From c03442ecf09de085fe8a9393248f05d0605b57be Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 16 May 2026 15:00:55 +0000 Subject: [PATCH 1/4] chore: plan bootstrap single-flight mitigation Agent-Logs-Url: https://github.com/furelid/sonicjs/sessions/57fd154d-2496-405b-8c12-d502940db821 --- package-lock.json | 45 +- .../{chunk-CSQWOYGZ.js => chunk-46DCL763.js} | 4 +- ...-CSQWOYGZ.js.map => chunk-46DCL763.js.map} | 2 +- packages/core/dist/chunk-5QK3FXKX.js.map | 1 - ...{chunk-QOZZJZ76.cjs => chunk-656GGECX.cjs} | 4 +- ...OZZJZ76.cjs.map => chunk-656GGECX.cjs.map} | 2 +- ...{chunk-ZUXOAZWZ.cjs => chunk-ABB34XUS.cjs} | 184 +++---- packages/core/dist/chunk-ABB34XUS.cjs.map | 1 + packages/core/dist/chunk-BX75LZES.cjs.map | 1 - .../{chunk-5QK3FXKX.js => chunk-DMPXZ6JJ.js} | 39 +- packages/core/dist/chunk-DMPXZ6JJ.js.map | 1 + .../{chunk-NDS4S4AG.js => chunk-FE77VWGD.js} | 8 +- ...-NDS4S4AG.js.map => chunk-FE77VWGD.js.map} | 2 +- ...{chunk-74BFRAQS.cjs => chunk-GLRZAPX6.cjs} | 8 +- ...4BFRAQS.cjs.map => chunk-GLRZAPX6.cjs.map} | 2 +- packages/core/dist/chunk-GQEIPW3L.js.map | 1 - ...{chunk-7KR6GOY3.cjs => chunk-ICMNCCX2.cjs} | 4 +- ...KR6GOY3.cjs.map => chunk-ICMNCCX2.cjs.map} | 2 +- ...{chunk-BX75LZES.cjs => chunk-LPYFMGAK.cjs} | 500 ++++++++++++------ packages/core/dist/chunk-LPYFMGAK.cjs.map | 1 + packages/core/dist/chunk-M2PKQJ6J.js.map | 1 - packages/core/dist/chunk-NGTBJJXZ.js.map | 1 - .../{chunk-CJOLOONT.js => chunk-NJVY2U43.js} | 4 +- ...-CJOLOONT.js.map => chunk-NJVY2U43.js.map} | 2 +- .../{chunk-M2PKQJ6J.js => chunk-OO7BOO6H.js} | 212 +++++++- packages/core/dist/chunk-OO7BOO6H.js.map | 1 + .../{chunk-GQEIPW3L.js => chunk-QFWHAFEO.js} | 4 +- ...XWQVFWPW.cjs.map => chunk-QFWHAFEO.js.map} | 2 +- ...{chunk-V4V54BY3.cjs => chunk-TAOOLOUH.cjs} | 45 +- packages/core/dist/chunk-TAOOLOUH.cjs.map | 1 + .../{chunk-NGTBJJXZ.js => chunk-TFNTM3OA.js} | 184 +++---- packages/core/dist/chunk-TFNTM3OA.js.map | 1 + packages/core/dist/chunk-V4V54BY3.cjs.map | 1 - ...{chunk-XWQVFWPW.cjs => chunk-WAEQXGCX.cjs} | 4 +- packages/core/dist/chunk-WAEQXGCX.cjs.map | 1 + packages/core/dist/chunk-ZUXOAZWZ.cjs.map | 1 - packages/core/dist/index.cjs | 388 +++++++------- packages/core/dist/index.cjs.map | 2 +- packages/core/dist/index.js | 26 +- packages/core/dist/index.js.map | 2 +- packages/core/dist/middleware.cjs | 64 +-- packages/core/dist/middleware.d.cts | 19 + packages/core/dist/middleware.d.ts | 19 + packages/core/dist/middleware.js | 6 +- packages/core/dist/migrations-2MVNZKQI.cjs | 13 + ...26.cjs.map => migrations-2MVNZKQI.cjs.map} | 2 +- packages/core/dist/migrations-3CPSXQ26.cjs | 13 - packages/core/dist/migrations-SMFIJBW2.js | 4 - packages/core/dist/migrations-W7P2NBXW.js | 4 + ...JBW2.js.map => migrations-W7P2NBXW.js.map} | 2 +- packages/core/dist/plugins.cjs | 18 +- packages/core/dist/plugins.js | 2 +- packages/core/dist/routes.cjs | 58 +- packages/core/dist/routes.js | 12 +- packages/core/dist/services.cjs | 78 +-- packages/core/dist/services.js | 6 +- packages/core/dist/utils.cjs | 22 +- packages/core/dist/utils.js | 2 +- packages/core/src/db/migrations-bundle.ts | 2 +- .../core/src/plugins/manifest-registry.ts | 2 +- 60 files changed, 1245 insertions(+), 798 deletions(-) rename packages/core/dist/{chunk-CSQWOYGZ.js => chunk-46DCL763.js} (99%) rename packages/core/dist/{chunk-CSQWOYGZ.js.map => chunk-46DCL763.js.map} (99%) delete mode 100644 packages/core/dist/chunk-5QK3FXKX.js.map rename packages/core/dist/{chunk-QOZZJZ76.cjs => chunk-656GGECX.cjs} (99%) rename packages/core/dist/{chunk-QOZZJZ76.cjs.map => chunk-656GGECX.cjs.map} (99%) rename packages/core/dist/{chunk-ZUXOAZWZ.cjs => chunk-ABB34XUS.cjs} (94%) create mode 100644 packages/core/dist/chunk-ABB34XUS.cjs.map delete mode 100644 packages/core/dist/chunk-BX75LZES.cjs.map rename packages/core/dist/{chunk-5QK3FXKX.js => chunk-DMPXZ6JJ.js} (94%) create mode 100644 packages/core/dist/chunk-DMPXZ6JJ.js.map rename packages/core/dist/{chunk-NDS4S4AG.js => chunk-FE77VWGD.js} (99%) rename packages/core/dist/{chunk-NDS4S4AG.js.map => chunk-FE77VWGD.js.map} (99%) rename packages/core/dist/{chunk-74BFRAQS.cjs => chunk-GLRZAPX6.cjs} (99%) rename packages/core/dist/{chunk-74BFRAQS.cjs.map => chunk-GLRZAPX6.cjs.map} (99%) delete mode 100644 packages/core/dist/chunk-GQEIPW3L.js.map rename packages/core/dist/{chunk-7KR6GOY3.cjs => chunk-ICMNCCX2.cjs} (99%) rename packages/core/dist/{chunk-7KR6GOY3.cjs.map => chunk-ICMNCCX2.cjs.map} (99%) rename packages/core/dist/{chunk-BX75LZES.cjs => chunk-LPYFMGAK.cjs} (98%) create mode 100644 packages/core/dist/chunk-LPYFMGAK.cjs.map delete mode 100644 packages/core/dist/chunk-M2PKQJ6J.js.map delete mode 100644 packages/core/dist/chunk-NGTBJJXZ.js.map rename packages/core/dist/{chunk-CJOLOONT.js => chunk-NJVY2U43.js} (99%) rename packages/core/dist/{chunk-CJOLOONT.js.map => chunk-NJVY2U43.js.map} (99%) rename packages/core/dist/{chunk-M2PKQJ6J.js => chunk-OO7BOO6H.js} (99%) create mode 100644 packages/core/dist/chunk-OO7BOO6H.js.map rename packages/core/dist/{chunk-GQEIPW3L.js => chunk-QFWHAFEO.js} (99%) rename packages/core/dist/{chunk-XWQVFWPW.cjs.map => chunk-QFWHAFEO.js.map} (53%) rename packages/core/dist/{chunk-V4V54BY3.cjs => chunk-TAOOLOUH.cjs} (93%) create mode 100644 packages/core/dist/chunk-TAOOLOUH.cjs.map rename packages/core/dist/{chunk-NGTBJJXZ.js => chunk-TFNTM3OA.js} (94%) create mode 100644 packages/core/dist/chunk-TFNTM3OA.js.map delete mode 100644 packages/core/dist/chunk-V4V54BY3.cjs.map rename packages/core/dist/{chunk-XWQVFWPW.cjs => chunk-WAEQXGCX.cjs} (99%) create mode 100644 packages/core/dist/chunk-WAEQXGCX.cjs.map delete mode 100644 packages/core/dist/chunk-ZUXOAZWZ.cjs.map create mode 100644 packages/core/dist/migrations-2MVNZKQI.cjs rename packages/core/dist/{migrations-3CPSXQ26.cjs.map => migrations-2MVNZKQI.cjs.map} (76%) delete mode 100644 packages/core/dist/migrations-3CPSXQ26.cjs delete mode 100644 packages/core/dist/migrations-SMFIJBW2.js create mode 100644 packages/core/dist/migrations-W7P2NBXW.js rename packages/core/dist/{migrations-SMFIJBW2.js.map => migrations-W7P2NBXW.js.map} (77%) diff --git a/package-lock.json b/package-lock.json index 5e28dde35..92c3a6a72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,7 +70,6 @@ "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -173,6 +172,7 @@ "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.8.0.tgz", "integrity": "sha512-Hb4BkGNnvgCj3F9XzqjiFTpA5IGkjOXwGAOV13qtc27l2qNF8X9rzSp1H5hu8XewlC0DzYtQtZZIOYzRZDyuXg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -220,6 +220,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.42.0.tgz", "integrity": "sha512-JLyyG7bb7XOda+w/sp8ch7rEVy6LnWs3qtxr6VJJ2XIINqGsY6U+0L3aJ6QFliBRNUeEAr2QBDxSm8u9Sal5uA==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -235,6 +236,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.42.0.tgz", "integrity": "sha512-SkCrvtZpdSWjNq9NGu/TtOg4TbzRuUToXlQqV6lLePa2s/WQlEyFw7QYjrz4itprWG9ASuH+StDlq7n49F2sBA==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -250,6 +252,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.42.0.tgz", "integrity": "sha512-6iiFbm2tRn6B2OqFv9XDTcw5LdWPudiJWIbRk+fsTX+hkPrPm4e1/SbU+lEYBciPoaTShLkDbRge4UePEyCPMQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 14.0.0" } @@ -259,6 +262,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.42.0.tgz", "integrity": "sha512-iEokmw2k6FBa8g/TT7ClyEriaP/FUEmz3iczRoCklEHWSgoABMkaeYrxRXrA2yx76AN+gyZoC8FX0iCJ55dsOg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -274,6 +278,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.42.0.tgz", "integrity": "sha512-ivVniRqX2ARd+jGvRHTxpWeOtO9VT+rK+OmiuRgkSunoTyxk0vjeDO7QkU7+lzBOXiYgakNjkZrBtIpW9c+muw==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -289,6 +294,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.42.0.tgz", "integrity": "sha512-9+BIw6rerUfA+eLMIS2lF4mgoeBGTCIHiqb35PLn3699Rm3CaJXz03hChdwAWcA6SwGw0haYXYJa7LF0xI6EpA==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -320,6 +326,7 @@ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.42.0.tgz", "integrity": "sha512-MBkjRymf4BT6VOvMpJlg6kq8K+PkH9q+N+K4YMNdzTXlL40YwOa1wIWQ5LxP/Jhlz64kW5g9/oaMWY06Sy9dcw==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -335,6 +342,7 @@ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.42.0.tgz", "integrity": "sha512-kmLs7YfjT4cpr4FnhhRmnoSX4psh9KYZ9NAiWt/YcUV33m0B/Os5L4QId30zVXkOqAPAEpV5VbDPWep+/aoJdQ==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -350,6 +358,7 @@ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.42.0.tgz", "integrity": "sha512-U5yZ8+Jj+A4ZC0IMfElpPcddQ9NCoawD1dKyWmjHP49nzN2Z4284IFVMAJWR6fq/0ddGf4OMjjYO9cnF8L+5tw==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -365,6 +374,7 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.42.0.tgz", "integrity": "sha512-EbuxgteaYBlKgc2Fs3JzoPIKAIaevAIwmv1F+fakaEXeibG4pkmVNsyTUjpOZIgJ1kXeqNvDrcjRb6g3vYBJ9A==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0" }, @@ -377,6 +387,7 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.42.0.tgz", "integrity": "sha512-4vnFvY5Q8QZL9eDNkywFLsk/eQCRBXCBpE8HWs8iUsFNHYoamiOxAeYMin0W/nszQj6abc+jNxMChHmejO+ftQ==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0" }, @@ -389,6 +400,7 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.42.0.tgz", "integrity": "sha512-gkLNpU+b1pCIwk1hKTJz2NWQPT8gsfGhQasnZ5QVv4jd79fKRL/1ikd86P0AzuIQs9tbbhlMwxsSTyJmlq502w==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0" }, @@ -1768,7 +1780,6 @@ "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", @@ -3969,7 +3980,6 @@ "resolved": "https://registry.npmjs.org/@libsql/client/-/client-0.15.15.tgz", "integrity": "sha512-twC0hQxPNHPKfeOv3sNT6u2pturQjLcI+CnpTM0SjRpocEGgfiZ7DWKXLNnsothjyJmDqEsBQJ5ztq9Wlu470w==", "license": "MIT", - "peer": true, "dependencies": { "@libsql/core": "^0.15.14", "@libsql/hrana-client": "^0.7.0", @@ -4140,7 +4150,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-3.1.1.tgz", "integrity": "sha512-0TTacJyZ9mDmY+VefuthVshaNIyCGZHJG2fMnGaDttCt8HmjUF7SizlHJpaCDoGnN635nK1wpzfpx/Xx5S4WnQ==", "license": "MIT", - "peer": true, "dependencies": { "@mdx-js/mdx": "^3.0.0", "source-map": "^0.7.0" @@ -4200,7 +4209,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -4431,7 +4439,6 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", - "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -5132,7 +5139,6 @@ "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "playwright": "1.56.1" }, @@ -6912,7 +6918,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -7003,7 +7008,6 @@ "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", @@ -7702,7 +7706,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -8231,7 +8234,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -9727,7 +9729,6 @@ "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.2.tgz", "integrity": "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", @@ -10246,7 +10247,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -10325,7 +10325,6 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -10511,7 +10510,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -12072,7 +12070,6 @@ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.18.tgz", "integrity": "sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -15285,7 +15282,6 @@ "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", "license": "MIT", - "peer": true, "dependencies": { "@next/env": "16.2.6", "@swc/helpers": "0.5.15", @@ -16156,7 +16152,6 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -16172,7 +16167,6 @@ "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.3.0.tgz", "integrity": "sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw==", "license": "MIT", - "peer": true, "peerDependencies": { "prettier": ">=2.0", "typescript": ">=2.9", @@ -17987,8 +17981,7 @@ "version": "4.1.16", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", "integrity": "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tapable": { "version": "2.3.0", @@ -18813,7 +18806,6 @@ "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -19395,7 +19387,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19481,7 +19472,6 @@ "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", "license": "MIT", - "peer": true, "dependencies": { "pathe": "^2.0.3" } @@ -19735,7 +19725,6 @@ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "license": "MIT", - "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } @@ -19812,7 +19801,6 @@ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -20326,7 +20314,6 @@ "integrity": "sha512-xQroKAadK503CrmbzCISvQUjeuvEZzv6U0wlnlVFOi5i3gnzfH4onyQ29f3lzpe0FresAiTAd3aqK0Bi/jLI8w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.7", "@vitest/mocker": "4.0.7", @@ -21010,7 +20997,6 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -21254,7 +21240,6 @@ "integrity": "sha512-ZuEq1OdrJBS+NV+L5HMYPCzVn49a2O60slQiiLpG44jqtlOo+S167fWC76kEXteXLLLydeuRrluRel7WdOUa4g==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "bin": { "workerd": "bin/workerd" }, @@ -21274,7 +21259,6 @@ "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.78.0.tgz", "integrity": "sha512-He/vUhk4ih0D0eFmtNnlbT6Od8j+BEokaSR+oYjbVsH0SWIrIch+eHqfLRSBjBQaOoh6HCNxcafcIkBm2u0Hag==", "license": "MIT OR Apache-2.0", - "peer": true, "dependencies": { "@cloudflare/kv-asset-handler": "0.4.2", "@cloudflare/unenv-preset": "2.16.0", @@ -22081,7 +22065,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/packages/core/dist/chunk-CSQWOYGZ.js b/packages/core/dist/chunk-46DCL763.js similarity index 99% rename from packages/core/dist/chunk-CSQWOYGZ.js rename to packages/core/dist/chunk-46DCL763.js index c23915a20..a5655f5a5 100644 --- a/packages/core/dist/chunk-CSQWOYGZ.js +++ b/packages/core/dist/chunk-46DCL763.js @@ -2213,5 +2213,5 @@ var MigrationService = class { }; export { MigrationService }; -//# sourceMappingURL=chunk-CSQWOYGZ.js.map -//# sourceMappingURL=chunk-CSQWOYGZ.js.map \ No newline at end of file +//# sourceMappingURL=chunk-46DCL763.js.map +//# sourceMappingURL=chunk-46DCL763.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-CSQWOYGZ.js.map b/packages/core/dist/chunk-46DCL763.js.map similarity index 99% rename from packages/core/dist/chunk-CSQWOYGZ.js.map rename to packages/core/dist/chunk-46DCL763.js.map index 2fa5fb3ee..0dce1846b 100644 --- a/packages/core/dist/chunk-CSQWOYGZ.js.map +++ b/packages/core/dist/chunk-46DCL763.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/db/migrations-bundle.ts","../src/services/migrations.ts"],"names":["hasUserProfilesTable"],"mappings":"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","file":"chunk-CSQWOYGZ.js","sourcesContent":["/**\n * AUTO-GENERATED FILE - DO NOT EDIT\n * Generated by: scripts/generate-migrations.ts\n * Generated at: 2026-05-01T00:32:37.853Z\n *\n * This file contains all migration SQL bundled for use in Cloudflare Workers\n * where filesystem access is not available at runtime.\n */\n\nexport interface BundledMigration {\n id: string\n name: string\n filename: string\n description: string\n sql: string\n}\n\nexport const bundledMigrations: BundledMigration[] = [\n {\n id: '001',\n name: 'Initial Schema',\n filename: '001_initial_schema.sql',\n description: 'Migration 001: Initial Schema',\n sql: \"-- Initial schema for SonicJS AI\\n-- Create users table for authentication\\nCREATE TABLE IF NOT EXISTS users (\\n id TEXT PRIMARY KEY,\\n email TEXT NOT NULL UNIQUE,\\n username TEXT NOT NULL UNIQUE,\\n first_name TEXT NOT NULL,\\n last_name TEXT NOT NULL,\\n password_hash TEXT,\\n role TEXT NOT NULL DEFAULT 'viewer',\\n avatar TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n last_login_at INTEGER,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create collections table for content schema definitions\\nCREATE TABLE IF NOT EXISTS collections (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n schema TEXT NOT NULL, -- JSON schema definition\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content table for actual content data\\nCREATE TABLE IF NOT EXISTS content (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n slug TEXT NOT NULL,\\n title TEXT NOT NULL,\\n data TEXT NOT NULL, -- JSON content data\\n status TEXT NOT NULL DEFAULT 'draft',\\n published_at INTEGER,\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content_versions table for versioning\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n version INTEGER NOT NULL,\\n data TEXT NOT NULL, -- JSON data\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create media/files table with comprehensive R2 integration\\nCREATE TABLE IF NOT EXISTS media (\\n id TEXT PRIMARY KEY,\\n filename TEXT NOT NULL,\\n original_name TEXT NOT NULL,\\n mime_type TEXT NOT NULL,\\n size INTEGER NOT NULL,\\n width INTEGER,\\n height INTEGER,\\n folder TEXT NOT NULL DEFAULT 'uploads',\\n r2_key TEXT NOT NULL, -- R2 storage key\\n public_url TEXT NOT NULL, -- CDN URL\\n thumbnail_url TEXT, -- Cloudflare Images URL\\n alt TEXT,\\n caption TEXT,\\n tags TEXT, -- JSON array of tags\\n uploaded_by TEXT NOT NULL REFERENCES users(id),\\n uploaded_at INTEGER NOT NULL,\\n updated_at INTEGER,\\n published_at INTEGER,\\n scheduled_at INTEGER,\\n archived_at INTEGER,\\n deleted_at INTEGER\\n);\\n\\n-- Create API tokens table for programmatic access\\nCREATE TABLE IF NOT EXISTS api_tokens (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n permissions TEXT NOT NULL, -- JSON array of permissions\\n expires_at INTEGER,\\n last_used_at INTEGER,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create workflow history table for content workflow tracking\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n action TEXT NOT NULL,\\n from_status TEXT NOT NULL,\\n to_status TEXT NOT NULL,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n comment TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\\nCREATE INDEX IF NOT EXISTS idx_users_username ON users(username);\\nCREATE INDEX IF NOT EXISTS idx_users_role ON users(role);\\n\\nCREATE INDEX IF NOT EXISTS idx_collections_name ON collections(name);\\nCREATE INDEX IF NOT EXISTS idx_collections_active ON collections(is_active);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_collection ON content(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_author ON content(author_id);\\nCREATE INDEX IF NOT EXISTS idx_content_status ON content(status);\\nCREATE INDEX IF NOT EXISTS idx_content_published ON content(published_at);\\nCREATE INDEX IF NOT EXISTS idx_content_slug ON content(slug);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_version ON content_versions(version);\\n\\nCREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);\\nCREATE INDEX IF NOT EXISTS idx_media_type ON media(mime_type);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_by ON media(uploaded_by);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_at ON media(uploaded_at);\\nCREATE INDEX IF NOT EXISTS idx_media_deleted ON media(deleted_at);\\n\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_user ON api_tokens(user_id);\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_token ON api_tokens(token);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_user ON workflow_history(user_id);\\n\\n-- Note: Admin user is created via the seed script with user-provided credentials\\n-- Run 'npm run seed' after migrations to create the admin user\\n\\n-- Insert sample collections\\nINSERT OR IGNORE INTO collections (\\n id, name, display_name, description, schema, \\n is_active, created_at, updated_at\\n) VALUES (\\n 'blog-posts-collection',\\n 'blog_posts',\\n 'Blog Posts',\\n 'Blog post content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"excerpt\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Excerpt\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"},\\\"tags\\\":{\\\"type\\\":\\\"array\\\",\\\"title\\\":\\\"Tags\\\",\\\"items\\\":{\\\"type\\\":\\\"string\\\"}},\\\"status\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Status\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"],\\\"default\\\":\\\"draft\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'pages-collection',\\n 'pages',\\n 'Pages',\\n 'Static page content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"slug\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Slug\\\"},\\\"meta_description\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Meta Description\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'news-collection',\\n 'news',\\n 'News',\\n 'News article content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"publish_date\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Publish Date\\\",\\\"format\\\":\\\"date\\\"},\\\"author\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Author\\\"},\\\"category\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Category\\\",\\\"enum\\\":[\\\"technology\\\",\\\"business\\\",\\\"general\\\"]}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Note: Sample content can be created via the admin interface after the admin user is seeded\"\n },\n {\n id: '002',\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql',\n description: 'Migration 002: Faq Plugin',\n sql: \"-- FAQ Plugin Migration (DEPRECATED - Now managed by third-party plugin)\\n-- Creates FAQ table for the FAQ plugin\\n-- NOTE: This migration is kept for historical purposes. \\n-- The FAQ functionality is now provided by the faq-plugin third-party plugin.\\n\\nCREATE TABLE IF NOT EXISTS faqs (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n question TEXT NOT NULL,\\n answer TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_faqs_category ON faqs(category);\\nCREATE INDEX IF NOT EXISTS idx_faqs_published ON faqs(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_faqs_sort_order ON faqs(sortOrder);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS faqs_updated_at\\n AFTER UPDATE ON faqs\\nBEGIN\\n UPDATE faqs SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert sample FAQ data\\nINSERT OR IGNORE INTO faqs (question, answer, category, tags, isPublished, sortOrder) VALUES \\n('What is SonicJS AI?', \\n'SonicJS AI is a modern, TypeScript-first headless CMS built for Cloudflare''s edge platform. It provides a complete content management system with admin interface, API endpoints, and plugin architecture.',\\n'general',\\n'sonicjs, cms, cloudflare',\\n1,\\n1),\\n\\n('How do I get started with SonicJS AI?',\\n'To get started: 1) Clone the repository, 2) Install dependencies with npm install, 3) Set up your Cloudflare account and services, 4) Run the development server with npm run dev, 5) Access the admin interface at /admin.',\\n'general',\\n'getting-started, setup',\\n1,\\n2),\\n\\n('What technologies does SonicJS AI use?',\\n'SonicJS AI is built with: TypeScript for type safety, Hono.js as the web framework, Cloudflare D1 for the database, Cloudflare R2 for media storage, Cloudflare Workers for serverless execution, and Tailwind CSS for styling.',\\n'technical',\\n'technology-stack, typescript, cloudflare',\\n1,\\n3),\\n\\n('How do I create content in SonicJS AI?',\\n'Content creation is done through the admin interface. Navigate to /admin, log in with your credentials, go to Content section, select a collection, and click \\\"New Content\\\" to create articles, pages, or other content types.',\\n'general',\\n'content-creation, admin',\\n1,\\n4),\\n\\n('Is SonicJS AI free to use?',\\n'SonicJS AI is open source and free to use. You only pay for the Cloudflare services you consume (D1 database, R2 storage, Workers execution time). Cloudflare offers generous free tiers for development and small projects.',\\n'billing',\\n'pricing, open-source, cloudflare',\\n1,\\n5),\\n\\n('How do I add custom functionality?',\\n'SonicJS AI features a plugin system that allows you to extend functionality. You can create plugins using the PluginBuilder API, add custom routes, models, admin pages, and integrate with external services.',\\n'technical',\\n'plugins, customization, development',\\n1,\\n6),\\n\\n('Can I customize the admin interface?',\\n'Yes! The admin interface is built with TypeScript templates and can be customized. You can modify existing templates, create new components, add custom pages, and integrate your own styling while maintaining the dark theme.',\\n'technical',\\n'admin-interface, customization, templates',\\n1,\\n7),\\n\\n('How does authentication work?',\\n'SonicJS AI includes a built-in authentication system with JWT tokens, role-based access control (admin, editor, viewer), secure password hashing, and session management. Users can be managed through the admin interface.',\\n'technical',\\n'authentication, security, users',\\n1,\\n8);\"\n },\n {\n id: '003',\n name: 'Stage5 Enhancements',\n filename: '003_stage5_enhancements.sql',\n description: 'Migration 003: Stage5 Enhancements',\n sql: \"-- Stage 5: Advanced Content Management enhancements\\n-- Add scheduling and workflow features to content table\\n\\n-- Add content scheduling columns\\nALTER TABLE content ADD COLUMN scheduled_publish_at INTEGER;\\nALTER TABLE content ADD COLUMN scheduled_unpublish_at INTEGER;\\n\\n-- Add workflow and review columns\\nALTER TABLE content ADD COLUMN review_status TEXT DEFAULT 'none'; -- none, pending, approved, rejected\\nALTER TABLE content ADD COLUMN reviewer_id TEXT REFERENCES users(id);\\nALTER TABLE content ADD COLUMN reviewed_at INTEGER;\\nALTER TABLE content ADD COLUMN review_notes TEXT;\\n\\n-- Add content metadata\\nALTER TABLE content ADD COLUMN meta_title TEXT;\\nALTER TABLE content ADD COLUMN meta_description TEXT;\\nALTER TABLE content ADD COLUMN featured_image_id TEXT REFERENCES media(id);\\nALTER TABLE content ADD COLUMN content_type TEXT DEFAULT 'standard'; -- standard, template, component\\n\\n-- Create content_fields table for dynamic field definitions\\nCREATE TABLE IF NOT EXISTS content_fields (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n field_name TEXT NOT NULL,\\n field_type TEXT NOT NULL, -- text, richtext, number, boolean, date, select, media, relationship\\n field_label TEXT NOT NULL,\\n field_options TEXT, -- JSON for select options, validation rules, etc.\\n field_order INTEGER NOT NULL DEFAULT 0,\\n is_required INTEGER NOT NULL DEFAULT 0,\\n is_searchable INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(collection_id, field_name)\\n);\\n\\n-- Create content_relationships table for content relationships\\nCREATE TABLE IF NOT EXISTS content_relationships (\\n id TEXT PRIMARY KEY,\\n source_content_id TEXT NOT NULL REFERENCES content(id),\\n target_content_id TEXT NOT NULL REFERENCES content(id),\\n relationship_type TEXT NOT NULL, -- references, tags, categories\\n created_at INTEGER NOT NULL,\\n UNIQUE(source_content_id, target_content_id, relationship_type)\\n);\\n\\n-- Create workflow_templates table for reusable workflows\\nCREATE TABLE IF NOT EXISTS workflow_templates (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT REFERENCES collections(id), -- null means applies to all collections\\n workflow_steps TEXT NOT NULL, -- JSON array of workflow steps\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Add indexes for new columns\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_unpublish ON content(scheduled_unpublish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_review_status ON content(review_status);\\nCREATE INDEX IF NOT EXISTS idx_content_reviewer ON content(reviewer_id);\\nCREATE INDEX IF NOT EXISTS idx_content_content_type ON content(content_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_fields_collection ON content_fields(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_name ON content_fields(field_name);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_type ON content_fields(field_type);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_order ON content_fields(field_order);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_source ON content_relationships(source_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_target ON content_relationships(target_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_type ON content_relationships(relationship_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_collection ON workflow_templates(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_active ON workflow_templates(is_active);\\n\\n-- Insert default workflow template\\nINSERT OR IGNORE INTO workflow_templates (\\n id, name, description, workflow_steps, is_active, created_at, updated_at\\n) VALUES (\\n 'default-content-workflow',\\n 'Default Content Workflow',\\n 'Standard content workflow: Draft → Review → Published',\\n '[\\n {\\\"step\\\": \\\"draft\\\", \\\"name\\\": \\\"Draft\\\", \\\"description\\\": \\\"Content is being created\\\", \\\"permissions\\\": [\\\"author\\\", \\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"review\\\", \\\"name\\\": \\\"Under Review\\\", \\\"description\\\": \\\"Content is pending review\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"published\\\", \\\"name\\\": \\\"Published\\\", \\\"description\\\": \\\"Content is live\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"archived\\\", \\\"name\\\": \\\"Archived\\\", \\\"description\\\": \\\"Content is archived\\\", \\\"permissions\\\": [\\\"admin\\\"]}\\n ]',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Insert enhanced field definitions for existing collections\\nINSERT OR IGNORE INTO content_fields (\\n id, collection_id, field_name, field_type, field_label, field_options, field_order, is_required, is_searchable, created_at, updated_at\\n) VALUES \\n-- Blog Posts fields\\n('blog-title-field', 'blog-posts-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter blog post title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-content-field', 'blog-posts-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-excerpt-field', 'blog-posts-collection', 'excerpt', 'text', 'Excerpt', '{\\\"maxLength\\\": 500, \\\"rows\\\": 3, \\\"placeholder\\\": \\\"Brief description of the post\\\"}', 3, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-tags-field', 'blog-posts-collection', 'tags', 'select', 'Tags', '{\\\"multiple\\\": true, \\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"tutorial\\\", \\\"news\\\", \\\"update\\\"], \\\"allowCustom\\\": true}', 4, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-image-field', 'blog-posts-collection', 'featured_image', 'media', 'Featured Image', '{\\\"accept\\\": \\\"image/*\\\", \\\"maxSize\\\": \\\"5MB\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-publish-date-field', 'blog-posts-collection', 'publish_date', 'date', 'Publish Date', '{\\\"format\\\": \\\"YYYY-MM-DD\\\", \\\"defaultToday\\\": true}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-field', 'blog-posts-collection', 'is_featured', 'boolean', 'Featured Post', '{\\\"default\\\": false}', 7, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- Pages fields\\n('pages-title-field', 'pages-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter page title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-content-field', 'pages-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 500}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-slug-field', 'pages-collection', 'slug', 'text', 'URL Slug', '{\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\"}', 3, 1, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-meta-desc-field', 'pages-collection', 'meta_description', 'text', 'Meta Description', '{\\\"maxLength\\\": 160, \\\"rows\\\": 2, \\\"placeholder\\\": \\\"SEO description for search engines\\\"}', 4, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-template-field', 'pages-collection', 'template', 'select', 'Page Template', '{\\\"options\\\": [\\\"default\\\", \\\"landing\\\", \\\"contact\\\", \\\"about\\\"], \\\"default\\\": \\\"default\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- News fields\\n('news-title-field', 'news-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter news title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-content-field', 'news-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"news\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-category-field', 'news-collection', 'category', 'select', 'Category', '{\\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"politics\\\", \\\"sports\\\", \\\"entertainment\\\", \\\"health\\\"], \\\"required\\\": true}', 3, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-author-field', 'news-collection', 'author', 'text', 'Author', '{\\\"placeholder\\\": \\\"Author name\\\"}', 4, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-source-field', 'news-collection', 'source', 'text', 'Source', '{\\\"placeholder\\\": \\\"News source\\\"}', 5, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-priority-field', 'news-collection', 'priority', 'select', 'Priority', '{\\\"options\\\": [\\\"low\\\", \\\"normal\\\", \\\"high\\\", \\\"breaking\\\"], \\\"default\\\": \\\"normal\\\"}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000);\"\n },\n {\n id: '004',\n name: 'Stage6 User Management',\n filename: '004_stage6_user_management.sql',\n description: 'Migration 004: Stage6 User Management',\n sql: \"-- Stage 6: User Management & Permissions enhancements\\n-- Enhanced user system with profiles, teams, permissions, and activity logging\\n\\n-- Add user profile and preferences columns\\nALTER TABLE users ADD COLUMN phone TEXT;\\nALTER TABLE users ADD COLUMN bio TEXT;\\nALTER TABLE users ADD COLUMN avatar_url TEXT;\\nALTER TABLE users ADD COLUMN timezone TEXT DEFAULT 'UTC';\\nALTER TABLE users ADD COLUMN language TEXT DEFAULT 'en';\\nALTER TABLE users ADD COLUMN email_notifications INTEGER DEFAULT 1;\\nALTER TABLE users ADD COLUMN theme TEXT DEFAULT 'dark';\\nALTER TABLE users ADD COLUMN two_factor_enabled INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN two_factor_secret TEXT;\\nALTER TABLE users ADD COLUMN password_reset_token TEXT;\\nALTER TABLE users ADD COLUMN password_reset_expires INTEGER;\\nALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN email_verification_token TEXT;\\nALTER TABLE users ADD COLUMN invitation_token TEXT;\\nALTER TABLE users ADD COLUMN invited_by TEXT REFERENCES users(id);\\nALTER TABLE users ADD COLUMN invited_at INTEGER;\\nALTER TABLE users ADD COLUMN accepted_invitation_at INTEGER;\\n\\n-- Create teams table for team-based collaboration\\nCREATE TABLE IF NOT EXISTS teams (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n slug TEXT NOT NULL UNIQUE,\\n owner_id TEXT NOT NULL REFERENCES users(id),\\n settings TEXT, -- JSON for team settings\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create team memberships table\\nCREATE TABLE IF NOT EXISTS team_memberships (\\n id TEXT PRIMARY KEY,\\n team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n role TEXT NOT NULL DEFAULT 'member', -- owner, admin, editor, member, viewer\\n permissions TEXT, -- JSON for specific permissions\\n joined_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(team_id, user_id)\\n);\\n\\n-- Create permissions table for granular access control\\nCREATE TABLE IF NOT EXISTS permissions (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n description TEXT,\\n category TEXT NOT NULL, -- content, users, collections, media, settings\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create role permissions mapping\\nCREATE TABLE IF NOT EXISTS role_permissions (\\n id TEXT PRIMARY KEY,\\n role TEXT NOT NULL,\\n permission_id TEXT NOT NULL REFERENCES permissions(id),\\n created_at INTEGER NOT NULL,\\n UNIQUE(role, permission_id)\\n);\\n\\n-- Create user sessions table for better session management\\nCREATE TABLE IF NOT EXISTS user_sessions (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n token_hash TEXT NOT NULL,\\n ip_address TEXT,\\n user_agent TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n expires_at INTEGER NOT NULL,\\n created_at INTEGER NOT NULL,\\n last_used_at INTEGER\\n);\\n\\n-- Create activity log table for audit trails\\nCREATE TABLE IF NOT EXISTS activity_logs (\\n id TEXT PRIMARY KEY,\\n user_id TEXT REFERENCES users(id),\\n action TEXT NOT NULL,\\n resource_type TEXT, -- users, content, collections, media, etc.\\n resource_id TEXT,\\n details TEXT, -- JSON with additional details\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create password history table for security\\nCREATE TABLE IF NOT EXISTS password_history (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n password_hash TEXT NOT NULL,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Insert default permissions\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at) VALUES\\n ('perm_content_create', 'content.create', 'Create new content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_read', 'content.read', 'View content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_update', 'content.update', 'Edit existing content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_delete', 'content.delete', 'Delete content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_publish', 'content.publish', 'Publish/unpublish content', 'content', strftime('%s', 'now') * 1000),\\n \\n ('perm_collections_create', 'collections.create', 'Create new collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_read', 'collections.read', 'View collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_update', 'collections.update', 'Edit collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_delete', 'collections.delete', 'Delete collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_fields', 'collections.fields', 'Manage collection fields', 'collections', strftime('%s', 'now') * 1000),\\n \\n ('perm_media_upload', 'media.upload', 'Upload media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_read', 'media.read', 'View media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_update', 'media.update', 'Edit media metadata', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_delete', 'media.delete', 'Delete media files', 'media', strftime('%s', 'now') * 1000),\\n \\n ('perm_users_create', 'users.create', 'Invite new users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_read', 'users.read', 'View user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_update', 'users.update', 'Edit user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_delete', 'users.delete', 'Deactivate users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_roles', 'users.roles', 'Manage user roles', 'users', strftime('%s', 'now') * 1000),\\n \\n ('perm_settings_read', 'settings.read', 'View system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_settings_update', 'settings.update', 'Modify system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_activity_read', 'activity.read', 'View activity logs', 'settings', strftime('%s', 'now') * 1000);\\n\\n-- Assign permissions to default roles\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at) VALUES\\n -- Admin has all permissions\\n ('rp_admin_content_create', 'admin', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_read', 'admin', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_update', 'admin', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_delete', 'admin', 'perm_content_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_publish', 'admin', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_create', 'admin', 'perm_collections_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_read', 'admin', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_update', 'admin', 'perm_collections_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_delete', 'admin', 'perm_collections_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_fields', 'admin', 'perm_collections_fields', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_upload', 'admin', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_read', 'admin', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_update', 'admin', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_delete', 'admin', 'perm_media_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_create', 'admin', 'perm_users_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_read', 'admin', 'perm_users_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_update', 'admin', 'perm_users_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_delete', 'admin', 'perm_users_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_roles', 'admin', 'perm_users_roles', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_read', 'admin', 'perm_settings_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_update', 'admin', 'perm_settings_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_activity_read', 'admin', 'perm_activity_read', strftime('%s', 'now') * 1000),\\n \\n -- Editor permissions\\n ('rp_editor_content_create', 'editor', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_read', 'editor', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_update', 'editor', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_publish', 'editor', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_editor_collections_read', 'editor', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_upload', 'editor', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_read', 'editor', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_update', 'editor', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_users_read', 'editor', 'perm_users_read', strftime('%s', 'now') * 1000),\\n \\n -- Viewer permissions\\n ('rp_viewer_content_read', 'viewer', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_collections_read', 'viewer', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_media_read', 'viewer', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_users_read', 'viewer', 'perm_users_read', strftime('%s', 'now') * 1000);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_team_id ON team_memberships(team_id);\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_user_id ON team_memberships(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_user_id ON user_sessions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_token_hash ON user_sessions(token_hash);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_user_id ON activity_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_created_at ON activity_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_resource ON activity_logs(resource_type, resource_id);\\nCREATE INDEX IF NOT EXISTS idx_password_history_user_id ON password_history(user_id);\\nCREATE INDEX IF NOT EXISTS idx_users_email_verification_token ON users(email_verification_token);\\nCREATE INDEX IF NOT EXISTS idx_users_password_reset_token ON users(password_reset_token);\\nCREATE INDEX IF NOT EXISTS idx_users_invitation_token ON users(invitation_token);\"\n },\n {\n id: '005',\n name: 'Stage7 Workflow Automation',\n filename: '005_stage7_workflow_automation.sql',\n description: 'Migration 005: Stage7 Workflow Automation',\n sql: \"-- Stage 7: Workflow & Automation Migration\\n-- This migration adds workflow and automation capabilities to SonicJS\\n\\n-- Workflow States Table\\nCREATE TABLE IF NOT EXISTS workflow_states (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n color TEXT DEFAULT '#6B7280',\\n is_initial INTEGER DEFAULT 0,\\n is_final INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Insert default workflow states\\nINSERT OR IGNORE INTO workflow_states (id, name, description, color, is_initial, is_final) VALUES\\n('draft', 'Draft', 'Content is being worked on', '#F59E0B', 1, 0),\\n('pending-review', 'Pending Review', 'Content is waiting for review', '#3B82F6', 0, 0),\\n('approved', 'Approved', 'Content has been approved', '#10B981', 0, 0),\\n('published', 'Published', 'Content is live', '#059669', 0, 1),\\n('rejected', 'Rejected', 'Content was rejected', '#EF4444', 0, 1),\\n('archived', 'Archived', 'Content has been archived', '#6B7280', 0, 1);\\n\\n-- Workflows Table\\nCREATE TABLE IF NOT EXISTS workflows (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT,\\n is_active INTEGER DEFAULT 1,\\n auto_publish INTEGER DEFAULT 0,\\n require_approval INTEGER DEFAULT 1,\\n approval_levels INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\\n);\\n\\n-- Workflow Transitions Table\\nCREATE TABLE IF NOT EXISTS workflow_transitions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT NOT NULL,\\n to_state_id TEXT NOT NULL,\\n required_permission TEXT,\\n auto_transition INTEGER DEFAULT 0,\\n transition_conditions TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE,\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id)\\n);\\n\\n-- Content Workflow Status Table\\nCREATE TABLE IF NOT EXISTS content_workflow_status (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n current_state_id TEXT NOT NULL,\\n assigned_to TEXT,\\n due_date DATETIME,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (current_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (assigned_to) REFERENCES users(id),\\n UNIQUE(content_id, workflow_id)\\n);\\n\\n-- Workflow History Table\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT,\\n to_state_id TEXT NOT NULL,\\n user_id TEXT NOT NULL,\\n comment TEXT,\\n metadata TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Scheduled Content Table\\nCREATE TABLE IF NOT EXISTS scheduled_content (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n action TEXT NOT NULL, -- 'publish', 'unpublish', 'archive'\\n scheduled_at DATETIME NOT NULL,\\n timezone TEXT DEFAULT 'UTC',\\n user_id TEXT NOT NULL,\\n status TEXT DEFAULT 'pending', -- 'pending', 'completed', 'failed', 'cancelled'\\n executed_at DATETIME,\\n error_message TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Notifications Table\\nCREATE TABLE IF NOT EXISTS notifications (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n type TEXT NOT NULL, -- 'workflow', 'schedule', 'system'\\n title TEXT NOT NULL,\\n message TEXT NOT NULL,\\n data TEXT, -- JSON\\n is_read INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\\n);\\n\\n-- Notification Preferences Table\\nCREATE TABLE IF NOT EXISTS notification_preferences (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n notification_type TEXT NOT NULL,\\n email_enabled INTEGER DEFAULT 1,\\n in_app_enabled INTEGER DEFAULT 1,\\n digest_frequency TEXT DEFAULT 'daily', -- 'immediate', 'hourly', 'daily', 'weekly'\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\\n UNIQUE(user_id, notification_type)\\n);\\n\\n-- Webhooks Table\\nCREATE TABLE IF NOT EXISTS webhooks (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n url TEXT NOT NULL,\\n secret TEXT,\\n events TEXT NOT NULL, -- JSON array of event types\\n is_active INTEGER DEFAULT 1,\\n retry_count INTEGER DEFAULT 3,\\n timeout_seconds INTEGER DEFAULT 30,\\n last_success_at DATETIME,\\n last_failure_at DATETIME,\\n failure_count INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Webhook Deliveries Table\\nCREATE TABLE IF NOT EXISTS webhook_deliveries (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n webhook_id TEXT NOT NULL,\\n event_type TEXT NOT NULL,\\n payload TEXT NOT NULL, -- JSON\\n response_status INTEGER,\\n response_body TEXT,\\n attempt_count INTEGER DEFAULT 1,\\n delivered_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE\\n);\\n\\n-- Content Versions Table (for rollback functionality)\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n version_number INTEGER NOT NULL,\\n title TEXT NOT NULL,\\n content TEXT NOT NULL,\\n fields TEXT, -- JSON\\n user_id TEXT NOT NULL,\\n change_summary TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, version_number)\\n);\\n\\n-- Automation Rules Table\\nCREATE TABLE IF NOT EXISTS automation_rules (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n trigger_type TEXT NOT NULL, -- 'content_created', 'content_updated', 'workflow_transition', 'schedule'\\n trigger_conditions TEXT, -- JSON\\n action_type TEXT NOT NULL, -- 'workflow_transition', 'send_notification', 'webhook_call', 'auto_save'\\n action_config TEXT, -- JSON\\n is_active INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Auto-save Drafts Table\\nCREATE TABLE IF NOT EXISTS auto_save_drafts (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT,\\n user_id TEXT NOT NULL,\\n title TEXT,\\n content TEXT,\\n fields TEXT, -- JSON\\n last_saved_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, user_id)\\n);\\n\\n-- Add workflow-related columns to existing content table (skip existing columns)\\nALTER TABLE content ADD COLUMN workflow_state_id TEXT DEFAULT 'draft';\\nALTER TABLE content ADD COLUMN embargo_until DATETIME;\\nALTER TABLE content ADD COLUMN expires_at DATETIME;\\nALTER TABLE content ADD COLUMN version_number INTEGER DEFAULT 1;\\nALTER TABLE content ADD COLUMN is_auto_saved INTEGER DEFAULT 0;\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_content_id ON content_workflow_status(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_workflow_id ON content_workflow_status(workflow_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content_id ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_scheduled_at ON scheduled_content(scheduled_at);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_status ON scheduled_content(status);\\nCREATE INDEX IF NOT EXISTS idx_notifications_user_id ON notifications(user_id);\\nCREATE INDEX IF NOT EXISTS idx_notifications_is_read ON notifications(is_read);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content_id ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_auto_save_drafts_user_id ON auto_save_drafts(user_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_state ON content(workflow_state_id);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\n\\n-- Insert default workflow for collections\\nINSERT OR IGNORE INTO workflows (id, name, description, collection_id, is_active, require_approval, approval_levels) \\nSELECT \\n 'default-' || id,\\n 'Default Workflow for ' || name,\\n 'Standard content approval workflow',\\n id,\\n 1,\\n 1,\\n 1\\nFROM collections;\\n\\n-- Insert default workflow transitions\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'draft',\\n 'pending-review',\\n 'content:submit'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'approved',\\n 'content:approve'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'approved',\\n 'published',\\n 'content:publish'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'rejected',\\n 'content:approve'\\nFROM workflows w;\\n\\n-- Insert default notification preferences for all users\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_assigned',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_status_change',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'content_scheduled',\\n 1,\\n 1\\nFROM users;\"\n },\n {\n id: '006',\n name: 'Plugin System',\n filename: '006_plugin_system.sql',\n description: 'Migration 006: Plugin System',\n sql: \"-- Plugin System Tables\\n-- Migration: 006_plugin_system\\n-- Description: Add plugin management system tables\\n\\n-- Plugins table\\nCREATE TABLE IF NOT EXISTS plugins (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n version TEXT NOT NULL,\\n author TEXT NOT NULL,\\n category TEXT NOT NULL,\\n icon TEXT,\\n status TEXT DEFAULT 'inactive' CHECK (status IN ('active', 'inactive', 'error')),\\n is_core BOOLEAN DEFAULT FALSE,\\n settings JSON,\\n permissions JSON,\\n dependencies JSON,\\n download_count INTEGER DEFAULT 0,\\n rating REAL DEFAULT 0,\\n installed_at INTEGER NOT NULL,\\n activated_at INTEGER,\\n last_updated INTEGER NOT NULL,\\n error_message TEXT,\\n created_at INTEGER DEFAULT (unixepoch()),\\n updated_at INTEGER DEFAULT (unixepoch())\\n);\\n\\n-- Plugin hooks table (registered hooks by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_hooks (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n hook_name TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n priority INTEGER DEFAULT 10,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, hook_name, handler_name)\\n);\\n\\n-- Plugin routes table\\nCREATE TABLE IF NOT EXISTS plugin_routes (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n path TEXT NOT NULL,\\n method TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n middleware JSON,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, path, method)\\n);\\n\\n-- Plugin assets table (CSS, JS files provided by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_assets (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n asset_type TEXT NOT NULL CHECK (asset_type IN ('css', 'js', 'image', 'font')),\\n asset_path TEXT NOT NULL,\\n load_order INTEGER DEFAULT 100,\\n load_location TEXT DEFAULT 'footer' CHECK (load_location IN ('header', 'footer')),\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Plugin activity log\\nCREATE TABLE IF NOT EXISTS plugin_activity_log (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n action TEXT NOT NULL,\\n user_id TEXT,\\n details JSON,\\n timestamp INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Create indexes\\nCREATE INDEX IF NOT EXISTS idx_plugins_status ON plugins(status);\\nCREATE INDEX IF NOT EXISTS idx_plugins_category ON plugins(category);\\nCREATE INDEX IF NOT EXISTS idx_plugin_hooks_plugin ON plugin_hooks(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_routes_plugin ON plugin_routes(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_assets_plugin ON plugin_assets(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_plugin ON plugin_activity_log(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_timestamp ON plugin_activity_log(timestamp);\\n\\n-- Insert core plugins\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES \\n(\\n 'core-auth',\\n 'core-auth',\\n 'Authentication System',\\n 'Core authentication and user management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔐',\\n 'active',\\n TRUE,\\n '[\\\"manage:users\\\", \\\"manage:roles\\\", \\\"manage:permissions\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-media',\\n 'core-media', \\n 'Media Manager',\\n 'Core media upload and management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'media',\\n '📸',\\n 'active',\\n TRUE,\\n '[\\\"manage:media\\\", \\\"upload:files\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-workflow',\\n 'core-workflow',\\n 'Workflow Engine',\\n 'Content workflow and approval system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin will be added as a third-party plugin through the admin interface\\n\\n-- Add plugin management permission\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at)\\nVALUES (\\n 'manage:plugins',\\n 'Manage Plugins',\\n 'Install, uninstall, activate, and configure plugins',\\n 'system',\\n unixepoch()\\n);\\n\\n-- Grant plugin management permission to admin role\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at)\\nVALUES ('role-perm-manage-plugins', 'admin', 'manage:plugins', unixepoch());\"\n },\n {\n id: '007',\n name: 'Demo Login Plugin',\n filename: '007_demo_login_plugin.sql',\n description: 'Migration 007: Demo Login Plugin',\n sql: \"-- Demo Login Plugin Migration\\n-- Migration: 007_demo_login_plugin\\n-- Description: Add demo login prefill plugin to the plugin registry\\n\\n-- Insert demo login plugin\\nINSERT INTO plugins (\\n id, name, display_name, description, version, author, category, icon, \\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'demo-login-prefill',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials (admin@sonicjs.com/sonicjs!) for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'inactive',\\n TRUE,\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\"\n },\n {\n id: '008',\n name: 'Fix Slug Validation',\n filename: '008_fix_slug_validation.sql',\n description: 'Migration 008: Fix Slug Validation',\n sql: \"-- Migration: Fix overly restrictive slug validation patterns\\n-- This migration relaxes the slug field validation to be more user-friendly\\n\\n-- Update the pages collection slug field to allow underscores and be less restrictive\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\\n-- Update any other slug fields with the restrictive pattern\\nUPDATE content_fields \\nSET field_options = REPLACE(field_options, '\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"', '\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\"')\\nWHERE field_options LIKE '%\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"%';\"\n },\n {\n id: '009',\n name: 'System Logging',\n filename: '009_system_logging.sql',\n description: 'Migration 009: System Logging',\n sql: \"-- System Logging Tables\\n-- Migration: 009_system_logging\\n-- Description: Add system logging and configuration tables\\n\\n-- System logs table for tracking application events\\nCREATE TABLE IF NOT EXISTS system_logs (\\n id TEXT PRIMARY KEY,\\n level TEXT NOT NULL CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n category TEXT NOT NULL CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n message TEXT NOT NULL,\\n data TEXT, -- JSON data\\n user_id TEXT,\\n session_id TEXT,\\n request_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n method TEXT,\\n url TEXT,\\n status_code INTEGER,\\n duration INTEGER, -- milliseconds\\n stack_trace TEXT,\\n tags TEXT, -- JSON array\\n source TEXT, -- source of the log entry\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Log configuration table for managing log settings per category\\nCREATE TABLE IF NOT EXISTS log_config (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL UNIQUE CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n enabled BOOLEAN NOT NULL DEFAULT TRUE,\\n level TEXT NOT NULL DEFAULT 'info' CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n retention_days INTEGER NOT NULL DEFAULT 30,\\n max_size_mb INTEGER NOT NULL DEFAULT 100,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_system_logs_level ON system_logs(level);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_category ON system_logs(category);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_created_at ON system_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_user_id ON system_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_status_code ON system_logs(status_code);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_source ON system_logs(source);\\n\\n-- Insert default log configurations\\nINSERT OR IGNORE INTO log_config (id, category, enabled, level, retention_days, max_size_mb) VALUES\\n('log-config-auth', 'auth', TRUE, 'info', 90, 50),\\n('log-config-api', 'api', TRUE, 'info', 30, 100),\\n('log-config-workflow', 'workflow', TRUE, 'info', 60, 50),\\n('log-config-plugin', 'plugin', TRUE, 'warn', 30, 25),\\n('log-config-media', 'media', TRUE, 'info', 30, 50),\\n('log-config-system', 'system', TRUE, 'info', 90, 100),\\n('log-config-security', 'security', TRUE, 'warn', 180, 100),\\n('log-config-error', 'error', TRUE, 'error', 90, 200);\"\n },\n {\n id: '011',\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql',\n description: 'Migration 011: Config Managed Collections',\n sql: \"-- Migration: Add Config-Managed Collections Support\\n-- Description: Add 'managed' column to collections table to support config-based collection definitions\\n-- Created: 2025-10-03\\n\\n-- Add 'managed' column to collections table\\n-- This column indicates whether a collection is managed by configuration files (true) or user-created (false)\\n-- Managed collections cannot be edited through the admin UI\\n-- Use a safe approach to add the column only if it doesn't exist\\nALTER TABLE collections ADD COLUMN managed INTEGER DEFAULT 0 NOT NULL;\\n\\n-- Create an index on the managed column for faster queries\\nCREATE INDEX IF NOT EXISTS idx_collections_managed ON collections(managed);\\n\\n-- Create an index on managed + is_active for efficient filtering\\nCREATE INDEX IF NOT EXISTS idx_collections_managed_active ON collections(managed, is_active);\\n\"\n },\n {\n id: '012',\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql',\n description: 'Migration 012: Testimonials Plugin',\n sql: \"-- Testimonials Plugin Migration\\n-- Creates testimonials table for the testimonials plugin\\n-- This demonstrates a code-based collection defined in src/plugins/core-plugins/testimonials-plugin.ts\\n\\nCREATE TABLE IF NOT EXISTS testimonials (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n author_name TEXT NOT NULL,\\n author_title TEXT,\\n author_company TEXT,\\n testimonial_text TEXT NOT NULL,\\n rating INTEGER CHECK(rating >= 1 AND rating <= 5),\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_testimonials_published ON testimonials(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_sort_order ON testimonials(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_rating ON testimonials(rating);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS testimonials_updated_at\\n AFTER UPDATE ON testimonials\\nBEGIN\\n UPDATE testimonials SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('testimonials',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support. This is a code-based collection example.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}');\\n\\n-- Insert sample testimonial data\\nINSERT OR IGNORE INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder) VALUES\\n('Jane Smith',\\n 'CTO',\\n 'TechStartup Inc',\\n 'SonicJS AI has transformed how we manage our content. The plugin architecture is brilliant and the edge deployment is blazing fast.',\\n 5,\\n 1,\\n 1),\\n\\n('Michael Chen',\\n 'Lead Developer',\\n 'Digital Agency Co',\\n 'We migrated from WordPress to SonicJS AI and couldn''t be happier. The TypeScript-first approach and modern tooling make development a joy.',\\n 5,\\n 1,\\n 2),\\n\\n('Sarah Johnson',\\n 'Product Manager',\\n 'E-commerce Solutions',\\n 'The headless CMS approach combined with Cloudflare Workers gives us unmatched performance. Our content is served globally with minimal latency.',\\n 4,\\n 1,\\n 3),\\n\\n('David Rodriguez',\\n 'Full Stack Developer',\\n 'Creative Studio',\\n 'Great CMS for modern web applications. The admin interface is clean and the API is well-designed. Plugin system is very flexible.',\\n 5,\\n 1,\\n 4),\\n\\n('Emily Watson',\\n 'Technical Director',\\n 'Media Company',\\n 'SonicJS AI solved our content distribution challenges. The R2 integration for media storage works flawlessly and scales effortlessly.',\\n 4,\\n 1,\\n 5);\\n\"\n },\n {\n id: '013',\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql',\n description: 'Migration 013: Code Examples Plugin',\n sql: \"-- Code Examples Plugin Migration\\n-- Creates code_examples table for the code examples plugin\\n-- This demonstrates a code-based collection for storing and managing code snippets\\n\\nCREATE TABLE IF NOT EXISTS code_examples (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n title TEXT NOT NULL,\\n description TEXT,\\n code TEXT NOT NULL,\\n language TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_code_examples_published ON code_examples(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_sort_order ON code_examples(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_language ON code_examples(language);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_category ON code_examples(category);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS code_examples_updated_at\\n AFTER UPDATE ON code_examples\\nBEGIN\\n UPDATE code_examples SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('code-examples',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support. Perfect for documentation and tutorials.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}');\\n\\n-- Insert sample code examples\\nINSERT OR IGNORE INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder) VALUES\\n('React useState Hook',\\n 'Basic example of using the useState hook in React for managing component state.',\\n 'import { useState } from ''react'';\\n\\nfunction Counter() {\\n const [count, setCount] = useState(0);\\n\\n return (\\n
\\n

Count: {count}

\\n \\n
\\n );\\n}\\n\\nexport default Counter;',\\n 'javascript',\\n 'frontend',\\n 'react,hooks,state',\\n 1,\\n 1),\\n\\n('TypeScript Interface Example',\\n 'Defining a TypeScript interface for type-safe objects.',\\n 'interface User {\\n id: string;\\n email: string;\\n name: string;\\n role: ''admin'' | ''editor'' | ''viewer'';\\n createdAt: Date;\\n}\\n\\nfunction greetUser(user: User): string {\\n return `Hello, ${user.name}!`;\\n}\\n\\nconst user: User = {\\n id: ''123'',\\n email: ''user@example.com'',\\n name: ''John Doe'',\\n role: ''admin'',\\n createdAt: new Date()\\n};\\n\\nconsole.log(greetUser(user));',\\n 'typescript',\\n 'backend',\\n 'typescript,types,interface',\\n 1,\\n 2),\\n\\n('Python List Comprehension',\\n 'Elegant way to create lists in Python using list comprehensions.',\\n '# Basic list comprehension\\nsquares = [x**2 for x in range(10)]\\nprint(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\\n\\n# With condition\\neven_squares = [x**2 for x in range(10) if x % 2 == 0]\\nprint(even_squares) # [0, 4, 16, 36, 64]\\n\\n# Nested list comprehension\\nmatrix = [[i+j for j in range(3)] for i in range(3)]\\nprint(matrix) # [[0, 1, 2], [1, 2, 3], [2, 3, 4]]',\\n 'python',\\n 'general',\\n 'python,lists,comprehension',\\n 1,\\n 3),\\n\\n('SQL Join Example',\\n 'Common SQL JOIN patterns for combining data from multiple tables.',\\n '-- INNER JOIN: Returns only matching rows\\nSELECT users.name, orders.total\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id;\\n\\n-- LEFT JOIN: Returns all users, even without orders\\nSELECT users.name, orders.total\\nFROM users\\nLEFT JOIN orders ON users.id = orders.user_id;\\n\\n-- Multiple JOINs\\nSELECT\\n users.name,\\n orders.order_date,\\n products.name AS product_name\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id\\nINNER JOIN order_items ON orders.id = order_items.order_id\\nINNER JOIN products ON order_items.product_id = products.id;',\\n 'sql',\\n 'database',\\n 'sql,joins,queries',\\n 1,\\n 4),\\n\\n('Go Error Handling',\\n 'Idiomatic error handling pattern in Go.',\\n 'package main\\n\\nimport (\\n\\t\\\"errors\\\"\\n\\t\\\"fmt\\\"\\n)\\n\\nfunc divide(a, b float64) (float64, error) {\\n\\tif b == 0 {\\n\\t\\treturn 0, errors.New(\\\"division by zero\\\")\\n\\t}\\n\\treturn a / b, nil\\n}\\n\\nfunc main() {\\n\\tresult, err := divide(10, 2)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t\\treturn\\n\\t}\\n\\tfmt.Printf(\\\"Result: %.2f\\\\n\\\", result)\\n\\n\\t// This will error\\n\\t_, err = divide(10, 0)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t}\\n}',\\n 'go',\\n 'backend',\\n 'go,error-handling,functions',\\n 1,\\n 5);\\n\"\n },\n {\n id: '014',\n name: 'Fix Plugin Registry',\n filename: '014_fix_plugin_registry.sql',\n description: 'Migration 014: Fix Plugin Registry',\n sql: \"-- Fix Plugin Registry\\n-- Migration: 014_fix_plugin_registry\\n-- Description: Add missing plugins and fix plugin name mismatches\\n\\n-- Note: Cannot easily update plugin names as they may be referenced elsewhere\\n-- Instead we'll add the missing plugins with correct names\\n\\n-- Insert missing plugins\\n\\n-- Core Analytics Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'core-analytics',\\n 'core-analytics',\\n 'Analytics & Tracking',\\n 'Core analytics tracking and reporting plugin with page views and event tracking',\\n '1.0.0',\\n 'SonicJS Team',\\n 'seo',\\n '📊',\\n 'active',\\n TRUE,\\n '[\\\"view:analytics\\\", \\\"manage:tracking\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'faq-plugin',\\n 'faq-plugin',\\n 'FAQ Management',\\n 'Frequently Asked Questions management plugin with categories, search, and custom styling',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '❓',\\n 'active',\\n FALSE,\\n '[\\\"manage:faqs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Seed Data Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'seed-data',\\n 'seed-data',\\n 'Seed Data Generator',\\n 'Generate realistic example users and content for testing and development',\\n '1.0.0',\\n 'SonicJS Team',\\n 'development',\\n '🌱',\\n 'inactive',\\n FALSE,\\n '[\\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Database Tools Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'database-tools',\\n 'database-tools',\\n 'Database Tools',\\n 'Database management tools including truncate, backup, and validation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'system',\\n '🗄️',\\n 'active',\\n FALSE,\\n '[\\\"manage:database\\\", \\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '015',\n name: 'Add Remaining Plugins',\n filename: '015_add_remaining_plugins.sql',\n description: 'Migration 015: Add Remaining Plugins',\n sql: \"-- Add Remaining Plugins\\n-- Migration: 015_add_remaining_plugins\\n-- Description: Add all remaining core plugins that were missing from the registry\\n\\n-- Testimonials Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'testimonials-plugin',\\n 'testimonials-plugin',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '⭐',\\n 'active',\\n FALSE,\\n '[\\\"manage:testimonials\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Code Examples Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'code-examples-plugin',\\n 'code-examples-plugin',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '💻',\\n 'active',\\n FALSE,\\n '[\\\"manage:code-examples\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Workflow Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'workflow-plugin',\\n 'workflow-plugin',\\n 'Workflow Engine',\\n 'Content workflow management with approval chains, scheduling, and automation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Demo Login Plugin (already exists with correct name from migration 007, but let's ensure it's there)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'demo-login-plugin',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '016',\n name: 'Remove Duplicate Cache Plugin',\n filename: '016_remove_duplicate_cache_plugin.sql',\n description: 'Migration 016: Remove Duplicate Cache Plugin',\n sql: \"-- Migration: Remove duplicate cache plugin entry\\n-- Description: Removes the old 'cache' plugin (id: 'cache') that is a duplicate of 'core-cache'\\n-- This fixes the issue where Cache System appears twice in the plugins list\\n-- Created: 2025-10-14\\n\\n-- Remove the old 'cache' plugin entry if it exists\\n-- The correct plugin is 'core-cache' which is managed by plugin-bootstrap.ts\\nDELETE FROM plugins WHERE id = 'cache' AND name = 'cache';\\n\\n-- Clean up any related entries in plugin activity log\\nDELETE FROM plugin_activity_log WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin hooks\\nDELETE FROM plugin_hooks WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin routes\\nDELETE FROM plugin_routes WHERE plugin_id = 'cache';\\n\"\n },\n {\n id: '017',\n name: 'Auth Configurable Fields',\n filename: '017_auth_configurable_fields.sql',\n description: 'Migration 017: Auth Configurable Fields',\n sql: \"-- Migration: Make authentication fields configurable\\n-- This migration updates the core-auth plugin to support configurable required fields\\n\\n-- The settings will be stored in the plugins table as JSON\\n-- Default settings for core-auth plugin include:\\n-- {\\n-- \\\"requiredFields\\\": {\\n-- \\\"email\\\": { \\\"required\\\": true, \\\"minLength\\\": 5 },\\n-- \\\"password\\\": { \\\"required\\\": true, \\\"minLength\\\": 8 },\\n-- \\\"username\\\": { \\\"required\\\": true, \\\"minLength\\\": 3 },\\n-- \\\"firstName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 },\\n-- \\\"lastName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 }\\n-- },\\n-- \\\"validation\\\": {\\n-- \\\"emailFormat\\\": true,\\n-- \\\"allowDuplicateUsernames\\\": false\\n-- }\\n-- }\\n\\n-- Update core-auth plugin settings with configurable field requirements\\nUPDATE plugins\\nSET settings = json_object(\\n 'requiredFields', json_object(\\n 'email', json_object('required', 1, 'minLength', 5, 'label', 'Email', 'type', 'email'),\\n 'password', json_object('required', 1, 'minLength', 8, 'label', 'Password', 'type', 'password'),\\n 'username', json_object('required', 1, 'minLength', 3, 'label', 'Username', 'type', 'text'),\\n 'firstName', json_object('required', 1, 'minLength', 1, 'label', 'First Name', 'type', 'text'),\\n 'lastName', json_object('required', 1, 'minLength', 1, 'label', 'Last Name', 'type', 'text')\\n ),\\n 'validation', json_object(\\n 'emailFormat', 1,\\n 'allowDuplicateUsernames', 0,\\n 'passwordRequirements', json_object(\\n 'requireUppercase', 0,\\n 'requireLowercase', 0,\\n 'requireNumbers', 0,\\n 'requireSpecialChars', 0\\n )\\n ),\\n 'registration', json_object(\\n 'enabled', 1,\\n 'requireEmailVerification', 0,\\n 'defaultRole', 'viewer'\\n )\\n)\\nWHERE id = 'core-auth';\\n\\n-- If core-auth plugin doesn't exist, this migration will be handled by bootstrap\\n-- No need to insert here as plugin bootstrap handles initial plugin creation\\n\"\n },\n {\n id: '018',\n name: 'Settings Table',\n filename: '018_settings_table.sql',\n description: 'Migration 018: Settings Table',\n sql: \"-- Create settings table for storing application settings\\nCREATE TABLE IF NOT EXISTS settings (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL, -- 'general', 'appearance', 'security', etc.\\n key TEXT NOT NULL,\\n value TEXT NOT NULL, -- JSON value\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(category, key)\\n);\\n\\n-- Insert default general settings\\nINSERT OR IGNORE INTO settings (id, category, key, value, created_at, updated_at)\\nVALUES\\n (lower(hex(randomblob(16))), 'general', 'siteName', '\\\"SonicJS AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'siteDescription', '\\\"A modern headless CMS powered by AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'timezone', '\\\"UTC\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'language', '\\\"en\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'maintenanceMode', 'false', unixepoch() * 1000, unixepoch() * 1000);\\n\\n-- Create index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);\\nCREATE INDEX IF NOT EXISTS idx_settings_category_key ON settings(category, key);\\n\"\n },\n {\n id: '019',\n name: 'Remove Blog Posts Collection',\n filename: '019_remove_blog_posts_collection.sql',\n description: 'Migration 019: Remove Blog Posts Collection',\n sql: \"-- Migration: Remove blog_posts from database-managed collections\\n-- Description: Remove blog-posts-collection from the database so it can be managed by code-based collection\\n-- Created: 2025-11-04\\n\\n-- Delete content associated with blog-posts-collection\\nDELETE FROM content WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete content fields for blog-posts-collection\\nDELETE FROM content_fields WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete the blog-posts collection itself\\nDELETE FROM collections WHERE id = 'blog-posts-collection';\\n\\n-- The blog-posts collection will now be managed by the code-based collection\\n-- in src/collections/blog-posts.collection.ts\\n\"\n },\n {\n id: '020',\n name: 'Add Email Plugin',\n filename: '020_add_email_plugin.sql',\n description: 'Migration 020: Add Email Plugin',\n sql: \"-- Add Email Plugin\\n-- Migration: 020_add_email_plugin\\n-- Description: Add email plugin for transactional emails via Resend\\n\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'email',\\n 'email',\\n 'Email',\\n 'Send transactional emails using Resend',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'utilities',\\n '📧',\\n 'inactive',\\n TRUE,\\n '[\\\"email:manage\\\", \\\"email:send\\\", \\\"email:view-logs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '021',\n name: 'Add Magic Link Auth Plugin',\n filename: '021_add_magic_link_auth_plugin.sql',\n description: 'Migration 021: Add Magic Link Auth Plugin',\n sql: \"-- Add Magic Link Authentication Plugin\\n-- Migration: 021_add_magic_link_auth_plugin\\n-- Description: Add magic link authentication plugin for passwordless login\\n\\n-- Create magic_links table\\nCREATE TABLE IF NOT EXISTS magic_links (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_magic_links_token ON magic_links(token);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_email ON magic_links(user_email);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_expires ON magic_links(expires_at);\\n\\n-- Register the plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'magic-link-auth',\\n 'magic-link-auth',\\n 'Magic Link Authentication',\\n 'Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔗',\\n 'inactive',\\n FALSE,\\n '[\\\"auth:manage\\\", \\\"auth:magic-link\\\"]',\\n '[\\\"email\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '022',\n name: 'Add Tinymce Plugin',\n filename: '022_add_tinymce_plugin.sql',\n description: 'Migration 022: Add Tinymce Plugin',\n sql: \"-- Add TinyMCE Rich Text Editor Plugin\\n-- Migration: 022_add_tinymce_plugin\\n-- Description: Add TinyMCE plugin for WYSIWYG rich text editing\\n\\n-- Register the plugin (active by default since it replaces hardcoded TinyMCE)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'tinymce-plugin',\\n 'tinymce-plugin',\\n 'TinyMCE Rich Text Editor',\\n 'Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✏️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"apiKey\\\":\\\"no-api-key\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"skin\\\":\\\"oxide-dark\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '023',\n name: 'Add Easy Mdx Plugin',\n filename: '023_add_easy_mdx_plugin.sql',\n description: 'Migration 023: Add Easy Mdx Plugin',\n sql: \"-- Add EasyMDE Markdown Editor Plugin\\n-- Migration: 023_add_easy_mdx_plugin\\n-- Description: Add EasyMDE plugin for lightweight markdown editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easy-mdx',\\n 'easy-mdx',\\n 'EasyMDE Markdown Editor',\\n 'Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '📝',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"defaultHeight\\\":400,\\\"theme\\\":\\\"dark\\\",\\\"toolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '024',\n name: 'Add Quill Editor Plugin',\n filename: '024_add_quill_editor_plugin.sql',\n description: 'Migration 024: Add Quill Editor Plugin',\n sql: \"-- Add Quill Rich Text Editor Plugin\\n-- Migration: 024_add_quill_editor_plugin\\n-- Description: Add Quill plugin for modern rich text editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'quill-editor',\\n 'quill-editor',\\n 'Quill Rich Text Editor',\\n 'Modern rich text editor for content creation. Provides a clean, intuitive WYSIWYG editor with customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"snow\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '025',\n name: 'Add Easymde Plugin',\n filename: '025_add_easymde_plugin.sql',\n description: 'Migration 025: Add Easymde Plugin',\n sql: \"-- Add EasyMDE Rich Text Editor Plugin\\n-- Migration: 025_add_easymde_plugin\\n-- Description: Add EasyMDE plugin for markdown-based rich text editing\\n\\n-- Register the plugin (inactive by default, replacing MDXEditor)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easymde-editor',\\n 'easymde-editor',\\n 'EasyMDE Editor',\\n 'Lightweight markdown editor for content creation. Simple, elegant WYSIWYG markdown editor with live preview, toolbar, and dark mode support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'inactive',\\n TRUE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"dark\\\",\\\"defaultHeight\\\":300,\\\"toolbar\\\":\\\"full\\\",\\\"spellChecker\\\":false,\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '026',\n name: 'Add Otp Login',\n filename: '026_add_otp_login.sql',\n description: 'Migration 026: Add Otp Login',\n sql: \"-- Add OTP Login Plugin\\n-- Migration: 021_add_otp_login\\n-- Description: Add OTP login plugin for passwordless authentication via email codes\\n\\n-- Create table for OTP codes\\nCREATE TABLE IF NOT EXISTS otp_codes (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n code TEXT NOT NULL,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n attempts INTEGER DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_otp_email_code ON otp_codes(user_email, code);\\nCREATE INDEX IF NOT EXISTS idx_otp_expires ON otp_codes(expires_at);\\nCREATE INDEX IF NOT EXISTS idx_otp_used ON otp_codes(used);\\n\\n-- Add plugin record\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'otp-login',\\n 'otp-login',\\n 'OTP Login',\\n 'Passwordless authentication via email one-time codes',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'security',\\n '🔢',\\n 'inactive',\\n TRUE,\\n '[\\\"otp:manage\\\", \\\"otp:request\\\", \\\"otp:verify\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '027',\n name: 'Fix Slug Field Type',\n filename: '027_fix_slug_field_type.sql',\n description: 'Migration 027: Fix Slug Field Type',\n sql: \"-- Migration: Fix slug field type\\n-- Description: Update slug fields to use 'slug' field type instead of 'text' for proper auto-generation\\n-- Created: 2026-01-10\\n\\n-- Update pages collection slug field to use 'slug' field type\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\"\n },\n {\n id: '028',\n name: 'Fix Slug Field Type In Schemas',\n filename: '028_fix_slug_field_type_in_schemas.sql',\n description: 'Migration 028: Fix Slug Field Type In Schemas',\n sql: \"-- Migration: Fix slug field type in collection schemas\\n-- Description: Update slug fields in collection schemas to use 'slug' type instead of 'string'\\n-- Created: 2026-01-10\\n\\n-- Update pages-collection schema\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'pages-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update blog-posts-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'blog-posts-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update news-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'news-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\"\n },\n {\n id: '029',\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql',\n description: 'Migration 029: Add Forms System',\n sql: \"-- Migration: 029_add_forms_system.sql\\n-- Description: Add Form.io integration for advanced form building\\n-- Date: January 23, 2026\\n-- Phase: 1 - Database Schema\\n\\n-- =====================================================\\n-- Table: forms\\n-- Description: Stores form definitions and configuration\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS forms (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE, -- Machine name (e.g., \\\"contact-form\\\")\\n display_name TEXT NOT NULL, -- Human name (e.g., \\\"Contact Form\\\")\\n description TEXT, -- Optional description\\n category TEXT DEFAULT 'general', -- Form category (contact, survey, registration, etc.)\\n \\n -- Form.io schema (JSON)\\n formio_schema TEXT NOT NULL, -- Complete Form.io JSON schema\\n \\n -- Settings\\n settings TEXT, -- JSON: {\\n -- emailNotifications: true,\\n -- notifyEmail: \\\"admin@example.com\\\",\\n -- successMessage: \\\"Thank you!\\\",\\n -- redirectUrl: \\\"/thank-you\\\",\\n -- allowAnonymous: true,\\n -- requireAuth: false,\\n -- maxSubmissions: null,\\n -- submitButtonText: \\\"Submit\\\",\\n -- saveProgress: true,\\n -- webhookUrl: null\\n -- }\\n \\n -- Status & Management\\n is_active INTEGER DEFAULT 1, -- Active/inactive flag\\n is_public INTEGER DEFAULT 1, -- Public (anyone) vs private (auth required)\\n managed INTEGER DEFAULT 0, -- Code-managed (like collections)\\n \\n -- Metadata\\n icon TEXT, -- Optional icon for admin UI\\n color TEXT, -- Optional color (hex) for admin UI\\n tags TEXT, -- JSON array of tags\\n \\n -- Stats\\n submission_count INTEGER DEFAULT 0, -- Total submissions received\\n view_count INTEGER DEFAULT 0, -- Form views (optional tracking)\\n \\n -- Ownership\\n created_by TEXT REFERENCES users(id), -- User who created the form\\n updated_by TEXT REFERENCES users(id), -- User who last updated\\n \\n -- Timestamps\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for forms\\nCREATE INDEX IF NOT EXISTS idx_forms_name ON forms(name);\\nCREATE INDEX IF NOT EXISTS idx_forms_category ON forms(category);\\nCREATE INDEX IF NOT EXISTS idx_forms_active ON forms(is_active);\\nCREATE INDEX IF NOT EXISTS idx_forms_public ON forms(is_public);\\nCREATE INDEX IF NOT EXISTS idx_forms_created_by ON forms(created_by);\\n\\n-- =====================================================\\n-- Table: form_submissions\\n-- Description: Stores submitted form data\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_submissions (\\n id TEXT PRIMARY KEY,\\n form_id TEXT NOT NULL REFERENCES forms(id) ON DELETE CASCADE,\\n \\n -- Submission data\\n submission_data TEXT NOT NULL, -- JSON: The actual form data submitted\\n \\n -- Submission metadata\\n status TEXT DEFAULT 'pending', -- pending, reviewed, approved, rejected, spam\\n submission_number INTEGER, -- Sequential number per form\\n \\n -- User information (if authenticated)\\n user_id TEXT REFERENCES users(id), -- Submitter user ID (if logged in)\\n user_email TEXT, -- Email from form (or user account)\\n \\n -- Tracking information\\n ip_address TEXT, -- IP address of submitter\\n user_agent TEXT, -- Browser user agent\\n referrer TEXT, -- Page that referred to form\\n utm_source TEXT, -- UTM tracking params\\n utm_medium TEXT,\\n utm_campaign TEXT,\\n \\n -- Review/Processing\\n reviewed_by TEXT REFERENCES users(id), -- Admin who reviewed\\n reviewed_at INTEGER, -- Review timestamp\\n review_notes TEXT, -- Admin notes\\n \\n -- Flags\\n is_spam INTEGER DEFAULT 0, -- Spam flag\\n is_archived INTEGER DEFAULT 0, -- Archived flag\\n \\n -- Timestamps\\n submitted_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for submissions\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_form_id ON form_submissions(form_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_status ON form_submissions(status);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_user_id ON form_submissions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_email ON form_submissions(user_email);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_submitted_at ON form_submissions(submitted_at);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_spam ON form_submissions(is_spam);\\n\\n-- Trigger to auto-increment submission_number per form\\nCREATE TRIGGER IF NOT EXISTS set_submission_number\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE form_submissions \\n SET submission_number = (\\n SELECT COUNT(*) \\n FROM form_submissions \\n WHERE form_id = NEW.form_id \\n AND id <= NEW.id\\n )\\n WHERE id = NEW.id;\\nEND;\\n\\n-- Trigger to update form submission_count\\nCREATE TRIGGER IF NOT EXISTS increment_form_submission_count\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE forms \\n SET submission_count = submission_count + 1,\\n updated_at = unixepoch() * 1000\\n WHERE id = NEW.form_id;\\nEND;\\n\\n-- =====================================================\\n-- Table: form_files (Optional)\\n-- Description: Link form submissions to uploaded files\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_files (\\n id TEXT PRIMARY KEY,\\n submission_id TEXT NOT NULL REFERENCES form_submissions(id) ON DELETE CASCADE,\\n media_id TEXT NOT NULL REFERENCES media(id) ON DELETE CASCADE,\\n field_name TEXT NOT NULL, -- Form field that uploaded this file\\n uploaded_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for form files\\nCREATE INDEX IF NOT EXISTS idx_form_files_submission ON form_files(submission_id);\\nCREATE INDEX IF NOT EXISTS idx_form_files_media ON form_files(media_id);\\n\\n-- =====================================================\\n-- Sample Data: Create a default contact form\\n-- =====================================================\\n\\nINSERT OR IGNORE INTO forms (\\n id,\\n name,\\n display_name,\\n description,\\n category,\\n formio_schema,\\n settings,\\n is_active,\\n is_public,\\n created_at,\\n updated_at\\n) VALUES (\\n 'default-contact-form',\\n 'contact',\\n 'Contact Form',\\n 'A simple contact form for getting in touch',\\n 'contact',\\n '{\\\"components\\\":[]}',\\n '{\\\"emailNotifications\\\":false,\\\"successMessage\\\":\\\"Thank you for your submission!\\\",\\\"submitButtonText\\\":\\\"Submit\\\",\\\"requireAuth\\\":false}',\\n 1,\\n 1,\\n unixepoch() * 1000,\\n unixepoch() * 1000\\n);\\n\"\n },\n {\n id: '030',\n name: 'Add Turnstile To Forms',\n filename: '030_add_turnstile_to_forms.sql',\n description: 'Migration 030: Add Turnstile To Forms',\n sql: \"-- Add Turnstile configuration to forms table\\n-- This allows per-form Turnstile settings with global fallback\\n\\n-- Add columns (D1 may not support CHECK constraints in ALTER TABLE)\\nALTER TABLE forms ADD COLUMN turnstile_enabled INTEGER DEFAULT 0;\\nALTER TABLE forms ADD COLUMN turnstile_settings TEXT;\\n\\n-- Set default to inherit global settings for existing forms\\nUPDATE forms \\nSET turnstile_settings = '{\\\"inherit\\\":true}' \\nWHERE turnstile_settings IS NULL;\\n\\n-- Add index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_forms_turnstile ON forms(turnstile_enabled);\\n\"\n },\n {\n id: '031',\n name: 'Ai Search Plugin',\n filename: '031_ai_search_plugin.sql',\n description: 'Migration 031: Ai Search Plugin',\n sql: \"-- AI Search plugin settings\\nCREATE TABLE IF NOT EXISTS ai_search_settings (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n enabled BOOLEAN DEFAULT 0,\\n ai_mode_enabled BOOLEAN DEFAULT 1,\\n selected_collections TEXT, -- JSON array of collection IDs to index\\n dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index\\n autocomplete_enabled BOOLEAN DEFAULT 1,\\n cache_duration INTEGER DEFAULT 1, -- hours\\n results_limit INTEGER DEFAULT 20,\\n index_media BOOLEAN DEFAULT 0,\\n index_status TEXT, -- JSON object with status per collection\\n last_indexed_at INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Search history/analytics\\nCREATE TABLE IF NOT EXISTS ai_search_history (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n query TEXT NOT NULL,\\n mode TEXT, -- 'ai' or 'keyword'\\n results_count INTEGER,\\n user_id INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index metadata tracking (per collection)\\nCREATE TABLE IF NOT EXISTS ai_search_index_meta (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n collection_id INTEGER NOT NULL,\\n collection_name TEXT NOT NULL, -- Cache collection name for display\\n total_items INTEGER DEFAULT 0,\\n indexed_items INTEGER DEFAULT 0,\\n last_sync_at INTEGER,\\n status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'\\n error_message TEXT,\\n UNIQUE(collection_id)\\n);\\n\\n-- Indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);\\n\"\n },\n {\n id: '032',\n name: 'User Profiles',\n filename: '032_user_profiles.sql',\n description: 'Migration 032: User Profiles',\n sql: \"-- User Profiles Table (Core Migration)\\n-- Stores extended user profile data separate from auth concerns\\n-- Required by admin-users.ts for user edit page profile management\\n--\\n-- Originally introduced as app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\\n-- in upstream PR #508. Core routes (admin-users.ts) were updated to query this table in PR #512,\\n-- but no corresponding core migration was added. This migration corrects that gap.\\n--\\n-- IF NOT EXISTS guards ensure idempotency for databases that already have the table\\n-- from the app-level migration.\\n\\nCREATE TABLE IF NOT EXISTS user_profiles (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,\\n\\n display_name TEXT,\\n bio TEXT,\\n company TEXT,\\n job_title TEXT,\\n website TEXT,\\n location TEXT,\\n date_of_birth INTEGER,\\n data TEXT DEFAULT '{}',\\n\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index for fast user lookups\\nCREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);\\n\\n-- Trigger to auto-update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS user_profiles_updated_at\\n AFTER UPDATE ON user_profiles\\nBEGIN\\n UPDATE user_profiles SET updated_at = strftime('%s', 'now') * 1000 WHERE id = NEW.id;\\nEND;\\n\"\n },\n {\n id: '033',\n name: 'Form Content Integration',\n filename: '033_form_content_integration.sql',\n description: 'Migration 033: Form Content Integration',\n sql: \"-- Migration 033: Form-Content Integration\\n-- Adds bridge columns to link forms to collections and submissions to content items\\n\\n-- Add source_type and source_id to collections for form-derived collections\\nALTER TABLE collections ADD COLUMN source_type TEXT DEFAULT 'user';\\nALTER TABLE collections ADD COLUMN source_id TEXT;\\n\\n-- Index for efficient lookup of form-derived collections\\nCREATE INDEX IF NOT EXISTS idx_collections_source ON collections(source_type, source_id);\\n\\n-- Add content_id to form_submissions for linking to content items\\nALTER TABLE form_submissions ADD COLUMN content_id TEXT REFERENCES content(id);\\n\\n-- Index for efficient lookup by content_id\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_content_id ON form_submissions(content_id);\\n\\n-- Create system user for anonymous form submissions\\nINSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\\nVALUES ('system-form-submission', 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', NULL, 'viewer', 0, strftime('%s','now') * 1000, strftime('%s','now') * 1000);\\n\"\n },\n {\n id: '034',\n name: 'Security Audit Plugin',\n filename: '034_security_audit_plugin.sql',\n description: 'Migration 034: Security Audit Plugin',\n sql: \"-- Security Audit Plugin\\n-- Tracks login attempts, registrations, and security events for monitoring and brute-force detection\\n\\nCREATE TABLE IF NOT EXISTS security_events (\\n id TEXT PRIMARY KEY,\\n event_type TEXT NOT NULL,\\n severity TEXT NOT NULL DEFAULT 'info',\\n user_id TEXT,\\n email TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n country_code TEXT,\\n request_path TEXT,\\n request_method TEXT,\\n details TEXT,\\n fingerprint TEXT,\\n blocked INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type);\\nCREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_security_events_email ON security_events(email);\\nCREATE INDEX IF NOT EXISTS idx_security_events_ip ON security_events(ip_address);\\nCREATE INDEX IF NOT EXISTS idx_security_events_severity ON security_events(severity);\\nCREATE INDEX IF NOT EXISTS idx_security_events_created ON security_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_security_events_fingerprint ON security_events(fingerprint);\\n\"\n },\n {\n id: '035',\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql',\n description: 'Migration 035: User Profiles Data Column',\n sql: \"-- Migration 035: Add data column to user_profiles (no-op)\\n--\\n-- This migration originally added a missing 'data' column to user_profiles.\\n-- Migration 032 has since been updated to include the column in the CREATE TABLE,\\n-- so on fresh installs the column already exists by the time this runs.\\n--\\n-- The ALTER TABLE has been removed to prevent \\\"duplicate column name: data\\\" errors\\n-- during fresh installs (GitHub issue #771). Wrangler's migration runner does not\\n-- gracefully handle duplicate column errors like the runtime MigrationService does.\\n--\\n-- Existing databases that ran the old 032 (without the data column) get the column\\n-- added at runtime by the core MigrationService, which skips duplicate-column errors.\\n--\\n-- This file is kept as a no-op so that wrangler's migration tracking remains\\n-- consistent (it tracks migrations by filename).\\nSELECT 1;\\n\"\n },\n {\n id: '036',\n name: 'Analytics Events',\n filename: '036_analytics_events.sql',\n description: 'Migration 036: Analytics Events',\n sql: \"-- Migration 036: Analytics Events Table\\n-- Provides storage for user behavior event tracking (page views, custom events)\\n\\nCREATE TABLE IF NOT EXISTS analytics_events (\\n id TEXT PRIMARY KEY,\\n event TEXT NOT NULL,\\n category TEXT NOT NULL DEFAULT 'user-activity',\\n properties TEXT,\\n user_id TEXT,\\n session_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n path TEXT,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_event ON analytics_events(event);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_category ON analytics_events(category);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_user_id ON analytics_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_session_id ON analytics_events(session_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_created_at ON analytics_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_path ON analytics_events(path);\\n\"\n }\n]\n\n// Map for quick lookup by ID\nexport const migrationsByIdMap = new Map(\n bundledMigrations.map(m => [m.id, m])\n)\n\n// Get migration SQL by ID\nexport function getMigrationSQLById(id: string): string | null {\n return migrationsByIdMap.get(id)?.sql ?? null\n}\n\n// Get all migration info (without SQL for lighter payloads)\nexport function getMigrationList(): Array> {\n return bundledMigrations.map(({ sql, ...rest }) => rest)\n}\n","import { D1Database } from '@cloudflare/workers-types'\nimport { bundledMigrations, getMigrationSQLById, type BundledMigration } from '../db/migrations-bundle'\n\nexport interface Migration {\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n}\n\nexport interface MigrationStatus {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Migration[]\n}\n\nexport class MigrationService {\n constructor(private db: D1Database) {}\n\n /**\n * Initialize the migrations tracking table\n */\n async initializeMigrationsTable(): Promise {\n const createTableQuery = `\n CREATE TABLE IF NOT EXISTS migrations (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n filename TEXT NOT NULL,\n applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n checksum TEXT\n )\n `\n\n await this.db.prepare(createTableQuery).run()\n }\n\n /**\n * Get all available migrations from the bundled migrations\n */\n async getAvailableMigrations(): Promise {\n const migrations: Migration[] = []\n\n // Get applied migrations from database\n const appliedResult = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at ASC'\n ).all()\n\n const appliedMigrations = new Map(\n appliedResult.results?.map((row: any) => [row.id, row]) || []\n )\n\n // Auto-detect applied migrations by checking if their tables exist\n await this.autoDetectAppliedMigrations(appliedMigrations)\n\n // Use bundled migrations as the source of truth\n for (const bundled of bundledMigrations) {\n const applied = appliedMigrations.has(bundled.id)\n const appliedData = appliedMigrations.get(bundled.id)\n\n migrations.push({\n id: bundled.id,\n name: bundled.name,\n filename: bundled.filename,\n description: bundled.description,\n applied,\n appliedAt: applied ? appliedData?.applied_at : undefined,\n size: bundled.sql.length\n })\n }\n\n return migrations\n }\n\n /**\n * Auto-detect applied migrations by checking if their tables exist\n */\n private async autoDetectAppliedMigrations(appliedMigrations: Map): Promise {\n // Check if basic schema tables exist (migration 001)\n if (!appliedMigrations.has('001')) {\n const hasBasicTables = await this.checkTablesExist(['users', 'content', 'collections', 'media'])\n if (hasBasicTables) {\n appliedMigrations.set('001', {\n id: '001',\n applied_at: new Date().toISOString(),\n name: 'Initial Schema',\n filename: '001_initial_schema.sql'\n })\n await this.markMigrationApplied('001', 'Initial Schema', '001_initial_schema.sql')\n }\n }\n\n // Check if FAQ tables exist (migration 002)\n // Migration 002 creates only the 'faqs' table\n if (!appliedMigrations.has('002')) {\n const hasFaqTables = await this.checkTablesExist(['faqs'])\n if (hasFaqTables) {\n appliedMigrations.set('002', {\n id: '002',\n applied_at: new Date().toISOString(),\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql'\n })\n await this.markMigrationApplied('002', 'Faq Plugin', '002_faq_plugin.sql')\n }\n }\n\n // Check if stage 5 enhancement tables exist (migration 003)\n // Migration 003 creates content_fields, content_relationships, workflow_templates tables\n if (!appliedMigrations.has('003')) {\n const hasStage5Tables = await this.checkTablesExist(['content_fields', 'content_relationships', 'workflow_templates'])\n if (hasStage5Tables) {\n appliedMigrations.set('003', {\n id: '003',\n applied_at: new Date().toISOString(),\n name: 'Stage 5 Enhancements',\n filename: '003_stage5_enhancements.sql'\n })\n await this.markMigrationApplied('003', 'Stage 5 Enhancements', '003_stage5_enhancements.sql')\n }\n }\n\n // Check if testimonials table exists (migration 012)\n if (!appliedMigrations.has('012')) {\n const hasTestimonialsTables = await this.checkTablesExist(['testimonials'])\n if (hasTestimonialsTables) {\n appliedMigrations.set('012', {\n id: '012',\n applied_at: new Date().toISOString(),\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql'\n })\n await this.markMigrationApplied('012', 'Testimonials Plugin', '012_testimonials_plugin.sql')\n }\n }\n\n // Check if code_examples table exists (migration 013)\n if (!appliedMigrations.has('013')) {\n const hasCodeExamplesTables = await this.checkTablesExist(['code_examples'])\n if (hasCodeExamplesTables) {\n appliedMigrations.set('013', {\n id: '013',\n applied_at: new Date().toISOString(),\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql'\n })\n await this.markMigrationApplied('013', 'Code Examples Plugin', '013_code_examples_plugin.sql')\n }\n }\n\n // Check if user management tables exist (migration 004)\n if (!appliedMigrations.has('004')) {\n const hasUserTables = await this.checkTablesExist(['api_tokens', 'workflow_history'])\n if (hasUserTables) {\n appliedMigrations.set('004', {\n id: '004',\n applied_at: new Date().toISOString(),\n name: 'User Management',\n filename: '004_stage6_user_management.sql'\n })\n await this.markMigrationApplied('004', 'User Management', '004_stage6_user_management.sql')\n }\n }\n\n // Check if plugin system tables exist (migration 006)\n if (!appliedMigrations.has('006')) {\n const hasPluginTables = await this.checkTablesExist(['plugins', 'plugin_hooks'])\n if (hasPluginTables) {\n appliedMigrations.set('006', {\n id: '006',\n applied_at: new Date().toISOString(),\n name: 'Plugin System',\n filename: '006_plugin_system.sql'\n })\n await this.markMigrationApplied('006', 'Plugin System', '006_plugin_system.sql')\n }\n }\n\n // Check if managed column exists (migration 011)\n // This handles both cases:\n // 1. Migration not marked as applied but column exists -> mark as applied\n // 2. Migration marked as applied but column doesn't exist -> remove from applied (will re-run)\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!appliedMigrations.has('011') && hasManagedColumn) {\n appliedMigrations.set('011', {\n id: '011',\n applied_at: new Date().toISOString(),\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql'\n })\n await this.markMigrationApplied('011', 'Config Managed Collections', '011_config_managed_collections.sql')\n } else if (appliedMigrations.has('011') && !hasManagedColumn) {\n // Migration was marked as applied but column doesn't exist - remove it so it will re-run\n console.log('[Migration] Migration 011 marked as applied but managed column missing - will re-run')\n appliedMigrations.delete('011')\n await this.removeMigrationApplied('011')\n }\n\n // Check if system_logs table exists (migration 009)\n if (!appliedMigrations.has('009')) {\n const hasLoggingTables = await this.checkTablesExist(['system_logs', 'log_config'])\n if (hasLoggingTables) {\n appliedMigrations.set('009', {\n id: '009',\n applied_at: new Date().toISOString(),\n name: 'System Logging',\n filename: '009_system_logging.sql'\n })\n await this.markMigrationApplied('009', 'System Logging', '009_system_logging.sql')\n }\n }\n\n // Check if settings table exists (migration 018)\n if (!appliedMigrations.has('018')) {\n const hasSettingsTable = await this.checkTablesExist(['settings'])\n if (hasSettingsTable) {\n appliedMigrations.set('018', {\n id: '018',\n applied_at: new Date().toISOString(),\n name: 'Settings Table',\n filename: '018_settings_table.sql'\n })\n await this.markMigrationApplied('018', 'Settings Table', '018_settings_table.sql')\n }\n }\n\n // Check if forms tables exist (migration 029)\n // Migration 029 was reassigned between releases: older versions used it for \"Ai Search Plugin\",\n // newer versions use it for \"Add Forms System\". This handles the case where 029 is marked as\n // applied (from the old AI Search migration) but the forms tables don't actually exist.\n const hasFormsTables = await this.checkTablesExist(['forms', 'form_submissions', 'form_files'])\n if (!appliedMigrations.has('029') && hasFormsTables) {\n appliedMigrations.set('029', {\n id: '029',\n applied_at: new Date().toISOString(),\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql'\n })\n await this.markMigrationApplied('029', 'Add Forms System', '029_add_forms_system.sql')\n } else if (appliedMigrations.has('029') && !hasFormsTables) {\n // Migration was marked as applied (possibly from old \"Ai Search Plugin\" migration)\n // but forms tables don't exist - remove it so the forms migration will re-run\n console.log('[Migration] Migration 029 marked as applied but forms tables missing - will re-run')\n appliedMigrations.delete('029')\n await this.removeMigrationApplied('029')\n }\n\n // Check if user_profiles table exists (migration 032)\n // Table may already exist from app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\n if (!appliedMigrations.has('032')) {\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n appliedMigrations.set('032', {\n id: '032',\n applied_at: new Date().toISOString(),\n name: 'User Profiles',\n filename: '032_user_profiles.sql'\n })\n await this.markMigrationApplied('032', 'User Profiles', '032_user_profiles.sql')\n }\n }\n\n // Ensure user_profiles.data column exists (migration 035 is now a no-op).\n // Databases that ran the old 032 (without data column) need the column added.\n // Migration 035 was converted to a no-op to fix #771 (duplicate column error\n // on fresh installs), so we add the column here if it's missing.\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n const hasDataColumn = await this.checkColumnExists('user_profiles', 'data')\n if (!hasDataColumn) {\n try {\n await this.db.prepare(`ALTER TABLE user_profiles ADD COLUMN data TEXT DEFAULT '{}'`).run()\n console.log('[Migration] Added missing data column to user_profiles')\n } catch (error) {\n // Column may have been added concurrently; ignore duplicate column errors\n const msg = error instanceof Error ? error.message : String(error)\n if (!msg.includes('duplicate column name')) {\n console.error('[Migration] Failed to add data column to user_profiles:', msg)\n }\n }\n }\n }\n\n // Mark migration 035 as applied since it's now a no-op (column handled above)\n if (!appliedMigrations.has('035')) {\n const hasDataCol = hasUserProfilesTable && await this.checkColumnExists('user_profiles', 'data')\n if (hasDataCol) {\n appliedMigrations.set('035', {\n id: '035',\n applied_at: new Date().toISOString(),\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql'\n })\n await this.markMigrationApplied('035', 'User Profiles Data Column', '035_user_profiles_data_column.sql')\n }\n }\n }\n\n /**\n * Check if specific tables exist in the database\n */\n private async checkTablesExist(tableNames: string[]): Promise {\n try {\n for (const tableName of tableNames) {\n const result = await this.db.prepare(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`\n ).bind(tableName).first()\n\n if (!result) {\n return false\n }\n }\n return true\n } catch (error) {\n return false\n }\n }\n\n /**\n * Check if a specific column exists in a table\n */\n private async checkColumnExists(tableName: string, columnName: string): Promise {\n try {\n const result = await this.db.prepare(\n `SELECT * FROM pragma_table_info(?) WHERE name = ?`\n ).bind(tableName, columnName).first()\n\n return !!result\n } catch (error) {\n return false\n }\n }\n\n /**\n * Get migration status summary\n */\n async getMigrationStatus(): Promise {\n await this.initializeMigrationsTable()\n\n const migrations = await this.getAvailableMigrations()\n const appliedMigrations = migrations.filter(m => m.applied)\n const pendingMigrations = migrations.filter(m => !m.applied)\n\n const lastApplied = appliedMigrations.length > 0\n ? appliedMigrations[appliedMigrations.length - 1]?.appliedAt\n : undefined\n\n return {\n totalMigrations: migrations.length,\n appliedMigrations: appliedMigrations.length,\n pendingMigrations: pendingMigrations.length,\n lastApplied,\n migrations\n }\n }\n\n /**\n * Mark a migration as applied\n */\n async markMigrationApplied(migrationId: string, name: string, filename: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'INSERT OR REPLACE INTO migrations (id, name, filename, applied_at) VALUES (?, ?, ?, CURRENT_TIMESTAMP)'\n ).bind(migrationId, name, filename).run()\n }\n\n /**\n * Remove a migration from the applied list (so it can be re-run)\n */\n async removeMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'DELETE FROM migrations WHERE id = ?'\n ).bind(migrationId).run()\n }\n\n /**\n * Check if a specific migration has been applied\n */\n async isMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM migrations WHERE id = ?'\n ).bind(migrationId).first()\n\n return (result?.count as number) > 0\n }\n\n /**\n * Get the last applied migration\n */\n async getLastAppliedMigration(): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at DESC LIMIT 1'\n ).first()\n\n if (!result) return null\n\n return {\n id: result.id as string,\n name: result.name as string,\n filename: result.filename as string,\n applied: true,\n appliedAt: result.applied_at as string\n }\n }\n\n /**\n * Run pending migrations\n */\n async runPendingMigrations(): Promise<{ success: boolean; message: string; applied: string[]; errors: string[] }> {\n await this.initializeMigrationsTable()\n\n const status = await this.getMigrationStatus()\n const pendingMigrations = status.migrations.filter(m => !m.applied)\n\n if (pendingMigrations.length === 0) {\n return {\n success: true,\n message: 'All migrations are up to date',\n applied: [],\n errors: []\n }\n }\n\n // Actually execute the migration files\n const applied: string[] = []\n const errors: string[] = []\n\n for (const migration of pendingMigrations) {\n try {\n console.log(`[Migration] Applying ${migration.id}: ${migration.name}`)\n await this.applyMigration(migration)\n await this.markMigrationApplied(migration.id, migration.name, migration.filename)\n applied.push(migration.id)\n console.log(`[Migration] Successfully applied ${migration.id}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`[Migration] Failed to apply migration ${migration.id}:`, errorMessage)\n errors.push(`${migration.id}: ${errorMessage}`)\n // Continue with other migrations instead of stopping on first failure\n // This allows independent migrations to still be applied\n }\n }\n\n if (errors.length > 0 && applied.length === 0) {\n return {\n success: false,\n message: `Failed to apply migrations: ${errors.join('; ')}`,\n applied,\n errors\n }\n }\n\n return {\n success: true,\n message: applied.length > 0\n ? `Applied ${applied.length} migration(s)${errors.length > 0 ? ` (${errors.length} failed)` : ''}`\n : 'No migrations applied',\n applied,\n errors\n }\n }\n\n /**\n * Apply a specific migration\n */\n private async applyMigration(migration: Migration): Promise {\n // Get the actual migration SQL from the bundle\n const migrationSQL = getMigrationSQLById(migration.id)\n\n if (migrationSQL === null) {\n throw new Error(`Migration SQL not found for ${migration.id}`)\n }\n\n if (migrationSQL.trim() === '') {\n console.log(`[Migration] Skipping empty migration ${migration.id}`)\n return\n }\n\n // Split SQL into individual statements, handling triggers properly\n const statements = this.splitSQLStatements(migrationSQL)\n\n for (const statement of statements) {\n if (statement.trim()) {\n try {\n await this.db.prepare(statement).run()\n } catch (error) {\n // Check if it's a \"already exists\" type error and skip it\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('already exists') ||\n errorMessage.includes('duplicate column name') ||\n errorMessage.includes('UNIQUE constraint failed')) {\n console.log(`[Migration] Skipping (already exists): ${statement.substring(0, 50)}...`)\n continue\n }\n console.error(`[Migration] Error executing statement: ${statement.substring(0, 100)}...`)\n throw error\n }\n }\n }\n }\n\n /**\n * Split SQL into statements, handling CREATE TRIGGER properly\n */\n private splitSQLStatements(sql: string): string[] {\n const statements: string[] = []\n let current = ''\n let inTrigger = false\n\n const lines = sql.split('\\n')\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n // Skip comments and empty lines\n if (trimmed.startsWith('--') || trimmed.length === 0) {\n continue\n }\n\n // Check if we're entering a trigger\n if (trimmed.toUpperCase().includes('CREATE TRIGGER')) {\n inTrigger = true\n }\n\n current += line + '\\n'\n\n // Check if we're exiting a trigger\n if (inTrigger && trimmed.toUpperCase() === 'END;') {\n statements.push(current.trim())\n current = ''\n inTrigger = false\n }\n // Check for regular statement end (not in trigger)\n else if (!inTrigger && trimmed.endsWith(';')) {\n statements.push(current.trim())\n current = ''\n }\n }\n\n // Add any remaining statement\n if (current.trim()) {\n statements.push(current.trim())\n }\n\n return statements.filter(s => s.length > 0)\n }\n\n /**\n * Validate database schema\n */\n async validateSchema(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n // Basic table existence checks\n const requiredTables = [\n 'users', 'content', 'collections', 'media'\n ]\n\n for (const table of requiredTables) {\n try {\n await this.db.prepare(`SELECT COUNT(*) FROM ${table} LIMIT 1`).first()\n } catch (error) {\n issues.push(`Missing table: ${table}`)\n }\n }\n\n // Check for managed column in collections\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!hasManagedColumn) {\n issues.push('Missing column: collections.managed')\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/db/migrations-bundle.ts","../src/services/migrations.ts"],"names":["hasUserProfilesTable"],"mappings":"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","file":"chunk-46DCL763.js","sourcesContent":["/**\n * AUTO-GENERATED FILE - DO NOT EDIT\n * Generated by: scripts/generate-migrations.ts\n * Generated at: 2026-05-16T15:00:21.459Z\n *\n * This file contains all migration SQL bundled for use in Cloudflare Workers\n * where filesystem access is not available at runtime.\n */\n\nexport interface BundledMigration {\n id: string\n name: string\n filename: string\n description: string\n sql: string\n}\n\nexport const bundledMigrations: BundledMigration[] = [\n {\n id: '001',\n name: 'Initial Schema',\n filename: '001_initial_schema.sql',\n description: 'Migration 001: Initial Schema',\n sql: \"-- Initial schema for SonicJS AI\\n-- Create users table for authentication\\nCREATE TABLE IF NOT EXISTS users (\\n id TEXT PRIMARY KEY,\\n email TEXT NOT NULL UNIQUE,\\n username TEXT NOT NULL UNIQUE,\\n first_name TEXT NOT NULL,\\n last_name TEXT NOT NULL,\\n password_hash TEXT,\\n role TEXT NOT NULL DEFAULT 'viewer',\\n avatar TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n last_login_at INTEGER,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create collections table for content schema definitions\\nCREATE TABLE IF NOT EXISTS collections (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n schema TEXT NOT NULL, -- JSON schema definition\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content table for actual content data\\nCREATE TABLE IF NOT EXISTS content (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n slug TEXT NOT NULL,\\n title TEXT NOT NULL,\\n data TEXT NOT NULL, -- JSON content data\\n status TEXT NOT NULL DEFAULT 'draft',\\n published_at INTEGER,\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content_versions table for versioning\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n version INTEGER NOT NULL,\\n data TEXT NOT NULL, -- JSON data\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create media/files table with comprehensive R2 integration\\nCREATE TABLE IF NOT EXISTS media (\\n id TEXT PRIMARY KEY,\\n filename TEXT NOT NULL,\\n original_name TEXT NOT NULL,\\n mime_type TEXT NOT NULL,\\n size INTEGER NOT NULL,\\n width INTEGER,\\n height INTEGER,\\n folder TEXT NOT NULL DEFAULT 'uploads',\\n r2_key TEXT NOT NULL, -- R2 storage key\\n public_url TEXT NOT NULL, -- CDN URL\\n thumbnail_url TEXT, -- Cloudflare Images URL\\n alt TEXT,\\n caption TEXT,\\n tags TEXT, -- JSON array of tags\\n uploaded_by TEXT NOT NULL REFERENCES users(id),\\n uploaded_at INTEGER NOT NULL,\\n updated_at INTEGER,\\n published_at INTEGER,\\n scheduled_at INTEGER,\\n archived_at INTEGER,\\n deleted_at INTEGER\\n);\\n\\n-- Create API tokens table for programmatic access\\nCREATE TABLE IF NOT EXISTS api_tokens (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n permissions TEXT NOT NULL, -- JSON array of permissions\\n expires_at INTEGER,\\n last_used_at INTEGER,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create workflow history table for content workflow tracking\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n action TEXT NOT NULL,\\n from_status TEXT NOT NULL,\\n to_status TEXT NOT NULL,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n comment TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\\nCREATE INDEX IF NOT EXISTS idx_users_username ON users(username);\\nCREATE INDEX IF NOT EXISTS idx_users_role ON users(role);\\n\\nCREATE INDEX IF NOT EXISTS idx_collections_name ON collections(name);\\nCREATE INDEX IF NOT EXISTS idx_collections_active ON collections(is_active);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_collection ON content(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_author ON content(author_id);\\nCREATE INDEX IF NOT EXISTS idx_content_status ON content(status);\\nCREATE INDEX IF NOT EXISTS idx_content_published ON content(published_at);\\nCREATE INDEX IF NOT EXISTS idx_content_slug ON content(slug);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_version ON content_versions(version);\\n\\nCREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);\\nCREATE INDEX IF NOT EXISTS idx_media_type ON media(mime_type);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_by ON media(uploaded_by);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_at ON media(uploaded_at);\\nCREATE INDEX IF NOT EXISTS idx_media_deleted ON media(deleted_at);\\n\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_user ON api_tokens(user_id);\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_token ON api_tokens(token);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_user ON workflow_history(user_id);\\n\\n-- Note: Admin user is created via the seed script with user-provided credentials\\n-- Run 'npm run seed' after migrations to create the admin user\\n\\n-- Insert sample collections\\nINSERT OR IGNORE INTO collections (\\n id, name, display_name, description, schema, \\n is_active, created_at, updated_at\\n) VALUES (\\n 'blog-posts-collection',\\n 'blog_posts',\\n 'Blog Posts',\\n 'Blog post content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"excerpt\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Excerpt\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"},\\\"tags\\\":{\\\"type\\\":\\\"array\\\",\\\"title\\\":\\\"Tags\\\",\\\"items\\\":{\\\"type\\\":\\\"string\\\"}},\\\"status\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Status\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"],\\\"default\\\":\\\"draft\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'pages-collection',\\n 'pages',\\n 'Pages',\\n 'Static page content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"slug\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Slug\\\"},\\\"meta_description\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Meta Description\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'news-collection',\\n 'news',\\n 'News',\\n 'News article content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"publish_date\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Publish Date\\\",\\\"format\\\":\\\"date\\\"},\\\"author\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Author\\\"},\\\"category\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Category\\\",\\\"enum\\\":[\\\"technology\\\",\\\"business\\\",\\\"general\\\"]}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Note: Sample content can be created via the admin interface after the admin user is seeded\"\n },\n {\n id: '002',\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql',\n description: 'Migration 002: Faq Plugin',\n sql: \"-- FAQ Plugin Migration (DEPRECATED - Now managed by third-party plugin)\\n-- Creates FAQ table for the FAQ plugin\\n-- NOTE: This migration is kept for historical purposes. \\n-- The FAQ functionality is now provided by the faq-plugin third-party plugin.\\n\\nCREATE TABLE IF NOT EXISTS faqs (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n question TEXT NOT NULL,\\n answer TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_faqs_category ON faqs(category);\\nCREATE INDEX IF NOT EXISTS idx_faqs_published ON faqs(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_faqs_sort_order ON faqs(sortOrder);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS faqs_updated_at\\n AFTER UPDATE ON faqs\\nBEGIN\\n UPDATE faqs SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert sample FAQ data\\nINSERT OR IGNORE INTO faqs (question, answer, category, tags, isPublished, sortOrder) VALUES \\n('What is SonicJS AI?', \\n'SonicJS AI is a modern, TypeScript-first headless CMS built for Cloudflare''s edge platform. It provides a complete content management system with admin interface, API endpoints, and plugin architecture.',\\n'general',\\n'sonicjs, cms, cloudflare',\\n1,\\n1),\\n\\n('How do I get started with SonicJS AI?',\\n'To get started: 1) Clone the repository, 2) Install dependencies with npm install, 3) Set up your Cloudflare account and services, 4) Run the development server with npm run dev, 5) Access the admin interface at /admin.',\\n'general',\\n'getting-started, setup',\\n1,\\n2),\\n\\n('What technologies does SonicJS AI use?',\\n'SonicJS AI is built with: TypeScript for type safety, Hono.js as the web framework, Cloudflare D1 for the database, Cloudflare R2 for media storage, Cloudflare Workers for serverless execution, and Tailwind CSS for styling.',\\n'technical',\\n'technology-stack, typescript, cloudflare',\\n1,\\n3),\\n\\n('How do I create content in SonicJS AI?',\\n'Content creation is done through the admin interface. Navigate to /admin, log in with your credentials, go to Content section, select a collection, and click \\\"New Content\\\" to create articles, pages, or other content types.',\\n'general',\\n'content-creation, admin',\\n1,\\n4),\\n\\n('Is SonicJS AI free to use?',\\n'SonicJS AI is open source and free to use. You only pay for the Cloudflare services you consume (D1 database, R2 storage, Workers execution time). Cloudflare offers generous free tiers for development and small projects.',\\n'billing',\\n'pricing, open-source, cloudflare',\\n1,\\n5),\\n\\n('How do I add custom functionality?',\\n'SonicJS AI features a plugin system that allows you to extend functionality. You can create plugins using the PluginBuilder API, add custom routes, models, admin pages, and integrate with external services.',\\n'technical',\\n'plugins, customization, development',\\n1,\\n6),\\n\\n('Can I customize the admin interface?',\\n'Yes! The admin interface is built with TypeScript templates and can be customized. You can modify existing templates, create new components, add custom pages, and integrate your own styling while maintaining the dark theme.',\\n'technical',\\n'admin-interface, customization, templates',\\n1,\\n7),\\n\\n('How does authentication work?',\\n'SonicJS AI includes a built-in authentication system with JWT tokens, role-based access control (admin, editor, viewer), secure password hashing, and session management. Users can be managed through the admin interface.',\\n'technical',\\n'authentication, security, users',\\n1,\\n8);\"\n },\n {\n id: '003',\n name: 'Stage5 Enhancements',\n filename: '003_stage5_enhancements.sql',\n description: 'Migration 003: Stage5 Enhancements',\n sql: \"-- Stage 5: Advanced Content Management enhancements\\n-- Add scheduling and workflow features to content table\\n\\n-- Add content scheduling columns\\nALTER TABLE content ADD COLUMN scheduled_publish_at INTEGER;\\nALTER TABLE content ADD COLUMN scheduled_unpublish_at INTEGER;\\n\\n-- Add workflow and review columns\\nALTER TABLE content ADD COLUMN review_status TEXT DEFAULT 'none'; -- none, pending, approved, rejected\\nALTER TABLE content ADD COLUMN reviewer_id TEXT REFERENCES users(id);\\nALTER TABLE content ADD COLUMN reviewed_at INTEGER;\\nALTER TABLE content ADD COLUMN review_notes TEXT;\\n\\n-- Add content metadata\\nALTER TABLE content ADD COLUMN meta_title TEXT;\\nALTER TABLE content ADD COLUMN meta_description TEXT;\\nALTER TABLE content ADD COLUMN featured_image_id TEXT REFERENCES media(id);\\nALTER TABLE content ADD COLUMN content_type TEXT DEFAULT 'standard'; -- standard, template, component\\n\\n-- Create content_fields table for dynamic field definitions\\nCREATE TABLE IF NOT EXISTS content_fields (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n field_name TEXT NOT NULL,\\n field_type TEXT NOT NULL, -- text, richtext, number, boolean, date, select, media, relationship\\n field_label TEXT NOT NULL,\\n field_options TEXT, -- JSON for select options, validation rules, etc.\\n field_order INTEGER NOT NULL DEFAULT 0,\\n is_required INTEGER NOT NULL DEFAULT 0,\\n is_searchable INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(collection_id, field_name)\\n);\\n\\n-- Create content_relationships table for content relationships\\nCREATE TABLE IF NOT EXISTS content_relationships (\\n id TEXT PRIMARY KEY,\\n source_content_id TEXT NOT NULL REFERENCES content(id),\\n target_content_id TEXT NOT NULL REFERENCES content(id),\\n relationship_type TEXT NOT NULL, -- references, tags, categories\\n created_at INTEGER NOT NULL,\\n UNIQUE(source_content_id, target_content_id, relationship_type)\\n);\\n\\n-- Create workflow_templates table for reusable workflows\\nCREATE TABLE IF NOT EXISTS workflow_templates (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT REFERENCES collections(id), -- null means applies to all collections\\n workflow_steps TEXT NOT NULL, -- JSON array of workflow steps\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Add indexes for new columns\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_unpublish ON content(scheduled_unpublish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_review_status ON content(review_status);\\nCREATE INDEX IF NOT EXISTS idx_content_reviewer ON content(reviewer_id);\\nCREATE INDEX IF NOT EXISTS idx_content_content_type ON content(content_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_fields_collection ON content_fields(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_name ON content_fields(field_name);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_type ON content_fields(field_type);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_order ON content_fields(field_order);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_source ON content_relationships(source_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_target ON content_relationships(target_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_type ON content_relationships(relationship_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_collection ON workflow_templates(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_active ON workflow_templates(is_active);\\n\\n-- Insert default workflow template\\nINSERT OR IGNORE INTO workflow_templates (\\n id, name, description, workflow_steps, is_active, created_at, updated_at\\n) VALUES (\\n 'default-content-workflow',\\n 'Default Content Workflow',\\n 'Standard content workflow: Draft → Review → Published',\\n '[\\n {\\\"step\\\": \\\"draft\\\", \\\"name\\\": \\\"Draft\\\", \\\"description\\\": \\\"Content is being created\\\", \\\"permissions\\\": [\\\"author\\\", \\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"review\\\", \\\"name\\\": \\\"Under Review\\\", \\\"description\\\": \\\"Content is pending review\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"published\\\", \\\"name\\\": \\\"Published\\\", \\\"description\\\": \\\"Content is live\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"archived\\\", \\\"name\\\": \\\"Archived\\\", \\\"description\\\": \\\"Content is archived\\\", \\\"permissions\\\": [\\\"admin\\\"]}\\n ]',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Insert enhanced field definitions for existing collections\\nINSERT OR IGNORE INTO content_fields (\\n id, collection_id, field_name, field_type, field_label, field_options, field_order, is_required, is_searchable, created_at, updated_at\\n) VALUES \\n-- Blog Posts fields\\n('blog-title-field', 'blog-posts-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter blog post title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-content-field', 'blog-posts-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-excerpt-field', 'blog-posts-collection', 'excerpt', 'text', 'Excerpt', '{\\\"maxLength\\\": 500, \\\"rows\\\": 3, \\\"placeholder\\\": \\\"Brief description of the post\\\"}', 3, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-tags-field', 'blog-posts-collection', 'tags', 'select', 'Tags', '{\\\"multiple\\\": true, \\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"tutorial\\\", \\\"news\\\", \\\"update\\\"], \\\"allowCustom\\\": true}', 4, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-image-field', 'blog-posts-collection', 'featured_image', 'media', 'Featured Image', '{\\\"accept\\\": \\\"image/*\\\", \\\"maxSize\\\": \\\"5MB\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-publish-date-field', 'blog-posts-collection', 'publish_date', 'date', 'Publish Date', '{\\\"format\\\": \\\"YYYY-MM-DD\\\", \\\"defaultToday\\\": true}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-field', 'blog-posts-collection', 'is_featured', 'boolean', 'Featured Post', '{\\\"default\\\": false}', 7, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- Pages fields\\n('pages-title-field', 'pages-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter page title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-content-field', 'pages-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 500}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-slug-field', 'pages-collection', 'slug', 'text', 'URL Slug', '{\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\"}', 3, 1, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-meta-desc-field', 'pages-collection', 'meta_description', 'text', 'Meta Description', '{\\\"maxLength\\\": 160, \\\"rows\\\": 2, \\\"placeholder\\\": \\\"SEO description for search engines\\\"}', 4, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-template-field', 'pages-collection', 'template', 'select', 'Page Template', '{\\\"options\\\": [\\\"default\\\", \\\"landing\\\", \\\"contact\\\", \\\"about\\\"], \\\"default\\\": \\\"default\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- News fields\\n('news-title-field', 'news-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter news title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-content-field', 'news-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"news\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-category-field', 'news-collection', 'category', 'select', 'Category', '{\\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"politics\\\", \\\"sports\\\", \\\"entertainment\\\", \\\"health\\\"], \\\"required\\\": true}', 3, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-author-field', 'news-collection', 'author', 'text', 'Author', '{\\\"placeholder\\\": \\\"Author name\\\"}', 4, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-source-field', 'news-collection', 'source', 'text', 'Source', '{\\\"placeholder\\\": \\\"News source\\\"}', 5, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-priority-field', 'news-collection', 'priority', 'select', 'Priority', '{\\\"options\\\": [\\\"low\\\", \\\"normal\\\", \\\"high\\\", \\\"breaking\\\"], \\\"default\\\": \\\"normal\\\"}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000);\"\n },\n {\n id: '004',\n name: 'Stage6 User Management',\n filename: '004_stage6_user_management.sql',\n description: 'Migration 004: Stage6 User Management',\n sql: \"-- Stage 6: User Management & Permissions enhancements\\n-- Enhanced user system with profiles, teams, permissions, and activity logging\\n\\n-- Add user profile and preferences columns\\nALTER TABLE users ADD COLUMN phone TEXT;\\nALTER TABLE users ADD COLUMN bio TEXT;\\nALTER TABLE users ADD COLUMN avatar_url TEXT;\\nALTER TABLE users ADD COLUMN timezone TEXT DEFAULT 'UTC';\\nALTER TABLE users ADD COLUMN language TEXT DEFAULT 'en';\\nALTER TABLE users ADD COLUMN email_notifications INTEGER DEFAULT 1;\\nALTER TABLE users ADD COLUMN theme TEXT DEFAULT 'dark';\\nALTER TABLE users ADD COLUMN two_factor_enabled INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN two_factor_secret TEXT;\\nALTER TABLE users ADD COLUMN password_reset_token TEXT;\\nALTER TABLE users ADD COLUMN password_reset_expires INTEGER;\\nALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN email_verification_token TEXT;\\nALTER TABLE users ADD COLUMN invitation_token TEXT;\\nALTER TABLE users ADD COLUMN invited_by TEXT REFERENCES users(id);\\nALTER TABLE users ADD COLUMN invited_at INTEGER;\\nALTER TABLE users ADD COLUMN accepted_invitation_at INTEGER;\\n\\n-- Create teams table for team-based collaboration\\nCREATE TABLE IF NOT EXISTS teams (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n slug TEXT NOT NULL UNIQUE,\\n owner_id TEXT NOT NULL REFERENCES users(id),\\n settings TEXT, -- JSON for team settings\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create team memberships table\\nCREATE TABLE IF NOT EXISTS team_memberships (\\n id TEXT PRIMARY KEY,\\n team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n role TEXT NOT NULL DEFAULT 'member', -- owner, admin, editor, member, viewer\\n permissions TEXT, -- JSON for specific permissions\\n joined_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(team_id, user_id)\\n);\\n\\n-- Create permissions table for granular access control\\nCREATE TABLE IF NOT EXISTS permissions (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n description TEXT,\\n category TEXT NOT NULL, -- content, users, collections, media, settings\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create role permissions mapping\\nCREATE TABLE IF NOT EXISTS role_permissions (\\n id TEXT PRIMARY KEY,\\n role TEXT NOT NULL,\\n permission_id TEXT NOT NULL REFERENCES permissions(id),\\n created_at INTEGER NOT NULL,\\n UNIQUE(role, permission_id)\\n);\\n\\n-- Create user sessions table for better session management\\nCREATE TABLE IF NOT EXISTS user_sessions (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n token_hash TEXT NOT NULL,\\n ip_address TEXT,\\n user_agent TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n expires_at INTEGER NOT NULL,\\n created_at INTEGER NOT NULL,\\n last_used_at INTEGER\\n);\\n\\n-- Create activity log table for audit trails\\nCREATE TABLE IF NOT EXISTS activity_logs (\\n id TEXT PRIMARY KEY,\\n user_id TEXT REFERENCES users(id),\\n action TEXT NOT NULL,\\n resource_type TEXT, -- users, content, collections, media, etc.\\n resource_id TEXT,\\n details TEXT, -- JSON with additional details\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create password history table for security\\nCREATE TABLE IF NOT EXISTS password_history (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n password_hash TEXT NOT NULL,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Insert default permissions\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at) VALUES\\n ('perm_content_create', 'content.create', 'Create new content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_read', 'content.read', 'View content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_update', 'content.update', 'Edit existing content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_delete', 'content.delete', 'Delete content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_publish', 'content.publish', 'Publish/unpublish content', 'content', strftime('%s', 'now') * 1000),\\n \\n ('perm_collections_create', 'collections.create', 'Create new collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_read', 'collections.read', 'View collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_update', 'collections.update', 'Edit collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_delete', 'collections.delete', 'Delete collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_fields', 'collections.fields', 'Manage collection fields', 'collections', strftime('%s', 'now') * 1000),\\n \\n ('perm_media_upload', 'media.upload', 'Upload media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_read', 'media.read', 'View media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_update', 'media.update', 'Edit media metadata', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_delete', 'media.delete', 'Delete media files', 'media', strftime('%s', 'now') * 1000),\\n \\n ('perm_users_create', 'users.create', 'Invite new users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_read', 'users.read', 'View user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_update', 'users.update', 'Edit user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_delete', 'users.delete', 'Deactivate users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_roles', 'users.roles', 'Manage user roles', 'users', strftime('%s', 'now') * 1000),\\n \\n ('perm_settings_read', 'settings.read', 'View system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_settings_update', 'settings.update', 'Modify system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_activity_read', 'activity.read', 'View activity logs', 'settings', strftime('%s', 'now') * 1000);\\n\\n-- Assign permissions to default roles\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at) VALUES\\n -- Admin has all permissions\\n ('rp_admin_content_create', 'admin', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_read', 'admin', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_update', 'admin', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_delete', 'admin', 'perm_content_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_publish', 'admin', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_create', 'admin', 'perm_collections_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_read', 'admin', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_update', 'admin', 'perm_collections_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_delete', 'admin', 'perm_collections_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_fields', 'admin', 'perm_collections_fields', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_upload', 'admin', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_read', 'admin', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_update', 'admin', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_delete', 'admin', 'perm_media_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_create', 'admin', 'perm_users_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_read', 'admin', 'perm_users_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_update', 'admin', 'perm_users_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_delete', 'admin', 'perm_users_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_roles', 'admin', 'perm_users_roles', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_read', 'admin', 'perm_settings_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_update', 'admin', 'perm_settings_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_activity_read', 'admin', 'perm_activity_read', strftime('%s', 'now') * 1000),\\n \\n -- Editor permissions\\n ('rp_editor_content_create', 'editor', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_read', 'editor', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_update', 'editor', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_publish', 'editor', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_editor_collections_read', 'editor', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_upload', 'editor', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_read', 'editor', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_update', 'editor', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_users_read', 'editor', 'perm_users_read', strftime('%s', 'now') * 1000),\\n \\n -- Viewer permissions\\n ('rp_viewer_content_read', 'viewer', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_collections_read', 'viewer', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_media_read', 'viewer', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_users_read', 'viewer', 'perm_users_read', strftime('%s', 'now') * 1000);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_team_id ON team_memberships(team_id);\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_user_id ON team_memberships(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_user_id ON user_sessions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_token_hash ON user_sessions(token_hash);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_user_id ON activity_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_created_at ON activity_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_resource ON activity_logs(resource_type, resource_id);\\nCREATE INDEX IF NOT EXISTS idx_password_history_user_id ON password_history(user_id);\\nCREATE INDEX IF NOT EXISTS idx_users_email_verification_token ON users(email_verification_token);\\nCREATE INDEX IF NOT EXISTS idx_users_password_reset_token ON users(password_reset_token);\\nCREATE INDEX IF NOT EXISTS idx_users_invitation_token ON users(invitation_token);\"\n },\n {\n id: '005',\n name: 'Stage7 Workflow Automation',\n filename: '005_stage7_workflow_automation.sql',\n description: 'Migration 005: Stage7 Workflow Automation',\n sql: \"-- Stage 7: Workflow & Automation Migration\\n-- This migration adds workflow and automation capabilities to SonicJS\\n\\n-- Workflow States Table\\nCREATE TABLE IF NOT EXISTS workflow_states (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n color TEXT DEFAULT '#6B7280',\\n is_initial INTEGER DEFAULT 0,\\n is_final INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Insert default workflow states\\nINSERT OR IGNORE INTO workflow_states (id, name, description, color, is_initial, is_final) VALUES\\n('draft', 'Draft', 'Content is being worked on', '#F59E0B', 1, 0),\\n('pending-review', 'Pending Review', 'Content is waiting for review', '#3B82F6', 0, 0),\\n('approved', 'Approved', 'Content has been approved', '#10B981', 0, 0),\\n('published', 'Published', 'Content is live', '#059669', 0, 1),\\n('rejected', 'Rejected', 'Content was rejected', '#EF4444', 0, 1),\\n('archived', 'Archived', 'Content has been archived', '#6B7280', 0, 1);\\n\\n-- Workflows Table\\nCREATE TABLE IF NOT EXISTS workflows (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT,\\n is_active INTEGER DEFAULT 1,\\n auto_publish INTEGER DEFAULT 0,\\n require_approval INTEGER DEFAULT 1,\\n approval_levels INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\\n);\\n\\n-- Workflow Transitions Table\\nCREATE TABLE IF NOT EXISTS workflow_transitions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT NOT NULL,\\n to_state_id TEXT NOT NULL,\\n required_permission TEXT,\\n auto_transition INTEGER DEFAULT 0,\\n transition_conditions TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE,\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id)\\n);\\n\\n-- Content Workflow Status Table\\nCREATE TABLE IF NOT EXISTS content_workflow_status (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n current_state_id TEXT NOT NULL,\\n assigned_to TEXT,\\n due_date DATETIME,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (current_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (assigned_to) REFERENCES users(id),\\n UNIQUE(content_id, workflow_id)\\n);\\n\\n-- Workflow History Table\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT,\\n to_state_id TEXT NOT NULL,\\n user_id TEXT NOT NULL,\\n comment TEXT,\\n metadata TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Scheduled Content Table\\nCREATE TABLE IF NOT EXISTS scheduled_content (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n action TEXT NOT NULL, -- 'publish', 'unpublish', 'archive'\\n scheduled_at DATETIME NOT NULL,\\n timezone TEXT DEFAULT 'UTC',\\n user_id TEXT NOT NULL,\\n status TEXT DEFAULT 'pending', -- 'pending', 'completed', 'failed', 'cancelled'\\n executed_at DATETIME,\\n error_message TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Notifications Table\\nCREATE TABLE IF NOT EXISTS notifications (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n type TEXT NOT NULL, -- 'workflow', 'schedule', 'system'\\n title TEXT NOT NULL,\\n message TEXT NOT NULL,\\n data TEXT, -- JSON\\n is_read INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\\n);\\n\\n-- Notification Preferences Table\\nCREATE TABLE IF NOT EXISTS notification_preferences (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n notification_type TEXT NOT NULL,\\n email_enabled INTEGER DEFAULT 1,\\n in_app_enabled INTEGER DEFAULT 1,\\n digest_frequency TEXT DEFAULT 'daily', -- 'immediate', 'hourly', 'daily', 'weekly'\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\\n UNIQUE(user_id, notification_type)\\n);\\n\\n-- Webhooks Table\\nCREATE TABLE IF NOT EXISTS webhooks (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n url TEXT NOT NULL,\\n secret TEXT,\\n events TEXT NOT NULL, -- JSON array of event types\\n is_active INTEGER DEFAULT 1,\\n retry_count INTEGER DEFAULT 3,\\n timeout_seconds INTEGER DEFAULT 30,\\n last_success_at DATETIME,\\n last_failure_at DATETIME,\\n failure_count INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Webhook Deliveries Table\\nCREATE TABLE IF NOT EXISTS webhook_deliveries (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n webhook_id TEXT NOT NULL,\\n event_type TEXT NOT NULL,\\n payload TEXT NOT NULL, -- JSON\\n response_status INTEGER,\\n response_body TEXT,\\n attempt_count INTEGER DEFAULT 1,\\n delivered_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE\\n);\\n\\n-- Content Versions Table (for rollback functionality)\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n version_number INTEGER NOT NULL,\\n title TEXT NOT NULL,\\n content TEXT NOT NULL,\\n fields TEXT, -- JSON\\n user_id TEXT NOT NULL,\\n change_summary TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, version_number)\\n);\\n\\n-- Automation Rules Table\\nCREATE TABLE IF NOT EXISTS automation_rules (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n trigger_type TEXT NOT NULL, -- 'content_created', 'content_updated', 'workflow_transition', 'schedule'\\n trigger_conditions TEXT, -- JSON\\n action_type TEXT NOT NULL, -- 'workflow_transition', 'send_notification', 'webhook_call', 'auto_save'\\n action_config TEXT, -- JSON\\n is_active INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Auto-save Drafts Table\\nCREATE TABLE IF NOT EXISTS auto_save_drafts (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT,\\n user_id TEXT NOT NULL,\\n title TEXT,\\n content TEXT,\\n fields TEXT, -- JSON\\n last_saved_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, user_id)\\n);\\n\\n-- Add workflow-related columns to existing content table (skip existing columns)\\nALTER TABLE content ADD COLUMN workflow_state_id TEXT DEFAULT 'draft';\\nALTER TABLE content ADD COLUMN embargo_until DATETIME;\\nALTER TABLE content ADD COLUMN expires_at DATETIME;\\nALTER TABLE content ADD COLUMN version_number INTEGER DEFAULT 1;\\nALTER TABLE content ADD COLUMN is_auto_saved INTEGER DEFAULT 0;\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_content_id ON content_workflow_status(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_workflow_id ON content_workflow_status(workflow_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content_id ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_scheduled_at ON scheduled_content(scheduled_at);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_status ON scheduled_content(status);\\nCREATE INDEX IF NOT EXISTS idx_notifications_user_id ON notifications(user_id);\\nCREATE INDEX IF NOT EXISTS idx_notifications_is_read ON notifications(is_read);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content_id ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_auto_save_drafts_user_id ON auto_save_drafts(user_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_state ON content(workflow_state_id);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\n\\n-- Insert default workflow for collections\\nINSERT OR IGNORE INTO workflows (id, name, description, collection_id, is_active, require_approval, approval_levels) \\nSELECT \\n 'default-' || id,\\n 'Default Workflow for ' || name,\\n 'Standard content approval workflow',\\n id,\\n 1,\\n 1,\\n 1\\nFROM collections;\\n\\n-- Insert default workflow transitions\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'draft',\\n 'pending-review',\\n 'content:submit'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'approved',\\n 'content:approve'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'approved',\\n 'published',\\n 'content:publish'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'rejected',\\n 'content:approve'\\nFROM workflows w;\\n\\n-- Insert default notification preferences for all users\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_assigned',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_status_change',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'content_scheduled',\\n 1,\\n 1\\nFROM users;\"\n },\n {\n id: '006',\n name: 'Plugin System',\n filename: '006_plugin_system.sql',\n description: 'Migration 006: Plugin System',\n sql: \"-- Plugin System Tables\\n-- Migration: 006_plugin_system\\n-- Description: Add plugin management system tables\\n\\n-- Plugins table\\nCREATE TABLE IF NOT EXISTS plugins (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n version TEXT NOT NULL,\\n author TEXT NOT NULL,\\n category TEXT NOT NULL,\\n icon TEXT,\\n status TEXT DEFAULT 'inactive' CHECK (status IN ('active', 'inactive', 'error')),\\n is_core BOOLEAN DEFAULT FALSE,\\n settings JSON,\\n permissions JSON,\\n dependencies JSON,\\n download_count INTEGER DEFAULT 0,\\n rating REAL DEFAULT 0,\\n installed_at INTEGER NOT NULL,\\n activated_at INTEGER,\\n last_updated INTEGER NOT NULL,\\n error_message TEXT,\\n created_at INTEGER DEFAULT (unixepoch()),\\n updated_at INTEGER DEFAULT (unixepoch())\\n);\\n\\n-- Plugin hooks table (registered hooks by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_hooks (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n hook_name TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n priority INTEGER DEFAULT 10,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, hook_name, handler_name)\\n);\\n\\n-- Plugin routes table\\nCREATE TABLE IF NOT EXISTS plugin_routes (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n path TEXT NOT NULL,\\n method TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n middleware JSON,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, path, method)\\n);\\n\\n-- Plugin assets table (CSS, JS files provided by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_assets (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n asset_type TEXT NOT NULL CHECK (asset_type IN ('css', 'js', 'image', 'font')),\\n asset_path TEXT NOT NULL,\\n load_order INTEGER DEFAULT 100,\\n load_location TEXT DEFAULT 'footer' CHECK (load_location IN ('header', 'footer')),\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Plugin activity log\\nCREATE TABLE IF NOT EXISTS plugin_activity_log (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n action TEXT NOT NULL,\\n user_id TEXT,\\n details JSON,\\n timestamp INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Create indexes\\nCREATE INDEX IF NOT EXISTS idx_plugins_status ON plugins(status);\\nCREATE INDEX IF NOT EXISTS idx_plugins_category ON plugins(category);\\nCREATE INDEX IF NOT EXISTS idx_plugin_hooks_plugin ON plugin_hooks(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_routes_plugin ON plugin_routes(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_assets_plugin ON plugin_assets(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_plugin ON plugin_activity_log(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_timestamp ON plugin_activity_log(timestamp);\\n\\n-- Insert core plugins\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES \\n(\\n 'core-auth',\\n 'core-auth',\\n 'Authentication System',\\n 'Core authentication and user management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔐',\\n 'active',\\n TRUE,\\n '[\\\"manage:users\\\", \\\"manage:roles\\\", \\\"manage:permissions\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-media',\\n 'core-media', \\n 'Media Manager',\\n 'Core media upload and management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'media',\\n '📸',\\n 'active',\\n TRUE,\\n '[\\\"manage:media\\\", \\\"upload:files\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-workflow',\\n 'core-workflow',\\n 'Workflow Engine',\\n 'Content workflow and approval system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin will be added as a third-party plugin through the admin interface\\n\\n-- Add plugin management permission\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at)\\nVALUES (\\n 'manage:plugins',\\n 'Manage Plugins',\\n 'Install, uninstall, activate, and configure plugins',\\n 'system',\\n unixepoch()\\n);\\n\\n-- Grant plugin management permission to admin role\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at)\\nVALUES ('role-perm-manage-plugins', 'admin', 'manage:plugins', unixepoch());\"\n },\n {\n id: '007',\n name: 'Demo Login Plugin',\n filename: '007_demo_login_plugin.sql',\n description: 'Migration 007: Demo Login Plugin',\n sql: \"-- Demo Login Plugin Migration\\n-- Migration: 007_demo_login_plugin\\n-- Description: Add demo login prefill plugin to the plugin registry\\n\\n-- Insert demo login plugin\\nINSERT INTO plugins (\\n id, name, display_name, description, version, author, category, icon, \\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'demo-login-prefill',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials (admin@sonicjs.com/sonicjs!) for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'inactive',\\n TRUE,\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\"\n },\n {\n id: '008',\n name: 'Fix Slug Validation',\n filename: '008_fix_slug_validation.sql',\n description: 'Migration 008: Fix Slug Validation',\n sql: \"-- Migration: Fix overly restrictive slug validation patterns\\n-- This migration relaxes the slug field validation to be more user-friendly\\n\\n-- Update the pages collection slug field to allow underscores and be less restrictive\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\\n-- Update any other slug fields with the restrictive pattern\\nUPDATE content_fields \\nSET field_options = REPLACE(field_options, '\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"', '\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\"')\\nWHERE field_options LIKE '%\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"%';\"\n },\n {\n id: '009',\n name: 'System Logging',\n filename: '009_system_logging.sql',\n description: 'Migration 009: System Logging',\n sql: \"-- System Logging Tables\\n-- Migration: 009_system_logging\\n-- Description: Add system logging and configuration tables\\n\\n-- System logs table for tracking application events\\nCREATE TABLE IF NOT EXISTS system_logs (\\n id TEXT PRIMARY KEY,\\n level TEXT NOT NULL CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n category TEXT NOT NULL CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n message TEXT NOT NULL,\\n data TEXT, -- JSON data\\n user_id TEXT,\\n session_id TEXT,\\n request_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n method TEXT,\\n url TEXT,\\n status_code INTEGER,\\n duration INTEGER, -- milliseconds\\n stack_trace TEXT,\\n tags TEXT, -- JSON array\\n source TEXT, -- source of the log entry\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Log configuration table for managing log settings per category\\nCREATE TABLE IF NOT EXISTS log_config (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL UNIQUE CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n enabled BOOLEAN NOT NULL DEFAULT TRUE,\\n level TEXT NOT NULL DEFAULT 'info' CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n retention_days INTEGER NOT NULL DEFAULT 30,\\n max_size_mb INTEGER NOT NULL DEFAULT 100,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_system_logs_level ON system_logs(level);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_category ON system_logs(category);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_created_at ON system_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_user_id ON system_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_status_code ON system_logs(status_code);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_source ON system_logs(source);\\n\\n-- Insert default log configurations\\nINSERT OR IGNORE INTO log_config (id, category, enabled, level, retention_days, max_size_mb) VALUES\\n('log-config-auth', 'auth', TRUE, 'info', 90, 50),\\n('log-config-api', 'api', TRUE, 'info', 30, 100),\\n('log-config-workflow', 'workflow', TRUE, 'info', 60, 50),\\n('log-config-plugin', 'plugin', TRUE, 'warn', 30, 25),\\n('log-config-media', 'media', TRUE, 'info', 30, 50),\\n('log-config-system', 'system', TRUE, 'info', 90, 100),\\n('log-config-security', 'security', TRUE, 'warn', 180, 100),\\n('log-config-error', 'error', TRUE, 'error', 90, 200);\"\n },\n {\n id: '011',\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql',\n description: 'Migration 011: Config Managed Collections',\n sql: \"-- Migration: Add Config-Managed Collections Support\\n-- Description: Add 'managed' column to collections table to support config-based collection definitions\\n-- Created: 2025-10-03\\n\\n-- Add 'managed' column to collections table\\n-- This column indicates whether a collection is managed by configuration files (true) or user-created (false)\\n-- Managed collections cannot be edited through the admin UI\\n-- Use a safe approach to add the column only if it doesn't exist\\nALTER TABLE collections ADD COLUMN managed INTEGER DEFAULT 0 NOT NULL;\\n\\n-- Create an index on the managed column for faster queries\\nCREATE INDEX IF NOT EXISTS idx_collections_managed ON collections(managed);\\n\\n-- Create an index on managed + is_active for efficient filtering\\nCREATE INDEX IF NOT EXISTS idx_collections_managed_active ON collections(managed, is_active);\\n\"\n },\n {\n id: '012',\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql',\n description: 'Migration 012: Testimonials Plugin',\n sql: \"-- Testimonials Plugin Migration\\n-- Creates testimonials table for the testimonials plugin\\n-- This demonstrates a code-based collection defined in src/plugins/core-plugins/testimonials-plugin.ts\\n\\nCREATE TABLE IF NOT EXISTS testimonials (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n author_name TEXT NOT NULL,\\n author_title TEXT,\\n author_company TEXT,\\n testimonial_text TEXT NOT NULL,\\n rating INTEGER CHECK(rating >= 1 AND rating <= 5),\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_testimonials_published ON testimonials(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_sort_order ON testimonials(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_rating ON testimonials(rating);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS testimonials_updated_at\\n AFTER UPDATE ON testimonials\\nBEGIN\\n UPDATE testimonials SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('testimonials',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support. This is a code-based collection example.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}');\\n\\n-- Insert sample testimonial data\\nINSERT OR IGNORE INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder) VALUES\\n('Jane Smith',\\n 'CTO',\\n 'TechStartup Inc',\\n 'SonicJS AI has transformed how we manage our content. The plugin architecture is brilliant and the edge deployment is blazing fast.',\\n 5,\\n 1,\\n 1),\\n\\n('Michael Chen',\\n 'Lead Developer',\\n 'Digital Agency Co',\\n 'We migrated from WordPress to SonicJS AI and couldn''t be happier. The TypeScript-first approach and modern tooling make development a joy.',\\n 5,\\n 1,\\n 2),\\n\\n('Sarah Johnson',\\n 'Product Manager',\\n 'E-commerce Solutions',\\n 'The headless CMS approach combined with Cloudflare Workers gives us unmatched performance. Our content is served globally with minimal latency.',\\n 4,\\n 1,\\n 3),\\n\\n('David Rodriguez',\\n 'Full Stack Developer',\\n 'Creative Studio',\\n 'Great CMS for modern web applications. The admin interface is clean and the API is well-designed. Plugin system is very flexible.',\\n 5,\\n 1,\\n 4),\\n\\n('Emily Watson',\\n 'Technical Director',\\n 'Media Company',\\n 'SonicJS AI solved our content distribution challenges. The R2 integration for media storage works flawlessly and scales effortlessly.',\\n 4,\\n 1,\\n 5);\\n\"\n },\n {\n id: '013',\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql',\n description: 'Migration 013: Code Examples Plugin',\n sql: \"-- Code Examples Plugin Migration\\n-- Creates code_examples table for the code examples plugin\\n-- This demonstrates a code-based collection for storing and managing code snippets\\n\\nCREATE TABLE IF NOT EXISTS code_examples (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n title TEXT NOT NULL,\\n description TEXT,\\n code TEXT NOT NULL,\\n language TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_code_examples_published ON code_examples(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_sort_order ON code_examples(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_language ON code_examples(language);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_category ON code_examples(category);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS code_examples_updated_at\\n AFTER UPDATE ON code_examples\\nBEGIN\\n UPDATE code_examples SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('code-examples',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support. Perfect for documentation and tutorials.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}');\\n\\n-- Insert sample code examples\\nINSERT OR IGNORE INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder) VALUES\\n('React useState Hook',\\n 'Basic example of using the useState hook in React for managing component state.',\\n 'import { useState } from ''react'';\\n\\nfunction Counter() {\\n const [count, setCount] = useState(0);\\n\\n return (\\n
\\n

Count: {count}

\\n \\n
\\n );\\n}\\n\\nexport default Counter;',\\n 'javascript',\\n 'frontend',\\n 'react,hooks,state',\\n 1,\\n 1),\\n\\n('TypeScript Interface Example',\\n 'Defining a TypeScript interface for type-safe objects.',\\n 'interface User {\\n id: string;\\n email: string;\\n name: string;\\n role: ''admin'' | ''editor'' | ''viewer'';\\n createdAt: Date;\\n}\\n\\nfunction greetUser(user: User): string {\\n return `Hello, ${user.name}!`;\\n}\\n\\nconst user: User = {\\n id: ''123'',\\n email: ''user@example.com'',\\n name: ''John Doe'',\\n role: ''admin'',\\n createdAt: new Date()\\n};\\n\\nconsole.log(greetUser(user));',\\n 'typescript',\\n 'backend',\\n 'typescript,types,interface',\\n 1,\\n 2),\\n\\n('Python List Comprehension',\\n 'Elegant way to create lists in Python using list comprehensions.',\\n '# Basic list comprehension\\nsquares = [x**2 for x in range(10)]\\nprint(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\\n\\n# With condition\\neven_squares = [x**2 for x in range(10) if x % 2 == 0]\\nprint(even_squares) # [0, 4, 16, 36, 64]\\n\\n# Nested list comprehension\\nmatrix = [[i+j for j in range(3)] for i in range(3)]\\nprint(matrix) # [[0, 1, 2], [1, 2, 3], [2, 3, 4]]',\\n 'python',\\n 'general',\\n 'python,lists,comprehension',\\n 1,\\n 3),\\n\\n('SQL Join Example',\\n 'Common SQL JOIN patterns for combining data from multiple tables.',\\n '-- INNER JOIN: Returns only matching rows\\nSELECT users.name, orders.total\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id;\\n\\n-- LEFT JOIN: Returns all users, even without orders\\nSELECT users.name, orders.total\\nFROM users\\nLEFT JOIN orders ON users.id = orders.user_id;\\n\\n-- Multiple JOINs\\nSELECT\\n users.name,\\n orders.order_date,\\n products.name AS product_name\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id\\nINNER JOIN order_items ON orders.id = order_items.order_id\\nINNER JOIN products ON order_items.product_id = products.id;',\\n 'sql',\\n 'database',\\n 'sql,joins,queries',\\n 1,\\n 4),\\n\\n('Go Error Handling',\\n 'Idiomatic error handling pattern in Go.',\\n 'package main\\n\\nimport (\\n\\t\\\"errors\\\"\\n\\t\\\"fmt\\\"\\n)\\n\\nfunc divide(a, b float64) (float64, error) {\\n\\tif b == 0 {\\n\\t\\treturn 0, errors.New(\\\"division by zero\\\")\\n\\t}\\n\\treturn a / b, nil\\n}\\n\\nfunc main() {\\n\\tresult, err := divide(10, 2)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t\\treturn\\n\\t}\\n\\tfmt.Printf(\\\"Result: %.2f\\\\n\\\", result)\\n\\n\\t// This will error\\n\\t_, err = divide(10, 0)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t}\\n}',\\n 'go',\\n 'backend',\\n 'go,error-handling,functions',\\n 1,\\n 5);\\n\"\n },\n {\n id: '014',\n name: 'Fix Plugin Registry',\n filename: '014_fix_plugin_registry.sql',\n description: 'Migration 014: Fix Plugin Registry',\n sql: \"-- Fix Plugin Registry\\n-- Migration: 014_fix_plugin_registry\\n-- Description: Add missing plugins and fix plugin name mismatches\\n\\n-- Note: Cannot easily update plugin names as they may be referenced elsewhere\\n-- Instead we'll add the missing plugins with correct names\\n\\n-- Insert missing plugins\\n\\n-- Core Analytics Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'core-analytics',\\n 'core-analytics',\\n 'Analytics & Tracking',\\n 'Core analytics tracking and reporting plugin with page views and event tracking',\\n '1.0.0',\\n 'SonicJS Team',\\n 'seo',\\n '📊',\\n 'active',\\n TRUE,\\n '[\\\"view:analytics\\\", \\\"manage:tracking\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'faq-plugin',\\n 'faq-plugin',\\n 'FAQ Management',\\n 'Frequently Asked Questions management plugin with categories, search, and custom styling',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '❓',\\n 'active',\\n FALSE,\\n '[\\\"manage:faqs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Seed Data Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'seed-data',\\n 'seed-data',\\n 'Seed Data Generator',\\n 'Generate realistic example users and content for testing and development',\\n '1.0.0',\\n 'SonicJS Team',\\n 'development',\\n '🌱',\\n 'inactive',\\n FALSE,\\n '[\\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Database Tools Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'database-tools',\\n 'database-tools',\\n 'Database Tools',\\n 'Database management tools including truncate, backup, and validation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'system',\\n '🗄️',\\n 'active',\\n FALSE,\\n '[\\\"manage:database\\\", \\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '015',\n name: 'Add Remaining Plugins',\n filename: '015_add_remaining_plugins.sql',\n description: 'Migration 015: Add Remaining Plugins',\n sql: \"-- Add Remaining Plugins\\n-- Migration: 015_add_remaining_plugins\\n-- Description: Add all remaining core plugins that were missing from the registry\\n\\n-- Testimonials Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'testimonials-plugin',\\n 'testimonials-plugin',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '⭐',\\n 'active',\\n FALSE,\\n '[\\\"manage:testimonials\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Code Examples Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'code-examples-plugin',\\n 'code-examples-plugin',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '💻',\\n 'active',\\n FALSE,\\n '[\\\"manage:code-examples\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Workflow Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'workflow-plugin',\\n 'workflow-plugin',\\n 'Workflow Engine',\\n 'Content workflow management with approval chains, scheduling, and automation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Demo Login Plugin (already exists with correct name from migration 007, but let's ensure it's there)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'demo-login-plugin',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '016',\n name: 'Remove Duplicate Cache Plugin',\n filename: '016_remove_duplicate_cache_plugin.sql',\n description: 'Migration 016: Remove Duplicate Cache Plugin',\n sql: \"-- Migration: Remove duplicate cache plugin entry\\n-- Description: Removes the old 'cache' plugin (id: 'cache') that is a duplicate of 'core-cache'\\n-- This fixes the issue where Cache System appears twice in the plugins list\\n-- Created: 2025-10-14\\n\\n-- Remove the old 'cache' plugin entry if it exists\\n-- The correct plugin is 'core-cache' which is managed by plugin-bootstrap.ts\\nDELETE FROM plugins WHERE id = 'cache' AND name = 'cache';\\n\\n-- Clean up any related entries in plugin activity log\\nDELETE FROM plugin_activity_log WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin hooks\\nDELETE FROM plugin_hooks WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin routes\\nDELETE FROM plugin_routes WHERE plugin_id = 'cache';\\n\"\n },\n {\n id: '017',\n name: 'Auth Configurable Fields',\n filename: '017_auth_configurable_fields.sql',\n description: 'Migration 017: Auth Configurable Fields',\n sql: \"-- Migration: Make authentication fields configurable\\n-- This migration updates the core-auth plugin to support configurable required fields\\n\\n-- The settings will be stored in the plugins table as JSON\\n-- Default settings for core-auth plugin include:\\n-- {\\n-- \\\"requiredFields\\\": {\\n-- \\\"email\\\": { \\\"required\\\": true, \\\"minLength\\\": 5 },\\n-- \\\"password\\\": { \\\"required\\\": true, \\\"minLength\\\": 8 },\\n-- \\\"username\\\": { \\\"required\\\": true, \\\"minLength\\\": 3 },\\n-- \\\"firstName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 },\\n-- \\\"lastName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 }\\n-- },\\n-- \\\"validation\\\": {\\n-- \\\"emailFormat\\\": true,\\n-- \\\"allowDuplicateUsernames\\\": false\\n-- }\\n-- }\\n\\n-- Update core-auth plugin settings with configurable field requirements\\nUPDATE plugins\\nSET settings = json_object(\\n 'requiredFields', json_object(\\n 'email', json_object('required', 1, 'minLength', 5, 'label', 'Email', 'type', 'email'),\\n 'password', json_object('required', 1, 'minLength', 8, 'label', 'Password', 'type', 'password'),\\n 'username', json_object('required', 1, 'minLength', 3, 'label', 'Username', 'type', 'text'),\\n 'firstName', json_object('required', 1, 'minLength', 1, 'label', 'First Name', 'type', 'text'),\\n 'lastName', json_object('required', 1, 'minLength', 1, 'label', 'Last Name', 'type', 'text')\\n ),\\n 'validation', json_object(\\n 'emailFormat', 1,\\n 'allowDuplicateUsernames', 0,\\n 'passwordRequirements', json_object(\\n 'requireUppercase', 0,\\n 'requireLowercase', 0,\\n 'requireNumbers', 0,\\n 'requireSpecialChars', 0\\n )\\n ),\\n 'registration', json_object(\\n 'enabled', 1,\\n 'requireEmailVerification', 0,\\n 'defaultRole', 'viewer'\\n )\\n)\\nWHERE id = 'core-auth';\\n\\n-- If core-auth plugin doesn't exist, this migration will be handled by bootstrap\\n-- No need to insert here as plugin bootstrap handles initial plugin creation\\n\"\n },\n {\n id: '018',\n name: 'Settings Table',\n filename: '018_settings_table.sql',\n description: 'Migration 018: Settings Table',\n sql: \"-- Create settings table for storing application settings\\nCREATE TABLE IF NOT EXISTS settings (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL, -- 'general', 'appearance', 'security', etc.\\n key TEXT NOT NULL,\\n value TEXT NOT NULL, -- JSON value\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(category, key)\\n);\\n\\n-- Insert default general settings\\nINSERT OR IGNORE INTO settings (id, category, key, value, created_at, updated_at)\\nVALUES\\n (lower(hex(randomblob(16))), 'general', 'siteName', '\\\"SonicJS AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'siteDescription', '\\\"A modern headless CMS powered by AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'timezone', '\\\"UTC\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'language', '\\\"en\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'maintenanceMode', 'false', unixepoch() * 1000, unixepoch() * 1000);\\n\\n-- Create index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);\\nCREATE INDEX IF NOT EXISTS idx_settings_category_key ON settings(category, key);\\n\"\n },\n {\n id: '019',\n name: 'Remove Blog Posts Collection',\n filename: '019_remove_blog_posts_collection.sql',\n description: 'Migration 019: Remove Blog Posts Collection',\n sql: \"-- Migration: Remove blog_posts from database-managed collections\\n-- Description: Remove blog-posts-collection from the database so it can be managed by code-based collection\\n-- Created: 2025-11-04\\n\\n-- Delete content associated with blog-posts-collection\\nDELETE FROM content WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete content fields for blog-posts-collection\\nDELETE FROM content_fields WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete the blog-posts collection itself\\nDELETE FROM collections WHERE id = 'blog-posts-collection';\\n\\n-- The blog-posts collection will now be managed by the code-based collection\\n-- in src/collections/blog-posts.collection.ts\\n\"\n },\n {\n id: '020',\n name: 'Add Email Plugin',\n filename: '020_add_email_plugin.sql',\n description: 'Migration 020: Add Email Plugin',\n sql: \"-- Add Email Plugin\\n-- Migration: 020_add_email_plugin\\n-- Description: Add email plugin for transactional emails via Resend\\n\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'email',\\n 'email',\\n 'Email',\\n 'Send transactional emails using Resend',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'utilities',\\n '📧',\\n 'inactive',\\n TRUE,\\n '[\\\"email:manage\\\", \\\"email:send\\\", \\\"email:view-logs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '021',\n name: 'Add Magic Link Auth Plugin',\n filename: '021_add_magic_link_auth_plugin.sql',\n description: 'Migration 021: Add Magic Link Auth Plugin',\n sql: \"-- Add Magic Link Authentication Plugin\\n-- Migration: 021_add_magic_link_auth_plugin\\n-- Description: Add magic link authentication plugin for passwordless login\\n\\n-- Create magic_links table\\nCREATE TABLE IF NOT EXISTS magic_links (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_magic_links_token ON magic_links(token);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_email ON magic_links(user_email);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_expires ON magic_links(expires_at);\\n\\n-- Register the plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'magic-link-auth',\\n 'magic-link-auth',\\n 'Magic Link Authentication',\\n 'Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔗',\\n 'inactive',\\n FALSE,\\n '[\\\"auth:manage\\\", \\\"auth:magic-link\\\"]',\\n '[\\\"email\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '022',\n name: 'Add Tinymce Plugin',\n filename: '022_add_tinymce_plugin.sql',\n description: 'Migration 022: Add Tinymce Plugin',\n sql: \"-- Add TinyMCE Rich Text Editor Plugin\\n-- Migration: 022_add_tinymce_plugin\\n-- Description: Add TinyMCE plugin for WYSIWYG rich text editing\\n\\n-- Register the plugin (active by default since it replaces hardcoded TinyMCE)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'tinymce-plugin',\\n 'tinymce-plugin',\\n 'TinyMCE Rich Text Editor',\\n 'Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✏️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"apiKey\\\":\\\"no-api-key\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"skin\\\":\\\"oxide-dark\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '023',\n name: 'Add Easy Mdx Plugin',\n filename: '023_add_easy_mdx_plugin.sql',\n description: 'Migration 023: Add Easy Mdx Plugin',\n sql: \"-- Add EasyMDE Markdown Editor Plugin\\n-- Migration: 023_add_easy_mdx_plugin\\n-- Description: Add EasyMDE plugin for lightweight markdown editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easy-mdx',\\n 'easy-mdx',\\n 'EasyMDE Markdown Editor',\\n 'Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '📝',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"defaultHeight\\\":400,\\\"theme\\\":\\\"dark\\\",\\\"toolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '024',\n name: 'Add Quill Editor Plugin',\n filename: '024_add_quill_editor_plugin.sql',\n description: 'Migration 024: Add Quill Editor Plugin',\n sql: \"-- Add Quill Rich Text Editor Plugin\\n-- Migration: 024_add_quill_editor_plugin\\n-- Description: Add Quill plugin for modern rich text editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'quill-editor',\\n 'quill-editor',\\n 'Quill Rich Text Editor',\\n 'Modern rich text editor for content creation. Provides a clean, intuitive WYSIWYG editor with customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"snow\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '025',\n name: 'Add Easymde Plugin',\n filename: '025_add_easymde_plugin.sql',\n description: 'Migration 025: Add Easymde Plugin',\n sql: \"-- Add EasyMDE Rich Text Editor Plugin\\n-- Migration: 025_add_easymde_plugin\\n-- Description: Add EasyMDE plugin for markdown-based rich text editing\\n\\n-- Register the plugin (inactive by default, replacing MDXEditor)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easymde-editor',\\n 'easymde-editor',\\n 'EasyMDE Editor',\\n 'Lightweight markdown editor for content creation. Simple, elegant WYSIWYG markdown editor with live preview, toolbar, and dark mode support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'inactive',\\n TRUE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"dark\\\",\\\"defaultHeight\\\":300,\\\"toolbar\\\":\\\"full\\\",\\\"spellChecker\\\":false,\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '026',\n name: 'Add Otp Login',\n filename: '026_add_otp_login.sql',\n description: 'Migration 026: Add Otp Login',\n sql: \"-- Add OTP Login Plugin\\n-- Migration: 021_add_otp_login\\n-- Description: Add OTP login plugin for passwordless authentication via email codes\\n\\n-- Create table for OTP codes\\nCREATE TABLE IF NOT EXISTS otp_codes (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n code TEXT NOT NULL,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n attempts INTEGER DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_otp_email_code ON otp_codes(user_email, code);\\nCREATE INDEX IF NOT EXISTS idx_otp_expires ON otp_codes(expires_at);\\nCREATE INDEX IF NOT EXISTS idx_otp_used ON otp_codes(used);\\n\\n-- Add plugin record\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'otp-login',\\n 'otp-login',\\n 'OTP Login',\\n 'Passwordless authentication via email one-time codes',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'security',\\n '🔢',\\n 'inactive',\\n TRUE,\\n '[\\\"otp:manage\\\", \\\"otp:request\\\", \\\"otp:verify\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '027',\n name: 'Fix Slug Field Type',\n filename: '027_fix_slug_field_type.sql',\n description: 'Migration 027: Fix Slug Field Type',\n sql: \"-- Migration: Fix slug field type\\n-- Description: Update slug fields to use 'slug' field type instead of 'text' for proper auto-generation\\n-- Created: 2026-01-10\\n\\n-- Update pages collection slug field to use 'slug' field type\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\"\n },\n {\n id: '028',\n name: 'Fix Slug Field Type In Schemas',\n filename: '028_fix_slug_field_type_in_schemas.sql',\n description: 'Migration 028: Fix Slug Field Type In Schemas',\n sql: \"-- Migration: Fix slug field type in collection schemas\\n-- Description: Update slug fields in collection schemas to use 'slug' type instead of 'string'\\n-- Created: 2026-01-10\\n\\n-- Update pages-collection schema\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'pages-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update blog-posts-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'blog-posts-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update news-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'news-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\"\n },\n {\n id: '029',\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql',\n description: 'Migration 029: Add Forms System',\n sql: \"-- Migration: 029_add_forms_system.sql\\n-- Description: Add Form.io integration for advanced form building\\n-- Date: January 23, 2026\\n-- Phase: 1 - Database Schema\\n\\n-- =====================================================\\n-- Table: forms\\n-- Description: Stores form definitions and configuration\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS forms (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE, -- Machine name (e.g., \\\"contact-form\\\")\\n display_name TEXT NOT NULL, -- Human name (e.g., \\\"Contact Form\\\")\\n description TEXT, -- Optional description\\n category TEXT DEFAULT 'general', -- Form category (contact, survey, registration, etc.)\\n \\n -- Form.io schema (JSON)\\n formio_schema TEXT NOT NULL, -- Complete Form.io JSON schema\\n \\n -- Settings\\n settings TEXT, -- JSON: {\\n -- emailNotifications: true,\\n -- notifyEmail: \\\"admin@example.com\\\",\\n -- successMessage: \\\"Thank you!\\\",\\n -- redirectUrl: \\\"/thank-you\\\",\\n -- allowAnonymous: true,\\n -- requireAuth: false,\\n -- maxSubmissions: null,\\n -- submitButtonText: \\\"Submit\\\",\\n -- saveProgress: true,\\n -- webhookUrl: null\\n -- }\\n \\n -- Status & Management\\n is_active INTEGER DEFAULT 1, -- Active/inactive flag\\n is_public INTEGER DEFAULT 1, -- Public (anyone) vs private (auth required)\\n managed INTEGER DEFAULT 0, -- Code-managed (like collections)\\n \\n -- Metadata\\n icon TEXT, -- Optional icon for admin UI\\n color TEXT, -- Optional color (hex) for admin UI\\n tags TEXT, -- JSON array of tags\\n \\n -- Stats\\n submission_count INTEGER DEFAULT 0, -- Total submissions received\\n view_count INTEGER DEFAULT 0, -- Form views (optional tracking)\\n \\n -- Ownership\\n created_by TEXT REFERENCES users(id), -- User who created the form\\n updated_by TEXT REFERENCES users(id), -- User who last updated\\n \\n -- Timestamps\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for forms\\nCREATE INDEX IF NOT EXISTS idx_forms_name ON forms(name);\\nCREATE INDEX IF NOT EXISTS idx_forms_category ON forms(category);\\nCREATE INDEX IF NOT EXISTS idx_forms_active ON forms(is_active);\\nCREATE INDEX IF NOT EXISTS idx_forms_public ON forms(is_public);\\nCREATE INDEX IF NOT EXISTS idx_forms_created_by ON forms(created_by);\\n\\n-- =====================================================\\n-- Table: form_submissions\\n-- Description: Stores submitted form data\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_submissions (\\n id TEXT PRIMARY KEY,\\n form_id TEXT NOT NULL REFERENCES forms(id) ON DELETE CASCADE,\\n \\n -- Submission data\\n submission_data TEXT NOT NULL, -- JSON: The actual form data submitted\\n \\n -- Submission metadata\\n status TEXT DEFAULT 'pending', -- pending, reviewed, approved, rejected, spam\\n submission_number INTEGER, -- Sequential number per form\\n \\n -- User information (if authenticated)\\n user_id TEXT REFERENCES users(id), -- Submitter user ID (if logged in)\\n user_email TEXT, -- Email from form (or user account)\\n \\n -- Tracking information\\n ip_address TEXT, -- IP address of submitter\\n user_agent TEXT, -- Browser user agent\\n referrer TEXT, -- Page that referred to form\\n utm_source TEXT, -- UTM tracking params\\n utm_medium TEXT,\\n utm_campaign TEXT,\\n \\n -- Review/Processing\\n reviewed_by TEXT REFERENCES users(id), -- Admin who reviewed\\n reviewed_at INTEGER, -- Review timestamp\\n review_notes TEXT, -- Admin notes\\n \\n -- Flags\\n is_spam INTEGER DEFAULT 0, -- Spam flag\\n is_archived INTEGER DEFAULT 0, -- Archived flag\\n \\n -- Timestamps\\n submitted_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for submissions\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_form_id ON form_submissions(form_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_status ON form_submissions(status);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_user_id ON form_submissions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_email ON form_submissions(user_email);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_submitted_at ON form_submissions(submitted_at);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_spam ON form_submissions(is_spam);\\n\\n-- Trigger to auto-increment submission_number per form\\nCREATE TRIGGER IF NOT EXISTS set_submission_number\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE form_submissions \\n SET submission_number = (\\n SELECT COUNT(*) \\n FROM form_submissions \\n WHERE form_id = NEW.form_id \\n AND id <= NEW.id\\n )\\n WHERE id = NEW.id;\\nEND;\\n\\n-- Trigger to update form submission_count\\nCREATE TRIGGER IF NOT EXISTS increment_form_submission_count\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE forms \\n SET submission_count = submission_count + 1,\\n updated_at = unixepoch() * 1000\\n WHERE id = NEW.form_id;\\nEND;\\n\\n-- =====================================================\\n-- Table: form_files (Optional)\\n-- Description: Link form submissions to uploaded files\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_files (\\n id TEXT PRIMARY KEY,\\n submission_id TEXT NOT NULL REFERENCES form_submissions(id) ON DELETE CASCADE,\\n media_id TEXT NOT NULL REFERENCES media(id) ON DELETE CASCADE,\\n field_name TEXT NOT NULL, -- Form field that uploaded this file\\n uploaded_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for form files\\nCREATE INDEX IF NOT EXISTS idx_form_files_submission ON form_files(submission_id);\\nCREATE INDEX IF NOT EXISTS idx_form_files_media ON form_files(media_id);\\n\\n-- =====================================================\\n-- Sample Data: Create a default contact form\\n-- =====================================================\\n\\nINSERT OR IGNORE INTO forms (\\n id,\\n name,\\n display_name,\\n description,\\n category,\\n formio_schema,\\n settings,\\n is_active,\\n is_public,\\n created_at,\\n updated_at\\n) VALUES (\\n 'default-contact-form',\\n 'contact',\\n 'Contact Form',\\n 'A simple contact form for getting in touch',\\n 'contact',\\n '{\\\"components\\\":[]}',\\n '{\\\"emailNotifications\\\":false,\\\"successMessage\\\":\\\"Thank you for your submission!\\\",\\\"submitButtonText\\\":\\\"Submit\\\",\\\"requireAuth\\\":false}',\\n 1,\\n 1,\\n unixepoch() * 1000,\\n unixepoch() * 1000\\n);\\n\"\n },\n {\n id: '030',\n name: 'Add Turnstile To Forms',\n filename: '030_add_turnstile_to_forms.sql',\n description: 'Migration 030: Add Turnstile To Forms',\n sql: \"-- Add Turnstile configuration to forms table\\n-- This allows per-form Turnstile settings with global fallback\\n\\n-- Add columns (D1 may not support CHECK constraints in ALTER TABLE)\\nALTER TABLE forms ADD COLUMN turnstile_enabled INTEGER DEFAULT 0;\\nALTER TABLE forms ADD COLUMN turnstile_settings TEXT;\\n\\n-- Set default to inherit global settings for existing forms\\nUPDATE forms \\nSET turnstile_settings = '{\\\"inherit\\\":true}' \\nWHERE turnstile_settings IS NULL;\\n\\n-- Add index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_forms_turnstile ON forms(turnstile_enabled);\\n\"\n },\n {\n id: '031',\n name: 'Ai Search Plugin',\n filename: '031_ai_search_plugin.sql',\n description: 'Migration 031: Ai Search Plugin',\n sql: \"-- AI Search plugin settings\\nCREATE TABLE IF NOT EXISTS ai_search_settings (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n enabled BOOLEAN DEFAULT 0,\\n ai_mode_enabled BOOLEAN DEFAULT 1,\\n selected_collections TEXT, -- JSON array of collection IDs to index\\n dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index\\n autocomplete_enabled BOOLEAN DEFAULT 1,\\n cache_duration INTEGER DEFAULT 1, -- hours\\n results_limit INTEGER DEFAULT 20,\\n index_media BOOLEAN DEFAULT 0,\\n index_status TEXT, -- JSON object with status per collection\\n last_indexed_at INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Search history/analytics\\nCREATE TABLE IF NOT EXISTS ai_search_history (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n query TEXT NOT NULL,\\n mode TEXT, -- 'ai' or 'keyword'\\n results_count INTEGER,\\n user_id INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index metadata tracking (per collection)\\nCREATE TABLE IF NOT EXISTS ai_search_index_meta (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n collection_id INTEGER NOT NULL,\\n collection_name TEXT NOT NULL, -- Cache collection name for display\\n total_items INTEGER DEFAULT 0,\\n indexed_items INTEGER DEFAULT 0,\\n last_sync_at INTEGER,\\n status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'\\n error_message TEXT,\\n UNIQUE(collection_id)\\n);\\n\\n-- Indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);\\n\"\n },\n {\n id: '032',\n name: 'User Profiles',\n filename: '032_user_profiles.sql',\n description: 'Migration 032: User Profiles',\n sql: \"-- User Profiles Table (Core Migration)\\n-- Stores extended user profile data separate from auth concerns\\n-- Required by admin-users.ts for user edit page profile management\\n--\\n-- Originally introduced as app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\\n-- in upstream PR #508. Core routes (admin-users.ts) were updated to query this table in PR #512,\\n-- but no corresponding core migration was added. This migration corrects that gap.\\n--\\n-- IF NOT EXISTS guards ensure idempotency for databases that already have the table\\n-- from the app-level migration.\\n\\nCREATE TABLE IF NOT EXISTS user_profiles (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,\\n\\n display_name TEXT,\\n bio TEXT,\\n company TEXT,\\n job_title TEXT,\\n website TEXT,\\n location TEXT,\\n date_of_birth INTEGER,\\n data TEXT DEFAULT '{}',\\n\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index for fast user lookups\\nCREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);\\n\\n-- Trigger to auto-update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS user_profiles_updated_at\\n AFTER UPDATE ON user_profiles\\nBEGIN\\n UPDATE user_profiles SET updated_at = strftime('%s', 'now') * 1000 WHERE id = NEW.id;\\nEND;\\n\"\n },\n {\n id: '033',\n name: 'Form Content Integration',\n filename: '033_form_content_integration.sql',\n description: 'Migration 033: Form Content Integration',\n sql: \"-- Migration 033: Form-Content Integration\\n-- Adds bridge columns to link forms to collections and submissions to content items\\n\\n-- Add source_type and source_id to collections for form-derived collections\\nALTER TABLE collections ADD COLUMN source_type TEXT DEFAULT 'user';\\nALTER TABLE collections ADD COLUMN source_id TEXT;\\n\\n-- Index for efficient lookup of form-derived collections\\nCREATE INDEX IF NOT EXISTS idx_collections_source ON collections(source_type, source_id);\\n\\n-- Add content_id to form_submissions for linking to content items\\nALTER TABLE form_submissions ADD COLUMN content_id TEXT REFERENCES content(id);\\n\\n-- Index for efficient lookup by content_id\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_content_id ON form_submissions(content_id);\\n\\n-- Create system user for anonymous form submissions\\nINSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\\nVALUES ('system-form-submission', 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', NULL, 'viewer', 0, strftime('%s','now') * 1000, strftime('%s','now') * 1000);\\n\"\n },\n {\n id: '034',\n name: 'Security Audit Plugin',\n filename: '034_security_audit_plugin.sql',\n description: 'Migration 034: Security Audit Plugin',\n sql: \"-- Security Audit Plugin\\n-- Tracks login attempts, registrations, and security events for monitoring and brute-force detection\\n\\nCREATE TABLE IF NOT EXISTS security_events (\\n id TEXT PRIMARY KEY,\\n event_type TEXT NOT NULL,\\n severity TEXT NOT NULL DEFAULT 'info',\\n user_id TEXT,\\n email TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n country_code TEXT,\\n request_path TEXT,\\n request_method TEXT,\\n details TEXT,\\n fingerprint TEXT,\\n blocked INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type);\\nCREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_security_events_email ON security_events(email);\\nCREATE INDEX IF NOT EXISTS idx_security_events_ip ON security_events(ip_address);\\nCREATE INDEX IF NOT EXISTS idx_security_events_severity ON security_events(severity);\\nCREATE INDEX IF NOT EXISTS idx_security_events_created ON security_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_security_events_fingerprint ON security_events(fingerprint);\\n\"\n },\n {\n id: '035',\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql',\n description: 'Migration 035: User Profiles Data Column',\n sql: \"-- Migration 035: Add data column to user_profiles (no-op)\\n--\\n-- This migration originally added a missing 'data' column to user_profiles.\\n-- Migration 032 has since been updated to include the column in the CREATE TABLE,\\n-- so on fresh installs the column already exists by the time this runs.\\n--\\n-- The ALTER TABLE has been removed to prevent \\\"duplicate column name: data\\\" errors\\n-- during fresh installs (GitHub issue #771). Wrangler's migration runner does not\\n-- gracefully handle duplicate column errors like the runtime MigrationService does.\\n--\\n-- Existing databases that ran the old 032 (without the data column) get the column\\n-- added at runtime by the core MigrationService, which skips duplicate-column errors.\\n--\\n-- This file is kept as a no-op so that wrangler's migration tracking remains\\n-- consistent (it tracks migrations by filename).\\nSELECT 1;\\n\"\n },\n {\n id: '036',\n name: 'Analytics Events',\n filename: '036_analytics_events.sql',\n description: 'Migration 036: Analytics Events',\n sql: \"-- Migration 036: Analytics Events Table\\n-- Provides storage for user behavior event tracking (page views, custom events)\\n\\nCREATE TABLE IF NOT EXISTS analytics_events (\\n id TEXT PRIMARY KEY,\\n event TEXT NOT NULL,\\n category TEXT NOT NULL DEFAULT 'user-activity',\\n properties TEXT,\\n user_id TEXT,\\n session_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n path TEXT,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_event ON analytics_events(event);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_category ON analytics_events(category);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_user_id ON analytics_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_session_id ON analytics_events(session_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_created_at ON analytics_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_path ON analytics_events(path);\\n\"\n }\n]\n\n// Map for quick lookup by ID\nexport const migrationsByIdMap = new Map(\n bundledMigrations.map(m => [m.id, m])\n)\n\n// Get migration SQL by ID\nexport function getMigrationSQLById(id: string): string | null {\n return migrationsByIdMap.get(id)?.sql ?? null\n}\n\n// Get all migration info (without SQL for lighter payloads)\nexport function getMigrationList(): Array> {\n return bundledMigrations.map(({ sql, ...rest }) => rest)\n}\n","import { D1Database } from '@cloudflare/workers-types'\nimport { bundledMigrations, getMigrationSQLById, type BundledMigration } from '../db/migrations-bundle'\n\nexport interface Migration {\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n}\n\nexport interface MigrationStatus {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Migration[]\n}\n\nexport class MigrationService {\n constructor(private db: D1Database) {}\n\n /**\n * Initialize the migrations tracking table\n */\n async initializeMigrationsTable(): Promise {\n const createTableQuery = `\n CREATE TABLE IF NOT EXISTS migrations (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n filename TEXT NOT NULL,\n applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n checksum TEXT\n )\n `\n\n await this.db.prepare(createTableQuery).run()\n }\n\n /**\n * Get all available migrations from the bundled migrations\n */\n async getAvailableMigrations(): Promise {\n const migrations: Migration[] = []\n\n // Get applied migrations from database\n const appliedResult = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at ASC'\n ).all()\n\n const appliedMigrations = new Map(\n appliedResult.results?.map((row: any) => [row.id, row]) || []\n )\n\n // Auto-detect applied migrations by checking if their tables exist\n await this.autoDetectAppliedMigrations(appliedMigrations)\n\n // Use bundled migrations as the source of truth\n for (const bundled of bundledMigrations) {\n const applied = appliedMigrations.has(bundled.id)\n const appliedData = appliedMigrations.get(bundled.id)\n\n migrations.push({\n id: bundled.id,\n name: bundled.name,\n filename: bundled.filename,\n description: bundled.description,\n applied,\n appliedAt: applied ? appliedData?.applied_at : undefined,\n size: bundled.sql.length\n })\n }\n\n return migrations\n }\n\n /**\n * Auto-detect applied migrations by checking if their tables exist\n */\n private async autoDetectAppliedMigrations(appliedMigrations: Map): Promise {\n // Check if basic schema tables exist (migration 001)\n if (!appliedMigrations.has('001')) {\n const hasBasicTables = await this.checkTablesExist(['users', 'content', 'collections', 'media'])\n if (hasBasicTables) {\n appliedMigrations.set('001', {\n id: '001',\n applied_at: new Date().toISOString(),\n name: 'Initial Schema',\n filename: '001_initial_schema.sql'\n })\n await this.markMigrationApplied('001', 'Initial Schema', '001_initial_schema.sql')\n }\n }\n\n // Check if FAQ tables exist (migration 002)\n // Migration 002 creates only the 'faqs' table\n if (!appliedMigrations.has('002')) {\n const hasFaqTables = await this.checkTablesExist(['faqs'])\n if (hasFaqTables) {\n appliedMigrations.set('002', {\n id: '002',\n applied_at: new Date().toISOString(),\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql'\n })\n await this.markMigrationApplied('002', 'Faq Plugin', '002_faq_plugin.sql')\n }\n }\n\n // Check if stage 5 enhancement tables exist (migration 003)\n // Migration 003 creates content_fields, content_relationships, workflow_templates tables\n if (!appliedMigrations.has('003')) {\n const hasStage5Tables = await this.checkTablesExist(['content_fields', 'content_relationships', 'workflow_templates'])\n if (hasStage5Tables) {\n appliedMigrations.set('003', {\n id: '003',\n applied_at: new Date().toISOString(),\n name: 'Stage 5 Enhancements',\n filename: '003_stage5_enhancements.sql'\n })\n await this.markMigrationApplied('003', 'Stage 5 Enhancements', '003_stage5_enhancements.sql')\n }\n }\n\n // Check if testimonials table exists (migration 012)\n if (!appliedMigrations.has('012')) {\n const hasTestimonialsTables = await this.checkTablesExist(['testimonials'])\n if (hasTestimonialsTables) {\n appliedMigrations.set('012', {\n id: '012',\n applied_at: new Date().toISOString(),\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql'\n })\n await this.markMigrationApplied('012', 'Testimonials Plugin', '012_testimonials_plugin.sql')\n }\n }\n\n // Check if code_examples table exists (migration 013)\n if (!appliedMigrations.has('013')) {\n const hasCodeExamplesTables = await this.checkTablesExist(['code_examples'])\n if (hasCodeExamplesTables) {\n appliedMigrations.set('013', {\n id: '013',\n applied_at: new Date().toISOString(),\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql'\n })\n await this.markMigrationApplied('013', 'Code Examples Plugin', '013_code_examples_plugin.sql')\n }\n }\n\n // Check if user management tables exist (migration 004)\n if (!appliedMigrations.has('004')) {\n const hasUserTables = await this.checkTablesExist(['api_tokens', 'workflow_history'])\n if (hasUserTables) {\n appliedMigrations.set('004', {\n id: '004',\n applied_at: new Date().toISOString(),\n name: 'User Management',\n filename: '004_stage6_user_management.sql'\n })\n await this.markMigrationApplied('004', 'User Management', '004_stage6_user_management.sql')\n }\n }\n\n // Check if plugin system tables exist (migration 006)\n if (!appliedMigrations.has('006')) {\n const hasPluginTables = await this.checkTablesExist(['plugins', 'plugin_hooks'])\n if (hasPluginTables) {\n appliedMigrations.set('006', {\n id: '006',\n applied_at: new Date().toISOString(),\n name: 'Plugin System',\n filename: '006_plugin_system.sql'\n })\n await this.markMigrationApplied('006', 'Plugin System', '006_plugin_system.sql')\n }\n }\n\n // Check if managed column exists (migration 011)\n // This handles both cases:\n // 1. Migration not marked as applied but column exists -> mark as applied\n // 2. Migration marked as applied but column doesn't exist -> remove from applied (will re-run)\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!appliedMigrations.has('011') && hasManagedColumn) {\n appliedMigrations.set('011', {\n id: '011',\n applied_at: new Date().toISOString(),\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql'\n })\n await this.markMigrationApplied('011', 'Config Managed Collections', '011_config_managed_collections.sql')\n } else if (appliedMigrations.has('011') && !hasManagedColumn) {\n // Migration was marked as applied but column doesn't exist - remove it so it will re-run\n console.log('[Migration] Migration 011 marked as applied but managed column missing - will re-run')\n appliedMigrations.delete('011')\n await this.removeMigrationApplied('011')\n }\n\n // Check if system_logs table exists (migration 009)\n if (!appliedMigrations.has('009')) {\n const hasLoggingTables = await this.checkTablesExist(['system_logs', 'log_config'])\n if (hasLoggingTables) {\n appliedMigrations.set('009', {\n id: '009',\n applied_at: new Date().toISOString(),\n name: 'System Logging',\n filename: '009_system_logging.sql'\n })\n await this.markMigrationApplied('009', 'System Logging', '009_system_logging.sql')\n }\n }\n\n // Check if settings table exists (migration 018)\n if (!appliedMigrations.has('018')) {\n const hasSettingsTable = await this.checkTablesExist(['settings'])\n if (hasSettingsTable) {\n appliedMigrations.set('018', {\n id: '018',\n applied_at: new Date().toISOString(),\n name: 'Settings Table',\n filename: '018_settings_table.sql'\n })\n await this.markMigrationApplied('018', 'Settings Table', '018_settings_table.sql')\n }\n }\n\n // Check if forms tables exist (migration 029)\n // Migration 029 was reassigned between releases: older versions used it for \"Ai Search Plugin\",\n // newer versions use it for \"Add Forms System\". This handles the case where 029 is marked as\n // applied (from the old AI Search migration) but the forms tables don't actually exist.\n const hasFormsTables = await this.checkTablesExist(['forms', 'form_submissions', 'form_files'])\n if (!appliedMigrations.has('029') && hasFormsTables) {\n appliedMigrations.set('029', {\n id: '029',\n applied_at: new Date().toISOString(),\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql'\n })\n await this.markMigrationApplied('029', 'Add Forms System', '029_add_forms_system.sql')\n } else if (appliedMigrations.has('029') && !hasFormsTables) {\n // Migration was marked as applied (possibly from old \"Ai Search Plugin\" migration)\n // but forms tables don't exist - remove it so the forms migration will re-run\n console.log('[Migration] Migration 029 marked as applied but forms tables missing - will re-run')\n appliedMigrations.delete('029')\n await this.removeMigrationApplied('029')\n }\n\n // Check if user_profiles table exists (migration 032)\n // Table may already exist from app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\n if (!appliedMigrations.has('032')) {\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n appliedMigrations.set('032', {\n id: '032',\n applied_at: new Date().toISOString(),\n name: 'User Profiles',\n filename: '032_user_profiles.sql'\n })\n await this.markMigrationApplied('032', 'User Profiles', '032_user_profiles.sql')\n }\n }\n\n // Ensure user_profiles.data column exists (migration 035 is now a no-op).\n // Databases that ran the old 032 (without data column) need the column added.\n // Migration 035 was converted to a no-op to fix #771 (duplicate column error\n // on fresh installs), so we add the column here if it's missing.\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n const hasDataColumn = await this.checkColumnExists('user_profiles', 'data')\n if (!hasDataColumn) {\n try {\n await this.db.prepare(`ALTER TABLE user_profiles ADD COLUMN data TEXT DEFAULT '{}'`).run()\n console.log('[Migration] Added missing data column to user_profiles')\n } catch (error) {\n // Column may have been added concurrently; ignore duplicate column errors\n const msg = error instanceof Error ? error.message : String(error)\n if (!msg.includes('duplicate column name')) {\n console.error('[Migration] Failed to add data column to user_profiles:', msg)\n }\n }\n }\n }\n\n // Mark migration 035 as applied since it's now a no-op (column handled above)\n if (!appliedMigrations.has('035')) {\n const hasDataCol = hasUserProfilesTable && await this.checkColumnExists('user_profiles', 'data')\n if (hasDataCol) {\n appliedMigrations.set('035', {\n id: '035',\n applied_at: new Date().toISOString(),\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql'\n })\n await this.markMigrationApplied('035', 'User Profiles Data Column', '035_user_profiles_data_column.sql')\n }\n }\n }\n\n /**\n * Check if specific tables exist in the database\n */\n private async checkTablesExist(tableNames: string[]): Promise {\n try {\n for (const tableName of tableNames) {\n const result = await this.db.prepare(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`\n ).bind(tableName).first()\n\n if (!result) {\n return false\n }\n }\n return true\n } catch (error) {\n return false\n }\n }\n\n /**\n * Check if a specific column exists in a table\n */\n private async checkColumnExists(tableName: string, columnName: string): Promise {\n try {\n const result = await this.db.prepare(\n `SELECT * FROM pragma_table_info(?) WHERE name = ?`\n ).bind(tableName, columnName).first()\n\n return !!result\n } catch (error) {\n return false\n }\n }\n\n /**\n * Get migration status summary\n */\n async getMigrationStatus(): Promise {\n await this.initializeMigrationsTable()\n\n const migrations = await this.getAvailableMigrations()\n const appliedMigrations = migrations.filter(m => m.applied)\n const pendingMigrations = migrations.filter(m => !m.applied)\n\n const lastApplied = appliedMigrations.length > 0\n ? appliedMigrations[appliedMigrations.length - 1]?.appliedAt\n : undefined\n\n return {\n totalMigrations: migrations.length,\n appliedMigrations: appliedMigrations.length,\n pendingMigrations: pendingMigrations.length,\n lastApplied,\n migrations\n }\n }\n\n /**\n * Mark a migration as applied\n */\n async markMigrationApplied(migrationId: string, name: string, filename: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'INSERT OR REPLACE INTO migrations (id, name, filename, applied_at) VALUES (?, ?, ?, CURRENT_TIMESTAMP)'\n ).bind(migrationId, name, filename).run()\n }\n\n /**\n * Remove a migration from the applied list (so it can be re-run)\n */\n async removeMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'DELETE FROM migrations WHERE id = ?'\n ).bind(migrationId).run()\n }\n\n /**\n * Check if a specific migration has been applied\n */\n async isMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM migrations WHERE id = ?'\n ).bind(migrationId).first()\n\n return (result?.count as number) > 0\n }\n\n /**\n * Get the last applied migration\n */\n async getLastAppliedMigration(): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at DESC LIMIT 1'\n ).first()\n\n if (!result) return null\n\n return {\n id: result.id as string,\n name: result.name as string,\n filename: result.filename as string,\n applied: true,\n appliedAt: result.applied_at as string\n }\n }\n\n /**\n * Run pending migrations\n */\n async runPendingMigrations(): Promise<{ success: boolean; message: string; applied: string[]; errors: string[] }> {\n await this.initializeMigrationsTable()\n\n const status = await this.getMigrationStatus()\n const pendingMigrations = status.migrations.filter(m => !m.applied)\n\n if (pendingMigrations.length === 0) {\n return {\n success: true,\n message: 'All migrations are up to date',\n applied: [],\n errors: []\n }\n }\n\n // Actually execute the migration files\n const applied: string[] = []\n const errors: string[] = []\n\n for (const migration of pendingMigrations) {\n try {\n console.log(`[Migration] Applying ${migration.id}: ${migration.name}`)\n await this.applyMigration(migration)\n await this.markMigrationApplied(migration.id, migration.name, migration.filename)\n applied.push(migration.id)\n console.log(`[Migration] Successfully applied ${migration.id}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`[Migration] Failed to apply migration ${migration.id}:`, errorMessage)\n errors.push(`${migration.id}: ${errorMessage}`)\n // Continue with other migrations instead of stopping on first failure\n // This allows independent migrations to still be applied\n }\n }\n\n if (errors.length > 0 && applied.length === 0) {\n return {\n success: false,\n message: `Failed to apply migrations: ${errors.join('; ')}`,\n applied,\n errors\n }\n }\n\n return {\n success: true,\n message: applied.length > 0\n ? `Applied ${applied.length} migration(s)${errors.length > 0 ? ` (${errors.length} failed)` : ''}`\n : 'No migrations applied',\n applied,\n errors\n }\n }\n\n /**\n * Apply a specific migration\n */\n private async applyMigration(migration: Migration): Promise {\n // Get the actual migration SQL from the bundle\n const migrationSQL = getMigrationSQLById(migration.id)\n\n if (migrationSQL === null) {\n throw new Error(`Migration SQL not found for ${migration.id}`)\n }\n\n if (migrationSQL.trim() === '') {\n console.log(`[Migration] Skipping empty migration ${migration.id}`)\n return\n }\n\n // Split SQL into individual statements, handling triggers properly\n const statements = this.splitSQLStatements(migrationSQL)\n\n for (const statement of statements) {\n if (statement.trim()) {\n try {\n await this.db.prepare(statement).run()\n } catch (error) {\n // Check if it's a \"already exists\" type error and skip it\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('already exists') ||\n errorMessage.includes('duplicate column name') ||\n errorMessage.includes('UNIQUE constraint failed')) {\n console.log(`[Migration] Skipping (already exists): ${statement.substring(0, 50)}...`)\n continue\n }\n console.error(`[Migration] Error executing statement: ${statement.substring(0, 100)}...`)\n throw error\n }\n }\n }\n }\n\n /**\n * Split SQL into statements, handling CREATE TRIGGER properly\n */\n private splitSQLStatements(sql: string): string[] {\n const statements: string[] = []\n let current = ''\n let inTrigger = false\n\n const lines = sql.split('\\n')\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n // Skip comments and empty lines\n if (trimmed.startsWith('--') || trimmed.length === 0) {\n continue\n }\n\n // Check if we're entering a trigger\n if (trimmed.toUpperCase().includes('CREATE TRIGGER')) {\n inTrigger = true\n }\n\n current += line + '\\n'\n\n // Check if we're exiting a trigger\n if (inTrigger && trimmed.toUpperCase() === 'END;') {\n statements.push(current.trim())\n current = ''\n inTrigger = false\n }\n // Check for regular statement end (not in trigger)\n else if (!inTrigger && trimmed.endsWith(';')) {\n statements.push(current.trim())\n current = ''\n }\n }\n\n // Add any remaining statement\n if (current.trim()) {\n statements.push(current.trim())\n }\n\n return statements.filter(s => s.length > 0)\n }\n\n /**\n * Validate database schema\n */\n async validateSchema(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n // Basic table existence checks\n const requiredTables = [\n 'users', 'content', 'collections', 'media'\n ]\n\n for (const table of requiredTables) {\n try {\n await this.db.prepare(`SELECT COUNT(*) FROM ${table} LIMIT 1`).first()\n } catch (error) {\n issues.push(`Missing table: ${table}`)\n }\n }\n\n // Check for managed column in collections\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!hasManagedColumn) {\n issues.push('Missing column: collections.managed')\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-5QK3FXKX.js.map b/packages/core/dist/chunk-5QK3FXKX.js.map deleted file mode 100644 index a83ba3fef..000000000 --- a/packages/core/dist/chunk-5QK3FXKX.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/middleware/bootstrap.ts","../src/middleware/auth.ts","../src/middleware/metrics.ts","../src/middleware/csrf.ts","../src/middleware/rate-limit.ts","../src/middleware/security-headers.ts","../src/middleware/index.ts"],"names":["result","JWT_SECRET_FALLBACK","getCookie","setCookie"],"mappings":"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","file":"chunk-5QK3FXKX.js","sourcesContent":["import { Context, Next } from \"hono\";\nimport { syncCollections } from \"../services/collection-sync\";\nimport { syncAllFormCollections } from \"../services/form-collection-sync\";\nimport { MigrationService } from \"../services/migrations\";\nimport { PluginBootstrapService } from \"../services/plugin-bootstrap\";\nimport type { SonicJSConfig } from \"../app\";\n\ntype Bindings = {\n DB: D1Database;\n KV: KVNamespace;\n JWT_SECRET?: string;\n CORS_ORIGINS?: string;\n ENVIRONMENT?: string;\n};\n\n// Track if bootstrap has been run in this worker instance\nlet bootstrapComplete = false;\n\n/**\n * Verify security-critical environment configuration at startup.\n * Logs warnings in development, throws in production to prevent\n * insecure deployments from silently running.\n */\nexport function verifySecurityConfig(env: Bindings): void {\n const warnings: string[] = [];\n\n // Check JWT secret\n if (!env.JWT_SECRET) {\n warnings.push(\n \"JWT_SECRET is not set — using hardcoded fallback. Set via `wrangler secret put JWT_SECRET`\"\n );\n } else if (env.JWT_SECRET.includes(\"change-in-production\")) {\n warnings.push(\n \"JWT_SECRET contains the default value — tokens are forgeable. Generate a strong random secret\"\n );\n }\n\n // Check CORS origins\n if (!env.CORS_ORIGINS) {\n warnings.push(\n \"CORS_ORIGINS is not set — all cross-origin API requests will be rejected\"\n );\n }\n\n // Check environment designation\n if (!env.ENVIRONMENT) {\n warnings.push(\n \"ENVIRONMENT is not set — HSTS header will not be applied. Set to \\\"production\\\" or \\\"development\\\"\"\n );\n }\n\n if (warnings.length === 0) {\n return;\n }\n\n const isProduction = env.ENVIRONMENT === \"production\";\n\n for (const warning of warnings) {\n console.warn(`[SonicJS Security] ${warning}`);\n }\n\n if (isProduction) {\n // In production, a missing or default JWT_SECRET is a hard failure —\n // every token issued would be forgeable by anyone reading the source code.\n const hasCritical =\n !env.JWT_SECRET || env.JWT_SECRET.includes(\"change-in-production\");\n if (hasCritical) {\n throw new Error(\n \"[SonicJS Security] CRITICAL: Production deployment is missing a secure JWT_SECRET. \" +\n \"Set it via `wrangler secret put JWT_SECRET` before deploying.\"\n );\n }\n }\n}\n\n/**\n * Bootstrap middleware that ensures system initialization\n * Runs once per worker instance\n */\nexport function bootstrapMiddleware(config: SonicJSConfig = {}) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n // Skip if already bootstrapped in this worker instance\n if (bootstrapComplete) {\n return next();\n }\n\n // Skip bootstrap for static assets and health checks\n const path = c.req.path;\n if (\n path.startsWith(\"/images/\") ||\n path.startsWith(\"/assets/\") ||\n path === \"/health\" ||\n path.endsWith(\".js\") ||\n path.endsWith(\".css\") ||\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".ico\")\n ) {\n return next();\n }\n\n try {\n console.log(\"[Bootstrap] Starting system initialization...\");\n\n // 1. Run database migrations first\n console.log(\"[Bootstrap] Running database migrations...\");\n const migrationService = new MigrationService(c.env.DB);\n await migrationService.runPendingMigrations();\n\n // 2. Sync collection configurations\n console.log(\"[Bootstrap] Syncing collection configurations...\");\n try {\n await syncCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing collections:\", error);\n // Continue bootstrap even if collection sync fails\n }\n\n // 2b. Sync form-derived shadow collections\n console.log(\"[Bootstrap] Syncing form collections...\");\n try {\n await syncAllFormCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing form collections:\", error);\n }\n\n // 3. Bootstrap core plugins (unless disableAll is set)\n if (!config.plugins?.disableAll) {\n console.log(\"[Bootstrap] Bootstrapping core plugins...\");\n const bootstrapService = new PluginBootstrapService(c.env.DB);\n\n // Check if bootstrap is needed\n const needsBootstrap = await bootstrapService.isBootstrapNeeded();\n if (needsBootstrap) {\n await bootstrapService.bootstrapCorePlugins();\n }\n } else {\n console.log(\"[Bootstrap] Plugin bootstrap skipped (disableAll is true)\");\n }\n\n // Mark bootstrap as complete for this worker instance\n bootstrapComplete = true;\n console.log(\"[Bootstrap] System initialization completed\");\n } catch (error) {\n console.error(\"[Bootstrap] Error during system initialization:\", error);\n // Don't prevent the app from starting, but log the error\n }\n\n // 4. Verify security configuration (outside try/catch so critical\n // errors in production propagate and prevent insecure deployments)\n verifySecurityConfig(c.env as Bindings);\n\n return next();\n };\n}\n\n/**\n * Reset bootstrap flag (useful for testing)\n */\nexport function resetBootstrap() {\n bootstrapComplete = false;\n}\n","import { sign, verify } from 'hono/jwt'\nimport { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\ntype JWTPayload = {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n}\n\n// Fallback JWT secret for local development only (no wrangler secret set)\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// Default JWT TTL: 30 days. Can be overridden via JWT_EXPIRES_IN env var.\nconst DEFAULT_JWT_EXPIRES_IN_SECONDS = 60 * 60 * 24 * 30\n\n/**\n * Parse a TTL string like \"30d\", \"12h\", \"3600s\", or a bare number-of-seconds\n * into a seconds value. Returns null if the input is missing/unparseable.\n */\nfunction parseDuration(input: string | number | undefined | null): number | null {\n if (input === undefined || input === null || input === '') return null\n if (typeof input === 'number' && Number.isFinite(input) && input > 0) {\n return Math.floor(input)\n }\n const raw = String(input).trim()\n if (/^\\d+$/.test(raw)) {\n const n = parseInt(raw, 10)\n return n > 0 ? n : null\n }\n const match = raw.match(/^(\\d+)\\s*(s|sec|secs|seconds|m|min|mins|minutes|h|hr|hrs|hours|d|day|days)$/i)\n if (!match) return null\n const value = parseInt(match[1]!, 10)\n const unit = match[2]!.toLowerCase()\n if (unit.startsWith('s')) return value\n if (unit.startsWith('m')) return value * 60\n if (unit.startsWith('h')) return value * 60 * 60\n if (unit.startsWith('d')) return value * 60 * 60 * 24\n return null\n}\n\n/**\n * Resolve the JWT expiry in seconds from the environment.\n * Honors `JWT_EXPIRES_IN` (seconds or \"30d\"/\"12h\"/\"3600s\") with a 30-day default.\n */\nexport function getJwtExpirySeconds(env?: Record | null): number {\n const configured = parseDuration(env?.JWT_EXPIRES_IN)\n return configured ?? DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the JWT expiry in seconds. Precedence: `JWT_EXPIRES_IN` env var\n * (authoritative ceiling) → `settings.security.jwtExpiresIn` DB value\n * (admin-configurable) → 30-day default.\n *\n * The env var wins so operators can cap runtime overrides — admins can adjust\n * the TTL from /admin/settings/security, but an env var, if set, always wins.\n * DB failures fall back to env/default so auth never breaks if the settings\n * table is unreachable.\n */\nexport async function getJwtExpirySecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const envParsed = parseDuration(env?.JWT_EXPIRES_IN)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtExpiresIn'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* value may already be a bare string */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtExpiresIn from settings, falling back to default:', err)\n }\n }\n return DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the refresh grace window (seconds) for `/auth/refresh`. Precedence:\n * `JWT_REFRESH_GRACE_SECONDS` env var → `settings.security.jwtRefreshGraceSeconds`\n * DB value → 7-day default.\n */\nexport async function getJwtRefreshGraceSecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const DEFAULT_GRACE = 60 * 60 * 24 * 7\n const envParsed = parseDuration(env?.JWT_REFRESH_GRACE_SECONDS)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtRefreshGraceSeconds'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* may be bare */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtRefreshGraceSeconds from settings:', err)\n }\n }\n return DEFAULT_GRACE\n}\n\n/**\n * Decode a JWT payload without verifying the signature. Returns null on any\n * parsing failure. Callers MUST independently verify the signature before\n * trusting this value — used from the grace-window refresh path where the\n * signature is verified explicitly via `verifyHs256Signature`.\n */\nfunction decodeJwtPayload(token: string): JWTPayload | null {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return null\n const b64 = parts[1]!.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const json = atob(padded)\n const obj = JSON.parse(json)\n if (!obj || typeof obj.exp !== 'number') return null\n return obj as JWTPayload\n } catch {\n return null\n }\n}\n\nfunction base64UrlToBytes(b64url: string): Uint8Array {\n const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const bin = atob(padded)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return bytes\n}\n\n/**\n * Verify a JWT's HS256 signature using Web Crypto, independent of hono/jwt.\n * Returns true iff the signature matches the header.payload portion.\n */\nasync function verifyHs256Signature(token: string, secret: string): Promise {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return false\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n )\n const signature = base64UrlToBytes(parts[2]!)\n const message = encoder.encode(`${parts[0]}.${parts[1]}`)\n return await crypto.subtle.verify('HMAC', key, signature, message)\n } catch {\n return false\n }\n}\n\nexport class AuthManager {\n static async generateToken(\n userId: string,\n email: string,\n role: string,\n secret?: string,\n expiresInSeconds?: number\n ): Promise {\n const ttl = expiresInSeconds && expiresInSeconds > 0\n ? Math.floor(expiresInSeconds)\n : DEFAULT_JWT_EXPIRES_IN_SECONDS\n const now = Math.floor(Date.now() / 1000)\n const payload: JWTPayload = {\n userId,\n email,\n role,\n exp: now + ttl,\n iat: now\n }\n\n return await sign(payload, secret || JWT_SECRET_FALLBACK, 'HS256')\n }\n\n /**\n * Verify a token's signature and expiration.\n *\n * If `graceSeconds` > 0, tokens whose `exp` is within the grace window\n * (i.e. expired by no more than `graceSeconds`) are still returned. This\n * supports a sliding-session refresh endpoint that accepts recently-expired\n * tokens. Signature failures always return null.\n */\n static async verifyToken(\n token: string,\n secret?: string,\n graceSeconds: number = 0\n ): Promise {\n const effectiveSecret = secret || JWT_SECRET_FALLBACK\n try {\n let payload: JWTPayload | null = null\n try {\n payload = await verify(token, effectiveSecret, 'HS256') as JWTPayload\n } catch (verifyError: any) {\n // hono/jwt checks `exp` before signature, so a bad-signature token\n // that happens to be expired will throw JwtTokenExpired here. For\n // the grace window, we still require a valid HS256 signature before\n // accepting the payload.\n const name = verifyError?.name || ''\n const message = String(verifyError?.message || '')\n const isExpired = name === 'JwtTokenExpired' || message.includes('expired')\n if (!isExpired || graceSeconds <= 0) {\n throw verifyError\n }\n const signatureValid = await verifyHs256Signature(token, effectiveSecret)\n if (!signatureValid) return null\n const decoded = decodeJwtPayload(token)\n if (!decoded) return null\n payload = decoded\n }\n\n if (!payload) return null\n\n const now = Math.floor(Date.now() / 1000)\n if (payload.exp < now - Math.max(0, Math.floor(graceSeconds))) {\n return null\n }\n\n return payload\n } catch (error) {\n console.error('Token verification failed:', error)\n return null\n }\n }\n\n static async hashPassword(password: string): Promise {\n const iterations = 100000\n const salt = new Uint8Array(16)\n crypto.getRandomValues(salt)\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const saltHex = Array.from(salt).map(b => b.toString(16).padStart(2, '0')).join('')\n const hashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n return `pbkdf2:${iterations}:${saltHex}:${hashHex}`\n }\n\n static async hashPasswordLegacy(password: string): Promise {\n const encoder = new TextEncoder()\n const data = encoder.encode(password + 'salt-change-in-production')\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n static async verifyPassword(password: string, storedHash: string): Promise {\n if (storedHash.startsWith('pbkdf2:')) {\n // PBKDF2 format: pbkdf2:::\n const parts = storedHash.split(':')\n if (parts.length !== 4) return false\n\n const iterationsStr = parts[1]!\n const saltHex = parts[2]!\n const expectedHashHex = parts[3]!\n const iterations = parseInt(iterationsStr, 10)\n\n const saltBytes = saltHex.match(/.{2}/g)\n if (!saltBytes) return false\n const salt = new Uint8Array(saltBytes.map(byte => parseInt(byte, 16)))\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const actualHashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n // Constant-time comparison\n if (actualHashHex.length !== expectedHashHex.length) return false\n let result = 0\n for (let i = 0; i < actualHashHex.length; i++) {\n result |= actualHashHex.charCodeAt(i) ^ expectedHashHex.charCodeAt(i)\n }\n return result === 0\n }\n\n // Legacy SHA-256 format (no colons in hash)\n const legacyHash = await this.hashPasswordLegacy(password)\n // Constant-time comparison for legacy too\n if (legacyHash.length !== storedHash.length) return false\n let result = 0\n for (let i = 0; i < legacyHash.length; i++) {\n result |= legacyHash.charCodeAt(i) ^ storedHash.charCodeAt(i)\n }\n return result === 0\n }\n\n static isLegacyHash(storedHash: string): boolean {\n return !storedHash.startsWith('pbkdf2:')\n }\n\n /**\n * Set authentication cookie - useful for plugins implementing alternative auth methods\n * @param c - Hono context\n * @param token - JWT token to set in cookie\n * @param options - Optional cookie configuration\n */\n static setAuthCookie(c: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void {\n setCookie(c, 'auth_token', token, {\n httpOnly: options?.httpOnly ?? true,\n secure: options?.secure ?? true,\n sameSite: options?.sameSite ?? 'Strict',\n maxAge: options?.maxAge ?? getJwtExpirySeconds((c as any)?.env)\n })\n }\n}\n\n// Middleware to require authentication\nexport const requireAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n // Try to get token from Authorization header\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n\n // If no header token, try cookie\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n\n if (!token) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n // Try to get cached token verification from KV\n const kv = c.env?.KV\n let payload: JWTPayload | null = null\n\n if (kv) {\n const cacheKey = `auth:${token.substring(0, 20)}` // Use token prefix as key\n const cached = await kv.get(cacheKey, 'json')\n if (cached) {\n payload = cached as JWTPayload\n }\n }\n\n // If not cached, verify token\n if (!payload) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n payload = await AuthManager.verifyToken(token, jwtSecret)\n\n // Cache the verified payload for 5 minutes\n if (payload && kv) {\n const cacheKey = `auth:${token.substring(0, 20)}`\n await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 })\n }\n }\n\n if (!payload) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Your session has expired, please login again')\n }\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Add user info to context\n c.set('user', payload)\n\n return await next()\n } catch (error) {\n console.error('Auth middleware error:', error)\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Authentication failed, please login again')\n }\n return c.json({ error: 'Authentication failed' }, 401)\n }\n }\n}\n\n// Middleware to require specific role\nexport const requireRole = (requiredRole: string | string[]) => {\n return async (c: Context, next: Next) => {\n const user = c.get('user') as JWTPayload\n \n if (!user) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n \n const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]\n \n if (!roles.includes(user.role)) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=You do not have permission to access this area')\n }\n return c.json({ error: 'Insufficient permissions' }, 403)\n }\n \n return await next()\n }\n}\n\n// Optional auth middleware (doesn't block if no token)\nexport const optionalAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n \n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n \n if (token) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n const payload = await AuthManager.verifyToken(token, jwtSecret)\n if (payload) {\n c.set('user', payload)\n }\n }\n \n return await next()\n } catch (error) {\n // Don't block on auth errors in optional auth\n console.error('Optional auth error:', error)\n return await next()\n }\n }\n}\n","import { MiddlewareHandler } from 'hono'\nimport { metricsTracker } from '../utils/metrics'\n\n/**\n * Middleware to track all HTTP requests for real-time analytics\n * Excludes the metrics endpoint itself to avoid inflating the count\n */\nexport const metricsMiddleware = (): MiddlewareHandler => {\n return async (c, next) => {\n const path = new URL(c.req.url).pathname\n\n // Don't track the metrics endpoint itself to avoid self-inflating counts\n if (path !== '/admin/dashboard/api/metrics') {\n metricsTracker.recordRequest()\n }\n\n // Continue with the request\n await next()\n }\n}\n","/**\n * CSRF Protection Middleware — Signed Double-Submit Cookie\n *\n * Stateless CSRF protection for Cloudflare Workers (no session store needed).\n * Token format: `.` where HMAC-SHA256 is keyed with JWT_SECRET.\n *\n * Flow:\n * GET — ensureCsrfCookie(): reuse existing valid cookie or set a new one\n * POST/PUT/DELETE/PATCH — validate X-CSRF-Token header === csrf_token cookie, HMAC valid\n *\n * Exempt:\n * - Safe methods (GET, HEAD, OPTIONS)\n * - Auth routes that create sessions (/auth/login*, /auth/register*, etc.)\n * - Public form submissions (/forms/*, /api/forms/*) — NOT /admin/forms/*\n * - Requests with no auth_token cookie (Bearer-only or API-key-only)\n */\n\nimport type { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\n// Fallback secret — mirrors auth.ts behavior for local dev without wrangler secret\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Convert ArrayBuffer to URL-safe base64 (no padding). */\nexport function arrayBufferToBase64Url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!)\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Import a string key for HMAC-SHA256. */\nasync function getHmacKey(secret: string): Promise {\n const encoder = new TextEncoder()\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify']\n )\n}\n\n// ============================================================================\n// Token Generation & Validation\n// ============================================================================\n\n/**\n * Generate a signed CSRF token: `.`\n * - nonce = 32 random bytes, base64url-encoded\n * - signature = HMAC-SHA256(nonce, secret), base64url-encoded\n */\nexport async function generateCsrfToken(secret: string): Promise {\n const nonceBytes = new Uint8Array(32)\n crypto.getRandomValues(nonceBytes)\n const nonce = arrayBufferToBase64Url(nonceBytes.buffer)\n\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(nonce))\n const signature = arrayBufferToBase64Url(signatureBuffer)\n\n return `${nonce}.${signature}`\n}\n\n/**\n * Validate a signed CSRF token.\n *\n * Checks that the token has the correct `.` format and that\n * the HMAC signature is valid for the given secret. Uses crypto.subtle.verify\n * which provides constant-time comparison.\n *\n * NOTE: No expiry check here — by design. The security property of signed\n * double-submit comes from the unpredictability of the nonce + the\n * secret-bound HMAC, not from time-bounding. The cookie's maxAge (86400s)\n * handles expiry at the browser level.\n */\nexport async function validateCsrfToken(token: string, secret: string): Promise {\n if (!token || typeof token !== 'string') return false\n\n const dotIndex = token.indexOf('.')\n if (dotIndex === -1) return false\n\n const nonce = token.substring(0, dotIndex)\n const signature = token.substring(dotIndex + 1)\n\n if (!nonce || !signature) return false\n\n try {\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n\n // Decode the signature from base64url\n const sigPadded = signature.replace(/-/g, '+').replace(/_/g, '/')\n const sigBinary = atob(sigPadded)\n const sigBytes = new Uint8Array(sigBinary.length)\n for (let i = 0; i < sigBinary.length; i++) {\n sigBytes[i] = sigBinary.charCodeAt(i)\n }\n\n // crypto.subtle.verify is constant-time\n return await crypto.subtle.verify('HMAC', key, sigBytes.buffer, encoder.encode(nonce))\n } catch {\n return false\n }\n}\n\n// ============================================================================\n// Default Exempt Paths\n// ============================================================================\n\nconst DEFAULT_EXEMPT_PATHS = [\n '/auth/login',\n '/auth/register',\n '/auth/seed-admin',\n '/auth/accept-invitation',\n '/auth/reset-password',\n '/auth/request-password-reset',\n '/auth/otp',\n '/auth/magic-link',\n '/auth/verify',\n '/api/stripe/webhook',\n '/api/events',\n]\n\n/**\n * Check whether a request path is exempt from CSRF validation.\n * - Exact match or startsWith for auth routes (e.g. /auth/login/form)\n * - /forms/* and /api/forms/* are exempt (public submissions)\n * - /api/search* is exempt (read-only POST for complex query params)\n * - /admin/forms/* is NOT exempt\n */\nfunction isExemptPath(path: string, extraExemptPaths: string[] = []): boolean {\n // Public form routes — NOT /admin/forms/*\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/') || path === '/forms' || path === '/api/forms') {\n return true\n }\n\n // Search API — read-only POST (includes /api/search/click, /api/search/facet-click)\n if (path.startsWith('/api/search')) {\n return true\n }\n\n const allExempt = [...DEFAULT_EXEMPT_PATHS, ...extraExemptPaths]\n for (const exempt of allExempt) {\n if (path === exempt || path.startsWith(exempt + '/')) {\n return true\n }\n }\n\n return false\n}\n\n// ============================================================================\n// Middleware\n// ============================================================================\n\nexport interface CsrfOptions {\n /** Additional paths to exempt from CSRF validation. */\n exemptPaths?: string[]\n}\n\n/**\n * CSRF protection middleware (Signed Double-Submit Cookie).\n *\n * - GET/HEAD/OPTIONS: ensure a valid csrf_token cookie exists\n * - POST/PUT/DELETE/PATCH: validate X-CSRF-Token header matches cookie, HMAC valid\n * - Exempt: auth routes, public /forms/*, Bearer-only, API-key-only\n */\nexport function csrfProtection(options: CsrfOptions = {}) {\n return async (c: Context, next: Next): Promise => {\n const method = c.req.method.toUpperCase()\n const path = new URL(c.req.url).pathname\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n\n // Warn if using fallback secret in production\n if (c.env?.ENVIRONMENT === 'production' && !c.env?.JWT_SECRET) {\n console.warn(\n '[CSRF] WARNING: JWT_SECRET is not set in production. ' +\n 'CSRF tokens are signed with the fallback key, which is insecure.'\n )\n }\n\n // Safe methods — just ensure cookie, then pass through\n if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS') {\n await ensureCsrfCookie(c, secret)\n await next()\n return\n }\n\n // Exempt paths — pass through without validation\n if (isExemptPath(path, options.exemptPaths)) {\n await next()\n return\n }\n\n // Bearer-only or API-key-only requests (no auth_token cookie) — exempt\n const authCookie = getCookie(c, 'auth_token')\n if (!authCookie) {\n await next()\n return\n }\n\n // Requests with an Authorization header use token-based auth — the cookie\n // is incidental and CSRF protection is unnecessary (the attacker cannot\n // forge the Authorization header from a cross-origin page).\n const authHeader = c.req.header('Authorization')\n if (authHeader) {\n await next()\n return\n }\n\n // State-changing request with cookie auth — validate CSRF\n const cookieToken = getCookie(c, 'csrf_token')\n let headerToken = c.req.header('X-CSRF-Token')\n\n // Fallback: check _csrf field in form-encoded body (regular HTML form submissions)\n if (!headerToken) {\n const contentType = c.req.header('Content-Type') || ''\n if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n try {\n const body = await c.req.parseBody()\n headerToken = body['_csrf'] as string | undefined\n } catch {\n // Body not parseable — leave headerToken undefined\n }\n }\n }\n\n if (!cookieToken || !headerToken) {\n return csrfError(c, 'CSRF token missing')\n }\n\n if (cookieToken !== headerToken) {\n return csrfError(c, 'CSRF token mismatch')\n }\n\n const isValid = await validateCsrfToken(cookieToken, secret)\n if (!isValid) {\n return csrfError(c, 'CSRF token invalid')\n }\n\n await next()\n }\n}\n\n/**\n * Ensure a valid CSRF cookie exists. Check-then-reuse: if the existing cookie\n * has a valid HMAC signature, reuse it (no new Set-Cookie header). Only\n * generate a fresh token when the cookie is missing or has an invalid signature.\n */\nasync function ensureCsrfCookie(c: Context, secret: string): Promise {\n const existing = getCookie(c, 'csrf_token')\n\n if (existing) {\n const isValid = await validateCsrfToken(existing, secret)\n if (isValid) {\n // Reuse existing valid token — no Set-Cookie needed\n c.set('csrfToken', existing)\n return\n }\n }\n\n // Generate fresh token\n const token = await generateCsrfToken(secret)\n c.set('csrfToken', token)\n\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n setCookie(c, 'csrf_token', token, {\n httpOnly: false, // JS must read this cookie\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: 86400, // 24 hours — browser-side expiry\n })\n}\n\n/** Return a 403 CSRF error — HTML for browser requests, JSON for API. */\nfunction csrfError(c: Context, message: string): Response {\n const accept = c.req.header('Accept') || ''\n if (accept.includes('text/html')) {\n return c.html(\n `403 Forbidden` +\n `

403 Forbidden

${message}

`,\n 403\n )\n }\n return c.json({ error: message, status: 403 }, 403)\n}\n","import { Context, Next } from 'hono'\n\ninterface RateLimitOptions {\n max: number\n windowMs: number\n keyPrefix: string\n}\n\ninterface RateLimitEntry {\n count: number\n resetAt: number\n}\n\n/**\n * KV-based sliding window rate limiter middleware.\n * Gracefully skips if CACHE_KV binding is not available.\n */\nexport function rateLimit(options: RateLimitOptions) {\n const { max, windowMs, keyPrefix } = options\n\n return async (c: Context, next: Next) => {\n const kv = (c.env as any)?.CACHE_KV\n if (!kv) {\n // No KV binding available — skip rate limiting\n return await next()\n }\n\n const ip = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const key = `ratelimit:${keyPrefix}:${ip}`\n\n try {\n const now = Date.now()\n const stored = await kv.get(key, 'json') as RateLimitEntry | null\n\n let entry: RateLimitEntry\n if (stored && stored.resetAt > now) {\n entry = stored\n } else {\n entry = { count: 0, resetAt: now + windowMs }\n }\n\n entry.count++\n\n // Calculate TTL in seconds (KV expiration)\n const ttlSeconds = Math.ceil((entry.resetAt - now) / 1000)\n\n if (entry.count > max) {\n // Store the updated count even when rejecting\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n const retryAfter = Math.ceil((entry.resetAt - now) / 1000)\n c.header('Retry-After', String(retryAfter))\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', '0')\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n return c.json({ error: 'Too many requests. Please try again later.' }, 429)\n }\n\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', String(max - entry.count))\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n\n return await next()\n } catch (error) {\n // Rate limiting should never break the app\n console.error('Rate limiter error (non-fatal):', error)\n return await next()\n }\n }\n}\n","import { Context, Next } from 'hono'\n\n/**\n * Security headers middleware.\n * Sets standard security headers on every response.\n * Skips HSTS in development to avoid local dev issues.\n */\nexport const securityHeadersMiddleware = () => {\n return async (c: Context, next: Next) => {\n await next()\n\n c.header('X-Content-Type-Options', 'nosniff')\n c.header('X-Frame-Options', 'SAMEORIGIN')\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin')\n c.header('Permissions-Policy', 'camera=(), microphone=(), geolocation=()')\n\n // Only set HSTS in non-development environments\n const environment = (c.env as any)?.ENVIRONMENT\n if (environment !== 'development') {\n c.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains')\n }\n }\n}\n","/**\n * Middleware Module Exports\n *\n * Request processing middleware for SonicJS\n *\n * Note: Most middleware is currently in the monolith and will be migrated later.\n * For now, we only export the bootstrap middleware which is used for system initialization.\n */\n\n// Bootstrap middleware\nexport { bootstrapMiddleware, verifySecurityConfig } from './bootstrap'\n\n// Auth middleware\nexport {\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n getJwtExpirySeconds,\n getJwtExpirySecondsFromDb,\n getJwtRefreshGraceSecondsFromDb,\n} from './auth'\n\n// Metrics middleware\nexport { metricsMiddleware } from './metrics'\n\n// CSRF protection middleware\nexport { csrfProtection, generateCsrfToken, validateCsrfToken } from './csrf'\n\n// Rate limiting middleware\nexport { rateLimit } from './rate-limit'\n\n// Re-export types and functions that are referenced but implemented in monolith\n// These are placeholder exports to maintain API compatibility\nexport type Permission = string\nexport type UserPermissions = {\n userId: string\n permissions: Permission[]\n}\n\n// Middleware stubs - these return pass-through middleware that call next()\nexport const loggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const detailedLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const securityLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const performanceLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const cacheHeaders: any = () => async (_c: any, next: any) => await next()\nexport const compressionMiddleware: any = async (_c: any, next: any) => await next()\nexport { securityHeadersMiddleware as securityHeaders } from './security-headers'\n\n// Other stubs\nexport const PermissionManager: any = {}\nexport const requirePermission: any = () => async (_c: any, next: any) => await next()\nexport const requireAnyPermission: any = () => async (_c: any, next: any) => await next()\nexport const logActivity: any = () => {}\nexport const requireActivePlugin: any = () => async (_c: any, next: any) => await next()\nexport const requireActivePlugins: any = () => async (_c: any, next: any) => await next()\nexport const getActivePlugins: any = () => []\nexport const isPluginActive: any = () => false\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-QOZZJZ76.cjs b/packages/core/dist/chunk-656GGECX.cjs similarity index 99% rename from packages/core/dist/chunk-QOZZJZ76.cjs rename to packages/core/dist/chunk-656GGECX.cjs index e233a25e0..90b8a6a00 100644 --- a/packages/core/dist/chunk-QOZZJZ76.cjs +++ b/packages/core/dist/chunk-656GGECX.cjs @@ -1802,5 +1802,5 @@ exports.syncCollection = syncCollection; exports.syncCollections = syncCollections; exports.syncFormCollection = syncFormCollection; exports.validateCollectionConfig = validateCollectionConfig; -//# sourceMappingURL=chunk-QOZZJZ76.cjs.map -//# sourceMappingURL=chunk-QOZZJZ76.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-656GGECX.cjs.map +//# sourceMappingURL=chunk-656GGECX.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-QOZZJZ76.cjs.map b/packages/core/dist/chunk-656GGECX.cjs.map similarity index 99% rename from packages/core/dist/chunk-QOZZJZ76.cjs.map rename to packages/core/dist/chunk-656GGECX.cjs.map index 13bd928b4..7f5b5d76f 100644 --- a/packages/core/dist/chunk-QOZZJZ76.cjs.map +++ b/packages/core/dist/chunk-656GGECX.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/services/collection-loader.ts","../src/services/collection-sync.ts","../src/services/form-collection-sync.ts","../src/services/plugin-service.ts","../src/plugins/manifest-registry.ts","../src/services/plugin-bootstrap.ts"],"names":[],"mappings":"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","file":"chunk-QOZZJZ76.cjs","sourcesContent":["/**\n * Collection Loader Service\n *\n * Loads collection configuration files from the collections directory.\n * Supports both development (reading from filesystem) and production (bundled).\n */\n\nimport { CollectionConfig, CollectionConfigModule } from '../types/collection-config'\n\n// Global registry for externally registered collections\nconst registeredCollections: CollectionConfig[] = []\n\n/**\n * Register collections from the application code\n * This should be called before creating the app\n */\nexport function registerCollections(collections: CollectionConfig[]): void {\n for (const config of collections) {\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config: missing required fields`, config)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n registeredCollections.push(normalizedConfig)\n console.log(`✓ Registered collection: ${config.name}`)\n }\n}\n\n/**\n * Load all collection configurations from the collections directory\n */\nexport async function loadCollectionConfigs(): Promise {\n const collections: CollectionConfig[] = [...registeredCollections]\n\n // Log registered collections summary\n if (registeredCollections.length > 0) {\n console.log(`📦 Found ${registeredCollections.length} registered collection(s) from application`)\n } else {\n console.log(`⚠️ No collections registered. Make sure to call registerCollections() in your app's index.ts`)\n console.log(` Example: import myCollection from './collections/my-collection.collection'`)\n console.log(` registerCollections([myCollection])`)\n }\n\n try {\n // Import all collection files dynamically from core package\n // In production, these will be bundled with the application\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts', { eager: true }) || {}\n let coreCollectionCount = 0\n\n for (const [path, module] of Object.entries(modules)) {\n try {\n const configModule = module as CollectionConfigModule\n\n if (!configModule.default) {\n console.warn(`Collection file ${path} does not export a default config`)\n continue\n }\n\n const config = configModule.default\n\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config in ${path}: missing required fields`)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n collections.push(normalizedConfig)\n coreCollectionCount++\n console.log(`✓ Loaded core collection: ${config.name}`)\n } catch (error) {\n console.error(`Error loading collection from ${path}:`, error)\n }\n }\n\n console.log(`📊 Collection summary: ${collections.length} total (${registeredCollections.length} from app, ${coreCollectionCount} from core)`)\n return collections\n } catch (error) {\n console.error('Error loading collection configurations:', error)\n return collections // Return registered collections even if core loading fails\n }\n}\n\n/**\n * Load a specific collection configuration by name\n * Note: This function requires implementation in the consuming application\n * as it depends on project-specific collection files\n */\nexport async function loadCollectionConfig(name: string): Promise {\n try {\n // Dynamic imports are not supported in library builds\n // This should be implemented in the consuming application\n console.warn('loadCollectionConfig requires implementation in consuming application')\n return null\n } catch (error) {\n console.error(`Error loading collection ${name}:`, error)\n return null\n }\n}\n\n/**\n * Get list of all available collection config file names\n */\nexport async function getAvailableCollectionNames(): Promise {\n try {\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts') || {}\n const names: string[] = []\n\n for (const path of Object.keys(modules)) {\n // Extract collection name from path\n // e.g., '../collections/blog-posts.collection.ts' -> 'blog-posts'\n const match = path.match(/\\/([^/]+)\\.collection\\.ts$/)\n if (match && match[1]) {\n names.push(match[1])\n }\n }\n\n return names\n } catch (error) {\n console.error('Error getting collection names:', error)\n return []\n }\n}\n\n/**\n * Validate a collection configuration\n */\nexport function validateCollectionConfig(config: CollectionConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push('Collection name is required')\n } else if (!/^[a-z0-9_-]+$/.test(config.name)) {\n errors.push('Collection name must contain only lowercase letters, numbers, underscores, and hyphens')\n }\n\n if (!config.displayName) {\n errors.push('Display name is required')\n }\n\n if (!config.schema) {\n errors.push('Schema is required')\n } else {\n // Validate schema structure\n if (config.schema.type !== 'object') {\n errors.push('Schema type must be \"object\"')\n }\n\n if (!config.schema.properties || typeof config.schema.properties !== 'object') {\n errors.push('Schema must have properties')\n }\n\n // Validate field types\n for (const [fieldName, fieldConfig] of Object.entries(config.schema.properties || {})) {\n if (!fieldConfig.type) {\n errors.push(`Field \"${fieldName}\" is missing type`)\n }\n\n // Validate reference fields\n if (fieldConfig.type === 'reference' && !fieldConfig.collection) {\n errors.push(`Reference field \"${fieldName}\" is missing collection property`)\n }\n\n const layoutValue = fieldConfig.objectLayout\n if (layoutValue !== undefined) {\n if (fieldConfig.type !== 'object') {\n errors.push(`Field \"${fieldName}\" uses objectLayout but is not an object field`)\n } else if (!['nested', 'flat'].includes(layoutValue)) {\n errors.push(`Object field \"${fieldName}\" has invalid objectLayout. Use \"nested\" or \"flat\"`)\n }\n }\n\n // Validate select fields\n if (['select', 'multiselect', 'radio'].includes(fieldConfig.type) && !fieldConfig.enum) {\n errors.push(`Select field \"${fieldName}\" is missing enum options`)\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n}\n","/**\n * Collection Sync Service\n *\n * Syncs collection configurations from code to the database.\n * Handles create, update, and validation of config-managed collections.\n */\n\nimport { CollectionConfig, CollectionSyncResult } from '../types/collection-config'\nimport { loadCollectionConfigs, validateCollectionConfig } from './collection-loader'\n\n/**\n * Sync all collection configurations to the database\n */\nexport async function syncCollections(db: D1Database): Promise {\n console.log('🔄 Starting collection sync...')\n\n const results: CollectionSyncResult[] = []\n const configs = await loadCollectionConfigs()\n\n if (configs.length === 0) {\n console.log('⚠️ No collection configurations found')\n return results\n }\n\n for (const config of configs) {\n const result = await syncCollection(db, config)\n results.push(result)\n }\n\n const created = results.filter(r => r.status === 'created').length\n const updated = results.filter(r => r.status === 'updated').length\n const unchanged = results.filter(r => r.status === 'unchanged').length\n const errors = results.filter(r => r.status === 'error').length\n\n console.log(`✅ Collection sync complete: ${created} created, ${updated} updated, ${unchanged} unchanged, ${errors} errors`)\n\n return results\n}\n\n/**\n * Sync a single collection configuration to the database\n */\nexport async function syncCollection(db: D1Database, config: CollectionConfig): Promise {\n try {\n // Validate config\n const validation = validateCollectionConfig(config)\n if (!validation.valid) {\n return {\n name: config.name,\n status: 'error',\n error: `Validation failed: ${validation.errors.join(', ')}`\n }\n }\n\n // Check if collection exists\n const existingStmt = db.prepare('SELECT * FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(config.name).first() as any\n\n const now = Date.now()\n const collectionId = existing?.id || `col-${config.name}-${crypto.randomUUID().slice(0, 8)}`\n\n // Prepare collection data\n const schemaJson = JSON.stringify(config.schema)\n const isActive = config.isActive !== false ? 1 : 0\n const managed = config.managed !== false ? 1 : 0\n\n if (!existing) {\n // Create new collection\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n config.name,\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n now\n ).run()\n\n console.log(` ✓ Created collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'created',\n message: `Created collection \"${config.displayName}\"`\n }\n } else {\n // Check if update is needed\n const existingSchema = existing.schema ? JSON.stringify(existing.schema) : '{}'\n const existingDisplayName = existing.display_name\n const existingDescription = existing.description\n const existingIsActive = existing.is_active\n const existingManaged = existing.managed\n\n const needsUpdate =\n schemaJson !== existingSchema ||\n config.displayName !== existingDisplayName ||\n (config.description || null) !== existingDescription ||\n isActive !== existingIsActive ||\n managed !== existingManaged\n\n if (!needsUpdate) {\n return {\n name: config.name,\n status: 'unchanged',\n message: `Collection \"${config.displayName}\" is up to date`\n }\n }\n\n // Update existing collection\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, schema = ?, is_active = ?, managed = ?, updated_at = ?\n WHERE name = ?\n `)\n\n await updateStmt.bind(\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n config.name\n ).run()\n\n console.log(` ✓ Updated collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'updated',\n message: `Updated collection \"${config.displayName}\"`\n }\n }\n } catch (error) {\n console.error(` ✗ Error syncing collection ${config.name}:`, error)\n\n return {\n name: config.name,\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n}\n\n/**\n * Check if a collection is managed by config\n */\nexport async function isCollectionManaged(db: D1Database, collectionName: string): Promise {\n try {\n const stmt = db.prepare('SELECT managed FROM collections WHERE name = ?')\n const result = await stmt.bind(collectionName).first() as any\n\n return result?.managed === 1\n } catch (error) {\n console.error(`Error checking if collection is managed:`, error)\n return false\n }\n}\n\n/**\n * Get all managed collections from database\n */\nexport async function getManagedCollections(db: D1Database): Promise {\n try {\n const stmt = db.prepare('SELECT name FROM collections WHERE managed = 1')\n const { results } = await stmt.all()\n\n return (results || []).map((row: any) => row.name)\n } catch (error) {\n console.error('Error getting managed collections:', error)\n return []\n }\n}\n\n/**\n * Remove collections that are no longer in config files\n * (Only removes managed collections that aren't in the config)\n */\nexport async function cleanupRemovedCollections(db: D1Database): Promise {\n try {\n const configs = await loadCollectionConfigs()\n const configNames = new Set(configs.map(c => c.name))\n const managedCollections = await getManagedCollections(db)\n const removed: string[] = []\n\n for (const managedName of managedCollections) {\n if (!configNames.has(managedName)) {\n // This managed collection no longer has a config file\n // Mark as inactive instead of deleting (safer)\n const updateStmt = db.prepare(`\n UPDATE collections\n SET is_active = 0, updated_at = ?\n WHERE name = ? AND managed = 1\n `)\n\n await updateStmt.bind(Date.now(), managedName).run()\n removed.push(managedName)\n console.log(` ⚠️ Deactivated removed collection: ${managedName}`)\n }\n }\n\n return removed\n } catch (error) {\n console.error('Error cleaning up removed collections:', error)\n return []\n }\n}\n\n/**\n * Full sync: sync all configs and cleanup removed\n */\nexport async function fullCollectionSync(db: D1Database): Promise<{\n results: CollectionSyncResult[]\n removed: string[]\n}> {\n const results = await syncCollections(db)\n const removed = await cleanupRemovedCollections(db)\n\n return { results, removed }\n}\n","/**\n * Form-Collection Sync Service\n *\n * Bridge logic that creates \"shadow collections\" for forms and\n * dual-writes form submissions to the content table, enabling\n * unified content management for form submissions.\n */\n\nconst SYSTEM_FORM_USER_ID = 'system-form-submission'\n\n/**\n * Convert Form.io component type to collection schema field type\n */\nfunction mapFormioTypeToSchemaType(component: any): { type: string; [key: string]: any } {\n switch (component.type) {\n case 'textfield':\n case 'textarea':\n case 'password':\n case 'phoneNumber':\n case 'url':\n return { type: 'string', title: component.label || component.key }\n case 'email':\n return { type: 'string', format: 'email', title: component.label || component.key }\n case 'number':\n case 'currency':\n return { type: 'number', title: component.label || component.key }\n case 'checkbox':\n return { type: 'boolean', title: component.label || component.key }\n case 'select':\n case 'radio': {\n const enumValues = (component.data?.values || component.values || []).map((v: any) => v.value)\n const enumLabels = (component.data?.values || component.values || []).map((v: any) => v.label)\n return {\n type: 'select',\n title: component.label || component.key,\n enum: enumValues,\n enumLabels\n }\n }\n case 'selectboxes':\n return { type: 'object', title: component.label || component.key }\n case 'datetime':\n case 'day':\n case 'time':\n return { type: 'string', format: 'date-time', title: component.label || component.key }\n case 'file':\n case 'signature':\n return { type: 'string', title: component.label || component.key }\n case 'address':\n return { type: 'object', title: component.label || component.key }\n case 'hidden':\n return { type: 'string', title: component.label || component.key }\n default:\n return { type: 'string', title: component.label || component.key }\n }\n}\n\n/**\n * Recursively extract field components from a Form.io schema,\n * skipping layout-only components (panels, columns, fieldsets, etc.)\n */\nfunction extractFieldComponents(components: any[]): any[] {\n const fields: any[] = []\n if (!components) return fields\n\n for (const comp of components) {\n // Layout components — recurse into children\n if (comp.type === 'panel' || comp.type === 'fieldset' || comp.type === 'well' || comp.type === 'tabs') {\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n continue\n }\n if (comp.type === 'columns' && comp.columns) {\n for (const col of comp.columns) {\n if (col.components) {\n fields.push(...extractFieldComponents(col.components))\n }\n }\n continue\n }\n if (comp.type === 'table' && comp.rows) {\n for (const row of comp.rows) {\n if (Array.isArray(row)) {\n for (const cell of row) {\n if (cell.components) {\n fields.push(...extractFieldComponents(cell.components))\n }\n }\n }\n }\n continue\n }\n // Skip buttons and non-input layout elements\n if (comp.type === 'button' || comp.type === 'htmlelement' || comp.type === 'content') {\n continue\n }\n // Skip turnstile (not data)\n if (comp.type === 'turnstile') {\n continue\n }\n // It's a real field\n if (comp.key) {\n fields.push(comp)\n }\n // Recurse into sub-components for containers\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n }\n return fields\n}\n\n/**\n * Convert a Form.io schema into a collection JSON schema definition\n */\nexport function deriveCollectionSchemaFromFormio(formioSchema: any): any {\n const components = formioSchema?.components || []\n const fieldComponents = extractFieldComponents(components)\n\n const properties: Record = {\n // Always include a title field for the content item\n title: { type: 'string', title: 'Title', required: true }\n }\n const required: string[] = ['title']\n\n for (const comp of fieldComponents) {\n const key = comp.key\n if (!key || key === 'submit' || key === 'title') continue\n const fieldDef = mapFormioTypeToSchemaType(comp)\n if (comp.validate?.required) {\n fieldDef.required = true\n required.push(key)\n }\n properties[key] = fieldDef\n }\n\n return { type: 'object', properties, required }\n}\n\n/**\n * Derive a human-readable title from form submission data\n */\nexport function deriveSubmissionTitle(data: Record, formDisplayName: string): string {\n // Try common fields in order of preference\n const candidates = ['name', 'fullName', 'full_name', 'firstName', 'first_name']\n for (const key of candidates) {\n if (data[key] && typeof data[key] === 'string' && data[key].trim()) {\n // Append last name if available\n if (key === 'firstName' || key === 'first_name') {\n const last = data['lastName'] || data['last_name'] || data['lastname'] || ''\n if (last) return `${data[key].trim()} ${last.trim()}`\n }\n return data[key].trim()\n }\n }\n // Try email\n if (data.email && typeof data.email === 'string' && data.email.trim()) {\n return data.email.trim()\n }\n // Try subject\n if (data.subject && typeof data.subject === 'string' && data.subject.trim()) {\n return data.subject.trim()\n }\n // Fallback\n const dateStr = new Date().toLocaleDateString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })\n return `${formDisplayName} - ${dateStr}`\n}\n\n/**\n * Map form submission status to content status.\n * Form submissions are complete data — they default to 'published'.\n * Only rejected/spam submissions get demoted.\n */\nexport function mapFormStatusToContentStatus(formStatus: string): string {\n switch (formStatus) {\n case 'pending': return 'published'\n case 'reviewed': return 'published'\n case 'approved': return 'published'\n case 'rejected': return 'archived'\n case 'spam': return 'deleted'\n default: return 'published'\n }\n}\n\n/**\n * Create or update a shadow collection for a given form\n */\nexport async function syncFormCollection(db: D1Database, form: {\n id: string\n name: string\n display_name: string\n description?: string | null\n formio_schema: any\n is_active: number | boolean\n}): Promise<{ collectionId: string; status: 'created' | 'updated' | 'unchanged' }> {\n const collectionName = `form_${form.name}`\n const displayName = `${form.display_name} (Form)`\n\n // Parse formio_schema\n const formioSchema = typeof form.formio_schema === 'string'\n ? JSON.parse(form.formio_schema)\n : form.formio_schema\n\n const schema = deriveCollectionSchemaFromFormio(formioSchema)\n const schemaJson = JSON.stringify(schema)\n const now = Date.now()\n const isActive = form.is_active ? 1 : 0\n\n // Check if shadow collection already exists\n const existing = await db.prepare(\n 'SELECT id, schema, display_name, description, is_active FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!existing) {\n // Create new shadow collection\n const collectionId = `col-form-${form.name}-${crypto.randomUUID().slice(0, 8)}`\n\n await db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, source_type, source_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, 1, 'form', ?, ?, ?)\n `).bind(\n collectionId,\n collectionName,\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n form.id,\n now,\n now\n ).run()\n\n console.log(`[FormSync] Created shadow collection: ${collectionName}`)\n return { collectionId, status: 'created' }\n }\n\n // Check if update needed\n const existingSchema = existing.schema ? JSON.stringify(typeof existing.schema === 'string' ? JSON.parse(existing.schema) : existing.schema) : '{}'\n const needsUpdate =\n schemaJson !== existingSchema ||\n displayName !== existing.display_name ||\n (form.description || null) !== existing.description ||\n isActive !== existing.is_active\n\n if (!needsUpdate) {\n return { collectionId: existing.id, status: 'unchanged' }\n }\n\n await db.prepare(`\n UPDATE collections SET display_name = ?, description = ?, schema = ?, is_active = ?, updated_at = ?\n WHERE id = ?\n `).bind(\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n now,\n existing.id\n ).run()\n\n console.log(`[FormSync] Updated shadow collection: ${collectionName}`)\n return { collectionId: existing.id, status: 'updated' }\n}\n\n/**\n * Sync all active forms to shadow collections\n */\nexport async function syncAllFormCollections(db: D1Database): Promise {\n try {\n // Check if forms table exists\n const tableCheck = await db.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='forms'\"\n ).first()\n if (!tableCheck) {\n console.log('[FormSync] Forms table does not exist, skipping form sync')\n return\n }\n\n const { results: forms } = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms'\n ).all()\n\n if (!forms || forms.length === 0) {\n console.log('[FormSync] No forms found, skipping')\n return\n }\n\n let created = 0\n let updated = 0\n\n for (const form of forms) {\n try {\n const result = await syncFormCollection(db, form as any)\n if (result.status === 'created') created++\n if (result.status === 'updated') updated++\n\n // Backfill existing submissions that don't have content_id\n await backfillFormSubmissions(db, form.id as string, result.collectionId)\n } catch (error) {\n console.error(`[FormSync] Error syncing form ${form.name}:`, error)\n }\n }\n\n console.log(`[FormSync] Sync complete: ${created} created, ${updated} updated out of ${forms.length} forms`)\n } catch (error) {\n console.error('[FormSync] Error syncing form collections:', error)\n }\n}\n\n/**\n * Create a content item from a form submission\n */\nexport async function createContentFromSubmission(\n db: D1Database,\n submissionData: Record,\n form: { id: string; name: string; display_name: string },\n submissionId: string,\n metadata: {\n ipAddress?: string | null\n userAgent?: string | null\n userEmail?: string | null\n userId?: string | null\n } = {}\n): Promise {\n try {\n // Find the shadow collection\n let collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!collection) {\n // Shadow collection missing — try to create it on the fly\n console.warn(`[FormSync] No shadow collection found for form ${form.name}, attempting to create...`)\n try {\n const fullForm = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms WHERE id = ?'\n ).bind(form.id).first() as any\n\n if (fullForm) {\n const schema = typeof fullForm.formio_schema === 'string'\n ? JSON.parse(fullForm.formio_schema)\n : fullForm.formio_schema\n const result = await syncFormCollection(db, {\n id: fullForm.id,\n name: fullForm.name,\n display_name: fullForm.display_name,\n description: fullForm.description,\n formio_schema: schema,\n is_active: fullForm.is_active ?? 1\n })\n // Re-query the collection\n collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n console.log(`[FormSync] On-the-fly sync result: ${result.status}, collectionId: ${result.collectionId}`)\n }\n } catch (syncErr) {\n console.error('[FormSync] On-the-fly shadow collection creation failed:', syncErr)\n }\n\n if (!collection) {\n console.error(`[FormSync] Still no shadow collection for form ${form.name} after recovery attempt`)\n return null\n }\n }\n\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const title = deriveSubmissionTitle(submissionData, form.display_name)\n const slug = `submission-${submissionId.slice(0, 8)}`\n\n // Build content data with embedded metadata\n const contentData: Record = {\n title,\n ...submissionData,\n _submission_metadata: {\n submissionId,\n formId: form.id,\n formName: form.name,\n email: metadata.userEmail || submissionData.email || null,\n ipAddress: metadata.ipAddress || null,\n userAgent: metadata.userAgent || null,\n submittedAt: now\n }\n }\n\n const authorId = metadata.userId || SYSTEM_FORM_USER_ID\n\n // Ensure the system user exists (D1 enforces foreign keys)\n if (authorId === SYSTEM_FORM_USER_ID) {\n const systemUser = await db.prepare('SELECT id FROM users WHERE id = ?').bind(SYSTEM_FORM_USER_ID).first()\n if (!systemUser) {\n console.log('[FormSync] System form user missing, creating...')\n const sysNow = Date.now()\n await db.prepare(`\n INSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 0, ?, ?)\n `).bind(SYSTEM_FORM_USER_ID, 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', sysNow, sysNow).run()\n }\n }\n\n console.log(`[FormSync] Inserting content: id=${contentId}, collection=${collection.id}, slug=${slug}, title=${title}, author=${authorId}`)\n\n await db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, 'published', ?, ?, ?)\n `).bind(\n contentId,\n collection.id,\n slug,\n title,\n JSON.stringify(contentData),\n authorId,\n now,\n now\n ).run()\n\n // Link submission to content\n await db.prepare(\n 'UPDATE form_submissions SET content_id = ? WHERE id = ?'\n ).bind(contentId, submissionId).run()\n\n console.log(`[FormSync] Content created successfully: ${contentId}`)\n return contentId\n } catch (error) {\n console.error('[FormSync] Error creating content from submission:', error)\n return null\n }\n}\n\n/**\n * Backfill existing form submissions that don't have a content_id\n */\nexport async function backfillFormSubmissions(\n db: D1Database,\n formId: string,\n collectionId: string\n): Promise {\n try {\n const { results: submissions } = await db.prepare(\n 'SELECT id, submission_data, user_email, ip_address, user_agent, user_id, submitted_at FROM form_submissions WHERE form_id = ? AND content_id IS NULL'\n ).bind(formId).all()\n\n if (!submissions || submissions.length === 0) {\n return 0\n }\n\n // Get form info\n const form = await db.prepare(\n 'SELECT id, name, display_name FROM forms WHERE id = ?'\n ).bind(formId).first() as any\n\n if (!form) return 0\n\n let count = 0\n for (const sub of submissions) {\n try {\n const submissionData = typeof sub.submission_data === 'string'\n ? JSON.parse(sub.submission_data as string)\n : sub.submission_data\n\n const contentId = await createContentFromSubmission(\n db,\n submissionData,\n { id: form.id, name: form.name, display_name: form.display_name },\n sub.id as string,\n {\n ipAddress: sub.ip_address as string | null,\n userAgent: sub.user_agent as string | null,\n userEmail: sub.user_email as string | null,\n userId: sub.user_id as string | null\n }\n )\n if (contentId) count++\n } catch (error) {\n console.error(`[FormSync] Error backfilling submission ${sub.id}:`, error)\n }\n }\n\n if (count > 0) {\n console.log(`[FormSync] Backfilled ${count} submissions for form ${formId}`)\n }\n return count\n } catch (error) {\n console.error('[FormSync] Error backfilling submissions:', error)\n return 0\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\n// Note: PLUGIN_REGISTRY and CORE_PLUGIN_IDS are project-specific\n// They should be passed as parameters to the service in the consuming application\n// import { PLUGIN_REGISTRY, CORE_PLUGIN_IDS } from '../plugins/plugin-registry'\n\nexport interface PluginData {\n id: string\n name: string\n display_name: string\n description: string\n version: string\n author: string\n category: string\n icon: string\n status: 'active' | 'inactive' | 'error'\n is_core: boolean\n settings?: any\n permissions?: string[]\n dependencies?: string[]\n download_count: number\n rating: number\n installed_at: number\n activated_at?: number\n last_updated: number\n error_message?: string\n}\n\nexport interface PluginStats {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n}\n\nexport class PluginService {\n constructor(private db: D1Database) {}\n\n async getAllPlugins(): Promise {\n // Ensure all plugins from registry exist in database (auto-install if missing)\n await this.ensureAllPluginsExist()\n\n const stmt = this.db.prepare(`\n SELECT * FROM plugins\n ORDER BY is_core DESC, display_name ASC\n `)\n\n const { results } = await stmt.all()\n return (results || []).map(this.mapPluginFromDb)\n }\n\n /**\n * Ensure all plugins from the registry exist in the database\n * Auto-installs any newly detected plugins with inactive status\n *\n * Note: This method should be overridden or configured with a plugin registry\n * in the consuming application\n */\n private async ensureAllPluginsExist(): Promise {\n // This functionality requires a project-specific PLUGIN_REGISTRY\n // In the consuming application, you should pass the registry to this service\n console.log('[PluginService] ensureAllPluginsExist - requires PLUGIN_REGISTRY configuration')\n }\n\n async getPlugin(pluginId: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE id = ?')\n const plugin = await stmt.bind(pluginId).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginByName(name: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE name = ?')\n const plugin = await stmt.bind(name).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginStats(): Promise {\n const stmt = this.db.prepare(`\n SELECT \n COUNT(*) as total,\n COUNT(CASE WHEN status = 'active' THEN 1 END) as active,\n COUNT(CASE WHEN status = 'inactive' THEN 1 END) as inactive,\n COUNT(CASE WHEN status = 'error' THEN 1 END) as errors\n FROM plugins\n `)\n \n const stats = await stmt.first() as any\n return {\n total: stats.total || 0,\n active: stats.active || 0,\n inactive: stats.inactive || 0,\n errors: stats.errors || 0,\n uninstalled: 0\n }\n }\n\n async installPlugin(pluginData: Partial): Promise {\n const id = pluginData.id || `plugin-${Date.now()}`\n const now = Math.floor(Date.now() / 1000)\n \n const stmt = this.db.prepare(`\n INSERT INTO plugins (\n id, name, display_name, description, version, author, category, icon,\n status, is_core, settings, permissions, dependencies, download_count, \n rating, installed_at, last_updated\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginData.name || id,\n pluginData.display_name || 'Unnamed Plugin',\n pluginData.description || '',\n pluginData.version || '1.0.0',\n pluginData.author || 'Unknown',\n pluginData.category || 'utilities',\n pluginData.icon || '🔌',\n 'inactive',\n pluginData.is_core || false,\n JSON.stringify(pluginData.settings || {}),\n JSON.stringify(pluginData.permissions || []),\n JSON.stringify(pluginData.dependencies || []),\n pluginData.download_count || 0,\n pluginData.rating || 0,\n now,\n now\n ).run()\n \n // Log the installation\n await this.logActivity(id, 'installed', null, { version: pluginData.version })\n \n const installed = await this.getPlugin(id)\n if (!installed) throw new Error('Failed to install plugin')\n \n return installed\n }\n\n async uninstallPlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n if (plugin.is_core) throw new Error('Cannot uninstall core plugins')\n \n // First deactivate if active\n if (plugin.status === 'active') {\n await this.deactivatePlugin(pluginId)\n }\n \n // Delete the plugin\n const stmt = this.db.prepare('DELETE FROM plugins WHERE id = ?')\n await stmt.bind(pluginId).run()\n \n // Log the uninstallation\n await this.logActivity(pluginId, 'uninstalled', null, { name: plugin.name })\n }\n\n async activatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check dependencies\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n await this.checkDependencies(plugin.dependencies)\n }\n \n const now = Math.floor(Date.now() / 1000)\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'active', activated_at = ?, error_message = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(now, pluginId).run()\n \n // Log the activation\n await this.logActivity(pluginId, 'activated', null)\n }\n\n async deactivatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check if other plugins depend on this one\n await this.checkDependents(plugin.name)\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'inactive', activated_at = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(pluginId).run()\n \n // Log the deactivation\n await this.logActivity(pluginId, 'deactivated', null)\n }\n\n async updatePluginSettings(pluginId: string, settings: any): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET settings = ?, updated_at = unixepoch() \n WHERE id = ?\n `)\n \n await stmt.bind(JSON.stringify(settings), pluginId).run()\n \n // Log the settings update\n await this.logActivity(pluginId, 'settings_updated', null)\n }\n\n async setPluginError(pluginId: string, error: string): Promise {\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'error', error_message = ? \n WHERE id = ?\n `)\n \n await stmt.bind(error, pluginId).run()\n \n // Log the error\n await this.logActivity(pluginId, 'error', null, { error })\n }\n\n async getPluginActivity(pluginId: string, limit: number = 10): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_activity_log \n WHERE plugin_id = ? \n ORDER BY timestamp DESC \n LIMIT ?\n `)\n \n const { results } = await stmt.bind(pluginId, limit).all()\n return (results || []).map((row: any) => ({\n id: row.id,\n action: row.action,\n userId: row.user_id,\n details: row.details ? JSON.parse(row.details) : null,\n timestamp: row.timestamp\n }))\n }\n\n async registerHook(pluginId: string, hookName: string, handlerName: string, priority: number = 10): Promise {\n const id = `hook-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_hooks (id, plugin_id, hook_name, handler_name, priority)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(id, pluginId, hookName, handlerName, priority).run()\n }\n\n async registerRoute(pluginId: string, path: string, method: string, handlerName: string, middleware?: any[]): Promise {\n const id = `route-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_routes (id, plugin_id, path, method, handler_name, middleware)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id, \n pluginId, \n path, \n method, \n handlerName, \n JSON.stringify(middleware || [])\n ).run()\n }\n\n async getPluginHooks(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_hooks \n WHERE plugin_id = ? AND is_active = TRUE\n ORDER BY priority ASC\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n async getPluginRoutes(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_routes \n WHERE plugin_id = ? AND is_active = TRUE\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n private async checkDependencies(dependencies: string[]): Promise {\n for (const dep of dependencies) {\n const plugin = await this.getPluginByName(dep)\n if (!plugin || plugin.status !== 'active') {\n throw new Error(`Required dependency '${dep}' is not active`)\n }\n }\n }\n\n private async checkDependents(pluginName: string): Promise {\n const stmt = this.db.prepare(`\n SELECT id, display_name FROM plugins \n WHERE status = 'active' \n AND dependencies LIKE ?\n `)\n \n const { results } = await stmt.bind(`%\"${pluginName}\"%`).all()\n if (results && results.length > 0) {\n const names = results.map((p: any) => p.display_name).join(', ')\n throw new Error(`Cannot deactivate. The following plugins depend on this one: ${names}`)\n }\n }\n\n private async logActivity(pluginId: string, action: string, userId: string | null, details?: any): Promise {\n const id = `activity-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_activity_log (id, plugin_id, action, user_id, details)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginId,\n action,\n userId,\n details ? JSON.stringify(details) : null\n ).run()\n }\n\n private mapPluginFromDb(row: any): PluginData {\n return {\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n version: row.version,\n author: row.author,\n category: row.category,\n icon: row.icon,\n status: row.status,\n is_core: row.is_core === 1,\n settings: row.settings ? JSON.parse(row.settings) : undefined,\n permissions: row.permissions ? JSON.parse(row.permissions) : undefined,\n dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,\n download_count: row.download_count || 0,\n rating: row.rating || 0,\n installed_at: row.installed_at,\n activated_at: row.activated_at,\n last_updated: row.last_updated,\n error_message: row.error_message\n }\n }\n}\n","/**\n * Plugin Registry - AUTO-GENERATED\n *\n * Generated by: packages/scripts/generate-plugin-registry.mjs\n * Generated at: 2026-05-01T00:32:37.025Z\n * Source: All manifest.json files in src/plugins/\n *\n * DO NOT EDIT MANUALLY - run the generator script instead.\n * To add a new plugin, create a manifest.json in the plugin directory.\n */\n\nexport interface PluginRegistryEntry {\n id: string\n codeName: string\n displayName: string\n description: string\n version: string\n author: string\n category: string\n iconEmoji: string\n is_core: boolean\n permissions: string[]\n dependencies: string[]\n defaultSettings: Record\n adminMenu: {\n label: string\n icon: string\n path: string\n order: number\n } | null\n}\n\n/**\n * All discovered plugins, keyed by plugin ID.\n */\nexport const PLUGIN_REGISTRY: Record = {\n 'ai-search': {\n \"id\": \"ai-search\",\n \"codeName\": \"ai-search-plugin\",\n \"displayName\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"path\": \"/admin/plugins/ai-search\",\n \"order\": 50\n }\n },\n\n 'code-examples-plugin': {\n \"id\": \"code-examples-plugin\",\n \"codeName\": \"code-examples-plugin\",\n \"displayName\": \"Code Examples\",\n \"description\": \"Code snippets and examples library with syntax highlighting and categorization\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💻\",\n \"is_core\": false,\n \"permissions\": [\n \"code-examples:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'core-analytics': {\n \"id\": \"core-analytics\",\n \"codeName\": \"core-analytics\",\n \"displayName\": \"Analytics & Insights\",\n \"description\": \"Core analytics system for tracking page views, user behavior, and content performance. Provides dashboards and reports with real-time metrics\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"seo\",\n \"iconEmoji\": \"📊\",\n \"is_core\": true,\n \"permissions\": [\n \"analytics:view\",\n \"analytics:export\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Analytics\",\n \"icon\": \"chart-bar\",\n \"path\": \"/admin/analytics\",\n \"order\": 50\n }\n },\n\n 'core-auth': {\n \"id\": \"core-auth\",\n \"codeName\": \"core-auth\",\n \"displayName\": \"Authentication System\",\n \"description\": \"Core authentication and user management system with role-based access control, session management, and security features\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔐\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:users\",\n \"manage:roles\",\n \"manage:permissions\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"requiredFields\": {\n \"email\": {\n \"required\": true,\n \"minLength\": 5,\n \"label\": \"Email\",\n \"type\": \"email\"\n },\n \"password\": {\n \"required\": true,\n \"minLength\": 8,\n \"label\": \"Password\",\n \"type\": \"password\"\n },\n \"username\": {\n \"required\": true,\n \"minLength\": 3,\n \"label\": \"Username\",\n \"type\": \"text\"\n },\n \"firstName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"First Name\",\n \"type\": \"text\"\n },\n \"lastName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"Last Name\",\n \"type\": \"text\"\n }\n },\n \"validation\": {\n \"emailFormat\": true,\n \"allowDuplicateUsernames\": false,\n \"passwordRequirements\": {\n \"requireUppercase\": false,\n \"requireLowercase\": false,\n \"requireNumbers\": false,\n \"requireSpecialChars\": false\n }\n },\n \"registration\": {\n \"enabled\": true,\n \"requireEmailVerification\": false,\n \"defaultRole\": \"viewer\"\n }\n },\n \"adminMenu\": null\n },\n\n 'core-cache': {\n \"id\": \"core-cache\",\n \"codeName\": \"core-cache\",\n \"displayName\": \"Cache System\",\n \"description\": \"Three-tiered caching system with in-memory and KV storage. Provides automatic caching for content, users, media, and API responses with configurable TTL and invalidation patterns.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"system\",\n \"iconEmoji\": \"⚡\",\n \"is_core\": true,\n \"permissions\": [\n \"cache.view\",\n \"cache.clear\",\n \"cache.invalidate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableMemoryCache\": true,\n \"enableKVCache\": true,\n \"enableDatabaseCache\": true,\n \"defaultTTL\": 3600\n },\n \"adminMenu\": null\n },\n\n 'core-media': {\n \"id\": \"core-media\",\n \"codeName\": \"core-media\",\n \"displayName\": \"Media Manager\",\n \"description\": \"Core media upload and management system with support for images, videos, and documents. Includes automatic optimization, thumbnail generation, and cloud storage integration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"media\",\n \"iconEmoji\": \"📸\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:media\",\n \"upload:files\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Media\",\n \"icon\": \"image\",\n \"path\": \"/admin/media\",\n \"order\": 30\n }\n },\n\n 'database-tools': {\n \"id\": \"database-tools\",\n \"codeName\": \"database-tools\",\n \"displayName\": \"Database Tools\",\n \"description\": \"Database management and administration tools including migrations, backups, and query execution\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🗄️\",\n \"is_core\": false,\n \"permissions\": [\n \"database:admin\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableTruncate\": true,\n \"enableBackup\": true,\n \"enableValidation\": true,\n \"requireConfirmation\": true\n },\n \"adminMenu\": null\n },\n\n 'demo-login-plugin': {\n \"id\": \"demo-login-plugin\",\n \"codeName\": \"demo-login-plugin\",\n \"displayName\": \"Demo Login\",\n \"description\": \"Quick demo login functionality for testing and demonstrations\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎯\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"core-auth\"\n ],\n \"defaultSettings\": {\n \"enableNotice\": true,\n \"demoEmail\": \"admin@sonicjs.com\",\n \"demoPassword\": \"sonicjs!\"\n },\n \"adminMenu\": null\n },\n\n 'design': {\n \"id\": \"design\",\n \"codeName\": \"design\",\n \"displayName\": \"Design System\",\n \"description\": \"Design system management including themes, components, and UI customization. Provides a visual interface for managing design tokens, typography, colors, and component library.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎨\",\n \"is_core\": false,\n \"permissions\": [\n \"design.view\",\n \"design.edit\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultTheme\": \"light\",\n \"customCSS\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Design\",\n \"icon\": \"palette\",\n \"path\": \"/admin/design\",\n \"order\": 80\n }\n },\n\n 'easy-mdx': {\n \"id\": \"easy-mdx\",\n \"codeName\": \"easy-mdx\",\n \"displayName\": \"EasyMDE Markdown Editor\",\n \"description\": \"Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultHeight\": 400,\n \"theme\": \"dark\",\n \"toolbar\": \"full\",\n \"placeholder\": \"Start writing your content...\"\n },\n \"adminMenu\": null\n },\n\n 'email': {\n \"id\": \"email\",\n \"codeName\": \"email\",\n \"displayName\": \"Email\",\n \"description\": \"Send transactional emails using Resend\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"📧\",\n \"is_core\": false,\n \"permissions\": [\n \"email:manage\",\n \"email:send\",\n \"email:view-logs\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"\",\n \"fromEmail\": \"\",\n \"fromName\": \"\",\n \"replyTo\": \"\",\n \"logoUrl\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Email\",\n \"icon\": \"envelope\",\n \"path\": \"/admin/plugins/email/settings\",\n \"order\": 80\n }\n },\n\n 'global-variables': {\n \"id\": \"global-variables\",\n \"codeName\": \"global-variables\",\n \"displayName\": \"Global Variables\",\n \"description\": \"Dynamic content variables with inline token support. Manage key-value variables via admin UI and use {variable_key} syntax in rich text fields for server-side resolution. Includes full CRUD admin page.\",\n \"version\": \"1.1.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔤\",\n \"is_core\": false,\n \"permissions\": [\n \"global-variables:manage\",\n \"global-variables:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableResolution\": true,\n \"cacheEnabled\": true,\n \"cacheTTL\": 300\n },\n \"adminMenu\": {\n \"label\": \"Global Variables\",\n \"icon\": \"variable\",\n \"path\": \"/admin/global-variables\",\n \"order\": 45\n }\n },\n\n 'hello-world': {\n \"id\": \"hello-world\",\n \"codeName\": \"hello-world\",\n \"displayName\": \"Hello World\",\n \"description\": \"A simple Hello World plugin demonstration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"👋\",\n \"is_core\": false,\n \"permissions\": [\n \"hello-world:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Hello World\",\n \"icon\": \"hand-raised\",\n \"path\": \"/admin/hello-world\",\n \"order\": 90\n }\n },\n\n 'magic-link-auth': {\n \"id\": \"magic-link-auth\",\n \"codeName\": \"magic-link-auth\",\n \"displayName\": \"Magic Link Authentication\",\n \"description\": \"Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔗\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"linkExpiryMinutes\": 15,\n \"rateLimitPerHour\": 5,\n \"allowNewUsers\": true\n },\n \"adminMenu\": null\n },\n\n 'oauth-providers': {\n \"id\": \"oauth-providers\",\n \"codeName\": \"oauth-providers\",\n \"displayName\": \"OAuth Providers\",\n \"description\": \"OAuth2/OIDC social login with GitHub, Google, and more\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"authentication\",\n \"iconEmoji\": \"🔑\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"providers\": {\n \"github\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n },\n \"google\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n }\n }\n },\n \"adminMenu\": null\n },\n\n 'otp-login': {\n \"id\": \"otp-login\",\n \"codeName\": \"otp-login\",\n \"displayName\": \"OTP Login\",\n \"description\": \"Passwordless authentication via email one-time codes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔢\",\n \"is_core\": false,\n \"permissions\": [\n \"otp:manage\",\n \"otp:request\",\n \"otp:verify\"\n ],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"codeLength\": 6,\n \"codeExpiryMinutes\": 10,\n \"maxAttempts\": 3,\n \"rateLimitPerHour\": 5,\n \"allowNewUserRegistration\": false,\n \"logoUrl\": \"\",\n \"logoWidth\": 150,\n \"logoBorderWidth\": 0,\n \"logoBorderColor\": \"#ffffff\",\n \"loginUrl\": \"\",\n \"loginButtonText\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"OTP Login\",\n \"icon\": \"key\",\n \"path\": \"/admin/plugins/otp-login/settings\",\n \"order\": 85\n }\n },\n\n 'quill-editor': {\n \"id\": \"quill-editor\",\n \"codeName\": \"quill-editor\",\n \"displayName\": \"Quill Rich Text Editor\",\n \"description\": \"Quill WYSIWYG editor integration for rich text editing. Lightweight, modern editor with customizable toolbars and dark mode support.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"✍️\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"version\": \"2.0.2\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"theme\": \"snow\"\n },\n \"adminMenu\": null\n },\n\n 'redirect-management': {\n \"id\": \"redirect-management\",\n \"codeName\": \"redirect-management\",\n \"displayName\": \"Redirect Management\",\n \"description\": \"URL redirect management with exact, partial, and regex matching\",\n \"version\": \"1.0.0\",\n \"author\": \"ahaas\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"↪️\",\n \"is_core\": false,\n \"permissions\": [\n \"redirect.manage\",\n \"redirect.view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"autoOffloadEnabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Redirects\",\n \"icon\": \"arrow-right\",\n \"path\": \"/admin/redirects\",\n \"order\": 85\n }\n },\n\n 'security-audit': {\n \"id\": \"security-audit\",\n \"codeName\": \"security-audit\",\n \"displayName\": \"Security Audit\",\n \"description\": \"Security event logging, brute-force detection, and analytics dashboard. Monitors login attempts, registrations, lockouts, and suspicious activity.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": false,\n \"permissions\": [\n \"security-audit:view\",\n \"security-audit:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"retention\": {\n \"daysToKeep\": 90,\n \"maxEvents\": 100000,\n \"autoPurge\": true\n },\n \"bruteForce\": {\n \"enabled\": true,\n \"maxFailedAttemptsPerIP\": 10,\n \"maxFailedAttemptsPerEmail\": 5,\n \"windowMinutes\": 15,\n \"lockoutDurationMinutes\": 30,\n \"alertThreshold\": 20\n },\n \"logging\": {\n \"logSuccessfulLogins\": true,\n \"logLogouts\": true,\n \"logRegistrations\": true,\n \"logPasswordResets\": true,\n \"logPermissionDenied\": true\n }\n },\n \"adminMenu\": {\n \"label\": \"Security Audit\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/security-audit\",\n \"order\": 85\n }\n },\n\n 'seed-data': {\n \"id\": \"seed-data\",\n \"codeName\": \"seed-data\",\n \"displayName\": \"Seed Data Generator\",\n \"description\": \"Development tool for generating sample data and testing content. Useful for demos and development environments\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🌱\",\n \"is_core\": false,\n \"permissions\": [\n \"seed-data:generate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"userCount\": 20,\n \"contentCount\": 200,\n \"defaultPassword\": \"password123\"\n },\n \"adminMenu\": null\n },\n\n 'shortcodes': {\n \"id\": \"shortcodes\",\n \"codeName\": \"shortcodes\",\n \"displayName\": \"Shortcodes\",\n \"description\": \"Registered shortcode functions for dynamic content. Use [[shortcode_name param=\\\"value\\\"]] syntax in rich text fields for server-side resolution. Includes handler registry, CRUD admin, and live preview.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"\",\n \"is_core\": false,\n \"permissions\": [\n \"shortcodes:manage\",\n \"shortcodes:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Shortcodes\",\n \"icon\": \"bolt\",\n \"path\": \"/admin/shortcodes\",\n \"order\": 46\n }\n },\n\n 'stripe': {\n \"id\": \"stripe\",\n \"codeName\": \"stripe\",\n \"displayName\": \"Stripe Subscriptions\",\n \"description\": \"Stripe subscription management with webhook handling, checkout sessions, and subscription gating\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"payments\",\n \"iconEmoji\": \"💳\",\n \"is_core\": true,\n \"permissions\": [\n \"stripe:manage\",\n \"stripe:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"stripeSecretKey\": \"\",\n \"stripeWebhookSecret\": \"\",\n \"stripePriceId\": \"\",\n \"successUrl\": \"/admin/dashboard\",\n \"cancelUrl\": \"/admin/dashboard\"\n },\n \"adminMenu\": {\n \"label\": \"Stripe\",\n \"icon\": \"credit-card\",\n \"path\": \"/admin/plugins/stripe\",\n \"order\": 90\n }\n },\n\n 'testimonials-plugin': {\n \"id\": \"testimonials-plugin\",\n \"codeName\": \"testimonials-plugin\",\n \"displayName\": \"Testimonials\",\n \"description\": \"Customer testimonials and reviews management with display widgets and ratings\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💬\",\n \"is_core\": false,\n \"permissions\": [\n \"testimonials:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'tinymce-plugin': {\n \"id\": \"tinymce-plugin\",\n \"codeName\": \"tinymce-plugin\",\n \"displayName\": \"TinyMCE Rich Text Editor\",\n \"description\": \"Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"no-api-key\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"skin\": \"oxide-dark\"\n },\n \"adminMenu\": null\n },\n\n 'turnstile': {\n \"id\": \"turnstile\",\n \"codeName\": \"turnstile-plugin\",\n \"displayName\": \"Cloudflare Turnstile\",\n \"description\": \"CAPTCHA-free bot protection using Cloudflare Turnstile. Provides reusable verification for any form.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"siteKey\": \"\",\n \"secretKey\": \"\",\n \"theme\": \"auto\",\n \"size\": \"normal\",\n \"mode\": \"managed\",\n \"appearance\": \"always\",\n \"preClearanceEnabled\": false,\n \"preClearanceLevel\": \"managed\",\n \"enabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Turnstile\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/turnstile/settings\",\n \"order\": 100\n }\n },\n\n 'user-profiles': {\n \"id\": \"user-profiles\",\n \"codeName\": \"user-profiles\",\n \"displayName\": \"User Profiles\",\n \"description\": \"Configurable custom profile fields for users\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"users\",\n \"iconEmoji\": \"👤\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'workflow-plugin': {\n \"id\": \"workflow-plugin\",\n \"codeName\": \"workflow-plugin\",\n \"displayName\": \"Workflow Engine\",\n \"description\": \"Content workflow and approval system with customizable states, transitions, and review processes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔄\",\n \"is_core\": false,\n \"permissions\": [\n \"workflow:manage\",\n \"workflow:approve\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableApprovalChains\": true,\n \"enableScheduling\": true,\n \"enableAutomation\": true,\n \"enableNotifications\": true\n },\n \"adminMenu\": null\n }\n} as const\n\n/**\n * All plugin IDs.\n */\nexport const ALL_PLUGIN_IDS = Object.keys(PLUGIN_REGISTRY)\n\n/**\n * Plugins that have their own admin page (have an adminMenu entry).\n */\nexport const PLUGINS_WITH_ADMIN_PAGES = ALL_PLUGIN_IDS.filter(\n id => PLUGIN_REGISTRY[id]?.adminMenu !== null\n)\n\n/**\n * Look up a plugin by its codeName (the `name` field stored in the DB).\n * Falls back to id lookup if no codeName match.\n */\nexport function findPluginByCodeName(codeName: string): PluginRegistryEntry | undefined {\n return Object.values(PLUGIN_REGISTRY).find(p => p.codeName === codeName)\n || PLUGIN_REGISTRY[codeName]\n}\n\n/**\n * Get a plugin by ID.\n */\nexport function getPlugin(id: string): PluginRegistryEntry | undefined {\n return PLUGIN_REGISTRY[id]\n}\n","import type { D1Database } from \"@cloudflare/workers-types\";\nimport { PluginService } from \"./plugin-service\";\nimport { PLUGIN_REGISTRY } from \"../plugins/manifest-registry\";\nimport type { PluginRegistryEntry } from \"../plugins/manifest-registry\";\n\nexport interface CorePlugin {\n id: string;\n name: string;\n display_name: string;\n description: string;\n version: string;\n author: string;\n category: string;\n icon: string;\n permissions: string[];\n dependencies: string[];\n settings?: any;\n}\n\n/**\n * Build the CORE_PLUGINS list from the auto-generated registry.\n * To add a new bootstrapped plugin, create a manifest.json and\n * run: node packages/scripts/generate-plugin-registry.mjs\n *\n * Only plugins that are in the BOOTSTRAP_PLUGIN_IDS list will be\n * auto-installed on first boot. Edit this list to control which\n * plugins are bootstrapped.\n */\nconst BOOTSTRAP_PLUGIN_IDS = [\n \"core-auth\",\n \"core-media\",\n \"database-tools\",\n \"seed-data\",\n \"core-cache\",\n \"workflow-plugin\",\n \"easy-mdx\",\n \"ai-search\",\n \"oauth-providers\",\n \"global-variables\",\n \"user-profiles\",\n \"stripe\",\n];\n\nfunction registryToCorePlugin(entry: PluginRegistryEntry): CorePlugin {\n return {\n id: entry.id,\n name: entry.codeName,\n display_name: entry.displayName,\n description: entry.description,\n version: entry.version,\n author: entry.author,\n category: entry.category,\n icon: entry.iconEmoji,\n permissions: entry.permissions,\n dependencies: entry.dependencies,\n settings: entry.defaultSettings,\n };\n}\n\nexport class PluginBootstrapService {\n private pluginService: PluginService;\n\n constructor(private db: D1Database) {\n this.pluginService = new PluginService(db);\n }\n\n /**\n * Core plugins derived from the auto-generated plugin registry.\n * Only plugins listed in BOOTSTRAP_PLUGIN_IDS are included.\n */\n private readonly CORE_PLUGINS: CorePlugin[] = BOOTSTRAP_PLUGIN_IDS\n .filter((id) => PLUGIN_REGISTRY[id] !== undefined)\n .map((id) => registryToCorePlugin(PLUGIN_REGISTRY[id]!));\n\n /**\n * Bootstrap all core plugins - install them if they don't exist\n */\n async bootstrapCorePlugins(): Promise {\n console.log(\"[PluginBootstrap] Starting core plugin bootstrap process...\");\n\n try {\n // Check each core plugin\n for (const corePlugin of this.CORE_PLUGINS) {\n await this.ensurePluginInstalled(corePlugin);\n }\n\n console.log(\n \"[PluginBootstrap] Core plugin bootstrap completed successfully\"\n );\n } catch (error) {\n console.error(\"[PluginBootstrap] Error during plugin bootstrap:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure a specific plugin is installed\n */\n private async ensurePluginInstalled(plugin: CorePlugin): Promise {\n try {\n // Check if plugin already exists\n const existingPlugin = await this.pluginService.getPlugin(plugin.id);\n\n if (existingPlugin) {\n console.log(\n `[PluginBootstrap] Plugin already installed: ${plugin.display_name} (status: ${existingPlugin.status})`\n );\n\n // Update plugin if version changed\n if (existingPlugin.version !== plugin.version) {\n console.log(\n `[PluginBootstrap] Updating plugin version: ${plugin.display_name} from ${existingPlugin.version} to ${plugin.version}`\n );\n await this.updatePlugin(plugin);\n }\n\n // ALWAYS ensure core-auth is active (critical for system functionality)\n if (plugin.id === 'core-auth' && existingPlugin.status !== 'active') {\n console.log(\n `[PluginBootstrap] Core-auth plugin is inactive, activating it now...`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n\n // Only auto-activate on first install, respect user's activation state on subsequent boots\n } else {\n // Install the plugin\n console.log(\n `[PluginBootstrap] Installing plugin: ${plugin.display_name}`\n );\n await this.pluginService.installPlugin({\n ...plugin,\n is_core: plugin.name.startsWith(\"core-\"),\n });\n\n // Activate plugins immediately after installation\n console.log(\n `[PluginBootstrap] Activating newly installed plugin: ${plugin.display_name}`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n } catch (error) {\n console.error(\n `[PluginBootstrap] Error ensuring plugin ${plugin.display_name}:`,\n error\n );\n // Don't throw - continue with other plugins\n }\n }\n\n /**\n * Update an existing plugin\n */\n private async updatePlugin(plugin: CorePlugin): Promise {\n const now = Math.floor(Date.now() / 1000);\n\n const stmt = this.db.prepare(`\n UPDATE plugins\n SET\n version = ?,\n description = ?,\n permissions = ?,\n settings = ?,\n last_updated = ?\n WHERE id = ?\n `);\n\n await stmt\n .bind(\n plugin.version,\n plugin.description,\n JSON.stringify(plugin.permissions),\n JSON.stringify(plugin.settings || {}),\n now,\n plugin.id\n )\n .run();\n }\n\n /**\n * Check if bootstrap is needed (first run detection)\n */\n async isBootstrapNeeded(): Promise {\n try {\n // Check if any core plugins are missing\n for (const corePlugin of this.CORE_PLUGINS.filter((p) =>\n p.name.startsWith(\"core-\")\n )) {\n const exists = await this.pluginService.getPlugin(corePlugin.id);\n if (!exists) {\n return true;\n }\n }\n return false;\n } catch (error) {\n // If there's an error (like table doesn't exist), we need bootstrap\n console.error(\n \"[PluginBootstrap] Error checking bootstrap status:\",\n error\n );\n return true;\n }\n }\n\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/services/collection-loader.ts","../src/services/collection-sync.ts","../src/services/form-collection-sync.ts","../src/services/plugin-service.ts","../src/plugins/manifest-registry.ts","../src/services/plugin-bootstrap.ts"],"names":[],"mappings":"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","file":"chunk-656GGECX.cjs","sourcesContent":["/**\n * Collection Loader Service\n *\n * Loads collection configuration files from the collections directory.\n * Supports both development (reading from filesystem) and production (bundled).\n */\n\nimport { CollectionConfig, CollectionConfigModule } from '../types/collection-config'\n\n// Global registry for externally registered collections\nconst registeredCollections: CollectionConfig[] = []\n\n/**\n * Register collections from the application code\n * This should be called before creating the app\n */\nexport function registerCollections(collections: CollectionConfig[]): void {\n for (const config of collections) {\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config: missing required fields`, config)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n registeredCollections.push(normalizedConfig)\n console.log(`✓ Registered collection: ${config.name}`)\n }\n}\n\n/**\n * Load all collection configurations from the collections directory\n */\nexport async function loadCollectionConfigs(): Promise {\n const collections: CollectionConfig[] = [...registeredCollections]\n\n // Log registered collections summary\n if (registeredCollections.length > 0) {\n console.log(`📦 Found ${registeredCollections.length} registered collection(s) from application`)\n } else {\n console.log(`⚠️ No collections registered. Make sure to call registerCollections() in your app's index.ts`)\n console.log(` Example: import myCollection from './collections/my-collection.collection'`)\n console.log(` registerCollections([myCollection])`)\n }\n\n try {\n // Import all collection files dynamically from core package\n // In production, these will be bundled with the application\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts', { eager: true }) || {}\n let coreCollectionCount = 0\n\n for (const [path, module] of Object.entries(modules)) {\n try {\n const configModule = module as CollectionConfigModule\n\n if (!configModule.default) {\n console.warn(`Collection file ${path} does not export a default config`)\n continue\n }\n\n const config = configModule.default\n\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config in ${path}: missing required fields`)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n collections.push(normalizedConfig)\n coreCollectionCount++\n console.log(`✓ Loaded core collection: ${config.name}`)\n } catch (error) {\n console.error(`Error loading collection from ${path}:`, error)\n }\n }\n\n console.log(`📊 Collection summary: ${collections.length} total (${registeredCollections.length} from app, ${coreCollectionCount} from core)`)\n return collections\n } catch (error) {\n console.error('Error loading collection configurations:', error)\n return collections // Return registered collections even if core loading fails\n }\n}\n\n/**\n * Load a specific collection configuration by name\n * Note: This function requires implementation in the consuming application\n * as it depends on project-specific collection files\n */\nexport async function loadCollectionConfig(name: string): Promise {\n try {\n // Dynamic imports are not supported in library builds\n // This should be implemented in the consuming application\n console.warn('loadCollectionConfig requires implementation in consuming application')\n return null\n } catch (error) {\n console.error(`Error loading collection ${name}:`, error)\n return null\n }\n}\n\n/**\n * Get list of all available collection config file names\n */\nexport async function getAvailableCollectionNames(): Promise {\n try {\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts') || {}\n const names: string[] = []\n\n for (const path of Object.keys(modules)) {\n // Extract collection name from path\n // e.g., '../collections/blog-posts.collection.ts' -> 'blog-posts'\n const match = path.match(/\\/([^/]+)\\.collection\\.ts$/)\n if (match && match[1]) {\n names.push(match[1])\n }\n }\n\n return names\n } catch (error) {\n console.error('Error getting collection names:', error)\n return []\n }\n}\n\n/**\n * Validate a collection configuration\n */\nexport function validateCollectionConfig(config: CollectionConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push('Collection name is required')\n } else if (!/^[a-z0-9_-]+$/.test(config.name)) {\n errors.push('Collection name must contain only lowercase letters, numbers, underscores, and hyphens')\n }\n\n if (!config.displayName) {\n errors.push('Display name is required')\n }\n\n if (!config.schema) {\n errors.push('Schema is required')\n } else {\n // Validate schema structure\n if (config.schema.type !== 'object') {\n errors.push('Schema type must be \"object\"')\n }\n\n if (!config.schema.properties || typeof config.schema.properties !== 'object') {\n errors.push('Schema must have properties')\n }\n\n // Validate field types\n for (const [fieldName, fieldConfig] of Object.entries(config.schema.properties || {})) {\n if (!fieldConfig.type) {\n errors.push(`Field \"${fieldName}\" is missing type`)\n }\n\n // Validate reference fields\n if (fieldConfig.type === 'reference' && !fieldConfig.collection) {\n errors.push(`Reference field \"${fieldName}\" is missing collection property`)\n }\n\n const layoutValue = fieldConfig.objectLayout\n if (layoutValue !== undefined) {\n if (fieldConfig.type !== 'object') {\n errors.push(`Field \"${fieldName}\" uses objectLayout but is not an object field`)\n } else if (!['nested', 'flat'].includes(layoutValue)) {\n errors.push(`Object field \"${fieldName}\" has invalid objectLayout. Use \"nested\" or \"flat\"`)\n }\n }\n\n // Validate select fields\n if (['select', 'multiselect', 'radio'].includes(fieldConfig.type) && !fieldConfig.enum) {\n errors.push(`Select field \"${fieldName}\" is missing enum options`)\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n}\n","/**\n * Collection Sync Service\n *\n * Syncs collection configurations from code to the database.\n * Handles create, update, and validation of config-managed collections.\n */\n\nimport { CollectionConfig, CollectionSyncResult } from '../types/collection-config'\nimport { loadCollectionConfigs, validateCollectionConfig } from './collection-loader'\n\n/**\n * Sync all collection configurations to the database\n */\nexport async function syncCollections(db: D1Database): Promise {\n console.log('🔄 Starting collection sync...')\n\n const results: CollectionSyncResult[] = []\n const configs = await loadCollectionConfigs()\n\n if (configs.length === 0) {\n console.log('⚠️ No collection configurations found')\n return results\n }\n\n for (const config of configs) {\n const result = await syncCollection(db, config)\n results.push(result)\n }\n\n const created = results.filter(r => r.status === 'created').length\n const updated = results.filter(r => r.status === 'updated').length\n const unchanged = results.filter(r => r.status === 'unchanged').length\n const errors = results.filter(r => r.status === 'error').length\n\n console.log(`✅ Collection sync complete: ${created} created, ${updated} updated, ${unchanged} unchanged, ${errors} errors`)\n\n return results\n}\n\n/**\n * Sync a single collection configuration to the database\n */\nexport async function syncCollection(db: D1Database, config: CollectionConfig): Promise {\n try {\n // Validate config\n const validation = validateCollectionConfig(config)\n if (!validation.valid) {\n return {\n name: config.name,\n status: 'error',\n error: `Validation failed: ${validation.errors.join(', ')}`\n }\n }\n\n // Check if collection exists\n const existingStmt = db.prepare('SELECT * FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(config.name).first() as any\n\n const now = Date.now()\n const collectionId = existing?.id || `col-${config.name}-${crypto.randomUUID().slice(0, 8)}`\n\n // Prepare collection data\n const schemaJson = JSON.stringify(config.schema)\n const isActive = config.isActive !== false ? 1 : 0\n const managed = config.managed !== false ? 1 : 0\n\n if (!existing) {\n // Create new collection\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n config.name,\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n now\n ).run()\n\n console.log(` ✓ Created collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'created',\n message: `Created collection \"${config.displayName}\"`\n }\n } else {\n // Check if update is needed\n const existingSchema = existing.schema ? JSON.stringify(existing.schema) : '{}'\n const existingDisplayName = existing.display_name\n const existingDescription = existing.description\n const existingIsActive = existing.is_active\n const existingManaged = existing.managed\n\n const needsUpdate =\n schemaJson !== existingSchema ||\n config.displayName !== existingDisplayName ||\n (config.description || null) !== existingDescription ||\n isActive !== existingIsActive ||\n managed !== existingManaged\n\n if (!needsUpdate) {\n return {\n name: config.name,\n status: 'unchanged',\n message: `Collection \"${config.displayName}\" is up to date`\n }\n }\n\n // Update existing collection\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, schema = ?, is_active = ?, managed = ?, updated_at = ?\n WHERE name = ?\n `)\n\n await updateStmt.bind(\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n config.name\n ).run()\n\n console.log(` ✓ Updated collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'updated',\n message: `Updated collection \"${config.displayName}\"`\n }\n }\n } catch (error) {\n console.error(` ✗ Error syncing collection ${config.name}:`, error)\n\n return {\n name: config.name,\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n}\n\n/**\n * Check if a collection is managed by config\n */\nexport async function isCollectionManaged(db: D1Database, collectionName: string): Promise {\n try {\n const stmt = db.prepare('SELECT managed FROM collections WHERE name = ?')\n const result = await stmt.bind(collectionName).first() as any\n\n return result?.managed === 1\n } catch (error) {\n console.error(`Error checking if collection is managed:`, error)\n return false\n }\n}\n\n/**\n * Get all managed collections from database\n */\nexport async function getManagedCollections(db: D1Database): Promise {\n try {\n const stmt = db.prepare('SELECT name FROM collections WHERE managed = 1')\n const { results } = await stmt.all()\n\n return (results || []).map((row: any) => row.name)\n } catch (error) {\n console.error('Error getting managed collections:', error)\n return []\n }\n}\n\n/**\n * Remove collections that are no longer in config files\n * (Only removes managed collections that aren't in the config)\n */\nexport async function cleanupRemovedCollections(db: D1Database): Promise {\n try {\n const configs = await loadCollectionConfigs()\n const configNames = new Set(configs.map(c => c.name))\n const managedCollections = await getManagedCollections(db)\n const removed: string[] = []\n\n for (const managedName of managedCollections) {\n if (!configNames.has(managedName)) {\n // This managed collection no longer has a config file\n // Mark as inactive instead of deleting (safer)\n const updateStmt = db.prepare(`\n UPDATE collections\n SET is_active = 0, updated_at = ?\n WHERE name = ? AND managed = 1\n `)\n\n await updateStmt.bind(Date.now(), managedName).run()\n removed.push(managedName)\n console.log(` ⚠️ Deactivated removed collection: ${managedName}`)\n }\n }\n\n return removed\n } catch (error) {\n console.error('Error cleaning up removed collections:', error)\n return []\n }\n}\n\n/**\n * Full sync: sync all configs and cleanup removed\n */\nexport async function fullCollectionSync(db: D1Database): Promise<{\n results: CollectionSyncResult[]\n removed: string[]\n}> {\n const results = await syncCollections(db)\n const removed = await cleanupRemovedCollections(db)\n\n return { results, removed }\n}\n","/**\n * Form-Collection Sync Service\n *\n * Bridge logic that creates \"shadow collections\" for forms and\n * dual-writes form submissions to the content table, enabling\n * unified content management for form submissions.\n */\n\nconst SYSTEM_FORM_USER_ID = 'system-form-submission'\n\n/**\n * Convert Form.io component type to collection schema field type\n */\nfunction mapFormioTypeToSchemaType(component: any): { type: string; [key: string]: any } {\n switch (component.type) {\n case 'textfield':\n case 'textarea':\n case 'password':\n case 'phoneNumber':\n case 'url':\n return { type: 'string', title: component.label || component.key }\n case 'email':\n return { type: 'string', format: 'email', title: component.label || component.key }\n case 'number':\n case 'currency':\n return { type: 'number', title: component.label || component.key }\n case 'checkbox':\n return { type: 'boolean', title: component.label || component.key }\n case 'select':\n case 'radio': {\n const enumValues = (component.data?.values || component.values || []).map((v: any) => v.value)\n const enumLabels = (component.data?.values || component.values || []).map((v: any) => v.label)\n return {\n type: 'select',\n title: component.label || component.key,\n enum: enumValues,\n enumLabels\n }\n }\n case 'selectboxes':\n return { type: 'object', title: component.label || component.key }\n case 'datetime':\n case 'day':\n case 'time':\n return { type: 'string', format: 'date-time', title: component.label || component.key }\n case 'file':\n case 'signature':\n return { type: 'string', title: component.label || component.key }\n case 'address':\n return { type: 'object', title: component.label || component.key }\n case 'hidden':\n return { type: 'string', title: component.label || component.key }\n default:\n return { type: 'string', title: component.label || component.key }\n }\n}\n\n/**\n * Recursively extract field components from a Form.io schema,\n * skipping layout-only components (panels, columns, fieldsets, etc.)\n */\nfunction extractFieldComponents(components: any[]): any[] {\n const fields: any[] = []\n if (!components) return fields\n\n for (const comp of components) {\n // Layout components — recurse into children\n if (comp.type === 'panel' || comp.type === 'fieldset' || comp.type === 'well' || comp.type === 'tabs') {\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n continue\n }\n if (comp.type === 'columns' && comp.columns) {\n for (const col of comp.columns) {\n if (col.components) {\n fields.push(...extractFieldComponents(col.components))\n }\n }\n continue\n }\n if (comp.type === 'table' && comp.rows) {\n for (const row of comp.rows) {\n if (Array.isArray(row)) {\n for (const cell of row) {\n if (cell.components) {\n fields.push(...extractFieldComponents(cell.components))\n }\n }\n }\n }\n continue\n }\n // Skip buttons and non-input layout elements\n if (comp.type === 'button' || comp.type === 'htmlelement' || comp.type === 'content') {\n continue\n }\n // Skip turnstile (not data)\n if (comp.type === 'turnstile') {\n continue\n }\n // It's a real field\n if (comp.key) {\n fields.push(comp)\n }\n // Recurse into sub-components for containers\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n }\n return fields\n}\n\n/**\n * Convert a Form.io schema into a collection JSON schema definition\n */\nexport function deriveCollectionSchemaFromFormio(formioSchema: any): any {\n const components = formioSchema?.components || []\n const fieldComponents = extractFieldComponents(components)\n\n const properties: Record = {\n // Always include a title field for the content item\n title: { type: 'string', title: 'Title', required: true }\n }\n const required: string[] = ['title']\n\n for (const comp of fieldComponents) {\n const key = comp.key\n if (!key || key === 'submit' || key === 'title') continue\n const fieldDef = mapFormioTypeToSchemaType(comp)\n if (comp.validate?.required) {\n fieldDef.required = true\n required.push(key)\n }\n properties[key] = fieldDef\n }\n\n return { type: 'object', properties, required }\n}\n\n/**\n * Derive a human-readable title from form submission data\n */\nexport function deriveSubmissionTitle(data: Record, formDisplayName: string): string {\n // Try common fields in order of preference\n const candidates = ['name', 'fullName', 'full_name', 'firstName', 'first_name']\n for (const key of candidates) {\n if (data[key] && typeof data[key] === 'string' && data[key].trim()) {\n // Append last name if available\n if (key === 'firstName' || key === 'first_name') {\n const last = data['lastName'] || data['last_name'] || data['lastname'] || ''\n if (last) return `${data[key].trim()} ${last.trim()}`\n }\n return data[key].trim()\n }\n }\n // Try email\n if (data.email && typeof data.email === 'string' && data.email.trim()) {\n return data.email.trim()\n }\n // Try subject\n if (data.subject && typeof data.subject === 'string' && data.subject.trim()) {\n return data.subject.trim()\n }\n // Fallback\n const dateStr = new Date().toLocaleDateString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })\n return `${formDisplayName} - ${dateStr}`\n}\n\n/**\n * Map form submission status to content status.\n * Form submissions are complete data — they default to 'published'.\n * Only rejected/spam submissions get demoted.\n */\nexport function mapFormStatusToContentStatus(formStatus: string): string {\n switch (formStatus) {\n case 'pending': return 'published'\n case 'reviewed': return 'published'\n case 'approved': return 'published'\n case 'rejected': return 'archived'\n case 'spam': return 'deleted'\n default: return 'published'\n }\n}\n\n/**\n * Create or update a shadow collection for a given form\n */\nexport async function syncFormCollection(db: D1Database, form: {\n id: string\n name: string\n display_name: string\n description?: string | null\n formio_schema: any\n is_active: number | boolean\n}): Promise<{ collectionId: string; status: 'created' | 'updated' | 'unchanged' }> {\n const collectionName = `form_${form.name}`\n const displayName = `${form.display_name} (Form)`\n\n // Parse formio_schema\n const formioSchema = typeof form.formio_schema === 'string'\n ? JSON.parse(form.formio_schema)\n : form.formio_schema\n\n const schema = deriveCollectionSchemaFromFormio(formioSchema)\n const schemaJson = JSON.stringify(schema)\n const now = Date.now()\n const isActive = form.is_active ? 1 : 0\n\n // Check if shadow collection already exists\n const existing = await db.prepare(\n 'SELECT id, schema, display_name, description, is_active FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!existing) {\n // Create new shadow collection\n const collectionId = `col-form-${form.name}-${crypto.randomUUID().slice(0, 8)}`\n\n await db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, source_type, source_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, 1, 'form', ?, ?, ?)\n `).bind(\n collectionId,\n collectionName,\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n form.id,\n now,\n now\n ).run()\n\n console.log(`[FormSync] Created shadow collection: ${collectionName}`)\n return { collectionId, status: 'created' }\n }\n\n // Check if update needed\n const existingSchema = existing.schema ? JSON.stringify(typeof existing.schema === 'string' ? JSON.parse(existing.schema) : existing.schema) : '{}'\n const needsUpdate =\n schemaJson !== existingSchema ||\n displayName !== existing.display_name ||\n (form.description || null) !== existing.description ||\n isActive !== existing.is_active\n\n if (!needsUpdate) {\n return { collectionId: existing.id, status: 'unchanged' }\n }\n\n await db.prepare(`\n UPDATE collections SET display_name = ?, description = ?, schema = ?, is_active = ?, updated_at = ?\n WHERE id = ?\n `).bind(\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n now,\n existing.id\n ).run()\n\n console.log(`[FormSync] Updated shadow collection: ${collectionName}`)\n return { collectionId: existing.id, status: 'updated' }\n}\n\n/**\n * Sync all active forms to shadow collections\n */\nexport async function syncAllFormCollections(db: D1Database): Promise {\n try {\n // Check if forms table exists\n const tableCheck = await db.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='forms'\"\n ).first()\n if (!tableCheck) {\n console.log('[FormSync] Forms table does not exist, skipping form sync')\n return\n }\n\n const { results: forms } = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms'\n ).all()\n\n if (!forms || forms.length === 0) {\n console.log('[FormSync] No forms found, skipping')\n return\n }\n\n let created = 0\n let updated = 0\n\n for (const form of forms) {\n try {\n const result = await syncFormCollection(db, form as any)\n if (result.status === 'created') created++\n if (result.status === 'updated') updated++\n\n // Backfill existing submissions that don't have content_id\n await backfillFormSubmissions(db, form.id as string, result.collectionId)\n } catch (error) {\n console.error(`[FormSync] Error syncing form ${form.name}:`, error)\n }\n }\n\n console.log(`[FormSync] Sync complete: ${created} created, ${updated} updated out of ${forms.length} forms`)\n } catch (error) {\n console.error('[FormSync] Error syncing form collections:', error)\n }\n}\n\n/**\n * Create a content item from a form submission\n */\nexport async function createContentFromSubmission(\n db: D1Database,\n submissionData: Record,\n form: { id: string; name: string; display_name: string },\n submissionId: string,\n metadata: {\n ipAddress?: string | null\n userAgent?: string | null\n userEmail?: string | null\n userId?: string | null\n } = {}\n): Promise {\n try {\n // Find the shadow collection\n let collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!collection) {\n // Shadow collection missing — try to create it on the fly\n console.warn(`[FormSync] No shadow collection found for form ${form.name}, attempting to create...`)\n try {\n const fullForm = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms WHERE id = ?'\n ).bind(form.id).first() as any\n\n if (fullForm) {\n const schema = typeof fullForm.formio_schema === 'string'\n ? JSON.parse(fullForm.formio_schema)\n : fullForm.formio_schema\n const result = await syncFormCollection(db, {\n id: fullForm.id,\n name: fullForm.name,\n display_name: fullForm.display_name,\n description: fullForm.description,\n formio_schema: schema,\n is_active: fullForm.is_active ?? 1\n })\n // Re-query the collection\n collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n console.log(`[FormSync] On-the-fly sync result: ${result.status}, collectionId: ${result.collectionId}`)\n }\n } catch (syncErr) {\n console.error('[FormSync] On-the-fly shadow collection creation failed:', syncErr)\n }\n\n if (!collection) {\n console.error(`[FormSync] Still no shadow collection for form ${form.name} after recovery attempt`)\n return null\n }\n }\n\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const title = deriveSubmissionTitle(submissionData, form.display_name)\n const slug = `submission-${submissionId.slice(0, 8)}`\n\n // Build content data with embedded metadata\n const contentData: Record = {\n title,\n ...submissionData,\n _submission_metadata: {\n submissionId,\n formId: form.id,\n formName: form.name,\n email: metadata.userEmail || submissionData.email || null,\n ipAddress: metadata.ipAddress || null,\n userAgent: metadata.userAgent || null,\n submittedAt: now\n }\n }\n\n const authorId = metadata.userId || SYSTEM_FORM_USER_ID\n\n // Ensure the system user exists (D1 enforces foreign keys)\n if (authorId === SYSTEM_FORM_USER_ID) {\n const systemUser = await db.prepare('SELECT id FROM users WHERE id = ?').bind(SYSTEM_FORM_USER_ID).first()\n if (!systemUser) {\n console.log('[FormSync] System form user missing, creating...')\n const sysNow = Date.now()\n await db.prepare(`\n INSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 0, ?, ?)\n `).bind(SYSTEM_FORM_USER_ID, 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', sysNow, sysNow).run()\n }\n }\n\n console.log(`[FormSync] Inserting content: id=${contentId}, collection=${collection.id}, slug=${slug}, title=${title}, author=${authorId}`)\n\n await db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, 'published', ?, ?, ?)\n `).bind(\n contentId,\n collection.id,\n slug,\n title,\n JSON.stringify(contentData),\n authorId,\n now,\n now\n ).run()\n\n // Link submission to content\n await db.prepare(\n 'UPDATE form_submissions SET content_id = ? WHERE id = ?'\n ).bind(contentId, submissionId).run()\n\n console.log(`[FormSync] Content created successfully: ${contentId}`)\n return contentId\n } catch (error) {\n console.error('[FormSync] Error creating content from submission:', error)\n return null\n }\n}\n\n/**\n * Backfill existing form submissions that don't have a content_id\n */\nexport async function backfillFormSubmissions(\n db: D1Database,\n formId: string,\n collectionId: string\n): Promise {\n try {\n const { results: submissions } = await db.prepare(\n 'SELECT id, submission_data, user_email, ip_address, user_agent, user_id, submitted_at FROM form_submissions WHERE form_id = ? AND content_id IS NULL'\n ).bind(formId).all()\n\n if (!submissions || submissions.length === 0) {\n return 0\n }\n\n // Get form info\n const form = await db.prepare(\n 'SELECT id, name, display_name FROM forms WHERE id = ?'\n ).bind(formId).first() as any\n\n if (!form) return 0\n\n let count = 0\n for (const sub of submissions) {\n try {\n const submissionData = typeof sub.submission_data === 'string'\n ? JSON.parse(sub.submission_data as string)\n : sub.submission_data\n\n const contentId = await createContentFromSubmission(\n db,\n submissionData,\n { id: form.id, name: form.name, display_name: form.display_name },\n sub.id as string,\n {\n ipAddress: sub.ip_address as string | null,\n userAgent: sub.user_agent as string | null,\n userEmail: sub.user_email as string | null,\n userId: sub.user_id as string | null\n }\n )\n if (contentId) count++\n } catch (error) {\n console.error(`[FormSync] Error backfilling submission ${sub.id}:`, error)\n }\n }\n\n if (count > 0) {\n console.log(`[FormSync] Backfilled ${count} submissions for form ${formId}`)\n }\n return count\n } catch (error) {\n console.error('[FormSync] Error backfilling submissions:', error)\n return 0\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\n// Note: PLUGIN_REGISTRY and CORE_PLUGIN_IDS are project-specific\n// They should be passed as parameters to the service in the consuming application\n// import { PLUGIN_REGISTRY, CORE_PLUGIN_IDS } from '../plugins/plugin-registry'\n\nexport interface PluginData {\n id: string\n name: string\n display_name: string\n description: string\n version: string\n author: string\n category: string\n icon: string\n status: 'active' | 'inactive' | 'error'\n is_core: boolean\n settings?: any\n permissions?: string[]\n dependencies?: string[]\n download_count: number\n rating: number\n installed_at: number\n activated_at?: number\n last_updated: number\n error_message?: string\n}\n\nexport interface PluginStats {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n}\n\nexport class PluginService {\n constructor(private db: D1Database) {}\n\n async getAllPlugins(): Promise {\n // Ensure all plugins from registry exist in database (auto-install if missing)\n await this.ensureAllPluginsExist()\n\n const stmt = this.db.prepare(`\n SELECT * FROM plugins\n ORDER BY is_core DESC, display_name ASC\n `)\n\n const { results } = await stmt.all()\n return (results || []).map(this.mapPluginFromDb)\n }\n\n /**\n * Ensure all plugins from the registry exist in the database\n * Auto-installs any newly detected plugins with inactive status\n *\n * Note: This method should be overridden or configured with a plugin registry\n * in the consuming application\n */\n private async ensureAllPluginsExist(): Promise {\n // This functionality requires a project-specific PLUGIN_REGISTRY\n // In the consuming application, you should pass the registry to this service\n console.log('[PluginService] ensureAllPluginsExist - requires PLUGIN_REGISTRY configuration')\n }\n\n async getPlugin(pluginId: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE id = ?')\n const plugin = await stmt.bind(pluginId).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginByName(name: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE name = ?')\n const plugin = await stmt.bind(name).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginStats(): Promise {\n const stmt = this.db.prepare(`\n SELECT \n COUNT(*) as total,\n COUNT(CASE WHEN status = 'active' THEN 1 END) as active,\n COUNT(CASE WHEN status = 'inactive' THEN 1 END) as inactive,\n COUNT(CASE WHEN status = 'error' THEN 1 END) as errors\n FROM plugins\n `)\n \n const stats = await stmt.first() as any\n return {\n total: stats.total || 0,\n active: stats.active || 0,\n inactive: stats.inactive || 0,\n errors: stats.errors || 0,\n uninstalled: 0\n }\n }\n\n async installPlugin(pluginData: Partial): Promise {\n const id = pluginData.id || `plugin-${Date.now()}`\n const now = Math.floor(Date.now() / 1000)\n \n const stmt = this.db.prepare(`\n INSERT INTO plugins (\n id, name, display_name, description, version, author, category, icon,\n status, is_core, settings, permissions, dependencies, download_count, \n rating, installed_at, last_updated\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginData.name || id,\n pluginData.display_name || 'Unnamed Plugin',\n pluginData.description || '',\n pluginData.version || '1.0.0',\n pluginData.author || 'Unknown',\n pluginData.category || 'utilities',\n pluginData.icon || '🔌',\n 'inactive',\n pluginData.is_core || false,\n JSON.stringify(pluginData.settings || {}),\n JSON.stringify(pluginData.permissions || []),\n JSON.stringify(pluginData.dependencies || []),\n pluginData.download_count || 0,\n pluginData.rating || 0,\n now,\n now\n ).run()\n \n // Log the installation\n await this.logActivity(id, 'installed', null, { version: pluginData.version })\n \n const installed = await this.getPlugin(id)\n if (!installed) throw new Error('Failed to install plugin')\n \n return installed\n }\n\n async uninstallPlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n if (plugin.is_core) throw new Error('Cannot uninstall core plugins')\n \n // First deactivate if active\n if (plugin.status === 'active') {\n await this.deactivatePlugin(pluginId)\n }\n \n // Delete the plugin\n const stmt = this.db.prepare('DELETE FROM plugins WHERE id = ?')\n await stmt.bind(pluginId).run()\n \n // Log the uninstallation\n await this.logActivity(pluginId, 'uninstalled', null, { name: plugin.name })\n }\n\n async activatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check dependencies\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n await this.checkDependencies(plugin.dependencies)\n }\n \n const now = Math.floor(Date.now() / 1000)\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'active', activated_at = ?, error_message = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(now, pluginId).run()\n \n // Log the activation\n await this.logActivity(pluginId, 'activated', null)\n }\n\n async deactivatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check if other plugins depend on this one\n await this.checkDependents(plugin.name)\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'inactive', activated_at = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(pluginId).run()\n \n // Log the deactivation\n await this.logActivity(pluginId, 'deactivated', null)\n }\n\n async updatePluginSettings(pluginId: string, settings: any): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET settings = ?, updated_at = unixepoch() \n WHERE id = ?\n `)\n \n await stmt.bind(JSON.stringify(settings), pluginId).run()\n \n // Log the settings update\n await this.logActivity(pluginId, 'settings_updated', null)\n }\n\n async setPluginError(pluginId: string, error: string): Promise {\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'error', error_message = ? \n WHERE id = ?\n `)\n \n await stmt.bind(error, pluginId).run()\n \n // Log the error\n await this.logActivity(pluginId, 'error', null, { error })\n }\n\n async getPluginActivity(pluginId: string, limit: number = 10): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_activity_log \n WHERE plugin_id = ? \n ORDER BY timestamp DESC \n LIMIT ?\n `)\n \n const { results } = await stmt.bind(pluginId, limit).all()\n return (results || []).map((row: any) => ({\n id: row.id,\n action: row.action,\n userId: row.user_id,\n details: row.details ? JSON.parse(row.details) : null,\n timestamp: row.timestamp\n }))\n }\n\n async registerHook(pluginId: string, hookName: string, handlerName: string, priority: number = 10): Promise {\n const id = `hook-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_hooks (id, plugin_id, hook_name, handler_name, priority)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(id, pluginId, hookName, handlerName, priority).run()\n }\n\n async registerRoute(pluginId: string, path: string, method: string, handlerName: string, middleware?: any[]): Promise {\n const id = `route-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_routes (id, plugin_id, path, method, handler_name, middleware)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id, \n pluginId, \n path, \n method, \n handlerName, \n JSON.stringify(middleware || [])\n ).run()\n }\n\n async getPluginHooks(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_hooks \n WHERE plugin_id = ? AND is_active = TRUE\n ORDER BY priority ASC\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n async getPluginRoutes(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_routes \n WHERE plugin_id = ? AND is_active = TRUE\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n private async checkDependencies(dependencies: string[]): Promise {\n for (const dep of dependencies) {\n const plugin = await this.getPluginByName(dep)\n if (!plugin || plugin.status !== 'active') {\n throw new Error(`Required dependency '${dep}' is not active`)\n }\n }\n }\n\n private async checkDependents(pluginName: string): Promise {\n const stmt = this.db.prepare(`\n SELECT id, display_name FROM plugins \n WHERE status = 'active' \n AND dependencies LIKE ?\n `)\n \n const { results } = await stmt.bind(`%\"${pluginName}\"%`).all()\n if (results && results.length > 0) {\n const names = results.map((p: any) => p.display_name).join(', ')\n throw new Error(`Cannot deactivate. The following plugins depend on this one: ${names}`)\n }\n }\n\n private async logActivity(pluginId: string, action: string, userId: string | null, details?: any): Promise {\n const id = `activity-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_activity_log (id, plugin_id, action, user_id, details)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginId,\n action,\n userId,\n details ? JSON.stringify(details) : null\n ).run()\n }\n\n private mapPluginFromDb(row: any): PluginData {\n return {\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n version: row.version,\n author: row.author,\n category: row.category,\n icon: row.icon,\n status: row.status,\n is_core: row.is_core === 1,\n settings: row.settings ? JSON.parse(row.settings) : undefined,\n permissions: row.permissions ? JSON.parse(row.permissions) : undefined,\n dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,\n download_count: row.download_count || 0,\n rating: row.rating || 0,\n installed_at: row.installed_at,\n activated_at: row.activated_at,\n last_updated: row.last_updated,\n error_message: row.error_message\n }\n }\n}\n","/**\n * Plugin Registry - AUTO-GENERATED\n *\n * Generated by: packages/scripts/generate-plugin-registry.mjs\n * Generated at: 2026-05-16T15:00:20.475Z\n * Source: All manifest.json files in src/plugins/\n *\n * DO NOT EDIT MANUALLY - run the generator script instead.\n * To add a new plugin, create a manifest.json in the plugin directory.\n */\n\nexport interface PluginRegistryEntry {\n id: string\n codeName: string\n displayName: string\n description: string\n version: string\n author: string\n category: string\n iconEmoji: string\n is_core: boolean\n permissions: string[]\n dependencies: string[]\n defaultSettings: Record\n adminMenu: {\n label: string\n icon: string\n path: string\n order: number\n } | null\n}\n\n/**\n * All discovered plugins, keyed by plugin ID.\n */\nexport const PLUGIN_REGISTRY: Record = {\n 'ai-search': {\n \"id\": \"ai-search\",\n \"codeName\": \"ai-search-plugin\",\n \"displayName\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"path\": \"/admin/plugins/ai-search\",\n \"order\": 50\n }\n },\n\n 'code-examples-plugin': {\n \"id\": \"code-examples-plugin\",\n \"codeName\": \"code-examples-plugin\",\n \"displayName\": \"Code Examples\",\n \"description\": \"Code snippets and examples library with syntax highlighting and categorization\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💻\",\n \"is_core\": false,\n \"permissions\": [\n \"code-examples:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'core-analytics': {\n \"id\": \"core-analytics\",\n \"codeName\": \"core-analytics\",\n \"displayName\": \"Analytics & Insights\",\n \"description\": \"Core analytics system for tracking page views, user behavior, and content performance. Provides dashboards and reports with real-time metrics\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"seo\",\n \"iconEmoji\": \"📊\",\n \"is_core\": true,\n \"permissions\": [\n \"analytics:view\",\n \"analytics:export\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Analytics\",\n \"icon\": \"chart-bar\",\n \"path\": \"/admin/analytics\",\n \"order\": 50\n }\n },\n\n 'core-auth': {\n \"id\": \"core-auth\",\n \"codeName\": \"core-auth\",\n \"displayName\": \"Authentication System\",\n \"description\": \"Core authentication and user management system with role-based access control, session management, and security features\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔐\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:users\",\n \"manage:roles\",\n \"manage:permissions\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"requiredFields\": {\n \"email\": {\n \"required\": true,\n \"minLength\": 5,\n \"label\": \"Email\",\n \"type\": \"email\"\n },\n \"password\": {\n \"required\": true,\n \"minLength\": 8,\n \"label\": \"Password\",\n \"type\": \"password\"\n },\n \"username\": {\n \"required\": true,\n \"minLength\": 3,\n \"label\": \"Username\",\n \"type\": \"text\"\n },\n \"firstName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"First Name\",\n \"type\": \"text\"\n },\n \"lastName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"Last Name\",\n \"type\": \"text\"\n }\n },\n \"validation\": {\n \"emailFormat\": true,\n \"allowDuplicateUsernames\": false,\n \"passwordRequirements\": {\n \"requireUppercase\": false,\n \"requireLowercase\": false,\n \"requireNumbers\": false,\n \"requireSpecialChars\": false\n }\n },\n \"registration\": {\n \"enabled\": true,\n \"requireEmailVerification\": false,\n \"defaultRole\": \"viewer\"\n }\n },\n \"adminMenu\": null\n },\n\n 'core-cache': {\n \"id\": \"core-cache\",\n \"codeName\": \"core-cache\",\n \"displayName\": \"Cache System\",\n \"description\": \"Three-tiered caching system with in-memory and KV storage. Provides automatic caching for content, users, media, and API responses with configurable TTL and invalidation patterns.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"system\",\n \"iconEmoji\": \"⚡\",\n \"is_core\": true,\n \"permissions\": [\n \"cache.view\",\n \"cache.clear\",\n \"cache.invalidate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableMemoryCache\": true,\n \"enableKVCache\": true,\n \"enableDatabaseCache\": true,\n \"defaultTTL\": 3600\n },\n \"adminMenu\": null\n },\n\n 'core-media': {\n \"id\": \"core-media\",\n \"codeName\": \"core-media\",\n \"displayName\": \"Media Manager\",\n \"description\": \"Core media upload and management system with support for images, videos, and documents. Includes automatic optimization, thumbnail generation, and cloud storage integration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"media\",\n \"iconEmoji\": \"📸\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:media\",\n \"upload:files\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Media\",\n \"icon\": \"image\",\n \"path\": \"/admin/media\",\n \"order\": 30\n }\n },\n\n 'database-tools': {\n \"id\": \"database-tools\",\n \"codeName\": \"database-tools\",\n \"displayName\": \"Database Tools\",\n \"description\": \"Database management and administration tools including migrations, backups, and query execution\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🗄️\",\n \"is_core\": false,\n \"permissions\": [\n \"database:admin\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableTruncate\": true,\n \"enableBackup\": true,\n \"enableValidation\": true,\n \"requireConfirmation\": true\n },\n \"adminMenu\": null\n },\n\n 'demo-login-plugin': {\n \"id\": \"demo-login-plugin\",\n \"codeName\": \"demo-login-plugin\",\n \"displayName\": \"Demo Login\",\n \"description\": \"Quick demo login functionality for testing and demonstrations\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎯\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"core-auth\"\n ],\n \"defaultSettings\": {\n \"enableNotice\": true,\n \"demoEmail\": \"admin@sonicjs.com\",\n \"demoPassword\": \"sonicjs!\"\n },\n \"adminMenu\": null\n },\n\n 'design': {\n \"id\": \"design\",\n \"codeName\": \"design\",\n \"displayName\": \"Design System\",\n \"description\": \"Design system management including themes, components, and UI customization. Provides a visual interface for managing design tokens, typography, colors, and component library.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎨\",\n \"is_core\": false,\n \"permissions\": [\n \"design.view\",\n \"design.edit\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultTheme\": \"light\",\n \"customCSS\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Design\",\n \"icon\": \"palette\",\n \"path\": \"/admin/design\",\n \"order\": 80\n }\n },\n\n 'easy-mdx': {\n \"id\": \"easy-mdx\",\n \"codeName\": \"easy-mdx\",\n \"displayName\": \"EasyMDE Markdown Editor\",\n \"description\": \"Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultHeight\": 400,\n \"theme\": \"dark\",\n \"toolbar\": \"full\",\n \"placeholder\": \"Start writing your content...\"\n },\n \"adminMenu\": null\n },\n\n 'email': {\n \"id\": \"email\",\n \"codeName\": \"email\",\n \"displayName\": \"Email\",\n \"description\": \"Send transactional emails using Resend\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"📧\",\n \"is_core\": false,\n \"permissions\": [\n \"email:manage\",\n \"email:send\",\n \"email:view-logs\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"\",\n \"fromEmail\": \"\",\n \"fromName\": \"\",\n \"replyTo\": \"\",\n \"logoUrl\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Email\",\n \"icon\": \"envelope\",\n \"path\": \"/admin/plugins/email/settings\",\n \"order\": 80\n }\n },\n\n 'global-variables': {\n \"id\": \"global-variables\",\n \"codeName\": \"global-variables\",\n \"displayName\": \"Global Variables\",\n \"description\": \"Dynamic content variables with inline token support. Manage key-value variables via admin UI and use {variable_key} syntax in rich text fields for server-side resolution. Includes full CRUD admin page.\",\n \"version\": \"1.1.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔤\",\n \"is_core\": false,\n \"permissions\": [\n \"global-variables:manage\",\n \"global-variables:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableResolution\": true,\n \"cacheEnabled\": true,\n \"cacheTTL\": 300\n },\n \"adminMenu\": {\n \"label\": \"Global Variables\",\n \"icon\": \"variable\",\n \"path\": \"/admin/global-variables\",\n \"order\": 45\n }\n },\n\n 'hello-world': {\n \"id\": \"hello-world\",\n \"codeName\": \"hello-world\",\n \"displayName\": \"Hello World\",\n \"description\": \"A simple Hello World plugin demonstration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"👋\",\n \"is_core\": false,\n \"permissions\": [\n \"hello-world:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Hello World\",\n \"icon\": \"hand-raised\",\n \"path\": \"/admin/hello-world\",\n \"order\": 90\n }\n },\n\n 'magic-link-auth': {\n \"id\": \"magic-link-auth\",\n \"codeName\": \"magic-link-auth\",\n \"displayName\": \"Magic Link Authentication\",\n \"description\": \"Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔗\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"linkExpiryMinutes\": 15,\n \"rateLimitPerHour\": 5,\n \"allowNewUsers\": true\n },\n \"adminMenu\": null\n },\n\n 'oauth-providers': {\n \"id\": \"oauth-providers\",\n \"codeName\": \"oauth-providers\",\n \"displayName\": \"OAuth Providers\",\n \"description\": \"OAuth2/OIDC social login with GitHub, Google, and more\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"authentication\",\n \"iconEmoji\": \"🔑\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"providers\": {\n \"github\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n },\n \"google\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n }\n }\n },\n \"adminMenu\": null\n },\n\n 'otp-login': {\n \"id\": \"otp-login\",\n \"codeName\": \"otp-login\",\n \"displayName\": \"OTP Login\",\n \"description\": \"Passwordless authentication via email one-time codes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔢\",\n \"is_core\": false,\n \"permissions\": [\n \"otp:manage\",\n \"otp:request\",\n \"otp:verify\"\n ],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"codeLength\": 6,\n \"codeExpiryMinutes\": 10,\n \"maxAttempts\": 3,\n \"rateLimitPerHour\": 5,\n \"allowNewUserRegistration\": false,\n \"logoUrl\": \"\",\n \"logoWidth\": 150,\n \"logoBorderWidth\": 0,\n \"logoBorderColor\": \"#ffffff\",\n \"loginUrl\": \"\",\n \"loginButtonText\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"OTP Login\",\n \"icon\": \"key\",\n \"path\": \"/admin/plugins/otp-login/settings\",\n \"order\": 85\n }\n },\n\n 'quill-editor': {\n \"id\": \"quill-editor\",\n \"codeName\": \"quill-editor\",\n \"displayName\": \"Quill Rich Text Editor\",\n \"description\": \"Quill WYSIWYG editor integration for rich text editing. Lightweight, modern editor with customizable toolbars and dark mode support.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"✍️\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"version\": \"2.0.2\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"theme\": \"snow\"\n },\n \"adminMenu\": null\n },\n\n 'redirect-management': {\n \"id\": \"redirect-management\",\n \"codeName\": \"redirect-management\",\n \"displayName\": \"Redirect Management\",\n \"description\": \"URL redirect management with exact, partial, and regex matching\",\n \"version\": \"1.0.0\",\n \"author\": \"ahaas\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"↪️\",\n \"is_core\": false,\n \"permissions\": [\n \"redirect.manage\",\n \"redirect.view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"autoOffloadEnabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Redirects\",\n \"icon\": \"arrow-right\",\n \"path\": \"/admin/redirects\",\n \"order\": 85\n }\n },\n\n 'security-audit': {\n \"id\": \"security-audit\",\n \"codeName\": \"security-audit\",\n \"displayName\": \"Security Audit\",\n \"description\": \"Security event logging, brute-force detection, and analytics dashboard. Monitors login attempts, registrations, lockouts, and suspicious activity.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": false,\n \"permissions\": [\n \"security-audit:view\",\n \"security-audit:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"retention\": {\n \"daysToKeep\": 90,\n \"maxEvents\": 100000,\n \"autoPurge\": true\n },\n \"bruteForce\": {\n \"enabled\": true,\n \"maxFailedAttemptsPerIP\": 10,\n \"maxFailedAttemptsPerEmail\": 5,\n \"windowMinutes\": 15,\n \"lockoutDurationMinutes\": 30,\n \"alertThreshold\": 20\n },\n \"logging\": {\n \"logSuccessfulLogins\": true,\n \"logLogouts\": true,\n \"logRegistrations\": true,\n \"logPasswordResets\": true,\n \"logPermissionDenied\": true\n }\n },\n \"adminMenu\": {\n \"label\": \"Security Audit\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/security-audit\",\n \"order\": 85\n }\n },\n\n 'seed-data': {\n \"id\": \"seed-data\",\n \"codeName\": \"seed-data\",\n \"displayName\": \"Seed Data Generator\",\n \"description\": \"Development tool for generating sample data and testing content. Useful for demos and development environments\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🌱\",\n \"is_core\": false,\n \"permissions\": [\n \"seed-data:generate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"userCount\": 20,\n \"contentCount\": 200,\n \"defaultPassword\": \"password123\"\n },\n \"adminMenu\": null\n },\n\n 'shortcodes': {\n \"id\": \"shortcodes\",\n \"codeName\": \"shortcodes\",\n \"displayName\": \"Shortcodes\",\n \"description\": \"Registered shortcode functions for dynamic content. Use [[shortcode_name param=\\\"value\\\"]] syntax in rich text fields for server-side resolution. Includes handler registry, CRUD admin, and live preview.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"\",\n \"is_core\": false,\n \"permissions\": [\n \"shortcodes:manage\",\n \"shortcodes:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Shortcodes\",\n \"icon\": \"bolt\",\n \"path\": \"/admin/shortcodes\",\n \"order\": 46\n }\n },\n\n 'stripe': {\n \"id\": \"stripe\",\n \"codeName\": \"stripe\",\n \"displayName\": \"Stripe Subscriptions\",\n \"description\": \"Stripe subscription management with webhook handling, checkout sessions, and subscription gating\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"payments\",\n \"iconEmoji\": \"💳\",\n \"is_core\": true,\n \"permissions\": [\n \"stripe:manage\",\n \"stripe:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"stripeSecretKey\": \"\",\n \"stripeWebhookSecret\": \"\",\n \"stripePriceId\": \"\",\n \"successUrl\": \"/admin/dashboard\",\n \"cancelUrl\": \"/admin/dashboard\"\n },\n \"adminMenu\": {\n \"label\": \"Stripe\",\n \"icon\": \"credit-card\",\n \"path\": \"/admin/plugins/stripe\",\n \"order\": 90\n }\n },\n\n 'testimonials-plugin': {\n \"id\": \"testimonials-plugin\",\n \"codeName\": \"testimonials-plugin\",\n \"displayName\": \"Testimonials\",\n \"description\": \"Customer testimonials and reviews management with display widgets and ratings\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💬\",\n \"is_core\": false,\n \"permissions\": [\n \"testimonials:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'tinymce-plugin': {\n \"id\": \"tinymce-plugin\",\n \"codeName\": \"tinymce-plugin\",\n \"displayName\": \"TinyMCE Rich Text Editor\",\n \"description\": \"Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"no-api-key\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"skin\": \"oxide-dark\"\n },\n \"adminMenu\": null\n },\n\n 'turnstile': {\n \"id\": \"turnstile\",\n \"codeName\": \"turnstile-plugin\",\n \"displayName\": \"Cloudflare Turnstile\",\n \"description\": \"CAPTCHA-free bot protection using Cloudflare Turnstile. Provides reusable verification for any form.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"siteKey\": \"\",\n \"secretKey\": \"\",\n \"theme\": \"auto\",\n \"size\": \"normal\",\n \"mode\": \"managed\",\n \"appearance\": \"always\",\n \"preClearanceEnabled\": false,\n \"preClearanceLevel\": \"managed\",\n \"enabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Turnstile\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/turnstile/settings\",\n \"order\": 100\n }\n },\n\n 'user-profiles': {\n \"id\": \"user-profiles\",\n \"codeName\": \"user-profiles\",\n \"displayName\": \"User Profiles\",\n \"description\": \"Configurable custom profile fields for users\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"users\",\n \"iconEmoji\": \"👤\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'workflow-plugin': {\n \"id\": \"workflow-plugin\",\n \"codeName\": \"workflow-plugin\",\n \"displayName\": \"Workflow Engine\",\n \"description\": \"Content workflow and approval system with customizable states, transitions, and review processes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔄\",\n \"is_core\": false,\n \"permissions\": [\n \"workflow:manage\",\n \"workflow:approve\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableApprovalChains\": true,\n \"enableScheduling\": true,\n \"enableAutomation\": true,\n \"enableNotifications\": true\n },\n \"adminMenu\": null\n }\n} as const\n\n/**\n * All plugin IDs.\n */\nexport const ALL_PLUGIN_IDS = Object.keys(PLUGIN_REGISTRY)\n\n/**\n * Plugins that have their own admin page (have an adminMenu entry).\n */\nexport const PLUGINS_WITH_ADMIN_PAGES = ALL_PLUGIN_IDS.filter(\n id => PLUGIN_REGISTRY[id]?.adminMenu !== null\n)\n\n/**\n * Look up a plugin by its codeName (the `name` field stored in the DB).\n * Falls back to id lookup if no codeName match.\n */\nexport function findPluginByCodeName(codeName: string): PluginRegistryEntry | undefined {\n return Object.values(PLUGIN_REGISTRY).find(p => p.codeName === codeName)\n || PLUGIN_REGISTRY[codeName]\n}\n\n/**\n * Get a plugin by ID.\n */\nexport function getPlugin(id: string): PluginRegistryEntry | undefined {\n return PLUGIN_REGISTRY[id]\n}\n","import type { D1Database } from \"@cloudflare/workers-types\";\nimport { PluginService } from \"./plugin-service\";\nimport { PLUGIN_REGISTRY } from \"../plugins/manifest-registry\";\nimport type { PluginRegistryEntry } from \"../plugins/manifest-registry\";\n\nexport interface CorePlugin {\n id: string;\n name: string;\n display_name: string;\n description: string;\n version: string;\n author: string;\n category: string;\n icon: string;\n permissions: string[];\n dependencies: string[];\n settings?: any;\n}\n\n/**\n * Build the CORE_PLUGINS list from the auto-generated registry.\n * To add a new bootstrapped plugin, create a manifest.json and\n * run: node packages/scripts/generate-plugin-registry.mjs\n *\n * Only plugins that are in the BOOTSTRAP_PLUGIN_IDS list will be\n * auto-installed on first boot. Edit this list to control which\n * plugins are bootstrapped.\n */\nconst BOOTSTRAP_PLUGIN_IDS = [\n \"core-auth\",\n \"core-media\",\n \"database-tools\",\n \"seed-data\",\n \"core-cache\",\n \"workflow-plugin\",\n \"easy-mdx\",\n \"ai-search\",\n \"oauth-providers\",\n \"global-variables\",\n \"user-profiles\",\n \"stripe\",\n];\n\nfunction registryToCorePlugin(entry: PluginRegistryEntry): CorePlugin {\n return {\n id: entry.id,\n name: entry.codeName,\n display_name: entry.displayName,\n description: entry.description,\n version: entry.version,\n author: entry.author,\n category: entry.category,\n icon: entry.iconEmoji,\n permissions: entry.permissions,\n dependencies: entry.dependencies,\n settings: entry.defaultSettings,\n };\n}\n\nexport class PluginBootstrapService {\n private pluginService: PluginService;\n\n constructor(private db: D1Database) {\n this.pluginService = new PluginService(db);\n }\n\n /**\n * Core plugins derived from the auto-generated plugin registry.\n * Only plugins listed in BOOTSTRAP_PLUGIN_IDS are included.\n */\n private readonly CORE_PLUGINS: CorePlugin[] = BOOTSTRAP_PLUGIN_IDS\n .filter((id) => PLUGIN_REGISTRY[id] !== undefined)\n .map((id) => registryToCorePlugin(PLUGIN_REGISTRY[id]!));\n\n /**\n * Bootstrap all core plugins - install them if they don't exist\n */\n async bootstrapCorePlugins(): Promise {\n console.log(\"[PluginBootstrap] Starting core plugin bootstrap process...\");\n\n try {\n // Check each core plugin\n for (const corePlugin of this.CORE_PLUGINS) {\n await this.ensurePluginInstalled(corePlugin);\n }\n\n console.log(\n \"[PluginBootstrap] Core plugin bootstrap completed successfully\"\n );\n } catch (error) {\n console.error(\"[PluginBootstrap] Error during plugin bootstrap:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure a specific plugin is installed\n */\n private async ensurePluginInstalled(plugin: CorePlugin): Promise {\n try {\n // Check if plugin already exists\n const existingPlugin = await this.pluginService.getPlugin(plugin.id);\n\n if (existingPlugin) {\n console.log(\n `[PluginBootstrap] Plugin already installed: ${plugin.display_name} (status: ${existingPlugin.status})`\n );\n\n // Update plugin if version changed\n if (existingPlugin.version !== plugin.version) {\n console.log(\n `[PluginBootstrap] Updating plugin version: ${plugin.display_name} from ${existingPlugin.version} to ${plugin.version}`\n );\n await this.updatePlugin(plugin);\n }\n\n // ALWAYS ensure core-auth is active (critical for system functionality)\n if (plugin.id === 'core-auth' && existingPlugin.status !== 'active') {\n console.log(\n `[PluginBootstrap] Core-auth plugin is inactive, activating it now...`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n\n // Only auto-activate on first install, respect user's activation state on subsequent boots\n } else {\n // Install the plugin\n console.log(\n `[PluginBootstrap] Installing plugin: ${plugin.display_name}`\n );\n await this.pluginService.installPlugin({\n ...plugin,\n is_core: plugin.name.startsWith(\"core-\"),\n });\n\n // Activate plugins immediately after installation\n console.log(\n `[PluginBootstrap] Activating newly installed plugin: ${plugin.display_name}`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n } catch (error) {\n console.error(\n `[PluginBootstrap] Error ensuring plugin ${plugin.display_name}:`,\n error\n );\n // Don't throw - continue with other plugins\n }\n }\n\n /**\n * Update an existing plugin\n */\n private async updatePlugin(plugin: CorePlugin): Promise {\n const now = Math.floor(Date.now() / 1000);\n\n const stmt = this.db.prepare(`\n UPDATE plugins\n SET\n version = ?,\n description = ?,\n permissions = ?,\n settings = ?,\n last_updated = ?\n WHERE id = ?\n `);\n\n await stmt\n .bind(\n plugin.version,\n plugin.description,\n JSON.stringify(plugin.permissions),\n JSON.stringify(plugin.settings || {}),\n now,\n plugin.id\n )\n .run();\n }\n\n /**\n * Check if bootstrap is needed (first run detection)\n */\n async isBootstrapNeeded(): Promise {\n try {\n // Check if any core plugins are missing\n for (const corePlugin of this.CORE_PLUGINS.filter((p) =>\n p.name.startsWith(\"core-\")\n )) {\n const exists = await this.pluginService.getPlugin(corePlugin.id);\n if (!exists) {\n return true;\n }\n }\n return false;\n } catch (error) {\n // If there's an error (like table doesn't exist), we need bootstrap\n console.error(\n \"[PluginBootstrap] Error checking bootstrap status:\",\n error\n );\n return true;\n }\n }\n\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-ZUXOAZWZ.cjs b/packages/core/dist/chunk-ABB34XUS.cjs similarity index 94% rename from packages/core/dist/chunk-ZUXOAZWZ.cjs rename to packages/core/dist/chunk-ABB34XUS.cjs index 3ce2b4b06..939f77c32 100644 --- a/packages/core/dist/chunk-ZUXOAZWZ.cjs +++ b/packages/core/dist/chunk-ABB34XUS.cjs @@ -6,9 +6,9 @@ var chunkIGJUBJBW_cjs = require('./chunk-IGJUBJBW.cjs'); var zod = require('zod'); var hono = require('hono'); -// ../../../../node_modules/semver/internal/constants.js +// ../../node_modules/semver/internal/constants.js var require_constants = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/internal/constants.js"(exports$1, module) { + "../../node_modules/semver/internal/constants.js"(exports$1, module) { var SEMVER_SPEC_VERSION = "2.0.0"; var MAX_LENGTH = 256; var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */ @@ -37,18 +37,18 @@ var require_constants = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/internal/debug.js +// ../../node_modules/semver/internal/debug.js var require_debug = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/internal/debug.js"(exports$1, module) { + "../../node_modules/semver/internal/debug.js"(exports$1, module) { var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => { }; module.exports = debug; } }); -// ../../../../node_modules/semver/internal/re.js +// ../../node_modules/semver/internal/re.js var require_re = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/internal/re.js"(exports$1, module) { + "../../node_modules/semver/internal/re.js"(exports$1, module) { var { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, @@ -133,9 +133,9 @@ var require_re = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/internal/parse-options.js +// ../../node_modules/semver/internal/parse-options.js var require_parse_options = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/internal/parse-options.js"(exports$1, module) { + "../../node_modules/semver/internal/parse-options.js"(exports$1, module) { var looseOption = Object.freeze({ loose: true }); var emptyOpts = Object.freeze({}); var parseOptions = (options) => { @@ -151,9 +151,9 @@ var require_parse_options = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/internal/identifiers.js +// ../../node_modules/semver/internal/identifiers.js var require_identifiers = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/internal/identifiers.js"(exports$1, module) { + "../../node_modules/semver/internal/identifiers.js"(exports$1, module) { var numeric = /^[0-9]+$/; var compareIdentifiers = (a, b) => { if (typeof a === "number" && typeof b === "number") { @@ -175,9 +175,9 @@ var require_identifiers = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/classes/semver.js +// ../../node_modules/semver/classes/semver.js var require_semver = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/classes/semver.js"(exports$1, module) { + "../../node_modules/semver/classes/semver.js"(exports$1, module) { var debug = require_debug(); var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants(); var { safeRe: re, t } = require_re(); @@ -453,9 +453,9 @@ var require_semver = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/functions/parse.js +// ../../node_modules/semver/functions/parse.js var require_parse = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/parse.js"(exports$1, module) { + "../../node_modules/semver/functions/parse.js"(exports$1, module) { var SemVer = require_semver(); var parse = (version, options, throwErrors = false) => { if (version instanceof SemVer) { @@ -474,9 +474,9 @@ var require_parse = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/functions/valid.js +// ../../node_modules/semver/functions/valid.js var require_valid = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/valid.js"(exports$1, module) { + "../../node_modules/semver/functions/valid.js"(exports$1, module) { var parse = require_parse(); var valid = (version, options) => { const v = parse(version, options); @@ -486,9 +486,9 @@ var require_valid = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/functions/clean.js +// ../../node_modules/semver/functions/clean.js var require_clean = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/clean.js"(exports$1, module) { + "../../node_modules/semver/functions/clean.js"(exports$1, module) { var parse = require_parse(); var clean = (version, options) => { const s = parse(version.trim().replace(/^[=v]+/, ""), options); @@ -498,9 +498,9 @@ var require_clean = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/functions/inc.js +// ../../node_modules/semver/functions/inc.js var require_inc = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/inc.js"(exports$1, module) { + "../../node_modules/semver/functions/inc.js"(exports$1, module) { var SemVer = require_semver(); var inc = (version, release, options, identifier, identifierBase) => { if (typeof options === "string") { @@ -521,9 +521,9 @@ var require_inc = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/functions/diff.js +// ../../node_modules/semver/functions/diff.js var require_diff = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/diff.js"(exports$1, module) { + "../../node_modules/semver/functions/diff.js"(exports$1, module) { var parse = require_parse(); var diff = (version1, version2) => { const v1 = parse(version1, null, true); @@ -564,36 +564,36 @@ var require_diff = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/functions/major.js +// ../../node_modules/semver/functions/major.js var require_major = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/major.js"(exports$1, module) { + "../../node_modules/semver/functions/major.js"(exports$1, module) { var SemVer = require_semver(); var major = (a, loose) => new SemVer(a, loose).major; module.exports = major; } }); -// ../../../../node_modules/semver/functions/minor.js +// ../../node_modules/semver/functions/minor.js var require_minor = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/minor.js"(exports$1, module) { + "../../node_modules/semver/functions/minor.js"(exports$1, module) { var SemVer = require_semver(); var minor = (a, loose) => new SemVer(a, loose).minor; module.exports = minor; } }); -// ../../../../node_modules/semver/functions/patch.js +// ../../node_modules/semver/functions/patch.js var require_patch = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/patch.js"(exports$1, module) { + "../../node_modules/semver/functions/patch.js"(exports$1, module) { var SemVer = require_semver(); var patch = (a, loose) => new SemVer(a, loose).patch; module.exports = patch; } }); -// ../../../../node_modules/semver/functions/prerelease.js +// ../../node_modules/semver/functions/prerelease.js var require_prerelease = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/prerelease.js"(exports$1, module) { + "../../node_modules/semver/functions/prerelease.js"(exports$1, module) { var parse = require_parse(); var prerelease = (version, options) => { const parsed = parse(version, options); @@ -603,36 +603,36 @@ var require_prerelease = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/functions/compare.js +// ../../node_modules/semver/functions/compare.js var require_compare = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/compare.js"(exports$1, module) { + "../../node_modules/semver/functions/compare.js"(exports$1, module) { var SemVer = require_semver(); var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose)); module.exports = compare; } }); -// ../../../../node_modules/semver/functions/rcompare.js +// ../../node_modules/semver/functions/rcompare.js var require_rcompare = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/rcompare.js"(exports$1, module) { + "../../node_modules/semver/functions/rcompare.js"(exports$1, module) { var compare = require_compare(); var rcompare = (a, b, loose) => compare(b, a, loose); module.exports = rcompare; } }); -// ../../../../node_modules/semver/functions/compare-loose.js +// ../../node_modules/semver/functions/compare-loose.js var require_compare_loose = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/compare-loose.js"(exports$1, module) { + "../../node_modules/semver/functions/compare-loose.js"(exports$1, module) { var compare = require_compare(); var compareLoose = (a, b) => compare(a, b, true); module.exports = compareLoose; } }); -// ../../../../node_modules/semver/functions/compare-build.js +// ../../node_modules/semver/functions/compare-build.js var require_compare_build = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/compare-build.js"(exports$1, module) { + "../../node_modules/semver/functions/compare-build.js"(exports$1, module) { var SemVer = require_semver(); var compareBuild = (a, b, loose) => { const versionA = new SemVer(a, loose); @@ -643,81 +643,81 @@ var require_compare_build = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/functions/sort.js +// ../../node_modules/semver/functions/sort.js var require_sort = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/sort.js"(exports$1, module) { + "../../node_modules/semver/functions/sort.js"(exports$1, module) { var compareBuild = require_compare_build(); var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)); module.exports = sort; } }); -// ../../../../node_modules/semver/functions/rsort.js +// ../../node_modules/semver/functions/rsort.js var require_rsort = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/rsort.js"(exports$1, module) { + "../../node_modules/semver/functions/rsort.js"(exports$1, module) { var compareBuild = require_compare_build(); var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)); module.exports = rsort; } }); -// ../../../../node_modules/semver/functions/gt.js +// ../../node_modules/semver/functions/gt.js var require_gt = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/gt.js"(exports$1, module) { + "../../node_modules/semver/functions/gt.js"(exports$1, module) { var compare = require_compare(); var gt = (a, b, loose) => compare(a, b, loose) > 0; module.exports = gt; } }); -// ../../../../node_modules/semver/functions/lt.js +// ../../node_modules/semver/functions/lt.js var require_lt = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/lt.js"(exports$1, module) { + "../../node_modules/semver/functions/lt.js"(exports$1, module) { var compare = require_compare(); var lt = (a, b, loose) => compare(a, b, loose) < 0; module.exports = lt; } }); -// ../../../../node_modules/semver/functions/eq.js +// ../../node_modules/semver/functions/eq.js var require_eq = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/eq.js"(exports$1, module) { + "../../node_modules/semver/functions/eq.js"(exports$1, module) { var compare = require_compare(); var eq = (a, b, loose) => compare(a, b, loose) === 0; module.exports = eq; } }); -// ../../../../node_modules/semver/functions/neq.js +// ../../node_modules/semver/functions/neq.js var require_neq = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/neq.js"(exports$1, module) { + "../../node_modules/semver/functions/neq.js"(exports$1, module) { var compare = require_compare(); var neq = (a, b, loose) => compare(a, b, loose) !== 0; module.exports = neq; } }); -// ../../../../node_modules/semver/functions/gte.js +// ../../node_modules/semver/functions/gte.js var require_gte = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/gte.js"(exports$1, module) { + "../../node_modules/semver/functions/gte.js"(exports$1, module) { var compare = require_compare(); var gte = (a, b, loose) => compare(a, b, loose) >= 0; module.exports = gte; } }); -// ../../../../node_modules/semver/functions/lte.js +// ../../node_modules/semver/functions/lte.js var require_lte = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/lte.js"(exports$1, module) { + "../../node_modules/semver/functions/lte.js"(exports$1, module) { var compare = require_compare(); var lte = (a, b, loose) => compare(a, b, loose) <= 0; module.exports = lte; } }); -// ../../../../node_modules/semver/functions/cmp.js +// ../../node_modules/semver/functions/cmp.js var require_cmp = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/cmp.js"(exports$1, module) { + "../../node_modules/semver/functions/cmp.js"(exports$1, module) { var eq = require_eq(); var neq = require_neq(); var gt = require_gt(); @@ -764,9 +764,9 @@ var require_cmp = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/functions/coerce.js +// ../../node_modules/semver/functions/coerce.js var require_coerce = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/coerce.js"(exports$1, module) { + "../../node_modules/semver/functions/coerce.js"(exports$1, module) { var SemVer = require_semver(); var parse = require_parse(); var { safeRe: re, t } = require_re(); @@ -809,9 +809,9 @@ var require_coerce = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/internal/lrucache.js +// ../../node_modules/semver/internal/lrucache.js var require_lrucache = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/internal/lrucache.js"(exports$1, module) { + "../../node_modules/semver/internal/lrucache.js"(exports$1, module) { var LRUCache = class { constructor() { this.max = 1e3; @@ -846,9 +846,9 @@ var require_lrucache = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/classes/range.js +// ../../node_modules/semver/classes/range.js var require_range = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/classes/range.js"(exports$1, module) { + "../../node_modules/semver/classes/range.js"(exports$1, module) { var SPACE_CHARACTERS = /\s+/g; var Range = class _Range { constructor(range, options) { @@ -1222,9 +1222,9 @@ var require_range = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/classes/comparator.js +// ../../node_modules/semver/classes/comparator.js var require_comparator = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/classes/comparator.js"(exports$1, module) { + "../../node_modules/semver/classes/comparator.js"(exports$1, module) { var ANY = Symbol("SemVer ANY"); var Comparator = class _Comparator { static get ANY() { @@ -1334,9 +1334,9 @@ var require_comparator = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/functions/satisfies.js +// ../../node_modules/semver/functions/satisfies.js var require_satisfies = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/functions/satisfies.js"(exports$1, module) { + "../../node_modules/semver/functions/satisfies.js"(exports$1, module) { var Range = require_range(); var satisfies = (version, range, options) => { try { @@ -1350,18 +1350,18 @@ var require_satisfies = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/ranges/to-comparators.js +// ../../node_modules/semver/ranges/to-comparators.js var require_to_comparators = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/ranges/to-comparators.js"(exports$1, module) { + "../../node_modules/semver/ranges/to-comparators.js"(exports$1, module) { var Range = require_range(); var toComparators = (range, options) => new Range(range, options).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" ")); module.exports = toComparators; } }); -// ../../../../node_modules/semver/ranges/max-satisfying.js +// ../../node_modules/semver/ranges/max-satisfying.js var require_max_satisfying = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/ranges/max-satisfying.js"(exports$1, module) { + "../../node_modules/semver/ranges/max-satisfying.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var maxSatisfying = (versions, range, options) => { @@ -1387,9 +1387,9 @@ var require_max_satisfying = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/ranges/min-satisfying.js +// ../../node_modules/semver/ranges/min-satisfying.js var require_min_satisfying = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/ranges/min-satisfying.js"(exports$1, module) { + "../../node_modules/semver/ranges/min-satisfying.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var minSatisfying = (versions, range, options) => { @@ -1415,9 +1415,9 @@ var require_min_satisfying = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/ranges/min-version.js +// ../../node_modules/semver/ranges/min-version.js var require_min_version = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/ranges/min-version.js"(exports$1, module) { + "../../node_modules/semver/ranges/min-version.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var gt = require_gt(); @@ -1473,9 +1473,9 @@ var require_min_version = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/ranges/valid.js +// ../../node_modules/semver/ranges/valid.js var require_valid2 = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/ranges/valid.js"(exports$1, module) { + "../../node_modules/semver/ranges/valid.js"(exports$1, module) { var Range = require_range(); var validRange = (range, options) => { try { @@ -1488,9 +1488,9 @@ var require_valid2 = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/ranges/outside.js +// ../../node_modules/semver/ranges/outside.js var require_outside = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/ranges/outside.js"(exports$1, module) { + "../../node_modules/semver/ranges/outside.js"(exports$1, module) { var SemVer = require_semver(); var Comparator = require_comparator(); var { ANY } = Comparator; @@ -1556,27 +1556,27 @@ var require_outside = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/ranges/gtr.js +// ../../node_modules/semver/ranges/gtr.js var require_gtr = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/ranges/gtr.js"(exports$1, module) { + "../../node_modules/semver/ranges/gtr.js"(exports$1, module) { var outside = require_outside(); var gtr = (version, range, options) => outside(version, range, ">", options); module.exports = gtr; } }); -// ../../../../node_modules/semver/ranges/ltr.js +// ../../node_modules/semver/ranges/ltr.js var require_ltr = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/ranges/ltr.js"(exports$1, module) { + "../../node_modules/semver/ranges/ltr.js"(exports$1, module) { var outside = require_outside(); var ltr = (version, range, options) => outside(version, range, "<", options); module.exports = ltr; } }); -// ../../../../node_modules/semver/ranges/intersects.js +// ../../node_modules/semver/ranges/intersects.js var require_intersects = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/ranges/intersects.js"(exports$1, module) { + "../../node_modules/semver/ranges/intersects.js"(exports$1, module) { var Range = require_range(); var intersects = (r1, r2, options) => { r1 = new Range(r1, options); @@ -1587,9 +1587,9 @@ var require_intersects = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/ranges/simplify.js +// ../../node_modules/semver/ranges/simplify.js var require_simplify = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/ranges/simplify.js"(exports$1, module) { + "../../node_modules/semver/ranges/simplify.js"(exports$1, module) { var satisfies = require_satisfies(); var compare = require_compare(); module.exports = (versions, range, options) => { @@ -1636,9 +1636,9 @@ var require_simplify = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/ranges/subset.js +// ../../node_modules/semver/ranges/subset.js var require_subset = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/ranges/subset.js"(exports$1, module) { + "../../node_modules/semver/ranges/subset.js"(exports$1, module) { var Range = require_range(); var Comparator = require_comparator(); var { ANY } = Comparator; @@ -1797,9 +1797,9 @@ var require_subset = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../../../node_modules/semver/index.js +// ../../node_modules/semver/index.js var require_semver2 = chunkIGJUBJBW_cjs.__commonJS({ - "../../../../node_modules/semver/index.js"(exports$1, module) { + "../../node_modules/semver/index.js"(exports$1, module) { var internalRe = require_re(); var constants = require_constants(); var SemVer = require_semver(); @@ -3180,5 +3180,5 @@ exports.PluginValidator = PluginValidator; exports.ScopedHookSystem = ScopedHookSystem; exports.createTurnstileMiddleware = createTurnstileMiddleware; exports.verifyTurnstile = verifyTurnstile; -//# sourceMappingURL=chunk-ZUXOAZWZ.cjs.map -//# sourceMappingURL=chunk-ZUXOAZWZ.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-ABB34XUS.cjs.map +//# sourceMappingURL=chunk-ABB34XUS.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-ABB34XUS.cjs.map b/packages/core/dist/chunk-ABB34XUS.cjs.map new file mode 100644 index 000000000..265930b92 --- /dev/null +++ b/packages/core/dist/chunk-ABB34XUS.cjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../node_modules/semver/internal/constants.js","../../../node_modules/semver/internal/debug.js","../../../node_modules/semver/internal/re.js","../../../node_modules/semver/internal/parse-options.js","../../../node_modules/semver/internal/identifiers.js","../../../node_modules/semver/classes/semver.js","../../../node_modules/semver/functions/parse.js","../../../node_modules/semver/functions/valid.js","../../../node_modules/semver/functions/clean.js","../../../node_modules/semver/functions/inc.js","../../../node_modules/semver/functions/diff.js","../../../node_modules/semver/functions/major.js","../../../node_modules/semver/functions/minor.js","../../../node_modules/semver/functions/patch.js","../../../node_modules/semver/functions/prerelease.js","../../../node_modules/semver/functions/compare.js","../../../node_modules/semver/functions/rcompare.js","../../../node_modules/semver/functions/compare-loose.js","../../../node_modules/semver/functions/compare-build.js","../../../node_modules/semver/functions/sort.js","../../../node_modules/semver/functions/rsort.js","../../../node_modules/semver/functions/gt.js","../../../node_modules/semver/functions/lt.js","../../../node_modules/semver/functions/eq.js","../../../node_modules/semver/functions/neq.js","../../../node_modules/semver/functions/gte.js","../../../node_modules/semver/functions/lte.js","../../../node_modules/semver/functions/cmp.js","../../../node_modules/semver/functions/coerce.js","../../../node_modules/semver/internal/lrucache.js","../../../node_modules/semver/classes/range.js","../../../node_modules/semver/classes/comparator.js","../../../node_modules/semver/functions/satisfies.js","../../../node_modules/semver/ranges/to-comparators.js","../../../node_modules/semver/ranges/max-satisfying.js","../../../node_modules/semver/ranges/min-satisfying.js","../../../node_modules/semver/ranges/min-version.js","../../../node_modules/semver/ranges/valid.js","../../../node_modules/semver/ranges/outside.js","../../../node_modules/semver/ranges/gtr.js","../../../node_modules/semver/ranges/ltr.js","../../../node_modules/semver/ranges/intersects.js","../../../node_modules/semver/ranges/simplify.js","../../../node_modules/semver/ranges/subset.js","../../../node_modules/semver/index.js","../src/plugins/hook-system.ts","../src/plugins/plugin-validator.ts","../src/plugins/plugin-registry.ts","../src/plugins/plugin-manager.ts","../src/plugins/core-plugins/turnstile-plugin/middleware/verify.ts","../src/plugins/core-plugins/turnstile-plugin/index.ts"],"names":["__commonJS","exports","z","require_valid","require_semver","__toESM","semver","HOOKS","Hono","TurnstileService","PluginBuilder","manifest_default"],"mappings":"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","file":"chunk-ABB34XUS.cjs","sourcesContent":["'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a === b ? 0 : a < b ? -1 : 1\n }\n\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n if (this.major < other.major) {\n return -1\n }\n if (this.major > other.major) {\n return 1\n }\n if (this.minor < other.minor) {\n return -1\n }\n if (this.minor > other.minor) {\n return 1\n }\n if (this.patch < other.patch) {\n return -1\n }\n if (this.patch > other.patch) {\n return 1\n }\n return 0\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n comp = comp.replace(re[t.BUILD], '')\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","/**\n * Hook System Implementation\n * \n * Provides event-driven extensibility for plugins\n */\n\nimport { HookSystem, HookHandler, PluginHook, HookContext } from '../types'\n\nexport class HookSystemImpl implements HookSystem {\n private hooks: Map = new Map()\n private executing: Set = new Set()\n\n /**\n * Register a hook handler\n */\n register(hookName: string, handler: HookHandler, priority: number = 10): void {\n if (!this.hooks.has(hookName)) {\n this.hooks.set(hookName, [])\n }\n\n const hooks = this.hooks.get(hookName)!\n const hook: PluginHook = {\n name: hookName,\n handler,\n priority,\n }\n\n // Insert hook in priority order (lower priority = earlier execution)\n const insertIndex = hooks.findIndex(h => h.priority! > priority)\n if (insertIndex === -1) {\n hooks.push(hook)\n } else {\n hooks.splice(insertIndex, 0, hook)\n }\n\n console.debug(`Hook registered: ${hookName} (priority: ${priority})`)\n }\n\n /**\n * Execute all handlers for a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n const hooks = this.hooks.get(hookName)\n if (!hooks || hooks.length === 0) {\n return data\n }\n\n // Prevent infinite recursion\n if (this.executing.has(hookName)) {\n console.warn(`Hook recursion detected for: ${hookName}`)\n return data\n }\n\n this.executing.add(hookName)\n\n try {\n let result = data\n let cancelled = false\n\n const hookContext: HookContext = {\n plugin: '', // Will be set by the plugin manager\n context: context || {},\n cancel: () => { cancelled = true }\n }\n\n for (const hook of hooks) {\n if (cancelled) {\n console.debug(`Hook execution cancelled: ${hookName}`)\n break\n }\n\n try {\n console.debug(`Executing hook: ${hookName} (priority: ${hook.priority})`)\n result = await hook.handler(result, hookContext)\n } catch (error) {\n console.error(`Hook execution failed: ${hookName}`, error)\n // Continue executing other hooks unless it's a critical error\n if (error instanceof Error && error.message.includes('CRITICAL')) {\n throw error\n }\n }\n }\n\n return result\n } finally {\n this.executing.delete(hookName)\n }\n }\n\n /**\n * Remove a hook handler\n */\n unregister(hookName: string, handler: HookHandler): void {\n const hooks = this.hooks.get(hookName)\n if (!hooks) return\n\n const index = hooks.findIndex(h => h.handler === handler)\n if (index !== -1) {\n hooks.splice(index, 1)\n console.debug(`Hook unregistered: ${hookName}`)\n }\n\n // Clean up empty hook arrays\n if (hooks.length === 0) {\n this.hooks.delete(hookName)\n }\n }\n\n /**\n * Get all registered hooks for a name\n */\n getHooks(hookName: string): PluginHook[] {\n return this.hooks.get(hookName) || []\n }\n\n /**\n * Get all registered hook names\n */\n getHookNames(): string[] {\n return Array.from(this.hooks.keys())\n }\n\n /**\n * Get hook statistics\n */\n getStats(): { hookName: string; handlerCount: number }[] {\n return Array.from(this.hooks.entries()).map(([hookName, handlers]) => ({\n hookName,\n handlerCount: handlers.length\n }))\n }\n\n /**\n * Clear all hooks (useful for testing)\n */\n clear(): void {\n this.hooks.clear()\n this.executing.clear()\n }\n\n /**\n * Create a scoped hook system for a plugin\n */\n createScope(_pluginName: string): ScopedHookSystem {\n return new ScopedHookSystem(this)\n }\n}\n\n/**\n * Scoped hook system for individual plugins\n */\nexport class ScopedHookSystem {\n private registeredHooks: { hookName: string; handler: HookHandler }[] = []\n\n constructor(\n private parent: HookSystemImpl\n ) {}\n\n /**\n * Register a hook (scoped to this plugin)\n */\n register(hookName: string, handler: HookHandler, priority?: number): void {\n this.parent.register(hookName, handler, priority)\n this.registeredHooks.push({ hookName, handler })\n }\n\n /**\n * Execute a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n return this.parent.execute(hookName, data, context)\n }\n\n /**\n * Unregister a specific hook\n */\n unregister(hookName: string, handler: HookHandler): void {\n this.parent.unregister(hookName, handler)\n const index = this.registeredHooks.findIndex(\n h => h.hookName === hookName && h.handler === handler\n )\n if (index !== -1) {\n this.registeredHooks.splice(index, 1)\n }\n }\n\n /**\n * Unregister all hooks for this plugin\n */\n unregisterAll(): void {\n for (const { hookName, handler } of this.registeredHooks) {\n this.parent.unregister(hookName, handler)\n }\n this.registeredHooks.length = 0\n }\n\n /**\n * Get hooks registered by this plugin\n */\n getRegisteredHooks(): { hookName: string; handler: HookHandler }[] {\n return [...this.registeredHooks]\n }\n}\n\n/**\n * Hook utilities\n */\nexport class HookUtils {\n /**\n * Create a hook name with namespace\n */\n static createHookName(namespace: string, event: string): string {\n return `${namespace}:${event}`\n }\n\n /**\n * Parse a hook name to extract namespace and event\n */\n static parseHookName(hookName: string): { namespace: string; event: string } {\n const parts = hookName.split(':')\n return {\n namespace: parts[0] || '',\n event: parts.slice(1).join(':') || ''\n }\n }\n\n /**\n * Create a middleware that executes hooks\n */\n static createHookMiddleware(\n hookSystem: HookSystem,\n beforeHook?: string,\n afterHook?: string\n ) {\n return async (c: any, next: any) => {\n if (beforeHook) {\n const beforeData = { request: c.req, context: c }\n await hookSystem.execute(beforeHook, beforeData)\n }\n\n await next()\n\n if (afterHook) {\n const afterData = { request: c.req, response: c.res, context: c }\n await hookSystem.execute(afterHook, afterData)\n }\n }\n }\n\n /**\n * Create a debounced hook handler\n */\n static debounce(handler: HookHandler, delay: number): HookHandler {\n let timeoutId: any\n \n return async (data: any, context: HookContext) => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n return new Promise((resolve, reject) => {\n timeoutId = setTimeout(async () => {\n try {\n const result = await handler(data, context)\n resolve(result)\n } catch (error) {\n reject(error)\n }\n }, delay)\n })\n }\n }\n\n /**\n * Create a throttled hook handler\n */\n static throttle(handler: HookHandler, limit: number): HookHandler {\n let lastExecution = 0\n\n return async (data: any, context: HookContext) => {\n const now = Date.now()\n if (now - lastExecution >= limit) {\n lastExecution = now\n return handler(data, context)\n }\n return data\n }\n }\n}","/**\n * Plugin Validator\n * \n * Validates plugin definitions, dependencies, and compatibility\n */\n\nimport { z } from 'zod'\nimport { Plugin, PluginValidator as IPluginValidator, PluginValidationResult, PluginRegistry } from '../types'\nimport semver from 'semver'\n\n// Zod schemas for plugin validation\nconst PluginAuthorSchema = z.object({\n name: z.string().min(1),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n})\n\nconst PluginRoutesSchema = z.object({\n path: z.string().min(1),\n handler: z.any(), // Hono instance\n description: z.string().optional(),\n requiresAuth: z.boolean().optional(),\n roles: z.array(z.string()).optional(),\n priority: z.number().optional(),\n})\n\nconst PluginMiddlewareSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n description: z.string().optional(),\n priority: z.number().optional(),\n routes: z.array(z.string()).optional(),\n global: z.boolean().optional(),\n})\n\nconst PluginModelSchema = z.object({\n name: z.string().min(1),\n tableName: z.string().min(1),\n schema: z.any(), // Zod schema\n migrations: z.array(z.string()),\n relationships: z.array(z.object({\n type: z.enum(['oneToOne', 'oneToMany', 'manyToMany']),\n target: z.string(),\n foreignKey: z.string().optional(),\n joinTable: z.string().optional(),\n })).optional(),\n extendsContent: z.boolean().optional(),\n})\n\nconst PluginServiceSchema = z.object({\n name: z.string().min(1),\n implementation: z.any(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n singleton: z.boolean().optional(),\n})\n\nconst PluginAdminPageSchema = z.object({\n path: z.string().min(1),\n title: z.string().min(1),\n component: z.string().min(1),\n description: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n menuItem: z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n }).optional(),\n icon: z.string().optional(),\n})\n\nconst PluginComponentSchema = z.object({\n name: z.string().min(1),\n template: z.function(),\n description: z.string().optional(),\n propsSchema: z.any().optional(), // Zod schema\n})\n\nconst PluginHookSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n priority: z.number().optional(),\n description: z.string().optional(),\n})\n\nconst PluginSchema = z.object({\n name: z.string().min(1).regex(/^[a-z0-9-]+$/, 'Plugin name must be lowercase with hyphens'),\n version: z.string().refine(v => semver.valid(v), 'Version must be valid semver'),\n description: z.string().optional(),\n author: PluginAuthorSchema.optional(),\n dependencies: z.array(z.string()).optional(),\n compatibility: z.string().optional(),\n license: z.string().optional(),\n \n // Extension points\n routes: z.array(PluginRoutesSchema).optional(),\n middleware: z.array(PluginMiddlewareSchema).optional(),\n models: z.array(PluginModelSchema).optional(),\n services: z.array(PluginServiceSchema).optional(),\n adminPages: z.array(PluginAdminPageSchema).optional(),\n adminComponents: z.array(PluginComponentSchema).optional(),\n menuItems: z.array(z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n })).optional(),\n hooks: z.array(PluginHookSchema).optional(),\n \n // Lifecycle hooks\n install: z.function().optional(),\n uninstall: z.function().optional(),\n activate: z.function().optional(),\n deactivate: z.function().optional(),\n configure: z.function().optional(),\n})\n\nexport class PluginValidator implements IPluginValidator {\n private static readonly RESERVED_NAMES = [\n 'core', 'system', 'admin', 'api', 'auth', 'content', 'media', 'users', 'collections'\n ]\n\n private static readonly RESERVED_PATHS = [\n '/admin', '/api', '/auth', '/docs', '/media', '/_assets'\n ]\n\n /**\n * Validate plugin definition\n */\n validate(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n try {\n // Schema validation\n const result = PluginSchema.safeParse(plugin)\n if (!result.success) {\n result.error.issues.forEach((err: any) => {\n errors.push(`${err.path.join('.')}: ${err.message}`)\n })\n }\n\n // Reserved name validation\n if (PluginValidator.RESERVED_NAMES.includes(plugin.name)) {\n errors.push(`Plugin name \"${plugin.name}\" is reserved`)\n }\n\n // Route path validation\n if (plugin.routes) {\n for (const route of plugin.routes) {\n if (PluginValidator.RESERVED_PATHS.some(path => route.path.startsWith(path))) {\n errors.push(`Route path \"${route.path}\" conflicts with reserved system path`)\n }\n \n if (!route.path.startsWith('/')) {\n errors.push(`Route path \"${route.path}\" must start with /`)\n }\n }\n }\n\n // Model validation\n if (plugin.models) {\n const modelNames = new Set()\n const tableNames = new Set()\n \n for (const model of plugin.models) {\n // Check for duplicate model names\n if (modelNames.has(model.name)) {\n errors.push(`Duplicate model name: ${model.name}`)\n }\n modelNames.add(model.name)\n \n // Check for duplicate table names\n if (tableNames.has(model.tableName)) {\n errors.push(`Duplicate table name: ${model.tableName}`)\n }\n tableNames.add(model.tableName)\n \n // Validate table name format\n if (!/^[a-z][a-z0-9_]*$/.test(model.tableName)) {\n errors.push(`Invalid table name format: ${model.tableName}`)\n }\n \n // Check for system table conflicts\n const systemTables = ['users', 'collections', 'content', 'content_versions', 'media', 'api_tokens']\n if (systemTables.includes(model.tableName)) {\n errors.push(`Table name \"${model.tableName}\" conflicts with system table`)\n }\n }\n }\n\n // Service validation\n if (plugin.services) {\n const serviceNames = new Set()\n \n for (const service of plugin.services) {\n if (serviceNames.has(service.name)) {\n errors.push(`Duplicate service name: ${service.name}`)\n }\n serviceNames.add(service.name)\n \n // Check for system service conflicts\n const systemServices = ['auth', 'content', 'media', 'cdn']\n if (systemServices.includes(service.name)) {\n warnings.push(`Service name \"${service.name}\" conflicts with system service`)\n }\n }\n }\n\n // Admin page validation\n if (plugin.adminPages) {\n const pagePaths = new Set()\n \n for (const page of plugin.adminPages) {\n if (pagePaths.has(page.path)) {\n errors.push(`Duplicate admin page path: ${page.path}`)\n }\n pagePaths.add(page.path)\n \n if (!page.path.startsWith('/')) {\n errors.push(`Admin page path \"${page.path}\" must start with /`)\n }\n \n // Check for system admin page conflicts\n const systemPaths = ['/', '/collections', '/content', '/media', '/users', '/settings']\n if (systemPaths.includes(page.path)) {\n errors.push(`Admin page path \"${page.path}\" conflicts with system page`)\n }\n }\n }\n\n // Component validation\n if (plugin.adminComponents) {\n const componentNames = new Set()\n \n for (const component of plugin.adminComponents) {\n if (componentNames.has(component.name)) {\n errors.push(`Duplicate component name: ${component.name}`)\n }\n componentNames.add(component.name)\n \n // Check for system component conflicts\n const systemComponents = ['table', 'form', 'alert', 'media-grid', 'pagination']\n if (systemComponents.includes(component.name)) {\n warnings.push(`Component name \"${component.name}\" conflicts with system component`)\n }\n }\n }\n\n // Hook validation\n if (plugin.hooks) {\n for (const hook of plugin.hooks) {\n if (!hook.name.includes(':')) {\n warnings.push(`Hook name \"${hook.name}\" should include namespace (e.g., \"plugin:event\")`)\n }\n }\n }\n\n // Dependency cycle detection (basic)\n if (plugin.dependencies?.includes(plugin.name)) {\n errors.push(`Plugin cannot depend on itself`)\n }\n\n // License validation\n if (plugin.license) {\n const validLicenses = ['MIT', 'Apache-2.0', 'GPL-3.0', 'BSD-3-Clause', 'ISC']\n if (!validLicenses.includes(plugin.license)) {\n warnings.push(`License \"${plugin.license}\" is not a common SPDX identifier`)\n }\n }\n\n // Performance warnings\n if (plugin.middleware && plugin.middleware.length > 5) {\n warnings.push(`Plugin defines ${plugin.middleware.length} middleware functions, consider consolidating`)\n }\n\n if (plugin.hooks && plugin.hooks.length > 10) {\n warnings.push(`Plugin defines ${plugin.hooks.length} hooks, ensure they are necessary`)\n }\n\n } catch (error) {\n errors.push(`Validation error: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin dependencies\n */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.dependencies || plugin.dependencies.length === 0) {\n return { valid: true, errors, warnings }\n }\n\n // Check if all dependencies are registered\n for (const depName of plugin.dependencies) {\n if (!registry.has(depName)) {\n errors.push(`Dependency \"${depName}\" is not registered`)\n continue\n }\n\n const dependency = registry.get(depName)!\n \n // Check dependency version compatibility\n if (dependency.compatibility && plugin.compatibility) {\n if (!this.isCompatible(dependency.compatibility, plugin.compatibility)) {\n warnings.push(`Potential compatibility issue with dependency \"${depName}\"`)\n }\n }\n }\n\n // Check for circular dependencies\n const visited = new Set()\n const visiting = new Set()\n \n const checkCircular = (name: string): boolean => {\n if (visiting.has(name)) return true\n if (visited.has(name)) return false\n \n visiting.add(name)\n \n const current = registry.get(name)\n if (current?.dependencies) {\n for (const depName of current.dependencies) {\n if (checkCircular(depName)) {\n errors.push(`Circular dependency detected: ${name} -> ${depName}`)\n return true\n }\n }\n }\n \n visiting.delete(name)\n visited.add(name)\n return false\n }\n\n checkCircular(plugin.name)\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin compatibility with SonicJS version\n */\n validateCompatibility(plugin: Plugin, sonicVersion: string): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.compatibility) {\n warnings.push('Plugin does not specify compatibility version')\n return { valid: true, errors, warnings }\n }\n\n try {\n if (!semver.satisfies(sonicVersion, plugin.compatibility)) {\n errors.push(`Plugin requires SonicJS ${plugin.compatibility}, but current version is ${sonicVersion}`)\n }\n } catch (error) {\n errors.push(`Invalid compatibility version format: ${plugin.compatibility}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Check if two version ranges are compatible\n */\n private isCompatible(version1: string, version2: string): boolean {\n try {\n // Simple compatibility check - can be enhanced\n return semver.intersects(version1, version2)\n } catch {\n return false\n }\n }\n\n /**\n * Validate plugin security constraints\n */\n validateSecurity(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n // Check for potentially dangerous patterns\n const pluginCode = JSON.stringify(plugin)\n \n // Check for eval or Function constructor usage\n if (pluginCode.includes('eval(') || pluginCode.includes('Function(')) {\n errors.push('Plugin contains potentially dangerous code execution patterns')\n }\n\n // Check for file system access attempts\n if (pluginCode.includes('fs.') || pluginCode.includes('require(')) {\n warnings.push('Plugin may attempt file system access (not available in Cloudflare Workers)')\n }\n\n // Check for network access patterns\n if (pluginCode.includes('fetch(') || pluginCode.includes('XMLHttpRequest')) {\n warnings.push('Plugin contains network access code - ensure it follows security guidelines')\n }\n\n // Check for sensitive data patterns\n const sensitivePatterns = ['password', 'secret', 'key', 'token', 'credential']\n for (const pattern of sensitivePatterns) {\n if (pluginCode.toLowerCase().includes(pattern)) {\n warnings.push(`Plugin code contains \"${pattern}\" - ensure sensitive data is properly handled`)\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n}","/**\n * Plugin Registry Implementation\n * \n * Manages plugin registration, activation, and lifecycle\n */\n\nimport { Plugin, PluginRegistry, PluginConfig, PluginStatus } from '../types'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginRegistryImpl implements PluginRegistry {\n private plugins: Map = new Map()\n private configs: Map = new Map()\n private statuses: Map = new Map()\n private validator: PluginValidator\n\n constructor(validator?: PluginValidator) {\n this.validator = validator || new PluginValidator()\n }\n\n /**\n * Get plugin by name\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name)\n }\n\n /**\n * Get all registered plugins\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values())\n }\n\n /**\n * Get active plugins\n */\n getActive(): Plugin[] {\n return this.getAll().filter(plugin => {\n const status = this.statuses.get(plugin.name)\n return status?.active === true\n })\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise {\n console.info(`Registering plugin: ${plugin.name} v${plugin.version}`)\n\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed for ${plugin.name}: ${validation.errors.join(', ')}`)\n }\n\n // Check for conflicts\n if (this.plugins.has(plugin.name)) {\n const existingPlugin = this.plugins.get(plugin.name)!\n if (existingPlugin.version !== plugin.version) {\n console.warn(`Plugin ${plugin.name} is already registered with version ${existingPlugin.version}, replacing with ${plugin.version}`)\n }\n }\n\n // Validate dependencies\n const depValidation = this.validator.validateDependencies(plugin, this)\n if (!depValidation.valid) {\n throw new Error(`Plugin dependency validation failed for ${plugin.name}: ${depValidation.errors.join(', ')}`)\n }\n\n // Register plugin\n this.plugins.set(plugin.name, plugin)\n \n // Initialize status\n this.statuses.set(plugin.name, {\n name: plugin.name,\n version: plugin.version,\n active: false,\n installed: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin registered successfully: ${plugin.name}`)\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise {\n console.info(`Unregistering plugin: ${name}`)\n\n if (!this.plugins.has(name)) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n // Check if other plugins depend on this one\n const dependents = this.getDependents(name)\n if (dependents.length > 0) {\n throw new Error(`Cannot unregister ${name}: plugins ${dependents.join(', ')} depend on it`)\n }\n\n // Remove plugin\n this.plugins.delete(name)\n this.configs.delete(name)\n this.statuses.delete(name)\n\n console.info(`Plugin unregistered: ${name}`)\n }\n\n /**\n * Check if plugin is registered\n */\n has(name: string): boolean {\n return this.plugins.has(name)\n }\n\n /**\n * Activate a plugin\n */\n async activate(name: string): Promise {\n console.info(`Activating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (status?.active) {\n console.warn(`Plugin ${name} is already active`)\n return\n }\n\n try {\n // Activate dependencies first\n if (plugin.dependencies) {\n for (const depName of plugin.dependencies) {\n const depStatus = this.statuses.get(depName)\n if (!depStatus?.active) {\n await this.activate(depName)\n }\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin activated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n active: false,\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to activate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Deactivate a plugin\n */\n async deactivate(name: string): Promise {\n console.info(`Deactivating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (!status?.active) {\n console.warn(`Plugin ${name} is not active`)\n return\n }\n\n try {\n // Deactivate dependents first\n const dependents = this.getDependents(name)\n for (const depName of dependents) {\n const depStatus = this.statuses.get(depName)\n if (depStatus?.active) {\n await this.deactivate(depName)\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: false,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin deactivated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to deactivate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Get plugin configuration\n */\n getConfig(name: string): PluginConfig | undefined {\n return this.configs.get(name)\n }\n\n /**\n * Set plugin configuration\n */\n setConfig(name: string, config: PluginConfig): void {\n this.configs.set(name, {\n ...config,\n updatedAt: Date.now()\n })\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus | undefined {\n return this.statuses.get(name)\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): Map {\n return new Map(this.statuses)\n }\n\n /**\n * Update plugin status\n */\n private updateStatus(name: string, updates: Partial): void {\n const current = this.statuses.get(name)\n if (current) {\n this.statuses.set(name, { ...current, ...updates })\n }\n }\n\n /**\n * Get plugins that depend on the specified plugin\n */\n private getDependents(name: string): string[] {\n const dependents: string[] = []\n \n for (const [pluginName, plugin] of this.plugins) {\n if (plugin.dependencies?.includes(name)) {\n dependents.push(pluginName)\n }\n }\n \n return dependents\n }\n\n /**\n * Get dependency graph\n */\n getDependencyGraph(): Map {\n const graph = new Map()\n \n for (const [name, plugin] of this.plugins) {\n graph.set(name, plugin.dependencies || [])\n }\n \n return graph\n }\n\n /**\n * Resolve plugin load order based on dependencies\n */\n resolveLoadOrder(): string[] {\n const graph = this.getDependencyGraph()\n const visited = new Set()\n const visiting = new Set()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected involving plugin: ${name}`)\n }\n\n visiting.add(name)\n \n const dependencies = graph.get(name) || []\n for (const dep of dependencies) {\n if (!graph.has(dep)) {\n throw new Error(`Plugin ${name} depends on ${dep}, but ${dep} is not registered`)\n }\n visit(dep)\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n for (const name of graph.keys()) {\n visit(name)\n }\n\n return result\n }\n\n /**\n * Export plugin configuration\n */\n exportConfig(): { plugins: PluginConfig[] } {\n const plugins: PluginConfig[] = []\n \n for (const [name, config] of this.configs) {\n plugins.push({\n ...config,\n name\n } as PluginConfig & { name: string })\n }\n \n return { plugins }\n }\n\n /**\n * Import plugin configuration\n */\n importConfig(config: { plugins: PluginConfig[] }): void {\n for (const pluginConfig of config.plugins) {\n if ('name' in pluginConfig) {\n const { name, ...rest } = pluginConfig as PluginConfig & { name: string }\n this.setConfig(name, rest)\n }\n }\n }\n\n /**\n * Clear all plugins (useful for testing)\n */\n clear(): void {\n this.plugins.clear()\n this.configs.clear()\n this.statuses.clear()\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n total: number\n active: number\n inactive: number\n withErrors: number\n } {\n const statuses = Array.from(this.statuses.values())\n \n return {\n total: statuses.length,\n active: statuses.filter(s => s.active).length,\n inactive: statuses.filter(s => !s.active).length,\n withErrors: statuses.filter(s => s.hasErrors).length\n }\n }\n}","/**\n * Plugin Manager\n * \n * Central orchestrator for the plugin system\n */\n\nimport { Hono } from 'hono'\nimport { Plugin, PluginManager as IPluginManager, PluginRegistry, PluginConfig, PluginContext, PluginStatus, HookSystem, PluginLogger, HOOKS } from '../types'\nimport { PluginRegistryImpl } from './plugin-registry'\nimport { HookSystemImpl, ScopedHookSystem } from './hook-system'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginManager implements IPluginManager {\n public readonly registry: PluginRegistry\n public readonly hooks: HookSystem\n private validator: PluginValidator\n private context?: PluginContext\n private scopedHooks: Map = new Map()\n private pluginRoutes: Map = new Map()\n\n constructor() {\n this.validator = new PluginValidator()\n this.registry = new PluginRegistryImpl(this.validator)\n this.hooks = new HookSystemImpl()\n }\n\n /**\n * Initialize plugin system\n */\n async initialize(context: PluginContext): Promise {\n console.info('Initializing plugin system...')\n \n this.context = context\n \n // Execute app init hook\n await this.hooks.execute(HOOKS.APP_INIT, {\n pluginManager: this,\n context\n })\n\n console.info('Plugin system initialized')\n }\n\n /**\n * Load plugins from configuration\n */\n async loadPlugins(configs: PluginConfig[]): Promise {\n console.info(`Loading ${configs.length} plugins...`)\n\n // Filter enabled plugins\n const enabledConfigs = configs.filter(config => config.enabled)\n \n if (enabledConfigs.length === 0) {\n console.info('No enabled plugins to load')\n return\n }\n\n // Load and register plugins (implementation would depend on how plugins are distributed)\n for (const config of enabledConfigs) {\n try {\n // In a real implementation, this would load the plugin from a registry or file system\n // For now, we'll assume plugins are already imported\n console.info(`Loading plugin configuration: ${JSON.stringify(config)}`)\n \n // Store configuration\n if ('name' in config) {\n this.registry.setConfig(config.name as string, config)\n }\n } catch (error) {\n console.error(`Failed to load plugin configuration:`, error)\n }\n }\n\n // Resolve load order based on dependencies\n try {\n const loadOrder = this.registry.resolveLoadOrder()\n console.info(`Plugin load order: ${loadOrder.join(' -> ')}`)\n\n // Activate plugins in dependency order\n for (const pluginName of loadOrder) {\n const config = this.registry.getConfig(pluginName)\n if (config?.enabled) {\n await this.registry.activate(pluginName)\n }\n }\n } catch (error) {\n console.error('Failed to resolve plugin load order:', error)\n }\n\n console.info('Plugin loading completed')\n }\n\n /**\n * Install a plugin\n */\n async install(plugin: Plugin, config?: PluginConfig): Promise {\n console.info(`Installing plugin: ${plugin.name}`)\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed: ${validation.errors.join(', ')}`)\n }\n\n // Register plugin\n await this.registry.register(plugin)\n\n // Set configuration\n const pluginConfig: PluginConfig = {\n enabled: true,\n installedAt: Date.now(),\n ...config\n }\n this.registry.setConfig(plugin.name, pluginConfig)\n\n // Create scoped hook system for plugin\n const scopedHooks = this.hooks.createScope ? \n (this.hooks as HookSystemImpl).createScope(plugin.name) : \n this.hooks\n\n this.scopedHooks.set(plugin.name, scopedHooks as ScopedHookSystem)\n\n // Create plugin context\n const pluginContext: PluginContext = {\n ...this.context,\n config: pluginConfig,\n hooks: scopedHooks,\n logger: this.createLogger(plugin.name)\n }\n\n // Register plugin extensions\n await this.registerPluginExtensions(plugin, pluginContext)\n\n // Run plugin install hook\n if (plugin.install) {\n await plugin.install(pluginContext)\n }\n\n // Execute plugin install hook\n await this.hooks.execute(HOOKS.PLUGIN_INSTALL, {\n plugin: plugin.name,\n version: plugin.version,\n context: pluginContext\n })\n\n console.info(`Plugin installed successfully: ${plugin.name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to install plugin ${plugin.name}:`, errorMessage)\n \n // Update status with error\n const status = this.registry.getStatus(plugin.name)\n if (status) {\n this.updatePluginStatus(plugin.name, {\n hasErrors: true,\n errors: [...(status.errors || []), errorMessage],\n lastError: errorMessage\n })\n }\n \n throw error\n }\n }\n\n /**\n * Uninstall a plugin\n */\n async uninstall(name: string): Promise {\n console.info(`Uninstalling plugin: ${name}`)\n\n const plugin = this.registry.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Deactivate plugin first\n const status = this.registry.getStatus(name)\n if (status?.active) {\n await this.registry.deactivate(name)\n }\n\n // Create plugin context\n const config = this.registry.getConfig(name) || { enabled: false }\n const pluginContext: PluginContext = {\n ...this.context,\n config,\n hooks: this.scopedHooks.get(name) || this.hooks,\n logger: this.createLogger(name)\n }\n\n // Run plugin uninstall hook\n if (plugin.uninstall) {\n await plugin.uninstall(pluginContext)\n }\n\n // Unregister plugin extensions\n await this.unregisterPluginExtensions(plugin)\n\n // Clean up scoped hooks\n const scopedHooks = this.scopedHooks.get(name)\n if (scopedHooks && 'unregisterAll' in scopedHooks) {\n scopedHooks.unregisterAll()\n }\n this.scopedHooks.delete(name)\n\n // Remove plugin routes\n this.pluginRoutes.delete(name)\n\n // Execute plugin uninstall hook\n await this.hooks.execute(HOOKS.PLUGIN_UNINSTALL, {\n plugin: name,\n context: pluginContext\n })\n\n // Unregister plugin\n await this.registry.unregister(name)\n\n console.info(`Plugin uninstalled successfully: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to uninstall plugin ${name}:`, errorMessage)\n throw error\n }\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus {\n const status = this.registry.getStatus(name)\n if (!status) {\n return {\n name,\n version: 'unknown',\n active: false,\n installed: false,\n hasErrors: false\n }\n }\n return status\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): PluginStatus[] {\n return Array.from(this.registry.getAllStatuses().values())\n }\n\n /**\n * Register plugin extensions (routes, middleware, etc.)\n */\n private async registerPluginExtensions(plugin: Plugin, _context: PluginContext): Promise {\n // Register routes\n if (plugin.routes) {\n const pluginApp = new Hono()\n \n for (const route of plugin.routes) {\n console.debug(`Registering plugin route: ${route.path}`)\n pluginApp.route(route.path, route.handler)\n }\n \n this.pluginRoutes.set(plugin.name, pluginApp)\n }\n\n // Register middleware\n if (plugin.middleware) {\n for (const middleware of plugin.middleware) {\n console.debug(`Registering plugin middleware: ${middleware.name}`)\n // Middleware registration would be handled by the main app\n }\n }\n\n // Register hooks\n if (plugin.hooks) {\n const scopedHooks = this.scopedHooks.get(plugin.name)\n for (const hook of plugin.hooks) {\n console.debug(`Registering plugin hook: ${hook.name}`)\n if (scopedHooks) {\n scopedHooks.register(hook.name, hook.handler, hook.priority)\n } else {\n this.hooks.register(hook.name, hook.handler, hook.priority)\n }\n }\n }\n\n // Register services\n if (plugin.services) {\n for (const service of plugin.services) {\n console.debug(`Registering plugin service: ${service.name}`)\n // Service registration would be handled by a service container\n }\n }\n\n // Register database models\n if (plugin.models) {\n for (const model of plugin.models) {\n console.debug(`Registering plugin model: ${model.name}`)\n // Model registration would involve database migrations\n }\n }\n }\n\n /**\n * Unregister plugin extensions\n */\n private async unregisterPluginExtensions(plugin: Plugin): Promise {\n // Clean up is mostly handled by the scoped systems\n console.debug(`Unregistering extensions for plugin: ${plugin.name}`)\n }\n\n /**\n * Update plugin status\n */\n private updatePluginStatus(name: string, updates: Partial): void {\n const current = this.registry.getStatus(name)\n if (current && 'updateStatus' in this.registry) {\n // This would require extending the registry interface\n console.debug(`Updating status for plugin: ${name}`, updates)\n }\n }\n\n /**\n * Create a logger for a plugin\n */\n private createLogger(pluginName: string): PluginLogger {\n return {\n debug: (message: string, data?: any) => {\n console.debug(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n info: (message: string, data?: any) => {\n console.info(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n warn: (message: string, data?: any) => {\n console.warn(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n error: (message: string, error?: Error, data?: any) => {\n console.error(`[Plugin:${pluginName}] ${message}`, error || '', data || '')\n }\n }\n }\n\n /**\n * Get plugin routes for mounting in main app\n */\n getPluginRoutes(): Map {\n return new Map(this.pluginRoutes)\n }\n\n /**\n * Get plugin middleware for main app\n */\n getPluginMiddleware(): Array<{ name: string; handler: any; priority: number; global: boolean }> {\n const middleware: Array<{ name: string; handler: any; priority: number; global: boolean }> = []\n \n for (const plugin of this.registry.getActive()) {\n if (plugin.middleware) {\n for (const mw of plugin.middleware) {\n middleware.push({\n name: `${plugin.name}:${mw.name}`,\n handler: mw.handler,\n priority: mw.priority || 10,\n global: mw.global || false\n })\n }\n }\n }\n \n // Sort by priority\n return middleware.sort((a, b) => a.priority - b.priority)\n }\n\n /**\n * Execute shutdown procedures\n */\n async shutdown(): Promise {\n console.info('Shutting down plugin system...')\n \n // Execute app shutdown hook\n await this.hooks.execute(HOOKS.APP_SHUTDOWN, {\n pluginManager: this\n })\n\n // Deactivate all active plugins\n const activePlugins = this.registry.getActive()\n for (const plugin of activePlugins.reverse()) { // Reverse order\n try {\n await this.registry.deactivate(plugin.name)\n } catch (error) {\n console.error(`Error deactivating plugin ${plugin.name}:`, error)\n }\n }\n\n console.info('Plugin system shutdown completed')\n }\n\n /**\n * Get plugin system statistics\n */\n getStats(): {\n registry: ReturnType\n hooks: Array<{ hookName: string; handlerCount: number }>\n routes: number\n middleware: number\n } {\n return {\n registry: (this.registry as PluginRegistryImpl).getStats(),\n hooks: (this.hooks as HookSystemImpl).getStats(),\n routes: this.pluginRoutes.size,\n middleware: this.getPluginMiddleware().length\n }\n }\n}","import type { Context, Next } from 'hono'\nimport { TurnstileService } from '../services/turnstile'\n\n/**\n * Middleware to verify Turnstile token on form submissions\n * \n * Usage:\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Token already verified, process form...\n * })\n * ```\n */\nexport async function verifyTurnstile(c: Context, next: Next) {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n console.error('Turnstile middleware: Database not available')\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n\n // Check if Turnstile is enabled\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n // Turnstile not enabled, allow through\n return next()\n }\n\n // Get token from request\n let token: string | undefined\n let body: any\n\n if (c.req.method === 'POST') {\n const contentType = c.req.header('content-type') || ''\n \n if (contentType.includes('application/json')) {\n body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n }\n\n if (!token) {\n return c.json({ \n error: 'Turnstile token missing',\n message: 'Please complete the verification challenge'\n }, 400)\n }\n\n // Verify token\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return c.json({ \n error: 'Turnstile verification failed',\n message: result.error || 'Verification failed. Please try again.'\n }, 403)\n }\n\n // Verification successful, continue\n return next()\n}\n\n/**\n * Middleware factory that allows custom error handling\n */\nexport function createTurnstileMiddleware(options?: {\n onError?: (c: Context, error: string) => Response\n onMissing?: (c: Context) => Response\n}) {\n return async (c: Context, next: Next) => {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n return options?.onError?.(c, 'Database not available') || \n c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n return next()\n }\n\n let token: string | undefined\n const contentType = c.req.header('content-type') || ''\n\n if (contentType.includes('application/json')) {\n const body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n\n if (!token) {\n return options?.onMissing?.(c) ||\n c.json({ error: 'Turnstile token missing' }, 400)\n }\n\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return options?.onError?.(c, result.error || 'Verification failed') ||\n c.json({ error: 'Turnstile verification failed', message: result.error }, 403)\n }\n\n return next()\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { TurnstileService } from './services/turnstile'\nimport { verifyTurnstile } from './middleware/verify'\nimport manifest from './manifest.json'\n\n/**\n * Cloudflare Turnstile Plugin\n * \n * Provides CAPTCHA-free bot protection using Cloudflare Turnstile.\n * Can be used with any form by adding the verifyTurnstile middleware.\n * \n * Settings are managed through the generic admin plugin interface.\n * No custom routes needed - the admin system automatically handles settings.\n * \n * @example\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Process form after Turnstile verification\n * })\n * ```\n */\n\n// Build the plugin - no custom routes, generic admin handles settings\nexport const turnstilePlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('turnstile', TurnstileService)\n .addSingleMiddleware('verifyTurnstile', verifyTurnstile, {\n description: 'Verify Cloudflare Turnstile token',\n global: false,\n })\n .build()\n\n// Export service and middleware for easy import\nexport { TurnstileService } from './services/turnstile'\nexport { verifyTurnstile, createTurnstileMiddleware } from './middleware/verify'\nexport { renderTurnstileWidget, renderInlineTurnstile, getTurnstileScript, renderExplicitTurnstile } from './components/widget'\nexport type { TurnstileSettings, TurnstileVerificationResponse } from './services/turnstile'\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-BX75LZES.cjs.map b/packages/core/dist/chunk-BX75LZES.cjs.map deleted file mode 100644 index 1c7c14210..000000000 --- a/packages/core/dist/chunk-BX75LZES.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/schemas/index.ts","../src/routes/api-content-access-policy.ts","../src/plugins/core-plugins/global-variables-plugin/variable-resolver.ts","../src/routes/api-content-crud.ts","../src/routes/api.ts","../src/routes/api-media.ts","../src/routes/api-system.ts","../src/routes/admin-api.ts","../src/templates/pages/auth-login.template.ts","../src/templates/pages/auth-register.template.ts","../src/services/auth-validation.ts","../src/plugins/core-plugins/user-profiles/user-profile-registry.ts","../src/plugins/core-plugins/user-profiles/user-profile-service.ts","../src/templates/components/drag-sortable.template.ts","../src/templates/components/dynamic-field.template.ts","../src/plugins/core-plugins/user-profiles/user-profile-renderer.ts","../src/plugins/core-plugins/user-profiles/index.ts","../src/routes/auth.ts","../src/routes/test-cleanup.ts","../src/middleware/plugin-middleware.ts","../src/templates/components/version-history.template.ts","../src/plugins/available/easy-mdx/index.ts","../src/plugins/available/tinymce-plugin/index.ts","../src/plugins/core-plugins/quill-editor/index.ts","../src/templates/pages/admin-content-form.template.ts","../src/templates/pages/admin-content-list.template.ts","../src/routes/admin-content-field-types.ts","../src/routes/admin-content.ts","../src/templates/pages/admin-profile.template.ts","../src/templates/components/alert.template.ts","../src/templates/pages/admin-activity-logs.template.ts","../src/templates/pages/admin-user-edit.template.ts","../src/templates/components/confirmation-dialog.template.ts","../src/templates/pages/admin-user-new.template.ts","../src/templates/pages/admin-users-list.template.ts","../src/routes/admin-users.ts","../src/templates/components/media-grid.template.ts","../src/templates/pages/admin-media-library.template.ts","../src/templates/components/media-file-details.template.ts","../src/routes/admin-media.ts","../src/templates/pages/admin-plugins-list.template.ts","../src/templates/components/auth-settings-form.template.ts","../src/templates/pages/admin-plugin-settings.template.ts","../src/routes/admin-plugins.ts","../src/templates/pages/admin-logs-list.template.ts","../src/templates/pages/admin-log-details.template.ts","../src/templates/pages/admin-log-config.template.ts","../src/routes/admin-logs.ts","../src/routes/admin-design.ts","../src/routes/admin-checkboxes.ts","../src/templates/pages/admin-testimonials-form.template.ts","../src/routes/admin-testimonials.ts","../src/templates/pages/admin-code-examples-form.template.ts","../src/routes/admin-code-examples.ts","../src/templates/pages/admin-dashboard.template.ts","../src/routes/admin-dashboard.ts","../src/routes/admin-collections-field-types.ts","../src/templates/pages/admin-collections-list.template.ts","../src/templates/components/table.template.ts","../src/templates/pages/admin-collections-form.template.ts","../src/routes/admin-collections.ts","../src/templates/pages/admin-settings.template.ts","../src/routes/admin-settings.ts","../src/templates/pages/admin-forms-list.template.ts","../src/templates/pages/admin-forms-builder.template.ts","../src/templates/pages/admin-forms-create.template.ts","../src/routes/admin-forms.ts","../src/routes/public-forms.ts","../src/templates/pages/admin-api-reference.template.ts","../src/routes/admin-api-reference.ts","../src/routes/index.ts"],"names":["Hono","requireAuth","requireRole","getCacheService","CACHE_CONFIGS","isPluginActive","cors","optionalAuth","QueryFilterBuilder","builder","z","MigrationService","renderAlert","sanitizeInput","raw","escapeHtml","checked","PluginBuilder","generateCsrfToken","getJwtExpirySecondsFromDb","setCookie","error","rateLimit","AuthManager","getCookie","getJwtRefreshGraceSecondsFromDb","html","passwordHash","c","init_admin_layout_catalyst_template","renderConfirmationDialog","getConfirmationDialogScript","renderAdminLayoutCatalyst","renderTable","renderPagination","getBlocksFieldConfig","parseBlocksValue","db","collection","formData","PluginService","tinymcePlugin","sanitizeRichText","renderAdminLayout","logActivity","fileValidationSchema","getImageDimensions","getJPEGDimensions","getPNGDimensions","PLUGIN_REGISTRY","SettingsService","findPluginByCodeName","adminLayoutV2","getLogger","renderDesignPage","renderCheckboxPage","renderTestimonialsList","renderCodeExamplesList","getCoreVersion","metricsTracker","renderForm","tinymceActive","quillActive","mdxeditorActive","result","TurnstileService","createContentFromSubmission","CATEGORY_INFO","VERSION","router","app","getAppInstance","buildRouteList"],"mappings":"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A;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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,CAAU,IAAA,CAAK,MAAA,IAAU,EAAE,CAAC,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA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AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EA6VU,KAAK,YAAY;AAAA;AAAA;AAAA;AAAA,kBAAA,EAI7B,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,2BAAA,EAgCA,KAAK,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,iCAAA,EAYH,KAAK,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2FxC,6BAA6B;AAAA;;AAAA;AAAA;AAAA;AAAA,wBAAA,EAML,KAAK,EAAE,CAAA;AAAA,+BAAA,EACA,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,qCAAA,EACtB,gBAAgB,CAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAAA,EAsHlB,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AA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","file":"chunk-BX75LZES.cjs","sourcesContent":["/**\n * Schema Definitions\n *\n * Placeholder for schema definitions - to be populated as needed\n */\n\nexport interface SchemaDefinition {\n name: string\n fields: any[]\n}\n\n// Empty array for now - schemas will be migrated incrementally\nexport const schemaDefinitions: SchemaDefinition[] = []\n","import type { FilterCondition, FilterGroup, QueryFilter } from '../utils/query-filter'\n\nfunction canReadNonPublicContent(userRole?: string): boolean {\n return userRole === 'admin' || userRole === 'editor'\n}\n\nfunction isStatusCondition(condition: FilterCondition): boolean {\n return condition.field === 'status'\n}\n\nfunction stripStatusConditions(group?: FilterGroup): FilterGroup | undefined {\n if (!group) {\n return undefined\n }\n\n const and = group.and?.filter(condition => !isStatusCondition(condition))\n const or = group.or?.filter(condition => !isStatusCondition(condition))\n\n const normalizedGroup: FilterGroup = {}\n\n if (and && and.length > 0) {\n normalizedGroup.and = and\n }\n\n if (or && or.length > 0) {\n normalizedGroup.or = or\n }\n\n return normalizedGroup\n}\n\nexport function normalizePublicContentFilter(filter: QueryFilter, userRole?: string): QueryFilter {\n if (canReadNonPublicContent(userRole)) {\n return filter\n }\n\n const normalizedFilter: QueryFilter = {\n ...filter,\n where: stripStatusConditions(filter.where)\n }\n\n if (!normalizedFilter.where) {\n normalizedFilter.where = { and: [] }\n }\n\n if (!normalizedFilter.where.and) {\n normalizedFilter.where.and = []\n }\n\n normalizedFilter.where.and.push({\n field: 'status',\n operator: 'equals',\n value: 'published'\n })\n\n return normalizedFilter\n}\n","/**\n * Variable Resolver\n *\n * Scans strings for {variable_key} tokens and replaces them\n * with values from the global variables map.\n *\n * Token syntax: {key} where key matches /^[a-z0-9_]+$/\n * Unresolved tokens are left as-is so editors can see what's missing.\n */\n\n// Matches {variable_key} — only lowercase alphanumeric + underscores\nconst TOKEN_PATTERN = /\\{([a-z0-9_]+)\\}/g\n\n/**\n * Replace all {variable_key} tokens in a string with their values.\n * Unresolved tokens remain unchanged.\n */\nexport function resolveVariables(\n text: string,\n variables: Map\n): string {\n if (!text || variables.size === 0) return text\n\n return text.replace(TOKEN_PATTERN, (match, key) => {\n const value = variables.get(key)\n return value !== undefined ? value : match\n })\n}\n\n/**\n * Recursively resolve variables in an object's string values.\n * Handles nested objects, arrays, and the `data` field of content items.\n */\nexport function resolveVariablesInObject(\n obj: any,\n variables: Map\n): any {\n if (!obj || variables.size === 0) return obj\n\n if (typeof obj === 'string') {\n return resolveVariables(obj, variables)\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => resolveVariablesInObject(item, variables))\n }\n\n if (typeof obj === 'object') {\n const result: Record = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key] = resolveVariablesInObject(value, variables)\n }\n return result\n }\n\n return obj\n}\n\n// ============================================================================\n// In-memory variable cache (shared with index.ts via import)\n// ============================================================================\n\nlet variableCache: Map | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL_MS = 300_000 // 5 minutes\n\nexport function getVariablesCached(): Map | null {\n const now = Date.now()\n if (variableCache && (now - cacheTimestamp) < CACHE_TTL_MS) {\n return variableCache\n }\n return null\n}\n\nexport function setVariablesCache(map: Map): void {\n variableCache = map\n cacheTimestamp = Date.now()\n}\n\nexport function invalidateVariablesCache(): void {\n variableCache = null\n cacheTimestamp = 0\n}\n\n/**\n * Resolve variables in a content object using the database.\n * Fetches variables from DB (with caching) and resolves tokens.\n * Safe to call even if the global_variables table doesn't exist yet.\n */\nexport async function resolveContentVariables(\n contentData: any,\n db: any\n): Promise {\n if (!db || !contentData) return contentData\n\n try {\n // Check cache first\n let variables = getVariablesCached()\n\n if (!variables) {\n const { results } = await db.prepare(\n 'SELECT key, value FROM global_variables WHERE is_active = 1'\n ).all()\n\n variables = new Map()\n for (const row of results || []) {\n variables.set((row as any).key, (row as any).value)\n }\n setVariablesCache(variables)\n }\n\n if (variables.size === 0) return contentData\n\n return resolveVariablesInObject(contentData, variables)\n } catch {\n // Table may not exist yet — silently return original data\n return contentData\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth, requireRole } from '../middleware'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport type { Bindings, Variables } from '../app'\nimport { resolveContentVariables } from '../plugins/core-plugins/global-variables-plugin/variable-resolver'\n\nconst apiContentCrudRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// GET /api/content/check-slug - Check if slug is available in collection\n// Query params: collectionId, slug, excludeId (optional - when editing)\n// NOTE: This MUST come before /:id route to avoid route conflict\napiContentCrudRoutes.get('/check-slug', async (c) => {\n try {\n const db = c.env.DB\n const collectionId = c.req.query('collectionId')\n const slug = c.req.query('slug')\n const excludeId = c.req.query('excludeId') // When editing, exclude current item\n \n if (!collectionId || !slug) {\n return c.json({ error: 'collectionId and slug are required' }, 400)\n }\n \n // Check for existing content with this slug in the collection\n let query = 'SELECT id FROM content WHERE collection_id = ? AND slug = ?'\n const params: string[] = [collectionId, slug]\n \n if (excludeId) {\n query += ' AND id != ?'\n params.push(excludeId)\n }\n \n const existing = await db.prepare(query).bind(...params).first()\n \n if (existing) {\n return c.json({ \n available: false, \n message: 'This URL slug is already in use in this collection' \n })\n }\n \n return c.json({ available: true })\n } catch (error: unknown) {\n console.error('Error checking slug:', error)\n return c.json({ \n error: 'Failed to check slug availability',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// GET /api/content/:id - Get single content item by ID\napiContentCrudRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n const stmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await stmt.bind(id).first()\n\n if (!content) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n const transformedContent = {\n id: (content as any).id,\n title: (content as any).title,\n slug: (content as any).slug,\n status: (content as any).status,\n collectionId: (content as any).collection_id,\n data: (content as any).data ? JSON.parse((content as any).data) : {},\n created_at: (content as any).created_at,\n updated_at: (content as any).updated_at\n }\n\n // Resolve {variable_key} tokens in content data\n const resolveVars = c.req.query('resolve_variables') !== 'false'\n if (resolveVars) {\n transformedContent.data = await resolveContentVariables(transformedContent.data, db)\n }\n\n return c.json({ data: transformedContent })\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// POST /api/content - Create new content (requires authentication)\napiContentCrudRoutes.post('/', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const db = c.env.DB\n const user = c.get('user')\n const body = await c.req.json()\n\n const { collectionId, title, slug, status, data } = body\n\n // Validate required fields\n if (!collectionId) {\n return c.json({ error: 'collectionId is required' }, 400)\n }\n\n if (!title) {\n return c.json({ error: 'title is required' }, 400)\n }\n\n // Generate slug from title if not provided\n let finalSlug = slug || title\n finalSlug = finalSlug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim()\n\n // Check for duplicate slug within the same collection\n const duplicateCheck = db.prepare(\n 'SELECT id FROM content WHERE collection_id = ? AND slug = ?'\n )\n const existing = await duplicateCheck.bind(collectionId, finalSlug).first()\n\n if (existing) {\n return c.json({ error: 'A content item with this slug already exists in this collection' }, 409)\n }\n\n // Create new content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n finalSlug,\n title,\n JSON.stringify(data || {}),\n status || 'draft',\n user?.userId || 'system',\n now,\n now\n ).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n await cache.invalidate('content-filtered:*')\n\n // Get the created content\n const getStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const createdContent = await getStmt.bind(contentId).first() as any\n\n return c.json({\n data: {\n id: createdContent.id,\n title: createdContent.title,\n slug: createdContent.slug,\n status: createdContent.status,\n collectionId: createdContent.collection_id,\n data: createdContent.data ? JSON.parse(createdContent.data) : {},\n created_at: createdContent.created_at,\n updated_at: createdContent.updated_at\n }\n }, 201)\n } catch (error) {\n console.error('Error creating content:', error)\n return c.json({\n error: 'Failed to create content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// PUT /api/content/:id - Update content (requires authentication)\napiContentCrudRoutes.put('/:id', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const body = await c.req.json()\n\n // Check if content exists\n const existingStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existing = await existingStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n // Build update fields dynamically\n const updates: string[] = []\n const params: any[] = []\n\n if (body.title !== undefined) {\n updates.push('title = ?')\n params.push(body.title)\n }\n\n if (body.slug !== undefined) {\n let finalSlug = body.slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim()\n updates.push('slug = ?')\n params.push(finalSlug)\n }\n\n if (body.status !== undefined) {\n updates.push('status = ?')\n params.push(body.status)\n }\n\n if (body.data !== undefined) {\n updates.push('data = ?')\n params.push(JSON.stringify(body.data))\n }\n\n // Always update updated_at\n const now = Date.now()\n updates.push('updated_at = ?')\n params.push(now)\n\n // Add id to params for WHERE clause\n params.push(id)\n\n // Execute update\n const updateStmt = db.prepare(`\n UPDATE content SET ${updates.join(', ')}\n WHERE id = ?\n `)\n\n await updateStmt.bind(...params).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existing.collection_id}:*`)\n await cache.invalidate('content-filtered:*')\n\n // Get updated content\n const getStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const updatedContent = await getStmt.bind(id).first() as any\n\n return c.json({\n data: {\n id: updatedContent.id,\n title: updatedContent.title,\n slug: updatedContent.slug,\n status: updatedContent.status,\n collectionId: updatedContent.collection_id,\n data: updatedContent.data ? JSON.parse(updatedContent.data) : {},\n created_at: updatedContent.created_at,\n updated_at: updatedContent.updated_at\n }\n })\n } catch (error) {\n console.error('Error updating content:', error)\n return c.json({\n error: 'Failed to update content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// DELETE /api/content/:id - Delete content (requires authentication)\napiContentCrudRoutes.delete('/:id', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if content exists\n const existingStmt = db.prepare('SELECT collection_id FROM content WHERE id = ?')\n const existing = await existingStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n // Delete the content (hard delete for API, soft delete happens in admin routes)\n const deleteStmt = db.prepare('DELETE FROM content WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existing.collection_id}:*`)\n await cache.invalidate('content-filtered:*')\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting content:', error)\n return c.json({\n error: 'Failed to delete content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\nexport default apiContentCrudRoutes\n","import { Hono } from 'hono'\nimport { cors } from 'hono/cors'\nimport { schemaDefinitions } from '../schemas'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { QueryFilterBuilder, QueryFilter } from '../utils'\nimport { isPluginActive, optionalAuth } from '../middleware'\nimport { normalizePublicContentFilter } from './api-content-access-policy'\nimport apiContentCrudRoutes from './api-content-crud'\nimport type { Bindings, Variables as AppVariables } from '../app'\n\n// Extend Variables with API-specific fields\ninterface Variables extends AppVariables {\n startTime: number\n cacheEnabled?: boolean\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Add timing middleware\napiRoutes.use('*', async (c, next) => {\n const startTime = Date.now()\n c.set('startTime', startTime)\n await next()\n const totalTime = Date.now() - startTime\n c.header('X-Response-Time', `${totalTime}ms`)\n})\n\n// Check if cache plugin is active\napiRoutes.use('*', async (c, next) => {\n const cacheEnabled = await isPluginActive(c.env.DB, 'core-cache')\n c.set('cacheEnabled', cacheEnabled)\n await next()\n})\n\n// Add CORS middleware\napiRoutes.use('*', cors({\n origin: (origin, c) => {\n const allowed = (c.env as any)?.CORS_ORIGINS as string | undefined\n if (!allowed) return null // No env var = reject cross-origin (secure default)\n const list = allowed.split(',').map((s: string) => s.trim())\n return list.includes(origin) ? origin : null\n },\n allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowHeaders: ['Content-Type', 'Authorization', 'X-API-Key']\n}))\n\n// Helper function to add timing metadata\nfunction addTimingMeta(c: any, meta: any = {}, executionStartTime?: number) {\n const totalTime = Date.now() - c.get('startTime')\n const executionTime = executionStartTime ? Date.now() - executionStartTime : undefined\n\n return {\n ...meta,\n timing: {\n total: totalTime,\n execution: executionTime,\n unit: 'ms'\n }\n }\n}\n\n// Root endpoint - OpenAPI 3.0.0 specification\napiRoutes.get('/', (c) => {\n const baseUrl = new URL(c.req.url)\n const serverUrl = `${baseUrl.protocol}//${baseUrl.host}`\n\n return c.json({\n openapi: '3.0.0',\n info: {\n title: 'SonicJS AI API',\n version: '0.1.0',\n description: 'RESTful API for SonicJS headless CMS - a modern, AI-powered content management system built on Cloudflare Workers',\n contact: {\n name: 'SonicJS Support',\n url: `${serverUrl}/docs`,\n email: 'support@sonicjs.com'\n },\n license: {\n name: 'MIT',\n url: 'https://opensource.org/licenses/MIT'\n }\n },\n servers: [\n {\n url: serverUrl,\n description: 'Current server'\n }\n ],\n paths: {\n '/api/': {\n get: {\n summary: 'API Information',\n description: 'Returns OpenAPI specification for the SonicJS API',\n operationId: 'getApiInfo',\n tags: ['System'],\n responses: {\n '200': {\n description: 'OpenAPI specification',\n content: {\n 'application/json': {\n schema: { type: 'object' }\n }\n }\n }\n }\n }\n },\n '/api/health': {\n get: {\n summary: 'Health Check',\n description: 'Returns API health status and available schemas',\n operationId: 'getHealth',\n tags: ['System'],\n responses: {\n '200': {\n description: 'Health status',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n status: { type: 'string', example: 'healthy' },\n timestamp: { type: 'string', format: 'date-time' },\n schemas: { type: 'array', items: { type: 'string' } }\n }\n }\n }\n }\n }\n }\n }\n },\n '/api/collections': {\n get: {\n summary: 'List Collections',\n description: 'Returns all active collections with their schemas',\n operationId: 'getCollections',\n tags: ['Content'],\n responses: {\n '200': {\n description: 'List of collections',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n name: { type: 'string' },\n display_name: { type: 'string' },\n schema: { type: 'object' },\n is_active: { type: 'integer' }\n }\n }\n },\n meta: { type: 'object' }\n }\n }\n }\n }\n }\n }\n }\n },\n '/api/collections/{collection}/content': {\n get: {\n summary: 'Get Collection Content',\n description: 'Returns content items from a specific collection with filtering support. Anonymous, viewer, and author requests are restricted to published content; admin and editor requests may query other statuses.',\n operationId: 'getCollectionContent',\n tags: ['Content'],\n parameters: [\n {\n name: 'collection',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Collection name'\n },\n {\n name: 'limit',\n in: 'query',\n schema: { type: 'integer', default: 50, maximum: 1000 },\n description: 'Maximum number of items to return'\n },\n {\n name: 'offset',\n in: 'query',\n schema: { type: 'integer', default: 0 },\n description: 'Number of items to skip'\n },\n {\n name: 'status',\n in: 'query',\n schema: { type: 'string', enum: ['draft', 'published', 'archived'] },\n description: 'Filter by content status. Anonymous, viewer, and author requests are limited to published content.'\n }\n ],\n responses: {\n '200': {\n description: 'List of content items',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: { type: 'array', items: { type: 'object' } },\n meta: { type: 'object' }\n }\n }\n }\n }\n },\n '404': {\n description: 'Collection not found'\n }\n }\n }\n },\n '/api/content': {\n get: {\n summary: 'List Content',\n description: 'Returns content items with advanced filtering support. Anonymous, viewer, and author requests are restricted to published content; admin and editor requests may query other statuses.',\n operationId: 'getContent',\n tags: ['Content'],\n parameters: [\n {\n name: 'collection',\n in: 'query',\n schema: { type: 'string' },\n description: 'Filter by collection name'\n },\n {\n name: 'limit',\n in: 'query',\n schema: { type: 'integer', default: 50, maximum: 1000 },\n description: 'Maximum number of items to return'\n },\n {\n name: 'offset',\n in: 'query',\n schema: { type: 'integer', default: 0 },\n description: 'Number of items to skip'\n },\n {\n name: 'status',\n in: 'query',\n schema: { type: 'string', enum: ['draft', 'published', 'archived'] },\n description: 'Filter by content status. Anonymous, viewer, and author requests are limited to published content.'\n }\n ],\n responses: {\n '200': {\n description: 'List of content items',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: { type: 'array', items: { type: 'object' } },\n meta: { type: 'object' }\n }\n }\n }\n }\n }\n }\n },\n post: {\n summary: 'Create Content',\n description: 'Creates a new content item',\n operationId: 'createContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['collection_id', 'title'],\n properties: {\n collection_id: { type: 'string' },\n title: { type: 'string' },\n slug: { type: 'string' },\n status: { type: 'string', enum: ['draft', 'published', 'archived'] },\n data: { type: 'object' }\n }\n }\n }\n }\n },\n responses: {\n '201': { description: 'Content created successfully' },\n '400': { description: 'Invalid request body' },\n '401': { description: 'Unauthorized' }\n }\n }\n },\n '/api/content/{id}': {\n get: {\n summary: 'Get Content by ID',\n description: 'Returns a specific content item by ID',\n operationId: 'getContentById',\n tags: ['Content'],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content item' },\n '404': { description: 'Content not found' }\n }\n },\n put: {\n summary: 'Update Content',\n description: 'Updates an existing content item',\n operationId: 'updateContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content updated successfully' },\n '401': { description: 'Unauthorized' },\n '404': { description: 'Content not found' }\n }\n },\n delete: {\n summary: 'Delete Content',\n description: 'Deletes a content item',\n operationId: 'deleteContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content deleted successfully' },\n '401': { description: 'Unauthorized' },\n '404': { description: 'Content not found' }\n }\n }\n },\n '/api/media': {\n get: {\n summary: 'List Media',\n description: 'Returns all media files with pagination',\n operationId: 'getMedia',\n tags: ['Media'],\n responses: {\n '200': { description: 'List of media files' }\n }\n }\n },\n '/api/media/upload': {\n post: {\n summary: 'Upload Media',\n description: 'Uploads a new media file to R2 storage',\n operationId: 'uploadMedia',\n tags: ['Media'],\n security: [{ bearerAuth: [] }],\n requestBody: {\n required: true,\n content: {\n 'multipart/form-data': {\n schema: {\n type: 'object',\n properties: {\n file: { type: 'string', format: 'binary' }\n }\n }\n }\n }\n },\n responses: {\n '201': { description: 'Media uploaded successfully' },\n '401': { description: 'Unauthorized' }\n }\n }\n }\n },\n components: {\n securitySchemes: {\n bearerAuth: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT'\n }\n },\n schemas: {\n Content: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n title: { type: 'string' },\n slug: { type: 'string' },\n status: { type: 'string', enum: ['draft', 'published', 'archived'] },\n collectionId: { type: 'string', format: 'uuid' },\n data: { type: 'object' },\n created_at: { type: 'integer' },\n updated_at: { type: 'integer' }\n }\n },\n Collection: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n name: { type: 'string' },\n display_name: { type: 'string' },\n description: { type: 'string' },\n schema: { type: 'object' },\n is_active: { type: 'integer' }\n }\n },\n Media: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n filename: { type: 'string' },\n mimetype: { type: 'string' },\n size: { type: 'integer' },\n url: { type: 'string' }\n }\n },\n Error: {\n type: 'object',\n properties: {\n error: { type: 'string' },\n details: { type: 'string' }\n }\n }\n }\n },\n tags: [\n { name: 'System', description: 'System and health endpoints' },\n { name: 'Content', description: 'Content management operations' },\n { name: 'Media', description: 'Media file operations' }\n ]\n })\n})\n\n// Health check endpoint\napiRoutes.get('/health', (c) => {\n return c.json({\n status: 'healthy',\n timestamp: new Date().toISOString(),\n schemas: schemaDefinitions.map(s => s.name)\n })\n})\n\n// Basic collections endpoint\napiRoutes.get('/collections', async (c) => {\n const executionStart = Date.now()\n\n try {\n const db = c.env.DB\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('collections', 'all')\n\n // Use cache only if cache plugin is active\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n const stmt = db.prepare(\"SELECT * FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const { results } = await stmt.all()\n\n // Parse schema and format results\n const transformedResults = results.map((row: any) => ({\n ...row,\n schema: row.schema ? JSON.parse(row.schema) : {},\n is_active: row.is_active // Keep as number (1 or 0)\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n count: results.length,\n timestamp: new Date().toISOString(),\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache plugin is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching collections:', error)\n return c.json({ error: 'Failed to fetch collections' }, 500)\n }\n})\n\n// Basic content endpoint with advanced filtering\napiRoutes.get('/content', optionalAuth(), async (c) => {\n const executionStart = Date.now()\n\n try {\n const db = c.env.DB\n const queryParams = c.req.query()\n\n // Handle collection parameter - convert collection name to collection_id\n if (queryParams.collection) {\n const collectionName = queryParams.collection\n const collectionStmt = db.prepare('SELECT id FROM collections WHERE name = ? AND is_active = 1')\n const collectionResult = await collectionStmt.bind(collectionName).first()\n\n if (collectionResult) {\n // Replace 'collection' param with 'collection_id' for the filter builder\n queryParams.collection_id = (collectionResult as any).id\n delete queryParams.collection\n } else {\n // Collection not found - return empty result\n return c.json({\n data: [],\n meta: addTimingMeta(c, {\n count: 0,\n timestamp: new Date().toISOString(),\n message: `Collection '${collectionName}' not found`\n }, executionStart)\n })\n }\n }\n\n // Parse filter from query parameters\n const filter: QueryFilter = QueryFilterBuilder.parseFromQuery(queryParams)\n const normalizedFilter = normalizePublicContentFilter(filter, c.get('user')?.role)\n\n // Set default limit if not provided\n if (!normalizedFilter.limit) {\n normalizedFilter.limit = 50\n }\n normalizedFilter.limit = Math.min(normalizedFilter.limit, 1000) // Max 1000\n\n // Build SQL query from filter\n const builder = new QueryFilterBuilder()\n const queryResult = builder.build('content', normalizedFilter)\n\n // Check for query building errors\n if (queryResult.errors.length > 0) {\n return c.json({\n error: 'Invalid filter parameters',\n details: queryResult.errors\n }, 400)\n }\n\n // Only use cache if cache plugin is active\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('content-filtered', JSON.stringify({ filter: normalizedFilter, query: queryResult.sql }))\n\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n // Execute query with parameters\n const stmt = db.prepare(queryResult.sql)\n const boundStmt = queryResult.params.length > 0\n ? stmt.bind(...queryResult.params)\n : stmt\n\n const { results } = await boundStmt.all()\n\n // Transform results to match API spec (camelCase)\n const transformedResults = results.map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n collectionId: row.collection_id,\n data: row.data ? JSON.parse(row.data) : {},\n created_at: row.created_at,\n updated_at: row.updated_at\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n count: results.length,\n timestamp: new Date().toISOString(),\n filter: normalizedFilter,\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// Collection-specific routes with advanced filtering\napiRoutes.get('/collections/:collection/content', optionalAuth(), async (c) => {\n const executionStart = Date.now()\n\n try {\n const collection = c.req.param('collection')\n const db = c.env.DB\n const queryParams = c.req.query()\n\n // First check if collection exists\n const collectionStmt = db.prepare('SELECT * FROM collections WHERE name = ? AND is_active = 1')\n const collectionResult = await collectionStmt.bind(collection).first()\n\n if (!collectionResult) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Parse filter from query parameters\n const filter: QueryFilter = QueryFilterBuilder.parseFromQuery(queryParams)\n const normalizedFilter = normalizePublicContentFilter(filter, c.get('user')?.role)\n\n // Add collection_id filter to where clause\n if (!normalizedFilter.where) {\n normalizedFilter.where = { and: [] }\n }\n\n if (!normalizedFilter.where.and) {\n normalizedFilter.where.and = []\n }\n\n // Add collection filter\n normalizedFilter.where.and.push({\n field: 'collection_id',\n operator: 'equals',\n value: (collectionResult as any).id\n })\n\n // Set default limit if not provided\n if (!normalizedFilter.limit) {\n normalizedFilter.limit = 50\n }\n normalizedFilter.limit = Math.min(normalizedFilter.limit, 1000)\n\n // Build SQL query from filter\n const builder = new QueryFilterBuilder()\n const queryResult = builder.build('content', normalizedFilter)\n\n // Check for query building errors\n if (queryResult.errors.length > 0) {\n return c.json({\n error: 'Invalid filter parameters',\n details: queryResult.errors\n }, 400)\n }\n\n // Generate cache key\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('collection-content-filtered', `${collection}:${JSON.stringify({ filter: normalizedFilter, query: queryResult.sql })}`)\n\n // Only check cache if plugin is enabled\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n // Execute query with parameters\n const stmt = db.prepare(queryResult.sql)\n const boundStmt = queryResult.params.length > 0\n ? stmt.bind(...queryResult.params)\n : stmt\n\n const { results } = await boundStmt.all()\n\n // Transform results to match API spec (camelCase)\n const transformedResults = results.map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n collectionId: row.collection_id,\n data: row.data ? JSON.parse(row.data) : {},\n created_at: row.created_at,\n updated_at: row.updated_at\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n collection: {\n ...(collectionResult as any),\n schema: (collectionResult as any).schema ? JSON.parse((collectionResult as any).schema) : {}\n },\n count: results.length,\n timestamp: new Date().toISOString(),\n filter: normalizedFilter,\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache plugin is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// Mount CRUD routes for content\napiRoutes.route('/content', apiContentCrudRoutes)\n\nexport default apiRoutes\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { requireAuth } from '../middleware'\nimport type { Bindings, Variables } from '../app'\n\n// Helper function to generate short IDs (replacement for nanoid)\nfunction generateId(): string {\n return crypto.randomUUID().replace(/-/g, '').substring(0, 21)\n}\n\n// Helper function for emitting events (simplified for core package)\nasync function emitEvent(eventName: string, data: any) {\n console.log(`[Event] ${eventName}:`, data)\n // TODO: Implement proper event system when plugin architecture is ready\n}\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nexport const apiMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply auth middleware to all routes\napiMediaRoutes.use('*', requireAuth())\n\n// Upload single file\napiMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')!\n const formData = await c.req.formData()\n const fileData = formData.get('file')\n\n if (!fileData || typeof fileData === 'string') {\n return c.json({ error: 'No file provided' }, 400)\n }\n\n const file = fileData as File\n\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n return c.json({ \n error: 'File validation failed', \n details: validation.error.issues \n }, 400)\n }\n\n // Generate unique filename and R2 key\n const fileId = generateId()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n return c.json({ error: 'Failed to upload file to storage' }, 500)\n }\n\n // Generate public URL using environment variable for bucket name\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const publicUrl = `https://pub-${bucketName}.r2.dev/${r2Key}`\n \n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate thumbnail URL for images\n let thumbnailUrl: string | null = null\n if (file.type.startsWith('image/') && c.env.IMAGES_ACCOUNT_ID) {\n thumbnailUrl = `https://imagedelivery.net/${c.env.IMAGES_ACCOUNT_ID}/${r2Key}/thumbnail`\n }\n\n // Save to database\n const mediaRecord = {\n id: fileId,\n filename: filename,\n original_name: file.name,\n mime_type: file.type,\n size: file.size,\n width,\n height,\n folder,\n r2_key: r2Key,\n public_url: publicUrl,\n thumbnail_url: thumbnailUrl,\n uploaded_by: user.userId,\n uploaded_at: Math.floor(Date.now() / 1000),\n created_at: Math.floor(Date.now() / 1000)\n }\n\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n mediaRecord.id,\n mediaRecord.filename,\n mediaRecord.original_name,\n mediaRecord.mime_type,\n mediaRecord.size,\n mediaRecord.width,\n mediaRecord.height,\n mediaRecord.folder,\n mediaRecord.r2_key,\n mediaRecord.public_url,\n mediaRecord.thumbnail_url,\n mediaRecord.uploaded_by,\n mediaRecord.uploaded_at\n ).run()\n\n // Emit media upload event\n await emitEvent('media.upload', { id: mediaRecord.id, filename: mediaRecord.filename })\n\n return c.json({\n success: true,\n file: {\n id: mediaRecord.id,\n filename: mediaRecord.filename,\n originalName: mediaRecord.original_name,\n mimeType: mediaRecord.mime_type,\n size: mediaRecord.size,\n width: mediaRecord.width,\n height: mediaRecord.height,\n r2_key: mediaRecord.r2_key,\n publicUrl: mediaRecord.public_url,\n thumbnailUrl: mediaRecord.thumbnail_url,\n uploadedAt: new Date(mediaRecord.uploaded_at * 1000).toISOString()\n }\n })\n } catch (error) {\n console.error('Upload error:', error)\n return c.json({ error: 'Upload failed' }, 500)\n }\n})\n\n// Upload multiple files\napiMediaRoutes.post('/upload-multiple', async (c) => {\n try {\n const user = c.get('user')!\n const formData = await c.req.formData()\n const filesData = formData.getAll('files')\n\n // Filter out strings and ensure we only have File objects\n const files: File[] = []\n for (const f of filesData) {\n if (typeof f !== 'string') {\n files.push(f as File)\n }\n }\n\n if (!files || files.length === 0) {\n return c.json({ error: 'No files provided' }, 400)\n }\n\n const uploadResults = []\n const errors = []\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: 'Validation failed',\n details: validation.error.issues\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = generateId()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Generate public URL using environment variable for bucket name\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const publicUrl = `https://pub-${bucketName}.r2.dev/${r2Key}`\n \n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate thumbnail URL for images\n let thumbnailUrl: string | null = null\n if (file.type.startsWith('image/') && c.env.IMAGES_ACCOUNT_ID) {\n thumbnailUrl = `https://imagedelivery.net/${c.env.IMAGES_ACCOUNT_ID}/${r2Key}/thumbnail`\n }\n\n // Save to database\n const mediaRecord = {\n id: fileId,\n filename: filename,\n original_name: file.name,\n mime_type: file.type,\n size: file.size,\n width,\n height,\n folder,\n r2_key: r2Key,\n public_url: publicUrl,\n thumbnail_url: thumbnailUrl,\n uploaded_by: user.userId,\n uploaded_at: Math.floor(Date.now() / 1000)\n }\n\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n mediaRecord.id,\n mediaRecord.filename,\n mediaRecord.original_name,\n mediaRecord.mime_type,\n mediaRecord.size,\n mediaRecord.width,\n mediaRecord.height,\n mediaRecord.folder,\n mediaRecord.r2_key,\n mediaRecord.public_url,\n mediaRecord.thumbnail_url,\n mediaRecord.uploaded_by,\n mediaRecord.uploaded_at\n ).run()\n\n uploadResults.push({\n id: mediaRecord.id,\n filename: mediaRecord.filename,\n originalName: mediaRecord.original_name,\n mimeType: mediaRecord.mime_type,\n size: mediaRecord.size,\n width: mediaRecord.width,\n height: mediaRecord.height,\n r2_key: mediaRecord.r2_key,\n publicUrl: mediaRecord.public_url,\n thumbnailUrl: mediaRecord.thumbnail_url,\n uploadedAt: new Date(mediaRecord.uploaded_at * 1000).toISOString()\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media upload event if any uploads succeeded\n if (uploadResults.length > 0) {\n await emitEvent('media.upload', { count: uploadResults.length })\n }\n\n return c.json({\n success: uploadResults.length > 0,\n uploaded: uploadResults,\n errors: errors,\n summary: {\n total: files.length,\n successful: uploadResults.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Multiple upload error:', error)\n return c.json({ error: 'Upload failed' }, 500)\n }\n})\n\n// Bulk delete files\napiMediaRoutes.post('/bulk-delete', async (c) => {\n try {\n const user = c.get('user')!\n const body = await c.req.json()\n const fileIds = body.fileIds as string[]\n \n if (!fileIds || !Array.isArray(fileIds) || fileIds.length === 0) {\n return c.json({ error: 'No file IDs provided' }, 400)\n }\n\n // Limit bulk operations to prevent abuse\n if (fileIds.length > 50) {\n return c.json({ error: 'Too many files selected. Maximum 50 files per operation.' }, 400)\n }\n\n const results = []\n const errors = []\n\n for (const fileId of fileIds) {\n try {\n // Get file record (including already deleted files to check if they exist at all)\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ?')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n errors.push({ fileId, error: 'File not found' })\n continue\n }\n\n // Skip if already deleted (treat as success)\n if (fileRecord.deleted_at !== null) {\n console.log(`File ${fileId} already deleted, skipping`)\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n alreadyDeleted: true\n })\n continue\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n errors.push({ fileId, error: 'Permission denied' })\n continue\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn(`Failed to delete from R2 for file ${fileId}:`, error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true\n })\n } catch (error) {\n errors.push({\n fileId,\n error: 'Delete failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media delete event if any deletes succeeded\n if (results.length > 0) {\n await emitEvent('media.delete', { count: results.length, ids: fileIds })\n }\n\n return c.json({\n success: results.length > 0,\n deleted: results,\n errors: errors,\n summary: {\n total: fileIds.length,\n successful: results.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Bulk delete error:', error)\n return c.json({ error: 'Bulk delete failed' }, 500)\n }\n})\n\n// Create folder\napiMediaRoutes.post('/create-folder', async (c) => {\n try {\n const body = await c.req.json()\n const folderName = body.folderName as string\n\n if (!folderName || typeof folderName !== 'string') {\n return c.json({ success: false, error: 'No folder name provided' }, 400)\n }\n\n // Validate folder name format\n const folderPattern = /^[a-z0-9-_]+$/\n if (!folderPattern.test(folderName)) {\n return c.json({\n success: false,\n error: 'Folder name can only contain lowercase letters, numbers, hyphens, and underscores'\n }, 400)\n }\n\n // Check if folder already exists in the database\n const checkStmt = c.env.DB.prepare('SELECT COUNT(*) as count FROM media WHERE folder = ? AND deleted_at IS NULL')\n const existingFolder = await checkStmt.bind(folderName).first() as any\n\n if (existingFolder && existingFolder.count > 0) {\n return c.json({\n success: false,\n error: `Folder \"${folderName}\" already exists`\n }, 400)\n }\n\n // Note: R2 folders are virtual - they only exist when files are uploaded to them\n // Return success message explaining this behavior\n return c.json({\n success: true,\n message: `Folder \"${folderName}\" is ready. Upload files to this folder to make it appear in the media library.`,\n folder: folderName,\n note: 'Folders appear automatically when you upload files to them'\n })\n } catch (error) {\n console.error('Create folder error:', error)\n return c.json({ success: false, error: 'Failed to create folder' }, 500)\n }\n})\n\n// Bulk move files to folder\napiMediaRoutes.post('/bulk-move', async (c) => {\n try {\n const user = c.get('user')!\n const body = await c.req.json()\n const fileIds = body.fileIds as string[]\n const targetFolder = body.folder as string\n\n if (!fileIds || !Array.isArray(fileIds) || fileIds.length === 0) {\n return c.json({ error: 'No file IDs provided' }, 400)\n }\n\n if (!targetFolder || typeof targetFolder !== 'string') {\n return c.json({ error: 'No target folder provided' }, 400)\n }\n\n // Limit bulk operations to prevent abuse\n if (fileIds.length > 50) {\n return c.json({ error: 'Too many files selected. Maximum 50 files per operation.' }, 400)\n }\n\n const results = []\n const errors = []\n\n for (const fileId of fileIds) {\n try {\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n errors.push({ fileId, error: 'File not found' })\n continue\n }\n\n // Check permissions (only allow move by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n errors.push({ fileId, error: 'Permission denied' })\n continue\n }\n\n // Skip if already in target folder\n if (fileRecord.folder === targetFolder) {\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n skipped: true\n })\n continue\n }\n\n // Generate new R2 key with new folder\n const oldR2Key = fileRecord.r2_key\n const filename = oldR2Key.split('/').pop() || fileRecord.filename\n const newR2Key = `${targetFolder}/${filename}`\n\n // Copy file to new location in R2\n try {\n const object = await c.env.MEDIA_BUCKET.get(oldR2Key)\n if (!object) {\n errors.push({ fileId, error: 'File not found in storage' })\n continue\n }\n\n await c.env.MEDIA_BUCKET.put(newR2Key, object.body, {\n httpMetadata: object.httpMetadata,\n customMetadata: {\n ...object.customMetadata,\n movedBy: user.userId,\n movedAt: new Date().toISOString()\n }\n })\n\n // Delete old file from R2\n await c.env.MEDIA_BUCKET.delete(oldR2Key)\n } catch (error) {\n console.warn(`Failed to move file in R2 for file ${fileId}:`, error)\n errors.push({ fileId, error: 'Failed to move file in storage' })\n continue\n }\n\n // Update database with new folder and R2 key\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const newPublicUrl = `https://pub-${bucketName}.r2.dev/${newR2Key}`\n\n const updateStmt = c.env.DB.prepare(`\n UPDATE media\n SET folder = ?, r2_key = ?, public_url = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n targetFolder,\n newR2Key,\n newPublicUrl,\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n skipped: false\n })\n } catch (error) {\n errors.push({\n fileId,\n error: 'Move failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media move event if any moves succeeded\n if (results.length > 0) {\n await emitEvent('media.move', { count: results.length, targetFolder, ids: fileIds })\n }\n\n return c.json({\n success: results.length > 0,\n moved: results,\n errors: errors,\n summary: {\n total: fileIds.length,\n successful: results.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Bulk move error:', error)\n return c.json({ error: 'Bulk move failed' }, 500)\n }\n})\n\n// Delete file\napiMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')!\n const fileId = c.req.param('id')\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.json({ error: 'File not found' }, 404)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n return c.json({ error: 'Permission denied' }, 403)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // Emit media delete event\n await emitEvent('media.delete', { id: fileId })\n\n return c.json({ success: true, message: 'File deleted successfully' })\n } catch (error) {\n console.error('Delete error:', error)\n return c.json({ error: 'Delete failed' }, 500)\n }\n})\n\n// Update file metadata\napiMediaRoutes.patch('/:id', async (c) => {\n try {\n const user = c.get('user')!\n const fileId = c.req.param('id')\n const body = await c.req.json()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.json({ error: 'File not found' }, 404)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n return c.json({ error: 'Permission denied' }, 403)\n }\n\n // Update allowed fields\n const allowedFields = ['alt', 'caption', 'tags', 'folder']\n const updates = []\n const values = []\n \n for (const [key, value] of Object.entries(body)) {\n if (allowedFields.includes(key)) {\n updates.push(`${key} = ?`)\n values.push(key === 'tags' ? JSON.stringify(value) : value)\n }\n }\n\n if (updates.length === 0) {\n return c.json({ error: 'No valid fields to update' }, 400)\n }\n\n updates.push('updated_at = ?')\n values.push(Math.floor(Date.now() / 1000))\n values.push(fileId)\n\n const updateStmt = c.env.DB.prepare(`\n UPDATE media SET ${updates.join(', ')} WHERE id = ?\n `)\n await updateStmt.bind(...values).run()\n\n // Emit media update event\n await emitEvent('media.update', { id: fileId })\n\n return c.json({ success: true, message: 'File updated successfully' })\n } catch (error) {\n console.error('Update error:', error)\n return c.json({ error: 'Update failed' }, 500)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n // This is a simplified implementation\n // In a real-world scenario, you'd use a proper image processing library\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length) {\n if (i + 8 >= uint8Array.length) break\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n if (i + 8 < uint8Array.length) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n }\n if (i + 3 < uint8Array.length) {\n i += 2 + ((uint8Array[i + 2]! << 8) | uint8Array[i + 3]!)\n } else {\n break\n }\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\nexport default apiMediaRoutes","/**\n * API System Routes\n *\n * Provides system health, status, and metadata endpoints\n * These are lightweight routes without heavy dependencies\n */\n\nimport { Hono } from 'hono'\nimport type { Bindings, Variables } from '../app'\n\nexport const apiSystemRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * System health check\n * GET /api/system/health\n */\napiSystemRoutes.get('/health', async (c) => {\n try {\n const startTime = Date.now()\n\n // Check database connectivity\n let dbStatus = 'unknown'\n let dbLatency = 0\n\n try {\n const dbStart = Date.now()\n await c.env.DB.prepare('SELECT 1').first()\n dbLatency = Date.now() - dbStart\n dbStatus = 'healthy'\n } catch (error) {\n console.error('Database health check failed:', error)\n dbStatus = 'unhealthy'\n }\n\n // Check KV connectivity (if available)\n let kvStatus = 'not_configured'\n let kvLatency = 0\n\n if (c.env.CACHE_KV) {\n try {\n const kvStart = Date.now()\n await c.env.CACHE_KV.get('__health_check__')\n kvLatency = Date.now() - kvStart\n kvStatus = 'healthy'\n } catch (error) {\n console.error('KV health check failed:', error)\n kvStatus = 'unhealthy'\n }\n }\n\n // Check R2 connectivity (if available)\n let r2Status = 'not_configured'\n\n if (c.env.MEDIA_BUCKET) {\n try {\n await c.env.MEDIA_BUCKET.head('__health_check__')\n r2Status = 'healthy'\n } catch (error) {\n // R2 head on non-existent key returns null, not an error\n // This is expected, so we consider it healthy\n r2Status = 'healthy'\n }\n }\n\n const totalLatency = Date.now() - startTime\n const overall = dbStatus === 'healthy' ? 'healthy' : 'degraded'\n\n return c.json({\n status: overall,\n timestamp: new Date().toISOString(),\n uptime: totalLatency,\n checks: {\n database: {\n status: dbStatus,\n latency: dbLatency\n },\n cache: {\n status: kvStatus,\n latency: kvLatency\n },\n storage: {\n status: r2Status\n }\n },\n environment: c.env.ENVIRONMENT || 'production'\n })\n } catch (error) {\n console.error('Health check failed:', error)\n return c.json({\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n error: 'Health check failed'\n }, 503)\n }\n})\n\n/**\n * System information\n * GET /api/system/info\n */\napiSystemRoutes.get('/info', (c) => {\n const appVersion = c.get('appVersion') || '1.0.0'\n\n return c.json({\n name: 'SonicJS',\n version: appVersion,\n description: 'Modern headless CMS built on Cloudflare Workers',\n endpoints: {\n api: '/api',\n auth: '/auth',\n health: '/api/system/health',\n docs: '/docs'\n },\n features: {\n content: true,\n media: true,\n auth: true,\n collections: true,\n caching: !!c.env.CACHE_KV,\n storage: !!c.env.MEDIA_BUCKET\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * System stats\n * GET /api/system/stats\n */\napiSystemRoutes.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get content statistics\n const contentStats = await db.prepare(`\n SELECT COUNT(*) as total_content\n FROM content\n WHERE deleted_at IS NULL\n `).first() as any\n\n // Get media statistics\n const mediaStats = await db.prepare(`\n SELECT\n COUNT(*) as total_files,\n SUM(size) as total_size\n FROM media\n WHERE deleted_at IS NULL\n `).first() as any\n\n // Get user statistics\n const userStats = await db.prepare(`\n SELECT COUNT(*) as total_users\n FROM users\n `).first() as any\n\n return c.json({\n content: {\n total: contentStats?.total_content || 0\n },\n media: {\n total_files: mediaStats?.total_files || 0,\n total_size_bytes: mediaStats?.total_size || 0,\n total_size_mb: Math.round((mediaStats?.total_size || 0) / 1024 / 1024 * 100) / 100\n },\n users: {\n total: userStats?.total_users || 0\n },\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Stats query failed:', error)\n return c.json({ error: 'Failed to fetch system statistics' }, 500)\n }\n})\n\n/**\n * Database ping\n * GET /api/system/ping\n */\napiSystemRoutes.get('/ping', async (c) => {\n try {\n const start = Date.now()\n await c.env.DB.prepare('SELECT 1').first()\n const latency = Date.now() - start\n\n return c.json({\n pong: true,\n latency,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Ping failed:', error)\n return c.json({\n pong: false,\n error: 'Database connection failed'\n }, 503)\n }\n})\n\n/**\n * Environment check\n * GET /api/system/env\n */\napiSystemRoutes.get('/env', (c) => {\n return c.json({\n environment: c.env.ENVIRONMENT || 'production',\n features: {\n database: !!c.env.DB,\n cache: !!c.env.CACHE_KV,\n media_bucket: !!c.env.MEDIA_BUCKET,\n email_queue: !!c.env.EMAIL_QUEUE,\n sendgrid: !!c.env.SENDGRID_API_KEY,\n cloudflare_images: !!(c.env.IMAGES_ACCOUNT_ID && c.env.IMAGES_API_TOKEN)\n },\n timestamp: new Date().toISOString()\n })\n})\n\nexport default apiSystemRoutes\n","/**\n * Admin API Routes\n *\n * Provides JSON API endpoints for admin operations\n * These routes complement the admin UI and can be used programmatically\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\n// import { zValidator } from '@hono/zod-validator'\nimport { requireAuth, requireRole } from '../middleware'\nimport type { Bindings, Variables } from '../app'\n\nexport const adminApiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply auth middleware to all admin routes\nadminApiRoutes.use('*', requireAuth())\nadminApiRoutes.use('*', requireRole(['admin', 'editor']))\n\n/**\n * Get dashboard statistics\n * GET /admin/api/stats\n */\nadminApiRoutes.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE c.deleted_at IS NULL AND (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n return c.json({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n mediaSize: mediaSize,\n users: usersCount,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.json({ error: 'Failed to fetch statistics' }, 500)\n }\n})\n\n/**\n * Get storage usage\n * GET /admin/api/storage\n */\nadminApiRoutes.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n return c.json({\n databaseSize,\n mediaSize,\n totalSize: databaseSize + mediaSize,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.json({ error: 'Failed to fetch storage usage' }, 500)\n }\n})\n\n/**\n * Get recent activity\n * GET /admin/api/activity\n */\nadminApiRoutes.get('/activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '10')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const recentActivity = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n let details: any = {}\n try {\n details = row.details ? JSON.parse(row.details) : {}\n } catch (e) {\n console.error('Error parsing activity details:', e)\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n resource_id: row.resource_id,\n details,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n return c.json({\n data: recentActivity,\n count: recentActivity.length,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n return c.json({ error: 'Failed to fetch recent activity' }, 500)\n }\n})\n\n/**\n * Collection management schema\n */\nconst createCollectionSchema = z.object({\n name: z.string().min(1).max(255).regex(/^[a-z0-9_]+$/, 'Must contain only lowercase letters, numbers, and underscores'),\n displayName: z.string().min(1).max(255).optional(),\n display_name: z.string().min(1).max(255).optional(),\n description: z.string().optional()\n}).refine(data => data.displayName || data.display_name, {\n message: 'Either displayName or display_name is required',\n path: ['displayName']\n})\n\nconst updateCollectionSchema = z.object({\n display_name: z.string().min(1).max(255).optional(),\n description: z.string().optional(),\n is_active: z.boolean().optional()\n})\n\n/**\n * Get all collections\n * GET /admin/api/collections\n */\nadminApiRoutes.get('/collections', async (c) => {\n try {\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const includeInactive = c.req.query('includeInactive') === 'true'\n\n let stmt\n let results\n\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, updated_at, is_active, managed\n FROM collections\n WHERE ${includeInactive ? '1=1' : 'is_active = 1'}\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, updated_at, is_active, managed\n FROM collections\n WHERE (source_type IS NULL OR source_type = 'user')\n ${includeInactive ? '' : 'AND is_active = 1'}\n ORDER BY created_at DESC\n `)\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Get field counts\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n is_active: row.is_active === 1,\n managed: row.managed === 1,\n field_count: fieldCounts.get(String(row.id)) || 0\n }))\n\n return c.json({\n data: collections,\n count: collections.length,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching collections:', error)\n return c.json({ error: 'Failed to fetch collections' }, 500)\n }\n})\n\n/**\n * Get single collection\n * GET /admin/api/collections/:id\n */\nadminApiRoutes.get('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Get collection fields\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n\n const fields = (fieldsResults || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at)\n }))\n\n return c.json({\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n is_active: collection.is_active === 1,\n managed: collection.managed === 1,\n schema: collection.schema ? JSON.parse(collection.schema) : null,\n created_at: Number(collection.created_at),\n updated_at: Number(collection.updated_at),\n fields\n })\n } catch (error) {\n console.error('Error fetching collection:', error)\n return c.json({ error: 'Failed to fetch collection' }, 500)\n }\n})\n\n/**\n * Get reference options for a collection\n * GET /admin/api/references?collection=&search=&limit=20&id=\n */\nadminApiRoutes.get('/references', async (c) => {\n try {\n const db = c.env.DB\n const url = new URL(c.req.url)\n const collectionParams = url.searchParams\n .getAll('collection')\n .flatMap((value) => value.split(','))\n .map((value) => value.trim())\n .filter(Boolean)\n const search = c.req.query('search') || ''\n const id = c.req.query('id') || ''\n const limit = Math.min(Number.parseInt(c.req.query('limit') || '20', 10) || 20, 100)\n\n if (collectionParams.length === 0) {\n return c.json({ error: 'Collection is required' }, 400)\n }\n\n const placeholders = collectionParams.map(() => '?').join(', ')\n const collectionStmt = db.prepare(`\n SELECT id, name, display_name\n FROM collections\n WHERE id IN (${placeholders}) OR name IN (${placeholders})\n `)\n const collectionResults = await collectionStmt\n .bind(...collectionParams, ...collectionParams)\n .all()\n const collections = (collectionResults.results || []) as any[]\n\n if (collections.length === 0) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n const collectionById = Object.fromEntries(\n collections.map((entry) => [\n entry.id,\n {\n id: entry.id,\n name: entry.name,\n display_name: entry.display_name\n }\n ])\n )\n const collectionIds = collections.map((entry) => entry.id)\n\n if (id) {\n const idPlaceholders = collectionIds.map(() => '?').join(', ')\n const itemStmt = db.prepare(`\n SELECT id, title, slug, collection_id\n FROM content\n WHERE id = ? AND collection_id IN (${idPlaceholders})\n LIMIT 1\n `)\n const item = await itemStmt.bind(id, ...collectionIds).first() as any\n\n if (!item) {\n return c.json({ error: 'Reference not found' }, 404)\n }\n\n return c.json({\n data: {\n id: item.id,\n title: item.title,\n slug: item.slug,\n collection: collectionById[item.collection_id]\n }\n })\n }\n\n let stmt\n let results\n\n const listPlaceholders = collectionIds.map(() => '?').join(', ')\n const statusFilterValues = ['published']\n const statusClause = ` AND status IN (${statusFilterValues.map(() => '?').join(', ')})`\n\n if (search) {\n const searchParam = `%${search}%`\n stmt = db.prepare(`\n SELECT id, title, slug, status, updated_at, collection_id\n FROM content\n WHERE collection_id IN (${listPlaceholders})\n AND (title LIKE ? OR slug LIKE ?)\n ${statusClause}\n ORDER BY updated_at DESC\n LIMIT ?\n `)\n const queryResults = await stmt\n .bind(...collectionIds, searchParam, searchParam, ...statusFilterValues, limit)\n .all()\n results = queryResults.results\n } else {\n stmt = db.prepare(`\n SELECT id, title, slug, status, updated_at, collection_id\n FROM content\n WHERE collection_id IN (${listPlaceholders})\n ${statusClause}\n ORDER BY updated_at DESC\n LIMIT ?\n `)\n const queryResults = await stmt\n .bind(...collectionIds, ...statusFilterValues, limit)\n .all()\n results = queryResults.results\n }\n\n const items = (results || []).map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n updated_at: row.updated_at ? Number(row.updated_at) : null,\n collection: collectionById[row.collection_id]\n }))\n\n return c.json({\n data: items,\n count: items.length\n })\n } catch (error) {\n console.error('Error fetching reference options:', error)\n return c.json({ error: 'Failed to fetch references' }, 500)\n }\n})\n\n/**\n * Create collection\n * POST /admin/api/collections\n */\nadminApiRoutes.post('/collections', async (c) => {\n try {\n // Validate content type\n const contentType = c.req.header('Content-Type')\n if (!contentType || !contentType.includes('application/json')) {\n return c.json({ error: 'Content-Type must be application/json' }, 400)\n }\n\n let body\n try {\n body = await c.req.json()\n } catch (e) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n const validation = createCollectionSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const validatedData = validation.data\n const db = c.env.DB\n const _user = c.get('user')\n\n // Handle both camelCase and snake_case for display_name\n const displayName = validatedData.displayName || validatedData.display_name || ''\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(validatedData.name).first()\n\n if (existing) {\n return c.json({ error: 'A collection with this name already exists' }, 400)\n }\n\n // Create basic schema\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n validatedData.name,\n displayName,\n validatedData.description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${validatedData.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({\n id: collectionId,\n name: validatedData.name,\n displayName: displayName,\n description: validatedData.description,\n created_at: now\n }, 201)\n } catch (error) {\n console.error('Error creating collection:', error)\n return c.json({ error: 'Failed to create collection' }, 500)\n }\n})\n\n/**\n * Update collection\n * PATCH /admin/api/collections/:id\n */\nadminApiRoutes.patch('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const body = await c.req.json()\n const validation = updateCollectionSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const validatedData = validation.data\n const db = c.env.DB\n\n // Check if collection exists\n const checkStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const existing = await checkStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Build update query\n const updateFields: string[] = []\n const updateParams: any[] = []\n\n if (validatedData.display_name !== undefined) {\n updateFields.push('display_name = ?')\n updateParams.push(validatedData.display_name)\n }\n\n if (validatedData.description !== undefined) {\n updateFields.push('description = ?')\n updateParams.push(validatedData.description)\n }\n\n if (validatedData.is_active !== undefined) {\n updateFields.push('is_active = ?')\n updateParams.push(validatedData.is_active ? 1 : 0)\n }\n\n if (updateFields.length === 0) {\n return c.json({ error: 'No fields to update' }, 400)\n }\n\n updateFields.push('updated_at = ?')\n updateParams.push(Date.now())\n updateParams.push(id)\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET ${updateFields.join(', ')}\n WHERE id = ?\n `)\n\n await updateStmt.bind(...updateParams).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${existing.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({ message: 'Collection updated successfully' })\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.json({ error: 'Failed to update collection' }, 500)\n }\n})\n\n/**\n * Delete collection\n * DELETE /admin/api/collections/:id\n */\nadminApiRoutes.delete('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection exists\n const collectionStmt = db.prepare('SELECT name FROM collections WHERE id = ?')\n const collection = await collectionStmt.bind(id).first() as any\n\n if (!collection) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.json({\n error: `Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.`\n }, 400)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${collection.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({ message: 'Collection deleted successfully' })\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.json({ error: 'Failed to delete collection' }, 500)\n }\n})\n\n// Migrations API endpoints\n// Get migration status\nadminApiRoutes.get('/migrations/status', async (c) => {\n try {\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminApiRoutes.post('/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied,\n errors: result.errors\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.json({\n success: false,\n error: `Failed to run migrations: ${errorMessage}`,\n errors: [errorMessage]\n }, 500)\n }\n})\n\n// Validate database schema\nadminApiRoutes.get('/migrations/validate', async (c) => {\n try {\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\nexport default adminApiRoutes\n","import { renderAlert } from '../alert.template'\n\nexport interface LoginPageData {\n error?: string\n message?: string\n version?: string\n}\n\nexport function renderLoginPage(data: LoginPageData, demoLoginActive: boolean = false): string {\n return `\n \n \n \n \n \n Login - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n

Welcome Back

\n

Sign in to your account to continue

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n ${data.message ? `
${renderAlert({ type: 'success', message: data.message })}
` : ''}\n\n \n
\n\n \n \n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Sign In\n \n \n\n \n
\n

\n Don't have an account?\n Create one here\n

\n
\n
\n\n \n
\n \n v${data.version || '0.1.0'}\n \n
\n
\n
\n\n ${demoLoginActive ? `\n \n ` : ''}\n \n \n `\n}","import { renderAlert } from '../alert.template'\n\nexport interface RegisterPageData {\n error?: string\n}\n\nexport function renderRegisterPage(data: RegisterPageData): string {\n return `\n \n \n \n \n \n Register - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n
\n

SonicJS AI

\n

Create your account and get started

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n\n \n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Create Account\n \n \n\n \n
\n

\n Already have an account?\n Sign in here\n

\n
\n\n
\n
\n
\n
\n \n \n `\n}","/**\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 {\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\n if (plugin?.settings) {\n // Parse settings and check registration.enabled\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 return true // Default to enabled if no settings\n } catch {\n return true // Default to enabled on error\n }\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 {\n try {\n const result = await db.prepare('SELECT COUNT(*) as count FROM users').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 {\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 users 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 username: z.string().min(3, 'Username must be at least 3 characters').optional(),\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\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 {\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 'username':\n // Generate username from email (part before @)\n return data.email ? data.email.split('@')[0] : `user${Date.now()}`\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","/**\n * User Profile Config Registry\n *\n * Global singleton storing developer-defined custom profile field definitions.\n * Set once at app boot via defineUserProfile(), queried by routes and templates.\n */\n\nimport type { FieldType } from '../../../types/collection-config'\n\nexport interface ProfileFieldDefinition {\n name: string\n label: string\n type: FieldType\n options?: string[]\n default?: any\n required?: boolean\n placeholder?: string\n helpText?: string\n hidden?: boolean\n fields?: ProfileFieldDefinition[]\n validation?: {\n min?: number\n max?: number\n pattern?: string\n }\n}\n\nexport interface UserProfileConfig {\n fields: ProfileFieldDefinition[]\n registrationFields?: string[]\n}\n\nlet _profileConfig: UserProfileConfig | null = null\n\nexport function defineUserProfile(config: UserProfileConfig): void {\n if (_profileConfig) {\n console.warn('[SonicJS] defineUserProfile called multiple times — overwriting previous config')\n }\n _profileConfig = config\n}\n\nexport function getUserProfileConfig(): UserProfileConfig | null {\n return _profileConfig\n}\n\nexport function getProfileFieldDefaults(): Record {\n if (!_profileConfig) return {}\n const defaults: Record = {}\n for (const field of _profileConfig.fields) {\n if (field.default !== undefined) {\n defaults[field.name] = field.default\n }\n }\n return defaults\n}\n\nexport function getRegistrationFields(): ProfileFieldDefinition[] {\n if (!_profileConfig) return []\n const regFieldNames = _profileConfig.registrationFields || []\n return _profileConfig.fields.filter(f => regFieldNames.includes(f.name))\n}\n\n/** Reset state — for tests only */\nexport function _resetProfileConfig(): void {\n _profileConfig = null\n}\n","/**\n * User Profile Service\n *\n * Handles reading, writing, validation, and sanitization of custom profile data.\n */\n\nimport { sanitizeInput } from '../../../utils/sanitize'\nimport {\n getUserProfileConfig,\n getProfileFieldDefaults,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport function validateCustomData(\n data: Record,\n config: UserProfileConfig\n): { valid: boolean; errors: Record } {\n const errors: Record = {}\n\n for (const field of config.fields) {\n const value = data[field.name]\n\n if (field.required && (value === undefined || value === null || value === '')) {\n errors[field.name] = `${field.label} is required`\n continue\n }\n\n if (value === undefined || value === null || value === '') continue\n\n if (field.type === 'number' && typeof value !== 'number') {\n errors[field.name] = `${field.label} must be a number`\n }\n if (field.type === 'select' && field.options && !field.options.includes(value)) {\n errors[field.name] = `${field.label} must be one of: ${field.options.join(', ')}`\n }\n if (field.type === 'boolean' && typeof value !== 'boolean') {\n errors[field.name] = `${field.label} must be true or false`\n }\n if (field.validation?.min !== undefined && typeof value === 'number' && value < field.validation.min) {\n errors[field.name] = `${field.label} must be at least ${field.validation.min}`\n }\n if (field.validation?.max !== undefined && typeof value === 'number' && value > field.validation.max) {\n errors[field.name] = `${field.label} must be at most ${field.validation.max}`\n }\n if (field.validation?.pattern && typeof value === 'string' && !new RegExp(field.validation.pattern).test(value)) {\n errors[field.name] = `${field.label} format is invalid`\n }\n }\n\n return { valid: Object.keys(errors).length === 0, errors }\n}\n\nexport function sanitizeCustomData(\n data: Record,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n const knownNames = new Set(config.fields.map(f => f.name))\n\n for (const [key, value] of Object.entries(data)) {\n if (!knownNames.has(key)) continue\n if (typeof value === 'string') {\n result[key] = sanitizeInput(value)\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\nexport function coerceFieldValue(raw: string | null | undefined, field: ProfileFieldDefinition): any {\n if (raw === null || raw === undefined || raw === '') {\n return field.default ?? null\n }\n\n switch (field.type) {\n case 'number':\n const num = Number(raw)\n return isNaN(num) ? null : num\n case 'boolean':\n case 'checkbox':\n return raw === '1' || raw === 'true' || raw === 'on'\n case 'date':\n case 'datetime':\n const ts = new Date(raw).getTime()\n return isNaN(ts) ? null : ts\n default:\n return raw\n }\n}\n\nexport function extractCustomFieldsFromForm(\n formData: FormData,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n for (const field of config.fields) {\n const raw = formData.get(`custom_${field.name}`)?.toString()\n // For boolean/checkbox, absence means false\n if (raw === null || raw === undefined) {\n if (field.type === 'boolean' || field.type === 'checkbox') {\n result[field.name] = false\n }\n continue\n }\n result[field.name] = coerceFieldValue(raw, field)\n }\n return result\n}\n\nexport async function getCustomData(db: any, userId: string): Promise> {\n const row = await db\n .prepare('SELECT data FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (!row?.data) return {}\n try {\n return JSON.parse(row.data)\n } catch {\n return {}\n }\n}\n\nexport async function saveCustomData(\n db: any,\n userId: string,\n newData: Record\n): Promise {\n const existing = await getCustomData(db, userId)\n const merged = { ...existing, ...newData }\n const json = JSON.stringify(merged)\n\n // Check if profile row exists\n const row = await db\n .prepare('SELECT id FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (row) {\n await db\n .prepare('UPDATE user_profiles SET data = ?, updated_at = ? WHERE user_id = ?')\n .bind(json, Date.now(), userId)\n .run()\n } else {\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const now = Date.now()\n await db\n .prepare(\n 'INSERT INTO user_profiles (id, user_id, data, created_at, updated_at) VALUES (?, ?, ?, ?, ?)'\n )\n .bind(profileId, userId, json, now, now)\n .run()\n }\n}\n","export interface DragSortableOptions {\n itemSelector?: string\n handleSelector?: string\n onUpdate?: () => void\n}\n\nexport function getDragSortableScript(): string {\n return `\n \n `;\n}\n","import { getDragSortableScript } from './drag-sortable.template'\n\n/**\n * Returns shared readFieldValue function used by both blocks and structured fields.\n * Uses a window flag to ensure it's only initialized once.\n */\nfunction getReadFieldValueScript(): string {\n return `\n \n `\n}\n\nconst STRUCTURED_INDEX_TOKEN = '__INDEX__'\nconst BLOCK_INDEX_TOKEN = '__BLOCK_INDEX__'\n\nfunction sanitizeStructuredGroupId(fieldName: string): string {\n return `object-${fieldName}`\n .split(BLOCK_INDEX_TOKEN)\n .map((blockSegment) =>\n blockSegment\n .split(STRUCTURED_INDEX_TOKEN)\n .map((segment) =>\n segment\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, ''),\n )\n .join(STRUCTURED_INDEX_TOKEN),\n )\n .join(BLOCK_INDEX_TOKEN)\n}\n\nexport interface FieldDefinition {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any // JSON options\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface FieldRenderOptions {\n value?: any\n errors?: string[]\n disabled?: boolean\n className?: string\n pluginStatuses?: {\n quillEnabled?: boolean\n mdxeditorEnabled?: boolean\n tinymceEnabled?: boolean\n }\n collectionId?: string\n contentId?: string\n}\n\nfunction isMarkdownEditorFieldType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nfunction getEditorMetadata(fieldType: string): { family: string; provider: string } | null {\n if (fieldType === 'richtext' || fieldType === 'tinymce') {\n return {\n family: 'richtext',\n provider: 'tinymce',\n }\n }\n\n if (isMarkdownEditorFieldType(fieldType)) {\n return {\n family: 'markdown',\n provider: 'easymde',\n }\n }\n\n return null\n}\n\nexport function renderDynamicField(field: FieldDefinition, options: FieldRenderOptions = {}): string {\n const { value = '', errors = [], disabled = false, className = '', pluginStatuses = {}, collectionId = '', contentId = '' } = options\n const opts = field.field_options || {}\n const required = field.is_required ? 'required' : ''\n const baseClasses = `w-full rounded-lg px-3 py-2 text-sm text-zinc-950 dark:text-white bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 placeholder:text-zinc-400 dark:placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-zinc-950 dark:focus:ring-white transition-shadow ${className}`\n const errorClasses =\n errors.length > 0\n ? 'ring-pink-600 dark:ring-pink-500 focus:ring-pink-600 dark:focus:ring-pink-500'\n : ''\n\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n\n // Check if this is a plugin-based field type and if the plugin is inactive\n // If so, fall back to textarea with a warning\n let fallbackToTextarea = false\n let fallbackWarning = ''\n\n if (field.field_type === 'quill' && !pluginStatuses.quillEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Quill Editor plugin is inactive. Using textarea fallback.'\n } else if (isMarkdownEditorFieldType(field.field_type) && !pluginStatuses.mdxeditorEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Markdown editor plugin is inactive. Using textarea fallback.'\n } else if ((field.field_type === 'richtext' || field.field_type === 'tinymce') && !pluginStatuses.tinymceEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ TinyMCE plugin is inactive. Using textarea fallback.'\n }\n\n // If falling back to textarea, render it with a warning\n if (fallbackToTextarea) {\n return `\n
\n ${fallbackWarning ? `
${fallbackWarning}
` : ''}\n ${escapeHtml(value)}\n
\n `\n }\n\n let fieldHTML = ''\n\n switch (field.field_type) {\n case 'text':\n let patternHelp = ''\n let autoSlugScript = ''\n\n if (opts.pattern) {\n if (opts.pattern === '^[a-z0-9-]+$' || opts.pattern === '^[a-zA-Z0-9_-]+$') {\n patternHelp =\n '

Use letters, numbers, underscores, and hyphens only

'\n\n // Add auto-slug generation for slug fields\n if (fieldName === 'slug') {\n patternHelp +=\n ''\n autoSlugScript = `\n \n `\n }\n } else {\n patternHelp =\n '

Must match required format

'\n }\n }\n\n fieldHTML = `\n \n ${patternHelp}\n ${autoSlugScript}\n ${\n opts.pattern\n ? `\n \n `\n : ''\n }\n `\n break\n\n case 'textarea':\n fieldHTML = `\n ${escapeHtml(value)}\n `\n break\n\n case 'richtext':\n case 'tinymce':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'quill':\n // Quill WYSIWYG Editor\n fieldHTML = `\n
\n \n ${value}
\n\n \n \n \n `\n break\n\n case 'markdown':\n case 'mdxeditor':\n case 'easymde':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n // Markdown editor fields use the EasyMDE-backed richtext container.\n // The EasyMDE plugin initialization script handles activation.\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'number':\n fieldHTML = `\n \n `\n break\n\n case 'boolean':\n const checked = value === true || value === 'true' || value === '1' ? 'checked' : ''\n fieldHTML = `\n
\n \n \n
\n \n `\n break\n\n case 'date':\n fieldHTML = `\n \n `\n break\n\n case 'datetime':\n fieldHTML = `\n \n `\n break\n\n case 'slug':\n // Slug fields with auto-generation and duplicate detection\n const slugPattern = opts.pattern || '^[a-z0-9-]+$'\n const collectionIdValue = collectionId || opts.collectionId || ''\n const contentIdValue = contentId || opts.contentId || ''\n const isEditMode = !!value\n\n fieldHTML = `\n
\n \n
\n \n

Use lowercase letters, numbers, and hyphens only

\n
\n \n \n `\n break\n\n case 'select':\n const selectOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const multiple = opts.multiple ? 'multiple' : ''\n const selectedValues = Array.isArray(value) ? value : [value]\n\n fieldHTML = `\n \n ${!required && !opts.multiple ? '' : ''}\n ${selectOptions\n .map((option: any) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const selected = selectedValues.includes(optionValue) ? 'selected' : ''\n return ``\n })\n .join('')}\n \n ${\n opts.allowCustom\n ? `\n
\n \n
\n `\n : ''\n }\n `\n break\n\n case 'radio':\n const radioOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const selectedRadioValue =\n value !== undefined && value !== null\n ? String(value)\n : opts.default\n ? String(opts.default)\n : ''\n\n const isInline = opts.inline === true\n fieldHTML = `\n
\n ${radioOptions\n .map((option: any, index: number) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const inputId = `${fieldId}-option-${index}`\n const checked = selectedRadioValue === String(optionValue) ? 'checked' : ''\n return `\n \n `\n })\n .join('')}\n
\n `\n break\n\n case 'reference':\n let referenceCollections: string[] = []\n if (Array.isArray(opts.collection)) {\n referenceCollections = opts.collection.filter(Boolean)\n } else if (typeof opts.collection === 'string' && opts.collection) {\n referenceCollections = [opts.collection]\n }\n const referenceCollectionsAttr = referenceCollections.join(',')\n const hasReferenceCollection = referenceCollections.length > 0\n const hasReferenceValue = Boolean(value)\n fieldHTML = `\n
\n \n
\n \n ${hasReferenceCollection ? (hasReferenceValue ? 'Loading selection...' : 'No reference selected.') : 'Reference collection not configured.'}\n
\n
\n \n Select reference\n \n \n Remove\n \n
\n
\n \n `\n break\n\n case 'media':\n // Check if multiple selection is enabled\n const isMultiple = opts.multiple === true\n const mediaValues =\n isMultiple && value\n ? Array.isArray(value)\n ? value\n : String(value).split(',').filter(Boolean)\n : []\n const singleValue = !isMultiple ? value : ''\n\n // Helper to detect if URL is a video\n const isVideoUrl = (url: string) => {\n const videoExtensions = ['.mp4', '.webm', '.ogg', '.mov', '.avi']\n return videoExtensions.some((ext) => url.toLowerCase().endsWith(ext))\n }\n\n // Helper to render media element\n const renderMediaPreview = (url: string, alt: string, classes: string) => {\n if (isVideoUrl(url)) {\n return ``\n }\n return `\"${alt}\"`\n }\n\n fieldHTML = `\n
\n \n\n ${\n isMultiple\n ? `\n
\n ${mediaValues\n .map(\n (url: string, idx: number) => `\n
\n ${renderMediaPreview(url, `Media ${idx + 1}`, 'w-full h-24 object-cover rounded-lg border border-white/20')}\n \n \n \n \n \n
\n `,\n )\n .join('')}\n
\n `\n : `\n
\n ${singleValue ? renderMediaPreview(singleValue, 'Selected media', 'w-32 h-32 object-cover rounded-lg border border-white/20') : ''}\n
\n `\n }\n\n
\n \n \n \n \n ${isMultiple ? 'Select Media (Multiple)' : 'Select Media'}\n \n ${\n (isMultiple ? mediaValues.length > 0 : singleValue)\n ? `\n \n ${isMultiple ? 'Clear All' : 'Remove'}\n \n `\n : ''\n }\n
\n
\n `\n break\n\n case 'object':\n // Structured object field (like SEO with nested properties)\n return renderStructuredObjectField(field, options, baseClasses, errorClasses)\n\n case 'array':\n // Check if this is a blocks field (has discriminator/blocks config) or a regular array\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n if (itemsConfig.blocks && typeof itemsConfig.blocks === 'object') {\n // Blocks field with discriminated union\n return renderBlocksField(field, options, baseClasses, errorClasses)\n }\n // Regular structured array field\n return renderStructuredArrayField(field, options, baseClasses, errorClasses)\n\n default:\n fieldHTML = `\n \n `\n }\n\n const showLabel = field.field_type !== 'boolean'\n\n return `\n
0 ? 'true' : 'false'}\">\n ${\n showLabel\n ? `\n \n `\n : ''\n }\n ${fieldHTML}\n ${\n errors.length > 0\n ? `\n
\n ${errors.map((error) => `
${escapeHtml(error)}
`).join('')}\n
\n `\n : ''\n }\n ${\n opts.helpText\n ? `\n
\n ${escapeHtml(opts.helpText)}\n
\n `\n : ''\n }\n
\n `\n}\n\nexport function renderFieldGroup(\n title: string,\n fields: string[],\n collapsible: boolean = false,\n): string {\n const groupId = title.toLowerCase().replace(/\\s+/g, '-')\n\n return `\n
\n
\n

\n ${escapeHtml(title)}\n ${\n collapsible\n ? `\n \n \n \n `\n : ''\n }\n

\n
\n
\n ${fields.join('')}\n
\n
\n `\n}\n\nfunction renderBlocksField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const blocks = normalizeBlockDefinitions(itemsConfig.blocks)\n const discriminator =\n typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n const blockValues = normalizeBlocksValue(value, discriminator)\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const emptyState =\n blockValues.length === 0\n ? `\n
\n No blocks yet. Add your first block to get started.\n
\n `\n : ''\n\n const blockOptions = blocks\n .map((block) => ``)\n .join('')\n\n const blockItems = blockValues\n .map((blockValue, index) =>\n renderBlockItem(field, blockValue, blocks, discriminator, index, pluginStatuses),\n )\n .join('')\n\n const templates = blocks\n .map((block) => renderBlockTemplate(field, block, discriminator, pluginStatuses))\n .join('')\n\n return `\n \n \n\n
\n

\n ${escapeHtml(field.field_label || 'Content Blocks')}\n

\n
\n\n
\n
\n \n \n ${blockOptions}\n \n
\n \n Add Block\n \n
\n\n
\n ${blockItems || emptyState}\n
\n\n ${templates}\n \n ${getDragSortableScript()}\n ${getBlocksFieldScript()}\n `\n}\n\nfunction renderStructuredObjectField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = {}, pluginStatuses = {}, errors = [] } = options\n const opts = field.field_options || {}\n const properties = opts.properties && typeof opts.properties === 'object' ? opts.properties : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const objectValue = normalizeStructuredObjectValue(value)\n const objectLayout = opts.objectLayout || 'nested'\n const useNestedLayout = objectLayout !== 'flat'\n\n const subfields = Object.entries(properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n objectValue,\n pluginStatuses,\n field.field_name,\n ),\n )\n .join('')\n\n const groupTitle = field.field_label || field.field_name\n\n if (!useNestedLayout) {\n return `\n
\n \n
\n

\n ${escapeHtml(groupTitle)}\n

\n
\n
\n ${subfields}\n
\n
\n ${getStructuredFieldScript()}\n `\n }\n\n const groupId = sanitizeStructuredGroupId(field.field_name)\n const isCollapsed = errors.length > 0 ? false : opts.collapsed !== false\n\n return `\n
\n
\n

\n ${escapeHtml(groupTitle)}\n \n \n \n

\n
\n
\n \n
\n ${subfields}\n
\n
\n
\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const arrayValue = normalizeStructuredArrayValue(value)\n const arrayTitle = opts.itemLabel || field.field_label || 'Items'\n const hasItemTitle = typeof opts.itemTitle === 'string' && opts.itemTitle.trim() !== ''\n const arrayItemTitle = hasItemTitle ? opts.itemTitle.trim() : 'Item'\n const addItemLabel = hasItemTitle ? `Add ${arrayItemTitle}` : 'Add item'\n\n const items = arrayValue\n .map((itemValue, index) =>\n renderStructuredArrayItem(\n field,\n itemsConfig,\n String(index),\n itemValue,\n pluginStatuses,\n arrayItemTitle,\n ),\n )\n .join('')\n\n const emptyState =\n arrayValue.length === 0\n ? `\n
\n No items yet. Add the first item to get started.\n
\n `\n : ''\n\n return `\n
\n \n\n
\n
\n ${escapeHtml(arrayTitle)}\n
\n \n ${escapeHtml(addItemLabel)}\n \n
\n\n
\n ${items || emptyState}\n
\n\n \n
\n ${getDragSortableScript()}\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayItem(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n arrayItemTitle: string,\n): string {\n const itemFields = renderStructuredItemFields(field, itemConfig, index, itemValue, pluginStatuses)\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n ${escapeHtml(arrayItemTitle)} \n
\n
\n
\n \n \n \n \n
\n
\n
\n ${itemFields}\n
\n
\n `\n}\n\nfunction renderStructuredItemFields(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const itemType = itemConfig?.type || 'string'\n if (\n itemType === 'object' &&\n itemConfig?.properties &&\n typeof itemConfig.properties === 'object'\n ) {\n const fieldPrefix = `array-${field.field_name}-${index}`\n return Object.entries(itemConfig.properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n itemValue || {},\n pluginStatuses,\n fieldPrefix,\n ),\n )\n .join('')\n }\n\n const normalizedField = normalizeBlockField(itemConfig, 'Item')\n const fieldValue = itemValue ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `array-${field.field_name}-${index}-value`,\n field_name: `array-${field.field_name}-${index}-value`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction renderStructuredSubfield(\n field: FieldDefinition,\n propertyName: string,\n propertyConfig: any,\n objectValue: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n fieldPrefix: string,\n): string {\n const normalizedField = normalizeBlockField(propertyConfig, propertyName)\n const fieldValue = objectValue?.[propertyName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `${fieldPrefix}-${propertyName}`,\n field_name: `${fieldPrefix}__${propertyName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction normalizeStructuredObjectValue(value: any): Record {\n if (!value) return {}\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {}\n } catch {\n return {}\n }\n }\n if (typeof value === 'object' && !Array.isArray(value)) return value\n return {}\n}\n\nfunction normalizeStructuredArrayValue(value: any): any[] {\n if (!value) return []\n if (Array.isArray(value)) return value\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction normalizeBlockDefinitions(\n rawBlocks: any,\n): Array<{ name: string; label: string; description?: string; properties: Record }> {\n if (!rawBlocks || typeof rawBlocks !== 'object') return []\n\n return Object.entries(rawBlocks)\n .filter(([name, block]) => typeof name === 'string' && block && typeof block === 'object')\n .map(([name, block]: [string, any]) => ({\n name,\n label: block.label || name,\n description: block.description,\n properties: block.properties && typeof block.properties === 'object' ? block.properties : {},\n }))\n}\n\nfunction normalizeBlocksValue(value: any, discriminator: string): any[] {\n const normalizeItem = (item: any) => {\n if (!item || typeof item !== 'object') return null\n if (item[discriminator]) return item\n if (item.blockType && item.data && typeof item.data === 'object') {\n return { [discriminator]: item.blockType, ...item.data }\n }\n return item\n }\n\n const fromArray = (items: any[]) =>\n items.map(normalizeItem).filter((item) => item && typeof item === 'object')\n\n if (Array.isArray(value)) return fromArray(value)\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? fromArray(parsed) : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction renderBlockTemplate(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n return `\n \n `\n}\n\nfunction renderBlockItem(\n field: FieldDefinition,\n blockValue: any,\n blocks: Array<{\n name: string\n label: string\n description?: string\n properties: Record\n }>,\n discriminator: string,\n index: number,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockType = blockValue?.[discriminator] || blockValue?.blockType\n const blockDefinition = blocks.find((block) => block.name === blockType)\n\n if (!blockDefinition) {\n return `\n
\n Unknown block type: ${escapeHtml(String(blockType || 'unknown'))}. This block will be preserved as-is.\n
\n `\n }\n\n const data =\n blockValue && typeof blockValue === 'object'\n ? Object.fromEntries(Object.entries(blockValue).filter(([key]) => key !== discriminator))\n : {}\n\n return renderBlockCard(field, blockDefinition, discriminator, String(index), data, pluginStatuses)\n}\n\nfunction renderBlockCard(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n index: string,\n data: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockFields = Object.entries(block.properties)\n .map(([fieldName, fieldConfig]) => {\n if (fieldConfig?.type === 'array' && fieldConfig?.items?.blocks) {\n return `\n
\n Nested blocks are not supported yet for \"${escapeHtml(fieldName)}\".\n
\n `\n }\n\n const normalizedField = normalizeBlockField(fieldConfig, fieldName)\n const fieldValue = data?.[fieldName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `block-${field.field_name}-${index}-${fieldName}`,\n field_name: `block-${field.field_name}-${index}-${fieldName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n })\n .join('')\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${escapeHtml(block.label)}\n \n
\n ${block.description ? `

${escapeHtml(block.description)}

` : ''}\n
\n
\n
\n \n \n \n \n
\n
\n
\n ${blockFields}\n
\n
\n `\n}\n\nfunction normalizeBlockField(fieldConfig: any, fieldName: string) {\n const type = fieldConfig?.type || 'text'\n const label = fieldConfig?.title || fieldName\n const required = fieldConfig?.required === true\n const options = { ...fieldConfig }\n\n if (type === 'select' && Array.isArray(fieldConfig?.enum)) {\n options.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return {\n type,\n label,\n required,\n defaultValue: fieldConfig?.default,\n options,\n }\n}\n\nfunction getStructuredFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction getBlocksFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}\n","/**\n * User Profile Custom Fields Renderer\n *\n * Generates the HTML section for custom profile fields by adapting\n * ProfileFieldDefinition into FieldDefinition and calling renderDynamicField.\n */\n\nimport { renderDynamicField, type FieldDefinition } from '../../../templates/components/dynamic-field.template'\nimport type { UserProfileConfig, ProfileFieldDefinition } from './user-profile-registry'\n\nexport function toFieldDefinition(field: ProfileFieldDefinition, index: number): FieldDefinition {\n return {\n id: `custom_${field.name}`,\n field_name: `custom_${field.name}`,\n field_type: field.type,\n field_label: field.label,\n field_options: {\n placeholder: field.placeholder || '',\n helpText: field.helpText || '',\n enum: field.options || [],\n enumLabels: field.options || [],\n },\n field_order: index,\n is_required: field.required || false,\n is_searchable: false,\n }\n}\n\nexport function renderCustomProfileSection(\n config: UserProfileConfig | null,\n customData: Record\n): string {\n if (!config || config.fields.length === 0) return ''\n\n const visibleFields = config.fields.filter(f => !f.hidden)\n if (visibleFields.length === 0) return ''\n\n const fieldsHtml = visibleFields\n .map((field, index) => {\n const fieldDef = toFieldDefinition(field, index)\n const value = customData[field.name] ?? field.default ?? ''\n return renderDynamicField(fieldDef, { value })\n })\n .join('\\n')\n\n return `\n \n
\n

Custom Profile Fields

\n
\n ${fieldsHtml}\n
\n
`\n}\n","/**\n * User Profiles Plugin\n *\n * Configurable custom profile fields for users.\n * Developers call defineUserProfile() at app boot to declare custom fields\n * that are stored as JSON in user_profiles.data and rendered in the admin UI.\n *\n * API Routes:\n * GET /api/user-profiles/schema → Public field definitions\n * GET /api/user-profiles/:userId → Get custom data for a user (auth required)\n * PUT /api/user-profiles/:userId → Update custom data for a user (auth required)\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { getUserProfileConfig } from './user-profile-registry'\nimport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\nimport { renderCustomProfileSection } from './user-profile-renderer'\n\nexport function createUserProfilesPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'user-profiles',\n version: '1.0.0-beta.1',\n description: 'Configurable custom profile fields for users',\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com',\n },\n license: 'MIT',\n compatibility: '^2.0.0',\n })\n\n // ==================== API Routes ====================\n\n const api = new Hono()\n\n // GET /api/user-profiles/schema — public schema endpoint\n api.get('/schema', (c) => {\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ fields: [], registrationFields: [] })\n }\n return c.json({\n fields: config.fields\n .filter(f => !f.hidden)\n .map(f => ({\n name: f.name,\n label: f.label,\n type: f.type,\n options: f.options,\n required: f.required || false,\n placeholder: f.placeholder,\n helpText: f.helpText,\n default: f.default,\n validation: f.validation,\n })),\n registrationFields: config.registrationFields || [],\n })\n })\n\n // GET /api/user-profiles/:userId — get custom data\n api.get('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const userId = c.req.param('userId')\n const data = await getCustomData(db, userId)\n return c.json({ userId, customData: data })\n })\n\n // PUT /api/user-profiles/:userId — update custom data\n api.put('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ error: 'No profile schema configured' }, 400)\n }\n\n const userId = c.req.param('userId')\n const body = await c.req.json()\n const customData = body.customData || body\n\n const sanitized = sanitizeCustomData(customData, config)\n const validation = validateCustomData(sanitized, config)\n if (!validation.valid) {\n return c.json({ error: 'Validation failed', errors: validation.errors }, 400)\n }\n\n await saveCustomData(db, userId, sanitized)\n return c.json({ success: true })\n })\n\n builder.addRoute('/api/user-profiles', api, {\n description: 'Custom user profile fields API',\n requiresAuth: false,\n priority: 100,\n })\n\n builder.lifecycle({\n activate: async () => {\n console.info('[SonicJS] User Profiles plugin activated')\n },\n deactivate: async () => {\n console.info('[SonicJS] User Profiles plugin deactivated')\n },\n })\n\n return builder.build() as Plugin\n}\n\nexport const userProfilesPlugin = createUserProfilesPlugin()\n\n// Re-export public API\nexport {\n defineUserProfile,\n getUserProfileConfig,\n getProfileFieldDefaults,\n getRegistrationFields,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\n\nexport { renderCustomProfileSection } from './user-profile-renderer'\n","import { Hono } from 'hono'\n// import { zValidator } from '@hono/zod-validator'\nimport { z } from 'zod'\nimport { getCookie, setCookie } from 'hono/cookie'\nimport { html } from 'hono/html'\nimport { AuthManager, requireAuth, generateCsrfToken, rateLimit } from '../middleware'\nimport { getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb } from '../middleware/auth'\nimport { renderLoginPage, LoginPageData } from '../templates/pages/auth-login.template'\nimport { renderRegisterPage, RegisterPageData } from '../templates/pages/auth-register.template'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { authValidationService, isRegistrationEnabled, isFirstUserRegistration } from '../services/auth-validation'\nimport type { RegistrationData } from '../services/auth-validation'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, getRegistrationFields, getProfileFieldDefaults, sanitizeCustomData, saveCustomData, getCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n/** Set a signed CSRF cookie alongside the auth cookie on login/register. */\nasync function setCsrfCookie(c: any, maxAge?: number): Promise {\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n const csrfToken = await generateCsrfToken(secret)\n const cookieMaxAge = maxAge ?? (await getJwtExpirySecondsFromDb(c.env?.DB, c.env))\n setCookie(c, 'csrf_token', csrfToken, {\n httpOnly: false,\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: cookieMaxAge,\n })\n}\n\n/** Clear the CSRF cookie on logout. */\nfunction clearCsrfCookie(c: any): void {\n setCookie(c, 'csrf_token', '', {\n httpOnly: false,\n secure: false,\n sameSite: 'Strict',\n path: '/',\n maxAge: 0,\n })\n}\n\nconst authRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Login page (HTML form)\nauthRoutes.get('/login', async (c) => {\n const error = c.req.query('error')\n const message = c.req.query('message')\n \n const pageData: LoginPageData = {\n error: error || undefined,\n message: message || undefined,\n version: c.get('appVersion')\n }\n \n // Check if demo login plugin is active\n const db = c.env.DB\n let demoLoginActive = false\n try {\n const plugin = await db.prepare('SELECT * FROM plugins WHERE id = ? AND status = ?')\n .bind('demo-login-prefill', 'active')\n .first()\n demoLoginActive = !!plugin\n } catch (error) {\n // Ignore database errors - plugin system might not be initialized\n }\n \n return c.html(renderLoginPage(pageData, demoLoginActive))\n})\n\n// Registration page (HTML form)\nauthRoutes.get('/register', async (c) => {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.redirect('/auth/login?error=Registration is currently disabled')\n }\n }\n\n const error = c.req.query('error')\n\n const pageData: RegisterPageData = {\n error: error || undefined\n }\n\n return c.html(renderRegisterPage(pageData))\n})\n\n// Login schema\nconst loginSchema = z.object({\n email: z.string().email('Valid email is required'),\n password: z.string().min(1, 'Password is required')\n})\n\n// Register new user\nauthRoutes.post('/register',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.json({ error: 'Registration is currently disabled' }, 403)\n }\n }\n\n // Parse JSON with error handling\n let requestData\n try {\n requestData = await c.req.json()\n } catch (parseError) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n\n let validatedData: RegistrationData\n try {\n validatedData = await validationSchema.parseAsync(requestData)\n } catch (validationError: any) {\n return c.json({\n error: 'Validation failed',\n details: validationError.issues?.map((e: any) => e.message) || [validationError.message || 'Invalid request data']\n }, 400)\n }\n\n // Extract fields with defaults for optional ones\n const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.json({ error: 'User with this email or username already exists' }, 400)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n \n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n 'viewer', // Default role\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n \n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n if (requestData[field.name] !== undefined) {\n customData[field.name] = requestData[field.name]\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, 'viewer', c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n user: {\n id: userId,\n email: normalizedEmail,\n username,\n firstName,\n lastName,\n role: 'viewer'\n },\n token\n }, 201)\n } catch (error) {\n console.error('Registration error:', error)\n // Return validation errors as 400, other errors as 500\n if (error instanceof Error && error.message.includes('validation')) {\n return c.json({ error: error.message }, 400)\n }\n return c.json({\n error: 'Registration failed',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n }\n)\n\n// Login user\nauthRoutes.post('/login',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const body = await c.req.json()\n const validation = loginSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const { email, password } = validation.data\n const db = c.env.DB\n \n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Find user with caching\n const cache = getCacheService(CACHE_CONFIGS.user!)\n let user = await cache.get(cache.generateKey('user', `email:${normalizedEmail}`))\n\n if (!user) {\n user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n\n if (user) {\n // Cache the user for faster subsequent lookups\n await cache.set(cache.generateKey('user', `email:${normalizedEmail}`), user)\n await cache.set(cache.generateKey('user', user.id), user)\n }\n }\n\n if (!user) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n // Invalidate user cache on login\n await cache.delete(cache.generateKey('user', user.id))\n await cache.delete(cache.generateKey('user', `email:${normalizedEmail}`))\n\n return c.json({\n user: {\n id: user.id,\n email: user.email,\n username: user.username,\n firstName: user.first_name,\n lastName: user.last_name,\n role: user.role\n },\n token\n })\n } catch (error) {\n console.error('Login error:', error)\n return c.json({ error: 'Login failed' }, 500)\n }\n})\n\n// Logout user (both GET and POST for convenience)\nauthRoutes.post('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.json({ message: 'Logged out successfully' })\n})\n\nauthRoutes.get('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.redirect('/auth/login?message=You have been logged out successfully')\n})\n\n// Get current user\nauthRoutes.get('/me', requireAuth(), async (c) => {\n try {\n // This would need the auth middleware applied\n const user = c.get('user')\n \n if (!user) {\n return c.json({ error: 'Not authenticated' }, 401)\n }\n \n const db = c.env.DB\n const userData = await db.prepare('SELECT id, email, username, first_name, last_name, role, created_at FROM users WHERE id = ?')\n .bind(user.userId)\n .first() as Record | null\n\n if (!userData) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n const customData = await getCustomData(db, user.userId)\n return c.json({ user: { ...userData, ...customData } })\n } catch (error) {\n console.error('Get user error:', error)\n return c.json({ error: 'Failed to get user' }, 500)\n }\n})\n\n// Refresh token (sliding session)\n//\n// Accepts a valid JWT — or one that has expired within the grace window\n// (`JWT_REFRESH_GRACE_SECONDS`, default 7 days) — and issues a fresh JWT\n// with a new `exp`. This lets a long-lived session cookie keep a user\n// logged in across JWT expirations without forcing a full re-login.\n//\n// Security: the caller must still present a valid-signature token that\n// recently belonged to an active user. Fully forged or long-expired tokens\n// are rejected.\nauthRoutes.post('/refresh',\n rateLimit({ max: 60, windowMs: 60 * 1000, keyPrefix: 'refresh' }),\n async (c) => {\n try {\n // Accept token from Authorization header or cookie\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) token = getCookie(c, 'auth_token')\n\n if (!token) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const grace = await getJwtRefreshGraceSecondsFromDb(db, c.env)\n\n const payload = await AuthManager.verifyToken(token, c.env.JWT_SECRET, grace)\n if (!payload) {\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Re-validate the user is still active, and pick up any role changes.\n const row = await db.prepare('SELECT id, email, role, is_active FROM users WHERE id = ?')\n .bind(payload.userId)\n .first() as any\n\n if (!row || !row.is_active) {\n return c.json({ error: 'User is not active' }, 401)\n }\n\n // Generate new token with a fresh exp\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env)\n const newToken = await AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set new cookie\n setCookie(c, 'auth_token', newToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n token: newToken,\n expiresIn: tokenTtl\n })\n } catch (error) {\n console.error('Token refresh error:', error)\n return c.json({ error: 'Token refresh failed' }, 500)\n }\n})\n\n// Form-based registration handler (for HTML forms)\nauthRoutes.post('/register/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.html(html`\n
\n Registration is currently disabled. Please contact an administrator.\n
\n `)\n }\n }\n\n const formData = await c.req.formData()\n\n // Extract form data\n const requestData = {\n email: formData.get('email') as string,\n password: formData.get('password') as string,\n username: formData.get('username') as string,\n firstName: formData.get('firstName') as string,\n lastName: formData.get('lastName') as string,\n }\n\n // Normalize email to lowercase\n const normalizedEmail = requestData.email?.toLowerCase()\n requestData.email = normalizedEmail\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n const validation = await validationSchema.safeParseAsync(requestData)\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const validatedData: RegistrationData = validation.data\n\n // Extract fields with defaults for optional ones\n // const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.html(html`\n
\n User with this email or username already exists\n
\n `)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Determine role: first user gets admin, others get viewer\n const role = isFirstUser ? 'admin' : 'viewer'\n\n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n\n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n role,\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n\n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n const raw = formData.get(field.name)?.toString()\n if (raw !== undefined && raw !== null) {\n customData[field.name] = raw\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Redirect based on role\n const redirectUrl = role === 'admin' ? '/admin/dashboard' : '/admin/dashboard'\n\n return c.html(html`\n
\n Account created successfully! Redirecting...\n \n
\n `)\n } catch (error) {\n console.error('Registration error:', error)\n return c.html(html`\n
\n Registration failed. Please try again.\n
\n `)\n }\n})\n\n// Form-based login handler (for HTML forms)\nauthRoutes.post('/login/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email') as string\n const password = formData.get('password') as string\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n\n // Validate the data\n const validation = loginSchema.safeParse({ email: normalizedEmail, password })\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const db = c.env.DB\n \n // Find user\n const user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n \n if (!user) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n return c.html(html`\n
\n
\n
\n \n \n \n
\n

Login successful! Redirecting to admin dashboard...

\n
\n
\n \n
\n
\n `)\n } catch (error) {\n console.error('Login error:', error)\n return c.html(html`\n
\n Login failed. Please try again.\n
\n `)\n }\n})\n\n// Test seeding endpoint (only for development/testing)\nauthRoutes.post('/seed-admin',\n rateLimit({ max: 10, windowMs: 60 * 1000, keyPrefix: 'seed-admin' }),\n async (c) => {\n try {\n const db = c.env.DB\n \n // First ensure the users table exists\n await db.prepare(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL UNIQUE,\n username TEXT NOT NULL UNIQUE,\n first_name TEXT NOT NULL,\n last_name TEXT NOT NULL,\n password_hash TEXT,\n role TEXT NOT NULL DEFAULT 'viewer',\n avatar TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n last_login_at INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `).run()\n \n // Check if admin user already exists\n const existingAdmin = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind('admin@sonicjs.com', 'admin')\n .first()\n\n if (existingAdmin) {\n // Update the password to ensure it's correct for testing\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(passwordHash, Date.now(), existingAdmin.id)\n .run()\n\n return c.json({\n message: 'Admin user already exists (password updated)',\n user: {\n id: existingAdmin.id,\n email: 'admin@sonicjs.com',\n username: 'admin',\n role: 'admin'\n }\n })\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n \n // Create admin user\n const userId = 'admin-user-id'\n const now = Date.now()\n const adminEmail = 'admin@sonicjs.com'.toLowerCase()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n adminEmail,\n 'admin',\n 'Admin',\n 'User',\n passwordHash,\n 'admin',\n 1, // is_active\n now,\n now\n ).run()\n \n return c.json({ \n message: 'Admin user created successfully',\n user: {\n id: userId,\n email: adminEmail,\n username: 'admin',\n role: 'admin'\n },\n passwordHash: passwordHash // For debugging\n })\n } catch (error) {\n console.error('Seed admin error:', error)\n return c.json({ error: 'Failed to create admin user', details: error instanceof Error ? error.message : String(error) }, 500)\n }\n})\n\n\n// Accept invitation page\nauthRoutes.get('/accept-invitation', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.html(`\n \n Invitation Expired\n \n

Invitation Expired

\n

This invitation has expired. Please contact your administrator for a new invitation.

\n Go to Login\n \n \n `)\n }\n\n // Show invitation acceptance form\n return c.html(`\n \n \n \n \n \n Accept Invitation - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Accept Invitation

\n

Complete your account setup

\n

\n You've been invited as ${invitedUser.first_name} ${invitedUser.last_name}
\n ${invitedUser.email}
\n ${invitedUser.role}\n

\n
\n\n
\n \n \n
\n \n \n
\n\n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Accept invitation page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your invitation.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process invitation acceptance\nauthRoutes.post('/accept-invitation', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const username = formData.get('username')?.toString()?.trim()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !username || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'Invalid or expired invitation' }, 400)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.json({ error: 'Invitation has expired' }, 400)\n }\n\n // Check if username is available\n const existingUsernameStmt = db.prepare(`\n SELECT id FROM users WHERE username = ? AND id != ?\n `)\n const existingUsername = await existingUsernameStmt.bind(username, invitedUser.id).first()\n\n if (existingUsername) {\n return c.json({ error: 'Username is already taken' }, 400)\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Activate user account\n const updateStmt = db.prepare(`\n UPDATE users SET \n username = ?,\n password_hash = ?,\n is_active = 1,\n email_verified = 1,\n invitation_token = NULL,\n accepted_invitation_at = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n username,\n passwordHash,\n Date.now(),\n Date.now(),\n invitedUser.id\n ).run()\n\n // Generate JWT token for auto-login\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const authToken = await AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', authToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?welcome=true')\n\n } catch (error) {\n console.error('Accept invitation error:', error)\n return c.json({ error: 'Failed to accept invitation' }, 500)\n }\n})\n\n// Request password reset\nauthRoutes.post('/request-password-reset',\n rateLimit({ max: 3, windowMs: 15 * 60 * 1000, keyPrefix: 'password-reset' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email')?.toString()?.trim()?.toLowerCase()\n\n if (!email) {\n return c.json({ error: 'Email is required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if user exists and is active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name FROM users \n WHERE email = ? AND is_active = 1\n `)\n const user = await userStmt.bind(email).first() as any\n\n // Always return success to prevent email enumeration\n if (!user) {\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.'\n })\n }\n\n // Generate password reset token (expires in 1 hour)\n const resetToken = crypto.randomUUID()\n const resetExpires = Date.now() + (60 * 60 * 1000) // 1 hour\n\n // Update user with reset token\n const updateStmt = db.prepare(`\n UPDATE users SET \n password_reset_token = ?,\n password_reset_expires = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n resetToken,\n resetExpires,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // In a real implementation, you would send an email here\n // For now, we'll return the reset link for development\n const resetLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/reset-password?token=${resetToken}`\n\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.',\n reset_link: resetLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('Password reset request error:', error)\n return c.json({ error: 'Failed to process password reset request' }, 500)\n }\n})\n\n// Show password reset form\nauthRoutes.get('/reset-password', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, password_reset_expires\n FROM users \n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has already been used.

\n Go to Login\n \n \n `)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.html(`\n \n Reset Link Expired\n \n

Reset Link Expired

\n

The password reset link has expired. Please request a new one.

\n Go to Login\n \n \n `)\n }\n\n // Show password reset form\n return c.html(`\n \n \n \n \n \n Reset Password - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Reset Password

\n

Choose a new password for your account

\n

\n Reset password for ${user.first_name} ${user.last_name}
\n ${user.email}\n

\n
\n\n
\n \n \n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n\n \n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Password reset page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your password reset.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process password reset\nauthRoutes.post('/reset-password', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, password_hash, password_reset_expires\n FROM users\n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.json({ error: 'Invalid or expired reset token' }, 400)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.json({ error: 'Reset token has expired' }, 400)\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(password)\n\n // Store old password in history (skip if table doesn't exist)\n try {\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user.id,\n user.password_hash,\n Date.now()\n ).run()\n } catch (historyError) {\n // Password history table may not exist yet\n console.warn('Could not store password history:', historyError)\n }\n\n // Update user password and clear reset token\n const updateStmt = db.prepare(`\n UPDATE users SET\n password_hash = ?,\n password_reset_token = NULL,\n password_reset_expires = NULL,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newPasswordHash,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to login with success message\n return c.redirect('/auth/login?message=Password reset successfully. Please log in with your new password.')\n\n } catch (error) {\n console.error('Password reset error:', error)\n return c.json({ error: 'Failed to reset password' }, 500)\n }\n})\n\nexport default authRoutes\n","/**\n * Test Cleanup Routes\n *\n * Provides endpoints to clean up test data after e2e tests\n * WARNING: These endpoints should only be available in development/test environments\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database } from '@cloudflare/workers-types'\n\nconst app = new Hono()\n\n/**\n * Clean up all test data (collections, content, users except admin)\n * POST /test-cleanup\n */\napp.post('/test-cleanup', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Use pattern-based deletes to avoid SQL variable limits\n // This approach uses subqueries instead of building large IN lists\n\n // Step 1: Delete child data for test content (by pattern)\n await db.prepare(`\n DELETE FROM content_versions\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM workflow_history\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n // Note: content_data table may not exist in all schemas\n try {\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n } catch (e) {\n // Table doesn't exist, skip\n }\n\n // Step 2: Delete test content by pattern\n const contentResult = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n `).run()\n deletedCount += contentResult.meta?.changes || 0\n\n // Step 3: Delete child data for test users\n await db.prepare(`\n DELETE FROM api_tokens\n WHERE user_id IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM media\n WHERE uploaded_by IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n // Step 4: Delete test users\n const usersResult = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n `).run()\n deletedCount += usersResult.meta?.changes || 0\n\n // Step 5: Delete child data for test collections\n try {\n await db.prepare(`\n DELETE FROM collection_fields\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Delete remaining content from test collections\n await db.prepare(`\n DELETE FROM content\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n\n // Step 6: Delete test collections\n const collectionsResult = await db.prepare(`\n DELETE FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).run()\n deletedCount += collectionsResult.meta?.changes || 0\n\n // Step 7: Clean up orphaned data (skip if tables don't exist)\n try {\n await db.prepare(`\n DELETE FROM content_data WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM collection_fields WHERE collection_id NOT IN (SELECT id FROM collections)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM content_versions WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM workflow_history WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Step 8: Delete old activity logs (keep only last 100)\n await db.prepare(`\n DELETE FROM activity_logs\n WHERE id NOT IN (\n SELECT id FROM activity_logs\n ORDER BY created_at DESC\n LIMIT 100\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test data cleaned up successfully'\n })\n } catch (error) {\n console.error('Test cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test users only\n * POST /test-cleanup/users\n */\napp.post('/test-cleanup/users', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test users (preserve admin)\n const result = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com'\n AND (\n email LIKE '%test%'\n OR email LIKE '%example.com%'\n OR first_name = 'Test'\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test users cleaned up successfully'\n })\n } catch (error) {\n console.error('User cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test collections only\n * POST /test-cleanup/collections\n */\napp.post('/test-cleanup/collections', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Get test collection IDs first\n const collections = await db.prepare(`\n SELECT id FROM collections\n WHERE name LIKE 'test_%'\n OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).all()\n\n if (collections.results && collections.results.length > 0) {\n const collectionIds = collections.results.map((c: any) => c.id)\n\n // Delete associated fields\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM collection_fields WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete associated content\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM content WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete the collections\n const result = await db.prepare(`\n DELETE FROM collections\n WHERE id IN (${collectionIds.map(() => '?').join(',')})\n `).bind(...collectionIds).run()\n\n deletedCount = result.meta?.changes || 0\n }\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test collections cleaned up successfully'\n })\n } catch (error) {\n console.error('Collection cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test content only\n * POST /test-cleanup/content\n */\napp.post('/test-cleanup/content', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test content\n const result = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %'\n OR title LIKE '%E2E%'\n OR title LIKE '%Playwright%'\n OR title LIKE '%Sample%'\n `).run()\n\n // Clean up orphaned content_data\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test content cleaned up successfully'\n })\n } catch (error) {\n console.error('Content cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Plugin Middleware\n *\n * Provides middleware functions for checking plugin status and enforcing plugin requirements\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n/**\n * Check if a plugin is active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @returns Promise - True if the plugin is active, false otherwise\n */\nexport async function isPluginActive(db: D1Database, pluginId: string): Promise {\n try {\n const result = await db\n .prepare('SELECT status FROM plugins WHERE id = ?')\n .bind(pluginId)\n .first()\n\n return result?.status === 'active'\n } catch (error) {\n console.error(`[isPluginActive] Error checking plugin status for ${pluginId}:`, error)\n return false\n }\n}\n\n/**\n * Middleware to require a plugin to be active\n * Throws an error if the plugin is not active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @throws Error if plugin is not active\n */\nexport async function requireActivePlugin(db: D1Database, pluginId: string): Promise {\n const isActive = await isPluginActive(db, pluginId)\n if (!isActive) {\n throw new Error(`Plugin '${pluginId}' is required but is not active`)\n }\n}\n\n/**\n * Middleware to require multiple plugins to be active\n * Throws an error if any plugin is not active\n * @param db - The D1 database instance\n * @param pluginIds - Array of plugin IDs to check\n * @throws Error if any plugin is not active\n */\nexport async function requireActivePlugins(db: D1Database, pluginIds: string[]): Promise {\n for (const pluginId of pluginIds) {\n await requireActivePlugin(db, pluginId)\n }\n}\n\n/**\n * Get all active plugins\n * @param db - The D1 database instance\n * @returns Promise - Array of active plugin records\n */\nexport async function getActivePlugins(db: D1Database): Promise {\n try {\n const { results } = await db\n .prepare('SELECT * FROM plugins WHERE status = ?')\n .bind('active')\n .all()\n\n return results || []\n } catch (error) {\n console.error('[getActivePlugins] Error fetching active plugins:', error)\n return []\n }\n}\n","export interface ContentVersion {\n id: string\n version: number\n data: any\n author_id: string\n author_name?: string\n created_at: number\n is_current?: boolean\n}\n\nexport interface VersionHistoryData {\n contentId: string\n versions: ContentVersion[]\n currentVersion: number\n}\n\nexport function renderVersionHistory(data: VersionHistoryData): string {\n return `\n
\n
\n \n
\n
\n
\n

Version History

\n \n
\n
\n \n \n
\n
\n ${data.versions.map((version, index) => `\n
\n
\n
\n \n Version ${version.version}${version.is_current ? ' (Current)' : ''}\n \n \n ${new Date(version.created_at).toLocaleString()}\n \n
\n
\n ${!version.is_current ? `\n \n ` : ''}\n \n
\n
\n \n \n
\n
\n
\n Title:\n ${escapeHtml(version.data?.title || 'Untitled')}\n
\n
\n Author:\n ${escapeHtml(version.author_name || 'Unknown')}\n
\n ${version.data?.excerpt ? `\n
\n Excerpt:\n

${escapeHtml(version.data.excerpt.substring(0, 200))}${version.data.excerpt.length > 200 ? '...' : ''}

\n
\n ` : ''}\n
\n
\n \n \n ${!version.is_current && index < data.versions.length - 1 ? `\n
\n \n
\n Change detection coming soon...\n
\n
\n ` : ''}\n
\n `).join('')}\n
\n
\n \n \n
\n
\n \n ${data.versions.length} version${data.versions.length !== 1 ? 's' : ''} total\n \n \n
\n
\n
\n
\n \n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * EasyMDE Markdown Editor Plugin\n *\n * Provides markdown editing capabilities for richtext fields.\n * When active, this plugin injects the EasyMDE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'easy-mdx',\n version: '1.0.0',\n description: 'Lightweight markdown editor with live preview'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ EasyMDE editor plugin activated')\n },\n deactivate: async () => {\n console.info('❌ EasyMDE editor plugin deactivated')\n }\n})\n\nconst easyMdxPlugin = builder.build() as Plugin\n\nexport default easyMdxPlugin\n\n/**\n * Get EasyMDE CDN script tags\n * @returns HTML script and style tags for EasyMDE\n */\nexport function getMDXEditorScripts(): string {\n return `\n \n \n \n \n `\n}\n\n/**\n * Get EasyMDE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getMDXEditorInitScript(config?: {\n defaultHeight?: number\n toolbar?: string\n placeholder?: string\n}): string {\n const defaultHeight = config?.defaultHeight || 400\n const toolbar = config?.toolbar || 'full'\n const placeholder = config?.placeholder || 'Start writing your content...'\n\n return `\n // Initialize EasyMDE (Markdown Editor) only for markdown-marked fields\n function initializeMDXEditor() {\n if (typeof EasyMDE === 'undefined') {\n console.warn('EasyMDE not loaded yet, retrying...');\n setTimeout(initializeMDXEditor, 100);\n return;\n }\n\n // Find all textareas that need EasyMDE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"easymde\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (textarea.dataset.mdxeditorInitialized === 'true') {\n return;\n }\n\n // Mark as initialized\n textarea.dataset.mdxeditorInitialized = 'true';\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const editorToolbar = container?.dataset.toolbar || '${toolbar}';\n\n // Initialize EasyMDE\n try {\n const toolbarButtons = editorToolbar === 'minimal'\n ? ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'preview']\n : ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', 'table', '|', 'preview', 'side-by-side', 'fullscreen', '|', 'guide'];\n\n const easyMDE = new EasyMDE({\n element: textarea,\n placeholder: '${placeholder}',\n spellChecker: false,\n minHeight: height + 'px',\n toolbar: toolbarButtons,\n status: ['lines', 'words', 'cursor'],\n renderingConfig: {\n singleLineBreaks: false,\n codeSyntaxHighlighting: true\n }\n });\n\n // Store reference to editor instance\n textarea.easyMDEInstance = easyMDE;\n\n // Sync changes back to textarea\n easyMDE.codemirror.on(\"change\", () => {\n textarea.value = easyMDE.value();\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n textarea.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n\n console.log('EasyMDE initialized for field:', textarea.id || textarea.name);\n } catch (error) {\n console.error('Error initializing EasyMDE:', error);\n // Show textarea as fallback\n textarea.style.display = 'block';\n }\n });\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeMDXEditor);\n } else {\n // DOM already loaded, initialize immediately\n initializeMDXEditor();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeMDXEditor, 100);\n });\n `\n}\n\n/**\n * Check if EasyMDE editor plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isEasyMdxActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('easy-mdx')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking EasyMDE editor plugin status:', error)\n return false\n }\n}\n","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * TinyMCE Rich Text Editor Plugin\n *\n * Provides WYSIWYG editing capabilities for richtext fields.\n * When active, this plugin injects the TinyMCE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'tinymce-plugin',\n version: '1.0.0',\n description: 'Powerful WYSIWYG rich text editor for content creation'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ TinyMCE plugin activated')\n },\n deactivate: async () => {\n console.info('❌ TinyMCE plugin deactivated')\n }\n})\n\nconst tinymcePlugin = builder.build() as Plugin\n\nexport default tinymcePlugin\n\n/**\n * Get TinyMCE CDN script tag\n * @param apiKey - Optional TinyMCE API key (defaults to 'no-api-key')\n * @returns HTML script tag for TinyMCE CDN\n */\nexport function getTinyMCEScript(apiKey: string = 'no-api-key'): string {\n return ``\n}\n\n/**\n * Get TinyMCE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getTinyMCEInitScript(config?: {\n skin?: string\n defaultHeight?: number\n defaultToolbar?: string\n}): string {\n const skin = config?.skin || 'oxide-dark'\n const contentCss = skin.includes('dark') ? 'dark' : 'default'\n const defaultHeight = config?.defaultHeight || 300\n\n return `\n // Initialize TinyMCE only for TinyMCE-backed richtext fields\n function initializeTinyMCE() {\n if (typeof tinymce !== 'undefined') {\n // Find all textareas that need TinyMCE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"tinymce\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (tinymce.get(textarea.id)) {\n return;\n }\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const toolbar = container?.dataset.toolbar || 'full';\n\n tinymce.init({\n selector: '#' + textarea.id,\n skin: '${skin}',\n content_css: '${contentCss}',\n height: parseInt(height),\n menubar: false,\n plugins: [\n 'advlist', 'autolink', 'lists', 'link', 'image', 'charmap', 'preview',\n 'anchor', 'searchreplace', 'visualblocks', 'code', 'fullscreen',\n 'insertdatetime', 'media', 'table', 'help', 'wordcount'\n ],\n toolbar: toolbar === 'simple'\n ? 'bold italic underline | bullist numlist | link'\n : toolbar === 'minimal'\n ? 'bold italic | link'\n : 'undo redo | blocks | bold italic forecolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | help',\n content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; font-size: 14px }'\n });\n });\n }\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeTinyMCE);\n } else {\n // DOM already loaded, initialize immediately\n initializeTinyMCE();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeTinyMCE, 100);\n });\n `\n}\n\n/**\n * Check if TinyMCE plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isTinyMCEActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('tinymce-plugin')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking TinyMCE plugin status:', error)\n return false\n }\n}\n","/**\n * Quill Rich Text Editor Plugin\n *\n * Provides Quill editor integration for rich text editing in SonicJS\n * https://quilljs.com/\n */\n\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\n/**\n * Quill Editor Configuration Options\n */\nexport interface QuillOptions {\n theme?: 'snow' | 'bubble'\n placeholder?: string\n height?: number\n toolbar?: 'full' | 'simple' | 'minimal' | string[][]\n modules?: Record\n formats?: string[]\n}\n\n/**\n * Default Quill toolbar configurations\n */\nconst QUILL_TOOLBARS = {\n full: [\n [{ 'header': [1, 2, 3, 4, 5, 6, false] }],\n ['bold', 'italic', 'underline', 'strike'],\n [{ 'color': [] }, { 'background': [] }],\n [{ 'align': [] }],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n [{ 'indent': '-1'}, { 'indent': '+1' }],\n ['blockquote', 'code-block'],\n ['link', 'image', 'video'],\n ['clean']\n ],\n simple: [\n ['bold', 'italic', 'underline'],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n ['link']\n ],\n minimal: [\n ['bold', 'italic'],\n ['link']\n ]\n}\n\n/**\n * Render a Quill editor field\n * @param fieldId - The field ID\n * @param fieldName - The field name\n * @param value - The current value\n * @param options - Quill configuration options\n * @returns HTML string for the Quill editor field\n */\nexport function renderQuillField(\n fieldId: string,\n fieldName: string,\n value: string = '',\n options: QuillOptions = {}\n): string {\n const {\n theme = 'snow',\n placeholder = 'Enter content...',\n height = 300,\n toolbar = 'full'\n } = options\n\n // Escape HTML for hidden input\n const escapeHtml = (str: string) => {\n return str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n }\n\n return `\n
\n \n ${value}
\n\n \n \n \n `\n}\n\n/**\n * Generate Quill initialization script\n * @returns HTML script tag with Quill initialization code\n */\nexport function getQuillInitScript(): string {\n return `\n \n `\n}\n\n/**\n * Generate Quill CDN links\n * @param version - Quill version (default: 2.0.2)\n * @returns HTML script and link tags for Quill CDN\n */\nexport function getQuillCDN(version: string = '2.0.2'): string {\n return `\n \n \n \n\n \n \n\n \n \n `\n}\n\n/**\n * Create the Quill Editor Plugin\n */\nexport function createQuillEditorPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'quill-editor',\n version: '1.0.0',\n description: 'Quill rich text editor integration for SonicJS'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Quill Editor plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Quill Editor plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const quillEditorPlugin = createQuillEditorPlugin()\n","import { getMDXEditorInitScript, getMDXEditorScripts } from '../../plugins/available/easy-mdx'\nimport { getTinyMCEInitScript, getTinyMCEScript } from '../../plugins/available/tinymce-plugin'\nimport { getQuillCDN, getQuillInitScript } from '../../plugins/core-plugins/quill-editor'\nimport { renderAlert } from '../alert.template'\nimport { FieldDefinition, renderDynamicField, renderFieldGroup } from '../components/dynamic-field.template'\nimport { getConfirmationDialogScript, renderConfirmationDialog } from '../confirmation-dialog.template'\nimport { AdminLayoutCatalystData, renderAdminLayoutCatalyst } from '../layouts/admin-layout-catalyst.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n schema: any\n}\n\nexport interface ContentFormData {\n id?: string\n title?: string\n slug?: string\n created_at?: number\n updated_at?: number\n published_at?: number\n data?: any\n status?: string\n scheduled_publish_at?: number\n scheduled_unpublish_at?: number\n review_status?: string\n meta_title?: string\n meta_description?: string\n collection: Collection\n fields: FieldDefinition[]\n isEdit?: boolean\n error?: string\n success?: string\n validationErrors?: Record\n workflowEnabled?: boolean // New flag to indicate if workflow plugin is active\n tinymceEnabled?: boolean // Flag to indicate if TinyMCE plugin is active\n tinymceSettings?: {\n apiKey?: string\n defaultHeight?: number\n defaultToolbar?: string\n skin?: string\n }\n quillEnabled?: boolean // Flag to indicate if Quill plugin is active\n quillSettings?: {\n version?: string\n defaultHeight?: number\n defaultToolbar?: string\n theme?: string\n }\n mdxeditorEnabled?: boolean // Flag to indicate if MDXEditor plugin is active\n mdxeditorSettings?: {\n defaultHeight?: number\n theme?: string\n toolbar?: string\n placeholder?: string\n }\n referrerParams?: string // URL parameters to preserve filters when returning to list\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentFormPage(data: ContentFormData): string {\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? `Edit: ${data.title || 'Content'}` : `New ${data.collection.display_name}`\n const hasValidationErrors = Boolean(data.validationErrors && Object.keys(data.validationErrors).length > 0)\n\n // Construct back URL with preserved filters\n const backUrl = data.referrerParams\n ? `/admin/content?${data.referrerParams}`\n : `/admin/content?collection=${data.collection.id}`\n\n // Group fields by category\n const coreFields = data.fields.filter(f => ['title', 'slug', 'content'].includes(f.field_name))\n const contentFields = data.fields.filter(f => !['title', 'slug', 'content'].includes(f.field_name) && !f.field_name.startsWith('meta_'))\n const metaFields = data.fields.filter(f => f.field_name.startsWith('meta_'))\n\n // Helper function to get field value - title and slug are stored as columns, others in data JSON\n const getFieldValue = (fieldName: string) => {\n if (fieldName === 'title') return data.title || data.data?.[fieldName] || ''\n if (fieldName === 'slug') return data.slug || data.data?.[fieldName] || ''\n return data.data?.[fieldName] || ''\n }\n\n // Prepare plugin statuses for field rendering\n const pluginStatuses = {\n quillEnabled: data.quillEnabled || false,\n mdxeditorEnabled: data.mdxeditorEnabled || false,\n tinymceEnabled: data.tinymceEnabled || false\n }\n\n // Render field groups\n const coreFieldsHTML = coreFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id // Pass content ID when editing\n }))\n\n const contentFieldsHTML = contentFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const metaFieldsHTML = metaFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const pageContent = `\n
\n \n
\n
\n

${isEdit ? 'Edit Content' : 'New Content'}

\n

\n ${data.collection.description || `Manage ${data.collection.display_name.toLowerCase()} content`}\n

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

${data.collection.display_name}

\n

${isEdit ? 'Update your content' : 'Create new content'}

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n
\n \n
\n \n \n ${isEdit ? `` : ''}\n ${data.referrerParams ? `` : ''}\n \n \n ${renderFieldGroup('Basic Information', coreFieldsHTML)}\n \n \n ${contentFields.length > 0 ? renderFieldGroup('Content Details', contentFieldsHTML) : ''}\n \n \n ${metaFields.length > 0 ? renderFieldGroup('SEO & Metadata', metaFieldsHTML, true) : ''}\n \n
\n \n
\n\n \n
\n \n
\n

Publishing

\n\n ${data.workflowEnabled ? `\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n \n

Leave empty to publish immediately

\n
\n\n \n
\n \n \n

Automatically unpublish at this time

\n
\n ` : `\n \n
\n \n
\n \n \n \n \n \n \n \n
\n

Enable Workflow plugin for advanced status management

\n
\n `}\n
\n\n \n ${isEdit ? `\n
\n

Content Info

\n\n
\n
\n
Created
\n
${data.created_at ? new Date(data.created_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Last Modified
\n
${data.updated_at ? new Date(data.updated_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Author
\n
${data.data?.author || 'Unknown'}
\n
\n ${data.published_at ? `\n
\n
Published
\n
${new Date(data.published_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n\n
\n \n \n \n \n View Version History\n \n
\n
\n ` : ''}\n\n \n
\n

Quick Actions

\n\n
\n \n \n \n \n \n Preview Content\n \n\n \n \n \n \n Duplicate Content\n \n\n ${isEdit ? `\n \n \n \n \n Delete Content\n \n ` : ''}\n
\n
\n
\n\n \n
\n \n \n \n \n Cancel\n \n\n
\n \n \n \n \n ${isEdit ? 'Update' : 'Save'}\n \n\n ${data.user?.role !== 'viewer' ? `\n \n \n \n \n ${isEdit ? 'Update' : 'Save'} & Publish\n \n ` : ''}\n
\n
\n
\n
\n
\n\n \n ${renderConfirmationDialog({\n id: 'duplicate-content-confirm',\n title: 'Duplicate Content',\n message: 'Create a copy of this content?',\n confirmText: 'Duplicate',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performDuplicateContent()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-content-confirm',\n title: 'Delete Content',\n message: 'Are you sure you want to delete this content? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: `performDeleteContent('${data.id}')`\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-repeater-item-confirm',\n title: 'Delete Item',\n message: 'Are you sure you want to delete this item? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-block-confirm',\n title: 'Delete Block',\n message: 'Are you sure you want to delete this block? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${getConfirmationDialogScript()}\n\n ${data.tinymceEnabled ? getTinyMCEScript(data.tinymceSettings?.apiKey) : ''}\n\n ${data.quillEnabled ? getQuillCDN(data.quillSettings?.version) : ''}\n\n ${data.quillEnabled ? getQuillInitScript() : ''}\n\n ${data.mdxeditorEnabled ? getMDXEditorScripts() : ''}\n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n content: pageContent,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderTable, TableData, TableColumn } from '../table.template'\nimport type { FilterBarData } from '../filter-bar.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../confirmation-dialog.template'\n\nexport interface ContentItem {\n id: string\n title: string\n slug: string\n modelName: string\n statusBadge: string\n authorName: string\n formattedDate: string\n availableActions: string[]\n}\n\nexport interface ContentListPageData {\n modelName: string\n status: string\n page: number\n search?: string\n models: Array<{\n name: string\n displayName: string\n }>\n contentItems: ContentItem[]\n totalItems: number\n itemsPerPage: number\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentListPage(data: ContentListPageData): string {\n // Build current URL parameters to pass to edit page\n const urlParams = new URLSearchParams()\n if (data.modelName && data.modelName !== 'all') urlParams.set('model', data.modelName)\n if (data.status && data.status !== 'all') urlParams.set('status', data.status)\n if (data.search) urlParams.set('search', data.search)\n if (data.page && data.page !== 1) urlParams.set('page', data.page.toString())\n const currentParams = urlParams.toString()\n\n // Check if filters are active (not in default state)\n const hasActiveFilters = data.modelName !== 'all' || data.status !== 'all' || !!data.search\n\n // Prepare filter bar data\n const filterBarData: FilterBarData = {\n filters: [\n {\n name: 'model',\n label: 'Model',\n options: [\n { value: 'all', label: 'All Models', selected: data.modelName === 'all' },\n ...data.models.map(model => ({\n value: model.name,\n label: model.displayName,\n selected: data.modelName === model.name\n }))\n ]\n },\n {\n name: 'status',\n label: 'Status',\n options: [\n { value: 'all', label: 'All Status', selected: data.status === 'all' },\n { value: 'draft', label: 'Draft', selected: data.status === 'draft' },\n { value: 'review', label: 'Under Review', selected: data.status === 'review' },\n { value: 'scheduled', label: 'Scheduled', selected: data.status === 'scheduled' },\n { value: 'published', label: 'Published', selected: data.status === 'published' },\n { value: 'archived', label: 'Archived', selected: data.status === 'archived' },\n { value: 'deleted', label: 'Deleted', selected: data.status === 'deleted' }\n ]\n }\n ],\n actions: [\n {\n label: 'Advanced Search',\n className: 'btn-primary',\n onclick: 'openAdvancedSearch()'\n },\n {\n label: 'Refresh',\n className: 'btn-secondary',\n onclick: 'location.reload()'\n }\n ],\n bulkActions: [\n { label: 'Publish', value: 'publish', icon: 'check-circle' },\n { label: 'Unpublish', value: 'unpublish', icon: 'x-circle' },\n { label: 'Delete', value: 'delete', icon: 'trash', className: 'text-pink-600' }\n ]\n }\n\n // Prepare table data\n const tableColumns: TableColumn[] = [\n {\n key: 'title',\n label: 'Title',\n sortable: true,\n sortType: 'string',\n render: (value, row) => `\n
\n
\n \n
${row.slug}
\n
\n
\n `\n },\n {\n key: 'modelName',\n label: 'Model',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'statusBadge',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (value) => value\n },\n {\n key: 'authorName',\n label: 'Author',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'formattedDate',\n label: 'Updated',\n sortable: true,\n sortType: 'date',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n className: 'text-sm font-medium',\n render: (value, row) => `\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'content-table',\n columns: tableColumns,\n rows: data.contentItems,\n selectable: true,\n rowClickable: true,\n rowClickUrl: (row: ContentItem) => `/admin/content/${row.id}/edit${currentParams ? `?ref=${encodeURIComponent(currentParams)}` : ''}`,\n emptyMessage: 'No content found. Create your first content item to get started.'\n }\n\n // Prepare pagination data\n const totalPages = Math.ceil(data.totalItems / data.itemsPerPage)\n const startItem = (data.page - 1) * data.itemsPerPage + 1\n const endItem = Math.min(data.page * data.itemsPerPage, data.totalItems)\n\n const paginationData: PaginationData = {\n currentPage: data.page,\n totalPages,\n totalItems: data.totalItems,\n itemsPerPage: data.itemsPerPage,\n startItem,\n endItem,\n baseUrl: '/admin/content',\n queryParams: {\n model: data.modelName,\n status: data.status,\n ...(data.search ? { search: data.search } : {})\n },\n showPageSizeSelector: true,\n pageSizeOptions: [10, 20, 50, 100]\n }\n\n // Generate page content\n const pageContent = `\n
\n \n
\n
\n

Content Management

\n

Manage and organize your content items

\n
\n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n \n
\n \n
\n \n \n ${data.models.map(model => `\n \n `).join('')}\n \n \n \n \n
\n
\n\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n
\n ${data.totalItems} ${data.totalItems === 1 ? 'item' : 'items'}\n ${filterBarData.actions?.map(action => `\n \n ${action.label === 'Refresh' ? `\n \n \n \n ` : ''}\n ${action.label}\n \n `).join('') || ''}\n ${filterBarData.bulkActions && filterBarData.bulkActions.length > 0 ? `\n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n \n Move to Draft\n \n
\n
\n \n \n \n \n Delete Selected\n \n
\n
\n
\n ` : ''}\n
\n
\n
\n
\n
\n \n \n
\n ${renderTable(tableData)}\n ${renderPagination(paginationData)}\n
\n \n
\n \n \n
\n
\n \n \n\n \n ${renderConfirmationDialog({\n id: 'bulk-action-confirm',\n title: 'Confirm Bulk Action',\n message: 'Are you sure you want to perform this action? This operation will affect multiple items.',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n iconColor: 'blue',\n onConfirm: 'executeBulkAction()'\n })}\n\n \n ${getConfirmationDialogScript()}\n\n \n
\n
\n \n
\n\n \n
\n
\n \n
\n

\n 🔍 Advanced Search\n

\n \n
\n\n \n
\n \n
\n \n
\n \n
\n
\n
\n\n \n
\n \n
\n \n \n
\n
\n\n \n
\n

Filters

\n \n
\n \n
\n \n \n \n ${data.models.map(\n (model) => `\n \n `\n ).join('')}\n \n

Hold Ctrl/Cmd to select multiple

\n
\n\n \n
\n \n \n \n \n \n \n \n \n
\n
\n
\n\n \n
\n \n Cancel\n \n \n Search\n \n
\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n // Prepare layout data\n const layoutData: AdminLayoutCatalystData = {\n title: 'Content Management',\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export function resolveSchemaFieldType(fieldConfig: Record): string {\n if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n return 'slug'\n }\n\n if (fieldConfig.type && fieldConfig.type !== 'string') {\n return fieldConfig.type\n }\n\n if (fieldConfig.format === 'richtext') {\n return 'richtext'\n }\n\n if (fieldConfig.format === 'media') {\n return 'media'\n }\n\n if (fieldConfig.format === 'date-time') {\n return 'date'\n }\n\n if (Array.isArray(fieldConfig.enum)) {\n return 'select'\n }\n\n return fieldConfig.type || 'string'\n}\n\nexport function buildSchemaFieldOptions(fieldConfig: Record): Record {\n const fieldOptions = { ...fieldConfig }\n const resolvedFieldType = resolveSchemaFieldType(fieldConfig)\n\n if (resolvedFieldType === 'select' && Array.isArray(fieldConfig.enum)) {\n fieldOptions.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return fieldOptions\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { Bindings, Variables } from '../app'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { CACHE_CONFIGS, getCacheService } from '../services/cache'\nimport { PluginService } from '../services/plugin-service'\nimport { ContentVersion, renderVersionHistory, VersionHistoryData } from '../templates/components/version-history.template'\nimport { ContentFormData, renderContentFormPage } from '../templates/pages/admin-content-form.template'\nimport { ContentListPageData, renderContentListPage } from '../templates/pages/admin-content-list.template'\nimport { getBlocksFieldConfig, parseBlocksValue } from '../utils/blocks'\nimport { escapeHtml, sanitizeRichText } from '../utils/sanitize'\nimport { buildSchemaFieldOptions, resolveSchemaFieldType } from './admin-content-field-types'\n\nconst adminContentRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Field definition type for form processing\ninterface FieldDefinition {\n field_name: string\n field_label: string\n field_type: string\n field_options?: any\n is_required?: boolean\n}\n\n// Result of parsing a single field value\ninterface ParsedFieldResult {\n value: any\n errors: string[]\n}\n\n/**\n * Parse a single field value from form data with validation\n * Centralizes field parsing logic used in POST, PUT, and preview handlers\n */\nfunction parseFieldValue(\n field: FieldDefinition,\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): ParsedFieldResult {\n const { skipValidation = false } = options\n const value = formData.get(field.field_name)\n const errors: string[] = []\n\n // Handle blocks fields (array with blocks config)\n const blocksConfig = getBlocksFieldConfig(field.field_options)\n if (blocksConfig) {\n const parsed = parseBlocksValue(value, blocksConfig)\n if (!skipValidation && field.is_required && parsed.value.length === 0) {\n parsed.errors.push(`${field.field_label} is required`)\n }\n return { value: parsed.value, errors: parsed.errors }\n }\n\n // Required field validation\n if (!skipValidation && field.is_required && (!value || value.toString().trim() === '')) {\n return { value: null, errors: [`${field.field_label} is required`] }\n }\n\n // Type-specific parsing\n switch (field.field_type) {\n case 'number':\n if (value && isNaN(Number(value))) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a valid number`)\n }\n return { value: null, errors }\n }\n return { value: value ? Number(value) : null, errors: [] }\n\n case 'boolean':\n // Check for the hidden _submitted field to determine if checkbox was rendered\n const submitted = formData.get(`${field.field_name}_submitted`)\n return { value: submitted ? value === 'true' : false, errors: [] }\n\n case 'select':\n if (field.field_options?.multiple) {\n return { value: formData.getAll(`${field.field_name}[]`), errors: [] }\n }\n return { value: value, errors: [] }\n\n case 'array': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: [], errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON array`)\n }\n return { value: [], errors }\n }\n if (!skipValidation && field.is_required && parsed.length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: [], errors }\n }\n }\n\n case 'object': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: {}, errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON object`)\n }\n return { value: {}, errors }\n }\n if (!skipValidation && field.is_required && Object.keys(parsed).length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: {}, errors }\n }\n }\n\n case 'json': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: null, errors }\n }\n try {\n return { value: JSON.parse(value.toString()), errors: [] }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: null, errors }\n }\n }\n\n default:\n return { value: value, errors: [] }\n }\n}\n\n/**\n * Extract all field values from form data\n */\nfunction extractFieldData(\n fields: FieldDefinition[],\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): { data: Record; errors: Record } {\n const data: Record = {}\n const errors: Record = {}\n\n for (const field of fields) {\n const result = parseFieldValue(field, formData, options)\n data[field.field_name] = result.value\n if (result.errors.length > 0) {\n errors[field.field_name] = result.errors\n }\n }\n\n return { data, errors }\n}\n\n// Apply authentication middleware\nadminContentRoutes.use('*', requireAuth())\n\n// Get collection fields\nasync function getCollectionFields(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('fields', collectionId),\n async () => {\n // First, check if collection has a schema (code-based collection)\n const collectionStmt = db.prepare('SELECT schema FROM collections WHERE id = ?')\n const collectionRow = await collectionStmt.bind(collectionId).first() as any\n\n if (collectionRow && collectionRow.schema) {\n try {\n const schema = typeof collectionRow.schema === 'string' ? JSON.parse(collectionRow.schema) : collectionRow.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n return Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n const fieldOptions = buildSchemaFieldOptions(fieldConfig)\n\n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: resolveSchemaFieldType(fieldConfig),\n field_label: fieldConfig.title || fieldName,\n field_options: fieldOptions,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table for legacy collections\n const stmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results } = await stmt.bind(collectionId).all()\n\n return (results || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }))\n }\n )\n}\n\n// Get collection by ID\nasync function getCollection(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('collection', collectionId),\n async () => {\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ? AND is_active = 1')\n const collection = await stmt.bind(collectionId).first() as any\n\n if (!collection) return null\n\n return {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n schema: collection.schema ? JSON.parse(collection.schema) : {}\n }\n }\n )\n}\n\n// Content list (main page)\nadminContentRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const db = c.env.DB\n\n // Get query parameters\n const page = parseInt(url.searchParams.get('page') || '1')\n const limit = parseInt(url.searchParams.get('limit') || '20')\n const modelName = url.searchParams.get('model') || 'all'\n const status = url.searchParams.get('status') || 'all'\n const search = url.searchParams.get('search') || ''\n const offset = (page - 1) * limit\n\n // Get all collections for filter dropdown (exclude form-sourced)\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results: collectionsResults } = await collectionsStmt.all()\n const models = (collectionsResults || []).map((row: any) => ({\n name: row.name,\n displayName: row.display_name\n }))\n\n // Build where conditions\n const conditions: string[] = []\n const params: any[] = []\n\n // Hide content from form-sourced collections in the regular content list\n conditions.push(\"(col.source_type IS NULL OR col.source_type = 'user')\")\n\n // Always filter out deleted content unless specifically requested\n if (status !== 'deleted') {\n conditions.push(\"c.status != 'deleted'\")\n }\n\n if (search) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n params.push(`%${search}%`, `%${search}%`, `%${search}%`)\n }\n\n if (modelName !== 'all') {\n conditions.push('col.name = ?')\n params.push(modelName)\n }\n\n if (status !== 'all' && status !== 'deleted') {\n conditions.push('c.status = ?')\n params.push(status)\n } else if (status === 'deleted') {\n conditions.push(\"c.status = 'deleted'\")\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n JOIN collections col ON c.collection_id = col.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalItems = countResult?.count || 0\n\n // Get content items\n const contentStmt = db.prepare(`\n SELECT c.id, c.title, c.slug, c.status, c.created_at, c.updated_at,\n col.name as collection_name, col.display_name as collection_display_name,\n u.first_name, u.last_name, u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n const { results } = await contentStmt.bind(...params, limit, offset).all()\n\n // Process content items\n const contentItems = (results || []).map((row: any) => {\n const statusConfig: Record = {\n draft: {\n class: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-1 ring-inset ring-zinc-600/20 dark:ring-zinc-500/20',\n text: 'Draft'\n },\n review: {\n class: 'bg-amber-50 dark:bg-amber-500/10 text-amber-700 dark:text-amber-400 ring-1 ring-inset ring-amber-600/20 dark:ring-amber-500/20',\n text: 'Under Review'\n },\n scheduled: {\n class: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-600/20 dark:ring-blue-500/20',\n text: 'Scheduled'\n },\n published: {\n class: 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-400 ring-1 ring-inset ring-green-600/20 dark:ring-green-500/20',\n text: 'Published'\n },\n archived: {\n class: 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-400 ring-1 ring-inset ring-purple-600/20 dark:ring-purple-500/20',\n text: 'Archived'\n },\n deleted: {\n class: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-600/20 dark:ring-red-500/20',\n text: 'Deleted'\n }\n }\n\n const config = statusConfig[row.status as keyof typeof statusConfig] || statusConfig.draft\n const statusBadge = `\n \n ${config?.text || row.status}\n \n `\n\n const authorName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.author_email || 'Unknown'\n\n const formattedDate = new Date(row.updated_at).toLocaleDateString()\n\n // Determine available workflow actions based on status\n const availableActions: string[] = []\n switch (row.status) {\n case 'draft':\n availableActions.push('submit_for_review', 'publish')\n break\n case 'review':\n availableActions.push('approve', 'request_changes')\n break\n case 'published':\n availableActions.push('unpublish', 'archive')\n break\n case 'scheduled':\n availableActions.push('unschedule')\n break\n }\n\n return {\n id: row.id,\n title: row.title,\n slug: row.slug,\n modelName: row.collection_display_name,\n statusBadge,\n authorName,\n formattedDate,\n availableActions\n }\n })\n\n const pageData: ContentListPageData = {\n modelName,\n status,\n page,\n search,\n models,\n contentItems,\n totalItems,\n itemsPerPage: limit,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentListPage(pageData))\n } catch (error) {\n console.error('Error fetching content list:', error)\n return c.html(`

Error loading content: ${error}

`)\n }\n})\n\n// New content form\nadminContentRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const collectionId = url.searchParams.get('collection')\n\n if (!collectionId) {\n // Show collection selection page\n const db = c.env.DB\n // Exclude form-sourced collections — users shouldn't manually create content in form collections\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name, description FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results } = await collectionsStmt.all()\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description\n }))\n\n // Render collection selection page\n const selectionHTML = `\n \n \n \n Select Collection - SonicJS AI Admin\n \n \n \n
\n
\n

Create New Content

\n

Select a collection to create content in:

\n \n
\n ${collections.map(collection => `\n \n

${collection.display_name}

\n

${collection.description || 'No description'}

\n
\n `).join('')}\n
\n \n \n
\n
\n \n \n `\n\n return c.html(selectionHTML)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n console.log('[Content Form /new] Editor plugins status:', {\n tinymce: tinymceEnabled,\n quill: quillEnabled,\n mdxeditor: mdxeditorEnabled,\n mdxeditorSettings\n })\n\n const formData: ContentFormData = {\n collection,\n fields,\n isEdit: false,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading new content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content form.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Edit content form\nadminContentRoutes.get('/:id/edit', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n\n // Capture referrer parameters to preserve filters when returning to list\n const referrerParams = url.searchParams.get('ref') || ''\n\n // Get content with caching\n const cache = getCacheService(CACHE_CONFIGS.content!)\n const content = await cache.getOrSet(\n cache.generateKey('content', id),\n async () => {\n const contentStmt = db.prepare(`\n SELECT c.*, col.id as collection_id, col.name as collection_name,\n col.display_name as collection_display_name, col.description as collection_description,\n col.schema as collection_schema\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n return await contentStmt.bind(id).first() as any\n }\n )\n\n if (!content) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Content not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const collection = {\n id: content.collection_id,\n name: content.collection_name,\n display_name: content.collection_display_name,\n description: content.collection_description,\n schema: content.collection_schema ? JSON.parse(content.collection_schema) : {}\n }\n\n const fields = await getCollectionFields(db, content.collection_id)\n const contentData = content.data ? JSON.parse(content.data) : {}\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n const formData: ContentFormData = {\n id: content.id,\n title: content.title,\n slug: content.slug,\n created_at: content.created_at,\n updated_at: content.updated_at,\n published_at: content.published_at,\n data: contentData,\n status: content.status,\n scheduled_publish_at: content.scheduled_publish_at,\n scheduled_unpublish_at: content.scheduled_unpublish_at,\n review_status: content.review_status,\n meta_title: content.meta_title,\n meta_description: content.meta_description,\n collection,\n fields,\n isEdit: true,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n referrerParams,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading edit content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content for editing.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Create content\nadminContentRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n const action = formData.get('action') as string\n\n if (!collectionId) {\n return c.html(html`\n
\n Collection ID is required.\n
\n `)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n // Check for validation errors\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Generate slug if not provided\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || 'draft'\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Create content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n // Invalidate collection content list cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n\n // Create initial version\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n contentId,\n 1,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n contentId,\n 'created',\n 'none',\n status,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${contentId}/edit?success=Content saved successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content created successfully!`\n : `/admin/content?collection=${collectionId}&success=Content created successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error creating content:', error)\n return c.html(html`\n
\n Failed to create content. Please try again.\n
\n `)\n }\n})\n\n// Update content\nadminContentRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const formData = await c.req.formData()\n const action = formData.get('action') as string\n\n const db = c.env.DB\n\n // Get existing content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existingContent = await contentStmt.bind(id).first() as any\n\n if (!existingContent) {\n return c.html(html`\n
\n Content not found.\n
\n `)\n }\n\n const collection = await getCollection(db, existingContent.collection_id)\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, existingContent.collection_id)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n id,\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Update slug if title changed\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || existingContent.status\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Update content\n const now = Date.now()\n\n const updateStmt = db.prepare(`\n UPDATE content SET\n slug = ?, title = ?, data = ?, status = ?,\n scheduled_publish_at = ?, scheduled_unpublish_at = ?,\n meta_title = ?, meta_description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n scheduledPublishAt ? new Date(scheduledPublishAt).getTime() : null,\n scheduledUnpublishAt ? new Date(scheduledUnpublishAt).getTime() : null,\n data.meta_title || null,\n data.meta_description || null,\n now,\n id\n ).run()\n\n // Invalidate content cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existingContent.collection_id}:*`)\n\n // Create new version if content changed\n const existingData = JSON.parse(existingContent.data || '{}')\n if (JSON.stringify(existingData) !== JSON.stringify(data)) {\n // Get next version number\n const versionCountStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const versionResult = await versionCountStmt.bind(id).first() as any\n const nextVersion = (versionResult?.max_version || 0) + 1\n\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Log workflow action if status changed\n if (status !== existingContent.status) {\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'status_changed',\n existingContent.status,\n status,\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${id}/edit?success=Content updated successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content updated successfully!`\n : `/admin/content?collection=${existingContent.collection_id}&success=Content updated successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error updating content:', error)\n return c.html(html`\n
\n Failed to update content. Please try again.\n
\n `)\n }\n})\n\n// Content preview\nadminContentRoutes.post('/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html('

Collection not found

')\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract field data for preview (skip validation)\n const { data } = extractFieldData(fields, formData, { skipValidation: true })\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeStatus = escapeHtml(String(formData.get('status') || 'draft'))\n const safeMetaDesc = data.meta_description ? escapeHtml(data.meta_description) : ''\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Preview: ${safeTitle}\n \n \n \n

${safeTitle}

\n
\n Collection: ${escapeHtml(collection.display_name)}
\n Status: ${safeStatus}
\n ${safeMetaDesc ? `Description: ${safeMetaDesc}
` : ''}\n
\n
\n ${safeContent}\n
\n\n

All Fields:

\n \n \n ${fields.map(field => `\n \n \n \n \n `).join('')}\n
FieldValue
${escapeHtml(field.field_label)}${data[field.field_name] ? escapeHtml(String(data[field.field_name])) : 'empty'}
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating preview:', error)\n return c.html('

Error generating preview

')\n }\n})\n\n// Duplicate content\nadminContentRoutes.post('/duplicate', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const originalId = formData.get('id') as string\n\n if (!originalId) {\n return c.json({ success: false, error: 'Content ID required' })\n }\n\n const db = c.env.DB\n\n // Get original content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const original = await contentStmt.bind(originalId).first() as any\n\n if (!original) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n // Create duplicate\n const newId = crypto.randomUUID()\n const now = Date.now()\n const originalData = JSON.parse(original.data || '{}')\n\n // Modify title to indicate it's a copy\n originalData.title = `${originalData.title || 'Untitled'} (Copy)`\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n newId,\n original.collection_id,\n `${original.slug}-copy-${Date.now()}`,\n originalData.title,\n JSON.stringify(originalData),\n 'draft', // Always start as draft\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n return c.json({ success: true, id: newId })\n } catch (error) {\n console.error('Error duplicating content:', error)\n return c.json({ success: false, error: 'Failed to duplicate content' })\n }\n})\n\n// Get bulk actions modal\nadminContentRoutes.get('/bulk-actions', async (c) => {\n const bulkActionsModal = `\n
\n
\n
\n

Bulk Actions

\n \n
\n

\n Select items from the table below to perform bulk actions.\n

\n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n Move to Draft\n \n \n \n \n \n Delete Selected\n \n
\n
\n
\n \n `\n\n return c.html(bulkActionsModal)\n})\n\n// Perform bulk action\nadminContentRoutes.post('/bulk-action', async (c) => {\n try {\n const user = c.get('user')\n const body = await c.req.json()\n const { action, ids } = body\n\n if (!action || !ids || ids.length === 0) {\n return c.json({ success: false, error: 'Action and IDs required' })\n }\n\n const db = c.env.DB\n const now = Date.now()\n\n if (action === 'delete') {\n // Soft delete by setting status to 'deleted'\n const placeholders = ids.map(() => '?').join(',')\n const stmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(now, ...ids).run()\n } else if (action === 'publish' || action === 'draft') {\n // Update status\n const placeholders = ids.map(() => '?').join(',')\n const publishedAt = action === 'publish' ? now : null\n const stmt = db.prepare(`\n UPDATE content\n SET status = ?, published_at = ?, updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(action, publishedAt, now, ...ids).run()\n } else {\n return c.json({ success: false, error: 'Invalid action' })\n }\n\n // Invalidate cache for all affected content items\n const cache = getCacheService(CACHE_CONFIGS.content!)\n for (const contentId of ids) {\n await cache.delete(cache.generateKey('content', contentId))\n }\n // Also invalidate list caches (they contain content from potentially multiple collections)\n await cache.invalidate('content:list:*')\n\n return c.json({ success: true, count: ids.length })\n } catch (error) {\n console.error('Bulk action error:', error)\n return c.json({ success: false, error: 'Failed to perform bulk action' })\n }\n})\n\n// Delete content\nadminContentRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const user = c.get('user')\n\n // Check if content exists\n const contentStmt = db.prepare('SELECT id, title FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.json({ success: false, error: 'Content not found' }, 404)\n }\n\n // Soft delete by setting status to 'deleted'\n const now = Date.now()\n const deleteStmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id = ?\n `)\n await deleteStmt.bind(now, id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate('content:list:*')\n\n // Return success - let HTMX reload the page\n return c.html(`\n
\n
\n
\n \n \n \n

Content deleted successfully. Refreshing...

\n
\n
\n
\n `)\n } catch (error) {\n console.error('Delete content error:', error)\n return c.json({ success: false, error: 'Failed to delete content' }, 500)\n }\n})\n\n// Get version history\nadminContentRoutes.get('/:id/versions', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.html('

Content not found

')\n }\n\n // Get all versions with author info\n const versionsStmt = db.prepare(`\n SELECT cv.*, u.first_name, u.last_name, u.email\n FROM content_versions cv\n LEFT JOIN users u ON cv.author_id = u.id\n WHERE cv.content_id = ?\n ORDER BY cv.version DESC\n `)\n const { results } = await versionsStmt.bind(id).all()\n\n const versions: ContentVersion[] = (results || []).map((row: any) => ({\n id: row.id,\n version: row.version,\n data: JSON.parse(row.data || '{}'),\n author_id: row.author_id,\n author_name: row.first_name && row.last_name ? `${row.first_name} ${row.last_name}` : row.email,\n created_at: row.created_at,\n is_current: false // Will be set below\n }))\n\n // Mark the latest version as current\n if (versions.length > 0) {\n versions[0]!.is_current = true\n }\n\n const data: VersionHistoryData = {\n contentId: id,\n versions,\n currentVersion: versions.length > 0 ? versions[0]!.version : 1\n }\n\n return c.html(renderVersionHistory(data))\n } catch (error) {\n console.error('Error loading version history:', error)\n return c.html('

Error loading version history

')\n }\n})\n\n// Restore version\nadminContentRoutes.post('/:id/restore/:version', async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const user = c.get('user')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT * FROM content_versions \n WHERE content_id = ? AND version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.json({ success: false, error: 'Version not found' })\n }\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const currentContent = await contentStmt.bind(id).first() as any\n\n if (!currentContent) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n const restoredData = JSON.parse(versionData.data)\n const now = Date.now()\n\n // Update content with restored data\n const updateStmt = db.prepare(`\n UPDATE content SET\n title = ?, data = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n restoredData.title || 'Untitled',\n versionData.data,\n now,\n id\n ).run()\n\n // Create new version for the restoration\n const nextVersionStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const nextVersionResult = await nextVersionStmt.bind(id).first() as any\n const nextVersion = (nextVersionResult?.max_version || 0) + 1\n\n const newVersionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await newVersionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n versionData.data,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, comment, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'version_restored',\n currentContent.status,\n currentContent.status,\n user?.userId || 'unknown',\n `Restored to version ${version}`,\n now\n ).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error restoring version:', error)\n return c.json({ success: false, error: 'Failed to restore version' })\n }\n})\n\n// Preview specific version\nadminContentRoutes.get('/:id/version/:version/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT cv.*, c.collection_id, col.display_name as collection_name\n FROM content_versions cv\n JOIN content c ON cv.content_id = c.id\n JOIN collections col ON c.collection_id = col.id\n WHERE cv.content_id = ? AND cv.version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.html('

Version not found

')\n }\n\n const data = JSON.parse(versionData.data || '{}')\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n const safeExcerpt = data.excerpt ? escapeHtml(data.excerpt) : ''\n const safeCollectionName = escapeHtml(versionData.collection_name || '')\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Version ${version} Preview: ${safeTitle}\n \n \n \n
\n Version ${version}\n Collection: ${safeCollectionName}
\n Created: ${new Date(versionData.created_at).toLocaleString()}
\n This is a historical version preview\n
\n\n

${safeTitle}

\n\n
\n ${safeContent}\n
\n\n ${safeExcerpt ? `

Excerpt:

${safeExcerpt}

` : ''}\n\n

All Field Data:

\n
\n${escapeHtml(JSON.stringify(data, null, 2))}\n        
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating version preview:', error)\n return c.html('

Error generating preview

')\n }\n})\nexport default adminContentRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserProfile {\n id: string\n email: string\n username: string\n first_name: string\n last_name: string\n phone?: string\n bio?: string\n avatar_url?: string\n timezone: string\n language: string\n theme: string\n email_notifications: boolean\n two_factor_enabled: boolean\n role: string\n created_at: number\n last_login_at?: number\n}\n\nexport interface ProfilePageData {\n profile: UserProfile\n timezones: Array<{ value: string; label: string }>\n languages: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderAvatarImage(avatarUrl: string | undefined, firstName: string, lastName: string): string {\n return `
\n ${avatarUrl\n ? `\"Profile`\n : `${firstName.charAt(0)}${lastName.charAt(0)}`\n }\n
`\n}\n\nexport function renderProfilePage(data: ProfilePageData): string {\n const pageContent = `\n
\n \n
\n
\n

User Profile

\n

\n Manage your account settings and preferences\n

\n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n \n
\n
\n \n
\n
\n
\n \n \n \n
\n
\n

Profile Information

\n

Update your account details

\n
\n
\n
\n\n \n
\n
\n\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n ${data.profile.bio || ''}\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Preferences

\n\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Notifications

\n\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n \n

Receive email updates about new features and product announcements.

\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Update Profile\n \n
\n
\n
\n
\n\n \n
\n \n
\n

Profile Picture

\n\n
\n ${renderAvatarImage(data.profile.avatar_url, data.profile.first_name, data.profile.last_name)}\n\n
\n \n \n \n \n \n \n Change Picture\n \n \n\n
\n
\n
\n\n \n
\n

Account Information

\n\n
\n
\n
Role
\n
\n \n ${data.profile.role}\n \n
\n
\n
\n
Member Since
\n
${new Date(data.profile.created_at).toLocaleDateString()}
\n
\n ${data.profile.last_login_at ? `\n
\n
Last Login
\n
${new Date(data.profile.last_login_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Two-Factor Auth
\n
\n ${data.profile.two_factor_enabled\n ? 'Enabled'\n : 'Disabled'\n }\n
\n
\n
\n
\n\n \n
\n

Security

\n\n
\n \n \n \n \n Change Password\n \n\n \n \n \n \n ${data.profile.two_factor_enabled ? 'Disable' : 'Enable'} 2FA\n \n
\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Change Password

\n \n
\n
\n\n
\n
\n\n
\n \n \n
\n\n
\n \n \n

Must be at least 8 characters

\n
\n\n
\n \n \n
\n\n
\n \n Cancel\n \n \n \n \n \n Update Password\n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'User Profile',\n pageTitle: 'Profile',\n currentPath: '/admin/profile',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { escapeHtml } from '../../utils/sanitize'\n\nexport type AlertType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface AlertData {\n type: AlertType\n title?: string\n message: string\n dismissible?: boolean\n className?: string\n icon?: boolean\n}\n\nexport function renderAlert(data: AlertData): string {\n const typeClasses = {\n success: 'bg-green-50 dark:bg-green-500/10 border border-green-600/20 dark:border-green-500/20',\n error: 'bg-error/10 border border-red-600/20 dark:border-red-500/20',\n warning: 'bg-amber-50 dark:bg-amber-500/10 border border-amber-600/20 dark:border-amber-500/20',\n info: 'bg-blue-50 dark:bg-blue-500/10 border border-blue-600/20 dark:border-blue-500/20'\n }\n\n const iconClasses = {\n success: 'text-green-600 dark:text-green-400',\n error: 'text-red-600 dark:text-red-400',\n warning: 'text-amber-600 dark:text-amber-400',\n info: 'text-blue-600 dark:text-blue-400'\n }\n\n const textClasses = {\n success: 'text-green-900 dark:text-green-300',\n error: 'text-red-900 dark:text-red-300',\n warning: 'text-amber-900 dark:text-amber-300',\n info: 'text-blue-900 dark:text-blue-300'\n }\n\n const messageTextClasses = {\n success: 'text-green-700 dark:text-green-400',\n error: 'text-red-700 dark:text-red-400',\n warning: 'text-amber-700 dark:text-amber-400',\n info: 'text-blue-700 dark:text-blue-400'\n }\n\n const icons = {\n success: ``,\n error: ``,\n warning: ``,\n info: ``\n }\n\n return `\n
\n
\n ${data.icon !== false ? `\n
\n \n ${icons[data.type]}\n \n
\n ` : ''}\n
\n ${data.title ? `\n

\n ${escapeHtml(data.title)}\n

\n ` : ''}\n
\n

${escapeHtml(data.message)}

\n
\n
\n ${data.dismissible ? `\n
\n
\n \n Dismiss\n \n \n \n \n
\n
\n ` : ''}\n
\n
\n `\n}\n\nexport function renderSuccessAlert(message: string, title?: string): string {\n return renderAlert({ type: 'success', message, title })\n}\n\nexport function renderErrorAlert(message: string, title?: string): string {\n return renderAlert({ type: 'error', message, title })\n}\n\nexport function renderWarningAlert(message: string, title?: string): string {\n return renderAlert({ type: 'warning', message, title })\n}\n\nexport function renderInfoAlert(message: string, title?: string): string {\n return renderAlert({ type: 'info', message, title })\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\n\nexport interface ActivityLog {\n id: string\n user_id: string\n action: string\n resource_type?: string\n resource_id?: string\n details?: any\n ip_address?: string\n user_agent?: string\n created_at: number\n user_email?: string\n user_name?: string\n}\n\nexport interface ActivityLogsPageData {\n logs: ActivityLog[]\n pagination: {\n page: number\n limit: number\n total: number\n pages: number\n }\n filters: {\n user_id?: string\n action?: string\n resource_type?: string\n date_from?: string\n date_to?: string\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderActivityLogsPage(data: ActivityLogsPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Activity Logs

\n

Monitor user actions and system activity

\n
\n
\n\n \n \n\n \n
\n

Filters

\n \n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n Clear Filters\n \n
\n
\n
\n\n \n
\n
\n
\n
\n

Recent Activity

\n
\n Showing ${data.logs.length} of ${data.pagination.total} logs\n
\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${data.logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimestampUserActionResourceIP AddressDetails
\n ${new Date(log.created_at).toLocaleString()}\n \n
${log.user_name || 'Unknown'}
\n
${log.user_email || 'N/A'}
\n
\n \n ${formatAction(log.action)}\n \n \n ${log.resource_type ? `\n
${log.resource_type}
\n ${log.resource_id ? `
${log.resource_id}
` : ''}\n ` : 'N/A'}\n
\n ${log.ip_address || 'N/A'}\n \n ${log.details ? `\n
\n View Details\n
${JSON.stringify(log.details, null, 2)}
\n
\n ` : 'N/A'}\n
\n
\n\n ${data.logs.length === 0 ? `\n
\n \n \n \n

No activity logs found

\n

Try adjusting your filters or check back later.

\n
\n ` : ''}\n\n \n ${data.pagination.pages > 1 ? `\n
\n
\n Page ${data.pagination.page} of ${data.pagination.pages} (${data.pagination.total} total logs)\n
\n \n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutData = {\n title: 'Activity Logs',\n pageTitle: 'Activity Logs',\n currentPath: '/admin/activity-logs',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction getActionBadgeClass(action: string): string {\n if (action.includes('login') || action.includes('logout')) {\n return 'bg-blue-500/20 text-blue-300'\n } else if (action.includes('create') || action.includes('invite')) {\n return 'bg-green-500/20 text-green-300'\n } else if (action.includes('update') || action.includes('change')) {\n return 'bg-yellow-500/20 text-yellow-300'\n } else if (action.includes('delete') || action.includes('cancel')) {\n return 'bg-red-500/20 text-red-300'\n } else {\n return 'bg-gray-500/20 text-gray-300'\n }\n}\n\nfunction formatAction(action: string): string {\n // Convert action from dot notation to readable format\n return action\n .split('.')\n .map(part => part.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()))\n .join(' - ')\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface UserProfileData {\n displayName?: string\n bio?: string\n company?: string\n jobTitle?: string\n website?: string\n location?: string\n dateOfBirth?: number\n}\n\nexport interface UserEditData {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n phone?: string\n avatarUrl?: string\n role: string\n isActive: boolean\n emailVerified: boolean\n twoFactorEnabled: boolean\n createdAt: number\n lastLoginAt?: number\n profile?: UserProfileData\n}\n\nexport interface UserEditPageData {\n userToEdit: UserEditData\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserEditPage(data: UserEditPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Edit User

\n
\n

Update user account and permissions

\n
\n
\n \n \n \n \n Save Changes\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Profile Information

\n

Extended profile data for this user

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n
\n\n
\n \n ${escapeHtml(data.userToEdit.profile?.bio || '')}\n
\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Set Password

\n

Leave blank to keep the current password

\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User has verified their email address

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

User Details

\n
\n
\n
User ID
\n
${data.userToEdit.id}
\n
\n
\n
Created
\n
${new Date(data.userToEdit.createdAt).toLocaleDateString()}
\n
\n ${data.userToEdit.lastLoginAt ? `\n
\n
Last Login
\n
${new Date(data.userToEdit.lastLoginAt).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Status
\n
\n ${data.userToEdit.isActive\n ? 'Active'\n : 'Inactive'\n }\n
\n
\n ${data.userToEdit.twoFactorEnabled ? `\n
\n
Security
\n
\n 2FA Enabled\n
\n
\n ` : ''}\n
\n
\n\n \n
\n

Danger Zone

\n

Irreversible and destructive actions

\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Permanently remove from database. Unchecked performs soft delete (deactivate only).

\n
\n
\n\n \n \n \n \n Delete User\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-user-confirm',\n title: 'Delete User',\n message: 'Are you sure you want to delete this user? Check the \"Hard Delete\" option to permanently remove all data from the database. This action cannot be undone!',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteUser()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Edit User',\n pageTitle: `Edit User - ${data.userToEdit.firstName} ${data.userToEdit.lastName}`,\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export interface ConfirmationDialogOptions {\n id: string\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmClass?: string\n iconColor?: 'red' | 'yellow' | 'blue'\n onConfirm?: string // JavaScript code to execute on confirm\n}\n\nexport function renderConfirmationDialog(options: ConfirmationDialogOptions): string {\n const {\n id,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmClass = 'bg-red-500 hover:bg-red-400',\n iconColor = 'red',\n onConfirm = ''\n } = options\n\n const iconColorClasses = {\n red: 'bg-red-500/10 text-red-400',\n yellow: 'bg-yellow-500/10 text-yellow-400',\n blue: 'bg-blue-500/10 text-blue-400'\n }\n\n return `\n \n \n \n\n
\n \n
\n
\n \n \n \n
\n
\n

${title}

\n
\n

${message}

\n
\n
\n
\n
\n \n ${confirmText}\n \n \n ${cancelText}\n \n
\n
\n
\n \n
\n `\n}\n\n/**\n * Helper function to show a confirmation dialog programmatically\n * Usage in templates: Add this script and call showConfirmDialog()\n */\nexport function getConfirmationDialogScript(): string {\n return `\n \n \n `\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserNewPageData {\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserNewPage(data: UserNewPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Create New User

\n
\n

Add a new user account to the system

\n
\n
\n \n \n \n \n Create User\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n\n
\n \n \n
\n
\n\n \n
\n

Password

\n
\n
\n \n \n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Mark email as verified

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

Creating a User

\n
\n

Fill in the required fields marked with * to create a new user account.

\n

The password must be at least 8 characters long.

\n

By default, new users are created as active and can sign in immediately.

\n

You can edit user details and permissions after creation.

\n
\n
\n\n \n
\n

Role Descriptions

\n
\n
\n
Administrator
\n
Full system access and permissions
\n
\n
\n
Editor
\n
Can create and edit content
\n
\n
\n
Author
\n
Can create own content
\n
\n
\n
Viewer
\n
Read-only access
\n
\n
\n
\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create User',\n pageTitle: 'Create New User',\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderAlert } from '../alert.template'\nimport { renderTable, TableColumn, TableData } from '../table.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface User {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n role: string\n avatar?: string\n isActive: boolean\n lastLoginAt?: number\n createdAt: number\n updatedAt: number\n formattedLastLogin?: string\n formattedCreatedAt?: string\n}\n\nexport interface UsersListPageData {\n users: User[]\n pagination?: PaginationData\n currentPage: number\n totalPages: number\n totalUsers: number\n statusFilter?: string\n roleFilter?: string\n searchFilter?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderUsersListPage(data: UsersListPageData): string {\n const columns: TableColumn[] = [\n {\n key: 'avatar',\n label: '',\n className: 'w-12',\n sortable: false,\n render: (value: string | null, row: User) => {\n const initials = `${row.firstName.charAt(0)}${row.lastName.charAt(0)}`.toUpperCase()\n if (value) {\n return `\"${row.firstName}`\n }\n return `\n
\n ${initials}\n
\n `\n }\n },\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, row: User) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n \n const truncatedFirstName = row.firstName.length > 25 ? row.firstName.substring(0, 25) + '...' : row.firstName\n const truncatedLastName = row.lastName.length > 25 ? row.lastName.substring(0, 25) + '...' : row.lastName\n const fullName = escapeHtml(`${truncatedFirstName} ${truncatedLastName}`)\n const truncatedUsername = row.username.length > 100 ? row.username.substring(0, 100) + '...' : row.username\n const username = escapeHtml(truncatedUsername)\n const statusBadge = row.isActive ?\n 'Active' :\n 'Inactive'\n return `\n
\n
${fullName}${statusBadge}
\n
@${username}
\n
\n `\n }\n },\n {\n key: 'email',\n label: 'Email',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n const escapedEmail = escapeHtml(value)\n return `${escapedEmail}`\n }\n },\n {\n key: 'role',\n label: 'Role',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const roleColors = {\n admin: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-700/10 dark:ring-red-500/20',\n editor: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-700/10 dark:ring-blue-500/20',\n author: 'bg-cyan-50 dark:bg-cyan-500/10 text-cyan-700 dark:text-cyan-400 ring-1 ring-inset ring-cyan-700/10 dark:ring-cyan-500/20',\n viewer: 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n }\n const colorClass = roleColors[value as keyof typeof roleColors] || 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n return `${value.charAt(0).toUpperCase() + value.slice(1)}`\n }\n },\n {\n key: 'lastLoginAt',\n label: 'Last Login',\n sortable: true,\n sortType: 'date',\n render: (value: number | null) => {\n if (!value) return 'Never'\n return `${new Date(value).toLocaleDateString()}`\n }\n },\n {\n key: 'createdAt',\n label: 'Created',\n sortable: true,\n sortType: 'date',\n render: (value: number) => `${new Date(value).toLocaleDateString()}`\n },\n {\n key: 'actions',\n label: 'Actions',\n className: 'text-right',\n sortable: false,\n render: (_value: any, row: User) => `\n
\n ${row.isActive ?\n `` :\n ``\n }\n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'users-table',\n columns,\n rows: data.users,\n selectable: false,\n rowClickable: true,\n rowClickUrl: (row: User) => `/admin/users/${row.id}/edit`,\n emptyMessage: 'No users found'\n }\n\n const pageContent = `\n
\n \n
\n
\n

User Management

\n

Manage user accounts and permissions

\n
\n
\n \n \n \n \n Add User\n \n \n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n

User Statistics

\n
\n
\n
Total Users
\n
\n
\n ${data.totalUsers}\n
\n
\n \n \n \n Increased by\n 5.2%\n
\n
\n
\n
\n
Active Users
\n
\n
\n ${data.users.filter(u => u.isActive).length}\n
\n
\n \n \n \n Increased by\n 3.1%\n
\n
\n
\n
\n
Administrators
\n
\n
\n ${data.users.filter(u => u.role === 'admin').length}\n
\n
\n \n \n \n Increased by\n 1.8%\n
\n
\n
\n
\n
Active This Week
\n
\n
\n ${data.users.filter(u => u.lastLoginAt && u.lastLoginAt > Date.now() - 7 * 24 * 60 * 60 * 1000).length}\n
\n
\n \n \n \n Decreased by\n 2.3%\n
\n
\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n
\n
\n \n
\n \n
\n {\n input.focus();\n input.setSelectionRange(len, len);\n }, 10);\n }\n \"\n >\n \n
\n \n \n \n
\n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n Clear Filters\n \n
\n
\n
\n
\n
\n
\n\n \n ${renderTable(tableData)}\n\n \n ${data.pagination ? renderPagination(data.pagination) : ''}\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'toggle-user-status-confirm',\n title: 'Toggle User Status',\n message: 'Are you sure you want to activate/deactivate this user?',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performToggleUserStatus()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Users',\n pageTitle: 'User Management',\n currentPath: '/admin/users',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n} ","import { Hono } from 'hono'\nimport { requireAuth, requireRole, logActivity, AuthManager } from '../middleware'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { renderProfilePage, renderAvatarImage, type UserProfile, type ProfilePageData } from '../templates/pages/admin-profile.template'\nimport { renderAlert } from '../templates/components/alert.template'\nimport { renderActivityLogsPage, type ActivityLogsPageData, type ActivityLog } from '../templates/pages/admin-activity-logs.template'\nimport { renderUserEditPage, type UserEditPageData, type UserEditData, type UserProfileData } from '../templates/pages/admin-user-edit.template'\nimport { renderUserNewPage, type UserNewPageData } from '../templates/pages/admin-user-new.template'\nimport { renderUsersListPage, type UsersListPageData, type User } from '../templates/pages/admin-users-list.template'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, renderCustomProfileSection, getCustomData, saveCustomData, extractCustomFieldsFromForm, sanitizeCustomData, validateCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst userRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware to all routes\nuserRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on user management routes\nuserRoutes.use('/users/*', requireRole(['admin']))\nuserRoutes.use('/users', requireRole(['admin']))\nuserRoutes.use('/invite-user', requireRole(['admin']))\nuserRoutes.use('/resend-invitation/*', requireRole(['admin']))\nuserRoutes.use('/cancel-invitation/*', requireRole(['admin']))\nuserRoutes.use('/activity-logs', requireRole(['admin']))\nuserRoutes.use('/activity-logs/*', requireRole(['admin']))\n\n// Redirect /admin to /admin/dashboard\nuserRoutes.get('/', (c) => {\n return c.redirect('/admin/dashboard')\n})\n\n// Timezone options for profile form\nconst TIMEZONES = [\n { value: 'UTC', label: 'UTC' },\n { value: 'America/New_York', label: 'Eastern Time' },\n { value: 'America/Chicago', label: 'Central Time' },\n { value: 'America/Denver', label: 'Mountain Time' },\n { value: 'America/Los_Angeles', label: 'Pacific Time' },\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Australia/Sydney', label: 'Sydney' }\n]\n\n// Language options for profile form\nconst LANGUAGES = [\n { value: 'en', label: 'English' },\n { value: 'es', label: 'Spanish' },\n { value: 'fr', label: 'French' },\n { value: 'de', label: 'German' },\n { value: 'it', label: 'Italian' },\n { value: 'pt', label: 'Portuguese' },\n { value: 'ja', label: 'Japanese' },\n { value: 'ko', label: 'Korean' },\n { value: 'zh', label: 'Chinese' }\n]\n\n// Role options for user form\nconst ROLES = [\n { value: 'admin', label: 'Administrator' },\n { value: 'editor', label: 'Editor' },\n { value: 'author', label: 'Author' },\n { value: 'viewer', label: 'Viewer' }\n]\n\n/**\n * GET /admin/profile - Show user profile page\n */\nuserRoutes.get('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n // Get user profile data\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n timezone, language, theme, email_notifications, two_factor_enabled,\n role, created_at, last_login_at\n FROM users \n WHERE id = ? AND is_active = 1\n `)\n \n const userProfile = await userStmt.bind(user!.userId).first() as any\n\n if (!userProfile) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Convert to UserProfile interface\n const profile: UserProfile = {\n id: userProfile.id,\n email: userProfile.email,\n username: userProfile.username || '',\n first_name: userProfile.first_name || '',\n last_name: userProfile.last_name || '',\n phone: userProfile.phone,\n bio: userProfile.bio,\n avatar_url: userProfile.avatar_url,\n timezone: userProfile.timezone || 'UTC',\n language: userProfile.language || 'en',\n theme: userProfile.theme || 'dark',\n email_notifications: Boolean(userProfile.email_notifications),\n two_factor_enabled: Boolean(userProfile.two_factor_enabled),\n role: userProfile.role,\n created_at: userProfile.created_at,\n last_login_at: userProfile.last_login_at\n }\n\n // Get custom profile data\n const customData = await getCustomData(db, user!.userId)\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n const pageData: ProfilePageData = {\n profile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n customProfileFieldsHtml,\n user: {\n name: `${profile.first_name} ${profile.last_name}`.trim() || profile.username || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n } catch (error) {\n console.error('Profile page error:', error)\n \n const pageData: ProfilePageData = {\n profile: {} as UserProfile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n error: 'Failed to load profile. Please try again.',\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n }\n})\n\n/**\n * PUT /admin/profile - Update user profile\n */\nuserRoutes.put('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const timezone = formData.get('timezone')?.toString() || 'UTC'\n const language = formData.get('language')?.toString() || 'en'\n const emailNotifications = formData.get('email_notifications') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please enter a valid email address.',\n dismissible: true \n }))\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users \n WHERE (username = ? OR email = ?) AND id != ? AND is_active = 1\n `)\n const existingUser = await checkStmt.bind(username, email, user!.userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Username or email is already taken by another user!.',\n dismissible: true \n }))\n }\n\n // Update user profile\n const updateStmt = db.prepare(`\n UPDATE users SET \n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, bio = ?, timezone = ?, language = ?,\n email_notifications = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, bio, timezone, language,\n emailNotifications ? 1 : 0, Date.now(),\n user!.userId\n ).run()\n\n // Save custom profile fields\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n await saveCustomData(db, user!.userId, sanitized)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.update', 'users', user!.userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'bio', 'timezone', 'language', 'email_notifications'] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success', \n message: 'Profile updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Profile update error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update profile. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/avatar - Upload user avatar\n */\nuserRoutes.post('/profile/avatar', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n const avatarFile = formData.get('avatar') as File | null\n\n if (!avatarFile || typeof avatarFile === 'string' || !avatarFile.name) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please select an image file.',\n dismissible: true\n }))\n }\n\n // Validate file type\n const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']\n if (!allowedTypes.includes(avatarFile.type)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please upload a valid image file (JPEG, PNG, GIF, or WebP).',\n dismissible: true \n }))\n }\n\n // Validate file size (5MB max)\n const maxSize = 5 * 1024 * 1024\n if (avatarFile.size > maxSize) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Image file must be smaller than 5MB.',\n dismissible: true \n }))\n }\n\n // For now, we'll simulate storing the avatar\n // In a real implementation, you'd upload to cloud storage (R2, S3, etc.)\n const avatarUrl = `/uploads/avatars/${user!.userId}-${Date.now()}.${avatarFile.type.split('/')[1]}`\n\n // Update user avatar URL in database\n const updateStmt = db.prepare(`\n UPDATE users SET avatar_url = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(avatarUrl, Date.now(), user!.userId).run()\n\n // Get updated user data to render the avatar\n const userStmt = db.prepare(`\n SELECT first_name, last_name FROM users WHERE id = ?\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.avatar_update', 'users', user!.userId,\n { avatar_url: avatarUrl },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return both the alert message and the updated avatar image using HTMX out-of-band swap\n const alertHtml = renderAlert({\n type: 'success',\n message: 'Profile picture updated successfully!',\n dismissible: true\n })\n\n // Add timestamp to avatar URL to bust cache\n const avatarUrlWithCache = `${avatarUrl}?t=${Date.now()}`\n const avatarImageHtml = renderAvatarImage(avatarUrlWithCache, userData.first_name, userData.last_name)\n\n // Use hx-swap-oob to update the avatar image container\n const avatarImageWithOob = avatarImageHtml.replace(\n 'id=\"avatar-image-container\"',\n 'id=\"avatar-image-container\" hx-swap-oob=\"true\"'\n )\n\n return c.html(alertHtml + avatarImageWithOob)\n\n } catch (error) {\n console.error('Avatar upload error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to upload profile picture. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/password - Change user password\n */\nuserRoutes.post('/profile/password', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n \n const currentPassword = formData.get('current_password')?.toString() || ''\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Validate input\n if (!currentPassword || !newPassword || !confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'All password fields are required.',\n dismissible: true \n }))\n }\n\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New passwords do not match.',\n dismissible: true \n }))\n }\n\n if (newPassword.length < 8) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New password must be at least 8 characters long.',\n dismissible: true \n }))\n }\n\n // Get current user data\n const userStmt = db.prepare(`\n SELECT password_hash FROM users WHERE id = ? AND is_active = 1\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n if (!userData) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'User not found.',\n dismissible: true \n }))\n }\n\n // Verify current password\n const validPassword = await AuthManager.verifyPassword(currentPassword, userData.password_hash)\n if (!validPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Current password is incorrect.',\n dismissible: true \n }))\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(newPassword)\n\n // Store old password in history\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user!.userId,\n userData.password_hash,\n Date.now()\n ).run()\n\n // Update user password\n const updateStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(newPasswordHash, Date.now(), user!.userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.password_change', 'users', user!.userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({ \n type: 'success', \n message: 'Password updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Password change error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update password. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * GET /admin/users - List all users\n * Returns HTML for browser requests and JSON for API requests\n * Note: Already protected by requireAuth() and requireRole(['admin', 'editor'])\n */\nuserRoutes.get('/users', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '20')\n const search = c.req.query('search') || ''\n const roleFilter = c.req.query('role') || ''\n const statusFilter = c.req.query('status') || 'active'\n const offset = (page - 1) * limit\n\n // Build search query\n let whereClause = ''\n let params: any[] = []\n\n // Handle status filter\n if (statusFilter === 'active') {\n whereClause = 'WHERE u.is_active = 1'\n } else if (statusFilter === 'inactive') {\n whereClause = 'WHERE u.is_active = 0'\n } else {\n // 'all' - no filter\n whereClause = 'WHERE 1=1'\n }\n\n if (search) {\n whereClause += ' AND (u.first_name LIKE ? OR u.last_name LIKE ? OR u.email LIKE ? OR u.username LIKE ?)'\n const searchParam = `%${search}%`\n params.push(searchParam, searchParam, searchParam, searchParam)\n }\n\n if (roleFilter) {\n whereClause += ' AND u.role = ?'\n params.push(roleFilter)\n }\n\n // Get users\n const usersStmt = db.prepare(`\n SELECT u.id, u.email, u.username, u.first_name, u.last_name,\n u.role, u.avatar_url, u.created_at, u.last_login_at, u.updated_at,\n u.email_verified, u.two_factor_enabled, u.is_active\n FROM users u\n ${whereClause}\n ORDER BY u.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: usersData } = await usersStmt.bind(...params, limit, offset).all()\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total FROM users u ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalUsers = countResult?.total || 0\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'users.list_view', 'users', undefined,\n { search, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Check if this is an API request (accept header contains 'application/json')\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n // Return JSON for API requests\n return c.json({\n users: usersData || [],\n pagination: {\n page,\n limit,\n total: totalUsers,\n pages: Math.ceil(totalUsers / limit)\n }\n })\n }\n\n // Return HTML for browser requests\n const users: User[] = (usersData || []).map((u: any) => ({\n id: u.id,\n email: u.email,\n username: u.username || '',\n firstName: u.first_name || '',\n lastName: u.last_name || '',\n role: u.role,\n avatar: u.avatar_url,\n isActive: Boolean(u.is_active),\n lastLoginAt: u.last_login_at,\n createdAt: u.created_at,\n updatedAt: u.updated_at,\n formattedLastLogin: u.last_login_at ? new Date(u.last_login_at).toLocaleDateString() : undefined,\n formattedCreatedAt: new Date(u.created_at).toLocaleDateString()\n }))\n\n const successMessage = c.req.query('success') || undefined\n\n const pageData: UsersListPageData = {\n users,\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalUsers,\n searchFilter: search,\n roleFilter,\n statusFilter,\n success: successMessage,\n pagination: {\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalItems: totalUsers,\n itemsPerPage: limit,\n startItem: offset + 1,\n endItem: Math.min(offset + limit, totalUsers),\n baseUrl: '/admin/users'\n },\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUsersListPage(pageData))\n\n } catch (error) {\n console.error('Users list error:', error)\n\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n return c.json({ error: 'Failed to load users' }, 500)\n }\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load users. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * GET /admin/users/new - Show new user creation page\n */\nuserRoutes.get('/users/new', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: UserNewPageData = {\n roles: ROLES,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserNewPage(pageData))\n } catch (error) {\n console.error('User new page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user creation page. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * POST /admin/users/new - Create new user\n */\nuserRoutes.post('/users/new', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const password = formData.get('password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email || !password) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, email, and password are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password\n if (password.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n\n if (password !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n\n // Check if username/email are already taken\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE username = ? OR email = ?\n `)\n const existingUser = await checkStmt.bind(username, email).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken.',\n dismissible: true\n }))\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Create user\n const userId = crypto.randomUUID()\n const createStmt = db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name, phone, bio,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createStmt.bind(\n userId, email, username, firstName, lastName, phone, bio,\n passwordHash, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.create', 'users', userId,\n { email, username, role },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Redirect to user list (use HX-Redirect for HTMX requests)\n c.header('HX-Redirect', '/admin/users?success=User created successfully')\n return c.body(null, 200)\n\n } catch (error) {\n console.error('User creation error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to create user!. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * GET /admin/users/:id - Get user by ID\n * Note: This endpoint returns users regardless of is_active status for admin purposes\n */\nuserRoutes.get('/users/:id', async (c) => {\n // Check if this is actually the edit route\n if (c.req.path.endsWith('/edit')) {\n return c.notFound()\n }\n\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (including inactive users for admin access)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userRecord = await userStmt.bind(userId).first() as any\n\n if (!userRecord) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.view', 'users', userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n user: {\n id: userRecord.id,\n email: userRecord.email,\n username: userRecord.username,\n first_name: userRecord.first_name,\n last_name: userRecord.last_name,\n phone: userRecord.phone,\n bio: userRecord.bio,\n avatar_url: userRecord.avatar_url,\n role: userRecord.role,\n is_active: userRecord.is_active,\n email_verified: userRecord.email_verified,\n two_factor_enabled: userRecord.two_factor_enabled,\n created_at: userRecord.created_at,\n last_login_at: userRecord.last_login_at\n }\n })\n\n } catch (error) {\n console.error('User fetch error:', error)\n return c.json({ error: 'Failed to fetch user' }, 500)\n }\n})\n\n/**\n * GET /admin/users/:id/edit - Show user edit page\n */\nuserRoutes.get('/users/:id/edit', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (removed bio - now in profile)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userToEdit = await userStmt.bind(userId).first() as any\n\n if (!userToEdit) {\n return c.html(renderAlert({\n type: 'error',\n message: 'User not found',\n dismissible: true\n }), 404)\n }\n\n // Get user profile data\n const profileStmt = db.prepare(`\n SELECT display_name, bio, company, job_title, website, location, date_of_birth, data\n FROM user_profiles\n WHERE user_id = ?\n `)\n const profileData = await profileStmt.bind(userId).first() as any\n\n // Convert profile to UserProfileData interface\n const profile: UserProfileData | undefined = profileData ? {\n displayName: profileData.display_name,\n bio: profileData.bio,\n company: profileData.company,\n jobTitle: profileData.job_title,\n website: profileData.website,\n location: profileData.location,\n dateOfBirth: profileData.date_of_birth\n } : undefined\n\n // Parse custom profile data\n let customData: Record = {}\n if (profileData?.data) {\n try { customData = JSON.parse(profileData.data) } catch {}\n }\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n // Convert to UserEditData interface\n const editData: UserEditData = {\n id: userToEdit.id,\n email: userToEdit.email,\n username: userToEdit.username || '',\n firstName: userToEdit.first_name || '',\n lastName: userToEdit.last_name || '',\n phone: userToEdit.phone,\n avatarUrl: userToEdit.avatar_url,\n role: userToEdit.role,\n isActive: Boolean(userToEdit.is_active),\n emailVerified: Boolean(userToEdit.email_verified),\n twoFactorEnabled: Boolean(userToEdit.two_factor_enabled),\n createdAt: userToEdit.created_at,\n lastLoginAt: userToEdit.last_login_at,\n profile\n }\n\n const pageData: UserEditPageData = {\n userToEdit: editData,\n roles: ROLES,\n customProfileFieldsHtml,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserEditPage(pageData))\n } catch (error) {\n console.error('User edit page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * PUT /admin/users/:id - Update user\n */\nuserRoutes.put('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Optional password change\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Extract profile fields\n const profileDisplayName = sanitizeInput(formData.get('profile_display_name')?.toString()) || null\n const profileBio = sanitizeInput(formData.get('profile_bio')?.toString()) || null\n const profileCompany = sanitizeInput(formData.get('profile_company')?.toString()) || null\n const profileJobTitle = sanitizeInput(formData.get('profile_job_title')?.toString()) || null\n const profileWebsite = formData.get('profile_website')?.toString()?.trim() || null\n const profileLocation = sanitizeInput(formData.get('profile_location')?.toString()) || null\n const profileDateOfBirthStr = formData.get('profile_date_of_birth')?.toString()?.trim() || null\n const profileDateOfBirth = profileDateOfBirthStr ? new Date(profileDateOfBirthStr).getTime() : null\n\n // Extract custom profile fields\n const profileConfig = getUserProfileConfig()\n let customDataJson: string | null = null\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n // Merge with existing custom data\n const existingCustom = await getCustomData(db, userId)\n const merged = { ...existingCustom, ...sanitized }\n customDataJson = JSON.stringify(merged)\n }\n\n // Validate required fields\n if (!username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password if provided\n if (newPassword) {\n if (newPassword.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n }\n\n // Validate website URL if provided\n if (profileWebsite) {\n try {\n new URL(profileWebsite)\n } catch {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid website URL.',\n dismissible: true\n }))\n }\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE (username = ? OR email = ?) AND id != ?\n `)\n const existingUser = await checkStmt.bind(username, email, userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken by another user.',\n dismissible: true\n }))\n }\n\n // Update user (removed bio - now in profile)\n const updateStmt = db.prepare(`\n UPDATE users SET\n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, role = ?, is_active = ?, email_verified = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), userId\n ).run()\n\n // Update password if provided\n if (newPassword) {\n const passwordHash = await AuthManager.hashPassword(newPassword)\n const updatePasswordStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?\n `)\n await updatePasswordStmt.bind(passwordHash, Date.now(), userId).run()\n }\n\n // Check if any profile field has data\n const hasProfileData = profileDisplayName || profileBio || profileCompany ||\n profileJobTitle || profileWebsite || profileLocation || profileDateOfBirth\n\n if (hasProfileData || customDataJson !== null) {\n const now = Date.now()\n\n // Check if profile exists\n const profileCheckStmt = db.prepare(`SELECT id FROM user_profiles WHERE user_id = ?`)\n const existingProfile = await profileCheckStmt.bind(userId).first() as any\n\n if (existingProfile) {\n // Update existing profile\n const updateProfileStmt = db.prepare(`\n UPDATE user_profiles SET\n display_name = ?, bio = ?, company = ?, job_title = ?,\n website = ?, location = ?, date_of_birth = ?, updated_at = ?\n ${customDataJson !== null ? ', data = ?' : ''}\n WHERE user_id = ?\n `)\n const updateBindings = [\n profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, now,\n ...(customDataJson !== null ? [customDataJson] : []),\n userId\n ]\n await updateProfileStmt.bind(...updateBindings).run()\n } else {\n // Create new profile\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const insertProfileStmt = db.prepare(`\n INSERT INTO user_profiles (id, user_id, display_name, bio, company, job_title, website, location, date_of_birth, data, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n await insertProfileStmt.bind(\n profileId, userId, profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, customDataJson || '{}', now, now\n ).run()\n }\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user.update', 'users', userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'role', 'is_active', 'email_verified', 'profile', ...(newPassword ? ['password'] : [])] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success',\n message: 'User updated successfully!',\n dismissible: true\n }))\n\n } catch (error) {\n console.error('User update error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to update user. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * POST /admin/users/:id/toggle - Toggle user active status\n */\nuserRoutes.post('/users/:id/toggle', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const body = await c.req.json().catch(() => ({ active: true }))\n const active = body.active === true\n\n // Prevent self-deactivation\n if (userId === user!.userId && !active) {\n return c.json({ error: 'You cannot deactivate your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToToggle = await userStmt.bind(userId).first() as any\n\n if (!userToToggle) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Toggle user status\n const toggleStmt = db.prepare(`\n UPDATE users SET is_active = ?, updated_at = ? WHERE id = ?\n `)\n await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, active ? 'user.activate' : 'user.deactivate', 'users', userId,\n { email: userToToggle.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: active ? 'User activated successfully' : 'User deactivated successfully'\n })\n\n } catch (error) {\n console.error('User toggle error:', error)\n return c.json({ error: 'Failed to toggle user status' }, 500)\n }\n})\n\n/**\n * DELETE /admin/users/:id - Delete user\n */\nuserRoutes.delete('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get request body to check for hard delete option\n const body = await c.req.json().catch(() => ({ hardDelete: false }))\n const hardDelete = body.hardDelete === true\n\n // Prevent self-deletion\n if (userId === user!.userId) {\n return c.json({ error: 'You cannot delete your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToDelete = await userStmt.bind(userId).first() as any\n\n if (!userToDelete) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n if (hardDelete) {\n // Hard delete - permanently remove from database\n const deleteStmt = db.prepare(`\n DELETE FROM users WHERE id = ?\n `)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.hard_delete', 'users', userId,\n { email: userToDelete.email, permanent: true },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User permanently deleted'\n })\n } else {\n // Soft delete - deactivate by setting is_active = 0\n const deleteStmt = db.prepare(`\n UPDATE users SET is_active = 0, updated_at = ? WHERE id = ?\n `)\n await deleteStmt.bind(Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.soft_delete', 'users', userId,\n { email: userToDelete.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User deactivated successfully'\n })\n }\n\n } catch (error) {\n console.error('User deletion error:', error)\n return c.json({ error: 'Failed to delete user' }, 500)\n }\n})\n\n/**\n * POST /admin/invite-user - Invite a new user\n */\nuserRoutes.post('/invite-user', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const role = formData.get('role')?.toString()?.trim() || 'viewer'\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n\n // Validate input\n if (!email || !firstName || !lastName) {\n return c.json({ error: 'Email, first name, and last name are required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n // Check if user already exists\n const existingUserStmt = db.prepare(`\n SELECT id FROM users WHERE email = ?\n `)\n const existingUser = await existingUserStmt.bind(email).first()\n\n if (existingUser) {\n return c.json({ error: 'A user with this email already exists' }, 400)\n }\n\n // Generate invitation token\n const invitationToken = crypto.randomUUID()\n // const invitationExpires = Date.now() + (7 * 24 * 60 * 60 * 1000) // 7 days\n\n // Create user record with invitation\n const userId = crypto.randomUUID()\n const createUserStmt = db.prepare(`\n INSERT INTO users (\n id, email, first_name, last_name, role, \n invitation_token, invited_by, invited_at,\n is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createUserStmt.bind(\n userId, email, firstName, lastName, role,\n invitationToken, user!.userId, Date.now(),\n 0, 0, Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invite_sent', 'users', userId,\n { email, role, invited_user_id: userId },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // In a real implementation, you would send an email here\n // For now, we'll return the invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${invitationToken}`\n\n return c.json({\n success: true,\n message: 'User invitation sent successfully',\n user: {\n id: userId,\n email,\n first_name: firstName,\n last_name: lastName,\n role\n },\n invitation_link: invitationLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('User invitation error:', error)\n return c.json({ error: 'Failed to send user invitation' }, 500)\n }\n})\n\n/**\n * POST /admin/resend-invitation/:id - Resend invitation\n */\nuserRoutes.post('/resend-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invitation_token\n FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Generate new invitation token\n const newInvitationToken = crypto.randomUUID()\n\n // Update invitation token and date\n const updateStmt = db.prepare(`\n UPDATE users SET \n invitation_token = ?, \n invited_at = ?, \n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newInvitationToken,\n Date.now(),\n Date.now(),\n userId\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_resent', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Generate new invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${newInvitationToken}`\n\n return c.json({\n success: true,\n message: 'Invitation resent successfully',\n invitation_link: invitationLink\n })\n\n } catch (error) {\n console.error('Resend invitation error:', error)\n return c.json({ error: 'Failed to resend invitation' }, 500)\n }\n})\n\n/**\n * DELETE /admin/cancel-invitation/:id - Cancel invitation\n */\nuserRoutes.delete('/cancel-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Delete the user record (since they haven't activated yet)\n const deleteStmt = db.prepare(`DELETE FROM users WHERE id = ?`)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_cancelled', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'Invitation cancelled successfully'\n })\n\n } catch (error) {\n console.error('Cancel invitation error:', error)\n return c.json({ error: 'Failed to cancel invitation' }, 500)\n }\n})\n\n/**\n * GET /admin/activity-logs - View activity logs\n */\nuserRoutes.get('/activity-logs', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination and filter parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '50')\n const offset = (page - 1) * limit\n\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get activity logs with user information\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: logs } = await logsStmt.bind(...params, limit, offset).all()\n\n // Get total count for pagination\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total \n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalLogs = countResult?.total || 0\n\n // Parse details JSON for each log\n const formattedLogs: ActivityLog[] = (logs || []).map((log: any) => ({\n ...log,\n details: log.details ? JSON.parse(log.details) : null\n }))\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'activity.logs_viewed', undefined, undefined,\n { filters, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n const pageData: ActivityLogsPageData = {\n logs: formattedLogs,\n pagination: {\n page,\n limit,\n total: totalLogs,\n pages: Math.ceil(totalLogs / limit)\n },\n filters,\n user: {\n name: user!.email.split('@')[0] || user!.email, // Use email username as fallback\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n\n } catch (error) {\n console.error('Activity logs error:', error)\n \n const pageData: ActivityLogsPageData = {\n logs: [],\n pagination: { page: 1, limit: 50, total: 0, pages: 0 },\n filters: {},\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n }\n})\n\n/**\n * GET /admin/activity-logs/export - Export activity logs to CSV\n */\nuserRoutes.get('/activity-logs/export', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get filter parameters (same as list view)\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get all matching activity logs (limit to 10,000 for performance)\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT 10000\n `)\n\n const { results: logs } = await logsStmt.bind(...params).all()\n\n // Generate CSV content\n const csvHeaders = ['Timestamp', 'User', 'Email', 'Action', 'Resource Type', 'Resource ID', 'IP Address', 'Details']\n const csvRows = [csvHeaders.join(',')]\n\n for (const log of (logs || [])) {\n const row = [\n `\"${new Date((log as any).created_at).toISOString()}\"`,\n `\"${(log as any).user_name || 'Unknown'}\"`,\n `\"${(log as any).user_email || 'N/A'}\"`,\n `\"${(log as any).action}\"`,\n `\"${(log as any).resource_type || 'N/A'}\"`,\n `\"${(log as any).resource_id || 'N/A'}\"`,\n `\"${(log as any).ip_address || 'N/A'}\"`,\n `\"${(log as any).details ? JSON.stringify(JSON.parse((log as any).details)) : 'N/A'}\"`\n ]\n csvRows.push(row.join(','))\n }\n\n const csvContent = csvRows.join('\\n')\n\n // Log the export activity\n await logActivity(\n db, user!.userId, 'activity.logs_exported', undefined, undefined,\n { filters, count: logs?.length || 0 },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return CSV file\n const filename = `activity-logs-${new Date().toISOString().split('T')[0]}.csv`\n \n return new Response(csvContent, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"${filename}\"`\n }\n })\n\n } catch (error) {\n console.error('Activity logs export error:', error)\n return c.json({ error: 'Failed to export activity logs' }, 500)\n }\n})\n\nexport { userRoutes }","export interface MediaFile {\n id: string;\n filename: string;\n original_name: string;\n mime_type: string;\n size: number;\n public_url: string;\n thumbnail_url?: string;\n alt?: string;\n caption?: string;\n tags: string[];\n uploaded_at: string;\n fileSize: string;\n uploadedAt: string;\n isImage: boolean;\n isVideo: boolean;\n isDocument: boolean;\n}\n\nexport interface MediaGridData {\n files: MediaFile[];\n viewMode?: \"grid\" | \"list\";\n selectable?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function renderMediaGrid(data: MediaGridData): string {\n if (data.files.length === 0) {\n return `\n
\n \n \n \n

No media files

\n

${\n data.emptyMessage || \"Get started by uploading your first file.\"\n }

\n
\n `;\n }\n\n const gridClass = data.viewMode === \"list\" ? \"space-y-4\" : \"media-grid\";\n\n return `\n
\n ${data.files\n .map((file) =>\n renderMediaFileCard(file, data.viewMode, data.selectable)\n )\n .join(\"\")}\n
\n `;\n}\n\nexport function renderMediaFileCard(\n file: MediaFile,\n viewMode: \"grid\" | \"list\" = \"grid\",\n selectable: boolean = false\n): string {\n if (viewMode === \"list\") {\n return `\n
\n
\n ${\n selectable\n ? `\n
\n
\n \n \n \n \n \n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n
\n\n
\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n \n \n \n \n \n
\n
\n
\n ${file.uploadedAt}\n ${\n file.tags.length > 0\n ? `\n \n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n
\n
\n `;\n }\n\n // Grid view\n return `\n
\n ${\n selectable\n ? `\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n ${\n file.uploadedAt\n }\n
\n ${\n file.tags.length > 0\n ? `\n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n `;\n}\n\nfunction getFileIcon(mimeType: string): string {\n if (mimeType.startsWith(\"image/\")) {\n return `\n \n \n \n `;\n } else if (mimeType.startsWith(\"video/\")) {\n return `\n \n \n \n `;\n } else if (mimeType === \"application/pdf\") {\n return `\n \n \n \n `;\n } else {\n return `\n \n \n \n `;\n }\n}\n","import {\n getConfirmationDialogScript,\n renderConfirmationDialog,\n} from \"../components/confirmation-dialog.template\";\nimport { MediaFile, renderMediaGrid } from \"../components/media-grid.template\";\nimport {\n AdminLayoutCatalystData,\n renderAdminLayoutCatalyst,\n} from \"../layouts/admin-layout-catalyst.template\";\n\nexport interface FolderStats {\n folder: string;\n count: number;\n totalSize: number;\n}\n\nexport interface TypeStats {\n type: string;\n count: number;\n}\n\nexport interface MediaLibraryPageData {\n files: MediaFile[];\n folders: FolderStats[];\n types: TypeStats[];\n currentFolder: string;\n currentType: string;\n currentView: \"grid\" | \"list\";\n currentPage: number;\n totalFiles: number;\n hasNextPage: boolean;\n user?: {\n name: string;\n email: string;\n role: string;\n };\n version?: string;\n}\n\nexport function renderMediaLibraryPage(data: MediaLibraryPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Media Library

\n

Manage your media files and assets

\n
\n
\n \n \n \n \n Upload Media\n \n
\n
\n \n
\n \n
\n
\n \n
\n \n Upload Files\n \n
\n\n \n
\n

Folders

\n \n
\n\n \n
\n

File Types

\n \n
\n\n \n
\n

Quick Actions

\n
\n \n Create Folder\n \n \n Cleanup Unused\n \n
\n
\n
\n
\n \n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n ${\n data.files.length\n } files\n \n Select All\n \n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Move to Folder\n \n
\n
\n \n \n \n \n Delete Selected Files\n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n ${renderMediaGrid({\n files: data.files,\n viewMode: data.currentView,\n selectable: true,\n emptyMessage:\n \"No media files found. Upload your first file to get started.\",\n })}\n
\n \n \n ${\n data.hasNextPage\n ? `\n
\n
\n ${\n data.currentPage > 1\n ? `\n \n Previous\n \n `\n : \"\"\n }\n Page ${\n data.currentPage\n }\n \n Next\n \n
\n
\n `\n : \"\"\n }\n
\n
\n \n \n \n
\n
\n
\n

Upload Files

\n \n
\n \n \n { window.location.href = '/admin/media?t=' + Date.now(); }, 1500); }\"\n class=\"space-y-4\"\n >\n \n \n \n \n \n
\n

Drop files here or click to upload

\n

PNG, JPG, GIF, PDF up to 10MB

\n
\n
\n \n \n \n \n
\n \n \n
\n\n \n
\n

Selected Files:

\n
\n
\n\n \n
\n \n Cancel\n \n \n Upload Files\n \n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n
\n
\n\n \n
\n
\n
\n

Move to Folder

\n \n
\n\n

\n Select a folder to move 0 selected file(s) to:\n

\n\n
\n ${\n data.folders.length > 0\n ? data.folders\n .map(\n (folder) => `\n \n
\n ${folder.folder}\n ${folder.count} files\n
\n \n `\n )\n .join(\"\")\n : '

No folders available

'\n }\n
\n\n
\n \n Cancel\n \n
\n
\n
\n\n \n
\n
\n
\n

Create New Folder

\n \n
\n\n
\n
\n \n \n

\n Use lowercase letters, numbers, hyphens, and underscores only\n

\n
\n\n
\n \n Cancel\n \n \n Create Folder\n \n
\n
\n
\n
\n\n \n \n \n\n \n ${renderConfirmationDialog({\n id: \"media-bulk-delete-confirm\",\n title: \"Delete Selected Files\",\n message: `Are you sure you want to delete ${\n data.files.length > 0 ? \"the selected files\" : \"these files\"\n }? This action cannot be undone and the files will be permanently removed.`,\n confirmText: \"Delete Files\",\n cancelText: \"Cancel\",\n confirmClass: \"bg-red-500 hover:bg-red-400\",\n iconColor: \"red\",\n onConfirm: \"performBulkDelete()\",\n })}\n\n \n ${getConfirmationDialogScript()}\n `;\n\n function buildPageUrl(page: number, folder: string, type: string): string {\n const params = new URLSearchParams();\n params.set(\"page\", page.toString());\n if (folder !== \"all\") params.set(\"folder\", folder);\n if (type !== \"all\") params.set(\"type\", type);\n return `/admin/media?${params.toString()}`;\n }\n\n const layoutData: AdminLayoutCatalystData = {\n title: \"Media Library\",\n pageTitle: \"Media Library\",\n currentPath: \"/admin/media\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayoutCatalyst(layoutData);\n}\n","import { MediaFile } from './media-grid.template'\n\nexport interface MediaFileDetailsData {\n file: MediaFile & {\n width?: number\n height?: number\n folder: string\n uploadedAt: string\n }\n}\n\nexport function renderMediaFileDetails(data: MediaFileDetailsData): string {\n const { file } = data\n \n return `\n
\n

File Details

\n \n
\n \n
\n \n
\n
\n ${file.isImage ? `\n \"${file.alt\n ` : file.isVideo ? `\n \n ` : `\n
\n \n \n \n
\n `}\n
\n\n
\n \n Copy URL\n \n \n Open Original\n \n
\n
\n \n \n
\n
\n \n

${file.original_name}

\n
\n\n
\n
\n \n

${file.fileSize}

\n
\n
\n \n

${file.mime_type}

\n
\n
\n\n ${file.width && file.height ? `\n
\n
\n \n

${file.width}px

\n
\n
\n \n

${file.height}px

\n
\n
\n ` : ''}\n\n
\n \n

${file.folder}

\n
\n\n
\n \n

${file.uploadedAt}

\n
\n\n \n
\n
\n \n \n
\n\n
\n \n ${file.caption || ''}\n
\n\n
\n \n \n
\n\n
\n \n Save Changes\n \n \n Delete File\n \n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\nimport { html, raw } from 'hono/html'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth, requireRole } from '../middleware'\nimport { renderMediaLibraryPage, MediaLibraryPageData, FolderStats, TypeStats } from '../templates/pages/admin-media-library.template'\nimport { renderMediaFileDetails, MediaFileDetailsData } from '../templates/components/media-file-details.template'\nimport { MediaFile, renderMediaFileCard } from '../templates/components/media-grid.template'\nimport type { Bindings, Variables } from '../app'\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nconst adminMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminMediaRoutes.use('*', requireAuth())\n\n// Media library main page\nadminMediaRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { searchParams } = new URL(c.req.url)\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const view = searchParams.get('view') || 'grid'\n const page = parseInt(searchParams.get('page') || '1')\n const _cacheBust = searchParams.get('t') // Cache-busting parameter\n const limit = 24\n const offset = (page - 1) * limit\n\n const db = c.env.DB\n\n // TODO: Cache implementation removed during migration - will be added back when cache plugin is migrated\n\n // Build query for media files\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = ['deleted_at IS NULL']\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT ${limit} OFFSET ${offset}`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n // Get folder statistics\n const foldersStmt = db.prepare(`\n SELECT folder, COUNT(*) as count, SUM(size) as totalSize\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY folder\n ORDER BY folder\n `)\n const { results: folders } = await foldersStmt.all()\n \n // Get type statistics\n const typesStmt = db.prepare(`\n SELECT\n CASE\n WHEN mime_type LIKE 'image/%' THEN 'images'\n WHEN mime_type LIKE 'video/%' THEN 'videos'\n WHEN mime_type IN ('application/pdf', 'text/plain') THEN 'documents'\n ELSE 'other'\n END as type,\n COUNT(*) as count\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY type\n `)\n const { results: types } = await typesStmt.all()\n \n // Process media files with local serving URLs\n const mediaFiles: MediaFile[] = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n caption: row.caption,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const pageData: MediaLibraryPageData = {\n files: mediaFiles,\n folders: folders.map((f: any) => ({\n folder: f.folder,\n count: f.count,\n totalSize: f.totalSize\n })) as FolderStats[],\n types: types.map((t: any) => ({\n type: t.type,\n count: t.count\n })) as TypeStats[],\n currentFolder: folder,\n currentType: type,\n currentView: view as 'grid' | 'list',\n currentPage: page,\n totalFiles: results.length,\n hasNextPage: results.length === limit,\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: c.get('appVersion')\n }\n\n // TODO: Cache implementation removed during migration\n\n return c.html(renderMediaLibraryPage(pageData))\n } catch (error) {\n console.error('Error loading media library:', error)\n return c.html(html`

Error loading media library

`)\n }\n})\n\n// Media selector endpoint (HTMX endpoint for content form media selection)\nadminMediaRoutes.get('/selector', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const db = c.env.DB\n\n // Build search query\n let query = 'SELECT * FROM media WHERE deleted_at IS NULL'\n const params: any[] = []\n\n if (search.trim()) {\n query += ' AND (filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n query += ' ORDER BY uploaded_at DESC LIMIT 24'\n\n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n // Render media selector grid\n return c.html(html`\n
\n \n
\n\n
\n ${raw(mediaFiles.map(file => `\n \n
\n ${file.isImage ? `\n \n ` : file.isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n\n
\n \n Select\n \n
\n
\n\n
\n

\n ${file.original_name}\n

\n

\n ${file.fileSize}\n

\n
\n
\n `).join(''))}\n \n\n ${mediaFiles.length === 0 ? html`\n
\n \n \n \n

No media files found

\n
\n ` : ''}\n `)\n } catch (error) {\n console.error('Error loading media selector:', error)\n return c.html(html`
Error loading media files
`)\n }\n})\n\n// Search media files (HTMX endpoint)\nadminMediaRoutes.get('/search', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const db = c.env.DB\n \n // Build search query\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = []\n \n if (search.trim()) {\n conditions.push('(filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)')\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT 24`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n const mediaFiles = results.map((row: any) => ({\n ...row,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n fileSize: formatFileSize(row.size),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const gridHTML = mediaFiles.map(file => generateMediaItemHTML(file)).join('')\n \n return c.html(raw(gridHTML))\n } catch (error) {\n console.error('Error searching media:', error)\n return c.html('
Error searching files
')\n }\n})\n\n// Get file details modal (HTMX endpoint)\nadminMediaRoutes.get('/:id/details', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n \n const stmt = db.prepare('SELECT * FROM media WHERE id = ?')\n const result = await stmt.bind(id).first() as any\n \n if (!result) {\n return c.html('
File not found
')\n }\n \n const file: MediaFile & { width?: number; height?: number; folder: string; uploadedAt: string } = {\n id: result.id,\n filename: result.filename,\n original_name: result.original_name,\n mime_type: result.mime_type,\n size: result.size,\n public_url: `/files/${result.r2_key}`,\n thumbnail_url: result.mime_type.startsWith('image/') ? `/files/${result.r2_key}` : undefined,\n alt: result.alt,\n caption: result.caption,\n tags: result.tags ? JSON.parse(result.tags) : [],\n uploaded_at: result.uploaded_at,\n fileSize: formatFileSize(result.size),\n uploadedAt: new Date(result.uploaded_at).toLocaleString(),\n isImage: result.mime_type.startsWith('image/'),\n isVideo: result.mime_type.startsWith('video/'),\n isDocument: !result.mime_type.startsWith('image/') && !result.mime_type.startsWith('video/'),\n width: result.width,\n height: result.height,\n folder: result.folder\n }\n \n const detailsData: MediaFileDetailsData = { file }\n \n return c.html(renderMediaFileDetails(detailsData))\n } catch (error) {\n console.error('Error fetching file details:', error)\n return c.html('
Error loading file details
')\n }\n})\n\n// Upload files endpoint (HTMX compatible)\nadminMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const fileEntries = formData.getAll('files') as unknown[]\n const files: File[] = []\n\n for (const entry of fileEntries) {\n if (entry instanceof File) {\n files.push(entry)\n }\n }\n \n if (!files || files.length === 0) {\n return c.html(html`\n
\n No files provided\n
\n `)\n }\n\n const uploadResults = []\n const errors = []\n\n // Check if MEDIA_BUCKET is available\n console.log('[MEDIA UPLOAD] c.env keys:', Object.keys(c.env))\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET defined?', !!c.env.MEDIA_BUCKET)\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET type:', typeof c.env.MEDIA_BUCKET)\n\n if (!c.env.MEDIA_BUCKET) {\n console.error('[MEDIA UPLOAD] MEDIA_BUCKET is not available! Available env keys:', Object.keys(c.env))\n return c.html(html`\n
\n Media storage (R2) is not configured. Please check your wrangler.toml configuration.\n
Debug: Available bindings: ${Object.keys(c.env).join(', ')}\n
\n `)\n }\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: validation.error.issues[0]?.message || 'Validation failed'\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = crypto.randomUUID()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user!.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Extract image dimensions if it's an image\n let width: number | undefined\n let height: number | undefined\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate URLs - use public serving route\n const publicUrl = `/files/${r2Key}`\n const thumbnailUrl = file.type.startsWith('image/') ? publicUrl : undefined\n\n // Save to database\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n fileId,\n filename,\n file.name,\n file.type,\n file.size,\n width,\n height,\n folder,\n r2Key,\n publicUrl,\n thumbnailUrl,\n user!.userId,\n Math.floor(Date.now() / 1000)\n ).run()\n\n uploadResults.push({\n id: fileId,\n filename: filename,\n originalName: file.name,\n mimeType: file.type,\n size: file.size,\n publicUrl: publicUrl\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed: ' + (error instanceof Error ? error.message : 'Unknown error')\n })\n }\n }\n\n // TODO: Cache invalidation removed during migration\n\n // Fetch updated media list to include in response\n let mediaGridHTML = ''\n if (uploadResults.length > 0) {\n try {\n const folderEntry = formData.get('folder')\n const folder = typeof folderEntry === 'string' ? folderEntry : 'uploads'\n const query = 'SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT 24'\n const stmt = c.env.DB.prepare(query)\n const { results } = await stmt.all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n mediaGridHTML = mediaFiles.map(file => renderMediaFileCard(file, 'grid', true)).join('')\n } catch (error) {\n console.error('Error fetching updated media list:', error)\n }\n }\n\n // Return HTMX response with results\n return c.html(html`\n ${uploadResults.length > 0 ? html`\n
\n Successfully uploaded ${uploadResults.length} file${uploadResults.length > 1 ? 's' : ''}\n
\n ` : ''}\n\n ${errors.length > 0 ? html`\n
\n

Upload errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n ${uploadResults.length > 0 ? html`\n \n ` : ''}\n `)\n } catch (error) {\n console.error('Upload error:', error)\n return c.html(html`\n
\n Upload failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Serve files from R2 storage\nadminMediaRoutes.get('/file/*', async (c) => {\n try {\n const r2Key = c.req.path.replace('/admin/media/file/', '')\n \n if (!r2Key) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(r2Key)\n \n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n \n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n})\n\n// Update media file metadata (HTMX compatible)\nadminMediaRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n const formData = await c.req.formData()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Extract form data\n const alt = formData.get('alt') as string || null\n const caption = formData.get('caption') as string || null\n const tagsString = formData.get('tags') as string || ''\n const tags = tagsString ? tagsString.split(',').map(tag => tag.trim()).filter(tag => tag) : []\n\n // Update database\n const updateStmt = c.env.DB.prepare(`\n UPDATE media \n SET alt = ?, caption = ?, tags = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n alt,\n caption,\n JSON.stringify(tags),\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n // TODO: Cache invalidation removed during migration\n\n return c.html(html`\n
\n File updated successfully\n
\n \n `)\n } catch (error) {\n console.error('Update error:', error)\n return c.html(html`\n
\n Update failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Cleanup unused media files (HTMX compatible)\nadminMediaRoutes.delete('/cleanup', requireRole('admin'), async (c) => {\n try {\n const db = c.env.DB\n\n // Find all media files\n const allMediaStmt = db.prepare('SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL')\n const { results: allMedia } = await allMediaStmt.all<{ id: string; r2_key: string; filename: string }>()\n\n // Find media files referenced in content\n // Content can reference media in various JSON fields like data, hero_image, etc.\n const contentStmt = db.prepare('SELECT data FROM content')\n const { results: contentRecords } = await contentStmt.all<{ data: unknown }>()\n\n // Extract all media URLs from content\n const referencedUrls = new Set()\n for (const record of contentRecords || []) {\n if (record.data) {\n const dataStr = typeof record.data === 'string' ? record.data : JSON.stringify(record.data)\n // Find all /files/ URLs in the content\n const urlMatches = dataStr.matchAll(/\\/files\\/([^\\s\"',]+)/g)\n for (const match of urlMatches) {\n referencedUrls.add(match[1]!)\n }\n }\n }\n\n // Find unreferenced media files\n const mediaRows = allMedia || []\n const unusedFiles = mediaRows.filter((file) => !referencedUrls.has(file.r2_key))\n\n if (unusedFiles.length === 0) {\n return c.html(html`\n
\n No unused media files found. All files are referenced in content.\n
\n \n `)\n }\n\n // Delete unused files from R2 and database\n let deletedCount = 0\n const errors = []\n\n for (const file of unusedFiles) {\n try {\n // Delete from R2\n await c.env.MEDIA_BUCKET.delete(file.r2_key)\n\n // Soft delete in database\n const deleteStmt = db.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), file.id).run()\n\n deletedCount++\n } catch (error) {\n console.error(`Failed to delete ${file.filename}:`, error)\n errors.push({\n filename: file.filename,\n error: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Return success response\n return c.html(html`\n
\n Successfully cleaned up ${deletedCount} unused media file${deletedCount !== 1 ? 's' : ''}.\n ${errors.length > 0 ? html`\n
Failed to delete ${errors.length} file${errors.length !== 1 ? 's' : ''}.\n ` : ''}\n
\n\n ${errors.length > 0 ? html`\n
\n

Cleanup errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n \n `)\n } catch (error) {\n console.error('Cleanup error:', error)\n return c.html(html`\n
\n Cleanup failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Delete media file (HTMX compatible)\nadminMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // TODO: Cache invalidation removed during migration\n\n // Return HTMX response that redirects to media library\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Delete error:', error)\n return c.html(html`\n
\n Delete failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length - 8) {\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n const segmentLength = (uint8Array[i + 2]! << 8) | uint8Array[i + 3]!\n i += 2 + segmentLength\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\n// Helper function to generate media item HTML\nfunction generateMediaItemHTML(file: any): string {\n const isImage = file.isImage\n const isVideo = file.isVideo\n \n return `\n
\n
\n ${isImage ? `\n \"${file.alt\n ` : isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n \n
\n
\n \n \n
\n
\n
\n \n
\n

\n ${file.original_name}\n

\n
\n ${file.fileSize}\n ${file.uploadedAt}\n
\n ${file.tags.length > 0 ? `\n
\n ${file.tags.slice(0, 2).map((tag: string) => `\n \n ${tag}\n \n `).join('')}\n ${file.tags.length > 2 ? `+${file.tags.length - 2}` : ''}\n
\n ` : ''}\n
\n
\n `\n}\n\n// Helper function to format file size\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n\nexport { adminMediaRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface Plugin {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error' | 'uninstalled'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n}\n\nexport interface PluginsListPageData {\n plugins: Plugin[]\n stats?: {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderPluginsListPage(data: PluginsListPageData): string {\n const categories = [\n { value: 'content', label: 'Content Management' },\n { value: 'media', label: 'Media' },\n { value: 'editor', label: 'Editors' },\n { value: 'seo', label: 'SEO & Analytics' },\n { value: 'security', label: 'Security' },\n { value: 'utilities', label: 'Utilities' },\n { value: 'system', label: 'System' },\n { value: 'development', label: 'Development' },\n { value: 'demo', label: 'Demo' }\n ];\n\n const statuses = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'uninstalled', label: 'Available to Install' },\n { value: 'error', label: 'Error' }\n ];\n\n // Calculate counts\n const categoryCounts: Record = {};\n categories.forEach(cat => {\n categoryCounts[cat.value] = data.plugins.filter(p => p.category === cat.value).length;\n });\n\n // Sort categories by count (descending)\n categories.sort((a, b) => (categoryCounts[b.value] || 0) - (categoryCounts[a.value] || 0));\n\n const statusCounts: Record = {};\n statuses.forEach(status => {\n statusCounts[status.value] = data.plugins.filter(p => p.status === status.value).length;\n });\n\n // Sort statuses by count (descending)\n statuses.sort((a, b) => (statusCounts[b.value] || 0) - (statusCounts[a.value] || 0));\n\n const pageContent = `\n
\n \n
\n
\n

Plugins

\n

Manage and extend functionality with plugins

\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n
\n

\n Experimental Feature\n

\n
\n

\n Plugin management is currently under active development. While functional, some features may change or have limitations.\n Please report any issues you encounter on our Discord community.\n

\n
\n
\n
\n
\n\n
\n \n \n\n \n
\n \n
\n
\n
Total
\n
${data.stats?.total || 0}
\n
\n
\n
Active
\n
${data.stats?.active || 0}
\n
\n
\n
Available
\n
${data.stats?.uninstalled || 0}
\n
\n
\n
Errors
\n
${data.stats?.errors || 0}
\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n \n
\n\n
\n \n\n \n \n \n \n \n
\n
\n\n \n
\n ${data.plugins.map(plugin => renderPluginCard(plugin)).join('')}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'uninstall-plugin-confirm',\n title: 'Uninstall Plugin',\n message: 'Are you sure you want to uninstall this plugin? This action cannot be undone.',\n confirmText: 'Uninstall',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performUninstallPlugin()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Plugins',\n pageTitle: 'Plugin Management',\n currentPath: '/admin/plugins',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderPluginCard(plugin: Plugin): string {\n const statusColors = {\n active: 'bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-400 ring-emerald-600/20',\n inactive: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-zinc-600/20',\n error: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-red-600/20',\n uninstalled: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-600 dark:text-zinc-500 ring-zinc-600/20'\n }\n\n const statusIcons = {\n active: '
',\n inactive: '
',\n error: '
',\n uninstalled: '
'\n }\n\n // Core system plugins that cannot be deactivated\n const criticalCorePlugins = ['core-auth', 'core-media']\n const canToggle = !criticalCorePlugins.includes(plugin.id)\n\n let actionButton = ''\n if (plugin.status === 'uninstalled') {\n actionButton = ``\n } else {\n const isActive = plugin.status === 'active';\n const action = isActive ? 'deactivate' : 'activate';\n // Use bg-emerald-600 for active, bg-zinc-200 (light) / bg-zinc-700 (dark) for inactive\n const bgClass = isActive ? 'bg-emerald-600' : 'bg-zinc-200 dark:bg-zinc-700';\n const translateClass = isActive ? 'translate-x-5' : 'translate-x-0';\n \n if (canToggle) {\n actionButton = `\n \n `\n } else {\n // Critical core plugins cannot be toggled\n actionButton = `\n
\n \n
\n `\n }\n }\n\n return `\n
\n
\n
\n
\n ${plugin.icon || getDefaultPluginIcon(plugin.category)}\n
\n
\n
\n

${plugin.displayName}

\n \n ${statusIcons[plugin.status]}${plugin.status.charAt(0).toUpperCase() + plugin.status.slice(1)}\n \n
\n

v${plugin.version} • ${plugin.author}

\n
\n
\n \n
\n ${!plugin.isCore && plugin.status !== 'uninstalled' ? `\n \n ` : ''}\n
\n
\n\n

${plugin.description}

\n\n
\n \n ${plugin.category}\n \n ${plugin.isCore ? 'Core' : ''}\n \n ${plugin.dependencies && plugin.dependencies.map(dep => `\n \n ${dep}\n \n `).join('') || ''}\n
\n\n
\n
\n ${actionButton}\n
\n
\n
\n `\n}\n\nfunction getDefaultPluginIcon(category: string): string {\n const iconColor = 'text-zinc-600 dark:text-zinc-400'\n\n const icons: Record = {\n 'content': `\n \n \n \n `,\n 'media': `\n \n \n \n `,\n 'seo': `\n \n \n \n `,\n 'analytics': `\n \n \n \n `,\n 'ecommerce': `\n \n \n \n `,\n 'email': `\n \n \n \n `,\n 'workflow': `\n \n \n \n `,\n 'security': `\n \n \n \n `,\n 'social': `\n \n \n \n `,\n 'utility': `\n \n \n \n \n `,\n }\n\n const iconKey = category.toLowerCase() as keyof typeof icons\n return icons[iconKey] || icons['utility'] || ''\n}\n\n// Mock data generator\nexport function generateMockPlugins(): Plugin[] {\n return [\n {\n id: '1',\n name: 'seo-optimizer',\n displayName: 'SEO Optimizer',\n description: 'Advanced SEO optimization tools including meta tag management, sitemap generation, and analytics integration. Boost your search engine rankings with automated optimizations.',\n version: '2.1.4',\n author: 'SonicJS Team',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 15420,\n rating: 4.8,\n lastUpdated: '2 days ago',\n dependencies: ['analytics-plugin'],\n permissions: ['read:content', 'write:meta'],\n isCore: true\n },\n {\n id: '2',\n name: 'image-optimizer',\n displayName: 'Image Optimizer',\n description: 'Automatically compress and optimize images on upload. Supports WebP conversion, lazy loading, and responsive image generation for better performance.',\n version: '1.5.2',\n author: 'MediaPro',\n status: 'active',\n category: 'media',\n icon: ``,\n downloadCount: 8930,\n rating: 4.6,\n lastUpdated: '1 week ago',\n dependencies: [],\n permissions: ['write:media', 'read:settings']\n },\n {\n id: '3',\n name: 'backup-manager',\n displayName: 'Backup Manager',\n description: 'Automated backup solution for content and media files. Schedule regular backups to cloud storage with encryption and restore capabilities.',\n version: '3.0.1',\n author: 'BackupCorp',\n status: 'inactive',\n category: 'utilities',\n icon: ``,\n downloadCount: 12450,\n rating: 4.9,\n lastUpdated: '3 days ago',\n dependencies: ['cloud-storage'],\n permissions: ['read:all', 'write:backups']\n },\n {\n id: '4',\n name: 'security-scanner',\n displayName: 'Security Scanner',\n description: 'Real-time security monitoring and vulnerability scanning. Detects malware, suspicious activities, and provides security recommendations.',\n version: '1.2.8',\n author: 'SecureWeb',\n status: 'error',\n category: 'security',\n icon: ``,\n downloadCount: 5680,\n rating: 4.3,\n lastUpdated: '5 days ago',\n dependencies: ['security-core'],\n permissions: ['read:logs', 'read:files', 'write:security']\n },\n {\n id: '5',\n name: 'social-share',\n displayName: 'Social Share',\n description: 'Easy social media sharing buttons and Open Graph meta tag generation. Supports all major social platforms with customizable styling.',\n version: '2.3.0',\n author: 'SocialPlus',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 22100,\n rating: 4.7,\n lastUpdated: '4 days ago',\n dependencies: [],\n permissions: ['read:content', 'write:meta']\n },\n {\n id: '6',\n name: 'analytics-pro',\n displayName: 'Analytics Pro',\n description: 'Advanced analytics dashboard with custom tracking events, conversion funnels, and detailed visitor insights. GDPR compliant with privacy controls.',\n version: '4.1.2',\n author: 'AnalyticsPro Inc',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 18750,\n rating: 4.9,\n lastUpdated: '1 day ago',\n dependencies: ['gdpr-compliance'],\n permissions: ['read:analytics', 'write:tracking', 'read:users']\n },\n {\n id: '7',\n name: 'form-builder',\n displayName: 'Advanced Form Builder',\n description: 'Drag-and-drop form builder with conditional logic, file uploads, payment integration, and email notifications. Perfect for contact forms and surveys.',\n version: '1.8.5',\n author: 'FormWorks',\n status: 'inactive',\n category: 'content',\n icon: ``,\n downloadCount: 9870,\n rating: 4.4,\n lastUpdated: '1 week ago',\n dependencies: ['email-service'],\n permissions: ['write:forms', 'read:submissions', 'send:emails']\n },\n {\n id: '8',\n name: 'cache-optimizer',\n displayName: 'Cache Optimizer',\n description: 'Intelligent caching system with Redis support, CDN integration, and automatic cache invalidation. Dramatically improves site performance.',\n version: '2.7.3',\n author: 'SpeedBoost',\n status: 'active',\n category: 'utilities',\n icon: ``,\n downloadCount: 13240,\n rating: 4.8,\n lastUpdated: '6 days ago',\n dependencies: ['redis-connector'],\n permissions: ['read:cache', 'write:cache', 'manage:cdn'],\n isCore: true\n },\n {\n id: '9',\n name: 'multilingual',\n displayName: 'Multilingual Support',\n description: 'Complete internationalization solution with automatic translation, language detection, and localized content management for global websites.',\n version: '3.2.1',\n author: 'GlobalWeb',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 7650,\n rating: 4.5,\n lastUpdated: '2 weeks ago',\n dependencies: ['translation-api'],\n permissions: ['read:content', 'write:translations', 'manage:languages']\n }\n ]\n}\n","import type { AuthSettings } from '../../services/auth-validation'\n\nexport function renderAuthSettingsForm(settings: AuthSettings): string {\n const fields = settings.requiredFields\n const validation = settings.validation\n const registration = settings.registration\n\n return `\n
\n \n
\n

Registration Fields

\n

Configure which fields are required during user registration and their minimum lengths.

\n\n
\n ${Object.entries(fields).map(([fieldName, config]: [string, any]) => `\n
\n
\n
\n

${config.label}

\n

Field type: ${config.type}

\n
\n \n
\n\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n `).join('')}\n
\n
\n\n \n
\n

Password Requirements

\n

Additional password complexity requirements.

\n\n
\n
\n
\n \n

Password must contain at least one uppercase letter (A-Z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one lowercase letter (a-z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one number (0-9)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one special character (!@#$%^&*)

\n
\n \n
\n
\n
\n\n \n
\n

Registration Settings

\n

General registration behavior.

\n\n
\n
\n
\n \n

Enable or disable public user registration

\n
\n \n
\n\n
\n
\n \n

Users must verify their email before accessing the system

\n
\n \n
\n\n
\n \n \n \n \n \n \n

Role assigned to new users upon registration

\n
\n
\n
\n\n \n
\n

Validation Settings

\n

Additional validation rules.

\n\n
\n
\n
\n \n

Validate that email addresses are in correct format

\n
\n \n
\n\n
\n
\n \n

Ensure usernames are unique across all users

\n
\n \n
\n
\n
\n
\n `\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAuthSettingsForm } from '../components/auth-settings-form.template'\nimport type { AuthSettings } from '../../services/auth-validation'\n\n/**\n * Escape HTML attribute values to prevent XSS\n */\nfunction escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport interface PluginSettings {\n [key: string]: any\n}\n\nexport interface PluginActivity {\n id: string\n action: string\n message: string\n timestamp: number\n user?: string\n}\n\nexport interface PluginSettingsPageData {\n plugin: {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n settings?: PluginSettings\n }\n activity?: PluginActivity[]\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderPluginSettingsPage(data: PluginSettingsPageData): string {\n const { plugin, activity = [], user } = data\n \n const pageContent = `\n
\n \n
\n
\n

Plugin Settings

\n

\n ${plugin.description}\n

\n
\n \n
\n\n \n
\n
\n
\n
\n ${plugin.icon || plugin.displayName.charAt(0).toUpperCase()}\n
\n
\n

${plugin.displayName}

\n
\n v${plugin.version}\n by ${plugin.author}\n ${plugin.category}\n ${plugin.downloadCount ? `${plugin.downloadCount.toLocaleString()} downloads` : ''}\n ${plugin.rating ? `★ ${plugin.rating}` : ''}\n
\n
\n
\n\n
\n ${renderStatusBadge(plugin.status)}\n ${renderToggleButton(plugin)}\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n \n
\n ${renderSettingsTab(plugin)}\n
\n\n \n
\n ${renderActivityTab(activity)}\n
\n\n \n
\n ${renderInformationTab(plugin)}\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${plugin.displayName} Settings`,\n pageTitle: `${plugin.displayName} Settings`,\n currentPath: `/admin/plugins/${plugin.id}`,\n user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction renderStatusBadge(status: string): string {\n const statusColors: Record = {\n active: 'bg-green-900/50 text-green-300 border-green-600/30',\n inactive: 'bg-gray-800/50 text-gray-400 border-gray-600/30',\n error: 'bg-red-900/50 text-red-300 border-red-600/30'\n }\n\n const statusIcons: Record = {\n active: '
',\n inactive: '
',\n error: '
'\n }\n\n return `\n \n ${statusIcons[status] || statusIcons.inactive}${status.charAt(0).toUpperCase() + status.slice(1)}\n \n `\n}\n\nfunction renderToggleButton(plugin: any): string {\n if (plugin.isCore) {\n return 'Core Plugin'\n }\n\n return plugin.status === 'active' \n ? ``\n : ``\n}\n\nfunction renderSettingsTab(plugin: any): string {\n const settings = plugin.settings || {}\n const pluginId = plugin.id || plugin.name\n\n // Check for custom settings component first\n const customRenderer = pluginSettingsComponents[pluginId]\n if (customRenderer) {\n return `\n
\n ${customRenderer(plugin, settings)}\n\n
\n \n Save Settings\n \n
\n
\n `\n }\n\n const isSeedDataPlugin = plugin.id === 'seed-data' || plugin.name === 'seed-data'\n const isAuthPlugin = plugin.id === 'core-auth' || plugin.name === 'core-auth'\n const isTurnstilePlugin = plugin.id === 'turnstile' || plugin.name === 'turnstile'\n\n return `\n ${isSeedDataPlugin ? `\n
\n
\n
\n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n
\n \n \n \n \n Open Seed Data Tool\n \n
\n
\n ` : ''}\n\n
\n ${isAuthPlugin ? `\n

Authentication Settings

\n

Configure user registration fields and validation rules.

\n ` : isTurnstilePlugin ? `\n

Cloudflare Turnstile Settings

\n

Configure CAPTCHA-free bot protection for your forms.

\n ` : `\n

Plugin Settings

\n `}\n\n
\n ${isAuthPlugin && Object.keys(settings).length > 0\n ? renderAuthSettingsForm(settings as AuthSettings)\n : isTurnstilePlugin && Object.keys(settings).length > 0\n ? renderTurnstileSettingsForm(settings)\n : Object.keys(settings).length > 0\n ? renderSettingsFields(settings)\n : renderNoSettings(plugin)\n }\n\n ${Object.keys(settings).length > 0 ? `\n
\n \n Save Settings\n \n
\n ` : ''}\n
\n
\n `\n}\n\nfunction renderSettingsFields(settings: PluginSettings): string {\n return Object.entries(settings).map(([key, value]) => {\n const fieldId = `setting_${key}`\n const displayName = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase())\n \n if (typeof value === 'boolean') {\n return `\n
\n
\n \n

Enable or disable this feature

\n
\n \n
\n `\n } else if (typeof value === 'number') {\n return `\n
\n \n \n
\n `\n } else {\n return `\n
\n \n \n
\n `\n }\n }).join('')\n}\n\nfunction renderTurnstileSettingsForm(settings: any): string {\n const inputClass = \"backdrop-blur-sm bg-white/10 border border-white/20 rounded-lg px-3 py-2 text-white placeholder-gray-300 focus:border-blue-400 focus:outline-none transition-colors w-full\"\n const selectClass = \"backdrop-blur-sm bg-zinc-800 border border-white/20 rounded-lg px-3 py-2 text-white focus:border-blue-400 focus:outline-none transition-colors w-full [&>option]:bg-zinc-800 [&>option]:text-white\"\n \n return `\n \n
\n
\n \n

Enable or disable Turnstile verification globally

\n
\n \n
\n\n \n
\n \n \n

Your Cloudflare Turnstile site key (public)

\n
\n\n \n
\n \n \n

Your Cloudflare Turnstile secret key (private)

\n
\n\n \n
\n \n \n

Visual appearance of the Turnstile widget

\n
\n\n \n
\n \n \n

Size of the Turnstile challenge widget

\n
\n\n \n
\n \n \n

Managed: Shows challenge only when needed. Non-Interactive: Always shows but doesn't require interaction. Invisible: Runs in background without UI.

\n
\n\n \n
\n \n \n

Controls when Turnstile verification occurs. Always: Verifies immediately (pre-clearance). Execute: Verifies on form submit. Interaction Only: Only after user interaction.

\n
\n `\n}\n\nfunction renderNoSettings(plugin: any): string {\n // Special handling for seed-data plugin\n if (plugin.id === 'seed-data' || plugin.name === 'seed-data') {\n return `\n
\n \n \n \n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n \n \n \n \n Generate Seed Data\n \n
\n `\n }\n\n return `\n
\n \n \n \n \n

No Settings Available

\n

This plugin doesn't have any configurable settings.

\n
\n `\n}\n\nfunction renderActivityTab(activity: PluginActivity[]): string {\n return `\n
\n

Activity Log

\n \n ${activity.length > 0 ? `\n
\n ${activity.map(item => `\n
\n
\n
\n
\n ${item.action}\n ${formatTimestamp(item.timestamp)}\n
\n

${item.message}

\n ${item.user ? `

by ${item.user}

` : ''}\n
\n
\n `).join('')}\n
\n ` : `\n
\n \n \n \n

No Activity

\n

No recent activity for this plugin.

\n
\n `}\n
\n `\n}\n\nfunction renderInformationTab(plugin: any): string {\n return `\n
\n \n
\n

Plugin Details

\n
\n
\n Name:\n ${plugin.displayName}\n
\n
\n Version:\n ${plugin.version}\n
\n
\n Author:\n ${plugin.author}\n
\n
\n Category:\n ${plugin.category}\n
\n
\n Status:\n ${plugin.status}\n
\n
\n Last Updated:\n ${plugin.lastUpdated}\n
\n
\n
\n\n \n
\n

Dependencies & Permissions

\n \n ${plugin.dependencies && plugin.dependencies.length > 0 ? `\n
\n

Dependencies:

\n
\n ${plugin.dependencies.map((dep: string) => `\n
${dep}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${plugin.permissions && plugin.permissions.length > 0 ? `\n
\n

Permissions:

\n
\n ${plugin.permissions.map((perm: string) => `\n
${perm}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${(!plugin.dependencies || plugin.dependencies.length === 0) && (!plugin.permissions || plugin.permissions.length === 0) ? `\n

No dependencies or special permissions required.

\n ` : ''}\n
\n
\n `\n}\n\nfunction formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp * 1000)\n return date.toLocaleString()\n}\n\n// ==================== Plugin Settings Components ====================\n// These render just the settings content, embedded within the shared layout\n\n/**\n * Registry of custom plugin settings components\n * Plugins with custom settings UI register their render functions here\n */\ntype PluginSettingsRenderer = (plugin: any, settings: PluginSettings) => string\n\nconst pluginSettingsComponents: Record = {\n 'otp-login': renderOTPLoginSettingsContent,\n 'email': renderEmailSettingsContent,\n}\n\n/**\n * OTP Login plugin settings content\n */\nfunction renderOTPLoginSettingsContent(plugin: any, settings: PluginSettings): string {\n const siteName = settings.siteName || 'SonicJS'\n const emailConfigured = settings._emailConfigured || false\n const codeLength = settings.codeLength || 6\n const codeExpiryMinutes = settings.codeExpiryMinutes || 10\n const maxAttempts = settings.maxAttempts || 3\n const rateLimitPerHour = settings.rateLimitPerHour || 5\n const allowNewUserRegistration = settings.allowNewUserRegistration || false\n const logoUrl = settings.logoUrl || ''\n const logoWidth = Number(settings.logoWidth) || 150\n const logoBorderWidth = Number(settings.logoBorderWidth) || 0\n const logoBorderColor = settings.logoBorderColor || '#ffffff'\n const loginUrl = settings.loginUrl || ''\n const loginButtonText = settings.loginButtonText || ''\n const previewButtonText = loginButtonText.trim() || `Sign in to ${siteName}`\n const previewLogoBorder = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${escapeHtmlAttr(logoBorderColor)}; border-radius: 8px;`\n : ''\n\n return `\n
\n \n
\n

\n 📧 Test OTP Email\n

\n\n ${!emailConfigured ? `\n
\n

\n ⚠️ Email not configured.\n Configure the Email plugin\n to send real emails. Dev mode will show codes in the response.\n

\n
\n ` : `\n
\n

\n ✅ Email configured. Test emails will be sent via Resend.\n

\n
\n `}\n\n
\n
\n \n \n
\n\n \n Send Test Code\n \n \n \n \n \n \n \n \n\n
\n\n \n
\n

Verify Code

\n
\n
\n \n \n
\n \n Verify Code\n \n \n
\n
\n
\n\n \n
\n

Code Settings

\n\n
\n
\n \n \n

Optional. Displayed at the top of the OTP email.

\n
\n\n
\n
\n \n \n

Max width of the logo (20-600).

\n
\n\n
\n \n \n

0 disables the border.

\n
\n\n
\n \n
\n \n \n
\n

Hex, rgb(), or named color.

\n
\n
\n\n
\n \n \n

Optional. If set, a \"Sign in\" button is added to the email.

\n
\n\n
\n \n \n

Optional. Defaults to \"Sign in to ${siteName}\".

\n
\n\n
\n
\n \n \n

Number of digits (4-8)

\n
\n\n
\n \n \n

How long codes remain valid

\n
\n\n
\n \n \n

Max verification attempts

\n
\n\n
\n \n \n

Max requests per email per hour

\n
\n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

\n 👁️ Email Preview\n

\n

\n This is how the OTP email will appear to users. The site name \"${siteName}\" is configured in\n General Settings.\n

\n\n
\n
\n ${logoUrl ? `\"Logo\"` : ''}\n

Your Login Code

\n

Enter this code to sign in to ${siteName}

\n
\n\n
\n
\n
\n 123456\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${codeExpiryMinutes} minutes\n

\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${siteName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n
\n
\n\n \n
\n

🔢 Features

\n
    \n
  • ✓ Passwordless authentication
  • \n
  • ✓ Secure random code generation
  • \n
  • ✓ Rate limiting protection
  • \n
  • ✓ Brute force prevention
  • \n
  • ✓ Mobile-friendly UX
  • \n
\n
\n\n \n \n
\n\n \n `\n}\n\n/**\n * Email plugin settings content\n */\nfunction renderEmailSettingsContent(plugin: any, settings: PluginSettings): string {\n const apiKey = settings.apiKey || ''\n const fromEmail = settings.fromEmail || ''\n const fromName = settings.fromName || ''\n const replyTo = settings.replyTo || ''\n const logoUrl = settings.logoUrl || ''\n\n return `\n
\n \n
\n

Resend Configuration

\n\n
\n \n
\n \n \n

\n Get your API key from resend.com/api-keys\n

\n
\n\n \n
\n \n \n

Must be a verified domain in Resend

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n

Logo to display in email templates

\n
\n
\n
\n\n \n
\n

Send Test Email

\n
\n \n \n Send Test\n \n
\n
\n
\n\n \n
\n

📧 Email Templates Included

\n
    \n
  • ✓ Registration confirmation
  • \n
  • ✓ Email verification
  • \n
  • ✓ Password reset
  • \n
  • ✓ One-time code (2FA)
  • \n
\n

\n Templates are code-based and can be customized by editing the plugin files.\n

\n
\n
\n\n \n `\n}\n\n/**\n * Check if a plugin has a custom settings component\n */\nexport function hasCustomSettingsComponent(pluginId: string): boolean {\n return pluginId in pluginSettingsComponents\n}\n\n/**\n * Get the custom settings component for a plugin\n */\nexport function getCustomSettingsComponent(pluginId: string): PluginSettingsRenderer | undefined {\n return pluginSettingsComponents[pluginId]\n}","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderPluginsListPage, PluginsListPageData, Plugin } from '../templates/pages/admin-plugins-list.template'\nimport { renderPluginSettingsPage, PluginSettingsPageData } from '../templates/pages/admin-plugin-settings.template'\nimport { SettingsService } from '../services/settings'\nimport { PluginService } from '../services'\nimport { PLUGIN_REGISTRY, findPluginByCodeName } from '../plugins/manifest-registry'\nimport type { Bindings, Variables } from '../app'\n\nconst adminPluginRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminPluginRoutes.use('*', requireAuth())\n\n// Build available plugins list from the auto-generated registry.\n// To add a new plugin to this list, create a manifest.json in the plugin directory\n// and run: node packages/scripts/generate-plugin-registry.mjs\nconst AVAILABLE_PLUGINS = Object.values(PLUGIN_REGISTRY).map(p => ({\n id: p.id,\n name: p.codeName,\n display_name: p.displayName,\n description: p.description,\n version: p.version,\n author: p.author,\n category: p.category,\n icon: p.iconEmoji,\n permissions: p.permissions,\n dependencies: p.dependencies,\n is_core: p.is_core\n}))\n\n// Plugin list page\nadminPluginRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n // TODO: Fix permission system\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n\n const pluginService = new PluginService(db)\n\n // Get all installed plugins with error handling\n let installedPlugins: any[] = []\n let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 }\n\n try {\n installedPlugins = await pluginService.getAllPlugins()\n stats = await pluginService.getPluginStats()\n } catch (error) {\n console.error('Error loading plugins:', error)\n // Continue with empty data\n }\n\n // Get list of installed plugin IDs\n const installedPluginIds = new Set(installedPlugins.map(p => p.id))\n\n // Find uninstalled plugins\n const uninstalledPlugins = AVAILABLE_PLUGINS.filter(p => !installedPluginIds.has(p.id))\n\n // Map installed plugins to template format\n const templatePlugins: Plugin[] = installedPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: p.status,\n category: p.category,\n icon: p.icon,\n downloadCount: p.download_count,\n rating: p.rating,\n lastUpdated: formatLastUpdated(p.last_updated),\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Add uninstalled plugins to the list\n const uninstalledTemplatePlugins: Plugin[] = uninstalledPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: 'uninstalled' as const,\n category: p.category,\n icon: p.icon,\n downloadCount: 0,\n rating: 0,\n lastUpdated: 'Not installed',\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Combine installed and uninstalled plugins\n const allPlugins = [...templatePlugins, ...uninstalledTemplatePlugins]\n\n // Update stats with uninstalled count\n stats.uninstalled = uninstalledPlugins.length\n stats.total = installedPlugins.length + uninstalledPlugins.length\n\n const pageData: PluginsListPageData = {\n plugins: allPlugins,\n stats,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n },\n version: c.get('appVersion')\n }\n\n return c.html(renderPluginsListPage(pageData))\n } catch (error) {\n console.error('Error loading plugins page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Get plugin settings page\nadminPluginRoutes.get('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Check authorization first\n if (user?.role !== 'admin') {\n return c.redirect('/admin/plugins')\n }\n\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin(pluginId)\n\n if (!plugin) {\n return c.text('Plugin not found', 404)\n }\n\n // Get activity log\n const activity = await pluginService.getPluginActivity(pluginId, 20)\n\n // Load additional context for plugins with custom settings components\n let enrichedSettings = plugin.settings || {}\n\n // For OTP Login plugin, add site name and email config status\n if (pluginId === 'otp-login') {\n // Get site name from general settings via SettingsService\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName || 'SonicJS'\n\n // Check if email plugin is configured\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n let emailConfigured = false\n if (emailPlugin?.settings) {\n try {\n const emailSettings = JSON.parse(emailPlugin.settings)\n emailConfigured = !!(emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName)\n } catch (e) { /* ignore */ }\n }\n\n enrichedSettings = {\n ...enrichedSettings,\n siteName,\n _emailConfigured: emailConfigured\n }\n }\n\n // Map plugin data to template format\n const templatePlugin = {\n id: plugin.id,\n name: plugin.name,\n displayName: plugin.display_name,\n description: plugin.description,\n version: plugin.version,\n author: plugin.author,\n status: plugin.status,\n category: plugin.category,\n icon: plugin.icon,\n downloadCount: plugin.download_count,\n rating: plugin.rating,\n lastUpdated: formatLastUpdated(plugin.last_updated),\n dependencies: plugin.dependencies,\n permissions: plugin.permissions,\n isCore: plugin.is_core,\n settings: enrichedSettings\n }\n\n // Map activity data\n const templateActivity = (activity || []).map(item => ({\n id: item.id,\n action: item.action,\n message: item.message,\n timestamp: item.timestamp,\n user: item.user_email\n }))\n\n const pageData: PluginSettingsPageData = {\n plugin: templatePlugin,\n activity: templateActivity,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n }\n }\n\n return c.html(renderPluginSettingsPage(pageData))\n } catch (error) {\n console.error('Error getting plugin settings page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Activate plugin\nadminPluginRoutes.post('/:id/activate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.activatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error activating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to activate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Deactivate plugin\nadminPluginRoutes.post('/:id/deactivate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.deactivatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deactivating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to deactivate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Generic install handler - uses the auto-generated plugin registry.\n// No per-plugin switch/case needed. Adding a manifest.json is enough.\nadminPluginRoutes.post('/install', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const body = await c.req.json()\n const pluginService = new PluginService(db)\n\n // Look up plugin in registry by codeName (what the frontend sends as body.name)\n // or by id\n const registryEntry = findPluginByCodeName(body.name)\n || PLUGIN_REGISTRY[body.name]\n || PLUGIN_REGISTRY[body.id]\n\n if (!registryEntry) {\n return c.json({ error: 'Plugin not found in registry' }, 404)\n }\n\n const plugin = await pluginService.installPlugin({\n id: registryEntry.id,\n name: registryEntry.codeName,\n display_name: registryEntry.displayName,\n description: registryEntry.description,\n version: registryEntry.version,\n author: registryEntry.author,\n category: registryEntry.category,\n icon: registryEntry.iconEmoji,\n permissions: registryEntry.permissions,\n dependencies: registryEntry.dependencies,\n is_core: registryEntry.is_core,\n settings: registryEntry.defaultSettings,\n })\n\n return c.json({ success: true, plugin })\n } catch (error) {\n console.error('Error installing plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to install plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Uninstall plugin\nadminPluginRoutes.post('/:id/uninstall', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.uninstallPlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error uninstalling plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to uninstall plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Update plugin settings\nadminPluginRoutes.post('/:id/settings', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const settings = await c.req.json()\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings(pluginId, settings)\n\n // Clear auth validation cache if updating core-auth plugin\n if (pluginId === 'core-auth') {\n try {\n const cacheKv = c.env.CACHE_KV\n if (cacheKv) {\n await cacheKv.delete('auth:settings')\n await cacheKv.delete('auth:registration-enabled')\n console.log('[AuthSettings] Cache cleared after updating authentication settings')\n }\n } catch (cacheError) {\n console.error('[AuthSettings] Failed to clear cache:', cacheError)\n }\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating plugin settings:', error)\n const message = error instanceof Error ? error.message : 'Failed to update settings'\n return c.json({ error: message }, 400)\n }\n})\n\n// Helper function to format last updated time\nfunction formatLastUpdated(timestamp: number): string {\n const now = Date.now() / 1000\n const diff = now - timestamp\n\n if (diff < 60) return 'just now'\n if (diff < 3600) return `${Math.floor(diff / 60)} minutes ago`\n if (diff < 86400) return `${Math.floor(diff / 3600)} hours ago`\n if (diff < 604800) return `${Math.floor(diff / 86400)} days ago`\n if (diff < 2592000) return `${Math.floor(diff / 604800)} weeks ago`\n return `${Math.floor(diff / 2592000)} months ago`\n}\n\nexport { adminPluginRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogEntry {\n id: string\n level: string\n category: string\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags: string[]\n source?: string\n createdAt: Date\n formattedDate: string\n formattedDuration?: string\n levelClass: string\n categoryClass: string\n}\n\nexport interface LogsListPageData {\n logs: LogEntry[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n baseUrl: string\n }\n filters: {\n level: string\n category: string\n search: string\n startDate: string\n endDate: string\n source: string\n }\n user?: BaseUser\n}\n\nexport function renderLogsListPage(data: LogsListPageData) {\n const { logs, pagination, filters, user } = data\n\n const content = `\n
\n
\n
\n

System Logs

\n

\n Monitor and analyze system activity, errors, and performance metrics.\n

\n
\n
\n \n Configure\n \n \n Export\n \n
\n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n Apply Filters\n \n \n Clear\n \n
\n
\n\n
\n ${pagination.totalItems} ${pagination.totalItems === 1 ? 'entry' : 'entries'}\n
\n
\n
\n
\n
\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
\n Level\n \n Category\n \n Message\n \n Source\n \n Time\n \n Actions\n
\n \n ${log.level}\n \n \n \n ${log.category}\n \n \n
\n
${log.message}
\n ${log.url ? `
${log.method} ${log.url}
` : ''}\n ${log.duration ? `
${log.formattedDuration}
` : ''}\n
\n
\n ${log.source || '-'}\n \n ${log.formattedDate}\n \n \n View Details\n \n
\n
\n\n ${logs.length === 0 ? `\n
\n \n \n \n

No log entries

\n

No log entries found matching your criteria.

\n
\n ` : ''}\n
\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : `\n \n Previous\n \n `}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : `\n \n Next\n \n `}\n
\n
\n
\n

\n Showing ${pagination.startItem} to ${pagination.endItem} of{' '}\n ${pagination.totalItems} results\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'System Logs',\n pageTitle: 'System Logs',\n currentPath: '/admin/logs',\n user,\n content\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport { LogEntry } from './admin-logs-list.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogDetailsPageData {\n log: LogEntry\n user?: BaseUser\n}\n\nexport function renderLogDetailsPage(data: LogDetailsPageData) {\n const { log, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Details

\n

\n Detailed information for log entry ${log.id}\n

\n
\n
\n\n
\n
\n
\n

Log Entry Information

\n
\n \n ${log.level}\n \n \n ${log.category}\n \n
\n
\n
\n \n
\n
\n
\n
ID
\n
${log.id}
\n
\n \n
\n
Timestamp
\n
${log.formattedDate}
\n
\n \n
\n
Level
\n
\n \n ${log.level}\n \n
\n
\n \n
\n
Category
\n
\n \n ${log.category}\n \n
\n
\n \n ${log.source ? html`\n
\n
Source
\n
${log.source}
\n
\n ` : ''}\n \n ${log.userId ? html`\n
\n
User ID
\n
${log.userId}
\n
\n ` : ''}\n \n ${log.sessionId ? html`\n
\n
Session ID
\n
${log.sessionId}
\n
\n ` : ''}\n \n ${log.requestId ? html`\n
\n
Request ID
\n
${log.requestId}
\n
\n ` : ''}\n \n ${log.ipAddress ? html`\n
\n
IP Address
\n
${log.ipAddress}
\n
\n ` : ''}\n \n ${log.method && log.url ? html`\n
\n
HTTP Request
\n
\n ${log.method} ${log.url}\n ${log.statusCode ? html`(${log.statusCode})` : ''}\n
\n
\n ` : ''}\n \n ${log.duration ? html`\n
\n
Duration
\n
${log.formattedDuration}
\n
\n ` : ''}\n \n ${log.userAgent ? html`\n
\n
User Agent
\n
${log.userAgent}
\n
\n ` : ''}\n
\n
\n
\n\n \n
\n
\n

Message

\n
\n
\n
\n ${log.message}\n
\n
\n
\n\n \n ${log.tags && log.tags.length > 0 ? html`\n
\n
\n

Tags

\n
\n
\n
\n ${log.tags.map(tag => html`\n \n ${tag}\n \n `).join('')}\n
\n
\n
\n ` : ''}\n\n \n ${log.data ? html`\n
\n
\n

Additional Data

\n
\n
\n
${JSON.stringify(log.data, null, 2)}
\n
\n
\n ` : ''}\n\n \n ${log.stackTrace ? html`\n
\n
\n

Stack Trace

\n
\n
\n
${log.stackTrace}
\n
\n
\n ` : ''}\n\n \n
\n \n ← Back to Logs\n \n \n
\n ${log.level === 'error' || log.level === 'fatal' ? html`\n \n Report Issue\n \n ` : ''}\n \n alert('Log details copied to clipboard'))\"\n >\n Copy Details\n \n
\n
\n
\n `\n\n return adminLayoutV2({\n title: `Log Details - ${log.id}`,\n user,\n content: content as string\n })\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport type { LogConfig } from '../../db/schema'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogConfigPageData {\n configs: LogConfig[]\n user?: BaseUser\n}\n\nexport function renderLogConfigPage(data: LogConfigPageData) {\n const { configs, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Configuration

\n

\n Configure logging settings for different categories and manage log retention policies.\n

\n
\n
\n \n Run Cleanup\n \n
\n
\n\n
\n\n \n
\n
\n

Log Levels Reference

\n
\n
\n
\n
\n \n debug\n \n

Detailed diagnostic information

\n
\n
\n \n info\n \n

General information messages

\n
\n
\n \n warn\n \n

Warning conditions

\n
\n
\n \n error\n \n

Error conditions

\n
\n
\n \n fatal\n \n

Critical system errors

\n
\n
\n
\n
\n\n \n
\n ${configs.map(config => html`\n
\n
\n
\n

${config.category}

\n
\n ${config.enabled ? html`\n \n Enabled\n \n ` : html`\n \n Disabled\n \n `}\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n \n \n \n \n \n \n

Only logs at this level or higher will be stored

\n
\n \n
\n \n \n

Logs older than this will be deleted

\n
\n \n
\n \n \n

Maximum number of logs to keep for this category

\n
\n
\n \n
\n
\n \n Update Configuration\n \n
\n
\n \n
\n
\n
Created: ${new Date(config.createdAt).toLocaleDateString()}
\n
Updated: ${new Date(config.updatedAt).toLocaleDateString()}
\n
\n
\n
\n `).join('')}\n
\n\n \n
\n
\n

Global Log Settings

\n
\n
\n
\n
\n

Storage Information

\n
\n
\n
-
\n
Total Log Entries
\n
\n
\n
-
\n
Storage Used
\n
\n
\n
-
\n
Oldest Log
\n
\n
\n
\n \n
\n

Log Categories

\n
\n
    \n
  • auth - Authentication and authorization events
  • \n
  • api - API requests and responses
  • \n
  • workflow - Content workflow state changes
  • \n
  • plugin - Plugin-related activities
  • \n
  • media - File upload and media operations
  • \n
  • system - General system events
  • \n
  • security - Security-related events and alerts
  • \n
  • error - General error conditions
  • \n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n return adminLayoutV2({\n title: 'Log Configuration',\n user,\n content: content as string\n })\n}","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { D1Database, KVNamespace } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport { getLogger, type LogLevel, type LogCategory, type LogFilter } from '../services'\nimport { renderLogsListPage, type LogsListPageData } from '../templates/pages/admin-logs-list.template'\nimport { renderLogDetailsPage, type LogDetailsPageData } from '../templates/pages/admin-log-details.template'\nimport { renderLogConfigPage, type LogConfigPageData } from '../templates/pages/admin-log-config.template'\nimport type { Bindings, Variables } from '../app'\n\nconst adminLogsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminLogsRoutes.use('*', requireAuth())\n\n// Main logs listing page\nadminLogsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Use Hono's built-in query method instead of parsing URL\n const query = c.req.query()\n \n // Parse query parameters\n const page = parseInt(query.page || '1')\n const limit = parseInt(query.limit || '50')\n const level = query.level\n const category = query.category\n const search = query.search\n const startDate = query.start_date\n const endDate = query.end_date\n const source = query.source\n \n // Build filter\n const filter: LogFilter = {\n limit,\n offset: (page - 1) * limit,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (search) {\n filter.search = search\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n if (source) {\n filter.source = source\n }\n \n // Get logs and total count\n const { logs, total } = await logger.getLogs(filter)\n \n // Format logs for display\n const formattedLogs = logs.map(log => ({\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }))\n \n const totalPages = Math.ceil(total / limit)\n \n const pageData: LogsListPageData = {\n logs: formattedLogs,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total),\n baseUrl: '/admin/logs'\n },\n filters: {\n level: level || '',\n category: category || '',\n search: search || '',\n startDate: startDate || '',\n endDate: endDate || '',\n source: source || ''\n },\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogsListPage(pageData))\n } catch (error) {\n console.error('Error fetching logs:', error)\n return c.html(html`

Error loading logs: ${error}

`)\n }\n})\n\n// Log details page\nadminLogsRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get single log by ID\n const { logs } = await logger.getLogs({ \n limit: 1, \n offset: 0,\n search: id // Using search to find by ID - this is a simplification\n })\n \n const log = logs.find(l => l.id === id)\n \n if (!log) {\n return c.html(html`

Log entry not found

`)\n }\n \n const formattedLog = {\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n \n const pageData: LogDetailsPageData = {\n log: formattedLog,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogDetailsPage(pageData))\n } catch (error) {\n console.error('Error fetching log details:', error)\n return c.html(html`

Error loading log details: ${error}

`)\n }\n})\n\n// Log configuration page\nadminLogsRoutes.get('/config', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get all log configurations\n const configs = await logger.getAllConfigs()\n \n const pageData: LogConfigPageData = {\n configs,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogConfigPage(pageData))\n } catch (error) {\n console.error('Error fetching log config:', error)\n return c.html(html`

Error loading log configuration: ${error}

`)\n }\n})\n\n// Update log configuration\nadminLogsRoutes.post('/config/:category', async (c) => {\n try {\n const category = c.req.param('category') as LogCategory\n const formData = await c.req.formData()\n \n const enabled = formData.get('enabled') === 'on'\n const level = formData.get('level') as string\n const retention = parseInt(formData.get('retention') as string)\n const maxSize = parseInt(formData.get('max_size') as string)\n \n const logger = getLogger(c.env.DB)\n await logger.updateConfig(category, {\n enabled,\n level,\n retention,\n maxSize\n })\n \n return c.html(html`\n
\n Configuration updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating log config:', error)\n return c.html(html`\n
\n Failed to update configuration. Please try again.\n
\n `)\n }\n})\n\n// Export logs\nadminLogsRoutes.get('/export', async (c) => {\n try {\n const query = c.req.query()\n const format = query.format || 'csv'\n const level = query.level\n const category = query.category\n const startDate = query.start_date\n const endDate = query.end_date\n \n const logger = getLogger(c.env.DB)\n \n // Build filter for export\n const filter: LogFilter = {\n limit: 10000, // Export up to 10k logs\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n const { logs } = await logger.getLogs(filter)\n \n if (format === 'json') {\n return c.json(logs, 200, {\n 'Content-Disposition': 'attachment; filename=\"logs-export.json\"'\n })\n } else {\n // Default to CSV\n const headers = [\n 'ID', 'Level', 'Category', 'Message', 'Source', 'User ID', \n 'IP Address', 'Method', 'URL', 'Status Code', 'Duration', \n 'Created At'\n ]\n const csvRows = [headers.join(',')]\n \n logs.forEach(log => {\n const row = [\n log.id,\n log.level,\n log.category,\n `\"${log.message.replace(/\"/g, '\"\"')}\"`, // Escape quotes\n log.source || '',\n log.userId || '',\n log.ipAddress || '',\n log.method || '',\n log.url || '',\n log.statusCode || '',\n log.duration || '',\n new Date(log.createdAt).toISOString()\n ]\n csvRows.push(row.join(','))\n })\n \n const csv = csvRows.join('\\n')\n \n return new Response(csv, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': 'attachment; filename=\"logs-export.csv\"'\n }\n })\n }\n } catch (error) {\n console.error('Error exporting logs:', error)\n return c.json({ error: 'Failed to export logs' }, 500)\n }\n})\n\n// Clean up old logs\nadminLogsRoutes.post('/cleanup', async (c) => {\n try {\n const user = c.get('user')\n \n // Only allow admin users to run cleanup\n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n \n const logger = getLogger(c.env.DB)\n await logger.cleanupByRetention()\n \n return c.html(html`\n
\n Log cleanup completed successfully!\n
\n `)\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n return c.html(html`\n
\n Failed to clean up logs. Please try again.\n
\n `)\n }\n})\n\n// Search logs (HTMX endpoint)\nadminLogsRoutes.post('/search', async (c) => {\n try {\n const formData = await c.req.formData()\n const search = formData.get('search') as string\n const level = formData.get('level') as string\n const category = formData.get('category') as string\n \n const logger = getLogger(c.env.DB)\n \n const filter: LogFilter = {\n limit: 20,\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (search) filter.search = search\n if (level) filter.level = [level] as LogLevel[]\n if (category) filter.category = [category] as LogCategory[]\n \n const { logs } = await logger.getLogs(filter)\n \n // Return just the logs table rows for HTMX\n const rows = logs.map(log => {\n const formattedLog = {\n ...log,\n formattedDate: new Date(log.createdAt).toLocaleString(),\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n\n return `\n \n \n \n ${formattedLog.level}\n \n \n \n \n ${formattedLog.category}\n \n \n \n
${formattedLog.message}
\n \n ${formattedLog.source || '-'}\n ${formattedLog.formattedDate}\n \n View\n \n \n `\n }).join('')\n\n return c.html(rows)\n } catch (error) {\n console.error('Error searching logs:', error)\n return c.html(html`Error searching logs`)\n }\n})\n\n// Helper functions\nfunction getLevelClass(level: string): string {\n switch (level) {\n case 'debug': return 'bg-gray-100 text-gray-800'\n case 'info': return 'bg-blue-100 text-blue-800'\n case 'warn': return 'bg-yellow-100 text-yellow-800'\n case 'error': return 'bg-red-100 text-red-800'\n case 'fatal': return 'bg-purple-100 text-purple-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nfunction getCategoryClass(category: string): string {\n switch (category) {\n case 'auth': return 'bg-green-100 text-green-800'\n case 'api': return 'bg-blue-100 text-blue-800'\n case 'workflow': return 'bg-purple-100 text-purple-800'\n case 'plugin': return 'bg-indigo-100 text-indigo-800'\n case 'media': return 'bg-pink-100 text-pink-800'\n case 'system': return 'bg-gray-100 text-gray-800'\n case 'security': return 'bg-red-100 text-red-800'\n case 'error': return 'bg-red-100 text-red-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nexport { adminLogsRoutes }","import { Hono } from 'hono'\nimport { renderDesignPage, DesignPageData } from '../templates/pages/admin-design.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminDesignRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminDesignRoutes.get('/', (c) => {\n const user = c.get('user')\n \n const pageData: DesignPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderDesignPage(pageData))\n})","import { Hono } from 'hono'\nimport { renderCheckboxPage, CheckboxPageData } from '../templates/pages/admin-checkboxes.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminCheckboxRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCheckboxRoutes.get('/', (c) => {\n const user = c.get('user')\n\n const pageData: CheckboxPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderCheckboxPage(pageData))\n})\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface Testimonial {\n id?: number\n authorName: string\n authorTitle?: string\n authorCompany?: string\n testimonialText: string\n rating?: number\n isPublished: boolean\n sortOrder: number\n}\n\ninterface TestimonialsFormData {\n testimonial?: Testimonial\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderTestimonialsForm(data: TestimonialsFormData): string {\n const { testimonial, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Testimonial' : 'New Testimonial'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the testimonial details below' : 'Create a new customer testimonial'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Author Information

\n\n \n
\n \n
\n \n
\n ${errors?.authorName ? `\n
\n ${errors.authorName.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.authorTitle ? `\n
\n ${errors.authorTitle.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.authorCompany ? `\n
\n ${errors.authorCompany.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Testimonial

\n\n \n
\n \n
\n \n

\n 0/1000 characters\n

\n
\n ${errors?.testimonialText ? `\n
\n ${errors.testimonialText.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.rating ? `\n
\n ${errors.rating.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/testimonials/${testimonial?.id}` : '/admin/testimonials/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderTestimonialsList } from '../templates/pages/admin-testimonials-list.template'\nimport { renderTestimonialsForm } from '../templates/pages/admin-testimonials-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst testimonialSchema = z.object({\n authorName: z.string().min(1, 'Author name is required').max(100, 'Author name must be under 100 characters'),\n authorTitle: z.string().optional(),\n authorCompany: z.string().optional(),\n testimonialText: z.string().min(1, 'Testimonial is required').max(1000, 'Testimonial must be under 1000 characters'),\n rating: z.string().transform(val => val ? parseInt(val, 10) : undefined).pipe(z.number().min(1).max(5).optional()),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminTestimonialsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminTestimonialsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, minRating, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (minRating) {\n whereClause += ' AND rating >= ?'\n params.push(parseInt(minRating, 10))\n }\n\n if (search) {\n whereClause += ' AND (author_name LIKE ? OR testimonial_text LIKE ? OR author_company LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM testimonials ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM testimonials\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: testimonials } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderTestimonialsList({\n testimonials: testimonials || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonials:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonials',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminTestimonialsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial created successfully')\n } else {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating testimonial:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM testimonials WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/testimonials?message=Testimonial not found&type=error')\n }\n\n const testimonial = results[0] as any\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id: testimonial.id,\n authorName: testimonial.author_name,\n authorTitle: testimonial.author_title,\n authorCompany: testimonial.author_company,\n testimonialText: testimonial.testimonial_text,\n rating: testimonial.rating,\n isPublished: Boolean(testimonial.isPublished),\n sortOrder: testimonial.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonial:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE testimonials\n SET author_name = ?, author_title = ?, author_company = ?, testimonial_text = ?, rating = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial updated successfully')\n } else {\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: validatedData.authorName,\n authorTitle: validatedData.authorTitle,\n authorCompany: validatedData.authorCompany,\n testimonialText: validatedData.testimonialText,\n rating: validatedData.rating,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Testimonial not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating testimonial:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM testimonials WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Testimonial not found' }, 404)\n }\n\n return c.redirect('/admin/testimonials?message=Testimonial deleted successfully')\n } catch (error) {\n console.error('Error deleting testimonial:', error)\n return c.json({ error: 'Failed to delete testimonial' }, 500)\n }\n})\n\nexport default adminTestimonialsRoutes\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface CodeExample {\n id?: number\n title: string\n description?: string\n code: string\n language: string\n category?: string\n tags?: string\n isPublished: boolean\n sortOrder: number\n}\n\ninterface CodeExamplesFormData {\n codeExample?: CodeExample\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderCodeExamplesForm(data: CodeExamplesFormData): string {\n const { codeExample, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Code Example' : 'New Code Example'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the code example details below' : 'Create a new code snippet or example'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Basic Information

\n\n \n
\n \n
\n \n
\n ${errors?.title ? `\n
\n ${errors.title.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

\n 0/500 characters\n

\n
\n ${errors?.description ? `\n
\n ${errors.description.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.language ? `\n
\n ${errors.language.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.category ? `\n
\n ${errors.category.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

Comma-separated tags

\n
\n ${errors?.tags ? `\n
\n ${errors.tags.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Code

\n\n \n
\n \n
\n \n

\n 0 characters\n

\n
\n ${errors?.code ? `\n
\n ${errors.code.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/code-examples/${codeExample?.id}` : '/admin/code-examples/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderCodeExamplesList } from '../templates/pages/admin-code-examples-list.template'\nimport { renderCodeExamplesForm } from '../templates/pages/admin-code-examples-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst codeExampleSchema = z.object({\n title: z.string().min(1, 'Title is required').max(200, 'Title must be under 200 characters'),\n description: z.string().max(500, 'Description must be under 500 characters').optional(),\n code: z.string().min(1, 'Code is required'),\n language: z.string().min(1, 'Language is required'),\n category: z.string().max(50, 'Category must be under 50 characters').optional(),\n tags: z.string().max(200, 'Tags must be under 200 characters').optional(),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminCodeExamplesRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCodeExamplesRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, language, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (language) {\n whereClause += ' AND language = ?'\n params.push(language)\n }\n\n if (search) {\n whereClause += ' AND (title LIKE ? OR description LIKE ? OR code LIKE ? OR tags LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM code_examples ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM code_examples\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: codeExamples } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderCodeExamplesList({\n codeExamples: codeExamples || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code examples:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code examples',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminCodeExamplesRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example created successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating code example:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM code_examples WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/code-examples?message=Code example not found&type=error')\n }\n\n const example = results[0] as any\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id: example.id,\n title: example.title,\n description: example.description,\n code: example.code,\n language: example.language,\n category: example.category,\n tags: example.tags,\n isPublished: Boolean(example.isPublished),\n sortOrder: example.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code example:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE code_examples\n SET title = ?, description = ?, code = ?, language = ?, category = ?, tags = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example updated successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: validatedData.title,\n description: validatedData.description,\n code: validatedData.code,\n language: validatedData.language,\n category: validatedData.category,\n tags: validatedData.tags,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Code example not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating code example:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM code_examples WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Code example not found' }, 404)\n }\n\n return c.redirect('/admin/code-examples?message=Code example deleted successfully')\n } catch (error) {\n console.error('Error deleting code example:', error)\n return c.json({ error: 'Failed to delete code example' }, 500)\n }\n})\n\nexport default adminCodeExamplesRoutes\n","import {\n AdminLayoutData,\n renderAdminLayout,\n} from \"../layouts/admin-layout-v2.template\";\n\nexport interface DashboardStats {\n collections: number;\n contentItems: number;\n mediaFiles: number;\n users: number;\n databaseSize?: number; // Size in bytes\n mediaSize?: number; // Total size of all media files in bytes\n recentActivity?: ActivityItem[];\n analytics?: AnalyticsData;\n}\n\nexport interface ActivityItem {\n id: string;\n type: \"content\" | \"media\" | \"user\" | \"collection\";\n action: string;\n description: string;\n timestamp: string;\n user: string;\n}\n\nexport interface AnalyticsData {\n pageViews: number;\n uniqueVisitors: number;\n contentPublished: number;\n mediaUploaded: number;\n weeklyGrowth: {\n pageViews: number;\n visitors: number;\n content: number;\n media: number;\n };\n}\n\nexport interface DashboardPageData {\n user?: {\n name: string;\n email: string;\n role: string;\n };\n stats?: DashboardStats;\n version?: string;\n enableExperimentalFeatures?: boolean;\n}\n\nexport function renderDashboardPage(data: DashboardPageData): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n \n \n ${renderStatsCardsSkeleton()}\n \n\n \n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n \n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderDashboardPageWithDynamicMenu(\n data: DashboardPageData,\n dynamicMenuItems: Array<{ label: string; path: string; icon: string }>\n): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n
\n ${renderStatsCards({\n collections: 0,\n contentItems: 0,\n mediaFiles: 0,\n users: 0,\n })}\n
\n\n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n enableExperimentalFeatures: data.enableExperimentalFeatures,\n content: pageContent,\n dynamicMenuItems,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderStatsCards(stats: DashboardStats): string {\n const cards = [\n {\n title: \"Total Collections\",\n value: stats.collections.toString(),\n change: \"12.5\",\n isPositive: true,\n },\n {\n title: \"Content Items\",\n value: stats.contentItems.toString(),\n change: \"8.2\",\n isPositive: true,\n },\n {\n title: \"Media Files\",\n value: stats.mediaFiles.toString(),\n change: \"15.3\",\n isPositive: true,\n },\n {\n title: \"Active Users\",\n value: stats.users.toString(),\n change: \"2.4\",\n isPositive: false,\n },\n ];\n\n const cardColors = ['text-cyan-400', 'text-lime-400', 'text-pink-400', 'text-purple-400'];\n\n return `\n
\n

Last 30 days

\n
\n ${cards.map((card, index) => `\n
\n
${card.title}
\n
\n
\n ${card.value}\n
\n
\n \n ${card.isPositive\n ? ''\n : ''\n }\n \n ${card.isPositive ? 'Increased' : 'Decreased'} by\n ${card.change}%\n
\n
\n
\n `).join('')}\n
\n
\n `;\n}\n\nfunction renderStatsCardsSkeleton(): string {\n return `\n
\n
\n
\n ${Array(4)\n .fill(0)\n .map(\n () => `\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n `;\n}\n\nfunction renderAnalyticsChart(): string {\n return `\n
\n
\n
\n
\n

Real-Time Analytics

\n

Requests per second (live)

\n
\n
\n
\n Live\n
\n
\n
\n 0\n req/s\n
\n
\n\n
\n \n
\n\n \n
\n \n\n \n `;\n}\n\nexport function renderRecentActivitySkeleton(): string {\n return `\n
\n
\n
\n
\n
\n
\n ${Array(3).fill(0).map(() => `\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n}\n\nexport function renderRecentActivity(activities?: ActivityItem[]): string {\n // Helper to get user initials\n const getInitials = (user: string): string => {\n const parts = user.split(' ').filter(p => p.length > 0)\n if (parts.length >= 2) {\n const first = parts[0]?.[0] || ''\n const second = parts[1]?.[0] || ''\n return (first + second).toUpperCase()\n }\n return user.substring(0, 2).toUpperCase()\n }\n\n // Helper to get relative time\n const getRelativeTime = (timestamp: string): string => {\n const date = new Date(timestamp)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) return 'just now'\n if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`\n return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`\n }\n\n // Helper to get color classes based on activity type\n const getColorClasses = (type: string): { bgColor: string; textColor: string } => {\n switch (type) {\n case 'content':\n return {\n bgColor: 'bg-lime-500/10 dark:bg-lime-400/10',\n textColor: 'text-lime-700 dark:text-lime-300'\n }\n case 'media':\n return {\n bgColor: 'bg-cyan-500/10 dark:bg-cyan-400/10',\n textColor: 'text-cyan-700 dark:text-cyan-300'\n }\n case 'user':\n return {\n bgColor: 'bg-pink-500/10 dark:bg-pink-400/10',\n textColor: 'text-pink-700 dark:text-pink-300'\n }\n case 'collection':\n return {\n bgColor: 'bg-purple-500/10 dark:bg-purple-400/10',\n textColor: 'text-purple-700 dark:text-purple-300'\n }\n default:\n return {\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300'\n }\n }\n }\n\n // Format activities with colors and times\n const formattedActivities = (activities || []).map(activity => {\n const colors = getColorClasses(activity.type)\n return {\n ...activity,\n initials: getInitials(activity.user),\n time: getRelativeTime(activity.timestamp),\n ...colors\n }\n })\n\n // If no activities, show empty state\n if (formattedActivities.length === 0) {\n formattedActivities.push({\n type: 'content' as const,\n description: 'No recent activity',\n user: 'System',\n time: '',\n initials: 'SY',\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300',\n id: '0',\n action: '',\n timestamp: new Date().toISOString()\n })\n }\n\n return `\n
\n
\n
\n

Recent Activity

\n \n
\n
\n\n
\n
    \n ${formattedActivities\n .map(\n (activity) => `\n
  • \n
    \n ${activity.initials}\n
    \n
    \n

    ${activity.description}

    \n

    \n ${activity.user}\n · \n ${activity.time}\n

    \n
    \n
  • \n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderQuickActions(): string {\n const actions = [\n {\n title: \"Create Content\",\n description: \"Add new blog post or page\",\n href: \"/admin/content/new\",\n icon: `\n \n `,\n },\n {\n title: \"Upload Media\",\n description: \"Add images and files\",\n href: \"/admin/media\",\n icon: `\n \n `,\n },\n {\n title: \"Manage Users\",\n description: \"Add or edit user accounts\",\n href: \"/admin/users\",\n icon: `\n \n `,\n },\n ];\n\n return `\n
\n
\n

Quick Actions

\n
\n\n
\n
\n ${actions\n .map(\n (action) => `\n \n
\n ${action.icon}\n
\n
\n

${action.title}

\n

${action.description}

\n
\n \n \n \n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderSystemStatus(): string {\n return `\n
\n
\n
\n

System Status

\n
\n
\n Live\n
\n
\n
\n\n \n \n
\n ${[\n { color: 'from-blue-500/20 to-cyan-500/20', darkColor: 'dark:from-blue-500/10 dark:to-cyan-500/10' },\n { color: 'from-purple-500/20 to-pink-500/20', darkColor: 'dark:from-purple-500/10 dark:to-pink-500/10' },\n { color: 'from-amber-500/20 to-orange-500/20', darkColor: 'dark:from-amber-500/10 dark:to-orange-500/10' },\n { color: 'from-lime-500/20 to-emerald-500/20', darkColor: 'dark:from-lime-500/10 dark:to-emerald-500/10' }\n ].map((gradient, i) => `\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n \n\n \n `;\n}\n\nexport function renderStorageUsage(databaseSizeBytes?: number, mediaSizeBytes?: number): string {\n // Helper to format bytes to human readable\n const formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`\n }\n\n const dbSizeGB = databaseSizeBytes ? databaseSizeBytes / (1024 ** 3) : 0\n const dbMaxGB = 10\n const dbPercentageRaw = (dbSizeGB / dbMaxGB) * 100\n // Ensure minimum 0.5% visibility for progress bar, max 100%\n const dbPercentage = Math.min(Math.max(dbPercentageRaw, 0.5), 100)\n const dbUsedFormatted = databaseSizeBytes ? formatBytes(databaseSizeBytes) : 'Unknown'\n\n const mediaUsedFormatted = mediaSizeBytes ? formatBytes(mediaSizeBytes) : '0 B'\n\n const storageItems = [\n {\n label: \"Database\",\n used: dbUsedFormatted,\n total: \"10 GB\",\n percentage: dbPercentage,\n color: dbPercentage > 80 ? \"bg-red-500 dark:bg-red-400\" : dbPercentage > 60 ? \"bg-amber-500 dark:bg-amber-400\" : \"bg-cyan-500 dark:bg-cyan-400\",\n },\n {\n label: \"Media Files\",\n used: mediaUsedFormatted,\n total: \"∞\",\n percentage: 0,\n color: \"bg-lime-500 dark:bg-lime-400\",\n note: \"Stored in R2\"\n },\n {\n label: \"Cache (KV)\",\n used: \"N/A\",\n total: \"∞\",\n percentage: 0,\n color: \"bg-purple-500 dark:bg-purple-400\",\n note: \"Unlimited\"\n },\n ];\n\n return `\n
\n
\n

Storage Usage

\n
\n\n
\n
\n ${storageItems\n .map(\n (item: any) => `\n
\n
\n
\n ${item.label}\n ${item.note ? `(${item.note})` : ''}\n
\n
${item.used} / ${item.total}
\n
\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}","import { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderDashboardPage,\n type DashboardPageData,\n renderStatsCards,\n renderStorageUsage,\n renderRecentActivity,\n type ActivityItem\n} from '../templates/pages/admin-dashboard.template'\nimport { getCoreVersion } from '../utils/version'\nimport { metricsTracker } from '../utils/metrics'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin - Admin Dashboard\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: DashboardPageData = {\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n } catch (error) {\n console.error('Dashboard error:', error)\n\n // Return dashboard with error state\n const pageData: DashboardPageData = {\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n }\n})\n\n/**\n * GET /admin/dashboard/stats - Dashboard stats HTML fragment (HTMX endpoint)\n */\nrouter.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n const html = renderStatsCards({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n users: usersCount,\n mediaSize: mediaSize\n })\n\n return c.html(html)\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.html('
Failed to load statistics
')\n }\n})\n\n/**\n * GET /admin/dashboard/storage - Storage usage HTML fragment (HTMX endpoint)\n */\nrouter.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n const html = renderStorageUsage(databaseSize, mediaSize)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.html('
Failed to load storage information
')\n }\n})\n\n/**\n * GET /admin/dashboard/recent-activity - Recent activity HTML fragment (HTMX endpoint)\n */\nrouter.get('/recent-activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '5')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const activities: ActivityItem[] = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n // Format description based on action and resource type\n let description = ''\n if (row.action === 'create') {\n description = `Created new ${row.resource_type}`\n } else if (row.action === 'update') {\n description = `Updated ${row.resource_type}`\n } else if (row.action === 'delete') {\n description = `Deleted ${row.resource_type}`\n } else {\n description = `${row.action} ${row.resource_type}`\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n description,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n const html = renderRecentActivity(activities)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n const html = renderRecentActivity([])\n return c.html(html)\n }\n})\n\n/**\n * GET /admin/api/metrics - Real-time metrics for analytics chart\n * Returns JSON with current requests per second from the metrics tracker\n */\nrouter.get('/api/metrics', async (c) => {\n return c.json({\n requestsPerSecond: metricsTracker.getRequestsPerSecond(),\n totalRequests: metricsTracker.getTotalRequests(),\n averageRPS: Number(metricsTracker.getAverageRPS().toFixed(2)),\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/dashboard/system-status - System status HTML fragment (HTMX endpoint)\n */\nrouter.get('/system-status', async (c) => {\n try {\n const html = `\n
\n
\n
\n
\n
\n API Status\n \n \n \n
\n

Operational

\n
\n
\n\n
\n
\n
\n
\n Database\n \n \n \n
\n

Connected

\n
\n
\n\n
\n
\n
\n
\n R2 Storage\n \n \n \n
\n

Available

\n
\n
\n\n
\n
\n
\n
\n KV Cache\n \n \n \n
\n

Ready

\n
\n
\n
\n `\n return c.html(html)\n } catch (error) {\n console.error('Error fetching system status:', error)\n return c.html('
Failed to load system status
')\n }\n})\n\nexport { router as adminDashboardRoutes }\n","export function isMarkdownEditorType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nexport function normalizeFieldType(fieldType: string): string {\n if (isMarkdownEditorType(fieldType)) {\n return 'markdown'\n }\n\n if (fieldType === 'tinymce') {\n return 'richtext'\n }\n\n return fieldType\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\nexport interface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCollectionsListPage(data: CollectionsListPageData): string {\n const tableData: any = {\n tableId: 'collections-table',\n rowClickable: true,\n rowClickUrl: (collection: Collection) => `/admin/collections/${collection.id}`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => `\n
\n \n ${collection.name}\n \n ${collection.managed ? `\n \n \n \n \n Config\n \n ` : ''}\n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'description',\n label: 'Description',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => collection.description || '-'\n },\n {\n key: 'field_count',\n label: 'Fields',\n sortable: true,\n sortType: 'number',\n render: (_value: any, collection: any) => {\n const count = collection.field_count || 0\n return `\n
\n \n ${count} ${count === 1 ? 'field' : 'fields'}\n \n
\n `\n }\n },\n {\n key: 'managed',\n label: 'Source',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => {\n if (collection.managed) {\n return `\n
\n \n \n \n Code\n
\n `\n } else {\n return `\n
\n \n \n \n \n \n Database\n
\n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Content',\n sortable: false,\n render: (_value: any, collection: any) => {\n if (!collection || !collection.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.collections,\n emptyMessage: 'No collections found.'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Collections

\n

Manage your content collections and their schemas

\n
\n \n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n ${data.collections.length} ${data.collections.length === 1 ? 'collection' : 'collections'}\n \n \n \n \n Refresh\n \n
\n
\n
\n
\n
\n\n \n
\n ${renderTable(tableData)}\n
\n\n \n ${data.collections.length === 0 ? `\n
\n \n \n \n

No collections found

\n

Get started by creating your first collection

\n \n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Collections',\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","export interface TableColumn {\n key: string\n label: string\n sortable?: boolean\n className?: string\n sortType?: 'string' | 'number' | 'date' | 'boolean'\n render?: (value: any, row: any) => string\n}\n\nexport interface TableData {\n columns: TableColumn[]\n rows: T[]\n selectable?: boolean\n className?: string\n emptyMessage?: string\n tableId?: string\n title?: string\n rowClickable?: boolean\n rowClickUrl?: (row: T) => string\n}\n\nexport function renderTable(data: TableData): string {\n const tableId = data.tableId || `table-${Math.random().toString(36).substr(2, 9)}`\n\n if (data.rows.length === 0) {\n return `\n
\n
\n \n \n \n

${data.emptyMessage || 'No data available'}

\n
\n
\n `\n }\n\n return `\n
\n ${data.title ? `\n
\n

${data.title}

\n
\n ` : ''}\n
\n \n \n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, index) => {\n const isFirst = index === 0 && !data.selectable\n const isLast = index === data.columns.length - 1\n return `\n \n `}).join('')}\n \n \n \n ${data.rows.map((row, rowIndex) => {\n if (!row) return ''\n const clickableClass = data.rowClickable ? 'cursor-pointer' : ''\n const clickHandler = data.rowClickable && data.rowClickUrl ? `onclick=\"window.location.href='${data.rowClickUrl(row)}'\"` : ''\n return `\n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, colIndex) => {\n const value = (row as any)[column.key]\n const displayValue = column.render ? column.render(value, row) : value\n const stopPropagation = column.key === 'actions' ? 'onclick=\"event.stopPropagation()\"' : ''\n const isFirst = colIndex === 0 && !data.selectable\n const isLast = colIndex === data.columns.length - 1\n return `\n \n `\n }).join('')}\n \n `\n }).join('')}\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${column.sortable ? `\n \n ${column.label}\n
\n \n \n \n \n \n \n
\n \n ` : column.label}\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${displayValue || ''}\n
\n
\n\n \n
\n `\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm, FormData, FormField } from '../form.template'\nimport { renderAlert } from '../components/alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\n// Helper function to get field type badge with color\nfunction getFieldTypeBadge(fieldType: string): string {\n const typeLabels: Record = {\n 'text': 'Text',\n 'slug': 'URL Slug',\n 'richtext': 'Rich Text (TinyMCE)',\n 'quill': 'Rich Text (Quill)',\n 'markdown': 'Markdown',\n 'mdxeditor': 'Markdown',\n 'easymde': 'Markdown',\n 'number': 'Number',\n 'boolean': 'Boolean',\n 'date': 'Date',\n 'select': 'Select',\n 'media': 'Media',\n 'reference': 'Reference'\n }\n const typeColors: Record = {\n 'text': 'bg-blue-500/10 dark:bg-blue-400/10 text-blue-700 dark:text-blue-300 ring-blue-500/20 dark:ring-blue-400/20',\n 'slug': 'bg-sky-500/10 dark:bg-sky-400/10 text-sky-700 dark:text-sky-300 ring-sky-500/20 dark:ring-sky-400/20',\n 'richtext': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'quill': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'markdown': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'mdxeditor': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'easymde': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'number': 'bg-green-500/10 dark:bg-green-400/10 text-green-700 dark:text-green-300 ring-green-500/20 dark:ring-green-400/20',\n 'boolean': 'bg-amber-500/10 dark:bg-amber-400/10 text-amber-700 dark:text-amber-300 ring-amber-500/20 dark:ring-amber-400/20',\n 'date': 'bg-cyan-500/10 dark:bg-cyan-400/10 text-cyan-700 dark:text-cyan-300 ring-cyan-500/20 dark:ring-cyan-400/20',\n 'select': 'bg-indigo-500/10 dark:bg-indigo-400/10 text-indigo-700 dark:text-indigo-300 ring-indigo-500/20 dark:ring-indigo-400/20',\n 'media': 'bg-rose-500/10 dark:bg-rose-400/10 text-rose-700 dark:text-rose-300 ring-rose-500/20 dark:ring-rose-400/20',\n 'reference': 'bg-teal-500/10 dark:bg-teal-400/10 text-teal-700 dark:text-teal-300 ring-teal-500/20 dark:ring-teal-400/20'\n }\n const label = typeLabels[fieldType] || fieldType\n const color = typeColors[fieldType] || 'bg-zinc-500/10 dark:bg-zinc-400/10 text-zinc-700 dark:text-zinc-300 ring-zinc-500/20 dark:ring-zinc-400/20'\n return `${label}`\n}\n\nexport function renderCollectionFormPage(data: CollectionFormData): string {\n console.log('[renderCollectionFormPage] editorPlugins:', data.editorPlugins)\n\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? 'Edit Collection' : 'Create New Collection'\n const subtitle = isEdit\n ? `Update collection: ${data.display_name}`\n : 'Define a new content collection with custom fields and settings.'\n\n // Pre-compute data attribute for all fields (without badge HTML to avoid escaping issues)\n const fieldsWithData = (data.fields || []).map(field => ({\n ...field,\n dataFieldJSON: JSON.stringify(JSON.stringify(field))\n }))\n\n const fields: FormField[] = [\n {\n name: 'displayName',\n label: 'Display Name',\n type: 'text',\n value: data.display_name || '',\n placeholder: 'Blog Posts',\n required: true,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'name',\n label: 'Collection Name',\n type: 'text',\n value: data.name || '',\n placeholder: 'blog_posts',\n required: true,\n readonly: isEdit,\n helpText: isEdit ? 'Collection name cannot be changed' : 'Lowercase letters, numbers, and underscores only',\n className: isEdit ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'description',\n label: 'Description',\n type: 'textarea',\n value: data.description || '',\n placeholder: 'Description of this collection...',\n rows: 3,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n }\n ]\n\n\n const formData: FormData = {\n id: 'collection-form',\n ...(isEdit\n ? { hxPut: `/admin/collections/${data.id}`, action: `/admin/collections/${data.id}`, method: 'PUT' }\n : { hxPost: '/admin/collections', action: '/admin/collections' }\n ),\n hxTarget: '#form-messages',\n fields: fields,\n submitButtons: data.managed ? [] : [\n {\n label: isEdit ? 'Update Collection' : 'Create Collection',\n type: 'submit',\n className: 'btn-primary'\n }\n ]\n }\n\n const pageContent = `\n
\n \n ${data.managed ? `\n
\n
\n \n \n \n
\n

\n Config-Managed Collection\n

\n
\n

This collection is managed by a configuration file and cannot be edited through the admin interface.

\n

\n Config file:\n \n src/collections/${data.name}.collection.ts\n \n

\n

\n To modify this collection's schema, edit the configuration file directly in your code editor.\n

\n
\n
\n
\n
\n ` : ''}\n\n \n
\n
\n

${title}

\n

${subtitle}

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

Collection Details

\n

Configure your collection settings below

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n \n \n ${renderForm(formData)}\n\n ${isEdit && data.managed ? `\n \n
\n
\n

Collection Fields

\n

Fields defined in the configuration file (read-only)

\n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n ${field.field_name}\n
\n
\n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add fields to your collection configuration file to see them here.

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${isEdit && !data.managed ? `\n \n
\n
\n
\n

Collection Fields

\n

Define the fields that content in this collection will have

\n
\n \n \n \n \n Add Field\n \n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n Field name: ${field.field_name}\n
\n
\n
\n
\n \n \n \n \n Edit\n \n \n \n \n \n Delete\n \n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add your first field to get started

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${!isEdit ? `\n
\n
\n \n \n \n
\n

\n Create Collection First\n

\n

\n After creating the collection, you'll be able to add and configure custom fields.\n

\n
\n
\n
\n ` : ''}\n \n \n
\n \n \n \n \n ${data.managed ? 'Back to Collections' : 'Cancel'}\n \n\n ${isEdit && !data.managed ? `\n \n \n \n \n Delete Collection\n \n ` : ''}\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Add Field

\n \n
\n
\n\n
\n \n\n
\n \n \n

Lowercase letters, numbers, and underscores only

\n
\n\n
\n \n
\n \n \n \n \n ${data.editorPlugins?.tinymce ? '' : ''}\n ${data.editorPlugins?.quill ? '' : ''}\n ${data.editorPlugins?.easyMdx ? '' : ''}\n \n \n \n \n \n \n \n \n \n \n \n
\n

\n
\n\n
\n \n \n
\n\n
\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n\n
\n \n \n

JSON configuration for field-specific options

\n
\n\n
\n \n Cancel\n \n \n Add Field\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-field-confirm',\n title: 'Delete Field',\n message: 'Are you sure you want to delete this field? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteField()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { normalizeFieldType } from './admin-collections-field-types'\nimport { renderCollectionsListPage } from '../templates/pages/admin-collections-list.template'\nimport { renderCollectionFormPage } from '../templates/pages/admin-collections-form.template'\n\n// Type definitions for collections\ninterface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\ninterface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\ninterface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\ninterface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminCollectionsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminCollectionsRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on collection modification routes\nadminCollectionsRoutes.post('*', requireRole(['admin']))\nadminCollectionsRoutes.put('*', requireRole(['admin']))\nadminCollectionsRoutes.delete('*', requireRole(['admin']))\n\n// Collections management - List all collections\nadminCollectionsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n const search = url.searchParams.get('search') || ''\n\n // Build query based on search\n let stmt\n let results\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, managed, schema\n FROM collections\n WHERE is_active = 1\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(\"SELECT id, name, display_name, description, created_at, managed, schema FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY created_at DESC\")\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Fetch field counts for all collections from content_fields table (legacy)\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections: Collection[] = (results || [])\n .filter((row: any) => row && row.id)\n .map((row: any) => {\n // Calculate field count: use schema if available, otherwise use content_fields table\n let fieldCount = 0\n if (row.schema) {\n try {\n const schema = typeof row.schema === 'string' ? JSON.parse(row.schema) : row.schema\n if (schema && schema.properties) {\n fieldCount = Object.keys(schema.properties).length\n }\n } catch (e) {\n // If schema parsing fails, fall back to content_fields count\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n } else {\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n\n return {\n id: String(row.id || ''),\n name: String(row.name || ''),\n display_name: String(row.display_name || ''),\n description: row.description ? String(row.description) : undefined,\n created_at: Number(row.created_at || 0),\n formattedDate: row.created_at ? new Date(Number(row.created_at)).toLocaleDateString() : 'Unknown',\n field_count: fieldCount,\n managed: row.managed === 1\n }\n })\n\n const pageData: CollectionsListPageData = {\n collections,\n search,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCollectionsListPage(pageData))\n } catch (error) {\n console.error('Error fetching collections:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.html(html`

Error loading collections: ${errorMessage}

`)\n }\n})\n\n// New collection form\nadminCollectionsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /new] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n})\n\n// Create collection\nadminCollectionsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const name = formData.get('name') as string\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n // Check if this is an HTMX request\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n // Basic validation\n if (!name || !displayName) {\n const errorMsg = 'Name and display name are required.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n // For regular form submission, redirect back with error\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Validate name format\n if (!/^[a-z0-9_]+$/.test(name)) {\n const errorMsg = 'Collection name must contain only lowercase letters, numbers, and underscores.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n const db = c.env.DB\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(name).first()\n\n if (existing) {\n const errorMsg = 'A collection with this name already exists.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Create basic schema for the collection\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n // Create collection\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n name,\n displayName,\n description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache (only if CACHE_KV is available)\n if (c.env.CACHE_KV) {\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n }\n\n if (isHtmx) {\n return c.html(html`\n
\n Collection created successfully! Redirecting to edit mode...\n \n
\n `)\n } else {\n // For regular form submission, redirect to edit page\n return c.redirect(`/admin/collections/${collectionId}`)\n }\n } catch (error) {\n console.error('Error creating collection:', error)\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n if (isHtmx) {\n return c.html(html`\n
\n Failed to create collection. Please try again.\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n})\n\n// Edit collection form\nadminCollectionsRoutes.get('/:id', async (c) => {\n const db = c.env.DB\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n\n // Get collection fields - try schema first, then content_fields table\n let fields: CollectionField[] = []\n\n // If collection has a schema, parse it\n if (collection.schema) {\n try {\n const schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n fields = Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n // Normalize schema formats to UI field types\n let fieldType = fieldConfig.type || 'string'\n if (fieldConfig.enum) {\n fieldType = 'select'\n } else if (fieldConfig.format === 'richtext') {\n fieldType = 'richtext'\n } else if (fieldConfig.format === 'media') {\n fieldType = 'media'\n } else if (fieldConfig.format === 'date-time') {\n fieldType = 'date'\n } else if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n fieldType = 'slug'\n }\n \n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: fieldType,\n field_label: fieldConfig.title || fieldName,\n field_options: fieldConfig,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: fieldConfig.searchable === true || false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table if no schema or parsing failed\n if (fields.length === 0) {\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n fields = (fieldsResults || []).map((row: any) => {\n let fieldOptions = {}\n if (row.field_options) {\n try {\n fieldOptions = typeof row.field_options === 'string' ? JSON.parse(row.field_options) : row.field_options\n } catch (e) {\n console.error('Error parsing field_options for field:', row.field_name, e)\n fieldOptions = {}\n }\n }\n return {\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: fieldOptions,\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }\n })\n }\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /:id] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n fields: fields,\n managed: collection.managed === 1,\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n } catch (error) {\n console.error('Error fetching collection:', error)\n const user = c.get('user')\n\n // Check which editor plugins are active (even in error state)\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Failed to load collection.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n})\n\n// Update collection\nadminCollectionsRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const formData = await c.req.formData()\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n if (!displayName) {\n return c.html(html`\n
\n Display name is required.\n
\n `)\n }\n\n const db = c.env.DB\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(displayName, description || null, Date.now(), id).run()\n\n return c.html(html`\n
\n Collection updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.html(html`\n
\n Failed to update collection. Please try again.\n
\n `)\n }\n})\n\n// Delete collection\nadminCollectionsRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.html(html`\n
\n Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.\n
\n `)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.html(html`\n
\n Failed to delete collection. Please try again.\n
\n `)\n }\n})\n\n// Add field to collection\nadminCollectionsRoutes.post('/:id/fields', async (c) => {\n try {\n const collectionId = c.req.param('id')\n const formData = await c.req.formData()\n const fieldName = formData.get('field_name') as string\n const fieldType = formData.get('field_type') as string\n const fieldLabel = formData.get('field_label') as string\n const isRequired = formData.get('is_required') === '1'\n const isSearchable = formData.get('is_searchable') === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n if (!fieldName || !fieldType || !fieldLabel) {\n return c.json({ success: false, error: 'Field name, type, and label are required.' })\n }\n\n // Validate field name format\n if (!/^[a-z0-9_]+$/.test(fieldName)) {\n return c.json({ success: false, error: 'Field name must contain only lowercase letters, numbers, and underscores.' })\n }\n\n const db = c.env.DB\n\n // Get current collection to check its schema\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Check if field already exists in schema\n let schema = collection.schema ? (typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema) : null\n\n if (schema && schema.properties && schema.properties[fieldName]) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Also check content_fields table for legacy support\n const existingStmt = db.prepare('SELECT id FROM content_fields WHERE collection_id = ? AND field_name = ?')\n const existing = await existingStmt.bind(collectionId, fieldName).first()\n\n if (existing) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Parse field options\n let parsedOptions = {}\n try {\n parsedOptions = fieldOptions ? JSON.parse(fieldOptions) : {}\n } catch (e) {\n console.error('Error parsing field options:', e)\n }\n\n // Add field to schema (primary storage method)\n if (schema) {\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Build field config based on type\n const fieldConfig: any = {\n type: fieldType === 'number' ? 'number' : fieldType === 'boolean' ? 'boolean' : 'string',\n title: fieldLabel,\n searchable: isSearchable,\n ...parsedOptions\n }\n\n const normalizedFieldType = normalizeFieldType(fieldType)\n\n // Handle special field types\n if (normalizedFieldType === 'richtext') {\n fieldConfig.format = 'richtext'\n } else if (normalizedFieldType === 'date') {\n fieldConfig.format = 'date-time'\n } else if (normalizedFieldType === 'select') {\n fieldConfig.enum = (parsedOptions as any).options || []\n } else if (fieldType === 'radio') {\n fieldConfig.type = 'radio'\n if (!(parsedOptions as any).enum && (parsedOptions as any).options) {\n fieldConfig.enum = (parsedOptions as any).options\n }\n } else if (fieldType === 'media') {\n fieldConfig.format = 'media'\n } else if (normalizedFieldType === 'slug') {\n fieldConfig.type = 'slug'\n fieldConfig.format = 'slug'\n } else if (normalizedFieldType === 'quill') {\n fieldConfig.type = 'quill'\n } else if (normalizedFieldType === 'markdown') {\n fieldConfig.type = 'markdown'\n } else if (normalizedFieldType === 'reference') {\n fieldConfig.type = 'reference'\n }\n\n schema.properties[fieldName] = fieldConfig\n\n // Add to required array if needed\n if (isRequired && !schema.required.includes(fieldName)) {\n schema.required.push(fieldName)\n }\n\n // Update collection schema in database\n const updateSchemaStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateSchemaStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Add Field] Added field to schema:', fieldName, fieldConfig)\n\n return c.json({ success: true, fieldId: `schema-${fieldName}` })\n }\n\n // Fallback: If no schema exists, use content_fields table\n // Get next field order\n const orderStmt = db.prepare('SELECT MAX(field_order) as max_order FROM content_fields WHERE collection_id = ?')\n const orderResult = await orderStmt.bind(collectionId).first() as any\n const nextOrder = (orderResult?.max_order || 0) + 1\n\n // Create field in content_fields table\n const fieldId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content_fields (\n id, collection_id, field_name, field_type, field_label,\n field_options, field_order, is_required, is_searchable,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n fieldId,\n collectionId,\n fieldName,\n fieldType,\n fieldLabel,\n fieldOptions,\n nextOrder,\n isRequired ? 1 : 0,\n isSearchable ? 1 : 0,\n now,\n now\n ).run()\n\n return c.json({ success: true, fieldId })\n } catch (error) {\n console.error('Error adding field:', error)\n return c.json({ success: false, error: 'Failed to add field.' })\n }\n})\n\n// Update field\nadminCollectionsRoutes.put('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const formData = await c.req.formData()\n const fieldLabel = formData.get('field_label') as string\n const fieldType = formData.get('field_type') as string\n // Use getAll() to handle hidden input + checkbox pattern (get last value)\n const isRequiredValues = formData.getAll('is_required')\n const isSearchableValues = formData.getAll('is_searchable')\n const isRequired = isRequiredValues[isRequiredValues.length - 1] === '1'\n const isSearchable = isSearchableValues[isSearchableValues.length - 1] === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n // Log all form data for debugging\n console.log('[Field Update] Field ID:', fieldId)\n console.log('[Field Update] Form data received:', {\n field_label: fieldLabel,\n field_type: fieldType,\n is_required: formData.get('is_required'),\n is_searchable: formData.get('is_searchable'),\n field_options: fieldOptions\n })\n\n if (!fieldLabel) {\n return c.json({ success: false, error: 'Field label is required.' })\n }\n\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n // Schema fields are part of the collection's JSON schema\n // We need to update the collection's schema in the database\n const fieldName = fieldId.replace('schema-', '')\n\n console.log('[Field Update] Updating schema field:', fieldName)\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first()\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema) {\n schema = { type: 'object', properties: {}, required: [] }\n }\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Update the field in the schema\n if (schema.properties[fieldName]) {\n // Parse field options from form\n let parsedFieldOptions: Record = {}\n try {\n parsedFieldOptions = JSON.parse(fieldOptions)\n } catch (e) {\n console.error('[Field Update] Error parsing field options:', e)\n }\n\n // Build the updated field config - merge in field options\n const updatedFieldConfig: any = {\n ...schema.properties[fieldName],\n ...parsedFieldOptions,\n type: fieldType,\n title: fieldLabel,\n searchable: isSearchable\n }\n\n // Also set/remove the individual required property on the field\n // This ensures consistency regardless of which format is checked in GET\n if (isRequired) {\n updatedFieldConfig.required = true\n } else {\n delete updatedFieldConfig.required\n }\n\n schema.properties[fieldName] = updatedFieldConfig\n\n // Handle required field in the schema's required array (proper JSON Schema way)\n const requiredIndex = schema.required.indexOf(fieldName)\n console.log('[Field Update] Required field handling:', {\n fieldName,\n isRequired,\n currentRequiredArray: schema.required,\n requiredIndex\n })\n\n if (isRequired && requiredIndex === -1) {\n // Add to required array if checked and not already there\n schema.required.push(fieldName)\n console.log('[Field Update] Added field to required array')\n } else if (!isRequired && requiredIndex !== -1) {\n // Remove from required array if unchecked and currently there\n schema.required.splice(requiredIndex, 1)\n console.log('[Field Update] Removed field from required array')\n }\n\n console.log('[Field Update] Final required array:', schema.required)\n console.log('[Field Update] Final field config:', schema.properties[fieldName])\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Field Update] Schema update result:', {\n success: result.success,\n changes: result.meta?.changes\n })\n\n return c.json({ success: true })\n }\n\n // For regular database fields\n const updateStmt = db.prepare(`\n UPDATE content_fields\n SET field_label = ?, field_type = ?, field_options = ?, is_required = ?, is_searchable = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateStmt.bind(fieldLabel, fieldType, fieldOptions, isRequired ? 1 : 0, isSearchable ? 1 : 0, Date.now(), fieldId).run()\n\n console.log('[Field Update] Update result:', {\n success: result.success,\n meta: result.meta,\n changes: result.meta?.changes,\n last_row_id: result.meta?.last_row_id\n })\n\n // Verify the update by reading back the field\n const verifyStmt = db.prepare('SELECT * FROM content_fields WHERE id = ?')\n const verifyResult = await verifyStmt.bind(fieldId).first()\n console.log('[Field Update] Verification - field after update:', verifyResult)\n\n console.log('[Field Update] Successfully updated field with type:', fieldType)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating field:', error)\n return c.json({ success: false, error: 'Failed to update field.' })\n }\n})\n\n// Delete field\nadminCollectionsRoutes.delete('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n const fieldName = fieldId.replace('schema-', '')\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema || !schema.properties) {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n\n // Remove field from schema\n if (schema.properties[fieldName]) {\n delete schema.properties[fieldName]\n\n // Also remove from required array if present\n if (schema.required && Array.isArray(schema.required)) {\n const requiredIndex = schema.required.indexOf(fieldName)\n if (requiredIndex !== -1) {\n schema.required.splice(requiredIndex, 1)\n }\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Delete Field] Removed field from schema:', fieldName)\n\n return c.json({ success: true })\n } else {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n }\n\n // For regular database fields\n const deleteStmt = db.prepare('DELETE FROM content_fields WHERE id = ?')\n await deleteStmt.bind(fieldId).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting field:', error)\n return c.json({ success: false, error: 'Failed to delete field.' })\n }\n})\n\n// Update field order\nadminCollectionsRoutes.post('/:collectionId/fields/reorder', async (c) => {\n try {\n const body = await c.req.json()\n const fieldIds = body.fieldIds as string[]\n\n if (!Array.isArray(fieldIds)) {\n return c.json({ success: false, error: 'Invalid field order data.' })\n }\n\n const db = c.env.DB\n\n // Update field order\n for (let i = 0; i < fieldIds.length; i++) {\n const updateStmt = db.prepare('UPDATE content_fields SET field_order = ?, updated_at = ? WHERE id = ?')\n await updateStmt.bind(i + 1, Date.now(), fieldIds[i]).run()\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error reordering fields:', error)\n return c.json({ success: false, error: 'Failed to reorder fields.' })\n }\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface SettingsPageData {\n user?: {\n name: string\n email: string\n role: string\n }\n settings?: {\n general?: GeneralSettings\n appearance?: AppearanceSettings\n security?: SecuritySettings\n notifications?: NotificationSettings\n storage?: StorageSettings\n migrations?: MigrationSettings\n databaseTools?: DatabaseToolsSettings\n }\n activeTab?: string\n version?: string\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface AppearanceSettings {\n theme: 'light' | 'dark' | 'auto'\n primaryColor: string\n logoUrl: string\n favicon: string\n customCSS: string\n}\n\nexport interface SecuritySettings {\n twoFactorEnabled: boolean\n sessionTimeout: number\n passwordRequirements: {\n minLength: number\n requireUppercase: boolean\n requireNumbers: boolean\n requireSymbols: boolean\n }\n ipWhitelist: string[]\n jwtExpiresIn?: string\n jwtRefreshGraceSeconds?: number\n}\n\nexport interface NotificationSettings {\n emailNotifications: boolean\n contentUpdates: boolean\n systemAlerts: boolean\n userRegistrations: boolean\n emailFrequency: 'immediate' | 'daily' | 'weekly'\n}\n\nexport interface StorageSettings {\n maxFileSize: number\n allowedFileTypes: string[]\n storageProvider: 'local' | 'cloudflare' | 's3'\n backupFrequency: 'daily' | 'weekly' | 'monthly'\n retentionPeriod: number\n}\n\nexport interface MigrationSettings {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Array<{\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n }>\n}\n\nexport interface DatabaseToolsSettings {\n totalTables: number\n totalRows: number\n lastBackup?: string\n databaseSize?: string\n tables: Array<{\n name: string\n rowCount: number\n }>\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const activeTab = data.activeTab || 'general'\n \n const pageContent = `\n
\n \n
\n
\n

Settings

\n

Manage your application settings and preferences

\n
\n
\n\n \n
\n
\n \n
\n
\n\n \n
\n
\n ${renderTabContent(activeTab, data.settings)}\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'run-migrations-confirm',\n title: 'Run Migrations',\n message: 'Are you sure you want to run pending migrations? This action cannot be undone.',\n confirmText: 'Run Migrations',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performRunMigrations()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Settings',\n pageTitle: 'Settings',\n currentPath: '/admin/settings',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderTabButton(tabId: string, label: string, iconPath: string, activeTab: string): string {\n const isActive = activeTab === tabId\n const baseClasses = 'flex items-center space-x-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 whitespace-nowrap no-underline'\n const activeClasses = isActive\n ? 'border-zinc-950 dark:border-white text-zinc-950 dark:text-white'\n : 'border-transparent text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-300 hover:border-zinc-300 dark:hover:border-zinc-700'\n\n return `\n \n \n \n \n ${label}\n \n `\n}\n\nfunction renderTabContent(activeTab: string, settings?: SettingsPageData['settings']): string {\n switch (activeTab) {\n case 'general':\n return renderGeneralSettings(settings?.general)\n case 'appearance':\n return renderAppearanceSettings(settings?.appearance)\n case 'security':\n return renderSecuritySettings(settings?.security)\n case 'notifications':\n return renderNotificationSettings(settings?.notifications)\n case 'storage':\n return renderStorageSettings(settings?.storage)\n case 'migrations':\n return renderMigrationSettings(settings?.migrations)\n case 'database-tools':\n return renderDatabaseToolsSettings(settings?.databaseTools)\n default:\n return renderGeneralSettings(settings?.general)\n }\n}\n\nfunction renderGeneralSettings(settings?: GeneralSettings): string {\n return `\n
\n
\n

General Settings

\n

Configure basic application settings and preferences.

\n
\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n
\n \n ${settings?.siteDescription || ''}\n
\n\n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderAppearanceSettings(settings?: AppearanceSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Appearance Settings

\n

Customize the look and feel of your application.

\n
\n \n
\n
\n
\n \n
\n \n \n \n
\n
\n \n
\n \n
\n \n \n
\n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderSecuritySettings(settings?: SecuritySettings): string {\n const jwtExpiresIn = settings?.jwtExpiresIn ?? '30d'\n const jwtRefreshGraceSeconds =\n typeof settings?.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n\n return `\n
\n \n
\n

Session / JWT

\n

\n Configure how long a signed-in session lasts and how long an expired token can still be refreshed.\n The JWT_EXPIRES_IN and JWT_REFRESH_GRACE_SECONDS\n environment variables, when set, override the values below.\n

\n\n
\n
\n \n \n

\n Accepts 30d, 12h, 3600s, or bare seconds. Default: 30 days.\n

\n
\n\n
\n \n \n

\n How long an expired token can still be exchanged at /auth/refresh. Default: 604800 (7 days).\n

\n
\n
\n\n
\n \n \n \n \n Save Session Settings\n \n
\n
\n\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n The fields below are under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Security Settings

\n

Configure security and authentication settings.

\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n

Leave empty to allow all IPs

\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderNotificationSettings(settings?: NotificationSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Notification Settings

\n

Configure how and when you receive notifications.

\n
\n \n
\n
\n
\n

Email Notifications

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Notification Preferences
\n

\n Critical system alerts will always be sent immediately regardless of your frequency setting.\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderStorageSettings(settings?: StorageSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Storage Settings

\n

Configure file storage and backup settings.

\n
\n \n
\n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Storage Status
\n

\n Current usage: 2.4 GB / 10 GB available\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderMigrationSettings(settings?: MigrationSettings): string {\n return `\n
\n
\n

Database Migrations

\n

View and manage database migrations to keep your schema up to date.

\n
\n \n \n
\n
\n
\n
\n

Total Migrations

\n

${settings?.totalMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Applied

\n

${settings?.appliedMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Pending

\n

${settings?.pendingMigrations || '0'}

\n
\n \n \n \n
\n
\n
\n\n \n
\n \n \n \n\n \n
\n\n \n
\n
\n

Migration History

\n

List of all available database migrations

\n
\n \n
\n
\n \n \n \n

Loading migration status...

\n
\n
\n
\n
\n\n \n `\n}\n\nfunction renderDatabaseToolsSettings(settings?: DatabaseToolsSettings): string {\n return `\n
\n
\n

Database Tools

\n

Manage database operations including backup, restore, and maintenance.

\n
\n\n \n
\n
\n
\n
\n

Total Tables

\n

${settings?.totalTables || '0'}

\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n
\n

Total Rows

\n

${settings?.totalRows?.toLocaleString() || '0'}

\n
\n
\n \n \n \n
\n
\n
\n
\n\n \n
\n \n
\n

Safe Operations

\n
\n \n \n \n \n Refresh Stats\n \n\n \n \n \n \n Create Backup\n \n\n \n \n \n \n Validate Database\n \n
\n
\n
\n\n \n
\n
\n

Database Tables

\n

Click on a table to view its data

\n
\n\n
\n
\n \n \n \n

Loading database statistics...

\n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

Danger Zone

\n

\n These operations are destructive and cannot be undone.\n Your admin account will be preserved, but all other data will be permanently deleted.\n

\n
\n \n \n \n \n Truncate All Data\n \n
\n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\n// import { html } from 'hono/html'\nimport { requireAuth } from '../middleware'\nimport { renderSettingsPage, SettingsPageData } from '../templates/pages/admin-settings.template'\nimport { MigrationService } from '../services/migrations'\nimport { SettingsService } from '../services/settings'\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminSettingsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminSettingsRoutes.use('*', requireAuth())\n\n// Helper function to get mock settings data\nfunction getMockSettings(user: any) {\n return {\n general: {\n siteName: 'SonicJS AI',\n siteDescription: 'A modern headless CMS powered by AI',\n adminEmail: user?.email || 'admin@example.com',\n timezone: 'UTC',\n language: 'en',\n maintenanceMode: false\n },\n appearance: {\n theme: 'dark' as const,\n primaryColor: '#465FFF',\n logoUrl: '',\n favicon: '',\n customCSS: ''\n },\n security: {\n twoFactorEnabled: false,\n sessionTimeout: 30,\n passwordRequirements: {\n minLength: 8,\n requireUppercase: true,\n requireNumbers: true,\n requireSymbols: false\n },\n ipWhitelist: []\n },\n notifications: {\n emailNotifications: true,\n contentUpdates: true,\n systemAlerts: true,\n userRegistrations: false,\n emailFrequency: 'immediate' as const\n },\n storage: {\n maxFileSize: 10,\n allowedFileTypes: ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'docx'],\n storageProvider: 'cloudflare' as const,\n backupFrequency: 'daily' as const,\n retentionPeriod: 30\n },\n migrations: {\n totalMigrations: 0,\n appliedMigrations: 0,\n pendingMigrations: 0,\n lastApplied: undefined,\n migrations: []\n },\n databaseTools: {\n totalTables: 0,\n totalRows: 0,\n lastBackup: undefined,\n databaseSize: '0 MB',\n tables: []\n }\n }\n}\n\n// Settings page (redirects to general settings)\nadminSettingsRoutes.get('/', (c) => {\n return c.redirect('/admin/settings/general')\n})\n\n// General settings\nadminSettingsRoutes.get('/general', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Get real general settings from database\n const generalSettings = await settingsService.getGeneralSettings(user?.email)\n\n const mockSettings = getMockSettings(user)\n mockSettings.general = generalSettings\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'general',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Appearance settings\nadminSettingsRoutes.get('/appearance', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'appearance',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Security settings\nadminSettingsRoutes.get('/security', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Load persisted security settings (JWT TTL + refresh grace)\n const persisted = await settingsService.getSecuritySettings()\n\n const mockSettings = getMockSettings(user)\n mockSettings.security = {\n ...mockSettings.security,\n jwtExpiresIn: persisted.jwtExpiresIn,\n jwtRefreshGraceSeconds: persisted.jwtRefreshGraceSeconds\n } as any\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'security',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Notifications settings\nadminSettingsRoutes.get('/notifications', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'notifications',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Storage settings\nadminSettingsRoutes.get('/storage', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'storage',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Migrations settings\nadminSettingsRoutes.get('/migrations', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'migrations',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Database tools settings\nadminSettingsRoutes.get('/database-tools', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'database-tools',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Get migration status\nadminSettingsRoutes.get('/api/migrations/status', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminSettingsRoutes.post('/api/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n return c.json({\n success: false,\n error: 'Failed to run migrations'\n }, 500)\n }\n})\n\n// Validate database schema\nadminSettingsRoutes.get('/api/migrations/validate', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\n// Get database tools stats\nadminSettingsRoutes.get('/api/database-tools/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get list of all tables\n const tablesQuery = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT LIKE '_cf_%'\n ORDER BY name\n `).all()\n\n const tables = tablesQuery.results || []\n let totalRows = 0\n\n // Get row count for each table\n const tableStats = await Promise.all(\n tables.map(async (table: any) => {\n try {\n const countResult = await db.prepare(`SELECT COUNT(*) as count FROM ${table.name}`).first()\n const rowCount = (countResult as any)?.count || 0\n totalRows += rowCount\n return {\n name: table.name,\n rowCount\n }\n } catch (error) {\n console.error(`Error counting rows in ${table.name}:`, error)\n return {\n name: table.name,\n rowCount: 0\n }\n }\n })\n )\n\n // D1 doesn't expose database size directly, so we'll estimate based on row counts\n // Average row size estimate: 1KB per row (rough approximation)\n const estimatedSizeBytes = totalRows * 1024\n const databaseSizeMB = (estimatedSizeBytes / (1024 * 1024)).toFixed(2)\n\n return c.json({\n success: true,\n data: {\n totalTables: tables.length,\n totalRows,\n databaseSize: `${databaseSizeMB} MB (estimated)`,\n tables: tableStats\n }\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch database statistics'\n }, 500)\n }\n})\n\n// Validate database\nadminSettingsRoutes.get('/api/database-tools/validate', async (c) => {\n try {\n const db = c.env.DB\n\n // Run PRAGMA integrity_check\n const integrityResult = await db.prepare('PRAGMA integrity_check').first()\n const isValid = (integrityResult as any)?.integrity_check === 'ok'\n\n return c.json({\n success: true,\n data: {\n valid: isValid,\n message: isValid ? 'Database integrity check passed' : 'Database integrity check failed'\n }\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n})\n\n// Backup database\nadminSettingsRoutes.post('/api/database-tools/backup', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n // TODO: Implement actual backup functionality\n // For now, return success message\n return c.json({\n success: true,\n message: 'Database backup feature coming soon. Use Cloudflare Dashboard for backups.'\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({\n success: false,\n error: 'Failed to create backup'\n }, 500)\n }\n})\n\n// Truncate tables\nadminSettingsRoutes.post('/api/database-tools/truncate', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const body = await c.req.json()\n const tablesToTruncate = body.tables || []\n\n if (!Array.isArray(tablesToTruncate) || tablesToTruncate.length === 0) {\n return c.json({\n success: false,\n error: 'No tables specified for truncation'\n }, 400)\n }\n\n const db = c.env.DB\n const results = []\n\n // Validate table names against actual database tables (prevents SQL injection)\n const tablesResult = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n `).all()\n const validTables = new Set(\n (tablesResult.results || []).map((row: any) => row.name)\n )\n\n for (const tableName of tablesToTruncate) {\n if (!validTables.has(tableName)) {\n results.push({ table: tableName, success: false, error: 'Table not found' })\n continue\n }\n try {\n await db.prepare(`DELETE FROM ${tableName}`).run()\n results.push({ table: tableName, success: true })\n } catch (error) {\n console.error(`Error truncating ${tableName}:`, error)\n results.push({ table: tableName, success: false, error: String(error) })\n }\n }\n\n return c.json({\n success: true,\n message: `Truncated ${results.filter(r => r.success).length} of ${tablesToTruncate.length} tables`,\n results\n })\n } catch (error) {\n console.error('Error truncating tables:', error)\n return c.json({\n success: false,\n error: 'Failed to truncate tables'\n }, 500)\n }\n})\n\n// Save general settings\nadminSettingsRoutes.post('/general', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Extract general settings from form data\n const settings = {\n siteName: formData.get('siteName') as string,\n siteDescription: formData.get('siteDescription') as string,\n adminEmail: formData.get('adminEmail') as string,\n timezone: formData.get('timezone') as string,\n language: formData.get('language') as string,\n maintenanceMode: formData.get('maintenanceMode') === 'true'\n }\n\n // Validate required fields\n if (!settings.siteName || !settings.siteDescription) {\n return c.json({\n success: false,\n error: 'Site name and description are required'\n }, 400)\n }\n\n // Save settings to database\n const success = await settingsService.saveGeneralSettings(settings)\n\n if (success) {\n return c.json({\n success: true,\n message: 'General settings saved successfully!'\n })\n } else {\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n }\n } catch (error) {\n console.error('Error saving general settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save security settings (JWT TTL + refresh grace)\nadminSettingsRoutes.post('/security', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n const jwtExpiresInRaw = (formData.get('jwtExpiresIn') as string | null)?.trim() || ''\n const graceRaw = (formData.get('jwtRefreshGraceSeconds') as string | null)?.trim() || ''\n\n // Validate jwtExpiresIn: bare seconds or \n if (!/^\\d+(?:s|m|h|d)?$/i.test(jwtExpiresInRaw)) {\n return c.json({\n success: false,\n error: 'JWT expiration must be a number optionally suffixed with s/m/h/d (e.g. 30d, 12h, 3600).'\n }, 400)\n }\n\n const graceSeconds = Number.parseInt(graceRaw, 10)\n if (!Number.isFinite(graceSeconds) || graceSeconds < 0 || graceSeconds > 60 * 60 * 24 * 90) {\n return c.json({\n success: false,\n error: 'Refresh grace must be an integer between 0 and 7776000 seconds (90 days).'\n }, 400)\n }\n\n const success = await settingsService.saveSecuritySettings({\n jwtExpiresIn: jwtExpiresInRaw,\n jwtRefreshGraceSeconds: graceSeconds\n })\n\n if (success) {\n return c.json({\n success: true,\n message: 'Security settings saved successfully!'\n })\n }\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n } catch (error) {\n console.error('Error saving security settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save settings (legacy endpoint - redirect to general)\nadminSettingsRoutes.post('/', async (c) => {\n return c.redirect('/admin/settings/general')\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n formattedDate: string\n}\n\nexport interface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormsListPage(data: FormsListPageData): string {\n const tableData: any = {\n tableId: 'forms-table',\n rowClickable: true,\n rowClickUrl: (form: Form) => `/admin/forms/${form.id}/builder`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => `\n
\n \n ${form.name}\n \n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'category',\n label: 'Category',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n const categoryColors: Record = {\n 'contact': 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 ring-blue-700/10 dark:ring-blue-400/20',\n 'survey': 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-300 ring-purple-700/10 dark:ring-purple-400/20',\n 'registration': 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-300 ring-green-700/10 dark:ring-green-400/20',\n 'feedback': 'bg-orange-50 dark:bg-orange-500/10 text-orange-700 dark:text-orange-300 ring-orange-700/10 dark:ring-orange-400/20',\n 'general': 'bg-gray-50 dark:bg-gray-500/10 text-gray-700 dark:text-gray-300 ring-gray-700/10 dark:ring-gray-400/20'\n }\n const colorClass = categoryColors[form.category] || categoryColors['general']\n return `\n \n ${form.category || 'general'}\n \n `\n }\n },\n {\n key: 'submission_count',\n label: 'Submissions',\n sortable: true,\n sortType: 'number',\n render: (_value: any, form: any) => {\n const count = form.submission_count || 0\n return `\n
\n \n ${count}\n \n
\n `\n }\n },\n {\n key: 'is_active',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n if (form.is_active) {\n return `\n \n Active\n \n `\n } else {\n return `\n \n Inactive\n \n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n render: (_value: any, form: any) => {\n if (!form || !form.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.forms,\n emptyMessage: 'No forms found. Create your first form to get started!'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Forms

\n

Create and manage forms with the visual form builder

\n
\n \n
\n\n \n
\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Forms
\n
${data.forms.length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Active Forms
\n
${data.forms.filter(f => f.is_active).length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Submissions
\n
${data.forms.reduce((sum, f) => sum + (f.submission_count || 0), 0)}
\n
\n
\n
\n
\n
\n\n \n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Filter\n \n ${data.search || data.category ? `\n \n Clear\n \n ` : ''}\n \n
\n\n \n
\n ${renderTable(tableData)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Forms',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface FormBuilderPageData {\n id: string\n name: string\n display_name: string\n description?: string\n category?: string\n formio_schema: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\n// Inline Turnstile component for Form.io builder\nfunction getTurnstileComponentScript(): string {\n return `\n (function() {\n 'use strict';\n\n if (!window.Formio || !window.Formio.Components) {\n console.error('Form.io library not loaded');\n return;\n }\n\n const FieldComponent = Formio.Components.components.field;\n\n class TurnstileComponent extends FieldComponent {\n static schema(...extend) {\n return FieldComponent.schema({\n type: 'turnstile',\n label: 'Turnstile Verification',\n key: 'turnstile',\n input: true,\n persistent: false,\n protected: true,\n unique: false,\n hidden: false,\n clearOnHide: true,\n tableView: false,\n validate: {\n required: false\n },\n siteKey: '',\n theme: 'auto',\n size: 'normal',\n action: '',\n appearance: 'always',\n errorMessage: 'Please complete the security verification'\n }, ...extend);\n }\n\n static get builderInfo() {\n return {\n title: 'Turnstile',\n group: 'premium',\n icon: 'fa fa-shield-alt',\n weight: 120,\n documentation: '/admin/forms/docs#turnstile',\n schema: TurnstileComponent.schema()\n };\n }\n\n constructor(component, options, data) {\n super(component, options, data);\n this.widgetId = null;\n this.scriptLoaded = false;\n }\n\n init() {\n super.init();\n // Only load script if NOT in builder/edit mode\n if (!this.options.editMode && !this.options.builder && !this.builderMode) {\n this.loadTurnstileScript();\n }\n }\n\n loadTurnstileScript() {\n // Extra safety: never load in builder\n if (this.options.editMode || this.options.builder || this.builderMode) {\n console.log('Turnstile: Skipping script load in builder mode');\n return Promise.resolve();\n }\n\n if (window.turnstile) {\n this.scriptLoaded = true;\n return Promise.resolve();\n }\n\n if (this.scriptPromise) {\n return this.scriptPromise;\n }\n\n console.log('Turnstile: Loading script for form mode');\n this.scriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js';\n script.async = true;\n script.defer = true;\n script.onload = () => {\n this.scriptLoaded = true;\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Turnstile'));\n document.head.appendChild(script);\n });\n\n return this.scriptPromise;\n }\n\n render() {\n return super.render(\\`\n
\n
\n \\${this.component.description ? \\`
\\${this.component.description}
\\` : ''}\n
\n \\`);\n }\n\n attach(element) {\n this.loadRefs(element, {\n turnstileContainer: 'single',\n turnstileWidget: 'single'\n });\n\n const superAttach = super.attach(element);\n\n // Check if we're in builder mode or form mode\n if (this.options.editMode || this.options.builder) {\n // Builder mode - show placeholder only\n this.renderPlaceholder();\n } else {\n // Form mode - render actual widget\n this.loadTurnstileScript()\n .then(() => this.renderWidget())\n .catch(err => {\n console.error('Failed to load Turnstile:', err);\n if (this.refs.turnstileWidget) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to load security verification\n
\n \\`;\n }\n });\n }\n\n return superAttach;\n }\n\n renderPlaceholder() {\n if (!this.refs.turnstileWidget) {\n return;\n }\n \n this.refs.turnstileWidget.innerHTML = \\`\n
\n
🛡️
\n
Turnstile Verification
\n
CAPTCHA-free bot protection by Cloudflare
\n
Widget will appear here on the live form
\n
\n \\`;\n }\n\n renderWidget() {\n if (!this.refs.turnstileWidget || !window.turnstile) {\n return;\n }\n\n this.refs.turnstileWidget.innerHTML = '';\n\n const siteKey = this.component.siteKey || \n (this.root && this.root.options && this.root.options.turnstileSiteKey) || \n '';\n \n if (!siteKey) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n ⚠️ Configuration Required: Turnstile site key not configured. \n Please enable the Turnstile plugin in Settings → Plugins.\n
\n \\`;\n return;\n }\n\n try {\n const self = this;\n this.widgetId = window.turnstile.render(this.refs.turnstileWidget, {\n sitekey: siteKey,\n theme: this.component.theme || 'auto',\n size: this.component.size || 'normal',\n action: this.component.action || '',\n appearance: this.component.appearance || 'always',\n callback: function(token) {\n self.updateValue(token);\n self.triggerChange();\n },\n 'error-callback': function() {\n self.updateValue(null);\n self.setCustomValidity(self.component.errorMessage || 'Security verification failed');\n },\n 'expired-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification expired. Please verify again.');\n },\n 'timeout-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification timed out. Please try again.');\n }\n });\n } catch (err) {\n console.error('Failed to render Turnstile widget:', err);\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to render security verification\n
\n \\`;\n }\n }\n\n detach() {\n if (this.widgetId !== null && window.turnstile) {\n try {\n window.turnstile.remove(this.widgetId);\n this.widgetId = null;\n } catch (err) {\n console.error('Failed to remove Turnstile widget:', err);\n }\n }\n return super.detach();\n }\n\n getValue() {\n if (this.widgetId !== null && window.turnstile) {\n return window.turnstile.getResponse(this.widgetId);\n }\n return this.dataValue;\n }\n\n setValue(value, flags) {\n const changed = super.setValue(value, flags);\n return changed;\n }\n\n getValueAsString(value) {\n return value ? '✅ Verified' : '❌ Not Verified';\n }\n\n isEmpty(value) {\n return !value;\n }\n\n updateValue(value, flags) {\n const changed = super.updateValue(value, flags);\n \n if (value) {\n this.setCustomValidity('');\n }\n \n return changed;\n }\n\n checkValidity(data, dirty, row) {\n const result = super.checkValidity(data, dirty, row);\n \n if (this.component.validate && this.component.validate.required) {\n const value = this.getValue();\n if (!value) {\n this.setCustomValidity(this.component.errorMessage || 'Please complete the security verification');\n return false;\n }\n }\n \n return result;\n }\n }\n\n Formio.Components.addComponent('turnstile', TurnstileComponent);\n console.log('✅ Turnstile component registered with Form.io');\n window.TurnstileComponent = TurnstileComponent;\n })();\n `;\n}\n\nexport function renderFormBuilderPage(data: FormBuilderPageData): string {\n const formioSchema = data.formio_schema || { components: [] }\n const settings = data.settings || {}\n const googleMapsApiKey = data.google_maps_api_key || ''\n const turnstileSiteKey = data.turnstile_site_key || ''\n\n const pageContent = `\n \n\n
\n \n
\n
\n
\n \n \n \n \n \n
\n

\n Form Builder: ${data.display_name}\n

\n

\n \n ${data.name}\n \n

\n
\n
\n\n \n
\n \n \n \n \n \n Preview\n \n\n \n \n \n \n Save Form\n \n\n \n \n \n \n View Public Form\n \n\n \n \n \n \n View Submissions\n \n
\n
\n
\n\n \n
\n \n
\n \n \n \n \n Single Page\n \n \n \n \n \n Multi-Page Wizard\n \n
\n \n 💡 Use Panel components (Layout tab) for each page\n \n
\n\n \n
\n\n \n
\n
\n \n \n \n \n

Loading Form Builder...

\n
\n
\n\n \n
\n\n \n
\n
\n
\n

Form Preview

\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n\n \n \n\n \n\n \n \n \n \n \n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Form Builder: ${data.display_name}`,\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm } from '../components/form.template'\n\nexport interface FormCreatePageData {\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormCreatePage(data: FormCreatePageData): string {\n const pageContent = `\n
\n \n
\n
\n \n \n \n \n \n
\n

Create New Form

\n

Enter basic information to create your form. You'll be able to add fields in the builder.

\n
\n
\n
\n\n \n ${data.error ? `\n
\n
\n \n \n \n

${data.error}

\n
\n
\n ` : ''}\n\n ${data.success ? `\n
\n
\n \n \n \n

${data.success}

\n
\n
\n ` : ''}\n\n \n
\n
\n \n
\n \n
\n \n \n

\n Lowercase letters, numbers, and underscores only. Used in URLs and API.\n

\n
\n\n \n
\n \n \n

\n Human-readable name shown in the admin interface.\n

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n \n \n \n \n \n \n

\n Helps organize forms in the admin panel.\n

\n
\n
\n\n \n
\n \n Cancel\n \n \n \n \n \n Create & Open Builder\n \n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

What happens next?

\n
\n

After creating your form, you'll be taken to the Form Builder where you can:

\n
    \n
  • Drag and drop fields onto your form
  • \n
  • Configure field properties and validation
  • \n
  • Add conditional logic
  • \n
  • Preview your form in real-time
  • \n
  • Publish when ready
  • \n
\n
\n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create Form',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderFormsListPage } from '../templates/pages/admin-forms-list.template'\nimport { renderFormBuilderPage, type FormBuilderPageData } from '../templates/pages/admin-forms-builder.template'\nimport { renderFormCreatePage } from '../templates/pages/admin-forms-create.template'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\n\n// Type definitions for forms\ninterface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n updated_at: number\n formattedDate: string\n}\n\ninterface FormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n category?: string\n formio_schema?: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ninterface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminFormsRoutes.use('*', requireAuth())\n\n// Forms management - List all forms\nadminFormsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const category = c.req.query('category') || ''\n\n // Build query\n let query = 'SELECT * FROM forms WHERE 1=1'\n const params: string[] = []\n\n if (search) {\n query += ' AND (name LIKE ? OR display_name LIKE ?)'\n params.push(`%${search}%`, `%${search}%`)\n }\n\n if (category) {\n query += ' AND category = ?'\n params.push(category)\n }\n\n query += ' ORDER BY created_at DESC'\n\n const result = await db.prepare(query).bind(...params).all()\n\n // Format dates\n const forms = result.results.map((form: any) => ({\n ...form,\n formattedDate: new Date(form.created_at).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n }))\n\n const pageData: FormsListPageData = {\n forms,\n search,\n category,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsListPage(pageData))\n } catch (error: any) {\n console.error('Error listing forms:', error)\n return c.html('

Error loading forms

', 500)\n }\n})\n\n// Show create form page\nadminFormsRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n\n const pageData: FormData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormCreatePage(pageData))\n } catch (error: any) {\n console.error('Error showing create form page:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Show docs page\nadminFormsRoutes.get('/docs', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsDocsPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsDocsPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms docs page:', error)\n return c.html('

Error loading documentation

', 500)\n }\n})\n\n// Show examples page\nadminFormsRoutes.get('/examples', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsExamplesPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsExamplesPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms examples page:', error)\n return c.html('

Error loading examples

', 500)\n }\n})\n\n// Create new form\nadminFormsRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const name = body.name as string\n const displayName = body.displayName as string\n const description = (body.description as string) || ''\n const category = (body.category as string) || 'general'\n\n // Validate required fields\n if (!name || !displayName) {\n return c.json({ error: 'Name and display name are required' }, 400)\n }\n\n // Validate name format (lowercase, numbers, underscores only)\n if (!/^[a-z0-9_]+$/.test(name)) {\n return c.json({ \n error: 'Form name must contain only lowercase letters, numbers, and underscores' \n }, 400)\n }\n\n // Check for duplicate name\n const existing = await db.prepare('SELECT id FROM forms WHERE name = ?')\n .bind(name)\n .first()\n\n if (existing) {\n return c.json({ error: 'A form with this name already exists' }, 400)\n }\n\n // Create form with empty schema\n const formId = crypto.randomUUID()\n const now = Date.now()\n const emptySchema = { components: [] } // Empty Form.io schema\n\n await db.prepare(`\n INSERT INTO forms (\n id, name, display_name, description, category,\n formio_schema, settings, is_active, is_public,\n created_by, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n formId,\n name,\n displayName,\n description,\n category,\n JSON.stringify(emptySchema),\n JSON.stringify({\n submitButtonText: 'Submit',\n successMessage: 'Thank you for your submission!',\n requireAuth: false,\n emailNotifications: false\n }),\n 1, // is_active\n 1, // is_public\n user?.userId || null,\n now,\n now\n ).run()\n\n // Redirect to builder\n return c.redirect(`/admin/forms/${formId}/builder`)\n } catch (error: any) {\n console.error('Error creating form:', error)\n return c.json({ error: 'Failed to create form' }, 500)\n }\n})\n\n// Show form builder\nadminFormsRoutes.get('/:id/builder', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get Turnstile configuration\n const turnstileService = new TurnstileService(db)\n const turnstileSettings = await turnstileService.getSettings()\n\n const pageData: FormData = {\n id: form.id as string,\n name: form.name as string,\n display_name: form.display_name as string,\n description: form.description as string | undefined,\n category: form.category as string,\n formio_schema: form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] },\n settings: form.settings ? JSON.parse(form.settings as string) : {},\n is_active: Boolean(form.is_active),\n is_public: Boolean(form.is_public),\n google_maps_api_key: googleMapsApiKey,\n turnstile_site_key: turnstileSettings?.siteKey || '',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormBuilderPage(pageData as FormBuilderPageData))\n } catch (error: any) {\n console.error('Error showing form builder:', error)\n return c.html('

Error loading form builder

', 500)\n }\n})\n\n// Update form (save schema)\nadminFormsRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const body = await c.req.json()\n\n // Check if form exists\n const form = await db.prepare('SELECT id FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const now = Date.now()\n\n // Update form\n await db.prepare(`\n UPDATE forms \n SET formio_schema = ?, \n updated_by = ?, \n updated_at = ?\n WHERE id = ?\n `).bind(\n JSON.stringify(body.formio_schema),\n user?.userId || null,\n now,\n formId\n ).run()\n\n return c.json({ success: true, message: 'Form saved successfully' })\n } catch (error: any) {\n console.error('Error updating form:', error)\n return c.json({ error: 'Failed to save form' }, 500)\n }\n})\n\n// Delete form\nadminFormsRoutes.delete('/:id', async (c) => {\n try {\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Check if form exists\n const form = await db.prepare('SELECT id, submission_count FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Warn if form has submissions\n const submissionCount = form.submission_count as number || 0\n if (submissionCount > 0) {\n return c.json({ \n error: `Cannot delete form with ${submissionCount} submissions. Archive it instead.` \n }, 400)\n }\n\n // Delete form (cascade will delete submissions and files)\n await db.prepare('DELETE FROM forms WHERE id = ?').bind(formId).run()\n\n return c.json({ success: true, message: 'Form deleted successfully' })\n } catch (error: any) {\n console.error('Error deleting form:', error)\n return c.json({ error: 'Failed to delete form' }, 500)\n }\n})\n\n// View form submissions\nadminFormsRoutes.get('/:id/submissions', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get submissions\n const submissions = await db.prepare(\n 'SELECT * FROM form_submissions WHERE form_id = ? ORDER BY submitted_at DESC'\n ).bind(formId).all()\n\n // Simple submissions page for now\n const html = `\n \n \n \n Submissions - ${form.display_name}\n \n \n \n ← Back to Forms\n

Submissions: ${form.display_name}

\n

Total submissions: ${submissions.results.length}

\n ${submissions.results.length > 0 ? `\n \n \n \n \n \n \n \n \n \n ${submissions.results.map((sub: any) => `\n \n \n \n \n \n `).join('')}\n \n
IDSubmittedData
${sub.id.substring(0, 8)}${new Date(sub.submitted_at).toLocaleString()}
${JSON.stringify(JSON.parse(sub.submission_data), null, 2)}
\n ` : '

No submissions yet.

'}\n \n \n `\n \n return c.html(html)\n } catch (error: any) {\n console.error('Error loading submissions:', error)\n return c.html('

Error loading submissions

', 500)\n }\n})\n\nexport default adminFormsRoutes\n","import { Hono } from 'hono'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { createContentFromSubmission } from '../services/form-collection-sync'\n\n/**\n * Recursively sanitize all string values in arbitrary JSON data.\n * HTML-encodes entities (e.g., < becomes <) to prevent stored XSS\n * when form submission data is rendered in admin templates.\n */\nfunction sanitizeDeep(value: unknown): unknown {\n if (typeof value === 'string') {\n return sanitizeInput(value)\n }\n if (Array.isArray(value)) {\n return value.map(sanitizeDeep)\n }\n if (value !== null && typeof value === 'object') {\n const result: Record = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = sanitizeDeep(v)\n }\n return result\n }\n return value // numbers, booleans, null pass through\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const publicFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Get Turnstile configuration for a form (for headless frontends)\npublicFormsRoutes.get('/:identifier/turnstile-config', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form\n const form = await db.prepare(\n 'SELECT id, turnstile_enabled, turnstile_settings FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const turnstileService = new TurnstileService(db)\n const globalSettings = await turnstileService.getSettings()\n \n const formSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string)\n : { inherit: true }\n\n // Determine effective settings\n const enabled = form.turnstile_enabled === 1 || \n (formSettings.inherit && globalSettings?.enabled)\n\n if (!enabled || !globalSettings) {\n return c.json({ enabled: false })\n }\n\n return c.json({\n enabled: true,\n siteKey: formSettings.siteKey || globalSettings.siteKey,\n theme: formSettings.theme || globalSettings.theme || 'auto',\n size: formSettings.size || globalSettings.size || 'normal',\n mode: formSettings.mode || globalSettings.mode || 'managed',\n appearance: formSettings.appearance || globalSettings.appearance || 'always'\n })\n } catch (error: any) {\n console.error('Error fetching Turnstile config:', error)\n return c.json({ error: 'Failed to fetch config' }, 500)\n }\n})\n\n// Get form schema as JSON (for headless frontends)\npublicFormsRoutes.get('/:identifier/schema', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT id, name, display_name, description, category, formio_schema, settings, is_active, is_public FROM forms WHERE (id = ? OR name = ?) AND is_active = 1 AND is_public = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n return c.json({\n id: form.id,\n name: form.name,\n displayName: form.display_name,\n description: form.description,\n category: form.category,\n schema: formioSchema,\n settings: settings,\n submitUrl: `/api/forms/${form.id}/submit`\n })\n } catch (error: any) {\n console.error('Error fetching form schema:', error)\n return c.json({ error: 'Failed to fetch form schema' }, 500)\n }\n})\n\n// Render public form by name\npublicFormsRoutes.get('/:name', async (c) => {\n try {\n const db = c.env.DB\n const formName = c.req.param('name')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form by name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE name = ? AND is_active = 1 AND is_public = 1'\n ).bind(formName).first()\n\n if (!form) {\n return c.html('

Form not found

This form does not exist or is not publicly available.

', 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n const html = `\n \n \n \n \n \n ${form.display_name}\n \n \n \n \n \n \n \n
\n

${form.display_name}

\n ${form.description ? `

${form.description}

` : ''}\n \n
\n \n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n `\n\n return c.html(html)\n } catch (error: any) {\n console.error('Error rendering form:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Handle form submission (accepts either name or ID)\npublicFormsRoutes.post('/:identifier/submit', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n const body = await c.req.json()\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Check if Turnstile is enabled for this form\n const turnstileEnabled = form.turnstile_enabled === 1\n const turnstileSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string) \n : { inherit: true }\n\n // Validate Turnstile if enabled (or inheriting global settings)\n if (turnstileEnabled || turnstileSettings.inherit) {\n const turnstileService = new TurnstileService(db)\n \n // Check if Turnstile is globally enabled\n const globalEnabled = await turnstileService.isEnabled()\n \n if (globalEnabled || turnstileEnabled) {\n // Extract Turnstile token from submission data\n const turnstileToken = body.data?.turnstile || body.turnstile\n \n if (!turnstileToken) {\n return c.json({ \n error: 'Turnstile verification required. Please complete the security check.',\n code: 'TURNSTILE_MISSING'\n }, 400)\n }\n\n // Verify the token\n const clientIp = c.req.header('cf-connecting-ip')\n const verification = await turnstileService.verifyToken(turnstileToken, clientIp)\n \n if (!verification.success) {\n return c.json({ \n error: verification.error || 'Security verification failed. Please try again.',\n code: 'TURNSTILE_INVALID'\n }, 403)\n }\n\n // Remove Turnstile token from submission data before storing\n if (body.data?.turnstile) {\n delete body.data.turnstile\n }\n }\n }\n\n // Sanitize all string values in submission data to prevent stored XSS.\n // HTML-encodes entities (e.g., < becomes <) before storage.\n const sanitizedData = sanitizeDeep(body.data) as Record\n\n // Create submission\n const submissionId = crypto.randomUUID()\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO form_submissions (\n id, form_id, submission_data, user_id, ip_address, user_agent,\n submitted_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n submissionId,\n form.id,\n JSON.stringify(sanitizedData),\n null, // user_id (for authenticated users)\n c.req.header('cf-connecting-ip') || null,\n c.req.header('user-agent') || null,\n now,\n now\n ).run()\n\n // Update submission count\n await db.prepare(`\n UPDATE forms\n SET submission_count = submission_count + 1,\n updated_at = ?\n WHERE id = ?\n `).bind(now, form.id).run()\n\n // Dual-write: create content item for this submission\n let contentId: string | null = null\n try {\n contentId = await createContentFromSubmission(\n db,\n sanitizedData as Record,\n { id: form.id as string, name: form.name as string, display_name: form.display_name as string },\n submissionId,\n {\n ipAddress: c.req.header('cf-connecting-ip') || null,\n userAgent: c.req.header('user-agent') || null,\n userEmail: (sanitizedData as any)?.email || null,\n userId: null // anonymous submission\n }\n )\n if (!contentId) {\n console.warn('[FormSubmit] Content creation returned null for submission:', submissionId)\n }\n } catch (contentError) {\n // Don't fail the submission if content creation fails\n console.error('[FormSubmit] Error creating content from submission:', contentError)\n }\n\n return c.json({\n success: true,\n submissionId,\n contentId,\n message: 'Form submitted successfully'\n })\n } catch (error: any) {\n console.error('Error submitting form:', error)\n return c.json({ error: 'Failed to submit form' }, 500)\n }\n})\n\nexport default publicFormsRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { CATEGORY_INFO } from '../../services/route-metadata'\n\nexport interface APIEndpoint {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented?: boolean\n}\n\nexport interface APIReferencePageData {\n endpoints: APIEndpoint[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nfunction renderAuthBadge(auth: boolean | 'unknown'): string {\n if (auth === true) {\n return `\n \n \n \n \n Auth\n `\n }\n if (auth === false) {\n return `\n \n \n \n \n Public\n `\n }\n // unknown\n return `\n \n \n \n \n Unknown\n `\n}\n\nexport function renderAPIReferencePage(data: APIReferencePageData): string {\n // Group endpoints by category\n const endpointsByCategory = data.endpoints.reduce((acc, endpoint) => {\n if (!acc[endpoint.category]) {\n acc[endpoint.category] = []\n }\n acc[endpoint.category]!.push(endpoint)\n return acc\n }, {} as Record)\n\n // Get unique categories from actual data\n const categories = Object.keys(endpointsByCategory)\n\n // Count stats\n const totalEndpoints = data.endpoints.length\n const publicEndpoints = data.endpoints.filter(e => e.authentication === false).length\n const protectedEndpoints = data.endpoints.filter(e => e.authentication === true).length\n const undocumentedCount = data.endpoints.filter(e => e.documented === false).length\n\n const pageContent = `\n
\n \n
\n
\n

API Reference

\n

Auto-discovered documentation of all registered API endpoints

\n
\n \n
\n\n \n
\n
\n
Total Endpoints
\n
\n ${totalEndpoints}\n
\n
\n
\n
Public Endpoints
\n
\n ${publicEndpoints}\n
\n
\n
\n
Protected Endpoints
\n
\n ${protectedEndpoints}\n
\n
\n
\n
Categories
\n
\n ${categories.length}\n
\n
\n
\n
Undocumented
\n
\n 0 ? 'text-zinc-400 dark:text-zinc-500' : 'text-lime-600 dark:text-lime-400'}\">${undocumentedCount}\n
\n
\n
\n\n \n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n \n \n ${categories.map(category => {\n const info = CATEGORY_INFO[category]\n const title = info ? info.title : category\n return ``\n }).join('\\n ')}\n \n \n \n \n
\n
\n
\n
\n
\n\n \n
\n ${Object.entries(endpointsByCategory).map(([category, endpoints]) => {\n const info = CATEGORY_INFO[category] || { title: category, description: '', icon: '📋' }\n return `\n
\n
\n \n
\n
\n ${info.icon}\n
\n

${info.title}

\n

${info.description}

\n
\n
\n \n ${endpoints.length} endpoint${endpoints.length !== 1 ? 's' : ''}\n \n
\n
\n
\n\n \n
\n ${endpoints.map(endpoint => `\n
\n
\n \n ${endpoint.method}\n \n
\n
\n ${endpoint.path}\n ${renderAuthBadge(endpoint.authentication)}\n ${endpoint.documented === false ? `\n \n Auto-discovered\n \n ` : ''}\n
\n

${endpoint.description || 'No description available'}

\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n }).join('')}\n
\n\n \n
\n \n \n \n

No endpoints found

\n

Try adjusting your search or filter criteria

\n
\n
\n\n \n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'API Reference',\n pageTitle: 'API Reference',\n currentPath: '/admin/api-reference',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","/**\n * Admin API Reference Routes\n *\n * Provides the API Reference page for the admin dashboard.\n * Uses auto-discovery via Hono's inspectRoutes() to always show\n * the complete list of registered API endpoints.\n */\n\nimport { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderAPIReferencePage,\n type APIReferencePageData\n} from '../templates/pages/admin-api-reference.template'\nimport { getCoreVersion } from '../utils/version'\nimport { buildRouteList, getAppInstance } from '../services/route-metadata'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin/api-reference - API Reference Page\n *\n * Auto-discovers all registered routes using Hono's inspectRoutes()\n * and enriches them with metadata from the route-metadata registry.\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const app = getAppInstance()\n const endpoints = buildRouteList(app)\n\n const pageData: APIReferencePageData = {\n endpoints,\n user: user ? {\n name: user.email.split('@')[0] || user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n } catch (error) {\n console.error('API Reference page error:', error)\n\n const pageData: APIReferencePageData = {\n endpoints: [],\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n }\n})\n\nexport { router as adminApiReferenceRoutes }\n","/**\n * Routes Module Exports\n *\n * Routes are being migrated incrementally from the monolith.\n * Each route is refactored to remove monolith-specific dependencies.\n */\n\n// API routes\nexport { default as apiRoutes } from './api'\nexport { default as apiContentCrudRoutes } from './api-content-crud'\nexport { default as apiMediaRoutes } from './api-media'\nexport { default as apiSystemRoutes } from './api-system'\nexport { default as adminApiRoutes } from './admin-api'\n\n// Auth routes\nexport { default as authRoutes } from './auth'\n\n// Test routes (only for development/test environments)\nexport { default as testCleanupRoutes } from './test-cleanup'\n\n// Admin UI routes\nexport { default as adminContentRoutes } from './admin-content'\nexport { userRoutes as adminUsersRoutes } from './admin-users'\nexport { adminMediaRoutes } from './admin-media'\nexport { adminPluginRoutes } from './admin-plugins'\nexport { adminLogsRoutes } from './admin-logs'\nexport { adminDesignRoutes } from './admin-design'\nexport { adminCheckboxRoutes } from './admin-checkboxes'\nexport { default as adminTestimonialsRoutes } from './admin-testimonials'\nexport { default as adminCodeExamplesRoutes } from './admin-code-examples'\nexport { adminDashboardRoutes } from './admin-dashboard'\nexport { adminCollectionsRoutes } from './admin-collections'\nexport { adminSettingsRoutes } from './admin-settings'\nexport { adminFormsRoutes } from './admin-forms'\nexport { default as publicFormsRoutes } from './public-forms'\nexport { adminApiReferenceRoutes } from './admin-api-reference'\n\nexport const ROUTES_INFO = {\n message: 'Core routes available',\n available: [\n 'apiRoutes',\n 'apiContentCrudRoutes',\n 'apiMediaRoutes',\n 'apiSystemRoutes',\n 'adminApiRoutes',\n 'authRoutes',\n 'testCleanupRoutes',\n 'adminContentRoutes',\n 'adminUsersRoutes',\n 'adminMediaRoutes',\n 'adminPluginRoutes',\n 'adminLogsRoutes',\n 'adminDesignRoutes',\n 'adminCheckboxRoutes',\n 'adminTestimonialsRoutes',\n 'adminCodeExamplesRoutes',\n 'adminDashboardRoutes',\n 'adminCollectionsRoutes',\n 'adminSettingsRoutes',\n 'adminFormsRoutes',\n 'publicFormsRoutes',\n 'adminApiReferenceRoutes'\n ],\n status: 'Core package routes ready',\n reference: 'https://github.com/sonicjs/sonicjs'\n} as const\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-5QK3FXKX.js b/packages/core/dist/chunk-DMPXZ6JJ.js similarity index 94% rename from packages/core/dist/chunk-5QK3FXKX.js rename to packages/core/dist/chunk-DMPXZ6JJ.js index 259441d8d..612f76dc1 100644 --- a/packages/core/dist/chunk-5QK3FXKX.js +++ b/packages/core/dist/chunk-DMPXZ6JJ.js @@ -1,8 +1,8 @@ -import { syncCollections, syncAllFormCollections, PluginBootstrapService } from './chunk-CJOLOONT.js'; -import { MigrationService } from './chunk-CSQWOYGZ.js'; +import { syncCollections, syncAllFormCollections, PluginBootstrapService } from './chunk-NJVY2U43.js'; +import { MigrationService } from './chunk-46DCL763.js'; import { metricsTracker } from './chunk-FICTAGD4.js'; import { sign, verify } from 'hono/jwt'; -import { setCookie, getCookie } from 'hono/cookie'; +import { getCookie, setCookie } from 'hono/cookie'; // src/middleware/bootstrap.ts var bootstrapComplete = false; @@ -198,7 +198,7 @@ async function verifyHs256Signature(token, secret) { return false; } } -var AuthManager = class { +var AuthManager = class _AuthManager { static async generateToken(userId, email, role, secret, expiresInSeconds) { const ttl = expiresInSeconds && expiresInSeconds > 0 ? Math.floor(expiresInSeconds) : DEFAULT_JWT_EXPIRES_IN_SECONDS; const now = Math.floor(Date.now() / 1e3); @@ -214,6 +214,13 @@ var AuthManager = class { /** * Verify a token's signature and expiration. * + * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the + * `secret` argument. If omitted, this falls back to a development-only + * placeholder secret — tokens signed with the real `JWT_SECRET` will then + * silently fail verification. From inside a Hono handler prefer + * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction + * and pulls the secret from `c.env` for you. + * * If `graceSeconds` > 0, tokens whose `exp` is within the grace window * (i.e. expired by no more than `graceSeconds`) are still returned. This * supports a sliding-session refresh endpoint that accepts recently-expired @@ -249,6 +256,26 @@ var AuthManager = class { return null; } } + /** + * Verify the JWT on an incoming Hono request using the `JWT_SECRET` + * binding from `c.env`. Reads the token from the `Authorization: Bearer …` + * header first, then falls back to the `auth_token` cookie. Returns the + * decoded payload, or null when the token is missing, malformed, expired, + * or signed with a different secret. + * + * Use this from custom Hono routes mounted alongside SonicJS — it + * resolves the secret the same way `requireAuth()` does, without forcing + * the caller to plumb it through manually. + */ + static async verifyAuthRequest(c) { + let token = c.req.header("Authorization")?.replace("Bearer ", ""); + if (!token) { + token = getCookie(c, "auth_token"); + } + if (!token) return null; + const secret = c.env?.JWT_SECRET; + return await _AuthManager.verifyToken(token, secret); + } static async hashPassword(password) { const iterations = 1e5; const salt = new Uint8Array(16); @@ -688,5 +715,5 @@ var getActivePlugins = () => []; var isPluginActive = () => false; export { AuthManager, PermissionManager, bootstrapMiddleware, cacheHeaders, compressionMiddleware, csrfProtection, detailedLoggingMiddleware, generateCsrfToken, getActivePlugins, getJwtExpirySeconds, getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb, isPluginActive, logActivity, loggingMiddleware, metricsMiddleware, optionalAuth, performanceLoggingMiddleware, rateLimit, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware, securityLoggingMiddleware, validateCsrfToken, verifySecurityConfig }; -//# sourceMappingURL=chunk-5QK3FXKX.js.map -//# sourceMappingURL=chunk-5QK3FXKX.js.map \ No newline at end of file +//# sourceMappingURL=chunk-DMPXZ6JJ.js.map +//# sourceMappingURL=chunk-DMPXZ6JJ.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-DMPXZ6JJ.js.map b/packages/core/dist/chunk-DMPXZ6JJ.js.map new file mode 100644 index 000000000..a7ac17d1b --- /dev/null +++ b/packages/core/dist/chunk-DMPXZ6JJ.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/middleware/bootstrap.ts","../src/middleware/auth.ts","../src/middleware/metrics.ts","../src/middleware/csrf.ts","../src/middleware/rate-limit.ts","../src/middleware/security-headers.ts","../src/middleware/index.ts"],"names":["result","JWT_SECRET_FALLBACK","getCookie","setCookie"],"mappings":"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","file":"chunk-DMPXZ6JJ.js","sourcesContent":["import { Context, Next } from \"hono\";\nimport { syncCollections } from \"../services/collection-sync\";\nimport { syncAllFormCollections } from \"../services/form-collection-sync\";\nimport { MigrationService } from \"../services/migrations\";\nimport { PluginBootstrapService } from \"../services/plugin-bootstrap\";\nimport type { SonicJSConfig } from \"../app\";\n\ntype Bindings = {\n DB: D1Database;\n KV: KVNamespace;\n JWT_SECRET?: string;\n CORS_ORIGINS?: string;\n ENVIRONMENT?: string;\n};\n\n// Track if bootstrap has been run in this worker instance\nlet bootstrapComplete = false;\n\n/**\n * Verify security-critical environment configuration at startup.\n * Logs warnings in development, throws in production to prevent\n * insecure deployments from silently running.\n */\nexport function verifySecurityConfig(env: Bindings): void {\n const warnings: string[] = [];\n\n // Check JWT secret\n if (!env.JWT_SECRET) {\n warnings.push(\n \"JWT_SECRET is not set — using hardcoded fallback. Set via `wrangler secret put JWT_SECRET`\"\n );\n } else if (env.JWT_SECRET.includes(\"change-in-production\")) {\n warnings.push(\n \"JWT_SECRET contains the default value — tokens are forgeable. Generate a strong random secret\"\n );\n }\n\n // Check CORS origins\n if (!env.CORS_ORIGINS) {\n warnings.push(\n \"CORS_ORIGINS is not set — all cross-origin API requests will be rejected\"\n );\n }\n\n // Check environment designation\n if (!env.ENVIRONMENT) {\n warnings.push(\n \"ENVIRONMENT is not set — HSTS header will not be applied. Set to \\\"production\\\" or \\\"development\\\"\"\n );\n }\n\n if (warnings.length === 0) {\n return;\n }\n\n const isProduction = env.ENVIRONMENT === \"production\";\n\n for (const warning of warnings) {\n console.warn(`[SonicJS Security] ${warning}`);\n }\n\n if (isProduction) {\n // In production, a missing or default JWT_SECRET is a hard failure —\n // every token issued would be forgeable by anyone reading the source code.\n const hasCritical =\n !env.JWT_SECRET || env.JWT_SECRET.includes(\"change-in-production\");\n if (hasCritical) {\n throw new Error(\n \"[SonicJS Security] CRITICAL: Production deployment is missing a secure JWT_SECRET. \" +\n \"Set it via `wrangler secret put JWT_SECRET` before deploying.\"\n );\n }\n }\n}\n\n/**\n * Bootstrap middleware that ensures system initialization\n * Runs once per worker instance\n */\nexport function bootstrapMiddleware(config: SonicJSConfig = {}) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n // Skip if already bootstrapped in this worker instance\n if (bootstrapComplete) {\n return next();\n }\n\n // Skip bootstrap for static assets and health checks\n const path = c.req.path;\n if (\n path.startsWith(\"/images/\") ||\n path.startsWith(\"/assets/\") ||\n path === \"/health\" ||\n path.endsWith(\".js\") ||\n path.endsWith(\".css\") ||\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".ico\")\n ) {\n return next();\n }\n\n try {\n console.log(\"[Bootstrap] Starting system initialization...\");\n\n // 1. Run database migrations first\n console.log(\"[Bootstrap] Running database migrations...\");\n const migrationService = new MigrationService(c.env.DB);\n await migrationService.runPendingMigrations();\n\n // 2. Sync collection configurations\n console.log(\"[Bootstrap] Syncing collection configurations...\");\n try {\n await syncCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing collections:\", error);\n // Continue bootstrap even if collection sync fails\n }\n\n // 2b. Sync form-derived shadow collections\n console.log(\"[Bootstrap] Syncing form collections...\");\n try {\n await syncAllFormCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing form collections:\", error);\n }\n\n // 3. Bootstrap core plugins (unless disableAll is set)\n if (!config.plugins?.disableAll) {\n console.log(\"[Bootstrap] Bootstrapping core plugins...\");\n const bootstrapService = new PluginBootstrapService(c.env.DB);\n\n // Check if bootstrap is needed\n const needsBootstrap = await bootstrapService.isBootstrapNeeded();\n if (needsBootstrap) {\n await bootstrapService.bootstrapCorePlugins();\n }\n } else {\n console.log(\"[Bootstrap] Plugin bootstrap skipped (disableAll is true)\");\n }\n\n // Mark bootstrap as complete for this worker instance\n bootstrapComplete = true;\n console.log(\"[Bootstrap] System initialization completed\");\n } catch (error) {\n console.error(\"[Bootstrap] Error during system initialization:\", error);\n // Don't prevent the app from starting, but log the error\n }\n\n // 4. Verify security configuration (outside try/catch so critical\n // errors in production propagate and prevent insecure deployments)\n verifySecurityConfig(c.env as Bindings);\n\n return next();\n };\n}\n\n/**\n * Reset bootstrap flag (useful for testing)\n */\nexport function resetBootstrap() {\n bootstrapComplete = false;\n}\n","import { sign, verify } from 'hono/jwt'\nimport { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\ntype JWTPayload = {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n}\n\n// Fallback JWT secret for local development only (no wrangler secret set)\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// Default JWT TTL: 30 days. Can be overridden via JWT_EXPIRES_IN env var.\nconst DEFAULT_JWT_EXPIRES_IN_SECONDS = 60 * 60 * 24 * 30\n\n/**\n * Parse a TTL string like \"30d\", \"12h\", \"3600s\", or a bare number-of-seconds\n * into a seconds value. Returns null if the input is missing/unparseable.\n */\nfunction parseDuration(input: string | number | undefined | null): number | null {\n if (input === undefined || input === null || input === '') return null\n if (typeof input === 'number' && Number.isFinite(input) && input > 0) {\n return Math.floor(input)\n }\n const raw = String(input).trim()\n if (/^\\d+$/.test(raw)) {\n const n = parseInt(raw, 10)\n return n > 0 ? n : null\n }\n const match = raw.match(/^(\\d+)\\s*(s|sec|secs|seconds|m|min|mins|minutes|h|hr|hrs|hours|d|day|days)$/i)\n if (!match) return null\n const value = parseInt(match[1]!, 10)\n const unit = match[2]!.toLowerCase()\n if (unit.startsWith('s')) return value\n if (unit.startsWith('m')) return value * 60\n if (unit.startsWith('h')) return value * 60 * 60\n if (unit.startsWith('d')) return value * 60 * 60 * 24\n return null\n}\n\n/**\n * Resolve the JWT expiry in seconds from the environment.\n * Honors `JWT_EXPIRES_IN` (seconds or \"30d\"/\"12h\"/\"3600s\") with a 30-day default.\n */\nexport function getJwtExpirySeconds(env?: Record | null): number {\n const configured = parseDuration(env?.JWT_EXPIRES_IN)\n return configured ?? DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the JWT expiry in seconds. Precedence: `JWT_EXPIRES_IN` env var\n * (authoritative ceiling) → `settings.security.jwtExpiresIn` DB value\n * (admin-configurable) → 30-day default.\n *\n * The env var wins so operators can cap runtime overrides — admins can adjust\n * the TTL from /admin/settings/security, but an env var, if set, always wins.\n * DB failures fall back to env/default so auth never breaks if the settings\n * table is unreachable.\n */\nexport async function getJwtExpirySecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const envParsed = parseDuration(env?.JWT_EXPIRES_IN)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtExpiresIn'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* value may already be a bare string */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtExpiresIn from settings, falling back to default:', err)\n }\n }\n return DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the refresh grace window (seconds) for `/auth/refresh`. Precedence:\n * `JWT_REFRESH_GRACE_SECONDS` env var → `settings.security.jwtRefreshGraceSeconds`\n * DB value → 7-day default.\n */\nexport async function getJwtRefreshGraceSecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const DEFAULT_GRACE = 60 * 60 * 24 * 7\n const envParsed = parseDuration(env?.JWT_REFRESH_GRACE_SECONDS)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtRefreshGraceSeconds'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* may be bare */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtRefreshGraceSeconds from settings:', err)\n }\n }\n return DEFAULT_GRACE\n}\n\n/**\n * Decode a JWT payload without verifying the signature. Returns null on any\n * parsing failure. Callers MUST independently verify the signature before\n * trusting this value — used from the grace-window refresh path where the\n * signature is verified explicitly via `verifyHs256Signature`.\n */\nfunction decodeJwtPayload(token: string): JWTPayload | null {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return null\n const b64 = parts[1]!.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const json = atob(padded)\n const obj = JSON.parse(json)\n if (!obj || typeof obj.exp !== 'number') return null\n return obj as JWTPayload\n } catch {\n return null\n }\n}\n\nfunction base64UrlToBytes(b64url: string): Uint8Array {\n const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const bin = atob(padded)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return bytes\n}\n\n/**\n * Verify a JWT's HS256 signature using Web Crypto, independent of hono/jwt.\n * Returns true iff the signature matches the header.payload portion.\n */\nasync function verifyHs256Signature(token: string, secret: string): Promise {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return false\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n )\n const signature = base64UrlToBytes(parts[2]!)\n const message = encoder.encode(`${parts[0]}.${parts[1]}`)\n return await crypto.subtle.verify('HMAC', key, signature, message)\n } catch {\n return false\n }\n}\n\nexport class AuthManager {\n static async generateToken(\n userId: string,\n email: string,\n role: string,\n secret?: string,\n expiresInSeconds?: number\n ): Promise {\n const ttl = expiresInSeconds && expiresInSeconds > 0\n ? Math.floor(expiresInSeconds)\n : DEFAULT_JWT_EXPIRES_IN_SECONDS\n const now = Math.floor(Date.now() / 1000)\n const payload: JWTPayload = {\n userId,\n email,\n role,\n exp: now + ttl,\n iat: now\n }\n\n return await sign(payload, secret || JWT_SECRET_FALLBACK, 'HS256')\n }\n\n /**\n * Verify a token's signature and expiration.\n *\n * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the\n * `secret` argument. If omitted, this falls back to a development-only\n * placeholder secret — tokens signed with the real `JWT_SECRET` will then\n * silently fail verification. From inside a Hono handler prefer\n * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction\n * and pulls the secret from `c.env` for you.\n *\n * If `graceSeconds` > 0, tokens whose `exp` is within the grace window\n * (i.e. expired by no more than `graceSeconds`) are still returned. This\n * supports a sliding-session refresh endpoint that accepts recently-expired\n * tokens. Signature failures always return null.\n */\n static async verifyToken(\n token: string,\n secret?: string,\n graceSeconds: number = 0\n ): Promise {\n const effectiveSecret = secret || JWT_SECRET_FALLBACK\n try {\n let payload: JWTPayload | null = null\n try {\n payload = await verify(token, effectiveSecret, 'HS256') as JWTPayload\n } catch (verifyError: any) {\n // hono/jwt checks `exp` before signature, so a bad-signature token\n // that happens to be expired will throw JwtTokenExpired here. For\n // the grace window, we still require a valid HS256 signature before\n // accepting the payload.\n const name = verifyError?.name || ''\n const message = String(verifyError?.message || '')\n const isExpired = name === 'JwtTokenExpired' || message.includes('expired')\n if (!isExpired || graceSeconds <= 0) {\n throw verifyError\n }\n const signatureValid = await verifyHs256Signature(token, effectiveSecret)\n if (!signatureValid) return null\n const decoded = decodeJwtPayload(token)\n if (!decoded) return null\n payload = decoded\n }\n\n if (!payload) return null\n\n const now = Math.floor(Date.now() / 1000)\n if (payload.exp < now - Math.max(0, Math.floor(graceSeconds))) {\n return null\n }\n\n return payload\n } catch (error) {\n console.error('Token verification failed:', error)\n return null\n }\n }\n\n /**\n * Verify the JWT on an incoming Hono request using the `JWT_SECRET`\n * binding from `c.env`. Reads the token from the `Authorization: Bearer …`\n * header first, then falls back to the `auth_token` cookie. Returns the\n * decoded payload, or null when the token is missing, malformed, expired,\n * or signed with a different secret.\n *\n * Use this from custom Hono routes mounted alongside SonicJS — it\n * resolves the secret the same way `requireAuth()` does, without forcing\n * the caller to plumb it through manually.\n */\n static async verifyAuthRequest(c: Context): Promise {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n if (!token) return null\n const secret = (c.env as any)?.JWT_SECRET\n return await AuthManager.verifyToken(token, secret)\n }\n\n static async hashPassword(password: string): Promise {\n const iterations = 100000\n const salt = new Uint8Array(16)\n crypto.getRandomValues(salt)\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const saltHex = Array.from(salt).map(b => b.toString(16).padStart(2, '0')).join('')\n const hashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n return `pbkdf2:${iterations}:${saltHex}:${hashHex}`\n }\n\n static async hashPasswordLegacy(password: string): Promise {\n const encoder = new TextEncoder()\n const data = encoder.encode(password + 'salt-change-in-production')\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n static async verifyPassword(password: string, storedHash: string): Promise {\n if (storedHash.startsWith('pbkdf2:')) {\n // PBKDF2 format: pbkdf2:::\n const parts = storedHash.split(':')\n if (parts.length !== 4) return false\n\n const iterationsStr = parts[1]!\n const saltHex = parts[2]!\n const expectedHashHex = parts[3]!\n const iterations = parseInt(iterationsStr, 10)\n\n const saltBytes = saltHex.match(/.{2}/g)\n if (!saltBytes) return false\n const salt = new Uint8Array(saltBytes.map(byte => parseInt(byte, 16)))\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const actualHashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n // Constant-time comparison\n if (actualHashHex.length !== expectedHashHex.length) return false\n let result = 0\n for (let i = 0; i < actualHashHex.length; i++) {\n result |= actualHashHex.charCodeAt(i) ^ expectedHashHex.charCodeAt(i)\n }\n return result === 0\n }\n\n // Legacy SHA-256 format (no colons in hash)\n const legacyHash = await this.hashPasswordLegacy(password)\n // Constant-time comparison for legacy too\n if (legacyHash.length !== storedHash.length) return false\n let result = 0\n for (let i = 0; i < legacyHash.length; i++) {\n result |= legacyHash.charCodeAt(i) ^ storedHash.charCodeAt(i)\n }\n return result === 0\n }\n\n static isLegacyHash(storedHash: string): boolean {\n return !storedHash.startsWith('pbkdf2:')\n }\n\n /**\n * Set authentication cookie - useful for plugins implementing alternative auth methods\n * @param c - Hono context\n * @param token - JWT token to set in cookie\n * @param options - Optional cookie configuration\n */\n static setAuthCookie(c: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void {\n setCookie(c, 'auth_token', token, {\n httpOnly: options?.httpOnly ?? true,\n secure: options?.secure ?? true,\n sameSite: options?.sameSite ?? 'Strict',\n maxAge: options?.maxAge ?? getJwtExpirySeconds((c as any)?.env)\n })\n }\n}\n\n// Middleware to require authentication\nexport const requireAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n // Try to get token from Authorization header\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n\n // If no header token, try cookie\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n\n if (!token) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n // Try to get cached token verification from KV\n const kv = c.env?.KV\n let payload: JWTPayload | null = null\n\n if (kv) {\n const cacheKey = `auth:${token.substring(0, 20)}` // Use token prefix as key\n const cached = await kv.get(cacheKey, 'json')\n if (cached) {\n payload = cached as JWTPayload\n }\n }\n\n // If not cached, verify token\n if (!payload) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n payload = await AuthManager.verifyToken(token, jwtSecret)\n\n // Cache the verified payload for 5 minutes\n if (payload && kv) {\n const cacheKey = `auth:${token.substring(0, 20)}`\n await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 })\n }\n }\n\n if (!payload) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Your session has expired, please login again')\n }\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Add user info to context\n c.set('user', payload)\n\n return await next()\n } catch (error) {\n console.error('Auth middleware error:', error)\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Authentication failed, please login again')\n }\n return c.json({ error: 'Authentication failed' }, 401)\n }\n }\n}\n\n// Middleware to require specific role\nexport const requireRole = (requiredRole: string | string[]) => {\n return async (c: Context, next: Next) => {\n const user = c.get('user') as JWTPayload\n \n if (!user) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n \n const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]\n \n if (!roles.includes(user.role)) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=You do not have permission to access this area')\n }\n return c.json({ error: 'Insufficient permissions' }, 403)\n }\n \n return await next()\n }\n}\n\n// Optional auth middleware (doesn't block if no token)\nexport const optionalAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n \n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n \n if (token) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n const payload = await AuthManager.verifyToken(token, jwtSecret)\n if (payload) {\n c.set('user', payload)\n }\n }\n \n return await next()\n } catch (error) {\n // Don't block on auth errors in optional auth\n console.error('Optional auth error:', error)\n return await next()\n }\n }\n}\n","import { MiddlewareHandler } from 'hono'\nimport { metricsTracker } from '../utils/metrics'\n\n/**\n * Middleware to track all HTTP requests for real-time analytics\n * Excludes the metrics endpoint itself to avoid inflating the count\n */\nexport const metricsMiddleware = (): MiddlewareHandler => {\n return async (c, next) => {\n const path = new URL(c.req.url).pathname\n\n // Don't track the metrics endpoint itself to avoid self-inflating counts\n if (path !== '/admin/dashboard/api/metrics') {\n metricsTracker.recordRequest()\n }\n\n // Continue with the request\n await next()\n }\n}\n","/**\n * CSRF Protection Middleware — Signed Double-Submit Cookie\n *\n * Stateless CSRF protection for Cloudflare Workers (no session store needed).\n * Token format: `.` where HMAC-SHA256 is keyed with JWT_SECRET.\n *\n * Flow:\n * GET — ensureCsrfCookie(): reuse existing valid cookie or set a new one\n * POST/PUT/DELETE/PATCH — validate X-CSRF-Token header === csrf_token cookie, HMAC valid\n *\n * Exempt:\n * - Safe methods (GET, HEAD, OPTIONS)\n * - Auth routes that create sessions (/auth/login*, /auth/register*, etc.)\n * - Public form submissions (/forms/*, /api/forms/*) — NOT /admin/forms/*\n * - Requests with no auth_token cookie (Bearer-only or API-key-only)\n */\n\nimport type { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\n// Fallback secret — mirrors auth.ts behavior for local dev without wrangler secret\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Convert ArrayBuffer to URL-safe base64 (no padding). */\nexport function arrayBufferToBase64Url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!)\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Import a string key for HMAC-SHA256. */\nasync function getHmacKey(secret: string): Promise {\n const encoder = new TextEncoder()\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify']\n )\n}\n\n// ============================================================================\n// Token Generation & Validation\n// ============================================================================\n\n/**\n * Generate a signed CSRF token: `.`\n * - nonce = 32 random bytes, base64url-encoded\n * - signature = HMAC-SHA256(nonce, secret), base64url-encoded\n */\nexport async function generateCsrfToken(secret: string): Promise {\n const nonceBytes = new Uint8Array(32)\n crypto.getRandomValues(nonceBytes)\n const nonce = arrayBufferToBase64Url(nonceBytes.buffer)\n\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(nonce))\n const signature = arrayBufferToBase64Url(signatureBuffer)\n\n return `${nonce}.${signature}`\n}\n\n/**\n * Validate a signed CSRF token.\n *\n * Checks that the token has the correct `.` format and that\n * the HMAC signature is valid for the given secret. Uses crypto.subtle.verify\n * which provides constant-time comparison.\n *\n * NOTE: No expiry check here — by design. The security property of signed\n * double-submit comes from the unpredictability of the nonce + the\n * secret-bound HMAC, not from time-bounding. The cookie's maxAge (86400s)\n * handles expiry at the browser level.\n */\nexport async function validateCsrfToken(token: string, secret: string): Promise {\n if (!token || typeof token !== 'string') return false\n\n const dotIndex = token.indexOf('.')\n if (dotIndex === -1) return false\n\n const nonce = token.substring(0, dotIndex)\n const signature = token.substring(dotIndex + 1)\n\n if (!nonce || !signature) return false\n\n try {\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n\n // Decode the signature from base64url\n const sigPadded = signature.replace(/-/g, '+').replace(/_/g, '/')\n const sigBinary = atob(sigPadded)\n const sigBytes = new Uint8Array(sigBinary.length)\n for (let i = 0; i < sigBinary.length; i++) {\n sigBytes[i] = sigBinary.charCodeAt(i)\n }\n\n // crypto.subtle.verify is constant-time\n return await crypto.subtle.verify('HMAC', key, sigBytes.buffer, encoder.encode(nonce))\n } catch {\n return false\n }\n}\n\n// ============================================================================\n// Default Exempt Paths\n// ============================================================================\n\nconst DEFAULT_EXEMPT_PATHS = [\n '/auth/login',\n '/auth/register',\n '/auth/seed-admin',\n '/auth/accept-invitation',\n '/auth/reset-password',\n '/auth/request-password-reset',\n '/auth/otp',\n '/auth/magic-link',\n '/auth/verify',\n '/api/stripe/webhook',\n '/api/events',\n]\n\n/**\n * Check whether a request path is exempt from CSRF validation.\n * - Exact match or startsWith for auth routes (e.g. /auth/login/form)\n * - /forms/* and /api/forms/* are exempt (public submissions)\n * - /api/search* is exempt (read-only POST for complex query params)\n * - /admin/forms/* is NOT exempt\n */\nfunction isExemptPath(path: string, extraExemptPaths: string[] = []): boolean {\n // Public form routes — NOT /admin/forms/*\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/') || path === '/forms' || path === '/api/forms') {\n return true\n }\n\n // Search API — read-only POST (includes /api/search/click, /api/search/facet-click)\n if (path.startsWith('/api/search')) {\n return true\n }\n\n const allExempt = [...DEFAULT_EXEMPT_PATHS, ...extraExemptPaths]\n for (const exempt of allExempt) {\n if (path === exempt || path.startsWith(exempt + '/')) {\n return true\n }\n }\n\n return false\n}\n\n// ============================================================================\n// Middleware\n// ============================================================================\n\nexport interface CsrfOptions {\n /** Additional paths to exempt from CSRF validation. */\n exemptPaths?: string[]\n}\n\n/**\n * CSRF protection middleware (Signed Double-Submit Cookie).\n *\n * - GET/HEAD/OPTIONS: ensure a valid csrf_token cookie exists\n * - POST/PUT/DELETE/PATCH: validate X-CSRF-Token header matches cookie, HMAC valid\n * - Exempt: auth routes, public /forms/*, Bearer-only, API-key-only\n */\nexport function csrfProtection(options: CsrfOptions = {}) {\n return async (c: Context, next: Next): Promise => {\n const method = c.req.method.toUpperCase()\n const path = new URL(c.req.url).pathname\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n\n // Warn if using fallback secret in production\n if (c.env?.ENVIRONMENT === 'production' && !c.env?.JWT_SECRET) {\n console.warn(\n '[CSRF] WARNING: JWT_SECRET is not set in production. ' +\n 'CSRF tokens are signed with the fallback key, which is insecure.'\n )\n }\n\n // Safe methods — just ensure cookie, then pass through\n if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS') {\n await ensureCsrfCookie(c, secret)\n await next()\n return\n }\n\n // Exempt paths — pass through without validation\n if (isExemptPath(path, options.exemptPaths)) {\n await next()\n return\n }\n\n // Bearer-only or API-key-only requests (no auth_token cookie) — exempt\n const authCookie = getCookie(c, 'auth_token')\n if (!authCookie) {\n await next()\n return\n }\n\n // Requests with an Authorization header use token-based auth — the cookie\n // is incidental and CSRF protection is unnecessary (the attacker cannot\n // forge the Authorization header from a cross-origin page).\n const authHeader = c.req.header('Authorization')\n if (authHeader) {\n await next()\n return\n }\n\n // State-changing request with cookie auth — validate CSRF\n const cookieToken = getCookie(c, 'csrf_token')\n let headerToken = c.req.header('X-CSRF-Token')\n\n // Fallback: check _csrf field in form-encoded body (regular HTML form submissions)\n if (!headerToken) {\n const contentType = c.req.header('Content-Type') || ''\n if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n try {\n const body = await c.req.parseBody()\n headerToken = body['_csrf'] as string | undefined\n } catch {\n // Body not parseable — leave headerToken undefined\n }\n }\n }\n\n if (!cookieToken || !headerToken) {\n return csrfError(c, 'CSRF token missing')\n }\n\n if (cookieToken !== headerToken) {\n return csrfError(c, 'CSRF token mismatch')\n }\n\n const isValid = await validateCsrfToken(cookieToken, secret)\n if (!isValid) {\n return csrfError(c, 'CSRF token invalid')\n }\n\n await next()\n }\n}\n\n/**\n * Ensure a valid CSRF cookie exists. Check-then-reuse: if the existing cookie\n * has a valid HMAC signature, reuse it (no new Set-Cookie header). Only\n * generate a fresh token when the cookie is missing or has an invalid signature.\n */\nasync function ensureCsrfCookie(c: Context, secret: string): Promise {\n const existing = getCookie(c, 'csrf_token')\n\n if (existing) {\n const isValid = await validateCsrfToken(existing, secret)\n if (isValid) {\n // Reuse existing valid token — no Set-Cookie needed\n c.set('csrfToken', existing)\n return\n }\n }\n\n // Generate fresh token\n const token = await generateCsrfToken(secret)\n c.set('csrfToken', token)\n\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n setCookie(c, 'csrf_token', token, {\n httpOnly: false, // JS must read this cookie\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: 86400, // 24 hours — browser-side expiry\n })\n}\n\n/** Return a 403 CSRF error — HTML for browser requests, JSON for API. */\nfunction csrfError(c: Context, message: string): Response {\n const accept = c.req.header('Accept') || ''\n if (accept.includes('text/html')) {\n return c.html(\n `403 Forbidden` +\n `

403 Forbidden

${message}

`,\n 403\n )\n }\n return c.json({ error: message, status: 403 }, 403)\n}\n","import { Context, Next } from 'hono'\n\ninterface RateLimitOptions {\n max: number\n windowMs: number\n keyPrefix: string\n}\n\ninterface RateLimitEntry {\n count: number\n resetAt: number\n}\n\n/**\n * KV-based sliding window rate limiter middleware.\n * Gracefully skips if CACHE_KV binding is not available.\n */\nexport function rateLimit(options: RateLimitOptions) {\n const { max, windowMs, keyPrefix } = options\n\n return async (c: Context, next: Next) => {\n const kv = (c.env as any)?.CACHE_KV\n if (!kv) {\n // No KV binding available — skip rate limiting\n return await next()\n }\n\n const ip = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const key = `ratelimit:${keyPrefix}:${ip}`\n\n try {\n const now = Date.now()\n const stored = await kv.get(key, 'json') as RateLimitEntry | null\n\n let entry: RateLimitEntry\n if (stored && stored.resetAt > now) {\n entry = stored\n } else {\n entry = { count: 0, resetAt: now + windowMs }\n }\n\n entry.count++\n\n // Calculate TTL in seconds (KV expiration)\n const ttlSeconds = Math.ceil((entry.resetAt - now) / 1000)\n\n if (entry.count > max) {\n // Store the updated count even when rejecting\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n const retryAfter = Math.ceil((entry.resetAt - now) / 1000)\n c.header('Retry-After', String(retryAfter))\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', '0')\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n return c.json({ error: 'Too many requests. Please try again later.' }, 429)\n }\n\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', String(max - entry.count))\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n\n return await next()\n } catch (error) {\n // Rate limiting should never break the app\n console.error('Rate limiter error (non-fatal):', error)\n return await next()\n }\n }\n}\n","import { Context, Next } from 'hono'\n\n/**\n * Security headers middleware.\n * Sets standard security headers on every response.\n * Skips HSTS in development to avoid local dev issues.\n */\nexport const securityHeadersMiddleware = () => {\n return async (c: Context, next: Next) => {\n await next()\n\n c.header('X-Content-Type-Options', 'nosniff')\n c.header('X-Frame-Options', 'SAMEORIGIN')\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin')\n c.header('Permissions-Policy', 'camera=(), microphone=(), geolocation=()')\n\n // Only set HSTS in non-development environments\n const environment = (c.env as any)?.ENVIRONMENT\n if (environment !== 'development') {\n c.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains')\n }\n }\n}\n","/**\n * Middleware Module Exports\n *\n * Request processing middleware for SonicJS\n *\n * Note: Most middleware is currently in the monolith and will be migrated later.\n * For now, we only export the bootstrap middleware which is used for system initialization.\n */\n\n// Bootstrap middleware\nexport { bootstrapMiddleware, verifySecurityConfig } from './bootstrap'\n\n// Auth middleware\nexport {\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n getJwtExpirySeconds,\n getJwtExpirySecondsFromDb,\n getJwtRefreshGraceSecondsFromDb,\n} from './auth'\n\n// Metrics middleware\nexport { metricsMiddleware } from './metrics'\n\n// CSRF protection middleware\nexport { csrfProtection, generateCsrfToken, validateCsrfToken } from './csrf'\n\n// Rate limiting middleware\nexport { rateLimit } from './rate-limit'\n\n// Re-export types and functions that are referenced but implemented in monolith\n// These are placeholder exports to maintain API compatibility\nexport type Permission = string\nexport type UserPermissions = {\n userId: string\n permissions: Permission[]\n}\n\n// Middleware stubs - these return pass-through middleware that call next()\nexport const loggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const detailedLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const securityLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const performanceLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const cacheHeaders: any = () => async (_c: any, next: any) => await next()\nexport const compressionMiddleware: any = async (_c: any, next: any) => await next()\nexport { securityHeadersMiddleware as securityHeaders } from './security-headers'\n\n// Other stubs\nexport const PermissionManager: any = {}\nexport const requirePermission: any = () => async (_c: any, next: any) => await next()\nexport const requireAnyPermission: any = () => async (_c: any, next: any) => await next()\nexport const logActivity: any = () => {}\nexport const requireActivePlugin: any = () => async (_c: any, next: any) => await next()\nexport const requireActivePlugins: any = () => async (_c: any, next: any) => await next()\nexport const getActivePlugins: any = () => []\nexport const isPluginActive: any = () => false\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-NDS4S4AG.js b/packages/core/dist/chunk-FE77VWGD.js similarity index 99% rename from packages/core/dist/chunk-NDS4S4AG.js rename to packages/core/dist/chunk-FE77VWGD.js index cf0fb6df1..5a739053b 100644 --- a/packages/core/dist/chunk-NDS4S4AG.js +++ b/packages/core/dist/chunk-FE77VWGD.js @@ -466,7 +466,7 @@ function buildQuery(table, filter) { // package.json var package_default = { name: "@sonicjs-cms/core", - version: "2.18.0", + version: "2.18.1", description: "Core framework for SonicJS headless CMS - Edge-first, TypeScript-native CMS built for Cloudflare Workers", type: "module", main: "./dist/index.cjs", @@ -588,7 +588,7 @@ var package_default = { "drizzle-orm": "^0.45.2", eslint: "^9.39.2", glob: "^10.5.0", - hono: "^4.12.12", + hono: "^4.12.18", tsup: "^8.5.0", typescript: "^5.9.3", vitest: "^4.0.5", @@ -655,5 +655,5 @@ function parseBlocksValue(value, config) { } export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, generateSlug, getBlocksFieldConfig, getCoreVersion, package_default, parseBlocksValue, renderTemplate, templateRenderer }; -//# sourceMappingURL=chunk-NDS4S4AG.js.map -//# sourceMappingURL=chunk-NDS4S4AG.js.map \ No newline at end of file +//# sourceMappingURL=chunk-FE77VWGD.js.map +//# sourceMappingURL=chunk-FE77VWGD.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-NDS4S4AG.js.map b/packages/core/dist/chunk-FE77VWGD.js.map similarity index 99% rename from packages/core/dist/chunk-NDS4S4AG.js.map rename to packages/core/dist/chunk-FE77VWGD.js.map index bc302feab..e9ddf0377 100644 --- a/packages/core/dist/chunk-NDS4S4AG.js.map +++ b/packages/core/dist/chunk-FE77VWGD.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/utils/slug-utils.ts","../src/utils/template-renderer.ts","../src/utils/query-filter.ts","../package.json","../src/utils/version.ts","../src/utils/blocks.ts"],"names":[],"mappings":"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","file":"chunk-NDS4S4AG.js","sourcesContent":["/**\n * Slug generation utilities for creating URL-friendly slugs\n */\n\n/**\n * Generate URL-friendly slug from text\n * \n * Features:\n * - Converts to lowercase\n * - Handles accented characters (NFD normalization)\n * - Removes diacritics\n * - Keeps only alphanumeric, spaces, underscores, and hyphens\n * - Replaces spaces with hyphens\n * - Collapses multiple hyphens/underscores\n * - Trims leading/trailing hyphens/underscores\n * - Limits length to 100 characters\n * \n * @param text - Text to slugify\n * @returns URL-safe slug\n * \n * @example\n * generateSlug('Hello World!') // 'hello-world'\n * generateSlug('Café París 2024') // 'cafe-paris-2024'\n * generateSlug('Multiple Spaces') // 'multiple-spaces'\n */\nexport function generateSlug(text: string): string {\n if (!text) return '';\n \n return text\n .toLowerCase()\n .normalize('NFD') // Decompose combined characters (e.g., é -> e + ́)\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9\\s_-]/g, '') // Keep only alphanumeric, spaces, underscores, hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/[-_]+/g, '-') // Collapse multiple hyphens/underscores\n .replace(/^[-_]+|[-_]+$/g, '') // Trim leading/trailing hyphens/underscores\n .substring(0, 100); // Limit length for URL safety\n}\n","// Template renderer compatible with Cloudflare Workers\n// No filesystem access available\n\ninterface TemplateData {\n [key: string]: any\n}\n\nexport class TemplateRenderer {\n private templateCache = new Map()\n\n constructor() {\n // Cloudflare Workers compatible - no filesystem access\n }\n\n /**\n * Simple Handlebars-like template engine\n */\n private renderTemplate(template: string, data: TemplateData): string {\n let rendered = template\n\n // Handle each loops - process outermost loops first for proper nesting\n rendered = rendered.replace(/\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g, (_match, arrayName, content) => {\n const array = this.getNestedValue(data, arrayName.trim())\n if (!Array.isArray(array)) return ''\n \n return array.map((item, index) => {\n // Create context with array item and special variables\n const itemContext = {\n ...data,\n // Handle primitive items (for {{.}} syntax)\n '.': item,\n // Spread item properties if it's an object\n ...(typeof item === 'object' && item !== null ? item : {}),\n '@index': index,\n '@first': index === 0,\n '@last': index === array.length - 1\n }\n return this.renderTemplate(content, itemContext)\n }).join('')\n })\n\n // Second pass: Handle conditionals\n let ifCount = 0\n while (rendered.includes('{{#if ') && ifCount < 100) {\n const previousRendered = rendered\n rendered = rendered.replace(/\\{\\{#if\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (_match, condition, content) => {\n const value = this.getNestedValue(data, condition.trim())\n // Handle boolean values properly - @first/@last are explicitly boolean\n const isTruthy = value === true || (value && value !== 0 && value !== '' && value !== null && value !== undefined)\n return isTruthy ? this.renderTemplate(content, data) : ''\n })\n if (previousRendered === rendered) break\n ifCount++\n }\n\n // Third pass: Handle triple braces for raw HTML {{{variable}}}\n rendered = rendered.replace(/\\{\\{\\{([^}]+)\\}\\}\\}/g, (_match, variable) => {\n const value = this.getNestedValue(data, variable.trim())\n return value !== undefined && value !== null ? String(value) : ''\n })\n\n // Fourth pass: Handle helper functions like {{titleCase field}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\s+([^}]+)\\}\\}/g, (match, helper, variable) => {\n const helperName = helper.trim()\n const varName = variable.trim()\n \n if (helperName === 'titleCase') {\n const value = this.getNestedValue(data, varName)\n if (value !== undefined && value !== null) {\n return this.titleCase(String(value))\n }\n }\n \n return match // Return original if helper not found\n })\n\n // Final pass: Handle simple variables {{variable}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\}\\}/g, (match, variable) => {\n const trimmed = variable.trim()\n \n // Skip if it's a helper function (has spaces)\n if (trimmed.includes(' ')) {\n return match\n }\n \n const value = this.getNestedValue(data, trimmed)\n if (value === null) return ''\n if (value === undefined) return ''\n return String(value)\n })\n\n return rendered\n }\n\n /**\n * Get nested value from object using dot notation\n */\n private getNestedValue(obj: any, path: string): any {\n if (!obj || path === '') return undefined\n \n return path.split('.').reduce((current, key) => {\n if (current === null || current === undefined) return undefined\n return current[key]\n }, obj)\n }\n\n /**\n * Title case helper function\n */\n private titleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, l => l.toUpperCase())\n }\n\n /**\n * Render a template string with data\n */\n render(template: string, data: TemplateData = {}): string {\n return this.renderTemplate(template, data)\n }\n\n /**\n * Clear template cache (useful for development)\n */\n clearCache(): void {\n this.templateCache.clear()\n }\n}\n\n// Export singleton instance\nexport const templateRenderer = new TemplateRenderer()\n\n// Utility function to render template strings directly\nexport function renderTemplate(template: string, data: TemplateData = {}): string {\n return templateRenderer.render(template, data)\n}","/**\n * Query Filter Builder for SonicJS AI\n * Supports comprehensive filtering with AND/OR logic\n * Compatible with D1 Database (SQLite)\n */\n\nexport type FilterOperator =\n | 'equals'\n | 'not_equals'\n | 'greater_than'\n | 'greater_than_equal'\n | 'less_than'\n | 'less_than_equal'\n | 'like'\n | 'contains'\n | 'starts_with'\n | 'ends_with'\n | 'in'\n | 'not_in'\n | 'all'\n | 'exists'\n | 'near'\n | 'within'\n | 'intersects'\n\nconst VALID_FILTER_OPERATORS: ReadonlySet = new Set([\n 'equals',\n 'not_equals',\n 'greater_than',\n 'greater_than_equal',\n 'less_than',\n 'less_than_equal',\n 'like',\n 'contains',\n 'starts_with',\n 'ends_with',\n 'in',\n 'not_in',\n 'all',\n 'exists',\n 'near',\n 'within',\n 'intersects'\n])\n\nexport interface FilterCondition {\n field: string\n operator: FilterOperator\n value: any\n}\n\nexport interface FilterGroup {\n and?: FilterCondition[]\n or?: FilterCondition[]\n}\n\nexport interface QueryFilter {\n where?: FilterGroup\n limit?: number\n offset?: number\n sort?: {\n field: string\n order: 'asc' | 'desc'\n }[]\n}\n\nexport interface QueryResult {\n sql: string\n params: any[]\n errors: string[]\n}\n\n/**\n * Validate sort order value - only 'asc' or 'desc' are allowed.\n * Returns the validated lowercase value, defaulting to 'asc' for invalid input.\n */\nexport function validateSortOrder(order: any): 'asc' | 'desc' {\n if (typeof order === 'string') {\n const normalized = order.toLowerCase().trim()\n if (normalized === 'asc' || normalized === 'desc') {\n return normalized\n }\n }\n return 'asc'\n}\n\n/**\n * Query Filter Builder\n * Converts filter objects into SQL WHERE clauses with parameterized queries\n */\nexport class QueryFilterBuilder {\n private params: any[] = []\n private errors: string[] = []\n\n /**\n * Build a complete SQL query from filter object\n */\n build(baseTable: string, filter: QueryFilter): QueryResult {\n this.params = []\n this.errors = []\n\n let sql = `SELECT * FROM ${baseTable}`\n\n // Build WHERE clause\n if (filter.where) {\n const whereClause = this.buildWhereClause(filter.where)\n if (whereClause) {\n sql += ` WHERE ${whereClause}`\n }\n }\n\n // Build ORDER BY clause\n if (filter.sort && filter.sort.length > 0) {\n const orderClauses = filter.sort\n .map(s => `${this.sanitizeFieldName(s.field)} ${this.sanitizeSortOrder(s.order)}`)\n .join(', ')\n sql += ` ORDER BY ${orderClauses}`\n }\n\n // Build LIMIT clause\n if (filter.limit) {\n sql += ` LIMIT ?`\n this.params.push(filter.limit)\n }\n\n // Build OFFSET clause\n if (filter.offset) {\n sql += ` OFFSET ?`\n this.params.push(filter.offset)\n }\n\n return {\n sql,\n params: this.params,\n errors: this.errors\n }\n }\n\n /**\n * Build WHERE clause from filter group\n */\n private buildWhereClause(group: FilterGroup): string {\n const clauses: string[] = []\n\n // Handle AND conditions\n if (group.and && group.and.length > 0) {\n const andClauses = group.and\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (andClauses.length > 0) {\n clauses.push(`(${andClauses.join(' AND ')})`)\n }\n }\n\n // Handle OR conditions\n if (group.or && group.or.length > 0) {\n const orClauses = group.or\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (orClauses.length > 0) {\n clauses.push(`(${orClauses.join(' OR ')})`)\n }\n }\n\n return clauses.join(' AND ')\n }\n\n /**\n * Build a single condition\n */\n private buildCondition(condition: FilterCondition): string | null {\n const field = this.sanitizeFieldName(condition.field)\n\n switch (condition.operator) {\n case 'equals':\n return this.buildEquals(field, condition.value)\n\n case 'not_equals':\n return this.buildNotEquals(field, condition.value)\n\n case 'greater_than':\n return this.buildComparison(field, '>', condition.value)\n\n case 'greater_than_equal':\n return this.buildComparison(field, '>=', condition.value)\n\n case 'less_than':\n return this.buildComparison(field, '<', condition.value)\n\n case 'less_than_equal':\n return this.buildComparison(field, '<=', condition.value)\n\n case 'like':\n return this.buildLike(field, condition.value)\n\n case 'contains':\n return this.buildContains(field, condition.value)\n\n case 'starts_with':\n return this.buildStartsWith(field, condition.value)\n\n case 'ends_with':\n return this.buildEndsWith(field, condition.value)\n\n case 'in':\n return this.buildIn(field, condition.value)\n\n case 'not_in':\n return this.buildNotIn(field, condition.value)\n\n case 'all':\n return this.buildAll(field, condition.value)\n\n case 'exists':\n return this.buildExists(field, condition.value)\n\n case 'near':\n this.errors.push(`'near' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'within':\n this.errors.push(`'within' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'intersects':\n this.errors.push(`'intersects' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n default:\n this.errors.push(`Unknown operator: ${condition.operator}`)\n return null\n }\n }\n\n /**\n * Build equals condition\n */\n private buildEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NULL`\n }\n this.params.push(value)\n return `${field} = ?`\n }\n\n /**\n * Build not equals condition\n */\n private buildNotEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NOT NULL`\n }\n this.params.push(value)\n return `${field} != ?`\n }\n\n /**\n * Build comparison condition (>, >=, <, <=)\n */\n private buildComparison(field: string, operator: string, value: any): string {\n this.params.push(value)\n return `${field} ${operator} ?`\n }\n\n /**\n * Build LIKE condition (case-insensitive, all words must be present)\n */\n private buildLike(field: string, value: string): string {\n const words = value.split(/\\s+/).filter(w => w.length > 0)\n\n if (words.length === 0) {\n return `1=1` // No-op condition\n }\n\n const conditions = words.map(word => {\n this.params.push(`%${word}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build CONTAINS condition (case-insensitive substring)\n */\n private buildContains(field: string, value: string): string {\n this.params.push(`%${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build STARTS_WITH condition (case-insensitive prefix match)\n */\n private buildStartsWith(field: string, value: string): string {\n this.params.push(`${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build ENDS_WITH condition (case-insensitive suffix match)\n */\n private buildEndsWith(field: string, value: string): string {\n this.params.push(`%${value}`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build IN condition\n */\n private buildIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=0` // No values means no matches\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} IN (${placeholders})`\n }\n\n /**\n * Build NOT IN condition\n */\n private buildNotIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1` // No values means all match\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} NOT IN (${placeholders})`\n }\n\n /**\n * Build ALL condition (value must contain all items in list)\n * For SQLite, we'll check if a JSON array contains all values\n */\n private buildAll(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1`\n }\n\n // For SQLite, check if field contains all values using JSON functions\n // This assumes the field is a JSON array or comma-separated string\n const conditions = values.map(val => {\n this.params.push(`%${val}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build EXISTS condition\n */\n private buildExists(field: string, value: boolean): string {\n if (value) {\n return `${field} IS NOT NULL AND ${field} != ''`\n } else {\n return `(${field} IS NULL OR ${field} = '')`\n }\n }\n\n /**\n * Sanitize field names to prevent SQL injection\n */\n private sanitizeFieldName(field: string): string {\n // Allow alphanumeric, underscores, dots (for JSON fields)\n const sanitized = field.replace(/[^a-zA-Z0-9_$.]/g, '')\n\n // Handle JSON field access (e.g., data.title -> json_extract(data, '$.title'))\n if (sanitized.includes('.')) {\n const [table, ...path] = sanitized.split('.')\n return `json_extract(${table}, '$.${path.join('.')}')`\n }\n\n return sanitized\n }\n\n /**\n * Sanitize sort order to prevent SQL injection\n * Only allows 'ASC' or 'DESC', defaults to 'ASC' for any other value\n */\n private sanitizeSortOrder(order: string): string {\n const normalized = String(order).toUpperCase().trim()\n if (normalized === 'ASC' || normalized === 'DESC') {\n return normalized\n }\n return 'ASC'\n }\n\n /**\n * Parse filter from query string\n */\n static parseFromQuery(query: Record): QueryFilter {\n const filter: QueryFilter = {}\n\n // Parse where clause from 'where' parameter (JSON string)\n if (query.where) {\n try {\n filter.where = typeof query.where === 'string'\n ? JSON.parse(query.where)\n : query.where\n } catch (e) {\n console.error('Failed to parse where clause:', e)\n }\n }\n\n // Initialize where clause if not present\n if (!filter.where) {\n filter.where = { and: [] }\n }\n if (!filter.where.and) {\n filter.where.and = []\n }\n\n // Parse simple field filters (status, collection_id, etc.)\n // These are convenience parameters that get converted to WHERE conditions\n const simpleFieldMappings: Record = {\n 'status': 'status',\n 'collection_id': 'collection_id'\n }\n\n for (const [queryParam, dbField] of Object.entries(simpleFieldMappings)) {\n if (query[queryParam]) {\n filter.where.and.push({\n field: dbField,\n operator: 'equals',\n value: query[queryParam]\n })\n }\n }\n\n // Parse bracket-syntax filters: filter[field][operator]=value or filter[field]=value\n const bracketFilterRegex = /^filter\\[([^\\]]+)\\](?:\\[([^\\]]+)\\])?$/\n for (const [key, rawValue] of Object.entries(query)) {\n const match = key.match(bracketFilterRegex)\n if (!match) continue\n\n const field = match[1]\n const operator = (match[2] || 'equals') as FilterOperator\n\n if (!field || !VALID_FILTER_OPERATORS.has(operator)) continue\n if (rawValue === undefined || rawValue === null) continue\n\n let value: any = rawValue\n if (operator === 'exists') {\n value = value === 'true' || value === true || value === '1' || value === 1\n }\n\n filter.where.and.push({ field, operator, value })\n }\n\n // Parse limit\n if (query.limit) {\n filter.limit = Math.min(parseInt(query.limit), 1000) // Max 1000\n }\n\n // Parse offset\n if (query.offset) {\n filter.offset = parseInt(query.offset)\n }\n\n // Parse sort\n if (query.sort) {\n try {\n const parsed = typeof query.sort === 'string'\n ? JSON.parse(query.sort)\n : query.sort\n // Validate and sanitize sort entries\n if (Array.isArray(parsed)) {\n filter.sort = parsed\n .filter((s: any) => s && typeof s.field === 'string')\n .map((s: any) => ({\n field: s.field,\n order: validateSortOrder(s.order)\n }))\n }\n } catch (e) {\n console.error('Failed to parse sort clause:', e)\n }\n }\n\n return filter\n }\n}\n\n/**\n * Helper function to build query from filter\n */\nexport function buildQuery(table: string, filter: QueryFilter): QueryResult {\n const builder = new QueryFilterBuilder()\n return builder.build(table, filter)\n}\n","{\n \"name\": \"@sonicjs-cms/core\",\n \"version\": \"2.18.0\",\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 },\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 \"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/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.0.5\",\n \"drizzle-orm\": \"^0.45.2\",\n \"eslint\": \"^9.39.2\",\n \"glob\": \"^10.5.0\",\n \"hono\": \"^4.12.12\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.5\",\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","import type { BlockDefinitions } from '../types/collection-config'\n\nexport type BlocksFieldConfig = {\n blocks: BlockDefinitions\n discriminator: string\n}\n\nexport function getBlocksFieldConfig(fieldOptions: any): BlocksFieldConfig | null {\n if (!fieldOptions || typeof fieldOptions !== 'object') return null\n\n const itemsConfig = fieldOptions.items && typeof fieldOptions.items === 'object'\n ? fieldOptions.items\n : null\n\n if (!itemsConfig || !itemsConfig.blocks || typeof itemsConfig.blocks !== 'object') {\n return null\n }\n\n const discriminator = typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n\n return {\n blocks: itemsConfig.blocks as BlockDefinitions,\n discriminator\n }\n}\n\nexport function parseBlocksValue(value: unknown, config: BlocksFieldConfig) {\n const errors: string[] = []\n let rawValue = value\n\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return { value: [] as any[], errors }\n }\n\n if (typeof rawValue === 'string') {\n try {\n rawValue = JSON.parse(rawValue)\n } catch {\n return { value: [] as any[], errors: ['Blocks value must be valid JSON'] }\n }\n }\n\n if (!Array.isArray(rawValue)) {\n return { value: [] as any[], errors: ['Blocks value must be an array'] }\n }\n\n const normalized = rawValue.map((item, index) => {\n if (!item || typeof item !== 'object') {\n errors.push(`Block #${index + 1} must be an object`)\n return null\n }\n\n if ((item as any).blockType && (item as any).data && typeof (item as any).data === 'object') {\n return { [config.discriminator]: (item as any).blockType, ...(item as any).data }\n }\n\n if (!(config.discriminator in (item as any))) {\n errors.push(`Block #${index + 1} is missing \"${config.discriminator}\"`)\n }\n\n return item as any\n }).filter((item) => item !== null)\n\n return { value: normalized, errors }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/utils/slug-utils.ts","../src/utils/template-renderer.ts","../src/utils/query-filter.ts","../package.json","../src/utils/version.ts","../src/utils/blocks.ts"],"names":[],"mappings":"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","file":"chunk-FE77VWGD.js","sourcesContent":["/**\n * Slug generation utilities for creating URL-friendly slugs\n */\n\n/**\n * Generate URL-friendly slug from text\n * \n * Features:\n * - Converts to lowercase\n * - Handles accented characters (NFD normalization)\n * - Removes diacritics\n * - Keeps only alphanumeric, spaces, underscores, and hyphens\n * - Replaces spaces with hyphens\n * - Collapses multiple hyphens/underscores\n * - Trims leading/trailing hyphens/underscores\n * - Limits length to 100 characters\n * \n * @param text - Text to slugify\n * @returns URL-safe slug\n * \n * @example\n * generateSlug('Hello World!') // 'hello-world'\n * generateSlug('Café París 2024') // 'cafe-paris-2024'\n * generateSlug('Multiple Spaces') // 'multiple-spaces'\n */\nexport function generateSlug(text: string): string {\n if (!text) return '';\n \n return text\n .toLowerCase()\n .normalize('NFD') // Decompose combined characters (e.g., é -> e + ́)\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9\\s_-]/g, '') // Keep only alphanumeric, spaces, underscores, hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/[-_]+/g, '-') // Collapse multiple hyphens/underscores\n .replace(/^[-_]+|[-_]+$/g, '') // Trim leading/trailing hyphens/underscores\n .substring(0, 100); // Limit length for URL safety\n}\n","// Template renderer compatible with Cloudflare Workers\n// No filesystem access available\n\ninterface TemplateData {\n [key: string]: any\n}\n\nexport class TemplateRenderer {\n private templateCache = new Map()\n\n constructor() {\n // Cloudflare Workers compatible - no filesystem access\n }\n\n /**\n * Simple Handlebars-like template engine\n */\n private renderTemplate(template: string, data: TemplateData): string {\n let rendered = template\n\n // Handle each loops - process outermost loops first for proper nesting\n rendered = rendered.replace(/\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g, (_match, arrayName, content) => {\n const array = this.getNestedValue(data, arrayName.trim())\n if (!Array.isArray(array)) return ''\n \n return array.map((item, index) => {\n // Create context with array item and special variables\n const itemContext = {\n ...data,\n // Handle primitive items (for {{.}} syntax)\n '.': item,\n // Spread item properties if it's an object\n ...(typeof item === 'object' && item !== null ? item : {}),\n '@index': index,\n '@first': index === 0,\n '@last': index === array.length - 1\n }\n return this.renderTemplate(content, itemContext)\n }).join('')\n })\n\n // Second pass: Handle conditionals\n let ifCount = 0\n while (rendered.includes('{{#if ') && ifCount < 100) {\n const previousRendered = rendered\n rendered = rendered.replace(/\\{\\{#if\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (_match, condition, content) => {\n const value = this.getNestedValue(data, condition.trim())\n // Handle boolean values properly - @first/@last are explicitly boolean\n const isTruthy = value === true || (value && value !== 0 && value !== '' && value !== null && value !== undefined)\n return isTruthy ? this.renderTemplate(content, data) : ''\n })\n if (previousRendered === rendered) break\n ifCount++\n }\n\n // Third pass: Handle triple braces for raw HTML {{{variable}}}\n rendered = rendered.replace(/\\{\\{\\{([^}]+)\\}\\}\\}/g, (_match, variable) => {\n const value = this.getNestedValue(data, variable.trim())\n return value !== undefined && value !== null ? String(value) : ''\n })\n\n // Fourth pass: Handle helper functions like {{titleCase field}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\s+([^}]+)\\}\\}/g, (match, helper, variable) => {\n const helperName = helper.trim()\n const varName = variable.trim()\n \n if (helperName === 'titleCase') {\n const value = this.getNestedValue(data, varName)\n if (value !== undefined && value !== null) {\n return this.titleCase(String(value))\n }\n }\n \n return match // Return original if helper not found\n })\n\n // Final pass: Handle simple variables {{variable}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\}\\}/g, (match, variable) => {\n const trimmed = variable.trim()\n \n // Skip if it's a helper function (has spaces)\n if (trimmed.includes(' ')) {\n return match\n }\n \n const value = this.getNestedValue(data, trimmed)\n if (value === null) return ''\n if (value === undefined) return ''\n return String(value)\n })\n\n return rendered\n }\n\n /**\n * Get nested value from object using dot notation\n */\n private getNestedValue(obj: any, path: string): any {\n if (!obj || path === '') return undefined\n \n return path.split('.').reduce((current, key) => {\n if (current === null || current === undefined) return undefined\n return current[key]\n }, obj)\n }\n\n /**\n * Title case helper function\n */\n private titleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, l => l.toUpperCase())\n }\n\n /**\n * Render a template string with data\n */\n render(template: string, data: TemplateData = {}): string {\n return this.renderTemplate(template, data)\n }\n\n /**\n * Clear template cache (useful for development)\n */\n clearCache(): void {\n this.templateCache.clear()\n }\n}\n\n// Export singleton instance\nexport const templateRenderer = new TemplateRenderer()\n\n// Utility function to render template strings directly\nexport function renderTemplate(template: string, data: TemplateData = {}): string {\n return templateRenderer.render(template, data)\n}","/**\n * Query Filter Builder for SonicJS AI\n * Supports comprehensive filtering with AND/OR logic\n * Compatible with D1 Database (SQLite)\n */\n\nexport type FilterOperator =\n | 'equals'\n | 'not_equals'\n | 'greater_than'\n | 'greater_than_equal'\n | 'less_than'\n | 'less_than_equal'\n | 'like'\n | 'contains'\n | 'starts_with'\n | 'ends_with'\n | 'in'\n | 'not_in'\n | 'all'\n | 'exists'\n | 'near'\n | 'within'\n | 'intersects'\n\nconst VALID_FILTER_OPERATORS: ReadonlySet = new Set([\n 'equals',\n 'not_equals',\n 'greater_than',\n 'greater_than_equal',\n 'less_than',\n 'less_than_equal',\n 'like',\n 'contains',\n 'starts_with',\n 'ends_with',\n 'in',\n 'not_in',\n 'all',\n 'exists',\n 'near',\n 'within',\n 'intersects'\n])\n\nexport interface FilterCondition {\n field: string\n operator: FilterOperator\n value: any\n}\n\nexport interface FilterGroup {\n and?: FilterCondition[]\n or?: FilterCondition[]\n}\n\nexport interface QueryFilter {\n where?: FilterGroup\n limit?: number\n offset?: number\n sort?: {\n field: string\n order: 'asc' | 'desc'\n }[]\n}\n\nexport interface QueryResult {\n sql: string\n params: any[]\n errors: string[]\n}\n\n/**\n * Validate sort order value - only 'asc' or 'desc' are allowed.\n * Returns the validated lowercase value, defaulting to 'asc' for invalid input.\n */\nexport function validateSortOrder(order: any): 'asc' | 'desc' {\n if (typeof order === 'string') {\n const normalized = order.toLowerCase().trim()\n if (normalized === 'asc' || normalized === 'desc') {\n return normalized\n }\n }\n return 'asc'\n}\n\n/**\n * Query Filter Builder\n * Converts filter objects into SQL WHERE clauses with parameterized queries\n */\nexport class QueryFilterBuilder {\n private params: any[] = []\n private errors: string[] = []\n\n /**\n * Build a complete SQL query from filter object\n */\n build(baseTable: string, filter: QueryFilter): QueryResult {\n this.params = []\n this.errors = []\n\n let sql = `SELECT * FROM ${baseTable}`\n\n // Build WHERE clause\n if (filter.where) {\n const whereClause = this.buildWhereClause(filter.where)\n if (whereClause) {\n sql += ` WHERE ${whereClause}`\n }\n }\n\n // Build ORDER BY clause\n if (filter.sort && filter.sort.length > 0) {\n const orderClauses = filter.sort\n .map(s => `${this.sanitizeFieldName(s.field)} ${this.sanitizeSortOrder(s.order)}`)\n .join(', ')\n sql += ` ORDER BY ${orderClauses}`\n }\n\n // Build LIMIT clause\n if (filter.limit) {\n sql += ` LIMIT ?`\n this.params.push(filter.limit)\n }\n\n // Build OFFSET clause\n if (filter.offset) {\n sql += ` OFFSET ?`\n this.params.push(filter.offset)\n }\n\n return {\n sql,\n params: this.params,\n errors: this.errors\n }\n }\n\n /**\n * Build WHERE clause from filter group\n */\n private buildWhereClause(group: FilterGroup): string {\n const clauses: string[] = []\n\n // Handle AND conditions\n if (group.and && group.and.length > 0) {\n const andClauses = group.and\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (andClauses.length > 0) {\n clauses.push(`(${andClauses.join(' AND ')})`)\n }\n }\n\n // Handle OR conditions\n if (group.or && group.or.length > 0) {\n const orClauses = group.or\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (orClauses.length > 0) {\n clauses.push(`(${orClauses.join(' OR ')})`)\n }\n }\n\n return clauses.join(' AND ')\n }\n\n /**\n * Build a single condition\n */\n private buildCondition(condition: FilterCondition): string | null {\n const field = this.sanitizeFieldName(condition.field)\n\n switch (condition.operator) {\n case 'equals':\n return this.buildEquals(field, condition.value)\n\n case 'not_equals':\n return this.buildNotEquals(field, condition.value)\n\n case 'greater_than':\n return this.buildComparison(field, '>', condition.value)\n\n case 'greater_than_equal':\n return this.buildComparison(field, '>=', condition.value)\n\n case 'less_than':\n return this.buildComparison(field, '<', condition.value)\n\n case 'less_than_equal':\n return this.buildComparison(field, '<=', condition.value)\n\n case 'like':\n return this.buildLike(field, condition.value)\n\n case 'contains':\n return this.buildContains(field, condition.value)\n\n case 'starts_with':\n return this.buildStartsWith(field, condition.value)\n\n case 'ends_with':\n return this.buildEndsWith(field, condition.value)\n\n case 'in':\n return this.buildIn(field, condition.value)\n\n case 'not_in':\n return this.buildNotIn(field, condition.value)\n\n case 'all':\n return this.buildAll(field, condition.value)\n\n case 'exists':\n return this.buildExists(field, condition.value)\n\n case 'near':\n this.errors.push(`'near' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'within':\n this.errors.push(`'within' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'intersects':\n this.errors.push(`'intersects' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n default:\n this.errors.push(`Unknown operator: ${condition.operator}`)\n return null\n }\n }\n\n /**\n * Build equals condition\n */\n private buildEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NULL`\n }\n this.params.push(value)\n return `${field} = ?`\n }\n\n /**\n * Build not equals condition\n */\n private buildNotEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NOT NULL`\n }\n this.params.push(value)\n return `${field} != ?`\n }\n\n /**\n * Build comparison condition (>, >=, <, <=)\n */\n private buildComparison(field: string, operator: string, value: any): string {\n this.params.push(value)\n return `${field} ${operator} ?`\n }\n\n /**\n * Build LIKE condition (case-insensitive, all words must be present)\n */\n private buildLike(field: string, value: string): string {\n const words = value.split(/\\s+/).filter(w => w.length > 0)\n\n if (words.length === 0) {\n return `1=1` // No-op condition\n }\n\n const conditions = words.map(word => {\n this.params.push(`%${word}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build CONTAINS condition (case-insensitive substring)\n */\n private buildContains(field: string, value: string): string {\n this.params.push(`%${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build STARTS_WITH condition (case-insensitive prefix match)\n */\n private buildStartsWith(field: string, value: string): string {\n this.params.push(`${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build ENDS_WITH condition (case-insensitive suffix match)\n */\n private buildEndsWith(field: string, value: string): string {\n this.params.push(`%${value}`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build IN condition\n */\n private buildIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=0` // No values means no matches\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} IN (${placeholders})`\n }\n\n /**\n * Build NOT IN condition\n */\n private buildNotIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1` // No values means all match\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} NOT IN (${placeholders})`\n }\n\n /**\n * Build ALL condition (value must contain all items in list)\n * For SQLite, we'll check if a JSON array contains all values\n */\n private buildAll(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1`\n }\n\n // For SQLite, check if field contains all values using JSON functions\n // This assumes the field is a JSON array or comma-separated string\n const conditions = values.map(val => {\n this.params.push(`%${val}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build EXISTS condition\n */\n private buildExists(field: string, value: boolean): string {\n if (value) {\n return `${field} IS NOT NULL AND ${field} != ''`\n } else {\n return `(${field} IS NULL OR ${field} = '')`\n }\n }\n\n /**\n * Sanitize field names to prevent SQL injection\n */\n private sanitizeFieldName(field: string): string {\n // Allow alphanumeric, underscores, dots (for JSON fields)\n const sanitized = field.replace(/[^a-zA-Z0-9_$.]/g, '')\n\n // Handle JSON field access (e.g., data.title -> json_extract(data, '$.title'))\n if (sanitized.includes('.')) {\n const [table, ...path] = sanitized.split('.')\n return `json_extract(${table}, '$.${path.join('.')}')`\n }\n\n return sanitized\n }\n\n /**\n * Sanitize sort order to prevent SQL injection\n * Only allows 'ASC' or 'DESC', defaults to 'ASC' for any other value\n */\n private sanitizeSortOrder(order: string): string {\n const normalized = String(order).toUpperCase().trim()\n if (normalized === 'ASC' || normalized === 'DESC') {\n return normalized\n }\n return 'ASC'\n }\n\n /**\n * Parse filter from query string\n */\n static parseFromQuery(query: Record): QueryFilter {\n const filter: QueryFilter = {}\n\n // Parse where clause from 'where' parameter (JSON string)\n if (query.where) {\n try {\n filter.where = typeof query.where === 'string'\n ? JSON.parse(query.where)\n : query.where\n } catch (e) {\n console.error('Failed to parse where clause:', e)\n }\n }\n\n // Initialize where clause if not present\n if (!filter.where) {\n filter.where = { and: [] }\n }\n if (!filter.where.and) {\n filter.where.and = []\n }\n\n // Parse simple field filters (status, collection_id, etc.)\n // These are convenience parameters that get converted to WHERE conditions\n const simpleFieldMappings: Record = {\n 'status': 'status',\n 'collection_id': 'collection_id'\n }\n\n for (const [queryParam, dbField] of Object.entries(simpleFieldMappings)) {\n if (query[queryParam]) {\n filter.where.and.push({\n field: dbField,\n operator: 'equals',\n value: query[queryParam]\n })\n }\n }\n\n // Parse bracket-syntax filters: filter[field][operator]=value or filter[field]=value\n const bracketFilterRegex = /^filter\\[([^\\]]+)\\](?:\\[([^\\]]+)\\])?$/\n for (const [key, rawValue] of Object.entries(query)) {\n const match = key.match(bracketFilterRegex)\n if (!match) continue\n\n const field = match[1]\n const operator = (match[2] || 'equals') as FilterOperator\n\n if (!field || !VALID_FILTER_OPERATORS.has(operator)) continue\n if (rawValue === undefined || rawValue === null) continue\n\n let value: any = rawValue\n if (operator === 'exists') {\n value = value === 'true' || value === true || value === '1' || value === 1\n }\n\n filter.where.and.push({ field, operator, value })\n }\n\n // Parse limit\n if (query.limit) {\n filter.limit = Math.min(parseInt(query.limit), 1000) // Max 1000\n }\n\n // Parse offset\n if (query.offset) {\n filter.offset = parseInt(query.offset)\n }\n\n // Parse sort\n if (query.sort) {\n try {\n const parsed = typeof query.sort === 'string'\n ? JSON.parse(query.sort)\n : query.sort\n // Validate and sanitize sort entries\n if (Array.isArray(parsed)) {\n filter.sort = parsed\n .filter((s: any) => s && typeof s.field === 'string')\n .map((s: any) => ({\n field: s.field,\n order: validateSortOrder(s.order)\n }))\n }\n } catch (e) {\n console.error('Failed to parse sort clause:', e)\n }\n }\n\n return filter\n }\n}\n\n/**\n * Helper function to build query from filter\n */\nexport function buildQuery(table: string, filter: QueryFilter): QueryResult {\n const builder = new QueryFilterBuilder()\n return builder.build(table, filter)\n}\n","{\n \"name\": \"@sonicjs-cms/core\",\n \"version\": \"2.18.1\",\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 },\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 \"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/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.0.5\",\n \"drizzle-orm\": \"^0.45.2\",\n \"eslint\": \"^9.39.2\",\n \"glob\": \"^10.5.0\",\n \"hono\": \"^4.12.18\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.5\",\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","import type { BlockDefinitions } from '../types/collection-config'\n\nexport type BlocksFieldConfig = {\n blocks: BlockDefinitions\n discriminator: string\n}\n\nexport function getBlocksFieldConfig(fieldOptions: any): BlocksFieldConfig | null {\n if (!fieldOptions || typeof fieldOptions !== 'object') return null\n\n const itemsConfig = fieldOptions.items && typeof fieldOptions.items === 'object'\n ? fieldOptions.items\n : null\n\n if (!itemsConfig || !itemsConfig.blocks || typeof itemsConfig.blocks !== 'object') {\n return null\n }\n\n const discriminator = typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n\n return {\n blocks: itemsConfig.blocks as BlockDefinitions,\n discriminator\n }\n}\n\nexport function parseBlocksValue(value: unknown, config: BlocksFieldConfig) {\n const errors: string[] = []\n let rawValue = value\n\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return { value: [] as any[], errors }\n }\n\n if (typeof rawValue === 'string') {\n try {\n rawValue = JSON.parse(rawValue)\n } catch {\n return { value: [] as any[], errors: ['Blocks value must be valid JSON'] }\n }\n }\n\n if (!Array.isArray(rawValue)) {\n return { value: [] as any[], errors: ['Blocks value must be an array'] }\n }\n\n const normalized = rawValue.map((item, index) => {\n if (!item || typeof item !== 'object') {\n errors.push(`Block #${index + 1} must be an object`)\n return null\n }\n\n if ((item as any).blockType && (item as any).data && typeof (item as any).data === 'object') {\n return { [config.discriminator]: (item as any).blockType, ...(item as any).data }\n }\n\n if (!(config.discriminator in (item as any))) {\n errors.push(`Block #${index + 1} is missing \"${config.discriminator}\"`)\n }\n\n return item as any\n }).filter((item) => item !== null)\n\n return { value: normalized, errors }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-74BFRAQS.cjs b/packages/core/dist/chunk-GLRZAPX6.cjs similarity index 99% rename from packages/core/dist/chunk-74BFRAQS.cjs rename to packages/core/dist/chunk-GLRZAPX6.cjs index c538b8249..2cb167f66 100644 --- a/packages/core/dist/chunk-74BFRAQS.cjs +++ b/packages/core/dist/chunk-GLRZAPX6.cjs @@ -468,7 +468,7 @@ function buildQuery(table, filter) { // package.json var package_default = { name: "@sonicjs-cms/core", - version: "2.18.0", + version: "2.18.1", description: "Core framework for SonicJS headless CMS - Edge-first, TypeScript-native CMS built for Cloudflare Workers", type: "module", main: "./dist/index.cjs", @@ -590,7 +590,7 @@ var package_default = { "drizzle-orm": "^0.45.2", eslint: "^9.39.2", glob: "^10.5.0", - hono: "^4.12.12", + hono: "^4.12.18", tsup: "^8.5.0", typescript: "^5.9.3", vitest: "^4.0.5", @@ -667,5 +667,5 @@ exports.package_default = package_default; exports.parseBlocksValue = parseBlocksValue; exports.renderTemplate = renderTemplate; exports.templateRenderer = templateRenderer; -//# sourceMappingURL=chunk-74BFRAQS.cjs.map -//# sourceMappingURL=chunk-74BFRAQS.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-GLRZAPX6.cjs.map +//# sourceMappingURL=chunk-GLRZAPX6.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-74BFRAQS.cjs.map b/packages/core/dist/chunk-GLRZAPX6.cjs.map similarity index 99% rename from packages/core/dist/chunk-74BFRAQS.cjs.map rename to packages/core/dist/chunk-GLRZAPX6.cjs.map index 647404673..c47feaa0a 100644 --- a/packages/core/dist/chunk-74BFRAQS.cjs.map +++ b/packages/core/dist/chunk-GLRZAPX6.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/utils/slug-utils.ts","../src/utils/template-renderer.ts","../src/utils/query-filter.ts","../package.json","../src/utils/version.ts","../src/utils/blocks.ts"],"names":[],"mappings":"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","file":"chunk-74BFRAQS.cjs","sourcesContent":["/**\n * Slug generation utilities for creating URL-friendly slugs\n */\n\n/**\n * Generate URL-friendly slug from text\n * \n * Features:\n * - Converts to lowercase\n * - Handles accented characters (NFD normalization)\n * - Removes diacritics\n * - Keeps only alphanumeric, spaces, underscores, and hyphens\n * - Replaces spaces with hyphens\n * - Collapses multiple hyphens/underscores\n * - Trims leading/trailing hyphens/underscores\n * - Limits length to 100 characters\n * \n * @param text - Text to slugify\n * @returns URL-safe slug\n * \n * @example\n * generateSlug('Hello World!') // 'hello-world'\n * generateSlug('Café París 2024') // 'cafe-paris-2024'\n * generateSlug('Multiple Spaces') // 'multiple-spaces'\n */\nexport function generateSlug(text: string): string {\n if (!text) return '';\n \n return text\n .toLowerCase()\n .normalize('NFD') // Decompose combined characters (e.g., é -> e + ́)\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9\\s_-]/g, '') // Keep only alphanumeric, spaces, underscores, hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/[-_]+/g, '-') // Collapse multiple hyphens/underscores\n .replace(/^[-_]+|[-_]+$/g, '') // Trim leading/trailing hyphens/underscores\n .substring(0, 100); // Limit length for URL safety\n}\n","// Template renderer compatible with Cloudflare Workers\n// No filesystem access available\n\ninterface TemplateData {\n [key: string]: any\n}\n\nexport class TemplateRenderer {\n private templateCache = new Map()\n\n constructor() {\n // Cloudflare Workers compatible - no filesystem access\n }\n\n /**\n * Simple Handlebars-like template engine\n */\n private renderTemplate(template: string, data: TemplateData): string {\n let rendered = template\n\n // Handle each loops - process outermost loops first for proper nesting\n rendered = rendered.replace(/\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g, (_match, arrayName, content) => {\n const array = this.getNestedValue(data, arrayName.trim())\n if (!Array.isArray(array)) return ''\n \n return array.map((item, index) => {\n // Create context with array item and special variables\n const itemContext = {\n ...data,\n // Handle primitive items (for {{.}} syntax)\n '.': item,\n // Spread item properties if it's an object\n ...(typeof item === 'object' && item !== null ? item : {}),\n '@index': index,\n '@first': index === 0,\n '@last': index === array.length - 1\n }\n return this.renderTemplate(content, itemContext)\n }).join('')\n })\n\n // Second pass: Handle conditionals\n let ifCount = 0\n while (rendered.includes('{{#if ') && ifCount < 100) {\n const previousRendered = rendered\n rendered = rendered.replace(/\\{\\{#if\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (_match, condition, content) => {\n const value = this.getNestedValue(data, condition.trim())\n // Handle boolean values properly - @first/@last are explicitly boolean\n const isTruthy = value === true || (value && value !== 0 && value !== '' && value !== null && value !== undefined)\n return isTruthy ? this.renderTemplate(content, data) : ''\n })\n if (previousRendered === rendered) break\n ifCount++\n }\n\n // Third pass: Handle triple braces for raw HTML {{{variable}}}\n rendered = rendered.replace(/\\{\\{\\{([^}]+)\\}\\}\\}/g, (_match, variable) => {\n const value = this.getNestedValue(data, variable.trim())\n return value !== undefined && value !== null ? String(value) : ''\n })\n\n // Fourth pass: Handle helper functions like {{titleCase field}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\s+([^}]+)\\}\\}/g, (match, helper, variable) => {\n const helperName = helper.trim()\n const varName = variable.trim()\n \n if (helperName === 'titleCase') {\n const value = this.getNestedValue(data, varName)\n if (value !== undefined && value !== null) {\n return this.titleCase(String(value))\n }\n }\n \n return match // Return original if helper not found\n })\n\n // Final pass: Handle simple variables {{variable}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\}\\}/g, (match, variable) => {\n const trimmed = variable.trim()\n \n // Skip if it's a helper function (has spaces)\n if (trimmed.includes(' ')) {\n return match\n }\n \n const value = this.getNestedValue(data, trimmed)\n if (value === null) return ''\n if (value === undefined) return ''\n return String(value)\n })\n\n return rendered\n }\n\n /**\n * Get nested value from object using dot notation\n */\n private getNestedValue(obj: any, path: string): any {\n if (!obj || path === '') return undefined\n \n return path.split('.').reduce((current, key) => {\n if (current === null || current === undefined) return undefined\n return current[key]\n }, obj)\n }\n\n /**\n * Title case helper function\n */\n private titleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, l => l.toUpperCase())\n }\n\n /**\n * Render a template string with data\n */\n render(template: string, data: TemplateData = {}): string {\n return this.renderTemplate(template, data)\n }\n\n /**\n * Clear template cache (useful for development)\n */\n clearCache(): void {\n this.templateCache.clear()\n }\n}\n\n// Export singleton instance\nexport const templateRenderer = new TemplateRenderer()\n\n// Utility function to render template strings directly\nexport function renderTemplate(template: string, data: TemplateData = {}): string {\n return templateRenderer.render(template, data)\n}","/**\n * Query Filter Builder for SonicJS AI\n * Supports comprehensive filtering with AND/OR logic\n * Compatible with D1 Database (SQLite)\n */\n\nexport type FilterOperator =\n | 'equals'\n | 'not_equals'\n | 'greater_than'\n | 'greater_than_equal'\n | 'less_than'\n | 'less_than_equal'\n | 'like'\n | 'contains'\n | 'starts_with'\n | 'ends_with'\n | 'in'\n | 'not_in'\n | 'all'\n | 'exists'\n | 'near'\n | 'within'\n | 'intersects'\n\nconst VALID_FILTER_OPERATORS: ReadonlySet = new Set([\n 'equals',\n 'not_equals',\n 'greater_than',\n 'greater_than_equal',\n 'less_than',\n 'less_than_equal',\n 'like',\n 'contains',\n 'starts_with',\n 'ends_with',\n 'in',\n 'not_in',\n 'all',\n 'exists',\n 'near',\n 'within',\n 'intersects'\n])\n\nexport interface FilterCondition {\n field: string\n operator: FilterOperator\n value: any\n}\n\nexport interface FilterGroup {\n and?: FilterCondition[]\n or?: FilterCondition[]\n}\n\nexport interface QueryFilter {\n where?: FilterGroup\n limit?: number\n offset?: number\n sort?: {\n field: string\n order: 'asc' | 'desc'\n }[]\n}\n\nexport interface QueryResult {\n sql: string\n params: any[]\n errors: string[]\n}\n\n/**\n * Validate sort order value - only 'asc' or 'desc' are allowed.\n * Returns the validated lowercase value, defaulting to 'asc' for invalid input.\n */\nexport function validateSortOrder(order: any): 'asc' | 'desc' {\n if (typeof order === 'string') {\n const normalized = order.toLowerCase().trim()\n if (normalized === 'asc' || normalized === 'desc') {\n return normalized\n }\n }\n return 'asc'\n}\n\n/**\n * Query Filter Builder\n * Converts filter objects into SQL WHERE clauses with parameterized queries\n */\nexport class QueryFilterBuilder {\n private params: any[] = []\n private errors: string[] = []\n\n /**\n * Build a complete SQL query from filter object\n */\n build(baseTable: string, filter: QueryFilter): QueryResult {\n this.params = []\n this.errors = []\n\n let sql = `SELECT * FROM ${baseTable}`\n\n // Build WHERE clause\n if (filter.where) {\n const whereClause = this.buildWhereClause(filter.where)\n if (whereClause) {\n sql += ` WHERE ${whereClause}`\n }\n }\n\n // Build ORDER BY clause\n if (filter.sort && filter.sort.length > 0) {\n const orderClauses = filter.sort\n .map(s => `${this.sanitizeFieldName(s.field)} ${this.sanitizeSortOrder(s.order)}`)\n .join(', ')\n sql += ` ORDER BY ${orderClauses}`\n }\n\n // Build LIMIT clause\n if (filter.limit) {\n sql += ` LIMIT ?`\n this.params.push(filter.limit)\n }\n\n // Build OFFSET clause\n if (filter.offset) {\n sql += ` OFFSET ?`\n this.params.push(filter.offset)\n }\n\n return {\n sql,\n params: this.params,\n errors: this.errors\n }\n }\n\n /**\n * Build WHERE clause from filter group\n */\n private buildWhereClause(group: FilterGroup): string {\n const clauses: string[] = []\n\n // Handle AND conditions\n if (group.and && group.and.length > 0) {\n const andClauses = group.and\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (andClauses.length > 0) {\n clauses.push(`(${andClauses.join(' AND ')})`)\n }\n }\n\n // Handle OR conditions\n if (group.or && group.or.length > 0) {\n const orClauses = group.or\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (orClauses.length > 0) {\n clauses.push(`(${orClauses.join(' OR ')})`)\n }\n }\n\n return clauses.join(' AND ')\n }\n\n /**\n * Build a single condition\n */\n private buildCondition(condition: FilterCondition): string | null {\n const field = this.sanitizeFieldName(condition.field)\n\n switch (condition.operator) {\n case 'equals':\n return this.buildEquals(field, condition.value)\n\n case 'not_equals':\n return this.buildNotEquals(field, condition.value)\n\n case 'greater_than':\n return this.buildComparison(field, '>', condition.value)\n\n case 'greater_than_equal':\n return this.buildComparison(field, '>=', condition.value)\n\n case 'less_than':\n return this.buildComparison(field, '<', condition.value)\n\n case 'less_than_equal':\n return this.buildComparison(field, '<=', condition.value)\n\n case 'like':\n return this.buildLike(field, condition.value)\n\n case 'contains':\n return this.buildContains(field, condition.value)\n\n case 'starts_with':\n return this.buildStartsWith(field, condition.value)\n\n case 'ends_with':\n return this.buildEndsWith(field, condition.value)\n\n case 'in':\n return this.buildIn(field, condition.value)\n\n case 'not_in':\n return this.buildNotIn(field, condition.value)\n\n case 'all':\n return this.buildAll(field, condition.value)\n\n case 'exists':\n return this.buildExists(field, condition.value)\n\n case 'near':\n this.errors.push(`'near' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'within':\n this.errors.push(`'within' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'intersects':\n this.errors.push(`'intersects' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n default:\n this.errors.push(`Unknown operator: ${condition.operator}`)\n return null\n }\n }\n\n /**\n * Build equals condition\n */\n private buildEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NULL`\n }\n this.params.push(value)\n return `${field} = ?`\n }\n\n /**\n * Build not equals condition\n */\n private buildNotEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NOT NULL`\n }\n this.params.push(value)\n return `${field} != ?`\n }\n\n /**\n * Build comparison condition (>, >=, <, <=)\n */\n private buildComparison(field: string, operator: string, value: any): string {\n this.params.push(value)\n return `${field} ${operator} ?`\n }\n\n /**\n * Build LIKE condition (case-insensitive, all words must be present)\n */\n private buildLike(field: string, value: string): string {\n const words = value.split(/\\s+/).filter(w => w.length > 0)\n\n if (words.length === 0) {\n return `1=1` // No-op condition\n }\n\n const conditions = words.map(word => {\n this.params.push(`%${word}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build CONTAINS condition (case-insensitive substring)\n */\n private buildContains(field: string, value: string): string {\n this.params.push(`%${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build STARTS_WITH condition (case-insensitive prefix match)\n */\n private buildStartsWith(field: string, value: string): string {\n this.params.push(`${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build ENDS_WITH condition (case-insensitive suffix match)\n */\n private buildEndsWith(field: string, value: string): string {\n this.params.push(`%${value}`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build IN condition\n */\n private buildIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=0` // No values means no matches\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} IN (${placeholders})`\n }\n\n /**\n * Build NOT IN condition\n */\n private buildNotIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1` // No values means all match\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} NOT IN (${placeholders})`\n }\n\n /**\n * Build ALL condition (value must contain all items in list)\n * For SQLite, we'll check if a JSON array contains all values\n */\n private buildAll(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1`\n }\n\n // For SQLite, check if field contains all values using JSON functions\n // This assumes the field is a JSON array or comma-separated string\n const conditions = values.map(val => {\n this.params.push(`%${val}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build EXISTS condition\n */\n private buildExists(field: string, value: boolean): string {\n if (value) {\n return `${field} IS NOT NULL AND ${field} != ''`\n } else {\n return `(${field} IS NULL OR ${field} = '')`\n }\n }\n\n /**\n * Sanitize field names to prevent SQL injection\n */\n private sanitizeFieldName(field: string): string {\n // Allow alphanumeric, underscores, dots (for JSON fields)\n const sanitized = field.replace(/[^a-zA-Z0-9_$.]/g, '')\n\n // Handle JSON field access (e.g., data.title -> json_extract(data, '$.title'))\n if (sanitized.includes('.')) {\n const [table, ...path] = sanitized.split('.')\n return `json_extract(${table}, '$.${path.join('.')}')`\n }\n\n return sanitized\n }\n\n /**\n * Sanitize sort order to prevent SQL injection\n * Only allows 'ASC' or 'DESC', defaults to 'ASC' for any other value\n */\n private sanitizeSortOrder(order: string): string {\n const normalized = String(order).toUpperCase().trim()\n if (normalized === 'ASC' || normalized === 'DESC') {\n return normalized\n }\n return 'ASC'\n }\n\n /**\n * Parse filter from query string\n */\n static parseFromQuery(query: Record): QueryFilter {\n const filter: QueryFilter = {}\n\n // Parse where clause from 'where' parameter (JSON string)\n if (query.where) {\n try {\n filter.where = typeof query.where === 'string'\n ? JSON.parse(query.where)\n : query.where\n } catch (e) {\n console.error('Failed to parse where clause:', e)\n }\n }\n\n // Initialize where clause if not present\n if (!filter.where) {\n filter.where = { and: [] }\n }\n if (!filter.where.and) {\n filter.where.and = []\n }\n\n // Parse simple field filters (status, collection_id, etc.)\n // These are convenience parameters that get converted to WHERE conditions\n const simpleFieldMappings: Record = {\n 'status': 'status',\n 'collection_id': 'collection_id'\n }\n\n for (const [queryParam, dbField] of Object.entries(simpleFieldMappings)) {\n if (query[queryParam]) {\n filter.where.and.push({\n field: dbField,\n operator: 'equals',\n value: query[queryParam]\n })\n }\n }\n\n // Parse bracket-syntax filters: filter[field][operator]=value or filter[field]=value\n const bracketFilterRegex = /^filter\\[([^\\]]+)\\](?:\\[([^\\]]+)\\])?$/\n for (const [key, rawValue] of Object.entries(query)) {\n const match = key.match(bracketFilterRegex)\n if (!match) continue\n\n const field = match[1]\n const operator = (match[2] || 'equals') as FilterOperator\n\n if (!field || !VALID_FILTER_OPERATORS.has(operator)) continue\n if (rawValue === undefined || rawValue === null) continue\n\n let value: any = rawValue\n if (operator === 'exists') {\n value = value === 'true' || value === true || value === '1' || value === 1\n }\n\n filter.where.and.push({ field, operator, value })\n }\n\n // Parse limit\n if (query.limit) {\n filter.limit = Math.min(parseInt(query.limit), 1000) // Max 1000\n }\n\n // Parse offset\n if (query.offset) {\n filter.offset = parseInt(query.offset)\n }\n\n // Parse sort\n if (query.sort) {\n try {\n const parsed = typeof query.sort === 'string'\n ? JSON.parse(query.sort)\n : query.sort\n // Validate and sanitize sort entries\n if (Array.isArray(parsed)) {\n filter.sort = parsed\n .filter((s: any) => s && typeof s.field === 'string')\n .map((s: any) => ({\n field: s.field,\n order: validateSortOrder(s.order)\n }))\n }\n } catch (e) {\n console.error('Failed to parse sort clause:', e)\n }\n }\n\n return filter\n }\n}\n\n/**\n * Helper function to build query from filter\n */\nexport function buildQuery(table: string, filter: QueryFilter): QueryResult {\n const builder = new QueryFilterBuilder()\n return builder.build(table, filter)\n}\n","{\n \"name\": \"@sonicjs-cms/core\",\n \"version\": \"2.18.0\",\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 },\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 \"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/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.0.5\",\n \"drizzle-orm\": \"^0.45.2\",\n \"eslint\": \"^9.39.2\",\n \"glob\": \"^10.5.0\",\n \"hono\": \"^4.12.12\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.5\",\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","import type { BlockDefinitions } from '../types/collection-config'\n\nexport type BlocksFieldConfig = {\n blocks: BlockDefinitions\n discriminator: string\n}\n\nexport function getBlocksFieldConfig(fieldOptions: any): BlocksFieldConfig | null {\n if (!fieldOptions || typeof fieldOptions !== 'object') return null\n\n const itemsConfig = fieldOptions.items && typeof fieldOptions.items === 'object'\n ? fieldOptions.items\n : null\n\n if (!itemsConfig || !itemsConfig.blocks || typeof itemsConfig.blocks !== 'object') {\n return null\n }\n\n const discriminator = typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n\n return {\n blocks: itemsConfig.blocks as BlockDefinitions,\n discriminator\n }\n}\n\nexport function parseBlocksValue(value: unknown, config: BlocksFieldConfig) {\n const errors: string[] = []\n let rawValue = value\n\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return { value: [] as any[], errors }\n }\n\n if (typeof rawValue === 'string') {\n try {\n rawValue = JSON.parse(rawValue)\n } catch {\n return { value: [] as any[], errors: ['Blocks value must be valid JSON'] }\n }\n }\n\n if (!Array.isArray(rawValue)) {\n return { value: [] as any[], errors: ['Blocks value must be an array'] }\n }\n\n const normalized = rawValue.map((item, index) => {\n if (!item || typeof item !== 'object') {\n errors.push(`Block #${index + 1} must be an object`)\n return null\n }\n\n if ((item as any).blockType && (item as any).data && typeof (item as any).data === 'object') {\n return { [config.discriminator]: (item as any).blockType, ...(item as any).data }\n }\n\n if (!(config.discriminator in (item as any))) {\n errors.push(`Block #${index + 1} is missing \"${config.discriminator}\"`)\n }\n\n return item as any\n }).filter((item) => item !== null)\n\n return { value: normalized, errors }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/utils/slug-utils.ts","../src/utils/template-renderer.ts","../src/utils/query-filter.ts","../package.json","../src/utils/version.ts","../src/utils/blocks.ts"],"names":[],"mappings":"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","file":"chunk-GLRZAPX6.cjs","sourcesContent":["/**\n * Slug generation utilities for creating URL-friendly slugs\n */\n\n/**\n * Generate URL-friendly slug from text\n * \n * Features:\n * - Converts to lowercase\n * - Handles accented characters (NFD normalization)\n * - Removes diacritics\n * - Keeps only alphanumeric, spaces, underscores, and hyphens\n * - Replaces spaces with hyphens\n * - Collapses multiple hyphens/underscores\n * - Trims leading/trailing hyphens/underscores\n * - Limits length to 100 characters\n * \n * @param text - Text to slugify\n * @returns URL-safe slug\n * \n * @example\n * generateSlug('Hello World!') // 'hello-world'\n * generateSlug('Café París 2024') // 'cafe-paris-2024'\n * generateSlug('Multiple Spaces') // 'multiple-spaces'\n */\nexport function generateSlug(text: string): string {\n if (!text) return '';\n \n return text\n .toLowerCase()\n .normalize('NFD') // Decompose combined characters (e.g., é -> e + ́)\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9\\s_-]/g, '') // Keep only alphanumeric, spaces, underscores, hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/[-_]+/g, '-') // Collapse multiple hyphens/underscores\n .replace(/^[-_]+|[-_]+$/g, '') // Trim leading/trailing hyphens/underscores\n .substring(0, 100); // Limit length for URL safety\n}\n","// Template renderer compatible with Cloudflare Workers\n// No filesystem access available\n\ninterface TemplateData {\n [key: string]: any\n}\n\nexport class TemplateRenderer {\n private templateCache = new Map()\n\n constructor() {\n // Cloudflare Workers compatible - no filesystem access\n }\n\n /**\n * Simple Handlebars-like template engine\n */\n private renderTemplate(template: string, data: TemplateData): string {\n let rendered = template\n\n // Handle each loops - process outermost loops first for proper nesting\n rendered = rendered.replace(/\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g, (_match, arrayName, content) => {\n const array = this.getNestedValue(data, arrayName.trim())\n if (!Array.isArray(array)) return ''\n \n return array.map((item, index) => {\n // Create context with array item and special variables\n const itemContext = {\n ...data,\n // Handle primitive items (for {{.}} syntax)\n '.': item,\n // Spread item properties if it's an object\n ...(typeof item === 'object' && item !== null ? item : {}),\n '@index': index,\n '@first': index === 0,\n '@last': index === array.length - 1\n }\n return this.renderTemplate(content, itemContext)\n }).join('')\n })\n\n // Second pass: Handle conditionals\n let ifCount = 0\n while (rendered.includes('{{#if ') && ifCount < 100) {\n const previousRendered = rendered\n rendered = rendered.replace(/\\{\\{#if\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (_match, condition, content) => {\n const value = this.getNestedValue(data, condition.trim())\n // Handle boolean values properly - @first/@last are explicitly boolean\n const isTruthy = value === true || (value && value !== 0 && value !== '' && value !== null && value !== undefined)\n return isTruthy ? this.renderTemplate(content, data) : ''\n })\n if (previousRendered === rendered) break\n ifCount++\n }\n\n // Third pass: Handle triple braces for raw HTML {{{variable}}}\n rendered = rendered.replace(/\\{\\{\\{([^}]+)\\}\\}\\}/g, (_match, variable) => {\n const value = this.getNestedValue(data, variable.trim())\n return value !== undefined && value !== null ? String(value) : ''\n })\n\n // Fourth pass: Handle helper functions like {{titleCase field}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\s+([^}]+)\\}\\}/g, (match, helper, variable) => {\n const helperName = helper.trim()\n const varName = variable.trim()\n \n if (helperName === 'titleCase') {\n const value = this.getNestedValue(data, varName)\n if (value !== undefined && value !== null) {\n return this.titleCase(String(value))\n }\n }\n \n return match // Return original if helper not found\n })\n\n // Final pass: Handle simple variables {{variable}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\}\\}/g, (match, variable) => {\n const trimmed = variable.trim()\n \n // Skip if it's a helper function (has spaces)\n if (trimmed.includes(' ')) {\n return match\n }\n \n const value = this.getNestedValue(data, trimmed)\n if (value === null) return ''\n if (value === undefined) return ''\n return String(value)\n })\n\n return rendered\n }\n\n /**\n * Get nested value from object using dot notation\n */\n private getNestedValue(obj: any, path: string): any {\n if (!obj || path === '') return undefined\n \n return path.split('.').reduce((current, key) => {\n if (current === null || current === undefined) return undefined\n return current[key]\n }, obj)\n }\n\n /**\n * Title case helper function\n */\n private titleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, l => l.toUpperCase())\n }\n\n /**\n * Render a template string with data\n */\n render(template: string, data: TemplateData = {}): string {\n return this.renderTemplate(template, data)\n }\n\n /**\n * Clear template cache (useful for development)\n */\n clearCache(): void {\n this.templateCache.clear()\n }\n}\n\n// Export singleton instance\nexport const templateRenderer = new TemplateRenderer()\n\n// Utility function to render template strings directly\nexport function renderTemplate(template: string, data: TemplateData = {}): string {\n return templateRenderer.render(template, data)\n}","/**\n * Query Filter Builder for SonicJS AI\n * Supports comprehensive filtering with AND/OR logic\n * Compatible with D1 Database (SQLite)\n */\n\nexport type FilterOperator =\n | 'equals'\n | 'not_equals'\n | 'greater_than'\n | 'greater_than_equal'\n | 'less_than'\n | 'less_than_equal'\n | 'like'\n | 'contains'\n | 'starts_with'\n | 'ends_with'\n | 'in'\n | 'not_in'\n | 'all'\n | 'exists'\n | 'near'\n | 'within'\n | 'intersects'\n\nconst VALID_FILTER_OPERATORS: ReadonlySet = new Set([\n 'equals',\n 'not_equals',\n 'greater_than',\n 'greater_than_equal',\n 'less_than',\n 'less_than_equal',\n 'like',\n 'contains',\n 'starts_with',\n 'ends_with',\n 'in',\n 'not_in',\n 'all',\n 'exists',\n 'near',\n 'within',\n 'intersects'\n])\n\nexport interface FilterCondition {\n field: string\n operator: FilterOperator\n value: any\n}\n\nexport interface FilterGroup {\n and?: FilterCondition[]\n or?: FilterCondition[]\n}\n\nexport interface QueryFilter {\n where?: FilterGroup\n limit?: number\n offset?: number\n sort?: {\n field: string\n order: 'asc' | 'desc'\n }[]\n}\n\nexport interface QueryResult {\n sql: string\n params: any[]\n errors: string[]\n}\n\n/**\n * Validate sort order value - only 'asc' or 'desc' are allowed.\n * Returns the validated lowercase value, defaulting to 'asc' for invalid input.\n */\nexport function validateSortOrder(order: any): 'asc' | 'desc' {\n if (typeof order === 'string') {\n const normalized = order.toLowerCase().trim()\n if (normalized === 'asc' || normalized === 'desc') {\n return normalized\n }\n }\n return 'asc'\n}\n\n/**\n * Query Filter Builder\n * Converts filter objects into SQL WHERE clauses with parameterized queries\n */\nexport class QueryFilterBuilder {\n private params: any[] = []\n private errors: string[] = []\n\n /**\n * Build a complete SQL query from filter object\n */\n build(baseTable: string, filter: QueryFilter): QueryResult {\n this.params = []\n this.errors = []\n\n let sql = `SELECT * FROM ${baseTable}`\n\n // Build WHERE clause\n if (filter.where) {\n const whereClause = this.buildWhereClause(filter.where)\n if (whereClause) {\n sql += ` WHERE ${whereClause}`\n }\n }\n\n // Build ORDER BY clause\n if (filter.sort && filter.sort.length > 0) {\n const orderClauses = filter.sort\n .map(s => `${this.sanitizeFieldName(s.field)} ${this.sanitizeSortOrder(s.order)}`)\n .join(', ')\n sql += ` ORDER BY ${orderClauses}`\n }\n\n // Build LIMIT clause\n if (filter.limit) {\n sql += ` LIMIT ?`\n this.params.push(filter.limit)\n }\n\n // Build OFFSET clause\n if (filter.offset) {\n sql += ` OFFSET ?`\n this.params.push(filter.offset)\n }\n\n return {\n sql,\n params: this.params,\n errors: this.errors\n }\n }\n\n /**\n * Build WHERE clause from filter group\n */\n private buildWhereClause(group: FilterGroup): string {\n const clauses: string[] = []\n\n // Handle AND conditions\n if (group.and && group.and.length > 0) {\n const andClauses = group.and\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (andClauses.length > 0) {\n clauses.push(`(${andClauses.join(' AND ')})`)\n }\n }\n\n // Handle OR conditions\n if (group.or && group.or.length > 0) {\n const orClauses = group.or\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (orClauses.length > 0) {\n clauses.push(`(${orClauses.join(' OR ')})`)\n }\n }\n\n return clauses.join(' AND ')\n }\n\n /**\n * Build a single condition\n */\n private buildCondition(condition: FilterCondition): string | null {\n const field = this.sanitizeFieldName(condition.field)\n\n switch (condition.operator) {\n case 'equals':\n return this.buildEquals(field, condition.value)\n\n case 'not_equals':\n return this.buildNotEquals(field, condition.value)\n\n case 'greater_than':\n return this.buildComparison(field, '>', condition.value)\n\n case 'greater_than_equal':\n return this.buildComparison(field, '>=', condition.value)\n\n case 'less_than':\n return this.buildComparison(field, '<', condition.value)\n\n case 'less_than_equal':\n return this.buildComparison(field, '<=', condition.value)\n\n case 'like':\n return this.buildLike(field, condition.value)\n\n case 'contains':\n return this.buildContains(field, condition.value)\n\n case 'starts_with':\n return this.buildStartsWith(field, condition.value)\n\n case 'ends_with':\n return this.buildEndsWith(field, condition.value)\n\n case 'in':\n return this.buildIn(field, condition.value)\n\n case 'not_in':\n return this.buildNotIn(field, condition.value)\n\n case 'all':\n return this.buildAll(field, condition.value)\n\n case 'exists':\n return this.buildExists(field, condition.value)\n\n case 'near':\n this.errors.push(`'near' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'within':\n this.errors.push(`'within' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'intersects':\n this.errors.push(`'intersects' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n default:\n this.errors.push(`Unknown operator: ${condition.operator}`)\n return null\n }\n }\n\n /**\n * Build equals condition\n */\n private buildEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NULL`\n }\n this.params.push(value)\n return `${field} = ?`\n }\n\n /**\n * Build not equals condition\n */\n private buildNotEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NOT NULL`\n }\n this.params.push(value)\n return `${field} != ?`\n }\n\n /**\n * Build comparison condition (>, >=, <, <=)\n */\n private buildComparison(field: string, operator: string, value: any): string {\n this.params.push(value)\n return `${field} ${operator} ?`\n }\n\n /**\n * Build LIKE condition (case-insensitive, all words must be present)\n */\n private buildLike(field: string, value: string): string {\n const words = value.split(/\\s+/).filter(w => w.length > 0)\n\n if (words.length === 0) {\n return `1=1` // No-op condition\n }\n\n const conditions = words.map(word => {\n this.params.push(`%${word}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build CONTAINS condition (case-insensitive substring)\n */\n private buildContains(field: string, value: string): string {\n this.params.push(`%${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build STARTS_WITH condition (case-insensitive prefix match)\n */\n private buildStartsWith(field: string, value: string): string {\n this.params.push(`${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build ENDS_WITH condition (case-insensitive suffix match)\n */\n private buildEndsWith(field: string, value: string): string {\n this.params.push(`%${value}`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build IN condition\n */\n private buildIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=0` // No values means no matches\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} IN (${placeholders})`\n }\n\n /**\n * Build NOT IN condition\n */\n private buildNotIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1` // No values means all match\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} NOT IN (${placeholders})`\n }\n\n /**\n * Build ALL condition (value must contain all items in list)\n * For SQLite, we'll check if a JSON array contains all values\n */\n private buildAll(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1`\n }\n\n // For SQLite, check if field contains all values using JSON functions\n // This assumes the field is a JSON array or comma-separated string\n const conditions = values.map(val => {\n this.params.push(`%${val}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build EXISTS condition\n */\n private buildExists(field: string, value: boolean): string {\n if (value) {\n return `${field} IS NOT NULL AND ${field} != ''`\n } else {\n return `(${field} IS NULL OR ${field} = '')`\n }\n }\n\n /**\n * Sanitize field names to prevent SQL injection\n */\n private sanitizeFieldName(field: string): string {\n // Allow alphanumeric, underscores, dots (for JSON fields)\n const sanitized = field.replace(/[^a-zA-Z0-9_$.]/g, '')\n\n // Handle JSON field access (e.g., data.title -> json_extract(data, '$.title'))\n if (sanitized.includes('.')) {\n const [table, ...path] = sanitized.split('.')\n return `json_extract(${table}, '$.${path.join('.')}')`\n }\n\n return sanitized\n }\n\n /**\n * Sanitize sort order to prevent SQL injection\n * Only allows 'ASC' or 'DESC', defaults to 'ASC' for any other value\n */\n private sanitizeSortOrder(order: string): string {\n const normalized = String(order).toUpperCase().trim()\n if (normalized === 'ASC' || normalized === 'DESC') {\n return normalized\n }\n return 'ASC'\n }\n\n /**\n * Parse filter from query string\n */\n static parseFromQuery(query: Record): QueryFilter {\n const filter: QueryFilter = {}\n\n // Parse where clause from 'where' parameter (JSON string)\n if (query.where) {\n try {\n filter.where = typeof query.where === 'string'\n ? JSON.parse(query.where)\n : query.where\n } catch (e) {\n console.error('Failed to parse where clause:', e)\n }\n }\n\n // Initialize where clause if not present\n if (!filter.where) {\n filter.where = { and: [] }\n }\n if (!filter.where.and) {\n filter.where.and = []\n }\n\n // Parse simple field filters (status, collection_id, etc.)\n // These are convenience parameters that get converted to WHERE conditions\n const simpleFieldMappings: Record = {\n 'status': 'status',\n 'collection_id': 'collection_id'\n }\n\n for (const [queryParam, dbField] of Object.entries(simpleFieldMappings)) {\n if (query[queryParam]) {\n filter.where.and.push({\n field: dbField,\n operator: 'equals',\n value: query[queryParam]\n })\n }\n }\n\n // Parse bracket-syntax filters: filter[field][operator]=value or filter[field]=value\n const bracketFilterRegex = /^filter\\[([^\\]]+)\\](?:\\[([^\\]]+)\\])?$/\n for (const [key, rawValue] of Object.entries(query)) {\n const match = key.match(bracketFilterRegex)\n if (!match) continue\n\n const field = match[1]\n const operator = (match[2] || 'equals') as FilterOperator\n\n if (!field || !VALID_FILTER_OPERATORS.has(operator)) continue\n if (rawValue === undefined || rawValue === null) continue\n\n let value: any = rawValue\n if (operator === 'exists') {\n value = value === 'true' || value === true || value === '1' || value === 1\n }\n\n filter.where.and.push({ field, operator, value })\n }\n\n // Parse limit\n if (query.limit) {\n filter.limit = Math.min(parseInt(query.limit), 1000) // Max 1000\n }\n\n // Parse offset\n if (query.offset) {\n filter.offset = parseInt(query.offset)\n }\n\n // Parse sort\n if (query.sort) {\n try {\n const parsed = typeof query.sort === 'string'\n ? JSON.parse(query.sort)\n : query.sort\n // Validate and sanitize sort entries\n if (Array.isArray(parsed)) {\n filter.sort = parsed\n .filter((s: any) => s && typeof s.field === 'string')\n .map((s: any) => ({\n field: s.field,\n order: validateSortOrder(s.order)\n }))\n }\n } catch (e) {\n console.error('Failed to parse sort clause:', e)\n }\n }\n\n return filter\n }\n}\n\n/**\n * Helper function to build query from filter\n */\nexport function buildQuery(table: string, filter: QueryFilter): QueryResult {\n const builder = new QueryFilterBuilder()\n return builder.build(table, filter)\n}\n","{\n \"name\": \"@sonicjs-cms/core\",\n \"version\": \"2.18.1\",\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 },\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 \"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/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.0.5\",\n \"drizzle-orm\": \"^0.45.2\",\n \"eslint\": \"^9.39.2\",\n \"glob\": \"^10.5.0\",\n \"hono\": \"^4.12.18\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.5\",\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","import type { BlockDefinitions } from '../types/collection-config'\n\nexport type BlocksFieldConfig = {\n blocks: BlockDefinitions\n discriminator: string\n}\n\nexport function getBlocksFieldConfig(fieldOptions: any): BlocksFieldConfig | null {\n if (!fieldOptions || typeof fieldOptions !== 'object') return null\n\n const itemsConfig = fieldOptions.items && typeof fieldOptions.items === 'object'\n ? fieldOptions.items\n : null\n\n if (!itemsConfig || !itemsConfig.blocks || typeof itemsConfig.blocks !== 'object') {\n return null\n }\n\n const discriminator = typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n\n return {\n blocks: itemsConfig.blocks as BlockDefinitions,\n discriminator\n }\n}\n\nexport function parseBlocksValue(value: unknown, config: BlocksFieldConfig) {\n const errors: string[] = []\n let rawValue = value\n\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return { value: [] as any[], errors }\n }\n\n if (typeof rawValue === 'string') {\n try {\n rawValue = JSON.parse(rawValue)\n } catch {\n return { value: [] as any[], errors: ['Blocks value must be valid JSON'] }\n }\n }\n\n if (!Array.isArray(rawValue)) {\n return { value: [] as any[], errors: ['Blocks value must be an array'] }\n }\n\n const normalized = rawValue.map((item, index) => {\n if (!item || typeof item !== 'object') {\n errors.push(`Block #${index + 1} must be an object`)\n return null\n }\n\n if ((item as any).blockType && (item as any).data && typeof (item as any).data === 'object') {\n return { [config.discriminator]: (item as any).blockType, ...(item as any).data }\n }\n\n if (!(config.discriminator in (item as any))) {\n errors.push(`Block #${index + 1} is missing \"${config.discriminator}\"`)\n }\n\n return item as any\n }).filter((item) => item !== null)\n\n return { value: normalized, errors }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-GQEIPW3L.js.map b/packages/core/dist/chunk-GQEIPW3L.js.map deleted file mode 100644 index e36280fc8..000000000 --- a/packages/core/dist/chunk-GQEIPW3L.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/db/schema.ts","../../../../../node_modules/src/constants.ts","../../../../../node_modules/src/utils.ts","../../../../../node_modules/src/column.ts","../../../../../node_modules/src/schema.ts","../src/services/logger.ts","../src/services/cache.ts","../src/services/settings.ts","../src/services/telemetry-service.ts","../src/services/route-metadata.ts"],"names":["zod","z","integer","columns"],"mappings":"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","file":"chunk-GQEIPW3L.js","sourcesContent":["import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod';\n\n// Users table for authentication and user management\nexport const users = sqliteTable('users', {\n id: text('id').primaryKey(),\n email: text('email').notNull().unique(),\n username: text('username').notNull().unique(),\n firstName: text('first_name').notNull(),\n lastName: text('last_name').notNull(),\n passwordHash: text('password_hash'), // Hashed password, nullable for OAuth users\n role: text('role').notNull().default('viewer'), // 'admin', 'editor', 'author', 'viewer'\n avatar: text('avatar'),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n lastLoginAt: integer('last_login_at'),\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Content collections - dynamic schema definitions\nexport const collections = sqliteTable('collections', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n schema: text('schema', { mode: 'json' }).notNull(), // JSON schema definition\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false), // Config-managed collections cannot be edited in UI\n sourceType: text('source_type').default('user'), // 'user' (normal), 'form' (form-derived)\n sourceId: text('source_id'), // stores the form ID for form-derived collections\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content items - actual content data\nexport const content = sqliteTable('content', {\n id: text('id').primaryKey(),\n collectionId: text('collection_id').notNull().references(() => collections.id),\n slug: text('slug').notNull(),\n title: text('title').notNull(),\n data: text('data', { mode: 'json' }).notNull(), // JSON content data\n status: text('status').notNull().default('draft'), // 'draft', 'published', 'archived'\n publishedAt: integer('published_at', { mode: 'timestamp' }),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content versions for versioning system\nexport const contentVersions = sqliteTable('content_versions', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n version: integer('version').notNull(),\n data: text('data', { mode: 'json' }).notNull(),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Media/Files table\nexport const media = sqliteTable('media', {\n id: text('id').primaryKey(),\n filename: text('filename').notNull(),\n originalName: text('original_name').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n width: integer('width'),\n height: integer('height'),\n folder: text('folder').notNull().default('uploads'),\n r2Key: text('r2_key').notNull(), // R2 storage key\n publicUrl: text('public_url').notNull(), // CDN URL\n thumbnailUrl: text('thumbnail_url'),\n alt: text('alt'),\n caption: text('caption'),\n tags: text('tags', { mode: 'json' }), // JSON array of tags\n uploadedBy: text('uploaded_by').notNull().references(() => users.id),\n uploadedAt: integer('uploaded_at').notNull(),\n updatedAt: integer('updated_at'),\n publishedAt: integer('published_at'),\n scheduledAt: integer('scheduled_at'),\n archivedAt: integer('archived_at'),\n deletedAt: integer('deleted_at'),\n});\n\n// API tokens for programmatic access\nexport const apiTokens = sqliteTable('api_tokens', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n token: text('token').notNull().unique(),\n userId: text('user_id').notNull().references(() => users.id),\n permissions: text('permissions', { mode: 'json' }).notNull(), // Array of permissions\n expiresAt: integer('expires_at', { mode: 'timestamp' }),\n lastUsedAt: integer('last_used_at', { mode: 'timestamp' }),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n\n// Workflow history for content workflow tracking\nexport const workflowHistory = sqliteTable('workflow_history', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n action: text('action').notNull(),\n fromStatus: text('from_status').notNull(),\n toStatus: text('to_status').notNull(),\n userId: text('user_id').notNull().references(() => users.id),\n comment: text('comment'),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Plugin system tables\nexport const plugins = sqliteTable('plugins', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n version: text('version').notNull(),\n author: text('author').notNull(),\n category: text('category').notNull(),\n icon: text('icon'),\n status: text('status').notNull().default('inactive'), // 'active', 'inactive', 'error'\n isCore: integer('is_core', { mode: 'boolean' }).notNull().default(false),\n settings: text('settings', { mode: 'json' }),\n permissions: text('permissions', { mode: 'json' }),\n dependencies: text('dependencies', { mode: 'json' }),\n downloadCount: integer('download_count').notNull().default(0),\n rating: integer('rating').notNull().default(0),\n installedAt: integer('installed_at').notNull(),\n activatedAt: integer('activated_at'),\n lastUpdated: integer('last_updated').notNull(),\n errorMessage: text('error_message'),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n updatedAt: integer('updated_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginHooks = sqliteTable('plugin_hooks', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n hookName: text('hook_name').notNull(),\n handlerName: text('handler_name').notNull(),\n priority: integer('priority').notNull().default(10),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginRoutes = sqliteTable('plugin_routes', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n path: text('path').notNull(),\n method: text('method').notNull(),\n handlerName: text('handler_name').notNull(),\n middleware: text('middleware', { mode: 'json' }),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginAssets = sqliteTable('plugin_assets', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n assetType: text('asset_type').notNull(), // 'css', 'js', 'image', 'font'\n assetPath: text('asset_path').notNull(),\n loadOrder: integer('load_order').notNull().default(100),\n loadLocation: text('load_location').notNull().default('footer'), // 'header', 'footer'\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginActivityLog = sqliteTable('plugin_activity_log', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n action: text('action').notNull(),\n userId: text('user_id'),\n details: text('details', { mode: 'json' }),\n timestamp: integer('timestamp').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\n// Zod schemas for validation\nexport const insertUserSchema = createInsertSchema(users, {\n email: (schema: any) => schema.email(),\n firstName: (schema: any) => schema.min(1),\n lastName: (schema: any) => schema.min(1),\n username: (schema: any) => schema.min(3),\n});\n\nexport const selectUserSchema = createSelectSchema(users);\n\nexport const insertCollectionSchema = createInsertSchema(collections, {\n name: (schema: any) => schema.min(1).regex(/^[a-z0-9_]+$/, 'Collection name must be lowercase with underscores'),\n displayName: (schema: any) => schema.min(1),\n});\n\nexport const selectCollectionSchema = createSelectSchema(collections);\n\nexport const insertContentSchema = createInsertSchema(content, {\n slug: (schema: any) => schema.min(1).regex(/^[a-zA-Z0-9_-]+$/, 'Slug must contain only letters, numbers, underscores, and hyphens'),\n title: (schema: any) => schema.min(1),\n status: (schema: any) => schema,\n});\n\nexport const selectContentSchema = createSelectSchema(content);\n\nexport const insertMediaSchema = createInsertSchema(media, {\n filename: (schema: any) => schema.min(1),\n originalName: (schema: any) => schema.min(1),\n mimeType: (schema: any) => schema.min(1),\n size: (schema: any) => schema.positive(),\n r2Key: (schema: any) => schema.min(1),\n publicUrl: (schema: any) => schema.url(),\n folder: (schema: any) => schema.min(1),\n});\n\nexport const selectMediaSchema = createSelectSchema(media);\n\n\nexport const insertWorkflowHistorySchema = createInsertSchema(workflowHistory, {\n action: (schema: any) => schema.min(1),\n fromStatus: (schema: any) => schema.min(1),\n toStatus: (schema: any) => schema.min(1),\n});\n\nexport const selectWorkflowHistorySchema = createSelectSchema(workflowHistory);\n\nexport const insertPluginSchema = createInsertSchema(plugins, {\n name: (schema: any) => schema.min(1),\n displayName: (schema: any) => schema.min(1),\n version: (schema: any) => schema.min(1),\n author: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginSchema = createSelectSchema(plugins);\n\nexport const insertPluginHookSchema = createInsertSchema(pluginHooks, {\n hookName: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginHookSchema = createSelectSchema(pluginHooks);\n\nexport const insertPluginRouteSchema = createInsertSchema(pluginRoutes, {\n path: (schema: any) => schema.min(1),\n method: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginRouteSchema = createSelectSchema(pluginRoutes);\n\nexport const insertPluginAssetSchema = createInsertSchema(pluginAssets, {\n assetType: (schema: any) => schema.min(1),\n assetPath: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginAssetSchema = createSelectSchema(pluginAssets);\n\nexport const insertPluginActivityLogSchema = createInsertSchema(pluginActivityLog, {\n action: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginActivityLogSchema = createSelectSchema(pluginActivityLog);\n\n// System logs table for comprehensive logging\nexport const systemLogs = sqliteTable('system_logs', {\n id: text('id').primaryKey(),\n level: text('level').notNull(), // 'debug', 'info', 'warn', 'error', 'fatal'\n category: text('category').notNull(), // 'auth', 'api', 'workflow', 'plugin', 'media', 'system', etc.\n message: text('message').notNull(),\n data: text('data', { mode: 'json' }), // Additional structured data\n userId: text('user_id').references(() => users.id),\n sessionId: text('session_id'),\n requestId: text('request_id'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n method: text('method'), // HTTP method for API logs\n url: text('url'), // Request URL for API logs\n statusCode: integer('status_code'), // HTTP status code for API logs\n duration: integer('duration'), // Request duration in milliseconds\n stackTrace: text('stack_trace'), // Error stack trace for error logs\n tags: text('tags', { mode: 'json' }), // Array of tags for categorization\n source: text('source'), // Source component/module that generated the log\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Log configuration table\nexport const logConfig = sqliteTable('log_config', {\n id: text('id').primaryKey(),\n category: text('category').notNull().unique(),\n enabled: integer('enabled', { mode: 'boolean' }).notNull().default(true),\n level: text('level').notNull().default('info'), // minimum log level to store\n retention: integer('retention').notNull().default(30), // days to keep logs\n maxSize: integer('max_size').default(10000), // max number of logs per category\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Insert and select schemas for system logs\nexport const insertSystemLogSchema = createInsertSchema(systemLogs, {\n level: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n message: (schema: any) => schema.min(1),\n});\n\nexport const selectSystemLogSchema = createSelectSchema(systemLogs);\n\nexport const insertLogConfigSchema = createInsertSchema(logConfig, {\n category: (schema: any) => schema.min(1),\n level: (schema: any) => schema.min(1),\n});\n\nexport const selectLogConfigSchema = createSelectSchema(logConfig);\n\n// Type exports\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\nexport type Collection = typeof collections.$inferSelect;\nexport type NewCollection = typeof collections.$inferInsert;\nexport type Content = typeof content.$inferSelect;\nexport type NewContent = typeof content.$inferInsert;\nexport type Media = typeof media.$inferSelect;\nexport type NewMedia = typeof media.$inferInsert;\nexport type WorkflowHistory = typeof workflowHistory.$inferSelect;\nexport type NewWorkflowHistory = typeof workflowHistory.$inferInsert;\nexport type Plugin = typeof plugins.$inferSelect;\nexport type NewPlugin = typeof plugins.$inferInsert;\nexport type PluginHook = typeof pluginHooks.$inferSelect;\nexport type NewPluginHook = typeof pluginHooks.$inferInsert;\nexport type PluginRoute = typeof pluginRoutes.$inferSelect;\nexport type NewPluginRoute = typeof pluginRoutes.$inferInsert;\nexport type PluginAsset = typeof pluginAssets.$inferSelect;\nexport type NewPluginAsset = typeof pluginAssets.$inferInsert;\nexport type PluginActivityLog = typeof pluginActivityLog.$inferSelect;\nexport type NewPluginActivityLog = typeof pluginActivityLog.$inferInsert;\nexport type SystemLog = typeof systemLogs.$inferSelect;\nexport type NewSystemLog = typeof systemLogs.$inferInsert;\nexport type LogConfig = typeof logConfig.$inferSelect;\nexport type NewLogConfig = typeof logConfig.$inferInsert;\n\n// =====================================================\n// Security Audit Plugin Tables\n// =====================================================\n\nexport const securityEvents = sqliteTable('security_events', {\n id: text('id').primaryKey(),\n eventType: text('event_type').notNull(),\n severity: text('severity').notNull().default('info'),\n userId: text('user_id'),\n email: text('email'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n countryCode: text('country_code'),\n requestPath: text('request_path'),\n requestMethod: text('request_method'),\n details: text('details', { mode: 'json' }),\n fingerprint: text('fingerprint'),\n blocked: integer('blocked').notNull().default(0),\n createdAt: integer('created_at').notNull().$defaultFn(() => Date.now()),\n});\n\nexport const insertSecurityEventSchema = createInsertSchema(securityEvents, {\n eventType: (schema: any) => schema.min(1),\n severity: (schema: any) => schema.min(1),\n});\n\nexport const selectSecurityEventSchema = createSelectSchema(securityEvents);\n\nexport type SecurityEventRecord = typeof securityEvents.$inferSelect;\nexport type NewSecurityEventRecord = typeof securityEvents.$inferInsert;\n\n// =====================================================\n// Form.io Integration Tables\n// =====================================================\n\n// Forms table - stores Form.io form definitions\nexport const forms = sqliteTable('forms', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(), // Machine name (e.g., \"contact-form\")\n displayName: text('display_name').notNull(), // Human name (e.g., \"Contact Form\")\n description: text('description'),\n category: text('category').notNull().default('general'), // contact, survey, registration, etc.\n \n // Form.io schema (JSON)\n formioSchema: text('formio_schema', { mode: 'json' }).notNull(), // Complete Form.io JSON schema\n \n // Settings (JSON)\n settings: text('settings', { mode: 'json' }), // emailNotifications, successMessage, etc.\n \n // Status & Management\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n isPublic: integer('is_public', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false),\n \n // Metadata\n icon: text('icon'),\n color: text('color'),\n tags: text('tags', { mode: 'json' }), // JSON array\n \n // Stats\n submissionCount: integer('submission_count').notNull().default(0),\n viewCount: integer('view_count').notNull().default(0),\n \n // Ownership\n createdBy: text('created_by').references(() => users.id),\n updatedBy: text('updated_by').references(() => users.id),\n \n // Timestamps\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form submissions table\nexport const formSubmissions = sqliteTable('form_submissions', {\n id: text('id').primaryKey(),\n formId: text('form_id').notNull().references(() => forms.id, { onDelete: 'cascade' }),\n \n // Submission data\n submissionData: text('submission_data', { mode: 'json' }).notNull(), // The actual form data\n \n // Submission metadata\n status: text('status').notNull().default('pending'), // pending, reviewed, approved, rejected, spam\n submissionNumber: integer('submission_number'),\n \n // User information\n userId: text('user_id').references(() => users.id),\n userEmail: text('user_email'),\n \n // Tracking\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n referrer: text('referrer'),\n utmSource: text('utm_source'),\n utmMedium: text('utm_medium'),\n utmCampaign: text('utm_campaign'),\n \n // Review/Processing\n reviewedBy: text('reviewed_by').references(() => users.id),\n reviewedAt: integer('reviewed_at'),\n reviewNotes: text('review_notes'),\n \n // Flags\n isSpam: integer('is_spam', { mode: 'boolean' }).notNull().default(false),\n isArchived: integer('is_archived', { mode: 'boolean' }).notNull().default(false),\n\n // Content integration\n contentId: text('content_id').references(() => content.id), // Links submission to its content item\n\n // Timestamps\n submittedAt: integer('submitted_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form files table - links submissions to uploaded files\nexport const formFiles = sqliteTable('form_files', {\n id: text('id').primaryKey(),\n submissionId: text('submission_id').notNull().references(() => formSubmissions.id, { onDelete: 'cascade' }),\n mediaId: text('media_id').notNull().references(() => media.id, { onDelete: 'cascade' }),\n fieldName: text('field_name').notNull(), // Form field that uploaded this file\n uploadedAt: integer('uploaded_at').notNull(),\n});\n\n// Zod schemas for validation\nexport const insertFormSchema = createInsertSchema(forms);\nexport const selectFormSchema = createSelectSchema(forms);\nexport const insertFormSubmissionSchema = createInsertSchema(formSubmissions);\nexport const selectFormSubmissionSchema = createSelectSchema(formSubmissions);\nexport const insertFormFileSchema = createInsertSchema(formFiles);\nexport const selectFormFileSchema = createSelectSchema(formFiles);\n\n// TypeScript types\nexport type Form = typeof forms.$inferSelect;\nexport type NewForm = typeof forms.$inferInsert;\nexport type FormSubmission = typeof formSubmissions.$inferSelect;\nexport type NewFormSubmission = typeof formSubmissions.$inferInsert;\nexport type FormFile = typeof formFiles.$inferSelect;\nexport type NewFormFile = typeof formFiles.$inferInsert;",null,null,null,null,"import type { D1Database } from '@cloudflare/workers-types'\nimport { systemLogs, logConfig, type NewSystemLog, type LogConfig } from '../db/schema'\nimport { drizzle } from 'drizzle-orm/d1'\nimport { eq, and, gte, lte, desc, asc, count, like, inArray } from 'drizzle-orm'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal'\nexport type LogCategory = 'auth' | 'api' | 'workflow' | 'plugin' | 'media' | 'system' | 'security' | 'error'\n\nexport interface LogEntry {\n level: LogLevel\n category: LogCategory\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags?: string[]\n source?: string\n}\n\nexport interface LogFilter {\n level?: LogLevel[]\n category?: LogCategory[]\n userId?: string\n source?: string\n search?: string\n startDate?: Date\n endDate?: Date\n tags?: string[]\n limit?: number\n offset?: number\n sortBy?: 'created_at' | 'level' | 'category'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport class Logger {\n private db: ReturnType\n private enabled: boolean = true\n private configCache: Map = new Map()\n private lastConfigRefresh: number = 0\n private configRefreshInterval: number = 60000 // 1 minute\n\n constructor(database: D1Database) {\n this.db = drizzle(database)\n }\n\n /**\n * Log a debug message\n */\n async debug(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('debug', category, message, data, context)\n }\n\n /**\n * Log an info message\n */\n async info(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('info', category, message, data, context)\n }\n\n /**\n * Log a warning message\n */\n async warn(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('warn', category, message, data, context)\n }\n\n /**\n * Log an error message\n */\n async error(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('error', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log a fatal message\n */\n async fatal(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('fatal', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log an API request\n */\n async logRequest(\n method: string,\n url: string,\n statusCode: number,\n duration: number,\n context?: Partial\n ): Promise {\n const level: LogLevel = statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info'\n \n return this.log(level, 'api', `${method} ${url} - ${statusCode}`, {\n method,\n url,\n statusCode,\n duration\n }, {\n ...context,\n method,\n url,\n statusCode,\n duration\n })\n }\n\n /**\n * Log an authentication event\n */\n async logAuth(action: string, userId?: string, success: boolean = true, context?: Partial): Promise {\n const level: LogLevel = success ? 'info' : 'warn'\n \n return this.log(level, 'auth', `Authentication ${action}: ${success ? 'success' : 'failed'}`, {\n action,\n success,\n userId\n }, {\n ...context,\n userId,\n tags: ['authentication', action]\n })\n }\n\n /**\n * Log a security event\n */\n async logSecurity(event: string, severity: 'low' | 'medium' | 'high' | 'critical', context?: Partial): Promise {\n const level: LogLevel = severity === 'critical' ? 'fatal' : severity === 'high' ? 'error' : 'warn'\n \n return this.log(level, 'security', `Security event: ${event}`, {\n event,\n severity\n }, {\n ...context,\n tags: ['security', severity]\n })\n }\n\n /**\n * Core logging method\n */\n private async log(\n level: LogLevel,\n category: LogCategory,\n message: string,\n data?: any,\n context?: Partial\n ): Promise {\n if (!this.enabled) return\n\n try {\n // Check if logging is enabled for this category and level\n const config = await this.getConfig(category)\n if (!config || !config.enabled || !this.shouldLog(level, config.level)) {\n return\n }\n\n const logEntry: NewSystemLog = {\n id: crypto.randomUUID(),\n level,\n category,\n message,\n data: data ? JSON.stringify(data) : null,\n userId: context?.userId || null,\n sessionId: context?.sessionId || null,\n requestId: context?.requestId || null,\n ipAddress: context?.ipAddress || null,\n userAgent: context?.userAgent || null,\n method: context?.method || null,\n url: context?.url || null,\n statusCode: context?.statusCode || null,\n duration: context?.duration || null,\n stackTrace: context?.stackTrace || null,\n tags: context?.tags ? JSON.stringify(context.tags) : null,\n source: context?.source || null,\n createdAt: new Date()\n }\n\n await this.db.insert(systemLogs).values(logEntry)\n\n // Check if we need to clean up old logs\n if (config.maxSize) {\n await this.cleanupCategory(category, config.maxSize)\n }\n\n } catch (error) {\n // Don't log errors in the logger to avoid infinite loops\n console.error('Logger error:', error)\n }\n }\n\n /**\n * Get logs with filtering and pagination\n */\n async getLogs(filter: LogFilter = {}): Promise<{ logs: any[], total: number }> {\n try {\n const conditions = []\n \n if (filter.level && filter.level.length > 0) {\n conditions.push(inArray(systemLogs.level, filter.level))\n }\n \n if (filter.category && filter.category.length > 0) {\n conditions.push(inArray(systemLogs.category, filter.category))\n }\n \n if (filter.userId) {\n conditions.push(eq(systemLogs.userId, filter.userId))\n }\n \n if (filter.source) {\n conditions.push(eq(systemLogs.source, filter.source))\n }\n \n if (filter.search) {\n conditions.push(\n like(systemLogs.message, `%${filter.search}%`)\n )\n }\n \n if (filter.startDate) {\n conditions.push(gte(systemLogs.createdAt, filter.startDate))\n }\n \n if (filter.endDate) {\n conditions.push(lte(systemLogs.createdAt, filter.endDate))\n }\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined\n\n // Get total count\n const totalResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(whereClause)\n\n const total = totalResult[0]?.count || 0\n\n // Get logs with pagination and sorting\n const sortColumn = filter.sortBy === 'level' ? systemLogs.level :\n filter.sortBy === 'category' ? systemLogs.category :\n systemLogs.createdAt\n\n const sortFn = filter.sortOrder === 'asc' ? asc : desc\n\n const logs = await this.db\n .select()\n .from(systemLogs)\n .where(whereClause)\n .orderBy(sortFn(sortColumn))\n .limit(filter.limit || 50)\n .offset(filter.offset || 0)\n\n return { logs, total }\n } catch (error) {\n console.error('Error getting logs:', error)\n return { logs: [], total: 0 }\n }\n }\n\n /**\n * Get log configuration for a category\n */\n private async getConfig(category: LogCategory): Promise {\n try {\n // Check cache first\n const now = Date.now()\n if (this.configCache.has(category) && (now - this.lastConfigRefresh) < this.configRefreshInterval) {\n return this.configCache.get(category) || null\n }\n\n // Refresh config from database\n const configs = await this.db\n .select()\n .from(logConfig)\n .where(eq(logConfig.category, category))\n\n const config = configs[0] || null\n \n if (config) {\n this.configCache.set(category, config)\n this.lastConfigRefresh = now\n }\n\n return config\n } catch (error) {\n console.error('Error getting log config:', error)\n return null\n }\n }\n\n /**\n * Update log configuration\n */\n async updateConfig(category: LogCategory, updates: Partial): Promise {\n try {\n await this.db\n .update(logConfig)\n .set({\n ...updates,\n updatedAt: new Date()\n })\n .where(eq(logConfig.category, category))\n\n // Clear cache for this category\n this.configCache.delete(category)\n } catch (error) {\n console.error('Error updating log config:', error)\n }\n }\n\n /**\n * Get all log configurations\n */\n async getAllConfigs(): Promise {\n try {\n return await this.db.select().from(logConfig)\n } catch (error) {\n console.error('Error getting log configs:', error)\n return []\n }\n }\n\n /**\n * Clean up old logs for a category\n */\n private async cleanupCategory(category: LogCategory, maxSize: number): Promise {\n try {\n // Count current logs for this category\n const countResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n\n const currentCount = countResult[0]?.count || 0\n\n if (currentCount > maxSize) {\n // Get the cutoff date (keep newest maxSize logs)\n const cutoffLogs = await this.db\n .select({ createdAt: systemLogs.createdAt })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n .orderBy(desc(systemLogs.createdAt))\n .limit(1)\n .offset(maxSize - 1)\n\n if (cutoffLogs[0]) {\n // Delete older logs\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, category),\n lte(systemLogs.createdAt, cutoffLogs[0].createdAt)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n }\n }\n\n /**\n * Clean up logs based on retention policy\n */\n async cleanupByRetention(): Promise {\n try {\n const configs = await this.getAllConfigs()\n \n for (const config of configs) {\n if (config.retention > 0) {\n const cutoffDate = new Date()\n cutoffDate.setDate(cutoffDate.getDate() - config.retention)\n\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, config.category),\n lte(systemLogs.createdAt, cutoffDate)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs by retention:', error)\n }\n }\n\n /**\n * Check if a log level should be recorded based on configuration\n */\n private shouldLog(level: LogLevel, configLevel: string): boolean {\n const levels = ['debug', 'info', 'warn', 'error', 'fatal']\n const levelIndex = levels.indexOf(level)\n const configLevelIndex = levels.indexOf(configLevel)\n \n return levelIndex >= configLevelIndex\n }\n\n /**\n * Enable or disable logging\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton logger instance\nlet loggerInstance: Logger | null = null\n\n/**\n * Get the logger instance\n */\nexport function getLogger(database?: D1Database): Logger {\n if (!loggerInstance && database) {\n loggerInstance = new Logger(database)\n }\n \n if (!loggerInstance) {\n throw new Error('Logger not initialized. Call getLogger with a database instance first.')\n }\n \n return loggerInstance\n}\n\n/**\n * Initialize the logger with a database\n */\nexport function initLogger(database: D1Database): Logger {\n loggerInstance = new Logger(database)\n return loggerInstance\n}","/**\n * Simple Cache Service\n *\n * Provides basic caching functionality for the core package\n * Can be extended with KV or other storage backends\n */\n\nexport interface CacheConfig {\n ttl: number // Time to live in seconds\n keyPrefix: string\n}\n\nexport class CacheService {\n private config: CacheConfig\n private memoryCache: Map = new Map()\n\n constructor(config: CacheConfig) {\n this.config = config\n }\n\n /**\n * Generate cache key with prefix\n */\n generateKey(type: string, identifier?: string): string {\n const parts = [this.config.keyPrefix, type]\n if (identifier) {\n parts.push(identifier)\n }\n return parts.join(':')\n }\n\n /**\n * Get value from cache\n */\n async get(key: string): Promise {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return null\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return null\n }\n\n return cached.value as T\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise<{\n hit: boolean\n data: T | null\n source: string\n ttl?: number\n }> {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return {\n hit: false,\n data: null,\n source: 'none'\n }\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return {\n hit: false,\n data: null,\n source: 'expired'\n }\n }\n\n return {\n hit: true,\n data: cached.value as T,\n source: 'memory',\n ttl: (cached.expires - Date.now()) / 1000 // TTL in seconds\n }\n }\n\n /**\n * Set value in cache\n */\n async set(key: string, value: any, ttl?: number): Promise {\n const expires = Date.now() + ((ttl || this.config.ttl) * 1000)\n this.memoryCache.set(key, { value, expires })\n }\n\n /**\n * Delete specific key from cache\n */\n async delete(key: string): Promise {\n this.memoryCache.delete(key)\n }\n\n /**\n * Invalidate cache keys matching a pattern\n * For memory cache, we do simple string matching\n */\n async invalidate(pattern: string): Promise {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.')\n const regex = new RegExp(`^${regexPattern}$`)\n\n // Find and delete matching keys\n for (const key of this.memoryCache.keys()) {\n if (regex.test(key)) {\n this.memoryCache.delete(key)\n }\n }\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise {\n this.memoryCache.clear()\n }\n\n /**\n * Get value from cache or set it using a callback\n */\n async getOrSet(key: string, callback: () => Promise, ttl?: number): Promise {\n const cached = await this.get(key)\n\n if (cached !== null) {\n return cached\n }\n\n const value = await callback()\n await this.set(key, value, ttl)\n return value\n }\n}\n\n/**\n * Cache configurations for different data types\n */\nexport const CACHE_CONFIGS = {\n api: {\n ttl: 300, // 5 minutes\n keyPrefix: 'api'\n },\n user: {\n ttl: 600, // 10 minutes\n keyPrefix: 'user'\n },\n content: {\n ttl: 300, // 5 minutes\n keyPrefix: 'content'\n },\n collection: {\n ttl: 600, // 10 minutes\n keyPrefix: 'collection'\n }\n}\n\n/**\n * Get cache service instance for a config\n */\nexport function getCacheService(config: CacheConfig): CacheService {\n return new CacheService(config)\n}\n","export interface Setting {\n id: string\n category: string\n key: string\n value: string // JSON string\n created_at: number\n updated_at: number\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface SecuritySettings {\n jwtExpiresIn: string\n jwtRefreshGraceSeconds: number\n}\n\nexport class SettingsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get a setting value by category and key\n */\n async getSetting(category: string, key: string): Promise {\n try {\n const result = await this.db\n .prepare('SELECT value FROM settings WHERE category = ? AND key = ?')\n .bind(category, key)\n .first()\n\n if (!result) {\n return null\n }\n\n return JSON.parse((result as any).value)\n } catch (error) {\n console.error(`Error getting setting ${category}.${key}:`, error)\n return null\n }\n }\n\n /**\n * Get all settings for a category\n */\n async getCategorySettings(category: string): Promise> {\n try {\n const { results } = await this.db\n .prepare('SELECT key, value FROM settings WHERE category = ?')\n .bind(category)\n .all()\n\n const settings: Record = {}\n for (const row of results || []) {\n const r = row as any\n settings[r.key] = JSON.parse(r.value)\n }\n\n return settings\n } catch (error) {\n console.error(`Error getting category settings for ${category}:`, error)\n return {}\n }\n }\n\n /**\n * Set a setting value\n */\n async setSetting(category: string, key: string, value: any): Promise {\n try {\n const now = Date.now()\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n\n return true\n } catch (error) {\n console.error(`Error setting ${category}.${key}:`, error)\n return false\n }\n }\n\n /**\n * Set multiple settings at once\n */\n async setMultipleSettings(category: string, settings: Record): Promise {\n try {\n const now = Date.now()\n\n // Use a transaction-like approach with batch operations\n for (const [key, value] of Object.entries(settings)) {\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n }\n\n return true\n } catch (error) {\n console.error(`Error setting multiple settings for ${category}:`, error)\n return false\n }\n }\n\n /**\n * Get general settings with defaults\n */\n async getGeneralSettings(userEmail?: string): Promise {\n const settings = await this.getCategorySettings('general')\n\n return {\n siteName: settings.siteName || 'SonicJS AI',\n siteDescription: settings.siteDescription || 'A modern headless CMS powered by AI',\n adminEmail: settings.adminEmail || userEmail || 'admin@example.com',\n timezone: settings.timezone || 'UTC',\n language: settings.language || 'en',\n maintenanceMode: settings.maintenanceMode || false\n }\n }\n\n /**\n * Save general settings\n */\n async saveGeneralSettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.siteName !== undefined) settingsToSave.siteName = settings.siteName\n if (settings.siteDescription !== undefined) settingsToSave.siteDescription = settings.siteDescription\n if (settings.adminEmail !== undefined) settingsToSave.adminEmail = settings.adminEmail\n if (settings.timezone !== undefined) settingsToSave.timezone = settings.timezone\n if (settings.language !== undefined) settingsToSave.language = settings.language\n if (settings.maintenanceMode !== undefined) settingsToSave.maintenanceMode = settings.maintenanceMode\n\n return await this.setMultipleSettings('general', settingsToSave)\n }\n\n /**\n * Get security settings with defaults\n */\n async getSecuritySettings(): Promise {\n const settings = await this.getCategorySettings('security')\n\n return {\n jwtExpiresIn: settings.jwtExpiresIn || '30d',\n jwtRefreshGraceSeconds:\n typeof settings.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n }\n }\n\n /**\n * Save security settings\n */\n async saveSecuritySettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.jwtExpiresIn !== undefined) settingsToSave.jwtExpiresIn = settings.jwtExpiresIn\n if (settings.jwtRefreshGraceSeconds !== undefined)\n settingsToSave.jwtRefreshGraceSeconds = settings.jwtRefreshGraceSeconds\n\n return await this.setMultipleSettings('security', settingsToSave)\n }\n}\n","/**\n * Telemetry Service\n *\n * Privacy-first telemetry service using custom SonicJS stats endpoint\n * - No PII collection\n * - Opt-out by default\n * - Silent failures (never blocks app)\n */\n\nimport type { TelemetryEvent, TelemetryProperties, TelemetryConfig, TelemetryIdentity } from '../types/telemetry'\nimport { getTelemetryConfig } from '../utils/telemetry-config'\nimport { generateInstallationId, generateProjectId, sanitizeErrorMessage, sanitizeRoute } from '../utils/telemetry-id'\n\n/**\n * TelemetryService class\n *\n * Handles all telemetry tracking in a privacy-conscious way\n */\nexport class TelemetryService {\n private config: TelemetryConfig\n private identity: TelemetryIdentity | null = null\n private enabled: boolean = true\n private eventQueue: Array<{ event: TelemetryEvent; properties?: TelemetryProperties }> = []\n private isInitialized: boolean = false\n\n constructor(config?: Partial) {\n this.config = {\n ...getTelemetryConfig(),\n ...config\n }\n this.enabled = this.config.enabled\n }\n\n /**\n * Initialize the telemetry service\n */\n async initialize(identity: TelemetryIdentity): Promise {\n if (!this.enabled) {\n if (this.config.debug) {\n console.log('[Telemetry] Disabled via configuration')\n }\n return\n }\n\n try {\n this.identity = identity\n\n if (this.config.debug) {\n console.log('[Telemetry] Initialized with installation ID:', identity.installationId)\n }\n\n this.isInitialized = true\n\n // Flush any queued events\n await this.flushQueue()\n\n } catch (error) {\n // Silent fail - telemetry should never break the app\n if (this.config.debug) {\n console.error('[Telemetry] Initialization failed:', error)\n }\n this.enabled = false\n }\n }\n\n /**\n * Track a telemetry event\n */\n async track(event: TelemetryEvent, properties?: TelemetryProperties): Promise {\n if (!this.enabled) return\n\n try {\n // Sanitize properties\n const sanitizedProps = this.sanitizeProperties(properties)\n\n // Add standard properties\n const enrichedProps = {\n ...sanitizedProps,\n timestamp: new Date().toISOString(),\n version: this.getVersion()\n }\n\n // If not initialized, queue the event\n if (!this.isInitialized) {\n this.eventQueue.push({ event, properties: enrichedProps })\n if (this.config.debug) {\n console.log('[Telemetry] Queued event:', event, enrichedProps)\n }\n return\n }\n\n // Send to custom SonicJS stats endpoint\n if (this.identity && this.config.host) {\n const payload = {\n data: {\n installation_id: this.identity.installationId,\n event_type: event,\n properties: enrichedProps,\n timestamp: enrichedProps.timestamp\n }\n }\n\n // Fire and forget - don't block on response\n fetch(`${this.config.host}/v1/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload)\n }).catch(() => {}) // Silent fail\n\n if (this.config.debug) {\n console.log('[Telemetry] Tracked event:', event, enrichedProps)\n }\n } else if (this.config.debug) {\n console.log('[Telemetry] Event (no endpoint):', event, enrichedProps)\n }\n\n } catch (error) {\n // Silent fail\n if (this.config.debug) {\n console.error('[Telemetry] Failed to track event:', error)\n }\n }\n }\n\n /**\n * Track installation started\n */\n async trackInstallationStarted(properties?: TelemetryProperties): Promise {\n await this.track('installation_started', properties)\n }\n\n /**\n * Track installation completed\n */\n async trackInstallationCompleted(properties?: TelemetryProperties): Promise {\n await this.track('installation_completed', properties)\n }\n\n /**\n * Track installation failed\n */\n async trackInstallationFailed(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('installation_failed', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track dev server started\n */\n async trackDevServerStarted(properties?: TelemetryProperties): Promise {\n await this.track('dev_server_started', properties)\n }\n\n /**\n * Track page view in admin UI\n */\n async trackPageView(route: string, properties?: TelemetryProperties): Promise {\n await this.track('page_viewed', {\n ...properties,\n route: sanitizeRoute(route)\n })\n }\n\n /**\n * Track error (sanitized)\n */\n async trackError(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('error_occurred', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track plugin activation\n */\n async trackPluginActivated(properties?: TelemetryProperties): Promise {\n await this.track('plugin_activated', properties)\n }\n\n /**\n * Track migration run\n */\n async trackMigrationRun(properties?: TelemetryProperties): Promise {\n await this.track('migration_run', properties)\n }\n\n /**\n * Flush queued events\n */\n private async flushQueue(): Promise {\n if (this.eventQueue.length === 0) return\n\n const queue = [...this.eventQueue]\n this.eventQueue = []\n\n for (const { event, properties } of queue) {\n await this.track(event, properties)\n }\n }\n\n /**\n * Sanitize properties to ensure no PII\n */\n private sanitizeProperties(properties?: TelemetryProperties): TelemetryProperties {\n if (!properties) return {}\n\n const sanitized: TelemetryProperties = {}\n\n for (const [key, value] of Object.entries(properties)) {\n // Skip undefined values\n if (value === undefined) continue\n\n // Sanitize routes\n if (key === 'route' && typeof value === 'string') {\n sanitized[key] = sanitizeRoute(value)\n continue\n }\n\n // Sanitize error messages\n if (key.toLowerCase().includes('error') && typeof value === 'string') {\n sanitized[key] = sanitizeErrorMessage(value)\n continue\n }\n\n // Only allow specific types\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n sanitized[key] = value\n }\n }\n\n return sanitized\n }\n\n /**\n * Get SonicJS version\n */\n private getVersion(): string {\n try {\n // Safe environment access for Cloudflare Workers compatibility\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SONICJS_VERSION || '2.0.0'\n }\n return '2.0.0'\n } catch {\n return 'unknown'\n }\n }\n\n /**\n * Shutdown the telemetry service (no-op for fetch-based telemetry)\n */\n async shutdown(): Promise {\n // No-op - fetch requests are fire and forget\n }\n\n /**\n * Enable telemetry\n */\n enable(): void {\n this.enabled = true\n }\n\n /**\n * Disable telemetry\n */\n disable(): void {\n this.enabled = false\n }\n\n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton instance\nlet telemetryInstance: TelemetryService | null = null\n\n/**\n * Get the telemetry service instance\n */\nexport function getTelemetryService(config?: Partial): TelemetryService {\n if (!telemetryInstance) {\n telemetryInstance = new TelemetryService(config)\n }\n return telemetryInstance\n}\n\n/**\n * Initialize telemetry service\n */\nexport async function initTelemetry(identity: TelemetryIdentity, config?: Partial): Promise {\n const service = getTelemetryService(config)\n await service.initialize(identity)\n return service\n}\n\n/**\n * Create a new installation identity\n */\nexport function createInstallationIdentity(projectName?: string): TelemetryIdentity {\n const installationId = generateInstallationId()\n const identity: TelemetryIdentity = { installationId }\n\n if (projectName) {\n // Generate anonymous project ID\n identity.projectId = generateProjectId(projectName)\n }\n\n return identity\n}\n","/**\n * Route Metadata Service\n *\n * Auto-discovers API routes using Hono's inspectRoutes() and enriches them\n * with metadata from a static registry. Routes without metadata still appear\n * as \"auto-discovered\" — nothing is ever invisible.\n */\n\nimport { inspectRoutes } from 'hono/dev'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RouteMetadata {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented: boolean\n}\n\ninterface RouteMeta {\n description: string\n authentication: boolean\n category: string\n}\n\nexport interface CategoryInfo {\n title: string\n description: string\n icon: string\n}\n\n// ============================================================================\n// App Instance Storage\n// ============================================================================\n\nlet appInstance: any = null\n\nexport function setAppInstance(app: any): void {\n appInstance = app\n}\n\nexport function getAppInstance(): any {\n return appInstance\n}\n\n// ============================================================================\n// Category Information\n// ============================================================================\n\nexport const CATEGORY_INFO: Record = {\n 'Auth': {\n title: 'Authentication',\n description: 'User authentication and authorization endpoints',\n icon: '🔐'\n },\n 'Content': {\n title: 'Content Management',\n description: 'Content creation, retrieval, and management',\n icon: '📝'\n },\n 'Media': {\n title: 'Media Management',\n description: 'File upload, storage, and media operations',\n icon: '🖼️'\n },\n 'Admin': {\n title: 'Admin Interface',\n description: 'Administrative panel and management features',\n icon: '⚙️'\n },\n 'System': {\n title: 'System',\n description: 'Health checks and system information',\n icon: '🔧'\n },\n 'Search': {\n title: 'Search',\n description: 'AI-powered search, full-text search, and analytics',\n icon: '🔍'\n },\n 'API Keys': {\n title: 'API Keys',\n description: 'API key management and authentication',\n icon: '🔑'\n },\n 'Workflow': {\n title: 'Workflow',\n description: 'Content workflow and approval processes',\n icon: '🔄'\n },\n 'Cache': {\n title: 'Cache',\n description: 'Cache management and invalidation',\n icon: '⚡'\n },\n 'Forms': {\n title: 'Forms',\n description: 'Form submissions and management',\n icon: '📋'\n },\n 'Files': {\n title: 'Files',\n description: 'File serving from R2 storage',\n icon: '📁'\n }\n}\n\n// ============================================================================\n// Route Metadata Registry\n// ============================================================================\n\nconst ROUTE_METADATA: Record = {\n // Auth endpoints\n 'POST /auth/login': { description: 'Authenticate user with email and password (returns JWT)', category: 'Auth', authentication: false },\n 'POST /auth/login/form': { description: 'Form-based login (sets session cookie)', category: 'Auth', authentication: false },\n 'POST /auth/register': { description: 'Register a new user account', category: 'Auth', authentication: false },\n 'POST /auth/logout': { description: 'Log out the current user and invalidate session', category: 'Auth', authentication: true },\n 'GET /auth/me': { description: 'Get current authenticated user information', category: 'Auth', authentication: true },\n 'POST /auth/refresh': { description: 'Refresh authentication token', category: 'Auth', authentication: true },\n 'POST /auth/seed-admin': { description: 'Create or reset the admin user account', category: 'Auth', authentication: false },\n 'POST /auth/magic-link/request': { description: 'Request a magic link login email', category: 'Auth', authentication: false },\n 'GET /auth/magic-link/verify': { description: 'Verify magic link token and authenticate', category: 'Auth', authentication: false },\n 'POST /auth/otp/request': { description: 'Request a one-time password via email', category: 'Auth', authentication: false },\n 'POST /auth/otp/verify': { description: 'Verify OTP code and authenticate', category: 'Auth', authentication: false },\n\n // Content endpoints\n 'GET /api/collections': { description: 'List all available collections', category: 'Content', authentication: false },\n 'GET /api/collections/:collection/content': { description: 'Get all content items from a specific collection', category: 'Content', authentication: false },\n 'GET /api/content/:id': { description: 'Get a specific content item by ID', category: 'Content', authentication: false },\n 'POST /api/content': { description: 'Create a new content item', category: 'Content', authentication: true },\n 'PUT /api/content/:id': { description: 'Update an existing content item', category: 'Content', authentication: true },\n 'DELETE /api/content/:id': { description: 'Delete a content item', category: 'Content', authentication: true },\n 'GET /api/content/:id/versions': { description: 'Get version history for a content item', category: 'Content', authentication: true },\n 'POST /api/content/:id/restore/:versionId': { description: 'Restore a content item to a previous version', category: 'Content', authentication: true },\n\n // Media endpoints\n 'GET /api/media': { description: 'List all media files with pagination', category: 'Media', authentication: false },\n 'GET /api/media/:id': { description: 'Get a specific media file by ID', category: 'Media', authentication: false },\n 'POST /api/media/upload': { description: 'Upload a new media file to R2 storage', category: 'Media', authentication: true },\n 'DELETE /api/media/:id': { description: 'Delete a media file from storage', category: 'Media', authentication: true },\n\n // Admin API endpoints\n 'GET /admin/api/stats': { description: 'Get dashboard statistics (collections, content, media, users)', category: 'Admin', authentication: true },\n 'GET /admin/api/storage': { description: 'Get storage usage information', category: 'Admin', authentication: true },\n 'GET /admin/api/activity': { description: 'Get recent activity logs', category: 'Admin', authentication: true },\n 'GET /admin/api/collections': { description: 'List all collections with field counts', category: 'Admin', authentication: true },\n 'POST /admin/api/collections': { description: 'Create a new collection', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id': { description: 'Get a specific collection with its fields', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id': { description: 'Update an existing collection', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id': { description: 'Delete a collection (must be empty)', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id/fields': { description: 'Get fields for a specific collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields': { description: 'Add a field to a collection', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id/fields/:fieldId': { description: 'Update a collection field', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id/fields/:fieldId': { description: 'Remove a field from a collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields/reorder': { description: 'Reorder fields in a collection', category: 'Admin', authentication: true },\n 'GET /admin/api/migrations/status': { description: 'Get database migration status', category: 'Admin', authentication: true },\n 'POST /admin/api/migrations/run': { description: 'Run pending database migrations', category: 'Admin', authentication: true },\n 'GET /admin/api/content': { description: 'List content items with filtering and pagination', category: 'Admin', authentication: true },\n 'GET /admin/api/content/:id': { description: 'Get a content item for admin editing', category: 'Admin', authentication: true },\n 'POST /admin/api/content': { description: 'Create content via admin API', category: 'Admin', authentication: true },\n 'PUT /admin/api/content/:id': { description: 'Update content via admin API', category: 'Admin', authentication: true },\n 'DELETE /admin/api/content/:id': { description: 'Delete content via admin API', category: 'Admin', authentication: true },\n 'GET /admin/api/media': { description: 'List media files for admin management', category: 'Admin', authentication: true },\n 'POST /admin/api/media/upload': { description: 'Upload media via admin interface', category: 'Admin', authentication: true },\n 'DELETE /admin/api/media/:id': { description: 'Delete media via admin interface', category: 'Admin', authentication: true },\n 'GET /admin/api/users': { description: 'List all users', category: 'Admin', authentication: true },\n 'POST /admin/api/users': { description: 'Create a new user', category: 'Admin', authentication: true },\n 'PUT /admin/api/users/:id': { description: 'Update a user', category: 'Admin', authentication: true },\n 'DELETE /admin/api/users/:id': { description: 'Delete a user', category: 'Admin', authentication: true },\n 'GET /admin/api/logs': { description: 'Get application logs with filtering', category: 'Admin', authentication: true },\n 'GET /admin/api/plugins': { description: 'List all registered plugins', category: 'Admin', authentication: true },\n 'POST /admin/api/plugins/:id/toggle': { description: 'Enable or disable a plugin', category: 'Admin', authentication: true },\n 'GET /admin/api/settings': { description: 'Get application settings', category: 'Admin', authentication: true },\n 'PUT /admin/api/settings': { description: 'Update application settings', category: 'Admin', authentication: true },\n 'GET /admin/api/forms': { description: 'List all forms', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id': { description: 'Get form details and submissions', category: 'Admin', authentication: true },\n 'POST /admin/api/forms': { description: 'Create a new form', category: 'Admin', authentication: true },\n 'PUT /admin/api/forms/:id': { description: 'Update a form', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id': { description: 'Delete a form', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id/submissions': { description: 'Get form submissions', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id/submissions/:submissionId': { description: 'Delete a form submission', category: 'Admin', authentication: true },\n\n // Search endpoints\n 'GET /api/search': { description: 'Search content using AI, FTS5, keyword, or hybrid mode', category: 'Search', authentication: false },\n 'POST /api/search/click': { description: 'Track a search result click for analytics', category: 'Search', authentication: false },\n 'GET /admin/plugins/ai-search/api/status': { description: 'Get search plugin status and configuration', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index': { description: 'Trigger content indexing for search', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index/reset': { description: 'Reset the search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics': { description: 'Get search analytics and metrics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/queries': { description: 'Get top search queries', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/clicks': { description: 'Get click-through analytics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/fts5/status': { description: 'Get FTS5 full-text search status', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/fts5/rebuild': { description: 'Rebuild the FTS5 search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/facets': { description: 'Get available search facets', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments': { description: 'List search A/B test experiments', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments': { description: 'Create a search A/B test experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id': { description: 'Get experiment details', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/experiments/:id': { description: 'Update an experiment', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/experiments/:id': { description: 'Delete an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/start': { description: 'Start an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/stop': { description: 'Stop a running experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id/results': { description: 'Get experiment results and statistics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality': { description: 'Get search quality agent analysis', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/run': { description: 'Run search quality analysis', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality/recommendations': { description: 'Get quality improvement recommendations', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/apply': { description: 'Apply a quality recommendation', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/dismiss': { description: 'Dismiss a quality recommendation', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/synonyms': { description: 'List search synonyms', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/synonyms': { description: 'Add a search synonym', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/synonyms/:id': { description: 'Delete a search synonym', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/query-rules': { description: 'List search query rules', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/query-rules': { description: 'Create a query rule', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/query-rules/:id': { description: 'Update a query rule', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/query-rules/:id': { description: 'Delete a query rule', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/settings': { description: 'Get search plugin settings', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/settings': { description: 'Update search plugin settings', category: 'Search', authentication: true },\n\n // API Key endpoints\n 'GET /admin/api-keys/api/keys': { description: 'List all API keys', category: 'API Keys', authentication: true },\n 'POST /admin/api-keys/api/keys': { description: 'Create a new API key', category: 'API Keys', authentication: true },\n 'DELETE /admin/api-keys/api/keys/:id': { description: 'Revoke an API key', category: 'API Keys', authentication: true },\n 'PUT /admin/api-keys/api/keys/:id': { description: 'Update an API key', category: 'API Keys', authentication: true },\n\n // Cache endpoints\n 'GET /admin/cache/api/stats': { description: 'Get cache statistics', category: 'Cache', authentication: true },\n 'POST /admin/cache/api/purge': { description: 'Purge cache entries', category: 'Cache', authentication: true },\n 'GET /admin/cache/api/entries': { description: 'List cache entries', category: 'Cache', authentication: true },\n 'DELETE /admin/cache/api/entries/:key': { description: 'Delete a specific cache entry', category: 'Cache', authentication: true },\n\n // Workflow endpoints\n 'GET /workflow/status/:id': { description: 'Get workflow status for a content item', category: 'Workflow', authentication: true },\n 'POST /workflow/submit/:id': { description: 'Submit content for review', category: 'Workflow', authentication: true },\n 'POST /workflow/approve/:id': { description: 'Approve content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/reject/:id': { description: 'Reject content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/publish/:id': { description: 'Publish approved content', category: 'Workflow', authentication: true },\n 'POST /workflow/unpublish/:id': { description: 'Unpublish content', category: 'Workflow', authentication: true },\n 'GET /workflow/history/:id': { description: 'Get workflow history for a content item', category: 'Workflow', authentication: true },\n\n // Form endpoints (public)\n 'POST /forms/:formId/submit': { description: 'Submit a form (public endpoint)', category: 'Forms', authentication: false },\n 'GET /forms/:formId': { description: 'Get form definition for rendering', category: 'Forms', authentication: false },\n 'POST /api/forms/:formId/submit': { description: 'Submit a form via API', category: 'Forms', authentication: false },\n 'GET /api/forms/:formId': { description: 'Get form definition via API', category: 'Forms', authentication: false },\n\n // System endpoints\n 'GET /health': { description: 'Health check endpoint for monitoring', category: 'System', authentication: false },\n 'GET /api/health': { description: 'API health check with schema information', category: 'System', authentication: false },\n 'GET /api': { description: 'API root - returns API information and available endpoints', category: 'System', authentication: false },\n 'GET /api/system/info': { description: 'Get system information and version', category: 'System', authentication: false },\n 'GET /api/system/schema': { description: 'Get database schema information', category: 'System', authentication: false },\n\n // File serving\n 'GET /files/*': { description: 'Serve files from R2 storage (public access)', category: 'Files', authentication: false },\n\n // Database tools\n 'POST /admin/database-tools/api/query': { description: 'Execute a database query', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables': { description: 'List database tables', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables/:name': { description: 'Get table schema and sample data', category: 'Admin', authentication: true },\n\n // Seed data\n 'POST /admin/seed-data/api/generate': { description: 'Generate seed data for development', category: 'Admin', authentication: true },\n 'GET /admin/seed-data/api/status': { description: 'Get seed data generation status', category: 'Admin', authentication: true },\n\n // Email plugin\n 'POST /admin/plugins/email/api/send': { description: 'Send an email', category: 'Admin', authentication: true },\n 'GET /admin/plugins/email/api/templates': { description: 'List email templates', category: 'Admin', authentication: true },\n 'POST /admin/plugins/email/api/test': { description: 'Send a test email', category: 'Admin', authentication: true },\n}\n\n// ============================================================================\n// Whitelist Patterns for API routes\n// ============================================================================\n\nconst INCLUDED_ROUTE_PATTERNS: RegExp[] = [\n /^\\/api\\//, // All /api/* routes\n /^\\/api$/, // API root\n /^\\/auth\\/(?!login$|register$)/, // Auth routes except GET login/register HTML pages\n /^\\/auth\\/login$/, // POST /auth/login (method filtered later)\n /^\\/auth\\/register$/, // POST /auth/register (method filtered later)\n /^\\/admin\\/api\\//, // Admin API endpoints\n /^\\/admin\\/api-keys\\/api\\//, // API key management\n /^\\/admin\\/cache\\/api\\//, // Cache management API\n /^\\/admin\\/plugins\\/.*\\/api\\//, // Plugin API endpoints\n /^\\/admin\\/database-tools\\/api\\//, // Database tools API\n /^\\/admin\\/seed-data\\/api\\//, // Seed data API\n /^\\/workflow\\//, // Workflow endpoints\n /^\\/health$/, // Health check\n /^\\/files\\//, // File serving\n /^\\/forms\\//, // Public form endpoints\n]\n\n// Routes to always exclude (even if they match an include pattern)\nconst EXCLUDED_ROUTES = new Set([\n 'GET /auth/login',\n 'GET /auth/register',\n 'GET /auth/login/form',\n])\n\n// ============================================================================\n// Route Discovery\n// ============================================================================\n\nlet cachedRouteList: RouteMetadata[] | null = null\n\nfunction isIncludedRoute(method: string, path: string): boolean {\n // Check exclusions first\n const key = `${method} ${path}`\n if (EXCLUDED_ROUTES.has(key)) {\n return false\n }\n\n // Check if the path matches any include pattern\n return INCLUDED_ROUTE_PATTERNS.some(pattern => pattern.test(path))\n}\n\nfunction inferCategory(path: string): string {\n if (path.startsWith('/auth/')) return 'Auth'\n if (path.startsWith('/api/search')) return 'Search'\n if (path.startsWith('/api/media')) return 'Media'\n if (path.startsWith('/api/system')) return 'System'\n if (path.startsWith('/api/content') || path.startsWith('/api/collections')) return 'Content'\n if (path.startsWith('/api/forms')) return 'Forms'\n if (path.startsWith('/admin/api-keys')) return 'API Keys'\n if (path.startsWith('/admin/cache')) return 'Cache'\n if (path.startsWith('/admin/plugins/ai-search')) return 'Search'\n if (path.startsWith('/admin/api')) return 'Admin'\n if (path.startsWith('/admin/database-tools')) return 'Admin'\n if (path.startsWith('/admin/seed-data')) return 'Admin'\n if (path.startsWith('/admin/plugins/email')) return 'Admin'\n if (path.startsWith('/workflow/')) return 'Workflow'\n if (path.startsWith('/forms/')) return 'Forms'\n if (path.startsWith('/files/')) return 'Files'\n if (path === '/health' || path.startsWith('/api')) return 'System'\n return 'Other'\n}\n\nfunction inferAuth(path: string): boolean | 'unknown' {\n // Known public routes\n if (path === '/health' || path === '/api' || path === '/api/health') return false\n if (path === '/api/system/info' || path === '/api/system/schema') return false\n if (path.startsWith('/files/')) return false\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/')) return false\n\n // Admin routes require auth\n if (path.startsWith('/admin/')) return true\n if (path.startsWith('/workflow/')) return true\n\n return 'unknown'\n}\n\nexport function buildRouteList(app: any): RouteMetadata[] {\n if (cachedRouteList) return cachedRouteList\n\n if (!app) return []\n\n try {\n const routes = inspectRoutes(app as any)\n\n // Deduplicate and filter\n const seen = new Set()\n const result: RouteMetadata[] = []\n\n for (const route of routes) {\n // Skip middleware entries\n if (route.isMiddleware) continue\n // Skip ALL method (middleware-like catch-all)\n if (route.method === 'ALL') continue\n\n const key = `${route.method} ${route.path}`\n\n // Skip duplicates\n if (seen.has(key)) continue\n seen.add(key)\n\n // Apply whitelist filter\n if (!isIncludedRoute(route.method, route.path)) continue\n\n // Look up metadata\n const meta = ROUTE_METADATA[key]\n\n if (meta) {\n result.push({\n method: route.method,\n path: route.path,\n description: meta.description,\n authentication: meta.authentication,\n category: meta.category,\n documented: true\n })\n } else {\n // Auto-discovered: infer category and auth\n result.push({\n method: route.method,\n path: route.path,\n description: '',\n authentication: inferAuth(route.path),\n category: inferCategory(route.path),\n documented: false\n })\n }\n }\n\n // Sort: by category, then method order, then path\n const methodOrder: Record = { GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4 }\n result.sort((a, b) => {\n const catCmp = a.category.localeCompare(b.category)\n if (catCmp !== 0) return catCmp\n const methCmp = (methodOrder[a.method] ?? 5) - (methodOrder[b.method] ?? 5)\n if (methCmp !== 0) return methCmp\n return a.path.localeCompare(b.path)\n })\n\n cachedRouteList = result\n return result\n } catch (error) {\n console.error('Failed to inspect routes:', error)\n return []\n }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-7KR6GOY3.cjs b/packages/core/dist/chunk-ICMNCCX2.cjs similarity index 99% rename from packages/core/dist/chunk-7KR6GOY3.cjs rename to packages/core/dist/chunk-ICMNCCX2.cjs index a8bffd41a..283169f9d 100644 --- a/packages/core/dist/chunk-7KR6GOY3.cjs +++ b/packages/core/dist/chunk-ICMNCCX2.cjs @@ -2215,5 +2215,5 @@ var MigrationService = class { }; exports.MigrationService = MigrationService; -//# sourceMappingURL=chunk-7KR6GOY3.cjs.map -//# sourceMappingURL=chunk-7KR6GOY3.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-ICMNCCX2.cjs.map +//# sourceMappingURL=chunk-ICMNCCX2.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-7KR6GOY3.cjs.map b/packages/core/dist/chunk-ICMNCCX2.cjs.map similarity index 99% rename from packages/core/dist/chunk-7KR6GOY3.cjs.map rename to packages/core/dist/chunk-ICMNCCX2.cjs.map index 31e41d43f..d806d878e 100644 --- a/packages/core/dist/chunk-7KR6GOY3.cjs.map +++ b/packages/core/dist/chunk-ICMNCCX2.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/db/migrations-bundle.ts","../src/services/migrations.ts"],"names":["hasUserProfilesTable"],"mappings":"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","file":"chunk-7KR6GOY3.cjs","sourcesContent":["/**\n * AUTO-GENERATED FILE - DO NOT EDIT\n * Generated by: scripts/generate-migrations.ts\n * Generated at: 2026-05-01T00:32:37.853Z\n *\n * This file contains all migration SQL bundled for use in Cloudflare Workers\n * where filesystem access is not available at runtime.\n */\n\nexport interface BundledMigration {\n id: string\n name: string\n filename: string\n description: string\n sql: string\n}\n\nexport const bundledMigrations: BundledMigration[] = [\n {\n id: '001',\n name: 'Initial Schema',\n filename: '001_initial_schema.sql',\n description: 'Migration 001: Initial Schema',\n sql: \"-- Initial schema for SonicJS AI\\n-- Create users table for authentication\\nCREATE TABLE IF NOT EXISTS users (\\n id TEXT PRIMARY KEY,\\n email TEXT NOT NULL UNIQUE,\\n username TEXT NOT NULL UNIQUE,\\n first_name TEXT NOT NULL,\\n last_name TEXT NOT NULL,\\n password_hash TEXT,\\n role TEXT NOT NULL DEFAULT 'viewer',\\n avatar TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n last_login_at INTEGER,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create collections table for content schema definitions\\nCREATE TABLE IF NOT EXISTS collections (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n schema TEXT NOT NULL, -- JSON schema definition\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content table for actual content data\\nCREATE TABLE IF NOT EXISTS content (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n slug TEXT NOT NULL,\\n title TEXT NOT NULL,\\n data TEXT NOT NULL, -- JSON content data\\n status TEXT NOT NULL DEFAULT 'draft',\\n published_at INTEGER,\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content_versions table for versioning\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n version INTEGER NOT NULL,\\n data TEXT NOT NULL, -- JSON data\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create media/files table with comprehensive R2 integration\\nCREATE TABLE IF NOT EXISTS media (\\n id TEXT PRIMARY KEY,\\n filename TEXT NOT NULL,\\n original_name TEXT NOT NULL,\\n mime_type TEXT NOT NULL,\\n size INTEGER NOT NULL,\\n width INTEGER,\\n height INTEGER,\\n folder TEXT NOT NULL DEFAULT 'uploads',\\n r2_key TEXT NOT NULL, -- R2 storage key\\n public_url TEXT NOT NULL, -- CDN URL\\n thumbnail_url TEXT, -- Cloudflare Images URL\\n alt TEXT,\\n caption TEXT,\\n tags TEXT, -- JSON array of tags\\n uploaded_by TEXT NOT NULL REFERENCES users(id),\\n uploaded_at INTEGER NOT NULL,\\n updated_at INTEGER,\\n published_at INTEGER,\\n scheduled_at INTEGER,\\n archived_at INTEGER,\\n deleted_at INTEGER\\n);\\n\\n-- Create API tokens table for programmatic access\\nCREATE TABLE IF NOT EXISTS api_tokens (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n permissions TEXT NOT NULL, -- JSON array of permissions\\n expires_at INTEGER,\\n last_used_at INTEGER,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create workflow history table for content workflow tracking\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n action TEXT NOT NULL,\\n from_status TEXT NOT NULL,\\n to_status TEXT NOT NULL,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n comment TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\\nCREATE INDEX IF NOT EXISTS idx_users_username ON users(username);\\nCREATE INDEX IF NOT EXISTS idx_users_role ON users(role);\\n\\nCREATE INDEX IF NOT EXISTS idx_collections_name ON collections(name);\\nCREATE INDEX IF NOT EXISTS idx_collections_active ON collections(is_active);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_collection ON content(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_author ON content(author_id);\\nCREATE INDEX IF NOT EXISTS idx_content_status ON content(status);\\nCREATE INDEX IF NOT EXISTS idx_content_published ON content(published_at);\\nCREATE INDEX IF NOT EXISTS idx_content_slug ON content(slug);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_version ON content_versions(version);\\n\\nCREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);\\nCREATE INDEX IF NOT EXISTS idx_media_type ON media(mime_type);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_by ON media(uploaded_by);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_at ON media(uploaded_at);\\nCREATE INDEX IF NOT EXISTS idx_media_deleted ON media(deleted_at);\\n\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_user ON api_tokens(user_id);\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_token ON api_tokens(token);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_user ON workflow_history(user_id);\\n\\n-- Note: Admin user is created via the seed script with user-provided credentials\\n-- Run 'npm run seed' after migrations to create the admin user\\n\\n-- Insert sample collections\\nINSERT OR IGNORE INTO collections (\\n id, name, display_name, description, schema, \\n is_active, created_at, updated_at\\n) VALUES (\\n 'blog-posts-collection',\\n 'blog_posts',\\n 'Blog Posts',\\n 'Blog post content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"excerpt\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Excerpt\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"},\\\"tags\\\":{\\\"type\\\":\\\"array\\\",\\\"title\\\":\\\"Tags\\\",\\\"items\\\":{\\\"type\\\":\\\"string\\\"}},\\\"status\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Status\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"],\\\"default\\\":\\\"draft\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'pages-collection',\\n 'pages',\\n 'Pages',\\n 'Static page content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"slug\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Slug\\\"},\\\"meta_description\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Meta Description\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'news-collection',\\n 'news',\\n 'News',\\n 'News article content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"publish_date\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Publish Date\\\",\\\"format\\\":\\\"date\\\"},\\\"author\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Author\\\"},\\\"category\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Category\\\",\\\"enum\\\":[\\\"technology\\\",\\\"business\\\",\\\"general\\\"]}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Note: Sample content can be created via the admin interface after the admin user is seeded\"\n },\n {\n id: '002',\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql',\n description: 'Migration 002: Faq Plugin',\n sql: \"-- FAQ Plugin Migration (DEPRECATED - Now managed by third-party plugin)\\n-- Creates FAQ table for the FAQ plugin\\n-- NOTE: This migration is kept for historical purposes. \\n-- The FAQ functionality is now provided by the faq-plugin third-party plugin.\\n\\nCREATE TABLE IF NOT EXISTS faqs (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n question TEXT NOT NULL,\\n answer TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_faqs_category ON faqs(category);\\nCREATE INDEX IF NOT EXISTS idx_faqs_published ON faqs(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_faqs_sort_order ON faqs(sortOrder);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS faqs_updated_at\\n AFTER UPDATE ON faqs\\nBEGIN\\n UPDATE faqs SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert sample FAQ data\\nINSERT OR IGNORE INTO faqs (question, answer, category, tags, isPublished, sortOrder) VALUES \\n('What is SonicJS AI?', \\n'SonicJS AI is a modern, TypeScript-first headless CMS built for Cloudflare''s edge platform. It provides a complete content management system with admin interface, API endpoints, and plugin architecture.',\\n'general',\\n'sonicjs, cms, cloudflare',\\n1,\\n1),\\n\\n('How do I get started with SonicJS AI?',\\n'To get started: 1) Clone the repository, 2) Install dependencies with npm install, 3) Set up your Cloudflare account and services, 4) Run the development server with npm run dev, 5) Access the admin interface at /admin.',\\n'general',\\n'getting-started, setup',\\n1,\\n2),\\n\\n('What technologies does SonicJS AI use?',\\n'SonicJS AI is built with: TypeScript for type safety, Hono.js as the web framework, Cloudflare D1 for the database, Cloudflare R2 for media storage, Cloudflare Workers for serverless execution, and Tailwind CSS for styling.',\\n'technical',\\n'technology-stack, typescript, cloudflare',\\n1,\\n3),\\n\\n('How do I create content in SonicJS AI?',\\n'Content creation is done through the admin interface. Navigate to /admin, log in with your credentials, go to Content section, select a collection, and click \\\"New Content\\\" to create articles, pages, or other content types.',\\n'general',\\n'content-creation, admin',\\n1,\\n4),\\n\\n('Is SonicJS AI free to use?',\\n'SonicJS AI is open source and free to use. You only pay for the Cloudflare services you consume (D1 database, R2 storage, Workers execution time). Cloudflare offers generous free tiers for development and small projects.',\\n'billing',\\n'pricing, open-source, cloudflare',\\n1,\\n5),\\n\\n('How do I add custom functionality?',\\n'SonicJS AI features a plugin system that allows you to extend functionality. You can create plugins using the PluginBuilder API, add custom routes, models, admin pages, and integrate with external services.',\\n'technical',\\n'plugins, customization, development',\\n1,\\n6),\\n\\n('Can I customize the admin interface?',\\n'Yes! The admin interface is built with TypeScript templates and can be customized. You can modify existing templates, create new components, add custom pages, and integrate your own styling while maintaining the dark theme.',\\n'technical',\\n'admin-interface, customization, templates',\\n1,\\n7),\\n\\n('How does authentication work?',\\n'SonicJS AI includes a built-in authentication system with JWT tokens, role-based access control (admin, editor, viewer), secure password hashing, and session management. Users can be managed through the admin interface.',\\n'technical',\\n'authentication, security, users',\\n1,\\n8);\"\n },\n {\n id: '003',\n name: 'Stage5 Enhancements',\n filename: '003_stage5_enhancements.sql',\n description: 'Migration 003: Stage5 Enhancements',\n sql: \"-- Stage 5: Advanced Content Management enhancements\\n-- Add scheduling and workflow features to content table\\n\\n-- Add content scheduling columns\\nALTER TABLE content ADD COLUMN scheduled_publish_at INTEGER;\\nALTER TABLE content ADD COLUMN scheduled_unpublish_at INTEGER;\\n\\n-- Add workflow and review columns\\nALTER TABLE content ADD COLUMN review_status TEXT DEFAULT 'none'; -- none, pending, approved, rejected\\nALTER TABLE content ADD COLUMN reviewer_id TEXT REFERENCES users(id);\\nALTER TABLE content ADD COLUMN reviewed_at INTEGER;\\nALTER TABLE content ADD COLUMN review_notes TEXT;\\n\\n-- Add content metadata\\nALTER TABLE content ADD COLUMN meta_title TEXT;\\nALTER TABLE content ADD COLUMN meta_description TEXT;\\nALTER TABLE content ADD COLUMN featured_image_id TEXT REFERENCES media(id);\\nALTER TABLE content ADD COLUMN content_type TEXT DEFAULT 'standard'; -- standard, template, component\\n\\n-- Create content_fields table for dynamic field definitions\\nCREATE TABLE IF NOT EXISTS content_fields (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n field_name TEXT NOT NULL,\\n field_type TEXT NOT NULL, -- text, richtext, number, boolean, date, select, media, relationship\\n field_label TEXT NOT NULL,\\n field_options TEXT, -- JSON for select options, validation rules, etc.\\n field_order INTEGER NOT NULL DEFAULT 0,\\n is_required INTEGER NOT NULL DEFAULT 0,\\n is_searchable INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(collection_id, field_name)\\n);\\n\\n-- Create content_relationships table for content relationships\\nCREATE TABLE IF NOT EXISTS content_relationships (\\n id TEXT PRIMARY KEY,\\n source_content_id TEXT NOT NULL REFERENCES content(id),\\n target_content_id TEXT NOT NULL REFERENCES content(id),\\n relationship_type TEXT NOT NULL, -- references, tags, categories\\n created_at INTEGER NOT NULL,\\n UNIQUE(source_content_id, target_content_id, relationship_type)\\n);\\n\\n-- Create workflow_templates table for reusable workflows\\nCREATE TABLE IF NOT EXISTS workflow_templates (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT REFERENCES collections(id), -- null means applies to all collections\\n workflow_steps TEXT NOT NULL, -- JSON array of workflow steps\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Add indexes for new columns\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_unpublish ON content(scheduled_unpublish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_review_status ON content(review_status);\\nCREATE INDEX IF NOT EXISTS idx_content_reviewer ON content(reviewer_id);\\nCREATE INDEX IF NOT EXISTS idx_content_content_type ON content(content_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_fields_collection ON content_fields(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_name ON content_fields(field_name);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_type ON content_fields(field_type);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_order ON content_fields(field_order);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_source ON content_relationships(source_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_target ON content_relationships(target_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_type ON content_relationships(relationship_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_collection ON workflow_templates(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_active ON workflow_templates(is_active);\\n\\n-- Insert default workflow template\\nINSERT OR IGNORE INTO workflow_templates (\\n id, name, description, workflow_steps, is_active, created_at, updated_at\\n) VALUES (\\n 'default-content-workflow',\\n 'Default Content Workflow',\\n 'Standard content workflow: Draft → Review → Published',\\n '[\\n {\\\"step\\\": \\\"draft\\\", \\\"name\\\": \\\"Draft\\\", \\\"description\\\": \\\"Content is being created\\\", \\\"permissions\\\": [\\\"author\\\", \\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"review\\\", \\\"name\\\": \\\"Under Review\\\", \\\"description\\\": \\\"Content is pending review\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"published\\\", \\\"name\\\": \\\"Published\\\", \\\"description\\\": \\\"Content is live\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"archived\\\", \\\"name\\\": \\\"Archived\\\", \\\"description\\\": \\\"Content is archived\\\", \\\"permissions\\\": [\\\"admin\\\"]}\\n ]',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Insert enhanced field definitions for existing collections\\nINSERT OR IGNORE INTO content_fields (\\n id, collection_id, field_name, field_type, field_label, field_options, field_order, is_required, is_searchable, created_at, updated_at\\n) VALUES \\n-- Blog Posts fields\\n('blog-title-field', 'blog-posts-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter blog post title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-content-field', 'blog-posts-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-excerpt-field', 'blog-posts-collection', 'excerpt', 'text', 'Excerpt', '{\\\"maxLength\\\": 500, \\\"rows\\\": 3, \\\"placeholder\\\": \\\"Brief description of the post\\\"}', 3, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-tags-field', 'blog-posts-collection', 'tags', 'select', 'Tags', '{\\\"multiple\\\": true, \\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"tutorial\\\", \\\"news\\\", \\\"update\\\"], \\\"allowCustom\\\": true}', 4, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-image-field', 'blog-posts-collection', 'featured_image', 'media', 'Featured Image', '{\\\"accept\\\": \\\"image/*\\\", \\\"maxSize\\\": \\\"5MB\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-publish-date-field', 'blog-posts-collection', 'publish_date', 'date', 'Publish Date', '{\\\"format\\\": \\\"YYYY-MM-DD\\\", \\\"defaultToday\\\": true}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-field', 'blog-posts-collection', 'is_featured', 'boolean', 'Featured Post', '{\\\"default\\\": false}', 7, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- Pages fields\\n('pages-title-field', 'pages-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter page title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-content-field', 'pages-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 500}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-slug-field', 'pages-collection', 'slug', 'text', 'URL Slug', '{\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\"}', 3, 1, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-meta-desc-field', 'pages-collection', 'meta_description', 'text', 'Meta Description', '{\\\"maxLength\\\": 160, \\\"rows\\\": 2, \\\"placeholder\\\": \\\"SEO description for search engines\\\"}', 4, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-template-field', 'pages-collection', 'template', 'select', 'Page Template', '{\\\"options\\\": [\\\"default\\\", \\\"landing\\\", \\\"contact\\\", \\\"about\\\"], \\\"default\\\": \\\"default\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- News fields\\n('news-title-field', 'news-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter news title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-content-field', 'news-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"news\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-category-field', 'news-collection', 'category', 'select', 'Category', '{\\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"politics\\\", \\\"sports\\\", \\\"entertainment\\\", \\\"health\\\"], \\\"required\\\": true}', 3, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-author-field', 'news-collection', 'author', 'text', 'Author', '{\\\"placeholder\\\": \\\"Author name\\\"}', 4, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-source-field', 'news-collection', 'source', 'text', 'Source', '{\\\"placeholder\\\": \\\"News source\\\"}', 5, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-priority-field', 'news-collection', 'priority', 'select', 'Priority', '{\\\"options\\\": [\\\"low\\\", \\\"normal\\\", \\\"high\\\", \\\"breaking\\\"], \\\"default\\\": \\\"normal\\\"}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000);\"\n },\n {\n id: '004',\n name: 'Stage6 User Management',\n filename: '004_stage6_user_management.sql',\n description: 'Migration 004: Stage6 User Management',\n sql: \"-- Stage 6: User Management & Permissions enhancements\\n-- Enhanced user system with profiles, teams, permissions, and activity logging\\n\\n-- Add user profile and preferences columns\\nALTER TABLE users ADD COLUMN phone TEXT;\\nALTER TABLE users ADD COLUMN bio TEXT;\\nALTER TABLE users ADD COLUMN avatar_url TEXT;\\nALTER TABLE users ADD COLUMN timezone TEXT DEFAULT 'UTC';\\nALTER TABLE users ADD COLUMN language TEXT DEFAULT 'en';\\nALTER TABLE users ADD COLUMN email_notifications INTEGER DEFAULT 1;\\nALTER TABLE users ADD COLUMN theme TEXT DEFAULT 'dark';\\nALTER TABLE users ADD COLUMN two_factor_enabled INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN two_factor_secret TEXT;\\nALTER TABLE users ADD COLUMN password_reset_token TEXT;\\nALTER TABLE users ADD COLUMN password_reset_expires INTEGER;\\nALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN email_verification_token TEXT;\\nALTER TABLE users ADD COLUMN invitation_token TEXT;\\nALTER TABLE users ADD COLUMN invited_by TEXT REFERENCES users(id);\\nALTER TABLE users ADD COLUMN invited_at INTEGER;\\nALTER TABLE users ADD COLUMN accepted_invitation_at INTEGER;\\n\\n-- Create teams table for team-based collaboration\\nCREATE TABLE IF NOT EXISTS teams (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n slug TEXT NOT NULL UNIQUE,\\n owner_id TEXT NOT NULL REFERENCES users(id),\\n settings TEXT, -- JSON for team settings\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create team memberships table\\nCREATE TABLE IF NOT EXISTS team_memberships (\\n id TEXT PRIMARY KEY,\\n team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n role TEXT NOT NULL DEFAULT 'member', -- owner, admin, editor, member, viewer\\n permissions TEXT, -- JSON for specific permissions\\n joined_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(team_id, user_id)\\n);\\n\\n-- Create permissions table for granular access control\\nCREATE TABLE IF NOT EXISTS permissions (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n description TEXT,\\n category TEXT NOT NULL, -- content, users, collections, media, settings\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create role permissions mapping\\nCREATE TABLE IF NOT EXISTS role_permissions (\\n id TEXT PRIMARY KEY,\\n role TEXT NOT NULL,\\n permission_id TEXT NOT NULL REFERENCES permissions(id),\\n created_at INTEGER NOT NULL,\\n UNIQUE(role, permission_id)\\n);\\n\\n-- Create user sessions table for better session management\\nCREATE TABLE IF NOT EXISTS user_sessions (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n token_hash TEXT NOT NULL,\\n ip_address TEXT,\\n user_agent TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n expires_at INTEGER NOT NULL,\\n created_at INTEGER NOT NULL,\\n last_used_at INTEGER\\n);\\n\\n-- Create activity log table for audit trails\\nCREATE TABLE IF NOT EXISTS activity_logs (\\n id TEXT PRIMARY KEY,\\n user_id TEXT REFERENCES users(id),\\n action TEXT NOT NULL,\\n resource_type TEXT, -- users, content, collections, media, etc.\\n resource_id TEXT,\\n details TEXT, -- JSON with additional details\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create password history table for security\\nCREATE TABLE IF NOT EXISTS password_history (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n password_hash TEXT NOT NULL,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Insert default permissions\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at) VALUES\\n ('perm_content_create', 'content.create', 'Create new content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_read', 'content.read', 'View content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_update', 'content.update', 'Edit existing content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_delete', 'content.delete', 'Delete content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_publish', 'content.publish', 'Publish/unpublish content', 'content', strftime('%s', 'now') * 1000),\\n \\n ('perm_collections_create', 'collections.create', 'Create new collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_read', 'collections.read', 'View collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_update', 'collections.update', 'Edit collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_delete', 'collections.delete', 'Delete collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_fields', 'collections.fields', 'Manage collection fields', 'collections', strftime('%s', 'now') * 1000),\\n \\n ('perm_media_upload', 'media.upload', 'Upload media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_read', 'media.read', 'View media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_update', 'media.update', 'Edit media metadata', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_delete', 'media.delete', 'Delete media files', 'media', strftime('%s', 'now') * 1000),\\n \\n ('perm_users_create', 'users.create', 'Invite new users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_read', 'users.read', 'View user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_update', 'users.update', 'Edit user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_delete', 'users.delete', 'Deactivate users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_roles', 'users.roles', 'Manage user roles', 'users', strftime('%s', 'now') * 1000),\\n \\n ('perm_settings_read', 'settings.read', 'View system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_settings_update', 'settings.update', 'Modify system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_activity_read', 'activity.read', 'View activity logs', 'settings', strftime('%s', 'now') * 1000);\\n\\n-- Assign permissions to default roles\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at) VALUES\\n -- Admin has all permissions\\n ('rp_admin_content_create', 'admin', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_read', 'admin', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_update', 'admin', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_delete', 'admin', 'perm_content_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_publish', 'admin', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_create', 'admin', 'perm_collections_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_read', 'admin', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_update', 'admin', 'perm_collections_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_delete', 'admin', 'perm_collections_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_fields', 'admin', 'perm_collections_fields', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_upload', 'admin', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_read', 'admin', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_update', 'admin', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_delete', 'admin', 'perm_media_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_create', 'admin', 'perm_users_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_read', 'admin', 'perm_users_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_update', 'admin', 'perm_users_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_delete', 'admin', 'perm_users_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_roles', 'admin', 'perm_users_roles', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_read', 'admin', 'perm_settings_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_update', 'admin', 'perm_settings_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_activity_read', 'admin', 'perm_activity_read', strftime('%s', 'now') * 1000),\\n \\n -- Editor permissions\\n ('rp_editor_content_create', 'editor', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_read', 'editor', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_update', 'editor', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_publish', 'editor', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_editor_collections_read', 'editor', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_upload', 'editor', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_read', 'editor', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_update', 'editor', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_users_read', 'editor', 'perm_users_read', strftime('%s', 'now') * 1000),\\n \\n -- Viewer permissions\\n ('rp_viewer_content_read', 'viewer', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_collections_read', 'viewer', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_media_read', 'viewer', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_users_read', 'viewer', 'perm_users_read', strftime('%s', 'now') * 1000);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_team_id ON team_memberships(team_id);\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_user_id ON team_memberships(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_user_id ON user_sessions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_token_hash ON user_sessions(token_hash);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_user_id ON activity_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_created_at ON activity_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_resource ON activity_logs(resource_type, resource_id);\\nCREATE INDEX IF NOT EXISTS idx_password_history_user_id ON password_history(user_id);\\nCREATE INDEX IF NOT EXISTS idx_users_email_verification_token ON users(email_verification_token);\\nCREATE INDEX IF NOT EXISTS idx_users_password_reset_token ON users(password_reset_token);\\nCREATE INDEX IF NOT EXISTS idx_users_invitation_token ON users(invitation_token);\"\n },\n {\n id: '005',\n name: 'Stage7 Workflow Automation',\n filename: '005_stage7_workflow_automation.sql',\n description: 'Migration 005: Stage7 Workflow Automation',\n sql: \"-- Stage 7: Workflow & Automation Migration\\n-- This migration adds workflow and automation capabilities to SonicJS\\n\\n-- Workflow States Table\\nCREATE TABLE IF NOT EXISTS workflow_states (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n color TEXT DEFAULT '#6B7280',\\n is_initial INTEGER DEFAULT 0,\\n is_final INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Insert default workflow states\\nINSERT OR IGNORE INTO workflow_states (id, name, description, color, is_initial, is_final) VALUES\\n('draft', 'Draft', 'Content is being worked on', '#F59E0B', 1, 0),\\n('pending-review', 'Pending Review', 'Content is waiting for review', '#3B82F6', 0, 0),\\n('approved', 'Approved', 'Content has been approved', '#10B981', 0, 0),\\n('published', 'Published', 'Content is live', '#059669', 0, 1),\\n('rejected', 'Rejected', 'Content was rejected', '#EF4444', 0, 1),\\n('archived', 'Archived', 'Content has been archived', '#6B7280', 0, 1);\\n\\n-- Workflows Table\\nCREATE TABLE IF NOT EXISTS workflows (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT,\\n is_active INTEGER DEFAULT 1,\\n auto_publish INTEGER DEFAULT 0,\\n require_approval INTEGER DEFAULT 1,\\n approval_levels INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\\n);\\n\\n-- Workflow Transitions Table\\nCREATE TABLE IF NOT EXISTS workflow_transitions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT NOT NULL,\\n to_state_id TEXT NOT NULL,\\n required_permission TEXT,\\n auto_transition INTEGER DEFAULT 0,\\n transition_conditions TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE,\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id)\\n);\\n\\n-- Content Workflow Status Table\\nCREATE TABLE IF NOT EXISTS content_workflow_status (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n current_state_id TEXT NOT NULL,\\n assigned_to TEXT,\\n due_date DATETIME,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (current_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (assigned_to) REFERENCES users(id),\\n UNIQUE(content_id, workflow_id)\\n);\\n\\n-- Workflow History Table\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT,\\n to_state_id TEXT NOT NULL,\\n user_id TEXT NOT NULL,\\n comment TEXT,\\n metadata TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Scheduled Content Table\\nCREATE TABLE IF NOT EXISTS scheduled_content (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n action TEXT NOT NULL, -- 'publish', 'unpublish', 'archive'\\n scheduled_at DATETIME NOT NULL,\\n timezone TEXT DEFAULT 'UTC',\\n user_id TEXT NOT NULL,\\n status TEXT DEFAULT 'pending', -- 'pending', 'completed', 'failed', 'cancelled'\\n executed_at DATETIME,\\n error_message TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Notifications Table\\nCREATE TABLE IF NOT EXISTS notifications (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n type TEXT NOT NULL, -- 'workflow', 'schedule', 'system'\\n title TEXT NOT NULL,\\n message TEXT NOT NULL,\\n data TEXT, -- JSON\\n is_read INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\\n);\\n\\n-- Notification Preferences Table\\nCREATE TABLE IF NOT EXISTS notification_preferences (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n notification_type TEXT NOT NULL,\\n email_enabled INTEGER DEFAULT 1,\\n in_app_enabled INTEGER DEFAULT 1,\\n digest_frequency TEXT DEFAULT 'daily', -- 'immediate', 'hourly', 'daily', 'weekly'\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\\n UNIQUE(user_id, notification_type)\\n);\\n\\n-- Webhooks Table\\nCREATE TABLE IF NOT EXISTS webhooks (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n url TEXT NOT NULL,\\n secret TEXT,\\n events TEXT NOT NULL, -- JSON array of event types\\n is_active INTEGER DEFAULT 1,\\n retry_count INTEGER DEFAULT 3,\\n timeout_seconds INTEGER DEFAULT 30,\\n last_success_at DATETIME,\\n last_failure_at DATETIME,\\n failure_count INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Webhook Deliveries Table\\nCREATE TABLE IF NOT EXISTS webhook_deliveries (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n webhook_id TEXT NOT NULL,\\n event_type TEXT NOT NULL,\\n payload TEXT NOT NULL, -- JSON\\n response_status INTEGER,\\n response_body TEXT,\\n attempt_count INTEGER DEFAULT 1,\\n delivered_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE\\n);\\n\\n-- Content Versions Table (for rollback functionality)\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n version_number INTEGER NOT NULL,\\n title TEXT NOT NULL,\\n content TEXT NOT NULL,\\n fields TEXT, -- JSON\\n user_id TEXT NOT NULL,\\n change_summary TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, version_number)\\n);\\n\\n-- Automation Rules Table\\nCREATE TABLE IF NOT EXISTS automation_rules (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n trigger_type TEXT NOT NULL, -- 'content_created', 'content_updated', 'workflow_transition', 'schedule'\\n trigger_conditions TEXT, -- JSON\\n action_type TEXT NOT NULL, -- 'workflow_transition', 'send_notification', 'webhook_call', 'auto_save'\\n action_config TEXT, -- JSON\\n is_active INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Auto-save Drafts Table\\nCREATE TABLE IF NOT EXISTS auto_save_drafts (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT,\\n user_id TEXT NOT NULL,\\n title TEXT,\\n content TEXT,\\n fields TEXT, -- JSON\\n last_saved_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, user_id)\\n);\\n\\n-- Add workflow-related columns to existing content table (skip existing columns)\\nALTER TABLE content ADD COLUMN workflow_state_id TEXT DEFAULT 'draft';\\nALTER TABLE content ADD COLUMN embargo_until DATETIME;\\nALTER TABLE content ADD COLUMN expires_at DATETIME;\\nALTER TABLE content ADD COLUMN version_number INTEGER DEFAULT 1;\\nALTER TABLE content ADD COLUMN is_auto_saved INTEGER DEFAULT 0;\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_content_id ON content_workflow_status(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_workflow_id ON content_workflow_status(workflow_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content_id ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_scheduled_at ON scheduled_content(scheduled_at);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_status ON scheduled_content(status);\\nCREATE INDEX IF NOT EXISTS idx_notifications_user_id ON notifications(user_id);\\nCREATE INDEX IF NOT EXISTS idx_notifications_is_read ON notifications(is_read);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content_id ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_auto_save_drafts_user_id ON auto_save_drafts(user_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_state ON content(workflow_state_id);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\n\\n-- Insert default workflow for collections\\nINSERT OR IGNORE INTO workflows (id, name, description, collection_id, is_active, require_approval, approval_levels) \\nSELECT \\n 'default-' || id,\\n 'Default Workflow for ' || name,\\n 'Standard content approval workflow',\\n id,\\n 1,\\n 1,\\n 1\\nFROM collections;\\n\\n-- Insert default workflow transitions\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'draft',\\n 'pending-review',\\n 'content:submit'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'approved',\\n 'content:approve'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'approved',\\n 'published',\\n 'content:publish'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'rejected',\\n 'content:approve'\\nFROM workflows w;\\n\\n-- Insert default notification preferences for all users\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_assigned',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_status_change',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'content_scheduled',\\n 1,\\n 1\\nFROM users;\"\n },\n {\n id: '006',\n name: 'Plugin System',\n filename: '006_plugin_system.sql',\n description: 'Migration 006: Plugin System',\n sql: \"-- Plugin System Tables\\n-- Migration: 006_plugin_system\\n-- Description: Add plugin management system tables\\n\\n-- Plugins table\\nCREATE TABLE IF NOT EXISTS plugins (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n version TEXT NOT NULL,\\n author TEXT NOT NULL,\\n category TEXT NOT NULL,\\n icon TEXT,\\n status TEXT DEFAULT 'inactive' CHECK (status IN ('active', 'inactive', 'error')),\\n is_core BOOLEAN DEFAULT FALSE,\\n settings JSON,\\n permissions JSON,\\n dependencies JSON,\\n download_count INTEGER DEFAULT 0,\\n rating REAL DEFAULT 0,\\n installed_at INTEGER NOT NULL,\\n activated_at INTEGER,\\n last_updated INTEGER NOT NULL,\\n error_message TEXT,\\n created_at INTEGER DEFAULT (unixepoch()),\\n updated_at INTEGER DEFAULT (unixepoch())\\n);\\n\\n-- Plugin hooks table (registered hooks by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_hooks (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n hook_name TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n priority INTEGER DEFAULT 10,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, hook_name, handler_name)\\n);\\n\\n-- Plugin routes table\\nCREATE TABLE IF NOT EXISTS plugin_routes (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n path TEXT NOT NULL,\\n method TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n middleware JSON,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, path, method)\\n);\\n\\n-- Plugin assets table (CSS, JS files provided by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_assets (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n asset_type TEXT NOT NULL CHECK (asset_type IN ('css', 'js', 'image', 'font')),\\n asset_path TEXT NOT NULL,\\n load_order INTEGER DEFAULT 100,\\n load_location TEXT DEFAULT 'footer' CHECK (load_location IN ('header', 'footer')),\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Plugin activity log\\nCREATE TABLE IF NOT EXISTS plugin_activity_log (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n action TEXT NOT NULL,\\n user_id TEXT,\\n details JSON,\\n timestamp INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Create indexes\\nCREATE INDEX IF NOT EXISTS idx_plugins_status ON plugins(status);\\nCREATE INDEX IF NOT EXISTS idx_plugins_category ON plugins(category);\\nCREATE INDEX IF NOT EXISTS idx_plugin_hooks_plugin ON plugin_hooks(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_routes_plugin ON plugin_routes(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_assets_plugin ON plugin_assets(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_plugin ON plugin_activity_log(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_timestamp ON plugin_activity_log(timestamp);\\n\\n-- Insert core plugins\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES \\n(\\n 'core-auth',\\n 'core-auth',\\n 'Authentication System',\\n 'Core authentication and user management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔐',\\n 'active',\\n TRUE,\\n '[\\\"manage:users\\\", \\\"manage:roles\\\", \\\"manage:permissions\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-media',\\n 'core-media', \\n 'Media Manager',\\n 'Core media upload and management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'media',\\n '📸',\\n 'active',\\n TRUE,\\n '[\\\"manage:media\\\", \\\"upload:files\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-workflow',\\n 'core-workflow',\\n 'Workflow Engine',\\n 'Content workflow and approval system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin will be added as a third-party plugin through the admin interface\\n\\n-- Add plugin management permission\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at)\\nVALUES (\\n 'manage:plugins',\\n 'Manage Plugins',\\n 'Install, uninstall, activate, and configure plugins',\\n 'system',\\n unixepoch()\\n);\\n\\n-- Grant plugin management permission to admin role\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at)\\nVALUES ('role-perm-manage-plugins', 'admin', 'manage:plugins', unixepoch());\"\n },\n {\n id: '007',\n name: 'Demo Login Plugin',\n filename: '007_demo_login_plugin.sql',\n description: 'Migration 007: Demo Login Plugin',\n sql: \"-- Demo Login Plugin Migration\\n-- Migration: 007_demo_login_plugin\\n-- Description: Add demo login prefill plugin to the plugin registry\\n\\n-- Insert demo login plugin\\nINSERT INTO plugins (\\n id, name, display_name, description, version, author, category, icon, \\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'demo-login-prefill',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials (admin@sonicjs.com/sonicjs!) for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'inactive',\\n TRUE,\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\"\n },\n {\n id: '008',\n name: 'Fix Slug Validation',\n filename: '008_fix_slug_validation.sql',\n description: 'Migration 008: Fix Slug Validation',\n sql: \"-- Migration: Fix overly restrictive slug validation patterns\\n-- This migration relaxes the slug field validation to be more user-friendly\\n\\n-- Update the pages collection slug field to allow underscores and be less restrictive\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\\n-- Update any other slug fields with the restrictive pattern\\nUPDATE content_fields \\nSET field_options = REPLACE(field_options, '\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"', '\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\"')\\nWHERE field_options LIKE '%\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"%';\"\n },\n {\n id: '009',\n name: 'System Logging',\n filename: '009_system_logging.sql',\n description: 'Migration 009: System Logging',\n sql: \"-- System Logging Tables\\n-- Migration: 009_system_logging\\n-- Description: Add system logging and configuration tables\\n\\n-- System logs table for tracking application events\\nCREATE TABLE IF NOT EXISTS system_logs (\\n id TEXT PRIMARY KEY,\\n level TEXT NOT NULL CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n category TEXT NOT NULL CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n message TEXT NOT NULL,\\n data TEXT, -- JSON data\\n user_id TEXT,\\n session_id TEXT,\\n request_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n method TEXT,\\n url TEXT,\\n status_code INTEGER,\\n duration INTEGER, -- milliseconds\\n stack_trace TEXT,\\n tags TEXT, -- JSON array\\n source TEXT, -- source of the log entry\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Log configuration table for managing log settings per category\\nCREATE TABLE IF NOT EXISTS log_config (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL UNIQUE CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n enabled BOOLEAN NOT NULL DEFAULT TRUE,\\n level TEXT NOT NULL DEFAULT 'info' CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n retention_days INTEGER NOT NULL DEFAULT 30,\\n max_size_mb INTEGER NOT NULL DEFAULT 100,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_system_logs_level ON system_logs(level);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_category ON system_logs(category);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_created_at ON system_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_user_id ON system_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_status_code ON system_logs(status_code);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_source ON system_logs(source);\\n\\n-- Insert default log configurations\\nINSERT OR IGNORE INTO log_config (id, category, enabled, level, retention_days, max_size_mb) VALUES\\n('log-config-auth', 'auth', TRUE, 'info', 90, 50),\\n('log-config-api', 'api', TRUE, 'info', 30, 100),\\n('log-config-workflow', 'workflow', TRUE, 'info', 60, 50),\\n('log-config-plugin', 'plugin', TRUE, 'warn', 30, 25),\\n('log-config-media', 'media', TRUE, 'info', 30, 50),\\n('log-config-system', 'system', TRUE, 'info', 90, 100),\\n('log-config-security', 'security', TRUE, 'warn', 180, 100),\\n('log-config-error', 'error', TRUE, 'error', 90, 200);\"\n },\n {\n id: '011',\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql',\n description: 'Migration 011: Config Managed Collections',\n sql: \"-- Migration: Add Config-Managed Collections Support\\n-- Description: Add 'managed' column to collections table to support config-based collection definitions\\n-- Created: 2025-10-03\\n\\n-- Add 'managed' column to collections table\\n-- This column indicates whether a collection is managed by configuration files (true) or user-created (false)\\n-- Managed collections cannot be edited through the admin UI\\n-- Use a safe approach to add the column only if it doesn't exist\\nALTER TABLE collections ADD COLUMN managed INTEGER DEFAULT 0 NOT NULL;\\n\\n-- Create an index on the managed column for faster queries\\nCREATE INDEX IF NOT EXISTS idx_collections_managed ON collections(managed);\\n\\n-- Create an index on managed + is_active for efficient filtering\\nCREATE INDEX IF NOT EXISTS idx_collections_managed_active ON collections(managed, is_active);\\n\"\n },\n {\n id: '012',\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql',\n description: 'Migration 012: Testimonials Plugin',\n sql: \"-- Testimonials Plugin Migration\\n-- Creates testimonials table for the testimonials plugin\\n-- This demonstrates a code-based collection defined in src/plugins/core-plugins/testimonials-plugin.ts\\n\\nCREATE TABLE IF NOT EXISTS testimonials (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n author_name TEXT NOT NULL,\\n author_title TEXT,\\n author_company TEXT,\\n testimonial_text TEXT NOT NULL,\\n rating INTEGER CHECK(rating >= 1 AND rating <= 5),\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_testimonials_published ON testimonials(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_sort_order ON testimonials(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_rating ON testimonials(rating);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS testimonials_updated_at\\n AFTER UPDATE ON testimonials\\nBEGIN\\n UPDATE testimonials SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('testimonials',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support. This is a code-based collection example.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}');\\n\\n-- Insert sample testimonial data\\nINSERT OR IGNORE INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder) VALUES\\n('Jane Smith',\\n 'CTO',\\n 'TechStartup Inc',\\n 'SonicJS AI has transformed how we manage our content. The plugin architecture is brilliant and the edge deployment is blazing fast.',\\n 5,\\n 1,\\n 1),\\n\\n('Michael Chen',\\n 'Lead Developer',\\n 'Digital Agency Co',\\n 'We migrated from WordPress to SonicJS AI and couldn''t be happier. The TypeScript-first approach and modern tooling make development a joy.',\\n 5,\\n 1,\\n 2),\\n\\n('Sarah Johnson',\\n 'Product Manager',\\n 'E-commerce Solutions',\\n 'The headless CMS approach combined with Cloudflare Workers gives us unmatched performance. Our content is served globally with minimal latency.',\\n 4,\\n 1,\\n 3),\\n\\n('David Rodriguez',\\n 'Full Stack Developer',\\n 'Creative Studio',\\n 'Great CMS for modern web applications. The admin interface is clean and the API is well-designed. Plugin system is very flexible.',\\n 5,\\n 1,\\n 4),\\n\\n('Emily Watson',\\n 'Technical Director',\\n 'Media Company',\\n 'SonicJS AI solved our content distribution challenges. The R2 integration for media storage works flawlessly and scales effortlessly.',\\n 4,\\n 1,\\n 5);\\n\"\n },\n {\n id: '013',\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql',\n description: 'Migration 013: Code Examples Plugin',\n sql: \"-- Code Examples Plugin Migration\\n-- Creates code_examples table for the code examples plugin\\n-- This demonstrates a code-based collection for storing and managing code snippets\\n\\nCREATE TABLE IF NOT EXISTS code_examples (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n title TEXT NOT NULL,\\n description TEXT,\\n code TEXT NOT NULL,\\n language TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_code_examples_published ON code_examples(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_sort_order ON code_examples(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_language ON code_examples(language);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_category ON code_examples(category);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS code_examples_updated_at\\n AFTER UPDATE ON code_examples\\nBEGIN\\n UPDATE code_examples SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('code-examples',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support. Perfect for documentation and tutorials.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}');\\n\\n-- Insert sample code examples\\nINSERT OR IGNORE INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder) VALUES\\n('React useState Hook',\\n 'Basic example of using the useState hook in React for managing component state.',\\n 'import { useState } from ''react'';\\n\\nfunction Counter() {\\n const [count, setCount] = useState(0);\\n\\n return (\\n
\\n

Count: {count}

\\n \\n
\\n );\\n}\\n\\nexport default Counter;',\\n 'javascript',\\n 'frontend',\\n 'react,hooks,state',\\n 1,\\n 1),\\n\\n('TypeScript Interface Example',\\n 'Defining a TypeScript interface for type-safe objects.',\\n 'interface User {\\n id: string;\\n email: string;\\n name: string;\\n role: ''admin'' | ''editor'' | ''viewer'';\\n createdAt: Date;\\n}\\n\\nfunction greetUser(user: User): string {\\n return `Hello, ${user.name}!`;\\n}\\n\\nconst user: User = {\\n id: ''123'',\\n email: ''user@example.com'',\\n name: ''John Doe'',\\n role: ''admin'',\\n createdAt: new Date()\\n};\\n\\nconsole.log(greetUser(user));',\\n 'typescript',\\n 'backend',\\n 'typescript,types,interface',\\n 1,\\n 2),\\n\\n('Python List Comprehension',\\n 'Elegant way to create lists in Python using list comprehensions.',\\n '# Basic list comprehension\\nsquares = [x**2 for x in range(10)]\\nprint(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\\n\\n# With condition\\neven_squares = [x**2 for x in range(10) if x % 2 == 0]\\nprint(even_squares) # [0, 4, 16, 36, 64]\\n\\n# Nested list comprehension\\nmatrix = [[i+j for j in range(3)] for i in range(3)]\\nprint(matrix) # [[0, 1, 2], [1, 2, 3], [2, 3, 4]]',\\n 'python',\\n 'general',\\n 'python,lists,comprehension',\\n 1,\\n 3),\\n\\n('SQL Join Example',\\n 'Common SQL JOIN patterns for combining data from multiple tables.',\\n '-- INNER JOIN: Returns only matching rows\\nSELECT users.name, orders.total\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id;\\n\\n-- LEFT JOIN: Returns all users, even without orders\\nSELECT users.name, orders.total\\nFROM users\\nLEFT JOIN orders ON users.id = orders.user_id;\\n\\n-- Multiple JOINs\\nSELECT\\n users.name,\\n orders.order_date,\\n products.name AS product_name\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id\\nINNER JOIN order_items ON orders.id = order_items.order_id\\nINNER JOIN products ON order_items.product_id = products.id;',\\n 'sql',\\n 'database',\\n 'sql,joins,queries',\\n 1,\\n 4),\\n\\n('Go Error Handling',\\n 'Idiomatic error handling pattern in Go.',\\n 'package main\\n\\nimport (\\n\\t\\\"errors\\\"\\n\\t\\\"fmt\\\"\\n)\\n\\nfunc divide(a, b float64) (float64, error) {\\n\\tif b == 0 {\\n\\t\\treturn 0, errors.New(\\\"division by zero\\\")\\n\\t}\\n\\treturn a / b, nil\\n}\\n\\nfunc main() {\\n\\tresult, err := divide(10, 2)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t\\treturn\\n\\t}\\n\\tfmt.Printf(\\\"Result: %.2f\\\\n\\\", result)\\n\\n\\t// This will error\\n\\t_, err = divide(10, 0)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t}\\n}',\\n 'go',\\n 'backend',\\n 'go,error-handling,functions',\\n 1,\\n 5);\\n\"\n },\n {\n id: '014',\n name: 'Fix Plugin Registry',\n filename: '014_fix_plugin_registry.sql',\n description: 'Migration 014: Fix Plugin Registry',\n sql: \"-- Fix Plugin Registry\\n-- Migration: 014_fix_plugin_registry\\n-- Description: Add missing plugins and fix plugin name mismatches\\n\\n-- Note: Cannot easily update plugin names as they may be referenced elsewhere\\n-- Instead we'll add the missing plugins with correct names\\n\\n-- Insert missing plugins\\n\\n-- Core Analytics Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'core-analytics',\\n 'core-analytics',\\n 'Analytics & Tracking',\\n 'Core analytics tracking and reporting plugin with page views and event tracking',\\n '1.0.0',\\n 'SonicJS Team',\\n 'seo',\\n '📊',\\n 'active',\\n TRUE,\\n '[\\\"view:analytics\\\", \\\"manage:tracking\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'faq-plugin',\\n 'faq-plugin',\\n 'FAQ Management',\\n 'Frequently Asked Questions management plugin with categories, search, and custom styling',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '❓',\\n 'active',\\n FALSE,\\n '[\\\"manage:faqs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Seed Data Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'seed-data',\\n 'seed-data',\\n 'Seed Data Generator',\\n 'Generate realistic example users and content for testing and development',\\n '1.0.0',\\n 'SonicJS Team',\\n 'development',\\n '🌱',\\n 'inactive',\\n FALSE,\\n '[\\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Database Tools Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'database-tools',\\n 'database-tools',\\n 'Database Tools',\\n 'Database management tools including truncate, backup, and validation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'system',\\n '🗄️',\\n 'active',\\n FALSE,\\n '[\\\"manage:database\\\", \\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '015',\n name: 'Add Remaining Plugins',\n filename: '015_add_remaining_plugins.sql',\n description: 'Migration 015: Add Remaining Plugins',\n sql: \"-- Add Remaining Plugins\\n-- Migration: 015_add_remaining_plugins\\n-- Description: Add all remaining core plugins that were missing from the registry\\n\\n-- Testimonials Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'testimonials-plugin',\\n 'testimonials-plugin',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '⭐',\\n 'active',\\n FALSE,\\n '[\\\"manage:testimonials\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Code Examples Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'code-examples-plugin',\\n 'code-examples-plugin',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '💻',\\n 'active',\\n FALSE,\\n '[\\\"manage:code-examples\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Workflow Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'workflow-plugin',\\n 'workflow-plugin',\\n 'Workflow Engine',\\n 'Content workflow management with approval chains, scheduling, and automation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Demo Login Plugin (already exists with correct name from migration 007, but let's ensure it's there)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'demo-login-plugin',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '016',\n name: 'Remove Duplicate Cache Plugin',\n filename: '016_remove_duplicate_cache_plugin.sql',\n description: 'Migration 016: Remove Duplicate Cache Plugin',\n sql: \"-- Migration: Remove duplicate cache plugin entry\\n-- Description: Removes the old 'cache' plugin (id: 'cache') that is a duplicate of 'core-cache'\\n-- This fixes the issue where Cache System appears twice in the plugins list\\n-- Created: 2025-10-14\\n\\n-- Remove the old 'cache' plugin entry if it exists\\n-- The correct plugin is 'core-cache' which is managed by plugin-bootstrap.ts\\nDELETE FROM plugins WHERE id = 'cache' AND name = 'cache';\\n\\n-- Clean up any related entries in plugin activity log\\nDELETE FROM plugin_activity_log WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin hooks\\nDELETE FROM plugin_hooks WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin routes\\nDELETE FROM plugin_routes WHERE plugin_id = 'cache';\\n\"\n },\n {\n id: '017',\n name: 'Auth Configurable Fields',\n filename: '017_auth_configurable_fields.sql',\n description: 'Migration 017: Auth Configurable Fields',\n sql: \"-- Migration: Make authentication fields configurable\\n-- This migration updates the core-auth plugin to support configurable required fields\\n\\n-- The settings will be stored in the plugins table as JSON\\n-- Default settings for core-auth plugin include:\\n-- {\\n-- \\\"requiredFields\\\": {\\n-- \\\"email\\\": { \\\"required\\\": true, \\\"minLength\\\": 5 },\\n-- \\\"password\\\": { \\\"required\\\": true, \\\"minLength\\\": 8 },\\n-- \\\"username\\\": { \\\"required\\\": true, \\\"minLength\\\": 3 },\\n-- \\\"firstName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 },\\n-- \\\"lastName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 }\\n-- },\\n-- \\\"validation\\\": {\\n-- \\\"emailFormat\\\": true,\\n-- \\\"allowDuplicateUsernames\\\": false\\n-- }\\n-- }\\n\\n-- Update core-auth plugin settings with configurable field requirements\\nUPDATE plugins\\nSET settings = json_object(\\n 'requiredFields', json_object(\\n 'email', json_object('required', 1, 'minLength', 5, 'label', 'Email', 'type', 'email'),\\n 'password', json_object('required', 1, 'minLength', 8, 'label', 'Password', 'type', 'password'),\\n 'username', json_object('required', 1, 'minLength', 3, 'label', 'Username', 'type', 'text'),\\n 'firstName', json_object('required', 1, 'minLength', 1, 'label', 'First Name', 'type', 'text'),\\n 'lastName', json_object('required', 1, 'minLength', 1, 'label', 'Last Name', 'type', 'text')\\n ),\\n 'validation', json_object(\\n 'emailFormat', 1,\\n 'allowDuplicateUsernames', 0,\\n 'passwordRequirements', json_object(\\n 'requireUppercase', 0,\\n 'requireLowercase', 0,\\n 'requireNumbers', 0,\\n 'requireSpecialChars', 0\\n )\\n ),\\n 'registration', json_object(\\n 'enabled', 1,\\n 'requireEmailVerification', 0,\\n 'defaultRole', 'viewer'\\n )\\n)\\nWHERE id = 'core-auth';\\n\\n-- If core-auth plugin doesn't exist, this migration will be handled by bootstrap\\n-- No need to insert here as plugin bootstrap handles initial plugin creation\\n\"\n },\n {\n id: '018',\n name: 'Settings Table',\n filename: '018_settings_table.sql',\n description: 'Migration 018: Settings Table',\n sql: \"-- Create settings table for storing application settings\\nCREATE TABLE IF NOT EXISTS settings (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL, -- 'general', 'appearance', 'security', etc.\\n key TEXT NOT NULL,\\n value TEXT NOT NULL, -- JSON value\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(category, key)\\n);\\n\\n-- Insert default general settings\\nINSERT OR IGNORE INTO settings (id, category, key, value, created_at, updated_at)\\nVALUES\\n (lower(hex(randomblob(16))), 'general', 'siteName', '\\\"SonicJS AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'siteDescription', '\\\"A modern headless CMS powered by AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'timezone', '\\\"UTC\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'language', '\\\"en\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'maintenanceMode', 'false', unixepoch() * 1000, unixepoch() * 1000);\\n\\n-- Create index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);\\nCREATE INDEX IF NOT EXISTS idx_settings_category_key ON settings(category, key);\\n\"\n },\n {\n id: '019',\n name: 'Remove Blog Posts Collection',\n filename: '019_remove_blog_posts_collection.sql',\n description: 'Migration 019: Remove Blog Posts Collection',\n sql: \"-- Migration: Remove blog_posts from database-managed collections\\n-- Description: Remove blog-posts-collection from the database so it can be managed by code-based collection\\n-- Created: 2025-11-04\\n\\n-- Delete content associated with blog-posts-collection\\nDELETE FROM content WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete content fields for blog-posts-collection\\nDELETE FROM content_fields WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete the blog-posts collection itself\\nDELETE FROM collections WHERE id = 'blog-posts-collection';\\n\\n-- The blog-posts collection will now be managed by the code-based collection\\n-- in src/collections/blog-posts.collection.ts\\n\"\n },\n {\n id: '020',\n name: 'Add Email Plugin',\n filename: '020_add_email_plugin.sql',\n description: 'Migration 020: Add Email Plugin',\n sql: \"-- Add Email Plugin\\n-- Migration: 020_add_email_plugin\\n-- Description: Add email plugin for transactional emails via Resend\\n\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'email',\\n 'email',\\n 'Email',\\n 'Send transactional emails using Resend',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'utilities',\\n '📧',\\n 'inactive',\\n TRUE,\\n '[\\\"email:manage\\\", \\\"email:send\\\", \\\"email:view-logs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '021',\n name: 'Add Magic Link Auth Plugin',\n filename: '021_add_magic_link_auth_plugin.sql',\n description: 'Migration 021: Add Magic Link Auth Plugin',\n sql: \"-- Add Magic Link Authentication Plugin\\n-- Migration: 021_add_magic_link_auth_plugin\\n-- Description: Add magic link authentication plugin for passwordless login\\n\\n-- Create magic_links table\\nCREATE TABLE IF NOT EXISTS magic_links (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_magic_links_token ON magic_links(token);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_email ON magic_links(user_email);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_expires ON magic_links(expires_at);\\n\\n-- Register the plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'magic-link-auth',\\n 'magic-link-auth',\\n 'Magic Link Authentication',\\n 'Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔗',\\n 'inactive',\\n FALSE,\\n '[\\\"auth:manage\\\", \\\"auth:magic-link\\\"]',\\n '[\\\"email\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '022',\n name: 'Add Tinymce Plugin',\n filename: '022_add_tinymce_plugin.sql',\n description: 'Migration 022: Add Tinymce Plugin',\n sql: \"-- Add TinyMCE Rich Text Editor Plugin\\n-- Migration: 022_add_tinymce_plugin\\n-- Description: Add TinyMCE plugin for WYSIWYG rich text editing\\n\\n-- Register the plugin (active by default since it replaces hardcoded TinyMCE)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'tinymce-plugin',\\n 'tinymce-plugin',\\n 'TinyMCE Rich Text Editor',\\n 'Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✏️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"apiKey\\\":\\\"no-api-key\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"skin\\\":\\\"oxide-dark\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '023',\n name: 'Add Easy Mdx Plugin',\n filename: '023_add_easy_mdx_plugin.sql',\n description: 'Migration 023: Add Easy Mdx Plugin',\n sql: \"-- Add EasyMDE Markdown Editor Plugin\\n-- Migration: 023_add_easy_mdx_plugin\\n-- Description: Add EasyMDE plugin for lightweight markdown editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easy-mdx',\\n 'easy-mdx',\\n 'EasyMDE Markdown Editor',\\n 'Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '📝',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"defaultHeight\\\":400,\\\"theme\\\":\\\"dark\\\",\\\"toolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '024',\n name: 'Add Quill Editor Plugin',\n filename: '024_add_quill_editor_plugin.sql',\n description: 'Migration 024: Add Quill Editor Plugin',\n sql: \"-- Add Quill Rich Text Editor Plugin\\n-- Migration: 024_add_quill_editor_plugin\\n-- Description: Add Quill plugin for modern rich text editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'quill-editor',\\n 'quill-editor',\\n 'Quill Rich Text Editor',\\n 'Modern rich text editor for content creation. Provides a clean, intuitive WYSIWYG editor with customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"snow\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '025',\n name: 'Add Easymde Plugin',\n filename: '025_add_easymde_plugin.sql',\n description: 'Migration 025: Add Easymde Plugin',\n sql: \"-- Add EasyMDE Rich Text Editor Plugin\\n-- Migration: 025_add_easymde_plugin\\n-- Description: Add EasyMDE plugin for markdown-based rich text editing\\n\\n-- Register the plugin (inactive by default, replacing MDXEditor)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easymde-editor',\\n 'easymde-editor',\\n 'EasyMDE Editor',\\n 'Lightweight markdown editor for content creation. Simple, elegant WYSIWYG markdown editor with live preview, toolbar, and dark mode support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'inactive',\\n TRUE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"dark\\\",\\\"defaultHeight\\\":300,\\\"toolbar\\\":\\\"full\\\",\\\"spellChecker\\\":false,\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '026',\n name: 'Add Otp Login',\n filename: '026_add_otp_login.sql',\n description: 'Migration 026: Add Otp Login',\n sql: \"-- Add OTP Login Plugin\\n-- Migration: 021_add_otp_login\\n-- Description: Add OTP login plugin for passwordless authentication via email codes\\n\\n-- Create table for OTP codes\\nCREATE TABLE IF NOT EXISTS otp_codes (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n code TEXT NOT NULL,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n attempts INTEGER DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_otp_email_code ON otp_codes(user_email, code);\\nCREATE INDEX IF NOT EXISTS idx_otp_expires ON otp_codes(expires_at);\\nCREATE INDEX IF NOT EXISTS idx_otp_used ON otp_codes(used);\\n\\n-- Add plugin record\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'otp-login',\\n 'otp-login',\\n 'OTP Login',\\n 'Passwordless authentication via email one-time codes',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'security',\\n '🔢',\\n 'inactive',\\n TRUE,\\n '[\\\"otp:manage\\\", \\\"otp:request\\\", \\\"otp:verify\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '027',\n name: 'Fix Slug Field Type',\n filename: '027_fix_slug_field_type.sql',\n description: 'Migration 027: Fix Slug Field Type',\n sql: \"-- Migration: Fix slug field type\\n-- Description: Update slug fields to use 'slug' field type instead of 'text' for proper auto-generation\\n-- Created: 2026-01-10\\n\\n-- Update pages collection slug field to use 'slug' field type\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\"\n },\n {\n id: '028',\n name: 'Fix Slug Field Type In Schemas',\n filename: '028_fix_slug_field_type_in_schemas.sql',\n description: 'Migration 028: Fix Slug Field Type In Schemas',\n sql: \"-- Migration: Fix slug field type in collection schemas\\n-- Description: Update slug fields in collection schemas to use 'slug' type instead of 'string'\\n-- Created: 2026-01-10\\n\\n-- Update pages-collection schema\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'pages-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update blog-posts-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'blog-posts-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update news-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'news-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\"\n },\n {\n id: '029',\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql',\n description: 'Migration 029: Add Forms System',\n sql: \"-- Migration: 029_add_forms_system.sql\\n-- Description: Add Form.io integration for advanced form building\\n-- Date: January 23, 2026\\n-- Phase: 1 - Database Schema\\n\\n-- =====================================================\\n-- Table: forms\\n-- Description: Stores form definitions and configuration\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS forms (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE, -- Machine name (e.g., \\\"contact-form\\\")\\n display_name TEXT NOT NULL, -- Human name (e.g., \\\"Contact Form\\\")\\n description TEXT, -- Optional description\\n category TEXT DEFAULT 'general', -- Form category (contact, survey, registration, etc.)\\n \\n -- Form.io schema (JSON)\\n formio_schema TEXT NOT NULL, -- Complete Form.io JSON schema\\n \\n -- Settings\\n settings TEXT, -- JSON: {\\n -- emailNotifications: true,\\n -- notifyEmail: \\\"admin@example.com\\\",\\n -- successMessage: \\\"Thank you!\\\",\\n -- redirectUrl: \\\"/thank-you\\\",\\n -- allowAnonymous: true,\\n -- requireAuth: false,\\n -- maxSubmissions: null,\\n -- submitButtonText: \\\"Submit\\\",\\n -- saveProgress: true,\\n -- webhookUrl: null\\n -- }\\n \\n -- Status & Management\\n is_active INTEGER DEFAULT 1, -- Active/inactive flag\\n is_public INTEGER DEFAULT 1, -- Public (anyone) vs private (auth required)\\n managed INTEGER DEFAULT 0, -- Code-managed (like collections)\\n \\n -- Metadata\\n icon TEXT, -- Optional icon for admin UI\\n color TEXT, -- Optional color (hex) for admin UI\\n tags TEXT, -- JSON array of tags\\n \\n -- Stats\\n submission_count INTEGER DEFAULT 0, -- Total submissions received\\n view_count INTEGER DEFAULT 0, -- Form views (optional tracking)\\n \\n -- Ownership\\n created_by TEXT REFERENCES users(id), -- User who created the form\\n updated_by TEXT REFERENCES users(id), -- User who last updated\\n \\n -- Timestamps\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for forms\\nCREATE INDEX IF NOT EXISTS idx_forms_name ON forms(name);\\nCREATE INDEX IF NOT EXISTS idx_forms_category ON forms(category);\\nCREATE INDEX IF NOT EXISTS idx_forms_active ON forms(is_active);\\nCREATE INDEX IF NOT EXISTS idx_forms_public ON forms(is_public);\\nCREATE INDEX IF NOT EXISTS idx_forms_created_by ON forms(created_by);\\n\\n-- =====================================================\\n-- Table: form_submissions\\n-- Description: Stores submitted form data\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_submissions (\\n id TEXT PRIMARY KEY,\\n form_id TEXT NOT NULL REFERENCES forms(id) ON DELETE CASCADE,\\n \\n -- Submission data\\n submission_data TEXT NOT NULL, -- JSON: The actual form data submitted\\n \\n -- Submission metadata\\n status TEXT DEFAULT 'pending', -- pending, reviewed, approved, rejected, spam\\n submission_number INTEGER, -- Sequential number per form\\n \\n -- User information (if authenticated)\\n user_id TEXT REFERENCES users(id), -- Submitter user ID (if logged in)\\n user_email TEXT, -- Email from form (or user account)\\n \\n -- Tracking information\\n ip_address TEXT, -- IP address of submitter\\n user_agent TEXT, -- Browser user agent\\n referrer TEXT, -- Page that referred to form\\n utm_source TEXT, -- UTM tracking params\\n utm_medium TEXT,\\n utm_campaign TEXT,\\n \\n -- Review/Processing\\n reviewed_by TEXT REFERENCES users(id), -- Admin who reviewed\\n reviewed_at INTEGER, -- Review timestamp\\n review_notes TEXT, -- Admin notes\\n \\n -- Flags\\n is_spam INTEGER DEFAULT 0, -- Spam flag\\n is_archived INTEGER DEFAULT 0, -- Archived flag\\n \\n -- Timestamps\\n submitted_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for submissions\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_form_id ON form_submissions(form_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_status ON form_submissions(status);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_user_id ON form_submissions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_email ON form_submissions(user_email);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_submitted_at ON form_submissions(submitted_at);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_spam ON form_submissions(is_spam);\\n\\n-- Trigger to auto-increment submission_number per form\\nCREATE TRIGGER IF NOT EXISTS set_submission_number\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE form_submissions \\n SET submission_number = (\\n SELECT COUNT(*) \\n FROM form_submissions \\n WHERE form_id = NEW.form_id \\n AND id <= NEW.id\\n )\\n WHERE id = NEW.id;\\nEND;\\n\\n-- Trigger to update form submission_count\\nCREATE TRIGGER IF NOT EXISTS increment_form_submission_count\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE forms \\n SET submission_count = submission_count + 1,\\n updated_at = unixepoch() * 1000\\n WHERE id = NEW.form_id;\\nEND;\\n\\n-- =====================================================\\n-- Table: form_files (Optional)\\n-- Description: Link form submissions to uploaded files\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_files (\\n id TEXT PRIMARY KEY,\\n submission_id TEXT NOT NULL REFERENCES form_submissions(id) ON DELETE CASCADE,\\n media_id TEXT NOT NULL REFERENCES media(id) ON DELETE CASCADE,\\n field_name TEXT NOT NULL, -- Form field that uploaded this file\\n uploaded_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for form files\\nCREATE INDEX IF NOT EXISTS idx_form_files_submission ON form_files(submission_id);\\nCREATE INDEX IF NOT EXISTS idx_form_files_media ON form_files(media_id);\\n\\n-- =====================================================\\n-- Sample Data: Create a default contact form\\n-- =====================================================\\n\\nINSERT OR IGNORE INTO forms (\\n id,\\n name,\\n display_name,\\n description,\\n category,\\n formio_schema,\\n settings,\\n is_active,\\n is_public,\\n created_at,\\n updated_at\\n) VALUES (\\n 'default-contact-form',\\n 'contact',\\n 'Contact Form',\\n 'A simple contact form for getting in touch',\\n 'contact',\\n '{\\\"components\\\":[]}',\\n '{\\\"emailNotifications\\\":false,\\\"successMessage\\\":\\\"Thank you for your submission!\\\",\\\"submitButtonText\\\":\\\"Submit\\\",\\\"requireAuth\\\":false}',\\n 1,\\n 1,\\n unixepoch() * 1000,\\n unixepoch() * 1000\\n);\\n\"\n },\n {\n id: '030',\n name: 'Add Turnstile To Forms',\n filename: '030_add_turnstile_to_forms.sql',\n description: 'Migration 030: Add Turnstile To Forms',\n sql: \"-- Add Turnstile configuration to forms table\\n-- This allows per-form Turnstile settings with global fallback\\n\\n-- Add columns (D1 may not support CHECK constraints in ALTER TABLE)\\nALTER TABLE forms ADD COLUMN turnstile_enabled INTEGER DEFAULT 0;\\nALTER TABLE forms ADD COLUMN turnstile_settings TEXT;\\n\\n-- Set default to inherit global settings for existing forms\\nUPDATE forms \\nSET turnstile_settings = '{\\\"inherit\\\":true}' \\nWHERE turnstile_settings IS NULL;\\n\\n-- Add index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_forms_turnstile ON forms(turnstile_enabled);\\n\"\n },\n {\n id: '031',\n name: 'Ai Search Plugin',\n filename: '031_ai_search_plugin.sql',\n description: 'Migration 031: Ai Search Plugin',\n sql: \"-- AI Search plugin settings\\nCREATE TABLE IF NOT EXISTS ai_search_settings (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n enabled BOOLEAN DEFAULT 0,\\n ai_mode_enabled BOOLEAN DEFAULT 1,\\n selected_collections TEXT, -- JSON array of collection IDs to index\\n dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index\\n autocomplete_enabled BOOLEAN DEFAULT 1,\\n cache_duration INTEGER DEFAULT 1, -- hours\\n results_limit INTEGER DEFAULT 20,\\n index_media BOOLEAN DEFAULT 0,\\n index_status TEXT, -- JSON object with status per collection\\n last_indexed_at INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Search history/analytics\\nCREATE TABLE IF NOT EXISTS ai_search_history (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n query TEXT NOT NULL,\\n mode TEXT, -- 'ai' or 'keyword'\\n results_count INTEGER,\\n user_id INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index metadata tracking (per collection)\\nCREATE TABLE IF NOT EXISTS ai_search_index_meta (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n collection_id INTEGER NOT NULL,\\n collection_name TEXT NOT NULL, -- Cache collection name for display\\n total_items INTEGER DEFAULT 0,\\n indexed_items INTEGER DEFAULT 0,\\n last_sync_at INTEGER,\\n status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'\\n error_message TEXT,\\n UNIQUE(collection_id)\\n);\\n\\n-- Indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);\\n\"\n },\n {\n id: '032',\n name: 'User Profiles',\n filename: '032_user_profiles.sql',\n description: 'Migration 032: User Profiles',\n sql: \"-- User Profiles Table (Core Migration)\\n-- Stores extended user profile data separate from auth concerns\\n-- Required by admin-users.ts for user edit page profile management\\n--\\n-- Originally introduced as app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\\n-- in upstream PR #508. Core routes (admin-users.ts) were updated to query this table in PR #512,\\n-- but no corresponding core migration was added. This migration corrects that gap.\\n--\\n-- IF NOT EXISTS guards ensure idempotency for databases that already have the table\\n-- from the app-level migration.\\n\\nCREATE TABLE IF NOT EXISTS user_profiles (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,\\n\\n display_name TEXT,\\n bio TEXT,\\n company TEXT,\\n job_title TEXT,\\n website TEXT,\\n location TEXT,\\n date_of_birth INTEGER,\\n data TEXT DEFAULT '{}',\\n\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index for fast user lookups\\nCREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);\\n\\n-- Trigger to auto-update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS user_profiles_updated_at\\n AFTER UPDATE ON user_profiles\\nBEGIN\\n UPDATE user_profiles SET updated_at = strftime('%s', 'now') * 1000 WHERE id = NEW.id;\\nEND;\\n\"\n },\n {\n id: '033',\n name: 'Form Content Integration',\n filename: '033_form_content_integration.sql',\n description: 'Migration 033: Form Content Integration',\n sql: \"-- Migration 033: Form-Content Integration\\n-- Adds bridge columns to link forms to collections and submissions to content items\\n\\n-- Add source_type and source_id to collections for form-derived collections\\nALTER TABLE collections ADD COLUMN source_type TEXT DEFAULT 'user';\\nALTER TABLE collections ADD COLUMN source_id TEXT;\\n\\n-- Index for efficient lookup of form-derived collections\\nCREATE INDEX IF NOT EXISTS idx_collections_source ON collections(source_type, source_id);\\n\\n-- Add content_id to form_submissions for linking to content items\\nALTER TABLE form_submissions ADD COLUMN content_id TEXT REFERENCES content(id);\\n\\n-- Index for efficient lookup by content_id\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_content_id ON form_submissions(content_id);\\n\\n-- Create system user for anonymous form submissions\\nINSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\\nVALUES ('system-form-submission', 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', NULL, 'viewer', 0, strftime('%s','now') * 1000, strftime('%s','now') * 1000);\\n\"\n },\n {\n id: '034',\n name: 'Security Audit Plugin',\n filename: '034_security_audit_plugin.sql',\n description: 'Migration 034: Security Audit Plugin',\n sql: \"-- Security Audit Plugin\\n-- Tracks login attempts, registrations, and security events for monitoring and brute-force detection\\n\\nCREATE TABLE IF NOT EXISTS security_events (\\n id TEXT PRIMARY KEY,\\n event_type TEXT NOT NULL,\\n severity TEXT NOT NULL DEFAULT 'info',\\n user_id TEXT,\\n email TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n country_code TEXT,\\n request_path TEXT,\\n request_method TEXT,\\n details TEXT,\\n fingerprint TEXT,\\n blocked INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type);\\nCREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_security_events_email ON security_events(email);\\nCREATE INDEX IF NOT EXISTS idx_security_events_ip ON security_events(ip_address);\\nCREATE INDEX IF NOT EXISTS idx_security_events_severity ON security_events(severity);\\nCREATE INDEX IF NOT EXISTS idx_security_events_created ON security_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_security_events_fingerprint ON security_events(fingerprint);\\n\"\n },\n {\n id: '035',\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql',\n description: 'Migration 035: User Profiles Data Column',\n sql: \"-- Migration 035: Add data column to user_profiles (no-op)\\n--\\n-- This migration originally added a missing 'data' column to user_profiles.\\n-- Migration 032 has since been updated to include the column in the CREATE TABLE,\\n-- so on fresh installs the column already exists by the time this runs.\\n--\\n-- The ALTER TABLE has been removed to prevent \\\"duplicate column name: data\\\" errors\\n-- during fresh installs (GitHub issue #771). Wrangler's migration runner does not\\n-- gracefully handle duplicate column errors like the runtime MigrationService does.\\n--\\n-- Existing databases that ran the old 032 (without the data column) get the column\\n-- added at runtime by the core MigrationService, which skips duplicate-column errors.\\n--\\n-- This file is kept as a no-op so that wrangler's migration tracking remains\\n-- consistent (it tracks migrations by filename).\\nSELECT 1;\\n\"\n },\n {\n id: '036',\n name: 'Analytics Events',\n filename: '036_analytics_events.sql',\n description: 'Migration 036: Analytics Events',\n sql: \"-- Migration 036: Analytics Events Table\\n-- Provides storage for user behavior event tracking (page views, custom events)\\n\\nCREATE TABLE IF NOT EXISTS analytics_events (\\n id TEXT PRIMARY KEY,\\n event TEXT NOT NULL,\\n category TEXT NOT NULL DEFAULT 'user-activity',\\n properties TEXT,\\n user_id TEXT,\\n session_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n path TEXT,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_event ON analytics_events(event);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_category ON analytics_events(category);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_user_id ON analytics_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_session_id ON analytics_events(session_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_created_at ON analytics_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_path ON analytics_events(path);\\n\"\n }\n]\n\n// Map for quick lookup by ID\nexport const migrationsByIdMap = new Map(\n bundledMigrations.map(m => [m.id, m])\n)\n\n// Get migration SQL by ID\nexport function getMigrationSQLById(id: string): string | null {\n return migrationsByIdMap.get(id)?.sql ?? null\n}\n\n// Get all migration info (without SQL for lighter payloads)\nexport function getMigrationList(): Array> {\n return bundledMigrations.map(({ sql, ...rest }) => rest)\n}\n","import { D1Database } from '@cloudflare/workers-types'\nimport { bundledMigrations, getMigrationSQLById, type BundledMigration } from '../db/migrations-bundle'\n\nexport interface Migration {\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n}\n\nexport interface MigrationStatus {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Migration[]\n}\n\nexport class MigrationService {\n constructor(private db: D1Database) {}\n\n /**\n * Initialize the migrations tracking table\n */\n async initializeMigrationsTable(): Promise {\n const createTableQuery = `\n CREATE TABLE IF NOT EXISTS migrations (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n filename TEXT NOT NULL,\n applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n checksum TEXT\n )\n `\n\n await this.db.prepare(createTableQuery).run()\n }\n\n /**\n * Get all available migrations from the bundled migrations\n */\n async getAvailableMigrations(): Promise {\n const migrations: Migration[] = []\n\n // Get applied migrations from database\n const appliedResult = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at ASC'\n ).all()\n\n const appliedMigrations = new Map(\n appliedResult.results?.map((row: any) => [row.id, row]) || []\n )\n\n // Auto-detect applied migrations by checking if their tables exist\n await this.autoDetectAppliedMigrations(appliedMigrations)\n\n // Use bundled migrations as the source of truth\n for (const bundled of bundledMigrations) {\n const applied = appliedMigrations.has(bundled.id)\n const appliedData = appliedMigrations.get(bundled.id)\n\n migrations.push({\n id: bundled.id,\n name: bundled.name,\n filename: bundled.filename,\n description: bundled.description,\n applied,\n appliedAt: applied ? appliedData?.applied_at : undefined,\n size: bundled.sql.length\n })\n }\n\n return migrations\n }\n\n /**\n * Auto-detect applied migrations by checking if their tables exist\n */\n private async autoDetectAppliedMigrations(appliedMigrations: Map): Promise {\n // Check if basic schema tables exist (migration 001)\n if (!appliedMigrations.has('001')) {\n const hasBasicTables = await this.checkTablesExist(['users', 'content', 'collections', 'media'])\n if (hasBasicTables) {\n appliedMigrations.set('001', {\n id: '001',\n applied_at: new Date().toISOString(),\n name: 'Initial Schema',\n filename: '001_initial_schema.sql'\n })\n await this.markMigrationApplied('001', 'Initial Schema', '001_initial_schema.sql')\n }\n }\n\n // Check if FAQ tables exist (migration 002)\n // Migration 002 creates only the 'faqs' table\n if (!appliedMigrations.has('002')) {\n const hasFaqTables = await this.checkTablesExist(['faqs'])\n if (hasFaqTables) {\n appliedMigrations.set('002', {\n id: '002',\n applied_at: new Date().toISOString(),\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql'\n })\n await this.markMigrationApplied('002', 'Faq Plugin', '002_faq_plugin.sql')\n }\n }\n\n // Check if stage 5 enhancement tables exist (migration 003)\n // Migration 003 creates content_fields, content_relationships, workflow_templates tables\n if (!appliedMigrations.has('003')) {\n const hasStage5Tables = await this.checkTablesExist(['content_fields', 'content_relationships', 'workflow_templates'])\n if (hasStage5Tables) {\n appliedMigrations.set('003', {\n id: '003',\n applied_at: new Date().toISOString(),\n name: 'Stage 5 Enhancements',\n filename: '003_stage5_enhancements.sql'\n })\n await this.markMigrationApplied('003', 'Stage 5 Enhancements', '003_stage5_enhancements.sql')\n }\n }\n\n // Check if testimonials table exists (migration 012)\n if (!appliedMigrations.has('012')) {\n const hasTestimonialsTables = await this.checkTablesExist(['testimonials'])\n if (hasTestimonialsTables) {\n appliedMigrations.set('012', {\n id: '012',\n applied_at: new Date().toISOString(),\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql'\n })\n await this.markMigrationApplied('012', 'Testimonials Plugin', '012_testimonials_plugin.sql')\n }\n }\n\n // Check if code_examples table exists (migration 013)\n if (!appliedMigrations.has('013')) {\n const hasCodeExamplesTables = await this.checkTablesExist(['code_examples'])\n if (hasCodeExamplesTables) {\n appliedMigrations.set('013', {\n id: '013',\n applied_at: new Date().toISOString(),\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql'\n })\n await this.markMigrationApplied('013', 'Code Examples Plugin', '013_code_examples_plugin.sql')\n }\n }\n\n // Check if user management tables exist (migration 004)\n if (!appliedMigrations.has('004')) {\n const hasUserTables = await this.checkTablesExist(['api_tokens', 'workflow_history'])\n if (hasUserTables) {\n appliedMigrations.set('004', {\n id: '004',\n applied_at: new Date().toISOString(),\n name: 'User Management',\n filename: '004_stage6_user_management.sql'\n })\n await this.markMigrationApplied('004', 'User Management', '004_stage6_user_management.sql')\n }\n }\n\n // Check if plugin system tables exist (migration 006)\n if (!appliedMigrations.has('006')) {\n const hasPluginTables = await this.checkTablesExist(['plugins', 'plugin_hooks'])\n if (hasPluginTables) {\n appliedMigrations.set('006', {\n id: '006',\n applied_at: new Date().toISOString(),\n name: 'Plugin System',\n filename: '006_plugin_system.sql'\n })\n await this.markMigrationApplied('006', 'Plugin System', '006_plugin_system.sql')\n }\n }\n\n // Check if managed column exists (migration 011)\n // This handles both cases:\n // 1. Migration not marked as applied but column exists -> mark as applied\n // 2. Migration marked as applied but column doesn't exist -> remove from applied (will re-run)\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!appliedMigrations.has('011') && hasManagedColumn) {\n appliedMigrations.set('011', {\n id: '011',\n applied_at: new Date().toISOString(),\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql'\n })\n await this.markMigrationApplied('011', 'Config Managed Collections', '011_config_managed_collections.sql')\n } else if (appliedMigrations.has('011') && !hasManagedColumn) {\n // Migration was marked as applied but column doesn't exist - remove it so it will re-run\n console.log('[Migration] Migration 011 marked as applied but managed column missing - will re-run')\n appliedMigrations.delete('011')\n await this.removeMigrationApplied('011')\n }\n\n // Check if system_logs table exists (migration 009)\n if (!appliedMigrations.has('009')) {\n const hasLoggingTables = await this.checkTablesExist(['system_logs', 'log_config'])\n if (hasLoggingTables) {\n appliedMigrations.set('009', {\n id: '009',\n applied_at: new Date().toISOString(),\n name: 'System Logging',\n filename: '009_system_logging.sql'\n })\n await this.markMigrationApplied('009', 'System Logging', '009_system_logging.sql')\n }\n }\n\n // Check if settings table exists (migration 018)\n if (!appliedMigrations.has('018')) {\n const hasSettingsTable = await this.checkTablesExist(['settings'])\n if (hasSettingsTable) {\n appliedMigrations.set('018', {\n id: '018',\n applied_at: new Date().toISOString(),\n name: 'Settings Table',\n filename: '018_settings_table.sql'\n })\n await this.markMigrationApplied('018', 'Settings Table', '018_settings_table.sql')\n }\n }\n\n // Check if forms tables exist (migration 029)\n // Migration 029 was reassigned between releases: older versions used it for \"Ai Search Plugin\",\n // newer versions use it for \"Add Forms System\". This handles the case where 029 is marked as\n // applied (from the old AI Search migration) but the forms tables don't actually exist.\n const hasFormsTables = await this.checkTablesExist(['forms', 'form_submissions', 'form_files'])\n if (!appliedMigrations.has('029') && hasFormsTables) {\n appliedMigrations.set('029', {\n id: '029',\n applied_at: new Date().toISOString(),\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql'\n })\n await this.markMigrationApplied('029', 'Add Forms System', '029_add_forms_system.sql')\n } else if (appliedMigrations.has('029') && !hasFormsTables) {\n // Migration was marked as applied (possibly from old \"Ai Search Plugin\" migration)\n // but forms tables don't exist - remove it so the forms migration will re-run\n console.log('[Migration] Migration 029 marked as applied but forms tables missing - will re-run')\n appliedMigrations.delete('029')\n await this.removeMigrationApplied('029')\n }\n\n // Check if user_profiles table exists (migration 032)\n // Table may already exist from app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\n if (!appliedMigrations.has('032')) {\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n appliedMigrations.set('032', {\n id: '032',\n applied_at: new Date().toISOString(),\n name: 'User Profiles',\n filename: '032_user_profiles.sql'\n })\n await this.markMigrationApplied('032', 'User Profiles', '032_user_profiles.sql')\n }\n }\n\n // Ensure user_profiles.data column exists (migration 035 is now a no-op).\n // Databases that ran the old 032 (without data column) need the column added.\n // Migration 035 was converted to a no-op to fix #771 (duplicate column error\n // on fresh installs), so we add the column here if it's missing.\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n const hasDataColumn = await this.checkColumnExists('user_profiles', 'data')\n if (!hasDataColumn) {\n try {\n await this.db.prepare(`ALTER TABLE user_profiles ADD COLUMN data TEXT DEFAULT '{}'`).run()\n console.log('[Migration] Added missing data column to user_profiles')\n } catch (error) {\n // Column may have been added concurrently; ignore duplicate column errors\n const msg = error instanceof Error ? error.message : String(error)\n if (!msg.includes('duplicate column name')) {\n console.error('[Migration] Failed to add data column to user_profiles:', msg)\n }\n }\n }\n }\n\n // Mark migration 035 as applied since it's now a no-op (column handled above)\n if (!appliedMigrations.has('035')) {\n const hasDataCol = hasUserProfilesTable && await this.checkColumnExists('user_profiles', 'data')\n if (hasDataCol) {\n appliedMigrations.set('035', {\n id: '035',\n applied_at: new Date().toISOString(),\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql'\n })\n await this.markMigrationApplied('035', 'User Profiles Data Column', '035_user_profiles_data_column.sql')\n }\n }\n }\n\n /**\n * Check if specific tables exist in the database\n */\n private async checkTablesExist(tableNames: string[]): Promise {\n try {\n for (const tableName of tableNames) {\n const result = await this.db.prepare(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`\n ).bind(tableName).first()\n\n if (!result) {\n return false\n }\n }\n return true\n } catch (error) {\n return false\n }\n }\n\n /**\n * Check if a specific column exists in a table\n */\n private async checkColumnExists(tableName: string, columnName: string): Promise {\n try {\n const result = await this.db.prepare(\n `SELECT * FROM pragma_table_info(?) WHERE name = ?`\n ).bind(tableName, columnName).first()\n\n return !!result\n } catch (error) {\n return false\n }\n }\n\n /**\n * Get migration status summary\n */\n async getMigrationStatus(): Promise {\n await this.initializeMigrationsTable()\n\n const migrations = await this.getAvailableMigrations()\n const appliedMigrations = migrations.filter(m => m.applied)\n const pendingMigrations = migrations.filter(m => !m.applied)\n\n const lastApplied = appliedMigrations.length > 0\n ? appliedMigrations[appliedMigrations.length - 1]?.appliedAt\n : undefined\n\n return {\n totalMigrations: migrations.length,\n appliedMigrations: appliedMigrations.length,\n pendingMigrations: pendingMigrations.length,\n lastApplied,\n migrations\n }\n }\n\n /**\n * Mark a migration as applied\n */\n async markMigrationApplied(migrationId: string, name: string, filename: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'INSERT OR REPLACE INTO migrations (id, name, filename, applied_at) VALUES (?, ?, ?, CURRENT_TIMESTAMP)'\n ).bind(migrationId, name, filename).run()\n }\n\n /**\n * Remove a migration from the applied list (so it can be re-run)\n */\n async removeMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'DELETE FROM migrations WHERE id = ?'\n ).bind(migrationId).run()\n }\n\n /**\n * Check if a specific migration has been applied\n */\n async isMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM migrations WHERE id = ?'\n ).bind(migrationId).first()\n\n return (result?.count as number) > 0\n }\n\n /**\n * Get the last applied migration\n */\n async getLastAppliedMigration(): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at DESC LIMIT 1'\n ).first()\n\n if (!result) return null\n\n return {\n id: result.id as string,\n name: result.name as string,\n filename: result.filename as string,\n applied: true,\n appliedAt: result.applied_at as string\n }\n }\n\n /**\n * Run pending migrations\n */\n async runPendingMigrations(): Promise<{ success: boolean; message: string; applied: string[]; errors: string[] }> {\n await this.initializeMigrationsTable()\n\n const status = await this.getMigrationStatus()\n const pendingMigrations = status.migrations.filter(m => !m.applied)\n\n if (pendingMigrations.length === 0) {\n return {\n success: true,\n message: 'All migrations are up to date',\n applied: [],\n errors: []\n }\n }\n\n // Actually execute the migration files\n const applied: string[] = []\n const errors: string[] = []\n\n for (const migration of pendingMigrations) {\n try {\n console.log(`[Migration] Applying ${migration.id}: ${migration.name}`)\n await this.applyMigration(migration)\n await this.markMigrationApplied(migration.id, migration.name, migration.filename)\n applied.push(migration.id)\n console.log(`[Migration] Successfully applied ${migration.id}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`[Migration] Failed to apply migration ${migration.id}:`, errorMessage)\n errors.push(`${migration.id}: ${errorMessage}`)\n // Continue with other migrations instead of stopping on first failure\n // This allows independent migrations to still be applied\n }\n }\n\n if (errors.length > 0 && applied.length === 0) {\n return {\n success: false,\n message: `Failed to apply migrations: ${errors.join('; ')}`,\n applied,\n errors\n }\n }\n\n return {\n success: true,\n message: applied.length > 0\n ? `Applied ${applied.length} migration(s)${errors.length > 0 ? ` (${errors.length} failed)` : ''}`\n : 'No migrations applied',\n applied,\n errors\n }\n }\n\n /**\n * Apply a specific migration\n */\n private async applyMigration(migration: Migration): Promise {\n // Get the actual migration SQL from the bundle\n const migrationSQL = getMigrationSQLById(migration.id)\n\n if (migrationSQL === null) {\n throw new Error(`Migration SQL not found for ${migration.id}`)\n }\n\n if (migrationSQL.trim() === '') {\n console.log(`[Migration] Skipping empty migration ${migration.id}`)\n return\n }\n\n // Split SQL into individual statements, handling triggers properly\n const statements = this.splitSQLStatements(migrationSQL)\n\n for (const statement of statements) {\n if (statement.trim()) {\n try {\n await this.db.prepare(statement).run()\n } catch (error) {\n // Check if it's a \"already exists\" type error and skip it\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('already exists') ||\n errorMessage.includes('duplicate column name') ||\n errorMessage.includes('UNIQUE constraint failed')) {\n console.log(`[Migration] Skipping (already exists): ${statement.substring(0, 50)}...`)\n continue\n }\n console.error(`[Migration] Error executing statement: ${statement.substring(0, 100)}...`)\n throw error\n }\n }\n }\n }\n\n /**\n * Split SQL into statements, handling CREATE TRIGGER properly\n */\n private splitSQLStatements(sql: string): string[] {\n const statements: string[] = []\n let current = ''\n let inTrigger = false\n\n const lines = sql.split('\\n')\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n // Skip comments and empty lines\n if (trimmed.startsWith('--') || trimmed.length === 0) {\n continue\n }\n\n // Check if we're entering a trigger\n if (trimmed.toUpperCase().includes('CREATE TRIGGER')) {\n inTrigger = true\n }\n\n current += line + '\\n'\n\n // Check if we're exiting a trigger\n if (inTrigger && trimmed.toUpperCase() === 'END;') {\n statements.push(current.trim())\n current = ''\n inTrigger = false\n }\n // Check for regular statement end (not in trigger)\n else if (!inTrigger && trimmed.endsWith(';')) {\n statements.push(current.trim())\n current = ''\n }\n }\n\n // Add any remaining statement\n if (current.trim()) {\n statements.push(current.trim())\n }\n\n return statements.filter(s => s.length > 0)\n }\n\n /**\n * Validate database schema\n */\n async validateSchema(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n // Basic table existence checks\n const requiredTables = [\n 'users', 'content', 'collections', 'media'\n ]\n\n for (const table of requiredTables) {\n try {\n await this.db.prepare(`SELECT COUNT(*) FROM ${table} LIMIT 1`).first()\n } catch (error) {\n issues.push(`Missing table: ${table}`)\n }\n }\n\n // Check for managed column in collections\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!hasManagedColumn) {\n issues.push('Missing column: collections.managed')\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/db/migrations-bundle.ts","../src/services/migrations.ts"],"names":["hasUserProfilesTable"],"mappings":";;;AAiBO,IAAM,iBAAA,GAAwC;AAAA,EACnD;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,QAAA,EAAU,wBAAA;AAAA,IACV,WAAA,EAAa,+BAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,6FAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU,oBAAA;AAAA,IACV,WAAA,EAAa,2BAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6NAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,wBAAA;AAAA,IACN,QAAA,EAAU,gCAAA;AAAA,IACV,WAAA,EAAa,uCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,4BAAA;AAAA,IACN,QAAA,EAAU,oCAAA;AAAA,IACV,WAAA,EAAa,2CAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,eAAA;AAAA,IACN,QAAA,EAAU,uBAAA;AAAA,IACV,WAAA,EAAa,8BAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,4EAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,mBAAA;AAAA,IACN,QAAA,EAAU,2BAAA;AAAA,IACV,WAAA,EAAa,kCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,uDAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,QAAA,EAAU,wBAAA;AAAA,IACV,WAAA,EAAa,+BAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,4BAAA;AAAA,IACN,QAAA,EAAU,oCAAA;AAAA,IACV,WAAA,EAAa,2CAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,sBAAA;AAAA,IACN,QAAA,EAAU,8BAAA;AAAA,IACV,WAAA,EAAa,qCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,uBAAA;AAAA,IACN,QAAA,EAAU,+BAAA;AAAA,IACV,WAAA,EAAa,sCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,+BAAA;AAAA,IACN,QAAA,EAAU,uCAAA;AAAA,IACV,WAAA,EAAa,8CAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,0BAAA;AAAA,IACN,QAAA,EAAU,kCAAA;AAAA,IACV,WAAA,EAAa,yCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,QAAA,EAAU,wBAAA;AAAA,IACV,WAAA,EAAa,+BAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,8BAAA;AAAA,IACN,QAAA,EAAU,sCAAA;AAAA,IACV,WAAA,EAAa,6CAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,QAAA,EAAU,0BAAA;AAAA,IACV,WAAA,EAAa,iCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,4BAAA;AAAA,IACN,QAAA,EAAU,oCAAA;AAAA,IACV,WAAA,EAAa,2CAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,oBAAA;AAAA,IACN,QAAA,EAAU,4BAAA;AAAA,IACV,WAAA,EAAa,mCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,yBAAA;AAAA,IACN,QAAA,EAAU,iCAAA;AAAA,IACV,WAAA,EAAa,wCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,oBAAA;AAAA,IACN,QAAA,EAAU,4BAAA;AAAA,IACV,WAAA,EAAa,mCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,eAAA;AAAA,IACN,QAAA,EAAU,uBAAA;AAAA,IACV,WAAA,EAAa,8BAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,gCAAA;AAAA,IACN,QAAA,EAAU,wCAAA;AAAA,IACV,WAAA,EAAa,+CAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,QAAA,EAAU,0BAAA;AAAA,IACV,WAAA,EAAa,iCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,wBAAA;AAAA,IACN,QAAA,EAAU,gCAAA;AAAA,IACV,WAAA,EAAa,uCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,QAAA,EAAU,0BAAA;AAAA,IACV,WAAA,EAAa,iCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,eAAA;AAAA,IACN,QAAA,EAAU,uBAAA;AAAA,IACV,WAAA,EAAa,8BAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,0BAAA;AAAA,IACN,QAAA,EAAU,kCAAA;AAAA,IACV,WAAA,EAAa,yCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,uBAAA;AAAA,IACN,QAAA,EAAU,+BAAA;AAAA,IACV,WAAA,EAAa,sCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,2BAAA;AAAA,IACN,QAAA,EAAU,mCAAA;AAAA,IACV,WAAA,EAAa,0CAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,QAAA,EAAU,0BAAA;AAAA,IACV,WAAA,EAAa,iCAAA;AAAA,IACb,GAAA,EAAK;AAAA;AAET,CAAA;AAGO,IAAM,oBAAoB,IAAI,GAAA;AAAA,EACnC,kBAAkB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC;AACtC,CAAA;AAGO,SAAS,oBAAoB,EAAA,EAA2B;AAC7D,EAAA,OAAO,iBAAA,CAAkB,GAAA,CAAI,EAAE,CAAA,EAAG,GAAA,IAAO,IAAA;AAC3C;;;AC5PO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,MAAM,yBAAA,GAA2C;AAC/C,IAAA,MAAM,gBAAA,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAUzB,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,gBAAgB,EAAE,GAAA,EAAI;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,GAA+C;AACnD,IAAA,MAAM,aAA0B,EAAC;AAGjC,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAClC;AAAA,MACA,GAAA,EAAI;AAEN,IAAA,MAAM,oBAAoB,IAAI,GAAA;AAAA,MAC5B,aAAA,CAAc,OAAA,EAAS,GAAA,CAAI,CAAC,GAAA,KAAa,CAAC,GAAA,CAAI,EAAA,EAAI,GAAG,CAAC,CAAA,IAAK;AAAC,KAC9D;AAGA,IAAA,MAAM,IAAA,CAAK,4BAA4B,iBAAiB,CAAA;AAGxD,IAAA,KAAA,MAAW,WAAW,iBAAA,EAAmB;AACvC,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AAChD,MAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AAEpD,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,OAAA;AAAA,QACA,SAAA,EAAW,OAAA,GAAU,WAAA,EAAa,UAAA,GAAa,MAAA;AAAA,QAC/C,IAAA,EAAM,QAAQ,GAAA,CAAI;AAAA,OACnB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,4BAA4B,iBAAA,EAAoD;AAE5F,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,OAAA,EAAS,SAAA,EAAW,aAAA,EAAe,OAAO,CAAC,CAAA;AAC/F,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,gBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,gBAAA,EAAkB,wBAAwB,CAAA;AAAA,MACnF;AAAA,IACF;AAIA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,eAAe,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,MAAM,CAAC,CAAA;AACzD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,YAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,YAAA,EAAc,oBAAoB,CAAA;AAAA,MAC3E;AAAA,IACF;AAIA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,gBAAA,EAAkB,uBAAA,EAAyB,oBAAoB,CAAC,CAAA;AACrH,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,sBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,sBAAA,EAAwB,6BAA6B,CAAA;AAAA,MAC9F;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,wBAAwB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,cAAc,CAAC,CAAA;AAC1E,MAAA,IAAI,qBAAA,EAAuB;AACzB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,qBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,qBAAA,EAAuB,6BAA6B,CAAA;AAAA,MAC7F;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,wBAAwB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,eAAe,CAAC,CAAA;AAC3E,MAAA,IAAI,qBAAA,EAAuB;AACzB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,sBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,sBAAA,EAAwB,8BAA8B,CAAA;AAAA,MAC/F;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,iBAAiB,CAAC,YAAA,EAAc,kBAAkB,CAAC,CAAA;AACpF,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,iBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,iBAAA,EAAmB,gCAAgC,CAAA;AAAA,MAC5F;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,kBAAkB,MAAM,IAAA,CAAK,iBAAiB,CAAC,SAAA,EAAW,cAAc,CAAC,CAAA;AAC/E,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,eAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,eAAA,EAAiB,uBAAuB,CAAA;AAAA,MACjF;AAAA,IACF;AAMA,IAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,iBAAA,CAAkB,eAAe,SAAS,CAAA;AAC9E,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,KAAK,gBAAA,EAAkB;AACrD,MAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,QAC3B,EAAA,EAAI,KAAA;AAAA,QACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QACnC,IAAA,EAAM,4BAAA;AAAA,QACN,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,4BAAA,EAA8B,oCAAoC,CAAA;AAAA,IAC3G,WAAW,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,IAAK,CAAC,gBAAA,EAAkB;AAE5D,MAAA,OAAA,CAAQ,IAAI,sFAAsF,CAAA;AAClG,MAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,MAAA,MAAM,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,mBAAmB,MAAM,IAAA,CAAK,iBAAiB,CAAC,aAAA,EAAe,YAAY,CAAC,CAAA;AAClF,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,gBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,gBAAA,EAAkB,wBAAwB,CAAA;AAAA,MACnF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,mBAAmB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,UAAU,CAAC,CAAA;AACjE,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,gBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,gBAAA,EAAkB,wBAAwB,CAAA;AAAA,MACnF;AAAA,IACF;AAMA,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,OAAA,EAAS,kBAAA,EAAoB,YAAY,CAAC,CAAA;AAC9F,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,KAAK,cAAA,EAAgB;AACnD,MAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,QAC3B,EAAA,EAAI,KAAA;AAAA,QACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QACnC,IAAA,EAAM,kBAAA;AAAA,QACN,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,kBAAA,EAAoB,0BAA0B,CAAA;AAAA,IACvF,WAAW,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,IAAK,CAAC,cAAA,EAAgB;AAG1D,MAAA,OAAA,CAAQ,IAAI,oFAAoF,CAAA;AAChG,MAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,MAAA,MAAM,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAAA,IACzC;AAIA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAMA,wBAAuB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,eAAe,CAAC,CAAA;AAC1E,MAAA,IAAIA,qBAAAA,EAAsB;AACxB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,eAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,eAAA,EAAiB,uBAAuB,CAAA;AAAA,MACjF;AAAA,IACF;AAMA,IAAA,MAAM,uBAAuB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,eAAe,CAAC,CAAA;AAC1E,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,iBAAA,CAAkB,iBAAiB,MAAM,CAAA;AAC1E,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,CAAA,2DAAA,CAA6D,EAAE,GAAA,EAAI;AACzF,UAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AAAA,QACtE,SAAS,KAAA,EAAO;AAEd,UAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACjE,UAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,uBAAuB,CAAA,EAAG;AAC1C,YAAA,OAAA,CAAQ,KAAA,CAAM,2DAA2D,GAAG,CAAA;AAAA,UAC9E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,aAAa,oBAAA,IAAwB,MAAM,IAAA,CAAK,iBAAA,CAAkB,iBAAiB,MAAM,CAAA;AAC/F,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,2BAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,2BAAA,EAA6B,mCAAmC,CAAA;AAAA,MACzG;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,UAAA,EAAwC;AACrE,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,UAC3B,CAAA,4DAAA;AAAA,SACF,CAAE,IAAA,CAAK,SAAS,CAAA,CAAE,KAAA,EAAM;AAExB,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,CAAkB,SAAA,EAAmB,UAAA,EAAsC;AACvF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,QAC3B,CAAA,iDAAA;AAAA,OACF,CAAE,IAAA,CAAK,SAAA,EAAW,UAAU,EAAE,KAAA,EAAM;AAEpC,MAAA,OAAO,CAAC,CAAC,MAAA;AAAA,IACX,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAA+C;AACnD,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,sBAAA,EAAuB;AACrD,IAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAC1D,IAAA,MAAM,oBAAoB,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,OAAO,CAAA;AAE3D,IAAA,MAAM,WAAA,GAAc,kBAAkB,MAAA,GAAS,CAAA,GAC3C,kBAAkB,iBAAA,CAAkB,MAAA,GAAS,CAAC,CAAA,EAAG,SAAA,GACjD,MAAA;AAEJ,IAAA,OAAO;AAAA,MACL,iBAAiB,UAAA,CAAW,MAAA;AAAA,MAC5B,mBAAmB,iBAAA,CAAkB,MAAA;AAAA,MACrC,mBAAmB,iBAAA,CAAkB,MAAA;AAAA,MACrC,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CAAqB,WAAA,EAAqB,IAAA,EAAc,QAAA,EAAiC;AAC7F,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,KAAK,EAAA,CAAG,OAAA;AAAA,MACZ;AAAA,MACA,IAAA,CAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,EAAE,GAAA,EAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,WAAA,EAAoC;AAC/D,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,KAAK,EAAA,CAAG,OAAA;AAAA,MACZ;AAAA,KACF,CAAE,IAAA,CAAK,WAAW,CAAA,CAAE,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,WAAA,EAAuC;AAC9D,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,WAAW,CAAA,CAAE,KAAA,EAAM;AAE1B,IAAA,OAAQ,QAAQ,KAAA,GAAmB,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAA,GAAqD;AACzD,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,MACA,KAAA,EAAM;AAER,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,OAAO;AAAA,MACL,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAA,EAAS,IAAA;AAAA,MACT,WAAW,MAAA,CAAO;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAA4G;AAChH,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAC7C,IAAA,MAAM,oBAAoB,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA,CAAA,KAAK,CAAC,EAAE,OAAO,CAAA;AAElE,IAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,+BAAA;AAAA,QACT,SAAS,EAAC;AAAA,QACV,QAAQ;AAAC,OACX;AAAA,IACF;AAGA,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,KAAA,MAAW,aAAa,iBAAA,EAAmB;AACzC,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,IAAI,CAAA,qBAAA,EAAwB,SAAA,CAAU,EAAE,CAAA,EAAA,EAAK,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AACrE,QAAA,MAAM,IAAA,CAAK,eAAe,SAAS,CAAA;AACnC,QAAA,MAAM,KAAK,oBAAA,CAAqB,SAAA,CAAU,IAAI,SAAA,CAAU,IAAA,EAAM,UAAU,QAAQ,CAAA;AAChF,QAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,EAAE,CAAA;AACzB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iCAAA,EAAoC,SAAA,CAAU,EAAE,CAAA,CAAE,CAAA;AAAA,MAChE,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,SAAA,CAAU,EAAE,KAAK,YAAY,CAAA;AACpF,QAAA,MAAA,CAAO,KAAK,CAAA,EAAG,SAAA,CAAU,EAAE,CAAA,EAAA,EAAK,YAAY,CAAA,CAAE,CAAA;AAAA,MAGhD;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC7C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,CAAA,4BAAA,EAA+B,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QACzD,OAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GACtB,CAAA,QAAA,EAAW,QAAQ,MAAM,CAAA,aAAA,EAAgB,MAAA,CAAO,MAAA,GAAS,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,QAAA,CAAA,GAAa,EAAE,CAAA,CAAA,GAC9F,uBAAA;AAAA,MACJ,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAe,SAAA,EAAqC;AAEhE,IAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,SAAA,CAAU,EAAE,CAAA;AAErD,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,SAAA,CAAU,EAAE,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,YAAA,CAAa,IAAA,EAAK,KAAM,EAAA,EAAI;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,SAAA,CAAU,EAAE,CAAA,CAAE,CAAA;AAClE,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,YAAY,CAAA;AAEvD,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAI,SAAA,CAAU,MAAK,EAAG;AACpB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,SAAS,EAAE,GAAA,EAAI;AAAA,QACvC,SAAS,KAAA,EAAO;AAEd,UAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,UAAA,IAAI,YAAA,CAAa,QAAA,CAAS,gBAAgB,CAAA,IACtC,YAAA,CAAa,QAAA,CAAS,uBAAuB,CAAA,IAC7C,YAAA,CAAa,QAAA,CAAS,0BAA0B,CAAA,EAAG;AACrD,YAAA,OAAA,CAAQ,IAAI,CAAA,uCAAA,EAA0C,SAAA,CAAU,UAAU,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAK,CAAA;AACrF,YAAA;AAAA,UACF;AACA,UAAA,OAAA,CAAQ,MAAM,CAAA,uCAAA,EAA0C,SAAA,CAAU,UAAU,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAK,CAAA;AACxF,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,GAAA,EAAuB;AAChD,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAE5B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAG1B,MAAA,IAAI,QAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACpD,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACpD,QAAA,SAAA,GAAY,IAAA;AAAA,MACd;AAEA,MAAA,OAAA,IAAW,IAAA,GAAO,IAAA;AAGlB,MAAA,IAAI,SAAA,IAAa,OAAA,CAAQ,WAAA,EAAY,KAAM,MAAA,EAAQ;AACjD,QAAA,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAC9B,QAAA,OAAA,GAAU,EAAA;AACV,QAAA,SAAA,GAAY,KAAA;AAAA,MACd,WAES,CAAC,SAAA,IAAa,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5C,QAAA,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAC9B,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,MAAK,EAAG;AAClB,MAAA,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAAgE;AACpE,IAAA,MAAM,SAAmB,EAAC;AAG1B,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,OAAA;AAAA,MAAS,SAAA;AAAA,MAAW,aAAA;AAAA,MAAe;AAAA,KACrC;AAEA,IAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,EAAA,CAAG,OAAA,CAAQ,wBAAwB,KAAK,CAAA,QAAA,CAAU,EAAE,KAAA,EAAM;AAAA,MACvE,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE,CAAA;AAAA,MACvC;AAAA,IACF;AAGA,IAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,iBAAA,CAAkB,eAAe,SAAS,CAAA;AAC9E,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAA,CAAO,KAAK,qCAAqC,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AACF","file":"chunk-ICMNCCX2.cjs","sourcesContent":["/**\n * AUTO-GENERATED FILE - DO NOT EDIT\n * Generated by: scripts/generate-migrations.ts\n * Generated at: 2026-05-16T15:00:21.459Z\n *\n * This file contains all migration SQL bundled for use in Cloudflare Workers\n * where filesystem access is not available at runtime.\n */\n\nexport interface BundledMigration {\n id: string\n name: string\n filename: string\n description: string\n sql: string\n}\n\nexport const bundledMigrations: BundledMigration[] = [\n {\n id: '001',\n name: 'Initial Schema',\n filename: '001_initial_schema.sql',\n description: 'Migration 001: Initial Schema',\n sql: \"-- Initial schema for SonicJS AI\\n-- Create users table for authentication\\nCREATE TABLE IF NOT EXISTS users (\\n id TEXT PRIMARY KEY,\\n email TEXT NOT NULL UNIQUE,\\n username TEXT NOT NULL UNIQUE,\\n first_name TEXT NOT NULL,\\n last_name TEXT NOT NULL,\\n password_hash TEXT,\\n role TEXT NOT NULL DEFAULT 'viewer',\\n avatar TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n last_login_at INTEGER,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create collections table for content schema definitions\\nCREATE TABLE IF NOT EXISTS collections (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n schema TEXT NOT NULL, -- JSON schema definition\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content table for actual content data\\nCREATE TABLE IF NOT EXISTS content (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n slug TEXT NOT NULL,\\n title TEXT NOT NULL,\\n data TEXT NOT NULL, -- JSON content data\\n status TEXT NOT NULL DEFAULT 'draft',\\n published_at INTEGER,\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content_versions table for versioning\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n version INTEGER NOT NULL,\\n data TEXT NOT NULL, -- JSON data\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create media/files table with comprehensive R2 integration\\nCREATE TABLE IF NOT EXISTS media (\\n id TEXT PRIMARY KEY,\\n filename TEXT NOT NULL,\\n original_name TEXT NOT NULL,\\n mime_type TEXT NOT NULL,\\n size INTEGER NOT NULL,\\n width INTEGER,\\n height INTEGER,\\n folder TEXT NOT NULL DEFAULT 'uploads',\\n r2_key TEXT NOT NULL, -- R2 storage key\\n public_url TEXT NOT NULL, -- CDN URL\\n thumbnail_url TEXT, -- Cloudflare Images URL\\n alt TEXT,\\n caption TEXT,\\n tags TEXT, -- JSON array of tags\\n uploaded_by TEXT NOT NULL REFERENCES users(id),\\n uploaded_at INTEGER NOT NULL,\\n updated_at INTEGER,\\n published_at INTEGER,\\n scheduled_at INTEGER,\\n archived_at INTEGER,\\n deleted_at INTEGER\\n);\\n\\n-- Create API tokens table for programmatic access\\nCREATE TABLE IF NOT EXISTS api_tokens (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n permissions TEXT NOT NULL, -- JSON array of permissions\\n expires_at INTEGER,\\n last_used_at INTEGER,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create workflow history table for content workflow tracking\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n action TEXT NOT NULL,\\n from_status TEXT NOT NULL,\\n to_status TEXT NOT NULL,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n comment TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\\nCREATE INDEX IF NOT EXISTS idx_users_username ON users(username);\\nCREATE INDEX IF NOT EXISTS idx_users_role ON users(role);\\n\\nCREATE INDEX IF NOT EXISTS idx_collections_name ON collections(name);\\nCREATE INDEX IF NOT EXISTS idx_collections_active ON collections(is_active);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_collection ON content(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_author ON content(author_id);\\nCREATE INDEX IF NOT EXISTS idx_content_status ON content(status);\\nCREATE INDEX IF NOT EXISTS idx_content_published ON content(published_at);\\nCREATE INDEX IF NOT EXISTS idx_content_slug ON content(slug);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_version ON content_versions(version);\\n\\nCREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);\\nCREATE INDEX IF NOT EXISTS idx_media_type ON media(mime_type);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_by ON media(uploaded_by);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_at ON media(uploaded_at);\\nCREATE INDEX IF NOT EXISTS idx_media_deleted ON media(deleted_at);\\n\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_user ON api_tokens(user_id);\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_token ON api_tokens(token);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_user ON workflow_history(user_id);\\n\\n-- Note: Admin user is created via the seed script with user-provided credentials\\n-- Run 'npm run seed' after migrations to create the admin user\\n\\n-- Insert sample collections\\nINSERT OR IGNORE INTO collections (\\n id, name, display_name, description, schema, \\n is_active, created_at, updated_at\\n) VALUES (\\n 'blog-posts-collection',\\n 'blog_posts',\\n 'Blog Posts',\\n 'Blog post content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"excerpt\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Excerpt\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"},\\\"tags\\\":{\\\"type\\\":\\\"array\\\",\\\"title\\\":\\\"Tags\\\",\\\"items\\\":{\\\"type\\\":\\\"string\\\"}},\\\"status\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Status\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"],\\\"default\\\":\\\"draft\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'pages-collection',\\n 'pages',\\n 'Pages',\\n 'Static page content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"slug\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Slug\\\"},\\\"meta_description\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Meta Description\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'news-collection',\\n 'news',\\n 'News',\\n 'News article content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"publish_date\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Publish Date\\\",\\\"format\\\":\\\"date\\\"},\\\"author\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Author\\\"},\\\"category\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Category\\\",\\\"enum\\\":[\\\"technology\\\",\\\"business\\\",\\\"general\\\"]}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Note: Sample content can be created via the admin interface after the admin user is seeded\"\n },\n {\n id: '002',\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql',\n description: 'Migration 002: Faq Plugin',\n sql: \"-- FAQ Plugin Migration (DEPRECATED - Now managed by third-party plugin)\\n-- Creates FAQ table for the FAQ plugin\\n-- NOTE: This migration is kept for historical purposes. \\n-- The FAQ functionality is now provided by the faq-plugin third-party plugin.\\n\\nCREATE TABLE IF NOT EXISTS faqs (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n question TEXT NOT NULL,\\n answer TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_faqs_category ON faqs(category);\\nCREATE INDEX IF NOT EXISTS idx_faqs_published ON faqs(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_faqs_sort_order ON faqs(sortOrder);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS faqs_updated_at\\n AFTER UPDATE ON faqs\\nBEGIN\\n UPDATE faqs SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert sample FAQ data\\nINSERT OR IGNORE INTO faqs (question, answer, category, tags, isPublished, sortOrder) VALUES \\n('What is SonicJS AI?', \\n'SonicJS AI is a modern, TypeScript-first headless CMS built for Cloudflare''s edge platform. It provides a complete content management system with admin interface, API endpoints, and plugin architecture.',\\n'general',\\n'sonicjs, cms, cloudflare',\\n1,\\n1),\\n\\n('How do I get started with SonicJS AI?',\\n'To get started: 1) Clone the repository, 2) Install dependencies with npm install, 3) Set up your Cloudflare account and services, 4) Run the development server with npm run dev, 5) Access the admin interface at /admin.',\\n'general',\\n'getting-started, setup',\\n1,\\n2),\\n\\n('What technologies does SonicJS AI use?',\\n'SonicJS AI is built with: TypeScript for type safety, Hono.js as the web framework, Cloudflare D1 for the database, Cloudflare R2 for media storage, Cloudflare Workers for serverless execution, and Tailwind CSS for styling.',\\n'technical',\\n'technology-stack, typescript, cloudflare',\\n1,\\n3),\\n\\n('How do I create content in SonicJS AI?',\\n'Content creation is done through the admin interface. Navigate to /admin, log in with your credentials, go to Content section, select a collection, and click \\\"New Content\\\" to create articles, pages, or other content types.',\\n'general',\\n'content-creation, admin',\\n1,\\n4),\\n\\n('Is SonicJS AI free to use?',\\n'SonicJS AI is open source and free to use. You only pay for the Cloudflare services you consume (D1 database, R2 storage, Workers execution time). Cloudflare offers generous free tiers for development and small projects.',\\n'billing',\\n'pricing, open-source, cloudflare',\\n1,\\n5),\\n\\n('How do I add custom functionality?',\\n'SonicJS AI features a plugin system that allows you to extend functionality. You can create plugins using the PluginBuilder API, add custom routes, models, admin pages, and integrate with external services.',\\n'technical',\\n'plugins, customization, development',\\n1,\\n6),\\n\\n('Can I customize the admin interface?',\\n'Yes! The admin interface is built with TypeScript templates and can be customized. You can modify existing templates, create new components, add custom pages, and integrate your own styling while maintaining the dark theme.',\\n'technical',\\n'admin-interface, customization, templates',\\n1,\\n7),\\n\\n('How does authentication work?',\\n'SonicJS AI includes a built-in authentication system with JWT tokens, role-based access control (admin, editor, viewer), secure password hashing, and session management. Users can be managed through the admin interface.',\\n'technical',\\n'authentication, security, users',\\n1,\\n8);\"\n },\n {\n id: '003',\n name: 'Stage5 Enhancements',\n filename: '003_stage5_enhancements.sql',\n description: 'Migration 003: Stage5 Enhancements',\n sql: \"-- Stage 5: Advanced Content Management enhancements\\n-- Add scheduling and workflow features to content table\\n\\n-- Add content scheduling columns\\nALTER TABLE content ADD COLUMN scheduled_publish_at INTEGER;\\nALTER TABLE content ADD COLUMN scheduled_unpublish_at INTEGER;\\n\\n-- Add workflow and review columns\\nALTER TABLE content ADD COLUMN review_status TEXT DEFAULT 'none'; -- none, pending, approved, rejected\\nALTER TABLE content ADD COLUMN reviewer_id TEXT REFERENCES users(id);\\nALTER TABLE content ADD COLUMN reviewed_at INTEGER;\\nALTER TABLE content ADD COLUMN review_notes TEXT;\\n\\n-- Add content metadata\\nALTER TABLE content ADD COLUMN meta_title TEXT;\\nALTER TABLE content ADD COLUMN meta_description TEXT;\\nALTER TABLE content ADD COLUMN featured_image_id TEXT REFERENCES media(id);\\nALTER TABLE content ADD COLUMN content_type TEXT DEFAULT 'standard'; -- standard, template, component\\n\\n-- Create content_fields table for dynamic field definitions\\nCREATE TABLE IF NOT EXISTS content_fields (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n field_name TEXT NOT NULL,\\n field_type TEXT NOT NULL, -- text, richtext, number, boolean, date, select, media, relationship\\n field_label TEXT NOT NULL,\\n field_options TEXT, -- JSON for select options, validation rules, etc.\\n field_order INTEGER NOT NULL DEFAULT 0,\\n is_required INTEGER NOT NULL DEFAULT 0,\\n is_searchable INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(collection_id, field_name)\\n);\\n\\n-- Create content_relationships table for content relationships\\nCREATE TABLE IF NOT EXISTS content_relationships (\\n id TEXT PRIMARY KEY,\\n source_content_id TEXT NOT NULL REFERENCES content(id),\\n target_content_id TEXT NOT NULL REFERENCES content(id),\\n relationship_type TEXT NOT NULL, -- references, tags, categories\\n created_at INTEGER NOT NULL,\\n UNIQUE(source_content_id, target_content_id, relationship_type)\\n);\\n\\n-- Create workflow_templates table for reusable workflows\\nCREATE TABLE IF NOT EXISTS workflow_templates (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT REFERENCES collections(id), -- null means applies to all collections\\n workflow_steps TEXT NOT NULL, -- JSON array of workflow steps\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Add indexes for new columns\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_unpublish ON content(scheduled_unpublish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_review_status ON content(review_status);\\nCREATE INDEX IF NOT EXISTS idx_content_reviewer ON content(reviewer_id);\\nCREATE INDEX IF NOT EXISTS idx_content_content_type ON content(content_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_fields_collection ON content_fields(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_name ON content_fields(field_name);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_type ON content_fields(field_type);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_order ON content_fields(field_order);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_source ON content_relationships(source_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_target ON content_relationships(target_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_type ON content_relationships(relationship_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_collection ON workflow_templates(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_active ON workflow_templates(is_active);\\n\\n-- Insert default workflow template\\nINSERT OR IGNORE INTO workflow_templates (\\n id, name, description, workflow_steps, is_active, created_at, updated_at\\n) VALUES (\\n 'default-content-workflow',\\n 'Default Content Workflow',\\n 'Standard content workflow: Draft → Review → Published',\\n '[\\n {\\\"step\\\": \\\"draft\\\", \\\"name\\\": \\\"Draft\\\", \\\"description\\\": \\\"Content is being created\\\", \\\"permissions\\\": [\\\"author\\\", \\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"review\\\", \\\"name\\\": \\\"Under Review\\\", \\\"description\\\": \\\"Content is pending review\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"published\\\", \\\"name\\\": \\\"Published\\\", \\\"description\\\": \\\"Content is live\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"archived\\\", \\\"name\\\": \\\"Archived\\\", \\\"description\\\": \\\"Content is archived\\\", \\\"permissions\\\": [\\\"admin\\\"]}\\n ]',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Insert enhanced field definitions for existing collections\\nINSERT OR IGNORE INTO content_fields (\\n id, collection_id, field_name, field_type, field_label, field_options, field_order, is_required, is_searchable, created_at, updated_at\\n) VALUES \\n-- Blog Posts fields\\n('blog-title-field', 'blog-posts-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter blog post title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-content-field', 'blog-posts-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-excerpt-field', 'blog-posts-collection', 'excerpt', 'text', 'Excerpt', '{\\\"maxLength\\\": 500, \\\"rows\\\": 3, \\\"placeholder\\\": \\\"Brief description of the post\\\"}', 3, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-tags-field', 'blog-posts-collection', 'tags', 'select', 'Tags', '{\\\"multiple\\\": true, \\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"tutorial\\\", \\\"news\\\", \\\"update\\\"], \\\"allowCustom\\\": true}', 4, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-image-field', 'blog-posts-collection', 'featured_image', 'media', 'Featured Image', '{\\\"accept\\\": \\\"image/*\\\", \\\"maxSize\\\": \\\"5MB\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-publish-date-field', 'blog-posts-collection', 'publish_date', 'date', 'Publish Date', '{\\\"format\\\": \\\"YYYY-MM-DD\\\", \\\"defaultToday\\\": true}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-field', 'blog-posts-collection', 'is_featured', 'boolean', 'Featured Post', '{\\\"default\\\": false}', 7, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- Pages fields\\n('pages-title-field', 'pages-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter page title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-content-field', 'pages-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 500}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-slug-field', 'pages-collection', 'slug', 'text', 'URL Slug', '{\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\"}', 3, 1, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-meta-desc-field', 'pages-collection', 'meta_description', 'text', 'Meta Description', '{\\\"maxLength\\\": 160, \\\"rows\\\": 2, \\\"placeholder\\\": \\\"SEO description for search engines\\\"}', 4, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-template-field', 'pages-collection', 'template', 'select', 'Page Template', '{\\\"options\\\": [\\\"default\\\", \\\"landing\\\", \\\"contact\\\", \\\"about\\\"], \\\"default\\\": \\\"default\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- News fields\\n('news-title-field', 'news-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter news title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-content-field', 'news-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"news\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-category-field', 'news-collection', 'category', 'select', 'Category', '{\\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"politics\\\", \\\"sports\\\", \\\"entertainment\\\", \\\"health\\\"], \\\"required\\\": true}', 3, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-author-field', 'news-collection', 'author', 'text', 'Author', '{\\\"placeholder\\\": \\\"Author name\\\"}', 4, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-source-field', 'news-collection', 'source', 'text', 'Source', '{\\\"placeholder\\\": \\\"News source\\\"}', 5, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-priority-field', 'news-collection', 'priority', 'select', 'Priority', '{\\\"options\\\": [\\\"low\\\", \\\"normal\\\", \\\"high\\\", \\\"breaking\\\"], \\\"default\\\": \\\"normal\\\"}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000);\"\n },\n {\n id: '004',\n name: 'Stage6 User Management',\n filename: '004_stage6_user_management.sql',\n description: 'Migration 004: Stage6 User Management',\n sql: \"-- Stage 6: User Management & Permissions enhancements\\n-- Enhanced user system with profiles, teams, permissions, and activity logging\\n\\n-- Add user profile and preferences columns\\nALTER TABLE users ADD COLUMN phone TEXT;\\nALTER TABLE users ADD COLUMN bio TEXT;\\nALTER TABLE users ADD COLUMN avatar_url TEXT;\\nALTER TABLE users ADD COLUMN timezone TEXT DEFAULT 'UTC';\\nALTER TABLE users ADD COLUMN language TEXT DEFAULT 'en';\\nALTER TABLE users ADD COLUMN email_notifications INTEGER DEFAULT 1;\\nALTER TABLE users ADD COLUMN theme TEXT DEFAULT 'dark';\\nALTER TABLE users ADD COLUMN two_factor_enabled INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN two_factor_secret TEXT;\\nALTER TABLE users ADD COLUMN password_reset_token TEXT;\\nALTER TABLE users ADD COLUMN password_reset_expires INTEGER;\\nALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN email_verification_token TEXT;\\nALTER TABLE users ADD COLUMN invitation_token TEXT;\\nALTER TABLE users ADD COLUMN invited_by TEXT REFERENCES users(id);\\nALTER TABLE users ADD COLUMN invited_at INTEGER;\\nALTER TABLE users ADD COLUMN accepted_invitation_at INTEGER;\\n\\n-- Create teams table for team-based collaboration\\nCREATE TABLE IF NOT EXISTS teams (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n slug TEXT NOT NULL UNIQUE,\\n owner_id TEXT NOT NULL REFERENCES users(id),\\n settings TEXT, -- JSON for team settings\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create team memberships table\\nCREATE TABLE IF NOT EXISTS team_memberships (\\n id TEXT PRIMARY KEY,\\n team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n role TEXT NOT NULL DEFAULT 'member', -- owner, admin, editor, member, viewer\\n permissions TEXT, -- JSON for specific permissions\\n joined_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(team_id, user_id)\\n);\\n\\n-- Create permissions table for granular access control\\nCREATE TABLE IF NOT EXISTS permissions (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n description TEXT,\\n category TEXT NOT NULL, -- content, users, collections, media, settings\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create role permissions mapping\\nCREATE TABLE IF NOT EXISTS role_permissions (\\n id TEXT PRIMARY KEY,\\n role TEXT NOT NULL,\\n permission_id TEXT NOT NULL REFERENCES permissions(id),\\n created_at INTEGER NOT NULL,\\n UNIQUE(role, permission_id)\\n);\\n\\n-- Create user sessions table for better session management\\nCREATE TABLE IF NOT EXISTS user_sessions (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n token_hash TEXT NOT NULL,\\n ip_address TEXT,\\n user_agent TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n expires_at INTEGER NOT NULL,\\n created_at INTEGER NOT NULL,\\n last_used_at INTEGER\\n);\\n\\n-- Create activity log table for audit trails\\nCREATE TABLE IF NOT EXISTS activity_logs (\\n id TEXT PRIMARY KEY,\\n user_id TEXT REFERENCES users(id),\\n action TEXT NOT NULL,\\n resource_type TEXT, -- users, content, collections, media, etc.\\n resource_id TEXT,\\n details TEXT, -- JSON with additional details\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create password history table for security\\nCREATE TABLE IF NOT EXISTS password_history (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n password_hash TEXT NOT NULL,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Insert default permissions\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at) VALUES\\n ('perm_content_create', 'content.create', 'Create new content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_read', 'content.read', 'View content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_update', 'content.update', 'Edit existing content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_delete', 'content.delete', 'Delete content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_publish', 'content.publish', 'Publish/unpublish content', 'content', strftime('%s', 'now') * 1000),\\n \\n ('perm_collections_create', 'collections.create', 'Create new collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_read', 'collections.read', 'View collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_update', 'collections.update', 'Edit collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_delete', 'collections.delete', 'Delete collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_fields', 'collections.fields', 'Manage collection fields', 'collections', strftime('%s', 'now') * 1000),\\n \\n ('perm_media_upload', 'media.upload', 'Upload media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_read', 'media.read', 'View media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_update', 'media.update', 'Edit media metadata', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_delete', 'media.delete', 'Delete media files', 'media', strftime('%s', 'now') * 1000),\\n \\n ('perm_users_create', 'users.create', 'Invite new users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_read', 'users.read', 'View user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_update', 'users.update', 'Edit user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_delete', 'users.delete', 'Deactivate users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_roles', 'users.roles', 'Manage user roles', 'users', strftime('%s', 'now') * 1000),\\n \\n ('perm_settings_read', 'settings.read', 'View system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_settings_update', 'settings.update', 'Modify system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_activity_read', 'activity.read', 'View activity logs', 'settings', strftime('%s', 'now') * 1000);\\n\\n-- Assign permissions to default roles\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at) VALUES\\n -- Admin has all permissions\\n ('rp_admin_content_create', 'admin', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_read', 'admin', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_update', 'admin', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_delete', 'admin', 'perm_content_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_publish', 'admin', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_create', 'admin', 'perm_collections_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_read', 'admin', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_update', 'admin', 'perm_collections_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_delete', 'admin', 'perm_collections_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_fields', 'admin', 'perm_collections_fields', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_upload', 'admin', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_read', 'admin', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_update', 'admin', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_delete', 'admin', 'perm_media_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_create', 'admin', 'perm_users_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_read', 'admin', 'perm_users_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_update', 'admin', 'perm_users_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_delete', 'admin', 'perm_users_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_roles', 'admin', 'perm_users_roles', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_read', 'admin', 'perm_settings_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_update', 'admin', 'perm_settings_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_activity_read', 'admin', 'perm_activity_read', strftime('%s', 'now') * 1000),\\n \\n -- Editor permissions\\n ('rp_editor_content_create', 'editor', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_read', 'editor', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_update', 'editor', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_publish', 'editor', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_editor_collections_read', 'editor', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_upload', 'editor', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_read', 'editor', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_update', 'editor', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_users_read', 'editor', 'perm_users_read', strftime('%s', 'now') * 1000),\\n \\n -- Viewer permissions\\n ('rp_viewer_content_read', 'viewer', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_collections_read', 'viewer', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_media_read', 'viewer', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_users_read', 'viewer', 'perm_users_read', strftime('%s', 'now') * 1000);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_team_id ON team_memberships(team_id);\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_user_id ON team_memberships(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_user_id ON user_sessions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_token_hash ON user_sessions(token_hash);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_user_id ON activity_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_created_at ON activity_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_resource ON activity_logs(resource_type, resource_id);\\nCREATE INDEX IF NOT EXISTS idx_password_history_user_id ON password_history(user_id);\\nCREATE INDEX IF NOT EXISTS idx_users_email_verification_token ON users(email_verification_token);\\nCREATE INDEX IF NOT EXISTS idx_users_password_reset_token ON users(password_reset_token);\\nCREATE INDEX IF NOT EXISTS idx_users_invitation_token ON users(invitation_token);\"\n },\n {\n id: '005',\n name: 'Stage7 Workflow Automation',\n filename: '005_stage7_workflow_automation.sql',\n description: 'Migration 005: Stage7 Workflow Automation',\n sql: \"-- Stage 7: Workflow & Automation Migration\\n-- This migration adds workflow and automation capabilities to SonicJS\\n\\n-- Workflow States Table\\nCREATE TABLE IF NOT EXISTS workflow_states (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n color TEXT DEFAULT '#6B7280',\\n is_initial INTEGER DEFAULT 0,\\n is_final INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Insert default workflow states\\nINSERT OR IGNORE INTO workflow_states (id, name, description, color, is_initial, is_final) VALUES\\n('draft', 'Draft', 'Content is being worked on', '#F59E0B', 1, 0),\\n('pending-review', 'Pending Review', 'Content is waiting for review', '#3B82F6', 0, 0),\\n('approved', 'Approved', 'Content has been approved', '#10B981', 0, 0),\\n('published', 'Published', 'Content is live', '#059669', 0, 1),\\n('rejected', 'Rejected', 'Content was rejected', '#EF4444', 0, 1),\\n('archived', 'Archived', 'Content has been archived', '#6B7280', 0, 1);\\n\\n-- Workflows Table\\nCREATE TABLE IF NOT EXISTS workflows (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT,\\n is_active INTEGER DEFAULT 1,\\n auto_publish INTEGER DEFAULT 0,\\n require_approval INTEGER DEFAULT 1,\\n approval_levels INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\\n);\\n\\n-- Workflow Transitions Table\\nCREATE TABLE IF NOT EXISTS workflow_transitions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT NOT NULL,\\n to_state_id TEXT NOT NULL,\\n required_permission TEXT,\\n auto_transition INTEGER DEFAULT 0,\\n transition_conditions TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE,\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id)\\n);\\n\\n-- Content Workflow Status Table\\nCREATE TABLE IF NOT EXISTS content_workflow_status (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n current_state_id TEXT NOT NULL,\\n assigned_to TEXT,\\n due_date DATETIME,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (current_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (assigned_to) REFERENCES users(id),\\n UNIQUE(content_id, workflow_id)\\n);\\n\\n-- Workflow History Table\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT,\\n to_state_id TEXT NOT NULL,\\n user_id TEXT NOT NULL,\\n comment TEXT,\\n metadata TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Scheduled Content Table\\nCREATE TABLE IF NOT EXISTS scheduled_content (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n action TEXT NOT NULL, -- 'publish', 'unpublish', 'archive'\\n scheduled_at DATETIME NOT NULL,\\n timezone TEXT DEFAULT 'UTC',\\n user_id TEXT NOT NULL,\\n status TEXT DEFAULT 'pending', -- 'pending', 'completed', 'failed', 'cancelled'\\n executed_at DATETIME,\\n error_message TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Notifications Table\\nCREATE TABLE IF NOT EXISTS notifications (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n type TEXT NOT NULL, -- 'workflow', 'schedule', 'system'\\n title TEXT NOT NULL,\\n message TEXT NOT NULL,\\n data TEXT, -- JSON\\n is_read INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\\n);\\n\\n-- Notification Preferences Table\\nCREATE TABLE IF NOT EXISTS notification_preferences (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n notification_type TEXT NOT NULL,\\n email_enabled INTEGER DEFAULT 1,\\n in_app_enabled INTEGER DEFAULT 1,\\n digest_frequency TEXT DEFAULT 'daily', -- 'immediate', 'hourly', 'daily', 'weekly'\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\\n UNIQUE(user_id, notification_type)\\n);\\n\\n-- Webhooks Table\\nCREATE TABLE IF NOT EXISTS webhooks (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n url TEXT NOT NULL,\\n secret TEXT,\\n events TEXT NOT NULL, -- JSON array of event types\\n is_active INTEGER DEFAULT 1,\\n retry_count INTEGER DEFAULT 3,\\n timeout_seconds INTEGER DEFAULT 30,\\n last_success_at DATETIME,\\n last_failure_at DATETIME,\\n failure_count INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Webhook Deliveries Table\\nCREATE TABLE IF NOT EXISTS webhook_deliveries (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n webhook_id TEXT NOT NULL,\\n event_type TEXT NOT NULL,\\n payload TEXT NOT NULL, -- JSON\\n response_status INTEGER,\\n response_body TEXT,\\n attempt_count INTEGER DEFAULT 1,\\n delivered_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE\\n);\\n\\n-- Content Versions Table (for rollback functionality)\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n version_number INTEGER NOT NULL,\\n title TEXT NOT NULL,\\n content TEXT NOT NULL,\\n fields TEXT, -- JSON\\n user_id TEXT NOT NULL,\\n change_summary TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, version_number)\\n);\\n\\n-- Automation Rules Table\\nCREATE TABLE IF NOT EXISTS automation_rules (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n trigger_type TEXT NOT NULL, -- 'content_created', 'content_updated', 'workflow_transition', 'schedule'\\n trigger_conditions TEXT, -- JSON\\n action_type TEXT NOT NULL, -- 'workflow_transition', 'send_notification', 'webhook_call', 'auto_save'\\n action_config TEXT, -- JSON\\n is_active INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Auto-save Drafts Table\\nCREATE TABLE IF NOT EXISTS auto_save_drafts (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT,\\n user_id TEXT NOT NULL,\\n title TEXT,\\n content TEXT,\\n fields TEXT, -- JSON\\n last_saved_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, user_id)\\n);\\n\\n-- Add workflow-related columns to existing content table (skip existing columns)\\nALTER TABLE content ADD COLUMN workflow_state_id TEXT DEFAULT 'draft';\\nALTER TABLE content ADD COLUMN embargo_until DATETIME;\\nALTER TABLE content ADD COLUMN expires_at DATETIME;\\nALTER TABLE content ADD COLUMN version_number INTEGER DEFAULT 1;\\nALTER TABLE content ADD COLUMN is_auto_saved INTEGER DEFAULT 0;\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_content_id ON content_workflow_status(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_workflow_id ON content_workflow_status(workflow_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content_id ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_scheduled_at ON scheduled_content(scheduled_at);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_status ON scheduled_content(status);\\nCREATE INDEX IF NOT EXISTS idx_notifications_user_id ON notifications(user_id);\\nCREATE INDEX IF NOT EXISTS idx_notifications_is_read ON notifications(is_read);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content_id ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_auto_save_drafts_user_id ON auto_save_drafts(user_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_state ON content(workflow_state_id);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\n\\n-- Insert default workflow for collections\\nINSERT OR IGNORE INTO workflows (id, name, description, collection_id, is_active, require_approval, approval_levels) \\nSELECT \\n 'default-' || id,\\n 'Default Workflow for ' || name,\\n 'Standard content approval workflow',\\n id,\\n 1,\\n 1,\\n 1\\nFROM collections;\\n\\n-- Insert default workflow transitions\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'draft',\\n 'pending-review',\\n 'content:submit'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'approved',\\n 'content:approve'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'approved',\\n 'published',\\n 'content:publish'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'rejected',\\n 'content:approve'\\nFROM workflows w;\\n\\n-- Insert default notification preferences for all users\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_assigned',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_status_change',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'content_scheduled',\\n 1,\\n 1\\nFROM users;\"\n },\n {\n id: '006',\n name: 'Plugin System',\n filename: '006_plugin_system.sql',\n description: 'Migration 006: Plugin System',\n sql: \"-- Plugin System Tables\\n-- Migration: 006_plugin_system\\n-- Description: Add plugin management system tables\\n\\n-- Plugins table\\nCREATE TABLE IF NOT EXISTS plugins (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n version TEXT NOT NULL,\\n author TEXT NOT NULL,\\n category TEXT NOT NULL,\\n icon TEXT,\\n status TEXT DEFAULT 'inactive' CHECK (status IN ('active', 'inactive', 'error')),\\n is_core BOOLEAN DEFAULT FALSE,\\n settings JSON,\\n permissions JSON,\\n dependencies JSON,\\n download_count INTEGER DEFAULT 0,\\n rating REAL DEFAULT 0,\\n installed_at INTEGER NOT NULL,\\n activated_at INTEGER,\\n last_updated INTEGER NOT NULL,\\n error_message TEXT,\\n created_at INTEGER DEFAULT (unixepoch()),\\n updated_at INTEGER DEFAULT (unixepoch())\\n);\\n\\n-- Plugin hooks table (registered hooks by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_hooks (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n hook_name TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n priority INTEGER DEFAULT 10,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, hook_name, handler_name)\\n);\\n\\n-- Plugin routes table\\nCREATE TABLE IF NOT EXISTS plugin_routes (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n path TEXT NOT NULL,\\n method TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n middleware JSON,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, path, method)\\n);\\n\\n-- Plugin assets table (CSS, JS files provided by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_assets (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n asset_type TEXT NOT NULL CHECK (asset_type IN ('css', 'js', 'image', 'font')),\\n asset_path TEXT NOT NULL,\\n load_order INTEGER DEFAULT 100,\\n load_location TEXT DEFAULT 'footer' CHECK (load_location IN ('header', 'footer')),\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Plugin activity log\\nCREATE TABLE IF NOT EXISTS plugin_activity_log (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n action TEXT NOT NULL,\\n user_id TEXT,\\n details JSON,\\n timestamp INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Create indexes\\nCREATE INDEX IF NOT EXISTS idx_plugins_status ON plugins(status);\\nCREATE INDEX IF NOT EXISTS idx_plugins_category ON plugins(category);\\nCREATE INDEX IF NOT EXISTS idx_plugin_hooks_plugin ON plugin_hooks(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_routes_plugin ON plugin_routes(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_assets_plugin ON plugin_assets(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_plugin ON plugin_activity_log(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_timestamp ON plugin_activity_log(timestamp);\\n\\n-- Insert core plugins\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES \\n(\\n 'core-auth',\\n 'core-auth',\\n 'Authentication System',\\n 'Core authentication and user management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔐',\\n 'active',\\n TRUE,\\n '[\\\"manage:users\\\", \\\"manage:roles\\\", \\\"manage:permissions\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-media',\\n 'core-media', \\n 'Media Manager',\\n 'Core media upload and management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'media',\\n '📸',\\n 'active',\\n TRUE,\\n '[\\\"manage:media\\\", \\\"upload:files\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-workflow',\\n 'core-workflow',\\n 'Workflow Engine',\\n 'Content workflow and approval system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin will be added as a third-party plugin through the admin interface\\n\\n-- Add plugin management permission\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at)\\nVALUES (\\n 'manage:plugins',\\n 'Manage Plugins',\\n 'Install, uninstall, activate, and configure plugins',\\n 'system',\\n unixepoch()\\n);\\n\\n-- Grant plugin management permission to admin role\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at)\\nVALUES ('role-perm-manage-plugins', 'admin', 'manage:plugins', unixepoch());\"\n },\n {\n id: '007',\n name: 'Demo Login Plugin',\n filename: '007_demo_login_plugin.sql',\n description: 'Migration 007: Demo Login Plugin',\n sql: \"-- Demo Login Plugin Migration\\n-- Migration: 007_demo_login_plugin\\n-- Description: Add demo login prefill plugin to the plugin registry\\n\\n-- Insert demo login plugin\\nINSERT INTO plugins (\\n id, name, display_name, description, version, author, category, icon, \\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'demo-login-prefill',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials (admin@sonicjs.com/sonicjs!) for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'inactive',\\n TRUE,\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\"\n },\n {\n id: '008',\n name: 'Fix Slug Validation',\n filename: '008_fix_slug_validation.sql',\n description: 'Migration 008: Fix Slug Validation',\n sql: \"-- Migration: Fix overly restrictive slug validation patterns\\n-- This migration relaxes the slug field validation to be more user-friendly\\n\\n-- Update the pages collection slug field to allow underscores and be less restrictive\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\\n-- Update any other slug fields with the restrictive pattern\\nUPDATE content_fields \\nSET field_options = REPLACE(field_options, '\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"', '\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\"')\\nWHERE field_options LIKE '%\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"%';\"\n },\n {\n id: '009',\n name: 'System Logging',\n filename: '009_system_logging.sql',\n description: 'Migration 009: System Logging',\n sql: \"-- System Logging Tables\\n-- Migration: 009_system_logging\\n-- Description: Add system logging and configuration tables\\n\\n-- System logs table for tracking application events\\nCREATE TABLE IF NOT EXISTS system_logs (\\n id TEXT PRIMARY KEY,\\n level TEXT NOT NULL CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n category TEXT NOT NULL CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n message TEXT NOT NULL,\\n data TEXT, -- JSON data\\n user_id TEXT,\\n session_id TEXT,\\n request_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n method TEXT,\\n url TEXT,\\n status_code INTEGER,\\n duration INTEGER, -- milliseconds\\n stack_trace TEXT,\\n tags TEXT, -- JSON array\\n source TEXT, -- source of the log entry\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Log configuration table for managing log settings per category\\nCREATE TABLE IF NOT EXISTS log_config (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL UNIQUE CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n enabled BOOLEAN NOT NULL DEFAULT TRUE,\\n level TEXT NOT NULL DEFAULT 'info' CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n retention_days INTEGER NOT NULL DEFAULT 30,\\n max_size_mb INTEGER NOT NULL DEFAULT 100,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_system_logs_level ON system_logs(level);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_category ON system_logs(category);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_created_at ON system_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_user_id ON system_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_status_code ON system_logs(status_code);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_source ON system_logs(source);\\n\\n-- Insert default log configurations\\nINSERT OR IGNORE INTO log_config (id, category, enabled, level, retention_days, max_size_mb) VALUES\\n('log-config-auth', 'auth', TRUE, 'info', 90, 50),\\n('log-config-api', 'api', TRUE, 'info', 30, 100),\\n('log-config-workflow', 'workflow', TRUE, 'info', 60, 50),\\n('log-config-plugin', 'plugin', TRUE, 'warn', 30, 25),\\n('log-config-media', 'media', TRUE, 'info', 30, 50),\\n('log-config-system', 'system', TRUE, 'info', 90, 100),\\n('log-config-security', 'security', TRUE, 'warn', 180, 100),\\n('log-config-error', 'error', TRUE, 'error', 90, 200);\"\n },\n {\n id: '011',\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql',\n description: 'Migration 011: Config Managed Collections',\n sql: \"-- Migration: Add Config-Managed Collections Support\\n-- Description: Add 'managed' column to collections table to support config-based collection definitions\\n-- Created: 2025-10-03\\n\\n-- Add 'managed' column to collections table\\n-- This column indicates whether a collection is managed by configuration files (true) or user-created (false)\\n-- Managed collections cannot be edited through the admin UI\\n-- Use a safe approach to add the column only if it doesn't exist\\nALTER TABLE collections ADD COLUMN managed INTEGER DEFAULT 0 NOT NULL;\\n\\n-- Create an index on the managed column for faster queries\\nCREATE INDEX IF NOT EXISTS idx_collections_managed ON collections(managed);\\n\\n-- Create an index on managed + is_active for efficient filtering\\nCREATE INDEX IF NOT EXISTS idx_collections_managed_active ON collections(managed, is_active);\\n\"\n },\n {\n id: '012',\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql',\n description: 'Migration 012: Testimonials Plugin',\n sql: \"-- Testimonials Plugin Migration\\n-- Creates testimonials table for the testimonials plugin\\n-- This demonstrates a code-based collection defined in src/plugins/core-plugins/testimonials-plugin.ts\\n\\nCREATE TABLE IF NOT EXISTS testimonials (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n author_name TEXT NOT NULL,\\n author_title TEXT,\\n author_company TEXT,\\n testimonial_text TEXT NOT NULL,\\n rating INTEGER CHECK(rating >= 1 AND rating <= 5),\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_testimonials_published ON testimonials(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_sort_order ON testimonials(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_rating ON testimonials(rating);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS testimonials_updated_at\\n AFTER UPDATE ON testimonials\\nBEGIN\\n UPDATE testimonials SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('testimonials',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support. This is a code-based collection example.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}');\\n\\n-- Insert sample testimonial data\\nINSERT OR IGNORE INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder) VALUES\\n('Jane Smith',\\n 'CTO',\\n 'TechStartup Inc',\\n 'SonicJS AI has transformed how we manage our content. The plugin architecture is brilliant and the edge deployment is blazing fast.',\\n 5,\\n 1,\\n 1),\\n\\n('Michael Chen',\\n 'Lead Developer',\\n 'Digital Agency Co',\\n 'We migrated from WordPress to SonicJS AI and couldn''t be happier. The TypeScript-first approach and modern tooling make development a joy.',\\n 5,\\n 1,\\n 2),\\n\\n('Sarah Johnson',\\n 'Product Manager',\\n 'E-commerce Solutions',\\n 'The headless CMS approach combined with Cloudflare Workers gives us unmatched performance. Our content is served globally with minimal latency.',\\n 4,\\n 1,\\n 3),\\n\\n('David Rodriguez',\\n 'Full Stack Developer',\\n 'Creative Studio',\\n 'Great CMS for modern web applications. The admin interface is clean and the API is well-designed. Plugin system is very flexible.',\\n 5,\\n 1,\\n 4),\\n\\n('Emily Watson',\\n 'Technical Director',\\n 'Media Company',\\n 'SonicJS AI solved our content distribution challenges. The R2 integration for media storage works flawlessly and scales effortlessly.',\\n 4,\\n 1,\\n 5);\\n\"\n },\n {\n id: '013',\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql',\n description: 'Migration 013: Code Examples Plugin',\n sql: \"-- Code Examples Plugin Migration\\n-- Creates code_examples table for the code examples plugin\\n-- This demonstrates a code-based collection for storing and managing code snippets\\n\\nCREATE TABLE IF NOT EXISTS code_examples (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n title TEXT NOT NULL,\\n description TEXT,\\n code TEXT NOT NULL,\\n language TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_code_examples_published ON code_examples(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_sort_order ON code_examples(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_language ON code_examples(language);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_category ON code_examples(category);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS code_examples_updated_at\\n AFTER UPDATE ON code_examples\\nBEGIN\\n UPDATE code_examples SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('code-examples',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support. Perfect for documentation and tutorials.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}');\\n\\n-- Insert sample code examples\\nINSERT OR IGNORE INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder) VALUES\\n('React useState Hook',\\n 'Basic example of using the useState hook in React for managing component state.',\\n 'import { useState } from ''react'';\\n\\nfunction Counter() {\\n const [count, setCount] = useState(0);\\n\\n return (\\n
\\n

Count: {count}

\\n \\n
\\n );\\n}\\n\\nexport default Counter;',\\n 'javascript',\\n 'frontend',\\n 'react,hooks,state',\\n 1,\\n 1),\\n\\n('TypeScript Interface Example',\\n 'Defining a TypeScript interface for type-safe objects.',\\n 'interface User {\\n id: string;\\n email: string;\\n name: string;\\n role: ''admin'' | ''editor'' | ''viewer'';\\n createdAt: Date;\\n}\\n\\nfunction greetUser(user: User): string {\\n return `Hello, ${user.name}!`;\\n}\\n\\nconst user: User = {\\n id: ''123'',\\n email: ''user@example.com'',\\n name: ''John Doe'',\\n role: ''admin'',\\n createdAt: new Date()\\n};\\n\\nconsole.log(greetUser(user));',\\n 'typescript',\\n 'backend',\\n 'typescript,types,interface',\\n 1,\\n 2),\\n\\n('Python List Comprehension',\\n 'Elegant way to create lists in Python using list comprehensions.',\\n '# Basic list comprehension\\nsquares = [x**2 for x in range(10)]\\nprint(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\\n\\n# With condition\\neven_squares = [x**2 for x in range(10) if x % 2 == 0]\\nprint(even_squares) # [0, 4, 16, 36, 64]\\n\\n# Nested list comprehension\\nmatrix = [[i+j for j in range(3)] for i in range(3)]\\nprint(matrix) # [[0, 1, 2], [1, 2, 3], [2, 3, 4]]',\\n 'python',\\n 'general',\\n 'python,lists,comprehension',\\n 1,\\n 3),\\n\\n('SQL Join Example',\\n 'Common SQL JOIN patterns for combining data from multiple tables.',\\n '-- INNER JOIN: Returns only matching rows\\nSELECT users.name, orders.total\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id;\\n\\n-- LEFT JOIN: Returns all users, even without orders\\nSELECT users.name, orders.total\\nFROM users\\nLEFT JOIN orders ON users.id = orders.user_id;\\n\\n-- Multiple JOINs\\nSELECT\\n users.name,\\n orders.order_date,\\n products.name AS product_name\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id\\nINNER JOIN order_items ON orders.id = order_items.order_id\\nINNER JOIN products ON order_items.product_id = products.id;',\\n 'sql',\\n 'database',\\n 'sql,joins,queries',\\n 1,\\n 4),\\n\\n('Go Error Handling',\\n 'Idiomatic error handling pattern in Go.',\\n 'package main\\n\\nimport (\\n\\t\\\"errors\\\"\\n\\t\\\"fmt\\\"\\n)\\n\\nfunc divide(a, b float64) (float64, error) {\\n\\tif b == 0 {\\n\\t\\treturn 0, errors.New(\\\"division by zero\\\")\\n\\t}\\n\\treturn a / b, nil\\n}\\n\\nfunc main() {\\n\\tresult, err := divide(10, 2)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t\\treturn\\n\\t}\\n\\tfmt.Printf(\\\"Result: %.2f\\\\n\\\", result)\\n\\n\\t// This will error\\n\\t_, err = divide(10, 0)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t}\\n}',\\n 'go',\\n 'backend',\\n 'go,error-handling,functions',\\n 1,\\n 5);\\n\"\n },\n {\n id: '014',\n name: 'Fix Plugin Registry',\n filename: '014_fix_plugin_registry.sql',\n description: 'Migration 014: Fix Plugin Registry',\n sql: \"-- Fix Plugin Registry\\n-- Migration: 014_fix_plugin_registry\\n-- Description: Add missing plugins and fix plugin name mismatches\\n\\n-- Note: Cannot easily update plugin names as they may be referenced elsewhere\\n-- Instead we'll add the missing plugins with correct names\\n\\n-- Insert missing plugins\\n\\n-- Core Analytics Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'core-analytics',\\n 'core-analytics',\\n 'Analytics & Tracking',\\n 'Core analytics tracking and reporting plugin with page views and event tracking',\\n '1.0.0',\\n 'SonicJS Team',\\n 'seo',\\n '📊',\\n 'active',\\n TRUE,\\n '[\\\"view:analytics\\\", \\\"manage:tracking\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'faq-plugin',\\n 'faq-plugin',\\n 'FAQ Management',\\n 'Frequently Asked Questions management plugin with categories, search, and custom styling',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '❓',\\n 'active',\\n FALSE,\\n '[\\\"manage:faqs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Seed Data Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'seed-data',\\n 'seed-data',\\n 'Seed Data Generator',\\n 'Generate realistic example users and content for testing and development',\\n '1.0.0',\\n 'SonicJS Team',\\n 'development',\\n '🌱',\\n 'inactive',\\n FALSE,\\n '[\\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Database Tools Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'database-tools',\\n 'database-tools',\\n 'Database Tools',\\n 'Database management tools including truncate, backup, and validation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'system',\\n '🗄️',\\n 'active',\\n FALSE,\\n '[\\\"manage:database\\\", \\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '015',\n name: 'Add Remaining Plugins',\n filename: '015_add_remaining_plugins.sql',\n description: 'Migration 015: Add Remaining Plugins',\n sql: \"-- Add Remaining Plugins\\n-- Migration: 015_add_remaining_plugins\\n-- Description: Add all remaining core plugins that were missing from the registry\\n\\n-- Testimonials Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'testimonials-plugin',\\n 'testimonials-plugin',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '⭐',\\n 'active',\\n FALSE,\\n '[\\\"manage:testimonials\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Code Examples Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'code-examples-plugin',\\n 'code-examples-plugin',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '💻',\\n 'active',\\n FALSE,\\n '[\\\"manage:code-examples\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Workflow Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'workflow-plugin',\\n 'workflow-plugin',\\n 'Workflow Engine',\\n 'Content workflow management with approval chains, scheduling, and automation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Demo Login Plugin (already exists with correct name from migration 007, but let's ensure it's there)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'demo-login-plugin',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '016',\n name: 'Remove Duplicate Cache Plugin',\n filename: '016_remove_duplicate_cache_plugin.sql',\n description: 'Migration 016: Remove Duplicate Cache Plugin',\n sql: \"-- Migration: Remove duplicate cache plugin entry\\n-- Description: Removes the old 'cache' plugin (id: 'cache') that is a duplicate of 'core-cache'\\n-- This fixes the issue where Cache System appears twice in the plugins list\\n-- Created: 2025-10-14\\n\\n-- Remove the old 'cache' plugin entry if it exists\\n-- The correct plugin is 'core-cache' which is managed by plugin-bootstrap.ts\\nDELETE FROM plugins WHERE id = 'cache' AND name = 'cache';\\n\\n-- Clean up any related entries in plugin activity log\\nDELETE FROM plugin_activity_log WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin hooks\\nDELETE FROM plugin_hooks WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin routes\\nDELETE FROM plugin_routes WHERE plugin_id = 'cache';\\n\"\n },\n {\n id: '017',\n name: 'Auth Configurable Fields',\n filename: '017_auth_configurable_fields.sql',\n description: 'Migration 017: Auth Configurable Fields',\n sql: \"-- Migration: Make authentication fields configurable\\n-- This migration updates the core-auth plugin to support configurable required fields\\n\\n-- The settings will be stored in the plugins table as JSON\\n-- Default settings for core-auth plugin include:\\n-- {\\n-- \\\"requiredFields\\\": {\\n-- \\\"email\\\": { \\\"required\\\": true, \\\"minLength\\\": 5 },\\n-- \\\"password\\\": { \\\"required\\\": true, \\\"minLength\\\": 8 },\\n-- \\\"username\\\": { \\\"required\\\": true, \\\"minLength\\\": 3 },\\n-- \\\"firstName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 },\\n-- \\\"lastName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 }\\n-- },\\n-- \\\"validation\\\": {\\n-- \\\"emailFormat\\\": true,\\n-- \\\"allowDuplicateUsernames\\\": false\\n-- }\\n-- }\\n\\n-- Update core-auth plugin settings with configurable field requirements\\nUPDATE plugins\\nSET settings = json_object(\\n 'requiredFields', json_object(\\n 'email', json_object('required', 1, 'minLength', 5, 'label', 'Email', 'type', 'email'),\\n 'password', json_object('required', 1, 'minLength', 8, 'label', 'Password', 'type', 'password'),\\n 'username', json_object('required', 1, 'minLength', 3, 'label', 'Username', 'type', 'text'),\\n 'firstName', json_object('required', 1, 'minLength', 1, 'label', 'First Name', 'type', 'text'),\\n 'lastName', json_object('required', 1, 'minLength', 1, 'label', 'Last Name', 'type', 'text')\\n ),\\n 'validation', json_object(\\n 'emailFormat', 1,\\n 'allowDuplicateUsernames', 0,\\n 'passwordRequirements', json_object(\\n 'requireUppercase', 0,\\n 'requireLowercase', 0,\\n 'requireNumbers', 0,\\n 'requireSpecialChars', 0\\n )\\n ),\\n 'registration', json_object(\\n 'enabled', 1,\\n 'requireEmailVerification', 0,\\n 'defaultRole', 'viewer'\\n )\\n)\\nWHERE id = 'core-auth';\\n\\n-- If core-auth plugin doesn't exist, this migration will be handled by bootstrap\\n-- No need to insert here as plugin bootstrap handles initial plugin creation\\n\"\n },\n {\n id: '018',\n name: 'Settings Table',\n filename: '018_settings_table.sql',\n description: 'Migration 018: Settings Table',\n sql: \"-- Create settings table for storing application settings\\nCREATE TABLE IF NOT EXISTS settings (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL, -- 'general', 'appearance', 'security', etc.\\n key TEXT NOT NULL,\\n value TEXT NOT NULL, -- JSON value\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(category, key)\\n);\\n\\n-- Insert default general settings\\nINSERT OR IGNORE INTO settings (id, category, key, value, created_at, updated_at)\\nVALUES\\n (lower(hex(randomblob(16))), 'general', 'siteName', '\\\"SonicJS AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'siteDescription', '\\\"A modern headless CMS powered by AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'timezone', '\\\"UTC\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'language', '\\\"en\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'maintenanceMode', 'false', unixepoch() * 1000, unixepoch() * 1000);\\n\\n-- Create index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);\\nCREATE INDEX IF NOT EXISTS idx_settings_category_key ON settings(category, key);\\n\"\n },\n {\n id: '019',\n name: 'Remove Blog Posts Collection',\n filename: '019_remove_blog_posts_collection.sql',\n description: 'Migration 019: Remove Blog Posts Collection',\n sql: \"-- Migration: Remove blog_posts from database-managed collections\\n-- Description: Remove blog-posts-collection from the database so it can be managed by code-based collection\\n-- Created: 2025-11-04\\n\\n-- Delete content associated with blog-posts-collection\\nDELETE FROM content WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete content fields for blog-posts-collection\\nDELETE FROM content_fields WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete the blog-posts collection itself\\nDELETE FROM collections WHERE id = 'blog-posts-collection';\\n\\n-- The blog-posts collection will now be managed by the code-based collection\\n-- in src/collections/blog-posts.collection.ts\\n\"\n },\n {\n id: '020',\n name: 'Add Email Plugin',\n filename: '020_add_email_plugin.sql',\n description: 'Migration 020: Add Email Plugin',\n sql: \"-- Add Email Plugin\\n-- Migration: 020_add_email_plugin\\n-- Description: Add email plugin for transactional emails via Resend\\n\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'email',\\n 'email',\\n 'Email',\\n 'Send transactional emails using Resend',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'utilities',\\n '📧',\\n 'inactive',\\n TRUE,\\n '[\\\"email:manage\\\", \\\"email:send\\\", \\\"email:view-logs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '021',\n name: 'Add Magic Link Auth Plugin',\n filename: '021_add_magic_link_auth_plugin.sql',\n description: 'Migration 021: Add Magic Link Auth Plugin',\n sql: \"-- Add Magic Link Authentication Plugin\\n-- Migration: 021_add_magic_link_auth_plugin\\n-- Description: Add magic link authentication plugin for passwordless login\\n\\n-- Create magic_links table\\nCREATE TABLE IF NOT EXISTS magic_links (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_magic_links_token ON magic_links(token);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_email ON magic_links(user_email);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_expires ON magic_links(expires_at);\\n\\n-- Register the plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'magic-link-auth',\\n 'magic-link-auth',\\n 'Magic Link Authentication',\\n 'Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔗',\\n 'inactive',\\n FALSE,\\n '[\\\"auth:manage\\\", \\\"auth:magic-link\\\"]',\\n '[\\\"email\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '022',\n name: 'Add Tinymce Plugin',\n filename: '022_add_tinymce_plugin.sql',\n description: 'Migration 022: Add Tinymce Plugin',\n sql: \"-- Add TinyMCE Rich Text Editor Plugin\\n-- Migration: 022_add_tinymce_plugin\\n-- Description: Add TinyMCE plugin for WYSIWYG rich text editing\\n\\n-- Register the plugin (active by default since it replaces hardcoded TinyMCE)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'tinymce-plugin',\\n 'tinymce-plugin',\\n 'TinyMCE Rich Text Editor',\\n 'Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✏️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"apiKey\\\":\\\"no-api-key\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"skin\\\":\\\"oxide-dark\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '023',\n name: 'Add Easy Mdx Plugin',\n filename: '023_add_easy_mdx_plugin.sql',\n description: 'Migration 023: Add Easy Mdx Plugin',\n sql: \"-- Add EasyMDE Markdown Editor Plugin\\n-- Migration: 023_add_easy_mdx_plugin\\n-- Description: Add EasyMDE plugin for lightweight markdown editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easy-mdx',\\n 'easy-mdx',\\n 'EasyMDE Markdown Editor',\\n 'Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '📝',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"defaultHeight\\\":400,\\\"theme\\\":\\\"dark\\\",\\\"toolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '024',\n name: 'Add Quill Editor Plugin',\n filename: '024_add_quill_editor_plugin.sql',\n description: 'Migration 024: Add Quill Editor Plugin',\n sql: \"-- Add Quill Rich Text Editor Plugin\\n-- Migration: 024_add_quill_editor_plugin\\n-- Description: Add Quill plugin for modern rich text editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'quill-editor',\\n 'quill-editor',\\n 'Quill Rich Text Editor',\\n 'Modern rich text editor for content creation. Provides a clean, intuitive WYSIWYG editor with customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"snow\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '025',\n name: 'Add Easymde Plugin',\n filename: '025_add_easymde_plugin.sql',\n description: 'Migration 025: Add Easymde Plugin',\n sql: \"-- Add EasyMDE Rich Text Editor Plugin\\n-- Migration: 025_add_easymde_plugin\\n-- Description: Add EasyMDE plugin for markdown-based rich text editing\\n\\n-- Register the plugin (inactive by default, replacing MDXEditor)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easymde-editor',\\n 'easymde-editor',\\n 'EasyMDE Editor',\\n 'Lightweight markdown editor for content creation. Simple, elegant WYSIWYG markdown editor with live preview, toolbar, and dark mode support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'inactive',\\n TRUE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"dark\\\",\\\"defaultHeight\\\":300,\\\"toolbar\\\":\\\"full\\\",\\\"spellChecker\\\":false,\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '026',\n name: 'Add Otp Login',\n filename: '026_add_otp_login.sql',\n description: 'Migration 026: Add Otp Login',\n sql: \"-- Add OTP Login Plugin\\n-- Migration: 021_add_otp_login\\n-- Description: Add OTP login plugin for passwordless authentication via email codes\\n\\n-- Create table for OTP codes\\nCREATE TABLE IF NOT EXISTS otp_codes (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n code TEXT NOT NULL,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n attempts INTEGER DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_otp_email_code ON otp_codes(user_email, code);\\nCREATE INDEX IF NOT EXISTS idx_otp_expires ON otp_codes(expires_at);\\nCREATE INDEX IF NOT EXISTS idx_otp_used ON otp_codes(used);\\n\\n-- Add plugin record\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'otp-login',\\n 'otp-login',\\n 'OTP Login',\\n 'Passwordless authentication via email one-time codes',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'security',\\n '🔢',\\n 'inactive',\\n TRUE,\\n '[\\\"otp:manage\\\", \\\"otp:request\\\", \\\"otp:verify\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '027',\n name: 'Fix Slug Field Type',\n filename: '027_fix_slug_field_type.sql',\n description: 'Migration 027: Fix Slug Field Type',\n sql: \"-- Migration: Fix slug field type\\n-- Description: Update slug fields to use 'slug' field type instead of 'text' for proper auto-generation\\n-- Created: 2026-01-10\\n\\n-- Update pages collection slug field to use 'slug' field type\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\"\n },\n {\n id: '028',\n name: 'Fix Slug Field Type In Schemas',\n filename: '028_fix_slug_field_type_in_schemas.sql',\n description: 'Migration 028: Fix Slug Field Type In Schemas',\n sql: \"-- Migration: Fix slug field type in collection schemas\\n-- Description: Update slug fields in collection schemas to use 'slug' type instead of 'string'\\n-- Created: 2026-01-10\\n\\n-- Update pages-collection schema\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'pages-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update blog-posts-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'blog-posts-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update news-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'news-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\"\n },\n {\n id: '029',\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql',\n description: 'Migration 029: Add Forms System',\n sql: \"-- Migration: 029_add_forms_system.sql\\n-- Description: Add Form.io integration for advanced form building\\n-- Date: January 23, 2026\\n-- Phase: 1 - Database Schema\\n\\n-- =====================================================\\n-- Table: forms\\n-- Description: Stores form definitions and configuration\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS forms (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE, -- Machine name (e.g., \\\"contact-form\\\")\\n display_name TEXT NOT NULL, -- Human name (e.g., \\\"Contact Form\\\")\\n description TEXT, -- Optional description\\n category TEXT DEFAULT 'general', -- Form category (contact, survey, registration, etc.)\\n \\n -- Form.io schema (JSON)\\n formio_schema TEXT NOT NULL, -- Complete Form.io JSON schema\\n \\n -- Settings\\n settings TEXT, -- JSON: {\\n -- emailNotifications: true,\\n -- notifyEmail: \\\"admin@example.com\\\",\\n -- successMessage: \\\"Thank you!\\\",\\n -- redirectUrl: \\\"/thank-you\\\",\\n -- allowAnonymous: true,\\n -- requireAuth: false,\\n -- maxSubmissions: null,\\n -- submitButtonText: \\\"Submit\\\",\\n -- saveProgress: true,\\n -- webhookUrl: null\\n -- }\\n \\n -- Status & Management\\n is_active INTEGER DEFAULT 1, -- Active/inactive flag\\n is_public INTEGER DEFAULT 1, -- Public (anyone) vs private (auth required)\\n managed INTEGER DEFAULT 0, -- Code-managed (like collections)\\n \\n -- Metadata\\n icon TEXT, -- Optional icon for admin UI\\n color TEXT, -- Optional color (hex) for admin UI\\n tags TEXT, -- JSON array of tags\\n \\n -- Stats\\n submission_count INTEGER DEFAULT 0, -- Total submissions received\\n view_count INTEGER DEFAULT 0, -- Form views (optional tracking)\\n \\n -- Ownership\\n created_by TEXT REFERENCES users(id), -- User who created the form\\n updated_by TEXT REFERENCES users(id), -- User who last updated\\n \\n -- Timestamps\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for forms\\nCREATE INDEX IF NOT EXISTS idx_forms_name ON forms(name);\\nCREATE INDEX IF NOT EXISTS idx_forms_category ON forms(category);\\nCREATE INDEX IF NOT EXISTS idx_forms_active ON forms(is_active);\\nCREATE INDEX IF NOT EXISTS idx_forms_public ON forms(is_public);\\nCREATE INDEX IF NOT EXISTS idx_forms_created_by ON forms(created_by);\\n\\n-- =====================================================\\n-- Table: form_submissions\\n-- Description: Stores submitted form data\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_submissions (\\n id TEXT PRIMARY KEY,\\n form_id TEXT NOT NULL REFERENCES forms(id) ON DELETE CASCADE,\\n \\n -- Submission data\\n submission_data TEXT NOT NULL, -- JSON: The actual form data submitted\\n \\n -- Submission metadata\\n status TEXT DEFAULT 'pending', -- pending, reviewed, approved, rejected, spam\\n submission_number INTEGER, -- Sequential number per form\\n \\n -- User information (if authenticated)\\n user_id TEXT REFERENCES users(id), -- Submitter user ID (if logged in)\\n user_email TEXT, -- Email from form (or user account)\\n \\n -- Tracking information\\n ip_address TEXT, -- IP address of submitter\\n user_agent TEXT, -- Browser user agent\\n referrer TEXT, -- Page that referred to form\\n utm_source TEXT, -- UTM tracking params\\n utm_medium TEXT,\\n utm_campaign TEXT,\\n \\n -- Review/Processing\\n reviewed_by TEXT REFERENCES users(id), -- Admin who reviewed\\n reviewed_at INTEGER, -- Review timestamp\\n review_notes TEXT, -- Admin notes\\n \\n -- Flags\\n is_spam INTEGER DEFAULT 0, -- Spam flag\\n is_archived INTEGER DEFAULT 0, -- Archived flag\\n \\n -- Timestamps\\n submitted_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for submissions\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_form_id ON form_submissions(form_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_status ON form_submissions(status);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_user_id ON form_submissions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_email ON form_submissions(user_email);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_submitted_at ON form_submissions(submitted_at);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_spam ON form_submissions(is_spam);\\n\\n-- Trigger to auto-increment submission_number per form\\nCREATE TRIGGER IF NOT EXISTS set_submission_number\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE form_submissions \\n SET submission_number = (\\n SELECT COUNT(*) \\n FROM form_submissions \\n WHERE form_id = NEW.form_id \\n AND id <= NEW.id\\n )\\n WHERE id = NEW.id;\\nEND;\\n\\n-- Trigger to update form submission_count\\nCREATE TRIGGER IF NOT EXISTS increment_form_submission_count\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE forms \\n SET submission_count = submission_count + 1,\\n updated_at = unixepoch() * 1000\\n WHERE id = NEW.form_id;\\nEND;\\n\\n-- =====================================================\\n-- Table: form_files (Optional)\\n-- Description: Link form submissions to uploaded files\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_files (\\n id TEXT PRIMARY KEY,\\n submission_id TEXT NOT NULL REFERENCES form_submissions(id) ON DELETE CASCADE,\\n media_id TEXT NOT NULL REFERENCES media(id) ON DELETE CASCADE,\\n field_name TEXT NOT NULL, -- Form field that uploaded this file\\n uploaded_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for form files\\nCREATE INDEX IF NOT EXISTS idx_form_files_submission ON form_files(submission_id);\\nCREATE INDEX IF NOT EXISTS idx_form_files_media ON form_files(media_id);\\n\\n-- =====================================================\\n-- Sample Data: Create a default contact form\\n-- =====================================================\\n\\nINSERT OR IGNORE INTO forms (\\n id,\\n name,\\n display_name,\\n description,\\n category,\\n formio_schema,\\n settings,\\n is_active,\\n is_public,\\n created_at,\\n updated_at\\n) VALUES (\\n 'default-contact-form',\\n 'contact',\\n 'Contact Form',\\n 'A simple contact form for getting in touch',\\n 'contact',\\n '{\\\"components\\\":[]}',\\n '{\\\"emailNotifications\\\":false,\\\"successMessage\\\":\\\"Thank you for your submission!\\\",\\\"submitButtonText\\\":\\\"Submit\\\",\\\"requireAuth\\\":false}',\\n 1,\\n 1,\\n unixepoch() * 1000,\\n unixepoch() * 1000\\n);\\n\"\n },\n {\n id: '030',\n name: 'Add Turnstile To Forms',\n filename: '030_add_turnstile_to_forms.sql',\n description: 'Migration 030: Add Turnstile To Forms',\n sql: \"-- Add Turnstile configuration to forms table\\n-- This allows per-form Turnstile settings with global fallback\\n\\n-- Add columns (D1 may not support CHECK constraints in ALTER TABLE)\\nALTER TABLE forms ADD COLUMN turnstile_enabled INTEGER DEFAULT 0;\\nALTER TABLE forms ADD COLUMN turnstile_settings TEXT;\\n\\n-- Set default to inherit global settings for existing forms\\nUPDATE forms \\nSET turnstile_settings = '{\\\"inherit\\\":true}' \\nWHERE turnstile_settings IS NULL;\\n\\n-- Add index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_forms_turnstile ON forms(turnstile_enabled);\\n\"\n },\n {\n id: '031',\n name: 'Ai Search Plugin',\n filename: '031_ai_search_plugin.sql',\n description: 'Migration 031: Ai Search Plugin',\n sql: \"-- AI Search plugin settings\\nCREATE TABLE IF NOT EXISTS ai_search_settings (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n enabled BOOLEAN DEFAULT 0,\\n ai_mode_enabled BOOLEAN DEFAULT 1,\\n selected_collections TEXT, -- JSON array of collection IDs to index\\n dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index\\n autocomplete_enabled BOOLEAN DEFAULT 1,\\n cache_duration INTEGER DEFAULT 1, -- hours\\n results_limit INTEGER DEFAULT 20,\\n index_media BOOLEAN DEFAULT 0,\\n index_status TEXT, -- JSON object with status per collection\\n last_indexed_at INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Search history/analytics\\nCREATE TABLE IF NOT EXISTS ai_search_history (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n query TEXT NOT NULL,\\n mode TEXT, -- 'ai' or 'keyword'\\n results_count INTEGER,\\n user_id INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index metadata tracking (per collection)\\nCREATE TABLE IF NOT EXISTS ai_search_index_meta (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n collection_id INTEGER NOT NULL,\\n collection_name TEXT NOT NULL, -- Cache collection name for display\\n total_items INTEGER DEFAULT 0,\\n indexed_items INTEGER DEFAULT 0,\\n last_sync_at INTEGER,\\n status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'\\n error_message TEXT,\\n UNIQUE(collection_id)\\n);\\n\\n-- Indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);\\n\"\n },\n {\n id: '032',\n name: 'User Profiles',\n filename: '032_user_profiles.sql',\n description: 'Migration 032: User Profiles',\n sql: \"-- User Profiles Table (Core Migration)\\n-- Stores extended user profile data separate from auth concerns\\n-- Required by admin-users.ts for user edit page profile management\\n--\\n-- Originally introduced as app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\\n-- in upstream PR #508. Core routes (admin-users.ts) were updated to query this table in PR #512,\\n-- but no corresponding core migration was added. This migration corrects that gap.\\n--\\n-- IF NOT EXISTS guards ensure idempotency for databases that already have the table\\n-- from the app-level migration.\\n\\nCREATE TABLE IF NOT EXISTS user_profiles (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,\\n\\n display_name TEXT,\\n bio TEXT,\\n company TEXT,\\n job_title TEXT,\\n website TEXT,\\n location TEXT,\\n date_of_birth INTEGER,\\n data TEXT DEFAULT '{}',\\n\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index for fast user lookups\\nCREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);\\n\\n-- Trigger to auto-update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS user_profiles_updated_at\\n AFTER UPDATE ON user_profiles\\nBEGIN\\n UPDATE user_profiles SET updated_at = strftime('%s', 'now') * 1000 WHERE id = NEW.id;\\nEND;\\n\"\n },\n {\n id: '033',\n name: 'Form Content Integration',\n filename: '033_form_content_integration.sql',\n description: 'Migration 033: Form Content Integration',\n sql: \"-- Migration 033: Form-Content Integration\\n-- Adds bridge columns to link forms to collections and submissions to content items\\n\\n-- Add source_type and source_id to collections for form-derived collections\\nALTER TABLE collections ADD COLUMN source_type TEXT DEFAULT 'user';\\nALTER TABLE collections ADD COLUMN source_id TEXT;\\n\\n-- Index for efficient lookup of form-derived collections\\nCREATE INDEX IF NOT EXISTS idx_collections_source ON collections(source_type, source_id);\\n\\n-- Add content_id to form_submissions for linking to content items\\nALTER TABLE form_submissions ADD COLUMN content_id TEXT REFERENCES content(id);\\n\\n-- Index for efficient lookup by content_id\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_content_id ON form_submissions(content_id);\\n\\n-- Create system user for anonymous form submissions\\nINSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\\nVALUES ('system-form-submission', 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', NULL, 'viewer', 0, strftime('%s','now') * 1000, strftime('%s','now') * 1000);\\n\"\n },\n {\n id: '034',\n name: 'Security Audit Plugin',\n filename: '034_security_audit_plugin.sql',\n description: 'Migration 034: Security Audit Plugin',\n sql: \"-- Security Audit Plugin\\n-- Tracks login attempts, registrations, and security events for monitoring and brute-force detection\\n\\nCREATE TABLE IF NOT EXISTS security_events (\\n id TEXT PRIMARY KEY,\\n event_type TEXT NOT NULL,\\n severity TEXT NOT NULL DEFAULT 'info',\\n user_id TEXT,\\n email TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n country_code TEXT,\\n request_path TEXT,\\n request_method TEXT,\\n details TEXT,\\n fingerprint TEXT,\\n blocked INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type);\\nCREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_security_events_email ON security_events(email);\\nCREATE INDEX IF NOT EXISTS idx_security_events_ip ON security_events(ip_address);\\nCREATE INDEX IF NOT EXISTS idx_security_events_severity ON security_events(severity);\\nCREATE INDEX IF NOT EXISTS idx_security_events_created ON security_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_security_events_fingerprint ON security_events(fingerprint);\\n\"\n },\n {\n id: '035',\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql',\n description: 'Migration 035: User Profiles Data Column',\n sql: \"-- Migration 035: Add data column to user_profiles (no-op)\\n--\\n-- This migration originally added a missing 'data' column to user_profiles.\\n-- Migration 032 has since been updated to include the column in the CREATE TABLE,\\n-- so on fresh installs the column already exists by the time this runs.\\n--\\n-- The ALTER TABLE has been removed to prevent \\\"duplicate column name: data\\\" errors\\n-- during fresh installs (GitHub issue #771). Wrangler's migration runner does not\\n-- gracefully handle duplicate column errors like the runtime MigrationService does.\\n--\\n-- Existing databases that ran the old 032 (without the data column) get the column\\n-- added at runtime by the core MigrationService, which skips duplicate-column errors.\\n--\\n-- This file is kept as a no-op so that wrangler's migration tracking remains\\n-- consistent (it tracks migrations by filename).\\nSELECT 1;\\n\"\n },\n {\n id: '036',\n name: 'Analytics Events',\n filename: '036_analytics_events.sql',\n description: 'Migration 036: Analytics Events',\n sql: \"-- Migration 036: Analytics Events Table\\n-- Provides storage for user behavior event tracking (page views, custom events)\\n\\nCREATE TABLE IF NOT EXISTS analytics_events (\\n id TEXT PRIMARY KEY,\\n event TEXT NOT NULL,\\n category TEXT NOT NULL DEFAULT 'user-activity',\\n properties TEXT,\\n user_id TEXT,\\n session_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n path TEXT,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_event ON analytics_events(event);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_category ON analytics_events(category);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_user_id ON analytics_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_session_id ON analytics_events(session_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_created_at ON analytics_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_path ON analytics_events(path);\\n\"\n }\n]\n\n// Map for quick lookup by ID\nexport const migrationsByIdMap = new Map(\n bundledMigrations.map(m => [m.id, m])\n)\n\n// Get migration SQL by ID\nexport function getMigrationSQLById(id: string): string | null {\n return migrationsByIdMap.get(id)?.sql ?? null\n}\n\n// Get all migration info (without SQL for lighter payloads)\nexport function getMigrationList(): Array> {\n return bundledMigrations.map(({ sql, ...rest }) => rest)\n}\n","import { D1Database } from '@cloudflare/workers-types'\nimport { bundledMigrations, getMigrationSQLById, type BundledMigration } from '../db/migrations-bundle'\n\nexport interface Migration {\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n}\n\nexport interface MigrationStatus {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Migration[]\n}\n\nexport class MigrationService {\n constructor(private db: D1Database) {}\n\n /**\n * Initialize the migrations tracking table\n */\n async initializeMigrationsTable(): Promise {\n const createTableQuery = `\n CREATE TABLE IF NOT EXISTS migrations (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n filename TEXT NOT NULL,\n applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n checksum TEXT\n )\n `\n\n await this.db.prepare(createTableQuery).run()\n }\n\n /**\n * Get all available migrations from the bundled migrations\n */\n async getAvailableMigrations(): Promise {\n const migrations: Migration[] = []\n\n // Get applied migrations from database\n const appliedResult = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at ASC'\n ).all()\n\n const appliedMigrations = new Map(\n appliedResult.results?.map((row: any) => [row.id, row]) || []\n )\n\n // Auto-detect applied migrations by checking if their tables exist\n await this.autoDetectAppliedMigrations(appliedMigrations)\n\n // Use bundled migrations as the source of truth\n for (const bundled of bundledMigrations) {\n const applied = appliedMigrations.has(bundled.id)\n const appliedData = appliedMigrations.get(bundled.id)\n\n migrations.push({\n id: bundled.id,\n name: bundled.name,\n filename: bundled.filename,\n description: bundled.description,\n applied,\n appliedAt: applied ? appliedData?.applied_at : undefined,\n size: bundled.sql.length\n })\n }\n\n return migrations\n }\n\n /**\n * Auto-detect applied migrations by checking if their tables exist\n */\n private async autoDetectAppliedMigrations(appliedMigrations: Map): Promise {\n // Check if basic schema tables exist (migration 001)\n if (!appliedMigrations.has('001')) {\n const hasBasicTables = await this.checkTablesExist(['users', 'content', 'collections', 'media'])\n if (hasBasicTables) {\n appliedMigrations.set('001', {\n id: '001',\n applied_at: new Date().toISOString(),\n name: 'Initial Schema',\n filename: '001_initial_schema.sql'\n })\n await this.markMigrationApplied('001', 'Initial Schema', '001_initial_schema.sql')\n }\n }\n\n // Check if FAQ tables exist (migration 002)\n // Migration 002 creates only the 'faqs' table\n if (!appliedMigrations.has('002')) {\n const hasFaqTables = await this.checkTablesExist(['faqs'])\n if (hasFaqTables) {\n appliedMigrations.set('002', {\n id: '002',\n applied_at: new Date().toISOString(),\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql'\n })\n await this.markMigrationApplied('002', 'Faq Plugin', '002_faq_plugin.sql')\n }\n }\n\n // Check if stage 5 enhancement tables exist (migration 003)\n // Migration 003 creates content_fields, content_relationships, workflow_templates tables\n if (!appliedMigrations.has('003')) {\n const hasStage5Tables = await this.checkTablesExist(['content_fields', 'content_relationships', 'workflow_templates'])\n if (hasStage5Tables) {\n appliedMigrations.set('003', {\n id: '003',\n applied_at: new Date().toISOString(),\n name: 'Stage 5 Enhancements',\n filename: '003_stage5_enhancements.sql'\n })\n await this.markMigrationApplied('003', 'Stage 5 Enhancements', '003_stage5_enhancements.sql')\n }\n }\n\n // Check if testimonials table exists (migration 012)\n if (!appliedMigrations.has('012')) {\n const hasTestimonialsTables = await this.checkTablesExist(['testimonials'])\n if (hasTestimonialsTables) {\n appliedMigrations.set('012', {\n id: '012',\n applied_at: new Date().toISOString(),\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql'\n })\n await this.markMigrationApplied('012', 'Testimonials Plugin', '012_testimonials_plugin.sql')\n }\n }\n\n // Check if code_examples table exists (migration 013)\n if (!appliedMigrations.has('013')) {\n const hasCodeExamplesTables = await this.checkTablesExist(['code_examples'])\n if (hasCodeExamplesTables) {\n appliedMigrations.set('013', {\n id: '013',\n applied_at: new Date().toISOString(),\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql'\n })\n await this.markMigrationApplied('013', 'Code Examples Plugin', '013_code_examples_plugin.sql')\n }\n }\n\n // Check if user management tables exist (migration 004)\n if (!appliedMigrations.has('004')) {\n const hasUserTables = await this.checkTablesExist(['api_tokens', 'workflow_history'])\n if (hasUserTables) {\n appliedMigrations.set('004', {\n id: '004',\n applied_at: new Date().toISOString(),\n name: 'User Management',\n filename: '004_stage6_user_management.sql'\n })\n await this.markMigrationApplied('004', 'User Management', '004_stage6_user_management.sql')\n }\n }\n\n // Check if plugin system tables exist (migration 006)\n if (!appliedMigrations.has('006')) {\n const hasPluginTables = await this.checkTablesExist(['plugins', 'plugin_hooks'])\n if (hasPluginTables) {\n appliedMigrations.set('006', {\n id: '006',\n applied_at: new Date().toISOString(),\n name: 'Plugin System',\n filename: '006_plugin_system.sql'\n })\n await this.markMigrationApplied('006', 'Plugin System', '006_plugin_system.sql')\n }\n }\n\n // Check if managed column exists (migration 011)\n // This handles both cases:\n // 1. Migration not marked as applied but column exists -> mark as applied\n // 2. Migration marked as applied but column doesn't exist -> remove from applied (will re-run)\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!appliedMigrations.has('011') && hasManagedColumn) {\n appliedMigrations.set('011', {\n id: '011',\n applied_at: new Date().toISOString(),\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql'\n })\n await this.markMigrationApplied('011', 'Config Managed Collections', '011_config_managed_collections.sql')\n } else if (appliedMigrations.has('011') && !hasManagedColumn) {\n // Migration was marked as applied but column doesn't exist - remove it so it will re-run\n console.log('[Migration] Migration 011 marked as applied but managed column missing - will re-run')\n appliedMigrations.delete('011')\n await this.removeMigrationApplied('011')\n }\n\n // Check if system_logs table exists (migration 009)\n if (!appliedMigrations.has('009')) {\n const hasLoggingTables = await this.checkTablesExist(['system_logs', 'log_config'])\n if (hasLoggingTables) {\n appliedMigrations.set('009', {\n id: '009',\n applied_at: new Date().toISOString(),\n name: 'System Logging',\n filename: '009_system_logging.sql'\n })\n await this.markMigrationApplied('009', 'System Logging', '009_system_logging.sql')\n }\n }\n\n // Check if settings table exists (migration 018)\n if (!appliedMigrations.has('018')) {\n const hasSettingsTable = await this.checkTablesExist(['settings'])\n if (hasSettingsTable) {\n appliedMigrations.set('018', {\n id: '018',\n applied_at: new Date().toISOString(),\n name: 'Settings Table',\n filename: '018_settings_table.sql'\n })\n await this.markMigrationApplied('018', 'Settings Table', '018_settings_table.sql')\n }\n }\n\n // Check if forms tables exist (migration 029)\n // Migration 029 was reassigned between releases: older versions used it for \"Ai Search Plugin\",\n // newer versions use it for \"Add Forms System\". This handles the case where 029 is marked as\n // applied (from the old AI Search migration) but the forms tables don't actually exist.\n const hasFormsTables = await this.checkTablesExist(['forms', 'form_submissions', 'form_files'])\n if (!appliedMigrations.has('029') && hasFormsTables) {\n appliedMigrations.set('029', {\n id: '029',\n applied_at: new Date().toISOString(),\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql'\n })\n await this.markMigrationApplied('029', 'Add Forms System', '029_add_forms_system.sql')\n } else if (appliedMigrations.has('029') && !hasFormsTables) {\n // Migration was marked as applied (possibly from old \"Ai Search Plugin\" migration)\n // but forms tables don't exist - remove it so the forms migration will re-run\n console.log('[Migration] Migration 029 marked as applied but forms tables missing - will re-run')\n appliedMigrations.delete('029')\n await this.removeMigrationApplied('029')\n }\n\n // Check if user_profiles table exists (migration 032)\n // Table may already exist from app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\n if (!appliedMigrations.has('032')) {\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n appliedMigrations.set('032', {\n id: '032',\n applied_at: new Date().toISOString(),\n name: 'User Profiles',\n filename: '032_user_profiles.sql'\n })\n await this.markMigrationApplied('032', 'User Profiles', '032_user_profiles.sql')\n }\n }\n\n // Ensure user_profiles.data column exists (migration 035 is now a no-op).\n // Databases that ran the old 032 (without data column) need the column added.\n // Migration 035 was converted to a no-op to fix #771 (duplicate column error\n // on fresh installs), so we add the column here if it's missing.\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n const hasDataColumn = await this.checkColumnExists('user_profiles', 'data')\n if (!hasDataColumn) {\n try {\n await this.db.prepare(`ALTER TABLE user_profiles ADD COLUMN data TEXT DEFAULT '{}'`).run()\n console.log('[Migration] Added missing data column to user_profiles')\n } catch (error) {\n // Column may have been added concurrently; ignore duplicate column errors\n const msg = error instanceof Error ? error.message : String(error)\n if (!msg.includes('duplicate column name')) {\n console.error('[Migration] Failed to add data column to user_profiles:', msg)\n }\n }\n }\n }\n\n // Mark migration 035 as applied since it's now a no-op (column handled above)\n if (!appliedMigrations.has('035')) {\n const hasDataCol = hasUserProfilesTable && await this.checkColumnExists('user_profiles', 'data')\n if (hasDataCol) {\n appliedMigrations.set('035', {\n id: '035',\n applied_at: new Date().toISOString(),\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql'\n })\n await this.markMigrationApplied('035', 'User Profiles Data Column', '035_user_profiles_data_column.sql')\n }\n }\n }\n\n /**\n * Check if specific tables exist in the database\n */\n private async checkTablesExist(tableNames: string[]): Promise {\n try {\n for (const tableName of tableNames) {\n const result = await this.db.prepare(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`\n ).bind(tableName).first()\n\n if (!result) {\n return false\n }\n }\n return true\n } catch (error) {\n return false\n }\n }\n\n /**\n * Check if a specific column exists in a table\n */\n private async checkColumnExists(tableName: string, columnName: string): Promise {\n try {\n const result = await this.db.prepare(\n `SELECT * FROM pragma_table_info(?) WHERE name = ?`\n ).bind(tableName, columnName).first()\n\n return !!result\n } catch (error) {\n return false\n }\n }\n\n /**\n * Get migration status summary\n */\n async getMigrationStatus(): Promise {\n await this.initializeMigrationsTable()\n\n const migrations = await this.getAvailableMigrations()\n const appliedMigrations = migrations.filter(m => m.applied)\n const pendingMigrations = migrations.filter(m => !m.applied)\n\n const lastApplied = appliedMigrations.length > 0\n ? appliedMigrations[appliedMigrations.length - 1]?.appliedAt\n : undefined\n\n return {\n totalMigrations: migrations.length,\n appliedMigrations: appliedMigrations.length,\n pendingMigrations: pendingMigrations.length,\n lastApplied,\n migrations\n }\n }\n\n /**\n * Mark a migration as applied\n */\n async markMigrationApplied(migrationId: string, name: string, filename: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'INSERT OR REPLACE INTO migrations (id, name, filename, applied_at) VALUES (?, ?, ?, CURRENT_TIMESTAMP)'\n ).bind(migrationId, name, filename).run()\n }\n\n /**\n * Remove a migration from the applied list (so it can be re-run)\n */\n async removeMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'DELETE FROM migrations WHERE id = ?'\n ).bind(migrationId).run()\n }\n\n /**\n * Check if a specific migration has been applied\n */\n async isMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM migrations WHERE id = ?'\n ).bind(migrationId).first()\n\n return (result?.count as number) > 0\n }\n\n /**\n * Get the last applied migration\n */\n async getLastAppliedMigration(): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at DESC LIMIT 1'\n ).first()\n\n if (!result) return null\n\n return {\n id: result.id as string,\n name: result.name as string,\n filename: result.filename as string,\n applied: true,\n appliedAt: result.applied_at as string\n }\n }\n\n /**\n * Run pending migrations\n */\n async runPendingMigrations(): Promise<{ success: boolean; message: string; applied: string[]; errors: string[] }> {\n await this.initializeMigrationsTable()\n\n const status = await this.getMigrationStatus()\n const pendingMigrations = status.migrations.filter(m => !m.applied)\n\n if (pendingMigrations.length === 0) {\n return {\n success: true,\n message: 'All migrations are up to date',\n applied: [],\n errors: []\n }\n }\n\n // Actually execute the migration files\n const applied: string[] = []\n const errors: string[] = []\n\n for (const migration of pendingMigrations) {\n try {\n console.log(`[Migration] Applying ${migration.id}: ${migration.name}`)\n await this.applyMigration(migration)\n await this.markMigrationApplied(migration.id, migration.name, migration.filename)\n applied.push(migration.id)\n console.log(`[Migration] Successfully applied ${migration.id}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`[Migration] Failed to apply migration ${migration.id}:`, errorMessage)\n errors.push(`${migration.id}: ${errorMessage}`)\n // Continue with other migrations instead of stopping on first failure\n // This allows independent migrations to still be applied\n }\n }\n\n if (errors.length > 0 && applied.length === 0) {\n return {\n success: false,\n message: `Failed to apply migrations: ${errors.join('; ')}`,\n applied,\n errors\n }\n }\n\n return {\n success: true,\n message: applied.length > 0\n ? `Applied ${applied.length} migration(s)${errors.length > 0 ? ` (${errors.length} failed)` : ''}`\n : 'No migrations applied',\n applied,\n errors\n }\n }\n\n /**\n * Apply a specific migration\n */\n private async applyMigration(migration: Migration): Promise {\n // Get the actual migration SQL from the bundle\n const migrationSQL = getMigrationSQLById(migration.id)\n\n if (migrationSQL === null) {\n throw new Error(`Migration SQL not found for ${migration.id}`)\n }\n\n if (migrationSQL.trim() === '') {\n console.log(`[Migration] Skipping empty migration ${migration.id}`)\n return\n }\n\n // Split SQL into individual statements, handling triggers properly\n const statements = this.splitSQLStatements(migrationSQL)\n\n for (const statement of statements) {\n if (statement.trim()) {\n try {\n await this.db.prepare(statement).run()\n } catch (error) {\n // Check if it's a \"already exists\" type error and skip it\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('already exists') ||\n errorMessage.includes('duplicate column name') ||\n errorMessage.includes('UNIQUE constraint failed')) {\n console.log(`[Migration] Skipping (already exists): ${statement.substring(0, 50)}...`)\n continue\n }\n console.error(`[Migration] Error executing statement: ${statement.substring(0, 100)}...`)\n throw error\n }\n }\n }\n }\n\n /**\n * Split SQL into statements, handling CREATE TRIGGER properly\n */\n private splitSQLStatements(sql: string): string[] {\n const statements: string[] = []\n let current = ''\n let inTrigger = false\n\n const lines = sql.split('\\n')\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n // Skip comments and empty lines\n if (trimmed.startsWith('--') || trimmed.length === 0) {\n continue\n }\n\n // Check if we're entering a trigger\n if (trimmed.toUpperCase().includes('CREATE TRIGGER')) {\n inTrigger = true\n }\n\n current += line + '\\n'\n\n // Check if we're exiting a trigger\n if (inTrigger && trimmed.toUpperCase() === 'END;') {\n statements.push(current.trim())\n current = ''\n inTrigger = false\n }\n // Check for regular statement end (not in trigger)\n else if (!inTrigger && trimmed.endsWith(';')) {\n statements.push(current.trim())\n current = ''\n }\n }\n\n // Add any remaining statement\n if (current.trim()) {\n statements.push(current.trim())\n }\n\n return statements.filter(s => s.length > 0)\n }\n\n /**\n * Validate database schema\n */\n async validateSchema(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n // Basic table existence checks\n const requiredTables = [\n 'users', 'content', 'collections', 'media'\n ]\n\n for (const table of requiredTables) {\n try {\n await this.db.prepare(`SELECT COUNT(*) FROM ${table} LIMIT 1`).first()\n } catch (error) {\n issues.push(`Missing table: ${table}`)\n }\n }\n\n // Check for managed column in collections\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!hasManagedColumn) {\n issues.push('Missing column: collections.managed')\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-BX75LZES.cjs b/packages/core/dist/chunk-LPYFMGAK.cjs similarity index 98% rename from packages/core/dist/chunk-BX75LZES.cjs rename to packages/core/dist/chunk-LPYFMGAK.cjs index 37d76b384..e75334656 100644 --- a/packages/core/dist/chunk-BX75LZES.cjs +++ b/packages/core/dist/chunk-LPYFMGAK.cjs @@ -1,13 +1,13 @@ 'use strict'; -var chunkXWQVFWPW_cjs = require('./chunk-XWQVFWPW.cjs'); -var chunkV4V54BY3_cjs = require('./chunk-V4V54BY3.cjs'); -var chunkQOZZJZ76_cjs = require('./chunk-QOZZJZ76.cjs'); -var chunk7KR6GOY3_cjs = require('./chunk-7KR6GOY3.cjs'); +var chunkWAEQXGCX_cjs = require('./chunk-WAEQXGCX.cjs'); +var chunkTAOOLOUH_cjs = require('./chunk-TAOOLOUH.cjs'); +var chunk656GGECX_cjs = require('./chunk-656GGECX.cjs'); +var chunkICMNCCX2_cjs = require('./chunk-ICMNCCX2.cjs'); var chunkOHYBNCVL_cjs = require('./chunk-OHYBNCVL.cjs'); var chunkUYJ6TJHX_cjs = require('./chunk-UYJ6TJHX.cjs'); var chunk635JAMSE_cjs = require('./chunk-635JAMSE.cjs'); -var chunk74BFRAQS_cjs = require('./chunk-74BFRAQS.cjs'); +var chunkGLRZAPX6_cjs = require('./chunk-GLRZAPX6.cjs'); var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs'); var chunkMNWKYY5E_cjs = require('./chunk-MNWKYY5E.cjs'); var hono = require('hono'); @@ -189,7 +189,7 @@ apiContentCrudRoutes.get("/:id", async (c) => { }, 500); } }); -apiContentCrudRoutes.post("/", chunkV4V54BY3_cjs.requireAuth(), chunkV4V54BY3_cjs.requireRole(["admin", "editor", "author"]), async (c) => { +apiContentCrudRoutes.post("/", chunkTAOOLOUH_cjs.requireAuth(), chunkTAOOLOUH_cjs.requireRole(["admin", "editor", "author"]), async (c) => { try { const db = c.env.DB; const user = c.get("user"); @@ -230,7 +230,7 @@ apiContentCrudRoutes.post("/", chunkV4V54BY3_cjs.requireAuth(), chunkV4V54BY3_cj now, now ).run(); - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); await cache.invalidate(`content:list:${collectionId}:*`); await cache.invalidate("content-filtered:*"); const getStmt = db.prepare("SELECT * FROM content WHERE id = ?"); @@ -255,7 +255,7 @@ apiContentCrudRoutes.post("/", chunkV4V54BY3_cjs.requireAuth(), chunkV4V54BY3_cj }, 500); } }); -apiContentCrudRoutes.put("/:id", chunkV4V54BY3_cjs.requireAuth(), chunkV4V54BY3_cjs.requireRole(["admin", "editor", "author"]), async (c) => { +apiContentCrudRoutes.put("/:id", chunkTAOOLOUH_cjs.requireAuth(), chunkTAOOLOUH_cjs.requireRole(["admin", "editor", "author"]), async (c) => { try { const id = c.req.param("id"); const db = c.env.DB; @@ -293,7 +293,7 @@ apiContentCrudRoutes.put("/:id", chunkV4V54BY3_cjs.requireAuth(), chunkV4V54BY3_ WHERE id = ? `); await updateStmt.bind(...params).run(); - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); await cache.delete(cache.generateKey("content", id)); await cache.invalidate(`content:list:${existing.collection_id}:*`); await cache.invalidate("content-filtered:*"); @@ -319,7 +319,7 @@ apiContentCrudRoutes.put("/:id", chunkV4V54BY3_cjs.requireAuth(), chunkV4V54BY3_ }, 500); } }); -apiContentCrudRoutes.delete("/:id", chunkV4V54BY3_cjs.requireAuth(), chunkV4V54BY3_cjs.requireRole(["admin", "editor", "author"]), async (c) => { +apiContentCrudRoutes.delete("/:id", chunkTAOOLOUH_cjs.requireAuth(), chunkTAOOLOUH_cjs.requireRole(["admin", "editor", "author"]), async (c) => { try { const id = c.req.param("id"); const db = c.env.DB; @@ -330,7 +330,7 @@ apiContentCrudRoutes.delete("/:id", chunkV4V54BY3_cjs.requireAuth(), chunkV4V54B } const deleteStmt = db.prepare("DELETE FROM content WHERE id = ?"); await deleteStmt.bind(id).run(); - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); await cache.delete(cache.generateKey("content", id)); await cache.invalidate(`content:list:${existing.collection_id}:*`); await cache.invalidate("content-filtered:*"); @@ -355,7 +355,7 @@ apiRoutes.use("*", async (c, next) => { c.header("X-Response-Time", `${totalTime}ms`); }); apiRoutes.use("*", async (c, next) => { - const cacheEnabled = await chunkV4V54BY3_cjs.isPluginActive(c.env.DB, "core-cache"); + const cacheEnabled = await chunkTAOOLOUH_cjs.isPluginActive(c.env.DB, "core-cache"); c.set("cacheEnabled", cacheEnabled); await next(); }); @@ -792,7 +792,7 @@ apiRoutes.get("/collections", async (c) => { try { const db = c.env.DB; const cacheEnabled = c.get("cacheEnabled"); - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); const cacheKey = cache.generateKey("collections", "all"); if (cacheEnabled) { const cacheResult = await cache.getWithSource(cacheKey); @@ -846,7 +846,7 @@ apiRoutes.get("/collections", async (c) => { return c.json({ error: "Failed to fetch collections" }, 500); } }); -apiRoutes.get("/content", chunkV4V54BY3_cjs.optionalAuth(), async (c) => { +apiRoutes.get("/content", chunkTAOOLOUH_cjs.optionalAuth(), async (c) => { const executionStart = Date.now(); try { const db = c.env.DB; @@ -869,13 +869,13 @@ apiRoutes.get("/content", chunkV4V54BY3_cjs.optionalAuth(), async (c) => { }); } } - const filter = chunk74BFRAQS_cjs.QueryFilterBuilder.parseFromQuery(queryParams); + const filter = chunkGLRZAPX6_cjs.QueryFilterBuilder.parseFromQuery(queryParams); const normalizedFilter = normalizePublicContentFilter(filter, c.get("user")?.role); if (!normalizedFilter.limit) { normalizedFilter.limit = 50; } normalizedFilter.limit = Math.min(normalizedFilter.limit, 1e3); - const builder3 = new chunk74BFRAQS_cjs.QueryFilterBuilder(); + const builder3 = new chunkGLRZAPX6_cjs.QueryFilterBuilder(); const queryResult = builder3.build("content", normalizedFilter); if (queryResult.errors.length > 0) { return c.json({ @@ -884,7 +884,7 @@ apiRoutes.get("/content", chunkV4V54BY3_cjs.optionalAuth(), async (c) => { }, 400); } const cacheEnabled = c.get("cacheEnabled"); - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); const cacheKey = cache.generateKey("content-filtered", JSON.stringify({ filter: normalizedFilter, query: queryResult.sql })); if (cacheEnabled) { const cacheResult = await cache.getWithSource(cacheKey); @@ -947,7 +947,7 @@ apiRoutes.get("/content", chunkV4V54BY3_cjs.optionalAuth(), async (c) => { }, 500); } }); -apiRoutes.get("/collections/:collection/content", chunkV4V54BY3_cjs.optionalAuth(), async (c) => { +apiRoutes.get("/collections/:collection/content", chunkTAOOLOUH_cjs.optionalAuth(), async (c) => { const executionStart = Date.now(); try { const collection = c.req.param("collection"); @@ -958,7 +958,7 @@ apiRoutes.get("/collections/:collection/content", chunkV4V54BY3_cjs.optionalAuth if (!collectionResult) { return c.json({ error: "Collection not found" }, 404); } - const filter = chunk74BFRAQS_cjs.QueryFilterBuilder.parseFromQuery(queryParams); + const filter = chunkGLRZAPX6_cjs.QueryFilterBuilder.parseFromQuery(queryParams); const normalizedFilter = normalizePublicContentFilter(filter, c.get("user")?.role); if (!normalizedFilter.where) { normalizedFilter.where = { and: [] }; @@ -975,7 +975,7 @@ apiRoutes.get("/collections/:collection/content", chunkV4V54BY3_cjs.optionalAuth normalizedFilter.limit = 50; } normalizedFilter.limit = Math.min(normalizedFilter.limit, 1e3); - const builder3 = new chunk74BFRAQS_cjs.QueryFilterBuilder(); + const builder3 = new chunkGLRZAPX6_cjs.QueryFilterBuilder(); const queryResult = builder3.build("content", normalizedFilter); if (queryResult.errors.length > 0) { return c.json({ @@ -984,7 +984,7 @@ apiRoutes.get("/collections/:collection/content", chunkV4V54BY3_cjs.optionalAuth }, 400); } const cacheEnabled = c.get("cacheEnabled"); - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); const cacheKey = cache.generateKey("collection-content-filtered", `${collection}:${JSON.stringify({ filter: normalizedFilter, query: queryResult.sql })}`); if (cacheEnabled) { const cacheResult = await cache.getWithSource(cacheKey); @@ -1096,7 +1096,7 @@ var fileValidationSchema = zod.z.object({ // 50MB max }); var apiMediaRoutes = new hono.Hono(); -apiMediaRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); +apiMediaRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); apiMediaRoutes.post("/upload", async (c) => { try { const user = c.get("user"); @@ -1840,8 +1840,8 @@ apiSystemRoutes.get("/env", (c) => { }); var api_system_default = apiSystemRoutes; var adminApiRoutes = new hono.Hono(); -adminApiRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); -adminApiRoutes.use("*", chunkV4V54BY3_cjs.requireRole(["admin", "editor"])); +adminApiRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); +adminApiRoutes.use("*", chunkTAOOLOUH_cjs.requireRole(["admin", "editor"])); adminApiRoutes.get("/stats", async (c) => { try { const db = c.env.DB; @@ -2353,7 +2353,7 @@ adminApiRoutes.delete("/collections/:id", async (c) => { }); adminApiRoutes.get("/migrations/status", async (c) => { try { - const { MigrationService: MigrationService2 } = await import('./migrations-3CPSXQ26.cjs'); + const { MigrationService: MigrationService2 } = await import('./migrations-2MVNZKQI.cjs'); const db = c.env.DB; const migrationService = new MigrationService2(db); const status = await migrationService.getMigrationStatus(); @@ -2378,7 +2378,7 @@ adminApiRoutes.post("/migrations/run", async (c) => { error: "Unauthorized. Admin access required." }, 403); } - const { MigrationService: MigrationService2 } = await import('./migrations-3CPSXQ26.cjs'); + const { MigrationService: MigrationService2 } = await import('./migrations-2MVNZKQI.cjs'); const db = c.env.DB; const migrationService = new MigrationService2(db); const result = await migrationService.runPendingMigrations(); @@ -2400,7 +2400,7 @@ adminApiRoutes.post("/migrations/run", async (c) => { }); adminApiRoutes.get("/migrations/validate", async (c) => { try { - const { MigrationService: MigrationService2 } = await import('./migrations-3CPSXQ26.cjs'); + const { MigrationService: MigrationService2 } = await import('./migrations-2MVNZKQI.cjs'); const db = c.env.DB; const migrationService = new MigrationService2(db); const validation = await migrationService.validateSchema(); @@ -5153,8 +5153,8 @@ var JWT_SECRET_FALLBACK = "your-super-secret-jwt-key-change-in-production"; async function setCsrfCookie(c, maxAge) { const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK; const isDev = c.env?.ENVIRONMENT === "development" || !c.env?.ENVIRONMENT; - const csrfToken = await chunkV4V54BY3_cjs.generateCsrfToken(secret); - const cookieMaxAge = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env?.DB, c.env); + const csrfToken = await chunkTAOOLOUH_cjs.generateCsrfToken(secret); + const cookieMaxAge = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env?.DB, c.env); cookie.setCookie(c, "csrf_token", csrfToken, { httpOnly: false, secure: !isDev, @@ -5211,7 +5211,7 @@ var loginSchema = zod.z.object({ }); authRoutes.post( "/register", - chunkV4V54BY3_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }), + chunkTAOOLOUH_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }), async (c) => { try { const db = c.env.DB; @@ -5248,7 +5248,7 @@ authRoutes.post( if (existingUser) { return c.json({ error: "User with this email or username already exists" }, 400); } - const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); + const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); const userId = crypto.randomUUID(); const now = /* @__PURE__ */ new Date(); await db.prepare(` @@ -5282,8 +5282,8 @@ authRoutes.post( await saveCustomData(db, userId, sanitized); } } - const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const token = await chunkV4V54BY3_cjs.AuthManager.generateToken(userId, normalizedEmail, "viewer", c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const token = await chunkTAOOLOUH_cjs.AuthManager.generateToken(userId, normalizedEmail, "viewer", c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", token, { httpOnly: true, secure: true, @@ -5316,7 +5316,7 @@ authRoutes.post( ); authRoutes.post( "/login", - chunkV4V54BY3_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }), + chunkTAOOLOUH_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }), async (c) => { try { const body = await c.req.json(); @@ -5327,7 +5327,7 @@ authRoutes.post( const { email, password } = validation.data; const db = c.env.DB; const normalizedEmail = email.toLowerCase(); - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.user); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.user); let user = await cache.get(cache.generateKey("user", `email:${normalizedEmail}`)); if (!user) { user = await db.prepare("SELECT * FROM users WHERE email = ? AND is_active = 1").bind(normalizedEmail).first(); @@ -5339,20 +5339,20 @@ authRoutes.post( if (!user) { return c.json({ error: "Invalid email or password" }, 401); } - const isValidPassword = await chunkV4V54BY3_cjs.AuthManager.verifyPassword(password, user.password_hash); + const isValidPassword = await chunkTAOOLOUH_cjs.AuthManager.verifyPassword(password, user.password_hash); if (!isValidPassword) { return c.json({ error: "Invalid email or password" }, 401); } - if (chunkV4V54BY3_cjs.AuthManager.isLegacyHash(user.password_hash)) { + if (chunkTAOOLOUH_cjs.AuthManager.isLegacyHash(user.password_hash)) { try { - const newHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); + const newHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); await db.prepare("UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?").bind(newHash, Date.now(), user.id).run(); } catch (rehashError) { console.error("Password rehash failed (non-fatal):", rehashError); } } - const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const token = await chunkV4V54BY3_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const token = await chunkTAOOLOUH_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", token, { httpOnly: true, secure: true, @@ -5404,7 +5404,7 @@ authRoutes.get("/logout", (c) => { clearCsrfCookie(c); return c.redirect("/auth/login?message=You have been logged out successfully"); }); -authRoutes.get("/me", chunkV4V54BY3_cjs.requireAuth(), async (c) => { +authRoutes.get("/me", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { try { const user = c.get("user"); if (!user) { @@ -5424,7 +5424,7 @@ authRoutes.get("/me", chunkV4V54BY3_cjs.requireAuth(), async (c) => { }); authRoutes.post( "/refresh", - chunkV4V54BY3_cjs.rateLimit({ max: 60, windowMs: 60 * 1e3, keyPrefix: "refresh" }), + chunkTAOOLOUH_cjs.rateLimit({ max: 60, windowMs: 60 * 1e3, keyPrefix: "refresh" }), async (c) => { try { let token = c.req.header("Authorization")?.replace("Bearer ", ""); @@ -5433,8 +5433,8 @@ authRoutes.post( return c.json({ error: "Authentication required" }, 401); } const db = c.env.DB; - const grace = await chunkV4V54BY3_cjs.getJwtRefreshGraceSecondsFromDb(db, c.env); - const payload = await chunkV4V54BY3_cjs.AuthManager.verifyToken(token, c.env.JWT_SECRET, grace); + const grace = await chunkTAOOLOUH_cjs.getJwtRefreshGraceSecondsFromDb(db, c.env); + const payload = await chunkTAOOLOUH_cjs.AuthManager.verifyToken(token, c.env.JWT_SECRET, grace); if (!payload) { return c.json({ error: "Invalid or expired token" }, 401); } @@ -5442,8 +5442,8 @@ authRoutes.post( if (!row || !row.is_active) { return c.json({ error: "User is not active" }, 401); } - const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(db, c.env); - const newToken = await chunkV4V54BY3_cjs.AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(db, c.env); + const newToken = await chunkTAOOLOUH_cjs.AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", newToken, { httpOnly: true, secure: true, @@ -5463,7 +5463,7 @@ authRoutes.post( ); authRoutes.post( "/register/form", - chunkV4V54BY3_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }), + chunkTAOOLOUH_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }), async (c) => { try { const db = c.env.DB; @@ -5510,7 +5510,7 @@ authRoutes.post( `); } - const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); + const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); const role = isFirstUser ? "admin" : "viewer"; const userId = crypto.randomUUID(); const now = /* @__PURE__ */ new Date(); @@ -5545,8 +5545,8 @@ authRoutes.post( await saveCustomData(db, userId, sanitized); } } - const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const token = await chunkV4V54BY3_cjs.AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const token = await chunkTAOOLOUH_cjs.AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", token, { httpOnly: true, secure: false, @@ -5578,7 +5578,7 @@ authRoutes.post( ); authRoutes.post( "/login/form", - chunkV4V54BY3_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }), + chunkTAOOLOUH_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }), async (c) => { try { const formData = await c.req.formData(); @@ -5602,7 +5602,7 @@ authRoutes.post( `); } - const isValidPassword = await chunkV4V54BY3_cjs.AuthManager.verifyPassword(password, user.password_hash); + const isValidPassword = await chunkTAOOLOUH_cjs.AuthManager.verifyPassword(password, user.password_hash); if (!isValidPassword) { return c.html(html.html`
@@ -5610,16 +5610,16 @@ authRoutes.post(
`); } - if (chunkV4V54BY3_cjs.AuthManager.isLegacyHash(user.password_hash)) { + if (chunkTAOOLOUH_cjs.AuthManager.isLegacyHash(user.password_hash)) { try { - const newHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); + const newHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); await db.prepare("UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?").bind(newHash, Date.now(), user.id).run(); } catch (rehashError) { console.error("Password rehash failed (non-fatal):", rehashError); } } - const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const token = await chunkV4V54BY3_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const token = await chunkTAOOLOUH_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", token, { httpOnly: true, secure: false, @@ -5660,7 +5660,7 @@ authRoutes.post( ); authRoutes.post( "/seed-admin", - chunkV4V54BY3_cjs.rateLimit({ max: 10, windowMs: 60 * 1e3, keyPrefix: "seed-admin" }), + chunkTAOOLOUH_cjs.rateLimit({ max: 10, windowMs: 60 * 1e3, keyPrefix: "seed-admin" }), async (c) => { try { const db = c.env.DB; @@ -5682,7 +5682,7 @@ authRoutes.post( `).run(); const existingAdmin = await db.prepare("SELECT id FROM users WHERE email = ? OR username = ?").bind("admin@sonicjs.com", "admin").first(); if (existingAdmin) { - const passwordHash2 = await chunkV4V54BY3_cjs.AuthManager.hashPassword("sonicjs!"); + const passwordHash2 = await chunkTAOOLOUH_cjs.AuthManager.hashPassword("sonicjs!"); await db.prepare("UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?").bind(passwordHash2, Date.now(), existingAdmin.id).run(); return c.json({ message: "Admin user already exists (password updated)", @@ -5694,7 +5694,7 @@ authRoutes.post( } }); } - const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword("sonicjs!"); + const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword("sonicjs!"); const userId = "admin-user-id"; const now = Date.now(); const adminEmail = "admin@sonicjs.com".toLowerCase(); @@ -5915,7 +5915,7 @@ authRoutes.post("/accept-invitation", async (c) => { if (existingUsername) { return c.json({ error: "Username is already taken" }, 400); } - const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); + const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); const updateStmt = db.prepare(` UPDATE users SET username = ?, @@ -5934,8 +5934,8 @@ authRoutes.post("/accept-invitation", async (c) => { Date.now(), invitedUser.id ).run(); - const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const authToken = await chunkV4V54BY3_cjs.AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const authToken = await chunkTAOOLOUH_cjs.AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", authToken, { httpOnly: true, secure: true, @@ -5951,7 +5951,7 @@ authRoutes.post("/accept-invitation", async (c) => { }); authRoutes.post( "/request-password-reset", - chunkV4V54BY3_cjs.rateLimit({ max: 3, windowMs: 15 * 60 * 1e3, keyPrefix: "password-reset" }), + chunkTAOOLOUH_cjs.rateLimit({ max: 3, windowMs: 15 * 60 * 1e3, keyPrefix: "password-reset" }), async (c) => { try { const formData = await c.req.formData(); @@ -6169,7 +6169,7 @@ authRoutes.post("/reset-password", async (c) => { if (Date.now() > user.password_reset_expires) { return c.json({ error: "Reset token has expired" }, 400); } - const newPasswordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); + const newPasswordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); try { const historyStmt = db.prepare(` INSERT INTO password_history (id, user_id, password_hash, created_at) @@ -9545,9 +9545,9 @@ function parseFieldValue(field, formData, options = {}) { const { skipValidation = false } = options; const value = formData.get(field.field_name); const errors = []; - const blocksConfig = chunk74BFRAQS_cjs.getBlocksFieldConfig(field.field_options); + const blocksConfig = chunkGLRZAPX6_cjs.getBlocksFieldConfig(field.field_options); if (blocksConfig) { - const parsed = chunk74BFRAQS_cjs.parseBlocksValue(value, blocksConfig); + const parsed = chunkGLRZAPX6_cjs.parseBlocksValue(value, blocksConfig); if (!skipValidation && field.is_required && parsed.value.length === 0) { parsed.errors.push(`${field.field_label} is required`); } @@ -9657,9 +9657,9 @@ function extractFieldData(fields, formData, options = {}) { } return { data, errors }; } -adminContentRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); +adminContentRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); async function getCollectionFields(db, collectionId) { - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.collection); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.collection); return cache.getOrSet( cache.generateKey("fields", collectionId), async () => { @@ -9708,7 +9708,7 @@ async function getCollectionFields(db, collectionId) { ); } async function getCollection(db, collectionId) { - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.collection); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.collection); return cache.getOrSet( cache.generateKey("collection", collectionId), async () => { @@ -9934,21 +9934,21 @@ adminContentRoutes.get("/new", async (c) => { const tinymceEnabled = await isPluginActive2(db, "tinymce-plugin"); let tinymceSettings; if (tinymceEnabled) { - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const tinymcePlugin2 = await pluginService.getPlugin("tinymce-plugin"); tinymceSettings = tinymcePlugin2?.settings; } const quillEnabled = await isPluginActive2(db, "quill-editor"); let quillSettings; if (quillEnabled) { - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const quillPlugin = await pluginService.getPlugin("quill-editor"); quillSettings = quillPlugin?.settings; } const mdxeditorEnabled = await isPluginActive2(db, "easy-mdx"); let mdxeditorSettings; if (mdxeditorEnabled) { - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const mdxeditorPlugin = await pluginService.getPlugin("easy-mdx"); mdxeditorSettings = mdxeditorPlugin?.settings; } @@ -9998,7 +9998,7 @@ adminContentRoutes.get("/:id/edit", async (c) => { const db = c.env.DB; const url = new URL(c.req.url); const referrerParams = url.searchParams.get("ref") || ""; - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.content); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.content); const content = await cache.getOrSet( cache.generateKey("content", id), async () => { @@ -10039,21 +10039,21 @@ adminContentRoutes.get("/:id/edit", async (c) => { const tinymceEnabled = await isPluginActive2(db, "tinymce-plugin"); let tinymceSettings; if (tinymceEnabled) { - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const tinymcePlugin2 = await pluginService.getPlugin("tinymce-plugin"); tinymceSettings = tinymcePlugin2?.settings; } const quillEnabled = await isPluginActive2(db, "quill-editor"); let quillSettings; if (quillEnabled) { - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const quillPlugin = await pluginService.getPlugin("quill-editor"); quillSettings = quillPlugin?.settings; } const mdxeditorEnabled = await isPluginActive2(db, "easy-mdx"); let mdxeditorSettings; if (mdxeditorEnabled) { - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const mdxeditorPlugin = await pluginService.getPlugin("easy-mdx"); mdxeditorSettings = mdxeditorPlugin?.settings; } @@ -10174,7 +10174,7 @@ adminContentRoutes.post("/", async (c) => { now, now ).run(); - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.content); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.content); await cache.invalidate(`content:list:${collectionId}:*`); const versionStmt = db.prepare(` INSERT INTO content_versions (id, content_id, version, data, author_id, created_at) @@ -10293,7 +10293,7 @@ adminContentRoutes.put("/:id", async (c) => { now, id ).run(); - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.content); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.content); await cache.delete(cache.generateKey("content", id)); await cache.invalidate(`content:list:${existingContent.collection_id}:*`); const existingData = JSON.parse(existingContent.data || "{}"); @@ -10348,7 +10348,7 @@ adminContentRoutes.put("/:id", async (c) => { `); } }); -adminContentRoutes.post("/preview", chunkV4V54BY3_cjs.requireRole(["admin", "editor", "author"]), async (c) => { +adminContentRoutes.post("/preview", chunkTAOOLOUH_cjs.requireRole(["admin", "editor", "author"]), async (c) => { try { const formData = await c.req.formData(); const collectionId = formData.get("collection_id"); @@ -10570,7 +10570,7 @@ adminContentRoutes.post("/bulk-action", async (c) => { } else { return c.json({ success: false, error: "Invalid action" }); } - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.content); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.content); for (const contentId of ids) { await cache.delete(cache.generateKey("content", contentId)); } @@ -10598,7 +10598,7 @@ adminContentRoutes.delete("/:id", async (c) => { WHERE id = ? `); await deleteStmt.bind(now, id).run(); - const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.content); + const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.content); await cache.delete(cache.generateKey("content", id)); await cache.invalidate("content:list:*"); return c.html(` @@ -10726,7 +10726,7 @@ adminContentRoutes.post("/:id/restore/:version", async (c) => { return c.json({ success: false, error: "Failed to restore version" }); } }); -adminContentRoutes.get("/:id/version/:version/preview", chunkV4V54BY3_cjs.requireRole(["admin", "editor", "author"]), async (c) => { +adminContentRoutes.get("/:id/version/:version/preview", chunkTAOOLOUH_cjs.requireRole(["admin", "editor", "author"]), async (c) => { try { const id = c.req.param("id"); const version = parseInt(c.req.param("version") || "0"); @@ -12725,14 +12725,14 @@ function renderUsersListPage(data) { // src/routes/admin-users.ts var userRoutes = new hono.Hono(); -userRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); -userRoutes.use("/users/*", chunkV4V54BY3_cjs.requireRole(["admin"])); -userRoutes.use("/users", chunkV4V54BY3_cjs.requireRole(["admin"])); -userRoutes.use("/invite-user", chunkV4V54BY3_cjs.requireRole(["admin"])); -userRoutes.use("/resend-invitation/*", chunkV4V54BY3_cjs.requireRole(["admin"])); -userRoutes.use("/cancel-invitation/*", chunkV4V54BY3_cjs.requireRole(["admin"])); -userRoutes.use("/activity-logs", chunkV4V54BY3_cjs.requireRole(["admin"])); -userRoutes.use("/activity-logs/*", chunkV4V54BY3_cjs.requireRole(["admin"])); +userRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); +userRoutes.use("/users/*", chunkTAOOLOUH_cjs.requireRole(["admin"])); +userRoutes.use("/users", chunkTAOOLOUH_cjs.requireRole(["admin"])); +userRoutes.use("/invite-user", chunkTAOOLOUH_cjs.requireRole(["admin"])); +userRoutes.use("/resend-invitation/*", chunkTAOOLOUH_cjs.requireRole(["admin"])); +userRoutes.use("/cancel-invitation/*", chunkTAOOLOUH_cjs.requireRole(["admin"])); +userRoutes.use("/activity-logs", chunkTAOOLOUH_cjs.requireRole(["admin"])); +userRoutes.use("/activity-logs/*", chunkTAOOLOUH_cjs.requireRole(["admin"])); userRoutes.get("/", (c) => { return c.redirect("/admin/dashboard"); }); @@ -12902,7 +12902,7 @@ userRoutes.put("/profile", async (c) => { } await saveCustomData(db, user.userId, sanitized); } - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "profile.update", @@ -12965,7 +12965,7 @@ userRoutes.post("/profile/avatar", async (c) => { SELECT first_name, last_name FROM users WHERE id = ? `); const userData = await userStmt.bind(user.userId).first(); - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "profile.avatar_update", @@ -13036,7 +13036,7 @@ userRoutes.post("/profile/password", async (c) => { dismissible: true })); } - const validPassword = await chunkV4V54BY3_cjs.AuthManager.verifyPassword(currentPassword, userData.password_hash); + const validPassword = await chunkTAOOLOUH_cjs.AuthManager.verifyPassword(currentPassword, userData.password_hash); if (!validPassword) { return c.html(renderAlert2({ type: "error", @@ -13044,7 +13044,7 @@ userRoutes.post("/profile/password", async (c) => { dismissible: true })); } - const newPasswordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(newPassword); + const newPasswordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(newPassword); const historyStmt = db.prepare(` INSERT INTO password_history (id, user_id, password_hash, created_at) VALUES (?, ?, ?, ?) @@ -13060,7 +13060,7 @@ userRoutes.post("/profile/password", async (c) => { WHERE id = ? `); await updateStmt.bind(newPasswordHash, Date.now(), user.userId).run(); - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "profile.password_change", @@ -13127,7 +13127,7 @@ userRoutes.get("/users", async (c) => { `); const countResult = await countStmt.bind(...params).first(); const totalUsers = countResult?.total || 0; - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "users.list_view", @@ -13285,7 +13285,7 @@ userRoutes.post("/users/new", async (c) => { dismissible: true })); } - const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); + const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); const userId = crypto.randomUUID(); const createStmt = db.prepare(` INSERT INTO users ( @@ -13308,7 +13308,7 @@ userRoutes.post("/users/new", async (c) => { Date.now(), Date.now() ).run(); - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "user!.create", @@ -13347,7 +13347,7 @@ userRoutes.get("/users/:id", async (c) => { if (!userRecord) { return c.json({ error: "User not found" }, 404); } - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "user!.view", @@ -13573,7 +13573,7 @@ userRoutes.put("/users/:id", async (c) => { userId ).run(); if (newPassword) { - const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(newPassword); + const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(newPassword); const updatePasswordStmt = db.prepare(` UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ? `); @@ -13627,7 +13627,7 @@ userRoutes.put("/users/:id", async (c) => { ).run(); } } - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "user.update", @@ -13672,7 +13672,7 @@ userRoutes.post("/users/:id/toggle", async (c) => { UPDATE users SET is_active = ?, updated_at = ? WHERE id = ? `); await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run(); - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, active ? "user.activate" : "user.deactivate", @@ -13713,7 +13713,7 @@ userRoutes.delete("/users/:id", async (c) => { DELETE FROM users WHERE id = ? `); await deleteStmt.bind(userId).run(); - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "user!.hard_delete", @@ -13732,7 +13732,7 @@ userRoutes.delete("/users/:id", async (c) => { UPDATE users SET is_active = 0, updated_at = ? WHERE id = ? `); await deleteStmt.bind(Date.now(), userId).run(); - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "user!.soft_delete", @@ -13798,7 +13798,7 @@ userRoutes.post("/invite-user", async (c) => { Date.now(), Date.now() ).run(); - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "user!.invite_sent", @@ -13855,7 +13855,7 @@ userRoutes.post("/resend-invitation/:id", async (c) => { Date.now(), userId ).run(); - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "user!.invitation_resent", @@ -13891,7 +13891,7 @@ userRoutes.delete("/cancel-invitation/:id", async (c) => { } const deleteStmt = db.prepare(`DELETE FROM users WHERE id = ?`); await deleteStmt.bind(userId).run(); - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "user!.invitation_cancelled", @@ -13974,7 +13974,7 @@ userRoutes.get("/activity-logs", async (c) => { ...log, details: log.details ? JSON.parse(log.details) : null })); - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "activity.logs_viewed", @@ -14081,7 +14081,7 @@ userRoutes.get("/activity-logs/export", async (c) => { csvRows.push(row.join(",")); } const csvContent = csvRows.join("\n"); - await chunkV4V54BY3_cjs.logActivity( + await chunkTAOOLOUH_cjs.logActivity( db, user.userId, "activity.logs_exported", @@ -15420,7 +15420,7 @@ var fileValidationSchema2 = zod.z.object({ // 50MB max }); var adminMediaRoutes = new hono.Hono(); -adminMediaRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); +adminMediaRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); adminMediaRoutes.get("/", async (c) => { try { const user = c.get("user"); @@ -15812,8 +15812,8 @@ adminMediaRoutes.post("/upload", async (c) => { }); continue; } - let width; - let height; + let width = null; + let height = null; if (file.type.startsWith("image/") && !file.type.includes("svg")) { try { const dimensions = await getImageDimensions2(arrayBuffer); @@ -15824,7 +15824,7 @@ adminMediaRoutes.post("/upload", async (c) => { } } const publicUrl = `/files/${r2Key}`; - const thumbnailUrl = file.type.startsWith("image/") ? publicUrl : void 0; + const thumbnailUrl = file.type.startsWith("image/") ? publicUrl : null; const stmt = c.env.DB.prepare(` INSERT INTO media ( id, filename, original_name, mime_type, size, width, height, @@ -16006,7 +16006,7 @@ adminMediaRoutes.put("/:id", async (c) => { `); } }); -adminMediaRoutes.delete("/cleanup", chunkV4V54BY3_cjs.requireRole("admin"), async (c) => { +adminMediaRoutes.delete("/cleanup", chunkTAOOLOUH_cjs.requireRole("admin"), async (c) => { try { const db = c.env.DB; const allMediaStmt = db.prepare("SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL"); @@ -18349,8 +18349,8 @@ function renderEmailSettingsContent(plugin, settings) { // src/routes/admin-plugins.ts var adminPluginRoutes = new hono.Hono(); -adminPluginRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); -var AVAILABLE_PLUGINS = Object.values(chunkQOZZJZ76_cjs.PLUGIN_REGISTRY).map((p) => ({ +adminPluginRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); +var AVAILABLE_PLUGINS = Object.values(chunk656GGECX_cjs.PLUGIN_REGISTRY).map((p) => ({ id: p.id, name: p.codeName, display_name: p.displayName, @@ -18370,7 +18370,7 @@ adminPluginRoutes.get("/", async (c) => { if (user?.role !== "admin") { return c.text("Access denied", 403); } - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); let installedPlugins = []; let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 }; try { @@ -18442,7 +18442,7 @@ adminPluginRoutes.get("/:id", async (c) => { if (user?.role !== "admin") { return c.redirect("/admin/plugins"); } - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const plugin = await pluginService.getPlugin(pluginId); if (!plugin) { return c.text("Plugin not found", 404); @@ -18450,7 +18450,7 @@ adminPluginRoutes.get("/:id", async (c) => { const activity = await pluginService.getPluginActivity(pluginId, 20); let enrichedSettings = plugin.settings || {}; if (pluginId === "otp-login") { - const settingsService = new chunkXWQVFWPW_cjs.SettingsService(db); + const settingsService = new chunkWAEQXGCX_cjs.SettingsService(db); const generalSettings = await settingsService.getGeneralSettings(); const siteName = generalSettings.siteName || "SonicJS"; const emailPlugin = await db.prepare(` @@ -18518,7 +18518,7 @@ adminPluginRoutes.post("/:id/activate", async (c) => { if (user?.role !== "admin") { return c.json({ error: "Access denied" }, 403); } - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); await pluginService.activatePlugin(pluginId); return c.json({ success: true }); } catch (error) { @@ -18535,7 +18535,7 @@ adminPluginRoutes.post("/:id/deactivate", async (c) => { if (user?.role !== "admin") { return c.json({ error: "Access denied" }, 403); } - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); await pluginService.deactivatePlugin(pluginId); return c.json({ success: true }); } catch (error) { @@ -18552,8 +18552,8 @@ adminPluginRoutes.post("/install", async (c) => { return c.json({ error: "Access denied" }, 403); } const body = await c.req.json(); - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); - const registryEntry = chunkQOZZJZ76_cjs.findPluginByCodeName(body.name) || chunkQOZZJZ76_cjs.PLUGIN_REGISTRY[body.name] || chunkQOZZJZ76_cjs.PLUGIN_REGISTRY[body.id]; + const pluginService = new chunk656GGECX_cjs.PluginService(db); + const registryEntry = chunk656GGECX_cjs.findPluginByCodeName(body.name) || chunk656GGECX_cjs.PLUGIN_REGISTRY[body.name] || chunk656GGECX_cjs.PLUGIN_REGISTRY[body.id]; if (!registryEntry) { return c.json({ error: "Plugin not found in registry" }, 404); } @@ -18586,7 +18586,7 @@ adminPluginRoutes.post("/:id/uninstall", async (c) => { if (user?.role !== "admin") { return c.json({ error: "Access denied" }, 403); } - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); await pluginService.uninstallPlugin(pluginId); return c.json({ success: true }); } catch (error) { @@ -18604,7 +18604,7 @@ adminPluginRoutes.post("/:id/settings", async (c) => { return c.json({ error: "Access denied" }, 403); } const settings = await c.req.json(); - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); await pluginService.updatePluginSettings(pluginId, settings); if (pluginId === "core-auth") { try { @@ -19412,11 +19412,11 @@ function renderLogConfigPage(data) { // src/routes/admin-logs.ts var adminLogsRoutes = new hono.Hono(); -adminLogsRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); +adminLogsRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); adminLogsRoutes.get("/", async (c) => { try { const user = c.get("user"); - const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); + const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); const query = c.req.query(); const page = parseInt(query.page || "1"); const limit = parseInt(query.limit || "50"); @@ -19496,7 +19496,7 @@ adminLogsRoutes.get("/:id", async (c) => { try { const id = c.req.param("id"); const user = c.get("user"); - const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); + const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); const { logs } = await logger.getLogs({ limit: 1, offset: 0, @@ -19533,7 +19533,7 @@ adminLogsRoutes.get("/:id", async (c) => { adminLogsRoutes.get("/config", async (c) => { try { const user = c.get("user"); - const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); + const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); const configs = await logger.getAllConfigs(); const pageData = { configs, @@ -19557,7 +19557,7 @@ adminLogsRoutes.post("/config/:category", async (c) => { const level = formData.get("level"); const retention = parseInt(formData.get("retention")); const maxSize = parseInt(formData.get("max_size")); - const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); + const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); await logger.updateConfig(category, { enabled, level, @@ -19586,7 +19586,7 @@ adminLogsRoutes.get("/export", async (c) => { const category = query.category; const startDate = query.start_date; const endDate = query.end_date; - const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); + const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); const filter = { limit: 1e4, // Export up to 10k logs @@ -19667,7 +19667,7 @@ adminLogsRoutes.post("/cleanup", async (c) => { error: "Unauthorized. Admin access required." }, 403); } - const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); + const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); await logger.cleanupByRetention(); return c.html(html.html`
@@ -19689,7 +19689,7 @@ adminLogsRoutes.post("/search", async (c) => { const search = formData.get("search"); const level = formData.get("level"); const category = formData.get("category"); - const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); + const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); const filter = { limit: 20, offset: 0, @@ -21740,9 +21740,9 @@ function renderStorageUsage(databaseSizeBytes, mediaSizeBytes) { } // src/routes/admin-dashboard.ts -var VERSION = chunk74BFRAQS_cjs.getCoreVersion(); +var VERSION = chunkGLRZAPX6_cjs.getCoreVersion(); var router = new hono.Hono(); -router.use("*", chunkV4V54BY3_cjs.requireAuth()); +router.use("*", chunkTAOOLOUH_cjs.requireAuth()); router.get("/", async (c) => { const user = c.get("user"); try { @@ -22610,6 +22610,22 @@ function renderCollectionFormPage(data) {

Collection Details

Configure your collection settings below

+ + ${isEdit && data.name ? ` + +
+ +
+ ` : ""} @@ -23069,6 +23085,176 @@ function renderCollectionFormPage(data) { + ${isEdit && data.name ? ` + + + + + ` : ""} \n \n \n \n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n

Welcome Back

\n

Sign in to your account to continue

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n ${data.message ? `
${renderAlert({ type: 'success', message: data.message })}
` : ''}\n\n \n
\n\n \n \n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Sign In\n \n \n\n \n
\n

\n Don't have an account?\n Create one here\n

\n
\n
\n\n \n
\n \n v${data.version || '0.1.0'}\n \n
\n
\n
\n\n ${demoLoginActive ? `\n \n ` : ''}\n \n \n `\n}","import { renderAlert } from '../alert.template'\n\nexport interface RegisterPageData {\n error?: string\n}\n\nexport function renderRegisterPage(data: RegisterPageData): string {\n return `\n \n \n \n \n \n Register - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n
\n

SonicJS AI

\n

Create your account and get started

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n\n \n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Create Account\n \n \n\n \n
\n

\n Already have an account?\n Sign in here\n

\n
\n\n
\n
\n
\n
\n \n \n `\n}","/**\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 {\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\n if (plugin?.settings) {\n // Parse settings and check registration.enabled\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 return true // Default to enabled if no settings\n } catch {\n return true // Default to enabled on error\n }\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 {\n try {\n const result = await db.prepare('SELECT COUNT(*) as count FROM users').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 {\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 users 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 username: z.string().min(3, 'Username must be at least 3 characters').optional(),\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\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 {\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 'username':\n // Generate username from email (part before @)\n return data.email ? data.email.split('@')[0] : `user${Date.now()}`\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","/**\n * User Profile Config Registry\n *\n * Global singleton storing developer-defined custom profile field definitions.\n * Set once at app boot via defineUserProfile(), queried by routes and templates.\n */\n\nimport type { FieldType } from '../../../types/collection-config'\n\nexport interface ProfileFieldDefinition {\n name: string\n label: string\n type: FieldType\n options?: string[]\n default?: any\n required?: boolean\n placeholder?: string\n helpText?: string\n hidden?: boolean\n fields?: ProfileFieldDefinition[]\n validation?: {\n min?: number\n max?: number\n pattern?: string\n }\n}\n\nexport interface UserProfileConfig {\n fields: ProfileFieldDefinition[]\n registrationFields?: string[]\n}\n\nlet _profileConfig: UserProfileConfig | null = null\n\nexport function defineUserProfile(config: UserProfileConfig): void {\n if (_profileConfig) {\n console.warn('[SonicJS] defineUserProfile called multiple times — overwriting previous config')\n }\n _profileConfig = config\n}\n\nexport function getUserProfileConfig(): UserProfileConfig | null {\n return _profileConfig\n}\n\nexport function getProfileFieldDefaults(): Record {\n if (!_profileConfig) return {}\n const defaults: Record = {}\n for (const field of _profileConfig.fields) {\n if (field.default !== undefined) {\n defaults[field.name] = field.default\n }\n }\n return defaults\n}\n\nexport function getRegistrationFields(): ProfileFieldDefinition[] {\n if (!_profileConfig) return []\n const regFieldNames = _profileConfig.registrationFields || []\n return _profileConfig.fields.filter(f => regFieldNames.includes(f.name))\n}\n\n/** Reset state — for tests only */\nexport function _resetProfileConfig(): void {\n _profileConfig = null\n}\n","/**\n * User Profile Service\n *\n * Handles reading, writing, validation, and sanitization of custom profile data.\n */\n\nimport { sanitizeInput } from '../../../utils/sanitize'\nimport {\n getUserProfileConfig,\n getProfileFieldDefaults,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport function validateCustomData(\n data: Record,\n config: UserProfileConfig\n): { valid: boolean; errors: Record } {\n const errors: Record = {}\n\n for (const field of config.fields) {\n const value = data[field.name]\n\n if (field.required && (value === undefined || value === null || value === '')) {\n errors[field.name] = `${field.label} is required`\n continue\n }\n\n if (value === undefined || value === null || value === '') continue\n\n if (field.type === 'number' && typeof value !== 'number') {\n errors[field.name] = `${field.label} must be a number`\n }\n if (field.type === 'select' && field.options && !field.options.includes(value)) {\n errors[field.name] = `${field.label} must be one of: ${field.options.join(', ')}`\n }\n if (field.type === 'boolean' && typeof value !== 'boolean') {\n errors[field.name] = `${field.label} must be true or false`\n }\n if (field.validation?.min !== undefined && typeof value === 'number' && value < field.validation.min) {\n errors[field.name] = `${field.label} must be at least ${field.validation.min}`\n }\n if (field.validation?.max !== undefined && typeof value === 'number' && value > field.validation.max) {\n errors[field.name] = `${field.label} must be at most ${field.validation.max}`\n }\n if (field.validation?.pattern && typeof value === 'string' && !new RegExp(field.validation.pattern).test(value)) {\n errors[field.name] = `${field.label} format is invalid`\n }\n }\n\n return { valid: Object.keys(errors).length === 0, errors }\n}\n\nexport function sanitizeCustomData(\n data: Record,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n const knownNames = new Set(config.fields.map(f => f.name))\n\n for (const [key, value] of Object.entries(data)) {\n if (!knownNames.has(key)) continue\n if (typeof value === 'string') {\n result[key] = sanitizeInput(value)\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\nexport function coerceFieldValue(raw: string | null | undefined, field: ProfileFieldDefinition): any {\n if (raw === null || raw === undefined || raw === '') {\n return field.default ?? null\n }\n\n switch (field.type) {\n case 'number':\n const num = Number(raw)\n return isNaN(num) ? null : num\n case 'boolean':\n case 'checkbox':\n return raw === '1' || raw === 'true' || raw === 'on'\n case 'date':\n case 'datetime':\n const ts = new Date(raw).getTime()\n return isNaN(ts) ? null : ts\n default:\n return raw\n }\n}\n\nexport function extractCustomFieldsFromForm(\n formData: FormData,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n for (const field of config.fields) {\n const raw = formData.get(`custom_${field.name}`)?.toString()\n // For boolean/checkbox, absence means false\n if (raw === null || raw === undefined) {\n if (field.type === 'boolean' || field.type === 'checkbox') {\n result[field.name] = false\n }\n continue\n }\n result[field.name] = coerceFieldValue(raw, field)\n }\n return result\n}\n\nexport async function getCustomData(db: any, userId: string): Promise> {\n const row = await db\n .prepare('SELECT data FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (!row?.data) return {}\n try {\n return JSON.parse(row.data)\n } catch {\n return {}\n }\n}\n\nexport async function saveCustomData(\n db: any,\n userId: string,\n newData: Record\n): Promise {\n const existing = await getCustomData(db, userId)\n const merged = { ...existing, ...newData }\n const json = JSON.stringify(merged)\n\n // Check if profile row exists\n const row = await db\n .prepare('SELECT id FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (row) {\n await db\n .prepare('UPDATE user_profiles SET data = ?, updated_at = ? WHERE user_id = ?')\n .bind(json, Date.now(), userId)\n .run()\n } else {\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const now = Date.now()\n await db\n .prepare(\n 'INSERT INTO user_profiles (id, user_id, data, created_at, updated_at) VALUES (?, ?, ?, ?, ?)'\n )\n .bind(profileId, userId, json, now, now)\n .run()\n }\n}\n","export interface DragSortableOptions {\n itemSelector?: string\n handleSelector?: string\n onUpdate?: () => void\n}\n\nexport function getDragSortableScript(): string {\n return `\n \n `;\n}\n","import { getDragSortableScript } from './drag-sortable.template'\n\n/**\n * Returns shared readFieldValue function used by both blocks and structured fields.\n * Uses a window flag to ensure it's only initialized once.\n */\nfunction getReadFieldValueScript(): string {\n return `\n \n `\n}\n\nconst STRUCTURED_INDEX_TOKEN = '__INDEX__'\nconst BLOCK_INDEX_TOKEN = '__BLOCK_INDEX__'\n\nfunction sanitizeStructuredGroupId(fieldName: string): string {\n return `object-${fieldName}`\n .split(BLOCK_INDEX_TOKEN)\n .map((blockSegment) =>\n blockSegment\n .split(STRUCTURED_INDEX_TOKEN)\n .map((segment) =>\n segment\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, ''),\n )\n .join(STRUCTURED_INDEX_TOKEN),\n )\n .join(BLOCK_INDEX_TOKEN)\n}\n\nexport interface FieldDefinition {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any // JSON options\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface FieldRenderOptions {\n value?: any\n errors?: string[]\n disabled?: boolean\n className?: string\n pluginStatuses?: {\n quillEnabled?: boolean\n mdxeditorEnabled?: boolean\n tinymceEnabled?: boolean\n }\n collectionId?: string\n contentId?: string\n}\n\nfunction isMarkdownEditorFieldType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nfunction getEditorMetadata(fieldType: string): { family: string; provider: string } | null {\n if (fieldType === 'richtext' || fieldType === 'tinymce') {\n return {\n family: 'richtext',\n provider: 'tinymce',\n }\n }\n\n if (isMarkdownEditorFieldType(fieldType)) {\n return {\n family: 'markdown',\n provider: 'easymde',\n }\n }\n\n return null\n}\n\nexport function renderDynamicField(field: FieldDefinition, options: FieldRenderOptions = {}): string {\n const { value = '', errors = [], disabled = false, className = '', pluginStatuses = {}, collectionId = '', contentId = '' } = options\n const opts = field.field_options || {}\n const required = field.is_required ? 'required' : ''\n const baseClasses = `w-full rounded-lg px-3 py-2 text-sm text-zinc-950 dark:text-white bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 placeholder:text-zinc-400 dark:placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-zinc-950 dark:focus:ring-white transition-shadow ${className}`\n const errorClasses =\n errors.length > 0\n ? 'ring-pink-600 dark:ring-pink-500 focus:ring-pink-600 dark:focus:ring-pink-500'\n : ''\n\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n\n // Check if this is a plugin-based field type and if the plugin is inactive\n // If so, fall back to textarea with a warning\n let fallbackToTextarea = false\n let fallbackWarning = ''\n\n if (field.field_type === 'quill' && !pluginStatuses.quillEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Quill Editor plugin is inactive. Using textarea fallback.'\n } else if (isMarkdownEditorFieldType(field.field_type) && !pluginStatuses.mdxeditorEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Markdown editor plugin is inactive. Using textarea fallback.'\n } else if ((field.field_type === 'richtext' || field.field_type === 'tinymce') && !pluginStatuses.tinymceEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ TinyMCE plugin is inactive. Using textarea fallback.'\n }\n\n // If falling back to textarea, render it with a warning\n if (fallbackToTextarea) {\n return `\n
\n ${fallbackWarning ? `
${fallbackWarning}
` : ''}\n ${escapeHtml(value)}\n
\n `\n }\n\n let fieldHTML = ''\n\n switch (field.field_type) {\n case 'text':\n let patternHelp = ''\n let autoSlugScript = ''\n\n if (opts.pattern) {\n if (opts.pattern === '^[a-z0-9-]+$' || opts.pattern === '^[a-zA-Z0-9_-]+$') {\n patternHelp =\n '

Use letters, numbers, underscores, and hyphens only

'\n\n // Add auto-slug generation for slug fields\n if (fieldName === 'slug') {\n patternHelp +=\n ''\n autoSlugScript = `\n \n `\n }\n } else {\n patternHelp =\n '

Must match required format

'\n }\n }\n\n fieldHTML = `\n \n ${patternHelp}\n ${autoSlugScript}\n ${\n opts.pattern\n ? `\n \n `\n : ''\n }\n `\n break\n\n case 'textarea':\n fieldHTML = `\n ${escapeHtml(value)}\n `\n break\n\n case 'richtext':\n case 'tinymce':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'quill':\n // Quill WYSIWYG Editor\n fieldHTML = `\n
\n \n ${value}
\n\n \n \n \n `\n break\n\n case 'markdown':\n case 'mdxeditor':\n case 'easymde':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n // Markdown editor fields use the EasyMDE-backed richtext container.\n // The EasyMDE plugin initialization script handles activation.\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'number':\n fieldHTML = `\n \n `\n break\n\n case 'boolean':\n const checked = value === true || value === 'true' || value === '1' ? 'checked' : ''\n fieldHTML = `\n
\n \n \n
\n \n `\n break\n\n case 'date':\n fieldHTML = `\n \n `\n break\n\n case 'datetime':\n fieldHTML = `\n \n `\n break\n\n case 'slug':\n // Slug fields with auto-generation and duplicate detection\n const slugPattern = opts.pattern || '^[a-z0-9-]+$'\n const collectionIdValue = collectionId || opts.collectionId || ''\n const contentIdValue = contentId || opts.contentId || ''\n const isEditMode = !!value\n\n fieldHTML = `\n
\n \n
\n \n

Use lowercase letters, numbers, and hyphens only

\n
\n \n \n `\n break\n\n case 'select':\n const selectOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const multiple = opts.multiple ? 'multiple' : ''\n const selectedValues = Array.isArray(value) ? value : [value]\n\n fieldHTML = `\n \n ${!required && !opts.multiple ? '' : ''}\n ${selectOptions\n .map((option: any) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const selected = selectedValues.includes(optionValue) ? 'selected' : ''\n return ``\n })\n .join('')}\n \n ${\n opts.allowCustom\n ? `\n
\n \n
\n `\n : ''\n }\n `\n break\n\n case 'radio':\n const radioOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const selectedRadioValue =\n value !== undefined && value !== null\n ? String(value)\n : opts.default\n ? String(opts.default)\n : ''\n\n const isInline = opts.inline === true\n fieldHTML = `\n
\n ${radioOptions\n .map((option: any, index: number) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const inputId = `${fieldId}-option-${index}`\n const checked = selectedRadioValue === String(optionValue) ? 'checked' : ''\n return `\n \n `\n })\n .join('')}\n
\n `\n break\n\n case 'reference':\n let referenceCollections: string[] = []\n if (Array.isArray(opts.collection)) {\n referenceCollections = opts.collection.filter(Boolean)\n } else if (typeof opts.collection === 'string' && opts.collection) {\n referenceCollections = [opts.collection]\n }\n const referenceCollectionsAttr = referenceCollections.join(',')\n const hasReferenceCollection = referenceCollections.length > 0\n const hasReferenceValue = Boolean(value)\n fieldHTML = `\n
\n \n
\n \n ${hasReferenceCollection ? (hasReferenceValue ? 'Loading selection...' : 'No reference selected.') : 'Reference collection not configured.'}\n
\n
\n \n Select reference\n \n \n Remove\n \n
\n
\n \n `\n break\n\n case 'media':\n // Check if multiple selection is enabled\n const isMultiple = opts.multiple === true\n const mediaValues =\n isMultiple && value\n ? Array.isArray(value)\n ? value\n : String(value).split(',').filter(Boolean)\n : []\n const singleValue = !isMultiple ? value : ''\n\n // Helper to detect if URL is a video\n const isVideoUrl = (url: string) => {\n const videoExtensions = ['.mp4', '.webm', '.ogg', '.mov', '.avi']\n return videoExtensions.some((ext) => url.toLowerCase().endsWith(ext))\n }\n\n // Helper to render media element\n const renderMediaPreview = (url: string, alt: string, classes: string) => {\n if (isVideoUrl(url)) {\n return ``\n }\n return `\"${alt}\"`\n }\n\n fieldHTML = `\n
\n \n\n ${\n isMultiple\n ? `\n
\n ${mediaValues\n .map(\n (url: string, idx: number) => `\n
\n ${renderMediaPreview(url, `Media ${idx + 1}`, 'w-full h-24 object-cover rounded-lg border border-white/20')}\n \n \n \n \n \n
\n `,\n )\n .join('')}\n
\n `\n : `\n
\n ${singleValue ? renderMediaPreview(singleValue, 'Selected media', 'w-32 h-32 object-cover rounded-lg border border-white/20') : ''}\n
\n `\n }\n\n
\n \n \n \n \n ${isMultiple ? 'Select Media (Multiple)' : 'Select Media'}\n \n ${\n (isMultiple ? mediaValues.length > 0 : singleValue)\n ? `\n \n ${isMultiple ? 'Clear All' : 'Remove'}\n \n `\n : ''\n }\n
\n
\n `\n break\n\n case 'object':\n // Structured object field (like SEO with nested properties)\n return renderStructuredObjectField(field, options, baseClasses, errorClasses)\n\n case 'array':\n // Check if this is a blocks field (has discriminator/blocks config) or a regular array\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n if (itemsConfig.blocks && typeof itemsConfig.blocks === 'object') {\n // Blocks field with discriminated union\n return renderBlocksField(field, options, baseClasses, errorClasses)\n }\n // Regular structured array field\n return renderStructuredArrayField(field, options, baseClasses, errorClasses)\n\n default:\n fieldHTML = `\n \n `\n }\n\n const showLabel = field.field_type !== 'boolean'\n\n return `\n
0 ? 'true' : 'false'}\">\n ${\n showLabel\n ? `\n \n `\n : ''\n }\n ${fieldHTML}\n ${\n errors.length > 0\n ? `\n
\n ${errors.map((error) => `
${escapeHtml(error)}
`).join('')}\n
\n `\n : ''\n }\n ${\n opts.helpText\n ? `\n
\n ${escapeHtml(opts.helpText)}\n
\n `\n : ''\n }\n
\n `\n}\n\nexport function renderFieldGroup(\n title: string,\n fields: string[],\n collapsible: boolean = false,\n): string {\n const groupId = title.toLowerCase().replace(/\\s+/g, '-')\n\n return `\n
\n
\n

\n ${escapeHtml(title)}\n ${\n collapsible\n ? `\n \n \n \n `\n : ''\n }\n

\n
\n
\n ${fields.join('')}\n
\n
\n `\n}\n\nfunction renderBlocksField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const blocks = normalizeBlockDefinitions(itemsConfig.blocks)\n const discriminator =\n typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n const blockValues = normalizeBlocksValue(value, discriminator)\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const emptyState =\n blockValues.length === 0\n ? `\n
\n No blocks yet. Add your first block to get started.\n
\n `\n : ''\n\n const blockOptions = blocks\n .map((block) => ``)\n .join('')\n\n const blockItems = blockValues\n .map((blockValue, index) =>\n renderBlockItem(field, blockValue, blocks, discriminator, index, pluginStatuses),\n )\n .join('')\n\n const templates = blocks\n .map((block) => renderBlockTemplate(field, block, discriminator, pluginStatuses))\n .join('')\n\n return `\n \n \n\n
\n

\n ${escapeHtml(field.field_label || 'Content Blocks')}\n

\n
\n\n
\n
\n \n \n ${blockOptions}\n \n
\n \n Add Block\n \n
\n\n
\n ${blockItems || emptyState}\n
\n\n ${templates}\n \n ${getDragSortableScript()}\n ${getBlocksFieldScript()}\n `\n}\n\nfunction renderStructuredObjectField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = {}, pluginStatuses = {}, errors = [] } = options\n const opts = field.field_options || {}\n const properties = opts.properties && typeof opts.properties === 'object' ? opts.properties : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const objectValue = normalizeStructuredObjectValue(value)\n const objectLayout = opts.objectLayout || 'nested'\n const useNestedLayout = objectLayout !== 'flat'\n\n const subfields = Object.entries(properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n objectValue,\n pluginStatuses,\n field.field_name,\n ),\n )\n .join('')\n\n const groupTitle = field.field_label || field.field_name\n\n if (!useNestedLayout) {\n return `\n
\n \n
\n

\n ${escapeHtml(groupTitle)}\n

\n
\n
\n ${subfields}\n
\n
\n ${getStructuredFieldScript()}\n `\n }\n\n const groupId = sanitizeStructuredGroupId(field.field_name)\n const isCollapsed = errors.length > 0 ? false : opts.collapsed !== false\n\n return `\n
\n
\n

\n ${escapeHtml(groupTitle)}\n \n \n \n

\n
\n
\n \n
\n ${subfields}\n
\n
\n
\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const arrayValue = normalizeStructuredArrayValue(value)\n const arrayTitle = opts.itemLabel || field.field_label || 'Items'\n const hasItemTitle = typeof opts.itemTitle === 'string' && opts.itemTitle.trim() !== ''\n const arrayItemTitle = hasItemTitle ? opts.itemTitle.trim() : 'Item'\n const addItemLabel = hasItemTitle ? `Add ${arrayItemTitle}` : 'Add item'\n\n const items = arrayValue\n .map((itemValue, index) =>\n renderStructuredArrayItem(\n field,\n itemsConfig,\n String(index),\n itemValue,\n pluginStatuses,\n arrayItemTitle,\n ),\n )\n .join('')\n\n const emptyState =\n arrayValue.length === 0\n ? `\n
\n No items yet. Add the first item to get started.\n
\n `\n : ''\n\n return `\n
\n \n\n
\n
\n ${escapeHtml(arrayTitle)}\n
\n \n ${escapeHtml(addItemLabel)}\n \n
\n\n
\n ${items || emptyState}\n
\n\n \n
\n ${getDragSortableScript()}\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayItem(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n arrayItemTitle: string,\n): string {\n const itemFields = renderStructuredItemFields(field, itemConfig, index, itemValue, pluginStatuses)\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n ${escapeHtml(arrayItemTitle)} \n
\n
\n
\n \n \n \n \n
\n
\n
\n ${itemFields}\n
\n
\n `\n}\n\nfunction renderStructuredItemFields(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const itemType = itemConfig?.type || 'string'\n if (\n itemType === 'object' &&\n itemConfig?.properties &&\n typeof itemConfig.properties === 'object'\n ) {\n const fieldPrefix = `array-${field.field_name}-${index}`\n return Object.entries(itemConfig.properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n itemValue || {},\n pluginStatuses,\n fieldPrefix,\n ),\n )\n .join('')\n }\n\n const normalizedField = normalizeBlockField(itemConfig, 'Item')\n const fieldValue = itemValue ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `array-${field.field_name}-${index}-value`,\n field_name: `array-${field.field_name}-${index}-value`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction renderStructuredSubfield(\n field: FieldDefinition,\n propertyName: string,\n propertyConfig: any,\n objectValue: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n fieldPrefix: string,\n): string {\n const normalizedField = normalizeBlockField(propertyConfig, propertyName)\n const fieldValue = objectValue?.[propertyName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `${fieldPrefix}-${propertyName}`,\n field_name: `${fieldPrefix}__${propertyName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction normalizeStructuredObjectValue(value: any): Record {\n if (!value) return {}\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {}\n } catch {\n return {}\n }\n }\n if (typeof value === 'object' && !Array.isArray(value)) return value\n return {}\n}\n\nfunction normalizeStructuredArrayValue(value: any): any[] {\n if (!value) return []\n if (Array.isArray(value)) return value\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction normalizeBlockDefinitions(\n rawBlocks: any,\n): Array<{ name: string; label: string; description?: string; properties: Record }> {\n if (!rawBlocks || typeof rawBlocks !== 'object') return []\n\n return Object.entries(rawBlocks)\n .filter(([name, block]) => typeof name === 'string' && block && typeof block === 'object')\n .map(([name, block]: [string, any]) => ({\n name,\n label: block.label || name,\n description: block.description,\n properties: block.properties && typeof block.properties === 'object' ? block.properties : {},\n }))\n}\n\nfunction normalizeBlocksValue(value: any, discriminator: string): any[] {\n const normalizeItem = (item: any) => {\n if (!item || typeof item !== 'object') return null\n if (item[discriminator]) return item\n if (item.blockType && item.data && typeof item.data === 'object') {\n return { [discriminator]: item.blockType, ...item.data }\n }\n return item\n }\n\n const fromArray = (items: any[]) =>\n items.map(normalizeItem).filter((item) => item && typeof item === 'object')\n\n if (Array.isArray(value)) return fromArray(value)\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? fromArray(parsed) : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction renderBlockTemplate(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n return `\n \n `\n}\n\nfunction renderBlockItem(\n field: FieldDefinition,\n blockValue: any,\n blocks: Array<{\n name: string\n label: string\n description?: string\n properties: Record\n }>,\n discriminator: string,\n index: number,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockType = blockValue?.[discriminator] || blockValue?.blockType\n const blockDefinition = blocks.find((block) => block.name === blockType)\n\n if (!blockDefinition) {\n return `\n
\n Unknown block type: ${escapeHtml(String(blockType || 'unknown'))}. This block will be preserved as-is.\n
\n `\n }\n\n const data =\n blockValue && typeof blockValue === 'object'\n ? Object.fromEntries(Object.entries(blockValue).filter(([key]) => key !== discriminator))\n : {}\n\n return renderBlockCard(field, blockDefinition, discriminator, String(index), data, pluginStatuses)\n}\n\nfunction renderBlockCard(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n index: string,\n data: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockFields = Object.entries(block.properties)\n .map(([fieldName, fieldConfig]) => {\n if (fieldConfig?.type === 'array' && fieldConfig?.items?.blocks) {\n return `\n
\n Nested blocks are not supported yet for \"${escapeHtml(fieldName)}\".\n
\n `\n }\n\n const normalizedField = normalizeBlockField(fieldConfig, fieldName)\n const fieldValue = data?.[fieldName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `block-${field.field_name}-${index}-${fieldName}`,\n field_name: `block-${field.field_name}-${index}-${fieldName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n })\n .join('')\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${escapeHtml(block.label)}\n \n
\n ${block.description ? `

${escapeHtml(block.description)}

` : ''}\n
\n
\n
\n \n \n \n \n
\n
\n
\n ${blockFields}\n
\n
\n `\n}\n\nfunction normalizeBlockField(fieldConfig: any, fieldName: string) {\n const type = fieldConfig?.type || 'text'\n const label = fieldConfig?.title || fieldName\n const required = fieldConfig?.required === true\n const options = { ...fieldConfig }\n\n if (type === 'select' && Array.isArray(fieldConfig?.enum)) {\n options.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return {\n type,\n label,\n required,\n defaultValue: fieldConfig?.default,\n options,\n }\n}\n\nfunction getStructuredFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction getBlocksFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}\n","/**\n * User Profile Custom Fields Renderer\n *\n * Generates the HTML section for custom profile fields by adapting\n * ProfileFieldDefinition into FieldDefinition and calling renderDynamicField.\n */\n\nimport { renderDynamicField, type FieldDefinition } from '../../../templates/components/dynamic-field.template'\nimport type { UserProfileConfig, ProfileFieldDefinition } from './user-profile-registry'\n\nexport function toFieldDefinition(field: ProfileFieldDefinition, index: number): FieldDefinition {\n return {\n id: `custom_${field.name}`,\n field_name: `custom_${field.name}`,\n field_type: field.type,\n field_label: field.label,\n field_options: {\n placeholder: field.placeholder || '',\n helpText: field.helpText || '',\n enum: field.options || [],\n enumLabels: field.options || [],\n },\n field_order: index,\n is_required: field.required || false,\n is_searchable: false,\n }\n}\n\nexport function renderCustomProfileSection(\n config: UserProfileConfig | null,\n customData: Record\n): string {\n if (!config || config.fields.length === 0) return ''\n\n const visibleFields = config.fields.filter(f => !f.hidden)\n if (visibleFields.length === 0) return ''\n\n const fieldsHtml = visibleFields\n .map((field, index) => {\n const fieldDef = toFieldDefinition(field, index)\n const value = customData[field.name] ?? field.default ?? ''\n return renderDynamicField(fieldDef, { value })\n })\n .join('\\n')\n\n return `\n \n
\n

Custom Profile Fields

\n
\n ${fieldsHtml}\n
\n
`\n}\n","/**\n * User Profiles Plugin\n *\n * Configurable custom profile fields for users.\n * Developers call defineUserProfile() at app boot to declare custom fields\n * that are stored as JSON in user_profiles.data and rendered in the admin UI.\n *\n * API Routes:\n * GET /api/user-profiles/schema → Public field definitions\n * GET /api/user-profiles/:userId → Get custom data for a user (auth required)\n * PUT /api/user-profiles/:userId → Update custom data for a user (auth required)\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { getUserProfileConfig } from './user-profile-registry'\nimport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\nimport { renderCustomProfileSection } from './user-profile-renderer'\n\nexport function createUserProfilesPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'user-profiles',\n version: '1.0.0-beta.1',\n description: 'Configurable custom profile fields for users',\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com',\n },\n license: 'MIT',\n compatibility: '^2.0.0',\n })\n\n // ==================== API Routes ====================\n\n const api = new Hono()\n\n // GET /api/user-profiles/schema — public schema endpoint\n api.get('/schema', (c) => {\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ fields: [], registrationFields: [] })\n }\n return c.json({\n fields: config.fields\n .filter(f => !f.hidden)\n .map(f => ({\n name: f.name,\n label: f.label,\n type: f.type,\n options: f.options,\n required: f.required || false,\n placeholder: f.placeholder,\n helpText: f.helpText,\n default: f.default,\n validation: f.validation,\n })),\n registrationFields: config.registrationFields || [],\n })\n })\n\n // GET /api/user-profiles/:userId — get custom data\n api.get('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const userId = c.req.param('userId')\n const data = await getCustomData(db, userId)\n return c.json({ userId, customData: data })\n })\n\n // PUT /api/user-profiles/:userId — update custom data\n api.put('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ error: 'No profile schema configured' }, 400)\n }\n\n const userId = c.req.param('userId')\n const body = await c.req.json()\n const customData = body.customData || body\n\n const sanitized = sanitizeCustomData(customData, config)\n const validation = validateCustomData(sanitized, config)\n if (!validation.valid) {\n return c.json({ error: 'Validation failed', errors: validation.errors }, 400)\n }\n\n await saveCustomData(db, userId, sanitized)\n return c.json({ success: true })\n })\n\n builder.addRoute('/api/user-profiles', api, {\n description: 'Custom user profile fields API',\n requiresAuth: false,\n priority: 100,\n })\n\n builder.lifecycle({\n activate: async () => {\n console.info('[SonicJS] User Profiles plugin activated')\n },\n deactivate: async () => {\n console.info('[SonicJS] User Profiles plugin deactivated')\n },\n })\n\n return builder.build() as Plugin\n}\n\nexport const userProfilesPlugin = createUserProfilesPlugin()\n\n// Re-export public API\nexport {\n defineUserProfile,\n getUserProfileConfig,\n getProfileFieldDefaults,\n getRegistrationFields,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\n\nexport { renderCustomProfileSection } from './user-profile-renderer'\n","import { Hono } from 'hono'\n// import { zValidator } from '@hono/zod-validator'\nimport { z } from 'zod'\nimport { getCookie, setCookie } from 'hono/cookie'\nimport { html } from 'hono/html'\nimport { AuthManager, requireAuth, generateCsrfToken, rateLimit } from '../middleware'\nimport { getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb } from '../middleware/auth'\nimport { renderLoginPage, LoginPageData } from '../templates/pages/auth-login.template'\nimport { renderRegisterPage, RegisterPageData } from '../templates/pages/auth-register.template'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { authValidationService, isRegistrationEnabled, isFirstUserRegistration } from '../services/auth-validation'\nimport type { RegistrationData } from '../services/auth-validation'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, getRegistrationFields, getProfileFieldDefaults, sanitizeCustomData, saveCustomData, getCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n/** Set a signed CSRF cookie alongside the auth cookie on login/register. */\nasync function setCsrfCookie(c: any, maxAge?: number): Promise {\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n const csrfToken = await generateCsrfToken(secret)\n const cookieMaxAge = maxAge ?? (await getJwtExpirySecondsFromDb(c.env?.DB, c.env))\n setCookie(c, 'csrf_token', csrfToken, {\n httpOnly: false,\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: cookieMaxAge,\n })\n}\n\n/** Clear the CSRF cookie on logout. */\nfunction clearCsrfCookie(c: any): void {\n setCookie(c, 'csrf_token', '', {\n httpOnly: false,\n secure: false,\n sameSite: 'Strict',\n path: '/',\n maxAge: 0,\n })\n}\n\nconst authRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Login page (HTML form)\nauthRoutes.get('/login', async (c) => {\n const error = c.req.query('error')\n const message = c.req.query('message')\n \n const pageData: LoginPageData = {\n error: error || undefined,\n message: message || undefined,\n version: c.get('appVersion')\n }\n \n // Check if demo login plugin is active\n const db = c.env.DB\n let demoLoginActive = false\n try {\n const plugin = await db.prepare('SELECT * FROM plugins WHERE id = ? AND status = ?')\n .bind('demo-login-prefill', 'active')\n .first()\n demoLoginActive = !!plugin\n } catch (error) {\n // Ignore database errors - plugin system might not be initialized\n }\n \n return c.html(renderLoginPage(pageData, demoLoginActive))\n})\n\n// Registration page (HTML form)\nauthRoutes.get('/register', async (c) => {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.redirect('/auth/login?error=Registration is currently disabled')\n }\n }\n\n const error = c.req.query('error')\n\n const pageData: RegisterPageData = {\n error: error || undefined\n }\n\n return c.html(renderRegisterPage(pageData))\n})\n\n// Login schema\nconst loginSchema = z.object({\n email: z.string().email('Valid email is required'),\n password: z.string().min(1, 'Password is required')\n})\n\n// Register new user\nauthRoutes.post('/register',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.json({ error: 'Registration is currently disabled' }, 403)\n }\n }\n\n // Parse JSON with error handling\n let requestData\n try {\n requestData = await c.req.json()\n } catch (parseError) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n\n let validatedData: RegistrationData\n try {\n validatedData = await validationSchema.parseAsync(requestData)\n } catch (validationError: any) {\n return c.json({\n error: 'Validation failed',\n details: validationError.issues?.map((e: any) => e.message) || [validationError.message || 'Invalid request data']\n }, 400)\n }\n\n // Extract fields with defaults for optional ones\n const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.json({ error: 'User with this email or username already exists' }, 400)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n \n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n 'viewer', // Default role\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n \n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n if (requestData[field.name] !== undefined) {\n customData[field.name] = requestData[field.name]\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, 'viewer', c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n user: {\n id: userId,\n email: normalizedEmail,\n username,\n firstName,\n lastName,\n role: 'viewer'\n },\n token\n }, 201)\n } catch (error) {\n console.error('Registration error:', error)\n // Return validation errors as 400, other errors as 500\n if (error instanceof Error && error.message.includes('validation')) {\n return c.json({ error: error.message }, 400)\n }\n return c.json({\n error: 'Registration failed',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n }\n)\n\n// Login user\nauthRoutes.post('/login',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const body = await c.req.json()\n const validation = loginSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const { email, password } = validation.data\n const db = c.env.DB\n \n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Find user with caching\n const cache = getCacheService(CACHE_CONFIGS.user!)\n let user = await cache.get(cache.generateKey('user', `email:${normalizedEmail}`))\n\n if (!user) {\n user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n\n if (user) {\n // Cache the user for faster subsequent lookups\n await cache.set(cache.generateKey('user', `email:${normalizedEmail}`), user)\n await cache.set(cache.generateKey('user', user.id), user)\n }\n }\n\n if (!user) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n // Invalidate user cache on login\n await cache.delete(cache.generateKey('user', user.id))\n await cache.delete(cache.generateKey('user', `email:${normalizedEmail}`))\n\n return c.json({\n user: {\n id: user.id,\n email: user.email,\n username: user.username,\n firstName: user.first_name,\n lastName: user.last_name,\n role: user.role\n },\n token\n })\n } catch (error) {\n console.error('Login error:', error)\n return c.json({ error: 'Login failed' }, 500)\n }\n})\n\n// Logout user (both GET and POST for convenience)\nauthRoutes.post('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.json({ message: 'Logged out successfully' })\n})\n\nauthRoutes.get('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.redirect('/auth/login?message=You have been logged out successfully')\n})\n\n// Get current user\nauthRoutes.get('/me', requireAuth(), async (c) => {\n try {\n // This would need the auth middleware applied\n const user = c.get('user')\n \n if (!user) {\n return c.json({ error: 'Not authenticated' }, 401)\n }\n \n const db = c.env.DB\n const userData = await db.prepare('SELECT id, email, username, first_name, last_name, role, created_at FROM users WHERE id = ?')\n .bind(user.userId)\n .first() as Record | null\n\n if (!userData) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n const customData = await getCustomData(db, user.userId)\n return c.json({ user: { ...userData, ...customData } })\n } catch (error) {\n console.error('Get user error:', error)\n return c.json({ error: 'Failed to get user' }, 500)\n }\n})\n\n// Refresh token (sliding session)\n//\n// Accepts a valid JWT — or one that has expired within the grace window\n// (`JWT_REFRESH_GRACE_SECONDS`, default 7 days) — and issues a fresh JWT\n// with a new `exp`. This lets a long-lived session cookie keep a user\n// logged in across JWT expirations without forcing a full re-login.\n//\n// Security: the caller must still present a valid-signature token that\n// recently belonged to an active user. Fully forged or long-expired tokens\n// are rejected.\nauthRoutes.post('/refresh',\n rateLimit({ max: 60, windowMs: 60 * 1000, keyPrefix: 'refresh' }),\n async (c) => {\n try {\n // Accept token from Authorization header or cookie\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) token = getCookie(c, 'auth_token')\n\n if (!token) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const grace = await getJwtRefreshGraceSecondsFromDb(db, c.env)\n\n const payload = await AuthManager.verifyToken(token, c.env.JWT_SECRET, grace)\n if (!payload) {\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Re-validate the user is still active, and pick up any role changes.\n const row = await db.prepare('SELECT id, email, role, is_active FROM users WHERE id = ?')\n .bind(payload.userId)\n .first() as any\n\n if (!row || !row.is_active) {\n return c.json({ error: 'User is not active' }, 401)\n }\n\n // Generate new token with a fresh exp\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env)\n const newToken = await AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set new cookie\n setCookie(c, 'auth_token', newToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n token: newToken,\n expiresIn: tokenTtl\n })\n } catch (error) {\n console.error('Token refresh error:', error)\n return c.json({ error: 'Token refresh failed' }, 500)\n }\n})\n\n// Form-based registration handler (for HTML forms)\nauthRoutes.post('/register/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.html(html`\n
\n Registration is currently disabled. Please contact an administrator.\n
\n `)\n }\n }\n\n const formData = await c.req.formData()\n\n // Extract form data\n const requestData = {\n email: formData.get('email') as string,\n password: formData.get('password') as string,\n username: formData.get('username') as string,\n firstName: formData.get('firstName') as string,\n lastName: formData.get('lastName') as string,\n }\n\n // Normalize email to lowercase\n const normalizedEmail = requestData.email?.toLowerCase()\n requestData.email = normalizedEmail\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n const validation = await validationSchema.safeParseAsync(requestData)\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const validatedData: RegistrationData = validation.data\n\n // Extract fields with defaults for optional ones\n // const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.html(html`\n
\n User with this email or username already exists\n
\n `)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Determine role: first user gets admin, others get viewer\n const role = isFirstUser ? 'admin' : 'viewer'\n\n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n\n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n role,\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n\n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n const raw = formData.get(field.name)?.toString()\n if (raw !== undefined && raw !== null) {\n customData[field.name] = raw\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Redirect based on role\n const redirectUrl = role === 'admin' ? '/admin/dashboard' : '/admin/dashboard'\n\n return c.html(html`\n
\n Account created successfully! Redirecting...\n \n
\n `)\n } catch (error) {\n console.error('Registration error:', error)\n return c.html(html`\n
\n Registration failed. Please try again.\n
\n `)\n }\n})\n\n// Form-based login handler (for HTML forms)\nauthRoutes.post('/login/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email') as string\n const password = formData.get('password') as string\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n\n // Validate the data\n const validation = loginSchema.safeParse({ email: normalizedEmail, password })\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const db = c.env.DB\n \n // Find user\n const user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n \n if (!user) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n return c.html(html`\n
\n
\n
\n \n \n \n
\n

Login successful! Redirecting to admin dashboard...

\n
\n
\n \n
\n
\n `)\n } catch (error) {\n console.error('Login error:', error)\n return c.html(html`\n
\n Login failed. Please try again.\n
\n `)\n }\n})\n\n// Test seeding endpoint (only for development/testing)\nauthRoutes.post('/seed-admin',\n rateLimit({ max: 10, windowMs: 60 * 1000, keyPrefix: 'seed-admin' }),\n async (c) => {\n try {\n const db = c.env.DB\n \n // First ensure the users table exists\n await db.prepare(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL UNIQUE,\n username TEXT NOT NULL UNIQUE,\n first_name TEXT NOT NULL,\n last_name TEXT NOT NULL,\n password_hash TEXT,\n role TEXT NOT NULL DEFAULT 'viewer',\n avatar TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n last_login_at INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `).run()\n \n // Check if admin user already exists\n const existingAdmin = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind('admin@sonicjs.com', 'admin')\n .first()\n\n if (existingAdmin) {\n // Update the password to ensure it's correct for testing\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(passwordHash, Date.now(), existingAdmin.id)\n .run()\n\n return c.json({\n message: 'Admin user already exists (password updated)',\n user: {\n id: existingAdmin.id,\n email: 'admin@sonicjs.com',\n username: 'admin',\n role: 'admin'\n }\n })\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n \n // Create admin user\n const userId = 'admin-user-id'\n const now = Date.now()\n const adminEmail = 'admin@sonicjs.com'.toLowerCase()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n adminEmail,\n 'admin',\n 'Admin',\n 'User',\n passwordHash,\n 'admin',\n 1, // is_active\n now,\n now\n ).run()\n \n return c.json({ \n message: 'Admin user created successfully',\n user: {\n id: userId,\n email: adminEmail,\n username: 'admin',\n role: 'admin'\n },\n passwordHash: passwordHash // For debugging\n })\n } catch (error) {\n console.error('Seed admin error:', error)\n return c.json({ error: 'Failed to create admin user', details: error instanceof Error ? error.message : String(error) }, 500)\n }\n})\n\n\n// Accept invitation page\nauthRoutes.get('/accept-invitation', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.html(`\n \n Invitation Expired\n \n

Invitation Expired

\n

This invitation has expired. Please contact your administrator for a new invitation.

\n Go to Login\n \n \n `)\n }\n\n // Show invitation acceptance form\n return c.html(`\n \n \n \n \n \n Accept Invitation - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Accept Invitation

\n

Complete your account setup

\n

\n You've been invited as ${invitedUser.first_name} ${invitedUser.last_name}
\n ${invitedUser.email}
\n ${invitedUser.role}\n

\n
\n\n
\n \n \n
\n \n \n
\n\n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Accept invitation page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your invitation.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process invitation acceptance\nauthRoutes.post('/accept-invitation', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const username = formData.get('username')?.toString()?.trim()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !username || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'Invalid or expired invitation' }, 400)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.json({ error: 'Invitation has expired' }, 400)\n }\n\n // Check if username is available\n const existingUsernameStmt = db.prepare(`\n SELECT id FROM users WHERE username = ? AND id != ?\n `)\n const existingUsername = await existingUsernameStmt.bind(username, invitedUser.id).first()\n\n if (existingUsername) {\n return c.json({ error: 'Username is already taken' }, 400)\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Activate user account\n const updateStmt = db.prepare(`\n UPDATE users SET \n username = ?,\n password_hash = ?,\n is_active = 1,\n email_verified = 1,\n invitation_token = NULL,\n accepted_invitation_at = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n username,\n passwordHash,\n Date.now(),\n Date.now(),\n invitedUser.id\n ).run()\n\n // Generate JWT token for auto-login\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const authToken = await AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', authToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?welcome=true')\n\n } catch (error) {\n console.error('Accept invitation error:', error)\n return c.json({ error: 'Failed to accept invitation' }, 500)\n }\n})\n\n// Request password reset\nauthRoutes.post('/request-password-reset',\n rateLimit({ max: 3, windowMs: 15 * 60 * 1000, keyPrefix: 'password-reset' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email')?.toString()?.trim()?.toLowerCase()\n\n if (!email) {\n return c.json({ error: 'Email is required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if user exists and is active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name FROM users \n WHERE email = ? AND is_active = 1\n `)\n const user = await userStmt.bind(email).first() as any\n\n // Always return success to prevent email enumeration\n if (!user) {\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.'\n })\n }\n\n // Generate password reset token (expires in 1 hour)\n const resetToken = crypto.randomUUID()\n const resetExpires = Date.now() + (60 * 60 * 1000) // 1 hour\n\n // Update user with reset token\n const updateStmt = db.prepare(`\n UPDATE users SET \n password_reset_token = ?,\n password_reset_expires = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n resetToken,\n resetExpires,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // In a real implementation, you would send an email here\n // For now, we'll return the reset link for development\n const resetLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/reset-password?token=${resetToken}`\n\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.',\n reset_link: resetLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('Password reset request error:', error)\n return c.json({ error: 'Failed to process password reset request' }, 500)\n }\n})\n\n// Show password reset form\nauthRoutes.get('/reset-password', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, password_reset_expires\n FROM users \n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has already been used.

\n Go to Login\n \n \n `)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.html(`\n \n Reset Link Expired\n \n

Reset Link Expired

\n

The password reset link has expired. Please request a new one.

\n Go to Login\n \n \n `)\n }\n\n // Show password reset form\n return c.html(`\n \n \n \n \n \n Reset Password - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Reset Password

\n

Choose a new password for your account

\n

\n Reset password for ${user.first_name} ${user.last_name}
\n ${user.email}\n

\n
\n\n
\n \n \n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n\n \n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Password reset page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your password reset.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process password reset\nauthRoutes.post('/reset-password', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, password_hash, password_reset_expires\n FROM users\n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.json({ error: 'Invalid or expired reset token' }, 400)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.json({ error: 'Reset token has expired' }, 400)\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(password)\n\n // Store old password in history (skip if table doesn't exist)\n try {\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user.id,\n user.password_hash,\n Date.now()\n ).run()\n } catch (historyError) {\n // Password history table may not exist yet\n console.warn('Could not store password history:', historyError)\n }\n\n // Update user password and clear reset token\n const updateStmt = db.prepare(`\n UPDATE users SET\n password_hash = ?,\n password_reset_token = NULL,\n password_reset_expires = NULL,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newPasswordHash,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to login with success message\n return c.redirect('/auth/login?message=Password reset successfully. Please log in with your new password.')\n\n } catch (error) {\n console.error('Password reset error:', error)\n return c.json({ error: 'Failed to reset password' }, 500)\n }\n})\n\nexport default authRoutes\n","/**\n * Test Cleanup Routes\n *\n * Provides endpoints to clean up test data after e2e tests\n * WARNING: These endpoints should only be available in development/test environments\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database } from '@cloudflare/workers-types'\n\nconst app = new Hono()\n\n/**\n * Clean up all test data (collections, content, users except admin)\n * POST /test-cleanup\n */\napp.post('/test-cleanup', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Use pattern-based deletes to avoid SQL variable limits\n // This approach uses subqueries instead of building large IN lists\n\n // Step 1: Delete child data for test content (by pattern)\n await db.prepare(`\n DELETE FROM content_versions\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM workflow_history\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n // Note: content_data table may not exist in all schemas\n try {\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n } catch (e) {\n // Table doesn't exist, skip\n }\n\n // Step 2: Delete test content by pattern\n const contentResult = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n `).run()\n deletedCount += contentResult.meta?.changes || 0\n\n // Step 3: Delete child data for test users\n await db.prepare(`\n DELETE FROM api_tokens\n WHERE user_id IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM media\n WHERE uploaded_by IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n // Step 4: Delete test users\n const usersResult = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n `).run()\n deletedCount += usersResult.meta?.changes || 0\n\n // Step 5: Delete child data for test collections\n try {\n await db.prepare(`\n DELETE FROM collection_fields\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Delete remaining content from test collections\n await db.prepare(`\n DELETE FROM content\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n\n // Step 6: Delete test collections\n const collectionsResult = await db.prepare(`\n DELETE FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).run()\n deletedCount += collectionsResult.meta?.changes || 0\n\n // Step 7: Clean up orphaned data (skip if tables don't exist)\n try {\n await db.prepare(`\n DELETE FROM content_data WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM collection_fields WHERE collection_id NOT IN (SELECT id FROM collections)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM content_versions WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM workflow_history WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Step 8: Delete old activity logs (keep only last 100)\n await db.prepare(`\n DELETE FROM activity_logs\n WHERE id NOT IN (\n SELECT id FROM activity_logs\n ORDER BY created_at DESC\n LIMIT 100\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test data cleaned up successfully'\n })\n } catch (error) {\n console.error('Test cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test users only\n * POST /test-cleanup/users\n */\napp.post('/test-cleanup/users', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test users (preserve admin)\n const result = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com'\n AND (\n email LIKE '%test%'\n OR email LIKE '%example.com%'\n OR first_name = 'Test'\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test users cleaned up successfully'\n })\n } catch (error) {\n console.error('User cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test collections only\n * POST /test-cleanup/collections\n */\napp.post('/test-cleanup/collections', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Get test collection IDs first\n const collections = await db.prepare(`\n SELECT id FROM collections\n WHERE name LIKE 'test_%'\n OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).all()\n\n if (collections.results && collections.results.length > 0) {\n const collectionIds = collections.results.map((c: any) => c.id)\n\n // Delete associated fields\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM collection_fields WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete associated content\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM content WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete the collections\n const result = await db.prepare(`\n DELETE FROM collections\n WHERE id IN (${collectionIds.map(() => '?').join(',')})\n `).bind(...collectionIds).run()\n\n deletedCount = result.meta?.changes || 0\n }\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test collections cleaned up successfully'\n })\n } catch (error) {\n console.error('Collection cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test content only\n * POST /test-cleanup/content\n */\napp.post('/test-cleanup/content', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test content\n const result = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %'\n OR title LIKE '%E2E%'\n OR title LIKE '%Playwright%'\n OR title LIKE '%Sample%'\n `).run()\n\n // Clean up orphaned content_data\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test content cleaned up successfully'\n })\n } catch (error) {\n console.error('Content cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Plugin Middleware\n *\n * Provides middleware functions for checking plugin status and enforcing plugin requirements\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n/**\n * Check if a plugin is active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @returns Promise - True if the plugin is active, false otherwise\n */\nexport async function isPluginActive(db: D1Database, pluginId: string): Promise {\n try {\n const result = await db\n .prepare('SELECT status FROM plugins WHERE id = ?')\n .bind(pluginId)\n .first()\n\n return result?.status === 'active'\n } catch (error) {\n console.error(`[isPluginActive] Error checking plugin status for ${pluginId}:`, error)\n return false\n }\n}\n\n/**\n * Middleware to require a plugin to be active\n * Throws an error if the plugin is not active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @throws Error if plugin is not active\n */\nexport async function requireActivePlugin(db: D1Database, pluginId: string): Promise {\n const isActive = await isPluginActive(db, pluginId)\n if (!isActive) {\n throw new Error(`Plugin '${pluginId}' is required but is not active`)\n }\n}\n\n/**\n * Middleware to require multiple plugins to be active\n * Throws an error if any plugin is not active\n * @param db - The D1 database instance\n * @param pluginIds - Array of plugin IDs to check\n * @throws Error if any plugin is not active\n */\nexport async function requireActivePlugins(db: D1Database, pluginIds: string[]): Promise {\n for (const pluginId of pluginIds) {\n await requireActivePlugin(db, pluginId)\n }\n}\n\n/**\n * Get all active plugins\n * @param db - The D1 database instance\n * @returns Promise - Array of active plugin records\n */\nexport async function getActivePlugins(db: D1Database): Promise {\n try {\n const { results } = await db\n .prepare('SELECT * FROM plugins WHERE status = ?')\n .bind('active')\n .all()\n\n return results || []\n } catch (error) {\n console.error('[getActivePlugins] Error fetching active plugins:', error)\n return []\n }\n}\n","export interface ContentVersion {\n id: string\n version: number\n data: any\n author_id: string\n author_name?: string\n created_at: number\n is_current?: boolean\n}\n\nexport interface VersionHistoryData {\n contentId: string\n versions: ContentVersion[]\n currentVersion: number\n}\n\nexport function renderVersionHistory(data: VersionHistoryData): string {\n return `\n
\n
\n \n
\n
\n
\n

Version History

\n \n
\n
\n \n \n
\n
\n ${data.versions.map((version, index) => `\n
\n
\n
\n \n Version ${version.version}${version.is_current ? ' (Current)' : ''}\n \n \n ${new Date(version.created_at).toLocaleString()}\n \n
\n
\n ${!version.is_current ? `\n \n ` : ''}\n \n
\n
\n \n \n
\n
\n
\n Title:\n ${escapeHtml(version.data?.title || 'Untitled')}\n
\n
\n Author:\n ${escapeHtml(version.author_name || 'Unknown')}\n
\n ${version.data?.excerpt ? `\n
\n Excerpt:\n

${escapeHtml(version.data.excerpt.substring(0, 200))}${version.data.excerpt.length > 200 ? '...' : ''}

\n
\n ` : ''}\n
\n
\n \n \n ${!version.is_current && index < data.versions.length - 1 ? `\n
\n \n
\n Change detection coming soon...\n
\n
\n ` : ''}\n
\n `).join('')}\n
\n
\n \n \n
\n
\n \n ${data.versions.length} version${data.versions.length !== 1 ? 's' : ''} total\n \n \n
\n
\n
\n
\n \n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * EasyMDE Markdown Editor Plugin\n *\n * Provides markdown editing capabilities for richtext fields.\n * When active, this plugin injects the EasyMDE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'easy-mdx',\n version: '1.0.0',\n description: 'Lightweight markdown editor with live preview'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ EasyMDE editor plugin activated')\n },\n deactivate: async () => {\n console.info('❌ EasyMDE editor plugin deactivated')\n }\n})\n\nconst easyMdxPlugin = builder.build() as Plugin\n\nexport default easyMdxPlugin\n\n/**\n * Get EasyMDE CDN script tags\n * @returns HTML script and style tags for EasyMDE\n */\nexport function getMDXEditorScripts(): string {\n return `\n \n \n \n \n `\n}\n\n/**\n * Get EasyMDE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getMDXEditorInitScript(config?: {\n defaultHeight?: number\n toolbar?: string\n placeholder?: string\n}): string {\n const defaultHeight = config?.defaultHeight || 400\n const toolbar = config?.toolbar || 'full'\n const placeholder = config?.placeholder || 'Start writing your content...'\n\n return `\n // Initialize EasyMDE (Markdown Editor) only for markdown-marked fields\n function initializeMDXEditor() {\n if (typeof EasyMDE === 'undefined') {\n console.warn('EasyMDE not loaded yet, retrying...');\n setTimeout(initializeMDXEditor, 100);\n return;\n }\n\n // Find all textareas that need EasyMDE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"easymde\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (textarea.dataset.mdxeditorInitialized === 'true') {\n return;\n }\n\n // Mark as initialized\n textarea.dataset.mdxeditorInitialized = 'true';\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const editorToolbar = container?.dataset.toolbar || '${toolbar}';\n\n // Initialize EasyMDE\n try {\n const toolbarButtons = editorToolbar === 'minimal'\n ? ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'preview']\n : ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', 'table', '|', 'preview', 'side-by-side', 'fullscreen', '|', 'guide'];\n\n const easyMDE = new EasyMDE({\n element: textarea,\n placeholder: '${placeholder}',\n spellChecker: false,\n minHeight: height + 'px',\n toolbar: toolbarButtons,\n status: ['lines', 'words', 'cursor'],\n renderingConfig: {\n singleLineBreaks: false,\n codeSyntaxHighlighting: true\n }\n });\n\n // Store reference to editor instance\n textarea.easyMDEInstance = easyMDE;\n\n // Sync changes back to textarea\n easyMDE.codemirror.on(\"change\", () => {\n textarea.value = easyMDE.value();\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n textarea.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n\n console.log('EasyMDE initialized for field:', textarea.id || textarea.name);\n } catch (error) {\n console.error('Error initializing EasyMDE:', error);\n // Show textarea as fallback\n textarea.style.display = 'block';\n }\n });\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeMDXEditor);\n } else {\n // DOM already loaded, initialize immediately\n initializeMDXEditor();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeMDXEditor, 100);\n });\n `\n}\n\n/**\n * Check if EasyMDE editor plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isEasyMdxActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('easy-mdx')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking EasyMDE editor plugin status:', error)\n return false\n }\n}\n","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * TinyMCE Rich Text Editor Plugin\n *\n * Provides WYSIWYG editing capabilities for richtext fields.\n * When active, this plugin injects the TinyMCE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'tinymce-plugin',\n version: '1.0.0',\n description: 'Powerful WYSIWYG rich text editor for content creation'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ TinyMCE plugin activated')\n },\n deactivate: async () => {\n console.info('❌ TinyMCE plugin deactivated')\n }\n})\n\nconst tinymcePlugin = builder.build() as Plugin\n\nexport default tinymcePlugin\n\n/**\n * Get TinyMCE CDN script tag\n * @param apiKey - Optional TinyMCE API key (defaults to 'no-api-key')\n * @returns HTML script tag for TinyMCE CDN\n */\nexport function getTinyMCEScript(apiKey: string = 'no-api-key'): string {\n return ``\n}\n\n/**\n * Get TinyMCE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getTinyMCEInitScript(config?: {\n skin?: string\n defaultHeight?: number\n defaultToolbar?: string\n}): string {\n const skin = config?.skin || 'oxide-dark'\n const contentCss = skin.includes('dark') ? 'dark' : 'default'\n const defaultHeight = config?.defaultHeight || 300\n\n return `\n // Initialize TinyMCE only for TinyMCE-backed richtext fields\n function initializeTinyMCE() {\n if (typeof tinymce !== 'undefined') {\n // Find all textareas that need TinyMCE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"tinymce\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (tinymce.get(textarea.id)) {\n return;\n }\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const toolbar = container?.dataset.toolbar || 'full';\n\n tinymce.init({\n selector: '#' + textarea.id,\n skin: '${skin}',\n content_css: '${contentCss}',\n height: parseInt(height),\n menubar: false,\n plugins: [\n 'advlist', 'autolink', 'lists', 'link', 'image', 'charmap', 'preview',\n 'anchor', 'searchreplace', 'visualblocks', 'code', 'fullscreen',\n 'insertdatetime', 'media', 'table', 'help', 'wordcount'\n ],\n toolbar: toolbar === 'simple'\n ? 'bold italic underline | bullist numlist | link'\n : toolbar === 'minimal'\n ? 'bold italic | link'\n : 'undo redo | blocks | bold italic forecolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | help',\n content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; font-size: 14px }'\n });\n });\n }\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeTinyMCE);\n } else {\n // DOM already loaded, initialize immediately\n initializeTinyMCE();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeTinyMCE, 100);\n });\n `\n}\n\n/**\n * Check if TinyMCE plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isTinyMCEActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('tinymce-plugin')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking TinyMCE plugin status:', error)\n return false\n }\n}\n","/**\n * Quill Rich Text Editor Plugin\n *\n * Provides Quill editor integration for rich text editing in SonicJS\n * https://quilljs.com/\n */\n\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\n/**\n * Quill Editor Configuration Options\n */\nexport interface QuillOptions {\n theme?: 'snow' | 'bubble'\n placeholder?: string\n height?: number\n toolbar?: 'full' | 'simple' | 'minimal' | string[][]\n modules?: Record\n formats?: string[]\n}\n\n/**\n * Default Quill toolbar configurations\n */\nconst QUILL_TOOLBARS = {\n full: [\n [{ 'header': [1, 2, 3, 4, 5, 6, false] }],\n ['bold', 'italic', 'underline', 'strike'],\n [{ 'color': [] }, { 'background': [] }],\n [{ 'align': [] }],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n [{ 'indent': '-1'}, { 'indent': '+1' }],\n ['blockquote', 'code-block'],\n ['link', 'image', 'video'],\n ['clean']\n ],\n simple: [\n ['bold', 'italic', 'underline'],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n ['link']\n ],\n minimal: [\n ['bold', 'italic'],\n ['link']\n ]\n}\n\n/**\n * Render a Quill editor field\n * @param fieldId - The field ID\n * @param fieldName - The field name\n * @param value - The current value\n * @param options - Quill configuration options\n * @returns HTML string for the Quill editor field\n */\nexport function renderQuillField(\n fieldId: string,\n fieldName: string,\n value: string = '',\n options: QuillOptions = {}\n): string {\n const {\n theme = 'snow',\n placeholder = 'Enter content...',\n height = 300,\n toolbar = 'full'\n } = options\n\n // Escape HTML for hidden input\n const escapeHtml = (str: string) => {\n return str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n }\n\n return `\n
\n \n ${value}
\n\n \n \n \n `\n}\n\n/**\n * Generate Quill initialization script\n * @returns HTML script tag with Quill initialization code\n */\nexport function getQuillInitScript(): string {\n return `\n \n `\n}\n\n/**\n * Generate Quill CDN links\n * @param version - Quill version (default: 2.0.2)\n * @returns HTML script and link tags for Quill CDN\n */\nexport function getQuillCDN(version: string = '2.0.2'): string {\n return `\n \n \n \n\n \n \n\n \n \n `\n}\n\n/**\n * Create the Quill Editor Plugin\n */\nexport function createQuillEditorPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'quill-editor',\n version: '1.0.0',\n description: 'Quill rich text editor integration for SonicJS'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Quill Editor plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Quill Editor plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const quillEditorPlugin = createQuillEditorPlugin()\n","import { getMDXEditorInitScript, getMDXEditorScripts } from '../../plugins/available/easy-mdx'\nimport { getTinyMCEInitScript, getTinyMCEScript } from '../../plugins/available/tinymce-plugin'\nimport { getQuillCDN, getQuillInitScript } from '../../plugins/core-plugins/quill-editor'\nimport { renderAlert } from '../alert.template'\nimport { FieldDefinition, renderDynamicField, renderFieldGroup } from '../components/dynamic-field.template'\nimport { getConfirmationDialogScript, renderConfirmationDialog } from '../confirmation-dialog.template'\nimport { AdminLayoutCatalystData, renderAdminLayoutCatalyst } from '../layouts/admin-layout-catalyst.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n schema: any\n}\n\nexport interface ContentFormData {\n id?: string\n title?: string\n slug?: string\n created_at?: number\n updated_at?: number\n published_at?: number\n data?: any\n status?: string\n scheduled_publish_at?: number\n scheduled_unpublish_at?: number\n review_status?: string\n meta_title?: string\n meta_description?: string\n collection: Collection\n fields: FieldDefinition[]\n isEdit?: boolean\n error?: string\n success?: string\n validationErrors?: Record\n workflowEnabled?: boolean // New flag to indicate if workflow plugin is active\n tinymceEnabled?: boolean // Flag to indicate if TinyMCE plugin is active\n tinymceSettings?: {\n apiKey?: string\n defaultHeight?: number\n defaultToolbar?: string\n skin?: string\n }\n quillEnabled?: boolean // Flag to indicate if Quill plugin is active\n quillSettings?: {\n version?: string\n defaultHeight?: number\n defaultToolbar?: string\n theme?: string\n }\n mdxeditorEnabled?: boolean // Flag to indicate if MDXEditor plugin is active\n mdxeditorSettings?: {\n defaultHeight?: number\n theme?: string\n toolbar?: string\n placeholder?: string\n }\n referrerParams?: string // URL parameters to preserve filters when returning to list\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentFormPage(data: ContentFormData): string {\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? `Edit: ${data.title || 'Content'}` : `New ${data.collection.display_name}`\n const hasValidationErrors = Boolean(data.validationErrors && Object.keys(data.validationErrors).length > 0)\n\n // Construct back URL with preserved filters\n const backUrl = data.referrerParams\n ? `/admin/content?${data.referrerParams}`\n : `/admin/content?collection=${data.collection.id}`\n\n // Group fields by category\n const coreFields = data.fields.filter(f => ['title', 'slug', 'content'].includes(f.field_name))\n const contentFields = data.fields.filter(f => !['title', 'slug', 'content'].includes(f.field_name) && !f.field_name.startsWith('meta_'))\n const metaFields = data.fields.filter(f => f.field_name.startsWith('meta_'))\n\n // Helper function to get field value - title and slug are stored as columns, others in data JSON\n const getFieldValue = (fieldName: string) => {\n if (fieldName === 'title') return data.title || data.data?.[fieldName] || ''\n if (fieldName === 'slug') return data.slug || data.data?.[fieldName] || ''\n return data.data?.[fieldName] || ''\n }\n\n // Prepare plugin statuses for field rendering\n const pluginStatuses = {\n quillEnabled: data.quillEnabled || false,\n mdxeditorEnabled: data.mdxeditorEnabled || false,\n tinymceEnabled: data.tinymceEnabled || false\n }\n\n // Render field groups\n const coreFieldsHTML = coreFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id // Pass content ID when editing\n }))\n\n const contentFieldsHTML = contentFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const metaFieldsHTML = metaFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const pageContent = `\n
\n \n
\n
\n

${isEdit ? 'Edit Content' : 'New Content'}

\n

\n ${data.collection.description || `Manage ${data.collection.display_name.toLowerCase()} content`}\n

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

${data.collection.display_name}

\n

${isEdit ? 'Update your content' : 'Create new content'}

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n
\n \n
\n \n \n ${isEdit ? `` : ''}\n ${data.referrerParams ? `` : ''}\n \n \n ${renderFieldGroup('Basic Information', coreFieldsHTML)}\n \n \n ${contentFields.length > 0 ? renderFieldGroup('Content Details', contentFieldsHTML) : ''}\n \n \n ${metaFields.length > 0 ? renderFieldGroup('SEO & Metadata', metaFieldsHTML, true) : ''}\n \n
\n \n
\n\n \n
\n \n
\n

Publishing

\n\n ${data.workflowEnabled ? `\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n \n

Leave empty to publish immediately

\n
\n\n \n
\n \n \n

Automatically unpublish at this time

\n
\n ` : `\n \n
\n \n
\n \n \n \n \n \n \n \n
\n

Enable Workflow plugin for advanced status management

\n
\n `}\n
\n\n \n ${isEdit ? `\n
\n

Content Info

\n\n
\n
\n
Created
\n
${data.created_at ? new Date(data.created_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Last Modified
\n
${data.updated_at ? new Date(data.updated_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Author
\n
${data.data?.author || 'Unknown'}
\n
\n ${data.published_at ? `\n
\n
Published
\n
${new Date(data.published_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n\n
\n \n \n \n \n View Version History\n \n
\n
\n ` : ''}\n\n \n
\n

Quick Actions

\n\n
\n \n \n \n \n \n Preview Content\n \n\n \n \n \n \n Duplicate Content\n \n\n ${isEdit ? `\n \n \n \n \n Delete Content\n \n ` : ''}\n
\n
\n
\n\n \n
\n \n \n \n \n Cancel\n \n\n
\n \n \n \n \n ${isEdit ? 'Update' : 'Save'}\n \n\n ${data.user?.role !== 'viewer' ? `\n \n \n \n \n ${isEdit ? 'Update' : 'Save'} & Publish\n \n ` : ''}\n
\n
\n
\n
\n
\n\n \n ${renderConfirmationDialog({\n id: 'duplicate-content-confirm',\n title: 'Duplicate Content',\n message: 'Create a copy of this content?',\n confirmText: 'Duplicate',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performDuplicateContent()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-content-confirm',\n title: 'Delete Content',\n message: 'Are you sure you want to delete this content? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: `performDeleteContent('${data.id}')`\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-repeater-item-confirm',\n title: 'Delete Item',\n message: 'Are you sure you want to delete this item? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-block-confirm',\n title: 'Delete Block',\n message: 'Are you sure you want to delete this block? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${getConfirmationDialogScript()}\n\n ${data.tinymceEnabled ? getTinyMCEScript(data.tinymceSettings?.apiKey) : ''}\n\n ${data.quillEnabled ? getQuillCDN(data.quillSettings?.version) : ''}\n\n ${data.quillEnabled ? getQuillInitScript() : ''}\n\n ${data.mdxeditorEnabled ? getMDXEditorScripts() : ''}\n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n content: pageContent,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderTable, TableData, TableColumn } from '../table.template'\nimport type { FilterBarData } from '../filter-bar.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../confirmation-dialog.template'\n\nexport interface ContentItem {\n id: string\n title: string\n slug: string\n modelName: string\n statusBadge: string\n authorName: string\n formattedDate: string\n availableActions: string[]\n}\n\nexport interface ContentListPageData {\n modelName: string\n status: string\n page: number\n search?: string\n models: Array<{\n name: string\n displayName: string\n }>\n contentItems: ContentItem[]\n totalItems: number\n itemsPerPage: number\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentListPage(data: ContentListPageData): string {\n // Build current URL parameters to pass to edit page\n const urlParams = new URLSearchParams()\n if (data.modelName && data.modelName !== 'all') urlParams.set('model', data.modelName)\n if (data.status && data.status !== 'all') urlParams.set('status', data.status)\n if (data.search) urlParams.set('search', data.search)\n if (data.page && data.page !== 1) urlParams.set('page', data.page.toString())\n const currentParams = urlParams.toString()\n\n // Check if filters are active (not in default state)\n const hasActiveFilters = data.modelName !== 'all' || data.status !== 'all' || !!data.search\n\n // Prepare filter bar data\n const filterBarData: FilterBarData = {\n filters: [\n {\n name: 'model',\n label: 'Model',\n options: [\n { value: 'all', label: 'All Models', selected: data.modelName === 'all' },\n ...data.models.map(model => ({\n value: model.name,\n label: model.displayName,\n selected: data.modelName === model.name\n }))\n ]\n },\n {\n name: 'status',\n label: 'Status',\n options: [\n { value: 'all', label: 'All Status', selected: data.status === 'all' },\n { value: 'draft', label: 'Draft', selected: data.status === 'draft' },\n { value: 'review', label: 'Under Review', selected: data.status === 'review' },\n { value: 'scheduled', label: 'Scheduled', selected: data.status === 'scheduled' },\n { value: 'published', label: 'Published', selected: data.status === 'published' },\n { value: 'archived', label: 'Archived', selected: data.status === 'archived' },\n { value: 'deleted', label: 'Deleted', selected: data.status === 'deleted' }\n ]\n }\n ],\n actions: [\n {\n label: 'Advanced Search',\n className: 'btn-primary',\n onclick: 'openAdvancedSearch()'\n },\n {\n label: 'Refresh',\n className: 'btn-secondary',\n onclick: 'location.reload()'\n }\n ],\n bulkActions: [\n { label: 'Publish', value: 'publish', icon: 'check-circle' },\n { label: 'Unpublish', value: 'unpublish', icon: 'x-circle' },\n { label: 'Delete', value: 'delete', icon: 'trash', className: 'text-pink-600' }\n ]\n }\n\n // Prepare table data\n const tableColumns: TableColumn[] = [\n {\n key: 'title',\n label: 'Title',\n sortable: true,\n sortType: 'string',\n render: (value, row) => `\n
\n
\n \n
${row.slug}
\n
\n
\n `\n },\n {\n key: 'modelName',\n label: 'Model',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'statusBadge',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (value) => value\n },\n {\n key: 'authorName',\n label: 'Author',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'formattedDate',\n label: 'Updated',\n sortable: true,\n sortType: 'date',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n className: 'text-sm font-medium',\n render: (value, row) => `\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'content-table',\n columns: tableColumns,\n rows: data.contentItems,\n selectable: true,\n rowClickable: true,\n rowClickUrl: (row: ContentItem) => `/admin/content/${row.id}/edit${currentParams ? `?ref=${encodeURIComponent(currentParams)}` : ''}`,\n emptyMessage: 'No content found. Create your first content item to get started.'\n }\n\n // Prepare pagination data\n const totalPages = Math.ceil(data.totalItems / data.itemsPerPage)\n const startItem = (data.page - 1) * data.itemsPerPage + 1\n const endItem = Math.min(data.page * data.itemsPerPage, data.totalItems)\n\n const paginationData: PaginationData = {\n currentPage: data.page,\n totalPages,\n totalItems: data.totalItems,\n itemsPerPage: data.itemsPerPage,\n startItem,\n endItem,\n baseUrl: '/admin/content',\n queryParams: {\n model: data.modelName,\n status: data.status,\n ...(data.search ? { search: data.search } : {})\n },\n showPageSizeSelector: true,\n pageSizeOptions: [10, 20, 50, 100]\n }\n\n // Generate page content\n const pageContent = `\n
\n \n
\n
\n

Content Management

\n

Manage and organize your content items

\n
\n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n \n
\n \n
\n \n \n ${data.models.map(model => `\n \n `).join('')}\n \n \n \n \n
\n
\n\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n
\n ${data.totalItems} ${data.totalItems === 1 ? 'item' : 'items'}\n ${filterBarData.actions?.map(action => `\n \n ${action.label === 'Refresh' ? `\n \n \n \n ` : ''}\n ${action.label}\n \n `).join('') || ''}\n ${filterBarData.bulkActions && filterBarData.bulkActions.length > 0 ? `\n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n \n Move to Draft\n \n
\n
\n \n \n \n \n Delete Selected\n \n
\n
\n
\n ` : ''}\n
\n
\n
\n
\n
\n \n \n
\n ${renderTable(tableData)}\n ${renderPagination(paginationData)}\n
\n \n
\n \n \n
\n
\n \n \n\n \n ${renderConfirmationDialog({\n id: 'bulk-action-confirm',\n title: 'Confirm Bulk Action',\n message: 'Are you sure you want to perform this action? This operation will affect multiple items.',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n iconColor: 'blue',\n onConfirm: 'executeBulkAction()'\n })}\n\n \n ${getConfirmationDialogScript()}\n\n \n
\n
\n \n
\n\n \n
\n
\n \n
\n

\n 🔍 Advanced Search\n

\n \n
\n\n \n
\n \n
\n \n
\n \n
\n
\n
\n\n \n
\n \n
\n \n \n
\n
\n\n \n
\n

Filters

\n \n
\n \n
\n \n \n \n ${data.models.map(\n (model) => `\n \n `\n ).join('')}\n \n

Hold Ctrl/Cmd to select multiple

\n
\n\n \n
\n \n \n \n \n \n \n \n \n
\n
\n
\n\n \n
\n \n Cancel\n \n \n Search\n \n
\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n // Prepare layout data\n const layoutData: AdminLayoutCatalystData = {\n title: 'Content Management',\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export function resolveSchemaFieldType(fieldConfig: Record): string {\n if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n return 'slug'\n }\n\n if (fieldConfig.type && fieldConfig.type !== 'string') {\n return fieldConfig.type\n }\n\n if (fieldConfig.format === 'richtext') {\n return 'richtext'\n }\n\n if (fieldConfig.format === 'media') {\n return 'media'\n }\n\n if (fieldConfig.format === 'date-time') {\n return 'date'\n }\n\n if (Array.isArray(fieldConfig.enum)) {\n return 'select'\n }\n\n return fieldConfig.type || 'string'\n}\n\nexport function buildSchemaFieldOptions(fieldConfig: Record): Record {\n const fieldOptions = { ...fieldConfig }\n const resolvedFieldType = resolveSchemaFieldType(fieldConfig)\n\n if (resolvedFieldType === 'select' && Array.isArray(fieldConfig.enum)) {\n fieldOptions.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return fieldOptions\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { Bindings, Variables } from '../app'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { CACHE_CONFIGS, getCacheService } from '../services/cache'\nimport { PluginService } from '../services/plugin-service'\nimport { ContentVersion, renderVersionHistory, VersionHistoryData } from '../templates/components/version-history.template'\nimport { ContentFormData, renderContentFormPage } from '../templates/pages/admin-content-form.template'\nimport { ContentListPageData, renderContentListPage } from '../templates/pages/admin-content-list.template'\nimport { getBlocksFieldConfig, parseBlocksValue } from '../utils/blocks'\nimport { escapeHtml, sanitizeRichText } from '../utils/sanitize'\nimport { buildSchemaFieldOptions, resolveSchemaFieldType } from './admin-content-field-types'\n\nconst adminContentRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Field definition type for form processing\ninterface FieldDefinition {\n field_name: string\n field_label: string\n field_type: string\n field_options?: any\n is_required?: boolean\n}\n\n// Result of parsing a single field value\ninterface ParsedFieldResult {\n value: any\n errors: string[]\n}\n\n/**\n * Parse a single field value from form data with validation\n * Centralizes field parsing logic used in POST, PUT, and preview handlers\n */\nfunction parseFieldValue(\n field: FieldDefinition,\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): ParsedFieldResult {\n const { skipValidation = false } = options\n const value = formData.get(field.field_name)\n const errors: string[] = []\n\n // Handle blocks fields (array with blocks config)\n const blocksConfig = getBlocksFieldConfig(field.field_options)\n if (blocksConfig) {\n const parsed = parseBlocksValue(value, blocksConfig)\n if (!skipValidation && field.is_required && parsed.value.length === 0) {\n parsed.errors.push(`${field.field_label} is required`)\n }\n return { value: parsed.value, errors: parsed.errors }\n }\n\n // Required field validation\n if (!skipValidation && field.is_required && (!value || value.toString().trim() === '')) {\n return { value: null, errors: [`${field.field_label} is required`] }\n }\n\n // Type-specific parsing\n switch (field.field_type) {\n case 'number':\n if (value && isNaN(Number(value))) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a valid number`)\n }\n return { value: null, errors }\n }\n return { value: value ? Number(value) : null, errors: [] }\n\n case 'boolean':\n // Check for the hidden _submitted field to determine if checkbox was rendered\n const submitted = formData.get(`${field.field_name}_submitted`)\n return { value: submitted ? value === 'true' : false, errors: [] }\n\n case 'select':\n if (field.field_options?.multiple) {\n return { value: formData.getAll(`${field.field_name}[]`), errors: [] }\n }\n return { value: value, errors: [] }\n\n case 'array': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: [], errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON array`)\n }\n return { value: [], errors }\n }\n if (!skipValidation && field.is_required && parsed.length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: [], errors }\n }\n }\n\n case 'object': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: {}, errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON object`)\n }\n return { value: {}, errors }\n }\n if (!skipValidation && field.is_required && Object.keys(parsed).length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: {}, errors }\n }\n }\n\n case 'json': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: null, errors }\n }\n try {\n return { value: JSON.parse(value.toString()), errors: [] }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: null, errors }\n }\n }\n\n default:\n return { value: value, errors: [] }\n }\n}\n\n/**\n * Extract all field values from form data\n */\nfunction extractFieldData(\n fields: FieldDefinition[],\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): { data: Record; errors: Record } {\n const data: Record = {}\n const errors: Record = {}\n\n for (const field of fields) {\n const result = parseFieldValue(field, formData, options)\n data[field.field_name] = result.value\n if (result.errors.length > 0) {\n errors[field.field_name] = result.errors\n }\n }\n\n return { data, errors }\n}\n\n// Apply authentication middleware\nadminContentRoutes.use('*', requireAuth())\n\n// Get collection fields\nasync function getCollectionFields(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('fields', collectionId),\n async () => {\n // First, check if collection has a schema (code-based collection)\n const collectionStmt = db.prepare('SELECT schema FROM collections WHERE id = ?')\n const collectionRow = await collectionStmt.bind(collectionId).first() as any\n\n if (collectionRow && collectionRow.schema) {\n try {\n const schema = typeof collectionRow.schema === 'string' ? JSON.parse(collectionRow.schema) : collectionRow.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n return Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n const fieldOptions = buildSchemaFieldOptions(fieldConfig)\n\n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: resolveSchemaFieldType(fieldConfig),\n field_label: fieldConfig.title || fieldName,\n field_options: fieldOptions,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table for legacy collections\n const stmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results } = await stmt.bind(collectionId).all()\n\n return (results || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }))\n }\n )\n}\n\n// Get collection by ID\nasync function getCollection(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('collection', collectionId),\n async () => {\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ? AND is_active = 1')\n const collection = await stmt.bind(collectionId).first() as any\n\n if (!collection) return null\n\n return {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n schema: collection.schema ? JSON.parse(collection.schema) : {}\n }\n }\n )\n}\n\n// Content list (main page)\nadminContentRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const db = c.env.DB\n\n // Get query parameters\n const page = parseInt(url.searchParams.get('page') || '1')\n const limit = parseInt(url.searchParams.get('limit') || '20')\n const modelName = url.searchParams.get('model') || 'all'\n const status = url.searchParams.get('status') || 'all'\n const search = url.searchParams.get('search') || ''\n const offset = (page - 1) * limit\n\n // Get all collections for filter dropdown (exclude form-sourced)\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results: collectionsResults } = await collectionsStmt.all()\n const models = (collectionsResults || []).map((row: any) => ({\n name: row.name,\n displayName: row.display_name\n }))\n\n // Build where conditions\n const conditions: string[] = []\n const params: any[] = []\n\n // Hide content from form-sourced collections in the regular content list\n conditions.push(\"(col.source_type IS NULL OR col.source_type = 'user')\")\n\n // Always filter out deleted content unless specifically requested\n if (status !== 'deleted') {\n conditions.push(\"c.status != 'deleted'\")\n }\n\n if (search) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n params.push(`%${search}%`, `%${search}%`, `%${search}%`)\n }\n\n if (modelName !== 'all') {\n conditions.push('col.name = ?')\n params.push(modelName)\n }\n\n if (status !== 'all' && status !== 'deleted') {\n conditions.push('c.status = ?')\n params.push(status)\n } else if (status === 'deleted') {\n conditions.push(\"c.status = 'deleted'\")\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n JOIN collections col ON c.collection_id = col.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalItems = countResult?.count || 0\n\n // Get content items\n const contentStmt = db.prepare(`\n SELECT c.id, c.title, c.slug, c.status, c.created_at, c.updated_at,\n col.name as collection_name, col.display_name as collection_display_name,\n u.first_name, u.last_name, u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n const { results } = await contentStmt.bind(...params, limit, offset).all()\n\n // Process content items\n const contentItems = (results || []).map((row: any) => {\n const statusConfig: Record = {\n draft: {\n class: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-1 ring-inset ring-zinc-600/20 dark:ring-zinc-500/20',\n text: 'Draft'\n },\n review: {\n class: 'bg-amber-50 dark:bg-amber-500/10 text-amber-700 dark:text-amber-400 ring-1 ring-inset ring-amber-600/20 dark:ring-amber-500/20',\n text: 'Under Review'\n },\n scheduled: {\n class: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-600/20 dark:ring-blue-500/20',\n text: 'Scheduled'\n },\n published: {\n class: 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-400 ring-1 ring-inset ring-green-600/20 dark:ring-green-500/20',\n text: 'Published'\n },\n archived: {\n class: 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-400 ring-1 ring-inset ring-purple-600/20 dark:ring-purple-500/20',\n text: 'Archived'\n },\n deleted: {\n class: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-600/20 dark:ring-red-500/20',\n text: 'Deleted'\n }\n }\n\n const config = statusConfig[row.status as keyof typeof statusConfig] || statusConfig.draft\n const statusBadge = `\n \n ${config?.text || row.status}\n \n `\n\n const authorName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.author_email || 'Unknown'\n\n const formattedDate = new Date(row.updated_at).toLocaleDateString()\n\n // Determine available workflow actions based on status\n const availableActions: string[] = []\n switch (row.status) {\n case 'draft':\n availableActions.push('submit_for_review', 'publish')\n break\n case 'review':\n availableActions.push('approve', 'request_changes')\n break\n case 'published':\n availableActions.push('unpublish', 'archive')\n break\n case 'scheduled':\n availableActions.push('unschedule')\n break\n }\n\n return {\n id: row.id,\n title: row.title,\n slug: row.slug,\n modelName: row.collection_display_name,\n statusBadge,\n authorName,\n formattedDate,\n availableActions\n }\n })\n\n const pageData: ContentListPageData = {\n modelName,\n status,\n page,\n search,\n models,\n contentItems,\n totalItems,\n itemsPerPage: limit,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentListPage(pageData))\n } catch (error) {\n console.error('Error fetching content list:', error)\n return c.html(`

Error loading content: ${error}

`)\n }\n})\n\n// New content form\nadminContentRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const collectionId = url.searchParams.get('collection')\n\n if (!collectionId) {\n // Show collection selection page\n const db = c.env.DB\n // Exclude form-sourced collections — users shouldn't manually create content in form collections\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name, description FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results } = await collectionsStmt.all()\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description\n }))\n\n // Render collection selection page\n const selectionHTML = `\n \n \n \n Select Collection - SonicJS AI Admin\n \n \n \n
\n
\n

Create New Content

\n

Select a collection to create content in:

\n \n
\n ${collections.map(collection => `\n \n

${collection.display_name}

\n

${collection.description || 'No description'}

\n
\n `).join('')}\n
\n \n \n
\n
\n \n \n `\n\n return c.html(selectionHTML)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n console.log('[Content Form /new] Editor plugins status:', {\n tinymce: tinymceEnabled,\n quill: quillEnabled,\n mdxeditor: mdxeditorEnabled,\n mdxeditorSettings\n })\n\n const formData: ContentFormData = {\n collection,\n fields,\n isEdit: false,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading new content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content form.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Edit content form\nadminContentRoutes.get('/:id/edit', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n\n // Capture referrer parameters to preserve filters when returning to list\n const referrerParams = url.searchParams.get('ref') || ''\n\n // Get content with caching\n const cache = getCacheService(CACHE_CONFIGS.content!)\n const content = await cache.getOrSet(\n cache.generateKey('content', id),\n async () => {\n const contentStmt = db.prepare(`\n SELECT c.*, col.id as collection_id, col.name as collection_name,\n col.display_name as collection_display_name, col.description as collection_description,\n col.schema as collection_schema\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n return await contentStmt.bind(id).first() as any\n }\n )\n\n if (!content) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Content not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const collection = {\n id: content.collection_id,\n name: content.collection_name,\n display_name: content.collection_display_name,\n description: content.collection_description,\n schema: content.collection_schema ? JSON.parse(content.collection_schema) : {}\n }\n\n const fields = await getCollectionFields(db, content.collection_id)\n const contentData = content.data ? JSON.parse(content.data) : {}\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n const formData: ContentFormData = {\n id: content.id,\n title: content.title,\n slug: content.slug,\n created_at: content.created_at,\n updated_at: content.updated_at,\n published_at: content.published_at,\n data: contentData,\n status: content.status,\n scheduled_publish_at: content.scheduled_publish_at,\n scheduled_unpublish_at: content.scheduled_unpublish_at,\n review_status: content.review_status,\n meta_title: content.meta_title,\n meta_description: content.meta_description,\n collection,\n fields,\n isEdit: true,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n referrerParams,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading edit content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content for editing.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Create content\nadminContentRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n const action = formData.get('action') as string\n\n if (!collectionId) {\n return c.html(html`\n
\n Collection ID is required.\n
\n `)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n // Check for validation errors\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Generate slug if not provided\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || 'draft'\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Create content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n // Invalidate collection content list cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n\n // Create initial version\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n contentId,\n 1,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n contentId,\n 'created',\n 'none',\n status,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${contentId}/edit?success=Content saved successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content created successfully!`\n : `/admin/content?collection=${collectionId}&success=Content created successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error creating content:', error)\n return c.html(html`\n
\n Failed to create content. Please try again.\n
\n `)\n }\n})\n\n// Update content\nadminContentRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const formData = await c.req.formData()\n const action = formData.get('action') as string\n\n const db = c.env.DB\n\n // Get existing content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existingContent = await contentStmt.bind(id).first() as any\n\n if (!existingContent) {\n return c.html(html`\n
\n Content not found.\n
\n `)\n }\n\n const collection = await getCollection(db, existingContent.collection_id)\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, existingContent.collection_id)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n id,\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Update slug if title changed\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || existingContent.status\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Update content\n const now = Date.now()\n\n const updateStmt = db.prepare(`\n UPDATE content SET\n slug = ?, title = ?, data = ?, status = ?,\n scheduled_publish_at = ?, scheduled_unpublish_at = ?,\n meta_title = ?, meta_description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n scheduledPublishAt ? new Date(scheduledPublishAt).getTime() : null,\n scheduledUnpublishAt ? new Date(scheduledUnpublishAt).getTime() : null,\n data.meta_title || null,\n data.meta_description || null,\n now,\n id\n ).run()\n\n // Invalidate content cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existingContent.collection_id}:*`)\n\n // Create new version if content changed\n const existingData = JSON.parse(existingContent.data || '{}')\n if (JSON.stringify(existingData) !== JSON.stringify(data)) {\n // Get next version number\n const versionCountStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const versionResult = await versionCountStmt.bind(id).first() as any\n const nextVersion = (versionResult?.max_version || 0) + 1\n\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Log workflow action if status changed\n if (status !== existingContent.status) {\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'status_changed',\n existingContent.status,\n status,\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${id}/edit?success=Content updated successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content updated successfully!`\n : `/admin/content?collection=${existingContent.collection_id}&success=Content updated successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error updating content:', error)\n return c.html(html`\n
\n Failed to update content. Please try again.\n
\n `)\n }\n})\n\n// Content preview\nadminContentRoutes.post('/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html('

Collection not found

')\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract field data for preview (skip validation)\n const { data } = extractFieldData(fields, formData, { skipValidation: true })\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeStatus = escapeHtml(String(formData.get('status') || 'draft'))\n const safeMetaDesc = data.meta_description ? escapeHtml(data.meta_description) : ''\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Preview: ${safeTitle}\n \n \n \n

${safeTitle}

\n
\n Collection: ${escapeHtml(collection.display_name)}
\n Status: ${safeStatus}
\n ${safeMetaDesc ? `Description: ${safeMetaDesc}
` : ''}\n
\n
\n ${safeContent}\n
\n\n

All Fields:

\n \n \n ${fields.map(field => `\n \n \n \n \n `).join('')}\n
FieldValue
${escapeHtml(field.field_label)}${data[field.field_name] ? escapeHtml(String(data[field.field_name])) : 'empty'}
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating preview:', error)\n return c.html('

Error generating preview

')\n }\n})\n\n// Duplicate content\nadminContentRoutes.post('/duplicate', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const originalId = formData.get('id') as string\n\n if (!originalId) {\n return c.json({ success: false, error: 'Content ID required' })\n }\n\n const db = c.env.DB\n\n // Get original content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const original = await contentStmt.bind(originalId).first() as any\n\n if (!original) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n // Create duplicate\n const newId = crypto.randomUUID()\n const now = Date.now()\n const originalData = JSON.parse(original.data || '{}')\n\n // Modify title to indicate it's a copy\n originalData.title = `${originalData.title || 'Untitled'} (Copy)`\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n newId,\n original.collection_id,\n `${original.slug}-copy-${Date.now()}`,\n originalData.title,\n JSON.stringify(originalData),\n 'draft', // Always start as draft\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n return c.json({ success: true, id: newId })\n } catch (error) {\n console.error('Error duplicating content:', error)\n return c.json({ success: false, error: 'Failed to duplicate content' })\n }\n})\n\n// Get bulk actions modal\nadminContentRoutes.get('/bulk-actions', async (c) => {\n const bulkActionsModal = `\n
\n
\n
\n

Bulk Actions

\n \n
\n

\n Select items from the table below to perform bulk actions.\n

\n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n Move to Draft\n \n \n \n \n \n Delete Selected\n \n
\n
\n
\n \n `\n\n return c.html(bulkActionsModal)\n})\n\n// Perform bulk action\nadminContentRoutes.post('/bulk-action', async (c) => {\n try {\n const user = c.get('user')\n const body = await c.req.json()\n const { action, ids } = body\n\n if (!action || !ids || ids.length === 0) {\n return c.json({ success: false, error: 'Action and IDs required' })\n }\n\n const db = c.env.DB\n const now = Date.now()\n\n if (action === 'delete') {\n // Soft delete by setting status to 'deleted'\n const placeholders = ids.map(() => '?').join(',')\n const stmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(now, ...ids).run()\n } else if (action === 'publish' || action === 'draft') {\n // Update status\n const placeholders = ids.map(() => '?').join(',')\n const publishedAt = action === 'publish' ? now : null\n const stmt = db.prepare(`\n UPDATE content\n SET status = ?, published_at = ?, updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(action, publishedAt, now, ...ids).run()\n } else {\n return c.json({ success: false, error: 'Invalid action' })\n }\n\n // Invalidate cache for all affected content items\n const cache = getCacheService(CACHE_CONFIGS.content!)\n for (const contentId of ids) {\n await cache.delete(cache.generateKey('content', contentId))\n }\n // Also invalidate list caches (they contain content from potentially multiple collections)\n await cache.invalidate('content:list:*')\n\n return c.json({ success: true, count: ids.length })\n } catch (error) {\n console.error('Bulk action error:', error)\n return c.json({ success: false, error: 'Failed to perform bulk action' })\n }\n})\n\n// Delete content\nadminContentRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const user = c.get('user')\n\n // Check if content exists\n const contentStmt = db.prepare('SELECT id, title FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.json({ success: false, error: 'Content not found' }, 404)\n }\n\n // Soft delete by setting status to 'deleted'\n const now = Date.now()\n const deleteStmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id = ?\n `)\n await deleteStmt.bind(now, id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate('content:list:*')\n\n // Return success - let HTMX reload the page\n return c.html(`\n
\n
\n
\n \n \n \n

Content deleted successfully. Refreshing...

\n
\n
\n
\n `)\n } catch (error) {\n console.error('Delete content error:', error)\n return c.json({ success: false, error: 'Failed to delete content' }, 500)\n }\n})\n\n// Get version history\nadminContentRoutes.get('/:id/versions', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.html('

Content not found

')\n }\n\n // Get all versions with author info\n const versionsStmt = db.prepare(`\n SELECT cv.*, u.first_name, u.last_name, u.email\n FROM content_versions cv\n LEFT JOIN users u ON cv.author_id = u.id\n WHERE cv.content_id = ?\n ORDER BY cv.version DESC\n `)\n const { results } = await versionsStmt.bind(id).all()\n\n const versions: ContentVersion[] = (results || []).map((row: any) => ({\n id: row.id,\n version: row.version,\n data: JSON.parse(row.data || '{}'),\n author_id: row.author_id,\n author_name: row.first_name && row.last_name ? `${row.first_name} ${row.last_name}` : row.email,\n created_at: row.created_at,\n is_current: false // Will be set below\n }))\n\n // Mark the latest version as current\n if (versions.length > 0) {\n versions[0]!.is_current = true\n }\n\n const data: VersionHistoryData = {\n contentId: id,\n versions,\n currentVersion: versions.length > 0 ? versions[0]!.version : 1\n }\n\n return c.html(renderVersionHistory(data))\n } catch (error) {\n console.error('Error loading version history:', error)\n return c.html('

Error loading version history

')\n }\n})\n\n// Restore version\nadminContentRoutes.post('/:id/restore/:version', async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const user = c.get('user')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT * FROM content_versions \n WHERE content_id = ? AND version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.json({ success: false, error: 'Version not found' })\n }\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const currentContent = await contentStmt.bind(id).first() as any\n\n if (!currentContent) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n const restoredData = JSON.parse(versionData.data)\n const now = Date.now()\n\n // Update content with restored data\n const updateStmt = db.prepare(`\n UPDATE content SET\n title = ?, data = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n restoredData.title || 'Untitled',\n versionData.data,\n now,\n id\n ).run()\n\n // Create new version for the restoration\n const nextVersionStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const nextVersionResult = await nextVersionStmt.bind(id).first() as any\n const nextVersion = (nextVersionResult?.max_version || 0) + 1\n\n const newVersionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await newVersionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n versionData.data,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, comment, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'version_restored',\n currentContent.status,\n currentContent.status,\n user?.userId || 'unknown',\n `Restored to version ${version}`,\n now\n ).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error restoring version:', error)\n return c.json({ success: false, error: 'Failed to restore version' })\n }\n})\n\n// Preview specific version\nadminContentRoutes.get('/:id/version/:version/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT cv.*, c.collection_id, col.display_name as collection_name\n FROM content_versions cv\n JOIN content c ON cv.content_id = c.id\n JOIN collections col ON c.collection_id = col.id\n WHERE cv.content_id = ? AND cv.version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.html('

Version not found

')\n }\n\n const data = JSON.parse(versionData.data || '{}')\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n const safeExcerpt = data.excerpt ? escapeHtml(data.excerpt) : ''\n const safeCollectionName = escapeHtml(versionData.collection_name || '')\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Version ${version} Preview: ${safeTitle}\n \n \n \n
\n Version ${version}\n Collection: ${safeCollectionName}
\n Created: ${new Date(versionData.created_at).toLocaleString()}
\n This is a historical version preview\n
\n\n

${safeTitle}

\n\n
\n ${safeContent}\n
\n\n ${safeExcerpt ? `

Excerpt:

${safeExcerpt}

` : ''}\n\n

All Field Data:

\n
\n${escapeHtml(JSON.stringify(data, null, 2))}\n        
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating version preview:', error)\n return c.html('

Error generating preview

')\n }\n})\nexport default adminContentRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserProfile {\n id: string\n email: string\n username: string\n first_name: string\n last_name: string\n phone?: string\n bio?: string\n avatar_url?: string\n timezone: string\n language: string\n theme: string\n email_notifications: boolean\n two_factor_enabled: boolean\n role: string\n created_at: number\n last_login_at?: number\n}\n\nexport interface ProfilePageData {\n profile: UserProfile\n timezones: Array<{ value: string; label: string }>\n languages: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderAvatarImage(avatarUrl: string | undefined, firstName: string, lastName: string): string {\n return `
\n ${avatarUrl\n ? `\"Profile`\n : `${firstName.charAt(0)}${lastName.charAt(0)}`\n }\n
`\n}\n\nexport function renderProfilePage(data: ProfilePageData): string {\n const pageContent = `\n
\n \n
\n
\n

User Profile

\n

\n Manage your account settings and preferences\n

\n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n \n
\n
\n \n
\n
\n
\n \n \n \n
\n
\n

Profile Information

\n

Update your account details

\n
\n
\n
\n\n \n
\n
\n\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n ${data.profile.bio || ''}\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Preferences

\n\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Notifications

\n\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n \n

Receive email updates about new features and product announcements.

\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Update Profile\n \n
\n
\n
\n
\n\n \n
\n \n
\n

Profile Picture

\n\n
\n ${renderAvatarImage(data.profile.avatar_url, data.profile.first_name, data.profile.last_name)}\n\n
\n \n \n \n \n \n \n Change Picture\n \n \n\n
\n
\n
\n\n \n
\n

Account Information

\n\n
\n
\n
Role
\n
\n \n ${data.profile.role}\n \n
\n
\n
\n
Member Since
\n
${new Date(data.profile.created_at).toLocaleDateString()}
\n
\n ${data.profile.last_login_at ? `\n
\n
Last Login
\n
${new Date(data.profile.last_login_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Two-Factor Auth
\n
\n ${data.profile.two_factor_enabled\n ? 'Enabled'\n : 'Disabled'\n }\n
\n
\n
\n
\n\n \n
\n

Security

\n\n
\n \n \n \n \n Change Password\n \n\n \n \n \n \n ${data.profile.two_factor_enabled ? 'Disable' : 'Enable'} 2FA\n \n
\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Change Password

\n \n
\n
\n\n
\n
\n\n
\n \n \n
\n\n
\n \n \n

Must be at least 8 characters

\n
\n\n
\n \n \n
\n\n
\n \n Cancel\n \n \n \n \n \n Update Password\n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'User Profile',\n pageTitle: 'Profile',\n currentPath: '/admin/profile',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { escapeHtml } from '../../utils/sanitize'\n\nexport type AlertType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface AlertData {\n type: AlertType\n title?: string\n message: string\n dismissible?: boolean\n className?: string\n icon?: boolean\n}\n\nexport function renderAlert(data: AlertData): string {\n const typeClasses = {\n success: 'bg-green-50 dark:bg-green-500/10 border border-green-600/20 dark:border-green-500/20',\n error: 'bg-error/10 border border-red-600/20 dark:border-red-500/20',\n warning: 'bg-amber-50 dark:bg-amber-500/10 border border-amber-600/20 dark:border-amber-500/20',\n info: 'bg-blue-50 dark:bg-blue-500/10 border border-blue-600/20 dark:border-blue-500/20'\n }\n\n const iconClasses = {\n success: 'text-green-600 dark:text-green-400',\n error: 'text-red-600 dark:text-red-400',\n warning: 'text-amber-600 dark:text-amber-400',\n info: 'text-blue-600 dark:text-blue-400'\n }\n\n const textClasses = {\n success: 'text-green-900 dark:text-green-300',\n error: 'text-red-900 dark:text-red-300',\n warning: 'text-amber-900 dark:text-amber-300',\n info: 'text-blue-900 dark:text-blue-300'\n }\n\n const messageTextClasses = {\n success: 'text-green-700 dark:text-green-400',\n error: 'text-red-700 dark:text-red-400',\n warning: 'text-amber-700 dark:text-amber-400',\n info: 'text-blue-700 dark:text-blue-400'\n }\n\n const icons = {\n success: ``,\n error: ``,\n warning: ``,\n info: ``\n }\n\n return `\n
\n
\n ${data.icon !== false ? `\n
\n \n ${icons[data.type]}\n \n
\n ` : ''}\n
\n ${data.title ? `\n

\n ${escapeHtml(data.title)}\n

\n ` : ''}\n
\n

${escapeHtml(data.message)}

\n
\n
\n ${data.dismissible ? `\n
\n
\n \n Dismiss\n \n \n \n \n
\n
\n ` : ''}\n
\n
\n `\n}\n\nexport function renderSuccessAlert(message: string, title?: string): string {\n return renderAlert({ type: 'success', message, title })\n}\n\nexport function renderErrorAlert(message: string, title?: string): string {\n return renderAlert({ type: 'error', message, title })\n}\n\nexport function renderWarningAlert(message: string, title?: string): string {\n return renderAlert({ type: 'warning', message, title })\n}\n\nexport function renderInfoAlert(message: string, title?: string): string {\n return renderAlert({ type: 'info', message, title })\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\n\nexport interface ActivityLog {\n id: string\n user_id: string\n action: string\n resource_type?: string\n resource_id?: string\n details?: any\n ip_address?: string\n user_agent?: string\n created_at: number\n user_email?: string\n user_name?: string\n}\n\nexport interface ActivityLogsPageData {\n logs: ActivityLog[]\n pagination: {\n page: number\n limit: number\n total: number\n pages: number\n }\n filters: {\n user_id?: string\n action?: string\n resource_type?: string\n date_from?: string\n date_to?: string\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderActivityLogsPage(data: ActivityLogsPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Activity Logs

\n

Monitor user actions and system activity

\n
\n
\n\n \n \n\n \n
\n

Filters

\n \n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n Clear Filters\n \n
\n
\n
\n\n \n
\n
\n
\n
\n

Recent Activity

\n
\n Showing ${data.logs.length} of ${data.pagination.total} logs\n
\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${data.logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimestampUserActionResourceIP AddressDetails
\n ${new Date(log.created_at).toLocaleString()}\n \n
${log.user_name || 'Unknown'}
\n
${log.user_email || 'N/A'}
\n
\n \n ${formatAction(log.action)}\n \n \n ${log.resource_type ? `\n
${log.resource_type}
\n ${log.resource_id ? `
${log.resource_id}
` : ''}\n ` : 'N/A'}\n
\n ${log.ip_address || 'N/A'}\n \n ${log.details ? `\n
\n View Details\n
${JSON.stringify(log.details, null, 2)}
\n
\n ` : 'N/A'}\n
\n
\n\n ${data.logs.length === 0 ? `\n
\n \n \n \n

No activity logs found

\n

Try adjusting your filters or check back later.

\n
\n ` : ''}\n\n \n ${data.pagination.pages > 1 ? `\n
\n
\n Page ${data.pagination.page} of ${data.pagination.pages} (${data.pagination.total} total logs)\n
\n \n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutData = {\n title: 'Activity Logs',\n pageTitle: 'Activity Logs',\n currentPath: '/admin/activity-logs',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction getActionBadgeClass(action: string): string {\n if (action.includes('login') || action.includes('logout')) {\n return 'bg-blue-500/20 text-blue-300'\n } else if (action.includes('create') || action.includes('invite')) {\n return 'bg-green-500/20 text-green-300'\n } else if (action.includes('update') || action.includes('change')) {\n return 'bg-yellow-500/20 text-yellow-300'\n } else if (action.includes('delete') || action.includes('cancel')) {\n return 'bg-red-500/20 text-red-300'\n } else {\n return 'bg-gray-500/20 text-gray-300'\n }\n}\n\nfunction formatAction(action: string): string {\n // Convert action from dot notation to readable format\n return action\n .split('.')\n .map(part => part.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()))\n .join(' - ')\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface UserProfileData {\n displayName?: string\n bio?: string\n company?: string\n jobTitle?: string\n website?: string\n location?: string\n dateOfBirth?: number\n}\n\nexport interface UserEditData {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n phone?: string\n avatarUrl?: string\n role: string\n isActive: boolean\n emailVerified: boolean\n twoFactorEnabled: boolean\n createdAt: number\n lastLoginAt?: number\n profile?: UserProfileData\n}\n\nexport interface UserEditPageData {\n userToEdit: UserEditData\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserEditPage(data: UserEditPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Edit User

\n
\n

Update user account and permissions

\n
\n
\n \n \n \n \n Save Changes\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Profile Information

\n

Extended profile data for this user

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n
\n\n
\n \n ${escapeHtml(data.userToEdit.profile?.bio || '')}\n
\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Set Password

\n

Leave blank to keep the current password

\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User has verified their email address

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

User Details

\n
\n
\n
User ID
\n
${data.userToEdit.id}
\n
\n
\n
Created
\n
${new Date(data.userToEdit.createdAt).toLocaleDateString()}
\n
\n ${data.userToEdit.lastLoginAt ? `\n
\n
Last Login
\n
${new Date(data.userToEdit.lastLoginAt).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Status
\n
\n ${data.userToEdit.isActive\n ? 'Active'\n : 'Inactive'\n }\n
\n
\n ${data.userToEdit.twoFactorEnabled ? `\n
\n
Security
\n
\n 2FA Enabled\n
\n
\n ` : ''}\n
\n
\n\n \n
\n

Danger Zone

\n

Irreversible and destructive actions

\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Permanently remove from database. Unchecked performs soft delete (deactivate only).

\n
\n
\n\n \n \n \n \n Delete User\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-user-confirm',\n title: 'Delete User',\n message: 'Are you sure you want to delete this user? Check the \"Hard Delete\" option to permanently remove all data from the database. This action cannot be undone!',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteUser()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Edit User',\n pageTitle: `Edit User - ${data.userToEdit.firstName} ${data.userToEdit.lastName}`,\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export interface ConfirmationDialogOptions {\n id: string\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmClass?: string\n iconColor?: 'red' | 'yellow' | 'blue'\n onConfirm?: string // JavaScript code to execute on confirm\n}\n\nexport function renderConfirmationDialog(options: ConfirmationDialogOptions): string {\n const {\n id,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmClass = 'bg-red-500 hover:bg-red-400',\n iconColor = 'red',\n onConfirm = ''\n } = options\n\n const iconColorClasses = {\n red: 'bg-red-500/10 text-red-400',\n yellow: 'bg-yellow-500/10 text-yellow-400',\n blue: 'bg-blue-500/10 text-blue-400'\n }\n\n return `\n \n \n \n\n
\n \n
\n
\n \n \n \n
\n
\n

${title}

\n
\n

${message}

\n
\n
\n
\n
\n \n ${confirmText}\n \n \n ${cancelText}\n \n
\n
\n
\n \n
\n `\n}\n\n/**\n * Helper function to show a confirmation dialog programmatically\n * Usage in templates: Add this script and call showConfirmDialog()\n */\nexport function getConfirmationDialogScript(): string {\n return `\n \n \n `\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserNewPageData {\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserNewPage(data: UserNewPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Create New User

\n
\n

Add a new user account to the system

\n
\n
\n \n \n \n \n Create User\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n\n
\n \n \n
\n
\n\n \n
\n

Password

\n
\n
\n \n \n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Mark email as verified

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

Creating a User

\n
\n

Fill in the required fields marked with * to create a new user account.

\n

The password must be at least 8 characters long.

\n

By default, new users are created as active and can sign in immediately.

\n

You can edit user details and permissions after creation.

\n
\n
\n\n \n
\n

Role Descriptions

\n
\n
\n
Administrator
\n
Full system access and permissions
\n
\n
\n
Editor
\n
Can create and edit content
\n
\n
\n
Author
\n
Can create own content
\n
\n
\n
Viewer
\n
Read-only access
\n
\n
\n
\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create User',\n pageTitle: 'Create New User',\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderAlert } from '../alert.template'\nimport { renderTable, TableColumn, TableData } from '../table.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface User {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n role: string\n avatar?: string\n isActive: boolean\n lastLoginAt?: number\n createdAt: number\n updatedAt: number\n formattedLastLogin?: string\n formattedCreatedAt?: string\n}\n\nexport interface UsersListPageData {\n users: User[]\n pagination?: PaginationData\n currentPage: number\n totalPages: number\n totalUsers: number\n statusFilter?: string\n roleFilter?: string\n searchFilter?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderUsersListPage(data: UsersListPageData): string {\n const columns: TableColumn[] = [\n {\n key: 'avatar',\n label: '',\n className: 'w-12',\n sortable: false,\n render: (value: string | null, row: User) => {\n const initials = `${row.firstName.charAt(0)}${row.lastName.charAt(0)}`.toUpperCase()\n if (value) {\n return `\"${row.firstName}`\n }\n return `\n
\n ${initials}\n
\n `\n }\n },\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, row: User) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n \n const truncatedFirstName = row.firstName.length > 25 ? row.firstName.substring(0, 25) + '...' : row.firstName\n const truncatedLastName = row.lastName.length > 25 ? row.lastName.substring(0, 25) + '...' : row.lastName\n const fullName = escapeHtml(`${truncatedFirstName} ${truncatedLastName}`)\n const truncatedUsername = row.username.length > 100 ? row.username.substring(0, 100) + '...' : row.username\n const username = escapeHtml(truncatedUsername)\n const statusBadge = row.isActive ?\n 'Active' :\n 'Inactive'\n return `\n
\n
${fullName}${statusBadge}
\n
@${username}
\n
\n `\n }\n },\n {\n key: 'email',\n label: 'Email',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n const escapedEmail = escapeHtml(value)\n return `${escapedEmail}`\n }\n },\n {\n key: 'role',\n label: 'Role',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const roleColors = {\n admin: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-700/10 dark:ring-red-500/20',\n editor: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-700/10 dark:ring-blue-500/20',\n author: 'bg-cyan-50 dark:bg-cyan-500/10 text-cyan-700 dark:text-cyan-400 ring-1 ring-inset ring-cyan-700/10 dark:ring-cyan-500/20',\n viewer: 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n }\n const colorClass = roleColors[value as keyof typeof roleColors] || 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n return `${value.charAt(0).toUpperCase() + value.slice(1)}`\n }\n },\n {\n key: 'lastLoginAt',\n label: 'Last Login',\n sortable: true,\n sortType: 'date',\n render: (value: number | null) => {\n if (!value) return 'Never'\n return `${new Date(value).toLocaleDateString()}`\n }\n },\n {\n key: 'createdAt',\n label: 'Created',\n sortable: true,\n sortType: 'date',\n render: (value: number) => `${new Date(value).toLocaleDateString()}`\n },\n {\n key: 'actions',\n label: 'Actions',\n className: 'text-right',\n sortable: false,\n render: (_value: any, row: User) => `\n
\n ${row.isActive ?\n `` :\n ``\n }\n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'users-table',\n columns,\n rows: data.users,\n selectable: false,\n rowClickable: true,\n rowClickUrl: (row: User) => `/admin/users/${row.id}/edit`,\n emptyMessage: 'No users found'\n }\n\n const pageContent = `\n
\n \n
\n
\n

User Management

\n

Manage user accounts and permissions

\n
\n
\n \n \n \n \n Add User\n \n \n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n

User Statistics

\n
\n
\n
Total Users
\n
\n
\n ${data.totalUsers}\n
\n
\n \n \n \n Increased by\n 5.2%\n
\n
\n
\n
\n
Active Users
\n
\n
\n ${data.users.filter(u => u.isActive).length}\n
\n
\n \n \n \n Increased by\n 3.1%\n
\n
\n
\n
\n
Administrators
\n
\n
\n ${data.users.filter(u => u.role === 'admin').length}\n
\n
\n \n \n \n Increased by\n 1.8%\n
\n
\n
\n
\n
Active This Week
\n
\n
\n ${data.users.filter(u => u.lastLoginAt && u.lastLoginAt > Date.now() - 7 * 24 * 60 * 60 * 1000).length}\n
\n
\n \n \n \n Decreased by\n 2.3%\n
\n
\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n
\n
\n \n
\n \n
\n {\n input.focus();\n input.setSelectionRange(len, len);\n }, 10);\n }\n \"\n >\n \n
\n \n \n \n
\n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n Clear Filters\n \n
\n
\n
\n
\n
\n
\n\n \n ${renderTable(tableData)}\n\n \n ${data.pagination ? renderPagination(data.pagination) : ''}\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'toggle-user-status-confirm',\n title: 'Toggle User Status',\n message: 'Are you sure you want to activate/deactivate this user?',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performToggleUserStatus()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Users',\n pageTitle: 'User Management',\n currentPath: '/admin/users',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n} ","import { Hono } from 'hono'\nimport { requireAuth, requireRole, logActivity, AuthManager } from '../middleware'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { renderProfilePage, renderAvatarImage, type UserProfile, type ProfilePageData } from '../templates/pages/admin-profile.template'\nimport { renderAlert } from '../templates/components/alert.template'\nimport { renderActivityLogsPage, type ActivityLogsPageData, type ActivityLog } from '../templates/pages/admin-activity-logs.template'\nimport { renderUserEditPage, type UserEditPageData, type UserEditData, type UserProfileData } from '../templates/pages/admin-user-edit.template'\nimport { renderUserNewPage, type UserNewPageData } from '../templates/pages/admin-user-new.template'\nimport { renderUsersListPage, type UsersListPageData, type User } from '../templates/pages/admin-users-list.template'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, renderCustomProfileSection, getCustomData, saveCustomData, extractCustomFieldsFromForm, sanitizeCustomData, validateCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst userRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware to all routes\nuserRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on user management routes\nuserRoutes.use('/users/*', requireRole(['admin']))\nuserRoutes.use('/users', requireRole(['admin']))\nuserRoutes.use('/invite-user', requireRole(['admin']))\nuserRoutes.use('/resend-invitation/*', requireRole(['admin']))\nuserRoutes.use('/cancel-invitation/*', requireRole(['admin']))\nuserRoutes.use('/activity-logs', requireRole(['admin']))\nuserRoutes.use('/activity-logs/*', requireRole(['admin']))\n\n// Redirect /admin to /admin/dashboard\nuserRoutes.get('/', (c) => {\n return c.redirect('/admin/dashboard')\n})\n\n// Timezone options for profile form\nconst TIMEZONES = [\n { value: 'UTC', label: 'UTC' },\n { value: 'America/New_York', label: 'Eastern Time' },\n { value: 'America/Chicago', label: 'Central Time' },\n { value: 'America/Denver', label: 'Mountain Time' },\n { value: 'America/Los_Angeles', label: 'Pacific Time' },\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Australia/Sydney', label: 'Sydney' }\n]\n\n// Language options for profile form\nconst LANGUAGES = [\n { value: 'en', label: 'English' },\n { value: 'es', label: 'Spanish' },\n { value: 'fr', label: 'French' },\n { value: 'de', label: 'German' },\n { value: 'it', label: 'Italian' },\n { value: 'pt', label: 'Portuguese' },\n { value: 'ja', label: 'Japanese' },\n { value: 'ko', label: 'Korean' },\n { value: 'zh', label: 'Chinese' }\n]\n\n// Role options for user form\nconst ROLES = [\n { value: 'admin', label: 'Administrator' },\n { value: 'editor', label: 'Editor' },\n { value: 'author', label: 'Author' },\n { value: 'viewer', label: 'Viewer' }\n]\n\n/**\n * GET /admin/profile - Show user profile page\n */\nuserRoutes.get('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n // Get user profile data\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n timezone, language, theme, email_notifications, two_factor_enabled,\n role, created_at, last_login_at\n FROM users \n WHERE id = ? AND is_active = 1\n `)\n \n const userProfile = await userStmt.bind(user!.userId).first() as any\n\n if (!userProfile) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Convert to UserProfile interface\n const profile: UserProfile = {\n id: userProfile.id,\n email: userProfile.email,\n username: userProfile.username || '',\n first_name: userProfile.first_name || '',\n last_name: userProfile.last_name || '',\n phone: userProfile.phone,\n bio: userProfile.bio,\n avatar_url: userProfile.avatar_url,\n timezone: userProfile.timezone || 'UTC',\n language: userProfile.language || 'en',\n theme: userProfile.theme || 'dark',\n email_notifications: Boolean(userProfile.email_notifications),\n two_factor_enabled: Boolean(userProfile.two_factor_enabled),\n role: userProfile.role,\n created_at: userProfile.created_at,\n last_login_at: userProfile.last_login_at\n }\n\n // Get custom profile data\n const customData = await getCustomData(db, user!.userId)\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n const pageData: ProfilePageData = {\n profile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n customProfileFieldsHtml,\n user: {\n name: `${profile.first_name} ${profile.last_name}`.trim() || profile.username || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n } catch (error) {\n console.error('Profile page error:', error)\n \n const pageData: ProfilePageData = {\n profile: {} as UserProfile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n error: 'Failed to load profile. Please try again.',\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n }\n})\n\n/**\n * PUT /admin/profile - Update user profile\n */\nuserRoutes.put('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const timezone = formData.get('timezone')?.toString() || 'UTC'\n const language = formData.get('language')?.toString() || 'en'\n const emailNotifications = formData.get('email_notifications') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please enter a valid email address.',\n dismissible: true \n }))\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users \n WHERE (username = ? OR email = ?) AND id != ? AND is_active = 1\n `)\n const existingUser = await checkStmt.bind(username, email, user!.userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Username or email is already taken by another user!.',\n dismissible: true \n }))\n }\n\n // Update user profile\n const updateStmt = db.prepare(`\n UPDATE users SET \n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, bio = ?, timezone = ?, language = ?,\n email_notifications = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, bio, timezone, language,\n emailNotifications ? 1 : 0, Date.now(),\n user!.userId\n ).run()\n\n // Save custom profile fields\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n await saveCustomData(db, user!.userId, sanitized)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.update', 'users', user!.userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'bio', 'timezone', 'language', 'email_notifications'] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success', \n message: 'Profile updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Profile update error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update profile. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/avatar - Upload user avatar\n */\nuserRoutes.post('/profile/avatar', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n const avatarFile = formData.get('avatar') as File | null\n\n if (!avatarFile || typeof avatarFile === 'string' || !avatarFile.name) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please select an image file.',\n dismissible: true\n }))\n }\n\n // Validate file type\n const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']\n if (!allowedTypes.includes(avatarFile.type)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please upload a valid image file (JPEG, PNG, GIF, or WebP).',\n dismissible: true \n }))\n }\n\n // Validate file size (5MB max)\n const maxSize = 5 * 1024 * 1024\n if (avatarFile.size > maxSize) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Image file must be smaller than 5MB.',\n dismissible: true \n }))\n }\n\n // For now, we'll simulate storing the avatar\n // In a real implementation, you'd upload to cloud storage (R2, S3, etc.)\n const avatarUrl = `/uploads/avatars/${user!.userId}-${Date.now()}.${avatarFile.type.split('/')[1]}`\n\n // Update user avatar URL in database\n const updateStmt = db.prepare(`\n UPDATE users SET avatar_url = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(avatarUrl, Date.now(), user!.userId).run()\n\n // Get updated user data to render the avatar\n const userStmt = db.prepare(`\n SELECT first_name, last_name FROM users WHERE id = ?\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.avatar_update', 'users', user!.userId,\n { avatar_url: avatarUrl },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return both the alert message and the updated avatar image using HTMX out-of-band swap\n const alertHtml = renderAlert({\n type: 'success',\n message: 'Profile picture updated successfully!',\n dismissible: true\n })\n\n // Add timestamp to avatar URL to bust cache\n const avatarUrlWithCache = `${avatarUrl}?t=${Date.now()}`\n const avatarImageHtml = renderAvatarImage(avatarUrlWithCache, userData.first_name, userData.last_name)\n\n // Use hx-swap-oob to update the avatar image container\n const avatarImageWithOob = avatarImageHtml.replace(\n 'id=\"avatar-image-container\"',\n 'id=\"avatar-image-container\" hx-swap-oob=\"true\"'\n )\n\n return c.html(alertHtml + avatarImageWithOob)\n\n } catch (error) {\n console.error('Avatar upload error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to upload profile picture. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/password - Change user password\n */\nuserRoutes.post('/profile/password', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n \n const currentPassword = formData.get('current_password')?.toString() || ''\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Validate input\n if (!currentPassword || !newPassword || !confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'All password fields are required.',\n dismissible: true \n }))\n }\n\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New passwords do not match.',\n dismissible: true \n }))\n }\n\n if (newPassword.length < 8) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New password must be at least 8 characters long.',\n dismissible: true \n }))\n }\n\n // Get current user data\n const userStmt = db.prepare(`\n SELECT password_hash FROM users WHERE id = ? AND is_active = 1\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n if (!userData) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'User not found.',\n dismissible: true \n }))\n }\n\n // Verify current password\n const validPassword = await AuthManager.verifyPassword(currentPassword, userData.password_hash)\n if (!validPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Current password is incorrect.',\n dismissible: true \n }))\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(newPassword)\n\n // Store old password in history\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user!.userId,\n userData.password_hash,\n Date.now()\n ).run()\n\n // Update user password\n const updateStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(newPasswordHash, Date.now(), user!.userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.password_change', 'users', user!.userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({ \n type: 'success', \n message: 'Password updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Password change error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update password. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * GET /admin/users - List all users\n * Returns HTML for browser requests and JSON for API requests\n * Note: Already protected by requireAuth() and requireRole(['admin', 'editor'])\n */\nuserRoutes.get('/users', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '20')\n const search = c.req.query('search') || ''\n const roleFilter = c.req.query('role') || ''\n const statusFilter = c.req.query('status') || 'active'\n const offset = (page - 1) * limit\n\n // Build search query\n let whereClause = ''\n let params: any[] = []\n\n // Handle status filter\n if (statusFilter === 'active') {\n whereClause = 'WHERE u.is_active = 1'\n } else if (statusFilter === 'inactive') {\n whereClause = 'WHERE u.is_active = 0'\n } else {\n // 'all' - no filter\n whereClause = 'WHERE 1=1'\n }\n\n if (search) {\n whereClause += ' AND (u.first_name LIKE ? OR u.last_name LIKE ? OR u.email LIKE ? OR u.username LIKE ?)'\n const searchParam = `%${search}%`\n params.push(searchParam, searchParam, searchParam, searchParam)\n }\n\n if (roleFilter) {\n whereClause += ' AND u.role = ?'\n params.push(roleFilter)\n }\n\n // Get users\n const usersStmt = db.prepare(`\n SELECT u.id, u.email, u.username, u.first_name, u.last_name,\n u.role, u.avatar_url, u.created_at, u.last_login_at, u.updated_at,\n u.email_verified, u.two_factor_enabled, u.is_active\n FROM users u\n ${whereClause}\n ORDER BY u.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: usersData } = await usersStmt.bind(...params, limit, offset).all()\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total FROM users u ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalUsers = countResult?.total || 0\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'users.list_view', 'users', undefined,\n { search, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Check if this is an API request (accept header contains 'application/json')\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n // Return JSON for API requests\n return c.json({\n users: usersData || [],\n pagination: {\n page,\n limit,\n total: totalUsers,\n pages: Math.ceil(totalUsers / limit)\n }\n })\n }\n\n // Return HTML for browser requests\n const users: User[] = (usersData || []).map((u: any) => ({\n id: u.id,\n email: u.email,\n username: u.username || '',\n firstName: u.first_name || '',\n lastName: u.last_name || '',\n role: u.role,\n avatar: u.avatar_url,\n isActive: Boolean(u.is_active),\n lastLoginAt: u.last_login_at,\n createdAt: u.created_at,\n updatedAt: u.updated_at,\n formattedLastLogin: u.last_login_at ? new Date(u.last_login_at).toLocaleDateString() : undefined,\n formattedCreatedAt: new Date(u.created_at).toLocaleDateString()\n }))\n\n const successMessage = c.req.query('success') || undefined\n\n const pageData: UsersListPageData = {\n users,\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalUsers,\n searchFilter: search,\n roleFilter,\n statusFilter,\n success: successMessage,\n pagination: {\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalItems: totalUsers,\n itemsPerPage: limit,\n startItem: offset + 1,\n endItem: Math.min(offset + limit, totalUsers),\n baseUrl: '/admin/users'\n },\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUsersListPage(pageData))\n\n } catch (error) {\n console.error('Users list error:', error)\n\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n return c.json({ error: 'Failed to load users' }, 500)\n }\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load users. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * GET /admin/users/new - Show new user creation page\n */\nuserRoutes.get('/users/new', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: UserNewPageData = {\n roles: ROLES,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserNewPage(pageData))\n } catch (error) {\n console.error('User new page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user creation page. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * POST /admin/users/new - Create new user\n */\nuserRoutes.post('/users/new', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const password = formData.get('password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email || !password) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, email, and password are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password\n if (password.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n\n if (password !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n\n // Check if username/email are already taken\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE username = ? OR email = ?\n `)\n const existingUser = await checkStmt.bind(username, email).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken.',\n dismissible: true\n }))\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Create user\n const userId = crypto.randomUUID()\n const createStmt = db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name, phone, bio,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createStmt.bind(\n userId, email, username, firstName, lastName, phone, bio,\n passwordHash, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.create', 'users', userId,\n { email, username, role },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Redirect to user list (use HX-Redirect for HTMX requests)\n c.header('HX-Redirect', '/admin/users?success=User created successfully')\n return c.body(null, 200)\n\n } catch (error) {\n console.error('User creation error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to create user!. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * GET /admin/users/:id - Get user by ID\n * Note: This endpoint returns users regardless of is_active status for admin purposes\n */\nuserRoutes.get('/users/:id', async (c) => {\n // Check if this is actually the edit route\n if (c.req.path.endsWith('/edit')) {\n return c.notFound()\n }\n\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (including inactive users for admin access)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userRecord = await userStmt.bind(userId).first() as any\n\n if (!userRecord) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.view', 'users', userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n user: {\n id: userRecord.id,\n email: userRecord.email,\n username: userRecord.username,\n first_name: userRecord.first_name,\n last_name: userRecord.last_name,\n phone: userRecord.phone,\n bio: userRecord.bio,\n avatar_url: userRecord.avatar_url,\n role: userRecord.role,\n is_active: userRecord.is_active,\n email_verified: userRecord.email_verified,\n two_factor_enabled: userRecord.two_factor_enabled,\n created_at: userRecord.created_at,\n last_login_at: userRecord.last_login_at\n }\n })\n\n } catch (error) {\n console.error('User fetch error:', error)\n return c.json({ error: 'Failed to fetch user' }, 500)\n }\n})\n\n/**\n * GET /admin/users/:id/edit - Show user edit page\n */\nuserRoutes.get('/users/:id/edit', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (removed bio - now in profile)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userToEdit = await userStmt.bind(userId).first() as any\n\n if (!userToEdit) {\n return c.html(renderAlert({\n type: 'error',\n message: 'User not found',\n dismissible: true\n }), 404)\n }\n\n // Get user profile data\n const profileStmt = db.prepare(`\n SELECT display_name, bio, company, job_title, website, location, date_of_birth, data\n FROM user_profiles\n WHERE user_id = ?\n `)\n const profileData = await profileStmt.bind(userId).first() as any\n\n // Convert profile to UserProfileData interface\n const profile: UserProfileData | undefined = profileData ? {\n displayName: profileData.display_name,\n bio: profileData.bio,\n company: profileData.company,\n jobTitle: profileData.job_title,\n website: profileData.website,\n location: profileData.location,\n dateOfBirth: profileData.date_of_birth\n } : undefined\n\n // Parse custom profile data\n let customData: Record = {}\n if (profileData?.data) {\n try { customData = JSON.parse(profileData.data) } catch {}\n }\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n // Convert to UserEditData interface\n const editData: UserEditData = {\n id: userToEdit.id,\n email: userToEdit.email,\n username: userToEdit.username || '',\n firstName: userToEdit.first_name || '',\n lastName: userToEdit.last_name || '',\n phone: userToEdit.phone,\n avatarUrl: userToEdit.avatar_url,\n role: userToEdit.role,\n isActive: Boolean(userToEdit.is_active),\n emailVerified: Boolean(userToEdit.email_verified),\n twoFactorEnabled: Boolean(userToEdit.two_factor_enabled),\n createdAt: userToEdit.created_at,\n lastLoginAt: userToEdit.last_login_at,\n profile\n }\n\n const pageData: UserEditPageData = {\n userToEdit: editData,\n roles: ROLES,\n customProfileFieldsHtml,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserEditPage(pageData))\n } catch (error) {\n console.error('User edit page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * PUT /admin/users/:id - Update user\n */\nuserRoutes.put('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Optional password change\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Extract profile fields\n const profileDisplayName = sanitizeInput(formData.get('profile_display_name')?.toString()) || null\n const profileBio = sanitizeInput(formData.get('profile_bio')?.toString()) || null\n const profileCompany = sanitizeInput(formData.get('profile_company')?.toString()) || null\n const profileJobTitle = sanitizeInput(formData.get('profile_job_title')?.toString()) || null\n const profileWebsite = formData.get('profile_website')?.toString()?.trim() || null\n const profileLocation = sanitizeInput(formData.get('profile_location')?.toString()) || null\n const profileDateOfBirthStr = formData.get('profile_date_of_birth')?.toString()?.trim() || null\n const profileDateOfBirth = profileDateOfBirthStr ? new Date(profileDateOfBirthStr).getTime() : null\n\n // Extract custom profile fields\n const profileConfig = getUserProfileConfig()\n let customDataJson: string | null = null\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n // Merge with existing custom data\n const existingCustom = await getCustomData(db, userId)\n const merged = { ...existingCustom, ...sanitized }\n customDataJson = JSON.stringify(merged)\n }\n\n // Validate required fields\n if (!username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password if provided\n if (newPassword) {\n if (newPassword.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n }\n\n // Validate website URL if provided\n if (profileWebsite) {\n try {\n new URL(profileWebsite)\n } catch {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid website URL.',\n dismissible: true\n }))\n }\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE (username = ? OR email = ?) AND id != ?\n `)\n const existingUser = await checkStmt.bind(username, email, userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken by another user.',\n dismissible: true\n }))\n }\n\n // Update user (removed bio - now in profile)\n const updateStmt = db.prepare(`\n UPDATE users SET\n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, role = ?, is_active = ?, email_verified = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), userId\n ).run()\n\n // Update password if provided\n if (newPassword) {\n const passwordHash = await AuthManager.hashPassword(newPassword)\n const updatePasswordStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?\n `)\n await updatePasswordStmt.bind(passwordHash, Date.now(), userId).run()\n }\n\n // Check if any profile field has data\n const hasProfileData = profileDisplayName || profileBio || profileCompany ||\n profileJobTitle || profileWebsite || profileLocation || profileDateOfBirth\n\n if (hasProfileData || customDataJson !== null) {\n const now = Date.now()\n\n // Check if profile exists\n const profileCheckStmt = db.prepare(`SELECT id FROM user_profiles WHERE user_id = ?`)\n const existingProfile = await profileCheckStmt.bind(userId).first() as any\n\n if (existingProfile) {\n // Update existing profile\n const updateProfileStmt = db.prepare(`\n UPDATE user_profiles SET\n display_name = ?, bio = ?, company = ?, job_title = ?,\n website = ?, location = ?, date_of_birth = ?, updated_at = ?\n ${customDataJson !== null ? ', data = ?' : ''}\n WHERE user_id = ?\n `)\n const updateBindings = [\n profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, now,\n ...(customDataJson !== null ? [customDataJson] : []),\n userId\n ]\n await updateProfileStmt.bind(...updateBindings).run()\n } else {\n // Create new profile\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const insertProfileStmt = db.prepare(`\n INSERT INTO user_profiles (id, user_id, display_name, bio, company, job_title, website, location, date_of_birth, data, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n await insertProfileStmt.bind(\n profileId, userId, profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, customDataJson || '{}', now, now\n ).run()\n }\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user.update', 'users', userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'role', 'is_active', 'email_verified', 'profile', ...(newPassword ? ['password'] : [])] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success',\n message: 'User updated successfully!',\n dismissible: true\n }))\n\n } catch (error) {\n console.error('User update error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to update user. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * POST /admin/users/:id/toggle - Toggle user active status\n */\nuserRoutes.post('/users/:id/toggle', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const body = await c.req.json().catch(() => ({ active: true }))\n const active = body.active === true\n\n // Prevent self-deactivation\n if (userId === user!.userId && !active) {\n return c.json({ error: 'You cannot deactivate your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToToggle = await userStmt.bind(userId).first() as any\n\n if (!userToToggle) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Toggle user status\n const toggleStmt = db.prepare(`\n UPDATE users SET is_active = ?, updated_at = ? WHERE id = ?\n `)\n await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, active ? 'user.activate' : 'user.deactivate', 'users', userId,\n { email: userToToggle.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: active ? 'User activated successfully' : 'User deactivated successfully'\n })\n\n } catch (error) {\n console.error('User toggle error:', error)\n return c.json({ error: 'Failed to toggle user status' }, 500)\n }\n})\n\n/**\n * DELETE /admin/users/:id - Delete user\n */\nuserRoutes.delete('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get request body to check for hard delete option\n const body = await c.req.json().catch(() => ({ hardDelete: false }))\n const hardDelete = body.hardDelete === true\n\n // Prevent self-deletion\n if (userId === user!.userId) {\n return c.json({ error: 'You cannot delete your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToDelete = await userStmt.bind(userId).first() as any\n\n if (!userToDelete) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n if (hardDelete) {\n // Hard delete - permanently remove from database\n const deleteStmt = db.prepare(`\n DELETE FROM users WHERE id = ?\n `)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.hard_delete', 'users', userId,\n { email: userToDelete.email, permanent: true },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User permanently deleted'\n })\n } else {\n // Soft delete - deactivate by setting is_active = 0\n const deleteStmt = db.prepare(`\n UPDATE users SET is_active = 0, updated_at = ? WHERE id = ?\n `)\n await deleteStmt.bind(Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.soft_delete', 'users', userId,\n { email: userToDelete.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User deactivated successfully'\n })\n }\n\n } catch (error) {\n console.error('User deletion error:', error)\n return c.json({ error: 'Failed to delete user' }, 500)\n }\n})\n\n/**\n * POST /admin/invite-user - Invite a new user\n */\nuserRoutes.post('/invite-user', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const role = formData.get('role')?.toString()?.trim() || 'viewer'\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n\n // Validate input\n if (!email || !firstName || !lastName) {\n return c.json({ error: 'Email, first name, and last name are required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n // Check if user already exists\n const existingUserStmt = db.prepare(`\n SELECT id FROM users WHERE email = ?\n `)\n const existingUser = await existingUserStmt.bind(email).first()\n\n if (existingUser) {\n return c.json({ error: 'A user with this email already exists' }, 400)\n }\n\n // Generate invitation token\n const invitationToken = crypto.randomUUID()\n // const invitationExpires = Date.now() + (7 * 24 * 60 * 60 * 1000) // 7 days\n\n // Create user record with invitation\n const userId = crypto.randomUUID()\n const createUserStmt = db.prepare(`\n INSERT INTO users (\n id, email, first_name, last_name, role, \n invitation_token, invited_by, invited_at,\n is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createUserStmt.bind(\n userId, email, firstName, lastName, role,\n invitationToken, user!.userId, Date.now(),\n 0, 0, Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invite_sent', 'users', userId,\n { email, role, invited_user_id: userId },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // In a real implementation, you would send an email here\n // For now, we'll return the invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${invitationToken}`\n\n return c.json({\n success: true,\n message: 'User invitation sent successfully',\n user: {\n id: userId,\n email,\n first_name: firstName,\n last_name: lastName,\n role\n },\n invitation_link: invitationLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('User invitation error:', error)\n return c.json({ error: 'Failed to send user invitation' }, 500)\n }\n})\n\n/**\n * POST /admin/resend-invitation/:id - Resend invitation\n */\nuserRoutes.post('/resend-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invitation_token\n FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Generate new invitation token\n const newInvitationToken = crypto.randomUUID()\n\n // Update invitation token and date\n const updateStmt = db.prepare(`\n UPDATE users SET \n invitation_token = ?, \n invited_at = ?, \n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newInvitationToken,\n Date.now(),\n Date.now(),\n userId\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_resent', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Generate new invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${newInvitationToken}`\n\n return c.json({\n success: true,\n message: 'Invitation resent successfully',\n invitation_link: invitationLink\n })\n\n } catch (error) {\n console.error('Resend invitation error:', error)\n return c.json({ error: 'Failed to resend invitation' }, 500)\n }\n})\n\n/**\n * DELETE /admin/cancel-invitation/:id - Cancel invitation\n */\nuserRoutes.delete('/cancel-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Delete the user record (since they haven't activated yet)\n const deleteStmt = db.prepare(`DELETE FROM users WHERE id = ?`)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_cancelled', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'Invitation cancelled successfully'\n })\n\n } catch (error) {\n console.error('Cancel invitation error:', error)\n return c.json({ error: 'Failed to cancel invitation' }, 500)\n }\n})\n\n/**\n * GET /admin/activity-logs - View activity logs\n */\nuserRoutes.get('/activity-logs', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination and filter parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '50')\n const offset = (page - 1) * limit\n\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get activity logs with user information\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: logs } = await logsStmt.bind(...params, limit, offset).all()\n\n // Get total count for pagination\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total \n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalLogs = countResult?.total || 0\n\n // Parse details JSON for each log\n const formattedLogs: ActivityLog[] = (logs || []).map((log: any) => ({\n ...log,\n details: log.details ? JSON.parse(log.details) : null\n }))\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'activity.logs_viewed', undefined, undefined,\n { filters, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n const pageData: ActivityLogsPageData = {\n logs: formattedLogs,\n pagination: {\n page,\n limit,\n total: totalLogs,\n pages: Math.ceil(totalLogs / limit)\n },\n filters,\n user: {\n name: user!.email.split('@')[0] || user!.email, // Use email username as fallback\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n\n } catch (error) {\n console.error('Activity logs error:', error)\n \n const pageData: ActivityLogsPageData = {\n logs: [],\n pagination: { page: 1, limit: 50, total: 0, pages: 0 },\n filters: {},\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n }\n})\n\n/**\n * GET /admin/activity-logs/export - Export activity logs to CSV\n */\nuserRoutes.get('/activity-logs/export', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get filter parameters (same as list view)\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get all matching activity logs (limit to 10,000 for performance)\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT 10000\n `)\n\n const { results: logs } = await logsStmt.bind(...params).all()\n\n // Generate CSV content\n const csvHeaders = ['Timestamp', 'User', 'Email', 'Action', 'Resource Type', 'Resource ID', 'IP Address', 'Details']\n const csvRows = [csvHeaders.join(',')]\n\n for (const log of (logs || [])) {\n const row = [\n `\"${new Date((log as any).created_at).toISOString()}\"`,\n `\"${(log as any).user_name || 'Unknown'}\"`,\n `\"${(log as any).user_email || 'N/A'}\"`,\n `\"${(log as any).action}\"`,\n `\"${(log as any).resource_type || 'N/A'}\"`,\n `\"${(log as any).resource_id || 'N/A'}\"`,\n `\"${(log as any).ip_address || 'N/A'}\"`,\n `\"${(log as any).details ? JSON.stringify(JSON.parse((log as any).details)) : 'N/A'}\"`\n ]\n csvRows.push(row.join(','))\n }\n\n const csvContent = csvRows.join('\\n')\n\n // Log the export activity\n await logActivity(\n db, user!.userId, 'activity.logs_exported', undefined, undefined,\n { filters, count: logs?.length || 0 },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return CSV file\n const filename = `activity-logs-${new Date().toISOString().split('T')[0]}.csv`\n \n return new Response(csvContent, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"${filename}\"`\n }\n })\n\n } catch (error) {\n console.error('Activity logs export error:', error)\n return c.json({ error: 'Failed to export activity logs' }, 500)\n }\n})\n\nexport { userRoutes }","export interface MediaFile {\n id: string;\n filename: string;\n original_name: string;\n mime_type: string;\n size: number;\n public_url: string;\n thumbnail_url?: string;\n alt?: string;\n caption?: string;\n tags: string[];\n uploaded_at: string;\n fileSize: string;\n uploadedAt: string;\n isImage: boolean;\n isVideo: boolean;\n isDocument: boolean;\n}\n\nexport interface MediaGridData {\n files: MediaFile[];\n viewMode?: \"grid\" | \"list\";\n selectable?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function renderMediaGrid(data: MediaGridData): string {\n if (data.files.length === 0) {\n return `\n
\n \n \n \n

No media files

\n

${\n data.emptyMessage || \"Get started by uploading your first file.\"\n }

\n
\n `;\n }\n\n const gridClass = data.viewMode === \"list\" ? \"space-y-4\" : \"media-grid\";\n\n return `\n
\n ${data.files\n .map((file) =>\n renderMediaFileCard(file, data.viewMode, data.selectable)\n )\n .join(\"\")}\n
\n `;\n}\n\nexport function renderMediaFileCard(\n file: MediaFile,\n viewMode: \"grid\" | \"list\" = \"grid\",\n selectable: boolean = false\n): string {\n if (viewMode === \"list\") {\n return `\n
\n
\n ${\n selectable\n ? `\n
\n
\n \n \n \n \n \n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n
\n\n
\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n \n \n \n \n \n
\n
\n
\n ${file.uploadedAt}\n ${\n file.tags.length > 0\n ? `\n \n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n
\n
\n `;\n }\n\n // Grid view\n return `\n
\n ${\n selectable\n ? `\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n ${\n file.uploadedAt\n }\n
\n ${\n file.tags.length > 0\n ? `\n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n `;\n}\n\nfunction getFileIcon(mimeType: string): string {\n if (mimeType.startsWith(\"image/\")) {\n return `\n \n \n \n `;\n } else if (mimeType.startsWith(\"video/\")) {\n return `\n \n \n \n `;\n } else if (mimeType === \"application/pdf\") {\n return `\n \n \n \n `;\n } else {\n return `\n \n \n \n `;\n }\n}\n","import {\n getConfirmationDialogScript,\n renderConfirmationDialog,\n} from \"../components/confirmation-dialog.template\";\nimport { MediaFile, renderMediaGrid } from \"../components/media-grid.template\";\nimport {\n AdminLayoutCatalystData,\n renderAdminLayoutCatalyst,\n} from \"../layouts/admin-layout-catalyst.template\";\n\nexport interface FolderStats {\n folder: string;\n count: number;\n totalSize: number;\n}\n\nexport interface TypeStats {\n type: string;\n count: number;\n}\n\nexport interface MediaLibraryPageData {\n files: MediaFile[];\n folders: FolderStats[];\n types: TypeStats[];\n currentFolder: string;\n currentType: string;\n currentView: \"grid\" | \"list\";\n currentPage: number;\n totalFiles: number;\n hasNextPage: boolean;\n user?: {\n name: string;\n email: string;\n role: string;\n };\n version?: string;\n}\n\nexport function renderMediaLibraryPage(data: MediaLibraryPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Media Library

\n

Manage your media files and assets

\n
\n
\n \n \n \n \n Upload Media\n \n
\n
\n \n
\n \n
\n
\n \n
\n \n Upload Files\n \n
\n\n \n
\n

Folders

\n \n
\n\n \n
\n

File Types

\n \n
\n\n \n
\n

Quick Actions

\n
\n \n Create Folder\n \n \n Cleanup Unused\n \n
\n
\n
\n
\n \n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n ${\n data.files.length\n } files\n \n Select All\n \n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Move to Folder\n \n
\n
\n \n \n \n \n Delete Selected Files\n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n ${renderMediaGrid({\n files: data.files,\n viewMode: data.currentView,\n selectable: true,\n emptyMessage:\n \"No media files found. Upload your first file to get started.\",\n })}\n
\n \n \n ${\n data.hasNextPage\n ? `\n
\n
\n ${\n data.currentPage > 1\n ? `\n \n Previous\n \n `\n : \"\"\n }\n Page ${\n data.currentPage\n }\n \n Next\n \n
\n
\n `\n : \"\"\n }\n
\n
\n \n \n \n
\n
\n
\n

Upload Files

\n \n
\n \n \n { window.location.href = '/admin/media?t=' + Date.now(); }, 1500); }\"\n class=\"space-y-4\"\n >\n \n \n \n \n \n
\n

Drop files here or click to upload

\n

PNG, JPG, GIF, PDF up to 10MB

\n
\n
\n \n \n \n \n
\n \n \n
\n\n \n
\n

Selected Files:

\n
\n
\n\n \n
\n \n Cancel\n \n \n Upload Files\n \n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n
\n
\n\n \n
\n
\n
\n

Move to Folder

\n \n
\n\n

\n Select a folder to move 0 selected file(s) to:\n

\n\n
\n ${\n data.folders.length > 0\n ? data.folders\n .map(\n (folder) => `\n \n
\n ${folder.folder}\n ${folder.count} files\n
\n \n `\n )\n .join(\"\")\n : '

No folders available

'\n }\n
\n\n
\n \n Cancel\n \n
\n
\n
\n\n \n
\n
\n
\n

Create New Folder

\n \n
\n\n
\n
\n \n \n

\n Use lowercase letters, numbers, hyphens, and underscores only\n

\n
\n\n
\n \n Cancel\n \n \n Create Folder\n \n
\n
\n
\n
\n\n \n \n \n\n \n ${renderConfirmationDialog({\n id: \"media-bulk-delete-confirm\",\n title: \"Delete Selected Files\",\n message: `Are you sure you want to delete ${\n data.files.length > 0 ? \"the selected files\" : \"these files\"\n }? This action cannot be undone and the files will be permanently removed.`,\n confirmText: \"Delete Files\",\n cancelText: \"Cancel\",\n confirmClass: \"bg-red-500 hover:bg-red-400\",\n iconColor: \"red\",\n onConfirm: \"performBulkDelete()\",\n })}\n\n \n ${getConfirmationDialogScript()}\n `;\n\n function buildPageUrl(page: number, folder: string, type: string): string {\n const params = new URLSearchParams();\n params.set(\"page\", page.toString());\n if (folder !== \"all\") params.set(\"folder\", folder);\n if (type !== \"all\") params.set(\"type\", type);\n return `/admin/media?${params.toString()}`;\n }\n\n const layoutData: AdminLayoutCatalystData = {\n title: \"Media Library\",\n pageTitle: \"Media Library\",\n currentPath: \"/admin/media\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayoutCatalyst(layoutData);\n}\n","import { MediaFile } from './media-grid.template'\n\nexport interface MediaFileDetailsData {\n file: MediaFile & {\n width?: number\n height?: number\n folder: string\n uploadedAt: string\n }\n}\n\nexport function renderMediaFileDetails(data: MediaFileDetailsData): string {\n const { file } = data\n \n return `\n
\n

File Details

\n \n
\n \n
\n \n
\n
\n ${file.isImage ? `\n \"${file.alt\n ` : file.isVideo ? `\n \n ` : `\n
\n \n \n \n
\n `}\n
\n\n
\n \n Copy URL\n \n \n Open Original\n \n
\n
\n \n \n
\n
\n \n

${file.original_name}

\n
\n\n
\n
\n \n

${file.fileSize}

\n
\n
\n \n

${file.mime_type}

\n
\n
\n\n ${file.width && file.height ? `\n
\n
\n \n

${file.width}px

\n
\n
\n \n

${file.height}px

\n
\n
\n ` : ''}\n\n
\n \n

${file.folder}

\n
\n\n
\n \n

${file.uploadedAt}

\n
\n\n \n
\n
\n \n \n
\n\n
\n \n ${file.caption || ''}\n
\n\n
\n \n \n
\n\n
\n \n Save Changes\n \n \n Delete File\n \n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\nimport { html, raw } from 'hono/html'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth, requireRole } from '../middleware'\nimport { renderMediaLibraryPage, MediaLibraryPageData, FolderStats, TypeStats } from '../templates/pages/admin-media-library.template'\nimport { renderMediaFileDetails, MediaFileDetailsData } from '../templates/components/media-file-details.template'\nimport { MediaFile, renderMediaFileCard } from '../templates/components/media-grid.template'\nimport type { Bindings, Variables } from '../app'\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nconst adminMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminMediaRoutes.use('*', requireAuth())\n\n// Media library main page\nadminMediaRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { searchParams } = new URL(c.req.url)\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const view = searchParams.get('view') || 'grid'\n const page = parseInt(searchParams.get('page') || '1')\n const _cacheBust = searchParams.get('t') // Cache-busting parameter\n const limit = 24\n const offset = (page - 1) * limit\n\n const db = c.env.DB\n\n // TODO: Cache implementation removed during migration - will be added back when cache plugin is migrated\n\n // Build query for media files\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = ['deleted_at IS NULL']\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT ${limit} OFFSET ${offset}`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n // Get folder statistics\n const foldersStmt = db.prepare(`\n SELECT folder, COUNT(*) as count, SUM(size) as totalSize\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY folder\n ORDER BY folder\n `)\n const { results: folders } = await foldersStmt.all()\n \n // Get type statistics\n const typesStmt = db.prepare(`\n SELECT\n CASE\n WHEN mime_type LIKE 'image/%' THEN 'images'\n WHEN mime_type LIKE 'video/%' THEN 'videos'\n WHEN mime_type IN ('application/pdf', 'text/plain') THEN 'documents'\n ELSE 'other'\n END as type,\n COUNT(*) as count\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY type\n `)\n const { results: types } = await typesStmt.all()\n \n // Process media files with local serving URLs\n const mediaFiles: MediaFile[] = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n caption: row.caption,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const pageData: MediaLibraryPageData = {\n files: mediaFiles,\n folders: folders.map((f: any) => ({\n folder: f.folder,\n count: f.count,\n totalSize: f.totalSize\n })) as FolderStats[],\n types: types.map((t: any) => ({\n type: t.type,\n count: t.count\n })) as TypeStats[],\n currentFolder: folder,\n currentType: type,\n currentView: view as 'grid' | 'list',\n currentPage: page,\n totalFiles: results.length,\n hasNextPage: results.length === limit,\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: c.get('appVersion')\n }\n\n // TODO: Cache implementation removed during migration\n\n return c.html(renderMediaLibraryPage(pageData))\n } catch (error) {\n console.error('Error loading media library:', error)\n return c.html(html`

Error loading media library

`)\n }\n})\n\n// Media selector endpoint (HTMX endpoint for content form media selection)\nadminMediaRoutes.get('/selector', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const db = c.env.DB\n\n // Build search query\n let query = 'SELECT * FROM media WHERE deleted_at IS NULL'\n const params: any[] = []\n\n if (search.trim()) {\n query += ' AND (filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n query += ' ORDER BY uploaded_at DESC LIMIT 24'\n\n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n // Render media selector grid\n return c.html(html`\n
\n \n
\n\n
\n ${raw(mediaFiles.map(file => `\n \n
\n ${file.isImage ? `\n \n ` : file.isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n\n
\n \n Select\n \n
\n
\n\n
\n

\n ${file.original_name}\n

\n

\n ${file.fileSize}\n

\n
\n
\n `).join(''))}\n \n\n ${mediaFiles.length === 0 ? html`\n
\n \n \n \n

No media files found

\n
\n ` : ''}\n `)\n } catch (error) {\n console.error('Error loading media selector:', error)\n return c.html(html`
Error loading media files
`)\n }\n})\n\n// Search media files (HTMX endpoint)\nadminMediaRoutes.get('/search', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const db = c.env.DB\n \n // Build search query\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = []\n \n if (search.trim()) {\n conditions.push('(filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)')\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT 24`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n const mediaFiles = results.map((row: any) => ({\n ...row,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n fileSize: formatFileSize(row.size),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const gridHTML = mediaFiles.map(file => generateMediaItemHTML(file)).join('')\n \n return c.html(raw(gridHTML))\n } catch (error) {\n console.error('Error searching media:', error)\n return c.html('
Error searching files
')\n }\n})\n\n// Get file details modal (HTMX endpoint)\nadminMediaRoutes.get('/:id/details', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n \n const stmt = db.prepare('SELECT * FROM media WHERE id = ?')\n const result = await stmt.bind(id).first() as any\n \n if (!result) {\n return c.html('
File not found
')\n }\n \n const file: MediaFile & { width?: number; height?: number; folder: string; uploadedAt: string } = {\n id: result.id,\n filename: result.filename,\n original_name: result.original_name,\n mime_type: result.mime_type,\n size: result.size,\n public_url: `/files/${result.r2_key}`,\n thumbnail_url: result.mime_type.startsWith('image/') ? `/files/${result.r2_key}` : undefined,\n alt: result.alt,\n caption: result.caption,\n tags: result.tags ? JSON.parse(result.tags) : [],\n uploaded_at: result.uploaded_at,\n fileSize: formatFileSize(result.size),\n uploadedAt: new Date(result.uploaded_at).toLocaleString(),\n isImage: result.mime_type.startsWith('image/'),\n isVideo: result.mime_type.startsWith('video/'),\n isDocument: !result.mime_type.startsWith('image/') && !result.mime_type.startsWith('video/'),\n width: result.width,\n height: result.height,\n folder: result.folder\n }\n \n const detailsData: MediaFileDetailsData = { file }\n \n return c.html(renderMediaFileDetails(detailsData))\n } catch (error) {\n console.error('Error fetching file details:', error)\n return c.html('
Error loading file details
')\n }\n})\n\n// Upload files endpoint (HTMX compatible)\nadminMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const fileEntries = formData.getAll('files') as unknown[]\n const files: File[] = []\n\n for (const entry of fileEntries) {\n if (entry instanceof File) {\n files.push(entry)\n }\n }\n \n if (!files || files.length === 0) {\n return c.html(html`\n
\n No files provided\n
\n `)\n }\n\n const uploadResults = []\n const errors = []\n\n // Check if MEDIA_BUCKET is available\n console.log('[MEDIA UPLOAD] c.env keys:', Object.keys(c.env))\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET defined?', !!c.env.MEDIA_BUCKET)\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET type:', typeof c.env.MEDIA_BUCKET)\n\n if (!c.env.MEDIA_BUCKET) {\n console.error('[MEDIA UPLOAD] MEDIA_BUCKET is not available! Available env keys:', Object.keys(c.env))\n return c.html(html`\n
\n Media storage (R2) is not configured. Please check your wrangler.toml configuration.\n
Debug: Available bindings: ${Object.keys(c.env).join(', ')}\n
\n `)\n }\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: validation.error.issues[0]?.message || 'Validation failed'\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = crypto.randomUUID()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user!.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n\n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate URLs - use public serving route\n const publicUrl = `/files/${r2Key}`\n const thumbnailUrl = file.type.startsWith('image/') ? publicUrl : null\n\n // Save to database\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n fileId,\n filename,\n file.name,\n file.type,\n file.size,\n width,\n height,\n folder,\n r2Key,\n publicUrl,\n thumbnailUrl,\n user!.userId,\n Math.floor(Date.now() / 1000)\n ).run()\n\n uploadResults.push({\n id: fileId,\n filename: filename,\n originalName: file.name,\n mimeType: file.type,\n size: file.size,\n publicUrl: publicUrl\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed: ' + (error instanceof Error ? error.message : 'Unknown error')\n })\n }\n }\n\n // TODO: Cache invalidation removed during migration\n\n // Fetch updated media list to include in response\n let mediaGridHTML = ''\n if (uploadResults.length > 0) {\n try {\n const folderEntry = formData.get('folder')\n const folder = typeof folderEntry === 'string' ? folderEntry : 'uploads'\n const query = 'SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT 24'\n const stmt = c.env.DB.prepare(query)\n const { results } = await stmt.all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n mediaGridHTML = mediaFiles.map(file => renderMediaFileCard(file, 'grid', true)).join('')\n } catch (error) {\n console.error('Error fetching updated media list:', error)\n }\n }\n\n // Return HTMX response with results\n return c.html(html`\n ${uploadResults.length > 0 ? html`\n
\n Successfully uploaded ${uploadResults.length} file${uploadResults.length > 1 ? 's' : ''}\n
\n ` : ''}\n\n ${errors.length > 0 ? html`\n
\n

Upload errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n ${uploadResults.length > 0 ? html`\n \n ` : ''}\n `)\n } catch (error) {\n console.error('Upload error:', error)\n return c.html(html`\n
\n Upload failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Serve files from R2 storage\nadminMediaRoutes.get('/file/*', async (c) => {\n try {\n const r2Key = c.req.path.replace('/admin/media/file/', '')\n \n if (!r2Key) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(r2Key)\n \n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n \n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n})\n\n// Update media file metadata (HTMX compatible)\nadminMediaRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n const formData = await c.req.formData()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Extract form data\n const alt = formData.get('alt') as string || null\n const caption = formData.get('caption') as string || null\n const tagsString = formData.get('tags') as string || ''\n const tags = tagsString ? tagsString.split(',').map(tag => tag.trim()).filter(tag => tag) : []\n\n // Update database\n const updateStmt = c.env.DB.prepare(`\n UPDATE media \n SET alt = ?, caption = ?, tags = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n alt,\n caption,\n JSON.stringify(tags),\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n // TODO: Cache invalidation removed during migration\n\n return c.html(html`\n
\n File updated successfully\n
\n \n `)\n } catch (error) {\n console.error('Update error:', error)\n return c.html(html`\n
\n Update failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Cleanup unused media files (HTMX compatible)\nadminMediaRoutes.delete('/cleanup', requireRole('admin'), async (c) => {\n try {\n const db = c.env.DB\n\n // Find all media files\n const allMediaStmt = db.prepare('SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL')\n const { results: allMedia } = await allMediaStmt.all<{ id: string; r2_key: string; filename: string }>()\n\n // Find media files referenced in content\n // Content can reference media in various JSON fields like data, hero_image, etc.\n const contentStmt = db.prepare('SELECT data FROM content')\n const { results: contentRecords } = await contentStmt.all<{ data: unknown }>()\n\n // Extract all media URLs from content\n const referencedUrls = new Set()\n for (const record of contentRecords || []) {\n if (record.data) {\n const dataStr = typeof record.data === 'string' ? record.data : JSON.stringify(record.data)\n // Find all /files/ URLs in the content\n const urlMatches = dataStr.matchAll(/\\/files\\/([^\\s\"',]+)/g)\n for (const match of urlMatches) {\n referencedUrls.add(match[1]!)\n }\n }\n }\n\n // Find unreferenced media files\n const mediaRows = allMedia || []\n const unusedFiles = mediaRows.filter((file) => !referencedUrls.has(file.r2_key))\n\n if (unusedFiles.length === 0) {\n return c.html(html`\n
\n No unused media files found. All files are referenced in content.\n
\n \n `)\n }\n\n // Delete unused files from R2 and database\n let deletedCount = 0\n const errors = []\n\n for (const file of unusedFiles) {\n try {\n // Delete from R2\n await c.env.MEDIA_BUCKET.delete(file.r2_key)\n\n // Soft delete in database\n const deleteStmt = db.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), file.id).run()\n\n deletedCount++\n } catch (error) {\n console.error(`Failed to delete ${file.filename}:`, error)\n errors.push({\n filename: file.filename,\n error: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Return success response\n return c.html(html`\n
\n Successfully cleaned up ${deletedCount} unused media file${deletedCount !== 1 ? 's' : ''}.\n ${errors.length > 0 ? html`\n
Failed to delete ${errors.length} file${errors.length !== 1 ? 's' : ''}.\n ` : ''}\n
\n\n ${errors.length > 0 ? html`\n
\n

Cleanup errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n \n `)\n } catch (error) {\n console.error('Cleanup error:', error)\n return c.html(html`\n
\n Cleanup failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Delete media file (HTMX compatible)\nadminMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // TODO: Cache invalidation removed during migration\n\n // Return HTMX response that redirects to media library\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Delete error:', error)\n return c.html(html`\n
\n Delete failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length - 8) {\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n const segmentLength = (uint8Array[i + 2]! << 8) | uint8Array[i + 3]!\n i += 2 + segmentLength\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\n// Helper function to generate media item HTML\nfunction generateMediaItemHTML(file: any): string {\n const isImage = file.isImage\n const isVideo = file.isVideo\n \n return `\n
\n
\n ${isImage ? `\n \"${file.alt\n ` : isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n \n
\n
\n \n \n
\n
\n
\n \n
\n

\n ${file.original_name}\n

\n
\n ${file.fileSize}\n ${file.uploadedAt}\n
\n ${file.tags.length > 0 ? `\n
\n ${file.tags.slice(0, 2).map((tag: string) => `\n \n ${tag}\n \n `).join('')}\n ${file.tags.length > 2 ? `+${file.tags.length - 2}` : ''}\n
\n ` : ''}\n
\n
\n `\n}\n\n// Helper function to format file size\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n\nexport { adminMediaRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface Plugin {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error' | 'uninstalled'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n}\n\nexport interface PluginsListPageData {\n plugins: Plugin[]\n stats?: {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderPluginsListPage(data: PluginsListPageData): string {\n const categories = [\n { value: 'content', label: 'Content Management' },\n { value: 'media', label: 'Media' },\n { value: 'editor', label: 'Editors' },\n { value: 'seo', label: 'SEO & Analytics' },\n { value: 'security', label: 'Security' },\n { value: 'utilities', label: 'Utilities' },\n { value: 'system', label: 'System' },\n { value: 'development', label: 'Development' },\n { value: 'demo', label: 'Demo' }\n ];\n\n const statuses = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'uninstalled', label: 'Available to Install' },\n { value: 'error', label: 'Error' }\n ];\n\n // Calculate counts\n const categoryCounts: Record = {};\n categories.forEach(cat => {\n categoryCounts[cat.value] = data.plugins.filter(p => p.category === cat.value).length;\n });\n\n // Sort categories by count (descending)\n categories.sort((a, b) => (categoryCounts[b.value] || 0) - (categoryCounts[a.value] || 0));\n\n const statusCounts: Record = {};\n statuses.forEach(status => {\n statusCounts[status.value] = data.plugins.filter(p => p.status === status.value).length;\n });\n\n // Sort statuses by count (descending)\n statuses.sort((a, b) => (statusCounts[b.value] || 0) - (statusCounts[a.value] || 0));\n\n const pageContent = `\n
\n \n
\n
\n

Plugins

\n

Manage and extend functionality with plugins

\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n
\n

\n Experimental Feature\n

\n
\n

\n Plugin management is currently under active development. While functional, some features may change or have limitations.\n Please report any issues you encounter on our Discord community.\n

\n
\n
\n
\n
\n\n
\n \n \n\n \n
\n \n
\n
\n
Total
\n
${data.stats?.total || 0}
\n
\n
\n
Active
\n
${data.stats?.active || 0}
\n
\n
\n
Available
\n
${data.stats?.uninstalled || 0}
\n
\n
\n
Errors
\n
${data.stats?.errors || 0}
\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n \n
\n\n
\n \n\n \n \n \n \n \n
\n
\n\n \n
\n ${data.plugins.map(plugin => renderPluginCard(plugin)).join('')}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'uninstall-plugin-confirm',\n title: 'Uninstall Plugin',\n message: 'Are you sure you want to uninstall this plugin? This action cannot be undone.',\n confirmText: 'Uninstall',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performUninstallPlugin()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Plugins',\n pageTitle: 'Plugin Management',\n currentPath: '/admin/plugins',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderPluginCard(plugin: Plugin): string {\n const statusColors = {\n active: 'bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-400 ring-emerald-600/20',\n inactive: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-zinc-600/20',\n error: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-red-600/20',\n uninstalled: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-600 dark:text-zinc-500 ring-zinc-600/20'\n }\n\n const statusIcons = {\n active: '
',\n inactive: '
',\n error: '
',\n uninstalled: '
'\n }\n\n // Core system plugins that cannot be deactivated\n const criticalCorePlugins = ['core-auth', 'core-media']\n const canToggle = !criticalCorePlugins.includes(plugin.id)\n\n let actionButton = ''\n if (plugin.status === 'uninstalled') {\n actionButton = ``\n } else {\n const isActive = plugin.status === 'active';\n const action = isActive ? 'deactivate' : 'activate';\n // Use bg-emerald-600 for active, bg-zinc-200 (light) / bg-zinc-700 (dark) for inactive\n const bgClass = isActive ? 'bg-emerald-600' : 'bg-zinc-200 dark:bg-zinc-700';\n const translateClass = isActive ? 'translate-x-5' : 'translate-x-0';\n \n if (canToggle) {\n actionButton = `\n \n `\n } else {\n // Critical core plugins cannot be toggled\n actionButton = `\n
\n \n
\n `\n }\n }\n\n return `\n
\n
\n
\n
\n ${plugin.icon || getDefaultPluginIcon(plugin.category)}\n
\n
\n
\n

${plugin.displayName}

\n \n ${statusIcons[plugin.status]}${plugin.status.charAt(0).toUpperCase() + plugin.status.slice(1)}\n \n
\n

v${plugin.version} • ${plugin.author}

\n
\n
\n \n
\n ${!plugin.isCore && plugin.status !== 'uninstalled' ? `\n \n ` : ''}\n
\n
\n\n

${plugin.description}

\n\n
\n \n ${plugin.category}\n \n ${plugin.isCore ? 'Core' : ''}\n \n ${plugin.dependencies && plugin.dependencies.map(dep => `\n \n ${dep}\n \n `).join('') || ''}\n
\n\n
\n
\n ${actionButton}\n
\n
\n
\n `\n}\n\nfunction getDefaultPluginIcon(category: string): string {\n const iconColor = 'text-zinc-600 dark:text-zinc-400'\n\n const icons: Record = {\n 'content': `\n \n \n \n `,\n 'media': `\n \n \n \n `,\n 'seo': `\n \n \n \n `,\n 'analytics': `\n \n \n \n `,\n 'ecommerce': `\n \n \n \n `,\n 'email': `\n \n \n \n `,\n 'workflow': `\n \n \n \n `,\n 'security': `\n \n \n \n `,\n 'social': `\n \n \n \n `,\n 'utility': `\n \n \n \n \n `,\n }\n\n const iconKey = category.toLowerCase() as keyof typeof icons\n return icons[iconKey] || icons['utility'] || ''\n}\n\n// Mock data generator\nexport function generateMockPlugins(): Plugin[] {\n return [\n {\n id: '1',\n name: 'seo-optimizer',\n displayName: 'SEO Optimizer',\n description: 'Advanced SEO optimization tools including meta tag management, sitemap generation, and analytics integration. Boost your search engine rankings with automated optimizations.',\n version: '2.1.4',\n author: 'SonicJS Team',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 15420,\n rating: 4.8,\n lastUpdated: '2 days ago',\n dependencies: ['analytics-plugin'],\n permissions: ['read:content', 'write:meta'],\n isCore: true\n },\n {\n id: '2',\n name: 'image-optimizer',\n displayName: 'Image Optimizer',\n description: 'Automatically compress and optimize images on upload. Supports WebP conversion, lazy loading, and responsive image generation for better performance.',\n version: '1.5.2',\n author: 'MediaPro',\n status: 'active',\n category: 'media',\n icon: ``,\n downloadCount: 8930,\n rating: 4.6,\n lastUpdated: '1 week ago',\n dependencies: [],\n permissions: ['write:media', 'read:settings']\n },\n {\n id: '3',\n name: 'backup-manager',\n displayName: 'Backup Manager',\n description: 'Automated backup solution for content and media files. Schedule regular backups to cloud storage with encryption and restore capabilities.',\n version: '3.0.1',\n author: 'BackupCorp',\n status: 'inactive',\n category: 'utilities',\n icon: ``,\n downloadCount: 12450,\n rating: 4.9,\n lastUpdated: '3 days ago',\n dependencies: ['cloud-storage'],\n permissions: ['read:all', 'write:backups']\n },\n {\n id: '4',\n name: 'security-scanner',\n displayName: 'Security Scanner',\n description: 'Real-time security monitoring and vulnerability scanning. Detects malware, suspicious activities, and provides security recommendations.',\n version: '1.2.8',\n author: 'SecureWeb',\n status: 'error',\n category: 'security',\n icon: ``,\n downloadCount: 5680,\n rating: 4.3,\n lastUpdated: '5 days ago',\n dependencies: ['security-core'],\n permissions: ['read:logs', 'read:files', 'write:security']\n },\n {\n id: '5',\n name: 'social-share',\n displayName: 'Social Share',\n description: 'Easy social media sharing buttons and Open Graph meta tag generation. Supports all major social platforms with customizable styling.',\n version: '2.3.0',\n author: 'SocialPlus',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 22100,\n rating: 4.7,\n lastUpdated: '4 days ago',\n dependencies: [],\n permissions: ['read:content', 'write:meta']\n },\n {\n id: '6',\n name: 'analytics-pro',\n displayName: 'Analytics Pro',\n description: 'Advanced analytics dashboard with custom tracking events, conversion funnels, and detailed visitor insights. GDPR compliant with privacy controls.',\n version: '4.1.2',\n author: 'AnalyticsPro Inc',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 18750,\n rating: 4.9,\n lastUpdated: '1 day ago',\n dependencies: ['gdpr-compliance'],\n permissions: ['read:analytics', 'write:tracking', 'read:users']\n },\n {\n id: '7',\n name: 'form-builder',\n displayName: 'Advanced Form Builder',\n description: 'Drag-and-drop form builder with conditional logic, file uploads, payment integration, and email notifications. Perfect for contact forms and surveys.',\n version: '1.8.5',\n author: 'FormWorks',\n status: 'inactive',\n category: 'content',\n icon: ``,\n downloadCount: 9870,\n rating: 4.4,\n lastUpdated: '1 week ago',\n dependencies: ['email-service'],\n permissions: ['write:forms', 'read:submissions', 'send:emails']\n },\n {\n id: '8',\n name: 'cache-optimizer',\n displayName: 'Cache Optimizer',\n description: 'Intelligent caching system with Redis support, CDN integration, and automatic cache invalidation. Dramatically improves site performance.',\n version: '2.7.3',\n author: 'SpeedBoost',\n status: 'active',\n category: 'utilities',\n icon: ``,\n downloadCount: 13240,\n rating: 4.8,\n lastUpdated: '6 days ago',\n dependencies: ['redis-connector'],\n permissions: ['read:cache', 'write:cache', 'manage:cdn'],\n isCore: true\n },\n {\n id: '9',\n name: 'multilingual',\n displayName: 'Multilingual Support',\n description: 'Complete internationalization solution with automatic translation, language detection, and localized content management for global websites.',\n version: '3.2.1',\n author: 'GlobalWeb',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 7650,\n rating: 4.5,\n lastUpdated: '2 weeks ago',\n dependencies: ['translation-api'],\n permissions: ['read:content', 'write:translations', 'manage:languages']\n }\n ]\n}\n","import type { AuthSettings } from '../../services/auth-validation'\n\nexport function renderAuthSettingsForm(settings: AuthSettings): string {\n const fields = settings.requiredFields\n const validation = settings.validation\n const registration = settings.registration\n\n return `\n
\n \n
\n

Registration Fields

\n

Configure which fields are required during user registration and their minimum lengths.

\n\n
\n ${Object.entries(fields).map(([fieldName, config]: [string, any]) => `\n
\n
\n
\n

${config.label}

\n

Field type: ${config.type}

\n
\n \n
\n\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n `).join('')}\n
\n
\n\n \n
\n

Password Requirements

\n

Additional password complexity requirements.

\n\n
\n
\n
\n \n

Password must contain at least one uppercase letter (A-Z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one lowercase letter (a-z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one number (0-9)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one special character (!@#$%^&*)

\n
\n \n
\n
\n
\n\n \n
\n

Registration Settings

\n

General registration behavior.

\n\n
\n
\n
\n \n

Enable or disable public user registration

\n
\n \n
\n\n
\n
\n \n

Users must verify their email before accessing the system

\n
\n \n
\n\n
\n \n \n \n \n \n \n

Role assigned to new users upon registration

\n
\n
\n
\n\n \n
\n

Validation Settings

\n

Additional validation rules.

\n\n
\n
\n
\n \n

Validate that email addresses are in correct format

\n
\n \n
\n\n
\n
\n \n

Ensure usernames are unique across all users

\n
\n \n
\n
\n
\n
\n `\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAuthSettingsForm } from '../components/auth-settings-form.template'\nimport type { AuthSettings } from '../../services/auth-validation'\n\n/**\n * Escape HTML attribute values to prevent XSS\n */\nfunction escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport interface PluginSettings {\n [key: string]: any\n}\n\nexport interface PluginActivity {\n id: string\n action: string\n message: string\n timestamp: number\n user?: string\n}\n\nexport interface PluginSettingsPageData {\n plugin: {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n settings?: PluginSettings\n }\n activity?: PluginActivity[]\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderPluginSettingsPage(data: PluginSettingsPageData): string {\n const { plugin, activity = [], user } = data\n \n const pageContent = `\n
\n \n
\n
\n

Plugin Settings

\n

\n ${plugin.description}\n

\n
\n \n
\n\n \n
\n
\n
\n
\n ${plugin.icon || plugin.displayName.charAt(0).toUpperCase()}\n
\n
\n

${plugin.displayName}

\n
\n v${plugin.version}\n by ${plugin.author}\n ${plugin.category}\n ${plugin.downloadCount ? `${plugin.downloadCount.toLocaleString()} downloads` : ''}\n ${plugin.rating ? `★ ${plugin.rating}` : ''}\n
\n
\n
\n\n
\n ${renderStatusBadge(plugin.status)}\n ${renderToggleButton(plugin)}\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n \n
\n ${renderSettingsTab(plugin)}\n
\n\n \n
\n ${renderActivityTab(activity)}\n
\n\n \n
\n ${renderInformationTab(plugin)}\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${plugin.displayName} Settings`,\n pageTitle: `${plugin.displayName} Settings`,\n currentPath: `/admin/plugins/${plugin.id}`,\n user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction renderStatusBadge(status: string): string {\n const statusColors: Record = {\n active: 'bg-green-900/50 text-green-300 border-green-600/30',\n inactive: 'bg-gray-800/50 text-gray-400 border-gray-600/30',\n error: 'bg-red-900/50 text-red-300 border-red-600/30'\n }\n\n const statusIcons: Record = {\n active: '
',\n inactive: '
',\n error: '
'\n }\n\n return `\n \n ${statusIcons[status] || statusIcons.inactive}${status.charAt(0).toUpperCase() + status.slice(1)}\n \n `\n}\n\nfunction renderToggleButton(plugin: any): string {\n if (plugin.isCore) {\n return 'Core Plugin'\n }\n\n return plugin.status === 'active' \n ? ``\n : ``\n}\n\nfunction renderSettingsTab(plugin: any): string {\n const settings = plugin.settings || {}\n const pluginId = plugin.id || plugin.name\n\n // Check for custom settings component first\n const customRenderer = pluginSettingsComponents[pluginId]\n if (customRenderer) {\n return `\n
\n ${customRenderer(plugin, settings)}\n\n
\n \n Save Settings\n \n
\n
\n `\n }\n\n const isSeedDataPlugin = plugin.id === 'seed-data' || plugin.name === 'seed-data'\n const isAuthPlugin = plugin.id === 'core-auth' || plugin.name === 'core-auth'\n const isTurnstilePlugin = plugin.id === 'turnstile' || plugin.name === 'turnstile'\n\n return `\n ${isSeedDataPlugin ? `\n
\n
\n
\n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n
\n \n \n \n \n Open Seed Data Tool\n \n
\n
\n ` : ''}\n\n
\n ${isAuthPlugin ? `\n

Authentication Settings

\n

Configure user registration fields and validation rules.

\n ` : isTurnstilePlugin ? `\n

Cloudflare Turnstile Settings

\n

Configure CAPTCHA-free bot protection for your forms.

\n ` : `\n

Plugin Settings

\n `}\n\n
\n ${isAuthPlugin && Object.keys(settings).length > 0\n ? renderAuthSettingsForm(settings as AuthSettings)\n : isTurnstilePlugin && Object.keys(settings).length > 0\n ? renderTurnstileSettingsForm(settings)\n : Object.keys(settings).length > 0\n ? renderSettingsFields(settings)\n : renderNoSettings(plugin)\n }\n\n ${Object.keys(settings).length > 0 ? `\n
\n \n Save Settings\n \n
\n ` : ''}\n
\n
\n `\n}\n\nfunction renderSettingsFields(settings: PluginSettings): string {\n return Object.entries(settings).map(([key, value]) => {\n const fieldId = `setting_${key}`\n const displayName = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase())\n \n if (typeof value === 'boolean') {\n return `\n
\n
\n \n

Enable or disable this feature

\n
\n \n
\n `\n } else if (typeof value === 'number') {\n return `\n
\n \n \n
\n `\n } else {\n return `\n
\n \n \n
\n `\n }\n }).join('')\n}\n\nfunction renderTurnstileSettingsForm(settings: any): string {\n const inputClass = \"backdrop-blur-sm bg-white/10 border border-white/20 rounded-lg px-3 py-2 text-white placeholder-gray-300 focus:border-blue-400 focus:outline-none transition-colors w-full\"\n const selectClass = \"backdrop-blur-sm bg-zinc-800 border border-white/20 rounded-lg px-3 py-2 text-white focus:border-blue-400 focus:outline-none transition-colors w-full [&>option]:bg-zinc-800 [&>option]:text-white\"\n \n return `\n \n
\n
\n \n

Enable or disable Turnstile verification globally

\n
\n \n
\n\n \n
\n \n \n

Your Cloudflare Turnstile site key (public)

\n
\n\n \n
\n \n \n

Your Cloudflare Turnstile secret key (private)

\n
\n\n \n
\n \n \n

Visual appearance of the Turnstile widget

\n
\n\n \n
\n \n \n

Size of the Turnstile challenge widget

\n
\n\n \n
\n \n \n

Managed: Shows challenge only when needed. Non-Interactive: Always shows but doesn't require interaction. Invisible: Runs in background without UI.

\n
\n\n \n
\n \n \n

Controls when Turnstile verification occurs. Always: Verifies immediately (pre-clearance). Execute: Verifies on form submit. Interaction Only: Only after user interaction.

\n
\n `\n}\n\nfunction renderNoSettings(plugin: any): string {\n // Special handling for seed-data plugin\n if (plugin.id === 'seed-data' || plugin.name === 'seed-data') {\n return `\n
\n \n \n \n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n \n \n \n \n Generate Seed Data\n \n
\n `\n }\n\n return `\n
\n \n \n \n \n

No Settings Available

\n

This plugin doesn't have any configurable settings.

\n
\n `\n}\n\nfunction renderActivityTab(activity: PluginActivity[]): string {\n return `\n
\n

Activity Log

\n \n ${activity.length > 0 ? `\n
\n ${activity.map(item => `\n
\n
\n
\n
\n ${item.action}\n ${formatTimestamp(item.timestamp)}\n
\n

${item.message}

\n ${item.user ? `

by ${item.user}

` : ''}\n
\n
\n `).join('')}\n
\n ` : `\n
\n \n \n \n

No Activity

\n

No recent activity for this plugin.

\n
\n `}\n
\n `\n}\n\nfunction renderInformationTab(plugin: any): string {\n return `\n
\n \n
\n

Plugin Details

\n
\n
\n Name:\n ${plugin.displayName}\n
\n
\n Version:\n ${plugin.version}\n
\n
\n Author:\n ${plugin.author}\n
\n
\n Category:\n ${plugin.category}\n
\n
\n Status:\n ${plugin.status}\n
\n
\n Last Updated:\n ${plugin.lastUpdated}\n
\n
\n
\n\n \n
\n

Dependencies & Permissions

\n \n ${plugin.dependencies && plugin.dependencies.length > 0 ? `\n
\n

Dependencies:

\n
\n ${plugin.dependencies.map((dep: string) => `\n
${dep}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${plugin.permissions && plugin.permissions.length > 0 ? `\n
\n

Permissions:

\n
\n ${plugin.permissions.map((perm: string) => `\n
${perm}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${(!plugin.dependencies || plugin.dependencies.length === 0) && (!plugin.permissions || plugin.permissions.length === 0) ? `\n

No dependencies or special permissions required.

\n ` : ''}\n
\n
\n `\n}\n\nfunction formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp * 1000)\n return date.toLocaleString()\n}\n\n// ==================== Plugin Settings Components ====================\n// These render just the settings content, embedded within the shared layout\n\n/**\n * Registry of custom plugin settings components\n * Plugins with custom settings UI register their render functions here\n */\ntype PluginSettingsRenderer = (plugin: any, settings: PluginSettings) => string\n\nconst pluginSettingsComponents: Record = {\n 'otp-login': renderOTPLoginSettingsContent,\n 'email': renderEmailSettingsContent,\n}\n\n/**\n * OTP Login plugin settings content\n */\nfunction renderOTPLoginSettingsContent(plugin: any, settings: PluginSettings): string {\n const siteName = settings.siteName || 'SonicJS'\n const emailConfigured = settings._emailConfigured || false\n const codeLength = settings.codeLength || 6\n const codeExpiryMinutes = settings.codeExpiryMinutes || 10\n const maxAttempts = settings.maxAttempts || 3\n const rateLimitPerHour = settings.rateLimitPerHour || 5\n const allowNewUserRegistration = settings.allowNewUserRegistration || false\n const logoUrl = settings.logoUrl || ''\n const logoWidth = Number(settings.logoWidth) || 150\n const logoBorderWidth = Number(settings.logoBorderWidth) || 0\n const logoBorderColor = settings.logoBorderColor || '#ffffff'\n const loginUrl = settings.loginUrl || ''\n const loginButtonText = settings.loginButtonText || ''\n const previewButtonText = loginButtonText.trim() || `Sign in to ${siteName}`\n const previewLogoBorder = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${escapeHtmlAttr(logoBorderColor)}; border-radius: 8px;`\n : ''\n\n return `\n
\n \n
\n

\n 📧 Test OTP Email\n

\n\n ${!emailConfigured ? `\n
\n

\n ⚠️ Email not configured.\n Configure the Email plugin\n to send real emails. Dev mode will show codes in the response.\n

\n
\n ` : `\n
\n

\n ✅ Email configured. Test emails will be sent via Resend.\n

\n
\n `}\n\n
\n
\n \n \n
\n\n \n Send Test Code\n \n \n \n \n \n \n \n \n\n
\n\n \n
\n

Verify Code

\n
\n
\n \n \n
\n \n Verify Code\n \n \n
\n
\n
\n\n \n
\n

Code Settings

\n\n
\n
\n \n \n

Optional. Displayed at the top of the OTP email.

\n
\n\n
\n
\n \n \n

Max width of the logo (20-600).

\n
\n\n
\n \n \n

0 disables the border.

\n
\n\n
\n \n
\n \n \n
\n

Hex, rgb(), or named color.

\n
\n
\n\n
\n \n \n

Optional. If set, a \"Sign in\" button is added to the email.

\n
\n\n
\n \n \n

Optional. Defaults to \"Sign in to ${siteName}\".

\n
\n\n
\n
\n \n \n

Number of digits (4-8)

\n
\n\n
\n \n \n

How long codes remain valid

\n
\n\n
\n \n \n

Max verification attempts

\n
\n\n
\n \n \n

Max requests per email per hour

\n
\n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

\n 👁️ Email Preview\n

\n

\n This is how the OTP email will appear to users. The site name \"${siteName}\" is configured in\n General Settings.\n

\n\n
\n
\n ${logoUrl ? `\"Logo\"` : ''}\n

Your Login Code

\n

Enter this code to sign in to ${siteName}

\n
\n\n
\n
\n
\n 123456\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${codeExpiryMinutes} minutes\n

\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${siteName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n
\n
\n\n \n
\n

🔢 Features

\n
    \n
  • ✓ Passwordless authentication
  • \n
  • ✓ Secure random code generation
  • \n
  • ✓ Rate limiting protection
  • \n
  • ✓ Brute force prevention
  • \n
  • ✓ Mobile-friendly UX
  • \n
\n
\n\n \n \n
\n\n \n `\n}\n\n/**\n * Email plugin settings content\n */\nfunction renderEmailSettingsContent(plugin: any, settings: PluginSettings): string {\n const apiKey = settings.apiKey || ''\n const fromEmail = settings.fromEmail || ''\n const fromName = settings.fromName || ''\n const replyTo = settings.replyTo || ''\n const logoUrl = settings.logoUrl || ''\n\n return `\n
\n \n
\n

Resend Configuration

\n\n
\n \n
\n \n \n

\n Get your API key from resend.com/api-keys\n

\n
\n\n \n
\n \n \n

Must be a verified domain in Resend

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n

Logo to display in email templates

\n
\n
\n
\n\n \n
\n

Send Test Email

\n
\n \n \n Send Test\n \n
\n
\n
\n\n \n
\n

📧 Email Templates Included

\n
    \n
  • ✓ Registration confirmation
  • \n
  • ✓ Email verification
  • \n
  • ✓ Password reset
  • \n
  • ✓ One-time code (2FA)
  • \n
\n

\n Templates are code-based and can be customized by editing the plugin files.\n

\n
\n
\n\n \n `\n}\n\n/**\n * Check if a plugin has a custom settings component\n */\nexport function hasCustomSettingsComponent(pluginId: string): boolean {\n return pluginId in pluginSettingsComponents\n}\n\n/**\n * Get the custom settings component for a plugin\n */\nexport function getCustomSettingsComponent(pluginId: string): PluginSettingsRenderer | undefined {\n return pluginSettingsComponents[pluginId]\n}","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderPluginsListPage, PluginsListPageData, Plugin } from '../templates/pages/admin-plugins-list.template'\nimport { renderPluginSettingsPage, PluginSettingsPageData } from '../templates/pages/admin-plugin-settings.template'\nimport { SettingsService } from '../services/settings'\nimport { PluginService } from '../services'\nimport { PLUGIN_REGISTRY, findPluginByCodeName } from '../plugins/manifest-registry'\nimport type { Bindings, Variables } from '../app'\n\nconst adminPluginRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminPluginRoutes.use('*', requireAuth())\n\n// Build available plugins list from the auto-generated registry.\n// To add a new plugin to this list, create a manifest.json in the plugin directory\n// and run: node packages/scripts/generate-plugin-registry.mjs\nconst AVAILABLE_PLUGINS = Object.values(PLUGIN_REGISTRY).map(p => ({\n id: p.id,\n name: p.codeName,\n display_name: p.displayName,\n description: p.description,\n version: p.version,\n author: p.author,\n category: p.category,\n icon: p.iconEmoji,\n permissions: p.permissions,\n dependencies: p.dependencies,\n is_core: p.is_core\n}))\n\n// Plugin list page\nadminPluginRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n // TODO: Fix permission system\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n\n const pluginService = new PluginService(db)\n\n // Get all installed plugins with error handling\n let installedPlugins: any[] = []\n let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 }\n\n try {\n installedPlugins = await pluginService.getAllPlugins()\n stats = await pluginService.getPluginStats()\n } catch (error) {\n console.error('Error loading plugins:', error)\n // Continue with empty data\n }\n\n // Get list of installed plugin IDs\n const installedPluginIds = new Set(installedPlugins.map(p => p.id))\n\n // Find uninstalled plugins\n const uninstalledPlugins = AVAILABLE_PLUGINS.filter(p => !installedPluginIds.has(p.id))\n\n // Map installed plugins to template format\n const templatePlugins: Plugin[] = installedPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: p.status,\n category: p.category,\n icon: p.icon,\n downloadCount: p.download_count,\n rating: p.rating,\n lastUpdated: formatLastUpdated(p.last_updated),\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Add uninstalled plugins to the list\n const uninstalledTemplatePlugins: Plugin[] = uninstalledPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: 'uninstalled' as const,\n category: p.category,\n icon: p.icon,\n downloadCount: 0,\n rating: 0,\n lastUpdated: 'Not installed',\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Combine installed and uninstalled plugins\n const allPlugins = [...templatePlugins, ...uninstalledTemplatePlugins]\n\n // Update stats with uninstalled count\n stats.uninstalled = uninstalledPlugins.length\n stats.total = installedPlugins.length + uninstalledPlugins.length\n\n const pageData: PluginsListPageData = {\n plugins: allPlugins,\n stats,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n },\n version: c.get('appVersion')\n }\n\n return c.html(renderPluginsListPage(pageData))\n } catch (error) {\n console.error('Error loading plugins page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Get plugin settings page\nadminPluginRoutes.get('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Check authorization first\n if (user?.role !== 'admin') {\n return c.redirect('/admin/plugins')\n }\n\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin(pluginId)\n\n if (!plugin) {\n return c.text('Plugin not found', 404)\n }\n\n // Get activity log\n const activity = await pluginService.getPluginActivity(pluginId, 20)\n\n // Load additional context for plugins with custom settings components\n let enrichedSettings = plugin.settings || {}\n\n // For OTP Login plugin, add site name and email config status\n if (pluginId === 'otp-login') {\n // Get site name from general settings via SettingsService\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName || 'SonicJS'\n\n // Check if email plugin is configured\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n let emailConfigured = false\n if (emailPlugin?.settings) {\n try {\n const emailSettings = JSON.parse(emailPlugin.settings)\n emailConfigured = !!(emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName)\n } catch (e) { /* ignore */ }\n }\n\n enrichedSettings = {\n ...enrichedSettings,\n siteName,\n _emailConfigured: emailConfigured\n }\n }\n\n // Map plugin data to template format\n const templatePlugin = {\n id: plugin.id,\n name: plugin.name,\n displayName: plugin.display_name,\n description: plugin.description,\n version: plugin.version,\n author: plugin.author,\n status: plugin.status,\n category: plugin.category,\n icon: plugin.icon,\n downloadCount: plugin.download_count,\n rating: plugin.rating,\n lastUpdated: formatLastUpdated(plugin.last_updated),\n dependencies: plugin.dependencies,\n permissions: plugin.permissions,\n isCore: plugin.is_core,\n settings: enrichedSettings\n }\n\n // Map activity data\n const templateActivity = (activity || []).map(item => ({\n id: item.id,\n action: item.action,\n message: item.message,\n timestamp: item.timestamp,\n user: item.user_email\n }))\n\n const pageData: PluginSettingsPageData = {\n plugin: templatePlugin,\n activity: templateActivity,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n }\n }\n\n return c.html(renderPluginSettingsPage(pageData))\n } catch (error) {\n console.error('Error getting plugin settings page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Activate plugin\nadminPluginRoutes.post('/:id/activate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.activatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error activating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to activate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Deactivate plugin\nadminPluginRoutes.post('/:id/deactivate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.deactivatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deactivating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to deactivate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Generic install handler - uses the auto-generated plugin registry.\n// No per-plugin switch/case needed. Adding a manifest.json is enough.\nadminPluginRoutes.post('/install', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const body = await c.req.json()\n const pluginService = new PluginService(db)\n\n // Look up plugin in registry by codeName (what the frontend sends as body.name)\n // or by id\n const registryEntry = findPluginByCodeName(body.name)\n || PLUGIN_REGISTRY[body.name]\n || PLUGIN_REGISTRY[body.id]\n\n if (!registryEntry) {\n return c.json({ error: 'Plugin not found in registry' }, 404)\n }\n\n const plugin = await pluginService.installPlugin({\n id: registryEntry.id,\n name: registryEntry.codeName,\n display_name: registryEntry.displayName,\n description: registryEntry.description,\n version: registryEntry.version,\n author: registryEntry.author,\n category: registryEntry.category,\n icon: registryEntry.iconEmoji,\n permissions: registryEntry.permissions,\n dependencies: registryEntry.dependencies,\n is_core: registryEntry.is_core,\n settings: registryEntry.defaultSettings,\n })\n\n return c.json({ success: true, plugin })\n } catch (error) {\n console.error('Error installing plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to install plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Uninstall plugin\nadminPluginRoutes.post('/:id/uninstall', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.uninstallPlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error uninstalling plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to uninstall plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Update plugin settings\nadminPluginRoutes.post('/:id/settings', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const settings = await c.req.json()\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings(pluginId, settings)\n\n // Clear auth validation cache if updating core-auth plugin\n if (pluginId === 'core-auth') {\n try {\n const cacheKv = c.env.CACHE_KV\n if (cacheKv) {\n await cacheKv.delete('auth:settings')\n await cacheKv.delete('auth:registration-enabled')\n console.log('[AuthSettings] Cache cleared after updating authentication settings')\n }\n } catch (cacheError) {\n console.error('[AuthSettings] Failed to clear cache:', cacheError)\n }\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating plugin settings:', error)\n const message = error instanceof Error ? error.message : 'Failed to update settings'\n return c.json({ error: message }, 400)\n }\n})\n\n// Helper function to format last updated time\nfunction formatLastUpdated(timestamp: number): string {\n const now = Date.now() / 1000\n const diff = now - timestamp\n\n if (diff < 60) return 'just now'\n if (diff < 3600) return `${Math.floor(diff / 60)} minutes ago`\n if (diff < 86400) return `${Math.floor(diff / 3600)} hours ago`\n if (diff < 604800) return `${Math.floor(diff / 86400)} days ago`\n if (diff < 2592000) return `${Math.floor(diff / 604800)} weeks ago`\n return `${Math.floor(diff / 2592000)} months ago`\n}\n\nexport { adminPluginRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogEntry {\n id: string\n level: string\n category: string\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags: string[]\n source?: string\n createdAt: Date\n formattedDate: string\n formattedDuration?: string\n levelClass: string\n categoryClass: string\n}\n\nexport interface LogsListPageData {\n logs: LogEntry[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n baseUrl: string\n }\n filters: {\n level: string\n category: string\n search: string\n startDate: string\n endDate: string\n source: string\n }\n user?: BaseUser\n}\n\nexport function renderLogsListPage(data: LogsListPageData) {\n const { logs, pagination, filters, user } = data\n\n const content = `\n
\n
\n
\n

System Logs

\n

\n Monitor and analyze system activity, errors, and performance metrics.\n

\n
\n
\n \n Configure\n \n \n Export\n \n
\n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n Apply Filters\n \n \n Clear\n \n
\n
\n\n
\n ${pagination.totalItems} ${pagination.totalItems === 1 ? 'entry' : 'entries'}\n
\n
\n
\n
\n
\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
\n Level\n \n Category\n \n Message\n \n Source\n \n Time\n \n Actions\n
\n \n ${log.level}\n \n \n \n ${log.category}\n \n \n
\n
${log.message}
\n ${log.url ? `
${log.method} ${log.url}
` : ''}\n ${log.duration ? `
${log.formattedDuration}
` : ''}\n
\n
\n ${log.source || '-'}\n \n ${log.formattedDate}\n \n \n View Details\n \n
\n
\n\n ${logs.length === 0 ? `\n
\n \n \n \n

No log entries

\n

No log entries found matching your criteria.

\n
\n ` : ''}\n
\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : `\n \n Previous\n \n `}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : `\n \n Next\n \n `}\n
\n
\n
\n

\n Showing ${pagination.startItem} to ${pagination.endItem} of{' '}\n ${pagination.totalItems} results\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'System Logs',\n pageTitle: 'System Logs',\n currentPath: '/admin/logs',\n user,\n content\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport { LogEntry } from './admin-logs-list.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogDetailsPageData {\n log: LogEntry\n user?: BaseUser\n}\n\nexport function renderLogDetailsPage(data: LogDetailsPageData) {\n const { log, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Details

\n

\n Detailed information for log entry ${log.id}\n

\n
\n
\n\n
\n
\n
\n

Log Entry Information

\n
\n \n ${log.level}\n \n \n ${log.category}\n \n
\n
\n
\n \n
\n
\n
\n
ID
\n
${log.id}
\n
\n \n
\n
Timestamp
\n
${log.formattedDate}
\n
\n \n
\n
Level
\n
\n \n ${log.level}\n \n
\n
\n \n
\n
Category
\n
\n \n ${log.category}\n \n
\n
\n \n ${log.source ? html`\n
\n
Source
\n
${log.source}
\n
\n ` : ''}\n \n ${log.userId ? html`\n
\n
User ID
\n
${log.userId}
\n
\n ` : ''}\n \n ${log.sessionId ? html`\n
\n
Session ID
\n
${log.sessionId}
\n
\n ` : ''}\n \n ${log.requestId ? html`\n
\n
Request ID
\n
${log.requestId}
\n
\n ` : ''}\n \n ${log.ipAddress ? html`\n
\n
IP Address
\n
${log.ipAddress}
\n
\n ` : ''}\n \n ${log.method && log.url ? html`\n
\n
HTTP Request
\n
\n ${log.method} ${log.url}\n ${log.statusCode ? html`(${log.statusCode})` : ''}\n
\n
\n ` : ''}\n \n ${log.duration ? html`\n
\n
Duration
\n
${log.formattedDuration}
\n
\n ` : ''}\n \n ${log.userAgent ? html`\n
\n
User Agent
\n
${log.userAgent}
\n
\n ` : ''}\n
\n
\n
\n\n \n
\n
\n

Message

\n
\n
\n
\n ${log.message}\n
\n
\n
\n\n \n ${log.tags && log.tags.length > 0 ? html`\n
\n
\n

Tags

\n
\n
\n
\n ${log.tags.map(tag => html`\n \n ${tag}\n \n `).join('')}\n
\n
\n
\n ` : ''}\n\n \n ${log.data ? html`\n
\n
\n

Additional Data

\n
\n
\n
${JSON.stringify(log.data, null, 2)}
\n
\n
\n ` : ''}\n\n \n ${log.stackTrace ? html`\n
\n
\n

Stack Trace

\n
\n
\n
${log.stackTrace}
\n
\n
\n ` : ''}\n\n \n
\n \n ← Back to Logs\n \n \n
\n ${log.level === 'error' || log.level === 'fatal' ? html`\n \n Report Issue\n \n ` : ''}\n \n alert('Log details copied to clipboard'))\"\n >\n Copy Details\n \n
\n
\n
\n `\n\n return adminLayoutV2({\n title: `Log Details - ${log.id}`,\n user,\n content: content as string\n })\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport type { LogConfig } from '../../db/schema'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogConfigPageData {\n configs: LogConfig[]\n user?: BaseUser\n}\n\nexport function renderLogConfigPage(data: LogConfigPageData) {\n const { configs, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Configuration

\n

\n Configure logging settings for different categories and manage log retention policies.\n

\n
\n
\n \n Run Cleanup\n \n
\n
\n\n
\n\n \n
\n
\n

Log Levels Reference

\n
\n
\n
\n
\n \n debug\n \n

Detailed diagnostic information

\n
\n
\n \n info\n \n

General information messages

\n
\n
\n \n warn\n \n

Warning conditions

\n
\n
\n \n error\n \n

Error conditions

\n
\n
\n \n fatal\n \n

Critical system errors

\n
\n
\n
\n
\n\n \n
\n ${configs.map(config => html`\n
\n
\n
\n

${config.category}

\n
\n ${config.enabled ? html`\n \n Enabled\n \n ` : html`\n \n Disabled\n \n `}\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n \n \n \n \n \n \n

Only logs at this level or higher will be stored

\n
\n \n
\n \n \n

Logs older than this will be deleted

\n
\n \n
\n \n \n

Maximum number of logs to keep for this category

\n
\n
\n \n
\n
\n \n Update Configuration\n \n
\n
\n \n
\n
\n
Created: ${new Date(config.createdAt).toLocaleDateString()}
\n
Updated: ${new Date(config.updatedAt).toLocaleDateString()}
\n
\n
\n
\n `).join('')}\n
\n\n \n
\n
\n

Global Log Settings

\n
\n
\n
\n
\n

Storage Information

\n
\n
\n
-
\n
Total Log Entries
\n
\n
\n
-
\n
Storage Used
\n
\n
\n
-
\n
Oldest Log
\n
\n
\n
\n \n
\n

Log Categories

\n
\n
    \n
  • auth - Authentication and authorization events
  • \n
  • api - API requests and responses
  • \n
  • workflow - Content workflow state changes
  • \n
  • plugin - Plugin-related activities
  • \n
  • media - File upload and media operations
  • \n
  • system - General system events
  • \n
  • security - Security-related events and alerts
  • \n
  • error - General error conditions
  • \n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n return adminLayoutV2({\n title: 'Log Configuration',\n user,\n content: content as string\n })\n}","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { D1Database, KVNamespace } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport { getLogger, type LogLevel, type LogCategory, type LogFilter } from '../services'\nimport { renderLogsListPage, type LogsListPageData } from '../templates/pages/admin-logs-list.template'\nimport { renderLogDetailsPage, type LogDetailsPageData } from '../templates/pages/admin-log-details.template'\nimport { renderLogConfigPage, type LogConfigPageData } from '../templates/pages/admin-log-config.template'\nimport type { Bindings, Variables } from '../app'\n\nconst adminLogsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminLogsRoutes.use('*', requireAuth())\n\n// Main logs listing page\nadminLogsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Use Hono's built-in query method instead of parsing URL\n const query = c.req.query()\n \n // Parse query parameters\n const page = parseInt(query.page || '1')\n const limit = parseInt(query.limit || '50')\n const level = query.level\n const category = query.category\n const search = query.search\n const startDate = query.start_date\n const endDate = query.end_date\n const source = query.source\n \n // Build filter\n const filter: LogFilter = {\n limit,\n offset: (page - 1) * limit,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (search) {\n filter.search = search\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n if (source) {\n filter.source = source\n }\n \n // Get logs and total count\n const { logs, total } = await logger.getLogs(filter)\n \n // Format logs for display\n const formattedLogs = logs.map(log => ({\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }))\n \n const totalPages = Math.ceil(total / limit)\n \n const pageData: LogsListPageData = {\n logs: formattedLogs,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total),\n baseUrl: '/admin/logs'\n },\n filters: {\n level: level || '',\n category: category || '',\n search: search || '',\n startDate: startDate || '',\n endDate: endDate || '',\n source: source || ''\n },\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogsListPage(pageData))\n } catch (error) {\n console.error('Error fetching logs:', error)\n return c.html(html`

Error loading logs: ${error}

`)\n }\n})\n\n// Log details page\nadminLogsRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get single log by ID\n const { logs } = await logger.getLogs({ \n limit: 1, \n offset: 0,\n search: id // Using search to find by ID - this is a simplification\n })\n \n const log = logs.find(l => l.id === id)\n \n if (!log) {\n return c.html(html`

Log entry not found

`)\n }\n \n const formattedLog = {\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n \n const pageData: LogDetailsPageData = {\n log: formattedLog,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogDetailsPage(pageData))\n } catch (error) {\n console.error('Error fetching log details:', error)\n return c.html(html`

Error loading log details: ${error}

`)\n }\n})\n\n// Log configuration page\nadminLogsRoutes.get('/config', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get all log configurations\n const configs = await logger.getAllConfigs()\n \n const pageData: LogConfigPageData = {\n configs,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogConfigPage(pageData))\n } catch (error) {\n console.error('Error fetching log config:', error)\n return c.html(html`

Error loading log configuration: ${error}

`)\n }\n})\n\n// Update log configuration\nadminLogsRoutes.post('/config/:category', async (c) => {\n try {\n const category = c.req.param('category') as LogCategory\n const formData = await c.req.formData()\n \n const enabled = formData.get('enabled') === 'on'\n const level = formData.get('level') as string\n const retention = parseInt(formData.get('retention') as string)\n const maxSize = parseInt(formData.get('max_size') as string)\n \n const logger = getLogger(c.env.DB)\n await logger.updateConfig(category, {\n enabled,\n level,\n retention,\n maxSize\n })\n \n return c.html(html`\n
\n Configuration updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating log config:', error)\n return c.html(html`\n
\n Failed to update configuration. Please try again.\n
\n `)\n }\n})\n\n// Export logs\nadminLogsRoutes.get('/export', async (c) => {\n try {\n const query = c.req.query()\n const format = query.format || 'csv'\n const level = query.level\n const category = query.category\n const startDate = query.start_date\n const endDate = query.end_date\n \n const logger = getLogger(c.env.DB)\n \n // Build filter for export\n const filter: LogFilter = {\n limit: 10000, // Export up to 10k logs\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n const { logs } = await logger.getLogs(filter)\n \n if (format === 'json') {\n return c.json(logs, 200, {\n 'Content-Disposition': 'attachment; filename=\"logs-export.json\"'\n })\n } else {\n // Default to CSV\n const headers = [\n 'ID', 'Level', 'Category', 'Message', 'Source', 'User ID', \n 'IP Address', 'Method', 'URL', 'Status Code', 'Duration', \n 'Created At'\n ]\n const csvRows = [headers.join(',')]\n \n logs.forEach(log => {\n const row = [\n log.id,\n log.level,\n log.category,\n `\"${log.message.replace(/\"/g, '\"\"')}\"`, // Escape quotes\n log.source || '',\n log.userId || '',\n log.ipAddress || '',\n log.method || '',\n log.url || '',\n log.statusCode || '',\n log.duration || '',\n new Date(log.createdAt).toISOString()\n ]\n csvRows.push(row.join(','))\n })\n \n const csv = csvRows.join('\\n')\n \n return new Response(csv, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': 'attachment; filename=\"logs-export.csv\"'\n }\n })\n }\n } catch (error) {\n console.error('Error exporting logs:', error)\n return c.json({ error: 'Failed to export logs' }, 500)\n }\n})\n\n// Clean up old logs\nadminLogsRoutes.post('/cleanup', async (c) => {\n try {\n const user = c.get('user')\n \n // Only allow admin users to run cleanup\n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n \n const logger = getLogger(c.env.DB)\n await logger.cleanupByRetention()\n \n return c.html(html`\n
\n Log cleanup completed successfully!\n
\n `)\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n return c.html(html`\n
\n Failed to clean up logs. Please try again.\n
\n `)\n }\n})\n\n// Search logs (HTMX endpoint)\nadminLogsRoutes.post('/search', async (c) => {\n try {\n const formData = await c.req.formData()\n const search = formData.get('search') as string\n const level = formData.get('level') as string\n const category = formData.get('category') as string\n \n const logger = getLogger(c.env.DB)\n \n const filter: LogFilter = {\n limit: 20,\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (search) filter.search = search\n if (level) filter.level = [level] as LogLevel[]\n if (category) filter.category = [category] as LogCategory[]\n \n const { logs } = await logger.getLogs(filter)\n \n // Return just the logs table rows for HTMX\n const rows = logs.map(log => {\n const formattedLog = {\n ...log,\n formattedDate: new Date(log.createdAt).toLocaleString(),\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n\n return `\n \n \n \n ${formattedLog.level}\n \n \n \n \n ${formattedLog.category}\n \n \n \n
${formattedLog.message}
\n \n ${formattedLog.source || '-'}\n ${formattedLog.formattedDate}\n \n View\n \n \n `\n }).join('')\n\n return c.html(rows)\n } catch (error) {\n console.error('Error searching logs:', error)\n return c.html(html`Error searching logs`)\n }\n})\n\n// Helper functions\nfunction getLevelClass(level: string): string {\n switch (level) {\n case 'debug': return 'bg-gray-100 text-gray-800'\n case 'info': return 'bg-blue-100 text-blue-800'\n case 'warn': return 'bg-yellow-100 text-yellow-800'\n case 'error': return 'bg-red-100 text-red-800'\n case 'fatal': return 'bg-purple-100 text-purple-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nfunction getCategoryClass(category: string): string {\n switch (category) {\n case 'auth': return 'bg-green-100 text-green-800'\n case 'api': return 'bg-blue-100 text-blue-800'\n case 'workflow': return 'bg-purple-100 text-purple-800'\n case 'plugin': return 'bg-indigo-100 text-indigo-800'\n case 'media': return 'bg-pink-100 text-pink-800'\n case 'system': return 'bg-gray-100 text-gray-800'\n case 'security': return 'bg-red-100 text-red-800'\n case 'error': return 'bg-red-100 text-red-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nexport { adminLogsRoutes }","import { Hono } from 'hono'\nimport { renderDesignPage, DesignPageData } from '../templates/pages/admin-design.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminDesignRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminDesignRoutes.get('/', (c) => {\n const user = c.get('user')\n \n const pageData: DesignPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderDesignPage(pageData))\n})","import { Hono } from 'hono'\nimport { renderCheckboxPage, CheckboxPageData } from '../templates/pages/admin-checkboxes.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminCheckboxRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCheckboxRoutes.get('/', (c) => {\n const user = c.get('user')\n\n const pageData: CheckboxPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderCheckboxPage(pageData))\n})\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface Testimonial {\n id?: number\n authorName: string\n authorTitle?: string\n authorCompany?: string\n testimonialText: string\n rating?: number\n isPublished: boolean\n sortOrder: number\n}\n\ninterface TestimonialsFormData {\n testimonial?: Testimonial\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderTestimonialsForm(data: TestimonialsFormData): string {\n const { testimonial, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Testimonial' : 'New Testimonial'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the testimonial details below' : 'Create a new customer testimonial'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Author Information

\n\n \n
\n \n
\n \n
\n ${errors?.authorName ? `\n
\n ${errors.authorName.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.authorTitle ? `\n
\n ${errors.authorTitle.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.authorCompany ? `\n
\n ${errors.authorCompany.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Testimonial

\n\n \n
\n \n
\n \n

\n 0/1000 characters\n

\n
\n ${errors?.testimonialText ? `\n
\n ${errors.testimonialText.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.rating ? `\n
\n ${errors.rating.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/testimonials/${testimonial?.id}` : '/admin/testimonials/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderTestimonialsList } from '../templates/pages/admin-testimonials-list.template'\nimport { renderTestimonialsForm } from '../templates/pages/admin-testimonials-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst testimonialSchema = z.object({\n authorName: z.string().min(1, 'Author name is required').max(100, 'Author name must be under 100 characters'),\n authorTitle: z.string().optional(),\n authorCompany: z.string().optional(),\n testimonialText: z.string().min(1, 'Testimonial is required').max(1000, 'Testimonial must be under 1000 characters'),\n rating: z.string().transform(val => val ? parseInt(val, 10) : undefined).pipe(z.number().min(1).max(5).optional()),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminTestimonialsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminTestimonialsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, minRating, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (minRating) {\n whereClause += ' AND rating >= ?'\n params.push(parseInt(minRating, 10))\n }\n\n if (search) {\n whereClause += ' AND (author_name LIKE ? OR testimonial_text LIKE ? OR author_company LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM testimonials ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM testimonials\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: testimonials } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderTestimonialsList({\n testimonials: testimonials || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonials:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonials',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminTestimonialsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial created successfully')\n } else {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating testimonial:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM testimonials WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/testimonials?message=Testimonial not found&type=error')\n }\n\n const testimonial = results[0] as any\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id: testimonial.id,\n authorName: testimonial.author_name,\n authorTitle: testimonial.author_title,\n authorCompany: testimonial.author_company,\n testimonialText: testimonial.testimonial_text,\n rating: testimonial.rating,\n isPublished: Boolean(testimonial.isPublished),\n sortOrder: testimonial.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonial:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE testimonials\n SET author_name = ?, author_title = ?, author_company = ?, testimonial_text = ?, rating = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial updated successfully')\n } else {\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: validatedData.authorName,\n authorTitle: validatedData.authorTitle,\n authorCompany: validatedData.authorCompany,\n testimonialText: validatedData.testimonialText,\n rating: validatedData.rating,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Testimonial not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating testimonial:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM testimonials WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Testimonial not found' }, 404)\n }\n\n return c.redirect('/admin/testimonials?message=Testimonial deleted successfully')\n } catch (error) {\n console.error('Error deleting testimonial:', error)\n return c.json({ error: 'Failed to delete testimonial' }, 500)\n }\n})\n\nexport default adminTestimonialsRoutes\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface CodeExample {\n id?: number\n title: string\n description?: string\n code: string\n language: string\n category?: string\n tags?: string\n isPublished: boolean\n sortOrder: number\n}\n\ninterface CodeExamplesFormData {\n codeExample?: CodeExample\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderCodeExamplesForm(data: CodeExamplesFormData): string {\n const { codeExample, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Code Example' : 'New Code Example'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the code example details below' : 'Create a new code snippet or example'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Basic Information

\n\n \n
\n \n
\n \n
\n ${errors?.title ? `\n
\n ${errors.title.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

\n 0/500 characters\n

\n
\n ${errors?.description ? `\n
\n ${errors.description.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.language ? `\n
\n ${errors.language.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.category ? `\n
\n ${errors.category.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

Comma-separated tags

\n
\n ${errors?.tags ? `\n
\n ${errors.tags.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Code

\n\n \n
\n \n
\n \n

\n 0 characters\n

\n
\n ${errors?.code ? `\n
\n ${errors.code.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/code-examples/${codeExample?.id}` : '/admin/code-examples/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderCodeExamplesList } from '../templates/pages/admin-code-examples-list.template'\nimport { renderCodeExamplesForm } from '../templates/pages/admin-code-examples-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst codeExampleSchema = z.object({\n title: z.string().min(1, 'Title is required').max(200, 'Title must be under 200 characters'),\n description: z.string().max(500, 'Description must be under 500 characters').optional(),\n code: z.string().min(1, 'Code is required'),\n language: z.string().min(1, 'Language is required'),\n category: z.string().max(50, 'Category must be under 50 characters').optional(),\n tags: z.string().max(200, 'Tags must be under 200 characters').optional(),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminCodeExamplesRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCodeExamplesRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, language, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (language) {\n whereClause += ' AND language = ?'\n params.push(language)\n }\n\n if (search) {\n whereClause += ' AND (title LIKE ? OR description LIKE ? OR code LIKE ? OR tags LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM code_examples ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM code_examples\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: codeExamples } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderCodeExamplesList({\n codeExamples: codeExamples || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code examples:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code examples',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminCodeExamplesRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example created successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating code example:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM code_examples WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/code-examples?message=Code example not found&type=error')\n }\n\n const example = results[0] as any\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id: example.id,\n title: example.title,\n description: example.description,\n code: example.code,\n language: example.language,\n category: example.category,\n tags: example.tags,\n isPublished: Boolean(example.isPublished),\n sortOrder: example.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code example:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE code_examples\n SET title = ?, description = ?, code = ?, language = ?, category = ?, tags = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example updated successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: validatedData.title,\n description: validatedData.description,\n code: validatedData.code,\n language: validatedData.language,\n category: validatedData.category,\n tags: validatedData.tags,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Code example not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating code example:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM code_examples WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Code example not found' }, 404)\n }\n\n return c.redirect('/admin/code-examples?message=Code example deleted successfully')\n } catch (error) {\n console.error('Error deleting code example:', error)\n return c.json({ error: 'Failed to delete code example' }, 500)\n }\n})\n\nexport default adminCodeExamplesRoutes\n","import {\n AdminLayoutData,\n renderAdminLayout,\n} from \"../layouts/admin-layout-v2.template\";\n\nexport interface DashboardStats {\n collections: number;\n contentItems: number;\n mediaFiles: number;\n users: number;\n databaseSize?: number; // Size in bytes\n mediaSize?: number; // Total size of all media files in bytes\n recentActivity?: ActivityItem[];\n analytics?: AnalyticsData;\n}\n\nexport interface ActivityItem {\n id: string;\n type: \"content\" | \"media\" | \"user\" | \"collection\";\n action: string;\n description: string;\n timestamp: string;\n user: string;\n}\n\nexport interface AnalyticsData {\n pageViews: number;\n uniqueVisitors: number;\n contentPublished: number;\n mediaUploaded: number;\n weeklyGrowth: {\n pageViews: number;\n visitors: number;\n content: number;\n media: number;\n };\n}\n\nexport interface DashboardPageData {\n user?: {\n name: string;\n email: string;\n role: string;\n };\n stats?: DashboardStats;\n version?: string;\n enableExperimentalFeatures?: boolean;\n}\n\nexport function renderDashboardPage(data: DashboardPageData): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n \n \n ${renderStatsCardsSkeleton()}\n \n\n \n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n \n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderDashboardPageWithDynamicMenu(\n data: DashboardPageData,\n dynamicMenuItems: Array<{ label: string; path: string; icon: string }>\n): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n
\n ${renderStatsCards({\n collections: 0,\n contentItems: 0,\n mediaFiles: 0,\n users: 0,\n })}\n
\n\n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n enableExperimentalFeatures: data.enableExperimentalFeatures,\n content: pageContent,\n dynamicMenuItems,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderStatsCards(stats: DashboardStats): string {\n const cards = [\n {\n title: \"Total Collections\",\n value: stats.collections.toString(),\n change: \"12.5\",\n isPositive: true,\n },\n {\n title: \"Content Items\",\n value: stats.contentItems.toString(),\n change: \"8.2\",\n isPositive: true,\n },\n {\n title: \"Media Files\",\n value: stats.mediaFiles.toString(),\n change: \"15.3\",\n isPositive: true,\n },\n {\n title: \"Active Users\",\n value: stats.users.toString(),\n change: \"2.4\",\n isPositive: false,\n },\n ];\n\n const cardColors = ['text-cyan-400', 'text-lime-400', 'text-pink-400', 'text-purple-400'];\n\n return `\n
\n

Last 30 days

\n
\n ${cards.map((card, index) => `\n
\n
${card.title}
\n
\n
\n ${card.value}\n
\n
\n \n ${card.isPositive\n ? ''\n : ''\n }\n \n ${card.isPositive ? 'Increased' : 'Decreased'} by\n ${card.change}%\n
\n
\n
\n `).join('')}\n
\n
\n `;\n}\n\nfunction renderStatsCardsSkeleton(): string {\n return `\n
\n
\n
\n ${Array(4)\n .fill(0)\n .map(\n () => `\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n `;\n}\n\nfunction renderAnalyticsChart(): string {\n return `\n
\n
\n
\n
\n

Real-Time Analytics

\n

Requests per second (live)

\n
\n
\n
\n Live\n
\n
\n
\n 0\n req/s\n
\n
\n\n
\n \n
\n\n \n
\n \n\n \n `;\n}\n\nexport function renderRecentActivitySkeleton(): string {\n return `\n
\n
\n
\n
\n
\n
\n ${Array(3).fill(0).map(() => `\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n}\n\nexport function renderRecentActivity(activities?: ActivityItem[]): string {\n // Helper to get user initials\n const getInitials = (user: string): string => {\n const parts = user.split(' ').filter(p => p.length > 0)\n if (parts.length >= 2) {\n const first = parts[0]?.[0] || ''\n const second = parts[1]?.[0] || ''\n return (first + second).toUpperCase()\n }\n return user.substring(0, 2).toUpperCase()\n }\n\n // Helper to get relative time\n const getRelativeTime = (timestamp: string): string => {\n const date = new Date(timestamp)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) return 'just now'\n if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`\n return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`\n }\n\n // Helper to get color classes based on activity type\n const getColorClasses = (type: string): { bgColor: string; textColor: string } => {\n switch (type) {\n case 'content':\n return {\n bgColor: 'bg-lime-500/10 dark:bg-lime-400/10',\n textColor: 'text-lime-700 dark:text-lime-300'\n }\n case 'media':\n return {\n bgColor: 'bg-cyan-500/10 dark:bg-cyan-400/10',\n textColor: 'text-cyan-700 dark:text-cyan-300'\n }\n case 'user':\n return {\n bgColor: 'bg-pink-500/10 dark:bg-pink-400/10',\n textColor: 'text-pink-700 dark:text-pink-300'\n }\n case 'collection':\n return {\n bgColor: 'bg-purple-500/10 dark:bg-purple-400/10',\n textColor: 'text-purple-700 dark:text-purple-300'\n }\n default:\n return {\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300'\n }\n }\n }\n\n // Format activities with colors and times\n const formattedActivities = (activities || []).map(activity => {\n const colors = getColorClasses(activity.type)\n return {\n ...activity,\n initials: getInitials(activity.user),\n time: getRelativeTime(activity.timestamp),\n ...colors\n }\n })\n\n // If no activities, show empty state\n if (formattedActivities.length === 0) {\n formattedActivities.push({\n type: 'content' as const,\n description: 'No recent activity',\n user: 'System',\n time: '',\n initials: 'SY',\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300',\n id: '0',\n action: '',\n timestamp: new Date().toISOString()\n })\n }\n\n return `\n
\n
\n
\n

Recent Activity

\n \n
\n
\n\n
\n
    \n ${formattedActivities\n .map(\n (activity) => `\n
  • \n
    \n ${activity.initials}\n
    \n
    \n

    ${activity.description}

    \n

    \n ${activity.user}\n · \n ${activity.time}\n

    \n
    \n
  • \n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderQuickActions(): string {\n const actions = [\n {\n title: \"Create Content\",\n description: \"Add new blog post or page\",\n href: \"/admin/content/new\",\n icon: `\n \n `,\n },\n {\n title: \"Upload Media\",\n description: \"Add images and files\",\n href: \"/admin/media\",\n icon: `\n \n `,\n },\n {\n title: \"Manage Users\",\n description: \"Add or edit user accounts\",\n href: \"/admin/users\",\n icon: `\n \n `,\n },\n ];\n\n return `\n
\n
\n

Quick Actions

\n
\n\n
\n
\n ${actions\n .map(\n (action) => `\n \n
\n ${action.icon}\n
\n
\n

${action.title}

\n

${action.description}

\n
\n \n \n \n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderSystemStatus(): string {\n return `\n
\n
\n
\n

System Status

\n
\n
\n Live\n
\n
\n
\n\n \n \n
\n ${[\n { color: 'from-blue-500/20 to-cyan-500/20', darkColor: 'dark:from-blue-500/10 dark:to-cyan-500/10' },\n { color: 'from-purple-500/20 to-pink-500/20', darkColor: 'dark:from-purple-500/10 dark:to-pink-500/10' },\n { color: 'from-amber-500/20 to-orange-500/20', darkColor: 'dark:from-amber-500/10 dark:to-orange-500/10' },\n { color: 'from-lime-500/20 to-emerald-500/20', darkColor: 'dark:from-lime-500/10 dark:to-emerald-500/10' }\n ].map((gradient, i) => `\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n \n\n \n `;\n}\n\nexport function renderStorageUsage(databaseSizeBytes?: number, mediaSizeBytes?: number): string {\n // Helper to format bytes to human readable\n const formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`\n }\n\n const dbSizeGB = databaseSizeBytes ? databaseSizeBytes / (1024 ** 3) : 0\n const dbMaxGB = 10\n const dbPercentageRaw = (dbSizeGB / dbMaxGB) * 100\n // Ensure minimum 0.5% visibility for progress bar, max 100%\n const dbPercentage = Math.min(Math.max(dbPercentageRaw, 0.5), 100)\n const dbUsedFormatted = databaseSizeBytes ? formatBytes(databaseSizeBytes) : 'Unknown'\n\n const mediaUsedFormatted = mediaSizeBytes ? formatBytes(mediaSizeBytes) : '0 B'\n\n const storageItems = [\n {\n label: \"Database\",\n used: dbUsedFormatted,\n total: \"10 GB\",\n percentage: dbPercentage,\n color: dbPercentage > 80 ? \"bg-red-500 dark:bg-red-400\" : dbPercentage > 60 ? \"bg-amber-500 dark:bg-amber-400\" : \"bg-cyan-500 dark:bg-cyan-400\",\n },\n {\n label: \"Media Files\",\n used: mediaUsedFormatted,\n total: \"∞\",\n percentage: 0,\n color: \"bg-lime-500 dark:bg-lime-400\",\n note: \"Stored in R2\"\n },\n {\n label: \"Cache (KV)\",\n used: \"N/A\",\n total: \"∞\",\n percentage: 0,\n color: \"bg-purple-500 dark:bg-purple-400\",\n note: \"Unlimited\"\n },\n ];\n\n return `\n
\n
\n

Storage Usage

\n
\n\n
\n
\n ${storageItems\n .map(\n (item: any) => `\n
\n
\n
\n ${item.label}\n ${item.note ? `(${item.note})` : ''}\n
\n
${item.used} / ${item.total}
\n
\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}","import { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderDashboardPage,\n type DashboardPageData,\n renderStatsCards,\n renderStorageUsage,\n renderRecentActivity,\n type ActivityItem\n} from '../templates/pages/admin-dashboard.template'\nimport { getCoreVersion } from '../utils/version'\nimport { metricsTracker } from '../utils/metrics'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin - Admin Dashboard\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: DashboardPageData = {\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n } catch (error) {\n console.error('Dashboard error:', error)\n\n // Return dashboard with error state\n const pageData: DashboardPageData = {\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n }\n})\n\n/**\n * GET /admin/dashboard/stats - Dashboard stats HTML fragment (HTMX endpoint)\n */\nrouter.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n const html = renderStatsCards({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n users: usersCount,\n mediaSize: mediaSize\n })\n\n return c.html(html)\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.html('
Failed to load statistics
')\n }\n})\n\n/**\n * GET /admin/dashboard/storage - Storage usage HTML fragment (HTMX endpoint)\n */\nrouter.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n const html = renderStorageUsage(databaseSize, mediaSize)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.html('
Failed to load storage information
')\n }\n})\n\n/**\n * GET /admin/dashboard/recent-activity - Recent activity HTML fragment (HTMX endpoint)\n */\nrouter.get('/recent-activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '5')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const activities: ActivityItem[] = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n // Format description based on action and resource type\n let description = ''\n if (row.action === 'create') {\n description = `Created new ${row.resource_type}`\n } else if (row.action === 'update') {\n description = `Updated ${row.resource_type}`\n } else if (row.action === 'delete') {\n description = `Deleted ${row.resource_type}`\n } else {\n description = `${row.action} ${row.resource_type}`\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n description,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n const html = renderRecentActivity(activities)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n const html = renderRecentActivity([])\n return c.html(html)\n }\n})\n\n/**\n * GET /admin/api/metrics - Real-time metrics for analytics chart\n * Returns JSON with current requests per second from the metrics tracker\n */\nrouter.get('/api/metrics', async (c) => {\n return c.json({\n requestsPerSecond: metricsTracker.getRequestsPerSecond(),\n totalRequests: metricsTracker.getTotalRequests(),\n averageRPS: Number(metricsTracker.getAverageRPS().toFixed(2)),\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/dashboard/system-status - System status HTML fragment (HTMX endpoint)\n */\nrouter.get('/system-status', async (c) => {\n try {\n const html = `\n
\n
\n
\n
\n
\n API Status\n \n \n \n
\n

Operational

\n
\n
\n\n
\n
\n
\n
\n Database\n \n \n \n
\n

Connected

\n
\n
\n\n
\n
\n
\n
\n R2 Storage\n \n \n \n
\n

Available

\n
\n
\n\n
\n
\n
\n
\n KV Cache\n \n \n \n
\n

Ready

\n
\n
\n
\n `\n return c.html(html)\n } catch (error) {\n console.error('Error fetching system status:', error)\n return c.html('
Failed to load system status
')\n }\n})\n\nexport { router as adminDashboardRoutes }\n","export function isMarkdownEditorType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nexport function normalizeFieldType(fieldType: string): string {\n if (isMarkdownEditorType(fieldType)) {\n return 'markdown'\n }\n\n if (fieldType === 'tinymce') {\n return 'richtext'\n }\n\n return fieldType\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\nexport interface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCollectionsListPage(data: CollectionsListPageData): string {\n const tableData: any = {\n tableId: 'collections-table',\n rowClickable: true,\n rowClickUrl: (collection: Collection) => `/admin/collections/${collection.id}`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => `\n
\n \n ${collection.name}\n \n ${collection.managed ? `\n \n \n \n \n Config\n \n ` : ''}\n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'description',\n label: 'Description',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => collection.description || '-'\n },\n {\n key: 'field_count',\n label: 'Fields',\n sortable: true,\n sortType: 'number',\n render: (_value: any, collection: any) => {\n const count = collection.field_count || 0\n return `\n
\n \n ${count} ${count === 1 ? 'field' : 'fields'}\n \n
\n `\n }\n },\n {\n key: 'managed',\n label: 'Source',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => {\n if (collection.managed) {\n return `\n
\n \n \n \n Code\n
\n `\n } else {\n return `\n
\n \n \n \n \n \n Database\n
\n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Content',\n sortable: false,\n render: (_value: any, collection: any) => {\n if (!collection || !collection.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.collections,\n emptyMessage: 'No collections found.'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Collections

\n

Manage your content collections and their schemas

\n
\n \n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n ${data.collections.length} ${data.collections.length === 1 ? 'collection' : 'collections'}\n \n \n \n \n Refresh\n \n
\n
\n
\n
\n
\n\n \n
\n ${renderTable(tableData)}\n
\n\n \n ${data.collections.length === 0 ? `\n
\n \n \n \n

No collections found

\n

Get started by creating your first collection

\n \n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Collections',\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","export interface TableColumn {\n key: string\n label: string\n sortable?: boolean\n className?: string\n sortType?: 'string' | 'number' | 'date' | 'boolean'\n render?: (value: any, row: any) => string\n}\n\nexport interface TableData {\n columns: TableColumn[]\n rows: T[]\n selectable?: boolean\n className?: string\n emptyMessage?: string\n tableId?: string\n title?: string\n rowClickable?: boolean\n rowClickUrl?: (row: T) => string\n}\n\nexport function renderTable(data: TableData): string {\n const tableId = data.tableId || `table-${Math.random().toString(36).substr(2, 9)}`\n\n if (data.rows.length === 0) {\n return `\n
\n
\n \n \n \n

${data.emptyMessage || 'No data available'}

\n
\n
\n `\n }\n\n return `\n
\n ${data.title ? `\n
\n

${data.title}

\n
\n ` : ''}\n
\n \n \n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, index) => {\n const isFirst = index === 0 && !data.selectable\n const isLast = index === data.columns.length - 1\n return `\n \n `}).join('')}\n \n \n \n ${data.rows.map((row, rowIndex) => {\n if (!row) return ''\n const clickableClass = data.rowClickable ? 'cursor-pointer' : ''\n const clickHandler = data.rowClickable && data.rowClickUrl ? `onclick=\"window.location.href='${data.rowClickUrl(row)}'\"` : ''\n return `\n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, colIndex) => {\n const value = (row as any)[column.key]\n const displayValue = column.render ? column.render(value, row) : value\n const stopPropagation = column.key === 'actions' ? 'onclick=\"event.stopPropagation()\"' : ''\n const isFirst = colIndex === 0 && !data.selectable\n const isLast = colIndex === data.columns.length - 1\n return `\n \n `\n }).join('')}\n \n `\n }).join('')}\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${column.sortable ? `\n \n ${column.label}\n
\n \n \n \n \n \n \n
\n \n ` : column.label}\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${displayValue || ''}\n
\n
\n\n \n
\n `\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm, FormData, FormField } from '../form.template'\nimport { renderAlert } from '../components/alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\n// Helper function to get field type badge with color\nfunction getFieldTypeBadge(fieldType: string): string {\n const typeLabels: Record = {\n 'text': 'Text',\n 'slug': 'URL Slug',\n 'richtext': 'Rich Text (TinyMCE)',\n 'quill': 'Rich Text (Quill)',\n 'markdown': 'Markdown',\n 'mdxeditor': 'Markdown',\n 'easymde': 'Markdown',\n 'number': 'Number',\n 'boolean': 'Boolean',\n 'date': 'Date',\n 'select': 'Select',\n 'media': 'Media',\n 'reference': 'Reference'\n }\n const typeColors: Record = {\n 'text': 'bg-blue-500/10 dark:bg-blue-400/10 text-blue-700 dark:text-blue-300 ring-blue-500/20 dark:ring-blue-400/20',\n 'slug': 'bg-sky-500/10 dark:bg-sky-400/10 text-sky-700 dark:text-sky-300 ring-sky-500/20 dark:ring-sky-400/20',\n 'richtext': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'quill': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'markdown': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'mdxeditor': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'easymde': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'number': 'bg-green-500/10 dark:bg-green-400/10 text-green-700 dark:text-green-300 ring-green-500/20 dark:ring-green-400/20',\n 'boolean': 'bg-amber-500/10 dark:bg-amber-400/10 text-amber-700 dark:text-amber-300 ring-amber-500/20 dark:ring-amber-400/20',\n 'date': 'bg-cyan-500/10 dark:bg-cyan-400/10 text-cyan-700 dark:text-cyan-300 ring-cyan-500/20 dark:ring-cyan-400/20',\n 'select': 'bg-indigo-500/10 dark:bg-indigo-400/10 text-indigo-700 dark:text-indigo-300 ring-indigo-500/20 dark:ring-indigo-400/20',\n 'media': 'bg-rose-500/10 dark:bg-rose-400/10 text-rose-700 dark:text-rose-300 ring-rose-500/20 dark:ring-rose-400/20',\n 'reference': 'bg-teal-500/10 dark:bg-teal-400/10 text-teal-700 dark:text-teal-300 ring-teal-500/20 dark:ring-teal-400/20'\n }\n const label = typeLabels[fieldType] || fieldType\n const color = typeColors[fieldType] || 'bg-zinc-500/10 dark:bg-zinc-400/10 text-zinc-700 dark:text-zinc-300 ring-zinc-500/20 dark:ring-zinc-400/20'\n return `${label}`\n}\n\nexport function renderCollectionFormPage(data: CollectionFormData): string {\n console.log('[renderCollectionFormPage] editorPlugins:', data.editorPlugins)\n\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? 'Edit Collection' : 'Create New Collection'\n const subtitle = isEdit\n ? `Update collection: ${data.display_name}`\n : 'Define a new content collection with custom fields and settings.'\n\n // Pre-compute data attribute for all fields (without badge HTML to avoid escaping issues)\n const fieldsWithData = (data.fields || []).map(field => ({\n ...field,\n dataFieldJSON: JSON.stringify(JSON.stringify(field))\n }))\n\n const fields: FormField[] = [\n {\n name: 'displayName',\n label: 'Display Name',\n type: 'text',\n value: data.display_name || '',\n placeholder: 'Blog Posts',\n required: true,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'name',\n label: 'Collection Name',\n type: 'text',\n value: data.name || '',\n placeholder: 'blog_posts',\n required: true,\n readonly: isEdit,\n helpText: isEdit ? 'Collection name cannot be changed' : 'Lowercase letters, numbers, and underscores only',\n className: isEdit ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'description',\n label: 'Description',\n type: 'textarea',\n value: data.description || '',\n placeholder: 'Description of this collection...',\n rows: 3,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n }\n ]\n\n\n const formData: FormData = {\n id: 'collection-form',\n ...(isEdit\n ? { hxPut: `/admin/collections/${data.id}`, action: `/admin/collections/${data.id}`, method: 'PUT' }\n : { hxPost: '/admin/collections', action: '/admin/collections' }\n ),\n hxTarget: '#form-messages',\n fields: fields,\n submitButtons: data.managed ? [] : [\n {\n label: isEdit ? 'Update Collection' : 'Create Collection',\n type: 'submit',\n className: 'btn-primary'\n }\n ]\n }\n\n const pageContent = `\n
\n \n ${data.managed ? `\n
\n
\n \n \n \n
\n

\n Config-Managed Collection\n

\n
\n

This collection is managed by a configuration file and cannot be edited through the admin interface.

\n

\n Config file:\n \n src/collections/${data.name}.collection.ts\n \n

\n

\n To modify this collection's schema, edit the configuration file directly in your code editor.\n

\n
\n
\n
\n
\n ` : ''}\n\n \n
\n
\n

${title}

\n

${subtitle}

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

Collection Details

\n

Configure your collection settings below

\n
\n\n ${isEdit && data.name ? `\n \n
\n \n \n \n \n \n
\n ` : ''}\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n \n \n ${renderForm(formData)}\n\n ${isEdit && data.managed ? `\n \n
\n
\n

Collection Fields

\n

Fields defined in the configuration file (read-only)

\n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n ${field.field_name}\n
\n
\n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add fields to your collection configuration file to see them here.

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${isEdit && !data.managed ? `\n \n
\n
\n
\n

Collection Fields

\n

Define the fields that content in this collection will have

\n
\n \n \n \n \n Add Field\n \n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n Field name: ${field.field_name}\n
\n
\n
\n
\n \n \n \n \n Edit\n \n \n \n \n \n Delete\n \n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add your first field to get started

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${!isEdit ? `\n
\n
\n \n \n \n
\n

\n Create Collection First\n

\n

\n After creating the collection, you'll be able to add and configure custom fields.\n

\n
\n
\n
\n ` : ''}\n \n \n
\n \n \n \n \n ${data.managed ? 'Back to Collections' : 'Cancel'}\n \n\n ${isEdit && !data.managed ? `\n \n \n \n \n Delete Collection\n \n ` : ''}\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Add Field

\n \n
\n
\n\n
\n \n\n
\n \n \n

Lowercase letters, numbers, and underscores only

\n
\n\n
\n \n
\n \n \n \n \n ${data.editorPlugins?.tinymce ? '' : ''}\n ${data.editorPlugins?.quill ? '' : ''}\n ${data.editorPlugins?.easyMdx ? '' : ''}\n \n \n \n \n \n \n \n \n \n \n \n
\n

\n
\n\n
\n \n \n
\n\n
\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n\n
\n \n \n

JSON configuration for field-specific options

\n
\n\n
\n \n Cancel\n \n \n Add Field\n \n
\n
\n
\n
\n\n ${isEdit && data.name ? `\n \n
\n
\n
\n
\n

\n Code-Based version of ${escapeHtml(data.display_name || 'this collection')}\n

\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n

\n This is a code-based representation of ${data.display_name ? `the ${escapeHtml(data.display_name)}` : 'this'} collection.\n Learn more about\n \n collections here.\n \n

\n Copied!\n
\n
\n\n
\n \n Close\n \n
\n
\n
\n
\n\n \n ` : ''}\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-field-confirm',\n title: 'Delete Field',\n message: 'Are you sure you want to delete this field? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteField()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { normalizeFieldType } from './admin-collections-field-types'\nimport { renderCollectionsListPage } from '../templates/pages/admin-collections-list.template'\nimport { renderCollectionFormPage } from '../templates/pages/admin-collections-form.template'\n\n// Type definitions for collections\ninterface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\ninterface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\ninterface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\ninterface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminCollectionsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminCollectionsRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on collection modification routes\nadminCollectionsRoutes.post('*', requireRole(['admin']))\nadminCollectionsRoutes.put('*', requireRole(['admin']))\nadminCollectionsRoutes.delete('*', requireRole(['admin']))\n\n// Collections management - List all collections\nadminCollectionsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n const search = url.searchParams.get('search') || ''\n\n // Build query based on search\n let stmt\n let results\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, managed, schema\n FROM collections\n WHERE is_active = 1\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(\"SELECT id, name, display_name, description, created_at, managed, schema FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY created_at DESC\")\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Fetch field counts for all collections from content_fields table (legacy)\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections: Collection[] = (results || [])\n .filter((row: any) => row && row.id)\n .map((row: any) => {\n // Calculate field count: use schema if available, otherwise use content_fields table\n let fieldCount = 0\n if (row.schema) {\n try {\n const schema = typeof row.schema === 'string' ? JSON.parse(row.schema) : row.schema\n if (schema && schema.properties) {\n fieldCount = Object.keys(schema.properties).length\n }\n } catch (e) {\n // If schema parsing fails, fall back to content_fields count\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n } else {\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n\n return {\n id: String(row.id || ''),\n name: String(row.name || ''),\n display_name: String(row.display_name || ''),\n description: row.description ? String(row.description) : undefined,\n created_at: Number(row.created_at || 0),\n formattedDate: row.created_at ? new Date(Number(row.created_at)).toLocaleDateString() : 'Unknown',\n field_count: fieldCount,\n managed: row.managed === 1\n }\n })\n\n const pageData: CollectionsListPageData = {\n collections,\n search,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCollectionsListPage(pageData))\n } catch (error) {\n console.error('Error fetching collections:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.html(html`

Error loading collections: ${errorMessage}

`)\n }\n})\n\n// New collection form\nadminCollectionsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /new] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n})\n\n// Create collection\nadminCollectionsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const name = formData.get('name') as string\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n // Check if this is an HTMX request\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n // Basic validation\n if (!name || !displayName) {\n const errorMsg = 'Name and display name are required.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n // For regular form submission, redirect back with error\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Validate name format\n if (!/^[a-z0-9_]+$/.test(name)) {\n const errorMsg = 'Collection name must contain only lowercase letters, numbers, and underscores.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n const db = c.env.DB\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(name).first()\n\n if (existing) {\n const errorMsg = 'A collection with this name already exists.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Create basic schema for the collection\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n // Create collection\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n name,\n displayName,\n description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache (only if CACHE_KV is available)\n if (c.env.CACHE_KV) {\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n }\n\n if (isHtmx) {\n return c.html(html`\n
\n Collection created successfully! Redirecting to edit mode...\n \n
\n `)\n } else {\n // For regular form submission, redirect to edit page\n return c.redirect(`/admin/collections/${collectionId}`)\n }\n } catch (error) {\n console.error('Error creating collection:', error)\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n if (isHtmx) {\n return c.html(html`\n
\n Failed to create collection. Please try again.\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n})\n\n// Edit collection form\nadminCollectionsRoutes.get('/:id', async (c) => {\n const db = c.env.DB\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n\n // Get collection fields - try schema first, then content_fields table\n let fields: CollectionField[] = []\n\n // If collection has a schema, parse it\n if (collection.schema) {\n try {\n const schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n fields = Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n // Normalize schema formats to UI field types\n let fieldType = fieldConfig.type || 'string'\n if (fieldConfig.enum) {\n fieldType = 'select'\n } else if (fieldConfig.format === 'richtext') {\n fieldType = 'richtext'\n } else if (fieldConfig.format === 'media') {\n fieldType = 'media'\n } else if (fieldConfig.format === 'date-time') {\n fieldType = 'date'\n } else if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n fieldType = 'slug'\n }\n \n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: fieldType,\n field_label: fieldConfig.title || fieldName,\n field_options: fieldConfig,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: fieldConfig.searchable === true || false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table if no schema or parsing failed\n if (fields.length === 0) {\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n fields = (fieldsResults || []).map((row: any) => {\n let fieldOptions = {}\n if (row.field_options) {\n try {\n fieldOptions = typeof row.field_options === 'string' ? JSON.parse(row.field_options) : row.field_options\n } catch (e) {\n console.error('Error parsing field_options for field:', row.field_name, e)\n fieldOptions = {}\n }\n }\n return {\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: fieldOptions,\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }\n })\n }\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /:id] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n fields: fields,\n managed: collection.managed === 1,\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n } catch (error) {\n console.error('Error fetching collection:', error)\n const user = c.get('user')\n\n // Check which editor plugins are active (even in error state)\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Failed to load collection.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n})\n\n// Update collection\nadminCollectionsRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const formData = await c.req.formData()\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n if (!displayName) {\n return c.html(html`\n
\n Display name is required.\n
\n `)\n }\n\n const db = c.env.DB\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(displayName, description || null, Date.now(), id).run()\n\n return c.html(html`\n
\n Collection updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.html(html`\n
\n Failed to update collection. Please try again.\n
\n `)\n }\n})\n\n// Delete collection\nadminCollectionsRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.html(html`\n
\n Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.\n
\n `)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.html(html`\n
\n Failed to delete collection. Please try again.\n
\n `)\n }\n})\n\n// Add field to collection\nadminCollectionsRoutes.post('/:id/fields', async (c) => {\n try {\n const collectionId = c.req.param('id')\n const formData = await c.req.formData()\n const fieldName = formData.get('field_name') as string\n const fieldType = formData.get('field_type') as string\n const fieldLabel = formData.get('field_label') as string\n const isRequired = formData.get('is_required') === '1'\n const isSearchable = formData.get('is_searchable') === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n if (!fieldName || !fieldType || !fieldLabel) {\n return c.json({ success: false, error: 'Field name, type, and label are required.' })\n }\n\n // Validate field name format\n if (!/^[a-z0-9_]+$/.test(fieldName)) {\n return c.json({ success: false, error: 'Field name must contain only lowercase letters, numbers, and underscores.' })\n }\n\n const db = c.env.DB\n\n // Get current collection to check its schema\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Check if field already exists in schema\n let schema = collection.schema ? (typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema) : null\n\n if (schema && schema.properties && schema.properties[fieldName]) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Also check content_fields table for legacy support\n const existingStmt = db.prepare('SELECT id FROM content_fields WHERE collection_id = ? AND field_name = ?')\n const existing = await existingStmt.bind(collectionId, fieldName).first()\n\n if (existing) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Parse field options\n let parsedOptions = {}\n try {\n parsedOptions = fieldOptions ? JSON.parse(fieldOptions) : {}\n } catch (e) {\n console.error('Error parsing field options:', e)\n }\n\n // Add field to schema (primary storage method)\n if (schema) {\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Build field config based on type\n const fieldConfig: any = {\n type: fieldType === 'number' ? 'number' : fieldType === 'boolean' ? 'boolean' : 'string',\n title: fieldLabel,\n searchable: isSearchable,\n ...parsedOptions\n }\n\n const normalizedFieldType = normalizeFieldType(fieldType)\n\n // Handle special field types\n if (normalizedFieldType === 'richtext') {\n fieldConfig.format = 'richtext'\n } else if (normalizedFieldType === 'date') {\n fieldConfig.format = 'date-time'\n } else if (normalizedFieldType === 'select') {\n fieldConfig.enum = (parsedOptions as any).options || []\n } else if (fieldType === 'radio') {\n fieldConfig.type = 'radio'\n if (!(parsedOptions as any).enum && (parsedOptions as any).options) {\n fieldConfig.enum = (parsedOptions as any).options\n }\n } else if (fieldType === 'media') {\n fieldConfig.format = 'media'\n } else if (normalizedFieldType === 'slug') {\n fieldConfig.type = 'slug'\n fieldConfig.format = 'slug'\n } else if (normalizedFieldType === 'quill') {\n fieldConfig.type = 'quill'\n } else if (normalizedFieldType === 'markdown') {\n fieldConfig.type = 'markdown'\n } else if (normalizedFieldType === 'reference') {\n fieldConfig.type = 'reference'\n }\n\n schema.properties[fieldName] = fieldConfig\n\n // Add to required array if needed\n if (isRequired && !schema.required.includes(fieldName)) {\n schema.required.push(fieldName)\n }\n\n // Update collection schema in database\n const updateSchemaStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateSchemaStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Add Field] Added field to schema:', fieldName, fieldConfig)\n\n return c.json({ success: true, fieldId: `schema-${fieldName}` })\n }\n\n // Fallback: If no schema exists, use content_fields table\n // Get next field order\n const orderStmt = db.prepare('SELECT MAX(field_order) as max_order FROM content_fields WHERE collection_id = ?')\n const orderResult = await orderStmt.bind(collectionId).first() as any\n const nextOrder = (orderResult?.max_order || 0) + 1\n\n // Create field in content_fields table\n const fieldId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content_fields (\n id, collection_id, field_name, field_type, field_label,\n field_options, field_order, is_required, is_searchable,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n fieldId,\n collectionId,\n fieldName,\n fieldType,\n fieldLabel,\n fieldOptions,\n nextOrder,\n isRequired ? 1 : 0,\n isSearchable ? 1 : 0,\n now,\n now\n ).run()\n\n return c.json({ success: true, fieldId })\n } catch (error) {\n console.error('Error adding field:', error)\n return c.json({ success: false, error: 'Failed to add field.' })\n }\n})\n\n// Update field\nadminCollectionsRoutes.put('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const formData = await c.req.formData()\n const fieldLabel = formData.get('field_label') as string\n const fieldType = formData.get('field_type') as string\n // Use getAll() to handle hidden input + checkbox pattern (get last value)\n const isRequiredValues = formData.getAll('is_required')\n const isSearchableValues = formData.getAll('is_searchable')\n const isRequired = isRequiredValues[isRequiredValues.length - 1] === '1'\n const isSearchable = isSearchableValues[isSearchableValues.length - 1] === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n // Log all form data for debugging\n console.log('[Field Update] Field ID:', fieldId)\n console.log('[Field Update] Form data received:', {\n field_label: fieldLabel,\n field_type: fieldType,\n is_required: formData.get('is_required'),\n is_searchable: formData.get('is_searchable'),\n field_options: fieldOptions\n })\n\n if (!fieldLabel) {\n return c.json({ success: false, error: 'Field label is required.' })\n }\n\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n // Schema fields are part of the collection's JSON schema\n // We need to update the collection's schema in the database\n const fieldName = fieldId.replace('schema-', '')\n\n console.log('[Field Update] Updating schema field:', fieldName)\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first()\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema) {\n schema = { type: 'object', properties: {}, required: [] }\n }\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Update the field in the schema\n if (schema.properties[fieldName]) {\n // Parse field options from form\n let parsedFieldOptions: Record = {}\n try {\n parsedFieldOptions = JSON.parse(fieldOptions)\n } catch (e) {\n console.error('[Field Update] Error parsing field options:', e)\n }\n\n // Build the updated field config - merge in field options\n const updatedFieldConfig: any = {\n ...schema.properties[fieldName],\n ...parsedFieldOptions,\n type: fieldType,\n title: fieldLabel,\n searchable: isSearchable\n }\n\n // Also set/remove the individual required property on the field\n // This ensures consistency regardless of which format is checked in GET\n if (isRequired) {\n updatedFieldConfig.required = true\n } else {\n delete updatedFieldConfig.required\n }\n\n schema.properties[fieldName] = updatedFieldConfig\n\n // Handle required field in the schema's required array (proper JSON Schema way)\n const requiredIndex = schema.required.indexOf(fieldName)\n console.log('[Field Update] Required field handling:', {\n fieldName,\n isRequired,\n currentRequiredArray: schema.required,\n requiredIndex\n })\n\n if (isRequired && requiredIndex === -1) {\n // Add to required array if checked and not already there\n schema.required.push(fieldName)\n console.log('[Field Update] Added field to required array')\n } else if (!isRequired && requiredIndex !== -1) {\n // Remove from required array if unchecked and currently there\n schema.required.splice(requiredIndex, 1)\n console.log('[Field Update] Removed field from required array')\n }\n\n console.log('[Field Update] Final required array:', schema.required)\n console.log('[Field Update] Final field config:', schema.properties[fieldName])\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Field Update] Schema update result:', {\n success: result.success,\n changes: result.meta?.changes\n })\n\n return c.json({ success: true })\n }\n\n // For regular database fields\n const updateStmt = db.prepare(`\n UPDATE content_fields\n SET field_label = ?, field_type = ?, field_options = ?, is_required = ?, is_searchable = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateStmt.bind(fieldLabel, fieldType, fieldOptions, isRequired ? 1 : 0, isSearchable ? 1 : 0, Date.now(), fieldId).run()\n\n console.log('[Field Update] Update result:', {\n success: result.success,\n meta: result.meta,\n changes: result.meta?.changes,\n last_row_id: result.meta?.last_row_id\n })\n\n // Verify the update by reading back the field\n const verifyStmt = db.prepare('SELECT * FROM content_fields WHERE id = ?')\n const verifyResult = await verifyStmt.bind(fieldId).first()\n console.log('[Field Update] Verification - field after update:', verifyResult)\n\n console.log('[Field Update] Successfully updated field with type:', fieldType)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating field:', error)\n return c.json({ success: false, error: 'Failed to update field.' })\n }\n})\n\n// Delete field\nadminCollectionsRoutes.delete('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n const fieldName = fieldId.replace('schema-', '')\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema || !schema.properties) {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n\n // Remove field from schema\n if (schema.properties[fieldName]) {\n delete schema.properties[fieldName]\n\n // Also remove from required array if present\n if (schema.required && Array.isArray(schema.required)) {\n const requiredIndex = schema.required.indexOf(fieldName)\n if (requiredIndex !== -1) {\n schema.required.splice(requiredIndex, 1)\n }\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Delete Field] Removed field from schema:', fieldName)\n\n return c.json({ success: true })\n } else {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n }\n\n // For regular database fields\n const deleteStmt = db.prepare('DELETE FROM content_fields WHERE id = ?')\n await deleteStmt.bind(fieldId).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting field:', error)\n return c.json({ success: false, error: 'Failed to delete field.' })\n }\n})\n\n// Update field order\nadminCollectionsRoutes.post('/:collectionId/fields/reorder', async (c) => {\n try {\n const body = await c.req.json()\n const fieldIds = body.fieldIds as string[]\n\n if (!Array.isArray(fieldIds)) {\n return c.json({ success: false, error: 'Invalid field order data.' })\n }\n\n const db = c.env.DB\n\n // Update field order\n for (let i = 0; i < fieldIds.length; i++) {\n const updateStmt = db.prepare('UPDATE content_fields SET field_order = ?, updated_at = ? WHERE id = ?')\n await updateStmt.bind(i + 1, Date.now(), fieldIds[i]).run()\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error reordering fields:', error)\n return c.json({ success: false, error: 'Failed to reorder fields.' })\n }\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface SettingsPageData {\n user?: {\n name: string\n email: string\n role: string\n }\n settings?: {\n general?: GeneralSettings\n appearance?: AppearanceSettings\n security?: SecuritySettings\n notifications?: NotificationSettings\n storage?: StorageSettings\n migrations?: MigrationSettings\n databaseTools?: DatabaseToolsSettings\n }\n activeTab?: string\n version?: string\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface AppearanceSettings {\n theme: 'light' | 'dark' | 'auto'\n primaryColor: string\n logoUrl: string\n favicon: string\n customCSS: string\n}\n\nexport interface SecuritySettings {\n twoFactorEnabled: boolean\n sessionTimeout: number\n passwordRequirements: {\n minLength: number\n requireUppercase: boolean\n requireNumbers: boolean\n requireSymbols: boolean\n }\n ipWhitelist: string[]\n jwtExpiresIn?: string\n jwtRefreshGraceSeconds?: number\n}\n\nexport interface NotificationSettings {\n emailNotifications: boolean\n contentUpdates: boolean\n systemAlerts: boolean\n userRegistrations: boolean\n emailFrequency: 'immediate' | 'daily' | 'weekly'\n}\n\nexport interface StorageSettings {\n maxFileSize: number\n allowedFileTypes: string[]\n storageProvider: 'local' | 'cloudflare' | 's3'\n backupFrequency: 'daily' | 'weekly' | 'monthly'\n retentionPeriod: number\n}\n\nexport interface MigrationSettings {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Array<{\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n }>\n}\n\nexport interface DatabaseToolsSettings {\n totalTables: number\n totalRows: number\n lastBackup?: string\n databaseSize?: string\n tables: Array<{\n name: string\n rowCount: number\n }>\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const activeTab = data.activeTab || 'general'\n \n const pageContent = `\n
\n \n
\n
\n

Settings

\n

Manage your application settings and preferences

\n
\n
\n\n \n
\n
\n \n
\n
\n\n \n
\n
\n ${renderTabContent(activeTab, data.settings)}\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'run-migrations-confirm',\n title: 'Run Migrations',\n message: 'Are you sure you want to run pending migrations? This action cannot be undone.',\n confirmText: 'Run Migrations',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performRunMigrations()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Settings',\n pageTitle: 'Settings',\n currentPath: '/admin/settings',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderTabButton(tabId: string, label: string, iconPath: string, activeTab: string): string {\n const isActive = activeTab === tabId\n const baseClasses = 'flex items-center space-x-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 whitespace-nowrap no-underline'\n const activeClasses = isActive\n ? 'border-zinc-950 dark:border-white text-zinc-950 dark:text-white'\n : 'border-transparent text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-300 hover:border-zinc-300 dark:hover:border-zinc-700'\n\n return `\n \n \n \n \n ${label}\n \n `\n}\n\nfunction renderTabContent(activeTab: string, settings?: SettingsPageData['settings']): string {\n switch (activeTab) {\n case 'general':\n return renderGeneralSettings(settings?.general)\n case 'appearance':\n return renderAppearanceSettings(settings?.appearance)\n case 'security':\n return renderSecuritySettings(settings?.security)\n case 'notifications':\n return renderNotificationSettings(settings?.notifications)\n case 'storage':\n return renderStorageSettings(settings?.storage)\n case 'migrations':\n return renderMigrationSettings(settings?.migrations)\n case 'database-tools':\n return renderDatabaseToolsSettings(settings?.databaseTools)\n default:\n return renderGeneralSettings(settings?.general)\n }\n}\n\nfunction renderGeneralSettings(settings?: GeneralSettings): string {\n return `\n
\n
\n

General Settings

\n

Configure basic application settings and preferences.

\n
\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n
\n \n ${settings?.siteDescription || ''}\n
\n\n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderAppearanceSettings(settings?: AppearanceSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Appearance Settings

\n

Customize the look and feel of your application.

\n
\n \n
\n
\n
\n \n
\n \n \n \n
\n
\n \n
\n \n
\n \n \n
\n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderSecuritySettings(settings?: SecuritySettings): string {\n const jwtExpiresIn = settings?.jwtExpiresIn ?? '30d'\n const jwtRefreshGraceSeconds =\n typeof settings?.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n\n return `\n
\n \n
\n

Session / JWT

\n

\n Configure how long a signed-in session lasts and how long an expired token can still be refreshed.\n The JWT_EXPIRES_IN and JWT_REFRESH_GRACE_SECONDS\n environment variables, when set, override the values below.\n

\n\n
\n
\n \n \n

\n Accepts 30d, 12h, 3600s, or bare seconds. Default: 30 days.\n

\n
\n\n
\n \n \n

\n How long an expired token can still be exchanged at /auth/refresh. Default: 604800 (7 days).\n

\n
\n
\n\n
\n \n \n \n \n Save Session Settings\n \n
\n
\n\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n The fields below are under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Security Settings

\n

Configure security and authentication settings.

\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n

Leave empty to allow all IPs

\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderNotificationSettings(settings?: NotificationSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Notification Settings

\n

Configure how and when you receive notifications.

\n
\n \n
\n
\n
\n

Email Notifications

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Notification Preferences
\n

\n Critical system alerts will always be sent immediately regardless of your frequency setting.\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderStorageSettings(settings?: StorageSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Storage Settings

\n

Configure file storage and backup settings.

\n
\n \n
\n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Storage Status
\n

\n Current usage: 2.4 GB / 10 GB available\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderMigrationSettings(settings?: MigrationSettings): string {\n return `\n
\n
\n

Database Migrations

\n

View and manage database migrations to keep your schema up to date.

\n
\n \n \n
\n
\n
\n
\n

Total Migrations

\n

${settings?.totalMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Applied

\n

${settings?.appliedMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Pending

\n

${settings?.pendingMigrations || '0'}

\n
\n \n \n \n
\n
\n
\n\n \n
\n \n \n \n\n \n
\n\n \n
\n
\n

Migration History

\n

List of all available database migrations

\n
\n \n
\n
\n \n \n \n

Loading migration status...

\n
\n
\n
\n
\n\n \n `\n}\n\nfunction renderDatabaseToolsSettings(settings?: DatabaseToolsSettings): string {\n return `\n
\n
\n

Database Tools

\n

Manage database operations including backup, restore, and maintenance.

\n
\n\n \n
\n
\n
\n
\n

Total Tables

\n

${settings?.totalTables || '0'}

\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n
\n

Total Rows

\n

${settings?.totalRows?.toLocaleString() || '0'}

\n
\n
\n \n \n \n
\n
\n
\n
\n\n \n
\n \n
\n

Safe Operations

\n
\n \n \n \n \n Refresh Stats\n \n\n \n \n \n \n Create Backup\n \n\n \n \n \n \n Validate Database\n \n
\n
\n
\n\n \n
\n
\n

Database Tables

\n

Click on a table to view its data

\n
\n\n
\n
\n \n \n \n

Loading database statistics...

\n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

Danger Zone

\n

\n These operations are destructive and cannot be undone.\n Your admin account will be preserved, but all other data will be permanently deleted.\n

\n
\n \n \n \n \n Truncate All Data\n \n
\n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\n// import { html } from 'hono/html'\nimport { requireAuth } from '../middleware'\nimport { renderSettingsPage, SettingsPageData } from '../templates/pages/admin-settings.template'\nimport { MigrationService } from '../services/migrations'\nimport { SettingsService } from '../services/settings'\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminSettingsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminSettingsRoutes.use('*', requireAuth())\n\n// Helper function to get mock settings data\nfunction getMockSettings(user: any) {\n return {\n general: {\n siteName: 'SonicJS AI',\n siteDescription: 'A modern headless CMS powered by AI',\n adminEmail: user?.email || 'admin@example.com',\n timezone: 'UTC',\n language: 'en',\n maintenanceMode: false\n },\n appearance: {\n theme: 'dark' as const,\n primaryColor: '#465FFF',\n logoUrl: '',\n favicon: '',\n customCSS: ''\n },\n security: {\n twoFactorEnabled: false,\n sessionTimeout: 30,\n passwordRequirements: {\n minLength: 8,\n requireUppercase: true,\n requireNumbers: true,\n requireSymbols: false\n },\n ipWhitelist: []\n },\n notifications: {\n emailNotifications: true,\n contentUpdates: true,\n systemAlerts: true,\n userRegistrations: false,\n emailFrequency: 'immediate' as const\n },\n storage: {\n maxFileSize: 10,\n allowedFileTypes: ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'docx'],\n storageProvider: 'cloudflare' as const,\n backupFrequency: 'daily' as const,\n retentionPeriod: 30\n },\n migrations: {\n totalMigrations: 0,\n appliedMigrations: 0,\n pendingMigrations: 0,\n lastApplied: undefined,\n migrations: []\n },\n databaseTools: {\n totalTables: 0,\n totalRows: 0,\n lastBackup: undefined,\n databaseSize: '0 MB',\n tables: []\n }\n }\n}\n\n// Settings page (redirects to general settings)\nadminSettingsRoutes.get('/', (c) => {\n return c.redirect('/admin/settings/general')\n})\n\n// General settings\nadminSettingsRoutes.get('/general', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Get real general settings from database\n const generalSettings = await settingsService.getGeneralSettings(user?.email)\n\n const mockSettings = getMockSettings(user)\n mockSettings.general = generalSettings\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'general',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Appearance settings\nadminSettingsRoutes.get('/appearance', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'appearance',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Security settings\nadminSettingsRoutes.get('/security', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Load persisted security settings (JWT TTL + refresh grace)\n const persisted = await settingsService.getSecuritySettings()\n\n const mockSettings = getMockSettings(user)\n mockSettings.security = {\n ...mockSettings.security,\n jwtExpiresIn: persisted.jwtExpiresIn,\n jwtRefreshGraceSeconds: persisted.jwtRefreshGraceSeconds\n } as any\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'security',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Notifications settings\nadminSettingsRoutes.get('/notifications', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'notifications',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Storage settings\nadminSettingsRoutes.get('/storage', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'storage',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Migrations settings\nadminSettingsRoutes.get('/migrations', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'migrations',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Database tools settings\nadminSettingsRoutes.get('/database-tools', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'database-tools',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Get migration status\nadminSettingsRoutes.get('/api/migrations/status', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminSettingsRoutes.post('/api/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n return c.json({\n success: false,\n error: 'Failed to run migrations'\n }, 500)\n }\n})\n\n// Validate database schema\nadminSettingsRoutes.get('/api/migrations/validate', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\n// Get database tools stats\nadminSettingsRoutes.get('/api/database-tools/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get list of all tables\n const tablesQuery = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT LIKE '_cf_%'\n ORDER BY name\n `).all()\n\n const tables = tablesQuery.results || []\n let totalRows = 0\n\n // Get row count for each table\n const tableStats = await Promise.all(\n tables.map(async (table: any) => {\n try {\n const countResult = await db.prepare(`SELECT COUNT(*) as count FROM ${table.name}`).first()\n const rowCount = (countResult as any)?.count || 0\n totalRows += rowCount\n return {\n name: table.name,\n rowCount\n }\n } catch (error) {\n console.error(`Error counting rows in ${table.name}:`, error)\n return {\n name: table.name,\n rowCount: 0\n }\n }\n })\n )\n\n // D1 doesn't expose database size directly, so we'll estimate based on row counts\n // Average row size estimate: 1KB per row (rough approximation)\n const estimatedSizeBytes = totalRows * 1024\n const databaseSizeMB = (estimatedSizeBytes / (1024 * 1024)).toFixed(2)\n\n return c.json({\n success: true,\n data: {\n totalTables: tables.length,\n totalRows,\n databaseSize: `${databaseSizeMB} MB (estimated)`,\n tables: tableStats\n }\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch database statistics'\n }, 500)\n }\n})\n\n// Validate database\nadminSettingsRoutes.get('/api/database-tools/validate', async (c) => {\n try {\n const db = c.env.DB\n\n // Run PRAGMA integrity_check\n const integrityResult = await db.prepare('PRAGMA integrity_check').first()\n const isValid = (integrityResult as any)?.integrity_check === 'ok'\n\n return c.json({\n success: true,\n data: {\n valid: isValid,\n message: isValid ? 'Database integrity check passed' : 'Database integrity check failed'\n }\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n})\n\n// Backup database\nadminSettingsRoutes.post('/api/database-tools/backup', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n // TODO: Implement actual backup functionality\n // For now, return success message\n return c.json({\n success: true,\n message: 'Database backup feature coming soon. Use Cloudflare Dashboard for backups.'\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({\n success: false,\n error: 'Failed to create backup'\n }, 500)\n }\n})\n\n// Truncate tables\nadminSettingsRoutes.post('/api/database-tools/truncate', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const body = await c.req.json()\n const tablesToTruncate = body.tables || []\n\n if (!Array.isArray(tablesToTruncate) || tablesToTruncate.length === 0) {\n return c.json({\n success: false,\n error: 'No tables specified for truncation'\n }, 400)\n }\n\n const db = c.env.DB\n const results = []\n\n // Validate table names against actual database tables (prevents SQL injection)\n const tablesResult = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n `).all()\n const validTables = new Set(\n (tablesResult.results || []).map((row: any) => row.name)\n )\n\n for (const tableName of tablesToTruncate) {\n if (!validTables.has(tableName)) {\n results.push({ table: tableName, success: false, error: 'Table not found' })\n continue\n }\n try {\n await db.prepare(`DELETE FROM ${tableName}`).run()\n results.push({ table: tableName, success: true })\n } catch (error) {\n console.error(`Error truncating ${tableName}:`, error)\n results.push({ table: tableName, success: false, error: String(error) })\n }\n }\n\n return c.json({\n success: true,\n message: `Truncated ${results.filter(r => r.success).length} of ${tablesToTruncate.length} tables`,\n results\n })\n } catch (error) {\n console.error('Error truncating tables:', error)\n return c.json({\n success: false,\n error: 'Failed to truncate tables'\n }, 500)\n }\n})\n\n// Save general settings\nadminSettingsRoutes.post('/general', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Extract general settings from form data\n const settings = {\n siteName: formData.get('siteName') as string,\n siteDescription: formData.get('siteDescription') as string,\n adminEmail: formData.get('adminEmail') as string,\n timezone: formData.get('timezone') as string,\n language: formData.get('language') as string,\n maintenanceMode: formData.get('maintenanceMode') === 'true'\n }\n\n // Validate required fields\n if (!settings.siteName || !settings.siteDescription) {\n return c.json({\n success: false,\n error: 'Site name and description are required'\n }, 400)\n }\n\n // Save settings to database\n const success = await settingsService.saveGeneralSettings(settings)\n\n if (success) {\n return c.json({\n success: true,\n message: 'General settings saved successfully!'\n })\n } else {\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n }\n } catch (error) {\n console.error('Error saving general settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save security settings (JWT TTL + refresh grace)\nadminSettingsRoutes.post('/security', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n const jwtExpiresInRaw = (formData.get('jwtExpiresIn') as string | null)?.trim() || ''\n const graceRaw = (formData.get('jwtRefreshGraceSeconds') as string | null)?.trim() || ''\n\n // Validate jwtExpiresIn: bare seconds or \n if (!/^\\d+(?:s|m|h|d)?$/i.test(jwtExpiresInRaw)) {\n return c.json({\n success: false,\n error: 'JWT expiration must be a number optionally suffixed with s/m/h/d (e.g. 30d, 12h, 3600).'\n }, 400)\n }\n\n const graceSeconds = Number.parseInt(graceRaw, 10)\n if (!Number.isFinite(graceSeconds) || graceSeconds < 0 || graceSeconds > 60 * 60 * 24 * 90) {\n return c.json({\n success: false,\n error: 'Refresh grace must be an integer between 0 and 7776000 seconds (90 days).'\n }, 400)\n }\n\n const success = await settingsService.saveSecuritySettings({\n jwtExpiresIn: jwtExpiresInRaw,\n jwtRefreshGraceSeconds: graceSeconds\n })\n\n if (success) {\n return c.json({\n success: true,\n message: 'Security settings saved successfully!'\n })\n }\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n } catch (error) {\n console.error('Error saving security settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save settings (legacy endpoint - redirect to general)\nadminSettingsRoutes.post('/', async (c) => {\n return c.redirect('/admin/settings/general')\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n formattedDate: string\n}\n\nexport interface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormsListPage(data: FormsListPageData): string {\n const tableData: any = {\n tableId: 'forms-table',\n rowClickable: true,\n rowClickUrl: (form: Form) => `/admin/forms/${form.id}/builder`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => `\n
\n \n ${form.name}\n \n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'category',\n label: 'Category',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n const categoryColors: Record = {\n 'contact': 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 ring-blue-700/10 dark:ring-blue-400/20',\n 'survey': 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-300 ring-purple-700/10 dark:ring-purple-400/20',\n 'registration': 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-300 ring-green-700/10 dark:ring-green-400/20',\n 'feedback': 'bg-orange-50 dark:bg-orange-500/10 text-orange-700 dark:text-orange-300 ring-orange-700/10 dark:ring-orange-400/20',\n 'general': 'bg-gray-50 dark:bg-gray-500/10 text-gray-700 dark:text-gray-300 ring-gray-700/10 dark:ring-gray-400/20'\n }\n const colorClass = categoryColors[form.category] || categoryColors['general']\n return `\n \n ${form.category || 'general'}\n \n `\n }\n },\n {\n key: 'submission_count',\n label: 'Submissions',\n sortable: true,\n sortType: 'number',\n render: (_value: any, form: any) => {\n const count = form.submission_count || 0\n return `\n
\n \n ${count}\n \n
\n `\n }\n },\n {\n key: 'is_active',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n if (form.is_active) {\n return `\n \n Active\n \n `\n } else {\n return `\n \n Inactive\n \n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n render: (_value: any, form: any) => {\n if (!form || !form.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.forms,\n emptyMessage: 'No forms found. Create your first form to get started!'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Forms

\n

Create and manage forms with the visual form builder

\n
\n \n
\n\n \n
\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Forms
\n
${data.forms.length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Active Forms
\n
${data.forms.filter(f => f.is_active).length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Submissions
\n
${data.forms.reduce((sum, f) => sum + (f.submission_count || 0), 0)}
\n
\n
\n
\n
\n
\n\n \n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Filter\n \n ${data.search || data.category ? `\n \n Clear\n \n ` : ''}\n \n
\n\n \n
\n ${renderTable(tableData)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Forms',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface FormBuilderPageData {\n id: string\n name: string\n display_name: string\n description?: string\n category?: string\n formio_schema: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\n// Inline Turnstile component for Form.io builder\nfunction getTurnstileComponentScript(): string {\n return `\n (function() {\n 'use strict';\n\n if (!window.Formio || !window.Formio.Components) {\n console.error('Form.io library not loaded');\n return;\n }\n\n const FieldComponent = Formio.Components.components.field;\n\n class TurnstileComponent extends FieldComponent {\n static schema(...extend) {\n return FieldComponent.schema({\n type: 'turnstile',\n label: 'Turnstile Verification',\n key: 'turnstile',\n input: true,\n persistent: false,\n protected: true,\n unique: false,\n hidden: false,\n clearOnHide: true,\n tableView: false,\n validate: {\n required: false\n },\n siteKey: '',\n theme: 'auto',\n size: 'normal',\n action: '',\n appearance: 'always',\n errorMessage: 'Please complete the security verification'\n }, ...extend);\n }\n\n static get builderInfo() {\n return {\n title: 'Turnstile',\n group: 'premium',\n icon: 'fa fa-shield-alt',\n weight: 120,\n documentation: '/admin/forms/docs#turnstile',\n schema: TurnstileComponent.schema()\n };\n }\n\n constructor(component, options, data) {\n super(component, options, data);\n this.widgetId = null;\n this.scriptLoaded = false;\n }\n\n init() {\n super.init();\n // Only load script if NOT in builder/edit mode\n if (!this.options.editMode && !this.options.builder && !this.builderMode) {\n this.loadTurnstileScript();\n }\n }\n\n loadTurnstileScript() {\n // Extra safety: never load in builder\n if (this.options.editMode || this.options.builder || this.builderMode) {\n console.log('Turnstile: Skipping script load in builder mode');\n return Promise.resolve();\n }\n\n if (window.turnstile) {\n this.scriptLoaded = true;\n return Promise.resolve();\n }\n\n if (this.scriptPromise) {\n return this.scriptPromise;\n }\n\n console.log('Turnstile: Loading script for form mode');\n this.scriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js';\n script.async = true;\n script.defer = true;\n script.onload = () => {\n this.scriptLoaded = true;\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Turnstile'));\n document.head.appendChild(script);\n });\n\n return this.scriptPromise;\n }\n\n render() {\n return super.render(\\`\n
\n
\n \\${this.component.description ? \\`
\\${this.component.description}
\\` : ''}\n
\n \\`);\n }\n\n attach(element) {\n this.loadRefs(element, {\n turnstileContainer: 'single',\n turnstileWidget: 'single'\n });\n\n const superAttach = super.attach(element);\n\n // Check if we're in builder mode or form mode\n if (this.options.editMode || this.options.builder) {\n // Builder mode - show placeholder only\n this.renderPlaceholder();\n } else {\n // Form mode - render actual widget\n this.loadTurnstileScript()\n .then(() => this.renderWidget())\n .catch(err => {\n console.error('Failed to load Turnstile:', err);\n if (this.refs.turnstileWidget) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to load security verification\n
\n \\`;\n }\n });\n }\n\n return superAttach;\n }\n\n renderPlaceholder() {\n if (!this.refs.turnstileWidget) {\n return;\n }\n \n this.refs.turnstileWidget.innerHTML = \\`\n
\n
🛡️
\n
Turnstile Verification
\n
CAPTCHA-free bot protection by Cloudflare
\n
Widget will appear here on the live form
\n
\n \\`;\n }\n\n renderWidget() {\n if (!this.refs.turnstileWidget || !window.turnstile) {\n return;\n }\n\n this.refs.turnstileWidget.innerHTML = '';\n\n const siteKey = this.component.siteKey || \n (this.root && this.root.options && this.root.options.turnstileSiteKey) || \n '';\n \n if (!siteKey) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n ⚠️ Configuration Required: Turnstile site key not configured. \n Please enable the Turnstile plugin in Settings → Plugins.\n
\n \\`;\n return;\n }\n\n try {\n const self = this;\n this.widgetId = window.turnstile.render(this.refs.turnstileWidget, {\n sitekey: siteKey,\n theme: this.component.theme || 'auto',\n size: this.component.size || 'normal',\n action: this.component.action || '',\n appearance: this.component.appearance || 'always',\n callback: function(token) {\n self.updateValue(token);\n self.triggerChange();\n },\n 'error-callback': function() {\n self.updateValue(null);\n self.setCustomValidity(self.component.errorMessage || 'Security verification failed');\n },\n 'expired-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification expired. Please verify again.');\n },\n 'timeout-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification timed out. Please try again.');\n }\n });\n } catch (err) {\n console.error('Failed to render Turnstile widget:', err);\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to render security verification\n
\n \\`;\n }\n }\n\n detach() {\n if (this.widgetId !== null && window.turnstile) {\n try {\n window.turnstile.remove(this.widgetId);\n this.widgetId = null;\n } catch (err) {\n console.error('Failed to remove Turnstile widget:', err);\n }\n }\n return super.detach();\n }\n\n getValue() {\n if (this.widgetId !== null && window.turnstile) {\n return window.turnstile.getResponse(this.widgetId);\n }\n return this.dataValue;\n }\n\n setValue(value, flags) {\n const changed = super.setValue(value, flags);\n return changed;\n }\n\n getValueAsString(value) {\n return value ? '✅ Verified' : '❌ Not Verified';\n }\n\n isEmpty(value) {\n return !value;\n }\n\n updateValue(value, flags) {\n const changed = super.updateValue(value, flags);\n \n if (value) {\n this.setCustomValidity('');\n }\n \n return changed;\n }\n\n checkValidity(data, dirty, row) {\n const result = super.checkValidity(data, dirty, row);\n \n if (this.component.validate && this.component.validate.required) {\n const value = this.getValue();\n if (!value) {\n this.setCustomValidity(this.component.errorMessage || 'Please complete the security verification');\n return false;\n }\n }\n \n return result;\n }\n }\n\n Formio.Components.addComponent('turnstile', TurnstileComponent);\n console.log('✅ Turnstile component registered with Form.io');\n window.TurnstileComponent = TurnstileComponent;\n })();\n `;\n}\n\nexport function renderFormBuilderPage(data: FormBuilderPageData): string {\n const formioSchema = data.formio_schema || { components: [] }\n const settings = data.settings || {}\n const googleMapsApiKey = data.google_maps_api_key || ''\n const turnstileSiteKey = data.turnstile_site_key || ''\n\n const pageContent = `\n \n\n
\n \n
\n
\n
\n \n \n \n \n \n
\n

\n Form Builder: ${data.display_name}\n

\n

\n \n ${data.name}\n \n

\n
\n
\n\n \n
\n \n \n \n \n \n Preview\n \n\n \n \n \n \n Save Form\n \n\n \n \n \n \n View Public Form\n \n\n \n \n \n \n View Submissions\n \n
\n
\n
\n\n \n
\n \n
\n \n \n \n \n Single Page\n \n \n \n \n \n Multi-Page Wizard\n \n
\n \n 💡 Use Panel components (Layout tab) for each page\n \n
\n\n \n
\n\n \n
\n
\n \n \n \n \n

Loading Form Builder...

\n
\n
\n\n \n
\n\n \n
\n
\n
\n

Form Preview

\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n\n \n \n\n \n\n \n \n \n \n \n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Form Builder: ${data.display_name}`,\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm } from '../components/form.template'\n\nexport interface FormCreatePageData {\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormCreatePage(data: FormCreatePageData): string {\n const pageContent = `\n
\n \n
\n
\n \n \n \n \n \n
\n

Create New Form

\n

Enter basic information to create your form. You'll be able to add fields in the builder.

\n
\n
\n
\n\n \n ${data.error ? `\n
\n
\n \n \n \n

${data.error}

\n
\n
\n ` : ''}\n\n ${data.success ? `\n
\n
\n \n \n \n

${data.success}

\n
\n
\n ` : ''}\n\n \n
\n
\n \n
\n \n
\n \n \n

\n Lowercase letters, numbers, and underscores only. Used in URLs and API.\n

\n
\n\n \n
\n \n \n

\n Human-readable name shown in the admin interface.\n

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n \n \n \n \n \n \n

\n Helps organize forms in the admin panel.\n

\n
\n
\n\n \n
\n \n Cancel\n \n \n \n \n \n Create & Open Builder\n \n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

What happens next?

\n
\n

After creating your form, you'll be taken to the Form Builder where you can:

\n
    \n
  • Drag and drop fields onto your form
  • \n
  • Configure field properties and validation
  • \n
  • Add conditional logic
  • \n
  • Preview your form in real-time
  • \n
  • Publish when ready
  • \n
\n
\n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create Form',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderFormsListPage } from '../templates/pages/admin-forms-list.template'\nimport { renderFormBuilderPage, type FormBuilderPageData } from '../templates/pages/admin-forms-builder.template'\nimport { renderFormCreatePage } from '../templates/pages/admin-forms-create.template'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\n\n// Type definitions for forms\ninterface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n updated_at: number\n formattedDate: string\n}\n\ninterface FormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n category?: string\n formio_schema?: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ninterface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminFormsRoutes.use('*', requireAuth())\n\n// Forms management - List all forms\nadminFormsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const category = c.req.query('category') || ''\n\n // Build query\n let query = 'SELECT * FROM forms WHERE 1=1'\n const params: string[] = []\n\n if (search) {\n query += ' AND (name LIKE ? OR display_name LIKE ?)'\n params.push(`%${search}%`, `%${search}%`)\n }\n\n if (category) {\n query += ' AND category = ?'\n params.push(category)\n }\n\n query += ' ORDER BY created_at DESC'\n\n const result = await db.prepare(query).bind(...params).all()\n\n // Format dates\n const forms = result.results.map((form: any) => ({\n ...form,\n formattedDate: new Date(form.created_at).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n }))\n\n const pageData: FormsListPageData = {\n forms,\n search,\n category,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsListPage(pageData))\n } catch (error: any) {\n console.error('Error listing forms:', error)\n return c.html('

Error loading forms

', 500)\n }\n})\n\n// Show create form page\nadminFormsRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n\n const pageData: FormData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormCreatePage(pageData))\n } catch (error: any) {\n console.error('Error showing create form page:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Show docs page\nadminFormsRoutes.get('/docs', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsDocsPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsDocsPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms docs page:', error)\n return c.html('

Error loading documentation

', 500)\n }\n})\n\n// Show examples page\nadminFormsRoutes.get('/examples', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsExamplesPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsExamplesPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms examples page:', error)\n return c.html('

Error loading examples

', 500)\n }\n})\n\n// Create new form\nadminFormsRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const name = body.name as string\n const displayName = body.displayName as string\n const description = (body.description as string) || ''\n const category = (body.category as string) || 'general'\n\n // Validate required fields\n if (!name || !displayName) {\n return c.json({ error: 'Name and display name are required' }, 400)\n }\n\n // Validate name format (lowercase, numbers, underscores only)\n if (!/^[a-z0-9_]+$/.test(name)) {\n return c.json({ \n error: 'Form name must contain only lowercase letters, numbers, and underscores' \n }, 400)\n }\n\n // Check for duplicate name\n const existing = await db.prepare('SELECT id FROM forms WHERE name = ?')\n .bind(name)\n .first()\n\n if (existing) {\n return c.json({ error: 'A form with this name already exists' }, 400)\n }\n\n // Create form with empty schema\n const formId = crypto.randomUUID()\n const now = Date.now()\n const emptySchema = { components: [] } // Empty Form.io schema\n\n await db.prepare(`\n INSERT INTO forms (\n id, name, display_name, description, category,\n formio_schema, settings, is_active, is_public,\n created_by, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n formId,\n name,\n displayName,\n description,\n category,\n JSON.stringify(emptySchema),\n JSON.stringify({\n submitButtonText: 'Submit',\n successMessage: 'Thank you for your submission!',\n requireAuth: false,\n emailNotifications: false\n }),\n 1, // is_active\n 1, // is_public\n user?.userId || null,\n now,\n now\n ).run()\n\n // Redirect to builder\n return c.redirect(`/admin/forms/${formId}/builder`)\n } catch (error: any) {\n console.error('Error creating form:', error)\n return c.json({ error: 'Failed to create form' }, 500)\n }\n})\n\n// Show form builder\nadminFormsRoutes.get('/:id/builder', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get Turnstile configuration\n const turnstileService = new TurnstileService(db)\n const turnstileSettings = await turnstileService.getSettings()\n\n const pageData: FormData = {\n id: form.id as string,\n name: form.name as string,\n display_name: form.display_name as string,\n description: form.description as string | undefined,\n category: form.category as string,\n formio_schema: form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] },\n settings: form.settings ? JSON.parse(form.settings as string) : {},\n is_active: Boolean(form.is_active),\n is_public: Boolean(form.is_public),\n google_maps_api_key: googleMapsApiKey,\n turnstile_site_key: turnstileSettings?.siteKey || '',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormBuilderPage(pageData as FormBuilderPageData))\n } catch (error: any) {\n console.error('Error showing form builder:', error)\n return c.html('

Error loading form builder

', 500)\n }\n})\n\n// Update form (save schema)\nadminFormsRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const body = await c.req.json()\n\n // Check if form exists\n const form = await db.prepare('SELECT id FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const now = Date.now()\n\n // Update form\n await db.prepare(`\n UPDATE forms \n SET formio_schema = ?, \n updated_by = ?, \n updated_at = ?\n WHERE id = ?\n `).bind(\n JSON.stringify(body.formio_schema),\n user?.userId || null,\n now,\n formId\n ).run()\n\n return c.json({ success: true, message: 'Form saved successfully' })\n } catch (error: any) {\n console.error('Error updating form:', error)\n return c.json({ error: 'Failed to save form' }, 500)\n }\n})\n\n// Delete form\nadminFormsRoutes.delete('/:id', async (c) => {\n try {\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Check if form exists\n const form = await db.prepare('SELECT id, submission_count FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Warn if form has submissions\n const submissionCount = form.submission_count as number || 0\n if (submissionCount > 0) {\n return c.json({ \n error: `Cannot delete form with ${submissionCount} submissions. Archive it instead.` \n }, 400)\n }\n\n // Delete form (cascade will delete submissions and files)\n await db.prepare('DELETE FROM forms WHERE id = ?').bind(formId).run()\n\n return c.json({ success: true, message: 'Form deleted successfully' })\n } catch (error: any) {\n console.error('Error deleting form:', error)\n return c.json({ error: 'Failed to delete form' }, 500)\n }\n})\n\n// View form submissions\nadminFormsRoutes.get('/:id/submissions', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get submissions\n const submissions = await db.prepare(\n 'SELECT * FROM form_submissions WHERE form_id = ? ORDER BY submitted_at DESC'\n ).bind(formId).all()\n\n // Simple submissions page for now\n const html = `\n \n \n \n Submissions - ${form.display_name}\n \n \n \n ← Back to Forms\n

Submissions: ${form.display_name}

\n

Total submissions: ${submissions.results.length}

\n ${submissions.results.length > 0 ? `\n \n \n \n \n \n \n \n \n \n ${submissions.results.map((sub: any) => `\n \n \n \n \n \n `).join('')}\n \n
IDSubmittedData
${sub.id.substring(0, 8)}${new Date(sub.submitted_at).toLocaleString()}
${JSON.stringify(JSON.parse(sub.submission_data), null, 2)}
\n ` : '

No submissions yet.

'}\n \n \n `\n \n return c.html(html)\n } catch (error: any) {\n console.error('Error loading submissions:', error)\n return c.html('

Error loading submissions

', 500)\n }\n})\n\nexport default adminFormsRoutes\n","import { Hono } from 'hono'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { createContentFromSubmission } from '../services/form-collection-sync'\n\n/**\n * Recursively sanitize all string values in arbitrary JSON data.\n * HTML-encodes entities (e.g., < becomes <) to prevent stored XSS\n * when form submission data is rendered in admin templates.\n */\nfunction sanitizeDeep(value: unknown): unknown {\n if (typeof value === 'string') {\n return sanitizeInput(value)\n }\n if (Array.isArray(value)) {\n return value.map(sanitizeDeep)\n }\n if (value !== null && typeof value === 'object') {\n const result: Record = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = sanitizeDeep(v)\n }\n return result\n }\n return value // numbers, booleans, null pass through\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const publicFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Get Turnstile configuration for a form (for headless frontends)\npublicFormsRoutes.get('/:identifier/turnstile-config', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form\n const form = await db.prepare(\n 'SELECT id, turnstile_enabled, turnstile_settings FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const turnstileService = new TurnstileService(db)\n const globalSettings = await turnstileService.getSettings()\n \n const formSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string)\n : { inherit: true }\n\n // Determine effective settings\n const enabled = form.turnstile_enabled === 1 || \n (formSettings.inherit && globalSettings?.enabled)\n\n if (!enabled || !globalSettings) {\n return c.json({ enabled: false })\n }\n\n return c.json({\n enabled: true,\n siteKey: formSettings.siteKey || globalSettings.siteKey,\n theme: formSettings.theme || globalSettings.theme || 'auto',\n size: formSettings.size || globalSettings.size || 'normal',\n mode: formSettings.mode || globalSettings.mode || 'managed',\n appearance: formSettings.appearance || globalSettings.appearance || 'always'\n })\n } catch (error: any) {\n console.error('Error fetching Turnstile config:', error)\n return c.json({ error: 'Failed to fetch config' }, 500)\n }\n})\n\n// Get form schema as JSON (for headless frontends)\npublicFormsRoutes.get('/:identifier/schema', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT id, name, display_name, description, category, formio_schema, settings, is_active, is_public FROM forms WHERE (id = ? OR name = ?) AND is_active = 1 AND is_public = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n return c.json({\n id: form.id,\n name: form.name,\n displayName: form.display_name,\n description: form.description,\n category: form.category,\n schema: formioSchema,\n settings: settings,\n submitUrl: `/api/forms/${form.id}/submit`\n })\n } catch (error: any) {\n console.error('Error fetching form schema:', error)\n return c.json({ error: 'Failed to fetch form schema' }, 500)\n }\n})\n\n// Render public form by name\npublicFormsRoutes.get('/:name', async (c) => {\n try {\n const db = c.env.DB\n const formName = c.req.param('name')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form by name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE name = ? AND is_active = 1 AND is_public = 1'\n ).bind(formName).first()\n\n if (!form) {\n return c.html('

Form not found

This form does not exist or is not publicly available.

', 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n const html = `\n \n \n \n \n \n ${form.display_name}\n \n \n \n \n \n \n \n
\n

${form.display_name}

\n ${form.description ? `

${form.description}

` : ''}\n \n
\n \n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n `\n\n return c.html(html)\n } catch (error: any) {\n console.error('Error rendering form:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Handle form submission (accepts either name or ID)\npublicFormsRoutes.post('/:identifier/submit', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n const body = await c.req.json()\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Check if Turnstile is enabled for this form\n const turnstileEnabled = form.turnstile_enabled === 1\n const turnstileSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string) \n : { inherit: true }\n\n // Validate Turnstile if enabled (or inheriting global settings)\n if (turnstileEnabled || turnstileSettings.inherit) {\n const turnstileService = new TurnstileService(db)\n \n // Check if Turnstile is globally enabled\n const globalEnabled = await turnstileService.isEnabled()\n \n if (globalEnabled || turnstileEnabled) {\n // Extract Turnstile token from submission data\n const turnstileToken = body.data?.turnstile || body.turnstile\n \n if (!turnstileToken) {\n return c.json({ \n error: 'Turnstile verification required. Please complete the security check.',\n code: 'TURNSTILE_MISSING'\n }, 400)\n }\n\n // Verify the token\n const clientIp = c.req.header('cf-connecting-ip')\n const verification = await turnstileService.verifyToken(turnstileToken, clientIp)\n \n if (!verification.success) {\n return c.json({ \n error: verification.error || 'Security verification failed. Please try again.',\n code: 'TURNSTILE_INVALID'\n }, 403)\n }\n\n // Remove Turnstile token from submission data before storing\n if (body.data?.turnstile) {\n delete body.data.turnstile\n }\n }\n }\n\n // Sanitize all string values in submission data to prevent stored XSS.\n // HTML-encodes entities (e.g., < becomes <) before storage.\n const sanitizedData = sanitizeDeep(body.data) as Record\n\n // Create submission\n const submissionId = crypto.randomUUID()\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO form_submissions (\n id, form_id, submission_data, user_id, ip_address, user_agent,\n submitted_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n submissionId,\n form.id,\n JSON.stringify(sanitizedData),\n null, // user_id (for authenticated users)\n c.req.header('cf-connecting-ip') || null,\n c.req.header('user-agent') || null,\n now,\n now\n ).run()\n\n // Update submission count\n await db.prepare(`\n UPDATE forms\n SET submission_count = submission_count + 1,\n updated_at = ?\n WHERE id = ?\n `).bind(now, form.id).run()\n\n // Dual-write: create content item for this submission\n let contentId: string | null = null\n try {\n contentId = await createContentFromSubmission(\n db,\n sanitizedData as Record,\n { id: form.id as string, name: form.name as string, display_name: form.display_name as string },\n submissionId,\n {\n ipAddress: c.req.header('cf-connecting-ip') || null,\n userAgent: c.req.header('user-agent') || null,\n userEmail: (sanitizedData as any)?.email || null,\n userId: null // anonymous submission\n }\n )\n if (!contentId) {\n console.warn('[FormSubmit] Content creation returned null for submission:', submissionId)\n }\n } catch (contentError) {\n // Don't fail the submission if content creation fails\n console.error('[FormSubmit] Error creating content from submission:', contentError)\n }\n\n return c.json({\n success: true,\n submissionId,\n contentId,\n message: 'Form submitted successfully'\n })\n } catch (error: any) {\n console.error('Error submitting form:', error)\n return c.json({ error: 'Failed to submit form' }, 500)\n }\n})\n\nexport default publicFormsRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { CATEGORY_INFO } from '../../services/route-metadata'\n\nexport interface APIEndpoint {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented?: boolean\n}\n\nexport interface APIReferencePageData {\n endpoints: APIEndpoint[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nfunction renderAuthBadge(auth: boolean | 'unknown'): string {\n if (auth === true) {\n return `\n \n \n \n \n Auth\n `\n }\n if (auth === false) {\n return `\n \n \n \n \n Public\n `\n }\n // unknown\n return `\n \n \n \n \n Unknown\n `\n}\n\nexport function renderAPIReferencePage(data: APIReferencePageData): string {\n // Group endpoints by category\n const endpointsByCategory = data.endpoints.reduce((acc, endpoint) => {\n if (!acc[endpoint.category]) {\n acc[endpoint.category] = []\n }\n acc[endpoint.category]!.push(endpoint)\n return acc\n }, {} as Record)\n\n // Get unique categories from actual data\n const categories = Object.keys(endpointsByCategory)\n\n // Count stats\n const totalEndpoints = data.endpoints.length\n const publicEndpoints = data.endpoints.filter(e => e.authentication === false).length\n const protectedEndpoints = data.endpoints.filter(e => e.authentication === true).length\n const undocumentedCount = data.endpoints.filter(e => e.documented === false).length\n\n const pageContent = `\n
\n \n
\n
\n

API Reference

\n

Auto-discovered documentation of all registered API endpoints

\n
\n \n
\n\n \n
\n
\n
Total Endpoints
\n
\n ${totalEndpoints}\n
\n
\n
\n
Public Endpoints
\n
\n ${publicEndpoints}\n
\n
\n
\n
Protected Endpoints
\n
\n ${protectedEndpoints}\n
\n
\n
\n
Categories
\n
\n ${categories.length}\n
\n
\n
\n
Undocumented
\n
\n 0 ? 'text-zinc-400 dark:text-zinc-500' : 'text-lime-600 dark:text-lime-400'}\">${undocumentedCount}\n
\n
\n
\n\n \n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n \n \n ${categories.map(category => {\n const info = CATEGORY_INFO[category]\n const title = info ? info.title : category\n return ``\n }).join('\\n ')}\n \n \n \n \n
\n
\n
\n
\n
\n\n \n
\n ${Object.entries(endpointsByCategory).map(([category, endpoints]) => {\n const info = CATEGORY_INFO[category] || { title: category, description: '', icon: '📋' }\n return `\n
\n
\n \n
\n
\n ${info.icon}\n
\n

${info.title}

\n

${info.description}

\n
\n
\n \n ${endpoints.length} endpoint${endpoints.length !== 1 ? 's' : ''}\n \n
\n
\n
\n\n \n
\n ${endpoints.map(endpoint => `\n
\n
\n \n ${endpoint.method}\n \n
\n
\n ${endpoint.path}\n ${renderAuthBadge(endpoint.authentication)}\n ${endpoint.documented === false ? `\n \n Auto-discovered\n \n ` : ''}\n
\n

${endpoint.description || 'No description available'}

\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n }).join('')}\n
\n\n \n
\n \n \n \n

No endpoints found

\n

Try adjusting your search or filter criteria

\n
\n
\n\n \n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'API Reference',\n pageTitle: 'API Reference',\n currentPath: '/admin/api-reference',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","/**\n * Admin API Reference Routes\n *\n * Provides the API Reference page for the admin dashboard.\n * Uses auto-discovery via Hono's inspectRoutes() to always show\n * the complete list of registered API endpoints.\n */\n\nimport { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderAPIReferencePage,\n type APIReferencePageData\n} from '../templates/pages/admin-api-reference.template'\nimport { getCoreVersion } from '../utils/version'\nimport { buildRouteList, getAppInstance } from '../services/route-metadata'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin/api-reference - API Reference Page\n *\n * Auto-discovers all registered routes using Hono's inspectRoutes()\n * and enriches them with metadata from the route-metadata registry.\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const app = getAppInstance()\n const endpoints = buildRouteList(app)\n\n const pageData: APIReferencePageData = {\n endpoints,\n user: user ? {\n name: user.email.split('@')[0] || user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n } catch (error) {\n console.error('API Reference page error:', error)\n\n const pageData: APIReferencePageData = {\n endpoints: [],\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n }\n})\n\nexport { router as adminApiReferenceRoutes }\n","/**\n * Routes Module Exports\n *\n * Routes are being migrated incrementally from the monolith.\n * Each route is refactored to remove monolith-specific dependencies.\n */\n\n// API routes\nexport { default as apiRoutes } from './api'\nexport { default as apiContentCrudRoutes } from './api-content-crud'\nexport { default as apiMediaRoutes } from './api-media'\nexport { default as apiSystemRoutes } from './api-system'\nexport { default as adminApiRoutes } from './admin-api'\n\n// Auth routes\nexport { default as authRoutes } from './auth'\n\n// Test routes (only for development/test environments)\nexport { default as testCleanupRoutes } from './test-cleanup'\n\n// Admin UI routes\nexport { default as adminContentRoutes } from './admin-content'\nexport { userRoutes as adminUsersRoutes } from './admin-users'\nexport { adminMediaRoutes } from './admin-media'\nexport { adminPluginRoutes } from './admin-plugins'\nexport { adminLogsRoutes } from './admin-logs'\nexport { adminDesignRoutes } from './admin-design'\nexport { adminCheckboxRoutes } from './admin-checkboxes'\nexport { default as adminTestimonialsRoutes } from './admin-testimonials'\nexport { default as adminCodeExamplesRoutes } from './admin-code-examples'\nexport { adminDashboardRoutes } from './admin-dashboard'\nexport { adminCollectionsRoutes } from './admin-collections'\nexport { adminSettingsRoutes } from './admin-settings'\nexport { adminFormsRoutes } from './admin-forms'\nexport { default as publicFormsRoutes } from './public-forms'\nexport { adminApiReferenceRoutes } from './admin-api-reference'\n\nexport const ROUTES_INFO = {\n message: 'Core routes available',\n available: [\n 'apiRoutes',\n 'apiContentCrudRoutes',\n 'apiMediaRoutes',\n 'apiSystemRoutes',\n 'adminApiRoutes',\n 'authRoutes',\n 'testCleanupRoutes',\n 'adminContentRoutes',\n 'adminUsersRoutes',\n 'adminMediaRoutes',\n 'adminPluginRoutes',\n 'adminLogsRoutes',\n 'adminDesignRoutes',\n 'adminCheckboxRoutes',\n 'adminTestimonialsRoutes',\n 'adminCodeExamplesRoutes',\n 'adminDashboardRoutes',\n 'adminCollectionsRoutes',\n 'adminSettingsRoutes',\n 'adminFormsRoutes',\n 'publicFormsRoutes',\n 'adminApiReferenceRoutes'\n ],\n status: 'Core package routes ready',\n reference: 'https://github.com/sonicjs/sonicjs'\n} as const\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-M2PKQJ6J.js.map b/packages/core/dist/chunk-M2PKQJ6J.js.map deleted file mode 100644 index b31b11a45..000000000 --- a/packages/core/dist/chunk-M2PKQJ6J.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/schemas/index.ts","../src/routes/api-content-access-policy.ts","../src/plugins/core-plugins/global-variables-plugin/variable-resolver.ts","../src/routes/api-content-crud.ts","../src/routes/api.ts","../src/routes/api-media.ts","../src/routes/api-system.ts","../src/routes/admin-api.ts","../src/templates/pages/auth-login.template.ts","../src/templates/pages/auth-register.template.ts","../src/services/auth-validation.ts","../src/plugins/core-plugins/user-profiles/user-profile-registry.ts","../src/plugins/core-plugins/user-profiles/user-profile-service.ts","../src/templates/components/drag-sortable.template.ts","../src/templates/components/dynamic-field.template.ts","../src/plugins/core-plugins/user-profiles/user-profile-renderer.ts","../src/plugins/core-plugins/user-profiles/index.ts","../src/routes/auth.ts","../src/routes/test-cleanup.ts","../src/middleware/plugin-middleware.ts","../src/templates/components/version-history.template.ts","../src/plugins/available/easy-mdx/index.ts","../src/plugins/available/tinymce-plugin/index.ts","../src/plugins/core-plugins/quill-editor/index.ts","../src/templates/pages/admin-content-form.template.ts","../src/templates/pages/admin-content-list.template.ts","../src/routes/admin-content-field-types.ts","../src/routes/admin-content.ts","../src/templates/pages/admin-profile.template.ts","../src/templates/components/alert.template.ts","../src/templates/pages/admin-activity-logs.template.ts","../src/templates/pages/admin-user-edit.template.ts","../src/templates/components/confirmation-dialog.template.ts","../src/templates/pages/admin-user-new.template.ts","../src/templates/pages/admin-users-list.template.ts","../src/routes/admin-users.ts","../src/templates/components/media-grid.template.ts","../src/templates/pages/admin-media-library.template.ts","../src/templates/components/media-file-details.template.ts","../src/routes/admin-media.ts","../src/templates/pages/admin-plugins-list.template.ts","../src/templates/components/auth-settings-form.template.ts","../src/templates/pages/admin-plugin-settings.template.ts","../src/routes/admin-plugins.ts","../src/templates/pages/admin-logs-list.template.ts","../src/templates/pages/admin-log-details.template.ts","../src/templates/pages/admin-log-config.template.ts","../src/routes/admin-logs.ts","../src/routes/admin-design.ts","../src/routes/admin-checkboxes.ts","../src/templates/pages/admin-testimonials-form.template.ts","../src/routes/admin-testimonials.ts","../src/templates/pages/admin-code-examples-form.template.ts","../src/routes/admin-code-examples.ts","../src/templates/pages/admin-dashboard.template.ts","../src/routes/admin-dashboard.ts","../src/routes/admin-collections-field-types.ts","../src/templates/pages/admin-collections-list.template.ts","../src/templates/components/table.template.ts","../src/templates/pages/admin-collections-form.template.ts","../src/routes/admin-collections.ts","../src/templates/pages/admin-settings.template.ts","../src/routes/admin-settings.ts","../src/templates/pages/admin-forms-list.template.ts","../src/templates/pages/admin-forms-builder.template.ts","../src/templates/pages/admin-forms-create.template.ts","../src/routes/admin-forms.ts","../src/routes/public-forms.ts","../src/templates/pages/admin-api-reference.template.ts","../src/routes/admin-api-reference.ts","../src/routes/index.ts"],"names":["Hono","builder","z","MigrationService","raw","escapeHtml","checked","error","passwordHash","c","isPluginActive","db","collection","formData","tinymcePlugin","html","renderAlert","renderConfirmationDialog","getConfirmationDialogScript","fileValidationSchema","getImageDimensions","getJPEGDimensions","getPNGDimensions","renderTable","tinymceActive","quillActive","mdxeditorActive","result","VERSION","router","app"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;A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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,IAAA,EAwW/BV,yBAAAA,CAAyB;AAAA,IACzB,EAAA,EAAI,wBAAA;AAAA,IACJ,KAAA,EAAO,gBAAA;AAAA,IACP,OAAA,EAAS,gFAAA;AAAA,IACT,WAAA,EAAa,gBAAA;AAAA,IACb,UAAA,EAAY,QAAA;AAAA,IACZ,SAAA,EAAW,MAAA;AAAA,IACX,YAAA,EAAc,+BAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACZ,CAAC;;AAAA,IAAA,EAEAC,8BAA6B;AAAA,EAAA,CAAA;AAGjC,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,UAAA;AAAA,IACP,SAAA,EAAW,UAAA;AAAA,IACX,WAAA,EAAa,iBAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,OAAO,0BAA0B,UAAU,CAAA;AAC7C;AAEA,SAAS,eAAA,CAAgB,KAAA,EAAe,KAAA,EAAe,QAAA,EAAkB,SAAA,EAA2B;AAClG,EAAA,MAAM,WAAW,SAAA,KAAc,KAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,uHAAA;AACpB,EAAA,MAAM,aAAA,GAAgB,WAClB,iEAAA,GACA,mJAAA;AAEJ,EAAA,OAAO;AAAA;AAAA,4BAAA,EAEqB,KAAK,CAAA;AAAA,gBAAA,EACjB,KAAK,CAAA;AAAA,aAAA,EACR,WAAW,IAAI,aAAa,CAAA;AAAA;AAAA;AAAA,iFAAA,EAGwC,QAAQ,CAAA;AAAA;AAAA,YAAA,EAE7E,KAAK,CAAA;AAAA;AAAA,EAAA,CAAA;AAGnB;AAEA,SAAS,gBAAA,CAAiB,WAAmB,QAAA,EAAiD;AAC5F,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,SAAA;AACH,MAAA,OAAO,qBAAA,CAAsB,UAAU,OAAO,CAAA;AAAA,IAChD,KAAK,YAAA;AACH,MAAA,OAAO,wBAAA,CAAyB,UAAU,UAAU,CAAA;AAAA,IACtD,KAAK,UAAA;AACH,MAAA,OAAO,sBAAA,CAAuB,UAAU,QAAQ,CAAA;AAAA,IAClD,KAAK,eAAA;AACH,MAAA,OAAO,0BAAA,CAA2B,UAAU,aAAa,CAAA;AAAA,IAC3D,KAAK,SAAA;AACH,MAAA,OAAO,qBAAA,CAAsB,UAAU,OAAO,CAAA;AAAA,IAChD,KAAK,YAAA;AACH,MAAA,OAAO,uBAAA,CAAwB,UAAU,UAAU,CAAA;AAAA,IACrD,KAAK,gBAAA;AACH,MAAA,OAAO,2BAAA,CAA4B,UAAU,aAAa,CAAA;AAAA,IAC5D;AACE,MAAA,OAAO,qBAAA,CAAsB,UAAU,OAAO,CAAA;AAAA;AAEpD;AAEA,SAAS,sBAAsB,QAAA,EAAoC;AACjE,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAcc,QAAA,EAAU,YAAY,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAWlC,QAAA,EAAU,cAAc,mBAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,EAY9B,QAAA,EAAU,QAAA,KAAa,KAAA,GAAQ,UAAA,GAAa,EAAE,CAAA;AAAA,+CAAA,EACjC,QAAA,EAAU,QAAA,KAAa,kBAAA,GAAqB,UAAA,GAAa,EAAE,CAAA;AAAA,8CAAA,EAC5D,QAAA,EAAU,QAAA,KAAa,iBAAA,GAAoB,UAAA,GAAa,EAAE,CAAA;AAAA,6CAAA,EAC3D,QAAA,EAAU,QAAA,KAAa,gBAAA,GAAmB,UAAA,GAAa,EAAE,CAAA;AAAA,kDAAA,EACpD,QAAA,EAAU,QAAA,KAAa,qBAAA,GAAwB,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAanG,QAAA,EAAU,mBAAmB,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAA,EASX,QAAA,EAAU,QAAA,KAAa,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EAC7C,QAAA,EAAU,QAAA,KAAa,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EAC7C,QAAA,EAAU,QAAA,KAAa,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EAC7C,QAAA,EAAU,QAAA,KAAa,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAW5D,QAAA,EAAU,eAAA,GAAkB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAgC9D;AAEA,SAAS,yBAAyB,QAAA,EAAuC;AACvE,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAgCW,QAAA,EAAU,KAAA,KAAU,OAAA,GAAU,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAU5C,UAAU,KAAA,KAAU,MAAA,IAAU,CAAC,QAAA,EAAU,KAAA,GAAQ,YAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAU/D,QAAA,EAAU,KAAA,KAAU,MAAA,GAAS,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EActC,QAAA,EAAU,gBAAgB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAKnC,QAAA,EAAU,gBAAgB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAYrC,QAAA,EAAU,WAAW,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAavB,QAAA,EAAU,WAAW,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAa/B,QAAA,EAAU,aAAa,EAAE,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAmBxC;AAEA,SAAS,uBAAuB,QAAA,EAAqC;AACnE,EAAA,MAAM,YAAA,GAAe,UAAU,YAAA,IAAgB,KAAA;AAC/C,EAAA,MAAM,sBAAA,GACJ,OAAO,QAAA,EAAU,sBAAA,KAA2B,WACxC,QAAA,CAAS,sBAAA,GACT,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA;AAErB,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAoBc,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAiBZ,sBAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAsDzB,QAAA,EAAU,gBAAA,GAAmB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAqBxC,QAAA,EAAU,kBAAkB,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAiB7B,QAAA,EAAU,oBAAA,EAAsB,gBAAA,GAAmB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAoBjE,QAAA,EAAU,oBAAA,EAAsB,cAAA,GAAiB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAoB/D,QAAA,EAAU,oBAAA,EAAsB,cAAA,GAAiB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAuBhE,QAAA,EAAU,oBAAA,EAAsB,SAAA,IAAa,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EActD,QAAA,EAAU,WAAA,EAAa,IAAA,CAAK,IAAI,KAAK,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAoBtD;AAEA,SAAS,2BAA2B,QAAA,EAAyC;AAC3E,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAkCe,QAAA,EAAU,kBAAA,GAAqB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAqB7C,QAAA,EAAU,cAAA,GAAiB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAqBzC,QAAA,EAAU,YAAA,GAAe,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAqBvC,QAAA,EAAU,iBAAA,GAAoB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAA,EAwB1B,QAAA,EAAU,cAAA,KAAmB,WAAA,GAAc,UAAA,GAAa,EAAE,CAAA;AAAA,oCAAA,EAC9D,QAAA,EAAU,cAAA,KAAmB,OAAA,GAAU,UAAA,GAAa,EAAE,CAAA;AAAA,qCAAA,EACrD,QAAA,EAAU,cAAA,KAAmB,QAAA,GAAW,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAkC9F;AAEA,SAAS,sBAAsB,QAAA,EAAoC;AACjE,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EA6Bc,QAAA,EAAU,eAAe,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAA,EAaZ,QAAA,EAAU,eAAA,KAAoB,OAAA,GAAU,UAAA,GAAa,EAAE,CAAA;AAAA,yCAAA,EAClD,QAAA,EAAU,eAAA,KAAoB,YAAA,GAAe,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EACpE,QAAA,EAAU,eAAA,KAAoB,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAA,EAUjD,QAAA,EAAU,eAAA,KAAoB,OAAA,GAAU,UAAA,GAAa,EAAE,CAAA;AAAA,qCAAA,EACtD,QAAA,EAAU,eAAA,KAAoB,QAAA,GAAW,UAAA,GAAa,EAAE,CAAA;AAAA,sCAAA,EACvD,QAAA,EAAU,eAAA,KAAoB,SAAA,GAAY,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAalF,QAAA,EAAU,gBAAA,EAAkB,IAAA,CAAK,IAAI,KAAK,gCAAgC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAQlE,QAAA,EAAU,mBAAmB,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAqCtD;AAEA,SAAS,wBAAwB,QAAA,EAAsC;AACrE,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6EAAA,EAasE,QAAA,EAAU,mBAAmB,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAY9B,QAAA,EAAU,qBAAqB,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAYlC,QAAA,EAAU,qBAAqB,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAAA,CAyBtG,QAAA,EAAU,iBAAA,IAAqB,CAAA,MAAO,CAAA,GAAI,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAsKtE;AAEA,SAAS,4BAA4B,QAAA,EAA0C;AAC7E,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uGAAA,EAagG,QAAA,EAAU,eAAe,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,qGAAA,EAc9B,QAAA,EAAU,SAAA,EAAW,cAAA,EAAe,IAAK,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAiGnJ;;;ACxmDO,IAAM,mBAAA,GAAsB,IAAIlB,IAAAA;AAGvC,mBAAA,CAAoB,GAAA,CAAI,GAAA,EAAK,WAAA,EAAa,CAAA;AAG1C,SAAS,gBAAgB,IAAA,EAAW;AAClC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,QAAA,EAAU,YAAA;AAAA,MACV,eAAA,EAAiB,qCAAA;AAAA,MACjB,UAAA,EAAY,MAAM,KAAA,IAAS,mBAAA;AAAA,MAC3B,QAAA,EAAU,KAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,UAAA,EAAY;AAAA,MACV,KAAA,EAAO,MAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,OAAA,EAAS,EAAA;AAAA,MACT,OAAA,EAAS,EAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,IACA,QAAA,EAAU;AAAA,MACR,gBAAA,EAAkB,KAAA;AAAA,MAClB,cAAA,EAAgB,EAAA;AAAA,MAChB,oBAAA,EAAsB;AAAA,QACpB,SAAA,EAAW,CAAA;AAAA,QACX,gBAAA,EAAkB,IAAA;AAAA,QAClB,cAAA,EAAgB,IAAA;AAAA,QAChB,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,aAAa;AAAC,KAChB;AAAA,IACA,aAAA,EAAe;AAAA,MACb,kBAAA,EAAoB,IAAA;AAAA,MACpB,cAAA,EAAgB,IAAA;AAAA,MAChB,YAAA,EAAc,IAAA;AAAA,MACd,iBAAA,EAAmB,KAAA;AAAA,MACnB,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,WAAA,EAAa,EAAA;AAAA,MACb,kBAAkB,CAAC,KAAA,EAAO,QAAQ,KAAA,EAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAAA,MAC7D,eAAA,EAAiB,YAAA;AAAA,MACjB,eAAA,EAAiB,OAAA;AAAA,MACjB,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,UAAA,EAAY;AAAA,MACV,eAAA,EAAiB,CAAA;AAAA,MACjB,iBAAA,EAAmB,CAAA;AAAA,MACnB,iBAAA,EAAmB,CAAA;AAAA,MACnB,WAAA,EAAa,MAAA;AAAA,MACb,YAAY;AAAC,KACf;AAAA,IACA,aAAA,EAAe;AAAA,MACb,WAAA,EAAa,CAAA;AAAA,MACb,SAAA,EAAW,CAAA;AAAA,MACX,UAAA,EAAY,MAAA;AAAA,MACZ,YAAA,EAAc,MAAA;AAAA,MACd,QAAQ;AAAC;AACX,GACF;AACF;AAGA,mBAAA,CAAoB,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA,KAAM;AAClC,EAAA,OAAO,CAAA,CAAE,SAAS,yBAAyB,CAAA;AAC7C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA,KAAM;AAC/C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,EAAE,CAAA;AAG9C,EAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,kBAAA,CAAmB,MAAM,KAAK,CAAA;AAE5E,EAAA,MAAM,YAAA,GAAe,gBAAgB,IAAI,CAAA;AACzC,EAAA,YAAA,CAAa,OAAA,GAAU,eAAA;AAEvB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,YAAA;AAAA,IACV,SAAA,EAAW,SAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,aAAA,EAAe,CAAC,CAAA,KAAM;AAC5C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,IAC9B,SAAA,EAAW,YAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AAChD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,EAAE,CAAA;AAG9C,EAAA,MAAM,SAAA,GAAY,MAAM,eAAA,CAAgB,mBAAA,EAAoB;AAE5D,EAAA,MAAM,YAAA,GAAe,gBAAgB,IAAI,CAAA;AACzC,EAAA,YAAA,CAAa,QAAA,GAAW;AAAA,IACtB,GAAG,YAAA,CAAa,QAAA;AAAA,IAChB,cAAc,SAAA,CAAU,YAAA;AAAA,IACxB,wBAAwB,SAAA,CAAU;AAAA,GACpC;AAEA,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,YAAA;AAAA,IACV,SAAA,EAAW,UAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,gBAAA,EAAkB,CAAC,CAAA,KAAM;AAC/C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,IAC9B,SAAA,EAAW,eAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,UAAA,EAAY,CAAC,CAAA,KAAM;AACzC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,IAC9B,SAAA,EAAW,SAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,aAAA,EAAe,CAAC,CAAA,KAAM;AAC5C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,IAC9B,SAAA,EAAW,YAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,iBAAA,EAAmB,CAAC,CAAA,KAAM;AAChD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,IAC9B,SAAA,EAAW,gBAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,wBAAA,EAA0B,OAAO,CAAA,KAAM;AAC7D,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,EAAE,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,kBAAA,EAAmB;AAEzD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,qBAAA,EAAuB,OAAO,CAAA,KAAM;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAGzB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,EAAE,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,oBAAA,EAAqB;AAE3D,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,0BAAA,EAA4B,OAAO,CAAA,KAAM;AAC/D,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,EAAE,CAAA;AAChD,IAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,cAAA,EAAe;AAEzD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,2BAAA,EAA6B,OAAO,CAAA,KAAM;AAChE,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAMpC,EAAE,GAAA,EAAI;AAEP,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,OAAA,IAAW,EAAC;AACvC,IAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC/B,MAAA,CAAO,GAAA,CAAI,OAAO,KAAA,KAAe;AAC/B,QAAA,IAAI;AACF,UAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,OAAA,CAAQ,iCAAiC,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA,CAAE,KAAA,EAAM;AAC1F,UAAA,MAAM,QAAA,GAAY,aAAqB,KAAA,IAAS,CAAA;AAChD,UAAA,SAAA,IAAa,QAAA;AACb,UAAA,OAAO;AAAA,YACL,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ;AAAA,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAA,CAAM,IAAI,KAAK,KAAK,CAAA;AAC5D,UAAA,OAAO;AAAA,YACL,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,QAAA,EAAU;AAAA,WACZ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,KACH;AAIA,IAAA,MAAM,qBAAqB,SAAA,GAAY,IAAA;AACvC,IAAA,MAAM,cAAA,GAAA,CAAkB,kBAAA,IAAsB,IAAA,GAAO,IAAA,CAAA,EAAO,QAAQ,CAAC,CAAA;AAErE,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,aAAa,MAAA,CAAO,MAAA;AAAA,QACpB,SAAA;AAAA,QACA,YAAA,EAAc,GAAG,cAAc,CAAA,eAAA,CAAA;AAAA,QAC/B,MAAA,EAAQ;AAAA;AACV,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,8BAAA,EAAgC,OAAO,CAAA,KAAM;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,MAAM,kBAAkB,MAAM,EAAA,CAAG,OAAA,CAAQ,wBAAwB,EAAE,KAAA,EAAM;AACzE,IAAA,MAAM,OAAA,GAAW,iBAAyB,eAAA,KAAoB,IAAA;AAE9D,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS,UAAU,iCAAA,GAAoC;AAAA;AACzD,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,4BAAA,EAA8B,OAAO,CAAA,KAAM;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAGzB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAIA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,8BAAA,EAAgC,OAAO,CAAA,KAAM;AACpE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAGzB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,MAAA,IAAU,EAAC;AAEzC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,gBAAgB,CAAA,IAAK,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACrE,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,UAAU,EAAC;AAGjB,IAAA,MAAM,YAAA,GAAe,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIrC,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,cAAc,IAAI,GAAA;AAAA,MAAA,CACrB,YAAA,CAAa,WAAW,EAAC,EAAG,IAAI,CAAC,GAAA,KAAa,IAAI,IAAI;AAAA,KACzD;AAEA,IAAA,KAAA,MAAW,aAAa,gBAAA,EAAkB;AACxC,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC/B,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,KAAA,EAAO,KAAA,EAAO,mBAAmB,CAAA;AAC3E,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,MAAM,GAAG,OAAA,CAAQ,CAAA,YAAA,EAAe,SAAS,CAAA,CAAE,EAAE,GAAA,EAAI;AACjD,QAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA;AAAA,MAClD,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACrD,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,OAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAAA,MACzE;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,CAAA,UAAA,EAAa,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAM,CAAA,IAAA,EAAO,gBAAA,CAAiB,MAAM,CAAA,OAAA,CAAA;AAAA,MACzF;AAAA,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,KAAM;AAChD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,EAAS;AACtC,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,EAAE,CAAA;AAG9C,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,eAAA,EAAiB,QAAA,CAAS,GAAA,CAAI,iBAAiB,CAAA;AAAA,MAC/C,UAAA,EAAY,QAAA,CAAS,GAAA,CAAI,YAAY,CAAA;AAAA,MACrC,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,eAAA,EAAiB,QAAA,CAAS,GAAA,CAAI,iBAAiB,CAAA,KAAM;AAAA,KACvD;AAGA,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,IAAY,CAAC,SAAS,eAAA,EAAiB;AACnD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,mBAAA,CAAoB,QAAQ,CAAA;AAElE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA,KAAM;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,EAAS;AACtC,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,EAAE,CAAA;AAE9C,IAAA,MAAM,kBAAmB,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA,EAAqB,MAAK,IAAK,EAAA;AACnF,IAAA,MAAM,WAAY,QAAA,CAAS,GAAA,CAAI,wBAAwB,CAAA,EAAqB,MAAK,IAAK,EAAA;AAGtF,IAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,CAAK,eAAe,CAAA,EAAG;AAC/C,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU,EAAE,CAAA;AACjD,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA,IAAK,YAAA,GAAe,CAAA,IAAK,YAAA,GAAe,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI;AAC1F,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,oBAAA,CAAqB;AAAA,MACzD,YAAA,EAAc,eAAA;AAAA,MACd,sBAAA,EAAwB;AAAA,KACzB,CAAA;AAED,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA,KAAM;AACzC,EAAA,OAAO,CAAA,CAAE,SAAS,yBAAyB,CAAA;AAC7C,CAAC,CAAA;;;AC7lBD,mCAAA,EAAA;AA4BO,SAAS,oBAAoB,IAAA,EAAiC;AACnE,EAAA,MAAM,SAAA,GAAiB;AAAA,IACrB,OAAA,EAAS,aAAA;AAAA,IACT,YAAA,EAAc,IAAA;AAAA,IACd,WAAA,EAAa,CAAC,IAAA,KAAe,CAAA,aAAA,EAAgB,KAAK,EAAE,CAAA,QAAA,CAAA;AAAA,IACpD,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,CAAC,MAAA,EAAa,IAAA,KAAc;AAAA;AAAA;AAAA,kBAAA,EAGxB,KAAK,IAAI;AAAA;AAAA;AAAA,UAAA;AAAA,OAIvB;AAAA,MACA;AAAA,QACE,GAAA,EAAK,cAAA;AAAA,QACL,KAAA,EAAO,cAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU;AAAA,OACZ;AAAA,MACA;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,CAAC,MAAA,EAAa,IAAA,KAAc;AAClC,UAAA,MAAM,cAAA,GAAyC;AAAA,YAC7C,SAAA,EAAW,wGAAA;AAAA,YACX,QAAA,EAAU,oHAAA;AAAA,YACV,cAAA,EAAgB,8GAAA;AAAA,YAChB,UAAA,EAAY,oHAAA;AAAA,YACZ,SAAA,EAAW;AAAA,WACb;AACA,UAAA,MAAM,aAAa,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,IAAK,eAAe,SAAS,CAAA;AAC5E,UAAA,OAAO;AAAA,6GAAA,EAC8F,UAAU,CAAA;AAAA,cAAA,EACzG,IAAA,CAAK,YAAY,SAAS;AAAA;AAAA,UAAA,CAAA;AAAA,QAGlC;AAAA,OACF;AAAA,MACA;AAAA,QACE,GAAA,EAAK,kBAAA;AAAA,QACL,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,CAAC,MAAA,EAAa,IAAA,KAAc;AAClC,UAAA,MAAM,KAAA,GAAQ,KAAK,gBAAA,IAAoB,CAAA;AACvC,UAAA,OAAO;AAAA;AAAA;AAAA,gBAAA,EAGC,KAAK;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,QAIf;AAAA,OACF;AAAA,MACA;AAAA,QACE,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,CAAC,MAAA,EAAa,IAAA,KAAc;AAClC,UAAA,IAAI,KAAK,SAAA,EAAW;AAClB,YAAA,OAAO;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAAA,UAKT,CAAA,MAAO;AACL,YAAA,OAAO;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAAA,UAKT;AAAA,QACF;AAAA,OACF;AAAA,MACA;AAAA,QACE,GAAA,EAAK,eAAA;AAAA,QACL,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU;AAAA,OACZ;AAAA,MACA;AAAA,QACE,GAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,CAAC,MAAA,EAAa,IAAA,KAAc;AAClC,UAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,IAAI,OAAO,yDAAA;AAC9B,UAAA,OAAO;AAAA;AAAA,oCAAA,EAEqB,KAAK,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAKb,KAAK,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAA,EAMH,KAAK,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,QAOrC;AAAA;AACF,KACF;AAAA,IACA,MAAM,IAAA,CAAK,KAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAEA,EAAA,MAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iFAAA,EA4C6D,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iFAAA,EAgBjB,KAAK,KAAA,CAAM,MAAA,CAAO,OAAK,CAAA,CAAE,SAAS,EAAE,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iFAAA,EAgB1C,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,gBAAA,IAAoB,CAAA,CAAA,EAAI,CAAC,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAe7H,IAAA,CAAK,UAAU,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,EAUA,IAAA,CAAK,QAAA,KAAa,SAAA,GAAY,UAAA,GAAa,EAAE,CAAA;AAAA,qCAAA,EAC9C,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,UAAA,GAAa,EAAE,CAAA;AAAA,2CAAA,EACtC,IAAA,CAAK,QAAA,KAAa,cAAA,GAAiB,UAAA,GAAa,EAAE,CAAA;AAAA,uCAAA,EACtD,IAAA,CAAK,QAAA,KAAa,UAAA,GAAa,UAAA,GAAa,EAAE,CAAA;AAAA,sCAAA,EAC/C,IAAA,CAAK,QAAA,KAAa,SAAA,GAAY,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAYzE,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA,GAO7B,EAAE;AAAA;AAAA;;AAAA;AAAA;AAAA,QAAA,EAMNuB,YAAAA,CAAY,SAAS,CAAC;AAAA;AAAA;AAAA,EAAA,CAAA;AAK9B,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,OAAA;AAAA,IACP,OAAA,EAAS,WAAA;AAAA,IACT,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS,IAAA,CAAK;AAAA,GAChB;AAEA,EAAA,OAAO,0BAA0B,UAAU,CAAA;AAC7C;;;ACrSA,mCAAA,EAAA;AAuBA,SAAS,2BAAA,GAAsC;AAC7C,EAAA,OAAO;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CA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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAA,EAsRlB,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"chunk-M2PKQJ6J.js","sourcesContent":["/**\n * Schema Definitions\n *\n * Placeholder for schema definitions - to be populated as needed\n */\n\nexport interface SchemaDefinition {\n name: string\n fields: any[]\n}\n\n// Empty array for now - schemas will be migrated incrementally\nexport const schemaDefinitions: SchemaDefinition[] = []\n","import type { FilterCondition, FilterGroup, QueryFilter } from '../utils/query-filter'\n\nfunction canReadNonPublicContent(userRole?: string): boolean {\n return userRole === 'admin' || userRole === 'editor'\n}\n\nfunction isStatusCondition(condition: FilterCondition): boolean {\n return condition.field === 'status'\n}\n\nfunction stripStatusConditions(group?: FilterGroup): FilterGroup | undefined {\n if (!group) {\n return undefined\n }\n\n const and = group.and?.filter(condition => !isStatusCondition(condition))\n const or = group.or?.filter(condition => !isStatusCondition(condition))\n\n const normalizedGroup: FilterGroup = {}\n\n if (and && and.length > 0) {\n normalizedGroup.and = and\n }\n\n if (or && or.length > 0) {\n normalizedGroup.or = or\n }\n\n return normalizedGroup\n}\n\nexport function normalizePublicContentFilter(filter: QueryFilter, userRole?: string): QueryFilter {\n if (canReadNonPublicContent(userRole)) {\n return filter\n }\n\n const normalizedFilter: QueryFilter = {\n ...filter,\n where: stripStatusConditions(filter.where)\n }\n\n if (!normalizedFilter.where) {\n normalizedFilter.where = { and: [] }\n }\n\n if (!normalizedFilter.where.and) {\n normalizedFilter.where.and = []\n }\n\n normalizedFilter.where.and.push({\n field: 'status',\n operator: 'equals',\n value: 'published'\n })\n\n return normalizedFilter\n}\n","/**\n * Variable Resolver\n *\n * Scans strings for {variable_key} tokens and replaces them\n * with values from the global variables map.\n *\n * Token syntax: {key} where key matches /^[a-z0-9_]+$/\n * Unresolved tokens are left as-is so editors can see what's missing.\n */\n\n// Matches {variable_key} — only lowercase alphanumeric + underscores\nconst TOKEN_PATTERN = /\\{([a-z0-9_]+)\\}/g\n\n/**\n * Replace all {variable_key} tokens in a string with their values.\n * Unresolved tokens remain unchanged.\n */\nexport function resolveVariables(\n text: string,\n variables: Map\n): string {\n if (!text || variables.size === 0) return text\n\n return text.replace(TOKEN_PATTERN, (match, key) => {\n const value = variables.get(key)\n return value !== undefined ? value : match\n })\n}\n\n/**\n * Recursively resolve variables in an object's string values.\n * Handles nested objects, arrays, and the `data` field of content items.\n */\nexport function resolveVariablesInObject(\n obj: any,\n variables: Map\n): any {\n if (!obj || variables.size === 0) return obj\n\n if (typeof obj === 'string') {\n return resolveVariables(obj, variables)\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => resolveVariablesInObject(item, variables))\n }\n\n if (typeof obj === 'object') {\n const result: Record = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key] = resolveVariablesInObject(value, variables)\n }\n return result\n }\n\n return obj\n}\n\n// ============================================================================\n// In-memory variable cache (shared with index.ts via import)\n// ============================================================================\n\nlet variableCache: Map | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL_MS = 300_000 // 5 minutes\n\nexport function getVariablesCached(): Map | null {\n const now = Date.now()\n if (variableCache && (now - cacheTimestamp) < CACHE_TTL_MS) {\n return variableCache\n }\n return null\n}\n\nexport function setVariablesCache(map: Map): void {\n variableCache = map\n cacheTimestamp = Date.now()\n}\n\nexport function invalidateVariablesCache(): void {\n variableCache = null\n cacheTimestamp = 0\n}\n\n/**\n * Resolve variables in a content object using the database.\n * Fetches variables from DB (with caching) and resolves tokens.\n * Safe to call even if the global_variables table doesn't exist yet.\n */\nexport async function resolveContentVariables(\n contentData: any,\n db: any\n): Promise {\n if (!db || !contentData) return contentData\n\n try {\n // Check cache first\n let variables = getVariablesCached()\n\n if (!variables) {\n const { results } = await db.prepare(\n 'SELECT key, value FROM global_variables WHERE is_active = 1'\n ).all()\n\n variables = new Map()\n for (const row of results || []) {\n variables.set((row as any).key, (row as any).value)\n }\n setVariablesCache(variables)\n }\n\n if (variables.size === 0) return contentData\n\n return resolveVariablesInObject(contentData, variables)\n } catch {\n // Table may not exist yet — silently return original data\n return contentData\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth, requireRole } from '../middleware'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport type { Bindings, Variables } from '../app'\nimport { resolveContentVariables } from '../plugins/core-plugins/global-variables-plugin/variable-resolver'\n\nconst apiContentCrudRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// GET /api/content/check-slug - Check if slug is available in collection\n// Query params: collectionId, slug, excludeId (optional - when editing)\n// NOTE: This MUST come before /:id route to avoid route conflict\napiContentCrudRoutes.get('/check-slug', async (c) => {\n try {\n const db = c.env.DB\n const collectionId = c.req.query('collectionId')\n const slug = c.req.query('slug')\n const excludeId = c.req.query('excludeId') // When editing, exclude current item\n \n if (!collectionId || !slug) {\n return c.json({ error: 'collectionId and slug are required' }, 400)\n }\n \n // Check for existing content with this slug in the collection\n let query = 'SELECT id FROM content WHERE collection_id = ? AND slug = ?'\n const params: string[] = [collectionId, slug]\n \n if (excludeId) {\n query += ' AND id != ?'\n params.push(excludeId)\n }\n \n const existing = await db.prepare(query).bind(...params).first()\n \n if (existing) {\n return c.json({ \n available: false, \n message: 'This URL slug is already in use in this collection' \n })\n }\n \n return c.json({ available: true })\n } catch (error: unknown) {\n console.error('Error checking slug:', error)\n return c.json({ \n error: 'Failed to check slug availability',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// GET /api/content/:id - Get single content item by ID\napiContentCrudRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n const stmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await stmt.bind(id).first()\n\n if (!content) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n const transformedContent = {\n id: (content as any).id,\n title: (content as any).title,\n slug: (content as any).slug,\n status: (content as any).status,\n collectionId: (content as any).collection_id,\n data: (content as any).data ? JSON.parse((content as any).data) : {},\n created_at: (content as any).created_at,\n updated_at: (content as any).updated_at\n }\n\n // Resolve {variable_key} tokens in content data\n const resolveVars = c.req.query('resolve_variables') !== 'false'\n if (resolveVars) {\n transformedContent.data = await resolveContentVariables(transformedContent.data, db)\n }\n\n return c.json({ data: transformedContent })\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// POST /api/content - Create new content (requires authentication)\napiContentCrudRoutes.post('/', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const db = c.env.DB\n const user = c.get('user')\n const body = await c.req.json()\n\n const { collectionId, title, slug, status, data } = body\n\n // Validate required fields\n if (!collectionId) {\n return c.json({ error: 'collectionId is required' }, 400)\n }\n\n if (!title) {\n return c.json({ error: 'title is required' }, 400)\n }\n\n // Generate slug from title if not provided\n let finalSlug = slug || title\n finalSlug = finalSlug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim()\n\n // Check for duplicate slug within the same collection\n const duplicateCheck = db.prepare(\n 'SELECT id FROM content WHERE collection_id = ? AND slug = ?'\n )\n const existing = await duplicateCheck.bind(collectionId, finalSlug).first()\n\n if (existing) {\n return c.json({ error: 'A content item with this slug already exists in this collection' }, 409)\n }\n\n // Create new content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n finalSlug,\n title,\n JSON.stringify(data || {}),\n status || 'draft',\n user?.userId || 'system',\n now,\n now\n ).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n await cache.invalidate('content-filtered:*')\n\n // Get the created content\n const getStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const createdContent = await getStmt.bind(contentId).first() as any\n\n return c.json({\n data: {\n id: createdContent.id,\n title: createdContent.title,\n slug: createdContent.slug,\n status: createdContent.status,\n collectionId: createdContent.collection_id,\n data: createdContent.data ? JSON.parse(createdContent.data) : {},\n created_at: createdContent.created_at,\n updated_at: createdContent.updated_at\n }\n }, 201)\n } catch (error) {\n console.error('Error creating content:', error)\n return c.json({\n error: 'Failed to create content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// PUT /api/content/:id - Update content (requires authentication)\napiContentCrudRoutes.put('/:id', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const body = await c.req.json()\n\n // Check if content exists\n const existingStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existing = await existingStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n // Build update fields dynamically\n const updates: string[] = []\n const params: any[] = []\n\n if (body.title !== undefined) {\n updates.push('title = ?')\n params.push(body.title)\n }\n\n if (body.slug !== undefined) {\n let finalSlug = body.slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim()\n updates.push('slug = ?')\n params.push(finalSlug)\n }\n\n if (body.status !== undefined) {\n updates.push('status = ?')\n params.push(body.status)\n }\n\n if (body.data !== undefined) {\n updates.push('data = ?')\n params.push(JSON.stringify(body.data))\n }\n\n // Always update updated_at\n const now = Date.now()\n updates.push('updated_at = ?')\n params.push(now)\n\n // Add id to params for WHERE clause\n params.push(id)\n\n // Execute update\n const updateStmt = db.prepare(`\n UPDATE content SET ${updates.join(', ')}\n WHERE id = ?\n `)\n\n await updateStmt.bind(...params).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existing.collection_id}:*`)\n await cache.invalidate('content-filtered:*')\n\n // Get updated content\n const getStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const updatedContent = await getStmt.bind(id).first() as any\n\n return c.json({\n data: {\n id: updatedContent.id,\n title: updatedContent.title,\n slug: updatedContent.slug,\n status: updatedContent.status,\n collectionId: updatedContent.collection_id,\n data: updatedContent.data ? JSON.parse(updatedContent.data) : {},\n created_at: updatedContent.created_at,\n updated_at: updatedContent.updated_at\n }\n })\n } catch (error) {\n console.error('Error updating content:', error)\n return c.json({\n error: 'Failed to update content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// DELETE /api/content/:id - Delete content (requires authentication)\napiContentCrudRoutes.delete('/:id', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if content exists\n const existingStmt = db.prepare('SELECT collection_id FROM content WHERE id = ?')\n const existing = await existingStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n // Delete the content (hard delete for API, soft delete happens in admin routes)\n const deleteStmt = db.prepare('DELETE FROM content WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existing.collection_id}:*`)\n await cache.invalidate('content-filtered:*')\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting content:', error)\n return c.json({\n error: 'Failed to delete content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\nexport default apiContentCrudRoutes\n","import { Hono } from 'hono'\nimport { cors } from 'hono/cors'\nimport { schemaDefinitions } from '../schemas'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { QueryFilterBuilder, QueryFilter } from '../utils'\nimport { isPluginActive, optionalAuth } from '../middleware'\nimport { normalizePublicContentFilter } from './api-content-access-policy'\nimport apiContentCrudRoutes from './api-content-crud'\nimport type { Bindings, Variables as AppVariables } from '../app'\n\n// Extend Variables with API-specific fields\ninterface Variables extends AppVariables {\n startTime: number\n cacheEnabled?: boolean\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Add timing middleware\napiRoutes.use('*', async (c, next) => {\n const startTime = Date.now()\n c.set('startTime', startTime)\n await next()\n const totalTime = Date.now() - startTime\n c.header('X-Response-Time', `${totalTime}ms`)\n})\n\n// Check if cache plugin is active\napiRoutes.use('*', async (c, next) => {\n const cacheEnabled = await isPluginActive(c.env.DB, 'core-cache')\n c.set('cacheEnabled', cacheEnabled)\n await next()\n})\n\n// Add CORS middleware\napiRoutes.use('*', cors({\n origin: (origin, c) => {\n const allowed = (c.env as any)?.CORS_ORIGINS as string | undefined\n if (!allowed) return null // No env var = reject cross-origin (secure default)\n const list = allowed.split(',').map((s: string) => s.trim())\n return list.includes(origin) ? origin : null\n },\n allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowHeaders: ['Content-Type', 'Authorization', 'X-API-Key']\n}))\n\n// Helper function to add timing metadata\nfunction addTimingMeta(c: any, meta: any = {}, executionStartTime?: number) {\n const totalTime = Date.now() - c.get('startTime')\n const executionTime = executionStartTime ? Date.now() - executionStartTime : undefined\n\n return {\n ...meta,\n timing: {\n total: totalTime,\n execution: executionTime,\n unit: 'ms'\n }\n }\n}\n\n// Root endpoint - OpenAPI 3.0.0 specification\napiRoutes.get('/', (c) => {\n const baseUrl = new URL(c.req.url)\n const serverUrl = `${baseUrl.protocol}//${baseUrl.host}`\n\n return c.json({\n openapi: '3.0.0',\n info: {\n title: 'SonicJS AI API',\n version: '0.1.0',\n description: 'RESTful API for SonicJS headless CMS - a modern, AI-powered content management system built on Cloudflare Workers',\n contact: {\n name: 'SonicJS Support',\n url: `${serverUrl}/docs`,\n email: 'support@sonicjs.com'\n },\n license: {\n name: 'MIT',\n url: 'https://opensource.org/licenses/MIT'\n }\n },\n servers: [\n {\n url: serverUrl,\n description: 'Current server'\n }\n ],\n paths: {\n '/api/': {\n get: {\n summary: 'API Information',\n description: 'Returns OpenAPI specification for the SonicJS API',\n operationId: 'getApiInfo',\n tags: ['System'],\n responses: {\n '200': {\n description: 'OpenAPI specification',\n content: {\n 'application/json': {\n schema: { type: 'object' }\n }\n }\n }\n }\n }\n },\n '/api/health': {\n get: {\n summary: 'Health Check',\n description: 'Returns API health status and available schemas',\n operationId: 'getHealth',\n tags: ['System'],\n responses: {\n '200': {\n description: 'Health status',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n status: { type: 'string', example: 'healthy' },\n timestamp: { type: 'string', format: 'date-time' },\n schemas: { type: 'array', items: { type: 'string' } }\n }\n }\n }\n }\n }\n }\n }\n },\n '/api/collections': {\n get: {\n summary: 'List Collections',\n description: 'Returns all active collections with their schemas',\n operationId: 'getCollections',\n tags: ['Content'],\n responses: {\n '200': {\n description: 'List of collections',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n name: { type: 'string' },\n display_name: { type: 'string' },\n schema: { type: 'object' },\n is_active: { type: 'integer' }\n }\n }\n },\n meta: { type: 'object' }\n }\n }\n }\n }\n }\n }\n }\n },\n '/api/collections/{collection}/content': {\n get: {\n summary: 'Get Collection Content',\n description: 'Returns content items from a specific collection with filtering support. Anonymous, viewer, and author requests are restricted to published content; admin and editor requests may query other statuses.',\n operationId: 'getCollectionContent',\n tags: ['Content'],\n parameters: [\n {\n name: 'collection',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Collection name'\n },\n {\n name: 'limit',\n in: 'query',\n schema: { type: 'integer', default: 50, maximum: 1000 },\n description: 'Maximum number of items to return'\n },\n {\n name: 'offset',\n in: 'query',\n schema: { type: 'integer', default: 0 },\n description: 'Number of items to skip'\n },\n {\n name: 'status',\n in: 'query',\n schema: { type: 'string', enum: ['draft', 'published', 'archived'] },\n description: 'Filter by content status. Anonymous, viewer, and author requests are limited to published content.'\n }\n ],\n responses: {\n '200': {\n description: 'List of content items',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: { type: 'array', items: { type: 'object' } },\n meta: { type: 'object' }\n }\n }\n }\n }\n },\n '404': {\n description: 'Collection not found'\n }\n }\n }\n },\n '/api/content': {\n get: {\n summary: 'List Content',\n description: 'Returns content items with advanced filtering support. Anonymous, viewer, and author requests are restricted to published content; admin and editor requests may query other statuses.',\n operationId: 'getContent',\n tags: ['Content'],\n parameters: [\n {\n name: 'collection',\n in: 'query',\n schema: { type: 'string' },\n description: 'Filter by collection name'\n },\n {\n name: 'limit',\n in: 'query',\n schema: { type: 'integer', default: 50, maximum: 1000 },\n description: 'Maximum number of items to return'\n },\n {\n name: 'offset',\n in: 'query',\n schema: { type: 'integer', default: 0 },\n description: 'Number of items to skip'\n },\n {\n name: 'status',\n in: 'query',\n schema: { type: 'string', enum: ['draft', 'published', 'archived'] },\n description: 'Filter by content status. Anonymous, viewer, and author requests are limited to published content.'\n }\n ],\n responses: {\n '200': {\n description: 'List of content items',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: { type: 'array', items: { type: 'object' } },\n meta: { type: 'object' }\n }\n }\n }\n }\n }\n }\n },\n post: {\n summary: 'Create Content',\n description: 'Creates a new content item',\n operationId: 'createContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['collection_id', 'title'],\n properties: {\n collection_id: { type: 'string' },\n title: { type: 'string' },\n slug: { type: 'string' },\n status: { type: 'string', enum: ['draft', 'published', 'archived'] },\n data: { type: 'object' }\n }\n }\n }\n }\n },\n responses: {\n '201': { description: 'Content created successfully' },\n '400': { description: 'Invalid request body' },\n '401': { description: 'Unauthorized' }\n }\n }\n },\n '/api/content/{id}': {\n get: {\n summary: 'Get Content by ID',\n description: 'Returns a specific content item by ID',\n operationId: 'getContentById',\n tags: ['Content'],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content item' },\n '404': { description: 'Content not found' }\n }\n },\n put: {\n summary: 'Update Content',\n description: 'Updates an existing content item',\n operationId: 'updateContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content updated successfully' },\n '401': { description: 'Unauthorized' },\n '404': { description: 'Content not found' }\n }\n },\n delete: {\n summary: 'Delete Content',\n description: 'Deletes a content item',\n operationId: 'deleteContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content deleted successfully' },\n '401': { description: 'Unauthorized' },\n '404': { description: 'Content not found' }\n }\n }\n },\n '/api/media': {\n get: {\n summary: 'List Media',\n description: 'Returns all media files with pagination',\n operationId: 'getMedia',\n tags: ['Media'],\n responses: {\n '200': { description: 'List of media files' }\n }\n }\n },\n '/api/media/upload': {\n post: {\n summary: 'Upload Media',\n description: 'Uploads a new media file to R2 storage',\n operationId: 'uploadMedia',\n tags: ['Media'],\n security: [{ bearerAuth: [] }],\n requestBody: {\n required: true,\n content: {\n 'multipart/form-data': {\n schema: {\n type: 'object',\n properties: {\n file: { type: 'string', format: 'binary' }\n }\n }\n }\n }\n },\n responses: {\n '201': { description: 'Media uploaded successfully' },\n '401': { description: 'Unauthorized' }\n }\n }\n }\n },\n components: {\n securitySchemes: {\n bearerAuth: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT'\n }\n },\n schemas: {\n Content: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n title: { type: 'string' },\n slug: { type: 'string' },\n status: { type: 'string', enum: ['draft', 'published', 'archived'] },\n collectionId: { type: 'string', format: 'uuid' },\n data: { type: 'object' },\n created_at: { type: 'integer' },\n updated_at: { type: 'integer' }\n }\n },\n Collection: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n name: { type: 'string' },\n display_name: { type: 'string' },\n description: { type: 'string' },\n schema: { type: 'object' },\n is_active: { type: 'integer' }\n }\n },\n Media: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n filename: { type: 'string' },\n mimetype: { type: 'string' },\n size: { type: 'integer' },\n url: { type: 'string' }\n }\n },\n Error: {\n type: 'object',\n properties: {\n error: { type: 'string' },\n details: { type: 'string' }\n }\n }\n }\n },\n tags: [\n { name: 'System', description: 'System and health endpoints' },\n { name: 'Content', description: 'Content management operations' },\n { name: 'Media', description: 'Media file operations' }\n ]\n })\n})\n\n// Health check endpoint\napiRoutes.get('/health', (c) => {\n return c.json({\n status: 'healthy',\n timestamp: new Date().toISOString(),\n schemas: schemaDefinitions.map(s => s.name)\n })\n})\n\n// Basic collections endpoint\napiRoutes.get('/collections', async (c) => {\n const executionStart = Date.now()\n\n try {\n const db = c.env.DB\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('collections', 'all')\n\n // Use cache only if cache plugin is active\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n const stmt = db.prepare(\"SELECT * FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const { results } = await stmt.all()\n\n // Parse schema and format results\n const transformedResults = results.map((row: any) => ({\n ...row,\n schema: row.schema ? JSON.parse(row.schema) : {},\n is_active: row.is_active // Keep as number (1 or 0)\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n count: results.length,\n timestamp: new Date().toISOString(),\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache plugin is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching collections:', error)\n return c.json({ error: 'Failed to fetch collections' }, 500)\n }\n})\n\n// Basic content endpoint with advanced filtering\napiRoutes.get('/content', optionalAuth(), async (c) => {\n const executionStart = Date.now()\n\n try {\n const db = c.env.DB\n const queryParams = c.req.query()\n\n // Handle collection parameter - convert collection name to collection_id\n if (queryParams.collection) {\n const collectionName = queryParams.collection\n const collectionStmt = db.prepare('SELECT id FROM collections WHERE name = ? AND is_active = 1')\n const collectionResult = await collectionStmt.bind(collectionName).first()\n\n if (collectionResult) {\n // Replace 'collection' param with 'collection_id' for the filter builder\n queryParams.collection_id = (collectionResult as any).id\n delete queryParams.collection\n } else {\n // Collection not found - return empty result\n return c.json({\n data: [],\n meta: addTimingMeta(c, {\n count: 0,\n timestamp: new Date().toISOString(),\n message: `Collection '${collectionName}' not found`\n }, executionStart)\n })\n }\n }\n\n // Parse filter from query parameters\n const filter: QueryFilter = QueryFilterBuilder.parseFromQuery(queryParams)\n const normalizedFilter = normalizePublicContentFilter(filter, c.get('user')?.role)\n\n // Set default limit if not provided\n if (!normalizedFilter.limit) {\n normalizedFilter.limit = 50\n }\n normalizedFilter.limit = Math.min(normalizedFilter.limit, 1000) // Max 1000\n\n // Build SQL query from filter\n const builder = new QueryFilterBuilder()\n const queryResult = builder.build('content', normalizedFilter)\n\n // Check for query building errors\n if (queryResult.errors.length > 0) {\n return c.json({\n error: 'Invalid filter parameters',\n details: queryResult.errors\n }, 400)\n }\n\n // Only use cache if cache plugin is active\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('content-filtered', JSON.stringify({ filter: normalizedFilter, query: queryResult.sql }))\n\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n // Execute query with parameters\n const stmt = db.prepare(queryResult.sql)\n const boundStmt = queryResult.params.length > 0\n ? stmt.bind(...queryResult.params)\n : stmt\n\n const { results } = await boundStmt.all()\n\n // Transform results to match API spec (camelCase)\n const transformedResults = results.map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n collectionId: row.collection_id,\n data: row.data ? JSON.parse(row.data) : {},\n created_at: row.created_at,\n updated_at: row.updated_at\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n count: results.length,\n timestamp: new Date().toISOString(),\n filter: normalizedFilter,\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// Collection-specific routes with advanced filtering\napiRoutes.get('/collections/:collection/content', optionalAuth(), async (c) => {\n const executionStart = Date.now()\n\n try {\n const collection = c.req.param('collection')\n const db = c.env.DB\n const queryParams = c.req.query()\n\n // First check if collection exists\n const collectionStmt = db.prepare('SELECT * FROM collections WHERE name = ? AND is_active = 1')\n const collectionResult = await collectionStmt.bind(collection).first()\n\n if (!collectionResult) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Parse filter from query parameters\n const filter: QueryFilter = QueryFilterBuilder.parseFromQuery(queryParams)\n const normalizedFilter = normalizePublicContentFilter(filter, c.get('user')?.role)\n\n // Add collection_id filter to where clause\n if (!normalizedFilter.where) {\n normalizedFilter.where = { and: [] }\n }\n\n if (!normalizedFilter.where.and) {\n normalizedFilter.where.and = []\n }\n\n // Add collection filter\n normalizedFilter.where.and.push({\n field: 'collection_id',\n operator: 'equals',\n value: (collectionResult as any).id\n })\n\n // Set default limit if not provided\n if (!normalizedFilter.limit) {\n normalizedFilter.limit = 50\n }\n normalizedFilter.limit = Math.min(normalizedFilter.limit, 1000)\n\n // Build SQL query from filter\n const builder = new QueryFilterBuilder()\n const queryResult = builder.build('content', normalizedFilter)\n\n // Check for query building errors\n if (queryResult.errors.length > 0) {\n return c.json({\n error: 'Invalid filter parameters',\n details: queryResult.errors\n }, 400)\n }\n\n // Generate cache key\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('collection-content-filtered', `${collection}:${JSON.stringify({ filter: normalizedFilter, query: queryResult.sql })}`)\n\n // Only check cache if plugin is enabled\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n // Execute query with parameters\n const stmt = db.prepare(queryResult.sql)\n const boundStmt = queryResult.params.length > 0\n ? stmt.bind(...queryResult.params)\n : stmt\n\n const { results } = await boundStmt.all()\n\n // Transform results to match API spec (camelCase)\n const transformedResults = results.map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n collectionId: row.collection_id,\n data: row.data ? JSON.parse(row.data) : {},\n created_at: row.created_at,\n updated_at: row.updated_at\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n collection: {\n ...(collectionResult as any),\n schema: (collectionResult as any).schema ? JSON.parse((collectionResult as any).schema) : {}\n },\n count: results.length,\n timestamp: new Date().toISOString(),\n filter: normalizedFilter,\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache plugin is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// Mount CRUD routes for content\napiRoutes.route('/content', apiContentCrudRoutes)\n\nexport default apiRoutes\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { requireAuth } from '../middleware'\nimport type { Bindings, Variables } from '../app'\n\n// Helper function to generate short IDs (replacement for nanoid)\nfunction generateId(): string {\n return crypto.randomUUID().replace(/-/g, '').substring(0, 21)\n}\n\n// Helper function for emitting events (simplified for core package)\nasync function emitEvent(eventName: string, data: any) {\n console.log(`[Event] ${eventName}:`, data)\n // TODO: Implement proper event system when plugin architecture is ready\n}\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nexport const apiMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply auth middleware to all routes\napiMediaRoutes.use('*', requireAuth())\n\n// Upload single file\napiMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')!\n const formData = await c.req.formData()\n const fileData = formData.get('file')\n\n if (!fileData || typeof fileData === 'string') {\n return c.json({ error: 'No file provided' }, 400)\n }\n\n const file = fileData as File\n\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n return c.json({ \n error: 'File validation failed', \n details: validation.error.issues \n }, 400)\n }\n\n // Generate unique filename and R2 key\n const fileId = generateId()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n return c.json({ error: 'Failed to upload file to storage' }, 500)\n }\n\n // Generate public URL using environment variable for bucket name\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const publicUrl = `https://pub-${bucketName}.r2.dev/${r2Key}`\n \n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate thumbnail URL for images\n let thumbnailUrl: string | null = null\n if (file.type.startsWith('image/') && c.env.IMAGES_ACCOUNT_ID) {\n thumbnailUrl = `https://imagedelivery.net/${c.env.IMAGES_ACCOUNT_ID}/${r2Key}/thumbnail`\n }\n\n // Save to database\n const mediaRecord = {\n id: fileId,\n filename: filename,\n original_name: file.name,\n mime_type: file.type,\n size: file.size,\n width,\n height,\n folder,\n r2_key: r2Key,\n public_url: publicUrl,\n thumbnail_url: thumbnailUrl,\n uploaded_by: user.userId,\n uploaded_at: Math.floor(Date.now() / 1000),\n created_at: Math.floor(Date.now() / 1000)\n }\n\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n mediaRecord.id,\n mediaRecord.filename,\n mediaRecord.original_name,\n mediaRecord.mime_type,\n mediaRecord.size,\n mediaRecord.width,\n mediaRecord.height,\n mediaRecord.folder,\n mediaRecord.r2_key,\n mediaRecord.public_url,\n mediaRecord.thumbnail_url,\n mediaRecord.uploaded_by,\n mediaRecord.uploaded_at\n ).run()\n\n // Emit media upload event\n await emitEvent('media.upload', { id: mediaRecord.id, filename: mediaRecord.filename })\n\n return c.json({\n success: true,\n file: {\n id: mediaRecord.id,\n filename: mediaRecord.filename,\n originalName: mediaRecord.original_name,\n mimeType: mediaRecord.mime_type,\n size: mediaRecord.size,\n width: mediaRecord.width,\n height: mediaRecord.height,\n r2_key: mediaRecord.r2_key,\n publicUrl: mediaRecord.public_url,\n thumbnailUrl: mediaRecord.thumbnail_url,\n uploadedAt: new Date(mediaRecord.uploaded_at * 1000).toISOString()\n }\n })\n } catch (error) {\n console.error('Upload error:', error)\n return c.json({ error: 'Upload failed' }, 500)\n }\n})\n\n// Upload multiple files\napiMediaRoutes.post('/upload-multiple', async (c) => {\n try {\n const user = c.get('user')!\n const formData = await c.req.formData()\n const filesData = formData.getAll('files')\n\n // Filter out strings and ensure we only have File objects\n const files: File[] = []\n for (const f of filesData) {\n if (typeof f !== 'string') {\n files.push(f as File)\n }\n }\n\n if (!files || files.length === 0) {\n return c.json({ error: 'No files provided' }, 400)\n }\n\n const uploadResults = []\n const errors = []\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: 'Validation failed',\n details: validation.error.issues\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = generateId()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Generate public URL using environment variable for bucket name\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const publicUrl = `https://pub-${bucketName}.r2.dev/${r2Key}`\n \n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate thumbnail URL for images\n let thumbnailUrl: string | null = null\n if (file.type.startsWith('image/') && c.env.IMAGES_ACCOUNT_ID) {\n thumbnailUrl = `https://imagedelivery.net/${c.env.IMAGES_ACCOUNT_ID}/${r2Key}/thumbnail`\n }\n\n // Save to database\n const mediaRecord = {\n id: fileId,\n filename: filename,\n original_name: file.name,\n mime_type: file.type,\n size: file.size,\n width,\n height,\n folder,\n r2_key: r2Key,\n public_url: publicUrl,\n thumbnail_url: thumbnailUrl,\n uploaded_by: user.userId,\n uploaded_at: Math.floor(Date.now() / 1000)\n }\n\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n mediaRecord.id,\n mediaRecord.filename,\n mediaRecord.original_name,\n mediaRecord.mime_type,\n mediaRecord.size,\n mediaRecord.width,\n mediaRecord.height,\n mediaRecord.folder,\n mediaRecord.r2_key,\n mediaRecord.public_url,\n mediaRecord.thumbnail_url,\n mediaRecord.uploaded_by,\n mediaRecord.uploaded_at\n ).run()\n\n uploadResults.push({\n id: mediaRecord.id,\n filename: mediaRecord.filename,\n originalName: mediaRecord.original_name,\n mimeType: mediaRecord.mime_type,\n size: mediaRecord.size,\n width: mediaRecord.width,\n height: mediaRecord.height,\n r2_key: mediaRecord.r2_key,\n publicUrl: mediaRecord.public_url,\n thumbnailUrl: mediaRecord.thumbnail_url,\n uploadedAt: new Date(mediaRecord.uploaded_at * 1000).toISOString()\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media upload event if any uploads succeeded\n if (uploadResults.length > 0) {\n await emitEvent('media.upload', { count: uploadResults.length })\n }\n\n return c.json({\n success: uploadResults.length > 0,\n uploaded: uploadResults,\n errors: errors,\n summary: {\n total: files.length,\n successful: uploadResults.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Multiple upload error:', error)\n return c.json({ error: 'Upload failed' }, 500)\n }\n})\n\n// Bulk delete files\napiMediaRoutes.post('/bulk-delete', async (c) => {\n try {\n const user = c.get('user')!\n const body = await c.req.json()\n const fileIds = body.fileIds as string[]\n \n if (!fileIds || !Array.isArray(fileIds) || fileIds.length === 0) {\n return c.json({ error: 'No file IDs provided' }, 400)\n }\n\n // Limit bulk operations to prevent abuse\n if (fileIds.length > 50) {\n return c.json({ error: 'Too many files selected. Maximum 50 files per operation.' }, 400)\n }\n\n const results = []\n const errors = []\n\n for (const fileId of fileIds) {\n try {\n // Get file record (including already deleted files to check if they exist at all)\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ?')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n errors.push({ fileId, error: 'File not found' })\n continue\n }\n\n // Skip if already deleted (treat as success)\n if (fileRecord.deleted_at !== null) {\n console.log(`File ${fileId} already deleted, skipping`)\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n alreadyDeleted: true\n })\n continue\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n errors.push({ fileId, error: 'Permission denied' })\n continue\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn(`Failed to delete from R2 for file ${fileId}:`, error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true\n })\n } catch (error) {\n errors.push({\n fileId,\n error: 'Delete failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media delete event if any deletes succeeded\n if (results.length > 0) {\n await emitEvent('media.delete', { count: results.length, ids: fileIds })\n }\n\n return c.json({\n success: results.length > 0,\n deleted: results,\n errors: errors,\n summary: {\n total: fileIds.length,\n successful: results.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Bulk delete error:', error)\n return c.json({ error: 'Bulk delete failed' }, 500)\n }\n})\n\n// Create folder\napiMediaRoutes.post('/create-folder', async (c) => {\n try {\n const body = await c.req.json()\n const folderName = body.folderName as string\n\n if (!folderName || typeof folderName !== 'string') {\n return c.json({ success: false, error: 'No folder name provided' }, 400)\n }\n\n // Validate folder name format\n const folderPattern = /^[a-z0-9-_]+$/\n if (!folderPattern.test(folderName)) {\n return c.json({\n success: false,\n error: 'Folder name can only contain lowercase letters, numbers, hyphens, and underscores'\n }, 400)\n }\n\n // Check if folder already exists in the database\n const checkStmt = c.env.DB.prepare('SELECT COUNT(*) as count FROM media WHERE folder = ? AND deleted_at IS NULL')\n const existingFolder = await checkStmt.bind(folderName).first() as any\n\n if (existingFolder && existingFolder.count > 0) {\n return c.json({\n success: false,\n error: `Folder \"${folderName}\" already exists`\n }, 400)\n }\n\n // Note: R2 folders are virtual - they only exist when files are uploaded to them\n // Return success message explaining this behavior\n return c.json({\n success: true,\n message: `Folder \"${folderName}\" is ready. Upload files to this folder to make it appear in the media library.`,\n folder: folderName,\n note: 'Folders appear automatically when you upload files to them'\n })\n } catch (error) {\n console.error('Create folder error:', error)\n return c.json({ success: false, error: 'Failed to create folder' }, 500)\n }\n})\n\n// Bulk move files to folder\napiMediaRoutes.post('/bulk-move', async (c) => {\n try {\n const user = c.get('user')!\n const body = await c.req.json()\n const fileIds = body.fileIds as string[]\n const targetFolder = body.folder as string\n\n if (!fileIds || !Array.isArray(fileIds) || fileIds.length === 0) {\n return c.json({ error: 'No file IDs provided' }, 400)\n }\n\n if (!targetFolder || typeof targetFolder !== 'string') {\n return c.json({ error: 'No target folder provided' }, 400)\n }\n\n // Limit bulk operations to prevent abuse\n if (fileIds.length > 50) {\n return c.json({ error: 'Too many files selected. Maximum 50 files per operation.' }, 400)\n }\n\n const results = []\n const errors = []\n\n for (const fileId of fileIds) {\n try {\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n errors.push({ fileId, error: 'File not found' })\n continue\n }\n\n // Check permissions (only allow move by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n errors.push({ fileId, error: 'Permission denied' })\n continue\n }\n\n // Skip if already in target folder\n if (fileRecord.folder === targetFolder) {\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n skipped: true\n })\n continue\n }\n\n // Generate new R2 key with new folder\n const oldR2Key = fileRecord.r2_key\n const filename = oldR2Key.split('/').pop() || fileRecord.filename\n const newR2Key = `${targetFolder}/${filename}`\n\n // Copy file to new location in R2\n try {\n const object = await c.env.MEDIA_BUCKET.get(oldR2Key)\n if (!object) {\n errors.push({ fileId, error: 'File not found in storage' })\n continue\n }\n\n await c.env.MEDIA_BUCKET.put(newR2Key, object.body, {\n httpMetadata: object.httpMetadata,\n customMetadata: {\n ...object.customMetadata,\n movedBy: user.userId,\n movedAt: new Date().toISOString()\n }\n })\n\n // Delete old file from R2\n await c.env.MEDIA_BUCKET.delete(oldR2Key)\n } catch (error) {\n console.warn(`Failed to move file in R2 for file ${fileId}:`, error)\n errors.push({ fileId, error: 'Failed to move file in storage' })\n continue\n }\n\n // Update database with new folder and R2 key\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const newPublicUrl = `https://pub-${bucketName}.r2.dev/${newR2Key}`\n\n const updateStmt = c.env.DB.prepare(`\n UPDATE media\n SET folder = ?, r2_key = ?, public_url = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n targetFolder,\n newR2Key,\n newPublicUrl,\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n skipped: false\n })\n } catch (error) {\n errors.push({\n fileId,\n error: 'Move failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media move event if any moves succeeded\n if (results.length > 0) {\n await emitEvent('media.move', { count: results.length, targetFolder, ids: fileIds })\n }\n\n return c.json({\n success: results.length > 0,\n moved: results,\n errors: errors,\n summary: {\n total: fileIds.length,\n successful: results.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Bulk move error:', error)\n return c.json({ error: 'Bulk move failed' }, 500)\n }\n})\n\n// Delete file\napiMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')!\n const fileId = c.req.param('id')\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.json({ error: 'File not found' }, 404)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n return c.json({ error: 'Permission denied' }, 403)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // Emit media delete event\n await emitEvent('media.delete', { id: fileId })\n\n return c.json({ success: true, message: 'File deleted successfully' })\n } catch (error) {\n console.error('Delete error:', error)\n return c.json({ error: 'Delete failed' }, 500)\n }\n})\n\n// Update file metadata\napiMediaRoutes.patch('/:id', async (c) => {\n try {\n const user = c.get('user')!\n const fileId = c.req.param('id')\n const body = await c.req.json()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.json({ error: 'File not found' }, 404)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n return c.json({ error: 'Permission denied' }, 403)\n }\n\n // Update allowed fields\n const allowedFields = ['alt', 'caption', 'tags', 'folder']\n const updates = []\n const values = []\n \n for (const [key, value] of Object.entries(body)) {\n if (allowedFields.includes(key)) {\n updates.push(`${key} = ?`)\n values.push(key === 'tags' ? JSON.stringify(value) : value)\n }\n }\n\n if (updates.length === 0) {\n return c.json({ error: 'No valid fields to update' }, 400)\n }\n\n updates.push('updated_at = ?')\n values.push(Math.floor(Date.now() / 1000))\n values.push(fileId)\n\n const updateStmt = c.env.DB.prepare(`\n UPDATE media SET ${updates.join(', ')} WHERE id = ?\n `)\n await updateStmt.bind(...values).run()\n\n // Emit media update event\n await emitEvent('media.update', { id: fileId })\n\n return c.json({ success: true, message: 'File updated successfully' })\n } catch (error) {\n console.error('Update error:', error)\n return c.json({ error: 'Update failed' }, 500)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n // This is a simplified implementation\n // In a real-world scenario, you'd use a proper image processing library\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length) {\n if (i + 8 >= uint8Array.length) break\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n if (i + 8 < uint8Array.length) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n }\n if (i + 3 < uint8Array.length) {\n i += 2 + ((uint8Array[i + 2]! << 8) | uint8Array[i + 3]!)\n } else {\n break\n }\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\nexport default apiMediaRoutes","/**\n * API System Routes\n *\n * Provides system health, status, and metadata endpoints\n * These are lightweight routes without heavy dependencies\n */\n\nimport { Hono } from 'hono'\nimport type { Bindings, Variables } from '../app'\n\nexport const apiSystemRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * System health check\n * GET /api/system/health\n */\napiSystemRoutes.get('/health', async (c) => {\n try {\n const startTime = Date.now()\n\n // Check database connectivity\n let dbStatus = 'unknown'\n let dbLatency = 0\n\n try {\n const dbStart = Date.now()\n await c.env.DB.prepare('SELECT 1').first()\n dbLatency = Date.now() - dbStart\n dbStatus = 'healthy'\n } catch (error) {\n console.error('Database health check failed:', error)\n dbStatus = 'unhealthy'\n }\n\n // Check KV connectivity (if available)\n let kvStatus = 'not_configured'\n let kvLatency = 0\n\n if (c.env.CACHE_KV) {\n try {\n const kvStart = Date.now()\n await c.env.CACHE_KV.get('__health_check__')\n kvLatency = Date.now() - kvStart\n kvStatus = 'healthy'\n } catch (error) {\n console.error('KV health check failed:', error)\n kvStatus = 'unhealthy'\n }\n }\n\n // Check R2 connectivity (if available)\n let r2Status = 'not_configured'\n\n if (c.env.MEDIA_BUCKET) {\n try {\n await c.env.MEDIA_BUCKET.head('__health_check__')\n r2Status = 'healthy'\n } catch (error) {\n // R2 head on non-existent key returns null, not an error\n // This is expected, so we consider it healthy\n r2Status = 'healthy'\n }\n }\n\n const totalLatency = Date.now() - startTime\n const overall = dbStatus === 'healthy' ? 'healthy' : 'degraded'\n\n return c.json({\n status: overall,\n timestamp: new Date().toISOString(),\n uptime: totalLatency,\n checks: {\n database: {\n status: dbStatus,\n latency: dbLatency\n },\n cache: {\n status: kvStatus,\n latency: kvLatency\n },\n storage: {\n status: r2Status\n }\n },\n environment: c.env.ENVIRONMENT || 'production'\n })\n } catch (error) {\n console.error('Health check failed:', error)\n return c.json({\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n error: 'Health check failed'\n }, 503)\n }\n})\n\n/**\n * System information\n * GET /api/system/info\n */\napiSystemRoutes.get('/info', (c) => {\n const appVersion = c.get('appVersion') || '1.0.0'\n\n return c.json({\n name: 'SonicJS',\n version: appVersion,\n description: 'Modern headless CMS built on Cloudflare Workers',\n endpoints: {\n api: '/api',\n auth: '/auth',\n health: '/api/system/health',\n docs: '/docs'\n },\n features: {\n content: true,\n media: true,\n auth: true,\n collections: true,\n caching: !!c.env.CACHE_KV,\n storage: !!c.env.MEDIA_BUCKET\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * System stats\n * GET /api/system/stats\n */\napiSystemRoutes.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get content statistics\n const contentStats = await db.prepare(`\n SELECT COUNT(*) as total_content\n FROM content\n WHERE deleted_at IS NULL\n `).first() as any\n\n // Get media statistics\n const mediaStats = await db.prepare(`\n SELECT\n COUNT(*) as total_files,\n SUM(size) as total_size\n FROM media\n WHERE deleted_at IS NULL\n `).first() as any\n\n // Get user statistics\n const userStats = await db.prepare(`\n SELECT COUNT(*) as total_users\n FROM users\n `).first() as any\n\n return c.json({\n content: {\n total: contentStats?.total_content || 0\n },\n media: {\n total_files: mediaStats?.total_files || 0,\n total_size_bytes: mediaStats?.total_size || 0,\n total_size_mb: Math.round((mediaStats?.total_size || 0) / 1024 / 1024 * 100) / 100\n },\n users: {\n total: userStats?.total_users || 0\n },\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Stats query failed:', error)\n return c.json({ error: 'Failed to fetch system statistics' }, 500)\n }\n})\n\n/**\n * Database ping\n * GET /api/system/ping\n */\napiSystemRoutes.get('/ping', async (c) => {\n try {\n const start = Date.now()\n await c.env.DB.prepare('SELECT 1').first()\n const latency = Date.now() - start\n\n return c.json({\n pong: true,\n latency,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Ping failed:', error)\n return c.json({\n pong: false,\n error: 'Database connection failed'\n }, 503)\n }\n})\n\n/**\n * Environment check\n * GET /api/system/env\n */\napiSystemRoutes.get('/env', (c) => {\n return c.json({\n environment: c.env.ENVIRONMENT || 'production',\n features: {\n database: !!c.env.DB,\n cache: !!c.env.CACHE_KV,\n media_bucket: !!c.env.MEDIA_BUCKET,\n email_queue: !!c.env.EMAIL_QUEUE,\n sendgrid: !!c.env.SENDGRID_API_KEY,\n cloudflare_images: !!(c.env.IMAGES_ACCOUNT_ID && c.env.IMAGES_API_TOKEN)\n },\n timestamp: new Date().toISOString()\n })\n})\n\nexport default apiSystemRoutes\n","/**\n * Admin API Routes\n *\n * Provides JSON API endpoints for admin operations\n * These routes complement the admin UI and can be used programmatically\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\n// import { zValidator } from '@hono/zod-validator'\nimport { requireAuth, requireRole } from '../middleware'\nimport type { Bindings, Variables } from '../app'\n\nexport const adminApiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply auth middleware to all admin routes\nadminApiRoutes.use('*', requireAuth())\nadminApiRoutes.use('*', requireRole(['admin', 'editor']))\n\n/**\n * Get dashboard statistics\n * GET /admin/api/stats\n */\nadminApiRoutes.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE c.deleted_at IS NULL AND (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n return c.json({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n mediaSize: mediaSize,\n users: usersCount,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.json({ error: 'Failed to fetch statistics' }, 500)\n }\n})\n\n/**\n * Get storage usage\n * GET /admin/api/storage\n */\nadminApiRoutes.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n return c.json({\n databaseSize,\n mediaSize,\n totalSize: databaseSize + mediaSize,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.json({ error: 'Failed to fetch storage usage' }, 500)\n }\n})\n\n/**\n * Get recent activity\n * GET /admin/api/activity\n */\nadminApiRoutes.get('/activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '10')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const recentActivity = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n let details: any = {}\n try {\n details = row.details ? JSON.parse(row.details) : {}\n } catch (e) {\n console.error('Error parsing activity details:', e)\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n resource_id: row.resource_id,\n details,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n return c.json({\n data: recentActivity,\n count: recentActivity.length,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n return c.json({ error: 'Failed to fetch recent activity' }, 500)\n }\n})\n\n/**\n * Collection management schema\n */\nconst createCollectionSchema = z.object({\n name: z.string().min(1).max(255).regex(/^[a-z0-9_]+$/, 'Must contain only lowercase letters, numbers, and underscores'),\n displayName: z.string().min(1).max(255).optional(),\n display_name: z.string().min(1).max(255).optional(),\n description: z.string().optional()\n}).refine(data => data.displayName || data.display_name, {\n message: 'Either displayName or display_name is required',\n path: ['displayName']\n})\n\nconst updateCollectionSchema = z.object({\n display_name: z.string().min(1).max(255).optional(),\n description: z.string().optional(),\n is_active: z.boolean().optional()\n})\n\n/**\n * Get all collections\n * GET /admin/api/collections\n */\nadminApiRoutes.get('/collections', async (c) => {\n try {\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const includeInactive = c.req.query('includeInactive') === 'true'\n\n let stmt\n let results\n\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, updated_at, is_active, managed\n FROM collections\n WHERE ${includeInactive ? '1=1' : 'is_active = 1'}\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, updated_at, is_active, managed\n FROM collections\n WHERE (source_type IS NULL OR source_type = 'user')\n ${includeInactive ? '' : 'AND is_active = 1'}\n ORDER BY created_at DESC\n `)\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Get field counts\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n is_active: row.is_active === 1,\n managed: row.managed === 1,\n field_count: fieldCounts.get(String(row.id)) || 0\n }))\n\n return c.json({\n data: collections,\n count: collections.length,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching collections:', error)\n return c.json({ error: 'Failed to fetch collections' }, 500)\n }\n})\n\n/**\n * Get single collection\n * GET /admin/api/collections/:id\n */\nadminApiRoutes.get('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Get collection fields\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n\n const fields = (fieldsResults || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at)\n }))\n\n return c.json({\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n is_active: collection.is_active === 1,\n managed: collection.managed === 1,\n schema: collection.schema ? JSON.parse(collection.schema) : null,\n created_at: Number(collection.created_at),\n updated_at: Number(collection.updated_at),\n fields\n })\n } catch (error) {\n console.error('Error fetching collection:', error)\n return c.json({ error: 'Failed to fetch collection' }, 500)\n }\n})\n\n/**\n * Get reference options for a collection\n * GET /admin/api/references?collection=&search=&limit=20&id=\n */\nadminApiRoutes.get('/references', async (c) => {\n try {\n const db = c.env.DB\n const url = new URL(c.req.url)\n const collectionParams = url.searchParams\n .getAll('collection')\n .flatMap((value) => value.split(','))\n .map((value) => value.trim())\n .filter(Boolean)\n const search = c.req.query('search') || ''\n const id = c.req.query('id') || ''\n const limit = Math.min(Number.parseInt(c.req.query('limit') || '20', 10) || 20, 100)\n\n if (collectionParams.length === 0) {\n return c.json({ error: 'Collection is required' }, 400)\n }\n\n const placeholders = collectionParams.map(() => '?').join(', ')\n const collectionStmt = db.prepare(`\n SELECT id, name, display_name\n FROM collections\n WHERE id IN (${placeholders}) OR name IN (${placeholders})\n `)\n const collectionResults = await collectionStmt\n .bind(...collectionParams, ...collectionParams)\n .all()\n const collections = (collectionResults.results || []) as any[]\n\n if (collections.length === 0) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n const collectionById = Object.fromEntries(\n collections.map((entry) => [\n entry.id,\n {\n id: entry.id,\n name: entry.name,\n display_name: entry.display_name\n }\n ])\n )\n const collectionIds = collections.map((entry) => entry.id)\n\n if (id) {\n const idPlaceholders = collectionIds.map(() => '?').join(', ')\n const itemStmt = db.prepare(`\n SELECT id, title, slug, collection_id\n FROM content\n WHERE id = ? AND collection_id IN (${idPlaceholders})\n LIMIT 1\n `)\n const item = await itemStmt.bind(id, ...collectionIds).first() as any\n\n if (!item) {\n return c.json({ error: 'Reference not found' }, 404)\n }\n\n return c.json({\n data: {\n id: item.id,\n title: item.title,\n slug: item.slug,\n collection: collectionById[item.collection_id]\n }\n })\n }\n\n let stmt\n let results\n\n const listPlaceholders = collectionIds.map(() => '?').join(', ')\n const statusFilterValues = ['published']\n const statusClause = ` AND status IN (${statusFilterValues.map(() => '?').join(', ')})`\n\n if (search) {\n const searchParam = `%${search}%`\n stmt = db.prepare(`\n SELECT id, title, slug, status, updated_at, collection_id\n FROM content\n WHERE collection_id IN (${listPlaceholders})\n AND (title LIKE ? OR slug LIKE ?)\n ${statusClause}\n ORDER BY updated_at DESC\n LIMIT ?\n `)\n const queryResults = await stmt\n .bind(...collectionIds, searchParam, searchParam, ...statusFilterValues, limit)\n .all()\n results = queryResults.results\n } else {\n stmt = db.prepare(`\n SELECT id, title, slug, status, updated_at, collection_id\n FROM content\n WHERE collection_id IN (${listPlaceholders})\n ${statusClause}\n ORDER BY updated_at DESC\n LIMIT ?\n `)\n const queryResults = await stmt\n .bind(...collectionIds, ...statusFilterValues, limit)\n .all()\n results = queryResults.results\n }\n\n const items = (results || []).map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n updated_at: row.updated_at ? Number(row.updated_at) : null,\n collection: collectionById[row.collection_id]\n }))\n\n return c.json({\n data: items,\n count: items.length\n })\n } catch (error) {\n console.error('Error fetching reference options:', error)\n return c.json({ error: 'Failed to fetch references' }, 500)\n }\n})\n\n/**\n * Create collection\n * POST /admin/api/collections\n */\nadminApiRoutes.post('/collections', async (c) => {\n try {\n // Validate content type\n const contentType = c.req.header('Content-Type')\n if (!contentType || !contentType.includes('application/json')) {\n return c.json({ error: 'Content-Type must be application/json' }, 400)\n }\n\n let body\n try {\n body = await c.req.json()\n } catch (e) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n const validation = createCollectionSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const validatedData = validation.data\n const db = c.env.DB\n const _user = c.get('user')\n\n // Handle both camelCase and snake_case for display_name\n const displayName = validatedData.displayName || validatedData.display_name || ''\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(validatedData.name).first()\n\n if (existing) {\n return c.json({ error: 'A collection with this name already exists' }, 400)\n }\n\n // Create basic schema\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n validatedData.name,\n displayName,\n validatedData.description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${validatedData.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({\n id: collectionId,\n name: validatedData.name,\n displayName: displayName,\n description: validatedData.description,\n created_at: now\n }, 201)\n } catch (error) {\n console.error('Error creating collection:', error)\n return c.json({ error: 'Failed to create collection' }, 500)\n }\n})\n\n/**\n * Update collection\n * PATCH /admin/api/collections/:id\n */\nadminApiRoutes.patch('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const body = await c.req.json()\n const validation = updateCollectionSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const validatedData = validation.data\n const db = c.env.DB\n\n // Check if collection exists\n const checkStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const existing = await checkStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Build update query\n const updateFields: string[] = []\n const updateParams: any[] = []\n\n if (validatedData.display_name !== undefined) {\n updateFields.push('display_name = ?')\n updateParams.push(validatedData.display_name)\n }\n\n if (validatedData.description !== undefined) {\n updateFields.push('description = ?')\n updateParams.push(validatedData.description)\n }\n\n if (validatedData.is_active !== undefined) {\n updateFields.push('is_active = ?')\n updateParams.push(validatedData.is_active ? 1 : 0)\n }\n\n if (updateFields.length === 0) {\n return c.json({ error: 'No fields to update' }, 400)\n }\n\n updateFields.push('updated_at = ?')\n updateParams.push(Date.now())\n updateParams.push(id)\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET ${updateFields.join(', ')}\n WHERE id = ?\n `)\n\n await updateStmt.bind(...updateParams).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${existing.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({ message: 'Collection updated successfully' })\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.json({ error: 'Failed to update collection' }, 500)\n }\n})\n\n/**\n * Delete collection\n * DELETE /admin/api/collections/:id\n */\nadminApiRoutes.delete('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection exists\n const collectionStmt = db.prepare('SELECT name FROM collections WHERE id = ?')\n const collection = await collectionStmt.bind(id).first() as any\n\n if (!collection) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.json({\n error: `Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.`\n }, 400)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${collection.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({ message: 'Collection deleted successfully' })\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.json({ error: 'Failed to delete collection' }, 500)\n }\n})\n\n// Migrations API endpoints\n// Get migration status\nadminApiRoutes.get('/migrations/status', async (c) => {\n try {\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminApiRoutes.post('/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied,\n errors: result.errors\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.json({\n success: false,\n error: `Failed to run migrations: ${errorMessage}`,\n errors: [errorMessage]\n }, 500)\n }\n})\n\n// Validate database schema\nadminApiRoutes.get('/migrations/validate', async (c) => {\n try {\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\nexport default adminApiRoutes\n","import { renderAlert } from '../alert.template'\n\nexport interface LoginPageData {\n error?: string\n message?: string\n version?: string\n}\n\nexport function renderLoginPage(data: LoginPageData, demoLoginActive: boolean = false): string {\n return `\n \n \n \n \n \n Login - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n

Welcome Back

\n

Sign in to your account to continue

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n ${data.message ? `
${renderAlert({ type: 'success', message: data.message })}
` : ''}\n\n \n
\n\n \n \n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Sign In\n \n \n\n \n
\n

\n Don't have an account?\n Create one here\n

\n
\n
\n\n \n
\n \n v${data.version || '0.1.0'}\n \n
\n
\n
\n\n ${demoLoginActive ? `\n \n ` : ''}\n \n \n `\n}","import { renderAlert } from '../alert.template'\n\nexport interface RegisterPageData {\n error?: string\n}\n\nexport function renderRegisterPage(data: RegisterPageData): string {\n return `\n \n \n \n \n \n Register - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n
\n

SonicJS AI

\n

Create your account and get started

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n\n \n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Create Account\n \n \n\n \n
\n

\n Already have an account?\n Sign in here\n

\n
\n\n
\n
\n
\n
\n \n \n `\n}","/**\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 {\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\n if (plugin?.settings) {\n // Parse settings and check registration.enabled\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 return true // Default to enabled if no settings\n } catch {\n return true // Default to enabled on error\n }\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 {\n try {\n const result = await db.prepare('SELECT COUNT(*) as count FROM users').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 {\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 users 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 username: z.string().min(3, 'Username must be at least 3 characters').optional(),\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\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 {\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 'username':\n // Generate username from email (part before @)\n return data.email ? data.email.split('@')[0] : `user${Date.now()}`\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","/**\n * User Profile Config Registry\n *\n * Global singleton storing developer-defined custom profile field definitions.\n * Set once at app boot via defineUserProfile(), queried by routes and templates.\n */\n\nimport type { FieldType } from '../../../types/collection-config'\n\nexport interface ProfileFieldDefinition {\n name: string\n label: string\n type: FieldType\n options?: string[]\n default?: any\n required?: boolean\n placeholder?: string\n helpText?: string\n hidden?: boolean\n fields?: ProfileFieldDefinition[]\n validation?: {\n min?: number\n max?: number\n pattern?: string\n }\n}\n\nexport interface UserProfileConfig {\n fields: ProfileFieldDefinition[]\n registrationFields?: string[]\n}\n\nlet _profileConfig: UserProfileConfig | null = null\n\nexport function defineUserProfile(config: UserProfileConfig): void {\n if (_profileConfig) {\n console.warn('[SonicJS] defineUserProfile called multiple times — overwriting previous config')\n }\n _profileConfig = config\n}\n\nexport function getUserProfileConfig(): UserProfileConfig | null {\n return _profileConfig\n}\n\nexport function getProfileFieldDefaults(): Record {\n if (!_profileConfig) return {}\n const defaults: Record = {}\n for (const field of _profileConfig.fields) {\n if (field.default !== undefined) {\n defaults[field.name] = field.default\n }\n }\n return defaults\n}\n\nexport function getRegistrationFields(): ProfileFieldDefinition[] {\n if (!_profileConfig) return []\n const regFieldNames = _profileConfig.registrationFields || []\n return _profileConfig.fields.filter(f => regFieldNames.includes(f.name))\n}\n\n/** Reset state — for tests only */\nexport function _resetProfileConfig(): void {\n _profileConfig = null\n}\n","/**\n * User Profile Service\n *\n * Handles reading, writing, validation, and sanitization of custom profile data.\n */\n\nimport { sanitizeInput } from '../../../utils/sanitize'\nimport {\n getUserProfileConfig,\n getProfileFieldDefaults,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport function validateCustomData(\n data: Record,\n config: UserProfileConfig\n): { valid: boolean; errors: Record } {\n const errors: Record = {}\n\n for (const field of config.fields) {\n const value = data[field.name]\n\n if (field.required && (value === undefined || value === null || value === '')) {\n errors[field.name] = `${field.label} is required`\n continue\n }\n\n if (value === undefined || value === null || value === '') continue\n\n if (field.type === 'number' && typeof value !== 'number') {\n errors[field.name] = `${field.label} must be a number`\n }\n if (field.type === 'select' && field.options && !field.options.includes(value)) {\n errors[field.name] = `${field.label} must be one of: ${field.options.join(', ')}`\n }\n if (field.type === 'boolean' && typeof value !== 'boolean') {\n errors[field.name] = `${field.label} must be true or false`\n }\n if (field.validation?.min !== undefined && typeof value === 'number' && value < field.validation.min) {\n errors[field.name] = `${field.label} must be at least ${field.validation.min}`\n }\n if (field.validation?.max !== undefined && typeof value === 'number' && value > field.validation.max) {\n errors[field.name] = `${field.label} must be at most ${field.validation.max}`\n }\n if (field.validation?.pattern && typeof value === 'string' && !new RegExp(field.validation.pattern).test(value)) {\n errors[field.name] = `${field.label} format is invalid`\n }\n }\n\n return { valid: Object.keys(errors).length === 0, errors }\n}\n\nexport function sanitizeCustomData(\n data: Record,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n const knownNames = new Set(config.fields.map(f => f.name))\n\n for (const [key, value] of Object.entries(data)) {\n if (!knownNames.has(key)) continue\n if (typeof value === 'string') {\n result[key] = sanitizeInput(value)\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\nexport function coerceFieldValue(raw: string | null | undefined, field: ProfileFieldDefinition): any {\n if (raw === null || raw === undefined || raw === '') {\n return field.default ?? null\n }\n\n switch (field.type) {\n case 'number':\n const num = Number(raw)\n return isNaN(num) ? null : num\n case 'boolean':\n case 'checkbox':\n return raw === '1' || raw === 'true' || raw === 'on'\n case 'date':\n case 'datetime':\n const ts = new Date(raw).getTime()\n return isNaN(ts) ? null : ts\n default:\n return raw\n }\n}\n\nexport function extractCustomFieldsFromForm(\n formData: FormData,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n for (const field of config.fields) {\n const raw = formData.get(`custom_${field.name}`)?.toString()\n // For boolean/checkbox, absence means false\n if (raw === null || raw === undefined) {\n if (field.type === 'boolean' || field.type === 'checkbox') {\n result[field.name] = false\n }\n continue\n }\n result[field.name] = coerceFieldValue(raw, field)\n }\n return result\n}\n\nexport async function getCustomData(db: any, userId: string): Promise> {\n const row = await db\n .prepare('SELECT data FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (!row?.data) return {}\n try {\n return JSON.parse(row.data)\n } catch {\n return {}\n }\n}\n\nexport async function saveCustomData(\n db: any,\n userId: string,\n newData: Record\n): Promise {\n const existing = await getCustomData(db, userId)\n const merged = { ...existing, ...newData }\n const json = JSON.stringify(merged)\n\n // Check if profile row exists\n const row = await db\n .prepare('SELECT id FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (row) {\n await db\n .prepare('UPDATE user_profiles SET data = ?, updated_at = ? WHERE user_id = ?')\n .bind(json, Date.now(), userId)\n .run()\n } else {\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const now = Date.now()\n await db\n .prepare(\n 'INSERT INTO user_profiles (id, user_id, data, created_at, updated_at) VALUES (?, ?, ?, ?, ?)'\n )\n .bind(profileId, userId, json, now, now)\n .run()\n }\n}\n","export interface DragSortableOptions {\n itemSelector?: string\n handleSelector?: string\n onUpdate?: () => void\n}\n\nexport function getDragSortableScript(): string {\n return `\n \n `;\n}\n","import { getDragSortableScript } from './drag-sortable.template'\n\n/**\n * Returns shared readFieldValue function used by both blocks and structured fields.\n * Uses a window flag to ensure it's only initialized once.\n */\nfunction getReadFieldValueScript(): string {\n return `\n \n `\n}\n\nconst STRUCTURED_INDEX_TOKEN = '__INDEX__'\nconst BLOCK_INDEX_TOKEN = '__BLOCK_INDEX__'\n\nfunction sanitizeStructuredGroupId(fieldName: string): string {\n return `object-${fieldName}`\n .split(BLOCK_INDEX_TOKEN)\n .map((blockSegment) =>\n blockSegment\n .split(STRUCTURED_INDEX_TOKEN)\n .map((segment) =>\n segment\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, ''),\n )\n .join(STRUCTURED_INDEX_TOKEN),\n )\n .join(BLOCK_INDEX_TOKEN)\n}\n\nexport interface FieldDefinition {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any // JSON options\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface FieldRenderOptions {\n value?: any\n errors?: string[]\n disabled?: boolean\n className?: string\n pluginStatuses?: {\n quillEnabled?: boolean\n mdxeditorEnabled?: boolean\n tinymceEnabled?: boolean\n }\n collectionId?: string\n contentId?: string\n}\n\nfunction isMarkdownEditorFieldType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nfunction getEditorMetadata(fieldType: string): { family: string; provider: string } | null {\n if (fieldType === 'richtext' || fieldType === 'tinymce') {\n return {\n family: 'richtext',\n provider: 'tinymce',\n }\n }\n\n if (isMarkdownEditorFieldType(fieldType)) {\n return {\n family: 'markdown',\n provider: 'easymde',\n }\n }\n\n return null\n}\n\nexport function renderDynamicField(field: FieldDefinition, options: FieldRenderOptions = {}): string {\n const { value = '', errors = [], disabled = false, className = '', pluginStatuses = {}, collectionId = '', contentId = '' } = options\n const opts = field.field_options || {}\n const required = field.is_required ? 'required' : ''\n const baseClasses = `w-full rounded-lg px-3 py-2 text-sm text-zinc-950 dark:text-white bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 placeholder:text-zinc-400 dark:placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-zinc-950 dark:focus:ring-white transition-shadow ${className}`\n const errorClasses =\n errors.length > 0\n ? 'ring-pink-600 dark:ring-pink-500 focus:ring-pink-600 dark:focus:ring-pink-500'\n : ''\n\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n\n // Check if this is a plugin-based field type and if the plugin is inactive\n // If so, fall back to textarea with a warning\n let fallbackToTextarea = false\n let fallbackWarning = ''\n\n if (field.field_type === 'quill' && !pluginStatuses.quillEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Quill Editor plugin is inactive. Using textarea fallback.'\n } else if (isMarkdownEditorFieldType(field.field_type) && !pluginStatuses.mdxeditorEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Markdown editor plugin is inactive. Using textarea fallback.'\n } else if ((field.field_type === 'richtext' || field.field_type === 'tinymce') && !pluginStatuses.tinymceEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ TinyMCE plugin is inactive. Using textarea fallback.'\n }\n\n // If falling back to textarea, render it with a warning\n if (fallbackToTextarea) {\n return `\n
\n ${fallbackWarning ? `
${fallbackWarning}
` : ''}\n ${escapeHtml(value)}\n
\n `\n }\n\n let fieldHTML = ''\n\n switch (field.field_type) {\n case 'text':\n let patternHelp = ''\n let autoSlugScript = ''\n\n if (opts.pattern) {\n if (opts.pattern === '^[a-z0-9-]+$' || opts.pattern === '^[a-zA-Z0-9_-]+$') {\n patternHelp =\n '

Use letters, numbers, underscores, and hyphens only

'\n\n // Add auto-slug generation for slug fields\n if (fieldName === 'slug') {\n patternHelp +=\n ''\n autoSlugScript = `\n \n `\n }\n } else {\n patternHelp =\n '

Must match required format

'\n }\n }\n\n fieldHTML = `\n \n ${patternHelp}\n ${autoSlugScript}\n ${\n opts.pattern\n ? `\n \n `\n : ''\n }\n `\n break\n\n case 'textarea':\n fieldHTML = `\n ${escapeHtml(value)}\n `\n break\n\n case 'richtext':\n case 'tinymce':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'quill':\n // Quill WYSIWYG Editor\n fieldHTML = `\n
\n \n ${value}
\n\n \n \n \n `\n break\n\n case 'markdown':\n case 'mdxeditor':\n case 'easymde':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n // Markdown editor fields use the EasyMDE-backed richtext container.\n // The EasyMDE plugin initialization script handles activation.\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'number':\n fieldHTML = `\n \n `\n break\n\n case 'boolean':\n const checked = value === true || value === 'true' || value === '1' ? 'checked' : ''\n fieldHTML = `\n
\n \n \n
\n \n `\n break\n\n case 'date':\n fieldHTML = `\n \n `\n break\n\n case 'datetime':\n fieldHTML = `\n \n `\n break\n\n case 'slug':\n // Slug fields with auto-generation and duplicate detection\n const slugPattern = opts.pattern || '^[a-z0-9-]+$'\n const collectionIdValue = collectionId || opts.collectionId || ''\n const contentIdValue = contentId || opts.contentId || ''\n const isEditMode = !!value\n\n fieldHTML = `\n
\n \n
\n \n

Use lowercase letters, numbers, and hyphens only

\n
\n \n \n `\n break\n\n case 'select':\n const selectOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const multiple = opts.multiple ? 'multiple' : ''\n const selectedValues = Array.isArray(value) ? value : [value]\n\n fieldHTML = `\n \n ${!required && !opts.multiple ? '' : ''}\n ${selectOptions\n .map((option: any) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const selected = selectedValues.includes(optionValue) ? 'selected' : ''\n return ``\n })\n .join('')}\n \n ${\n opts.allowCustom\n ? `\n
\n \n
\n `\n : ''\n }\n `\n break\n\n case 'radio':\n const radioOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const selectedRadioValue =\n value !== undefined && value !== null\n ? String(value)\n : opts.default\n ? String(opts.default)\n : ''\n\n const isInline = opts.inline === true\n fieldHTML = `\n
\n ${radioOptions\n .map((option: any, index: number) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const inputId = `${fieldId}-option-${index}`\n const checked = selectedRadioValue === String(optionValue) ? 'checked' : ''\n return `\n \n `\n })\n .join('')}\n
\n `\n break\n\n case 'reference':\n let referenceCollections: string[] = []\n if (Array.isArray(opts.collection)) {\n referenceCollections = opts.collection.filter(Boolean)\n } else if (typeof opts.collection === 'string' && opts.collection) {\n referenceCollections = [opts.collection]\n }\n const referenceCollectionsAttr = referenceCollections.join(',')\n const hasReferenceCollection = referenceCollections.length > 0\n const hasReferenceValue = Boolean(value)\n fieldHTML = `\n
\n \n
\n \n ${hasReferenceCollection ? (hasReferenceValue ? 'Loading selection...' : 'No reference selected.') : 'Reference collection not configured.'}\n
\n
\n \n Select reference\n \n \n Remove\n \n
\n
\n \n `\n break\n\n case 'media':\n // Check if multiple selection is enabled\n const isMultiple = opts.multiple === true\n const mediaValues =\n isMultiple && value\n ? Array.isArray(value)\n ? value\n : String(value).split(',').filter(Boolean)\n : []\n const singleValue = !isMultiple ? value : ''\n\n // Helper to detect if URL is a video\n const isVideoUrl = (url: string) => {\n const videoExtensions = ['.mp4', '.webm', '.ogg', '.mov', '.avi']\n return videoExtensions.some((ext) => url.toLowerCase().endsWith(ext))\n }\n\n // Helper to render media element\n const renderMediaPreview = (url: string, alt: string, classes: string) => {\n if (isVideoUrl(url)) {\n return ``\n }\n return `\"${alt}\"`\n }\n\n fieldHTML = `\n
\n \n\n ${\n isMultiple\n ? `\n
\n ${mediaValues\n .map(\n (url: string, idx: number) => `\n
\n ${renderMediaPreview(url, `Media ${idx + 1}`, 'w-full h-24 object-cover rounded-lg border border-white/20')}\n \n \n \n \n \n
\n `,\n )\n .join('')}\n
\n `\n : `\n
\n ${singleValue ? renderMediaPreview(singleValue, 'Selected media', 'w-32 h-32 object-cover rounded-lg border border-white/20') : ''}\n
\n `\n }\n\n
\n \n \n \n \n ${isMultiple ? 'Select Media (Multiple)' : 'Select Media'}\n \n ${\n (isMultiple ? mediaValues.length > 0 : singleValue)\n ? `\n \n ${isMultiple ? 'Clear All' : 'Remove'}\n \n `\n : ''\n }\n
\n
\n `\n break\n\n case 'object':\n // Structured object field (like SEO with nested properties)\n return renderStructuredObjectField(field, options, baseClasses, errorClasses)\n\n case 'array':\n // Check if this is a blocks field (has discriminator/blocks config) or a regular array\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n if (itemsConfig.blocks && typeof itemsConfig.blocks === 'object') {\n // Blocks field with discriminated union\n return renderBlocksField(field, options, baseClasses, errorClasses)\n }\n // Regular structured array field\n return renderStructuredArrayField(field, options, baseClasses, errorClasses)\n\n default:\n fieldHTML = `\n \n `\n }\n\n const showLabel = field.field_type !== 'boolean'\n\n return `\n
0 ? 'true' : 'false'}\">\n ${\n showLabel\n ? `\n \n `\n : ''\n }\n ${fieldHTML}\n ${\n errors.length > 0\n ? `\n
\n ${errors.map((error) => `
${escapeHtml(error)}
`).join('')}\n
\n `\n : ''\n }\n ${\n opts.helpText\n ? `\n
\n ${escapeHtml(opts.helpText)}\n
\n `\n : ''\n }\n
\n `\n}\n\nexport function renderFieldGroup(\n title: string,\n fields: string[],\n collapsible: boolean = false,\n): string {\n const groupId = title.toLowerCase().replace(/\\s+/g, '-')\n\n return `\n
\n
\n

\n ${escapeHtml(title)}\n ${\n collapsible\n ? `\n \n \n \n `\n : ''\n }\n

\n
\n
\n ${fields.join('')}\n
\n
\n `\n}\n\nfunction renderBlocksField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const blocks = normalizeBlockDefinitions(itemsConfig.blocks)\n const discriminator =\n typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n const blockValues = normalizeBlocksValue(value, discriminator)\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const emptyState =\n blockValues.length === 0\n ? `\n
\n No blocks yet. Add your first block to get started.\n
\n `\n : ''\n\n const blockOptions = blocks\n .map((block) => ``)\n .join('')\n\n const blockItems = blockValues\n .map((blockValue, index) =>\n renderBlockItem(field, blockValue, blocks, discriminator, index, pluginStatuses),\n )\n .join('')\n\n const templates = blocks\n .map((block) => renderBlockTemplate(field, block, discriminator, pluginStatuses))\n .join('')\n\n return `\n \n \n\n
\n

\n ${escapeHtml(field.field_label || 'Content Blocks')}\n

\n
\n\n
\n
\n \n \n ${blockOptions}\n \n
\n \n Add Block\n \n
\n\n
\n ${blockItems || emptyState}\n
\n\n ${templates}\n \n ${getDragSortableScript()}\n ${getBlocksFieldScript()}\n `\n}\n\nfunction renderStructuredObjectField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = {}, pluginStatuses = {}, errors = [] } = options\n const opts = field.field_options || {}\n const properties = opts.properties && typeof opts.properties === 'object' ? opts.properties : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const objectValue = normalizeStructuredObjectValue(value)\n const objectLayout = opts.objectLayout || 'nested'\n const useNestedLayout = objectLayout !== 'flat'\n\n const subfields = Object.entries(properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n objectValue,\n pluginStatuses,\n field.field_name,\n ),\n )\n .join('')\n\n const groupTitle = field.field_label || field.field_name\n\n if (!useNestedLayout) {\n return `\n
\n \n
\n

\n ${escapeHtml(groupTitle)}\n

\n
\n
\n ${subfields}\n
\n
\n ${getStructuredFieldScript()}\n `\n }\n\n const groupId = sanitizeStructuredGroupId(field.field_name)\n const isCollapsed = errors.length > 0 ? false : opts.collapsed !== false\n\n return `\n
\n
\n

\n ${escapeHtml(groupTitle)}\n \n \n \n

\n
\n
\n \n
\n ${subfields}\n
\n
\n
\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const arrayValue = normalizeStructuredArrayValue(value)\n const arrayTitle = opts.itemLabel || field.field_label || 'Items'\n const hasItemTitle = typeof opts.itemTitle === 'string' && opts.itemTitle.trim() !== ''\n const arrayItemTitle = hasItemTitle ? opts.itemTitle.trim() : 'Item'\n const addItemLabel = hasItemTitle ? `Add ${arrayItemTitle}` : 'Add item'\n\n const items = arrayValue\n .map((itemValue, index) =>\n renderStructuredArrayItem(\n field,\n itemsConfig,\n String(index),\n itemValue,\n pluginStatuses,\n arrayItemTitle,\n ),\n )\n .join('')\n\n const emptyState =\n arrayValue.length === 0\n ? `\n
\n No items yet. Add the first item to get started.\n
\n `\n : ''\n\n return `\n
\n \n\n
\n
\n ${escapeHtml(arrayTitle)}\n
\n \n ${escapeHtml(addItemLabel)}\n \n
\n\n
\n ${items || emptyState}\n
\n\n \n
\n ${getDragSortableScript()}\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayItem(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n arrayItemTitle: string,\n): string {\n const itemFields = renderStructuredItemFields(field, itemConfig, index, itemValue, pluginStatuses)\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n ${escapeHtml(arrayItemTitle)} \n
\n
\n
\n \n \n \n \n
\n
\n
\n ${itemFields}\n
\n
\n `\n}\n\nfunction renderStructuredItemFields(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const itemType = itemConfig?.type || 'string'\n if (\n itemType === 'object' &&\n itemConfig?.properties &&\n typeof itemConfig.properties === 'object'\n ) {\n const fieldPrefix = `array-${field.field_name}-${index}`\n return Object.entries(itemConfig.properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n itemValue || {},\n pluginStatuses,\n fieldPrefix,\n ),\n )\n .join('')\n }\n\n const normalizedField = normalizeBlockField(itemConfig, 'Item')\n const fieldValue = itemValue ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `array-${field.field_name}-${index}-value`,\n field_name: `array-${field.field_name}-${index}-value`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction renderStructuredSubfield(\n field: FieldDefinition,\n propertyName: string,\n propertyConfig: any,\n objectValue: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n fieldPrefix: string,\n): string {\n const normalizedField = normalizeBlockField(propertyConfig, propertyName)\n const fieldValue = objectValue?.[propertyName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `${fieldPrefix}-${propertyName}`,\n field_name: `${fieldPrefix}__${propertyName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction normalizeStructuredObjectValue(value: any): Record {\n if (!value) return {}\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {}\n } catch {\n return {}\n }\n }\n if (typeof value === 'object' && !Array.isArray(value)) return value\n return {}\n}\n\nfunction normalizeStructuredArrayValue(value: any): any[] {\n if (!value) return []\n if (Array.isArray(value)) return value\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction normalizeBlockDefinitions(\n rawBlocks: any,\n): Array<{ name: string; label: string; description?: string; properties: Record }> {\n if (!rawBlocks || typeof rawBlocks !== 'object') return []\n\n return Object.entries(rawBlocks)\n .filter(([name, block]) => typeof name === 'string' && block && typeof block === 'object')\n .map(([name, block]: [string, any]) => ({\n name,\n label: block.label || name,\n description: block.description,\n properties: block.properties && typeof block.properties === 'object' ? block.properties : {},\n }))\n}\n\nfunction normalizeBlocksValue(value: any, discriminator: string): any[] {\n const normalizeItem = (item: any) => {\n if (!item || typeof item !== 'object') return null\n if (item[discriminator]) return item\n if (item.blockType && item.data && typeof item.data === 'object') {\n return { [discriminator]: item.blockType, ...item.data }\n }\n return item\n }\n\n const fromArray = (items: any[]) =>\n items.map(normalizeItem).filter((item) => item && typeof item === 'object')\n\n if (Array.isArray(value)) return fromArray(value)\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? fromArray(parsed) : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction renderBlockTemplate(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n return `\n \n `\n}\n\nfunction renderBlockItem(\n field: FieldDefinition,\n blockValue: any,\n blocks: Array<{\n name: string\n label: string\n description?: string\n properties: Record\n }>,\n discriminator: string,\n index: number,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockType = blockValue?.[discriminator] || blockValue?.blockType\n const blockDefinition = blocks.find((block) => block.name === blockType)\n\n if (!blockDefinition) {\n return `\n
\n Unknown block type: ${escapeHtml(String(blockType || 'unknown'))}. This block will be preserved as-is.\n
\n `\n }\n\n const data =\n blockValue && typeof blockValue === 'object'\n ? Object.fromEntries(Object.entries(blockValue).filter(([key]) => key !== discriminator))\n : {}\n\n return renderBlockCard(field, blockDefinition, discriminator, String(index), data, pluginStatuses)\n}\n\nfunction renderBlockCard(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n index: string,\n data: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockFields = Object.entries(block.properties)\n .map(([fieldName, fieldConfig]) => {\n if (fieldConfig?.type === 'array' && fieldConfig?.items?.blocks) {\n return `\n
\n Nested blocks are not supported yet for \"${escapeHtml(fieldName)}\".\n
\n `\n }\n\n const normalizedField = normalizeBlockField(fieldConfig, fieldName)\n const fieldValue = data?.[fieldName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `block-${field.field_name}-${index}-${fieldName}`,\n field_name: `block-${field.field_name}-${index}-${fieldName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n })\n .join('')\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${escapeHtml(block.label)}\n \n
\n ${block.description ? `

${escapeHtml(block.description)}

` : ''}\n
\n
\n
\n \n \n \n \n
\n
\n
\n ${blockFields}\n
\n
\n `\n}\n\nfunction normalizeBlockField(fieldConfig: any, fieldName: string) {\n const type = fieldConfig?.type || 'text'\n const label = fieldConfig?.title || fieldName\n const required = fieldConfig?.required === true\n const options = { ...fieldConfig }\n\n if (type === 'select' && Array.isArray(fieldConfig?.enum)) {\n options.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return {\n type,\n label,\n required,\n defaultValue: fieldConfig?.default,\n options,\n }\n}\n\nfunction getStructuredFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction getBlocksFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}\n","/**\n * User Profile Custom Fields Renderer\n *\n * Generates the HTML section for custom profile fields by adapting\n * ProfileFieldDefinition into FieldDefinition and calling renderDynamicField.\n */\n\nimport { renderDynamicField, type FieldDefinition } from '../../../templates/components/dynamic-field.template'\nimport type { UserProfileConfig, ProfileFieldDefinition } from './user-profile-registry'\n\nexport function toFieldDefinition(field: ProfileFieldDefinition, index: number): FieldDefinition {\n return {\n id: `custom_${field.name}`,\n field_name: `custom_${field.name}`,\n field_type: field.type,\n field_label: field.label,\n field_options: {\n placeholder: field.placeholder || '',\n helpText: field.helpText || '',\n enum: field.options || [],\n enumLabels: field.options || [],\n },\n field_order: index,\n is_required: field.required || false,\n is_searchable: false,\n }\n}\n\nexport function renderCustomProfileSection(\n config: UserProfileConfig | null,\n customData: Record\n): string {\n if (!config || config.fields.length === 0) return ''\n\n const visibleFields = config.fields.filter(f => !f.hidden)\n if (visibleFields.length === 0) return ''\n\n const fieldsHtml = visibleFields\n .map((field, index) => {\n const fieldDef = toFieldDefinition(field, index)\n const value = customData[field.name] ?? field.default ?? ''\n return renderDynamicField(fieldDef, { value })\n })\n .join('\\n')\n\n return `\n \n
\n

Custom Profile Fields

\n
\n ${fieldsHtml}\n
\n
`\n}\n","/**\n * User Profiles Plugin\n *\n * Configurable custom profile fields for users.\n * Developers call defineUserProfile() at app boot to declare custom fields\n * that are stored as JSON in user_profiles.data and rendered in the admin UI.\n *\n * API Routes:\n * GET /api/user-profiles/schema → Public field definitions\n * GET /api/user-profiles/:userId → Get custom data for a user (auth required)\n * PUT /api/user-profiles/:userId → Update custom data for a user (auth required)\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { getUserProfileConfig } from './user-profile-registry'\nimport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\nimport { renderCustomProfileSection } from './user-profile-renderer'\n\nexport function createUserProfilesPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'user-profiles',\n version: '1.0.0-beta.1',\n description: 'Configurable custom profile fields for users',\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com',\n },\n license: 'MIT',\n compatibility: '^2.0.0',\n })\n\n // ==================== API Routes ====================\n\n const api = new Hono()\n\n // GET /api/user-profiles/schema — public schema endpoint\n api.get('/schema', (c) => {\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ fields: [], registrationFields: [] })\n }\n return c.json({\n fields: config.fields\n .filter(f => !f.hidden)\n .map(f => ({\n name: f.name,\n label: f.label,\n type: f.type,\n options: f.options,\n required: f.required || false,\n placeholder: f.placeholder,\n helpText: f.helpText,\n default: f.default,\n validation: f.validation,\n })),\n registrationFields: config.registrationFields || [],\n })\n })\n\n // GET /api/user-profiles/:userId — get custom data\n api.get('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const userId = c.req.param('userId')\n const data = await getCustomData(db, userId)\n return c.json({ userId, customData: data })\n })\n\n // PUT /api/user-profiles/:userId — update custom data\n api.put('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ error: 'No profile schema configured' }, 400)\n }\n\n const userId = c.req.param('userId')\n const body = await c.req.json()\n const customData = body.customData || body\n\n const sanitized = sanitizeCustomData(customData, config)\n const validation = validateCustomData(sanitized, config)\n if (!validation.valid) {\n return c.json({ error: 'Validation failed', errors: validation.errors }, 400)\n }\n\n await saveCustomData(db, userId, sanitized)\n return c.json({ success: true })\n })\n\n builder.addRoute('/api/user-profiles', api, {\n description: 'Custom user profile fields API',\n requiresAuth: false,\n priority: 100,\n })\n\n builder.lifecycle({\n activate: async () => {\n console.info('[SonicJS] User Profiles plugin activated')\n },\n deactivate: async () => {\n console.info('[SonicJS] User Profiles plugin deactivated')\n },\n })\n\n return builder.build() as Plugin\n}\n\nexport const userProfilesPlugin = createUserProfilesPlugin()\n\n// Re-export public API\nexport {\n defineUserProfile,\n getUserProfileConfig,\n getProfileFieldDefaults,\n getRegistrationFields,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\n\nexport { renderCustomProfileSection } from './user-profile-renderer'\n","import { Hono } from 'hono'\n// import { zValidator } from '@hono/zod-validator'\nimport { z } from 'zod'\nimport { getCookie, setCookie } from 'hono/cookie'\nimport { html } from 'hono/html'\nimport { AuthManager, requireAuth, generateCsrfToken, rateLimit } from '../middleware'\nimport { getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb } from '../middleware/auth'\nimport { renderLoginPage, LoginPageData } from '../templates/pages/auth-login.template'\nimport { renderRegisterPage, RegisterPageData } from '../templates/pages/auth-register.template'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { authValidationService, isRegistrationEnabled, isFirstUserRegistration } from '../services/auth-validation'\nimport type { RegistrationData } from '../services/auth-validation'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, getRegistrationFields, getProfileFieldDefaults, sanitizeCustomData, saveCustomData, getCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n/** Set a signed CSRF cookie alongside the auth cookie on login/register. */\nasync function setCsrfCookie(c: any, maxAge?: number): Promise {\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n const csrfToken = await generateCsrfToken(secret)\n const cookieMaxAge = maxAge ?? (await getJwtExpirySecondsFromDb(c.env?.DB, c.env))\n setCookie(c, 'csrf_token', csrfToken, {\n httpOnly: false,\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: cookieMaxAge,\n })\n}\n\n/** Clear the CSRF cookie on logout. */\nfunction clearCsrfCookie(c: any): void {\n setCookie(c, 'csrf_token', '', {\n httpOnly: false,\n secure: false,\n sameSite: 'Strict',\n path: '/',\n maxAge: 0,\n })\n}\n\nconst authRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Login page (HTML form)\nauthRoutes.get('/login', async (c) => {\n const error = c.req.query('error')\n const message = c.req.query('message')\n \n const pageData: LoginPageData = {\n error: error || undefined,\n message: message || undefined,\n version: c.get('appVersion')\n }\n \n // Check if demo login plugin is active\n const db = c.env.DB\n let demoLoginActive = false\n try {\n const plugin = await db.prepare('SELECT * FROM plugins WHERE id = ? AND status = ?')\n .bind('demo-login-prefill', 'active')\n .first()\n demoLoginActive = !!plugin\n } catch (error) {\n // Ignore database errors - plugin system might not be initialized\n }\n \n return c.html(renderLoginPage(pageData, demoLoginActive))\n})\n\n// Registration page (HTML form)\nauthRoutes.get('/register', async (c) => {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.redirect('/auth/login?error=Registration is currently disabled')\n }\n }\n\n const error = c.req.query('error')\n\n const pageData: RegisterPageData = {\n error: error || undefined\n }\n\n return c.html(renderRegisterPage(pageData))\n})\n\n// Login schema\nconst loginSchema = z.object({\n email: z.string().email('Valid email is required'),\n password: z.string().min(1, 'Password is required')\n})\n\n// Register new user\nauthRoutes.post('/register',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.json({ error: 'Registration is currently disabled' }, 403)\n }\n }\n\n // Parse JSON with error handling\n let requestData\n try {\n requestData = await c.req.json()\n } catch (parseError) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n\n let validatedData: RegistrationData\n try {\n validatedData = await validationSchema.parseAsync(requestData)\n } catch (validationError: any) {\n return c.json({\n error: 'Validation failed',\n details: validationError.issues?.map((e: any) => e.message) || [validationError.message || 'Invalid request data']\n }, 400)\n }\n\n // Extract fields with defaults for optional ones\n const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.json({ error: 'User with this email or username already exists' }, 400)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n \n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n 'viewer', // Default role\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n \n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n if (requestData[field.name] !== undefined) {\n customData[field.name] = requestData[field.name]\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, 'viewer', c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n user: {\n id: userId,\n email: normalizedEmail,\n username,\n firstName,\n lastName,\n role: 'viewer'\n },\n token\n }, 201)\n } catch (error) {\n console.error('Registration error:', error)\n // Return validation errors as 400, other errors as 500\n if (error instanceof Error && error.message.includes('validation')) {\n return c.json({ error: error.message }, 400)\n }\n return c.json({\n error: 'Registration failed',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n }\n)\n\n// Login user\nauthRoutes.post('/login',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const body = await c.req.json()\n const validation = loginSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const { email, password } = validation.data\n const db = c.env.DB\n \n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Find user with caching\n const cache = getCacheService(CACHE_CONFIGS.user!)\n let user = await cache.get(cache.generateKey('user', `email:${normalizedEmail}`))\n\n if (!user) {\n user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n\n if (user) {\n // Cache the user for faster subsequent lookups\n await cache.set(cache.generateKey('user', `email:${normalizedEmail}`), user)\n await cache.set(cache.generateKey('user', user.id), user)\n }\n }\n\n if (!user) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n // Invalidate user cache on login\n await cache.delete(cache.generateKey('user', user.id))\n await cache.delete(cache.generateKey('user', `email:${normalizedEmail}`))\n\n return c.json({\n user: {\n id: user.id,\n email: user.email,\n username: user.username,\n firstName: user.first_name,\n lastName: user.last_name,\n role: user.role\n },\n token\n })\n } catch (error) {\n console.error('Login error:', error)\n return c.json({ error: 'Login failed' }, 500)\n }\n})\n\n// Logout user (both GET and POST for convenience)\nauthRoutes.post('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.json({ message: 'Logged out successfully' })\n})\n\nauthRoutes.get('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.redirect('/auth/login?message=You have been logged out successfully')\n})\n\n// Get current user\nauthRoutes.get('/me', requireAuth(), async (c) => {\n try {\n // This would need the auth middleware applied\n const user = c.get('user')\n \n if (!user) {\n return c.json({ error: 'Not authenticated' }, 401)\n }\n \n const db = c.env.DB\n const userData = await db.prepare('SELECT id, email, username, first_name, last_name, role, created_at FROM users WHERE id = ?')\n .bind(user.userId)\n .first() as Record | null\n\n if (!userData) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n const customData = await getCustomData(db, user.userId)\n return c.json({ user: { ...userData, ...customData } })\n } catch (error) {\n console.error('Get user error:', error)\n return c.json({ error: 'Failed to get user' }, 500)\n }\n})\n\n// Refresh token (sliding session)\n//\n// Accepts a valid JWT — or one that has expired within the grace window\n// (`JWT_REFRESH_GRACE_SECONDS`, default 7 days) — and issues a fresh JWT\n// with a new `exp`. This lets a long-lived session cookie keep a user\n// logged in across JWT expirations without forcing a full re-login.\n//\n// Security: the caller must still present a valid-signature token that\n// recently belonged to an active user. Fully forged or long-expired tokens\n// are rejected.\nauthRoutes.post('/refresh',\n rateLimit({ max: 60, windowMs: 60 * 1000, keyPrefix: 'refresh' }),\n async (c) => {\n try {\n // Accept token from Authorization header or cookie\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) token = getCookie(c, 'auth_token')\n\n if (!token) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const grace = await getJwtRefreshGraceSecondsFromDb(db, c.env)\n\n const payload = await AuthManager.verifyToken(token, c.env.JWT_SECRET, grace)\n if (!payload) {\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Re-validate the user is still active, and pick up any role changes.\n const row = await db.prepare('SELECT id, email, role, is_active FROM users WHERE id = ?')\n .bind(payload.userId)\n .first() as any\n\n if (!row || !row.is_active) {\n return c.json({ error: 'User is not active' }, 401)\n }\n\n // Generate new token with a fresh exp\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env)\n const newToken = await AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set new cookie\n setCookie(c, 'auth_token', newToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n token: newToken,\n expiresIn: tokenTtl\n })\n } catch (error) {\n console.error('Token refresh error:', error)\n return c.json({ error: 'Token refresh failed' }, 500)\n }\n})\n\n// Form-based registration handler (for HTML forms)\nauthRoutes.post('/register/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.html(html`\n
\n Registration is currently disabled. Please contact an administrator.\n
\n `)\n }\n }\n\n const formData = await c.req.formData()\n\n // Extract form data\n const requestData = {\n email: formData.get('email') as string,\n password: formData.get('password') as string,\n username: formData.get('username') as string,\n firstName: formData.get('firstName') as string,\n lastName: formData.get('lastName') as string,\n }\n\n // Normalize email to lowercase\n const normalizedEmail = requestData.email?.toLowerCase()\n requestData.email = normalizedEmail\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n const validation = await validationSchema.safeParseAsync(requestData)\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const validatedData: RegistrationData = validation.data\n\n // Extract fields with defaults for optional ones\n // const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.html(html`\n
\n User with this email or username already exists\n
\n `)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Determine role: first user gets admin, others get viewer\n const role = isFirstUser ? 'admin' : 'viewer'\n\n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n\n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n role,\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n\n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n const raw = formData.get(field.name)?.toString()\n if (raw !== undefined && raw !== null) {\n customData[field.name] = raw\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Redirect based on role\n const redirectUrl = role === 'admin' ? '/admin/dashboard' : '/admin/dashboard'\n\n return c.html(html`\n
\n Account created successfully! Redirecting...\n \n
\n `)\n } catch (error) {\n console.error('Registration error:', error)\n return c.html(html`\n
\n Registration failed. Please try again.\n
\n `)\n }\n})\n\n// Form-based login handler (for HTML forms)\nauthRoutes.post('/login/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email') as string\n const password = formData.get('password') as string\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n\n // Validate the data\n const validation = loginSchema.safeParse({ email: normalizedEmail, password })\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const db = c.env.DB\n \n // Find user\n const user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n \n if (!user) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n return c.html(html`\n
\n
\n
\n \n \n \n
\n

Login successful! Redirecting to admin dashboard...

\n
\n
\n \n
\n
\n `)\n } catch (error) {\n console.error('Login error:', error)\n return c.html(html`\n
\n Login failed. Please try again.\n
\n `)\n }\n})\n\n// Test seeding endpoint (only for development/testing)\nauthRoutes.post('/seed-admin',\n rateLimit({ max: 10, windowMs: 60 * 1000, keyPrefix: 'seed-admin' }),\n async (c) => {\n try {\n const db = c.env.DB\n \n // First ensure the users table exists\n await db.prepare(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL UNIQUE,\n username TEXT NOT NULL UNIQUE,\n first_name TEXT NOT NULL,\n last_name TEXT NOT NULL,\n password_hash TEXT,\n role TEXT NOT NULL DEFAULT 'viewer',\n avatar TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n last_login_at INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `).run()\n \n // Check if admin user already exists\n const existingAdmin = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind('admin@sonicjs.com', 'admin')\n .first()\n\n if (existingAdmin) {\n // Update the password to ensure it's correct for testing\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(passwordHash, Date.now(), existingAdmin.id)\n .run()\n\n return c.json({\n message: 'Admin user already exists (password updated)',\n user: {\n id: existingAdmin.id,\n email: 'admin@sonicjs.com',\n username: 'admin',\n role: 'admin'\n }\n })\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n \n // Create admin user\n const userId = 'admin-user-id'\n const now = Date.now()\n const adminEmail = 'admin@sonicjs.com'.toLowerCase()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n adminEmail,\n 'admin',\n 'Admin',\n 'User',\n passwordHash,\n 'admin',\n 1, // is_active\n now,\n now\n ).run()\n \n return c.json({ \n message: 'Admin user created successfully',\n user: {\n id: userId,\n email: adminEmail,\n username: 'admin',\n role: 'admin'\n },\n passwordHash: passwordHash // For debugging\n })\n } catch (error) {\n console.error('Seed admin error:', error)\n return c.json({ error: 'Failed to create admin user', details: error instanceof Error ? error.message : String(error) }, 500)\n }\n})\n\n\n// Accept invitation page\nauthRoutes.get('/accept-invitation', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.html(`\n \n Invitation Expired\n \n

Invitation Expired

\n

This invitation has expired. Please contact your administrator for a new invitation.

\n Go to Login\n \n \n `)\n }\n\n // Show invitation acceptance form\n return c.html(`\n \n \n \n \n \n Accept Invitation - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Accept Invitation

\n

Complete your account setup

\n

\n You've been invited as ${invitedUser.first_name} ${invitedUser.last_name}
\n ${invitedUser.email}
\n ${invitedUser.role}\n

\n
\n\n
\n \n \n
\n \n \n
\n\n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Accept invitation page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your invitation.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process invitation acceptance\nauthRoutes.post('/accept-invitation', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const username = formData.get('username')?.toString()?.trim()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !username || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'Invalid or expired invitation' }, 400)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.json({ error: 'Invitation has expired' }, 400)\n }\n\n // Check if username is available\n const existingUsernameStmt = db.prepare(`\n SELECT id FROM users WHERE username = ? AND id != ?\n `)\n const existingUsername = await existingUsernameStmt.bind(username, invitedUser.id).first()\n\n if (existingUsername) {\n return c.json({ error: 'Username is already taken' }, 400)\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Activate user account\n const updateStmt = db.prepare(`\n UPDATE users SET \n username = ?,\n password_hash = ?,\n is_active = 1,\n email_verified = 1,\n invitation_token = NULL,\n accepted_invitation_at = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n username,\n passwordHash,\n Date.now(),\n Date.now(),\n invitedUser.id\n ).run()\n\n // Generate JWT token for auto-login\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const authToken = await AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', authToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?welcome=true')\n\n } catch (error) {\n console.error('Accept invitation error:', error)\n return c.json({ error: 'Failed to accept invitation' }, 500)\n }\n})\n\n// Request password reset\nauthRoutes.post('/request-password-reset',\n rateLimit({ max: 3, windowMs: 15 * 60 * 1000, keyPrefix: 'password-reset' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email')?.toString()?.trim()?.toLowerCase()\n\n if (!email) {\n return c.json({ error: 'Email is required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if user exists and is active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name FROM users \n WHERE email = ? AND is_active = 1\n `)\n const user = await userStmt.bind(email).first() as any\n\n // Always return success to prevent email enumeration\n if (!user) {\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.'\n })\n }\n\n // Generate password reset token (expires in 1 hour)\n const resetToken = crypto.randomUUID()\n const resetExpires = Date.now() + (60 * 60 * 1000) // 1 hour\n\n // Update user with reset token\n const updateStmt = db.prepare(`\n UPDATE users SET \n password_reset_token = ?,\n password_reset_expires = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n resetToken,\n resetExpires,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // In a real implementation, you would send an email here\n // For now, we'll return the reset link for development\n const resetLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/reset-password?token=${resetToken}`\n\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.',\n reset_link: resetLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('Password reset request error:', error)\n return c.json({ error: 'Failed to process password reset request' }, 500)\n }\n})\n\n// Show password reset form\nauthRoutes.get('/reset-password', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, password_reset_expires\n FROM users \n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has already been used.

\n Go to Login\n \n \n `)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.html(`\n \n Reset Link Expired\n \n

Reset Link Expired

\n

The password reset link has expired. Please request a new one.

\n Go to Login\n \n \n `)\n }\n\n // Show password reset form\n return c.html(`\n \n \n \n \n \n Reset Password - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Reset Password

\n

Choose a new password for your account

\n

\n Reset password for ${user.first_name} ${user.last_name}
\n ${user.email}\n

\n
\n\n
\n \n \n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n\n \n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Password reset page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your password reset.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process password reset\nauthRoutes.post('/reset-password', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, password_hash, password_reset_expires\n FROM users\n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.json({ error: 'Invalid or expired reset token' }, 400)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.json({ error: 'Reset token has expired' }, 400)\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(password)\n\n // Store old password in history (skip if table doesn't exist)\n try {\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user.id,\n user.password_hash,\n Date.now()\n ).run()\n } catch (historyError) {\n // Password history table may not exist yet\n console.warn('Could not store password history:', historyError)\n }\n\n // Update user password and clear reset token\n const updateStmt = db.prepare(`\n UPDATE users SET\n password_hash = ?,\n password_reset_token = NULL,\n password_reset_expires = NULL,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newPasswordHash,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to login with success message\n return c.redirect('/auth/login?message=Password reset successfully. Please log in with your new password.')\n\n } catch (error) {\n console.error('Password reset error:', error)\n return c.json({ error: 'Failed to reset password' }, 500)\n }\n})\n\nexport default authRoutes\n","/**\n * Test Cleanup Routes\n *\n * Provides endpoints to clean up test data after e2e tests\n * WARNING: These endpoints should only be available in development/test environments\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database } from '@cloudflare/workers-types'\n\nconst app = new Hono()\n\n/**\n * Clean up all test data (collections, content, users except admin)\n * POST /test-cleanup\n */\napp.post('/test-cleanup', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Use pattern-based deletes to avoid SQL variable limits\n // This approach uses subqueries instead of building large IN lists\n\n // Step 1: Delete child data for test content (by pattern)\n await db.prepare(`\n DELETE FROM content_versions\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM workflow_history\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n // Note: content_data table may not exist in all schemas\n try {\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n } catch (e) {\n // Table doesn't exist, skip\n }\n\n // Step 2: Delete test content by pattern\n const contentResult = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n `).run()\n deletedCount += contentResult.meta?.changes || 0\n\n // Step 3: Delete child data for test users\n await db.prepare(`\n DELETE FROM api_tokens\n WHERE user_id IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM media\n WHERE uploaded_by IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n // Step 4: Delete test users\n const usersResult = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n `).run()\n deletedCount += usersResult.meta?.changes || 0\n\n // Step 5: Delete child data for test collections\n try {\n await db.prepare(`\n DELETE FROM collection_fields\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Delete remaining content from test collections\n await db.prepare(`\n DELETE FROM content\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n\n // Step 6: Delete test collections\n const collectionsResult = await db.prepare(`\n DELETE FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).run()\n deletedCount += collectionsResult.meta?.changes || 0\n\n // Step 7: Clean up orphaned data (skip if tables don't exist)\n try {\n await db.prepare(`\n DELETE FROM content_data WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM collection_fields WHERE collection_id NOT IN (SELECT id FROM collections)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM content_versions WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM workflow_history WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Step 8: Delete old activity logs (keep only last 100)\n await db.prepare(`\n DELETE FROM activity_logs\n WHERE id NOT IN (\n SELECT id FROM activity_logs\n ORDER BY created_at DESC\n LIMIT 100\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test data cleaned up successfully'\n })\n } catch (error) {\n console.error('Test cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test users only\n * POST /test-cleanup/users\n */\napp.post('/test-cleanup/users', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test users (preserve admin)\n const result = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com'\n AND (\n email LIKE '%test%'\n OR email LIKE '%example.com%'\n OR first_name = 'Test'\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test users cleaned up successfully'\n })\n } catch (error) {\n console.error('User cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test collections only\n * POST /test-cleanup/collections\n */\napp.post('/test-cleanup/collections', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Get test collection IDs first\n const collections = await db.prepare(`\n SELECT id FROM collections\n WHERE name LIKE 'test_%'\n OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).all()\n\n if (collections.results && collections.results.length > 0) {\n const collectionIds = collections.results.map((c: any) => c.id)\n\n // Delete associated fields\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM collection_fields WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete associated content\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM content WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete the collections\n const result = await db.prepare(`\n DELETE FROM collections\n WHERE id IN (${collectionIds.map(() => '?').join(',')})\n `).bind(...collectionIds).run()\n\n deletedCount = result.meta?.changes || 0\n }\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test collections cleaned up successfully'\n })\n } catch (error) {\n console.error('Collection cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test content only\n * POST /test-cleanup/content\n */\napp.post('/test-cleanup/content', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test content\n const result = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %'\n OR title LIKE '%E2E%'\n OR title LIKE '%Playwright%'\n OR title LIKE '%Sample%'\n `).run()\n\n // Clean up orphaned content_data\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test content cleaned up successfully'\n })\n } catch (error) {\n console.error('Content cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Plugin Middleware\n *\n * Provides middleware functions for checking plugin status and enforcing plugin requirements\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n/**\n * Check if a plugin is active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @returns Promise - True if the plugin is active, false otherwise\n */\nexport async function isPluginActive(db: D1Database, pluginId: string): Promise {\n try {\n const result = await db\n .prepare('SELECT status FROM plugins WHERE id = ?')\n .bind(pluginId)\n .first()\n\n return result?.status === 'active'\n } catch (error) {\n console.error(`[isPluginActive] Error checking plugin status for ${pluginId}:`, error)\n return false\n }\n}\n\n/**\n * Middleware to require a plugin to be active\n * Throws an error if the plugin is not active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @throws Error if plugin is not active\n */\nexport async function requireActivePlugin(db: D1Database, pluginId: string): Promise {\n const isActive = await isPluginActive(db, pluginId)\n if (!isActive) {\n throw new Error(`Plugin '${pluginId}' is required but is not active`)\n }\n}\n\n/**\n * Middleware to require multiple plugins to be active\n * Throws an error if any plugin is not active\n * @param db - The D1 database instance\n * @param pluginIds - Array of plugin IDs to check\n * @throws Error if any plugin is not active\n */\nexport async function requireActivePlugins(db: D1Database, pluginIds: string[]): Promise {\n for (const pluginId of pluginIds) {\n await requireActivePlugin(db, pluginId)\n }\n}\n\n/**\n * Get all active plugins\n * @param db - The D1 database instance\n * @returns Promise - Array of active plugin records\n */\nexport async function getActivePlugins(db: D1Database): Promise {\n try {\n const { results } = await db\n .prepare('SELECT * FROM plugins WHERE status = ?')\n .bind('active')\n .all()\n\n return results || []\n } catch (error) {\n console.error('[getActivePlugins] Error fetching active plugins:', error)\n return []\n }\n}\n","export interface ContentVersion {\n id: string\n version: number\n data: any\n author_id: string\n author_name?: string\n created_at: number\n is_current?: boolean\n}\n\nexport interface VersionHistoryData {\n contentId: string\n versions: ContentVersion[]\n currentVersion: number\n}\n\nexport function renderVersionHistory(data: VersionHistoryData): string {\n return `\n
\n
\n \n
\n
\n
\n

Version History

\n \n
\n
\n \n \n
\n
\n ${data.versions.map((version, index) => `\n
\n
\n
\n \n Version ${version.version}${version.is_current ? ' (Current)' : ''}\n \n \n ${new Date(version.created_at).toLocaleString()}\n \n
\n
\n ${!version.is_current ? `\n \n ` : ''}\n \n
\n
\n \n \n
\n
\n
\n Title:\n ${escapeHtml(version.data?.title || 'Untitled')}\n
\n
\n Author:\n ${escapeHtml(version.author_name || 'Unknown')}\n
\n ${version.data?.excerpt ? `\n
\n Excerpt:\n

${escapeHtml(version.data.excerpt.substring(0, 200))}${version.data.excerpt.length > 200 ? '...' : ''}

\n
\n ` : ''}\n
\n
\n \n \n ${!version.is_current && index < data.versions.length - 1 ? `\n
\n \n
\n Change detection coming soon...\n
\n
\n ` : ''}\n
\n `).join('')}\n
\n
\n \n \n
\n
\n \n ${data.versions.length} version${data.versions.length !== 1 ? 's' : ''} total\n \n \n
\n
\n
\n
\n \n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * EasyMDE Markdown Editor Plugin\n *\n * Provides markdown editing capabilities for richtext fields.\n * When active, this plugin injects the EasyMDE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'easy-mdx',\n version: '1.0.0',\n description: 'Lightweight markdown editor with live preview'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ EasyMDE editor plugin activated')\n },\n deactivate: async () => {\n console.info('❌ EasyMDE editor plugin deactivated')\n }\n})\n\nconst easyMdxPlugin = builder.build() as Plugin\n\nexport default easyMdxPlugin\n\n/**\n * Get EasyMDE CDN script tags\n * @returns HTML script and style tags for EasyMDE\n */\nexport function getMDXEditorScripts(): string {\n return `\n \n \n \n \n `\n}\n\n/**\n * Get EasyMDE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getMDXEditorInitScript(config?: {\n defaultHeight?: number\n toolbar?: string\n placeholder?: string\n}): string {\n const defaultHeight = config?.defaultHeight || 400\n const toolbar = config?.toolbar || 'full'\n const placeholder = config?.placeholder || 'Start writing your content...'\n\n return `\n // Initialize EasyMDE (Markdown Editor) only for markdown-marked fields\n function initializeMDXEditor() {\n if (typeof EasyMDE === 'undefined') {\n console.warn('EasyMDE not loaded yet, retrying...');\n setTimeout(initializeMDXEditor, 100);\n return;\n }\n\n // Find all textareas that need EasyMDE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"easymde\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (textarea.dataset.mdxeditorInitialized === 'true') {\n return;\n }\n\n // Mark as initialized\n textarea.dataset.mdxeditorInitialized = 'true';\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const editorToolbar = container?.dataset.toolbar || '${toolbar}';\n\n // Initialize EasyMDE\n try {\n const toolbarButtons = editorToolbar === 'minimal'\n ? ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'preview']\n : ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', 'table', '|', 'preview', 'side-by-side', 'fullscreen', '|', 'guide'];\n\n const easyMDE = new EasyMDE({\n element: textarea,\n placeholder: '${placeholder}',\n spellChecker: false,\n minHeight: height + 'px',\n toolbar: toolbarButtons,\n status: ['lines', 'words', 'cursor'],\n renderingConfig: {\n singleLineBreaks: false,\n codeSyntaxHighlighting: true\n }\n });\n\n // Store reference to editor instance\n textarea.easyMDEInstance = easyMDE;\n\n // Sync changes back to textarea\n easyMDE.codemirror.on(\"change\", () => {\n textarea.value = easyMDE.value();\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n textarea.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n\n console.log('EasyMDE initialized for field:', textarea.id || textarea.name);\n } catch (error) {\n console.error('Error initializing EasyMDE:', error);\n // Show textarea as fallback\n textarea.style.display = 'block';\n }\n });\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeMDXEditor);\n } else {\n // DOM already loaded, initialize immediately\n initializeMDXEditor();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeMDXEditor, 100);\n });\n `\n}\n\n/**\n * Check if EasyMDE editor plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isEasyMdxActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('easy-mdx')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking EasyMDE editor plugin status:', error)\n return false\n }\n}\n","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * TinyMCE Rich Text Editor Plugin\n *\n * Provides WYSIWYG editing capabilities for richtext fields.\n * When active, this plugin injects the TinyMCE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'tinymce-plugin',\n version: '1.0.0',\n description: 'Powerful WYSIWYG rich text editor for content creation'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ TinyMCE plugin activated')\n },\n deactivate: async () => {\n console.info('❌ TinyMCE plugin deactivated')\n }\n})\n\nconst tinymcePlugin = builder.build() as Plugin\n\nexport default tinymcePlugin\n\n/**\n * Get TinyMCE CDN script tag\n * @param apiKey - Optional TinyMCE API key (defaults to 'no-api-key')\n * @returns HTML script tag for TinyMCE CDN\n */\nexport function getTinyMCEScript(apiKey: string = 'no-api-key'): string {\n return ``\n}\n\n/**\n * Get TinyMCE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getTinyMCEInitScript(config?: {\n skin?: string\n defaultHeight?: number\n defaultToolbar?: string\n}): string {\n const skin = config?.skin || 'oxide-dark'\n const contentCss = skin.includes('dark') ? 'dark' : 'default'\n const defaultHeight = config?.defaultHeight || 300\n\n return `\n // Initialize TinyMCE only for TinyMCE-backed richtext fields\n function initializeTinyMCE() {\n if (typeof tinymce !== 'undefined') {\n // Find all textareas that need TinyMCE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"tinymce\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (tinymce.get(textarea.id)) {\n return;\n }\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const toolbar = container?.dataset.toolbar || 'full';\n\n tinymce.init({\n selector: '#' + textarea.id,\n skin: '${skin}',\n content_css: '${contentCss}',\n height: parseInt(height),\n menubar: false,\n plugins: [\n 'advlist', 'autolink', 'lists', 'link', 'image', 'charmap', 'preview',\n 'anchor', 'searchreplace', 'visualblocks', 'code', 'fullscreen',\n 'insertdatetime', 'media', 'table', 'help', 'wordcount'\n ],\n toolbar: toolbar === 'simple'\n ? 'bold italic underline | bullist numlist | link'\n : toolbar === 'minimal'\n ? 'bold italic | link'\n : 'undo redo | blocks | bold italic forecolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | help',\n content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; font-size: 14px }'\n });\n });\n }\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeTinyMCE);\n } else {\n // DOM already loaded, initialize immediately\n initializeTinyMCE();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeTinyMCE, 100);\n });\n `\n}\n\n/**\n * Check if TinyMCE plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isTinyMCEActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('tinymce-plugin')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking TinyMCE plugin status:', error)\n return false\n }\n}\n","/**\n * Quill Rich Text Editor Plugin\n *\n * Provides Quill editor integration for rich text editing in SonicJS\n * https://quilljs.com/\n */\n\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\n/**\n * Quill Editor Configuration Options\n */\nexport interface QuillOptions {\n theme?: 'snow' | 'bubble'\n placeholder?: string\n height?: number\n toolbar?: 'full' | 'simple' | 'minimal' | string[][]\n modules?: Record\n formats?: string[]\n}\n\n/**\n * Default Quill toolbar configurations\n */\nconst QUILL_TOOLBARS = {\n full: [\n [{ 'header': [1, 2, 3, 4, 5, 6, false] }],\n ['bold', 'italic', 'underline', 'strike'],\n [{ 'color': [] }, { 'background': [] }],\n [{ 'align': [] }],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n [{ 'indent': '-1'}, { 'indent': '+1' }],\n ['blockquote', 'code-block'],\n ['link', 'image', 'video'],\n ['clean']\n ],\n simple: [\n ['bold', 'italic', 'underline'],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n ['link']\n ],\n minimal: [\n ['bold', 'italic'],\n ['link']\n ]\n}\n\n/**\n * Render a Quill editor field\n * @param fieldId - The field ID\n * @param fieldName - The field name\n * @param value - The current value\n * @param options - Quill configuration options\n * @returns HTML string for the Quill editor field\n */\nexport function renderQuillField(\n fieldId: string,\n fieldName: string,\n value: string = '',\n options: QuillOptions = {}\n): string {\n const {\n theme = 'snow',\n placeholder = 'Enter content...',\n height = 300,\n toolbar = 'full'\n } = options\n\n // Escape HTML for hidden input\n const escapeHtml = (str: string) => {\n return str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n }\n\n return `\n
\n \n ${value}
\n\n \n \n \n `\n}\n\n/**\n * Generate Quill initialization script\n * @returns HTML script tag with Quill initialization code\n */\nexport function getQuillInitScript(): string {\n return `\n \n `\n}\n\n/**\n * Generate Quill CDN links\n * @param version - Quill version (default: 2.0.2)\n * @returns HTML script and link tags for Quill CDN\n */\nexport function getQuillCDN(version: string = '2.0.2'): string {\n return `\n \n \n \n\n \n \n\n \n \n `\n}\n\n/**\n * Create the Quill Editor Plugin\n */\nexport function createQuillEditorPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'quill-editor',\n version: '1.0.0',\n description: 'Quill rich text editor integration for SonicJS'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Quill Editor plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Quill Editor plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const quillEditorPlugin = createQuillEditorPlugin()\n","import { getMDXEditorInitScript, getMDXEditorScripts } from '../../plugins/available/easy-mdx'\nimport { getTinyMCEInitScript, getTinyMCEScript } from '../../plugins/available/tinymce-plugin'\nimport { getQuillCDN, getQuillInitScript } from '../../plugins/core-plugins/quill-editor'\nimport { renderAlert } from '../alert.template'\nimport { FieldDefinition, renderDynamicField, renderFieldGroup } from '../components/dynamic-field.template'\nimport { getConfirmationDialogScript, renderConfirmationDialog } from '../confirmation-dialog.template'\nimport { AdminLayoutCatalystData, renderAdminLayoutCatalyst } from '../layouts/admin-layout-catalyst.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n schema: any\n}\n\nexport interface ContentFormData {\n id?: string\n title?: string\n slug?: string\n created_at?: number\n updated_at?: number\n published_at?: number\n data?: any\n status?: string\n scheduled_publish_at?: number\n scheduled_unpublish_at?: number\n review_status?: string\n meta_title?: string\n meta_description?: string\n collection: Collection\n fields: FieldDefinition[]\n isEdit?: boolean\n error?: string\n success?: string\n validationErrors?: Record\n workflowEnabled?: boolean // New flag to indicate if workflow plugin is active\n tinymceEnabled?: boolean // Flag to indicate if TinyMCE plugin is active\n tinymceSettings?: {\n apiKey?: string\n defaultHeight?: number\n defaultToolbar?: string\n skin?: string\n }\n quillEnabled?: boolean // Flag to indicate if Quill plugin is active\n quillSettings?: {\n version?: string\n defaultHeight?: number\n defaultToolbar?: string\n theme?: string\n }\n mdxeditorEnabled?: boolean // Flag to indicate if MDXEditor plugin is active\n mdxeditorSettings?: {\n defaultHeight?: number\n theme?: string\n toolbar?: string\n placeholder?: string\n }\n referrerParams?: string // URL parameters to preserve filters when returning to list\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentFormPage(data: ContentFormData): string {\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? `Edit: ${data.title || 'Content'}` : `New ${data.collection.display_name}`\n const hasValidationErrors = Boolean(data.validationErrors && Object.keys(data.validationErrors).length > 0)\n\n // Construct back URL with preserved filters\n const backUrl = data.referrerParams\n ? `/admin/content?${data.referrerParams}`\n : `/admin/content?collection=${data.collection.id}`\n\n // Group fields by category\n const coreFields = data.fields.filter(f => ['title', 'slug', 'content'].includes(f.field_name))\n const contentFields = data.fields.filter(f => !['title', 'slug', 'content'].includes(f.field_name) && !f.field_name.startsWith('meta_'))\n const metaFields = data.fields.filter(f => f.field_name.startsWith('meta_'))\n\n // Helper function to get field value - title and slug are stored as columns, others in data JSON\n const getFieldValue = (fieldName: string) => {\n if (fieldName === 'title') return data.title || data.data?.[fieldName] || ''\n if (fieldName === 'slug') return data.slug || data.data?.[fieldName] || ''\n return data.data?.[fieldName] || ''\n }\n\n // Prepare plugin statuses for field rendering\n const pluginStatuses = {\n quillEnabled: data.quillEnabled || false,\n mdxeditorEnabled: data.mdxeditorEnabled || false,\n tinymceEnabled: data.tinymceEnabled || false\n }\n\n // Render field groups\n const coreFieldsHTML = coreFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id // Pass content ID when editing\n }))\n\n const contentFieldsHTML = contentFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const metaFieldsHTML = metaFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const pageContent = `\n
\n \n
\n
\n

${isEdit ? 'Edit Content' : 'New Content'}

\n

\n ${data.collection.description || `Manage ${data.collection.display_name.toLowerCase()} content`}\n

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

${data.collection.display_name}

\n

${isEdit ? 'Update your content' : 'Create new content'}

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n
\n \n
\n \n \n ${isEdit ? `` : ''}\n ${data.referrerParams ? `` : ''}\n \n \n ${renderFieldGroup('Basic Information', coreFieldsHTML)}\n \n \n ${contentFields.length > 0 ? renderFieldGroup('Content Details', contentFieldsHTML) : ''}\n \n \n ${metaFields.length > 0 ? renderFieldGroup('SEO & Metadata', metaFieldsHTML, true) : ''}\n \n
\n \n
\n\n \n
\n \n
\n

Publishing

\n\n ${data.workflowEnabled ? `\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n \n

Leave empty to publish immediately

\n
\n\n \n
\n \n \n

Automatically unpublish at this time

\n
\n ` : `\n \n
\n \n
\n \n \n \n \n \n \n \n
\n

Enable Workflow plugin for advanced status management

\n
\n `}\n
\n\n \n ${isEdit ? `\n
\n

Content Info

\n\n
\n
\n
Created
\n
${data.created_at ? new Date(data.created_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Last Modified
\n
${data.updated_at ? new Date(data.updated_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Author
\n
${data.data?.author || 'Unknown'}
\n
\n ${data.published_at ? `\n
\n
Published
\n
${new Date(data.published_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n\n
\n \n \n \n \n View Version History\n \n
\n
\n ` : ''}\n\n \n
\n

Quick Actions

\n\n
\n \n \n \n \n \n Preview Content\n \n\n \n \n \n \n Duplicate Content\n \n\n ${isEdit ? `\n \n \n \n \n Delete Content\n \n ` : ''}\n
\n
\n
\n\n \n
\n \n \n \n \n Cancel\n \n\n
\n \n \n \n \n ${isEdit ? 'Update' : 'Save'}\n \n\n ${data.user?.role !== 'viewer' ? `\n \n \n \n \n ${isEdit ? 'Update' : 'Save'} & Publish\n \n ` : ''}\n
\n
\n
\n
\n
\n\n \n ${renderConfirmationDialog({\n id: 'duplicate-content-confirm',\n title: 'Duplicate Content',\n message: 'Create a copy of this content?',\n confirmText: 'Duplicate',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performDuplicateContent()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-content-confirm',\n title: 'Delete Content',\n message: 'Are you sure you want to delete this content? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: `performDeleteContent('${data.id}')`\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-repeater-item-confirm',\n title: 'Delete Item',\n message: 'Are you sure you want to delete this item? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-block-confirm',\n title: 'Delete Block',\n message: 'Are you sure you want to delete this block? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${getConfirmationDialogScript()}\n\n ${data.tinymceEnabled ? getTinyMCEScript(data.tinymceSettings?.apiKey) : ''}\n\n ${data.quillEnabled ? getQuillCDN(data.quillSettings?.version) : ''}\n\n ${data.quillEnabled ? getQuillInitScript() : ''}\n\n ${data.mdxeditorEnabled ? getMDXEditorScripts() : ''}\n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n content: pageContent,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderTable, TableData, TableColumn } from '../table.template'\nimport type { FilterBarData } from '../filter-bar.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../confirmation-dialog.template'\n\nexport interface ContentItem {\n id: string\n title: string\n slug: string\n modelName: string\n statusBadge: string\n authorName: string\n formattedDate: string\n availableActions: string[]\n}\n\nexport interface ContentListPageData {\n modelName: string\n status: string\n page: number\n search?: string\n models: Array<{\n name: string\n displayName: string\n }>\n contentItems: ContentItem[]\n totalItems: number\n itemsPerPage: number\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentListPage(data: ContentListPageData): string {\n // Build current URL parameters to pass to edit page\n const urlParams = new URLSearchParams()\n if (data.modelName && data.modelName !== 'all') urlParams.set('model', data.modelName)\n if (data.status && data.status !== 'all') urlParams.set('status', data.status)\n if (data.search) urlParams.set('search', data.search)\n if (data.page && data.page !== 1) urlParams.set('page', data.page.toString())\n const currentParams = urlParams.toString()\n\n // Check if filters are active (not in default state)\n const hasActiveFilters = data.modelName !== 'all' || data.status !== 'all' || !!data.search\n\n // Prepare filter bar data\n const filterBarData: FilterBarData = {\n filters: [\n {\n name: 'model',\n label: 'Model',\n options: [\n { value: 'all', label: 'All Models', selected: data.modelName === 'all' },\n ...data.models.map(model => ({\n value: model.name,\n label: model.displayName,\n selected: data.modelName === model.name\n }))\n ]\n },\n {\n name: 'status',\n label: 'Status',\n options: [\n { value: 'all', label: 'All Status', selected: data.status === 'all' },\n { value: 'draft', label: 'Draft', selected: data.status === 'draft' },\n { value: 'review', label: 'Under Review', selected: data.status === 'review' },\n { value: 'scheduled', label: 'Scheduled', selected: data.status === 'scheduled' },\n { value: 'published', label: 'Published', selected: data.status === 'published' },\n { value: 'archived', label: 'Archived', selected: data.status === 'archived' },\n { value: 'deleted', label: 'Deleted', selected: data.status === 'deleted' }\n ]\n }\n ],\n actions: [\n {\n label: 'Advanced Search',\n className: 'btn-primary',\n onclick: 'openAdvancedSearch()'\n },\n {\n label: 'Refresh',\n className: 'btn-secondary',\n onclick: 'location.reload()'\n }\n ],\n bulkActions: [\n { label: 'Publish', value: 'publish', icon: 'check-circle' },\n { label: 'Unpublish', value: 'unpublish', icon: 'x-circle' },\n { label: 'Delete', value: 'delete', icon: 'trash', className: 'text-pink-600' }\n ]\n }\n\n // Prepare table data\n const tableColumns: TableColumn[] = [\n {\n key: 'title',\n label: 'Title',\n sortable: true,\n sortType: 'string',\n render: (value, row) => `\n
\n
\n \n
${row.slug}
\n
\n
\n `\n },\n {\n key: 'modelName',\n label: 'Model',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'statusBadge',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (value) => value\n },\n {\n key: 'authorName',\n label: 'Author',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'formattedDate',\n label: 'Updated',\n sortable: true,\n sortType: 'date',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n className: 'text-sm font-medium',\n render: (value, row) => `\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'content-table',\n columns: tableColumns,\n rows: data.contentItems,\n selectable: true,\n rowClickable: true,\n rowClickUrl: (row: ContentItem) => `/admin/content/${row.id}/edit${currentParams ? `?ref=${encodeURIComponent(currentParams)}` : ''}`,\n emptyMessage: 'No content found. Create your first content item to get started.'\n }\n\n // Prepare pagination data\n const totalPages = Math.ceil(data.totalItems / data.itemsPerPage)\n const startItem = (data.page - 1) * data.itemsPerPage + 1\n const endItem = Math.min(data.page * data.itemsPerPage, data.totalItems)\n\n const paginationData: PaginationData = {\n currentPage: data.page,\n totalPages,\n totalItems: data.totalItems,\n itemsPerPage: data.itemsPerPage,\n startItem,\n endItem,\n baseUrl: '/admin/content',\n queryParams: {\n model: data.modelName,\n status: data.status,\n ...(data.search ? { search: data.search } : {})\n },\n showPageSizeSelector: true,\n pageSizeOptions: [10, 20, 50, 100]\n }\n\n // Generate page content\n const pageContent = `\n
\n \n
\n
\n

Content Management

\n

Manage and organize your content items

\n
\n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n \n
\n \n
\n \n \n ${data.models.map(model => `\n \n `).join('')}\n \n \n \n \n
\n
\n\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n
\n ${data.totalItems} ${data.totalItems === 1 ? 'item' : 'items'}\n ${filterBarData.actions?.map(action => `\n \n ${action.label === 'Refresh' ? `\n \n \n \n ` : ''}\n ${action.label}\n \n `).join('') || ''}\n ${filterBarData.bulkActions && filterBarData.bulkActions.length > 0 ? `\n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n \n Move to Draft\n \n
\n
\n \n \n \n \n Delete Selected\n \n
\n
\n
\n ` : ''}\n
\n
\n
\n
\n
\n \n \n
\n ${renderTable(tableData)}\n ${renderPagination(paginationData)}\n
\n \n
\n \n \n
\n
\n \n \n\n \n ${renderConfirmationDialog({\n id: 'bulk-action-confirm',\n title: 'Confirm Bulk Action',\n message: 'Are you sure you want to perform this action? This operation will affect multiple items.',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n iconColor: 'blue',\n onConfirm: 'executeBulkAction()'\n })}\n\n \n ${getConfirmationDialogScript()}\n\n \n
\n
\n \n
\n\n \n
\n
\n \n
\n

\n 🔍 Advanced Search\n

\n \n
\n\n \n
\n \n
\n \n
\n \n
\n
\n
\n\n \n
\n \n
\n \n \n
\n
\n\n \n
\n

Filters

\n \n
\n \n
\n \n \n \n ${data.models.map(\n (model) => `\n \n `\n ).join('')}\n \n

Hold Ctrl/Cmd to select multiple

\n
\n\n \n
\n \n \n \n \n \n \n \n \n
\n
\n
\n\n \n
\n \n Cancel\n \n \n Search\n \n
\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n // Prepare layout data\n const layoutData: AdminLayoutCatalystData = {\n title: 'Content Management',\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export function resolveSchemaFieldType(fieldConfig: Record): string {\n if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n return 'slug'\n }\n\n if (fieldConfig.type && fieldConfig.type !== 'string') {\n return fieldConfig.type\n }\n\n if (fieldConfig.format === 'richtext') {\n return 'richtext'\n }\n\n if (fieldConfig.format === 'media') {\n return 'media'\n }\n\n if (fieldConfig.format === 'date-time') {\n return 'date'\n }\n\n if (Array.isArray(fieldConfig.enum)) {\n return 'select'\n }\n\n return fieldConfig.type || 'string'\n}\n\nexport function buildSchemaFieldOptions(fieldConfig: Record): Record {\n const fieldOptions = { ...fieldConfig }\n const resolvedFieldType = resolveSchemaFieldType(fieldConfig)\n\n if (resolvedFieldType === 'select' && Array.isArray(fieldConfig.enum)) {\n fieldOptions.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return fieldOptions\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { Bindings, Variables } from '../app'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { CACHE_CONFIGS, getCacheService } from '../services/cache'\nimport { PluginService } from '../services/plugin-service'\nimport { ContentVersion, renderVersionHistory, VersionHistoryData } from '../templates/components/version-history.template'\nimport { ContentFormData, renderContentFormPage } from '../templates/pages/admin-content-form.template'\nimport { ContentListPageData, renderContentListPage } from '../templates/pages/admin-content-list.template'\nimport { getBlocksFieldConfig, parseBlocksValue } from '../utils/blocks'\nimport { escapeHtml, sanitizeRichText } from '../utils/sanitize'\nimport { buildSchemaFieldOptions, resolveSchemaFieldType } from './admin-content-field-types'\n\nconst adminContentRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Field definition type for form processing\ninterface FieldDefinition {\n field_name: string\n field_label: string\n field_type: string\n field_options?: any\n is_required?: boolean\n}\n\n// Result of parsing a single field value\ninterface ParsedFieldResult {\n value: any\n errors: string[]\n}\n\n/**\n * Parse a single field value from form data with validation\n * Centralizes field parsing logic used in POST, PUT, and preview handlers\n */\nfunction parseFieldValue(\n field: FieldDefinition,\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): ParsedFieldResult {\n const { skipValidation = false } = options\n const value = formData.get(field.field_name)\n const errors: string[] = []\n\n // Handle blocks fields (array with blocks config)\n const blocksConfig = getBlocksFieldConfig(field.field_options)\n if (blocksConfig) {\n const parsed = parseBlocksValue(value, blocksConfig)\n if (!skipValidation && field.is_required && parsed.value.length === 0) {\n parsed.errors.push(`${field.field_label} is required`)\n }\n return { value: parsed.value, errors: parsed.errors }\n }\n\n // Required field validation\n if (!skipValidation && field.is_required && (!value || value.toString().trim() === '')) {\n return { value: null, errors: [`${field.field_label} is required`] }\n }\n\n // Type-specific parsing\n switch (field.field_type) {\n case 'number':\n if (value && isNaN(Number(value))) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a valid number`)\n }\n return { value: null, errors }\n }\n return { value: value ? Number(value) : null, errors: [] }\n\n case 'boolean':\n // Check for the hidden _submitted field to determine if checkbox was rendered\n const submitted = formData.get(`${field.field_name}_submitted`)\n return { value: submitted ? value === 'true' : false, errors: [] }\n\n case 'select':\n if (field.field_options?.multiple) {\n return { value: formData.getAll(`${field.field_name}[]`), errors: [] }\n }\n return { value: value, errors: [] }\n\n case 'array': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: [], errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON array`)\n }\n return { value: [], errors }\n }\n if (!skipValidation && field.is_required && parsed.length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: [], errors }\n }\n }\n\n case 'object': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: {}, errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON object`)\n }\n return { value: {}, errors }\n }\n if (!skipValidation && field.is_required && Object.keys(parsed).length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: {}, errors }\n }\n }\n\n case 'json': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: null, errors }\n }\n try {\n return { value: JSON.parse(value.toString()), errors: [] }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: null, errors }\n }\n }\n\n default:\n return { value: value, errors: [] }\n }\n}\n\n/**\n * Extract all field values from form data\n */\nfunction extractFieldData(\n fields: FieldDefinition[],\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): { data: Record; errors: Record } {\n const data: Record = {}\n const errors: Record = {}\n\n for (const field of fields) {\n const result = parseFieldValue(field, formData, options)\n data[field.field_name] = result.value\n if (result.errors.length > 0) {\n errors[field.field_name] = result.errors\n }\n }\n\n return { data, errors }\n}\n\n// Apply authentication middleware\nadminContentRoutes.use('*', requireAuth())\n\n// Get collection fields\nasync function getCollectionFields(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('fields', collectionId),\n async () => {\n // First, check if collection has a schema (code-based collection)\n const collectionStmt = db.prepare('SELECT schema FROM collections WHERE id = ?')\n const collectionRow = await collectionStmt.bind(collectionId).first() as any\n\n if (collectionRow && collectionRow.schema) {\n try {\n const schema = typeof collectionRow.schema === 'string' ? JSON.parse(collectionRow.schema) : collectionRow.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n return Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n const fieldOptions = buildSchemaFieldOptions(fieldConfig)\n\n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: resolveSchemaFieldType(fieldConfig),\n field_label: fieldConfig.title || fieldName,\n field_options: fieldOptions,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table for legacy collections\n const stmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results } = await stmt.bind(collectionId).all()\n\n return (results || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }))\n }\n )\n}\n\n// Get collection by ID\nasync function getCollection(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('collection', collectionId),\n async () => {\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ? AND is_active = 1')\n const collection = await stmt.bind(collectionId).first() as any\n\n if (!collection) return null\n\n return {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n schema: collection.schema ? JSON.parse(collection.schema) : {}\n }\n }\n )\n}\n\n// Content list (main page)\nadminContentRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const db = c.env.DB\n\n // Get query parameters\n const page = parseInt(url.searchParams.get('page') || '1')\n const limit = parseInt(url.searchParams.get('limit') || '20')\n const modelName = url.searchParams.get('model') || 'all'\n const status = url.searchParams.get('status') || 'all'\n const search = url.searchParams.get('search') || ''\n const offset = (page - 1) * limit\n\n // Get all collections for filter dropdown (exclude form-sourced)\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results: collectionsResults } = await collectionsStmt.all()\n const models = (collectionsResults || []).map((row: any) => ({\n name: row.name,\n displayName: row.display_name\n }))\n\n // Build where conditions\n const conditions: string[] = []\n const params: any[] = []\n\n // Hide content from form-sourced collections in the regular content list\n conditions.push(\"(col.source_type IS NULL OR col.source_type = 'user')\")\n\n // Always filter out deleted content unless specifically requested\n if (status !== 'deleted') {\n conditions.push(\"c.status != 'deleted'\")\n }\n\n if (search) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n params.push(`%${search}%`, `%${search}%`, `%${search}%`)\n }\n\n if (modelName !== 'all') {\n conditions.push('col.name = ?')\n params.push(modelName)\n }\n\n if (status !== 'all' && status !== 'deleted') {\n conditions.push('c.status = ?')\n params.push(status)\n } else if (status === 'deleted') {\n conditions.push(\"c.status = 'deleted'\")\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n JOIN collections col ON c.collection_id = col.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalItems = countResult?.count || 0\n\n // Get content items\n const contentStmt = db.prepare(`\n SELECT c.id, c.title, c.slug, c.status, c.created_at, c.updated_at,\n col.name as collection_name, col.display_name as collection_display_name,\n u.first_name, u.last_name, u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n const { results } = await contentStmt.bind(...params, limit, offset).all()\n\n // Process content items\n const contentItems = (results || []).map((row: any) => {\n const statusConfig: Record = {\n draft: {\n class: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-1 ring-inset ring-zinc-600/20 dark:ring-zinc-500/20',\n text: 'Draft'\n },\n review: {\n class: 'bg-amber-50 dark:bg-amber-500/10 text-amber-700 dark:text-amber-400 ring-1 ring-inset ring-amber-600/20 dark:ring-amber-500/20',\n text: 'Under Review'\n },\n scheduled: {\n class: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-600/20 dark:ring-blue-500/20',\n text: 'Scheduled'\n },\n published: {\n class: 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-400 ring-1 ring-inset ring-green-600/20 dark:ring-green-500/20',\n text: 'Published'\n },\n archived: {\n class: 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-400 ring-1 ring-inset ring-purple-600/20 dark:ring-purple-500/20',\n text: 'Archived'\n },\n deleted: {\n class: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-600/20 dark:ring-red-500/20',\n text: 'Deleted'\n }\n }\n\n const config = statusConfig[row.status as keyof typeof statusConfig] || statusConfig.draft\n const statusBadge = `\n \n ${config?.text || row.status}\n \n `\n\n const authorName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.author_email || 'Unknown'\n\n const formattedDate = new Date(row.updated_at).toLocaleDateString()\n\n // Determine available workflow actions based on status\n const availableActions: string[] = []\n switch (row.status) {\n case 'draft':\n availableActions.push('submit_for_review', 'publish')\n break\n case 'review':\n availableActions.push('approve', 'request_changes')\n break\n case 'published':\n availableActions.push('unpublish', 'archive')\n break\n case 'scheduled':\n availableActions.push('unschedule')\n break\n }\n\n return {\n id: row.id,\n title: row.title,\n slug: row.slug,\n modelName: row.collection_display_name,\n statusBadge,\n authorName,\n formattedDate,\n availableActions\n }\n })\n\n const pageData: ContentListPageData = {\n modelName,\n status,\n page,\n search,\n models,\n contentItems,\n totalItems,\n itemsPerPage: limit,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentListPage(pageData))\n } catch (error) {\n console.error('Error fetching content list:', error)\n return c.html(`

Error loading content: ${error}

`)\n }\n})\n\n// New content form\nadminContentRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const collectionId = url.searchParams.get('collection')\n\n if (!collectionId) {\n // Show collection selection page\n const db = c.env.DB\n // Exclude form-sourced collections — users shouldn't manually create content in form collections\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name, description FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results } = await collectionsStmt.all()\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description\n }))\n\n // Render collection selection page\n const selectionHTML = `\n \n \n \n Select Collection - SonicJS AI Admin\n \n \n \n
\n
\n

Create New Content

\n

Select a collection to create content in:

\n \n
\n ${collections.map(collection => `\n \n

${collection.display_name}

\n

${collection.description || 'No description'}

\n
\n `).join('')}\n
\n \n \n
\n
\n \n \n `\n\n return c.html(selectionHTML)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n console.log('[Content Form /new] Editor plugins status:', {\n tinymce: tinymceEnabled,\n quill: quillEnabled,\n mdxeditor: mdxeditorEnabled,\n mdxeditorSettings\n })\n\n const formData: ContentFormData = {\n collection,\n fields,\n isEdit: false,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading new content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content form.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Edit content form\nadminContentRoutes.get('/:id/edit', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n\n // Capture referrer parameters to preserve filters when returning to list\n const referrerParams = url.searchParams.get('ref') || ''\n\n // Get content with caching\n const cache = getCacheService(CACHE_CONFIGS.content!)\n const content = await cache.getOrSet(\n cache.generateKey('content', id),\n async () => {\n const contentStmt = db.prepare(`\n SELECT c.*, col.id as collection_id, col.name as collection_name,\n col.display_name as collection_display_name, col.description as collection_description,\n col.schema as collection_schema\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n return await contentStmt.bind(id).first() as any\n }\n )\n\n if (!content) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Content not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const collection = {\n id: content.collection_id,\n name: content.collection_name,\n display_name: content.collection_display_name,\n description: content.collection_description,\n schema: content.collection_schema ? JSON.parse(content.collection_schema) : {}\n }\n\n const fields = await getCollectionFields(db, content.collection_id)\n const contentData = content.data ? JSON.parse(content.data) : {}\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n const formData: ContentFormData = {\n id: content.id,\n title: content.title,\n slug: content.slug,\n created_at: content.created_at,\n updated_at: content.updated_at,\n published_at: content.published_at,\n data: contentData,\n status: content.status,\n scheduled_publish_at: content.scheduled_publish_at,\n scheduled_unpublish_at: content.scheduled_unpublish_at,\n review_status: content.review_status,\n meta_title: content.meta_title,\n meta_description: content.meta_description,\n collection,\n fields,\n isEdit: true,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n referrerParams,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading edit content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content for editing.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Create content\nadminContentRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n const action = formData.get('action') as string\n\n if (!collectionId) {\n return c.html(html`\n
\n Collection ID is required.\n
\n `)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n // Check for validation errors\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Generate slug if not provided\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || 'draft'\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Create content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n // Invalidate collection content list cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n\n // Create initial version\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n contentId,\n 1,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n contentId,\n 'created',\n 'none',\n status,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${contentId}/edit?success=Content saved successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content created successfully!`\n : `/admin/content?collection=${collectionId}&success=Content created successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error creating content:', error)\n return c.html(html`\n
\n Failed to create content. Please try again.\n
\n `)\n }\n})\n\n// Update content\nadminContentRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const formData = await c.req.formData()\n const action = formData.get('action') as string\n\n const db = c.env.DB\n\n // Get existing content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existingContent = await contentStmt.bind(id).first() as any\n\n if (!existingContent) {\n return c.html(html`\n
\n Content not found.\n
\n `)\n }\n\n const collection = await getCollection(db, existingContent.collection_id)\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, existingContent.collection_id)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n id,\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Update slug if title changed\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || existingContent.status\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Update content\n const now = Date.now()\n\n const updateStmt = db.prepare(`\n UPDATE content SET\n slug = ?, title = ?, data = ?, status = ?,\n scheduled_publish_at = ?, scheduled_unpublish_at = ?,\n meta_title = ?, meta_description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n scheduledPublishAt ? new Date(scheduledPublishAt).getTime() : null,\n scheduledUnpublishAt ? new Date(scheduledUnpublishAt).getTime() : null,\n data.meta_title || null,\n data.meta_description || null,\n now,\n id\n ).run()\n\n // Invalidate content cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existingContent.collection_id}:*`)\n\n // Create new version if content changed\n const existingData = JSON.parse(existingContent.data || '{}')\n if (JSON.stringify(existingData) !== JSON.stringify(data)) {\n // Get next version number\n const versionCountStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const versionResult = await versionCountStmt.bind(id).first() as any\n const nextVersion = (versionResult?.max_version || 0) + 1\n\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Log workflow action if status changed\n if (status !== existingContent.status) {\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'status_changed',\n existingContent.status,\n status,\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${id}/edit?success=Content updated successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content updated successfully!`\n : `/admin/content?collection=${existingContent.collection_id}&success=Content updated successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error updating content:', error)\n return c.html(html`\n
\n Failed to update content. Please try again.\n
\n `)\n }\n})\n\n// Content preview\nadminContentRoutes.post('/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html('

Collection not found

')\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract field data for preview (skip validation)\n const { data } = extractFieldData(fields, formData, { skipValidation: true })\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeStatus = escapeHtml(String(formData.get('status') || 'draft'))\n const safeMetaDesc = data.meta_description ? escapeHtml(data.meta_description) : ''\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Preview: ${safeTitle}\n \n \n \n

${safeTitle}

\n
\n Collection: ${escapeHtml(collection.display_name)}
\n Status: ${safeStatus}
\n ${safeMetaDesc ? `Description: ${safeMetaDesc}
` : ''}\n
\n
\n ${safeContent}\n
\n\n

All Fields:

\n \n \n ${fields.map(field => `\n \n \n \n \n `).join('')}\n
FieldValue
${escapeHtml(field.field_label)}${data[field.field_name] ? escapeHtml(String(data[field.field_name])) : 'empty'}
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating preview:', error)\n return c.html('

Error generating preview

')\n }\n})\n\n// Duplicate content\nadminContentRoutes.post('/duplicate', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const originalId = formData.get('id') as string\n\n if (!originalId) {\n return c.json({ success: false, error: 'Content ID required' })\n }\n\n const db = c.env.DB\n\n // Get original content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const original = await contentStmt.bind(originalId).first() as any\n\n if (!original) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n // Create duplicate\n const newId = crypto.randomUUID()\n const now = Date.now()\n const originalData = JSON.parse(original.data || '{}')\n\n // Modify title to indicate it's a copy\n originalData.title = `${originalData.title || 'Untitled'} (Copy)`\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n newId,\n original.collection_id,\n `${original.slug}-copy-${Date.now()}`,\n originalData.title,\n JSON.stringify(originalData),\n 'draft', // Always start as draft\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n return c.json({ success: true, id: newId })\n } catch (error) {\n console.error('Error duplicating content:', error)\n return c.json({ success: false, error: 'Failed to duplicate content' })\n }\n})\n\n// Get bulk actions modal\nadminContentRoutes.get('/bulk-actions', async (c) => {\n const bulkActionsModal = `\n
\n
\n
\n

Bulk Actions

\n \n
\n

\n Select items from the table below to perform bulk actions.\n

\n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n Move to Draft\n \n \n \n \n \n Delete Selected\n \n
\n
\n
\n \n `\n\n return c.html(bulkActionsModal)\n})\n\n// Perform bulk action\nadminContentRoutes.post('/bulk-action', async (c) => {\n try {\n const user = c.get('user')\n const body = await c.req.json()\n const { action, ids } = body\n\n if (!action || !ids || ids.length === 0) {\n return c.json({ success: false, error: 'Action and IDs required' })\n }\n\n const db = c.env.DB\n const now = Date.now()\n\n if (action === 'delete') {\n // Soft delete by setting status to 'deleted'\n const placeholders = ids.map(() => '?').join(',')\n const stmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(now, ...ids).run()\n } else if (action === 'publish' || action === 'draft') {\n // Update status\n const placeholders = ids.map(() => '?').join(',')\n const publishedAt = action === 'publish' ? now : null\n const stmt = db.prepare(`\n UPDATE content\n SET status = ?, published_at = ?, updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(action, publishedAt, now, ...ids).run()\n } else {\n return c.json({ success: false, error: 'Invalid action' })\n }\n\n // Invalidate cache for all affected content items\n const cache = getCacheService(CACHE_CONFIGS.content!)\n for (const contentId of ids) {\n await cache.delete(cache.generateKey('content', contentId))\n }\n // Also invalidate list caches (they contain content from potentially multiple collections)\n await cache.invalidate('content:list:*')\n\n return c.json({ success: true, count: ids.length })\n } catch (error) {\n console.error('Bulk action error:', error)\n return c.json({ success: false, error: 'Failed to perform bulk action' })\n }\n})\n\n// Delete content\nadminContentRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const user = c.get('user')\n\n // Check if content exists\n const contentStmt = db.prepare('SELECT id, title FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.json({ success: false, error: 'Content not found' }, 404)\n }\n\n // Soft delete by setting status to 'deleted'\n const now = Date.now()\n const deleteStmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id = ?\n `)\n await deleteStmt.bind(now, id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate('content:list:*')\n\n // Return success - let HTMX reload the page\n return c.html(`\n
\n
\n
\n \n \n \n

Content deleted successfully. Refreshing...

\n
\n
\n
\n `)\n } catch (error) {\n console.error('Delete content error:', error)\n return c.json({ success: false, error: 'Failed to delete content' }, 500)\n }\n})\n\n// Get version history\nadminContentRoutes.get('/:id/versions', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.html('

Content not found

')\n }\n\n // Get all versions with author info\n const versionsStmt = db.prepare(`\n SELECT cv.*, u.first_name, u.last_name, u.email\n FROM content_versions cv\n LEFT JOIN users u ON cv.author_id = u.id\n WHERE cv.content_id = ?\n ORDER BY cv.version DESC\n `)\n const { results } = await versionsStmt.bind(id).all()\n\n const versions: ContentVersion[] = (results || []).map((row: any) => ({\n id: row.id,\n version: row.version,\n data: JSON.parse(row.data || '{}'),\n author_id: row.author_id,\n author_name: row.first_name && row.last_name ? `${row.first_name} ${row.last_name}` : row.email,\n created_at: row.created_at,\n is_current: false // Will be set below\n }))\n\n // Mark the latest version as current\n if (versions.length > 0) {\n versions[0]!.is_current = true\n }\n\n const data: VersionHistoryData = {\n contentId: id,\n versions,\n currentVersion: versions.length > 0 ? versions[0]!.version : 1\n }\n\n return c.html(renderVersionHistory(data))\n } catch (error) {\n console.error('Error loading version history:', error)\n return c.html('

Error loading version history

')\n }\n})\n\n// Restore version\nadminContentRoutes.post('/:id/restore/:version', async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const user = c.get('user')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT * FROM content_versions \n WHERE content_id = ? AND version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.json({ success: false, error: 'Version not found' })\n }\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const currentContent = await contentStmt.bind(id).first() as any\n\n if (!currentContent) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n const restoredData = JSON.parse(versionData.data)\n const now = Date.now()\n\n // Update content with restored data\n const updateStmt = db.prepare(`\n UPDATE content SET\n title = ?, data = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n restoredData.title || 'Untitled',\n versionData.data,\n now,\n id\n ).run()\n\n // Create new version for the restoration\n const nextVersionStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const nextVersionResult = await nextVersionStmt.bind(id).first() as any\n const nextVersion = (nextVersionResult?.max_version || 0) + 1\n\n const newVersionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await newVersionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n versionData.data,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, comment, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'version_restored',\n currentContent.status,\n currentContent.status,\n user?.userId || 'unknown',\n `Restored to version ${version}`,\n now\n ).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error restoring version:', error)\n return c.json({ success: false, error: 'Failed to restore version' })\n }\n})\n\n// Preview specific version\nadminContentRoutes.get('/:id/version/:version/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT cv.*, c.collection_id, col.display_name as collection_name\n FROM content_versions cv\n JOIN content c ON cv.content_id = c.id\n JOIN collections col ON c.collection_id = col.id\n WHERE cv.content_id = ? AND cv.version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.html('

Version not found

')\n }\n\n const data = JSON.parse(versionData.data || '{}')\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n const safeExcerpt = data.excerpt ? escapeHtml(data.excerpt) : ''\n const safeCollectionName = escapeHtml(versionData.collection_name || '')\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Version ${version} Preview: ${safeTitle}\n \n \n \n
\n Version ${version}\n Collection: ${safeCollectionName}
\n Created: ${new Date(versionData.created_at).toLocaleString()}
\n This is a historical version preview\n
\n\n

${safeTitle}

\n\n
\n ${safeContent}\n
\n\n ${safeExcerpt ? `

Excerpt:

${safeExcerpt}

` : ''}\n\n

All Field Data:

\n
\n${escapeHtml(JSON.stringify(data, null, 2))}\n        
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating version preview:', error)\n return c.html('

Error generating preview

')\n }\n})\nexport default adminContentRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserProfile {\n id: string\n email: string\n username: string\n first_name: string\n last_name: string\n phone?: string\n bio?: string\n avatar_url?: string\n timezone: string\n language: string\n theme: string\n email_notifications: boolean\n two_factor_enabled: boolean\n role: string\n created_at: number\n last_login_at?: number\n}\n\nexport interface ProfilePageData {\n profile: UserProfile\n timezones: Array<{ value: string; label: string }>\n languages: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderAvatarImage(avatarUrl: string | undefined, firstName: string, lastName: string): string {\n return `
\n ${avatarUrl\n ? `\"Profile`\n : `${firstName.charAt(0)}${lastName.charAt(0)}`\n }\n
`\n}\n\nexport function renderProfilePage(data: ProfilePageData): string {\n const pageContent = `\n
\n \n
\n
\n

User Profile

\n

\n Manage your account settings and preferences\n

\n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n \n
\n
\n \n
\n
\n
\n \n \n \n
\n
\n

Profile Information

\n

Update your account details

\n
\n
\n
\n\n \n
\n
\n\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n ${data.profile.bio || ''}\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Preferences

\n\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Notifications

\n\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n \n

Receive email updates about new features and product announcements.

\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Update Profile\n \n
\n
\n
\n
\n\n \n
\n \n
\n

Profile Picture

\n\n
\n ${renderAvatarImage(data.profile.avatar_url, data.profile.first_name, data.profile.last_name)}\n\n
\n \n \n \n \n \n \n Change Picture\n \n \n\n
\n
\n
\n\n \n
\n

Account Information

\n\n
\n
\n
Role
\n
\n \n ${data.profile.role}\n \n
\n
\n
\n
Member Since
\n
${new Date(data.profile.created_at).toLocaleDateString()}
\n
\n ${data.profile.last_login_at ? `\n
\n
Last Login
\n
${new Date(data.profile.last_login_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Two-Factor Auth
\n
\n ${data.profile.two_factor_enabled\n ? 'Enabled'\n : 'Disabled'\n }\n
\n
\n
\n
\n\n \n
\n

Security

\n\n
\n \n \n \n \n Change Password\n \n\n \n \n \n \n ${data.profile.two_factor_enabled ? 'Disable' : 'Enable'} 2FA\n \n
\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Change Password

\n \n
\n
\n\n
\n
\n\n
\n \n \n
\n\n
\n \n \n

Must be at least 8 characters

\n
\n\n
\n \n \n
\n\n
\n \n Cancel\n \n \n \n \n \n Update Password\n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'User Profile',\n pageTitle: 'Profile',\n currentPath: '/admin/profile',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { escapeHtml } from '../../utils/sanitize'\n\nexport type AlertType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface AlertData {\n type: AlertType\n title?: string\n message: string\n dismissible?: boolean\n className?: string\n icon?: boolean\n}\n\nexport function renderAlert(data: AlertData): string {\n const typeClasses = {\n success: 'bg-green-50 dark:bg-green-500/10 border border-green-600/20 dark:border-green-500/20',\n error: 'bg-error/10 border border-red-600/20 dark:border-red-500/20',\n warning: 'bg-amber-50 dark:bg-amber-500/10 border border-amber-600/20 dark:border-amber-500/20',\n info: 'bg-blue-50 dark:bg-blue-500/10 border border-blue-600/20 dark:border-blue-500/20'\n }\n\n const iconClasses = {\n success: 'text-green-600 dark:text-green-400',\n error: 'text-red-600 dark:text-red-400',\n warning: 'text-amber-600 dark:text-amber-400',\n info: 'text-blue-600 dark:text-blue-400'\n }\n\n const textClasses = {\n success: 'text-green-900 dark:text-green-300',\n error: 'text-red-900 dark:text-red-300',\n warning: 'text-amber-900 dark:text-amber-300',\n info: 'text-blue-900 dark:text-blue-300'\n }\n\n const messageTextClasses = {\n success: 'text-green-700 dark:text-green-400',\n error: 'text-red-700 dark:text-red-400',\n warning: 'text-amber-700 dark:text-amber-400',\n info: 'text-blue-700 dark:text-blue-400'\n }\n\n const icons = {\n success: ``,\n error: ``,\n warning: ``,\n info: ``\n }\n\n return `\n
\n
\n ${data.icon !== false ? `\n
\n \n ${icons[data.type]}\n \n
\n ` : ''}\n
\n ${data.title ? `\n

\n ${escapeHtml(data.title)}\n

\n ` : ''}\n
\n

${escapeHtml(data.message)}

\n
\n
\n ${data.dismissible ? `\n
\n
\n \n Dismiss\n \n \n \n \n
\n
\n ` : ''}\n
\n
\n `\n}\n\nexport function renderSuccessAlert(message: string, title?: string): string {\n return renderAlert({ type: 'success', message, title })\n}\n\nexport function renderErrorAlert(message: string, title?: string): string {\n return renderAlert({ type: 'error', message, title })\n}\n\nexport function renderWarningAlert(message: string, title?: string): string {\n return renderAlert({ type: 'warning', message, title })\n}\n\nexport function renderInfoAlert(message: string, title?: string): string {\n return renderAlert({ type: 'info', message, title })\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\n\nexport interface ActivityLog {\n id: string\n user_id: string\n action: string\n resource_type?: string\n resource_id?: string\n details?: any\n ip_address?: string\n user_agent?: string\n created_at: number\n user_email?: string\n user_name?: string\n}\n\nexport interface ActivityLogsPageData {\n logs: ActivityLog[]\n pagination: {\n page: number\n limit: number\n total: number\n pages: number\n }\n filters: {\n user_id?: string\n action?: string\n resource_type?: string\n date_from?: string\n date_to?: string\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderActivityLogsPage(data: ActivityLogsPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Activity Logs

\n

Monitor user actions and system activity

\n
\n
\n\n \n \n\n \n
\n

Filters

\n \n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n Clear Filters\n \n
\n
\n
\n\n \n
\n
\n
\n
\n

Recent Activity

\n
\n Showing ${data.logs.length} of ${data.pagination.total} logs\n
\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${data.logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimestampUserActionResourceIP AddressDetails
\n ${new Date(log.created_at).toLocaleString()}\n \n
${log.user_name || 'Unknown'}
\n
${log.user_email || 'N/A'}
\n
\n \n ${formatAction(log.action)}\n \n \n ${log.resource_type ? `\n
${log.resource_type}
\n ${log.resource_id ? `
${log.resource_id}
` : ''}\n ` : 'N/A'}\n
\n ${log.ip_address || 'N/A'}\n \n ${log.details ? `\n
\n View Details\n
${JSON.stringify(log.details, null, 2)}
\n
\n ` : 'N/A'}\n
\n
\n\n ${data.logs.length === 0 ? `\n
\n \n \n \n

No activity logs found

\n

Try adjusting your filters or check back later.

\n
\n ` : ''}\n\n \n ${data.pagination.pages > 1 ? `\n
\n
\n Page ${data.pagination.page} of ${data.pagination.pages} (${data.pagination.total} total logs)\n
\n \n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutData = {\n title: 'Activity Logs',\n pageTitle: 'Activity Logs',\n currentPath: '/admin/activity-logs',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction getActionBadgeClass(action: string): string {\n if (action.includes('login') || action.includes('logout')) {\n return 'bg-blue-500/20 text-blue-300'\n } else if (action.includes('create') || action.includes('invite')) {\n return 'bg-green-500/20 text-green-300'\n } else if (action.includes('update') || action.includes('change')) {\n return 'bg-yellow-500/20 text-yellow-300'\n } else if (action.includes('delete') || action.includes('cancel')) {\n return 'bg-red-500/20 text-red-300'\n } else {\n return 'bg-gray-500/20 text-gray-300'\n }\n}\n\nfunction formatAction(action: string): string {\n // Convert action from dot notation to readable format\n return action\n .split('.')\n .map(part => part.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()))\n .join(' - ')\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface UserProfileData {\n displayName?: string\n bio?: string\n company?: string\n jobTitle?: string\n website?: string\n location?: string\n dateOfBirth?: number\n}\n\nexport interface UserEditData {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n phone?: string\n avatarUrl?: string\n role: string\n isActive: boolean\n emailVerified: boolean\n twoFactorEnabled: boolean\n createdAt: number\n lastLoginAt?: number\n profile?: UserProfileData\n}\n\nexport interface UserEditPageData {\n userToEdit: UserEditData\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserEditPage(data: UserEditPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Edit User

\n
\n

Update user account and permissions

\n
\n
\n \n \n \n \n Save Changes\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Profile Information

\n

Extended profile data for this user

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n
\n\n
\n \n ${escapeHtml(data.userToEdit.profile?.bio || '')}\n
\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Set Password

\n

Leave blank to keep the current password

\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User has verified their email address

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

User Details

\n
\n
\n
User ID
\n
${data.userToEdit.id}
\n
\n
\n
Created
\n
${new Date(data.userToEdit.createdAt).toLocaleDateString()}
\n
\n ${data.userToEdit.lastLoginAt ? `\n
\n
Last Login
\n
${new Date(data.userToEdit.lastLoginAt).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Status
\n
\n ${data.userToEdit.isActive\n ? 'Active'\n : 'Inactive'\n }\n
\n
\n ${data.userToEdit.twoFactorEnabled ? `\n
\n
Security
\n
\n 2FA Enabled\n
\n
\n ` : ''}\n
\n
\n\n \n
\n

Danger Zone

\n

Irreversible and destructive actions

\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Permanently remove from database. Unchecked performs soft delete (deactivate only).

\n
\n
\n\n \n \n \n \n Delete User\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-user-confirm',\n title: 'Delete User',\n message: 'Are you sure you want to delete this user? Check the \"Hard Delete\" option to permanently remove all data from the database. This action cannot be undone!',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteUser()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Edit User',\n pageTitle: `Edit User - ${data.userToEdit.firstName} ${data.userToEdit.lastName}`,\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export interface ConfirmationDialogOptions {\n id: string\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmClass?: string\n iconColor?: 'red' | 'yellow' | 'blue'\n onConfirm?: string // JavaScript code to execute on confirm\n}\n\nexport function renderConfirmationDialog(options: ConfirmationDialogOptions): string {\n const {\n id,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmClass = 'bg-red-500 hover:bg-red-400',\n iconColor = 'red',\n onConfirm = ''\n } = options\n\n const iconColorClasses = {\n red: 'bg-red-500/10 text-red-400',\n yellow: 'bg-yellow-500/10 text-yellow-400',\n blue: 'bg-blue-500/10 text-blue-400'\n }\n\n return `\n \n \n \n\n
\n \n
\n
\n \n \n \n
\n
\n

${title}

\n
\n

${message}

\n
\n
\n
\n
\n \n ${confirmText}\n \n \n ${cancelText}\n \n
\n
\n
\n \n
\n `\n}\n\n/**\n * Helper function to show a confirmation dialog programmatically\n * Usage in templates: Add this script and call showConfirmDialog()\n */\nexport function getConfirmationDialogScript(): string {\n return `\n \n \n `\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserNewPageData {\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserNewPage(data: UserNewPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Create New User

\n
\n

Add a new user account to the system

\n
\n
\n \n \n \n \n Create User\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n\n
\n \n \n
\n
\n\n \n
\n

Password

\n
\n
\n \n \n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Mark email as verified

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

Creating a User

\n
\n

Fill in the required fields marked with * to create a new user account.

\n

The password must be at least 8 characters long.

\n

By default, new users are created as active and can sign in immediately.

\n

You can edit user details and permissions after creation.

\n
\n
\n\n \n
\n

Role Descriptions

\n
\n
\n
Administrator
\n
Full system access and permissions
\n
\n
\n
Editor
\n
Can create and edit content
\n
\n
\n
Author
\n
Can create own content
\n
\n
\n
Viewer
\n
Read-only access
\n
\n
\n
\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create User',\n pageTitle: 'Create New User',\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderAlert } from '../alert.template'\nimport { renderTable, TableColumn, TableData } from '../table.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface User {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n role: string\n avatar?: string\n isActive: boolean\n lastLoginAt?: number\n createdAt: number\n updatedAt: number\n formattedLastLogin?: string\n formattedCreatedAt?: string\n}\n\nexport interface UsersListPageData {\n users: User[]\n pagination?: PaginationData\n currentPage: number\n totalPages: number\n totalUsers: number\n statusFilter?: string\n roleFilter?: string\n searchFilter?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderUsersListPage(data: UsersListPageData): string {\n const columns: TableColumn[] = [\n {\n key: 'avatar',\n label: '',\n className: 'w-12',\n sortable: false,\n render: (value: string | null, row: User) => {\n const initials = `${row.firstName.charAt(0)}${row.lastName.charAt(0)}`.toUpperCase()\n if (value) {\n return `\"${row.firstName}`\n }\n return `\n
\n ${initials}\n
\n `\n }\n },\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, row: User) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n \n const truncatedFirstName = row.firstName.length > 25 ? row.firstName.substring(0, 25) + '...' : row.firstName\n const truncatedLastName = row.lastName.length > 25 ? row.lastName.substring(0, 25) + '...' : row.lastName\n const fullName = escapeHtml(`${truncatedFirstName} ${truncatedLastName}`)\n const truncatedUsername = row.username.length > 100 ? row.username.substring(0, 100) + '...' : row.username\n const username = escapeHtml(truncatedUsername)\n const statusBadge = row.isActive ?\n 'Active' :\n 'Inactive'\n return `\n
\n
${fullName}${statusBadge}
\n
@${username}
\n
\n `\n }\n },\n {\n key: 'email',\n label: 'Email',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n const escapedEmail = escapeHtml(value)\n return `${escapedEmail}`\n }\n },\n {\n key: 'role',\n label: 'Role',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const roleColors = {\n admin: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-700/10 dark:ring-red-500/20',\n editor: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-700/10 dark:ring-blue-500/20',\n author: 'bg-cyan-50 dark:bg-cyan-500/10 text-cyan-700 dark:text-cyan-400 ring-1 ring-inset ring-cyan-700/10 dark:ring-cyan-500/20',\n viewer: 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n }\n const colorClass = roleColors[value as keyof typeof roleColors] || 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n return `${value.charAt(0).toUpperCase() + value.slice(1)}`\n }\n },\n {\n key: 'lastLoginAt',\n label: 'Last Login',\n sortable: true,\n sortType: 'date',\n render: (value: number | null) => {\n if (!value) return 'Never'\n return `${new Date(value).toLocaleDateString()}`\n }\n },\n {\n key: 'createdAt',\n label: 'Created',\n sortable: true,\n sortType: 'date',\n render: (value: number) => `${new Date(value).toLocaleDateString()}`\n },\n {\n key: 'actions',\n label: 'Actions',\n className: 'text-right',\n sortable: false,\n render: (_value: any, row: User) => `\n
\n ${row.isActive ?\n `` :\n ``\n }\n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'users-table',\n columns,\n rows: data.users,\n selectable: false,\n rowClickable: true,\n rowClickUrl: (row: User) => `/admin/users/${row.id}/edit`,\n emptyMessage: 'No users found'\n }\n\n const pageContent = `\n
\n \n
\n
\n

User Management

\n

Manage user accounts and permissions

\n
\n
\n \n \n \n \n Add User\n \n \n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n

User Statistics

\n
\n
\n
Total Users
\n
\n
\n ${data.totalUsers}\n
\n
\n \n \n \n Increased by\n 5.2%\n
\n
\n
\n
\n
Active Users
\n
\n
\n ${data.users.filter(u => u.isActive).length}\n
\n
\n \n \n \n Increased by\n 3.1%\n
\n
\n
\n
\n
Administrators
\n
\n
\n ${data.users.filter(u => u.role === 'admin').length}\n
\n
\n \n \n \n Increased by\n 1.8%\n
\n
\n
\n
\n
Active This Week
\n
\n
\n ${data.users.filter(u => u.lastLoginAt && u.lastLoginAt > Date.now() - 7 * 24 * 60 * 60 * 1000).length}\n
\n
\n \n \n \n Decreased by\n 2.3%\n
\n
\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n
\n
\n \n
\n \n
\n {\n input.focus();\n input.setSelectionRange(len, len);\n }, 10);\n }\n \"\n >\n \n
\n \n \n \n
\n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n Clear Filters\n \n
\n
\n
\n
\n
\n
\n\n \n ${renderTable(tableData)}\n\n \n ${data.pagination ? renderPagination(data.pagination) : ''}\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'toggle-user-status-confirm',\n title: 'Toggle User Status',\n message: 'Are you sure you want to activate/deactivate this user?',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performToggleUserStatus()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Users',\n pageTitle: 'User Management',\n currentPath: '/admin/users',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n} ","import { Hono } from 'hono'\nimport { requireAuth, requireRole, logActivity, AuthManager } from '../middleware'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { renderProfilePage, renderAvatarImage, type UserProfile, type ProfilePageData } from '../templates/pages/admin-profile.template'\nimport { renderAlert } from '../templates/components/alert.template'\nimport { renderActivityLogsPage, type ActivityLogsPageData, type ActivityLog } from '../templates/pages/admin-activity-logs.template'\nimport { renderUserEditPage, type UserEditPageData, type UserEditData, type UserProfileData } from '../templates/pages/admin-user-edit.template'\nimport { renderUserNewPage, type UserNewPageData } from '../templates/pages/admin-user-new.template'\nimport { renderUsersListPage, type UsersListPageData, type User } from '../templates/pages/admin-users-list.template'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, renderCustomProfileSection, getCustomData, saveCustomData, extractCustomFieldsFromForm, sanitizeCustomData, validateCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst userRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware to all routes\nuserRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on user management routes\nuserRoutes.use('/users/*', requireRole(['admin']))\nuserRoutes.use('/users', requireRole(['admin']))\nuserRoutes.use('/invite-user', requireRole(['admin']))\nuserRoutes.use('/resend-invitation/*', requireRole(['admin']))\nuserRoutes.use('/cancel-invitation/*', requireRole(['admin']))\nuserRoutes.use('/activity-logs', requireRole(['admin']))\nuserRoutes.use('/activity-logs/*', requireRole(['admin']))\n\n// Redirect /admin to /admin/dashboard\nuserRoutes.get('/', (c) => {\n return c.redirect('/admin/dashboard')\n})\n\n// Timezone options for profile form\nconst TIMEZONES = [\n { value: 'UTC', label: 'UTC' },\n { value: 'America/New_York', label: 'Eastern Time' },\n { value: 'America/Chicago', label: 'Central Time' },\n { value: 'America/Denver', label: 'Mountain Time' },\n { value: 'America/Los_Angeles', label: 'Pacific Time' },\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Australia/Sydney', label: 'Sydney' }\n]\n\n// Language options for profile form\nconst LANGUAGES = [\n { value: 'en', label: 'English' },\n { value: 'es', label: 'Spanish' },\n { value: 'fr', label: 'French' },\n { value: 'de', label: 'German' },\n { value: 'it', label: 'Italian' },\n { value: 'pt', label: 'Portuguese' },\n { value: 'ja', label: 'Japanese' },\n { value: 'ko', label: 'Korean' },\n { value: 'zh', label: 'Chinese' }\n]\n\n// Role options for user form\nconst ROLES = [\n { value: 'admin', label: 'Administrator' },\n { value: 'editor', label: 'Editor' },\n { value: 'author', label: 'Author' },\n { value: 'viewer', label: 'Viewer' }\n]\n\n/**\n * GET /admin/profile - Show user profile page\n */\nuserRoutes.get('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n // Get user profile data\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n timezone, language, theme, email_notifications, two_factor_enabled,\n role, created_at, last_login_at\n FROM users \n WHERE id = ? AND is_active = 1\n `)\n \n const userProfile = await userStmt.bind(user!.userId).first() as any\n\n if (!userProfile) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Convert to UserProfile interface\n const profile: UserProfile = {\n id: userProfile.id,\n email: userProfile.email,\n username: userProfile.username || '',\n first_name: userProfile.first_name || '',\n last_name: userProfile.last_name || '',\n phone: userProfile.phone,\n bio: userProfile.bio,\n avatar_url: userProfile.avatar_url,\n timezone: userProfile.timezone || 'UTC',\n language: userProfile.language || 'en',\n theme: userProfile.theme || 'dark',\n email_notifications: Boolean(userProfile.email_notifications),\n two_factor_enabled: Boolean(userProfile.two_factor_enabled),\n role: userProfile.role,\n created_at: userProfile.created_at,\n last_login_at: userProfile.last_login_at\n }\n\n // Get custom profile data\n const customData = await getCustomData(db, user!.userId)\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n const pageData: ProfilePageData = {\n profile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n customProfileFieldsHtml,\n user: {\n name: `${profile.first_name} ${profile.last_name}`.trim() || profile.username || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n } catch (error) {\n console.error('Profile page error:', error)\n \n const pageData: ProfilePageData = {\n profile: {} as UserProfile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n error: 'Failed to load profile. Please try again.',\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n }\n})\n\n/**\n * PUT /admin/profile - Update user profile\n */\nuserRoutes.put('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const timezone = formData.get('timezone')?.toString() || 'UTC'\n const language = formData.get('language')?.toString() || 'en'\n const emailNotifications = formData.get('email_notifications') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please enter a valid email address.',\n dismissible: true \n }))\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users \n WHERE (username = ? OR email = ?) AND id != ? AND is_active = 1\n `)\n const existingUser = await checkStmt.bind(username, email, user!.userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Username or email is already taken by another user!.',\n dismissible: true \n }))\n }\n\n // Update user profile\n const updateStmt = db.prepare(`\n UPDATE users SET \n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, bio = ?, timezone = ?, language = ?,\n email_notifications = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, bio, timezone, language,\n emailNotifications ? 1 : 0, Date.now(),\n user!.userId\n ).run()\n\n // Save custom profile fields\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n await saveCustomData(db, user!.userId, sanitized)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.update', 'users', user!.userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'bio', 'timezone', 'language', 'email_notifications'] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success', \n message: 'Profile updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Profile update error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update profile. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/avatar - Upload user avatar\n */\nuserRoutes.post('/profile/avatar', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n const avatarFile = formData.get('avatar') as File | null\n\n if (!avatarFile || typeof avatarFile === 'string' || !avatarFile.name) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please select an image file.',\n dismissible: true\n }))\n }\n\n // Validate file type\n const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']\n if (!allowedTypes.includes(avatarFile.type)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please upload a valid image file (JPEG, PNG, GIF, or WebP).',\n dismissible: true \n }))\n }\n\n // Validate file size (5MB max)\n const maxSize = 5 * 1024 * 1024\n if (avatarFile.size > maxSize) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Image file must be smaller than 5MB.',\n dismissible: true \n }))\n }\n\n // For now, we'll simulate storing the avatar\n // In a real implementation, you'd upload to cloud storage (R2, S3, etc.)\n const avatarUrl = `/uploads/avatars/${user!.userId}-${Date.now()}.${avatarFile.type.split('/')[1]}`\n\n // Update user avatar URL in database\n const updateStmt = db.prepare(`\n UPDATE users SET avatar_url = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(avatarUrl, Date.now(), user!.userId).run()\n\n // Get updated user data to render the avatar\n const userStmt = db.prepare(`\n SELECT first_name, last_name FROM users WHERE id = ?\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.avatar_update', 'users', user!.userId,\n { avatar_url: avatarUrl },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return both the alert message and the updated avatar image using HTMX out-of-band swap\n const alertHtml = renderAlert({\n type: 'success',\n message: 'Profile picture updated successfully!',\n dismissible: true\n })\n\n // Add timestamp to avatar URL to bust cache\n const avatarUrlWithCache = `${avatarUrl}?t=${Date.now()}`\n const avatarImageHtml = renderAvatarImage(avatarUrlWithCache, userData.first_name, userData.last_name)\n\n // Use hx-swap-oob to update the avatar image container\n const avatarImageWithOob = avatarImageHtml.replace(\n 'id=\"avatar-image-container\"',\n 'id=\"avatar-image-container\" hx-swap-oob=\"true\"'\n )\n\n return c.html(alertHtml + avatarImageWithOob)\n\n } catch (error) {\n console.error('Avatar upload error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to upload profile picture. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/password - Change user password\n */\nuserRoutes.post('/profile/password', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n \n const currentPassword = formData.get('current_password')?.toString() || ''\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Validate input\n if (!currentPassword || !newPassword || !confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'All password fields are required.',\n dismissible: true \n }))\n }\n\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New passwords do not match.',\n dismissible: true \n }))\n }\n\n if (newPassword.length < 8) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New password must be at least 8 characters long.',\n dismissible: true \n }))\n }\n\n // Get current user data\n const userStmt = db.prepare(`\n SELECT password_hash FROM users WHERE id = ? AND is_active = 1\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n if (!userData) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'User not found.',\n dismissible: true \n }))\n }\n\n // Verify current password\n const validPassword = await AuthManager.verifyPassword(currentPassword, userData.password_hash)\n if (!validPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Current password is incorrect.',\n dismissible: true \n }))\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(newPassword)\n\n // Store old password in history\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user!.userId,\n userData.password_hash,\n Date.now()\n ).run()\n\n // Update user password\n const updateStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(newPasswordHash, Date.now(), user!.userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.password_change', 'users', user!.userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({ \n type: 'success', \n message: 'Password updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Password change error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update password. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * GET /admin/users - List all users\n * Returns HTML for browser requests and JSON for API requests\n * Note: Already protected by requireAuth() and requireRole(['admin', 'editor'])\n */\nuserRoutes.get('/users', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '20')\n const search = c.req.query('search') || ''\n const roleFilter = c.req.query('role') || ''\n const statusFilter = c.req.query('status') || 'active'\n const offset = (page - 1) * limit\n\n // Build search query\n let whereClause = ''\n let params: any[] = []\n\n // Handle status filter\n if (statusFilter === 'active') {\n whereClause = 'WHERE u.is_active = 1'\n } else if (statusFilter === 'inactive') {\n whereClause = 'WHERE u.is_active = 0'\n } else {\n // 'all' - no filter\n whereClause = 'WHERE 1=1'\n }\n\n if (search) {\n whereClause += ' AND (u.first_name LIKE ? OR u.last_name LIKE ? OR u.email LIKE ? OR u.username LIKE ?)'\n const searchParam = `%${search}%`\n params.push(searchParam, searchParam, searchParam, searchParam)\n }\n\n if (roleFilter) {\n whereClause += ' AND u.role = ?'\n params.push(roleFilter)\n }\n\n // Get users\n const usersStmt = db.prepare(`\n SELECT u.id, u.email, u.username, u.first_name, u.last_name,\n u.role, u.avatar_url, u.created_at, u.last_login_at, u.updated_at,\n u.email_verified, u.two_factor_enabled, u.is_active\n FROM users u\n ${whereClause}\n ORDER BY u.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: usersData } = await usersStmt.bind(...params, limit, offset).all()\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total FROM users u ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalUsers = countResult?.total || 0\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'users.list_view', 'users', undefined,\n { search, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Check if this is an API request (accept header contains 'application/json')\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n // Return JSON for API requests\n return c.json({\n users: usersData || [],\n pagination: {\n page,\n limit,\n total: totalUsers,\n pages: Math.ceil(totalUsers / limit)\n }\n })\n }\n\n // Return HTML for browser requests\n const users: User[] = (usersData || []).map((u: any) => ({\n id: u.id,\n email: u.email,\n username: u.username || '',\n firstName: u.first_name || '',\n lastName: u.last_name || '',\n role: u.role,\n avatar: u.avatar_url,\n isActive: Boolean(u.is_active),\n lastLoginAt: u.last_login_at,\n createdAt: u.created_at,\n updatedAt: u.updated_at,\n formattedLastLogin: u.last_login_at ? new Date(u.last_login_at).toLocaleDateString() : undefined,\n formattedCreatedAt: new Date(u.created_at).toLocaleDateString()\n }))\n\n const successMessage = c.req.query('success') || undefined\n\n const pageData: UsersListPageData = {\n users,\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalUsers,\n searchFilter: search,\n roleFilter,\n statusFilter,\n success: successMessage,\n pagination: {\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalItems: totalUsers,\n itemsPerPage: limit,\n startItem: offset + 1,\n endItem: Math.min(offset + limit, totalUsers),\n baseUrl: '/admin/users'\n },\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUsersListPage(pageData))\n\n } catch (error) {\n console.error('Users list error:', error)\n\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n return c.json({ error: 'Failed to load users' }, 500)\n }\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load users. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * GET /admin/users/new - Show new user creation page\n */\nuserRoutes.get('/users/new', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: UserNewPageData = {\n roles: ROLES,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserNewPage(pageData))\n } catch (error) {\n console.error('User new page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user creation page. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * POST /admin/users/new - Create new user\n */\nuserRoutes.post('/users/new', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const password = formData.get('password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email || !password) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, email, and password are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password\n if (password.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n\n if (password !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n\n // Check if username/email are already taken\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE username = ? OR email = ?\n `)\n const existingUser = await checkStmt.bind(username, email).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken.',\n dismissible: true\n }))\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Create user\n const userId = crypto.randomUUID()\n const createStmt = db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name, phone, bio,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createStmt.bind(\n userId, email, username, firstName, lastName, phone, bio,\n passwordHash, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.create', 'users', userId,\n { email, username, role },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Redirect to user list (use HX-Redirect for HTMX requests)\n c.header('HX-Redirect', '/admin/users?success=User created successfully')\n return c.body(null, 200)\n\n } catch (error) {\n console.error('User creation error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to create user!. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * GET /admin/users/:id - Get user by ID\n * Note: This endpoint returns users regardless of is_active status for admin purposes\n */\nuserRoutes.get('/users/:id', async (c) => {\n // Check if this is actually the edit route\n if (c.req.path.endsWith('/edit')) {\n return c.notFound()\n }\n\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (including inactive users for admin access)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userRecord = await userStmt.bind(userId).first() as any\n\n if (!userRecord) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.view', 'users', userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n user: {\n id: userRecord.id,\n email: userRecord.email,\n username: userRecord.username,\n first_name: userRecord.first_name,\n last_name: userRecord.last_name,\n phone: userRecord.phone,\n bio: userRecord.bio,\n avatar_url: userRecord.avatar_url,\n role: userRecord.role,\n is_active: userRecord.is_active,\n email_verified: userRecord.email_verified,\n two_factor_enabled: userRecord.two_factor_enabled,\n created_at: userRecord.created_at,\n last_login_at: userRecord.last_login_at\n }\n })\n\n } catch (error) {\n console.error('User fetch error:', error)\n return c.json({ error: 'Failed to fetch user' }, 500)\n }\n})\n\n/**\n * GET /admin/users/:id/edit - Show user edit page\n */\nuserRoutes.get('/users/:id/edit', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (removed bio - now in profile)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userToEdit = await userStmt.bind(userId).first() as any\n\n if (!userToEdit) {\n return c.html(renderAlert({\n type: 'error',\n message: 'User not found',\n dismissible: true\n }), 404)\n }\n\n // Get user profile data\n const profileStmt = db.prepare(`\n SELECT display_name, bio, company, job_title, website, location, date_of_birth, data\n FROM user_profiles\n WHERE user_id = ?\n `)\n const profileData = await profileStmt.bind(userId).first() as any\n\n // Convert profile to UserProfileData interface\n const profile: UserProfileData | undefined = profileData ? {\n displayName: profileData.display_name,\n bio: profileData.bio,\n company: profileData.company,\n jobTitle: profileData.job_title,\n website: profileData.website,\n location: profileData.location,\n dateOfBirth: profileData.date_of_birth\n } : undefined\n\n // Parse custom profile data\n let customData: Record = {}\n if (profileData?.data) {\n try { customData = JSON.parse(profileData.data) } catch {}\n }\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n // Convert to UserEditData interface\n const editData: UserEditData = {\n id: userToEdit.id,\n email: userToEdit.email,\n username: userToEdit.username || '',\n firstName: userToEdit.first_name || '',\n lastName: userToEdit.last_name || '',\n phone: userToEdit.phone,\n avatarUrl: userToEdit.avatar_url,\n role: userToEdit.role,\n isActive: Boolean(userToEdit.is_active),\n emailVerified: Boolean(userToEdit.email_verified),\n twoFactorEnabled: Boolean(userToEdit.two_factor_enabled),\n createdAt: userToEdit.created_at,\n lastLoginAt: userToEdit.last_login_at,\n profile\n }\n\n const pageData: UserEditPageData = {\n userToEdit: editData,\n roles: ROLES,\n customProfileFieldsHtml,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserEditPage(pageData))\n } catch (error) {\n console.error('User edit page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * PUT /admin/users/:id - Update user\n */\nuserRoutes.put('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Optional password change\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Extract profile fields\n const profileDisplayName = sanitizeInput(formData.get('profile_display_name')?.toString()) || null\n const profileBio = sanitizeInput(formData.get('profile_bio')?.toString()) || null\n const profileCompany = sanitizeInput(formData.get('profile_company')?.toString()) || null\n const profileJobTitle = sanitizeInput(formData.get('profile_job_title')?.toString()) || null\n const profileWebsite = formData.get('profile_website')?.toString()?.trim() || null\n const profileLocation = sanitizeInput(formData.get('profile_location')?.toString()) || null\n const profileDateOfBirthStr = formData.get('profile_date_of_birth')?.toString()?.trim() || null\n const profileDateOfBirth = profileDateOfBirthStr ? new Date(profileDateOfBirthStr).getTime() : null\n\n // Extract custom profile fields\n const profileConfig = getUserProfileConfig()\n let customDataJson: string | null = null\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n // Merge with existing custom data\n const existingCustom = await getCustomData(db, userId)\n const merged = { ...existingCustom, ...sanitized }\n customDataJson = JSON.stringify(merged)\n }\n\n // Validate required fields\n if (!username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password if provided\n if (newPassword) {\n if (newPassword.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n }\n\n // Validate website URL if provided\n if (profileWebsite) {\n try {\n new URL(profileWebsite)\n } catch {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid website URL.',\n dismissible: true\n }))\n }\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE (username = ? OR email = ?) AND id != ?\n `)\n const existingUser = await checkStmt.bind(username, email, userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken by another user.',\n dismissible: true\n }))\n }\n\n // Update user (removed bio - now in profile)\n const updateStmt = db.prepare(`\n UPDATE users SET\n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, role = ?, is_active = ?, email_verified = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), userId\n ).run()\n\n // Update password if provided\n if (newPassword) {\n const passwordHash = await AuthManager.hashPassword(newPassword)\n const updatePasswordStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?\n `)\n await updatePasswordStmt.bind(passwordHash, Date.now(), userId).run()\n }\n\n // Check if any profile field has data\n const hasProfileData = profileDisplayName || profileBio || profileCompany ||\n profileJobTitle || profileWebsite || profileLocation || profileDateOfBirth\n\n if (hasProfileData || customDataJson !== null) {\n const now = Date.now()\n\n // Check if profile exists\n const profileCheckStmt = db.prepare(`SELECT id FROM user_profiles WHERE user_id = ?`)\n const existingProfile = await profileCheckStmt.bind(userId).first() as any\n\n if (existingProfile) {\n // Update existing profile\n const updateProfileStmt = db.prepare(`\n UPDATE user_profiles SET\n display_name = ?, bio = ?, company = ?, job_title = ?,\n website = ?, location = ?, date_of_birth = ?, updated_at = ?\n ${customDataJson !== null ? ', data = ?' : ''}\n WHERE user_id = ?\n `)\n const updateBindings = [\n profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, now,\n ...(customDataJson !== null ? [customDataJson] : []),\n userId\n ]\n await updateProfileStmt.bind(...updateBindings).run()\n } else {\n // Create new profile\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const insertProfileStmt = db.prepare(`\n INSERT INTO user_profiles (id, user_id, display_name, bio, company, job_title, website, location, date_of_birth, data, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n await insertProfileStmt.bind(\n profileId, userId, profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, customDataJson || '{}', now, now\n ).run()\n }\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user.update', 'users', userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'role', 'is_active', 'email_verified', 'profile', ...(newPassword ? ['password'] : [])] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success',\n message: 'User updated successfully!',\n dismissible: true\n }))\n\n } catch (error) {\n console.error('User update error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to update user. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * POST /admin/users/:id/toggle - Toggle user active status\n */\nuserRoutes.post('/users/:id/toggle', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const body = await c.req.json().catch(() => ({ active: true }))\n const active = body.active === true\n\n // Prevent self-deactivation\n if (userId === user!.userId && !active) {\n return c.json({ error: 'You cannot deactivate your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToToggle = await userStmt.bind(userId).first() as any\n\n if (!userToToggle) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Toggle user status\n const toggleStmt = db.prepare(`\n UPDATE users SET is_active = ?, updated_at = ? WHERE id = ?\n `)\n await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, active ? 'user.activate' : 'user.deactivate', 'users', userId,\n { email: userToToggle.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: active ? 'User activated successfully' : 'User deactivated successfully'\n })\n\n } catch (error) {\n console.error('User toggle error:', error)\n return c.json({ error: 'Failed to toggle user status' }, 500)\n }\n})\n\n/**\n * DELETE /admin/users/:id - Delete user\n */\nuserRoutes.delete('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get request body to check for hard delete option\n const body = await c.req.json().catch(() => ({ hardDelete: false }))\n const hardDelete = body.hardDelete === true\n\n // Prevent self-deletion\n if (userId === user!.userId) {\n return c.json({ error: 'You cannot delete your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToDelete = await userStmt.bind(userId).first() as any\n\n if (!userToDelete) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n if (hardDelete) {\n // Hard delete - permanently remove from database\n const deleteStmt = db.prepare(`\n DELETE FROM users WHERE id = ?\n `)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.hard_delete', 'users', userId,\n { email: userToDelete.email, permanent: true },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User permanently deleted'\n })\n } else {\n // Soft delete - deactivate by setting is_active = 0\n const deleteStmt = db.prepare(`\n UPDATE users SET is_active = 0, updated_at = ? WHERE id = ?\n `)\n await deleteStmt.bind(Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.soft_delete', 'users', userId,\n { email: userToDelete.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User deactivated successfully'\n })\n }\n\n } catch (error) {\n console.error('User deletion error:', error)\n return c.json({ error: 'Failed to delete user' }, 500)\n }\n})\n\n/**\n * POST /admin/invite-user - Invite a new user\n */\nuserRoutes.post('/invite-user', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const role = formData.get('role')?.toString()?.trim() || 'viewer'\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n\n // Validate input\n if (!email || !firstName || !lastName) {\n return c.json({ error: 'Email, first name, and last name are required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n // Check if user already exists\n const existingUserStmt = db.prepare(`\n SELECT id FROM users WHERE email = ?\n `)\n const existingUser = await existingUserStmt.bind(email).first()\n\n if (existingUser) {\n return c.json({ error: 'A user with this email already exists' }, 400)\n }\n\n // Generate invitation token\n const invitationToken = crypto.randomUUID()\n // const invitationExpires = Date.now() + (7 * 24 * 60 * 60 * 1000) // 7 days\n\n // Create user record with invitation\n const userId = crypto.randomUUID()\n const createUserStmt = db.prepare(`\n INSERT INTO users (\n id, email, first_name, last_name, role, \n invitation_token, invited_by, invited_at,\n is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createUserStmt.bind(\n userId, email, firstName, lastName, role,\n invitationToken, user!.userId, Date.now(),\n 0, 0, Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invite_sent', 'users', userId,\n { email, role, invited_user_id: userId },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // In a real implementation, you would send an email here\n // For now, we'll return the invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${invitationToken}`\n\n return c.json({\n success: true,\n message: 'User invitation sent successfully',\n user: {\n id: userId,\n email,\n first_name: firstName,\n last_name: lastName,\n role\n },\n invitation_link: invitationLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('User invitation error:', error)\n return c.json({ error: 'Failed to send user invitation' }, 500)\n }\n})\n\n/**\n * POST /admin/resend-invitation/:id - Resend invitation\n */\nuserRoutes.post('/resend-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invitation_token\n FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Generate new invitation token\n const newInvitationToken = crypto.randomUUID()\n\n // Update invitation token and date\n const updateStmt = db.prepare(`\n UPDATE users SET \n invitation_token = ?, \n invited_at = ?, \n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newInvitationToken,\n Date.now(),\n Date.now(),\n userId\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_resent', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Generate new invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${newInvitationToken}`\n\n return c.json({\n success: true,\n message: 'Invitation resent successfully',\n invitation_link: invitationLink\n })\n\n } catch (error) {\n console.error('Resend invitation error:', error)\n return c.json({ error: 'Failed to resend invitation' }, 500)\n }\n})\n\n/**\n * DELETE /admin/cancel-invitation/:id - Cancel invitation\n */\nuserRoutes.delete('/cancel-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Delete the user record (since they haven't activated yet)\n const deleteStmt = db.prepare(`DELETE FROM users WHERE id = ?`)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_cancelled', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'Invitation cancelled successfully'\n })\n\n } catch (error) {\n console.error('Cancel invitation error:', error)\n return c.json({ error: 'Failed to cancel invitation' }, 500)\n }\n})\n\n/**\n * GET /admin/activity-logs - View activity logs\n */\nuserRoutes.get('/activity-logs', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination and filter parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '50')\n const offset = (page - 1) * limit\n\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get activity logs with user information\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: logs } = await logsStmt.bind(...params, limit, offset).all()\n\n // Get total count for pagination\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total \n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalLogs = countResult?.total || 0\n\n // Parse details JSON for each log\n const formattedLogs: ActivityLog[] = (logs || []).map((log: any) => ({\n ...log,\n details: log.details ? JSON.parse(log.details) : null\n }))\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'activity.logs_viewed', undefined, undefined,\n { filters, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n const pageData: ActivityLogsPageData = {\n logs: formattedLogs,\n pagination: {\n page,\n limit,\n total: totalLogs,\n pages: Math.ceil(totalLogs / limit)\n },\n filters,\n user: {\n name: user!.email.split('@')[0] || user!.email, // Use email username as fallback\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n\n } catch (error) {\n console.error('Activity logs error:', error)\n \n const pageData: ActivityLogsPageData = {\n logs: [],\n pagination: { page: 1, limit: 50, total: 0, pages: 0 },\n filters: {},\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n }\n})\n\n/**\n * GET /admin/activity-logs/export - Export activity logs to CSV\n */\nuserRoutes.get('/activity-logs/export', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get filter parameters (same as list view)\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get all matching activity logs (limit to 10,000 for performance)\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT 10000\n `)\n\n const { results: logs } = await logsStmt.bind(...params).all()\n\n // Generate CSV content\n const csvHeaders = ['Timestamp', 'User', 'Email', 'Action', 'Resource Type', 'Resource ID', 'IP Address', 'Details']\n const csvRows = [csvHeaders.join(',')]\n\n for (const log of (logs || [])) {\n const row = [\n `\"${new Date((log as any).created_at).toISOString()}\"`,\n `\"${(log as any).user_name || 'Unknown'}\"`,\n `\"${(log as any).user_email || 'N/A'}\"`,\n `\"${(log as any).action}\"`,\n `\"${(log as any).resource_type || 'N/A'}\"`,\n `\"${(log as any).resource_id || 'N/A'}\"`,\n `\"${(log as any).ip_address || 'N/A'}\"`,\n `\"${(log as any).details ? JSON.stringify(JSON.parse((log as any).details)) : 'N/A'}\"`\n ]\n csvRows.push(row.join(','))\n }\n\n const csvContent = csvRows.join('\\n')\n\n // Log the export activity\n await logActivity(\n db, user!.userId, 'activity.logs_exported', undefined, undefined,\n { filters, count: logs?.length || 0 },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return CSV file\n const filename = `activity-logs-${new Date().toISOString().split('T')[0]}.csv`\n \n return new Response(csvContent, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"${filename}\"`\n }\n })\n\n } catch (error) {\n console.error('Activity logs export error:', error)\n return c.json({ error: 'Failed to export activity logs' }, 500)\n }\n})\n\nexport { userRoutes }","export interface MediaFile {\n id: string;\n filename: string;\n original_name: string;\n mime_type: string;\n size: number;\n public_url: string;\n thumbnail_url?: string;\n alt?: string;\n caption?: string;\n tags: string[];\n uploaded_at: string;\n fileSize: string;\n uploadedAt: string;\n isImage: boolean;\n isVideo: boolean;\n isDocument: boolean;\n}\n\nexport interface MediaGridData {\n files: MediaFile[];\n viewMode?: \"grid\" | \"list\";\n selectable?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function renderMediaGrid(data: MediaGridData): string {\n if (data.files.length === 0) {\n return `\n
\n \n \n \n

No media files

\n

${\n data.emptyMessage || \"Get started by uploading your first file.\"\n }

\n
\n `;\n }\n\n const gridClass = data.viewMode === \"list\" ? \"space-y-4\" : \"media-grid\";\n\n return `\n
\n ${data.files\n .map((file) =>\n renderMediaFileCard(file, data.viewMode, data.selectable)\n )\n .join(\"\")}\n
\n `;\n}\n\nexport function renderMediaFileCard(\n file: MediaFile,\n viewMode: \"grid\" | \"list\" = \"grid\",\n selectable: boolean = false\n): string {\n if (viewMode === \"list\") {\n return `\n
\n
\n ${\n selectable\n ? `\n
\n
\n \n \n \n \n \n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n
\n\n
\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n \n \n \n \n \n
\n
\n
\n ${file.uploadedAt}\n ${\n file.tags.length > 0\n ? `\n \n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n
\n
\n `;\n }\n\n // Grid view\n return `\n
\n ${\n selectable\n ? `\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n ${\n file.uploadedAt\n }\n
\n ${\n file.tags.length > 0\n ? `\n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n `;\n}\n\nfunction getFileIcon(mimeType: string): string {\n if (mimeType.startsWith(\"image/\")) {\n return `\n \n \n \n `;\n } else if (mimeType.startsWith(\"video/\")) {\n return `\n \n \n \n `;\n } else if (mimeType === \"application/pdf\") {\n return `\n \n \n \n `;\n } else {\n return `\n \n \n \n `;\n }\n}\n","import {\n getConfirmationDialogScript,\n renderConfirmationDialog,\n} from \"../components/confirmation-dialog.template\";\nimport { MediaFile, renderMediaGrid } from \"../components/media-grid.template\";\nimport {\n AdminLayoutCatalystData,\n renderAdminLayoutCatalyst,\n} from \"../layouts/admin-layout-catalyst.template\";\n\nexport interface FolderStats {\n folder: string;\n count: number;\n totalSize: number;\n}\n\nexport interface TypeStats {\n type: string;\n count: number;\n}\n\nexport interface MediaLibraryPageData {\n files: MediaFile[];\n folders: FolderStats[];\n types: TypeStats[];\n currentFolder: string;\n currentType: string;\n currentView: \"grid\" | \"list\";\n currentPage: number;\n totalFiles: number;\n hasNextPage: boolean;\n user?: {\n name: string;\n email: string;\n role: string;\n };\n version?: string;\n}\n\nexport function renderMediaLibraryPage(data: MediaLibraryPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Media Library

\n

Manage your media files and assets

\n
\n
\n \n \n \n \n Upload Media\n \n
\n
\n \n
\n \n
\n
\n \n
\n \n Upload Files\n \n
\n\n \n
\n

Folders

\n \n
\n\n \n
\n

File Types

\n \n
\n\n \n
\n

Quick Actions

\n
\n \n Create Folder\n \n \n Cleanup Unused\n \n
\n
\n
\n
\n \n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n ${\n data.files.length\n } files\n \n Select All\n \n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Move to Folder\n \n
\n
\n \n \n \n \n Delete Selected Files\n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n ${renderMediaGrid({\n files: data.files,\n viewMode: data.currentView,\n selectable: true,\n emptyMessage:\n \"No media files found. Upload your first file to get started.\",\n })}\n
\n \n \n ${\n data.hasNextPage\n ? `\n
\n
\n ${\n data.currentPage > 1\n ? `\n \n Previous\n \n `\n : \"\"\n }\n Page ${\n data.currentPage\n }\n \n Next\n \n
\n
\n `\n : \"\"\n }\n
\n
\n \n \n \n
\n
\n
\n

Upload Files

\n \n
\n \n \n { window.location.href = '/admin/media?t=' + Date.now(); }, 1500); }\"\n class=\"space-y-4\"\n >\n \n \n \n \n \n
\n

Drop files here or click to upload

\n

PNG, JPG, GIF, PDF up to 10MB

\n
\n
\n \n \n \n \n
\n \n \n
\n\n \n
\n

Selected Files:

\n
\n
\n\n \n
\n \n Cancel\n \n \n Upload Files\n \n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n
\n
\n\n \n
\n
\n
\n

Move to Folder

\n \n
\n\n

\n Select a folder to move 0 selected file(s) to:\n

\n\n
\n ${\n data.folders.length > 0\n ? data.folders\n .map(\n (folder) => `\n \n
\n ${folder.folder}\n ${folder.count} files\n
\n \n `\n )\n .join(\"\")\n : '

No folders available

'\n }\n
\n\n
\n \n Cancel\n \n
\n
\n
\n\n \n
\n
\n
\n

Create New Folder

\n \n
\n\n
\n
\n \n \n

\n Use lowercase letters, numbers, hyphens, and underscores only\n

\n
\n\n
\n \n Cancel\n \n \n Create Folder\n \n
\n
\n
\n
\n\n \n \n \n\n \n ${renderConfirmationDialog({\n id: \"media-bulk-delete-confirm\",\n title: \"Delete Selected Files\",\n message: `Are you sure you want to delete ${\n data.files.length > 0 ? \"the selected files\" : \"these files\"\n }? This action cannot be undone and the files will be permanently removed.`,\n confirmText: \"Delete Files\",\n cancelText: \"Cancel\",\n confirmClass: \"bg-red-500 hover:bg-red-400\",\n iconColor: \"red\",\n onConfirm: \"performBulkDelete()\",\n })}\n\n \n ${getConfirmationDialogScript()}\n `;\n\n function buildPageUrl(page: number, folder: string, type: string): string {\n const params = new URLSearchParams();\n params.set(\"page\", page.toString());\n if (folder !== \"all\") params.set(\"folder\", folder);\n if (type !== \"all\") params.set(\"type\", type);\n return `/admin/media?${params.toString()}`;\n }\n\n const layoutData: AdminLayoutCatalystData = {\n title: \"Media Library\",\n pageTitle: \"Media Library\",\n currentPath: \"/admin/media\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayoutCatalyst(layoutData);\n}\n","import { MediaFile } from './media-grid.template'\n\nexport interface MediaFileDetailsData {\n file: MediaFile & {\n width?: number\n height?: number\n folder: string\n uploadedAt: string\n }\n}\n\nexport function renderMediaFileDetails(data: MediaFileDetailsData): string {\n const { file } = data\n \n return `\n
\n

File Details

\n \n
\n \n
\n \n
\n
\n ${file.isImage ? `\n \"${file.alt\n ` : file.isVideo ? `\n \n ` : `\n
\n \n \n \n
\n `}\n
\n\n
\n \n Copy URL\n \n \n Open Original\n \n
\n
\n \n \n
\n
\n \n

${file.original_name}

\n
\n\n
\n
\n \n

${file.fileSize}

\n
\n
\n \n

${file.mime_type}

\n
\n
\n\n ${file.width && file.height ? `\n
\n
\n \n

${file.width}px

\n
\n
\n \n

${file.height}px

\n
\n
\n ` : ''}\n\n
\n \n

${file.folder}

\n
\n\n
\n \n

${file.uploadedAt}

\n
\n\n \n
\n
\n \n \n
\n\n
\n \n ${file.caption || ''}\n
\n\n
\n \n \n
\n\n
\n \n Save Changes\n \n \n Delete File\n \n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\nimport { html, raw } from 'hono/html'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth, requireRole } from '../middleware'\nimport { renderMediaLibraryPage, MediaLibraryPageData, FolderStats, TypeStats } from '../templates/pages/admin-media-library.template'\nimport { renderMediaFileDetails, MediaFileDetailsData } from '../templates/components/media-file-details.template'\nimport { MediaFile, renderMediaFileCard } from '../templates/components/media-grid.template'\nimport type { Bindings, Variables } from '../app'\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nconst adminMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminMediaRoutes.use('*', requireAuth())\n\n// Media library main page\nadminMediaRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { searchParams } = new URL(c.req.url)\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const view = searchParams.get('view') || 'grid'\n const page = parseInt(searchParams.get('page') || '1')\n const _cacheBust = searchParams.get('t') // Cache-busting parameter\n const limit = 24\n const offset = (page - 1) * limit\n\n const db = c.env.DB\n\n // TODO: Cache implementation removed during migration - will be added back when cache plugin is migrated\n\n // Build query for media files\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = ['deleted_at IS NULL']\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT ${limit} OFFSET ${offset}`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n // Get folder statistics\n const foldersStmt = db.prepare(`\n SELECT folder, COUNT(*) as count, SUM(size) as totalSize\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY folder\n ORDER BY folder\n `)\n const { results: folders } = await foldersStmt.all()\n \n // Get type statistics\n const typesStmt = db.prepare(`\n SELECT\n CASE\n WHEN mime_type LIKE 'image/%' THEN 'images'\n WHEN mime_type LIKE 'video/%' THEN 'videos'\n WHEN mime_type IN ('application/pdf', 'text/plain') THEN 'documents'\n ELSE 'other'\n END as type,\n COUNT(*) as count\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY type\n `)\n const { results: types } = await typesStmt.all()\n \n // Process media files with local serving URLs\n const mediaFiles: MediaFile[] = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n caption: row.caption,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const pageData: MediaLibraryPageData = {\n files: mediaFiles,\n folders: folders.map((f: any) => ({\n folder: f.folder,\n count: f.count,\n totalSize: f.totalSize\n })) as FolderStats[],\n types: types.map((t: any) => ({\n type: t.type,\n count: t.count\n })) as TypeStats[],\n currentFolder: folder,\n currentType: type,\n currentView: view as 'grid' | 'list',\n currentPage: page,\n totalFiles: results.length,\n hasNextPage: results.length === limit,\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: c.get('appVersion')\n }\n\n // TODO: Cache implementation removed during migration\n\n return c.html(renderMediaLibraryPage(pageData))\n } catch (error) {\n console.error('Error loading media library:', error)\n return c.html(html`

Error loading media library

`)\n }\n})\n\n// Media selector endpoint (HTMX endpoint for content form media selection)\nadminMediaRoutes.get('/selector', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const db = c.env.DB\n\n // Build search query\n let query = 'SELECT * FROM media WHERE deleted_at IS NULL'\n const params: any[] = []\n\n if (search.trim()) {\n query += ' AND (filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n query += ' ORDER BY uploaded_at DESC LIMIT 24'\n\n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n // Render media selector grid\n return c.html(html`\n
\n \n
\n\n
\n ${raw(mediaFiles.map(file => `\n \n
\n ${file.isImage ? `\n \n ` : file.isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n\n
\n \n Select\n \n
\n
\n\n
\n

\n ${file.original_name}\n

\n

\n ${file.fileSize}\n

\n
\n
\n `).join(''))}\n \n\n ${mediaFiles.length === 0 ? html`\n
\n \n \n \n

No media files found

\n
\n ` : ''}\n `)\n } catch (error) {\n console.error('Error loading media selector:', error)\n return c.html(html`
Error loading media files
`)\n }\n})\n\n// Search media files (HTMX endpoint)\nadminMediaRoutes.get('/search', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const db = c.env.DB\n \n // Build search query\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = []\n \n if (search.trim()) {\n conditions.push('(filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)')\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT 24`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n const mediaFiles = results.map((row: any) => ({\n ...row,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n fileSize: formatFileSize(row.size),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const gridHTML = mediaFiles.map(file => generateMediaItemHTML(file)).join('')\n \n return c.html(raw(gridHTML))\n } catch (error) {\n console.error('Error searching media:', error)\n return c.html('
Error searching files
')\n }\n})\n\n// Get file details modal (HTMX endpoint)\nadminMediaRoutes.get('/:id/details', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n \n const stmt = db.prepare('SELECT * FROM media WHERE id = ?')\n const result = await stmt.bind(id).first() as any\n \n if (!result) {\n return c.html('
File not found
')\n }\n \n const file: MediaFile & { width?: number; height?: number; folder: string; uploadedAt: string } = {\n id: result.id,\n filename: result.filename,\n original_name: result.original_name,\n mime_type: result.mime_type,\n size: result.size,\n public_url: `/files/${result.r2_key}`,\n thumbnail_url: result.mime_type.startsWith('image/') ? `/files/${result.r2_key}` : undefined,\n alt: result.alt,\n caption: result.caption,\n tags: result.tags ? JSON.parse(result.tags) : [],\n uploaded_at: result.uploaded_at,\n fileSize: formatFileSize(result.size),\n uploadedAt: new Date(result.uploaded_at).toLocaleString(),\n isImage: result.mime_type.startsWith('image/'),\n isVideo: result.mime_type.startsWith('video/'),\n isDocument: !result.mime_type.startsWith('image/') && !result.mime_type.startsWith('video/'),\n width: result.width,\n height: result.height,\n folder: result.folder\n }\n \n const detailsData: MediaFileDetailsData = { file }\n \n return c.html(renderMediaFileDetails(detailsData))\n } catch (error) {\n console.error('Error fetching file details:', error)\n return c.html('
Error loading file details
')\n }\n})\n\n// Upload files endpoint (HTMX compatible)\nadminMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const fileEntries = formData.getAll('files') as unknown[]\n const files: File[] = []\n\n for (const entry of fileEntries) {\n if (entry instanceof File) {\n files.push(entry)\n }\n }\n \n if (!files || files.length === 0) {\n return c.html(html`\n
\n No files provided\n
\n `)\n }\n\n const uploadResults = []\n const errors = []\n\n // Check if MEDIA_BUCKET is available\n console.log('[MEDIA UPLOAD] c.env keys:', Object.keys(c.env))\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET defined?', !!c.env.MEDIA_BUCKET)\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET type:', typeof c.env.MEDIA_BUCKET)\n\n if (!c.env.MEDIA_BUCKET) {\n console.error('[MEDIA UPLOAD] MEDIA_BUCKET is not available! Available env keys:', Object.keys(c.env))\n return c.html(html`\n
\n Media storage (R2) is not configured. Please check your wrangler.toml configuration.\n
Debug: Available bindings: ${Object.keys(c.env).join(', ')}\n
\n `)\n }\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: validation.error.issues[0]?.message || 'Validation failed'\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = crypto.randomUUID()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user!.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Extract image dimensions if it's an image\n let width: number | undefined\n let height: number | undefined\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate URLs - use public serving route\n const publicUrl = `/files/${r2Key}`\n const thumbnailUrl = file.type.startsWith('image/') ? publicUrl : undefined\n\n // Save to database\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n fileId,\n filename,\n file.name,\n file.type,\n file.size,\n width,\n height,\n folder,\n r2Key,\n publicUrl,\n thumbnailUrl,\n user!.userId,\n Math.floor(Date.now() / 1000)\n ).run()\n\n uploadResults.push({\n id: fileId,\n filename: filename,\n originalName: file.name,\n mimeType: file.type,\n size: file.size,\n publicUrl: publicUrl\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed: ' + (error instanceof Error ? error.message : 'Unknown error')\n })\n }\n }\n\n // TODO: Cache invalidation removed during migration\n\n // Fetch updated media list to include in response\n let mediaGridHTML = ''\n if (uploadResults.length > 0) {\n try {\n const folderEntry = formData.get('folder')\n const folder = typeof folderEntry === 'string' ? folderEntry : 'uploads'\n const query = 'SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT 24'\n const stmt = c.env.DB.prepare(query)\n const { results } = await stmt.all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n mediaGridHTML = mediaFiles.map(file => renderMediaFileCard(file, 'grid', true)).join('')\n } catch (error) {\n console.error('Error fetching updated media list:', error)\n }\n }\n\n // Return HTMX response with results\n return c.html(html`\n ${uploadResults.length > 0 ? html`\n
\n Successfully uploaded ${uploadResults.length} file${uploadResults.length > 1 ? 's' : ''}\n
\n ` : ''}\n\n ${errors.length > 0 ? html`\n
\n

Upload errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n ${uploadResults.length > 0 ? html`\n \n ` : ''}\n `)\n } catch (error) {\n console.error('Upload error:', error)\n return c.html(html`\n
\n Upload failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Serve files from R2 storage\nadminMediaRoutes.get('/file/*', async (c) => {\n try {\n const r2Key = c.req.path.replace('/admin/media/file/', '')\n \n if (!r2Key) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(r2Key)\n \n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n \n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n})\n\n// Update media file metadata (HTMX compatible)\nadminMediaRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n const formData = await c.req.formData()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Extract form data\n const alt = formData.get('alt') as string || null\n const caption = formData.get('caption') as string || null\n const tagsString = formData.get('tags') as string || ''\n const tags = tagsString ? tagsString.split(',').map(tag => tag.trim()).filter(tag => tag) : []\n\n // Update database\n const updateStmt = c.env.DB.prepare(`\n UPDATE media \n SET alt = ?, caption = ?, tags = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n alt,\n caption,\n JSON.stringify(tags),\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n // TODO: Cache invalidation removed during migration\n\n return c.html(html`\n
\n File updated successfully\n
\n \n `)\n } catch (error) {\n console.error('Update error:', error)\n return c.html(html`\n
\n Update failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Cleanup unused media files (HTMX compatible)\nadminMediaRoutes.delete('/cleanup', requireRole('admin'), async (c) => {\n try {\n const db = c.env.DB\n\n // Find all media files\n const allMediaStmt = db.prepare('SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL')\n const { results: allMedia } = await allMediaStmt.all<{ id: string; r2_key: string; filename: string }>()\n\n // Find media files referenced in content\n // Content can reference media in various JSON fields like data, hero_image, etc.\n const contentStmt = db.prepare('SELECT data FROM content')\n const { results: contentRecords } = await contentStmt.all<{ data: unknown }>()\n\n // Extract all media URLs from content\n const referencedUrls = new Set()\n for (const record of contentRecords || []) {\n if (record.data) {\n const dataStr = typeof record.data === 'string' ? record.data : JSON.stringify(record.data)\n // Find all /files/ URLs in the content\n const urlMatches = dataStr.matchAll(/\\/files\\/([^\\s\"',]+)/g)\n for (const match of urlMatches) {\n referencedUrls.add(match[1]!)\n }\n }\n }\n\n // Find unreferenced media files\n const mediaRows = allMedia || []\n const unusedFiles = mediaRows.filter((file) => !referencedUrls.has(file.r2_key))\n\n if (unusedFiles.length === 0) {\n return c.html(html`\n
\n No unused media files found. All files are referenced in content.\n
\n \n `)\n }\n\n // Delete unused files from R2 and database\n let deletedCount = 0\n const errors = []\n\n for (const file of unusedFiles) {\n try {\n // Delete from R2\n await c.env.MEDIA_BUCKET.delete(file.r2_key)\n\n // Soft delete in database\n const deleteStmt = db.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), file.id).run()\n\n deletedCount++\n } catch (error) {\n console.error(`Failed to delete ${file.filename}:`, error)\n errors.push({\n filename: file.filename,\n error: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Return success response\n return c.html(html`\n
\n Successfully cleaned up ${deletedCount} unused media file${deletedCount !== 1 ? 's' : ''}.\n ${errors.length > 0 ? html`\n
Failed to delete ${errors.length} file${errors.length !== 1 ? 's' : ''}.\n ` : ''}\n
\n\n ${errors.length > 0 ? html`\n
\n

Cleanup errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n \n `)\n } catch (error) {\n console.error('Cleanup error:', error)\n return c.html(html`\n
\n Cleanup failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Delete media file (HTMX compatible)\nadminMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // TODO: Cache invalidation removed during migration\n\n // Return HTMX response that redirects to media library\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Delete error:', error)\n return c.html(html`\n
\n Delete failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length - 8) {\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n const segmentLength = (uint8Array[i + 2]! << 8) | uint8Array[i + 3]!\n i += 2 + segmentLength\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\n// Helper function to generate media item HTML\nfunction generateMediaItemHTML(file: any): string {\n const isImage = file.isImage\n const isVideo = file.isVideo\n \n return `\n
\n
\n ${isImage ? `\n \"${file.alt\n ` : isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n \n
\n
\n \n \n
\n
\n
\n \n
\n

\n ${file.original_name}\n

\n
\n ${file.fileSize}\n ${file.uploadedAt}\n
\n ${file.tags.length > 0 ? `\n
\n ${file.tags.slice(0, 2).map((tag: string) => `\n \n ${tag}\n \n `).join('')}\n ${file.tags.length > 2 ? `+${file.tags.length - 2}` : ''}\n
\n ` : ''}\n
\n
\n `\n}\n\n// Helper function to format file size\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n\nexport { adminMediaRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface Plugin {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error' | 'uninstalled'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n}\n\nexport interface PluginsListPageData {\n plugins: Plugin[]\n stats?: {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderPluginsListPage(data: PluginsListPageData): string {\n const categories = [\n { value: 'content', label: 'Content Management' },\n { value: 'media', label: 'Media' },\n { value: 'editor', label: 'Editors' },\n { value: 'seo', label: 'SEO & Analytics' },\n { value: 'security', label: 'Security' },\n { value: 'utilities', label: 'Utilities' },\n { value: 'system', label: 'System' },\n { value: 'development', label: 'Development' },\n { value: 'demo', label: 'Demo' }\n ];\n\n const statuses = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'uninstalled', label: 'Available to Install' },\n { value: 'error', label: 'Error' }\n ];\n\n // Calculate counts\n const categoryCounts: Record = {};\n categories.forEach(cat => {\n categoryCounts[cat.value] = data.plugins.filter(p => p.category === cat.value).length;\n });\n\n // Sort categories by count (descending)\n categories.sort((a, b) => (categoryCounts[b.value] || 0) - (categoryCounts[a.value] || 0));\n\n const statusCounts: Record = {};\n statuses.forEach(status => {\n statusCounts[status.value] = data.plugins.filter(p => p.status === status.value).length;\n });\n\n // Sort statuses by count (descending)\n statuses.sort((a, b) => (statusCounts[b.value] || 0) - (statusCounts[a.value] || 0));\n\n const pageContent = `\n
\n \n
\n
\n

Plugins

\n

Manage and extend functionality with plugins

\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n
\n

\n Experimental Feature\n

\n
\n

\n Plugin management is currently under active development. While functional, some features may change or have limitations.\n Please report any issues you encounter on our Discord community.\n

\n
\n
\n
\n
\n\n
\n \n \n\n \n
\n \n
\n
\n
Total
\n
${data.stats?.total || 0}
\n
\n
\n
Active
\n
${data.stats?.active || 0}
\n
\n
\n
Available
\n
${data.stats?.uninstalled || 0}
\n
\n
\n
Errors
\n
${data.stats?.errors || 0}
\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n \n
\n\n
\n \n\n \n \n \n \n \n
\n
\n\n \n
\n ${data.plugins.map(plugin => renderPluginCard(plugin)).join('')}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'uninstall-plugin-confirm',\n title: 'Uninstall Plugin',\n message: 'Are you sure you want to uninstall this plugin? This action cannot be undone.',\n confirmText: 'Uninstall',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performUninstallPlugin()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Plugins',\n pageTitle: 'Plugin Management',\n currentPath: '/admin/plugins',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderPluginCard(plugin: Plugin): string {\n const statusColors = {\n active: 'bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-400 ring-emerald-600/20',\n inactive: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-zinc-600/20',\n error: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-red-600/20',\n uninstalled: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-600 dark:text-zinc-500 ring-zinc-600/20'\n }\n\n const statusIcons = {\n active: '
',\n inactive: '
',\n error: '
',\n uninstalled: '
'\n }\n\n // Core system plugins that cannot be deactivated\n const criticalCorePlugins = ['core-auth', 'core-media']\n const canToggle = !criticalCorePlugins.includes(plugin.id)\n\n let actionButton = ''\n if (plugin.status === 'uninstalled') {\n actionButton = ``\n } else {\n const isActive = plugin.status === 'active';\n const action = isActive ? 'deactivate' : 'activate';\n // Use bg-emerald-600 for active, bg-zinc-200 (light) / bg-zinc-700 (dark) for inactive\n const bgClass = isActive ? 'bg-emerald-600' : 'bg-zinc-200 dark:bg-zinc-700';\n const translateClass = isActive ? 'translate-x-5' : 'translate-x-0';\n \n if (canToggle) {\n actionButton = `\n \n `\n } else {\n // Critical core plugins cannot be toggled\n actionButton = `\n
\n \n
\n `\n }\n }\n\n return `\n
\n
\n
\n
\n ${plugin.icon || getDefaultPluginIcon(plugin.category)}\n
\n
\n
\n

${plugin.displayName}

\n \n ${statusIcons[plugin.status]}${plugin.status.charAt(0).toUpperCase() + plugin.status.slice(1)}\n \n
\n

v${plugin.version} • ${plugin.author}

\n
\n
\n \n
\n ${!plugin.isCore && plugin.status !== 'uninstalled' ? `\n \n ` : ''}\n
\n
\n\n

${plugin.description}

\n\n
\n \n ${plugin.category}\n \n ${plugin.isCore ? 'Core' : ''}\n \n ${plugin.dependencies && plugin.dependencies.map(dep => `\n \n ${dep}\n \n `).join('') || ''}\n
\n\n
\n
\n ${actionButton}\n
\n
\n
\n `\n}\n\nfunction getDefaultPluginIcon(category: string): string {\n const iconColor = 'text-zinc-600 dark:text-zinc-400'\n\n const icons: Record = {\n 'content': `\n \n \n \n `,\n 'media': `\n \n \n \n `,\n 'seo': `\n \n \n \n `,\n 'analytics': `\n \n \n \n `,\n 'ecommerce': `\n \n \n \n `,\n 'email': `\n \n \n \n `,\n 'workflow': `\n \n \n \n `,\n 'security': `\n \n \n \n `,\n 'social': `\n \n \n \n `,\n 'utility': `\n \n \n \n \n `,\n }\n\n const iconKey = category.toLowerCase() as keyof typeof icons\n return icons[iconKey] || icons['utility'] || ''\n}\n\n// Mock data generator\nexport function generateMockPlugins(): Plugin[] {\n return [\n {\n id: '1',\n name: 'seo-optimizer',\n displayName: 'SEO Optimizer',\n description: 'Advanced SEO optimization tools including meta tag management, sitemap generation, and analytics integration. Boost your search engine rankings with automated optimizations.',\n version: '2.1.4',\n author: 'SonicJS Team',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 15420,\n rating: 4.8,\n lastUpdated: '2 days ago',\n dependencies: ['analytics-plugin'],\n permissions: ['read:content', 'write:meta'],\n isCore: true\n },\n {\n id: '2',\n name: 'image-optimizer',\n displayName: 'Image Optimizer',\n description: 'Automatically compress and optimize images on upload. Supports WebP conversion, lazy loading, and responsive image generation for better performance.',\n version: '1.5.2',\n author: 'MediaPro',\n status: 'active',\n category: 'media',\n icon: ``,\n downloadCount: 8930,\n rating: 4.6,\n lastUpdated: '1 week ago',\n dependencies: [],\n permissions: ['write:media', 'read:settings']\n },\n {\n id: '3',\n name: 'backup-manager',\n displayName: 'Backup Manager',\n description: 'Automated backup solution for content and media files. Schedule regular backups to cloud storage with encryption and restore capabilities.',\n version: '3.0.1',\n author: 'BackupCorp',\n status: 'inactive',\n category: 'utilities',\n icon: ``,\n downloadCount: 12450,\n rating: 4.9,\n lastUpdated: '3 days ago',\n dependencies: ['cloud-storage'],\n permissions: ['read:all', 'write:backups']\n },\n {\n id: '4',\n name: 'security-scanner',\n displayName: 'Security Scanner',\n description: 'Real-time security monitoring and vulnerability scanning. Detects malware, suspicious activities, and provides security recommendations.',\n version: '1.2.8',\n author: 'SecureWeb',\n status: 'error',\n category: 'security',\n icon: ``,\n downloadCount: 5680,\n rating: 4.3,\n lastUpdated: '5 days ago',\n dependencies: ['security-core'],\n permissions: ['read:logs', 'read:files', 'write:security']\n },\n {\n id: '5',\n name: 'social-share',\n displayName: 'Social Share',\n description: 'Easy social media sharing buttons and Open Graph meta tag generation. Supports all major social platforms with customizable styling.',\n version: '2.3.0',\n author: 'SocialPlus',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 22100,\n rating: 4.7,\n lastUpdated: '4 days ago',\n dependencies: [],\n permissions: ['read:content', 'write:meta']\n },\n {\n id: '6',\n name: 'analytics-pro',\n displayName: 'Analytics Pro',\n description: 'Advanced analytics dashboard with custom tracking events, conversion funnels, and detailed visitor insights. GDPR compliant with privacy controls.',\n version: '4.1.2',\n author: 'AnalyticsPro Inc',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 18750,\n rating: 4.9,\n lastUpdated: '1 day ago',\n dependencies: ['gdpr-compliance'],\n permissions: ['read:analytics', 'write:tracking', 'read:users']\n },\n {\n id: '7',\n name: 'form-builder',\n displayName: 'Advanced Form Builder',\n description: 'Drag-and-drop form builder with conditional logic, file uploads, payment integration, and email notifications. Perfect for contact forms and surveys.',\n version: '1.8.5',\n author: 'FormWorks',\n status: 'inactive',\n category: 'content',\n icon: ``,\n downloadCount: 9870,\n rating: 4.4,\n lastUpdated: '1 week ago',\n dependencies: ['email-service'],\n permissions: ['write:forms', 'read:submissions', 'send:emails']\n },\n {\n id: '8',\n name: 'cache-optimizer',\n displayName: 'Cache Optimizer',\n description: 'Intelligent caching system with Redis support, CDN integration, and automatic cache invalidation. Dramatically improves site performance.',\n version: '2.7.3',\n author: 'SpeedBoost',\n status: 'active',\n category: 'utilities',\n icon: ``,\n downloadCount: 13240,\n rating: 4.8,\n lastUpdated: '6 days ago',\n dependencies: ['redis-connector'],\n permissions: ['read:cache', 'write:cache', 'manage:cdn'],\n isCore: true\n },\n {\n id: '9',\n name: 'multilingual',\n displayName: 'Multilingual Support',\n description: 'Complete internationalization solution with automatic translation, language detection, and localized content management for global websites.',\n version: '3.2.1',\n author: 'GlobalWeb',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 7650,\n rating: 4.5,\n lastUpdated: '2 weeks ago',\n dependencies: ['translation-api'],\n permissions: ['read:content', 'write:translations', 'manage:languages']\n }\n ]\n}\n","import type { AuthSettings } from '../../services/auth-validation'\n\nexport function renderAuthSettingsForm(settings: AuthSettings): string {\n const fields = settings.requiredFields\n const validation = settings.validation\n const registration = settings.registration\n\n return `\n
\n \n
\n

Registration Fields

\n

Configure which fields are required during user registration and their minimum lengths.

\n\n
\n ${Object.entries(fields).map(([fieldName, config]: [string, any]) => `\n
\n
\n
\n

${config.label}

\n

Field type: ${config.type}

\n
\n \n
\n\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n `).join('')}\n
\n
\n\n \n
\n

Password Requirements

\n

Additional password complexity requirements.

\n\n
\n
\n
\n \n

Password must contain at least one uppercase letter (A-Z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one lowercase letter (a-z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one number (0-9)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one special character (!@#$%^&*)

\n
\n \n
\n
\n
\n\n \n
\n

Registration Settings

\n

General registration behavior.

\n\n
\n
\n
\n \n

Enable or disable public user registration

\n
\n \n
\n\n
\n
\n \n

Users must verify their email before accessing the system

\n
\n \n
\n\n
\n \n \n \n \n \n \n

Role assigned to new users upon registration

\n
\n
\n
\n\n \n
\n

Validation Settings

\n

Additional validation rules.

\n\n
\n
\n
\n \n

Validate that email addresses are in correct format

\n
\n \n
\n\n
\n
\n \n

Ensure usernames are unique across all users

\n
\n \n
\n
\n
\n
\n `\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAuthSettingsForm } from '../components/auth-settings-form.template'\nimport type { AuthSettings } from '../../services/auth-validation'\n\n/**\n * Escape HTML attribute values to prevent XSS\n */\nfunction escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport interface PluginSettings {\n [key: string]: any\n}\n\nexport interface PluginActivity {\n id: string\n action: string\n message: string\n timestamp: number\n user?: string\n}\n\nexport interface PluginSettingsPageData {\n plugin: {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n settings?: PluginSettings\n }\n activity?: PluginActivity[]\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderPluginSettingsPage(data: PluginSettingsPageData): string {\n const { plugin, activity = [], user } = data\n \n const pageContent = `\n
\n \n
\n
\n

Plugin Settings

\n

\n ${plugin.description}\n

\n
\n \n
\n\n \n
\n
\n
\n
\n ${plugin.icon || plugin.displayName.charAt(0).toUpperCase()}\n
\n
\n

${plugin.displayName}

\n
\n v${plugin.version}\n by ${plugin.author}\n ${plugin.category}\n ${plugin.downloadCount ? `${plugin.downloadCount.toLocaleString()} downloads` : ''}\n ${plugin.rating ? `★ ${plugin.rating}` : ''}\n
\n
\n
\n\n
\n ${renderStatusBadge(plugin.status)}\n ${renderToggleButton(plugin)}\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n \n
\n ${renderSettingsTab(plugin)}\n
\n\n \n
\n ${renderActivityTab(activity)}\n
\n\n \n
\n ${renderInformationTab(plugin)}\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${plugin.displayName} Settings`,\n pageTitle: `${plugin.displayName} Settings`,\n currentPath: `/admin/plugins/${plugin.id}`,\n user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction renderStatusBadge(status: string): string {\n const statusColors: Record = {\n active: 'bg-green-900/50 text-green-300 border-green-600/30',\n inactive: 'bg-gray-800/50 text-gray-400 border-gray-600/30',\n error: 'bg-red-900/50 text-red-300 border-red-600/30'\n }\n\n const statusIcons: Record = {\n active: '
',\n inactive: '
',\n error: '
'\n }\n\n return `\n \n ${statusIcons[status] || statusIcons.inactive}${status.charAt(0).toUpperCase() + status.slice(1)}\n \n `\n}\n\nfunction renderToggleButton(plugin: any): string {\n if (plugin.isCore) {\n return 'Core Plugin'\n }\n\n return plugin.status === 'active' \n ? ``\n : ``\n}\n\nfunction renderSettingsTab(plugin: any): string {\n const settings = plugin.settings || {}\n const pluginId = plugin.id || plugin.name\n\n // Check for custom settings component first\n const customRenderer = pluginSettingsComponents[pluginId]\n if (customRenderer) {\n return `\n
\n ${customRenderer(plugin, settings)}\n\n
\n \n Save Settings\n \n
\n
\n `\n }\n\n const isSeedDataPlugin = plugin.id === 'seed-data' || plugin.name === 'seed-data'\n const isAuthPlugin = plugin.id === 'core-auth' || plugin.name === 'core-auth'\n const isTurnstilePlugin = plugin.id === 'turnstile' || plugin.name === 'turnstile'\n\n return `\n ${isSeedDataPlugin ? `\n
\n
\n
\n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n
\n \n \n \n \n Open Seed Data Tool\n \n
\n
\n ` : ''}\n\n
\n ${isAuthPlugin ? `\n

Authentication Settings

\n

Configure user registration fields and validation rules.

\n ` : isTurnstilePlugin ? `\n

Cloudflare Turnstile Settings

\n

Configure CAPTCHA-free bot protection for your forms.

\n ` : `\n

Plugin Settings

\n `}\n\n
\n ${isAuthPlugin && Object.keys(settings).length > 0\n ? renderAuthSettingsForm(settings as AuthSettings)\n : isTurnstilePlugin && Object.keys(settings).length > 0\n ? renderTurnstileSettingsForm(settings)\n : Object.keys(settings).length > 0\n ? renderSettingsFields(settings)\n : renderNoSettings(plugin)\n }\n\n ${Object.keys(settings).length > 0 ? `\n
\n \n Save Settings\n \n
\n ` : ''}\n
\n
\n `\n}\n\nfunction renderSettingsFields(settings: PluginSettings): string {\n return Object.entries(settings).map(([key, value]) => {\n const fieldId = `setting_${key}`\n const displayName = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase())\n \n if (typeof value === 'boolean') {\n return `\n
\n
\n \n

Enable or disable this feature

\n
\n \n
\n `\n } else if (typeof value === 'number') {\n return `\n
\n \n \n
\n `\n } else {\n return `\n
\n \n \n
\n `\n }\n }).join('')\n}\n\nfunction renderTurnstileSettingsForm(settings: any): string {\n const inputClass = \"backdrop-blur-sm bg-white/10 border border-white/20 rounded-lg px-3 py-2 text-white placeholder-gray-300 focus:border-blue-400 focus:outline-none transition-colors w-full\"\n const selectClass = \"backdrop-blur-sm bg-zinc-800 border border-white/20 rounded-lg px-3 py-2 text-white focus:border-blue-400 focus:outline-none transition-colors w-full [&>option]:bg-zinc-800 [&>option]:text-white\"\n \n return `\n \n
\n
\n \n

Enable or disable Turnstile verification globally

\n
\n \n
\n\n \n
\n \n \n

Your Cloudflare Turnstile site key (public)

\n
\n\n \n
\n \n \n

Your Cloudflare Turnstile secret key (private)

\n
\n\n \n
\n \n \n

Visual appearance of the Turnstile widget

\n
\n\n \n
\n \n \n

Size of the Turnstile challenge widget

\n
\n\n \n
\n \n \n

Managed: Shows challenge only when needed. Non-Interactive: Always shows but doesn't require interaction. Invisible: Runs in background without UI.

\n
\n\n \n
\n \n \n

Controls when Turnstile verification occurs. Always: Verifies immediately (pre-clearance). Execute: Verifies on form submit. Interaction Only: Only after user interaction.

\n
\n `\n}\n\nfunction renderNoSettings(plugin: any): string {\n // Special handling for seed-data plugin\n if (plugin.id === 'seed-data' || plugin.name === 'seed-data') {\n return `\n
\n \n \n \n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n \n \n \n \n Generate Seed Data\n \n
\n `\n }\n\n return `\n
\n \n \n \n \n

No Settings Available

\n

This plugin doesn't have any configurable settings.

\n
\n `\n}\n\nfunction renderActivityTab(activity: PluginActivity[]): string {\n return `\n
\n

Activity Log

\n \n ${activity.length > 0 ? `\n
\n ${activity.map(item => `\n
\n
\n
\n
\n ${item.action}\n ${formatTimestamp(item.timestamp)}\n
\n

${item.message}

\n ${item.user ? `

by ${item.user}

` : ''}\n
\n
\n `).join('')}\n
\n ` : `\n
\n \n \n \n

No Activity

\n

No recent activity for this plugin.

\n
\n `}\n
\n `\n}\n\nfunction renderInformationTab(plugin: any): string {\n return `\n
\n \n
\n

Plugin Details

\n
\n
\n Name:\n ${plugin.displayName}\n
\n
\n Version:\n ${plugin.version}\n
\n
\n Author:\n ${plugin.author}\n
\n
\n Category:\n ${plugin.category}\n
\n
\n Status:\n ${plugin.status}\n
\n
\n Last Updated:\n ${plugin.lastUpdated}\n
\n
\n
\n\n \n
\n

Dependencies & Permissions

\n \n ${plugin.dependencies && plugin.dependencies.length > 0 ? `\n
\n

Dependencies:

\n
\n ${plugin.dependencies.map((dep: string) => `\n
${dep}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${plugin.permissions && plugin.permissions.length > 0 ? `\n
\n

Permissions:

\n
\n ${plugin.permissions.map((perm: string) => `\n
${perm}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${(!plugin.dependencies || plugin.dependencies.length === 0) && (!plugin.permissions || plugin.permissions.length === 0) ? `\n

No dependencies or special permissions required.

\n ` : ''}\n
\n
\n `\n}\n\nfunction formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp * 1000)\n return date.toLocaleString()\n}\n\n// ==================== Plugin Settings Components ====================\n// These render just the settings content, embedded within the shared layout\n\n/**\n * Registry of custom plugin settings components\n * Plugins with custom settings UI register their render functions here\n */\ntype PluginSettingsRenderer = (plugin: any, settings: PluginSettings) => string\n\nconst pluginSettingsComponents: Record = {\n 'otp-login': renderOTPLoginSettingsContent,\n 'email': renderEmailSettingsContent,\n}\n\n/**\n * OTP Login plugin settings content\n */\nfunction renderOTPLoginSettingsContent(plugin: any, settings: PluginSettings): string {\n const siteName = settings.siteName || 'SonicJS'\n const emailConfigured = settings._emailConfigured || false\n const codeLength = settings.codeLength || 6\n const codeExpiryMinutes = settings.codeExpiryMinutes || 10\n const maxAttempts = settings.maxAttempts || 3\n const rateLimitPerHour = settings.rateLimitPerHour || 5\n const allowNewUserRegistration = settings.allowNewUserRegistration || false\n const logoUrl = settings.logoUrl || ''\n const logoWidth = Number(settings.logoWidth) || 150\n const logoBorderWidth = Number(settings.logoBorderWidth) || 0\n const logoBorderColor = settings.logoBorderColor || '#ffffff'\n const loginUrl = settings.loginUrl || ''\n const loginButtonText = settings.loginButtonText || ''\n const previewButtonText = loginButtonText.trim() || `Sign in to ${siteName}`\n const previewLogoBorder = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${escapeHtmlAttr(logoBorderColor)}; border-radius: 8px;`\n : ''\n\n return `\n
\n \n
\n

\n 📧 Test OTP Email\n

\n\n ${!emailConfigured ? `\n
\n

\n ⚠️ Email not configured.\n Configure the Email plugin\n to send real emails. Dev mode will show codes in the response.\n

\n
\n ` : `\n
\n

\n ✅ Email configured. Test emails will be sent via Resend.\n

\n
\n `}\n\n
\n
\n \n \n
\n\n \n Send Test Code\n \n \n \n \n \n \n \n \n\n
\n\n \n
\n

Verify Code

\n
\n
\n \n \n
\n \n Verify Code\n \n \n
\n
\n
\n\n \n
\n

Code Settings

\n\n
\n
\n \n \n

Optional. Displayed at the top of the OTP email.

\n
\n\n
\n
\n \n \n

Max width of the logo (20-600).

\n
\n\n
\n \n \n

0 disables the border.

\n
\n\n
\n \n
\n \n \n
\n

Hex, rgb(), or named color.

\n
\n
\n\n
\n \n \n

Optional. If set, a \"Sign in\" button is added to the email.

\n
\n\n
\n \n \n

Optional. Defaults to \"Sign in to ${siteName}\".

\n
\n\n
\n
\n \n \n

Number of digits (4-8)

\n
\n\n
\n \n \n

How long codes remain valid

\n
\n\n
\n \n \n

Max verification attempts

\n
\n\n
\n \n \n

Max requests per email per hour

\n
\n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

\n 👁️ Email Preview\n

\n

\n This is how the OTP email will appear to users. The site name \"${siteName}\" is configured in\n General Settings.\n

\n\n
\n
\n ${logoUrl ? `\"Logo\"` : ''}\n

Your Login Code

\n

Enter this code to sign in to ${siteName}

\n
\n\n
\n
\n
\n 123456\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${codeExpiryMinutes} minutes\n

\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${siteName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n
\n
\n\n \n
\n

🔢 Features

\n
    \n
  • ✓ Passwordless authentication
  • \n
  • ✓ Secure random code generation
  • \n
  • ✓ Rate limiting protection
  • \n
  • ✓ Brute force prevention
  • \n
  • ✓ Mobile-friendly UX
  • \n
\n
\n\n \n \n
\n\n \n `\n}\n\n/**\n * Email plugin settings content\n */\nfunction renderEmailSettingsContent(plugin: any, settings: PluginSettings): string {\n const apiKey = settings.apiKey || ''\n const fromEmail = settings.fromEmail || ''\n const fromName = settings.fromName || ''\n const replyTo = settings.replyTo || ''\n const logoUrl = settings.logoUrl || ''\n\n return `\n
\n \n
\n

Resend Configuration

\n\n
\n \n
\n \n \n

\n Get your API key from resend.com/api-keys\n

\n
\n\n \n
\n \n \n

Must be a verified domain in Resend

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n

Logo to display in email templates

\n
\n
\n
\n\n \n
\n

Send Test Email

\n
\n \n \n Send Test\n \n
\n
\n
\n\n \n
\n

📧 Email Templates Included

\n
    \n
  • ✓ Registration confirmation
  • \n
  • ✓ Email verification
  • \n
  • ✓ Password reset
  • \n
  • ✓ One-time code (2FA)
  • \n
\n

\n Templates are code-based and can be customized by editing the plugin files.\n

\n
\n
\n\n \n `\n}\n\n/**\n * Check if a plugin has a custom settings component\n */\nexport function hasCustomSettingsComponent(pluginId: string): boolean {\n return pluginId in pluginSettingsComponents\n}\n\n/**\n * Get the custom settings component for a plugin\n */\nexport function getCustomSettingsComponent(pluginId: string): PluginSettingsRenderer | undefined {\n return pluginSettingsComponents[pluginId]\n}","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderPluginsListPage, PluginsListPageData, Plugin } from '../templates/pages/admin-plugins-list.template'\nimport { renderPluginSettingsPage, PluginSettingsPageData } from '../templates/pages/admin-plugin-settings.template'\nimport { SettingsService } from '../services/settings'\nimport { PluginService } from '../services'\nimport { PLUGIN_REGISTRY, findPluginByCodeName } from '../plugins/manifest-registry'\nimport type { Bindings, Variables } from '../app'\n\nconst adminPluginRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminPluginRoutes.use('*', requireAuth())\n\n// Build available plugins list from the auto-generated registry.\n// To add a new plugin to this list, create a manifest.json in the plugin directory\n// and run: node packages/scripts/generate-plugin-registry.mjs\nconst AVAILABLE_PLUGINS = Object.values(PLUGIN_REGISTRY).map(p => ({\n id: p.id,\n name: p.codeName,\n display_name: p.displayName,\n description: p.description,\n version: p.version,\n author: p.author,\n category: p.category,\n icon: p.iconEmoji,\n permissions: p.permissions,\n dependencies: p.dependencies,\n is_core: p.is_core\n}))\n\n// Plugin list page\nadminPluginRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n // TODO: Fix permission system\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n\n const pluginService = new PluginService(db)\n\n // Get all installed plugins with error handling\n let installedPlugins: any[] = []\n let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 }\n\n try {\n installedPlugins = await pluginService.getAllPlugins()\n stats = await pluginService.getPluginStats()\n } catch (error) {\n console.error('Error loading plugins:', error)\n // Continue with empty data\n }\n\n // Get list of installed plugin IDs\n const installedPluginIds = new Set(installedPlugins.map(p => p.id))\n\n // Find uninstalled plugins\n const uninstalledPlugins = AVAILABLE_PLUGINS.filter(p => !installedPluginIds.has(p.id))\n\n // Map installed plugins to template format\n const templatePlugins: Plugin[] = installedPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: p.status,\n category: p.category,\n icon: p.icon,\n downloadCount: p.download_count,\n rating: p.rating,\n lastUpdated: formatLastUpdated(p.last_updated),\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Add uninstalled plugins to the list\n const uninstalledTemplatePlugins: Plugin[] = uninstalledPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: 'uninstalled' as const,\n category: p.category,\n icon: p.icon,\n downloadCount: 0,\n rating: 0,\n lastUpdated: 'Not installed',\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Combine installed and uninstalled plugins\n const allPlugins = [...templatePlugins, ...uninstalledTemplatePlugins]\n\n // Update stats with uninstalled count\n stats.uninstalled = uninstalledPlugins.length\n stats.total = installedPlugins.length + uninstalledPlugins.length\n\n const pageData: PluginsListPageData = {\n plugins: allPlugins,\n stats,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n },\n version: c.get('appVersion')\n }\n\n return c.html(renderPluginsListPage(pageData))\n } catch (error) {\n console.error('Error loading plugins page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Get plugin settings page\nadminPluginRoutes.get('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Check authorization first\n if (user?.role !== 'admin') {\n return c.redirect('/admin/plugins')\n }\n\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin(pluginId)\n\n if (!plugin) {\n return c.text('Plugin not found', 404)\n }\n\n // Get activity log\n const activity = await pluginService.getPluginActivity(pluginId, 20)\n\n // Load additional context for plugins with custom settings components\n let enrichedSettings = plugin.settings || {}\n\n // For OTP Login plugin, add site name and email config status\n if (pluginId === 'otp-login') {\n // Get site name from general settings via SettingsService\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName || 'SonicJS'\n\n // Check if email plugin is configured\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n let emailConfigured = false\n if (emailPlugin?.settings) {\n try {\n const emailSettings = JSON.parse(emailPlugin.settings)\n emailConfigured = !!(emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName)\n } catch (e) { /* ignore */ }\n }\n\n enrichedSettings = {\n ...enrichedSettings,\n siteName,\n _emailConfigured: emailConfigured\n }\n }\n\n // Map plugin data to template format\n const templatePlugin = {\n id: plugin.id,\n name: plugin.name,\n displayName: plugin.display_name,\n description: plugin.description,\n version: plugin.version,\n author: plugin.author,\n status: plugin.status,\n category: plugin.category,\n icon: plugin.icon,\n downloadCount: plugin.download_count,\n rating: plugin.rating,\n lastUpdated: formatLastUpdated(plugin.last_updated),\n dependencies: plugin.dependencies,\n permissions: plugin.permissions,\n isCore: plugin.is_core,\n settings: enrichedSettings\n }\n\n // Map activity data\n const templateActivity = (activity || []).map(item => ({\n id: item.id,\n action: item.action,\n message: item.message,\n timestamp: item.timestamp,\n user: item.user_email\n }))\n\n const pageData: PluginSettingsPageData = {\n plugin: templatePlugin,\n activity: templateActivity,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n }\n }\n\n return c.html(renderPluginSettingsPage(pageData))\n } catch (error) {\n console.error('Error getting plugin settings page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Activate plugin\nadminPluginRoutes.post('/:id/activate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.activatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error activating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to activate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Deactivate plugin\nadminPluginRoutes.post('/:id/deactivate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.deactivatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deactivating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to deactivate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Generic install handler - uses the auto-generated plugin registry.\n// No per-plugin switch/case needed. Adding a manifest.json is enough.\nadminPluginRoutes.post('/install', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const body = await c.req.json()\n const pluginService = new PluginService(db)\n\n // Look up plugin in registry by codeName (what the frontend sends as body.name)\n // or by id\n const registryEntry = findPluginByCodeName(body.name)\n || PLUGIN_REGISTRY[body.name]\n || PLUGIN_REGISTRY[body.id]\n\n if (!registryEntry) {\n return c.json({ error: 'Plugin not found in registry' }, 404)\n }\n\n const plugin = await pluginService.installPlugin({\n id: registryEntry.id,\n name: registryEntry.codeName,\n display_name: registryEntry.displayName,\n description: registryEntry.description,\n version: registryEntry.version,\n author: registryEntry.author,\n category: registryEntry.category,\n icon: registryEntry.iconEmoji,\n permissions: registryEntry.permissions,\n dependencies: registryEntry.dependencies,\n is_core: registryEntry.is_core,\n settings: registryEntry.defaultSettings,\n })\n\n return c.json({ success: true, plugin })\n } catch (error) {\n console.error('Error installing plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to install plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Uninstall plugin\nadminPluginRoutes.post('/:id/uninstall', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.uninstallPlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error uninstalling plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to uninstall plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Update plugin settings\nadminPluginRoutes.post('/:id/settings', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const settings = await c.req.json()\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings(pluginId, settings)\n\n // Clear auth validation cache if updating core-auth plugin\n if (pluginId === 'core-auth') {\n try {\n const cacheKv = c.env.CACHE_KV\n if (cacheKv) {\n await cacheKv.delete('auth:settings')\n await cacheKv.delete('auth:registration-enabled')\n console.log('[AuthSettings] Cache cleared after updating authentication settings')\n }\n } catch (cacheError) {\n console.error('[AuthSettings] Failed to clear cache:', cacheError)\n }\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating plugin settings:', error)\n const message = error instanceof Error ? error.message : 'Failed to update settings'\n return c.json({ error: message }, 400)\n }\n})\n\n// Helper function to format last updated time\nfunction formatLastUpdated(timestamp: number): string {\n const now = Date.now() / 1000\n const diff = now - timestamp\n\n if (diff < 60) return 'just now'\n if (diff < 3600) return `${Math.floor(diff / 60)} minutes ago`\n if (diff < 86400) return `${Math.floor(diff / 3600)} hours ago`\n if (diff < 604800) return `${Math.floor(diff / 86400)} days ago`\n if (diff < 2592000) return `${Math.floor(diff / 604800)} weeks ago`\n return `${Math.floor(diff / 2592000)} months ago`\n}\n\nexport { adminPluginRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogEntry {\n id: string\n level: string\n category: string\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags: string[]\n source?: string\n createdAt: Date\n formattedDate: string\n formattedDuration?: string\n levelClass: string\n categoryClass: string\n}\n\nexport interface LogsListPageData {\n logs: LogEntry[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n baseUrl: string\n }\n filters: {\n level: string\n category: string\n search: string\n startDate: string\n endDate: string\n source: string\n }\n user?: BaseUser\n}\n\nexport function renderLogsListPage(data: LogsListPageData) {\n const { logs, pagination, filters, user } = data\n\n const content = `\n
\n
\n
\n

System Logs

\n

\n Monitor and analyze system activity, errors, and performance metrics.\n

\n
\n
\n \n Configure\n \n \n Export\n \n
\n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n Apply Filters\n \n \n Clear\n \n
\n
\n\n
\n ${pagination.totalItems} ${pagination.totalItems === 1 ? 'entry' : 'entries'}\n
\n
\n
\n
\n
\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
\n Level\n \n Category\n \n Message\n \n Source\n \n Time\n \n Actions\n
\n \n ${log.level}\n \n \n \n ${log.category}\n \n \n
\n
${log.message}
\n ${log.url ? `
${log.method} ${log.url}
` : ''}\n ${log.duration ? `
${log.formattedDuration}
` : ''}\n
\n
\n ${log.source || '-'}\n \n ${log.formattedDate}\n \n \n View Details\n \n
\n
\n\n ${logs.length === 0 ? `\n
\n \n \n \n

No log entries

\n

No log entries found matching your criteria.

\n
\n ` : ''}\n
\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : `\n \n Previous\n \n `}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : `\n \n Next\n \n `}\n
\n
\n
\n

\n Showing ${pagination.startItem} to ${pagination.endItem} of{' '}\n ${pagination.totalItems} results\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'System Logs',\n pageTitle: 'System Logs',\n currentPath: '/admin/logs',\n user,\n content\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport { LogEntry } from './admin-logs-list.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogDetailsPageData {\n log: LogEntry\n user?: BaseUser\n}\n\nexport function renderLogDetailsPage(data: LogDetailsPageData) {\n const { log, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Details

\n

\n Detailed information for log entry ${log.id}\n

\n
\n
\n\n
\n
\n
\n

Log Entry Information

\n
\n \n ${log.level}\n \n \n ${log.category}\n \n
\n
\n
\n \n
\n
\n
\n
ID
\n
${log.id}
\n
\n \n
\n
Timestamp
\n
${log.formattedDate}
\n
\n \n
\n
Level
\n
\n \n ${log.level}\n \n
\n
\n \n
\n
Category
\n
\n \n ${log.category}\n \n
\n
\n \n ${log.source ? html`\n
\n
Source
\n
${log.source}
\n
\n ` : ''}\n \n ${log.userId ? html`\n
\n
User ID
\n
${log.userId}
\n
\n ` : ''}\n \n ${log.sessionId ? html`\n
\n
Session ID
\n
${log.sessionId}
\n
\n ` : ''}\n \n ${log.requestId ? html`\n
\n
Request ID
\n
${log.requestId}
\n
\n ` : ''}\n \n ${log.ipAddress ? html`\n
\n
IP Address
\n
${log.ipAddress}
\n
\n ` : ''}\n \n ${log.method && log.url ? html`\n
\n
HTTP Request
\n
\n ${log.method} ${log.url}\n ${log.statusCode ? html`(${log.statusCode})` : ''}\n
\n
\n ` : ''}\n \n ${log.duration ? html`\n
\n
Duration
\n
${log.formattedDuration}
\n
\n ` : ''}\n \n ${log.userAgent ? html`\n
\n
User Agent
\n
${log.userAgent}
\n
\n ` : ''}\n
\n
\n
\n\n \n
\n
\n

Message

\n
\n
\n
\n ${log.message}\n
\n
\n
\n\n \n ${log.tags && log.tags.length > 0 ? html`\n
\n
\n

Tags

\n
\n
\n
\n ${log.tags.map(tag => html`\n \n ${tag}\n \n `).join('')}\n
\n
\n
\n ` : ''}\n\n \n ${log.data ? html`\n
\n
\n

Additional Data

\n
\n
\n
${JSON.stringify(log.data, null, 2)}
\n
\n
\n ` : ''}\n\n \n ${log.stackTrace ? html`\n
\n
\n

Stack Trace

\n
\n
\n
${log.stackTrace}
\n
\n
\n ` : ''}\n\n \n
\n \n ← Back to Logs\n \n \n
\n ${log.level === 'error' || log.level === 'fatal' ? html`\n \n Report Issue\n \n ` : ''}\n \n alert('Log details copied to clipboard'))\"\n >\n Copy Details\n \n
\n
\n
\n `\n\n return adminLayoutV2({\n title: `Log Details - ${log.id}`,\n user,\n content: content as string\n })\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport type { LogConfig } from '../../db/schema'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogConfigPageData {\n configs: LogConfig[]\n user?: BaseUser\n}\n\nexport function renderLogConfigPage(data: LogConfigPageData) {\n const { configs, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Configuration

\n

\n Configure logging settings for different categories and manage log retention policies.\n

\n
\n
\n \n Run Cleanup\n \n
\n
\n\n
\n\n \n
\n
\n

Log Levels Reference

\n
\n
\n
\n
\n \n debug\n \n

Detailed diagnostic information

\n
\n
\n \n info\n \n

General information messages

\n
\n
\n \n warn\n \n

Warning conditions

\n
\n
\n \n error\n \n

Error conditions

\n
\n
\n \n fatal\n \n

Critical system errors

\n
\n
\n
\n
\n\n \n
\n ${configs.map(config => html`\n
\n
\n
\n

${config.category}

\n
\n ${config.enabled ? html`\n \n Enabled\n \n ` : html`\n \n Disabled\n \n `}\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n \n \n \n \n \n \n

Only logs at this level or higher will be stored

\n
\n \n
\n \n \n

Logs older than this will be deleted

\n
\n \n
\n \n \n

Maximum number of logs to keep for this category

\n
\n
\n \n
\n
\n \n Update Configuration\n \n
\n
\n \n
\n
\n
Created: ${new Date(config.createdAt).toLocaleDateString()}
\n
Updated: ${new Date(config.updatedAt).toLocaleDateString()}
\n
\n
\n
\n `).join('')}\n
\n\n \n
\n
\n

Global Log Settings

\n
\n
\n
\n
\n

Storage Information

\n
\n
\n
-
\n
Total Log Entries
\n
\n
\n
-
\n
Storage Used
\n
\n
\n
-
\n
Oldest Log
\n
\n
\n
\n \n
\n

Log Categories

\n
\n
    \n
  • auth - Authentication and authorization events
  • \n
  • api - API requests and responses
  • \n
  • workflow - Content workflow state changes
  • \n
  • plugin - Plugin-related activities
  • \n
  • media - File upload and media operations
  • \n
  • system - General system events
  • \n
  • security - Security-related events and alerts
  • \n
  • error - General error conditions
  • \n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n return adminLayoutV2({\n title: 'Log Configuration',\n user,\n content: content as string\n })\n}","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { D1Database, KVNamespace } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport { getLogger, type LogLevel, type LogCategory, type LogFilter } from '../services'\nimport { renderLogsListPage, type LogsListPageData } from '../templates/pages/admin-logs-list.template'\nimport { renderLogDetailsPage, type LogDetailsPageData } from '../templates/pages/admin-log-details.template'\nimport { renderLogConfigPage, type LogConfigPageData } from '../templates/pages/admin-log-config.template'\nimport type { Bindings, Variables } from '../app'\n\nconst adminLogsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminLogsRoutes.use('*', requireAuth())\n\n// Main logs listing page\nadminLogsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Use Hono's built-in query method instead of parsing URL\n const query = c.req.query()\n \n // Parse query parameters\n const page = parseInt(query.page || '1')\n const limit = parseInt(query.limit || '50')\n const level = query.level\n const category = query.category\n const search = query.search\n const startDate = query.start_date\n const endDate = query.end_date\n const source = query.source\n \n // Build filter\n const filter: LogFilter = {\n limit,\n offset: (page - 1) * limit,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (search) {\n filter.search = search\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n if (source) {\n filter.source = source\n }\n \n // Get logs and total count\n const { logs, total } = await logger.getLogs(filter)\n \n // Format logs for display\n const formattedLogs = logs.map(log => ({\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }))\n \n const totalPages = Math.ceil(total / limit)\n \n const pageData: LogsListPageData = {\n logs: formattedLogs,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total),\n baseUrl: '/admin/logs'\n },\n filters: {\n level: level || '',\n category: category || '',\n search: search || '',\n startDate: startDate || '',\n endDate: endDate || '',\n source: source || ''\n },\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogsListPage(pageData))\n } catch (error) {\n console.error('Error fetching logs:', error)\n return c.html(html`

Error loading logs: ${error}

`)\n }\n})\n\n// Log details page\nadminLogsRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get single log by ID\n const { logs } = await logger.getLogs({ \n limit: 1, \n offset: 0,\n search: id // Using search to find by ID - this is a simplification\n })\n \n const log = logs.find(l => l.id === id)\n \n if (!log) {\n return c.html(html`

Log entry not found

`)\n }\n \n const formattedLog = {\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n \n const pageData: LogDetailsPageData = {\n log: formattedLog,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogDetailsPage(pageData))\n } catch (error) {\n console.error('Error fetching log details:', error)\n return c.html(html`

Error loading log details: ${error}

`)\n }\n})\n\n// Log configuration page\nadminLogsRoutes.get('/config', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get all log configurations\n const configs = await logger.getAllConfigs()\n \n const pageData: LogConfigPageData = {\n configs,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogConfigPage(pageData))\n } catch (error) {\n console.error('Error fetching log config:', error)\n return c.html(html`

Error loading log configuration: ${error}

`)\n }\n})\n\n// Update log configuration\nadminLogsRoutes.post('/config/:category', async (c) => {\n try {\n const category = c.req.param('category') as LogCategory\n const formData = await c.req.formData()\n \n const enabled = formData.get('enabled') === 'on'\n const level = formData.get('level') as string\n const retention = parseInt(formData.get('retention') as string)\n const maxSize = parseInt(formData.get('max_size') as string)\n \n const logger = getLogger(c.env.DB)\n await logger.updateConfig(category, {\n enabled,\n level,\n retention,\n maxSize\n })\n \n return c.html(html`\n
\n Configuration updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating log config:', error)\n return c.html(html`\n
\n Failed to update configuration. Please try again.\n
\n `)\n }\n})\n\n// Export logs\nadminLogsRoutes.get('/export', async (c) => {\n try {\n const query = c.req.query()\n const format = query.format || 'csv'\n const level = query.level\n const category = query.category\n const startDate = query.start_date\n const endDate = query.end_date\n \n const logger = getLogger(c.env.DB)\n \n // Build filter for export\n const filter: LogFilter = {\n limit: 10000, // Export up to 10k logs\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n const { logs } = await logger.getLogs(filter)\n \n if (format === 'json') {\n return c.json(logs, 200, {\n 'Content-Disposition': 'attachment; filename=\"logs-export.json\"'\n })\n } else {\n // Default to CSV\n const headers = [\n 'ID', 'Level', 'Category', 'Message', 'Source', 'User ID', \n 'IP Address', 'Method', 'URL', 'Status Code', 'Duration', \n 'Created At'\n ]\n const csvRows = [headers.join(',')]\n \n logs.forEach(log => {\n const row = [\n log.id,\n log.level,\n log.category,\n `\"${log.message.replace(/\"/g, '\"\"')}\"`, // Escape quotes\n log.source || '',\n log.userId || '',\n log.ipAddress || '',\n log.method || '',\n log.url || '',\n log.statusCode || '',\n log.duration || '',\n new Date(log.createdAt).toISOString()\n ]\n csvRows.push(row.join(','))\n })\n \n const csv = csvRows.join('\\n')\n \n return new Response(csv, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': 'attachment; filename=\"logs-export.csv\"'\n }\n })\n }\n } catch (error) {\n console.error('Error exporting logs:', error)\n return c.json({ error: 'Failed to export logs' }, 500)\n }\n})\n\n// Clean up old logs\nadminLogsRoutes.post('/cleanup', async (c) => {\n try {\n const user = c.get('user')\n \n // Only allow admin users to run cleanup\n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n \n const logger = getLogger(c.env.DB)\n await logger.cleanupByRetention()\n \n return c.html(html`\n
\n Log cleanup completed successfully!\n
\n `)\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n return c.html(html`\n
\n Failed to clean up logs. Please try again.\n
\n `)\n }\n})\n\n// Search logs (HTMX endpoint)\nadminLogsRoutes.post('/search', async (c) => {\n try {\n const formData = await c.req.formData()\n const search = formData.get('search') as string\n const level = formData.get('level') as string\n const category = formData.get('category') as string\n \n const logger = getLogger(c.env.DB)\n \n const filter: LogFilter = {\n limit: 20,\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (search) filter.search = search\n if (level) filter.level = [level] as LogLevel[]\n if (category) filter.category = [category] as LogCategory[]\n \n const { logs } = await logger.getLogs(filter)\n \n // Return just the logs table rows for HTMX\n const rows = logs.map(log => {\n const formattedLog = {\n ...log,\n formattedDate: new Date(log.createdAt).toLocaleString(),\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n\n return `\n \n \n \n ${formattedLog.level}\n \n \n \n \n ${formattedLog.category}\n \n \n \n
${formattedLog.message}
\n \n ${formattedLog.source || '-'}\n ${formattedLog.formattedDate}\n \n View\n \n \n `\n }).join('')\n\n return c.html(rows)\n } catch (error) {\n console.error('Error searching logs:', error)\n return c.html(html`Error searching logs`)\n }\n})\n\n// Helper functions\nfunction getLevelClass(level: string): string {\n switch (level) {\n case 'debug': return 'bg-gray-100 text-gray-800'\n case 'info': return 'bg-blue-100 text-blue-800'\n case 'warn': return 'bg-yellow-100 text-yellow-800'\n case 'error': return 'bg-red-100 text-red-800'\n case 'fatal': return 'bg-purple-100 text-purple-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nfunction getCategoryClass(category: string): string {\n switch (category) {\n case 'auth': return 'bg-green-100 text-green-800'\n case 'api': return 'bg-blue-100 text-blue-800'\n case 'workflow': return 'bg-purple-100 text-purple-800'\n case 'plugin': return 'bg-indigo-100 text-indigo-800'\n case 'media': return 'bg-pink-100 text-pink-800'\n case 'system': return 'bg-gray-100 text-gray-800'\n case 'security': return 'bg-red-100 text-red-800'\n case 'error': return 'bg-red-100 text-red-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nexport { adminLogsRoutes }","import { Hono } from 'hono'\nimport { renderDesignPage, DesignPageData } from '../templates/pages/admin-design.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminDesignRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminDesignRoutes.get('/', (c) => {\n const user = c.get('user')\n \n const pageData: DesignPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderDesignPage(pageData))\n})","import { Hono } from 'hono'\nimport { renderCheckboxPage, CheckboxPageData } from '../templates/pages/admin-checkboxes.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminCheckboxRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCheckboxRoutes.get('/', (c) => {\n const user = c.get('user')\n\n const pageData: CheckboxPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderCheckboxPage(pageData))\n})\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface Testimonial {\n id?: number\n authorName: string\n authorTitle?: string\n authorCompany?: string\n testimonialText: string\n rating?: number\n isPublished: boolean\n sortOrder: number\n}\n\ninterface TestimonialsFormData {\n testimonial?: Testimonial\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderTestimonialsForm(data: TestimonialsFormData): string {\n const { testimonial, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Testimonial' : 'New Testimonial'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the testimonial details below' : 'Create a new customer testimonial'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Author Information

\n\n \n
\n \n
\n \n
\n ${errors?.authorName ? `\n
\n ${errors.authorName.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.authorTitle ? `\n
\n ${errors.authorTitle.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.authorCompany ? `\n
\n ${errors.authorCompany.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Testimonial

\n\n \n
\n \n
\n \n

\n 0/1000 characters\n

\n
\n ${errors?.testimonialText ? `\n
\n ${errors.testimonialText.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.rating ? `\n
\n ${errors.rating.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/testimonials/${testimonial?.id}` : '/admin/testimonials/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderTestimonialsList } from '../templates/pages/admin-testimonials-list.template'\nimport { renderTestimonialsForm } from '../templates/pages/admin-testimonials-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst testimonialSchema = z.object({\n authorName: z.string().min(1, 'Author name is required').max(100, 'Author name must be under 100 characters'),\n authorTitle: z.string().optional(),\n authorCompany: z.string().optional(),\n testimonialText: z.string().min(1, 'Testimonial is required').max(1000, 'Testimonial must be under 1000 characters'),\n rating: z.string().transform(val => val ? parseInt(val, 10) : undefined).pipe(z.number().min(1).max(5).optional()),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminTestimonialsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminTestimonialsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, minRating, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (minRating) {\n whereClause += ' AND rating >= ?'\n params.push(parseInt(minRating, 10))\n }\n\n if (search) {\n whereClause += ' AND (author_name LIKE ? OR testimonial_text LIKE ? OR author_company LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM testimonials ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM testimonials\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: testimonials } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderTestimonialsList({\n testimonials: testimonials || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonials:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonials',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminTestimonialsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial created successfully')\n } else {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating testimonial:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM testimonials WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/testimonials?message=Testimonial not found&type=error')\n }\n\n const testimonial = results[0] as any\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id: testimonial.id,\n authorName: testimonial.author_name,\n authorTitle: testimonial.author_title,\n authorCompany: testimonial.author_company,\n testimonialText: testimonial.testimonial_text,\n rating: testimonial.rating,\n isPublished: Boolean(testimonial.isPublished),\n sortOrder: testimonial.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonial:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE testimonials\n SET author_name = ?, author_title = ?, author_company = ?, testimonial_text = ?, rating = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial updated successfully')\n } else {\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: validatedData.authorName,\n authorTitle: validatedData.authorTitle,\n authorCompany: validatedData.authorCompany,\n testimonialText: validatedData.testimonialText,\n rating: validatedData.rating,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Testimonial not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating testimonial:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM testimonials WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Testimonial not found' }, 404)\n }\n\n return c.redirect('/admin/testimonials?message=Testimonial deleted successfully')\n } catch (error) {\n console.error('Error deleting testimonial:', error)\n return c.json({ error: 'Failed to delete testimonial' }, 500)\n }\n})\n\nexport default adminTestimonialsRoutes\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface CodeExample {\n id?: number\n title: string\n description?: string\n code: string\n language: string\n category?: string\n tags?: string\n isPublished: boolean\n sortOrder: number\n}\n\ninterface CodeExamplesFormData {\n codeExample?: CodeExample\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderCodeExamplesForm(data: CodeExamplesFormData): string {\n const { codeExample, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Code Example' : 'New Code Example'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the code example details below' : 'Create a new code snippet or example'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Basic Information

\n\n \n
\n \n
\n \n
\n ${errors?.title ? `\n
\n ${errors.title.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

\n 0/500 characters\n

\n
\n ${errors?.description ? `\n
\n ${errors.description.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.language ? `\n
\n ${errors.language.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.category ? `\n
\n ${errors.category.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

Comma-separated tags

\n
\n ${errors?.tags ? `\n
\n ${errors.tags.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Code

\n\n \n
\n \n
\n \n

\n 0 characters\n

\n
\n ${errors?.code ? `\n
\n ${errors.code.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/code-examples/${codeExample?.id}` : '/admin/code-examples/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderCodeExamplesList } from '../templates/pages/admin-code-examples-list.template'\nimport { renderCodeExamplesForm } from '../templates/pages/admin-code-examples-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst codeExampleSchema = z.object({\n title: z.string().min(1, 'Title is required').max(200, 'Title must be under 200 characters'),\n description: z.string().max(500, 'Description must be under 500 characters').optional(),\n code: z.string().min(1, 'Code is required'),\n language: z.string().min(1, 'Language is required'),\n category: z.string().max(50, 'Category must be under 50 characters').optional(),\n tags: z.string().max(200, 'Tags must be under 200 characters').optional(),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminCodeExamplesRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCodeExamplesRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, language, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (language) {\n whereClause += ' AND language = ?'\n params.push(language)\n }\n\n if (search) {\n whereClause += ' AND (title LIKE ? OR description LIKE ? OR code LIKE ? OR tags LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM code_examples ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM code_examples\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: codeExamples } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderCodeExamplesList({\n codeExamples: codeExamples || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code examples:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code examples',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminCodeExamplesRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example created successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating code example:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM code_examples WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/code-examples?message=Code example not found&type=error')\n }\n\n const example = results[0] as any\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id: example.id,\n title: example.title,\n description: example.description,\n code: example.code,\n language: example.language,\n category: example.category,\n tags: example.tags,\n isPublished: Boolean(example.isPublished),\n sortOrder: example.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code example:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE code_examples\n SET title = ?, description = ?, code = ?, language = ?, category = ?, tags = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example updated successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: validatedData.title,\n description: validatedData.description,\n code: validatedData.code,\n language: validatedData.language,\n category: validatedData.category,\n tags: validatedData.tags,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Code example not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating code example:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM code_examples WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Code example not found' }, 404)\n }\n\n return c.redirect('/admin/code-examples?message=Code example deleted successfully')\n } catch (error) {\n console.error('Error deleting code example:', error)\n return c.json({ error: 'Failed to delete code example' }, 500)\n }\n})\n\nexport default adminCodeExamplesRoutes\n","import {\n AdminLayoutData,\n renderAdminLayout,\n} from \"../layouts/admin-layout-v2.template\";\n\nexport interface DashboardStats {\n collections: number;\n contentItems: number;\n mediaFiles: number;\n users: number;\n databaseSize?: number; // Size in bytes\n mediaSize?: number; // Total size of all media files in bytes\n recentActivity?: ActivityItem[];\n analytics?: AnalyticsData;\n}\n\nexport interface ActivityItem {\n id: string;\n type: \"content\" | \"media\" | \"user\" | \"collection\";\n action: string;\n description: string;\n timestamp: string;\n user: string;\n}\n\nexport interface AnalyticsData {\n pageViews: number;\n uniqueVisitors: number;\n contentPublished: number;\n mediaUploaded: number;\n weeklyGrowth: {\n pageViews: number;\n visitors: number;\n content: number;\n media: number;\n };\n}\n\nexport interface DashboardPageData {\n user?: {\n name: string;\n email: string;\n role: string;\n };\n stats?: DashboardStats;\n version?: string;\n enableExperimentalFeatures?: boolean;\n}\n\nexport function renderDashboardPage(data: DashboardPageData): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n \n \n ${renderStatsCardsSkeleton()}\n \n\n \n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n \n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderDashboardPageWithDynamicMenu(\n data: DashboardPageData,\n dynamicMenuItems: Array<{ label: string; path: string; icon: string }>\n): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n
\n ${renderStatsCards({\n collections: 0,\n contentItems: 0,\n mediaFiles: 0,\n users: 0,\n })}\n
\n\n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n enableExperimentalFeatures: data.enableExperimentalFeatures,\n content: pageContent,\n dynamicMenuItems,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderStatsCards(stats: DashboardStats): string {\n const cards = [\n {\n title: \"Total Collections\",\n value: stats.collections.toString(),\n change: \"12.5\",\n isPositive: true,\n },\n {\n title: \"Content Items\",\n value: stats.contentItems.toString(),\n change: \"8.2\",\n isPositive: true,\n },\n {\n title: \"Media Files\",\n value: stats.mediaFiles.toString(),\n change: \"15.3\",\n isPositive: true,\n },\n {\n title: \"Active Users\",\n value: stats.users.toString(),\n change: \"2.4\",\n isPositive: false,\n },\n ];\n\n const cardColors = ['text-cyan-400', 'text-lime-400', 'text-pink-400', 'text-purple-400'];\n\n return `\n
\n

Last 30 days

\n
\n ${cards.map((card, index) => `\n
\n
${card.title}
\n
\n
\n ${card.value}\n
\n
\n \n ${card.isPositive\n ? ''\n : ''\n }\n \n ${card.isPositive ? 'Increased' : 'Decreased'} by\n ${card.change}%\n
\n
\n
\n `).join('')}\n
\n
\n `;\n}\n\nfunction renderStatsCardsSkeleton(): string {\n return `\n
\n
\n
\n ${Array(4)\n .fill(0)\n .map(\n () => `\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n `;\n}\n\nfunction renderAnalyticsChart(): string {\n return `\n
\n
\n
\n
\n

Real-Time Analytics

\n

Requests per second (live)

\n
\n
\n
\n Live\n
\n
\n
\n 0\n req/s\n
\n
\n\n
\n \n
\n\n \n
\n \n\n \n `;\n}\n\nexport function renderRecentActivitySkeleton(): string {\n return `\n
\n
\n
\n
\n
\n
\n ${Array(3).fill(0).map(() => `\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n}\n\nexport function renderRecentActivity(activities?: ActivityItem[]): string {\n // Helper to get user initials\n const getInitials = (user: string): string => {\n const parts = user.split(' ').filter(p => p.length > 0)\n if (parts.length >= 2) {\n const first = parts[0]?.[0] || ''\n const second = parts[1]?.[0] || ''\n return (first + second).toUpperCase()\n }\n return user.substring(0, 2).toUpperCase()\n }\n\n // Helper to get relative time\n const getRelativeTime = (timestamp: string): string => {\n const date = new Date(timestamp)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) return 'just now'\n if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`\n return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`\n }\n\n // Helper to get color classes based on activity type\n const getColorClasses = (type: string): { bgColor: string; textColor: string } => {\n switch (type) {\n case 'content':\n return {\n bgColor: 'bg-lime-500/10 dark:bg-lime-400/10',\n textColor: 'text-lime-700 dark:text-lime-300'\n }\n case 'media':\n return {\n bgColor: 'bg-cyan-500/10 dark:bg-cyan-400/10',\n textColor: 'text-cyan-700 dark:text-cyan-300'\n }\n case 'user':\n return {\n bgColor: 'bg-pink-500/10 dark:bg-pink-400/10',\n textColor: 'text-pink-700 dark:text-pink-300'\n }\n case 'collection':\n return {\n bgColor: 'bg-purple-500/10 dark:bg-purple-400/10',\n textColor: 'text-purple-700 dark:text-purple-300'\n }\n default:\n return {\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300'\n }\n }\n }\n\n // Format activities with colors and times\n const formattedActivities = (activities || []).map(activity => {\n const colors = getColorClasses(activity.type)\n return {\n ...activity,\n initials: getInitials(activity.user),\n time: getRelativeTime(activity.timestamp),\n ...colors\n }\n })\n\n // If no activities, show empty state\n if (formattedActivities.length === 0) {\n formattedActivities.push({\n type: 'content' as const,\n description: 'No recent activity',\n user: 'System',\n time: '',\n initials: 'SY',\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300',\n id: '0',\n action: '',\n timestamp: new Date().toISOString()\n })\n }\n\n return `\n
\n
\n
\n

Recent Activity

\n \n
\n
\n\n
\n
    \n ${formattedActivities\n .map(\n (activity) => `\n
  • \n
    \n ${activity.initials}\n
    \n
    \n

    ${activity.description}

    \n

    \n ${activity.user}\n · \n ${activity.time}\n

    \n
    \n
  • \n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderQuickActions(): string {\n const actions = [\n {\n title: \"Create Content\",\n description: \"Add new blog post or page\",\n href: \"/admin/content/new\",\n icon: `\n \n `,\n },\n {\n title: \"Upload Media\",\n description: \"Add images and files\",\n href: \"/admin/media\",\n icon: `\n \n `,\n },\n {\n title: \"Manage Users\",\n description: \"Add or edit user accounts\",\n href: \"/admin/users\",\n icon: `\n \n `,\n },\n ];\n\n return `\n
\n
\n

Quick Actions

\n
\n\n
\n
\n ${actions\n .map(\n (action) => `\n \n
\n ${action.icon}\n
\n
\n

${action.title}

\n

${action.description}

\n
\n \n \n \n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderSystemStatus(): string {\n return `\n
\n
\n
\n

System Status

\n
\n
\n Live\n
\n
\n
\n\n \n \n
\n ${[\n { color: 'from-blue-500/20 to-cyan-500/20', darkColor: 'dark:from-blue-500/10 dark:to-cyan-500/10' },\n { color: 'from-purple-500/20 to-pink-500/20', darkColor: 'dark:from-purple-500/10 dark:to-pink-500/10' },\n { color: 'from-amber-500/20 to-orange-500/20', darkColor: 'dark:from-amber-500/10 dark:to-orange-500/10' },\n { color: 'from-lime-500/20 to-emerald-500/20', darkColor: 'dark:from-lime-500/10 dark:to-emerald-500/10' }\n ].map((gradient, i) => `\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n \n\n \n `;\n}\n\nexport function renderStorageUsage(databaseSizeBytes?: number, mediaSizeBytes?: number): string {\n // Helper to format bytes to human readable\n const formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`\n }\n\n const dbSizeGB = databaseSizeBytes ? databaseSizeBytes / (1024 ** 3) : 0\n const dbMaxGB = 10\n const dbPercentageRaw = (dbSizeGB / dbMaxGB) * 100\n // Ensure minimum 0.5% visibility for progress bar, max 100%\n const dbPercentage = Math.min(Math.max(dbPercentageRaw, 0.5), 100)\n const dbUsedFormatted = databaseSizeBytes ? formatBytes(databaseSizeBytes) : 'Unknown'\n\n const mediaUsedFormatted = mediaSizeBytes ? formatBytes(mediaSizeBytes) : '0 B'\n\n const storageItems = [\n {\n label: \"Database\",\n used: dbUsedFormatted,\n total: \"10 GB\",\n percentage: dbPercentage,\n color: dbPercentage > 80 ? \"bg-red-500 dark:bg-red-400\" : dbPercentage > 60 ? \"bg-amber-500 dark:bg-amber-400\" : \"bg-cyan-500 dark:bg-cyan-400\",\n },\n {\n label: \"Media Files\",\n used: mediaUsedFormatted,\n total: \"∞\",\n percentage: 0,\n color: \"bg-lime-500 dark:bg-lime-400\",\n note: \"Stored in R2\"\n },\n {\n label: \"Cache (KV)\",\n used: \"N/A\",\n total: \"∞\",\n percentage: 0,\n color: \"bg-purple-500 dark:bg-purple-400\",\n note: \"Unlimited\"\n },\n ];\n\n return `\n
\n
\n

Storage Usage

\n
\n\n
\n
\n ${storageItems\n .map(\n (item: any) => `\n
\n
\n
\n ${item.label}\n ${item.note ? `(${item.note})` : ''}\n
\n
${item.used} / ${item.total}
\n
\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}","import { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderDashboardPage,\n type DashboardPageData,\n renderStatsCards,\n renderStorageUsage,\n renderRecentActivity,\n type ActivityItem\n} from '../templates/pages/admin-dashboard.template'\nimport { getCoreVersion } from '../utils/version'\nimport { metricsTracker } from '../utils/metrics'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin - Admin Dashboard\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: DashboardPageData = {\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n } catch (error) {\n console.error('Dashboard error:', error)\n\n // Return dashboard with error state\n const pageData: DashboardPageData = {\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n }\n})\n\n/**\n * GET /admin/dashboard/stats - Dashboard stats HTML fragment (HTMX endpoint)\n */\nrouter.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n const html = renderStatsCards({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n users: usersCount,\n mediaSize: mediaSize\n })\n\n return c.html(html)\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.html('
Failed to load statistics
')\n }\n})\n\n/**\n * GET /admin/dashboard/storage - Storage usage HTML fragment (HTMX endpoint)\n */\nrouter.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n const html = renderStorageUsage(databaseSize, mediaSize)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.html('
Failed to load storage information
')\n }\n})\n\n/**\n * GET /admin/dashboard/recent-activity - Recent activity HTML fragment (HTMX endpoint)\n */\nrouter.get('/recent-activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '5')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const activities: ActivityItem[] = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n // Format description based on action and resource type\n let description = ''\n if (row.action === 'create') {\n description = `Created new ${row.resource_type}`\n } else if (row.action === 'update') {\n description = `Updated ${row.resource_type}`\n } else if (row.action === 'delete') {\n description = `Deleted ${row.resource_type}`\n } else {\n description = `${row.action} ${row.resource_type}`\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n description,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n const html = renderRecentActivity(activities)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n const html = renderRecentActivity([])\n return c.html(html)\n }\n})\n\n/**\n * GET /admin/api/metrics - Real-time metrics for analytics chart\n * Returns JSON with current requests per second from the metrics tracker\n */\nrouter.get('/api/metrics', async (c) => {\n return c.json({\n requestsPerSecond: metricsTracker.getRequestsPerSecond(),\n totalRequests: metricsTracker.getTotalRequests(),\n averageRPS: Number(metricsTracker.getAverageRPS().toFixed(2)),\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/dashboard/system-status - System status HTML fragment (HTMX endpoint)\n */\nrouter.get('/system-status', async (c) => {\n try {\n const html = `\n
\n
\n
\n
\n
\n API Status\n \n \n \n
\n

Operational

\n
\n
\n\n
\n
\n
\n
\n Database\n \n \n \n
\n

Connected

\n
\n
\n\n
\n
\n
\n
\n R2 Storage\n \n \n \n
\n

Available

\n
\n
\n\n
\n
\n
\n
\n KV Cache\n \n \n \n
\n

Ready

\n
\n
\n
\n `\n return c.html(html)\n } catch (error) {\n console.error('Error fetching system status:', error)\n return c.html('
Failed to load system status
')\n }\n})\n\nexport { router as adminDashboardRoutes }\n","export function isMarkdownEditorType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nexport function normalizeFieldType(fieldType: string): string {\n if (isMarkdownEditorType(fieldType)) {\n return 'markdown'\n }\n\n if (fieldType === 'tinymce') {\n return 'richtext'\n }\n\n return fieldType\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\nexport interface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCollectionsListPage(data: CollectionsListPageData): string {\n const tableData: any = {\n tableId: 'collections-table',\n rowClickable: true,\n rowClickUrl: (collection: Collection) => `/admin/collections/${collection.id}`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => `\n
\n \n ${collection.name}\n \n ${collection.managed ? `\n \n \n \n \n Config\n \n ` : ''}\n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'description',\n label: 'Description',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => collection.description || '-'\n },\n {\n key: 'field_count',\n label: 'Fields',\n sortable: true,\n sortType: 'number',\n render: (_value: any, collection: any) => {\n const count = collection.field_count || 0\n return `\n
\n \n ${count} ${count === 1 ? 'field' : 'fields'}\n \n
\n `\n }\n },\n {\n key: 'managed',\n label: 'Source',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => {\n if (collection.managed) {\n return `\n
\n \n \n \n Code\n
\n `\n } else {\n return `\n
\n \n \n \n \n \n Database\n
\n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Content',\n sortable: false,\n render: (_value: any, collection: any) => {\n if (!collection || !collection.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.collections,\n emptyMessage: 'No collections found.'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Collections

\n

Manage your content collections and their schemas

\n
\n \n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n ${data.collections.length} ${data.collections.length === 1 ? 'collection' : 'collections'}\n \n \n \n \n Refresh\n \n
\n
\n
\n
\n
\n\n \n
\n ${renderTable(tableData)}\n
\n\n \n ${data.collections.length === 0 ? `\n
\n \n \n \n

No collections found

\n

Get started by creating your first collection

\n \n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Collections',\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","export interface TableColumn {\n key: string\n label: string\n sortable?: boolean\n className?: string\n sortType?: 'string' | 'number' | 'date' | 'boolean'\n render?: (value: any, row: any) => string\n}\n\nexport interface TableData {\n columns: TableColumn[]\n rows: T[]\n selectable?: boolean\n className?: string\n emptyMessage?: string\n tableId?: string\n title?: string\n rowClickable?: boolean\n rowClickUrl?: (row: T) => string\n}\n\nexport function renderTable(data: TableData): string {\n const tableId = data.tableId || `table-${Math.random().toString(36).substr(2, 9)}`\n\n if (data.rows.length === 0) {\n return `\n
\n
\n \n \n \n

${data.emptyMessage || 'No data available'}

\n
\n
\n `\n }\n\n return `\n
\n ${data.title ? `\n
\n

${data.title}

\n
\n ` : ''}\n
\n \n \n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, index) => {\n const isFirst = index === 0 && !data.selectable\n const isLast = index === data.columns.length - 1\n return `\n \n `}).join('')}\n \n \n \n ${data.rows.map((row, rowIndex) => {\n if (!row) return ''\n const clickableClass = data.rowClickable ? 'cursor-pointer' : ''\n const clickHandler = data.rowClickable && data.rowClickUrl ? `onclick=\"window.location.href='${data.rowClickUrl(row)}'\"` : ''\n return `\n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, colIndex) => {\n const value = (row as any)[column.key]\n const displayValue = column.render ? column.render(value, row) : value\n const stopPropagation = column.key === 'actions' ? 'onclick=\"event.stopPropagation()\"' : ''\n const isFirst = colIndex === 0 && !data.selectable\n const isLast = colIndex === data.columns.length - 1\n return `\n \n `\n }).join('')}\n \n `\n }).join('')}\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${column.sortable ? `\n \n ${column.label}\n
\n \n \n \n \n \n \n
\n \n ` : column.label}\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${displayValue || ''}\n
\n
\n\n \n
\n `\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm, FormData, FormField } from '../form.template'\nimport { renderAlert } from '../components/alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\n// Helper function to get field type badge with color\nfunction getFieldTypeBadge(fieldType: string): string {\n const typeLabels: Record = {\n 'text': 'Text',\n 'slug': 'URL Slug',\n 'richtext': 'Rich Text (TinyMCE)',\n 'quill': 'Rich Text (Quill)',\n 'markdown': 'Markdown',\n 'mdxeditor': 'Markdown',\n 'easymde': 'Markdown',\n 'number': 'Number',\n 'boolean': 'Boolean',\n 'date': 'Date',\n 'select': 'Select',\n 'media': 'Media',\n 'reference': 'Reference'\n }\n const typeColors: Record = {\n 'text': 'bg-blue-500/10 dark:bg-blue-400/10 text-blue-700 dark:text-blue-300 ring-blue-500/20 dark:ring-blue-400/20',\n 'slug': 'bg-sky-500/10 dark:bg-sky-400/10 text-sky-700 dark:text-sky-300 ring-sky-500/20 dark:ring-sky-400/20',\n 'richtext': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'quill': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'markdown': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'mdxeditor': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'easymde': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'number': 'bg-green-500/10 dark:bg-green-400/10 text-green-700 dark:text-green-300 ring-green-500/20 dark:ring-green-400/20',\n 'boolean': 'bg-amber-500/10 dark:bg-amber-400/10 text-amber-700 dark:text-amber-300 ring-amber-500/20 dark:ring-amber-400/20',\n 'date': 'bg-cyan-500/10 dark:bg-cyan-400/10 text-cyan-700 dark:text-cyan-300 ring-cyan-500/20 dark:ring-cyan-400/20',\n 'select': 'bg-indigo-500/10 dark:bg-indigo-400/10 text-indigo-700 dark:text-indigo-300 ring-indigo-500/20 dark:ring-indigo-400/20',\n 'media': 'bg-rose-500/10 dark:bg-rose-400/10 text-rose-700 dark:text-rose-300 ring-rose-500/20 dark:ring-rose-400/20',\n 'reference': 'bg-teal-500/10 dark:bg-teal-400/10 text-teal-700 dark:text-teal-300 ring-teal-500/20 dark:ring-teal-400/20'\n }\n const label = typeLabels[fieldType] || fieldType\n const color = typeColors[fieldType] || 'bg-zinc-500/10 dark:bg-zinc-400/10 text-zinc-700 dark:text-zinc-300 ring-zinc-500/20 dark:ring-zinc-400/20'\n return `${label}`\n}\n\nexport function renderCollectionFormPage(data: CollectionFormData): string {\n console.log('[renderCollectionFormPage] editorPlugins:', data.editorPlugins)\n\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? 'Edit Collection' : 'Create New Collection'\n const subtitle = isEdit\n ? `Update collection: ${data.display_name}`\n : 'Define a new content collection with custom fields and settings.'\n\n // Pre-compute data attribute for all fields (without badge HTML to avoid escaping issues)\n const fieldsWithData = (data.fields || []).map(field => ({\n ...field,\n dataFieldJSON: JSON.stringify(JSON.stringify(field))\n }))\n\n const fields: FormField[] = [\n {\n name: 'displayName',\n label: 'Display Name',\n type: 'text',\n value: data.display_name || '',\n placeholder: 'Blog Posts',\n required: true,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'name',\n label: 'Collection Name',\n type: 'text',\n value: data.name || '',\n placeholder: 'blog_posts',\n required: true,\n readonly: isEdit,\n helpText: isEdit ? 'Collection name cannot be changed' : 'Lowercase letters, numbers, and underscores only',\n className: isEdit ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'description',\n label: 'Description',\n type: 'textarea',\n value: data.description || '',\n placeholder: 'Description of this collection...',\n rows: 3,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n }\n ]\n\n\n const formData: FormData = {\n id: 'collection-form',\n ...(isEdit\n ? { hxPut: `/admin/collections/${data.id}`, action: `/admin/collections/${data.id}`, method: 'PUT' }\n : { hxPost: '/admin/collections', action: '/admin/collections' }\n ),\n hxTarget: '#form-messages',\n fields: fields,\n submitButtons: data.managed ? [] : [\n {\n label: isEdit ? 'Update Collection' : 'Create Collection',\n type: 'submit',\n className: 'btn-primary'\n }\n ]\n }\n\n const pageContent = `\n
\n \n ${data.managed ? `\n
\n
\n \n \n \n
\n

\n Config-Managed Collection\n

\n
\n

This collection is managed by a configuration file and cannot be edited through the admin interface.

\n

\n Config file:\n \n src/collections/${data.name}.collection.ts\n \n

\n

\n To modify this collection's schema, edit the configuration file directly in your code editor.\n

\n
\n
\n
\n
\n ` : ''}\n\n \n
\n
\n

${title}

\n

${subtitle}

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

Collection Details

\n

Configure your collection settings below

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n \n \n ${renderForm(formData)}\n\n ${isEdit && data.managed ? `\n \n
\n
\n

Collection Fields

\n

Fields defined in the configuration file (read-only)

\n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n ${field.field_name}\n
\n
\n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add fields to your collection configuration file to see them here.

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${isEdit && !data.managed ? `\n \n
\n
\n
\n

Collection Fields

\n

Define the fields that content in this collection will have

\n
\n \n \n \n \n Add Field\n \n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n Field name: ${field.field_name}\n
\n
\n
\n
\n \n \n \n \n Edit\n \n \n \n \n \n Delete\n \n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add your first field to get started

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${!isEdit ? `\n
\n
\n \n \n \n
\n

\n Create Collection First\n

\n

\n After creating the collection, you'll be able to add and configure custom fields.\n

\n
\n
\n
\n ` : ''}\n \n \n
\n \n \n \n \n ${data.managed ? 'Back to Collections' : 'Cancel'}\n \n\n ${isEdit && !data.managed ? `\n \n \n \n \n Delete Collection\n \n ` : ''}\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Add Field

\n \n
\n
\n\n
\n \n\n
\n \n \n

Lowercase letters, numbers, and underscores only

\n
\n\n
\n \n
\n \n \n \n \n ${data.editorPlugins?.tinymce ? '' : ''}\n ${data.editorPlugins?.quill ? '' : ''}\n ${data.editorPlugins?.easyMdx ? '' : ''}\n \n \n \n \n \n \n \n \n \n \n \n
\n

\n
\n\n
\n \n \n
\n\n
\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n\n
\n \n \n

JSON configuration for field-specific options

\n
\n\n
\n \n Cancel\n \n \n Add Field\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-field-confirm',\n title: 'Delete Field',\n message: 'Are you sure you want to delete this field? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteField()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { normalizeFieldType } from './admin-collections-field-types'\nimport { renderCollectionsListPage } from '../templates/pages/admin-collections-list.template'\nimport { renderCollectionFormPage } from '../templates/pages/admin-collections-form.template'\n\n// Type definitions for collections\ninterface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\ninterface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\ninterface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\ninterface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminCollectionsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminCollectionsRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on collection modification routes\nadminCollectionsRoutes.post('*', requireRole(['admin']))\nadminCollectionsRoutes.put('*', requireRole(['admin']))\nadminCollectionsRoutes.delete('*', requireRole(['admin']))\n\n// Collections management - List all collections\nadminCollectionsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n const search = url.searchParams.get('search') || ''\n\n // Build query based on search\n let stmt\n let results\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, managed, schema\n FROM collections\n WHERE is_active = 1\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(\"SELECT id, name, display_name, description, created_at, managed, schema FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY created_at DESC\")\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Fetch field counts for all collections from content_fields table (legacy)\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections: Collection[] = (results || [])\n .filter((row: any) => row && row.id)\n .map((row: any) => {\n // Calculate field count: use schema if available, otherwise use content_fields table\n let fieldCount = 0\n if (row.schema) {\n try {\n const schema = typeof row.schema === 'string' ? JSON.parse(row.schema) : row.schema\n if (schema && schema.properties) {\n fieldCount = Object.keys(schema.properties).length\n }\n } catch (e) {\n // If schema parsing fails, fall back to content_fields count\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n } else {\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n\n return {\n id: String(row.id || ''),\n name: String(row.name || ''),\n display_name: String(row.display_name || ''),\n description: row.description ? String(row.description) : undefined,\n created_at: Number(row.created_at || 0),\n formattedDate: row.created_at ? new Date(Number(row.created_at)).toLocaleDateString() : 'Unknown',\n field_count: fieldCount,\n managed: row.managed === 1\n }\n })\n\n const pageData: CollectionsListPageData = {\n collections,\n search,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCollectionsListPage(pageData))\n } catch (error) {\n console.error('Error fetching collections:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.html(html`

Error loading collections: ${errorMessage}

`)\n }\n})\n\n// New collection form\nadminCollectionsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /new] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n})\n\n// Create collection\nadminCollectionsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const name = formData.get('name') as string\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n // Check if this is an HTMX request\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n // Basic validation\n if (!name || !displayName) {\n const errorMsg = 'Name and display name are required.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n // For regular form submission, redirect back with error\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Validate name format\n if (!/^[a-z0-9_]+$/.test(name)) {\n const errorMsg = 'Collection name must contain only lowercase letters, numbers, and underscores.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n const db = c.env.DB\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(name).first()\n\n if (existing) {\n const errorMsg = 'A collection with this name already exists.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Create basic schema for the collection\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n // Create collection\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n name,\n displayName,\n description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache (only if CACHE_KV is available)\n if (c.env.CACHE_KV) {\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n }\n\n if (isHtmx) {\n return c.html(html`\n
\n Collection created successfully! Redirecting to edit mode...\n \n
\n `)\n } else {\n // For regular form submission, redirect to edit page\n return c.redirect(`/admin/collections/${collectionId}`)\n }\n } catch (error) {\n console.error('Error creating collection:', error)\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n if (isHtmx) {\n return c.html(html`\n
\n Failed to create collection. Please try again.\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n})\n\n// Edit collection form\nadminCollectionsRoutes.get('/:id', async (c) => {\n const db = c.env.DB\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n\n // Get collection fields - try schema first, then content_fields table\n let fields: CollectionField[] = []\n\n // If collection has a schema, parse it\n if (collection.schema) {\n try {\n const schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n fields = Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n // Normalize schema formats to UI field types\n let fieldType = fieldConfig.type || 'string'\n if (fieldConfig.enum) {\n fieldType = 'select'\n } else if (fieldConfig.format === 'richtext') {\n fieldType = 'richtext'\n } else if (fieldConfig.format === 'media') {\n fieldType = 'media'\n } else if (fieldConfig.format === 'date-time') {\n fieldType = 'date'\n } else if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n fieldType = 'slug'\n }\n \n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: fieldType,\n field_label: fieldConfig.title || fieldName,\n field_options: fieldConfig,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: fieldConfig.searchable === true || false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table if no schema or parsing failed\n if (fields.length === 0) {\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n fields = (fieldsResults || []).map((row: any) => {\n let fieldOptions = {}\n if (row.field_options) {\n try {\n fieldOptions = typeof row.field_options === 'string' ? JSON.parse(row.field_options) : row.field_options\n } catch (e) {\n console.error('Error parsing field_options for field:', row.field_name, e)\n fieldOptions = {}\n }\n }\n return {\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: fieldOptions,\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }\n })\n }\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /:id] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n fields: fields,\n managed: collection.managed === 1,\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n } catch (error) {\n console.error('Error fetching collection:', error)\n const user = c.get('user')\n\n // Check which editor plugins are active (even in error state)\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Failed to load collection.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n})\n\n// Update collection\nadminCollectionsRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const formData = await c.req.formData()\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n if (!displayName) {\n return c.html(html`\n
\n Display name is required.\n
\n `)\n }\n\n const db = c.env.DB\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(displayName, description || null, Date.now(), id).run()\n\n return c.html(html`\n
\n Collection updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.html(html`\n
\n Failed to update collection. Please try again.\n
\n `)\n }\n})\n\n// Delete collection\nadminCollectionsRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.html(html`\n
\n Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.\n
\n `)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.html(html`\n
\n Failed to delete collection. Please try again.\n
\n `)\n }\n})\n\n// Add field to collection\nadminCollectionsRoutes.post('/:id/fields', async (c) => {\n try {\n const collectionId = c.req.param('id')\n const formData = await c.req.formData()\n const fieldName = formData.get('field_name') as string\n const fieldType = formData.get('field_type') as string\n const fieldLabel = formData.get('field_label') as string\n const isRequired = formData.get('is_required') === '1'\n const isSearchable = formData.get('is_searchable') === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n if (!fieldName || !fieldType || !fieldLabel) {\n return c.json({ success: false, error: 'Field name, type, and label are required.' })\n }\n\n // Validate field name format\n if (!/^[a-z0-9_]+$/.test(fieldName)) {\n return c.json({ success: false, error: 'Field name must contain only lowercase letters, numbers, and underscores.' })\n }\n\n const db = c.env.DB\n\n // Get current collection to check its schema\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Check if field already exists in schema\n let schema = collection.schema ? (typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema) : null\n\n if (schema && schema.properties && schema.properties[fieldName]) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Also check content_fields table for legacy support\n const existingStmt = db.prepare('SELECT id FROM content_fields WHERE collection_id = ? AND field_name = ?')\n const existing = await existingStmt.bind(collectionId, fieldName).first()\n\n if (existing) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Parse field options\n let parsedOptions = {}\n try {\n parsedOptions = fieldOptions ? JSON.parse(fieldOptions) : {}\n } catch (e) {\n console.error('Error parsing field options:', e)\n }\n\n // Add field to schema (primary storage method)\n if (schema) {\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Build field config based on type\n const fieldConfig: any = {\n type: fieldType === 'number' ? 'number' : fieldType === 'boolean' ? 'boolean' : 'string',\n title: fieldLabel,\n searchable: isSearchable,\n ...parsedOptions\n }\n\n const normalizedFieldType = normalizeFieldType(fieldType)\n\n // Handle special field types\n if (normalizedFieldType === 'richtext') {\n fieldConfig.format = 'richtext'\n } else if (normalizedFieldType === 'date') {\n fieldConfig.format = 'date-time'\n } else if (normalizedFieldType === 'select') {\n fieldConfig.enum = (parsedOptions as any).options || []\n } else if (fieldType === 'radio') {\n fieldConfig.type = 'radio'\n if (!(parsedOptions as any).enum && (parsedOptions as any).options) {\n fieldConfig.enum = (parsedOptions as any).options\n }\n } else if (fieldType === 'media') {\n fieldConfig.format = 'media'\n } else if (normalizedFieldType === 'slug') {\n fieldConfig.type = 'slug'\n fieldConfig.format = 'slug'\n } else if (normalizedFieldType === 'quill') {\n fieldConfig.type = 'quill'\n } else if (normalizedFieldType === 'markdown') {\n fieldConfig.type = 'markdown'\n } else if (normalizedFieldType === 'reference') {\n fieldConfig.type = 'reference'\n }\n\n schema.properties[fieldName] = fieldConfig\n\n // Add to required array if needed\n if (isRequired && !schema.required.includes(fieldName)) {\n schema.required.push(fieldName)\n }\n\n // Update collection schema in database\n const updateSchemaStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateSchemaStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Add Field] Added field to schema:', fieldName, fieldConfig)\n\n return c.json({ success: true, fieldId: `schema-${fieldName}` })\n }\n\n // Fallback: If no schema exists, use content_fields table\n // Get next field order\n const orderStmt = db.prepare('SELECT MAX(field_order) as max_order FROM content_fields WHERE collection_id = ?')\n const orderResult = await orderStmt.bind(collectionId).first() as any\n const nextOrder = (orderResult?.max_order || 0) + 1\n\n // Create field in content_fields table\n const fieldId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content_fields (\n id, collection_id, field_name, field_type, field_label,\n field_options, field_order, is_required, is_searchable,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n fieldId,\n collectionId,\n fieldName,\n fieldType,\n fieldLabel,\n fieldOptions,\n nextOrder,\n isRequired ? 1 : 0,\n isSearchable ? 1 : 0,\n now,\n now\n ).run()\n\n return c.json({ success: true, fieldId })\n } catch (error) {\n console.error('Error adding field:', error)\n return c.json({ success: false, error: 'Failed to add field.' })\n }\n})\n\n// Update field\nadminCollectionsRoutes.put('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const formData = await c.req.formData()\n const fieldLabel = formData.get('field_label') as string\n const fieldType = formData.get('field_type') as string\n // Use getAll() to handle hidden input + checkbox pattern (get last value)\n const isRequiredValues = formData.getAll('is_required')\n const isSearchableValues = formData.getAll('is_searchable')\n const isRequired = isRequiredValues[isRequiredValues.length - 1] === '1'\n const isSearchable = isSearchableValues[isSearchableValues.length - 1] === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n // Log all form data for debugging\n console.log('[Field Update] Field ID:', fieldId)\n console.log('[Field Update] Form data received:', {\n field_label: fieldLabel,\n field_type: fieldType,\n is_required: formData.get('is_required'),\n is_searchable: formData.get('is_searchable'),\n field_options: fieldOptions\n })\n\n if (!fieldLabel) {\n return c.json({ success: false, error: 'Field label is required.' })\n }\n\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n // Schema fields are part of the collection's JSON schema\n // We need to update the collection's schema in the database\n const fieldName = fieldId.replace('schema-', '')\n\n console.log('[Field Update] Updating schema field:', fieldName)\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first()\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema) {\n schema = { type: 'object', properties: {}, required: [] }\n }\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Update the field in the schema\n if (schema.properties[fieldName]) {\n // Parse field options from form\n let parsedFieldOptions: Record = {}\n try {\n parsedFieldOptions = JSON.parse(fieldOptions)\n } catch (e) {\n console.error('[Field Update] Error parsing field options:', e)\n }\n\n // Build the updated field config - merge in field options\n const updatedFieldConfig: any = {\n ...schema.properties[fieldName],\n ...parsedFieldOptions,\n type: fieldType,\n title: fieldLabel,\n searchable: isSearchable\n }\n\n // Also set/remove the individual required property on the field\n // This ensures consistency regardless of which format is checked in GET\n if (isRequired) {\n updatedFieldConfig.required = true\n } else {\n delete updatedFieldConfig.required\n }\n\n schema.properties[fieldName] = updatedFieldConfig\n\n // Handle required field in the schema's required array (proper JSON Schema way)\n const requiredIndex = schema.required.indexOf(fieldName)\n console.log('[Field Update] Required field handling:', {\n fieldName,\n isRequired,\n currentRequiredArray: schema.required,\n requiredIndex\n })\n\n if (isRequired && requiredIndex === -1) {\n // Add to required array if checked and not already there\n schema.required.push(fieldName)\n console.log('[Field Update] Added field to required array')\n } else if (!isRequired && requiredIndex !== -1) {\n // Remove from required array if unchecked and currently there\n schema.required.splice(requiredIndex, 1)\n console.log('[Field Update] Removed field from required array')\n }\n\n console.log('[Field Update] Final required array:', schema.required)\n console.log('[Field Update] Final field config:', schema.properties[fieldName])\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Field Update] Schema update result:', {\n success: result.success,\n changes: result.meta?.changes\n })\n\n return c.json({ success: true })\n }\n\n // For regular database fields\n const updateStmt = db.prepare(`\n UPDATE content_fields\n SET field_label = ?, field_type = ?, field_options = ?, is_required = ?, is_searchable = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateStmt.bind(fieldLabel, fieldType, fieldOptions, isRequired ? 1 : 0, isSearchable ? 1 : 0, Date.now(), fieldId).run()\n\n console.log('[Field Update] Update result:', {\n success: result.success,\n meta: result.meta,\n changes: result.meta?.changes,\n last_row_id: result.meta?.last_row_id\n })\n\n // Verify the update by reading back the field\n const verifyStmt = db.prepare('SELECT * FROM content_fields WHERE id = ?')\n const verifyResult = await verifyStmt.bind(fieldId).first()\n console.log('[Field Update] Verification - field after update:', verifyResult)\n\n console.log('[Field Update] Successfully updated field with type:', fieldType)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating field:', error)\n return c.json({ success: false, error: 'Failed to update field.' })\n }\n})\n\n// Delete field\nadminCollectionsRoutes.delete('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n const fieldName = fieldId.replace('schema-', '')\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema || !schema.properties) {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n\n // Remove field from schema\n if (schema.properties[fieldName]) {\n delete schema.properties[fieldName]\n\n // Also remove from required array if present\n if (schema.required && Array.isArray(schema.required)) {\n const requiredIndex = schema.required.indexOf(fieldName)\n if (requiredIndex !== -1) {\n schema.required.splice(requiredIndex, 1)\n }\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Delete Field] Removed field from schema:', fieldName)\n\n return c.json({ success: true })\n } else {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n }\n\n // For regular database fields\n const deleteStmt = db.prepare('DELETE FROM content_fields WHERE id = ?')\n await deleteStmt.bind(fieldId).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting field:', error)\n return c.json({ success: false, error: 'Failed to delete field.' })\n }\n})\n\n// Update field order\nadminCollectionsRoutes.post('/:collectionId/fields/reorder', async (c) => {\n try {\n const body = await c.req.json()\n const fieldIds = body.fieldIds as string[]\n\n if (!Array.isArray(fieldIds)) {\n return c.json({ success: false, error: 'Invalid field order data.' })\n }\n\n const db = c.env.DB\n\n // Update field order\n for (let i = 0; i < fieldIds.length; i++) {\n const updateStmt = db.prepare('UPDATE content_fields SET field_order = ?, updated_at = ? WHERE id = ?')\n await updateStmt.bind(i + 1, Date.now(), fieldIds[i]).run()\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error reordering fields:', error)\n return c.json({ success: false, error: 'Failed to reorder fields.' })\n }\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface SettingsPageData {\n user?: {\n name: string\n email: string\n role: string\n }\n settings?: {\n general?: GeneralSettings\n appearance?: AppearanceSettings\n security?: SecuritySettings\n notifications?: NotificationSettings\n storage?: StorageSettings\n migrations?: MigrationSettings\n databaseTools?: DatabaseToolsSettings\n }\n activeTab?: string\n version?: string\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface AppearanceSettings {\n theme: 'light' | 'dark' | 'auto'\n primaryColor: string\n logoUrl: string\n favicon: string\n customCSS: string\n}\n\nexport interface SecuritySettings {\n twoFactorEnabled: boolean\n sessionTimeout: number\n passwordRequirements: {\n minLength: number\n requireUppercase: boolean\n requireNumbers: boolean\n requireSymbols: boolean\n }\n ipWhitelist: string[]\n jwtExpiresIn?: string\n jwtRefreshGraceSeconds?: number\n}\n\nexport interface NotificationSettings {\n emailNotifications: boolean\n contentUpdates: boolean\n systemAlerts: boolean\n userRegistrations: boolean\n emailFrequency: 'immediate' | 'daily' | 'weekly'\n}\n\nexport interface StorageSettings {\n maxFileSize: number\n allowedFileTypes: string[]\n storageProvider: 'local' | 'cloudflare' | 's3'\n backupFrequency: 'daily' | 'weekly' | 'monthly'\n retentionPeriod: number\n}\n\nexport interface MigrationSettings {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Array<{\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n }>\n}\n\nexport interface DatabaseToolsSettings {\n totalTables: number\n totalRows: number\n lastBackup?: string\n databaseSize?: string\n tables: Array<{\n name: string\n rowCount: number\n }>\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const activeTab = data.activeTab || 'general'\n \n const pageContent = `\n
\n \n
\n
\n

Settings

\n

Manage your application settings and preferences

\n
\n
\n\n \n
\n
\n \n
\n
\n\n \n
\n
\n ${renderTabContent(activeTab, data.settings)}\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'run-migrations-confirm',\n title: 'Run Migrations',\n message: 'Are you sure you want to run pending migrations? This action cannot be undone.',\n confirmText: 'Run Migrations',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performRunMigrations()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Settings',\n pageTitle: 'Settings',\n currentPath: '/admin/settings',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderTabButton(tabId: string, label: string, iconPath: string, activeTab: string): string {\n const isActive = activeTab === tabId\n const baseClasses = 'flex items-center space-x-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 whitespace-nowrap no-underline'\n const activeClasses = isActive\n ? 'border-zinc-950 dark:border-white text-zinc-950 dark:text-white'\n : 'border-transparent text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-300 hover:border-zinc-300 dark:hover:border-zinc-700'\n\n return `\n \n \n \n \n ${label}\n \n `\n}\n\nfunction renderTabContent(activeTab: string, settings?: SettingsPageData['settings']): string {\n switch (activeTab) {\n case 'general':\n return renderGeneralSettings(settings?.general)\n case 'appearance':\n return renderAppearanceSettings(settings?.appearance)\n case 'security':\n return renderSecuritySettings(settings?.security)\n case 'notifications':\n return renderNotificationSettings(settings?.notifications)\n case 'storage':\n return renderStorageSettings(settings?.storage)\n case 'migrations':\n return renderMigrationSettings(settings?.migrations)\n case 'database-tools':\n return renderDatabaseToolsSettings(settings?.databaseTools)\n default:\n return renderGeneralSettings(settings?.general)\n }\n}\n\nfunction renderGeneralSettings(settings?: GeneralSettings): string {\n return `\n
\n
\n

General Settings

\n

Configure basic application settings and preferences.

\n
\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n
\n \n ${settings?.siteDescription || ''}\n
\n\n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderAppearanceSettings(settings?: AppearanceSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Appearance Settings

\n

Customize the look and feel of your application.

\n
\n \n
\n
\n
\n \n
\n \n \n \n
\n
\n \n
\n \n
\n \n \n
\n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderSecuritySettings(settings?: SecuritySettings): string {\n const jwtExpiresIn = settings?.jwtExpiresIn ?? '30d'\n const jwtRefreshGraceSeconds =\n typeof settings?.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n\n return `\n
\n \n
\n

Session / JWT

\n

\n Configure how long a signed-in session lasts and how long an expired token can still be refreshed.\n The JWT_EXPIRES_IN and JWT_REFRESH_GRACE_SECONDS\n environment variables, when set, override the values below.\n

\n\n
\n
\n \n \n

\n Accepts 30d, 12h, 3600s, or bare seconds. Default: 30 days.\n

\n
\n\n
\n \n \n

\n How long an expired token can still be exchanged at /auth/refresh. Default: 604800 (7 days).\n

\n
\n
\n\n
\n \n \n \n \n Save Session Settings\n \n
\n
\n\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n The fields below are under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Security Settings

\n

Configure security and authentication settings.

\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n

Leave empty to allow all IPs

\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderNotificationSettings(settings?: NotificationSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Notification Settings

\n

Configure how and when you receive notifications.

\n
\n \n
\n
\n
\n

Email Notifications

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Notification Preferences
\n

\n Critical system alerts will always be sent immediately regardless of your frequency setting.\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderStorageSettings(settings?: StorageSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Storage Settings

\n

Configure file storage and backup settings.

\n
\n \n
\n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Storage Status
\n

\n Current usage: 2.4 GB / 10 GB available\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderMigrationSettings(settings?: MigrationSettings): string {\n return `\n
\n
\n

Database Migrations

\n

View and manage database migrations to keep your schema up to date.

\n
\n \n \n
\n
\n
\n
\n

Total Migrations

\n

${settings?.totalMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Applied

\n

${settings?.appliedMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Pending

\n

${settings?.pendingMigrations || '0'}

\n
\n \n \n \n
\n
\n
\n\n \n
\n \n \n \n\n \n
\n\n \n
\n
\n

Migration History

\n

List of all available database migrations

\n
\n \n
\n
\n \n \n \n

Loading migration status...

\n
\n
\n
\n
\n\n \n `\n}\n\nfunction renderDatabaseToolsSettings(settings?: DatabaseToolsSettings): string {\n return `\n
\n
\n

Database Tools

\n

Manage database operations including backup, restore, and maintenance.

\n
\n\n \n
\n
\n
\n
\n

Total Tables

\n

${settings?.totalTables || '0'}

\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n
\n

Total Rows

\n

${settings?.totalRows?.toLocaleString() || '0'}

\n
\n
\n \n \n \n
\n
\n
\n
\n\n \n
\n \n
\n

Safe Operations

\n
\n \n \n \n \n Refresh Stats\n \n\n \n \n \n \n Create Backup\n \n\n \n \n \n \n Validate Database\n \n
\n
\n
\n\n \n
\n
\n

Database Tables

\n

Click on a table to view its data

\n
\n\n
\n
\n \n \n \n

Loading database statistics...

\n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

Danger Zone

\n

\n These operations are destructive and cannot be undone.\n Your admin account will be preserved, but all other data will be permanently deleted.\n

\n
\n \n \n \n \n Truncate All Data\n \n
\n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\n// import { html } from 'hono/html'\nimport { requireAuth } from '../middleware'\nimport { renderSettingsPage, SettingsPageData } from '../templates/pages/admin-settings.template'\nimport { MigrationService } from '../services/migrations'\nimport { SettingsService } from '../services/settings'\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminSettingsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminSettingsRoutes.use('*', requireAuth())\n\n// Helper function to get mock settings data\nfunction getMockSettings(user: any) {\n return {\n general: {\n siteName: 'SonicJS AI',\n siteDescription: 'A modern headless CMS powered by AI',\n adminEmail: user?.email || 'admin@example.com',\n timezone: 'UTC',\n language: 'en',\n maintenanceMode: false\n },\n appearance: {\n theme: 'dark' as const,\n primaryColor: '#465FFF',\n logoUrl: '',\n favicon: '',\n customCSS: ''\n },\n security: {\n twoFactorEnabled: false,\n sessionTimeout: 30,\n passwordRequirements: {\n minLength: 8,\n requireUppercase: true,\n requireNumbers: true,\n requireSymbols: false\n },\n ipWhitelist: []\n },\n notifications: {\n emailNotifications: true,\n contentUpdates: true,\n systemAlerts: true,\n userRegistrations: false,\n emailFrequency: 'immediate' as const\n },\n storage: {\n maxFileSize: 10,\n allowedFileTypes: ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'docx'],\n storageProvider: 'cloudflare' as const,\n backupFrequency: 'daily' as const,\n retentionPeriod: 30\n },\n migrations: {\n totalMigrations: 0,\n appliedMigrations: 0,\n pendingMigrations: 0,\n lastApplied: undefined,\n migrations: []\n },\n databaseTools: {\n totalTables: 0,\n totalRows: 0,\n lastBackup: undefined,\n databaseSize: '0 MB',\n tables: []\n }\n }\n}\n\n// Settings page (redirects to general settings)\nadminSettingsRoutes.get('/', (c) => {\n return c.redirect('/admin/settings/general')\n})\n\n// General settings\nadminSettingsRoutes.get('/general', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Get real general settings from database\n const generalSettings = await settingsService.getGeneralSettings(user?.email)\n\n const mockSettings = getMockSettings(user)\n mockSettings.general = generalSettings\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'general',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Appearance settings\nadminSettingsRoutes.get('/appearance', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'appearance',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Security settings\nadminSettingsRoutes.get('/security', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Load persisted security settings (JWT TTL + refresh grace)\n const persisted = await settingsService.getSecuritySettings()\n\n const mockSettings = getMockSettings(user)\n mockSettings.security = {\n ...mockSettings.security,\n jwtExpiresIn: persisted.jwtExpiresIn,\n jwtRefreshGraceSeconds: persisted.jwtRefreshGraceSeconds\n } as any\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'security',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Notifications settings\nadminSettingsRoutes.get('/notifications', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'notifications',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Storage settings\nadminSettingsRoutes.get('/storage', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'storage',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Migrations settings\nadminSettingsRoutes.get('/migrations', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'migrations',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Database tools settings\nadminSettingsRoutes.get('/database-tools', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'database-tools',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Get migration status\nadminSettingsRoutes.get('/api/migrations/status', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminSettingsRoutes.post('/api/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n return c.json({\n success: false,\n error: 'Failed to run migrations'\n }, 500)\n }\n})\n\n// Validate database schema\nadminSettingsRoutes.get('/api/migrations/validate', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\n// Get database tools stats\nadminSettingsRoutes.get('/api/database-tools/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get list of all tables\n const tablesQuery = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT LIKE '_cf_%'\n ORDER BY name\n `).all()\n\n const tables = tablesQuery.results || []\n let totalRows = 0\n\n // Get row count for each table\n const tableStats = await Promise.all(\n tables.map(async (table: any) => {\n try {\n const countResult = await db.prepare(`SELECT COUNT(*) as count FROM ${table.name}`).first()\n const rowCount = (countResult as any)?.count || 0\n totalRows += rowCount\n return {\n name: table.name,\n rowCount\n }\n } catch (error) {\n console.error(`Error counting rows in ${table.name}:`, error)\n return {\n name: table.name,\n rowCount: 0\n }\n }\n })\n )\n\n // D1 doesn't expose database size directly, so we'll estimate based on row counts\n // Average row size estimate: 1KB per row (rough approximation)\n const estimatedSizeBytes = totalRows * 1024\n const databaseSizeMB = (estimatedSizeBytes / (1024 * 1024)).toFixed(2)\n\n return c.json({\n success: true,\n data: {\n totalTables: tables.length,\n totalRows,\n databaseSize: `${databaseSizeMB} MB (estimated)`,\n tables: tableStats\n }\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch database statistics'\n }, 500)\n }\n})\n\n// Validate database\nadminSettingsRoutes.get('/api/database-tools/validate', async (c) => {\n try {\n const db = c.env.DB\n\n // Run PRAGMA integrity_check\n const integrityResult = await db.prepare('PRAGMA integrity_check').first()\n const isValid = (integrityResult as any)?.integrity_check === 'ok'\n\n return c.json({\n success: true,\n data: {\n valid: isValid,\n message: isValid ? 'Database integrity check passed' : 'Database integrity check failed'\n }\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n})\n\n// Backup database\nadminSettingsRoutes.post('/api/database-tools/backup', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n // TODO: Implement actual backup functionality\n // For now, return success message\n return c.json({\n success: true,\n message: 'Database backup feature coming soon. Use Cloudflare Dashboard for backups.'\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({\n success: false,\n error: 'Failed to create backup'\n }, 500)\n }\n})\n\n// Truncate tables\nadminSettingsRoutes.post('/api/database-tools/truncate', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const body = await c.req.json()\n const tablesToTruncate = body.tables || []\n\n if (!Array.isArray(tablesToTruncate) || tablesToTruncate.length === 0) {\n return c.json({\n success: false,\n error: 'No tables specified for truncation'\n }, 400)\n }\n\n const db = c.env.DB\n const results = []\n\n // Validate table names against actual database tables (prevents SQL injection)\n const tablesResult = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n `).all()\n const validTables = new Set(\n (tablesResult.results || []).map((row: any) => row.name)\n )\n\n for (const tableName of tablesToTruncate) {\n if (!validTables.has(tableName)) {\n results.push({ table: tableName, success: false, error: 'Table not found' })\n continue\n }\n try {\n await db.prepare(`DELETE FROM ${tableName}`).run()\n results.push({ table: tableName, success: true })\n } catch (error) {\n console.error(`Error truncating ${tableName}:`, error)\n results.push({ table: tableName, success: false, error: String(error) })\n }\n }\n\n return c.json({\n success: true,\n message: `Truncated ${results.filter(r => r.success).length} of ${tablesToTruncate.length} tables`,\n results\n })\n } catch (error) {\n console.error('Error truncating tables:', error)\n return c.json({\n success: false,\n error: 'Failed to truncate tables'\n }, 500)\n }\n})\n\n// Save general settings\nadminSettingsRoutes.post('/general', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Extract general settings from form data\n const settings = {\n siteName: formData.get('siteName') as string,\n siteDescription: formData.get('siteDescription') as string,\n adminEmail: formData.get('adminEmail') as string,\n timezone: formData.get('timezone') as string,\n language: formData.get('language') as string,\n maintenanceMode: formData.get('maintenanceMode') === 'true'\n }\n\n // Validate required fields\n if (!settings.siteName || !settings.siteDescription) {\n return c.json({\n success: false,\n error: 'Site name and description are required'\n }, 400)\n }\n\n // Save settings to database\n const success = await settingsService.saveGeneralSettings(settings)\n\n if (success) {\n return c.json({\n success: true,\n message: 'General settings saved successfully!'\n })\n } else {\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n }\n } catch (error) {\n console.error('Error saving general settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save security settings (JWT TTL + refresh grace)\nadminSettingsRoutes.post('/security', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n const jwtExpiresInRaw = (formData.get('jwtExpiresIn') as string | null)?.trim() || ''\n const graceRaw = (formData.get('jwtRefreshGraceSeconds') as string | null)?.trim() || ''\n\n // Validate jwtExpiresIn: bare seconds or \n if (!/^\\d+(?:s|m|h|d)?$/i.test(jwtExpiresInRaw)) {\n return c.json({\n success: false,\n error: 'JWT expiration must be a number optionally suffixed with s/m/h/d (e.g. 30d, 12h, 3600).'\n }, 400)\n }\n\n const graceSeconds = Number.parseInt(graceRaw, 10)\n if (!Number.isFinite(graceSeconds) || graceSeconds < 0 || graceSeconds > 60 * 60 * 24 * 90) {\n return c.json({\n success: false,\n error: 'Refresh grace must be an integer between 0 and 7776000 seconds (90 days).'\n }, 400)\n }\n\n const success = await settingsService.saveSecuritySettings({\n jwtExpiresIn: jwtExpiresInRaw,\n jwtRefreshGraceSeconds: graceSeconds\n })\n\n if (success) {\n return c.json({\n success: true,\n message: 'Security settings saved successfully!'\n })\n }\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n } catch (error) {\n console.error('Error saving security settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save settings (legacy endpoint - redirect to general)\nadminSettingsRoutes.post('/', async (c) => {\n return c.redirect('/admin/settings/general')\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n formattedDate: string\n}\n\nexport interface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormsListPage(data: FormsListPageData): string {\n const tableData: any = {\n tableId: 'forms-table',\n rowClickable: true,\n rowClickUrl: (form: Form) => `/admin/forms/${form.id}/builder`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => `\n
\n \n ${form.name}\n \n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'category',\n label: 'Category',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n const categoryColors: Record = {\n 'contact': 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 ring-blue-700/10 dark:ring-blue-400/20',\n 'survey': 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-300 ring-purple-700/10 dark:ring-purple-400/20',\n 'registration': 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-300 ring-green-700/10 dark:ring-green-400/20',\n 'feedback': 'bg-orange-50 dark:bg-orange-500/10 text-orange-700 dark:text-orange-300 ring-orange-700/10 dark:ring-orange-400/20',\n 'general': 'bg-gray-50 dark:bg-gray-500/10 text-gray-700 dark:text-gray-300 ring-gray-700/10 dark:ring-gray-400/20'\n }\n const colorClass = categoryColors[form.category] || categoryColors['general']\n return `\n \n ${form.category || 'general'}\n \n `\n }\n },\n {\n key: 'submission_count',\n label: 'Submissions',\n sortable: true,\n sortType: 'number',\n render: (_value: any, form: any) => {\n const count = form.submission_count || 0\n return `\n
\n \n ${count}\n \n
\n `\n }\n },\n {\n key: 'is_active',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n if (form.is_active) {\n return `\n \n Active\n \n `\n } else {\n return `\n \n Inactive\n \n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n render: (_value: any, form: any) => {\n if (!form || !form.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.forms,\n emptyMessage: 'No forms found. Create your first form to get started!'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Forms

\n

Create and manage forms with the visual form builder

\n
\n \n
\n\n \n
\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Forms
\n
${data.forms.length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Active Forms
\n
${data.forms.filter(f => f.is_active).length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Submissions
\n
${data.forms.reduce((sum, f) => sum + (f.submission_count || 0), 0)}
\n
\n
\n
\n
\n
\n\n \n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Filter\n \n ${data.search || data.category ? `\n \n Clear\n \n ` : ''}\n \n
\n\n \n
\n ${renderTable(tableData)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Forms',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface FormBuilderPageData {\n id: string\n name: string\n display_name: string\n description?: string\n category?: string\n formio_schema: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\n// Inline Turnstile component for Form.io builder\nfunction getTurnstileComponentScript(): string {\n return `\n (function() {\n 'use strict';\n\n if (!window.Formio || !window.Formio.Components) {\n console.error('Form.io library not loaded');\n return;\n }\n\n const FieldComponent = Formio.Components.components.field;\n\n class TurnstileComponent extends FieldComponent {\n static schema(...extend) {\n return FieldComponent.schema({\n type: 'turnstile',\n label: 'Turnstile Verification',\n key: 'turnstile',\n input: true,\n persistent: false,\n protected: true,\n unique: false,\n hidden: false,\n clearOnHide: true,\n tableView: false,\n validate: {\n required: false\n },\n siteKey: '',\n theme: 'auto',\n size: 'normal',\n action: '',\n appearance: 'always',\n errorMessage: 'Please complete the security verification'\n }, ...extend);\n }\n\n static get builderInfo() {\n return {\n title: 'Turnstile',\n group: 'premium',\n icon: 'fa fa-shield-alt',\n weight: 120,\n documentation: '/admin/forms/docs#turnstile',\n schema: TurnstileComponent.schema()\n };\n }\n\n constructor(component, options, data) {\n super(component, options, data);\n this.widgetId = null;\n this.scriptLoaded = false;\n }\n\n init() {\n super.init();\n // Only load script if NOT in builder/edit mode\n if (!this.options.editMode && !this.options.builder && !this.builderMode) {\n this.loadTurnstileScript();\n }\n }\n\n loadTurnstileScript() {\n // Extra safety: never load in builder\n if (this.options.editMode || this.options.builder || this.builderMode) {\n console.log('Turnstile: Skipping script load in builder mode');\n return Promise.resolve();\n }\n\n if (window.turnstile) {\n this.scriptLoaded = true;\n return Promise.resolve();\n }\n\n if (this.scriptPromise) {\n return this.scriptPromise;\n }\n\n console.log('Turnstile: Loading script for form mode');\n this.scriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js';\n script.async = true;\n script.defer = true;\n script.onload = () => {\n this.scriptLoaded = true;\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Turnstile'));\n document.head.appendChild(script);\n });\n\n return this.scriptPromise;\n }\n\n render() {\n return super.render(\\`\n
\n
\n \\${this.component.description ? \\`
\\${this.component.description}
\\` : ''}\n
\n \\`);\n }\n\n attach(element) {\n this.loadRefs(element, {\n turnstileContainer: 'single',\n turnstileWidget: 'single'\n });\n\n const superAttach = super.attach(element);\n\n // Check if we're in builder mode or form mode\n if (this.options.editMode || this.options.builder) {\n // Builder mode - show placeholder only\n this.renderPlaceholder();\n } else {\n // Form mode - render actual widget\n this.loadTurnstileScript()\n .then(() => this.renderWidget())\n .catch(err => {\n console.error('Failed to load Turnstile:', err);\n if (this.refs.turnstileWidget) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to load security verification\n
\n \\`;\n }\n });\n }\n\n return superAttach;\n }\n\n renderPlaceholder() {\n if (!this.refs.turnstileWidget) {\n return;\n }\n \n this.refs.turnstileWidget.innerHTML = \\`\n
\n
🛡️
\n
Turnstile Verification
\n
CAPTCHA-free bot protection by Cloudflare
\n
Widget will appear here on the live form
\n
\n \\`;\n }\n\n renderWidget() {\n if (!this.refs.turnstileWidget || !window.turnstile) {\n return;\n }\n\n this.refs.turnstileWidget.innerHTML = '';\n\n const siteKey = this.component.siteKey || \n (this.root && this.root.options && this.root.options.turnstileSiteKey) || \n '';\n \n if (!siteKey) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n ⚠️ Configuration Required: Turnstile site key not configured. \n Please enable the Turnstile plugin in Settings → Plugins.\n
\n \\`;\n return;\n }\n\n try {\n const self = this;\n this.widgetId = window.turnstile.render(this.refs.turnstileWidget, {\n sitekey: siteKey,\n theme: this.component.theme || 'auto',\n size: this.component.size || 'normal',\n action: this.component.action || '',\n appearance: this.component.appearance || 'always',\n callback: function(token) {\n self.updateValue(token);\n self.triggerChange();\n },\n 'error-callback': function() {\n self.updateValue(null);\n self.setCustomValidity(self.component.errorMessage || 'Security verification failed');\n },\n 'expired-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification expired. Please verify again.');\n },\n 'timeout-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification timed out. Please try again.');\n }\n });\n } catch (err) {\n console.error('Failed to render Turnstile widget:', err);\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to render security verification\n
\n \\`;\n }\n }\n\n detach() {\n if (this.widgetId !== null && window.turnstile) {\n try {\n window.turnstile.remove(this.widgetId);\n this.widgetId = null;\n } catch (err) {\n console.error('Failed to remove Turnstile widget:', err);\n }\n }\n return super.detach();\n }\n\n getValue() {\n if (this.widgetId !== null && window.turnstile) {\n return window.turnstile.getResponse(this.widgetId);\n }\n return this.dataValue;\n }\n\n setValue(value, flags) {\n const changed = super.setValue(value, flags);\n return changed;\n }\n\n getValueAsString(value) {\n return value ? '✅ Verified' : '❌ Not Verified';\n }\n\n isEmpty(value) {\n return !value;\n }\n\n updateValue(value, flags) {\n const changed = super.updateValue(value, flags);\n \n if (value) {\n this.setCustomValidity('');\n }\n \n return changed;\n }\n\n checkValidity(data, dirty, row) {\n const result = super.checkValidity(data, dirty, row);\n \n if (this.component.validate && this.component.validate.required) {\n const value = this.getValue();\n if (!value) {\n this.setCustomValidity(this.component.errorMessage || 'Please complete the security verification');\n return false;\n }\n }\n \n return result;\n }\n }\n\n Formio.Components.addComponent('turnstile', TurnstileComponent);\n console.log('✅ Turnstile component registered with Form.io');\n window.TurnstileComponent = TurnstileComponent;\n })();\n `;\n}\n\nexport function renderFormBuilderPage(data: FormBuilderPageData): string {\n const formioSchema = data.formio_schema || { components: [] }\n const settings = data.settings || {}\n const googleMapsApiKey = data.google_maps_api_key || ''\n const turnstileSiteKey = data.turnstile_site_key || ''\n\n const pageContent = `\n \n\n
\n \n
\n
\n
\n \n \n \n \n \n
\n

\n Form Builder: ${data.display_name}\n

\n

\n \n ${data.name}\n \n

\n
\n
\n\n \n
\n \n \n \n \n \n Preview\n \n\n \n \n \n \n Save Form\n \n\n \n \n \n \n View Public Form\n \n\n \n \n \n \n View Submissions\n \n
\n
\n
\n\n \n
\n \n
\n \n \n \n \n Single Page\n \n \n \n \n \n Multi-Page Wizard\n \n
\n \n 💡 Use Panel components (Layout tab) for each page\n \n
\n\n \n
\n\n \n
\n
\n \n \n \n \n

Loading Form Builder...

\n
\n
\n\n \n
\n\n \n
\n
\n
\n

Form Preview

\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n\n \n \n\n \n\n \n \n \n \n \n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Form Builder: ${data.display_name}`,\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm } from '../components/form.template'\n\nexport interface FormCreatePageData {\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormCreatePage(data: FormCreatePageData): string {\n const pageContent = `\n
\n \n
\n
\n \n \n \n \n \n
\n

Create New Form

\n

Enter basic information to create your form. You'll be able to add fields in the builder.

\n
\n
\n
\n\n \n ${data.error ? `\n
\n
\n \n \n \n

${data.error}

\n
\n
\n ` : ''}\n\n ${data.success ? `\n
\n
\n \n \n \n

${data.success}

\n
\n
\n ` : ''}\n\n \n
\n
\n \n
\n \n
\n \n \n

\n Lowercase letters, numbers, and underscores only. Used in URLs and API.\n

\n
\n\n \n
\n \n \n

\n Human-readable name shown in the admin interface.\n

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n \n \n \n \n \n \n

\n Helps organize forms in the admin panel.\n

\n
\n
\n\n \n
\n \n Cancel\n \n \n \n \n \n Create & Open Builder\n \n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

What happens next?

\n
\n

After creating your form, you'll be taken to the Form Builder where you can:

\n
    \n
  • Drag and drop fields onto your form
  • \n
  • Configure field properties and validation
  • \n
  • Add conditional logic
  • \n
  • Preview your form in real-time
  • \n
  • Publish when ready
  • \n
\n
\n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create Form',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderFormsListPage } from '../templates/pages/admin-forms-list.template'\nimport { renderFormBuilderPage, type FormBuilderPageData } from '../templates/pages/admin-forms-builder.template'\nimport { renderFormCreatePage } from '../templates/pages/admin-forms-create.template'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\n\n// Type definitions for forms\ninterface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n updated_at: number\n formattedDate: string\n}\n\ninterface FormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n category?: string\n formio_schema?: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ninterface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminFormsRoutes.use('*', requireAuth())\n\n// Forms management - List all forms\nadminFormsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const category = c.req.query('category') || ''\n\n // Build query\n let query = 'SELECT * FROM forms WHERE 1=1'\n const params: string[] = []\n\n if (search) {\n query += ' AND (name LIKE ? OR display_name LIKE ?)'\n params.push(`%${search}%`, `%${search}%`)\n }\n\n if (category) {\n query += ' AND category = ?'\n params.push(category)\n }\n\n query += ' ORDER BY created_at DESC'\n\n const result = await db.prepare(query).bind(...params).all()\n\n // Format dates\n const forms = result.results.map((form: any) => ({\n ...form,\n formattedDate: new Date(form.created_at).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n }))\n\n const pageData: FormsListPageData = {\n forms,\n search,\n category,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsListPage(pageData))\n } catch (error: any) {\n console.error('Error listing forms:', error)\n return c.html('

Error loading forms

', 500)\n }\n})\n\n// Show create form page\nadminFormsRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n\n const pageData: FormData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormCreatePage(pageData))\n } catch (error: any) {\n console.error('Error showing create form page:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Show docs page\nadminFormsRoutes.get('/docs', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsDocsPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsDocsPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms docs page:', error)\n return c.html('

Error loading documentation

', 500)\n }\n})\n\n// Show examples page\nadminFormsRoutes.get('/examples', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsExamplesPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsExamplesPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms examples page:', error)\n return c.html('

Error loading examples

', 500)\n }\n})\n\n// Create new form\nadminFormsRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const name = body.name as string\n const displayName = body.displayName as string\n const description = (body.description as string) || ''\n const category = (body.category as string) || 'general'\n\n // Validate required fields\n if (!name || !displayName) {\n return c.json({ error: 'Name and display name are required' }, 400)\n }\n\n // Validate name format (lowercase, numbers, underscores only)\n if (!/^[a-z0-9_]+$/.test(name)) {\n return c.json({ \n error: 'Form name must contain only lowercase letters, numbers, and underscores' \n }, 400)\n }\n\n // Check for duplicate name\n const existing = await db.prepare('SELECT id FROM forms WHERE name = ?')\n .bind(name)\n .first()\n\n if (existing) {\n return c.json({ error: 'A form with this name already exists' }, 400)\n }\n\n // Create form with empty schema\n const formId = crypto.randomUUID()\n const now = Date.now()\n const emptySchema = { components: [] } // Empty Form.io schema\n\n await db.prepare(`\n INSERT INTO forms (\n id, name, display_name, description, category,\n formio_schema, settings, is_active, is_public,\n created_by, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n formId,\n name,\n displayName,\n description,\n category,\n JSON.stringify(emptySchema),\n JSON.stringify({\n submitButtonText: 'Submit',\n successMessage: 'Thank you for your submission!',\n requireAuth: false,\n emailNotifications: false\n }),\n 1, // is_active\n 1, // is_public\n user?.userId || null,\n now,\n now\n ).run()\n\n // Redirect to builder\n return c.redirect(`/admin/forms/${formId}/builder`)\n } catch (error: any) {\n console.error('Error creating form:', error)\n return c.json({ error: 'Failed to create form' }, 500)\n }\n})\n\n// Show form builder\nadminFormsRoutes.get('/:id/builder', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get Turnstile configuration\n const turnstileService = new TurnstileService(db)\n const turnstileSettings = await turnstileService.getSettings()\n\n const pageData: FormData = {\n id: form.id as string,\n name: form.name as string,\n display_name: form.display_name as string,\n description: form.description as string | undefined,\n category: form.category as string,\n formio_schema: form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] },\n settings: form.settings ? JSON.parse(form.settings as string) : {},\n is_active: Boolean(form.is_active),\n is_public: Boolean(form.is_public),\n google_maps_api_key: googleMapsApiKey,\n turnstile_site_key: turnstileSettings?.siteKey || '',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormBuilderPage(pageData as FormBuilderPageData))\n } catch (error: any) {\n console.error('Error showing form builder:', error)\n return c.html('

Error loading form builder

', 500)\n }\n})\n\n// Update form (save schema)\nadminFormsRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const body = await c.req.json()\n\n // Check if form exists\n const form = await db.prepare('SELECT id FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const now = Date.now()\n\n // Update form\n await db.prepare(`\n UPDATE forms \n SET formio_schema = ?, \n updated_by = ?, \n updated_at = ?\n WHERE id = ?\n `).bind(\n JSON.stringify(body.formio_schema),\n user?.userId || null,\n now,\n formId\n ).run()\n\n return c.json({ success: true, message: 'Form saved successfully' })\n } catch (error: any) {\n console.error('Error updating form:', error)\n return c.json({ error: 'Failed to save form' }, 500)\n }\n})\n\n// Delete form\nadminFormsRoutes.delete('/:id', async (c) => {\n try {\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Check if form exists\n const form = await db.prepare('SELECT id, submission_count FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Warn if form has submissions\n const submissionCount = form.submission_count as number || 0\n if (submissionCount > 0) {\n return c.json({ \n error: `Cannot delete form with ${submissionCount} submissions. Archive it instead.` \n }, 400)\n }\n\n // Delete form (cascade will delete submissions and files)\n await db.prepare('DELETE FROM forms WHERE id = ?').bind(formId).run()\n\n return c.json({ success: true, message: 'Form deleted successfully' })\n } catch (error: any) {\n console.error('Error deleting form:', error)\n return c.json({ error: 'Failed to delete form' }, 500)\n }\n})\n\n// View form submissions\nadminFormsRoutes.get('/:id/submissions', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get submissions\n const submissions = await db.prepare(\n 'SELECT * FROM form_submissions WHERE form_id = ? ORDER BY submitted_at DESC'\n ).bind(formId).all()\n\n // Simple submissions page for now\n const html = `\n \n \n \n Submissions - ${form.display_name}\n \n \n \n ← Back to Forms\n

Submissions: ${form.display_name}

\n

Total submissions: ${submissions.results.length}

\n ${submissions.results.length > 0 ? `\n \n \n \n \n \n \n \n \n \n ${submissions.results.map((sub: any) => `\n \n \n \n \n \n `).join('')}\n \n
IDSubmittedData
${sub.id.substring(0, 8)}${new Date(sub.submitted_at).toLocaleString()}
${JSON.stringify(JSON.parse(sub.submission_data), null, 2)}
\n ` : '

No submissions yet.

'}\n \n \n `\n \n return c.html(html)\n } catch (error: any) {\n console.error('Error loading submissions:', error)\n return c.html('

Error loading submissions

', 500)\n }\n})\n\nexport default adminFormsRoutes\n","import { Hono } from 'hono'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { createContentFromSubmission } from '../services/form-collection-sync'\n\n/**\n * Recursively sanitize all string values in arbitrary JSON data.\n * HTML-encodes entities (e.g., < becomes <) to prevent stored XSS\n * when form submission data is rendered in admin templates.\n */\nfunction sanitizeDeep(value: unknown): unknown {\n if (typeof value === 'string') {\n return sanitizeInput(value)\n }\n if (Array.isArray(value)) {\n return value.map(sanitizeDeep)\n }\n if (value !== null && typeof value === 'object') {\n const result: Record = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = sanitizeDeep(v)\n }\n return result\n }\n return value // numbers, booleans, null pass through\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const publicFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Get Turnstile configuration for a form (for headless frontends)\npublicFormsRoutes.get('/:identifier/turnstile-config', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form\n const form = await db.prepare(\n 'SELECT id, turnstile_enabled, turnstile_settings FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const turnstileService = new TurnstileService(db)\n const globalSettings = await turnstileService.getSettings()\n \n const formSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string)\n : { inherit: true }\n\n // Determine effective settings\n const enabled = form.turnstile_enabled === 1 || \n (formSettings.inherit && globalSettings?.enabled)\n\n if (!enabled || !globalSettings) {\n return c.json({ enabled: false })\n }\n\n return c.json({\n enabled: true,\n siteKey: formSettings.siteKey || globalSettings.siteKey,\n theme: formSettings.theme || globalSettings.theme || 'auto',\n size: formSettings.size || globalSettings.size || 'normal',\n mode: formSettings.mode || globalSettings.mode || 'managed',\n appearance: formSettings.appearance || globalSettings.appearance || 'always'\n })\n } catch (error: any) {\n console.error('Error fetching Turnstile config:', error)\n return c.json({ error: 'Failed to fetch config' }, 500)\n }\n})\n\n// Get form schema as JSON (for headless frontends)\npublicFormsRoutes.get('/:identifier/schema', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT id, name, display_name, description, category, formio_schema, settings, is_active, is_public FROM forms WHERE (id = ? OR name = ?) AND is_active = 1 AND is_public = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n return c.json({\n id: form.id,\n name: form.name,\n displayName: form.display_name,\n description: form.description,\n category: form.category,\n schema: formioSchema,\n settings: settings,\n submitUrl: `/api/forms/${form.id}/submit`\n })\n } catch (error: any) {\n console.error('Error fetching form schema:', error)\n return c.json({ error: 'Failed to fetch form schema' }, 500)\n }\n})\n\n// Render public form by name\npublicFormsRoutes.get('/:name', async (c) => {\n try {\n const db = c.env.DB\n const formName = c.req.param('name')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form by name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE name = ? AND is_active = 1 AND is_public = 1'\n ).bind(formName).first()\n\n if (!form) {\n return c.html('

Form not found

This form does not exist or is not publicly available.

', 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n const html = `\n \n \n \n \n \n ${form.display_name}\n \n \n \n \n \n \n \n
\n

${form.display_name}

\n ${form.description ? `

${form.description}

` : ''}\n \n
\n \n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n `\n\n return c.html(html)\n } catch (error: any) {\n console.error('Error rendering form:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Handle form submission (accepts either name or ID)\npublicFormsRoutes.post('/:identifier/submit', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n const body = await c.req.json()\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Check if Turnstile is enabled for this form\n const turnstileEnabled = form.turnstile_enabled === 1\n const turnstileSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string) \n : { inherit: true }\n\n // Validate Turnstile if enabled (or inheriting global settings)\n if (turnstileEnabled || turnstileSettings.inherit) {\n const turnstileService = new TurnstileService(db)\n \n // Check if Turnstile is globally enabled\n const globalEnabled = await turnstileService.isEnabled()\n \n if (globalEnabled || turnstileEnabled) {\n // Extract Turnstile token from submission data\n const turnstileToken = body.data?.turnstile || body.turnstile\n \n if (!turnstileToken) {\n return c.json({ \n error: 'Turnstile verification required. Please complete the security check.',\n code: 'TURNSTILE_MISSING'\n }, 400)\n }\n\n // Verify the token\n const clientIp = c.req.header('cf-connecting-ip')\n const verification = await turnstileService.verifyToken(turnstileToken, clientIp)\n \n if (!verification.success) {\n return c.json({ \n error: verification.error || 'Security verification failed. Please try again.',\n code: 'TURNSTILE_INVALID'\n }, 403)\n }\n\n // Remove Turnstile token from submission data before storing\n if (body.data?.turnstile) {\n delete body.data.turnstile\n }\n }\n }\n\n // Sanitize all string values in submission data to prevent stored XSS.\n // HTML-encodes entities (e.g., < becomes <) before storage.\n const sanitizedData = sanitizeDeep(body.data) as Record\n\n // Create submission\n const submissionId = crypto.randomUUID()\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO form_submissions (\n id, form_id, submission_data, user_id, ip_address, user_agent,\n submitted_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n submissionId,\n form.id,\n JSON.stringify(sanitizedData),\n null, // user_id (for authenticated users)\n c.req.header('cf-connecting-ip') || null,\n c.req.header('user-agent') || null,\n now,\n now\n ).run()\n\n // Update submission count\n await db.prepare(`\n UPDATE forms\n SET submission_count = submission_count + 1,\n updated_at = ?\n WHERE id = ?\n `).bind(now, form.id).run()\n\n // Dual-write: create content item for this submission\n let contentId: string | null = null\n try {\n contentId = await createContentFromSubmission(\n db,\n sanitizedData as Record,\n { id: form.id as string, name: form.name as string, display_name: form.display_name as string },\n submissionId,\n {\n ipAddress: c.req.header('cf-connecting-ip') || null,\n userAgent: c.req.header('user-agent') || null,\n userEmail: (sanitizedData as any)?.email || null,\n userId: null // anonymous submission\n }\n )\n if (!contentId) {\n console.warn('[FormSubmit] Content creation returned null for submission:', submissionId)\n }\n } catch (contentError) {\n // Don't fail the submission if content creation fails\n console.error('[FormSubmit] Error creating content from submission:', contentError)\n }\n\n return c.json({\n success: true,\n submissionId,\n contentId,\n message: 'Form submitted successfully'\n })\n } catch (error: any) {\n console.error('Error submitting form:', error)\n return c.json({ error: 'Failed to submit form' }, 500)\n }\n})\n\nexport default publicFormsRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { CATEGORY_INFO } from '../../services/route-metadata'\n\nexport interface APIEndpoint {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented?: boolean\n}\n\nexport interface APIReferencePageData {\n endpoints: APIEndpoint[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nfunction renderAuthBadge(auth: boolean | 'unknown'): string {\n if (auth === true) {\n return `\n \n \n \n \n Auth\n `\n }\n if (auth === false) {\n return `\n \n \n \n \n Public\n `\n }\n // unknown\n return `\n \n \n \n \n Unknown\n `\n}\n\nexport function renderAPIReferencePage(data: APIReferencePageData): string {\n // Group endpoints by category\n const endpointsByCategory = data.endpoints.reduce((acc, endpoint) => {\n if (!acc[endpoint.category]) {\n acc[endpoint.category] = []\n }\n acc[endpoint.category]!.push(endpoint)\n return acc\n }, {} as Record)\n\n // Get unique categories from actual data\n const categories = Object.keys(endpointsByCategory)\n\n // Count stats\n const totalEndpoints = data.endpoints.length\n const publicEndpoints = data.endpoints.filter(e => e.authentication === false).length\n const protectedEndpoints = data.endpoints.filter(e => e.authentication === true).length\n const undocumentedCount = data.endpoints.filter(e => e.documented === false).length\n\n const pageContent = `\n
\n \n
\n
\n

API Reference

\n

Auto-discovered documentation of all registered API endpoints

\n
\n \n
\n\n \n
\n
\n
Total Endpoints
\n
\n ${totalEndpoints}\n
\n
\n
\n
Public Endpoints
\n
\n ${publicEndpoints}\n
\n
\n
\n
Protected Endpoints
\n
\n ${protectedEndpoints}\n
\n
\n
\n
Categories
\n
\n ${categories.length}\n
\n
\n
\n
Undocumented
\n
\n 0 ? 'text-zinc-400 dark:text-zinc-500' : 'text-lime-600 dark:text-lime-400'}\">${undocumentedCount}\n
\n
\n
\n\n \n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n \n \n ${categories.map(category => {\n const info = CATEGORY_INFO[category]\n const title = info ? info.title : category\n return ``\n }).join('\\n ')}\n \n \n \n \n
\n
\n
\n
\n
\n\n \n
\n ${Object.entries(endpointsByCategory).map(([category, endpoints]) => {\n const info = CATEGORY_INFO[category] || { title: category, description: '', icon: '📋' }\n return `\n
\n
\n \n
\n
\n ${info.icon}\n
\n

${info.title}

\n

${info.description}

\n
\n
\n \n ${endpoints.length} endpoint${endpoints.length !== 1 ? 's' : ''}\n \n
\n
\n
\n\n \n
\n ${endpoints.map(endpoint => `\n
\n
\n \n ${endpoint.method}\n \n
\n
\n ${endpoint.path}\n ${renderAuthBadge(endpoint.authentication)}\n ${endpoint.documented === false ? `\n \n Auto-discovered\n \n ` : ''}\n
\n

${endpoint.description || 'No description available'}

\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n }).join('')}\n
\n\n \n
\n \n \n \n

No endpoints found

\n

Try adjusting your search or filter criteria

\n
\n
\n\n \n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'API Reference',\n pageTitle: 'API Reference',\n currentPath: '/admin/api-reference',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","/**\n * Admin API Reference Routes\n *\n * Provides the API Reference page for the admin dashboard.\n * Uses auto-discovery via Hono's inspectRoutes() to always show\n * the complete list of registered API endpoints.\n */\n\nimport { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderAPIReferencePage,\n type APIReferencePageData\n} from '../templates/pages/admin-api-reference.template'\nimport { getCoreVersion } from '../utils/version'\nimport { buildRouteList, getAppInstance } from '../services/route-metadata'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin/api-reference - API Reference Page\n *\n * Auto-discovers all registered routes using Hono's inspectRoutes()\n * and enriches them with metadata from the route-metadata registry.\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const app = getAppInstance()\n const endpoints = buildRouteList(app)\n\n const pageData: APIReferencePageData = {\n endpoints,\n user: user ? {\n name: user.email.split('@')[0] || user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n } catch (error) {\n console.error('API Reference page error:', error)\n\n const pageData: APIReferencePageData = {\n endpoints: [],\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n }\n})\n\nexport { router as adminApiReferenceRoutes }\n","/**\n * Routes Module Exports\n *\n * Routes are being migrated incrementally from the monolith.\n * Each route is refactored to remove monolith-specific dependencies.\n */\n\n// API routes\nexport { default as apiRoutes } from './api'\nexport { default as apiContentCrudRoutes } from './api-content-crud'\nexport { default as apiMediaRoutes } from './api-media'\nexport { default as apiSystemRoutes } from './api-system'\nexport { default as adminApiRoutes } from './admin-api'\n\n// Auth routes\nexport { default as authRoutes } from './auth'\n\n// Test routes (only for development/test environments)\nexport { default as testCleanupRoutes } from './test-cleanup'\n\n// Admin UI routes\nexport { default as adminContentRoutes } from './admin-content'\nexport { userRoutes as adminUsersRoutes } from './admin-users'\nexport { adminMediaRoutes } from './admin-media'\nexport { adminPluginRoutes } from './admin-plugins'\nexport { adminLogsRoutes } from './admin-logs'\nexport { adminDesignRoutes } from './admin-design'\nexport { adminCheckboxRoutes } from './admin-checkboxes'\nexport { default as adminTestimonialsRoutes } from './admin-testimonials'\nexport { default as adminCodeExamplesRoutes } from './admin-code-examples'\nexport { adminDashboardRoutes } from './admin-dashboard'\nexport { adminCollectionsRoutes } from './admin-collections'\nexport { adminSettingsRoutes } from './admin-settings'\nexport { adminFormsRoutes } from './admin-forms'\nexport { default as publicFormsRoutes } from './public-forms'\nexport { adminApiReferenceRoutes } from './admin-api-reference'\n\nexport const ROUTES_INFO = {\n message: 'Core routes available',\n available: [\n 'apiRoutes',\n 'apiContentCrudRoutes',\n 'apiMediaRoutes',\n 'apiSystemRoutes',\n 'adminApiRoutes',\n 'authRoutes',\n 'testCleanupRoutes',\n 'adminContentRoutes',\n 'adminUsersRoutes',\n 'adminMediaRoutes',\n 'adminPluginRoutes',\n 'adminLogsRoutes',\n 'adminDesignRoutes',\n 'adminCheckboxRoutes',\n 'adminTestimonialsRoutes',\n 'adminCodeExamplesRoutes',\n 'adminDashboardRoutes',\n 'adminCollectionsRoutes',\n 'adminSettingsRoutes',\n 'adminFormsRoutes',\n 'publicFormsRoutes',\n 'adminApiReferenceRoutes'\n ],\n status: 'Core package routes ready',\n reference: 'https://github.com/sonicjs/sonicjs'\n} as const\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-NGTBJJXZ.js.map b/packages/core/dist/chunk-NGTBJJXZ.js.map deleted file mode 100644 index 412ad83b5..000000000 --- a/packages/core/dist/chunk-NGTBJJXZ.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../../../../node_modules/semver/internal/constants.js","../../../../../node_modules/semver/internal/debug.js","../../../../../node_modules/semver/internal/re.js","../../../../../node_modules/semver/internal/parse-options.js","../../../../../node_modules/semver/internal/identifiers.js","../../../../../node_modules/semver/classes/semver.js","../../../../../node_modules/semver/functions/parse.js","../../../../../node_modules/semver/functions/valid.js","../../../../../node_modules/semver/functions/clean.js","../../../../../node_modules/semver/functions/inc.js","../../../../../node_modules/semver/functions/diff.js","../../../../../node_modules/semver/functions/major.js","../../../../../node_modules/semver/functions/minor.js","../../../../../node_modules/semver/functions/patch.js","../../../../../node_modules/semver/functions/prerelease.js","../../../../../node_modules/semver/functions/compare.js","../../../../../node_modules/semver/functions/rcompare.js","../../../../../node_modules/semver/functions/compare-loose.js","../../../../../node_modules/semver/functions/compare-build.js","../../../../../node_modules/semver/functions/sort.js","../../../../../node_modules/semver/functions/rsort.js","../../../../../node_modules/semver/functions/gt.js","../../../../../node_modules/semver/functions/lt.js","../../../../../node_modules/semver/functions/eq.js","../../../../../node_modules/semver/functions/neq.js","../../../../../node_modules/semver/functions/gte.js","../../../../../node_modules/semver/functions/lte.js","../../../../../node_modules/semver/functions/cmp.js","../../../../../node_modules/semver/functions/coerce.js","../../../../../node_modules/semver/internal/lrucache.js","../../../../../node_modules/semver/classes/range.js","../../../../../node_modules/semver/classes/comparator.js","../../../../../node_modules/semver/functions/satisfies.js","../../../../../node_modules/semver/ranges/to-comparators.js","../../../../../node_modules/semver/ranges/max-satisfying.js","../../../../../node_modules/semver/ranges/min-satisfying.js","../../../../../node_modules/semver/ranges/min-version.js","../../../../../node_modules/semver/ranges/valid.js","../../../../../node_modules/semver/ranges/outside.js","../../../../../node_modules/semver/ranges/gtr.js","../../../../../node_modules/semver/ranges/ltr.js","../../../../../node_modules/semver/ranges/intersects.js","../../../../../node_modules/semver/ranges/simplify.js","../../../../../node_modules/semver/ranges/subset.js","../../../../../node_modules/semver/index.js","../src/plugins/hook-system.ts","../src/plugins/plugin-validator.ts","../src/plugins/plugin-registry.ts","../src/plugins/plugin-manager.ts","../src/plugins/core-plugins/turnstile-plugin/middleware/verify.ts","../src/plugins/core-plugins/turnstile-plugin/index.ts"],"names":["exports","z","require_valid","require_semver","semver"],"mappings":"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","file":"chunk-NGTBJJXZ.js","sourcesContent":["'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a === b ? 0 : a < b ? -1 : 1\n }\n\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n if (this.major < other.major) {\n return -1\n }\n if (this.major > other.major) {\n return 1\n }\n if (this.minor < other.minor) {\n return -1\n }\n if (this.minor > other.minor) {\n return 1\n }\n if (this.patch < other.patch) {\n return -1\n }\n if (this.patch > other.patch) {\n return 1\n }\n return 0\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n comp = comp.replace(re[t.BUILD], '')\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","/**\n * Hook System Implementation\n * \n * Provides event-driven extensibility for plugins\n */\n\nimport { HookSystem, HookHandler, PluginHook, HookContext } from '../types'\n\nexport class HookSystemImpl implements HookSystem {\n private hooks: Map = new Map()\n private executing: Set = new Set()\n\n /**\n * Register a hook handler\n */\n register(hookName: string, handler: HookHandler, priority: number = 10): void {\n if (!this.hooks.has(hookName)) {\n this.hooks.set(hookName, [])\n }\n\n const hooks = this.hooks.get(hookName)!\n const hook: PluginHook = {\n name: hookName,\n handler,\n priority,\n }\n\n // Insert hook in priority order (lower priority = earlier execution)\n const insertIndex = hooks.findIndex(h => h.priority! > priority)\n if (insertIndex === -1) {\n hooks.push(hook)\n } else {\n hooks.splice(insertIndex, 0, hook)\n }\n\n console.debug(`Hook registered: ${hookName} (priority: ${priority})`)\n }\n\n /**\n * Execute all handlers for a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n const hooks = this.hooks.get(hookName)\n if (!hooks || hooks.length === 0) {\n return data\n }\n\n // Prevent infinite recursion\n if (this.executing.has(hookName)) {\n console.warn(`Hook recursion detected for: ${hookName}`)\n return data\n }\n\n this.executing.add(hookName)\n\n try {\n let result = data\n let cancelled = false\n\n const hookContext: HookContext = {\n plugin: '', // Will be set by the plugin manager\n context: context || {},\n cancel: () => { cancelled = true }\n }\n\n for (const hook of hooks) {\n if (cancelled) {\n console.debug(`Hook execution cancelled: ${hookName}`)\n break\n }\n\n try {\n console.debug(`Executing hook: ${hookName} (priority: ${hook.priority})`)\n result = await hook.handler(result, hookContext)\n } catch (error) {\n console.error(`Hook execution failed: ${hookName}`, error)\n // Continue executing other hooks unless it's a critical error\n if (error instanceof Error && error.message.includes('CRITICAL')) {\n throw error\n }\n }\n }\n\n return result\n } finally {\n this.executing.delete(hookName)\n }\n }\n\n /**\n * Remove a hook handler\n */\n unregister(hookName: string, handler: HookHandler): void {\n const hooks = this.hooks.get(hookName)\n if (!hooks) return\n\n const index = hooks.findIndex(h => h.handler === handler)\n if (index !== -1) {\n hooks.splice(index, 1)\n console.debug(`Hook unregistered: ${hookName}`)\n }\n\n // Clean up empty hook arrays\n if (hooks.length === 0) {\n this.hooks.delete(hookName)\n }\n }\n\n /**\n * Get all registered hooks for a name\n */\n getHooks(hookName: string): PluginHook[] {\n return this.hooks.get(hookName) || []\n }\n\n /**\n * Get all registered hook names\n */\n getHookNames(): string[] {\n return Array.from(this.hooks.keys())\n }\n\n /**\n * Get hook statistics\n */\n getStats(): { hookName: string; handlerCount: number }[] {\n return Array.from(this.hooks.entries()).map(([hookName, handlers]) => ({\n hookName,\n handlerCount: handlers.length\n }))\n }\n\n /**\n * Clear all hooks (useful for testing)\n */\n clear(): void {\n this.hooks.clear()\n this.executing.clear()\n }\n\n /**\n * Create a scoped hook system for a plugin\n */\n createScope(_pluginName: string): ScopedHookSystem {\n return new ScopedHookSystem(this)\n }\n}\n\n/**\n * Scoped hook system for individual plugins\n */\nexport class ScopedHookSystem {\n private registeredHooks: { hookName: string; handler: HookHandler }[] = []\n\n constructor(\n private parent: HookSystemImpl\n ) {}\n\n /**\n * Register a hook (scoped to this plugin)\n */\n register(hookName: string, handler: HookHandler, priority?: number): void {\n this.parent.register(hookName, handler, priority)\n this.registeredHooks.push({ hookName, handler })\n }\n\n /**\n * Execute a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n return this.parent.execute(hookName, data, context)\n }\n\n /**\n * Unregister a specific hook\n */\n unregister(hookName: string, handler: HookHandler): void {\n this.parent.unregister(hookName, handler)\n const index = this.registeredHooks.findIndex(\n h => h.hookName === hookName && h.handler === handler\n )\n if (index !== -1) {\n this.registeredHooks.splice(index, 1)\n }\n }\n\n /**\n * Unregister all hooks for this plugin\n */\n unregisterAll(): void {\n for (const { hookName, handler } of this.registeredHooks) {\n this.parent.unregister(hookName, handler)\n }\n this.registeredHooks.length = 0\n }\n\n /**\n * Get hooks registered by this plugin\n */\n getRegisteredHooks(): { hookName: string; handler: HookHandler }[] {\n return [...this.registeredHooks]\n }\n}\n\n/**\n * Hook utilities\n */\nexport class HookUtils {\n /**\n * Create a hook name with namespace\n */\n static createHookName(namespace: string, event: string): string {\n return `${namespace}:${event}`\n }\n\n /**\n * Parse a hook name to extract namespace and event\n */\n static parseHookName(hookName: string): { namespace: string; event: string } {\n const parts = hookName.split(':')\n return {\n namespace: parts[0] || '',\n event: parts.slice(1).join(':') || ''\n }\n }\n\n /**\n * Create a middleware that executes hooks\n */\n static createHookMiddleware(\n hookSystem: HookSystem,\n beforeHook?: string,\n afterHook?: string\n ) {\n return async (c: any, next: any) => {\n if (beforeHook) {\n const beforeData = { request: c.req, context: c }\n await hookSystem.execute(beforeHook, beforeData)\n }\n\n await next()\n\n if (afterHook) {\n const afterData = { request: c.req, response: c.res, context: c }\n await hookSystem.execute(afterHook, afterData)\n }\n }\n }\n\n /**\n * Create a debounced hook handler\n */\n static debounce(handler: HookHandler, delay: number): HookHandler {\n let timeoutId: any\n \n return async (data: any, context: HookContext) => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n return new Promise((resolve, reject) => {\n timeoutId = setTimeout(async () => {\n try {\n const result = await handler(data, context)\n resolve(result)\n } catch (error) {\n reject(error)\n }\n }, delay)\n })\n }\n }\n\n /**\n * Create a throttled hook handler\n */\n static throttle(handler: HookHandler, limit: number): HookHandler {\n let lastExecution = 0\n\n return async (data: any, context: HookContext) => {\n const now = Date.now()\n if (now - lastExecution >= limit) {\n lastExecution = now\n return handler(data, context)\n }\n return data\n }\n }\n}","/**\n * Plugin Validator\n * \n * Validates plugin definitions, dependencies, and compatibility\n */\n\nimport { z } from 'zod'\nimport { Plugin, PluginValidator as IPluginValidator, PluginValidationResult, PluginRegistry } from '../types'\nimport semver from 'semver'\n\n// Zod schemas for plugin validation\nconst PluginAuthorSchema = z.object({\n name: z.string().min(1),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n})\n\nconst PluginRoutesSchema = z.object({\n path: z.string().min(1),\n handler: z.any(), // Hono instance\n description: z.string().optional(),\n requiresAuth: z.boolean().optional(),\n roles: z.array(z.string()).optional(),\n priority: z.number().optional(),\n})\n\nconst PluginMiddlewareSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n description: z.string().optional(),\n priority: z.number().optional(),\n routes: z.array(z.string()).optional(),\n global: z.boolean().optional(),\n})\n\nconst PluginModelSchema = z.object({\n name: z.string().min(1),\n tableName: z.string().min(1),\n schema: z.any(), // Zod schema\n migrations: z.array(z.string()),\n relationships: z.array(z.object({\n type: z.enum(['oneToOne', 'oneToMany', 'manyToMany']),\n target: z.string(),\n foreignKey: z.string().optional(),\n joinTable: z.string().optional(),\n })).optional(),\n extendsContent: z.boolean().optional(),\n})\n\nconst PluginServiceSchema = z.object({\n name: z.string().min(1),\n implementation: z.any(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n singleton: z.boolean().optional(),\n})\n\nconst PluginAdminPageSchema = z.object({\n path: z.string().min(1),\n title: z.string().min(1),\n component: z.string().min(1),\n description: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n menuItem: z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n }).optional(),\n icon: z.string().optional(),\n})\n\nconst PluginComponentSchema = z.object({\n name: z.string().min(1),\n template: z.function(),\n description: z.string().optional(),\n propsSchema: z.any().optional(), // Zod schema\n})\n\nconst PluginHookSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n priority: z.number().optional(),\n description: z.string().optional(),\n})\n\nconst PluginSchema = z.object({\n name: z.string().min(1).regex(/^[a-z0-9-]+$/, 'Plugin name must be lowercase with hyphens'),\n version: z.string().refine(v => semver.valid(v), 'Version must be valid semver'),\n description: z.string().optional(),\n author: PluginAuthorSchema.optional(),\n dependencies: z.array(z.string()).optional(),\n compatibility: z.string().optional(),\n license: z.string().optional(),\n \n // Extension points\n routes: z.array(PluginRoutesSchema).optional(),\n middleware: z.array(PluginMiddlewareSchema).optional(),\n models: z.array(PluginModelSchema).optional(),\n services: z.array(PluginServiceSchema).optional(),\n adminPages: z.array(PluginAdminPageSchema).optional(),\n adminComponents: z.array(PluginComponentSchema).optional(),\n menuItems: z.array(z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n })).optional(),\n hooks: z.array(PluginHookSchema).optional(),\n \n // Lifecycle hooks\n install: z.function().optional(),\n uninstall: z.function().optional(),\n activate: z.function().optional(),\n deactivate: z.function().optional(),\n configure: z.function().optional(),\n})\n\nexport class PluginValidator implements IPluginValidator {\n private static readonly RESERVED_NAMES = [\n 'core', 'system', 'admin', 'api', 'auth', 'content', 'media', 'users', 'collections'\n ]\n\n private static readonly RESERVED_PATHS = [\n '/admin', '/api', '/auth', '/docs', '/media', '/_assets'\n ]\n\n /**\n * Validate plugin definition\n */\n validate(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n try {\n // Schema validation\n const result = PluginSchema.safeParse(plugin)\n if (!result.success) {\n result.error.issues.forEach((err: any) => {\n errors.push(`${err.path.join('.')}: ${err.message}`)\n })\n }\n\n // Reserved name validation\n if (PluginValidator.RESERVED_NAMES.includes(plugin.name)) {\n errors.push(`Plugin name \"${plugin.name}\" is reserved`)\n }\n\n // Route path validation\n if (plugin.routes) {\n for (const route of plugin.routes) {\n if (PluginValidator.RESERVED_PATHS.some(path => route.path.startsWith(path))) {\n errors.push(`Route path \"${route.path}\" conflicts with reserved system path`)\n }\n \n if (!route.path.startsWith('/')) {\n errors.push(`Route path \"${route.path}\" must start with /`)\n }\n }\n }\n\n // Model validation\n if (plugin.models) {\n const modelNames = new Set()\n const tableNames = new Set()\n \n for (const model of plugin.models) {\n // Check for duplicate model names\n if (modelNames.has(model.name)) {\n errors.push(`Duplicate model name: ${model.name}`)\n }\n modelNames.add(model.name)\n \n // Check for duplicate table names\n if (tableNames.has(model.tableName)) {\n errors.push(`Duplicate table name: ${model.tableName}`)\n }\n tableNames.add(model.tableName)\n \n // Validate table name format\n if (!/^[a-z][a-z0-9_]*$/.test(model.tableName)) {\n errors.push(`Invalid table name format: ${model.tableName}`)\n }\n \n // Check for system table conflicts\n const systemTables = ['users', 'collections', 'content', 'content_versions', 'media', 'api_tokens']\n if (systemTables.includes(model.tableName)) {\n errors.push(`Table name \"${model.tableName}\" conflicts with system table`)\n }\n }\n }\n\n // Service validation\n if (plugin.services) {\n const serviceNames = new Set()\n \n for (const service of plugin.services) {\n if (serviceNames.has(service.name)) {\n errors.push(`Duplicate service name: ${service.name}`)\n }\n serviceNames.add(service.name)\n \n // Check for system service conflicts\n const systemServices = ['auth', 'content', 'media', 'cdn']\n if (systemServices.includes(service.name)) {\n warnings.push(`Service name \"${service.name}\" conflicts with system service`)\n }\n }\n }\n\n // Admin page validation\n if (plugin.adminPages) {\n const pagePaths = new Set()\n \n for (const page of plugin.adminPages) {\n if (pagePaths.has(page.path)) {\n errors.push(`Duplicate admin page path: ${page.path}`)\n }\n pagePaths.add(page.path)\n \n if (!page.path.startsWith('/')) {\n errors.push(`Admin page path \"${page.path}\" must start with /`)\n }\n \n // Check for system admin page conflicts\n const systemPaths = ['/', '/collections', '/content', '/media', '/users', '/settings']\n if (systemPaths.includes(page.path)) {\n errors.push(`Admin page path \"${page.path}\" conflicts with system page`)\n }\n }\n }\n\n // Component validation\n if (plugin.adminComponents) {\n const componentNames = new Set()\n \n for (const component of plugin.adminComponents) {\n if (componentNames.has(component.name)) {\n errors.push(`Duplicate component name: ${component.name}`)\n }\n componentNames.add(component.name)\n \n // Check for system component conflicts\n const systemComponents = ['table', 'form', 'alert', 'media-grid', 'pagination']\n if (systemComponents.includes(component.name)) {\n warnings.push(`Component name \"${component.name}\" conflicts with system component`)\n }\n }\n }\n\n // Hook validation\n if (plugin.hooks) {\n for (const hook of plugin.hooks) {\n if (!hook.name.includes(':')) {\n warnings.push(`Hook name \"${hook.name}\" should include namespace (e.g., \"plugin:event\")`)\n }\n }\n }\n\n // Dependency cycle detection (basic)\n if (plugin.dependencies?.includes(plugin.name)) {\n errors.push(`Plugin cannot depend on itself`)\n }\n\n // License validation\n if (plugin.license) {\n const validLicenses = ['MIT', 'Apache-2.0', 'GPL-3.0', 'BSD-3-Clause', 'ISC']\n if (!validLicenses.includes(plugin.license)) {\n warnings.push(`License \"${plugin.license}\" is not a common SPDX identifier`)\n }\n }\n\n // Performance warnings\n if (plugin.middleware && plugin.middleware.length > 5) {\n warnings.push(`Plugin defines ${plugin.middleware.length} middleware functions, consider consolidating`)\n }\n\n if (plugin.hooks && plugin.hooks.length > 10) {\n warnings.push(`Plugin defines ${plugin.hooks.length} hooks, ensure they are necessary`)\n }\n\n } catch (error) {\n errors.push(`Validation error: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin dependencies\n */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.dependencies || plugin.dependencies.length === 0) {\n return { valid: true, errors, warnings }\n }\n\n // Check if all dependencies are registered\n for (const depName of plugin.dependencies) {\n if (!registry.has(depName)) {\n errors.push(`Dependency \"${depName}\" is not registered`)\n continue\n }\n\n const dependency = registry.get(depName)!\n \n // Check dependency version compatibility\n if (dependency.compatibility && plugin.compatibility) {\n if (!this.isCompatible(dependency.compatibility, plugin.compatibility)) {\n warnings.push(`Potential compatibility issue with dependency \"${depName}\"`)\n }\n }\n }\n\n // Check for circular dependencies\n const visited = new Set()\n const visiting = new Set()\n \n const checkCircular = (name: string): boolean => {\n if (visiting.has(name)) return true\n if (visited.has(name)) return false\n \n visiting.add(name)\n \n const current = registry.get(name)\n if (current?.dependencies) {\n for (const depName of current.dependencies) {\n if (checkCircular(depName)) {\n errors.push(`Circular dependency detected: ${name} -> ${depName}`)\n return true\n }\n }\n }\n \n visiting.delete(name)\n visited.add(name)\n return false\n }\n\n checkCircular(plugin.name)\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin compatibility with SonicJS version\n */\n validateCompatibility(plugin: Plugin, sonicVersion: string): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.compatibility) {\n warnings.push('Plugin does not specify compatibility version')\n return { valid: true, errors, warnings }\n }\n\n try {\n if (!semver.satisfies(sonicVersion, plugin.compatibility)) {\n errors.push(`Plugin requires SonicJS ${plugin.compatibility}, but current version is ${sonicVersion}`)\n }\n } catch (error) {\n errors.push(`Invalid compatibility version format: ${plugin.compatibility}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Check if two version ranges are compatible\n */\n private isCompatible(version1: string, version2: string): boolean {\n try {\n // Simple compatibility check - can be enhanced\n return semver.intersects(version1, version2)\n } catch {\n return false\n }\n }\n\n /**\n * Validate plugin security constraints\n */\n validateSecurity(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n // Check for potentially dangerous patterns\n const pluginCode = JSON.stringify(plugin)\n \n // Check for eval or Function constructor usage\n if (pluginCode.includes('eval(') || pluginCode.includes('Function(')) {\n errors.push('Plugin contains potentially dangerous code execution patterns')\n }\n\n // Check for file system access attempts\n if (pluginCode.includes('fs.') || pluginCode.includes('require(')) {\n warnings.push('Plugin may attempt file system access (not available in Cloudflare Workers)')\n }\n\n // Check for network access patterns\n if (pluginCode.includes('fetch(') || pluginCode.includes('XMLHttpRequest')) {\n warnings.push('Plugin contains network access code - ensure it follows security guidelines')\n }\n\n // Check for sensitive data patterns\n const sensitivePatterns = ['password', 'secret', 'key', 'token', 'credential']\n for (const pattern of sensitivePatterns) {\n if (pluginCode.toLowerCase().includes(pattern)) {\n warnings.push(`Plugin code contains \"${pattern}\" - ensure sensitive data is properly handled`)\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n}","/**\n * Plugin Registry Implementation\n * \n * Manages plugin registration, activation, and lifecycle\n */\n\nimport { Plugin, PluginRegistry, PluginConfig, PluginStatus } from '../types'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginRegistryImpl implements PluginRegistry {\n private plugins: Map = new Map()\n private configs: Map = new Map()\n private statuses: Map = new Map()\n private validator: PluginValidator\n\n constructor(validator?: PluginValidator) {\n this.validator = validator || new PluginValidator()\n }\n\n /**\n * Get plugin by name\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name)\n }\n\n /**\n * Get all registered plugins\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values())\n }\n\n /**\n * Get active plugins\n */\n getActive(): Plugin[] {\n return this.getAll().filter(plugin => {\n const status = this.statuses.get(plugin.name)\n return status?.active === true\n })\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise {\n console.info(`Registering plugin: ${plugin.name} v${plugin.version}`)\n\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed for ${plugin.name}: ${validation.errors.join(', ')}`)\n }\n\n // Check for conflicts\n if (this.plugins.has(plugin.name)) {\n const existingPlugin = this.plugins.get(plugin.name)!\n if (existingPlugin.version !== plugin.version) {\n console.warn(`Plugin ${plugin.name} is already registered with version ${existingPlugin.version}, replacing with ${plugin.version}`)\n }\n }\n\n // Validate dependencies\n const depValidation = this.validator.validateDependencies(plugin, this)\n if (!depValidation.valid) {\n throw new Error(`Plugin dependency validation failed for ${plugin.name}: ${depValidation.errors.join(', ')}`)\n }\n\n // Register plugin\n this.plugins.set(plugin.name, plugin)\n \n // Initialize status\n this.statuses.set(plugin.name, {\n name: plugin.name,\n version: plugin.version,\n active: false,\n installed: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin registered successfully: ${plugin.name}`)\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise {\n console.info(`Unregistering plugin: ${name}`)\n\n if (!this.plugins.has(name)) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n // Check if other plugins depend on this one\n const dependents = this.getDependents(name)\n if (dependents.length > 0) {\n throw new Error(`Cannot unregister ${name}: plugins ${dependents.join(', ')} depend on it`)\n }\n\n // Remove plugin\n this.plugins.delete(name)\n this.configs.delete(name)\n this.statuses.delete(name)\n\n console.info(`Plugin unregistered: ${name}`)\n }\n\n /**\n * Check if plugin is registered\n */\n has(name: string): boolean {\n return this.plugins.has(name)\n }\n\n /**\n * Activate a plugin\n */\n async activate(name: string): Promise {\n console.info(`Activating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (status?.active) {\n console.warn(`Plugin ${name} is already active`)\n return\n }\n\n try {\n // Activate dependencies first\n if (plugin.dependencies) {\n for (const depName of plugin.dependencies) {\n const depStatus = this.statuses.get(depName)\n if (!depStatus?.active) {\n await this.activate(depName)\n }\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin activated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n active: false,\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to activate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Deactivate a plugin\n */\n async deactivate(name: string): Promise {\n console.info(`Deactivating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (!status?.active) {\n console.warn(`Plugin ${name} is not active`)\n return\n }\n\n try {\n // Deactivate dependents first\n const dependents = this.getDependents(name)\n for (const depName of dependents) {\n const depStatus = this.statuses.get(depName)\n if (depStatus?.active) {\n await this.deactivate(depName)\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: false,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin deactivated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to deactivate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Get plugin configuration\n */\n getConfig(name: string): PluginConfig | undefined {\n return this.configs.get(name)\n }\n\n /**\n * Set plugin configuration\n */\n setConfig(name: string, config: PluginConfig): void {\n this.configs.set(name, {\n ...config,\n updatedAt: Date.now()\n })\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus | undefined {\n return this.statuses.get(name)\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): Map {\n return new Map(this.statuses)\n }\n\n /**\n * Update plugin status\n */\n private updateStatus(name: string, updates: Partial): void {\n const current = this.statuses.get(name)\n if (current) {\n this.statuses.set(name, { ...current, ...updates })\n }\n }\n\n /**\n * Get plugins that depend on the specified plugin\n */\n private getDependents(name: string): string[] {\n const dependents: string[] = []\n \n for (const [pluginName, plugin] of this.plugins) {\n if (plugin.dependencies?.includes(name)) {\n dependents.push(pluginName)\n }\n }\n \n return dependents\n }\n\n /**\n * Get dependency graph\n */\n getDependencyGraph(): Map {\n const graph = new Map()\n \n for (const [name, plugin] of this.plugins) {\n graph.set(name, plugin.dependencies || [])\n }\n \n return graph\n }\n\n /**\n * Resolve plugin load order based on dependencies\n */\n resolveLoadOrder(): string[] {\n const graph = this.getDependencyGraph()\n const visited = new Set()\n const visiting = new Set()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected involving plugin: ${name}`)\n }\n\n visiting.add(name)\n \n const dependencies = graph.get(name) || []\n for (const dep of dependencies) {\n if (!graph.has(dep)) {\n throw new Error(`Plugin ${name} depends on ${dep}, but ${dep} is not registered`)\n }\n visit(dep)\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n for (const name of graph.keys()) {\n visit(name)\n }\n\n return result\n }\n\n /**\n * Export plugin configuration\n */\n exportConfig(): { plugins: PluginConfig[] } {\n const plugins: PluginConfig[] = []\n \n for (const [name, config] of this.configs) {\n plugins.push({\n ...config,\n name\n } as PluginConfig & { name: string })\n }\n \n return { plugins }\n }\n\n /**\n * Import plugin configuration\n */\n importConfig(config: { plugins: PluginConfig[] }): void {\n for (const pluginConfig of config.plugins) {\n if ('name' in pluginConfig) {\n const { name, ...rest } = pluginConfig as PluginConfig & { name: string }\n this.setConfig(name, rest)\n }\n }\n }\n\n /**\n * Clear all plugins (useful for testing)\n */\n clear(): void {\n this.plugins.clear()\n this.configs.clear()\n this.statuses.clear()\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n total: number\n active: number\n inactive: number\n withErrors: number\n } {\n const statuses = Array.from(this.statuses.values())\n \n return {\n total: statuses.length,\n active: statuses.filter(s => s.active).length,\n inactive: statuses.filter(s => !s.active).length,\n withErrors: statuses.filter(s => s.hasErrors).length\n }\n }\n}","/**\n * Plugin Manager\n * \n * Central orchestrator for the plugin system\n */\n\nimport { Hono } from 'hono'\nimport { Plugin, PluginManager as IPluginManager, PluginRegistry, PluginConfig, PluginContext, PluginStatus, HookSystem, PluginLogger, HOOKS } from '../types'\nimport { PluginRegistryImpl } from './plugin-registry'\nimport { HookSystemImpl, ScopedHookSystem } from './hook-system'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginManager implements IPluginManager {\n public readonly registry: PluginRegistry\n public readonly hooks: HookSystem\n private validator: PluginValidator\n private context?: PluginContext\n private scopedHooks: Map = new Map()\n private pluginRoutes: Map = new Map()\n\n constructor() {\n this.validator = new PluginValidator()\n this.registry = new PluginRegistryImpl(this.validator)\n this.hooks = new HookSystemImpl()\n }\n\n /**\n * Initialize plugin system\n */\n async initialize(context: PluginContext): Promise {\n console.info('Initializing plugin system...')\n \n this.context = context\n \n // Execute app init hook\n await this.hooks.execute(HOOKS.APP_INIT, {\n pluginManager: this,\n context\n })\n\n console.info('Plugin system initialized')\n }\n\n /**\n * Load plugins from configuration\n */\n async loadPlugins(configs: PluginConfig[]): Promise {\n console.info(`Loading ${configs.length} plugins...`)\n\n // Filter enabled plugins\n const enabledConfigs = configs.filter(config => config.enabled)\n \n if (enabledConfigs.length === 0) {\n console.info('No enabled plugins to load')\n return\n }\n\n // Load and register plugins (implementation would depend on how plugins are distributed)\n for (const config of enabledConfigs) {\n try {\n // In a real implementation, this would load the plugin from a registry or file system\n // For now, we'll assume plugins are already imported\n console.info(`Loading plugin configuration: ${JSON.stringify(config)}`)\n \n // Store configuration\n if ('name' in config) {\n this.registry.setConfig(config.name as string, config)\n }\n } catch (error) {\n console.error(`Failed to load plugin configuration:`, error)\n }\n }\n\n // Resolve load order based on dependencies\n try {\n const loadOrder = this.registry.resolveLoadOrder()\n console.info(`Plugin load order: ${loadOrder.join(' -> ')}`)\n\n // Activate plugins in dependency order\n for (const pluginName of loadOrder) {\n const config = this.registry.getConfig(pluginName)\n if (config?.enabled) {\n await this.registry.activate(pluginName)\n }\n }\n } catch (error) {\n console.error('Failed to resolve plugin load order:', error)\n }\n\n console.info('Plugin loading completed')\n }\n\n /**\n * Install a plugin\n */\n async install(plugin: Plugin, config?: PluginConfig): Promise {\n console.info(`Installing plugin: ${plugin.name}`)\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed: ${validation.errors.join(', ')}`)\n }\n\n // Register plugin\n await this.registry.register(plugin)\n\n // Set configuration\n const pluginConfig: PluginConfig = {\n enabled: true,\n installedAt: Date.now(),\n ...config\n }\n this.registry.setConfig(plugin.name, pluginConfig)\n\n // Create scoped hook system for plugin\n const scopedHooks = this.hooks.createScope ? \n (this.hooks as HookSystemImpl).createScope(plugin.name) : \n this.hooks\n\n this.scopedHooks.set(plugin.name, scopedHooks as ScopedHookSystem)\n\n // Create plugin context\n const pluginContext: PluginContext = {\n ...this.context,\n config: pluginConfig,\n hooks: scopedHooks,\n logger: this.createLogger(plugin.name)\n }\n\n // Register plugin extensions\n await this.registerPluginExtensions(plugin, pluginContext)\n\n // Run plugin install hook\n if (plugin.install) {\n await plugin.install(pluginContext)\n }\n\n // Execute plugin install hook\n await this.hooks.execute(HOOKS.PLUGIN_INSTALL, {\n plugin: plugin.name,\n version: plugin.version,\n context: pluginContext\n })\n\n console.info(`Plugin installed successfully: ${plugin.name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to install plugin ${plugin.name}:`, errorMessage)\n \n // Update status with error\n const status = this.registry.getStatus(plugin.name)\n if (status) {\n this.updatePluginStatus(plugin.name, {\n hasErrors: true,\n errors: [...(status.errors || []), errorMessage],\n lastError: errorMessage\n })\n }\n \n throw error\n }\n }\n\n /**\n * Uninstall a plugin\n */\n async uninstall(name: string): Promise {\n console.info(`Uninstalling plugin: ${name}`)\n\n const plugin = this.registry.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Deactivate plugin first\n const status = this.registry.getStatus(name)\n if (status?.active) {\n await this.registry.deactivate(name)\n }\n\n // Create plugin context\n const config = this.registry.getConfig(name) || { enabled: false }\n const pluginContext: PluginContext = {\n ...this.context,\n config,\n hooks: this.scopedHooks.get(name) || this.hooks,\n logger: this.createLogger(name)\n }\n\n // Run plugin uninstall hook\n if (plugin.uninstall) {\n await plugin.uninstall(pluginContext)\n }\n\n // Unregister plugin extensions\n await this.unregisterPluginExtensions(plugin)\n\n // Clean up scoped hooks\n const scopedHooks = this.scopedHooks.get(name)\n if (scopedHooks && 'unregisterAll' in scopedHooks) {\n scopedHooks.unregisterAll()\n }\n this.scopedHooks.delete(name)\n\n // Remove plugin routes\n this.pluginRoutes.delete(name)\n\n // Execute plugin uninstall hook\n await this.hooks.execute(HOOKS.PLUGIN_UNINSTALL, {\n plugin: name,\n context: pluginContext\n })\n\n // Unregister plugin\n await this.registry.unregister(name)\n\n console.info(`Plugin uninstalled successfully: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to uninstall plugin ${name}:`, errorMessage)\n throw error\n }\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus {\n const status = this.registry.getStatus(name)\n if (!status) {\n return {\n name,\n version: 'unknown',\n active: false,\n installed: false,\n hasErrors: false\n }\n }\n return status\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): PluginStatus[] {\n return Array.from(this.registry.getAllStatuses().values())\n }\n\n /**\n * Register plugin extensions (routes, middleware, etc.)\n */\n private async registerPluginExtensions(plugin: Plugin, _context: PluginContext): Promise {\n // Register routes\n if (plugin.routes) {\n const pluginApp = new Hono()\n \n for (const route of plugin.routes) {\n console.debug(`Registering plugin route: ${route.path}`)\n pluginApp.route(route.path, route.handler)\n }\n \n this.pluginRoutes.set(plugin.name, pluginApp)\n }\n\n // Register middleware\n if (plugin.middleware) {\n for (const middleware of plugin.middleware) {\n console.debug(`Registering plugin middleware: ${middleware.name}`)\n // Middleware registration would be handled by the main app\n }\n }\n\n // Register hooks\n if (plugin.hooks) {\n const scopedHooks = this.scopedHooks.get(plugin.name)\n for (const hook of plugin.hooks) {\n console.debug(`Registering plugin hook: ${hook.name}`)\n if (scopedHooks) {\n scopedHooks.register(hook.name, hook.handler, hook.priority)\n } else {\n this.hooks.register(hook.name, hook.handler, hook.priority)\n }\n }\n }\n\n // Register services\n if (plugin.services) {\n for (const service of plugin.services) {\n console.debug(`Registering plugin service: ${service.name}`)\n // Service registration would be handled by a service container\n }\n }\n\n // Register database models\n if (plugin.models) {\n for (const model of plugin.models) {\n console.debug(`Registering plugin model: ${model.name}`)\n // Model registration would involve database migrations\n }\n }\n }\n\n /**\n * Unregister plugin extensions\n */\n private async unregisterPluginExtensions(plugin: Plugin): Promise {\n // Clean up is mostly handled by the scoped systems\n console.debug(`Unregistering extensions for plugin: ${plugin.name}`)\n }\n\n /**\n * Update plugin status\n */\n private updatePluginStatus(name: string, updates: Partial): void {\n const current = this.registry.getStatus(name)\n if (current && 'updateStatus' in this.registry) {\n // This would require extending the registry interface\n console.debug(`Updating status for plugin: ${name}`, updates)\n }\n }\n\n /**\n * Create a logger for a plugin\n */\n private createLogger(pluginName: string): PluginLogger {\n return {\n debug: (message: string, data?: any) => {\n console.debug(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n info: (message: string, data?: any) => {\n console.info(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n warn: (message: string, data?: any) => {\n console.warn(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n error: (message: string, error?: Error, data?: any) => {\n console.error(`[Plugin:${pluginName}] ${message}`, error || '', data || '')\n }\n }\n }\n\n /**\n * Get plugin routes for mounting in main app\n */\n getPluginRoutes(): Map {\n return new Map(this.pluginRoutes)\n }\n\n /**\n * Get plugin middleware for main app\n */\n getPluginMiddleware(): Array<{ name: string; handler: any; priority: number; global: boolean }> {\n const middleware: Array<{ name: string; handler: any; priority: number; global: boolean }> = []\n \n for (const plugin of this.registry.getActive()) {\n if (plugin.middleware) {\n for (const mw of plugin.middleware) {\n middleware.push({\n name: `${plugin.name}:${mw.name}`,\n handler: mw.handler,\n priority: mw.priority || 10,\n global: mw.global || false\n })\n }\n }\n }\n \n // Sort by priority\n return middleware.sort((a, b) => a.priority - b.priority)\n }\n\n /**\n * Execute shutdown procedures\n */\n async shutdown(): Promise {\n console.info('Shutting down plugin system...')\n \n // Execute app shutdown hook\n await this.hooks.execute(HOOKS.APP_SHUTDOWN, {\n pluginManager: this\n })\n\n // Deactivate all active plugins\n const activePlugins = this.registry.getActive()\n for (const plugin of activePlugins.reverse()) { // Reverse order\n try {\n await this.registry.deactivate(plugin.name)\n } catch (error) {\n console.error(`Error deactivating plugin ${plugin.name}:`, error)\n }\n }\n\n console.info('Plugin system shutdown completed')\n }\n\n /**\n * Get plugin system statistics\n */\n getStats(): {\n registry: ReturnType\n hooks: Array<{ hookName: string; handlerCount: number }>\n routes: number\n middleware: number\n } {\n return {\n registry: (this.registry as PluginRegistryImpl).getStats(),\n hooks: (this.hooks as HookSystemImpl).getStats(),\n routes: this.pluginRoutes.size,\n middleware: this.getPluginMiddleware().length\n }\n }\n}","import type { Context, Next } from 'hono'\nimport { TurnstileService } from '../services/turnstile'\n\n/**\n * Middleware to verify Turnstile token on form submissions\n * \n * Usage:\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Token already verified, process form...\n * })\n * ```\n */\nexport async function verifyTurnstile(c: Context, next: Next) {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n console.error('Turnstile middleware: Database not available')\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n\n // Check if Turnstile is enabled\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n // Turnstile not enabled, allow through\n return next()\n }\n\n // Get token from request\n let token: string | undefined\n let body: any\n\n if (c.req.method === 'POST') {\n const contentType = c.req.header('content-type') || ''\n \n if (contentType.includes('application/json')) {\n body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n }\n\n if (!token) {\n return c.json({ \n error: 'Turnstile token missing',\n message: 'Please complete the verification challenge'\n }, 400)\n }\n\n // Verify token\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return c.json({ \n error: 'Turnstile verification failed',\n message: result.error || 'Verification failed. Please try again.'\n }, 403)\n }\n\n // Verification successful, continue\n return next()\n}\n\n/**\n * Middleware factory that allows custom error handling\n */\nexport function createTurnstileMiddleware(options?: {\n onError?: (c: Context, error: string) => Response\n onMissing?: (c: Context) => Response\n}) {\n return async (c: Context, next: Next) => {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n return options?.onError?.(c, 'Database not available') || \n c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n return next()\n }\n\n let token: string | undefined\n const contentType = c.req.header('content-type') || ''\n\n if (contentType.includes('application/json')) {\n const body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n\n if (!token) {\n return options?.onMissing?.(c) ||\n c.json({ error: 'Turnstile token missing' }, 400)\n }\n\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return options?.onError?.(c, result.error || 'Verification failed') ||\n c.json({ error: 'Turnstile verification failed', message: result.error }, 403)\n }\n\n return next()\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { TurnstileService } from './services/turnstile'\nimport { verifyTurnstile } from './middleware/verify'\nimport manifest from './manifest.json'\n\n/**\n * Cloudflare Turnstile Plugin\n * \n * Provides CAPTCHA-free bot protection using Cloudflare Turnstile.\n * Can be used with any form by adding the verifyTurnstile middleware.\n * \n * Settings are managed through the generic admin plugin interface.\n * No custom routes needed - the admin system automatically handles settings.\n * \n * @example\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Process form after Turnstile verification\n * })\n * ```\n */\n\n// Build the plugin - no custom routes, generic admin handles settings\nexport const turnstilePlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('turnstile', TurnstileService)\n .addSingleMiddleware('verifyTurnstile', verifyTurnstile, {\n description: 'Verify Cloudflare Turnstile token',\n global: false,\n })\n .build()\n\n// Export service and middleware for easy import\nexport { TurnstileService } from './services/turnstile'\nexport { verifyTurnstile, createTurnstileMiddleware } from './middleware/verify'\nexport { renderTurnstileWidget, renderInlineTurnstile, getTurnstileScript, renderExplicitTurnstile } from './components/widget'\nexport type { TurnstileSettings, TurnstileVerificationResponse } from './services/turnstile'\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-CJOLOONT.js b/packages/core/dist/chunk-NJVY2U43.js similarity index 99% rename from packages/core/dist/chunk-CJOLOONT.js rename to packages/core/dist/chunk-NJVY2U43.js index 7d0024289..ba08251a6 100644 --- a/packages/core/dist/chunk-CJOLOONT.js +++ b/packages/core/dist/chunk-NJVY2U43.js @@ -1779,5 +1779,5 @@ var PluginBootstrapService = class { }; export { PLUGIN_REGISTRY, PluginBootstrapService, PluginService, backfillFormSubmissions, cleanupRemovedCollections, createContentFromSubmission, deriveCollectionSchemaFromFormio, deriveSubmissionTitle, findPluginByCodeName, fullCollectionSync, getAvailableCollectionNames, getManagedCollections, isCollectionManaged, loadCollectionConfig, loadCollectionConfigs, mapFormStatusToContentStatus, registerCollections, syncAllFormCollections, syncCollection, syncCollections, syncFormCollection, validateCollectionConfig }; -//# sourceMappingURL=chunk-CJOLOONT.js.map -//# sourceMappingURL=chunk-CJOLOONT.js.map \ No newline at end of file +//# sourceMappingURL=chunk-NJVY2U43.js.map +//# sourceMappingURL=chunk-NJVY2U43.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-CJOLOONT.js.map b/packages/core/dist/chunk-NJVY2U43.js.map similarity index 99% rename from packages/core/dist/chunk-CJOLOONT.js.map rename to packages/core/dist/chunk-NJVY2U43.js.map index 0c8d4b6fb..3a4771fdf 100644 --- a/packages/core/dist/chunk-CJOLOONT.js.map +++ b/packages/core/dist/chunk-NJVY2U43.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/services/collection-loader.ts","../src/services/collection-sync.ts","../src/services/form-collection-sync.ts","../src/services/plugin-service.ts","../src/plugins/manifest-registry.ts","../src/services/plugin-bootstrap.ts"],"names":[],"mappings":"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","file":"chunk-CJOLOONT.js","sourcesContent":["/**\n * Collection Loader Service\n *\n * Loads collection configuration files from the collections directory.\n * Supports both development (reading from filesystem) and production (bundled).\n */\n\nimport { CollectionConfig, CollectionConfigModule } from '../types/collection-config'\n\n// Global registry for externally registered collections\nconst registeredCollections: CollectionConfig[] = []\n\n/**\n * Register collections from the application code\n * This should be called before creating the app\n */\nexport function registerCollections(collections: CollectionConfig[]): void {\n for (const config of collections) {\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config: missing required fields`, config)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n registeredCollections.push(normalizedConfig)\n console.log(`✓ Registered collection: ${config.name}`)\n }\n}\n\n/**\n * Load all collection configurations from the collections directory\n */\nexport async function loadCollectionConfigs(): Promise {\n const collections: CollectionConfig[] = [...registeredCollections]\n\n // Log registered collections summary\n if (registeredCollections.length > 0) {\n console.log(`📦 Found ${registeredCollections.length} registered collection(s) from application`)\n } else {\n console.log(`⚠️ No collections registered. Make sure to call registerCollections() in your app's index.ts`)\n console.log(` Example: import myCollection from './collections/my-collection.collection'`)\n console.log(` registerCollections([myCollection])`)\n }\n\n try {\n // Import all collection files dynamically from core package\n // In production, these will be bundled with the application\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts', { eager: true }) || {}\n let coreCollectionCount = 0\n\n for (const [path, module] of Object.entries(modules)) {\n try {\n const configModule = module as CollectionConfigModule\n\n if (!configModule.default) {\n console.warn(`Collection file ${path} does not export a default config`)\n continue\n }\n\n const config = configModule.default\n\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config in ${path}: missing required fields`)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n collections.push(normalizedConfig)\n coreCollectionCount++\n console.log(`✓ Loaded core collection: ${config.name}`)\n } catch (error) {\n console.error(`Error loading collection from ${path}:`, error)\n }\n }\n\n console.log(`📊 Collection summary: ${collections.length} total (${registeredCollections.length} from app, ${coreCollectionCount} from core)`)\n return collections\n } catch (error) {\n console.error('Error loading collection configurations:', error)\n return collections // Return registered collections even if core loading fails\n }\n}\n\n/**\n * Load a specific collection configuration by name\n * Note: This function requires implementation in the consuming application\n * as it depends on project-specific collection files\n */\nexport async function loadCollectionConfig(name: string): Promise {\n try {\n // Dynamic imports are not supported in library builds\n // This should be implemented in the consuming application\n console.warn('loadCollectionConfig requires implementation in consuming application')\n return null\n } catch (error) {\n console.error(`Error loading collection ${name}:`, error)\n return null\n }\n}\n\n/**\n * Get list of all available collection config file names\n */\nexport async function getAvailableCollectionNames(): Promise {\n try {\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts') || {}\n const names: string[] = []\n\n for (const path of Object.keys(modules)) {\n // Extract collection name from path\n // e.g., '../collections/blog-posts.collection.ts' -> 'blog-posts'\n const match = path.match(/\\/([^/]+)\\.collection\\.ts$/)\n if (match && match[1]) {\n names.push(match[1])\n }\n }\n\n return names\n } catch (error) {\n console.error('Error getting collection names:', error)\n return []\n }\n}\n\n/**\n * Validate a collection configuration\n */\nexport function validateCollectionConfig(config: CollectionConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push('Collection name is required')\n } else if (!/^[a-z0-9_-]+$/.test(config.name)) {\n errors.push('Collection name must contain only lowercase letters, numbers, underscores, and hyphens')\n }\n\n if (!config.displayName) {\n errors.push('Display name is required')\n }\n\n if (!config.schema) {\n errors.push('Schema is required')\n } else {\n // Validate schema structure\n if (config.schema.type !== 'object') {\n errors.push('Schema type must be \"object\"')\n }\n\n if (!config.schema.properties || typeof config.schema.properties !== 'object') {\n errors.push('Schema must have properties')\n }\n\n // Validate field types\n for (const [fieldName, fieldConfig] of Object.entries(config.schema.properties || {})) {\n if (!fieldConfig.type) {\n errors.push(`Field \"${fieldName}\" is missing type`)\n }\n\n // Validate reference fields\n if (fieldConfig.type === 'reference' && !fieldConfig.collection) {\n errors.push(`Reference field \"${fieldName}\" is missing collection property`)\n }\n\n const layoutValue = fieldConfig.objectLayout\n if (layoutValue !== undefined) {\n if (fieldConfig.type !== 'object') {\n errors.push(`Field \"${fieldName}\" uses objectLayout but is not an object field`)\n } else if (!['nested', 'flat'].includes(layoutValue)) {\n errors.push(`Object field \"${fieldName}\" has invalid objectLayout. Use \"nested\" or \"flat\"`)\n }\n }\n\n // Validate select fields\n if (['select', 'multiselect', 'radio'].includes(fieldConfig.type) && !fieldConfig.enum) {\n errors.push(`Select field \"${fieldName}\" is missing enum options`)\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n}\n","/**\n * Collection Sync Service\n *\n * Syncs collection configurations from code to the database.\n * Handles create, update, and validation of config-managed collections.\n */\n\nimport { CollectionConfig, CollectionSyncResult } from '../types/collection-config'\nimport { loadCollectionConfigs, validateCollectionConfig } from './collection-loader'\n\n/**\n * Sync all collection configurations to the database\n */\nexport async function syncCollections(db: D1Database): Promise {\n console.log('🔄 Starting collection sync...')\n\n const results: CollectionSyncResult[] = []\n const configs = await loadCollectionConfigs()\n\n if (configs.length === 0) {\n console.log('⚠️ No collection configurations found')\n return results\n }\n\n for (const config of configs) {\n const result = await syncCollection(db, config)\n results.push(result)\n }\n\n const created = results.filter(r => r.status === 'created').length\n const updated = results.filter(r => r.status === 'updated').length\n const unchanged = results.filter(r => r.status === 'unchanged').length\n const errors = results.filter(r => r.status === 'error').length\n\n console.log(`✅ Collection sync complete: ${created} created, ${updated} updated, ${unchanged} unchanged, ${errors} errors`)\n\n return results\n}\n\n/**\n * Sync a single collection configuration to the database\n */\nexport async function syncCollection(db: D1Database, config: CollectionConfig): Promise {\n try {\n // Validate config\n const validation = validateCollectionConfig(config)\n if (!validation.valid) {\n return {\n name: config.name,\n status: 'error',\n error: `Validation failed: ${validation.errors.join(', ')}`\n }\n }\n\n // Check if collection exists\n const existingStmt = db.prepare('SELECT * FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(config.name).first() as any\n\n const now = Date.now()\n const collectionId = existing?.id || `col-${config.name}-${crypto.randomUUID().slice(0, 8)}`\n\n // Prepare collection data\n const schemaJson = JSON.stringify(config.schema)\n const isActive = config.isActive !== false ? 1 : 0\n const managed = config.managed !== false ? 1 : 0\n\n if (!existing) {\n // Create new collection\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n config.name,\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n now\n ).run()\n\n console.log(` ✓ Created collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'created',\n message: `Created collection \"${config.displayName}\"`\n }\n } else {\n // Check if update is needed\n const existingSchema = existing.schema ? JSON.stringify(existing.schema) : '{}'\n const existingDisplayName = existing.display_name\n const existingDescription = existing.description\n const existingIsActive = existing.is_active\n const existingManaged = existing.managed\n\n const needsUpdate =\n schemaJson !== existingSchema ||\n config.displayName !== existingDisplayName ||\n (config.description || null) !== existingDescription ||\n isActive !== existingIsActive ||\n managed !== existingManaged\n\n if (!needsUpdate) {\n return {\n name: config.name,\n status: 'unchanged',\n message: `Collection \"${config.displayName}\" is up to date`\n }\n }\n\n // Update existing collection\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, schema = ?, is_active = ?, managed = ?, updated_at = ?\n WHERE name = ?\n `)\n\n await updateStmt.bind(\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n config.name\n ).run()\n\n console.log(` ✓ Updated collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'updated',\n message: `Updated collection \"${config.displayName}\"`\n }\n }\n } catch (error) {\n console.error(` ✗ Error syncing collection ${config.name}:`, error)\n\n return {\n name: config.name,\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n}\n\n/**\n * Check if a collection is managed by config\n */\nexport async function isCollectionManaged(db: D1Database, collectionName: string): Promise {\n try {\n const stmt = db.prepare('SELECT managed FROM collections WHERE name = ?')\n const result = await stmt.bind(collectionName).first() as any\n\n return result?.managed === 1\n } catch (error) {\n console.error(`Error checking if collection is managed:`, error)\n return false\n }\n}\n\n/**\n * Get all managed collections from database\n */\nexport async function getManagedCollections(db: D1Database): Promise {\n try {\n const stmt = db.prepare('SELECT name FROM collections WHERE managed = 1')\n const { results } = await stmt.all()\n\n return (results || []).map((row: any) => row.name)\n } catch (error) {\n console.error('Error getting managed collections:', error)\n return []\n }\n}\n\n/**\n * Remove collections that are no longer in config files\n * (Only removes managed collections that aren't in the config)\n */\nexport async function cleanupRemovedCollections(db: D1Database): Promise {\n try {\n const configs = await loadCollectionConfigs()\n const configNames = new Set(configs.map(c => c.name))\n const managedCollections = await getManagedCollections(db)\n const removed: string[] = []\n\n for (const managedName of managedCollections) {\n if (!configNames.has(managedName)) {\n // This managed collection no longer has a config file\n // Mark as inactive instead of deleting (safer)\n const updateStmt = db.prepare(`\n UPDATE collections\n SET is_active = 0, updated_at = ?\n WHERE name = ? AND managed = 1\n `)\n\n await updateStmt.bind(Date.now(), managedName).run()\n removed.push(managedName)\n console.log(` ⚠️ Deactivated removed collection: ${managedName}`)\n }\n }\n\n return removed\n } catch (error) {\n console.error('Error cleaning up removed collections:', error)\n return []\n }\n}\n\n/**\n * Full sync: sync all configs and cleanup removed\n */\nexport async function fullCollectionSync(db: D1Database): Promise<{\n results: CollectionSyncResult[]\n removed: string[]\n}> {\n const results = await syncCollections(db)\n const removed = await cleanupRemovedCollections(db)\n\n return { results, removed }\n}\n","/**\n * Form-Collection Sync Service\n *\n * Bridge logic that creates \"shadow collections\" for forms and\n * dual-writes form submissions to the content table, enabling\n * unified content management for form submissions.\n */\n\nconst SYSTEM_FORM_USER_ID = 'system-form-submission'\n\n/**\n * Convert Form.io component type to collection schema field type\n */\nfunction mapFormioTypeToSchemaType(component: any): { type: string; [key: string]: any } {\n switch (component.type) {\n case 'textfield':\n case 'textarea':\n case 'password':\n case 'phoneNumber':\n case 'url':\n return { type: 'string', title: component.label || component.key }\n case 'email':\n return { type: 'string', format: 'email', title: component.label || component.key }\n case 'number':\n case 'currency':\n return { type: 'number', title: component.label || component.key }\n case 'checkbox':\n return { type: 'boolean', title: component.label || component.key }\n case 'select':\n case 'radio': {\n const enumValues = (component.data?.values || component.values || []).map((v: any) => v.value)\n const enumLabels = (component.data?.values || component.values || []).map((v: any) => v.label)\n return {\n type: 'select',\n title: component.label || component.key,\n enum: enumValues,\n enumLabels\n }\n }\n case 'selectboxes':\n return { type: 'object', title: component.label || component.key }\n case 'datetime':\n case 'day':\n case 'time':\n return { type: 'string', format: 'date-time', title: component.label || component.key }\n case 'file':\n case 'signature':\n return { type: 'string', title: component.label || component.key }\n case 'address':\n return { type: 'object', title: component.label || component.key }\n case 'hidden':\n return { type: 'string', title: component.label || component.key }\n default:\n return { type: 'string', title: component.label || component.key }\n }\n}\n\n/**\n * Recursively extract field components from a Form.io schema,\n * skipping layout-only components (panels, columns, fieldsets, etc.)\n */\nfunction extractFieldComponents(components: any[]): any[] {\n const fields: any[] = []\n if (!components) return fields\n\n for (const comp of components) {\n // Layout components — recurse into children\n if (comp.type === 'panel' || comp.type === 'fieldset' || comp.type === 'well' || comp.type === 'tabs') {\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n continue\n }\n if (comp.type === 'columns' && comp.columns) {\n for (const col of comp.columns) {\n if (col.components) {\n fields.push(...extractFieldComponents(col.components))\n }\n }\n continue\n }\n if (comp.type === 'table' && comp.rows) {\n for (const row of comp.rows) {\n if (Array.isArray(row)) {\n for (const cell of row) {\n if (cell.components) {\n fields.push(...extractFieldComponents(cell.components))\n }\n }\n }\n }\n continue\n }\n // Skip buttons and non-input layout elements\n if (comp.type === 'button' || comp.type === 'htmlelement' || comp.type === 'content') {\n continue\n }\n // Skip turnstile (not data)\n if (comp.type === 'turnstile') {\n continue\n }\n // It's a real field\n if (comp.key) {\n fields.push(comp)\n }\n // Recurse into sub-components for containers\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n }\n return fields\n}\n\n/**\n * Convert a Form.io schema into a collection JSON schema definition\n */\nexport function deriveCollectionSchemaFromFormio(formioSchema: any): any {\n const components = formioSchema?.components || []\n const fieldComponents = extractFieldComponents(components)\n\n const properties: Record = {\n // Always include a title field for the content item\n title: { type: 'string', title: 'Title', required: true }\n }\n const required: string[] = ['title']\n\n for (const comp of fieldComponents) {\n const key = comp.key\n if (!key || key === 'submit' || key === 'title') continue\n const fieldDef = mapFormioTypeToSchemaType(comp)\n if (comp.validate?.required) {\n fieldDef.required = true\n required.push(key)\n }\n properties[key] = fieldDef\n }\n\n return { type: 'object', properties, required }\n}\n\n/**\n * Derive a human-readable title from form submission data\n */\nexport function deriveSubmissionTitle(data: Record, formDisplayName: string): string {\n // Try common fields in order of preference\n const candidates = ['name', 'fullName', 'full_name', 'firstName', 'first_name']\n for (const key of candidates) {\n if (data[key] && typeof data[key] === 'string' && data[key].trim()) {\n // Append last name if available\n if (key === 'firstName' || key === 'first_name') {\n const last = data['lastName'] || data['last_name'] || data['lastname'] || ''\n if (last) return `${data[key].trim()} ${last.trim()}`\n }\n return data[key].trim()\n }\n }\n // Try email\n if (data.email && typeof data.email === 'string' && data.email.trim()) {\n return data.email.trim()\n }\n // Try subject\n if (data.subject && typeof data.subject === 'string' && data.subject.trim()) {\n return data.subject.trim()\n }\n // Fallback\n const dateStr = new Date().toLocaleDateString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })\n return `${formDisplayName} - ${dateStr}`\n}\n\n/**\n * Map form submission status to content status.\n * Form submissions are complete data — they default to 'published'.\n * Only rejected/spam submissions get demoted.\n */\nexport function mapFormStatusToContentStatus(formStatus: string): string {\n switch (formStatus) {\n case 'pending': return 'published'\n case 'reviewed': return 'published'\n case 'approved': return 'published'\n case 'rejected': return 'archived'\n case 'spam': return 'deleted'\n default: return 'published'\n }\n}\n\n/**\n * Create or update a shadow collection for a given form\n */\nexport async function syncFormCollection(db: D1Database, form: {\n id: string\n name: string\n display_name: string\n description?: string | null\n formio_schema: any\n is_active: number | boolean\n}): Promise<{ collectionId: string; status: 'created' | 'updated' | 'unchanged' }> {\n const collectionName = `form_${form.name}`\n const displayName = `${form.display_name} (Form)`\n\n // Parse formio_schema\n const formioSchema = typeof form.formio_schema === 'string'\n ? JSON.parse(form.formio_schema)\n : form.formio_schema\n\n const schema = deriveCollectionSchemaFromFormio(formioSchema)\n const schemaJson = JSON.stringify(schema)\n const now = Date.now()\n const isActive = form.is_active ? 1 : 0\n\n // Check if shadow collection already exists\n const existing = await db.prepare(\n 'SELECT id, schema, display_name, description, is_active FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!existing) {\n // Create new shadow collection\n const collectionId = `col-form-${form.name}-${crypto.randomUUID().slice(0, 8)}`\n\n await db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, source_type, source_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, 1, 'form', ?, ?, ?)\n `).bind(\n collectionId,\n collectionName,\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n form.id,\n now,\n now\n ).run()\n\n console.log(`[FormSync] Created shadow collection: ${collectionName}`)\n return { collectionId, status: 'created' }\n }\n\n // Check if update needed\n const existingSchema = existing.schema ? JSON.stringify(typeof existing.schema === 'string' ? JSON.parse(existing.schema) : existing.schema) : '{}'\n const needsUpdate =\n schemaJson !== existingSchema ||\n displayName !== existing.display_name ||\n (form.description || null) !== existing.description ||\n isActive !== existing.is_active\n\n if (!needsUpdate) {\n return { collectionId: existing.id, status: 'unchanged' }\n }\n\n await db.prepare(`\n UPDATE collections SET display_name = ?, description = ?, schema = ?, is_active = ?, updated_at = ?\n WHERE id = ?\n `).bind(\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n now,\n existing.id\n ).run()\n\n console.log(`[FormSync] Updated shadow collection: ${collectionName}`)\n return { collectionId: existing.id, status: 'updated' }\n}\n\n/**\n * Sync all active forms to shadow collections\n */\nexport async function syncAllFormCollections(db: D1Database): Promise {\n try {\n // Check if forms table exists\n const tableCheck = await db.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='forms'\"\n ).first()\n if (!tableCheck) {\n console.log('[FormSync] Forms table does not exist, skipping form sync')\n return\n }\n\n const { results: forms } = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms'\n ).all()\n\n if (!forms || forms.length === 0) {\n console.log('[FormSync] No forms found, skipping')\n return\n }\n\n let created = 0\n let updated = 0\n\n for (const form of forms) {\n try {\n const result = await syncFormCollection(db, form as any)\n if (result.status === 'created') created++\n if (result.status === 'updated') updated++\n\n // Backfill existing submissions that don't have content_id\n await backfillFormSubmissions(db, form.id as string, result.collectionId)\n } catch (error) {\n console.error(`[FormSync] Error syncing form ${form.name}:`, error)\n }\n }\n\n console.log(`[FormSync] Sync complete: ${created} created, ${updated} updated out of ${forms.length} forms`)\n } catch (error) {\n console.error('[FormSync] Error syncing form collections:', error)\n }\n}\n\n/**\n * Create a content item from a form submission\n */\nexport async function createContentFromSubmission(\n db: D1Database,\n submissionData: Record,\n form: { id: string; name: string; display_name: string },\n submissionId: string,\n metadata: {\n ipAddress?: string | null\n userAgent?: string | null\n userEmail?: string | null\n userId?: string | null\n } = {}\n): Promise {\n try {\n // Find the shadow collection\n let collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!collection) {\n // Shadow collection missing — try to create it on the fly\n console.warn(`[FormSync] No shadow collection found for form ${form.name}, attempting to create...`)\n try {\n const fullForm = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms WHERE id = ?'\n ).bind(form.id).first() as any\n\n if (fullForm) {\n const schema = typeof fullForm.formio_schema === 'string'\n ? JSON.parse(fullForm.formio_schema)\n : fullForm.formio_schema\n const result = await syncFormCollection(db, {\n id: fullForm.id,\n name: fullForm.name,\n display_name: fullForm.display_name,\n description: fullForm.description,\n formio_schema: schema,\n is_active: fullForm.is_active ?? 1\n })\n // Re-query the collection\n collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n console.log(`[FormSync] On-the-fly sync result: ${result.status}, collectionId: ${result.collectionId}`)\n }\n } catch (syncErr) {\n console.error('[FormSync] On-the-fly shadow collection creation failed:', syncErr)\n }\n\n if (!collection) {\n console.error(`[FormSync] Still no shadow collection for form ${form.name} after recovery attempt`)\n return null\n }\n }\n\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const title = deriveSubmissionTitle(submissionData, form.display_name)\n const slug = `submission-${submissionId.slice(0, 8)}`\n\n // Build content data with embedded metadata\n const contentData: Record = {\n title,\n ...submissionData,\n _submission_metadata: {\n submissionId,\n formId: form.id,\n formName: form.name,\n email: metadata.userEmail || submissionData.email || null,\n ipAddress: metadata.ipAddress || null,\n userAgent: metadata.userAgent || null,\n submittedAt: now\n }\n }\n\n const authorId = metadata.userId || SYSTEM_FORM_USER_ID\n\n // Ensure the system user exists (D1 enforces foreign keys)\n if (authorId === SYSTEM_FORM_USER_ID) {\n const systemUser = await db.prepare('SELECT id FROM users WHERE id = ?').bind(SYSTEM_FORM_USER_ID).first()\n if (!systemUser) {\n console.log('[FormSync] System form user missing, creating...')\n const sysNow = Date.now()\n await db.prepare(`\n INSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 0, ?, ?)\n `).bind(SYSTEM_FORM_USER_ID, 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', sysNow, sysNow).run()\n }\n }\n\n console.log(`[FormSync] Inserting content: id=${contentId}, collection=${collection.id}, slug=${slug}, title=${title}, author=${authorId}`)\n\n await db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, 'published', ?, ?, ?)\n `).bind(\n contentId,\n collection.id,\n slug,\n title,\n JSON.stringify(contentData),\n authorId,\n now,\n now\n ).run()\n\n // Link submission to content\n await db.prepare(\n 'UPDATE form_submissions SET content_id = ? WHERE id = ?'\n ).bind(contentId, submissionId).run()\n\n console.log(`[FormSync] Content created successfully: ${contentId}`)\n return contentId\n } catch (error) {\n console.error('[FormSync] Error creating content from submission:', error)\n return null\n }\n}\n\n/**\n * Backfill existing form submissions that don't have a content_id\n */\nexport async function backfillFormSubmissions(\n db: D1Database,\n formId: string,\n collectionId: string\n): Promise {\n try {\n const { results: submissions } = await db.prepare(\n 'SELECT id, submission_data, user_email, ip_address, user_agent, user_id, submitted_at FROM form_submissions WHERE form_id = ? AND content_id IS NULL'\n ).bind(formId).all()\n\n if (!submissions || submissions.length === 0) {\n return 0\n }\n\n // Get form info\n const form = await db.prepare(\n 'SELECT id, name, display_name FROM forms WHERE id = ?'\n ).bind(formId).first() as any\n\n if (!form) return 0\n\n let count = 0\n for (const sub of submissions) {\n try {\n const submissionData = typeof sub.submission_data === 'string'\n ? JSON.parse(sub.submission_data as string)\n : sub.submission_data\n\n const contentId = await createContentFromSubmission(\n db,\n submissionData,\n { id: form.id, name: form.name, display_name: form.display_name },\n sub.id as string,\n {\n ipAddress: sub.ip_address as string | null,\n userAgent: sub.user_agent as string | null,\n userEmail: sub.user_email as string | null,\n userId: sub.user_id as string | null\n }\n )\n if (contentId) count++\n } catch (error) {\n console.error(`[FormSync] Error backfilling submission ${sub.id}:`, error)\n }\n }\n\n if (count > 0) {\n console.log(`[FormSync] Backfilled ${count} submissions for form ${formId}`)\n }\n return count\n } catch (error) {\n console.error('[FormSync] Error backfilling submissions:', error)\n return 0\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\n// Note: PLUGIN_REGISTRY and CORE_PLUGIN_IDS are project-specific\n// They should be passed as parameters to the service in the consuming application\n// import { PLUGIN_REGISTRY, CORE_PLUGIN_IDS } from '../plugins/plugin-registry'\n\nexport interface PluginData {\n id: string\n name: string\n display_name: string\n description: string\n version: string\n author: string\n category: string\n icon: string\n status: 'active' | 'inactive' | 'error'\n is_core: boolean\n settings?: any\n permissions?: string[]\n dependencies?: string[]\n download_count: number\n rating: number\n installed_at: number\n activated_at?: number\n last_updated: number\n error_message?: string\n}\n\nexport interface PluginStats {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n}\n\nexport class PluginService {\n constructor(private db: D1Database) {}\n\n async getAllPlugins(): Promise {\n // Ensure all plugins from registry exist in database (auto-install if missing)\n await this.ensureAllPluginsExist()\n\n const stmt = this.db.prepare(`\n SELECT * FROM plugins\n ORDER BY is_core DESC, display_name ASC\n `)\n\n const { results } = await stmt.all()\n return (results || []).map(this.mapPluginFromDb)\n }\n\n /**\n * Ensure all plugins from the registry exist in the database\n * Auto-installs any newly detected plugins with inactive status\n *\n * Note: This method should be overridden or configured with a plugin registry\n * in the consuming application\n */\n private async ensureAllPluginsExist(): Promise {\n // This functionality requires a project-specific PLUGIN_REGISTRY\n // In the consuming application, you should pass the registry to this service\n console.log('[PluginService] ensureAllPluginsExist - requires PLUGIN_REGISTRY configuration')\n }\n\n async getPlugin(pluginId: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE id = ?')\n const plugin = await stmt.bind(pluginId).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginByName(name: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE name = ?')\n const plugin = await stmt.bind(name).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginStats(): Promise {\n const stmt = this.db.prepare(`\n SELECT \n COUNT(*) as total,\n COUNT(CASE WHEN status = 'active' THEN 1 END) as active,\n COUNT(CASE WHEN status = 'inactive' THEN 1 END) as inactive,\n COUNT(CASE WHEN status = 'error' THEN 1 END) as errors\n FROM plugins\n `)\n \n const stats = await stmt.first() as any\n return {\n total: stats.total || 0,\n active: stats.active || 0,\n inactive: stats.inactive || 0,\n errors: stats.errors || 0,\n uninstalled: 0\n }\n }\n\n async installPlugin(pluginData: Partial): Promise {\n const id = pluginData.id || `plugin-${Date.now()}`\n const now = Math.floor(Date.now() / 1000)\n \n const stmt = this.db.prepare(`\n INSERT INTO plugins (\n id, name, display_name, description, version, author, category, icon,\n status, is_core, settings, permissions, dependencies, download_count, \n rating, installed_at, last_updated\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginData.name || id,\n pluginData.display_name || 'Unnamed Plugin',\n pluginData.description || '',\n pluginData.version || '1.0.0',\n pluginData.author || 'Unknown',\n pluginData.category || 'utilities',\n pluginData.icon || '🔌',\n 'inactive',\n pluginData.is_core || false,\n JSON.stringify(pluginData.settings || {}),\n JSON.stringify(pluginData.permissions || []),\n JSON.stringify(pluginData.dependencies || []),\n pluginData.download_count || 0,\n pluginData.rating || 0,\n now,\n now\n ).run()\n \n // Log the installation\n await this.logActivity(id, 'installed', null, { version: pluginData.version })\n \n const installed = await this.getPlugin(id)\n if (!installed) throw new Error('Failed to install plugin')\n \n return installed\n }\n\n async uninstallPlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n if (plugin.is_core) throw new Error('Cannot uninstall core plugins')\n \n // First deactivate if active\n if (plugin.status === 'active') {\n await this.deactivatePlugin(pluginId)\n }\n \n // Delete the plugin\n const stmt = this.db.prepare('DELETE FROM plugins WHERE id = ?')\n await stmt.bind(pluginId).run()\n \n // Log the uninstallation\n await this.logActivity(pluginId, 'uninstalled', null, { name: plugin.name })\n }\n\n async activatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check dependencies\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n await this.checkDependencies(plugin.dependencies)\n }\n \n const now = Math.floor(Date.now() / 1000)\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'active', activated_at = ?, error_message = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(now, pluginId).run()\n \n // Log the activation\n await this.logActivity(pluginId, 'activated', null)\n }\n\n async deactivatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check if other plugins depend on this one\n await this.checkDependents(plugin.name)\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'inactive', activated_at = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(pluginId).run()\n \n // Log the deactivation\n await this.logActivity(pluginId, 'deactivated', null)\n }\n\n async updatePluginSettings(pluginId: string, settings: any): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET settings = ?, updated_at = unixepoch() \n WHERE id = ?\n `)\n \n await stmt.bind(JSON.stringify(settings), pluginId).run()\n \n // Log the settings update\n await this.logActivity(pluginId, 'settings_updated', null)\n }\n\n async setPluginError(pluginId: string, error: string): Promise {\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'error', error_message = ? \n WHERE id = ?\n `)\n \n await stmt.bind(error, pluginId).run()\n \n // Log the error\n await this.logActivity(pluginId, 'error', null, { error })\n }\n\n async getPluginActivity(pluginId: string, limit: number = 10): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_activity_log \n WHERE plugin_id = ? \n ORDER BY timestamp DESC \n LIMIT ?\n `)\n \n const { results } = await stmt.bind(pluginId, limit).all()\n return (results || []).map((row: any) => ({\n id: row.id,\n action: row.action,\n userId: row.user_id,\n details: row.details ? JSON.parse(row.details) : null,\n timestamp: row.timestamp\n }))\n }\n\n async registerHook(pluginId: string, hookName: string, handlerName: string, priority: number = 10): Promise {\n const id = `hook-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_hooks (id, plugin_id, hook_name, handler_name, priority)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(id, pluginId, hookName, handlerName, priority).run()\n }\n\n async registerRoute(pluginId: string, path: string, method: string, handlerName: string, middleware?: any[]): Promise {\n const id = `route-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_routes (id, plugin_id, path, method, handler_name, middleware)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id, \n pluginId, \n path, \n method, \n handlerName, \n JSON.stringify(middleware || [])\n ).run()\n }\n\n async getPluginHooks(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_hooks \n WHERE plugin_id = ? AND is_active = TRUE\n ORDER BY priority ASC\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n async getPluginRoutes(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_routes \n WHERE plugin_id = ? AND is_active = TRUE\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n private async checkDependencies(dependencies: string[]): Promise {\n for (const dep of dependencies) {\n const plugin = await this.getPluginByName(dep)\n if (!plugin || plugin.status !== 'active') {\n throw new Error(`Required dependency '${dep}' is not active`)\n }\n }\n }\n\n private async checkDependents(pluginName: string): Promise {\n const stmt = this.db.prepare(`\n SELECT id, display_name FROM plugins \n WHERE status = 'active' \n AND dependencies LIKE ?\n `)\n \n const { results } = await stmt.bind(`%\"${pluginName}\"%`).all()\n if (results && results.length > 0) {\n const names = results.map((p: any) => p.display_name).join(', ')\n throw new Error(`Cannot deactivate. The following plugins depend on this one: ${names}`)\n }\n }\n\n private async logActivity(pluginId: string, action: string, userId: string | null, details?: any): Promise {\n const id = `activity-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_activity_log (id, plugin_id, action, user_id, details)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginId,\n action,\n userId,\n details ? JSON.stringify(details) : null\n ).run()\n }\n\n private mapPluginFromDb(row: any): PluginData {\n return {\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n version: row.version,\n author: row.author,\n category: row.category,\n icon: row.icon,\n status: row.status,\n is_core: row.is_core === 1,\n settings: row.settings ? JSON.parse(row.settings) : undefined,\n permissions: row.permissions ? JSON.parse(row.permissions) : undefined,\n dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,\n download_count: row.download_count || 0,\n rating: row.rating || 0,\n installed_at: row.installed_at,\n activated_at: row.activated_at,\n last_updated: row.last_updated,\n error_message: row.error_message\n }\n }\n}\n","/**\n * Plugin Registry - AUTO-GENERATED\n *\n * Generated by: packages/scripts/generate-plugin-registry.mjs\n * Generated at: 2026-05-01T00:32:37.025Z\n * Source: All manifest.json files in src/plugins/\n *\n * DO NOT EDIT MANUALLY - run the generator script instead.\n * To add a new plugin, create a manifest.json in the plugin directory.\n */\n\nexport interface PluginRegistryEntry {\n id: string\n codeName: string\n displayName: string\n description: string\n version: string\n author: string\n category: string\n iconEmoji: string\n is_core: boolean\n permissions: string[]\n dependencies: string[]\n defaultSettings: Record\n adminMenu: {\n label: string\n icon: string\n path: string\n order: number\n } | null\n}\n\n/**\n * All discovered plugins, keyed by plugin ID.\n */\nexport const PLUGIN_REGISTRY: Record = {\n 'ai-search': {\n \"id\": \"ai-search\",\n \"codeName\": \"ai-search-plugin\",\n \"displayName\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"path\": \"/admin/plugins/ai-search\",\n \"order\": 50\n }\n },\n\n 'code-examples-plugin': {\n \"id\": \"code-examples-plugin\",\n \"codeName\": \"code-examples-plugin\",\n \"displayName\": \"Code Examples\",\n \"description\": \"Code snippets and examples library with syntax highlighting and categorization\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💻\",\n \"is_core\": false,\n \"permissions\": [\n \"code-examples:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'core-analytics': {\n \"id\": \"core-analytics\",\n \"codeName\": \"core-analytics\",\n \"displayName\": \"Analytics & Insights\",\n \"description\": \"Core analytics system for tracking page views, user behavior, and content performance. Provides dashboards and reports with real-time metrics\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"seo\",\n \"iconEmoji\": \"📊\",\n \"is_core\": true,\n \"permissions\": [\n \"analytics:view\",\n \"analytics:export\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Analytics\",\n \"icon\": \"chart-bar\",\n \"path\": \"/admin/analytics\",\n \"order\": 50\n }\n },\n\n 'core-auth': {\n \"id\": \"core-auth\",\n \"codeName\": \"core-auth\",\n \"displayName\": \"Authentication System\",\n \"description\": \"Core authentication and user management system with role-based access control, session management, and security features\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔐\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:users\",\n \"manage:roles\",\n \"manage:permissions\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"requiredFields\": {\n \"email\": {\n \"required\": true,\n \"minLength\": 5,\n \"label\": \"Email\",\n \"type\": \"email\"\n },\n \"password\": {\n \"required\": true,\n \"minLength\": 8,\n \"label\": \"Password\",\n \"type\": \"password\"\n },\n \"username\": {\n \"required\": true,\n \"minLength\": 3,\n \"label\": \"Username\",\n \"type\": \"text\"\n },\n \"firstName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"First Name\",\n \"type\": \"text\"\n },\n \"lastName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"Last Name\",\n \"type\": \"text\"\n }\n },\n \"validation\": {\n \"emailFormat\": true,\n \"allowDuplicateUsernames\": false,\n \"passwordRequirements\": {\n \"requireUppercase\": false,\n \"requireLowercase\": false,\n \"requireNumbers\": false,\n \"requireSpecialChars\": false\n }\n },\n \"registration\": {\n \"enabled\": true,\n \"requireEmailVerification\": false,\n \"defaultRole\": \"viewer\"\n }\n },\n \"adminMenu\": null\n },\n\n 'core-cache': {\n \"id\": \"core-cache\",\n \"codeName\": \"core-cache\",\n \"displayName\": \"Cache System\",\n \"description\": \"Three-tiered caching system with in-memory and KV storage. Provides automatic caching for content, users, media, and API responses with configurable TTL and invalidation patterns.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"system\",\n \"iconEmoji\": \"⚡\",\n \"is_core\": true,\n \"permissions\": [\n \"cache.view\",\n \"cache.clear\",\n \"cache.invalidate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableMemoryCache\": true,\n \"enableKVCache\": true,\n \"enableDatabaseCache\": true,\n \"defaultTTL\": 3600\n },\n \"adminMenu\": null\n },\n\n 'core-media': {\n \"id\": \"core-media\",\n \"codeName\": \"core-media\",\n \"displayName\": \"Media Manager\",\n \"description\": \"Core media upload and management system with support for images, videos, and documents. Includes automatic optimization, thumbnail generation, and cloud storage integration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"media\",\n \"iconEmoji\": \"📸\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:media\",\n \"upload:files\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Media\",\n \"icon\": \"image\",\n \"path\": \"/admin/media\",\n \"order\": 30\n }\n },\n\n 'database-tools': {\n \"id\": \"database-tools\",\n \"codeName\": \"database-tools\",\n \"displayName\": \"Database Tools\",\n \"description\": \"Database management and administration tools including migrations, backups, and query execution\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🗄️\",\n \"is_core\": false,\n \"permissions\": [\n \"database:admin\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableTruncate\": true,\n \"enableBackup\": true,\n \"enableValidation\": true,\n \"requireConfirmation\": true\n },\n \"adminMenu\": null\n },\n\n 'demo-login-plugin': {\n \"id\": \"demo-login-plugin\",\n \"codeName\": \"demo-login-plugin\",\n \"displayName\": \"Demo Login\",\n \"description\": \"Quick demo login functionality for testing and demonstrations\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎯\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"core-auth\"\n ],\n \"defaultSettings\": {\n \"enableNotice\": true,\n \"demoEmail\": \"admin@sonicjs.com\",\n \"demoPassword\": \"sonicjs!\"\n },\n \"adminMenu\": null\n },\n\n 'design': {\n \"id\": \"design\",\n \"codeName\": \"design\",\n \"displayName\": \"Design System\",\n \"description\": \"Design system management including themes, components, and UI customization. Provides a visual interface for managing design tokens, typography, colors, and component library.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎨\",\n \"is_core\": false,\n \"permissions\": [\n \"design.view\",\n \"design.edit\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultTheme\": \"light\",\n \"customCSS\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Design\",\n \"icon\": \"palette\",\n \"path\": \"/admin/design\",\n \"order\": 80\n }\n },\n\n 'easy-mdx': {\n \"id\": \"easy-mdx\",\n \"codeName\": \"easy-mdx\",\n \"displayName\": \"EasyMDE Markdown Editor\",\n \"description\": \"Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultHeight\": 400,\n \"theme\": \"dark\",\n \"toolbar\": \"full\",\n \"placeholder\": \"Start writing your content...\"\n },\n \"adminMenu\": null\n },\n\n 'email': {\n \"id\": \"email\",\n \"codeName\": \"email\",\n \"displayName\": \"Email\",\n \"description\": \"Send transactional emails using Resend\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"📧\",\n \"is_core\": false,\n \"permissions\": [\n \"email:manage\",\n \"email:send\",\n \"email:view-logs\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"\",\n \"fromEmail\": \"\",\n \"fromName\": \"\",\n \"replyTo\": \"\",\n \"logoUrl\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Email\",\n \"icon\": \"envelope\",\n \"path\": \"/admin/plugins/email/settings\",\n \"order\": 80\n }\n },\n\n 'global-variables': {\n \"id\": \"global-variables\",\n \"codeName\": \"global-variables\",\n \"displayName\": \"Global Variables\",\n \"description\": \"Dynamic content variables with inline token support. Manage key-value variables via admin UI and use {variable_key} syntax in rich text fields for server-side resolution. Includes full CRUD admin page.\",\n \"version\": \"1.1.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔤\",\n \"is_core\": false,\n \"permissions\": [\n \"global-variables:manage\",\n \"global-variables:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableResolution\": true,\n \"cacheEnabled\": true,\n \"cacheTTL\": 300\n },\n \"adminMenu\": {\n \"label\": \"Global Variables\",\n \"icon\": \"variable\",\n \"path\": \"/admin/global-variables\",\n \"order\": 45\n }\n },\n\n 'hello-world': {\n \"id\": \"hello-world\",\n \"codeName\": \"hello-world\",\n \"displayName\": \"Hello World\",\n \"description\": \"A simple Hello World plugin demonstration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"👋\",\n \"is_core\": false,\n \"permissions\": [\n \"hello-world:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Hello World\",\n \"icon\": \"hand-raised\",\n \"path\": \"/admin/hello-world\",\n \"order\": 90\n }\n },\n\n 'magic-link-auth': {\n \"id\": \"magic-link-auth\",\n \"codeName\": \"magic-link-auth\",\n \"displayName\": \"Magic Link Authentication\",\n \"description\": \"Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔗\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"linkExpiryMinutes\": 15,\n \"rateLimitPerHour\": 5,\n \"allowNewUsers\": true\n },\n \"adminMenu\": null\n },\n\n 'oauth-providers': {\n \"id\": \"oauth-providers\",\n \"codeName\": \"oauth-providers\",\n \"displayName\": \"OAuth Providers\",\n \"description\": \"OAuth2/OIDC social login with GitHub, Google, and more\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"authentication\",\n \"iconEmoji\": \"🔑\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"providers\": {\n \"github\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n },\n \"google\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n }\n }\n },\n \"adminMenu\": null\n },\n\n 'otp-login': {\n \"id\": \"otp-login\",\n \"codeName\": \"otp-login\",\n \"displayName\": \"OTP Login\",\n \"description\": \"Passwordless authentication via email one-time codes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔢\",\n \"is_core\": false,\n \"permissions\": [\n \"otp:manage\",\n \"otp:request\",\n \"otp:verify\"\n ],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"codeLength\": 6,\n \"codeExpiryMinutes\": 10,\n \"maxAttempts\": 3,\n \"rateLimitPerHour\": 5,\n \"allowNewUserRegistration\": false,\n \"logoUrl\": \"\",\n \"logoWidth\": 150,\n \"logoBorderWidth\": 0,\n \"logoBorderColor\": \"#ffffff\",\n \"loginUrl\": \"\",\n \"loginButtonText\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"OTP Login\",\n \"icon\": \"key\",\n \"path\": \"/admin/plugins/otp-login/settings\",\n \"order\": 85\n }\n },\n\n 'quill-editor': {\n \"id\": \"quill-editor\",\n \"codeName\": \"quill-editor\",\n \"displayName\": \"Quill Rich Text Editor\",\n \"description\": \"Quill WYSIWYG editor integration for rich text editing. Lightweight, modern editor with customizable toolbars and dark mode support.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"✍️\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"version\": \"2.0.2\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"theme\": \"snow\"\n },\n \"adminMenu\": null\n },\n\n 'redirect-management': {\n \"id\": \"redirect-management\",\n \"codeName\": \"redirect-management\",\n \"displayName\": \"Redirect Management\",\n \"description\": \"URL redirect management with exact, partial, and regex matching\",\n \"version\": \"1.0.0\",\n \"author\": \"ahaas\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"↪️\",\n \"is_core\": false,\n \"permissions\": [\n \"redirect.manage\",\n \"redirect.view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"autoOffloadEnabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Redirects\",\n \"icon\": \"arrow-right\",\n \"path\": \"/admin/redirects\",\n \"order\": 85\n }\n },\n\n 'security-audit': {\n \"id\": \"security-audit\",\n \"codeName\": \"security-audit\",\n \"displayName\": \"Security Audit\",\n \"description\": \"Security event logging, brute-force detection, and analytics dashboard. Monitors login attempts, registrations, lockouts, and suspicious activity.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": false,\n \"permissions\": [\n \"security-audit:view\",\n \"security-audit:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"retention\": {\n \"daysToKeep\": 90,\n \"maxEvents\": 100000,\n \"autoPurge\": true\n },\n \"bruteForce\": {\n \"enabled\": true,\n \"maxFailedAttemptsPerIP\": 10,\n \"maxFailedAttemptsPerEmail\": 5,\n \"windowMinutes\": 15,\n \"lockoutDurationMinutes\": 30,\n \"alertThreshold\": 20\n },\n \"logging\": {\n \"logSuccessfulLogins\": true,\n \"logLogouts\": true,\n \"logRegistrations\": true,\n \"logPasswordResets\": true,\n \"logPermissionDenied\": true\n }\n },\n \"adminMenu\": {\n \"label\": \"Security Audit\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/security-audit\",\n \"order\": 85\n }\n },\n\n 'seed-data': {\n \"id\": \"seed-data\",\n \"codeName\": \"seed-data\",\n \"displayName\": \"Seed Data Generator\",\n \"description\": \"Development tool for generating sample data and testing content. Useful for demos and development environments\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🌱\",\n \"is_core\": false,\n \"permissions\": [\n \"seed-data:generate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"userCount\": 20,\n \"contentCount\": 200,\n \"defaultPassword\": \"password123\"\n },\n \"adminMenu\": null\n },\n\n 'shortcodes': {\n \"id\": \"shortcodes\",\n \"codeName\": \"shortcodes\",\n \"displayName\": \"Shortcodes\",\n \"description\": \"Registered shortcode functions for dynamic content. Use [[shortcode_name param=\\\"value\\\"]] syntax in rich text fields for server-side resolution. Includes handler registry, CRUD admin, and live preview.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"\",\n \"is_core\": false,\n \"permissions\": [\n \"shortcodes:manage\",\n \"shortcodes:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Shortcodes\",\n \"icon\": \"bolt\",\n \"path\": \"/admin/shortcodes\",\n \"order\": 46\n }\n },\n\n 'stripe': {\n \"id\": \"stripe\",\n \"codeName\": \"stripe\",\n \"displayName\": \"Stripe Subscriptions\",\n \"description\": \"Stripe subscription management with webhook handling, checkout sessions, and subscription gating\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"payments\",\n \"iconEmoji\": \"💳\",\n \"is_core\": true,\n \"permissions\": [\n \"stripe:manage\",\n \"stripe:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"stripeSecretKey\": \"\",\n \"stripeWebhookSecret\": \"\",\n \"stripePriceId\": \"\",\n \"successUrl\": \"/admin/dashboard\",\n \"cancelUrl\": \"/admin/dashboard\"\n },\n \"adminMenu\": {\n \"label\": \"Stripe\",\n \"icon\": \"credit-card\",\n \"path\": \"/admin/plugins/stripe\",\n \"order\": 90\n }\n },\n\n 'testimonials-plugin': {\n \"id\": \"testimonials-plugin\",\n \"codeName\": \"testimonials-plugin\",\n \"displayName\": \"Testimonials\",\n \"description\": \"Customer testimonials and reviews management with display widgets and ratings\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💬\",\n \"is_core\": false,\n \"permissions\": [\n \"testimonials:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'tinymce-plugin': {\n \"id\": \"tinymce-plugin\",\n \"codeName\": \"tinymce-plugin\",\n \"displayName\": \"TinyMCE Rich Text Editor\",\n \"description\": \"Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"no-api-key\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"skin\": \"oxide-dark\"\n },\n \"adminMenu\": null\n },\n\n 'turnstile': {\n \"id\": \"turnstile\",\n \"codeName\": \"turnstile-plugin\",\n \"displayName\": \"Cloudflare Turnstile\",\n \"description\": \"CAPTCHA-free bot protection using Cloudflare Turnstile. Provides reusable verification for any form.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"siteKey\": \"\",\n \"secretKey\": \"\",\n \"theme\": \"auto\",\n \"size\": \"normal\",\n \"mode\": \"managed\",\n \"appearance\": \"always\",\n \"preClearanceEnabled\": false,\n \"preClearanceLevel\": \"managed\",\n \"enabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Turnstile\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/turnstile/settings\",\n \"order\": 100\n }\n },\n\n 'user-profiles': {\n \"id\": \"user-profiles\",\n \"codeName\": \"user-profiles\",\n \"displayName\": \"User Profiles\",\n \"description\": \"Configurable custom profile fields for users\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"users\",\n \"iconEmoji\": \"👤\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'workflow-plugin': {\n \"id\": \"workflow-plugin\",\n \"codeName\": \"workflow-plugin\",\n \"displayName\": \"Workflow Engine\",\n \"description\": \"Content workflow and approval system with customizable states, transitions, and review processes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔄\",\n \"is_core\": false,\n \"permissions\": [\n \"workflow:manage\",\n \"workflow:approve\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableApprovalChains\": true,\n \"enableScheduling\": true,\n \"enableAutomation\": true,\n \"enableNotifications\": true\n },\n \"adminMenu\": null\n }\n} as const\n\n/**\n * All plugin IDs.\n */\nexport const ALL_PLUGIN_IDS = Object.keys(PLUGIN_REGISTRY)\n\n/**\n * Plugins that have their own admin page (have an adminMenu entry).\n */\nexport const PLUGINS_WITH_ADMIN_PAGES = ALL_PLUGIN_IDS.filter(\n id => PLUGIN_REGISTRY[id]?.adminMenu !== null\n)\n\n/**\n * Look up a plugin by its codeName (the `name` field stored in the DB).\n * Falls back to id lookup if no codeName match.\n */\nexport function findPluginByCodeName(codeName: string): PluginRegistryEntry | undefined {\n return Object.values(PLUGIN_REGISTRY).find(p => p.codeName === codeName)\n || PLUGIN_REGISTRY[codeName]\n}\n\n/**\n * Get a plugin by ID.\n */\nexport function getPlugin(id: string): PluginRegistryEntry | undefined {\n return PLUGIN_REGISTRY[id]\n}\n","import type { D1Database } from \"@cloudflare/workers-types\";\nimport { PluginService } from \"./plugin-service\";\nimport { PLUGIN_REGISTRY } from \"../plugins/manifest-registry\";\nimport type { PluginRegistryEntry } from \"../plugins/manifest-registry\";\n\nexport interface CorePlugin {\n id: string;\n name: string;\n display_name: string;\n description: string;\n version: string;\n author: string;\n category: string;\n icon: string;\n permissions: string[];\n dependencies: string[];\n settings?: any;\n}\n\n/**\n * Build the CORE_PLUGINS list from the auto-generated registry.\n * To add a new bootstrapped plugin, create a manifest.json and\n * run: node packages/scripts/generate-plugin-registry.mjs\n *\n * Only plugins that are in the BOOTSTRAP_PLUGIN_IDS list will be\n * auto-installed on first boot. Edit this list to control which\n * plugins are bootstrapped.\n */\nconst BOOTSTRAP_PLUGIN_IDS = [\n \"core-auth\",\n \"core-media\",\n \"database-tools\",\n \"seed-data\",\n \"core-cache\",\n \"workflow-plugin\",\n \"easy-mdx\",\n \"ai-search\",\n \"oauth-providers\",\n \"global-variables\",\n \"user-profiles\",\n \"stripe\",\n];\n\nfunction registryToCorePlugin(entry: PluginRegistryEntry): CorePlugin {\n return {\n id: entry.id,\n name: entry.codeName,\n display_name: entry.displayName,\n description: entry.description,\n version: entry.version,\n author: entry.author,\n category: entry.category,\n icon: entry.iconEmoji,\n permissions: entry.permissions,\n dependencies: entry.dependencies,\n settings: entry.defaultSettings,\n };\n}\n\nexport class PluginBootstrapService {\n private pluginService: PluginService;\n\n constructor(private db: D1Database) {\n this.pluginService = new PluginService(db);\n }\n\n /**\n * Core plugins derived from the auto-generated plugin registry.\n * Only plugins listed in BOOTSTRAP_PLUGIN_IDS are included.\n */\n private readonly CORE_PLUGINS: CorePlugin[] = BOOTSTRAP_PLUGIN_IDS\n .filter((id) => PLUGIN_REGISTRY[id] !== undefined)\n .map((id) => registryToCorePlugin(PLUGIN_REGISTRY[id]!));\n\n /**\n * Bootstrap all core plugins - install them if they don't exist\n */\n async bootstrapCorePlugins(): Promise {\n console.log(\"[PluginBootstrap] Starting core plugin bootstrap process...\");\n\n try {\n // Check each core plugin\n for (const corePlugin of this.CORE_PLUGINS) {\n await this.ensurePluginInstalled(corePlugin);\n }\n\n console.log(\n \"[PluginBootstrap] Core plugin bootstrap completed successfully\"\n );\n } catch (error) {\n console.error(\"[PluginBootstrap] Error during plugin bootstrap:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure a specific plugin is installed\n */\n private async ensurePluginInstalled(plugin: CorePlugin): Promise {\n try {\n // Check if plugin already exists\n const existingPlugin = await this.pluginService.getPlugin(plugin.id);\n\n if (existingPlugin) {\n console.log(\n `[PluginBootstrap] Plugin already installed: ${plugin.display_name} (status: ${existingPlugin.status})`\n );\n\n // Update plugin if version changed\n if (existingPlugin.version !== plugin.version) {\n console.log(\n `[PluginBootstrap] Updating plugin version: ${plugin.display_name} from ${existingPlugin.version} to ${plugin.version}`\n );\n await this.updatePlugin(plugin);\n }\n\n // ALWAYS ensure core-auth is active (critical for system functionality)\n if (plugin.id === 'core-auth' && existingPlugin.status !== 'active') {\n console.log(\n `[PluginBootstrap] Core-auth plugin is inactive, activating it now...`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n\n // Only auto-activate on first install, respect user's activation state on subsequent boots\n } else {\n // Install the plugin\n console.log(\n `[PluginBootstrap] Installing plugin: ${plugin.display_name}`\n );\n await this.pluginService.installPlugin({\n ...plugin,\n is_core: plugin.name.startsWith(\"core-\"),\n });\n\n // Activate plugins immediately after installation\n console.log(\n `[PluginBootstrap] Activating newly installed plugin: ${plugin.display_name}`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n } catch (error) {\n console.error(\n `[PluginBootstrap] Error ensuring plugin ${plugin.display_name}:`,\n error\n );\n // Don't throw - continue with other plugins\n }\n }\n\n /**\n * Update an existing plugin\n */\n private async updatePlugin(plugin: CorePlugin): Promise {\n const now = Math.floor(Date.now() / 1000);\n\n const stmt = this.db.prepare(`\n UPDATE plugins\n SET\n version = ?,\n description = ?,\n permissions = ?,\n settings = ?,\n last_updated = ?\n WHERE id = ?\n `);\n\n await stmt\n .bind(\n plugin.version,\n plugin.description,\n JSON.stringify(plugin.permissions),\n JSON.stringify(plugin.settings || {}),\n now,\n plugin.id\n )\n .run();\n }\n\n /**\n * Check if bootstrap is needed (first run detection)\n */\n async isBootstrapNeeded(): Promise {\n try {\n // Check if any core plugins are missing\n for (const corePlugin of this.CORE_PLUGINS.filter((p) =>\n p.name.startsWith(\"core-\")\n )) {\n const exists = await this.pluginService.getPlugin(corePlugin.id);\n if (!exists) {\n return true;\n }\n }\n return false;\n } catch (error) {\n // If there's an error (like table doesn't exist), we need bootstrap\n console.error(\n \"[PluginBootstrap] Error checking bootstrap status:\",\n error\n );\n return true;\n }\n }\n\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/services/collection-loader.ts","../src/services/collection-sync.ts","../src/services/form-collection-sync.ts","../src/services/plugin-service.ts","../src/plugins/manifest-registry.ts","../src/services/plugin-bootstrap.ts"],"names":[],"mappings":"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","file":"chunk-NJVY2U43.js","sourcesContent":["/**\n * Collection Loader Service\n *\n * Loads collection configuration files from the collections directory.\n * Supports both development (reading from filesystem) and production (bundled).\n */\n\nimport { CollectionConfig, CollectionConfigModule } from '../types/collection-config'\n\n// Global registry for externally registered collections\nconst registeredCollections: CollectionConfig[] = []\n\n/**\n * Register collections from the application code\n * This should be called before creating the app\n */\nexport function registerCollections(collections: CollectionConfig[]): void {\n for (const config of collections) {\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config: missing required fields`, config)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n registeredCollections.push(normalizedConfig)\n console.log(`✓ Registered collection: ${config.name}`)\n }\n}\n\n/**\n * Load all collection configurations from the collections directory\n */\nexport async function loadCollectionConfigs(): Promise {\n const collections: CollectionConfig[] = [...registeredCollections]\n\n // Log registered collections summary\n if (registeredCollections.length > 0) {\n console.log(`📦 Found ${registeredCollections.length} registered collection(s) from application`)\n } else {\n console.log(`⚠️ No collections registered. Make sure to call registerCollections() in your app's index.ts`)\n console.log(` Example: import myCollection from './collections/my-collection.collection'`)\n console.log(` registerCollections([myCollection])`)\n }\n\n try {\n // Import all collection files dynamically from core package\n // In production, these will be bundled with the application\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts', { eager: true }) || {}\n let coreCollectionCount = 0\n\n for (const [path, module] of Object.entries(modules)) {\n try {\n const configModule = module as CollectionConfigModule\n\n if (!configModule.default) {\n console.warn(`Collection file ${path} does not export a default config`)\n continue\n }\n\n const config = configModule.default\n\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config in ${path}: missing required fields`)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n collections.push(normalizedConfig)\n coreCollectionCount++\n console.log(`✓ Loaded core collection: ${config.name}`)\n } catch (error) {\n console.error(`Error loading collection from ${path}:`, error)\n }\n }\n\n console.log(`📊 Collection summary: ${collections.length} total (${registeredCollections.length} from app, ${coreCollectionCount} from core)`)\n return collections\n } catch (error) {\n console.error('Error loading collection configurations:', error)\n return collections // Return registered collections even if core loading fails\n }\n}\n\n/**\n * Load a specific collection configuration by name\n * Note: This function requires implementation in the consuming application\n * as it depends on project-specific collection files\n */\nexport async function loadCollectionConfig(name: string): Promise {\n try {\n // Dynamic imports are not supported in library builds\n // This should be implemented in the consuming application\n console.warn('loadCollectionConfig requires implementation in consuming application')\n return null\n } catch (error) {\n console.error(`Error loading collection ${name}:`, error)\n return null\n }\n}\n\n/**\n * Get list of all available collection config file names\n */\nexport async function getAvailableCollectionNames(): Promise {\n try {\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts') || {}\n const names: string[] = []\n\n for (const path of Object.keys(modules)) {\n // Extract collection name from path\n // e.g., '../collections/blog-posts.collection.ts' -> 'blog-posts'\n const match = path.match(/\\/([^/]+)\\.collection\\.ts$/)\n if (match && match[1]) {\n names.push(match[1])\n }\n }\n\n return names\n } catch (error) {\n console.error('Error getting collection names:', error)\n return []\n }\n}\n\n/**\n * Validate a collection configuration\n */\nexport function validateCollectionConfig(config: CollectionConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push('Collection name is required')\n } else if (!/^[a-z0-9_-]+$/.test(config.name)) {\n errors.push('Collection name must contain only lowercase letters, numbers, underscores, and hyphens')\n }\n\n if (!config.displayName) {\n errors.push('Display name is required')\n }\n\n if (!config.schema) {\n errors.push('Schema is required')\n } else {\n // Validate schema structure\n if (config.schema.type !== 'object') {\n errors.push('Schema type must be \"object\"')\n }\n\n if (!config.schema.properties || typeof config.schema.properties !== 'object') {\n errors.push('Schema must have properties')\n }\n\n // Validate field types\n for (const [fieldName, fieldConfig] of Object.entries(config.schema.properties || {})) {\n if (!fieldConfig.type) {\n errors.push(`Field \"${fieldName}\" is missing type`)\n }\n\n // Validate reference fields\n if (fieldConfig.type === 'reference' && !fieldConfig.collection) {\n errors.push(`Reference field \"${fieldName}\" is missing collection property`)\n }\n\n const layoutValue = fieldConfig.objectLayout\n if (layoutValue !== undefined) {\n if (fieldConfig.type !== 'object') {\n errors.push(`Field \"${fieldName}\" uses objectLayout but is not an object field`)\n } else if (!['nested', 'flat'].includes(layoutValue)) {\n errors.push(`Object field \"${fieldName}\" has invalid objectLayout. Use \"nested\" or \"flat\"`)\n }\n }\n\n // Validate select fields\n if (['select', 'multiselect', 'radio'].includes(fieldConfig.type) && !fieldConfig.enum) {\n errors.push(`Select field \"${fieldName}\" is missing enum options`)\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n}\n","/**\n * Collection Sync Service\n *\n * Syncs collection configurations from code to the database.\n * Handles create, update, and validation of config-managed collections.\n */\n\nimport { CollectionConfig, CollectionSyncResult } from '../types/collection-config'\nimport { loadCollectionConfigs, validateCollectionConfig } from './collection-loader'\n\n/**\n * Sync all collection configurations to the database\n */\nexport async function syncCollections(db: D1Database): Promise {\n console.log('🔄 Starting collection sync...')\n\n const results: CollectionSyncResult[] = []\n const configs = await loadCollectionConfigs()\n\n if (configs.length === 0) {\n console.log('⚠️ No collection configurations found')\n return results\n }\n\n for (const config of configs) {\n const result = await syncCollection(db, config)\n results.push(result)\n }\n\n const created = results.filter(r => r.status === 'created').length\n const updated = results.filter(r => r.status === 'updated').length\n const unchanged = results.filter(r => r.status === 'unchanged').length\n const errors = results.filter(r => r.status === 'error').length\n\n console.log(`✅ Collection sync complete: ${created} created, ${updated} updated, ${unchanged} unchanged, ${errors} errors`)\n\n return results\n}\n\n/**\n * Sync a single collection configuration to the database\n */\nexport async function syncCollection(db: D1Database, config: CollectionConfig): Promise {\n try {\n // Validate config\n const validation = validateCollectionConfig(config)\n if (!validation.valid) {\n return {\n name: config.name,\n status: 'error',\n error: `Validation failed: ${validation.errors.join(', ')}`\n }\n }\n\n // Check if collection exists\n const existingStmt = db.prepare('SELECT * FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(config.name).first() as any\n\n const now = Date.now()\n const collectionId = existing?.id || `col-${config.name}-${crypto.randomUUID().slice(0, 8)}`\n\n // Prepare collection data\n const schemaJson = JSON.stringify(config.schema)\n const isActive = config.isActive !== false ? 1 : 0\n const managed = config.managed !== false ? 1 : 0\n\n if (!existing) {\n // Create new collection\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n config.name,\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n now\n ).run()\n\n console.log(` ✓ Created collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'created',\n message: `Created collection \"${config.displayName}\"`\n }\n } else {\n // Check if update is needed\n const existingSchema = existing.schema ? JSON.stringify(existing.schema) : '{}'\n const existingDisplayName = existing.display_name\n const existingDescription = existing.description\n const existingIsActive = existing.is_active\n const existingManaged = existing.managed\n\n const needsUpdate =\n schemaJson !== existingSchema ||\n config.displayName !== existingDisplayName ||\n (config.description || null) !== existingDescription ||\n isActive !== existingIsActive ||\n managed !== existingManaged\n\n if (!needsUpdate) {\n return {\n name: config.name,\n status: 'unchanged',\n message: `Collection \"${config.displayName}\" is up to date`\n }\n }\n\n // Update existing collection\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, schema = ?, is_active = ?, managed = ?, updated_at = ?\n WHERE name = ?\n `)\n\n await updateStmt.bind(\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n config.name\n ).run()\n\n console.log(` ✓ Updated collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'updated',\n message: `Updated collection \"${config.displayName}\"`\n }\n }\n } catch (error) {\n console.error(` ✗ Error syncing collection ${config.name}:`, error)\n\n return {\n name: config.name,\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n}\n\n/**\n * Check if a collection is managed by config\n */\nexport async function isCollectionManaged(db: D1Database, collectionName: string): Promise {\n try {\n const stmt = db.prepare('SELECT managed FROM collections WHERE name = ?')\n const result = await stmt.bind(collectionName).first() as any\n\n return result?.managed === 1\n } catch (error) {\n console.error(`Error checking if collection is managed:`, error)\n return false\n }\n}\n\n/**\n * Get all managed collections from database\n */\nexport async function getManagedCollections(db: D1Database): Promise {\n try {\n const stmt = db.prepare('SELECT name FROM collections WHERE managed = 1')\n const { results } = await stmt.all()\n\n return (results || []).map((row: any) => row.name)\n } catch (error) {\n console.error('Error getting managed collections:', error)\n return []\n }\n}\n\n/**\n * Remove collections that are no longer in config files\n * (Only removes managed collections that aren't in the config)\n */\nexport async function cleanupRemovedCollections(db: D1Database): Promise {\n try {\n const configs = await loadCollectionConfigs()\n const configNames = new Set(configs.map(c => c.name))\n const managedCollections = await getManagedCollections(db)\n const removed: string[] = []\n\n for (const managedName of managedCollections) {\n if (!configNames.has(managedName)) {\n // This managed collection no longer has a config file\n // Mark as inactive instead of deleting (safer)\n const updateStmt = db.prepare(`\n UPDATE collections\n SET is_active = 0, updated_at = ?\n WHERE name = ? AND managed = 1\n `)\n\n await updateStmt.bind(Date.now(), managedName).run()\n removed.push(managedName)\n console.log(` ⚠️ Deactivated removed collection: ${managedName}`)\n }\n }\n\n return removed\n } catch (error) {\n console.error('Error cleaning up removed collections:', error)\n return []\n }\n}\n\n/**\n * Full sync: sync all configs and cleanup removed\n */\nexport async function fullCollectionSync(db: D1Database): Promise<{\n results: CollectionSyncResult[]\n removed: string[]\n}> {\n const results = await syncCollections(db)\n const removed = await cleanupRemovedCollections(db)\n\n return { results, removed }\n}\n","/**\n * Form-Collection Sync Service\n *\n * Bridge logic that creates \"shadow collections\" for forms and\n * dual-writes form submissions to the content table, enabling\n * unified content management for form submissions.\n */\n\nconst SYSTEM_FORM_USER_ID = 'system-form-submission'\n\n/**\n * Convert Form.io component type to collection schema field type\n */\nfunction mapFormioTypeToSchemaType(component: any): { type: string; [key: string]: any } {\n switch (component.type) {\n case 'textfield':\n case 'textarea':\n case 'password':\n case 'phoneNumber':\n case 'url':\n return { type: 'string', title: component.label || component.key }\n case 'email':\n return { type: 'string', format: 'email', title: component.label || component.key }\n case 'number':\n case 'currency':\n return { type: 'number', title: component.label || component.key }\n case 'checkbox':\n return { type: 'boolean', title: component.label || component.key }\n case 'select':\n case 'radio': {\n const enumValues = (component.data?.values || component.values || []).map((v: any) => v.value)\n const enumLabels = (component.data?.values || component.values || []).map((v: any) => v.label)\n return {\n type: 'select',\n title: component.label || component.key,\n enum: enumValues,\n enumLabels\n }\n }\n case 'selectboxes':\n return { type: 'object', title: component.label || component.key }\n case 'datetime':\n case 'day':\n case 'time':\n return { type: 'string', format: 'date-time', title: component.label || component.key }\n case 'file':\n case 'signature':\n return { type: 'string', title: component.label || component.key }\n case 'address':\n return { type: 'object', title: component.label || component.key }\n case 'hidden':\n return { type: 'string', title: component.label || component.key }\n default:\n return { type: 'string', title: component.label || component.key }\n }\n}\n\n/**\n * Recursively extract field components from a Form.io schema,\n * skipping layout-only components (panels, columns, fieldsets, etc.)\n */\nfunction extractFieldComponents(components: any[]): any[] {\n const fields: any[] = []\n if (!components) return fields\n\n for (const comp of components) {\n // Layout components — recurse into children\n if (comp.type === 'panel' || comp.type === 'fieldset' || comp.type === 'well' || comp.type === 'tabs') {\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n continue\n }\n if (comp.type === 'columns' && comp.columns) {\n for (const col of comp.columns) {\n if (col.components) {\n fields.push(...extractFieldComponents(col.components))\n }\n }\n continue\n }\n if (comp.type === 'table' && comp.rows) {\n for (const row of comp.rows) {\n if (Array.isArray(row)) {\n for (const cell of row) {\n if (cell.components) {\n fields.push(...extractFieldComponents(cell.components))\n }\n }\n }\n }\n continue\n }\n // Skip buttons and non-input layout elements\n if (comp.type === 'button' || comp.type === 'htmlelement' || comp.type === 'content') {\n continue\n }\n // Skip turnstile (not data)\n if (comp.type === 'turnstile') {\n continue\n }\n // It's a real field\n if (comp.key) {\n fields.push(comp)\n }\n // Recurse into sub-components for containers\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n }\n return fields\n}\n\n/**\n * Convert a Form.io schema into a collection JSON schema definition\n */\nexport function deriveCollectionSchemaFromFormio(formioSchema: any): any {\n const components = formioSchema?.components || []\n const fieldComponents = extractFieldComponents(components)\n\n const properties: Record = {\n // Always include a title field for the content item\n title: { type: 'string', title: 'Title', required: true }\n }\n const required: string[] = ['title']\n\n for (const comp of fieldComponents) {\n const key = comp.key\n if (!key || key === 'submit' || key === 'title') continue\n const fieldDef = mapFormioTypeToSchemaType(comp)\n if (comp.validate?.required) {\n fieldDef.required = true\n required.push(key)\n }\n properties[key] = fieldDef\n }\n\n return { type: 'object', properties, required }\n}\n\n/**\n * Derive a human-readable title from form submission data\n */\nexport function deriveSubmissionTitle(data: Record, formDisplayName: string): string {\n // Try common fields in order of preference\n const candidates = ['name', 'fullName', 'full_name', 'firstName', 'first_name']\n for (const key of candidates) {\n if (data[key] && typeof data[key] === 'string' && data[key].trim()) {\n // Append last name if available\n if (key === 'firstName' || key === 'first_name') {\n const last = data['lastName'] || data['last_name'] || data['lastname'] || ''\n if (last) return `${data[key].trim()} ${last.trim()}`\n }\n return data[key].trim()\n }\n }\n // Try email\n if (data.email && typeof data.email === 'string' && data.email.trim()) {\n return data.email.trim()\n }\n // Try subject\n if (data.subject && typeof data.subject === 'string' && data.subject.trim()) {\n return data.subject.trim()\n }\n // Fallback\n const dateStr = new Date().toLocaleDateString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })\n return `${formDisplayName} - ${dateStr}`\n}\n\n/**\n * Map form submission status to content status.\n * Form submissions are complete data — they default to 'published'.\n * Only rejected/spam submissions get demoted.\n */\nexport function mapFormStatusToContentStatus(formStatus: string): string {\n switch (formStatus) {\n case 'pending': return 'published'\n case 'reviewed': return 'published'\n case 'approved': return 'published'\n case 'rejected': return 'archived'\n case 'spam': return 'deleted'\n default: return 'published'\n }\n}\n\n/**\n * Create or update a shadow collection for a given form\n */\nexport async function syncFormCollection(db: D1Database, form: {\n id: string\n name: string\n display_name: string\n description?: string | null\n formio_schema: any\n is_active: number | boolean\n}): Promise<{ collectionId: string; status: 'created' | 'updated' | 'unchanged' }> {\n const collectionName = `form_${form.name}`\n const displayName = `${form.display_name} (Form)`\n\n // Parse formio_schema\n const formioSchema = typeof form.formio_schema === 'string'\n ? JSON.parse(form.formio_schema)\n : form.formio_schema\n\n const schema = deriveCollectionSchemaFromFormio(formioSchema)\n const schemaJson = JSON.stringify(schema)\n const now = Date.now()\n const isActive = form.is_active ? 1 : 0\n\n // Check if shadow collection already exists\n const existing = await db.prepare(\n 'SELECT id, schema, display_name, description, is_active FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!existing) {\n // Create new shadow collection\n const collectionId = `col-form-${form.name}-${crypto.randomUUID().slice(0, 8)}`\n\n await db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, source_type, source_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, 1, 'form', ?, ?, ?)\n `).bind(\n collectionId,\n collectionName,\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n form.id,\n now,\n now\n ).run()\n\n console.log(`[FormSync] Created shadow collection: ${collectionName}`)\n return { collectionId, status: 'created' }\n }\n\n // Check if update needed\n const existingSchema = existing.schema ? JSON.stringify(typeof existing.schema === 'string' ? JSON.parse(existing.schema) : existing.schema) : '{}'\n const needsUpdate =\n schemaJson !== existingSchema ||\n displayName !== existing.display_name ||\n (form.description || null) !== existing.description ||\n isActive !== existing.is_active\n\n if (!needsUpdate) {\n return { collectionId: existing.id, status: 'unchanged' }\n }\n\n await db.prepare(`\n UPDATE collections SET display_name = ?, description = ?, schema = ?, is_active = ?, updated_at = ?\n WHERE id = ?\n `).bind(\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n now,\n existing.id\n ).run()\n\n console.log(`[FormSync] Updated shadow collection: ${collectionName}`)\n return { collectionId: existing.id, status: 'updated' }\n}\n\n/**\n * Sync all active forms to shadow collections\n */\nexport async function syncAllFormCollections(db: D1Database): Promise {\n try {\n // Check if forms table exists\n const tableCheck = await db.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='forms'\"\n ).first()\n if (!tableCheck) {\n console.log('[FormSync] Forms table does not exist, skipping form sync')\n return\n }\n\n const { results: forms } = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms'\n ).all()\n\n if (!forms || forms.length === 0) {\n console.log('[FormSync] No forms found, skipping')\n return\n }\n\n let created = 0\n let updated = 0\n\n for (const form of forms) {\n try {\n const result = await syncFormCollection(db, form as any)\n if (result.status === 'created') created++\n if (result.status === 'updated') updated++\n\n // Backfill existing submissions that don't have content_id\n await backfillFormSubmissions(db, form.id as string, result.collectionId)\n } catch (error) {\n console.error(`[FormSync] Error syncing form ${form.name}:`, error)\n }\n }\n\n console.log(`[FormSync] Sync complete: ${created} created, ${updated} updated out of ${forms.length} forms`)\n } catch (error) {\n console.error('[FormSync] Error syncing form collections:', error)\n }\n}\n\n/**\n * Create a content item from a form submission\n */\nexport async function createContentFromSubmission(\n db: D1Database,\n submissionData: Record,\n form: { id: string; name: string; display_name: string },\n submissionId: string,\n metadata: {\n ipAddress?: string | null\n userAgent?: string | null\n userEmail?: string | null\n userId?: string | null\n } = {}\n): Promise {\n try {\n // Find the shadow collection\n let collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!collection) {\n // Shadow collection missing — try to create it on the fly\n console.warn(`[FormSync] No shadow collection found for form ${form.name}, attempting to create...`)\n try {\n const fullForm = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms WHERE id = ?'\n ).bind(form.id).first() as any\n\n if (fullForm) {\n const schema = typeof fullForm.formio_schema === 'string'\n ? JSON.parse(fullForm.formio_schema)\n : fullForm.formio_schema\n const result = await syncFormCollection(db, {\n id: fullForm.id,\n name: fullForm.name,\n display_name: fullForm.display_name,\n description: fullForm.description,\n formio_schema: schema,\n is_active: fullForm.is_active ?? 1\n })\n // Re-query the collection\n collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n console.log(`[FormSync] On-the-fly sync result: ${result.status}, collectionId: ${result.collectionId}`)\n }\n } catch (syncErr) {\n console.error('[FormSync] On-the-fly shadow collection creation failed:', syncErr)\n }\n\n if (!collection) {\n console.error(`[FormSync] Still no shadow collection for form ${form.name} after recovery attempt`)\n return null\n }\n }\n\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const title = deriveSubmissionTitle(submissionData, form.display_name)\n const slug = `submission-${submissionId.slice(0, 8)}`\n\n // Build content data with embedded metadata\n const contentData: Record = {\n title,\n ...submissionData,\n _submission_metadata: {\n submissionId,\n formId: form.id,\n formName: form.name,\n email: metadata.userEmail || submissionData.email || null,\n ipAddress: metadata.ipAddress || null,\n userAgent: metadata.userAgent || null,\n submittedAt: now\n }\n }\n\n const authorId = metadata.userId || SYSTEM_FORM_USER_ID\n\n // Ensure the system user exists (D1 enforces foreign keys)\n if (authorId === SYSTEM_FORM_USER_ID) {\n const systemUser = await db.prepare('SELECT id FROM users WHERE id = ?').bind(SYSTEM_FORM_USER_ID).first()\n if (!systemUser) {\n console.log('[FormSync] System form user missing, creating...')\n const sysNow = Date.now()\n await db.prepare(`\n INSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 0, ?, ?)\n `).bind(SYSTEM_FORM_USER_ID, 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', sysNow, sysNow).run()\n }\n }\n\n console.log(`[FormSync] Inserting content: id=${contentId}, collection=${collection.id}, slug=${slug}, title=${title}, author=${authorId}`)\n\n await db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, 'published', ?, ?, ?)\n `).bind(\n contentId,\n collection.id,\n slug,\n title,\n JSON.stringify(contentData),\n authorId,\n now,\n now\n ).run()\n\n // Link submission to content\n await db.prepare(\n 'UPDATE form_submissions SET content_id = ? WHERE id = ?'\n ).bind(contentId, submissionId).run()\n\n console.log(`[FormSync] Content created successfully: ${contentId}`)\n return contentId\n } catch (error) {\n console.error('[FormSync] Error creating content from submission:', error)\n return null\n }\n}\n\n/**\n * Backfill existing form submissions that don't have a content_id\n */\nexport async function backfillFormSubmissions(\n db: D1Database,\n formId: string,\n collectionId: string\n): Promise {\n try {\n const { results: submissions } = await db.prepare(\n 'SELECT id, submission_data, user_email, ip_address, user_agent, user_id, submitted_at FROM form_submissions WHERE form_id = ? AND content_id IS NULL'\n ).bind(formId).all()\n\n if (!submissions || submissions.length === 0) {\n return 0\n }\n\n // Get form info\n const form = await db.prepare(\n 'SELECT id, name, display_name FROM forms WHERE id = ?'\n ).bind(formId).first() as any\n\n if (!form) return 0\n\n let count = 0\n for (const sub of submissions) {\n try {\n const submissionData = typeof sub.submission_data === 'string'\n ? JSON.parse(sub.submission_data as string)\n : sub.submission_data\n\n const contentId = await createContentFromSubmission(\n db,\n submissionData,\n { id: form.id, name: form.name, display_name: form.display_name },\n sub.id as string,\n {\n ipAddress: sub.ip_address as string | null,\n userAgent: sub.user_agent as string | null,\n userEmail: sub.user_email as string | null,\n userId: sub.user_id as string | null\n }\n )\n if (contentId) count++\n } catch (error) {\n console.error(`[FormSync] Error backfilling submission ${sub.id}:`, error)\n }\n }\n\n if (count > 0) {\n console.log(`[FormSync] Backfilled ${count} submissions for form ${formId}`)\n }\n return count\n } catch (error) {\n console.error('[FormSync] Error backfilling submissions:', error)\n return 0\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\n// Note: PLUGIN_REGISTRY and CORE_PLUGIN_IDS are project-specific\n// They should be passed as parameters to the service in the consuming application\n// import { PLUGIN_REGISTRY, CORE_PLUGIN_IDS } from '../plugins/plugin-registry'\n\nexport interface PluginData {\n id: string\n name: string\n display_name: string\n description: string\n version: string\n author: string\n category: string\n icon: string\n status: 'active' | 'inactive' | 'error'\n is_core: boolean\n settings?: any\n permissions?: string[]\n dependencies?: string[]\n download_count: number\n rating: number\n installed_at: number\n activated_at?: number\n last_updated: number\n error_message?: string\n}\n\nexport interface PluginStats {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n}\n\nexport class PluginService {\n constructor(private db: D1Database) {}\n\n async getAllPlugins(): Promise {\n // Ensure all plugins from registry exist in database (auto-install if missing)\n await this.ensureAllPluginsExist()\n\n const stmt = this.db.prepare(`\n SELECT * FROM plugins\n ORDER BY is_core DESC, display_name ASC\n `)\n\n const { results } = await stmt.all()\n return (results || []).map(this.mapPluginFromDb)\n }\n\n /**\n * Ensure all plugins from the registry exist in the database\n * Auto-installs any newly detected plugins with inactive status\n *\n * Note: This method should be overridden or configured with a plugin registry\n * in the consuming application\n */\n private async ensureAllPluginsExist(): Promise {\n // This functionality requires a project-specific PLUGIN_REGISTRY\n // In the consuming application, you should pass the registry to this service\n console.log('[PluginService] ensureAllPluginsExist - requires PLUGIN_REGISTRY configuration')\n }\n\n async getPlugin(pluginId: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE id = ?')\n const plugin = await stmt.bind(pluginId).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginByName(name: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE name = ?')\n const plugin = await stmt.bind(name).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginStats(): Promise {\n const stmt = this.db.prepare(`\n SELECT \n COUNT(*) as total,\n COUNT(CASE WHEN status = 'active' THEN 1 END) as active,\n COUNT(CASE WHEN status = 'inactive' THEN 1 END) as inactive,\n COUNT(CASE WHEN status = 'error' THEN 1 END) as errors\n FROM plugins\n `)\n \n const stats = await stmt.first() as any\n return {\n total: stats.total || 0,\n active: stats.active || 0,\n inactive: stats.inactive || 0,\n errors: stats.errors || 0,\n uninstalled: 0\n }\n }\n\n async installPlugin(pluginData: Partial): Promise {\n const id = pluginData.id || `plugin-${Date.now()}`\n const now = Math.floor(Date.now() / 1000)\n \n const stmt = this.db.prepare(`\n INSERT INTO plugins (\n id, name, display_name, description, version, author, category, icon,\n status, is_core, settings, permissions, dependencies, download_count, \n rating, installed_at, last_updated\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginData.name || id,\n pluginData.display_name || 'Unnamed Plugin',\n pluginData.description || '',\n pluginData.version || '1.0.0',\n pluginData.author || 'Unknown',\n pluginData.category || 'utilities',\n pluginData.icon || '🔌',\n 'inactive',\n pluginData.is_core || false,\n JSON.stringify(pluginData.settings || {}),\n JSON.stringify(pluginData.permissions || []),\n JSON.stringify(pluginData.dependencies || []),\n pluginData.download_count || 0,\n pluginData.rating || 0,\n now,\n now\n ).run()\n \n // Log the installation\n await this.logActivity(id, 'installed', null, { version: pluginData.version })\n \n const installed = await this.getPlugin(id)\n if (!installed) throw new Error('Failed to install plugin')\n \n return installed\n }\n\n async uninstallPlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n if (plugin.is_core) throw new Error('Cannot uninstall core plugins')\n \n // First deactivate if active\n if (plugin.status === 'active') {\n await this.deactivatePlugin(pluginId)\n }\n \n // Delete the plugin\n const stmt = this.db.prepare('DELETE FROM plugins WHERE id = ?')\n await stmt.bind(pluginId).run()\n \n // Log the uninstallation\n await this.logActivity(pluginId, 'uninstalled', null, { name: plugin.name })\n }\n\n async activatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check dependencies\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n await this.checkDependencies(plugin.dependencies)\n }\n \n const now = Math.floor(Date.now() / 1000)\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'active', activated_at = ?, error_message = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(now, pluginId).run()\n \n // Log the activation\n await this.logActivity(pluginId, 'activated', null)\n }\n\n async deactivatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check if other plugins depend on this one\n await this.checkDependents(plugin.name)\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'inactive', activated_at = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(pluginId).run()\n \n // Log the deactivation\n await this.logActivity(pluginId, 'deactivated', null)\n }\n\n async updatePluginSettings(pluginId: string, settings: any): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET settings = ?, updated_at = unixepoch() \n WHERE id = ?\n `)\n \n await stmt.bind(JSON.stringify(settings), pluginId).run()\n \n // Log the settings update\n await this.logActivity(pluginId, 'settings_updated', null)\n }\n\n async setPluginError(pluginId: string, error: string): Promise {\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'error', error_message = ? \n WHERE id = ?\n `)\n \n await stmt.bind(error, pluginId).run()\n \n // Log the error\n await this.logActivity(pluginId, 'error', null, { error })\n }\n\n async getPluginActivity(pluginId: string, limit: number = 10): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_activity_log \n WHERE plugin_id = ? \n ORDER BY timestamp DESC \n LIMIT ?\n `)\n \n const { results } = await stmt.bind(pluginId, limit).all()\n return (results || []).map((row: any) => ({\n id: row.id,\n action: row.action,\n userId: row.user_id,\n details: row.details ? JSON.parse(row.details) : null,\n timestamp: row.timestamp\n }))\n }\n\n async registerHook(pluginId: string, hookName: string, handlerName: string, priority: number = 10): Promise {\n const id = `hook-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_hooks (id, plugin_id, hook_name, handler_name, priority)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(id, pluginId, hookName, handlerName, priority).run()\n }\n\n async registerRoute(pluginId: string, path: string, method: string, handlerName: string, middleware?: any[]): Promise {\n const id = `route-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_routes (id, plugin_id, path, method, handler_name, middleware)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id, \n pluginId, \n path, \n method, \n handlerName, \n JSON.stringify(middleware || [])\n ).run()\n }\n\n async getPluginHooks(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_hooks \n WHERE plugin_id = ? AND is_active = TRUE\n ORDER BY priority ASC\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n async getPluginRoutes(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_routes \n WHERE plugin_id = ? AND is_active = TRUE\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n private async checkDependencies(dependencies: string[]): Promise {\n for (const dep of dependencies) {\n const plugin = await this.getPluginByName(dep)\n if (!plugin || plugin.status !== 'active') {\n throw new Error(`Required dependency '${dep}' is not active`)\n }\n }\n }\n\n private async checkDependents(pluginName: string): Promise {\n const stmt = this.db.prepare(`\n SELECT id, display_name FROM plugins \n WHERE status = 'active' \n AND dependencies LIKE ?\n `)\n \n const { results } = await stmt.bind(`%\"${pluginName}\"%`).all()\n if (results && results.length > 0) {\n const names = results.map((p: any) => p.display_name).join(', ')\n throw new Error(`Cannot deactivate. The following plugins depend on this one: ${names}`)\n }\n }\n\n private async logActivity(pluginId: string, action: string, userId: string | null, details?: any): Promise {\n const id = `activity-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_activity_log (id, plugin_id, action, user_id, details)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginId,\n action,\n userId,\n details ? JSON.stringify(details) : null\n ).run()\n }\n\n private mapPluginFromDb(row: any): PluginData {\n return {\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n version: row.version,\n author: row.author,\n category: row.category,\n icon: row.icon,\n status: row.status,\n is_core: row.is_core === 1,\n settings: row.settings ? JSON.parse(row.settings) : undefined,\n permissions: row.permissions ? JSON.parse(row.permissions) : undefined,\n dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,\n download_count: row.download_count || 0,\n rating: row.rating || 0,\n installed_at: row.installed_at,\n activated_at: row.activated_at,\n last_updated: row.last_updated,\n error_message: row.error_message\n }\n }\n}\n","/**\n * Plugin Registry - AUTO-GENERATED\n *\n * Generated by: packages/scripts/generate-plugin-registry.mjs\n * Generated at: 2026-05-16T15:00:20.475Z\n * Source: All manifest.json files in src/plugins/\n *\n * DO NOT EDIT MANUALLY - run the generator script instead.\n * To add a new plugin, create a manifest.json in the plugin directory.\n */\n\nexport interface PluginRegistryEntry {\n id: string\n codeName: string\n displayName: string\n description: string\n version: string\n author: string\n category: string\n iconEmoji: string\n is_core: boolean\n permissions: string[]\n dependencies: string[]\n defaultSettings: Record\n adminMenu: {\n label: string\n icon: string\n path: string\n order: number\n } | null\n}\n\n/**\n * All discovered plugins, keyed by plugin ID.\n */\nexport const PLUGIN_REGISTRY: Record = {\n 'ai-search': {\n \"id\": \"ai-search\",\n \"codeName\": \"ai-search-plugin\",\n \"displayName\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"path\": \"/admin/plugins/ai-search\",\n \"order\": 50\n }\n },\n\n 'code-examples-plugin': {\n \"id\": \"code-examples-plugin\",\n \"codeName\": \"code-examples-plugin\",\n \"displayName\": \"Code Examples\",\n \"description\": \"Code snippets and examples library with syntax highlighting and categorization\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💻\",\n \"is_core\": false,\n \"permissions\": [\n \"code-examples:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'core-analytics': {\n \"id\": \"core-analytics\",\n \"codeName\": \"core-analytics\",\n \"displayName\": \"Analytics & Insights\",\n \"description\": \"Core analytics system for tracking page views, user behavior, and content performance. Provides dashboards and reports with real-time metrics\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"seo\",\n \"iconEmoji\": \"📊\",\n \"is_core\": true,\n \"permissions\": [\n \"analytics:view\",\n \"analytics:export\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Analytics\",\n \"icon\": \"chart-bar\",\n \"path\": \"/admin/analytics\",\n \"order\": 50\n }\n },\n\n 'core-auth': {\n \"id\": \"core-auth\",\n \"codeName\": \"core-auth\",\n \"displayName\": \"Authentication System\",\n \"description\": \"Core authentication and user management system with role-based access control, session management, and security features\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔐\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:users\",\n \"manage:roles\",\n \"manage:permissions\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"requiredFields\": {\n \"email\": {\n \"required\": true,\n \"minLength\": 5,\n \"label\": \"Email\",\n \"type\": \"email\"\n },\n \"password\": {\n \"required\": true,\n \"minLength\": 8,\n \"label\": \"Password\",\n \"type\": \"password\"\n },\n \"username\": {\n \"required\": true,\n \"minLength\": 3,\n \"label\": \"Username\",\n \"type\": \"text\"\n },\n \"firstName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"First Name\",\n \"type\": \"text\"\n },\n \"lastName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"Last Name\",\n \"type\": \"text\"\n }\n },\n \"validation\": {\n \"emailFormat\": true,\n \"allowDuplicateUsernames\": false,\n \"passwordRequirements\": {\n \"requireUppercase\": false,\n \"requireLowercase\": false,\n \"requireNumbers\": false,\n \"requireSpecialChars\": false\n }\n },\n \"registration\": {\n \"enabled\": true,\n \"requireEmailVerification\": false,\n \"defaultRole\": \"viewer\"\n }\n },\n \"adminMenu\": null\n },\n\n 'core-cache': {\n \"id\": \"core-cache\",\n \"codeName\": \"core-cache\",\n \"displayName\": \"Cache System\",\n \"description\": \"Three-tiered caching system with in-memory and KV storage. Provides automatic caching for content, users, media, and API responses with configurable TTL and invalidation patterns.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"system\",\n \"iconEmoji\": \"⚡\",\n \"is_core\": true,\n \"permissions\": [\n \"cache.view\",\n \"cache.clear\",\n \"cache.invalidate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableMemoryCache\": true,\n \"enableKVCache\": true,\n \"enableDatabaseCache\": true,\n \"defaultTTL\": 3600\n },\n \"adminMenu\": null\n },\n\n 'core-media': {\n \"id\": \"core-media\",\n \"codeName\": \"core-media\",\n \"displayName\": \"Media Manager\",\n \"description\": \"Core media upload and management system with support for images, videos, and documents. Includes automatic optimization, thumbnail generation, and cloud storage integration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"media\",\n \"iconEmoji\": \"📸\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:media\",\n \"upload:files\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Media\",\n \"icon\": \"image\",\n \"path\": \"/admin/media\",\n \"order\": 30\n }\n },\n\n 'database-tools': {\n \"id\": \"database-tools\",\n \"codeName\": \"database-tools\",\n \"displayName\": \"Database Tools\",\n \"description\": \"Database management and administration tools including migrations, backups, and query execution\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🗄️\",\n \"is_core\": false,\n \"permissions\": [\n \"database:admin\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableTruncate\": true,\n \"enableBackup\": true,\n \"enableValidation\": true,\n \"requireConfirmation\": true\n },\n \"adminMenu\": null\n },\n\n 'demo-login-plugin': {\n \"id\": \"demo-login-plugin\",\n \"codeName\": \"demo-login-plugin\",\n \"displayName\": \"Demo Login\",\n \"description\": \"Quick demo login functionality for testing and demonstrations\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎯\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"core-auth\"\n ],\n \"defaultSettings\": {\n \"enableNotice\": true,\n \"demoEmail\": \"admin@sonicjs.com\",\n \"demoPassword\": \"sonicjs!\"\n },\n \"adminMenu\": null\n },\n\n 'design': {\n \"id\": \"design\",\n \"codeName\": \"design\",\n \"displayName\": \"Design System\",\n \"description\": \"Design system management including themes, components, and UI customization. Provides a visual interface for managing design tokens, typography, colors, and component library.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎨\",\n \"is_core\": false,\n \"permissions\": [\n \"design.view\",\n \"design.edit\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultTheme\": \"light\",\n \"customCSS\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Design\",\n \"icon\": \"palette\",\n \"path\": \"/admin/design\",\n \"order\": 80\n }\n },\n\n 'easy-mdx': {\n \"id\": \"easy-mdx\",\n \"codeName\": \"easy-mdx\",\n \"displayName\": \"EasyMDE Markdown Editor\",\n \"description\": \"Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultHeight\": 400,\n \"theme\": \"dark\",\n \"toolbar\": \"full\",\n \"placeholder\": \"Start writing your content...\"\n },\n \"adminMenu\": null\n },\n\n 'email': {\n \"id\": \"email\",\n \"codeName\": \"email\",\n \"displayName\": \"Email\",\n \"description\": \"Send transactional emails using Resend\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"📧\",\n \"is_core\": false,\n \"permissions\": [\n \"email:manage\",\n \"email:send\",\n \"email:view-logs\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"\",\n \"fromEmail\": \"\",\n \"fromName\": \"\",\n \"replyTo\": \"\",\n \"logoUrl\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Email\",\n \"icon\": \"envelope\",\n \"path\": \"/admin/plugins/email/settings\",\n \"order\": 80\n }\n },\n\n 'global-variables': {\n \"id\": \"global-variables\",\n \"codeName\": \"global-variables\",\n \"displayName\": \"Global Variables\",\n \"description\": \"Dynamic content variables with inline token support. Manage key-value variables via admin UI and use {variable_key} syntax in rich text fields for server-side resolution. Includes full CRUD admin page.\",\n \"version\": \"1.1.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔤\",\n \"is_core\": false,\n \"permissions\": [\n \"global-variables:manage\",\n \"global-variables:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableResolution\": true,\n \"cacheEnabled\": true,\n \"cacheTTL\": 300\n },\n \"adminMenu\": {\n \"label\": \"Global Variables\",\n \"icon\": \"variable\",\n \"path\": \"/admin/global-variables\",\n \"order\": 45\n }\n },\n\n 'hello-world': {\n \"id\": \"hello-world\",\n \"codeName\": \"hello-world\",\n \"displayName\": \"Hello World\",\n \"description\": \"A simple Hello World plugin demonstration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"👋\",\n \"is_core\": false,\n \"permissions\": [\n \"hello-world:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Hello World\",\n \"icon\": \"hand-raised\",\n \"path\": \"/admin/hello-world\",\n \"order\": 90\n }\n },\n\n 'magic-link-auth': {\n \"id\": \"magic-link-auth\",\n \"codeName\": \"magic-link-auth\",\n \"displayName\": \"Magic Link Authentication\",\n \"description\": \"Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔗\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"linkExpiryMinutes\": 15,\n \"rateLimitPerHour\": 5,\n \"allowNewUsers\": true\n },\n \"adminMenu\": null\n },\n\n 'oauth-providers': {\n \"id\": \"oauth-providers\",\n \"codeName\": \"oauth-providers\",\n \"displayName\": \"OAuth Providers\",\n \"description\": \"OAuth2/OIDC social login with GitHub, Google, and more\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"authentication\",\n \"iconEmoji\": \"🔑\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"providers\": {\n \"github\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n },\n \"google\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n }\n }\n },\n \"adminMenu\": null\n },\n\n 'otp-login': {\n \"id\": \"otp-login\",\n \"codeName\": \"otp-login\",\n \"displayName\": \"OTP Login\",\n \"description\": \"Passwordless authentication via email one-time codes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔢\",\n \"is_core\": false,\n \"permissions\": [\n \"otp:manage\",\n \"otp:request\",\n \"otp:verify\"\n ],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"codeLength\": 6,\n \"codeExpiryMinutes\": 10,\n \"maxAttempts\": 3,\n \"rateLimitPerHour\": 5,\n \"allowNewUserRegistration\": false,\n \"logoUrl\": \"\",\n \"logoWidth\": 150,\n \"logoBorderWidth\": 0,\n \"logoBorderColor\": \"#ffffff\",\n \"loginUrl\": \"\",\n \"loginButtonText\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"OTP Login\",\n \"icon\": \"key\",\n \"path\": \"/admin/plugins/otp-login/settings\",\n \"order\": 85\n }\n },\n\n 'quill-editor': {\n \"id\": \"quill-editor\",\n \"codeName\": \"quill-editor\",\n \"displayName\": \"Quill Rich Text Editor\",\n \"description\": \"Quill WYSIWYG editor integration for rich text editing. Lightweight, modern editor with customizable toolbars and dark mode support.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"✍️\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"version\": \"2.0.2\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"theme\": \"snow\"\n },\n \"adminMenu\": null\n },\n\n 'redirect-management': {\n \"id\": \"redirect-management\",\n \"codeName\": \"redirect-management\",\n \"displayName\": \"Redirect Management\",\n \"description\": \"URL redirect management with exact, partial, and regex matching\",\n \"version\": \"1.0.0\",\n \"author\": \"ahaas\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"↪️\",\n \"is_core\": false,\n \"permissions\": [\n \"redirect.manage\",\n \"redirect.view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"autoOffloadEnabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Redirects\",\n \"icon\": \"arrow-right\",\n \"path\": \"/admin/redirects\",\n \"order\": 85\n }\n },\n\n 'security-audit': {\n \"id\": \"security-audit\",\n \"codeName\": \"security-audit\",\n \"displayName\": \"Security Audit\",\n \"description\": \"Security event logging, brute-force detection, and analytics dashboard. Monitors login attempts, registrations, lockouts, and suspicious activity.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": false,\n \"permissions\": [\n \"security-audit:view\",\n \"security-audit:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"retention\": {\n \"daysToKeep\": 90,\n \"maxEvents\": 100000,\n \"autoPurge\": true\n },\n \"bruteForce\": {\n \"enabled\": true,\n \"maxFailedAttemptsPerIP\": 10,\n \"maxFailedAttemptsPerEmail\": 5,\n \"windowMinutes\": 15,\n \"lockoutDurationMinutes\": 30,\n \"alertThreshold\": 20\n },\n \"logging\": {\n \"logSuccessfulLogins\": true,\n \"logLogouts\": true,\n \"logRegistrations\": true,\n \"logPasswordResets\": true,\n \"logPermissionDenied\": true\n }\n },\n \"adminMenu\": {\n \"label\": \"Security Audit\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/security-audit\",\n \"order\": 85\n }\n },\n\n 'seed-data': {\n \"id\": \"seed-data\",\n \"codeName\": \"seed-data\",\n \"displayName\": \"Seed Data Generator\",\n \"description\": \"Development tool for generating sample data and testing content. Useful for demos and development environments\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🌱\",\n \"is_core\": false,\n \"permissions\": [\n \"seed-data:generate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"userCount\": 20,\n \"contentCount\": 200,\n \"defaultPassword\": \"password123\"\n },\n \"adminMenu\": null\n },\n\n 'shortcodes': {\n \"id\": \"shortcodes\",\n \"codeName\": \"shortcodes\",\n \"displayName\": \"Shortcodes\",\n \"description\": \"Registered shortcode functions for dynamic content. Use [[shortcode_name param=\\\"value\\\"]] syntax in rich text fields for server-side resolution. Includes handler registry, CRUD admin, and live preview.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"\",\n \"is_core\": false,\n \"permissions\": [\n \"shortcodes:manage\",\n \"shortcodes:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Shortcodes\",\n \"icon\": \"bolt\",\n \"path\": \"/admin/shortcodes\",\n \"order\": 46\n }\n },\n\n 'stripe': {\n \"id\": \"stripe\",\n \"codeName\": \"stripe\",\n \"displayName\": \"Stripe Subscriptions\",\n \"description\": \"Stripe subscription management with webhook handling, checkout sessions, and subscription gating\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"payments\",\n \"iconEmoji\": \"💳\",\n \"is_core\": true,\n \"permissions\": [\n \"stripe:manage\",\n \"stripe:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"stripeSecretKey\": \"\",\n \"stripeWebhookSecret\": \"\",\n \"stripePriceId\": \"\",\n \"successUrl\": \"/admin/dashboard\",\n \"cancelUrl\": \"/admin/dashboard\"\n },\n \"adminMenu\": {\n \"label\": \"Stripe\",\n \"icon\": \"credit-card\",\n \"path\": \"/admin/plugins/stripe\",\n \"order\": 90\n }\n },\n\n 'testimonials-plugin': {\n \"id\": \"testimonials-plugin\",\n \"codeName\": \"testimonials-plugin\",\n \"displayName\": \"Testimonials\",\n \"description\": \"Customer testimonials and reviews management with display widgets and ratings\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💬\",\n \"is_core\": false,\n \"permissions\": [\n \"testimonials:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'tinymce-plugin': {\n \"id\": \"tinymce-plugin\",\n \"codeName\": \"tinymce-plugin\",\n \"displayName\": \"TinyMCE Rich Text Editor\",\n \"description\": \"Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"no-api-key\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"skin\": \"oxide-dark\"\n },\n \"adminMenu\": null\n },\n\n 'turnstile': {\n \"id\": \"turnstile\",\n \"codeName\": \"turnstile-plugin\",\n \"displayName\": \"Cloudflare Turnstile\",\n \"description\": \"CAPTCHA-free bot protection using Cloudflare Turnstile. Provides reusable verification for any form.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"siteKey\": \"\",\n \"secretKey\": \"\",\n \"theme\": \"auto\",\n \"size\": \"normal\",\n \"mode\": \"managed\",\n \"appearance\": \"always\",\n \"preClearanceEnabled\": false,\n \"preClearanceLevel\": \"managed\",\n \"enabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Turnstile\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/turnstile/settings\",\n \"order\": 100\n }\n },\n\n 'user-profiles': {\n \"id\": \"user-profiles\",\n \"codeName\": \"user-profiles\",\n \"displayName\": \"User Profiles\",\n \"description\": \"Configurable custom profile fields for users\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"users\",\n \"iconEmoji\": \"👤\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'workflow-plugin': {\n \"id\": \"workflow-plugin\",\n \"codeName\": \"workflow-plugin\",\n \"displayName\": \"Workflow Engine\",\n \"description\": \"Content workflow and approval system with customizable states, transitions, and review processes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔄\",\n \"is_core\": false,\n \"permissions\": [\n \"workflow:manage\",\n \"workflow:approve\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableApprovalChains\": true,\n \"enableScheduling\": true,\n \"enableAutomation\": true,\n \"enableNotifications\": true\n },\n \"adminMenu\": null\n }\n} as const\n\n/**\n * All plugin IDs.\n */\nexport const ALL_PLUGIN_IDS = Object.keys(PLUGIN_REGISTRY)\n\n/**\n * Plugins that have their own admin page (have an adminMenu entry).\n */\nexport const PLUGINS_WITH_ADMIN_PAGES = ALL_PLUGIN_IDS.filter(\n id => PLUGIN_REGISTRY[id]?.adminMenu !== null\n)\n\n/**\n * Look up a plugin by its codeName (the `name` field stored in the DB).\n * Falls back to id lookup if no codeName match.\n */\nexport function findPluginByCodeName(codeName: string): PluginRegistryEntry | undefined {\n return Object.values(PLUGIN_REGISTRY).find(p => p.codeName === codeName)\n || PLUGIN_REGISTRY[codeName]\n}\n\n/**\n * Get a plugin by ID.\n */\nexport function getPlugin(id: string): PluginRegistryEntry | undefined {\n return PLUGIN_REGISTRY[id]\n}\n","import type { D1Database } from \"@cloudflare/workers-types\";\nimport { PluginService } from \"./plugin-service\";\nimport { PLUGIN_REGISTRY } from \"../plugins/manifest-registry\";\nimport type { PluginRegistryEntry } from \"../plugins/manifest-registry\";\n\nexport interface CorePlugin {\n id: string;\n name: string;\n display_name: string;\n description: string;\n version: string;\n author: string;\n category: string;\n icon: string;\n permissions: string[];\n dependencies: string[];\n settings?: any;\n}\n\n/**\n * Build the CORE_PLUGINS list from the auto-generated registry.\n * To add a new bootstrapped plugin, create a manifest.json and\n * run: node packages/scripts/generate-plugin-registry.mjs\n *\n * Only plugins that are in the BOOTSTRAP_PLUGIN_IDS list will be\n * auto-installed on first boot. Edit this list to control which\n * plugins are bootstrapped.\n */\nconst BOOTSTRAP_PLUGIN_IDS = [\n \"core-auth\",\n \"core-media\",\n \"database-tools\",\n \"seed-data\",\n \"core-cache\",\n \"workflow-plugin\",\n \"easy-mdx\",\n \"ai-search\",\n \"oauth-providers\",\n \"global-variables\",\n \"user-profiles\",\n \"stripe\",\n];\n\nfunction registryToCorePlugin(entry: PluginRegistryEntry): CorePlugin {\n return {\n id: entry.id,\n name: entry.codeName,\n display_name: entry.displayName,\n description: entry.description,\n version: entry.version,\n author: entry.author,\n category: entry.category,\n icon: entry.iconEmoji,\n permissions: entry.permissions,\n dependencies: entry.dependencies,\n settings: entry.defaultSettings,\n };\n}\n\nexport class PluginBootstrapService {\n private pluginService: PluginService;\n\n constructor(private db: D1Database) {\n this.pluginService = new PluginService(db);\n }\n\n /**\n * Core plugins derived from the auto-generated plugin registry.\n * Only plugins listed in BOOTSTRAP_PLUGIN_IDS are included.\n */\n private readonly CORE_PLUGINS: CorePlugin[] = BOOTSTRAP_PLUGIN_IDS\n .filter((id) => PLUGIN_REGISTRY[id] !== undefined)\n .map((id) => registryToCorePlugin(PLUGIN_REGISTRY[id]!));\n\n /**\n * Bootstrap all core plugins - install them if they don't exist\n */\n async bootstrapCorePlugins(): Promise {\n console.log(\"[PluginBootstrap] Starting core plugin bootstrap process...\");\n\n try {\n // Check each core plugin\n for (const corePlugin of this.CORE_PLUGINS) {\n await this.ensurePluginInstalled(corePlugin);\n }\n\n console.log(\n \"[PluginBootstrap] Core plugin bootstrap completed successfully\"\n );\n } catch (error) {\n console.error(\"[PluginBootstrap] Error during plugin bootstrap:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure a specific plugin is installed\n */\n private async ensurePluginInstalled(plugin: CorePlugin): Promise {\n try {\n // Check if plugin already exists\n const existingPlugin = await this.pluginService.getPlugin(plugin.id);\n\n if (existingPlugin) {\n console.log(\n `[PluginBootstrap] Plugin already installed: ${plugin.display_name} (status: ${existingPlugin.status})`\n );\n\n // Update plugin if version changed\n if (existingPlugin.version !== plugin.version) {\n console.log(\n `[PluginBootstrap] Updating plugin version: ${plugin.display_name} from ${existingPlugin.version} to ${plugin.version}`\n );\n await this.updatePlugin(plugin);\n }\n\n // ALWAYS ensure core-auth is active (critical for system functionality)\n if (plugin.id === 'core-auth' && existingPlugin.status !== 'active') {\n console.log(\n `[PluginBootstrap] Core-auth plugin is inactive, activating it now...`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n\n // Only auto-activate on first install, respect user's activation state on subsequent boots\n } else {\n // Install the plugin\n console.log(\n `[PluginBootstrap] Installing plugin: ${plugin.display_name}`\n );\n await this.pluginService.installPlugin({\n ...plugin,\n is_core: plugin.name.startsWith(\"core-\"),\n });\n\n // Activate plugins immediately after installation\n console.log(\n `[PluginBootstrap] Activating newly installed plugin: ${plugin.display_name}`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n } catch (error) {\n console.error(\n `[PluginBootstrap] Error ensuring plugin ${plugin.display_name}:`,\n error\n );\n // Don't throw - continue with other plugins\n }\n }\n\n /**\n * Update an existing plugin\n */\n private async updatePlugin(plugin: CorePlugin): Promise {\n const now = Math.floor(Date.now() / 1000);\n\n const stmt = this.db.prepare(`\n UPDATE plugins\n SET\n version = ?,\n description = ?,\n permissions = ?,\n settings = ?,\n last_updated = ?\n WHERE id = ?\n `);\n\n await stmt\n .bind(\n plugin.version,\n plugin.description,\n JSON.stringify(plugin.permissions),\n JSON.stringify(plugin.settings || {}),\n now,\n plugin.id\n )\n .run();\n }\n\n /**\n * Check if bootstrap is needed (first run detection)\n */\n async isBootstrapNeeded(): Promise {\n try {\n // Check if any core plugins are missing\n for (const corePlugin of this.CORE_PLUGINS.filter((p) =>\n p.name.startsWith(\"core-\")\n )) {\n const exists = await this.pluginService.getPlugin(corePlugin.id);\n if (!exists) {\n return true;\n }\n }\n return false;\n } catch (error) {\n // If there's an error (like table doesn't exist), we need bootstrap\n console.error(\n \"[PluginBootstrap] Error checking bootstrap status:\",\n error\n );\n return true;\n }\n }\n\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-M2PKQJ6J.js b/packages/core/dist/chunk-OO7BOO6H.js similarity index 99% rename from packages/core/dist/chunk-M2PKQJ6J.js rename to packages/core/dist/chunk-OO7BOO6H.js index dfd3eb664..b081db3e6 100644 --- a/packages/core/dist/chunk-M2PKQJ6J.js +++ b/packages/core/dist/chunk-OO7BOO6H.js @@ -1,11 +1,11 @@ -import { getCacheService, CACHE_CONFIGS, SettingsService, getLogger, getAppInstance, buildRouteList, CATEGORY_INFO } from './chunk-GQEIPW3L.js'; -import { requireAuth, requireRole, isPluginActive, optionalAuth, rateLimit, AuthManager, getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb, logActivity, generateCsrfToken } from './chunk-5QK3FXKX.js'; -import { PluginService, PLUGIN_REGISTRY, findPluginByCodeName, createContentFromSubmission } from './chunk-CJOLOONT.js'; -import { MigrationService } from './chunk-CSQWOYGZ.js'; +import { getCacheService, CACHE_CONFIGS, SettingsService, getLogger, getAppInstance, buildRouteList, CATEGORY_INFO } from './chunk-QFWHAFEO.js'; +import { requireAuth, requireRole, isPluginActive, optionalAuth, rateLimit, AuthManager, getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb, logActivity, generateCsrfToken } from './chunk-DMPXZ6JJ.js'; +import { PluginService, PLUGIN_REGISTRY, findPluginByCodeName, createContentFromSubmission } from './chunk-NJVY2U43.js'; +import { MigrationService } from './chunk-46DCL763.js'; import { renderDesignPage, renderCheckboxPage, renderTestimonialsList, renderCodeExamplesList, renderAlert, renderTable, renderPagination, renderConfirmationDialog, getConfirmationDialogScript, renderAdminLayout, adminLayoutV2, renderForm } from './chunk-XWIA3HVX.js'; import { init_admin_layout_catalyst_template, renderAdminLayoutCatalyst } from './chunk-55RDMDOP.js'; import { PluginBuilder, TurnstileService } from './chunk-EXNEW5US.js'; -import { QueryFilterBuilder, getCoreVersion, getBlocksFieldConfig, parseBlocksValue } from './chunk-NDS4S4AG.js'; +import { QueryFilterBuilder, getCoreVersion, getBlocksFieldConfig, parseBlocksValue } from './chunk-FE77VWGD.js'; import { metricsTracker } from './chunk-FICTAGD4.js'; import { escapeHtml, sanitizeRichText, sanitizeInput } from './chunk-TQABQWOP.js'; import { Hono } from 'hono'; @@ -2351,7 +2351,7 @@ adminApiRoutes.delete("/collections/:id", async (c) => { }); adminApiRoutes.get("/migrations/status", async (c) => { try { - const { MigrationService: MigrationService2 } = await import('./migrations-SMFIJBW2.js'); + const { MigrationService: MigrationService2 } = await import('./migrations-W7P2NBXW.js'); const db = c.env.DB; const migrationService = new MigrationService2(db); const status = await migrationService.getMigrationStatus(); @@ -2376,7 +2376,7 @@ adminApiRoutes.post("/migrations/run", async (c) => { error: "Unauthorized. Admin access required." }, 403); } - const { MigrationService: MigrationService2 } = await import('./migrations-SMFIJBW2.js'); + const { MigrationService: MigrationService2 } = await import('./migrations-W7P2NBXW.js'); const db = c.env.DB; const migrationService = new MigrationService2(db); const result = await migrationService.runPendingMigrations(); @@ -2398,7 +2398,7 @@ adminApiRoutes.post("/migrations/run", async (c) => { }); adminApiRoutes.get("/migrations/validate", async (c) => { try { - const { MigrationService: MigrationService2 } = await import('./migrations-SMFIJBW2.js'); + const { MigrationService: MigrationService2 } = await import('./migrations-W7P2NBXW.js'); const db = c.env.DB; const migrationService = new MigrationService2(db); const validation = await migrationService.validateSchema(); @@ -15810,8 +15810,8 @@ adminMediaRoutes.post("/upload", async (c) => { }); continue; } - let width; - let height; + let width = null; + let height = null; if (file.type.startsWith("image/") && !file.type.includes("svg")) { try { const dimensions = await getImageDimensions2(arrayBuffer); @@ -15822,7 +15822,7 @@ adminMediaRoutes.post("/upload", async (c) => { } } const publicUrl = `/files/${r2Key}`; - const thumbnailUrl = file.type.startsWith("image/") ? publicUrl : void 0; + const thumbnailUrl = file.type.startsWith("image/") ? publicUrl : null; const stmt = c.env.DB.prepare(` INSERT INTO media ( id, filename, original_name, mime_type, size, width, height, @@ -22608,6 +22608,22 @@ function renderCollectionFormPage(data) {

Collection Details

Configure your collection settings below

+ + ${isEdit && data.name ? ` + +
+ +
+ ` : ""} @@ -23067,6 +23083,176 @@ function renderCollectionFormPage(data) { + ${isEdit && data.name ? ` + + + + + ` : ""} \n \n \n \n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n

Welcome Back

\n

Sign in to your account to continue

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n ${data.message ? `
${renderAlert({ type: 'success', message: data.message })}
` : ''}\n\n \n
\n\n \n \n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Sign In\n \n \n\n \n
\n

\n Don't have an account?\n Create one here\n

\n
\n
\n\n \n
\n \n v${data.version || '0.1.0'}\n \n
\n
\n
\n\n ${demoLoginActive ? `\n \n ` : ''}\n \n \n `\n}","import { renderAlert } from '../alert.template'\n\nexport interface RegisterPageData {\n error?: string\n}\n\nexport function renderRegisterPage(data: RegisterPageData): string {\n return `\n \n \n \n \n \n Register - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n
\n

SonicJS AI

\n

Create your account and get started

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n\n \n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Create Account\n \n \n\n \n
\n

\n Already have an account?\n Sign in here\n

\n
\n\n
\n
\n
\n
\n \n \n `\n}","/**\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 {\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\n if (plugin?.settings) {\n // Parse settings and check registration.enabled\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 return true // Default to enabled if no settings\n } catch {\n return true // Default to enabled on error\n }\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 {\n try {\n const result = await db.prepare('SELECT COUNT(*) as count FROM users').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 {\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 users 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 username: z.string().min(3, 'Username must be at least 3 characters').optional(),\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\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 {\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 'username':\n // Generate username from email (part before @)\n return data.email ? data.email.split('@')[0] : `user${Date.now()}`\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","/**\n * User Profile Config Registry\n *\n * Global singleton storing developer-defined custom profile field definitions.\n * Set once at app boot via defineUserProfile(), queried by routes and templates.\n */\n\nimport type { FieldType } from '../../../types/collection-config'\n\nexport interface ProfileFieldDefinition {\n name: string\n label: string\n type: FieldType\n options?: string[]\n default?: any\n required?: boolean\n placeholder?: string\n helpText?: string\n hidden?: boolean\n fields?: ProfileFieldDefinition[]\n validation?: {\n min?: number\n max?: number\n pattern?: string\n }\n}\n\nexport interface UserProfileConfig {\n fields: ProfileFieldDefinition[]\n registrationFields?: string[]\n}\n\nlet _profileConfig: UserProfileConfig | null = null\n\nexport function defineUserProfile(config: UserProfileConfig): void {\n if (_profileConfig) {\n console.warn('[SonicJS] defineUserProfile called multiple times — overwriting previous config')\n }\n _profileConfig = config\n}\n\nexport function getUserProfileConfig(): UserProfileConfig | null {\n return _profileConfig\n}\n\nexport function getProfileFieldDefaults(): Record {\n if (!_profileConfig) return {}\n const defaults: Record = {}\n for (const field of _profileConfig.fields) {\n if (field.default !== undefined) {\n defaults[field.name] = field.default\n }\n }\n return defaults\n}\n\nexport function getRegistrationFields(): ProfileFieldDefinition[] {\n if (!_profileConfig) return []\n const regFieldNames = _profileConfig.registrationFields || []\n return _profileConfig.fields.filter(f => regFieldNames.includes(f.name))\n}\n\n/** Reset state — for tests only */\nexport function _resetProfileConfig(): void {\n _profileConfig = null\n}\n","/**\n * User Profile Service\n *\n * Handles reading, writing, validation, and sanitization of custom profile data.\n */\n\nimport { sanitizeInput } from '../../../utils/sanitize'\nimport {\n getUserProfileConfig,\n getProfileFieldDefaults,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport function validateCustomData(\n data: Record,\n config: UserProfileConfig\n): { valid: boolean; errors: Record } {\n const errors: Record = {}\n\n for (const field of config.fields) {\n const value = data[field.name]\n\n if (field.required && (value === undefined || value === null || value === '')) {\n errors[field.name] = `${field.label} is required`\n continue\n }\n\n if (value === undefined || value === null || value === '') continue\n\n if (field.type === 'number' && typeof value !== 'number') {\n errors[field.name] = `${field.label} must be a number`\n }\n if (field.type === 'select' && field.options && !field.options.includes(value)) {\n errors[field.name] = `${field.label} must be one of: ${field.options.join(', ')}`\n }\n if (field.type === 'boolean' && typeof value !== 'boolean') {\n errors[field.name] = `${field.label} must be true or false`\n }\n if (field.validation?.min !== undefined && typeof value === 'number' && value < field.validation.min) {\n errors[field.name] = `${field.label} must be at least ${field.validation.min}`\n }\n if (field.validation?.max !== undefined && typeof value === 'number' && value > field.validation.max) {\n errors[field.name] = `${field.label} must be at most ${field.validation.max}`\n }\n if (field.validation?.pattern && typeof value === 'string' && !new RegExp(field.validation.pattern).test(value)) {\n errors[field.name] = `${field.label} format is invalid`\n }\n }\n\n return { valid: Object.keys(errors).length === 0, errors }\n}\n\nexport function sanitizeCustomData(\n data: Record,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n const knownNames = new Set(config.fields.map(f => f.name))\n\n for (const [key, value] of Object.entries(data)) {\n if (!knownNames.has(key)) continue\n if (typeof value === 'string') {\n result[key] = sanitizeInput(value)\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\nexport function coerceFieldValue(raw: string | null | undefined, field: ProfileFieldDefinition): any {\n if (raw === null || raw === undefined || raw === '') {\n return field.default ?? null\n }\n\n switch (field.type) {\n case 'number':\n const num = Number(raw)\n return isNaN(num) ? null : num\n case 'boolean':\n case 'checkbox':\n return raw === '1' || raw === 'true' || raw === 'on'\n case 'date':\n case 'datetime':\n const ts = new Date(raw).getTime()\n return isNaN(ts) ? null : ts\n default:\n return raw\n }\n}\n\nexport function extractCustomFieldsFromForm(\n formData: FormData,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n for (const field of config.fields) {\n const raw = formData.get(`custom_${field.name}`)?.toString()\n // For boolean/checkbox, absence means false\n if (raw === null || raw === undefined) {\n if (field.type === 'boolean' || field.type === 'checkbox') {\n result[field.name] = false\n }\n continue\n }\n result[field.name] = coerceFieldValue(raw, field)\n }\n return result\n}\n\nexport async function getCustomData(db: any, userId: string): Promise> {\n const row = await db\n .prepare('SELECT data FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (!row?.data) return {}\n try {\n return JSON.parse(row.data)\n } catch {\n return {}\n }\n}\n\nexport async function saveCustomData(\n db: any,\n userId: string,\n newData: Record\n): Promise {\n const existing = await getCustomData(db, userId)\n const merged = { ...existing, ...newData }\n const json = JSON.stringify(merged)\n\n // Check if profile row exists\n const row = await db\n .prepare('SELECT id FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (row) {\n await db\n .prepare('UPDATE user_profiles SET data = ?, updated_at = ? WHERE user_id = ?')\n .bind(json, Date.now(), userId)\n .run()\n } else {\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const now = Date.now()\n await db\n .prepare(\n 'INSERT INTO user_profiles (id, user_id, data, created_at, updated_at) VALUES (?, ?, ?, ?, ?)'\n )\n .bind(profileId, userId, json, now, now)\n .run()\n }\n}\n","export interface DragSortableOptions {\n itemSelector?: string\n handleSelector?: string\n onUpdate?: () => void\n}\n\nexport function getDragSortableScript(): string {\n return `\n \n `;\n}\n","import { getDragSortableScript } from './drag-sortable.template'\n\n/**\n * Returns shared readFieldValue function used by both blocks and structured fields.\n * Uses a window flag to ensure it's only initialized once.\n */\nfunction getReadFieldValueScript(): string {\n return `\n \n `\n}\n\nconst STRUCTURED_INDEX_TOKEN = '__INDEX__'\nconst BLOCK_INDEX_TOKEN = '__BLOCK_INDEX__'\n\nfunction sanitizeStructuredGroupId(fieldName: string): string {\n return `object-${fieldName}`\n .split(BLOCK_INDEX_TOKEN)\n .map((blockSegment) =>\n blockSegment\n .split(STRUCTURED_INDEX_TOKEN)\n .map((segment) =>\n segment\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, ''),\n )\n .join(STRUCTURED_INDEX_TOKEN),\n )\n .join(BLOCK_INDEX_TOKEN)\n}\n\nexport interface FieldDefinition {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any // JSON options\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface FieldRenderOptions {\n value?: any\n errors?: string[]\n disabled?: boolean\n className?: string\n pluginStatuses?: {\n quillEnabled?: boolean\n mdxeditorEnabled?: boolean\n tinymceEnabled?: boolean\n }\n collectionId?: string\n contentId?: string\n}\n\nfunction isMarkdownEditorFieldType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nfunction getEditorMetadata(fieldType: string): { family: string; provider: string } | null {\n if (fieldType === 'richtext' || fieldType === 'tinymce') {\n return {\n family: 'richtext',\n provider: 'tinymce',\n }\n }\n\n if (isMarkdownEditorFieldType(fieldType)) {\n return {\n family: 'markdown',\n provider: 'easymde',\n }\n }\n\n return null\n}\n\nexport function renderDynamicField(field: FieldDefinition, options: FieldRenderOptions = {}): string {\n const { value = '', errors = [], disabled = false, className = '', pluginStatuses = {}, collectionId = '', contentId = '' } = options\n const opts = field.field_options || {}\n const required = field.is_required ? 'required' : ''\n const baseClasses = `w-full rounded-lg px-3 py-2 text-sm text-zinc-950 dark:text-white bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 placeholder:text-zinc-400 dark:placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-zinc-950 dark:focus:ring-white transition-shadow ${className}`\n const errorClasses =\n errors.length > 0\n ? 'ring-pink-600 dark:ring-pink-500 focus:ring-pink-600 dark:focus:ring-pink-500'\n : ''\n\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n\n // Check if this is a plugin-based field type and if the plugin is inactive\n // If so, fall back to textarea with a warning\n let fallbackToTextarea = false\n let fallbackWarning = ''\n\n if (field.field_type === 'quill' && !pluginStatuses.quillEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Quill Editor plugin is inactive. Using textarea fallback.'\n } else if (isMarkdownEditorFieldType(field.field_type) && !pluginStatuses.mdxeditorEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Markdown editor plugin is inactive. Using textarea fallback.'\n } else if ((field.field_type === 'richtext' || field.field_type === 'tinymce') && !pluginStatuses.tinymceEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ TinyMCE plugin is inactive. Using textarea fallback.'\n }\n\n // If falling back to textarea, render it with a warning\n if (fallbackToTextarea) {\n return `\n
\n ${fallbackWarning ? `
${fallbackWarning}
` : ''}\n ${escapeHtml(value)}\n
\n `\n }\n\n let fieldHTML = ''\n\n switch (field.field_type) {\n case 'text':\n let patternHelp = ''\n let autoSlugScript = ''\n\n if (opts.pattern) {\n if (opts.pattern === '^[a-z0-9-]+$' || opts.pattern === '^[a-zA-Z0-9_-]+$') {\n patternHelp =\n '

Use letters, numbers, underscores, and hyphens only

'\n\n // Add auto-slug generation for slug fields\n if (fieldName === 'slug') {\n patternHelp +=\n ''\n autoSlugScript = `\n \n `\n }\n } else {\n patternHelp =\n '

Must match required format

'\n }\n }\n\n fieldHTML = `\n \n ${patternHelp}\n ${autoSlugScript}\n ${\n opts.pattern\n ? `\n \n `\n : ''\n }\n `\n break\n\n case 'textarea':\n fieldHTML = `\n ${escapeHtml(value)}\n `\n break\n\n case 'richtext':\n case 'tinymce':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'quill':\n // Quill WYSIWYG Editor\n fieldHTML = `\n
\n \n ${value}
\n\n \n \n \n `\n break\n\n case 'markdown':\n case 'mdxeditor':\n case 'easymde':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n // Markdown editor fields use the EasyMDE-backed richtext container.\n // The EasyMDE plugin initialization script handles activation.\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'number':\n fieldHTML = `\n \n `\n break\n\n case 'boolean':\n const checked = value === true || value === 'true' || value === '1' ? 'checked' : ''\n fieldHTML = `\n
\n \n \n
\n \n `\n break\n\n case 'date':\n fieldHTML = `\n \n `\n break\n\n case 'datetime':\n fieldHTML = `\n \n `\n break\n\n case 'slug':\n // Slug fields with auto-generation and duplicate detection\n const slugPattern = opts.pattern || '^[a-z0-9-]+$'\n const collectionIdValue = collectionId || opts.collectionId || ''\n const contentIdValue = contentId || opts.contentId || ''\n const isEditMode = !!value\n\n fieldHTML = `\n
\n \n
\n \n

Use lowercase letters, numbers, and hyphens only

\n
\n \n \n `\n break\n\n case 'select':\n const selectOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const multiple = opts.multiple ? 'multiple' : ''\n const selectedValues = Array.isArray(value) ? value : [value]\n\n fieldHTML = `\n \n ${!required && !opts.multiple ? '' : ''}\n ${selectOptions\n .map((option: any) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const selected = selectedValues.includes(optionValue) ? 'selected' : ''\n return ``\n })\n .join('')}\n \n ${\n opts.allowCustom\n ? `\n
\n \n
\n `\n : ''\n }\n `\n break\n\n case 'radio':\n const radioOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const selectedRadioValue =\n value !== undefined && value !== null\n ? String(value)\n : opts.default\n ? String(opts.default)\n : ''\n\n const isInline = opts.inline === true\n fieldHTML = `\n
\n ${radioOptions\n .map((option: any, index: number) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const inputId = `${fieldId}-option-${index}`\n const checked = selectedRadioValue === String(optionValue) ? 'checked' : ''\n return `\n \n `\n })\n .join('')}\n
\n `\n break\n\n case 'reference':\n let referenceCollections: string[] = []\n if (Array.isArray(opts.collection)) {\n referenceCollections = opts.collection.filter(Boolean)\n } else if (typeof opts.collection === 'string' && opts.collection) {\n referenceCollections = [opts.collection]\n }\n const referenceCollectionsAttr = referenceCollections.join(',')\n const hasReferenceCollection = referenceCollections.length > 0\n const hasReferenceValue = Boolean(value)\n fieldHTML = `\n
\n \n
\n \n ${hasReferenceCollection ? (hasReferenceValue ? 'Loading selection...' : 'No reference selected.') : 'Reference collection not configured.'}\n
\n
\n \n Select reference\n \n \n Remove\n \n
\n
\n \n `\n break\n\n case 'media':\n // Check if multiple selection is enabled\n const isMultiple = opts.multiple === true\n const mediaValues =\n isMultiple && value\n ? Array.isArray(value)\n ? value\n : String(value).split(',').filter(Boolean)\n : []\n const singleValue = !isMultiple ? value : ''\n\n // Helper to detect if URL is a video\n const isVideoUrl = (url: string) => {\n const videoExtensions = ['.mp4', '.webm', '.ogg', '.mov', '.avi']\n return videoExtensions.some((ext) => url.toLowerCase().endsWith(ext))\n }\n\n // Helper to render media element\n const renderMediaPreview = (url: string, alt: string, classes: string) => {\n if (isVideoUrl(url)) {\n return ``\n }\n return `\"${alt}\"`\n }\n\n fieldHTML = `\n
\n \n\n ${\n isMultiple\n ? `\n
\n ${mediaValues\n .map(\n (url: string, idx: number) => `\n
\n ${renderMediaPreview(url, `Media ${idx + 1}`, 'w-full h-24 object-cover rounded-lg border border-white/20')}\n \n \n \n \n \n
\n `,\n )\n .join('')}\n
\n `\n : `\n
\n ${singleValue ? renderMediaPreview(singleValue, 'Selected media', 'w-32 h-32 object-cover rounded-lg border border-white/20') : ''}\n
\n `\n }\n\n
\n \n \n \n \n ${isMultiple ? 'Select Media (Multiple)' : 'Select Media'}\n \n ${\n (isMultiple ? mediaValues.length > 0 : singleValue)\n ? `\n \n ${isMultiple ? 'Clear All' : 'Remove'}\n \n `\n : ''\n }\n
\n
\n `\n break\n\n case 'object':\n // Structured object field (like SEO with nested properties)\n return renderStructuredObjectField(field, options, baseClasses, errorClasses)\n\n case 'array':\n // Check if this is a blocks field (has discriminator/blocks config) or a regular array\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n if (itemsConfig.blocks && typeof itemsConfig.blocks === 'object') {\n // Blocks field with discriminated union\n return renderBlocksField(field, options, baseClasses, errorClasses)\n }\n // Regular structured array field\n return renderStructuredArrayField(field, options, baseClasses, errorClasses)\n\n default:\n fieldHTML = `\n \n `\n }\n\n const showLabel = field.field_type !== 'boolean'\n\n return `\n
0 ? 'true' : 'false'}\">\n ${\n showLabel\n ? `\n \n `\n : ''\n }\n ${fieldHTML}\n ${\n errors.length > 0\n ? `\n
\n ${errors.map((error) => `
${escapeHtml(error)}
`).join('')}\n
\n `\n : ''\n }\n ${\n opts.helpText\n ? `\n
\n ${escapeHtml(opts.helpText)}\n
\n `\n : ''\n }\n
\n `\n}\n\nexport function renderFieldGroup(\n title: string,\n fields: string[],\n collapsible: boolean = false,\n): string {\n const groupId = title.toLowerCase().replace(/\\s+/g, '-')\n\n return `\n
\n
\n

\n ${escapeHtml(title)}\n ${\n collapsible\n ? `\n \n \n \n `\n : ''\n }\n

\n
\n
\n ${fields.join('')}\n
\n
\n `\n}\n\nfunction renderBlocksField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const blocks = normalizeBlockDefinitions(itemsConfig.blocks)\n const discriminator =\n typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n const blockValues = normalizeBlocksValue(value, discriminator)\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const emptyState =\n blockValues.length === 0\n ? `\n
\n No blocks yet. Add your first block to get started.\n
\n `\n : ''\n\n const blockOptions = blocks\n .map((block) => ``)\n .join('')\n\n const blockItems = blockValues\n .map((blockValue, index) =>\n renderBlockItem(field, blockValue, blocks, discriminator, index, pluginStatuses),\n )\n .join('')\n\n const templates = blocks\n .map((block) => renderBlockTemplate(field, block, discriminator, pluginStatuses))\n .join('')\n\n return `\n \n \n\n
\n

\n ${escapeHtml(field.field_label || 'Content Blocks')}\n

\n
\n\n
\n
\n \n \n ${blockOptions}\n \n
\n \n Add Block\n \n
\n\n
\n ${blockItems || emptyState}\n
\n\n ${templates}\n \n ${getDragSortableScript()}\n ${getBlocksFieldScript()}\n `\n}\n\nfunction renderStructuredObjectField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = {}, pluginStatuses = {}, errors = [] } = options\n const opts = field.field_options || {}\n const properties = opts.properties && typeof opts.properties === 'object' ? opts.properties : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const objectValue = normalizeStructuredObjectValue(value)\n const objectLayout = opts.objectLayout || 'nested'\n const useNestedLayout = objectLayout !== 'flat'\n\n const subfields = Object.entries(properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n objectValue,\n pluginStatuses,\n field.field_name,\n ),\n )\n .join('')\n\n const groupTitle = field.field_label || field.field_name\n\n if (!useNestedLayout) {\n return `\n
\n \n
\n

\n ${escapeHtml(groupTitle)}\n

\n
\n
\n ${subfields}\n
\n
\n ${getStructuredFieldScript()}\n `\n }\n\n const groupId = sanitizeStructuredGroupId(field.field_name)\n const isCollapsed = errors.length > 0 ? false : opts.collapsed !== false\n\n return `\n
\n
\n

\n ${escapeHtml(groupTitle)}\n \n \n \n

\n
\n
\n \n
\n ${subfields}\n
\n
\n
\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const arrayValue = normalizeStructuredArrayValue(value)\n const arrayTitle = opts.itemLabel || field.field_label || 'Items'\n const hasItemTitle = typeof opts.itemTitle === 'string' && opts.itemTitle.trim() !== ''\n const arrayItemTitle = hasItemTitle ? opts.itemTitle.trim() : 'Item'\n const addItemLabel = hasItemTitle ? `Add ${arrayItemTitle}` : 'Add item'\n\n const items = arrayValue\n .map((itemValue, index) =>\n renderStructuredArrayItem(\n field,\n itemsConfig,\n String(index),\n itemValue,\n pluginStatuses,\n arrayItemTitle,\n ),\n )\n .join('')\n\n const emptyState =\n arrayValue.length === 0\n ? `\n
\n No items yet. Add the first item to get started.\n
\n `\n : ''\n\n return `\n
\n \n\n
\n
\n ${escapeHtml(arrayTitle)}\n
\n \n ${escapeHtml(addItemLabel)}\n \n
\n\n
\n ${items || emptyState}\n
\n\n \n
\n ${getDragSortableScript()}\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayItem(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n arrayItemTitle: string,\n): string {\n const itemFields = renderStructuredItemFields(field, itemConfig, index, itemValue, pluginStatuses)\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n ${escapeHtml(arrayItemTitle)} \n
\n
\n
\n \n \n \n \n
\n
\n
\n ${itemFields}\n
\n
\n `\n}\n\nfunction renderStructuredItemFields(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const itemType = itemConfig?.type || 'string'\n if (\n itemType === 'object' &&\n itemConfig?.properties &&\n typeof itemConfig.properties === 'object'\n ) {\n const fieldPrefix = `array-${field.field_name}-${index}`\n return Object.entries(itemConfig.properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n itemValue || {},\n pluginStatuses,\n fieldPrefix,\n ),\n )\n .join('')\n }\n\n const normalizedField = normalizeBlockField(itemConfig, 'Item')\n const fieldValue = itemValue ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `array-${field.field_name}-${index}-value`,\n field_name: `array-${field.field_name}-${index}-value`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction renderStructuredSubfield(\n field: FieldDefinition,\n propertyName: string,\n propertyConfig: any,\n objectValue: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n fieldPrefix: string,\n): string {\n const normalizedField = normalizeBlockField(propertyConfig, propertyName)\n const fieldValue = objectValue?.[propertyName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `${fieldPrefix}-${propertyName}`,\n field_name: `${fieldPrefix}__${propertyName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction normalizeStructuredObjectValue(value: any): Record {\n if (!value) return {}\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {}\n } catch {\n return {}\n }\n }\n if (typeof value === 'object' && !Array.isArray(value)) return value\n return {}\n}\n\nfunction normalizeStructuredArrayValue(value: any): any[] {\n if (!value) return []\n if (Array.isArray(value)) return value\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction normalizeBlockDefinitions(\n rawBlocks: any,\n): Array<{ name: string; label: string; description?: string; properties: Record }> {\n if (!rawBlocks || typeof rawBlocks !== 'object') return []\n\n return Object.entries(rawBlocks)\n .filter(([name, block]) => typeof name === 'string' && block && typeof block === 'object')\n .map(([name, block]: [string, any]) => ({\n name,\n label: block.label || name,\n description: block.description,\n properties: block.properties && typeof block.properties === 'object' ? block.properties : {},\n }))\n}\n\nfunction normalizeBlocksValue(value: any, discriminator: string): any[] {\n const normalizeItem = (item: any) => {\n if (!item || typeof item !== 'object') return null\n if (item[discriminator]) return item\n if (item.blockType && item.data && typeof item.data === 'object') {\n return { [discriminator]: item.blockType, ...item.data }\n }\n return item\n }\n\n const fromArray = (items: any[]) =>\n items.map(normalizeItem).filter((item) => item && typeof item === 'object')\n\n if (Array.isArray(value)) return fromArray(value)\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? fromArray(parsed) : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction renderBlockTemplate(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n return `\n \n `\n}\n\nfunction renderBlockItem(\n field: FieldDefinition,\n blockValue: any,\n blocks: Array<{\n name: string\n label: string\n description?: string\n properties: Record\n }>,\n discriminator: string,\n index: number,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockType = blockValue?.[discriminator] || blockValue?.blockType\n const blockDefinition = blocks.find((block) => block.name === blockType)\n\n if (!blockDefinition) {\n return `\n
\n Unknown block type: ${escapeHtml(String(blockType || 'unknown'))}. This block will be preserved as-is.\n
\n `\n }\n\n const data =\n blockValue && typeof blockValue === 'object'\n ? Object.fromEntries(Object.entries(blockValue).filter(([key]) => key !== discriminator))\n : {}\n\n return renderBlockCard(field, blockDefinition, discriminator, String(index), data, pluginStatuses)\n}\n\nfunction renderBlockCard(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n index: string,\n data: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockFields = Object.entries(block.properties)\n .map(([fieldName, fieldConfig]) => {\n if (fieldConfig?.type === 'array' && fieldConfig?.items?.blocks) {\n return `\n
\n Nested blocks are not supported yet for \"${escapeHtml(fieldName)}\".\n
\n `\n }\n\n const normalizedField = normalizeBlockField(fieldConfig, fieldName)\n const fieldValue = data?.[fieldName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `block-${field.field_name}-${index}-${fieldName}`,\n field_name: `block-${field.field_name}-${index}-${fieldName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n })\n .join('')\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${escapeHtml(block.label)}\n \n
\n ${block.description ? `

${escapeHtml(block.description)}

` : ''}\n
\n
\n
\n \n \n \n \n
\n
\n
\n ${blockFields}\n
\n
\n `\n}\n\nfunction normalizeBlockField(fieldConfig: any, fieldName: string) {\n const type = fieldConfig?.type || 'text'\n const label = fieldConfig?.title || fieldName\n const required = fieldConfig?.required === true\n const options = { ...fieldConfig }\n\n if (type === 'select' && Array.isArray(fieldConfig?.enum)) {\n options.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return {\n type,\n label,\n required,\n defaultValue: fieldConfig?.default,\n options,\n }\n}\n\nfunction getStructuredFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction getBlocksFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}\n","/**\n * User Profile Custom Fields Renderer\n *\n * Generates the HTML section for custom profile fields by adapting\n * ProfileFieldDefinition into FieldDefinition and calling renderDynamicField.\n */\n\nimport { renderDynamicField, type FieldDefinition } from '../../../templates/components/dynamic-field.template'\nimport type { UserProfileConfig, ProfileFieldDefinition } from './user-profile-registry'\n\nexport function toFieldDefinition(field: ProfileFieldDefinition, index: number): FieldDefinition {\n return {\n id: `custom_${field.name}`,\n field_name: `custom_${field.name}`,\n field_type: field.type,\n field_label: field.label,\n field_options: {\n placeholder: field.placeholder || '',\n helpText: field.helpText || '',\n enum: field.options || [],\n enumLabels: field.options || [],\n },\n field_order: index,\n is_required: field.required || false,\n is_searchable: false,\n }\n}\n\nexport function renderCustomProfileSection(\n config: UserProfileConfig | null,\n customData: Record\n): string {\n if (!config || config.fields.length === 0) return ''\n\n const visibleFields = config.fields.filter(f => !f.hidden)\n if (visibleFields.length === 0) return ''\n\n const fieldsHtml = visibleFields\n .map((field, index) => {\n const fieldDef = toFieldDefinition(field, index)\n const value = customData[field.name] ?? field.default ?? ''\n return renderDynamicField(fieldDef, { value })\n })\n .join('\\n')\n\n return `\n \n
\n

Custom Profile Fields

\n
\n ${fieldsHtml}\n
\n
`\n}\n","/**\n * User Profiles Plugin\n *\n * Configurable custom profile fields for users.\n * Developers call defineUserProfile() at app boot to declare custom fields\n * that are stored as JSON in user_profiles.data and rendered in the admin UI.\n *\n * API Routes:\n * GET /api/user-profiles/schema → Public field definitions\n * GET /api/user-profiles/:userId → Get custom data for a user (auth required)\n * PUT /api/user-profiles/:userId → Update custom data for a user (auth required)\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { getUserProfileConfig } from './user-profile-registry'\nimport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\nimport { renderCustomProfileSection } from './user-profile-renderer'\n\nexport function createUserProfilesPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'user-profiles',\n version: '1.0.0-beta.1',\n description: 'Configurable custom profile fields for users',\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com',\n },\n license: 'MIT',\n compatibility: '^2.0.0',\n })\n\n // ==================== API Routes ====================\n\n const api = new Hono()\n\n // GET /api/user-profiles/schema — public schema endpoint\n api.get('/schema', (c) => {\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ fields: [], registrationFields: [] })\n }\n return c.json({\n fields: config.fields\n .filter(f => !f.hidden)\n .map(f => ({\n name: f.name,\n label: f.label,\n type: f.type,\n options: f.options,\n required: f.required || false,\n placeholder: f.placeholder,\n helpText: f.helpText,\n default: f.default,\n validation: f.validation,\n })),\n registrationFields: config.registrationFields || [],\n })\n })\n\n // GET /api/user-profiles/:userId — get custom data\n api.get('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const userId = c.req.param('userId')\n const data = await getCustomData(db, userId)\n return c.json({ userId, customData: data })\n })\n\n // PUT /api/user-profiles/:userId — update custom data\n api.put('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ error: 'No profile schema configured' }, 400)\n }\n\n const userId = c.req.param('userId')\n const body = await c.req.json()\n const customData = body.customData || body\n\n const sanitized = sanitizeCustomData(customData, config)\n const validation = validateCustomData(sanitized, config)\n if (!validation.valid) {\n return c.json({ error: 'Validation failed', errors: validation.errors }, 400)\n }\n\n await saveCustomData(db, userId, sanitized)\n return c.json({ success: true })\n })\n\n builder.addRoute('/api/user-profiles', api, {\n description: 'Custom user profile fields API',\n requiresAuth: false,\n priority: 100,\n })\n\n builder.lifecycle({\n activate: async () => {\n console.info('[SonicJS] User Profiles plugin activated')\n },\n deactivate: async () => {\n console.info('[SonicJS] User Profiles plugin deactivated')\n },\n })\n\n return builder.build() as Plugin\n}\n\nexport const userProfilesPlugin = createUserProfilesPlugin()\n\n// Re-export public API\nexport {\n defineUserProfile,\n getUserProfileConfig,\n getProfileFieldDefaults,\n getRegistrationFields,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\n\nexport { renderCustomProfileSection } from './user-profile-renderer'\n","import { Hono } from 'hono'\n// import { zValidator } from '@hono/zod-validator'\nimport { z } from 'zod'\nimport { getCookie, setCookie } from 'hono/cookie'\nimport { html } from 'hono/html'\nimport { AuthManager, requireAuth, generateCsrfToken, rateLimit } from '../middleware'\nimport { getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb } from '../middleware/auth'\nimport { renderLoginPage, LoginPageData } from '../templates/pages/auth-login.template'\nimport { renderRegisterPage, RegisterPageData } from '../templates/pages/auth-register.template'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { authValidationService, isRegistrationEnabled, isFirstUserRegistration } from '../services/auth-validation'\nimport type { RegistrationData } from '../services/auth-validation'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, getRegistrationFields, getProfileFieldDefaults, sanitizeCustomData, saveCustomData, getCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n/** Set a signed CSRF cookie alongside the auth cookie on login/register. */\nasync function setCsrfCookie(c: any, maxAge?: number): Promise {\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n const csrfToken = await generateCsrfToken(secret)\n const cookieMaxAge = maxAge ?? (await getJwtExpirySecondsFromDb(c.env?.DB, c.env))\n setCookie(c, 'csrf_token', csrfToken, {\n httpOnly: false,\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: cookieMaxAge,\n })\n}\n\n/** Clear the CSRF cookie on logout. */\nfunction clearCsrfCookie(c: any): void {\n setCookie(c, 'csrf_token', '', {\n httpOnly: false,\n secure: false,\n sameSite: 'Strict',\n path: '/',\n maxAge: 0,\n })\n}\n\nconst authRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Login page (HTML form)\nauthRoutes.get('/login', async (c) => {\n const error = c.req.query('error')\n const message = c.req.query('message')\n \n const pageData: LoginPageData = {\n error: error || undefined,\n message: message || undefined,\n version: c.get('appVersion')\n }\n \n // Check if demo login plugin is active\n const db = c.env.DB\n let demoLoginActive = false\n try {\n const plugin = await db.prepare('SELECT * FROM plugins WHERE id = ? AND status = ?')\n .bind('demo-login-prefill', 'active')\n .first()\n demoLoginActive = !!plugin\n } catch (error) {\n // Ignore database errors - plugin system might not be initialized\n }\n \n return c.html(renderLoginPage(pageData, demoLoginActive))\n})\n\n// Registration page (HTML form)\nauthRoutes.get('/register', async (c) => {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.redirect('/auth/login?error=Registration is currently disabled')\n }\n }\n\n const error = c.req.query('error')\n\n const pageData: RegisterPageData = {\n error: error || undefined\n }\n\n return c.html(renderRegisterPage(pageData))\n})\n\n// Login schema\nconst loginSchema = z.object({\n email: z.string().email('Valid email is required'),\n password: z.string().min(1, 'Password is required')\n})\n\n// Register new user\nauthRoutes.post('/register',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.json({ error: 'Registration is currently disabled' }, 403)\n }\n }\n\n // Parse JSON with error handling\n let requestData\n try {\n requestData = await c.req.json()\n } catch (parseError) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n\n let validatedData: RegistrationData\n try {\n validatedData = await validationSchema.parseAsync(requestData)\n } catch (validationError: any) {\n return c.json({\n error: 'Validation failed',\n details: validationError.issues?.map((e: any) => e.message) || [validationError.message || 'Invalid request data']\n }, 400)\n }\n\n // Extract fields with defaults for optional ones\n const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.json({ error: 'User with this email or username already exists' }, 400)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n \n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n 'viewer', // Default role\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n \n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n if (requestData[field.name] !== undefined) {\n customData[field.name] = requestData[field.name]\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, 'viewer', c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n user: {\n id: userId,\n email: normalizedEmail,\n username,\n firstName,\n lastName,\n role: 'viewer'\n },\n token\n }, 201)\n } catch (error) {\n console.error('Registration error:', error)\n // Return validation errors as 400, other errors as 500\n if (error instanceof Error && error.message.includes('validation')) {\n return c.json({ error: error.message }, 400)\n }\n return c.json({\n error: 'Registration failed',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n }\n)\n\n// Login user\nauthRoutes.post('/login',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const body = await c.req.json()\n const validation = loginSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const { email, password } = validation.data\n const db = c.env.DB\n \n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Find user with caching\n const cache = getCacheService(CACHE_CONFIGS.user!)\n let user = await cache.get(cache.generateKey('user', `email:${normalizedEmail}`))\n\n if (!user) {\n user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n\n if (user) {\n // Cache the user for faster subsequent lookups\n await cache.set(cache.generateKey('user', `email:${normalizedEmail}`), user)\n await cache.set(cache.generateKey('user', user.id), user)\n }\n }\n\n if (!user) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n // Invalidate user cache on login\n await cache.delete(cache.generateKey('user', user.id))\n await cache.delete(cache.generateKey('user', `email:${normalizedEmail}`))\n\n return c.json({\n user: {\n id: user.id,\n email: user.email,\n username: user.username,\n firstName: user.first_name,\n lastName: user.last_name,\n role: user.role\n },\n token\n })\n } catch (error) {\n console.error('Login error:', error)\n return c.json({ error: 'Login failed' }, 500)\n }\n})\n\n// Logout user (both GET and POST for convenience)\nauthRoutes.post('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.json({ message: 'Logged out successfully' })\n})\n\nauthRoutes.get('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.redirect('/auth/login?message=You have been logged out successfully')\n})\n\n// Get current user\nauthRoutes.get('/me', requireAuth(), async (c) => {\n try {\n // This would need the auth middleware applied\n const user = c.get('user')\n \n if (!user) {\n return c.json({ error: 'Not authenticated' }, 401)\n }\n \n const db = c.env.DB\n const userData = await db.prepare('SELECT id, email, username, first_name, last_name, role, created_at FROM users WHERE id = ?')\n .bind(user.userId)\n .first() as Record | null\n\n if (!userData) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n const customData = await getCustomData(db, user.userId)\n return c.json({ user: { ...userData, ...customData } })\n } catch (error) {\n console.error('Get user error:', error)\n return c.json({ error: 'Failed to get user' }, 500)\n }\n})\n\n// Refresh token (sliding session)\n//\n// Accepts a valid JWT — or one that has expired within the grace window\n// (`JWT_REFRESH_GRACE_SECONDS`, default 7 days) — and issues a fresh JWT\n// with a new `exp`. This lets a long-lived session cookie keep a user\n// logged in across JWT expirations without forcing a full re-login.\n//\n// Security: the caller must still present a valid-signature token that\n// recently belonged to an active user. Fully forged or long-expired tokens\n// are rejected.\nauthRoutes.post('/refresh',\n rateLimit({ max: 60, windowMs: 60 * 1000, keyPrefix: 'refresh' }),\n async (c) => {\n try {\n // Accept token from Authorization header or cookie\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) token = getCookie(c, 'auth_token')\n\n if (!token) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const grace = await getJwtRefreshGraceSecondsFromDb(db, c.env)\n\n const payload = await AuthManager.verifyToken(token, c.env.JWT_SECRET, grace)\n if (!payload) {\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Re-validate the user is still active, and pick up any role changes.\n const row = await db.prepare('SELECT id, email, role, is_active FROM users WHERE id = ?')\n .bind(payload.userId)\n .first() as any\n\n if (!row || !row.is_active) {\n return c.json({ error: 'User is not active' }, 401)\n }\n\n // Generate new token with a fresh exp\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env)\n const newToken = await AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set new cookie\n setCookie(c, 'auth_token', newToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n token: newToken,\n expiresIn: tokenTtl\n })\n } catch (error) {\n console.error('Token refresh error:', error)\n return c.json({ error: 'Token refresh failed' }, 500)\n }\n})\n\n// Form-based registration handler (for HTML forms)\nauthRoutes.post('/register/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.html(html`\n
\n Registration is currently disabled. Please contact an administrator.\n
\n `)\n }\n }\n\n const formData = await c.req.formData()\n\n // Extract form data\n const requestData = {\n email: formData.get('email') as string,\n password: formData.get('password') as string,\n username: formData.get('username') as string,\n firstName: formData.get('firstName') as string,\n lastName: formData.get('lastName') as string,\n }\n\n // Normalize email to lowercase\n const normalizedEmail = requestData.email?.toLowerCase()\n requestData.email = normalizedEmail\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n const validation = await validationSchema.safeParseAsync(requestData)\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const validatedData: RegistrationData = validation.data\n\n // Extract fields with defaults for optional ones\n // const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.html(html`\n
\n User with this email or username already exists\n
\n `)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Determine role: first user gets admin, others get viewer\n const role = isFirstUser ? 'admin' : 'viewer'\n\n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n\n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n role,\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n\n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n const raw = formData.get(field.name)?.toString()\n if (raw !== undefined && raw !== null) {\n customData[field.name] = raw\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Redirect based on role\n const redirectUrl = role === 'admin' ? '/admin/dashboard' : '/admin/dashboard'\n\n return c.html(html`\n
\n Account created successfully! Redirecting...\n \n
\n `)\n } catch (error) {\n console.error('Registration error:', error)\n return c.html(html`\n
\n Registration failed. Please try again.\n
\n `)\n }\n})\n\n// Form-based login handler (for HTML forms)\nauthRoutes.post('/login/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email') as string\n const password = formData.get('password') as string\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n\n // Validate the data\n const validation = loginSchema.safeParse({ email: normalizedEmail, password })\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const db = c.env.DB\n \n // Find user\n const user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n \n if (!user) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n return c.html(html`\n
\n
\n
\n \n \n \n
\n

Login successful! Redirecting to admin dashboard...

\n
\n
\n \n
\n
\n `)\n } catch (error) {\n console.error('Login error:', error)\n return c.html(html`\n
\n Login failed. Please try again.\n
\n `)\n }\n})\n\n// Test seeding endpoint (only for development/testing)\nauthRoutes.post('/seed-admin',\n rateLimit({ max: 10, windowMs: 60 * 1000, keyPrefix: 'seed-admin' }),\n async (c) => {\n try {\n const db = c.env.DB\n \n // First ensure the users table exists\n await db.prepare(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL UNIQUE,\n username TEXT NOT NULL UNIQUE,\n first_name TEXT NOT NULL,\n last_name TEXT NOT NULL,\n password_hash TEXT,\n role TEXT NOT NULL DEFAULT 'viewer',\n avatar TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n last_login_at INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `).run()\n \n // Check if admin user already exists\n const existingAdmin = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind('admin@sonicjs.com', 'admin')\n .first()\n\n if (existingAdmin) {\n // Update the password to ensure it's correct for testing\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(passwordHash, Date.now(), existingAdmin.id)\n .run()\n\n return c.json({\n message: 'Admin user already exists (password updated)',\n user: {\n id: existingAdmin.id,\n email: 'admin@sonicjs.com',\n username: 'admin',\n role: 'admin'\n }\n })\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n \n // Create admin user\n const userId = 'admin-user-id'\n const now = Date.now()\n const adminEmail = 'admin@sonicjs.com'.toLowerCase()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n adminEmail,\n 'admin',\n 'Admin',\n 'User',\n passwordHash,\n 'admin',\n 1, // is_active\n now,\n now\n ).run()\n \n return c.json({ \n message: 'Admin user created successfully',\n user: {\n id: userId,\n email: adminEmail,\n username: 'admin',\n role: 'admin'\n },\n passwordHash: passwordHash // For debugging\n })\n } catch (error) {\n console.error('Seed admin error:', error)\n return c.json({ error: 'Failed to create admin user', details: error instanceof Error ? error.message : String(error) }, 500)\n }\n})\n\n\n// Accept invitation page\nauthRoutes.get('/accept-invitation', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.html(`\n \n Invitation Expired\n \n

Invitation Expired

\n

This invitation has expired. Please contact your administrator for a new invitation.

\n Go to Login\n \n \n `)\n }\n\n // Show invitation acceptance form\n return c.html(`\n \n \n \n \n \n Accept Invitation - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Accept Invitation

\n

Complete your account setup

\n

\n You've been invited as ${invitedUser.first_name} ${invitedUser.last_name}
\n ${invitedUser.email}
\n ${invitedUser.role}\n

\n
\n\n
\n \n \n
\n \n \n
\n\n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Accept invitation page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your invitation.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process invitation acceptance\nauthRoutes.post('/accept-invitation', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const username = formData.get('username')?.toString()?.trim()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !username || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'Invalid or expired invitation' }, 400)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.json({ error: 'Invitation has expired' }, 400)\n }\n\n // Check if username is available\n const existingUsernameStmt = db.prepare(`\n SELECT id FROM users WHERE username = ? AND id != ?\n `)\n const existingUsername = await existingUsernameStmt.bind(username, invitedUser.id).first()\n\n if (existingUsername) {\n return c.json({ error: 'Username is already taken' }, 400)\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Activate user account\n const updateStmt = db.prepare(`\n UPDATE users SET \n username = ?,\n password_hash = ?,\n is_active = 1,\n email_verified = 1,\n invitation_token = NULL,\n accepted_invitation_at = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n username,\n passwordHash,\n Date.now(),\n Date.now(),\n invitedUser.id\n ).run()\n\n // Generate JWT token for auto-login\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const authToken = await AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', authToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?welcome=true')\n\n } catch (error) {\n console.error('Accept invitation error:', error)\n return c.json({ error: 'Failed to accept invitation' }, 500)\n }\n})\n\n// Request password reset\nauthRoutes.post('/request-password-reset',\n rateLimit({ max: 3, windowMs: 15 * 60 * 1000, keyPrefix: 'password-reset' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email')?.toString()?.trim()?.toLowerCase()\n\n if (!email) {\n return c.json({ error: 'Email is required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if user exists and is active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name FROM users \n WHERE email = ? AND is_active = 1\n `)\n const user = await userStmt.bind(email).first() as any\n\n // Always return success to prevent email enumeration\n if (!user) {\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.'\n })\n }\n\n // Generate password reset token (expires in 1 hour)\n const resetToken = crypto.randomUUID()\n const resetExpires = Date.now() + (60 * 60 * 1000) // 1 hour\n\n // Update user with reset token\n const updateStmt = db.prepare(`\n UPDATE users SET \n password_reset_token = ?,\n password_reset_expires = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n resetToken,\n resetExpires,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // In a real implementation, you would send an email here\n // For now, we'll return the reset link for development\n const resetLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/reset-password?token=${resetToken}`\n\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.',\n reset_link: resetLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('Password reset request error:', error)\n return c.json({ error: 'Failed to process password reset request' }, 500)\n }\n})\n\n// Show password reset form\nauthRoutes.get('/reset-password', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, password_reset_expires\n FROM users \n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has already been used.

\n Go to Login\n \n \n `)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.html(`\n \n Reset Link Expired\n \n

Reset Link Expired

\n

The password reset link has expired. Please request a new one.

\n Go to Login\n \n \n `)\n }\n\n // Show password reset form\n return c.html(`\n \n \n \n \n \n Reset Password - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Reset Password

\n

Choose a new password for your account

\n

\n Reset password for ${user.first_name} ${user.last_name}
\n ${user.email}\n

\n
\n\n
\n \n \n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n\n \n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Password reset page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your password reset.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process password reset\nauthRoutes.post('/reset-password', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, password_hash, password_reset_expires\n FROM users\n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.json({ error: 'Invalid or expired reset token' }, 400)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.json({ error: 'Reset token has expired' }, 400)\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(password)\n\n // Store old password in history (skip if table doesn't exist)\n try {\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user.id,\n user.password_hash,\n Date.now()\n ).run()\n } catch (historyError) {\n // Password history table may not exist yet\n console.warn('Could not store password history:', historyError)\n }\n\n // Update user password and clear reset token\n const updateStmt = db.prepare(`\n UPDATE users SET\n password_hash = ?,\n password_reset_token = NULL,\n password_reset_expires = NULL,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newPasswordHash,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to login with success message\n return c.redirect('/auth/login?message=Password reset successfully. Please log in with your new password.')\n\n } catch (error) {\n console.error('Password reset error:', error)\n return c.json({ error: 'Failed to reset password' }, 500)\n }\n})\n\nexport default authRoutes\n","/**\n * Test Cleanup Routes\n *\n * Provides endpoints to clean up test data after e2e tests\n * WARNING: These endpoints should only be available in development/test environments\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database } from '@cloudflare/workers-types'\n\nconst app = new Hono()\n\n/**\n * Clean up all test data (collections, content, users except admin)\n * POST /test-cleanup\n */\napp.post('/test-cleanup', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Use pattern-based deletes to avoid SQL variable limits\n // This approach uses subqueries instead of building large IN lists\n\n // Step 1: Delete child data for test content (by pattern)\n await db.prepare(`\n DELETE FROM content_versions\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM workflow_history\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n // Note: content_data table may not exist in all schemas\n try {\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n } catch (e) {\n // Table doesn't exist, skip\n }\n\n // Step 2: Delete test content by pattern\n const contentResult = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n `).run()\n deletedCount += contentResult.meta?.changes || 0\n\n // Step 3: Delete child data for test users\n await db.prepare(`\n DELETE FROM api_tokens\n WHERE user_id IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM media\n WHERE uploaded_by IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n // Step 4: Delete test users\n const usersResult = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n `).run()\n deletedCount += usersResult.meta?.changes || 0\n\n // Step 5: Delete child data for test collections\n try {\n await db.prepare(`\n DELETE FROM collection_fields\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Delete remaining content from test collections\n await db.prepare(`\n DELETE FROM content\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n\n // Step 6: Delete test collections\n const collectionsResult = await db.prepare(`\n DELETE FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).run()\n deletedCount += collectionsResult.meta?.changes || 0\n\n // Step 7: Clean up orphaned data (skip if tables don't exist)\n try {\n await db.prepare(`\n DELETE FROM content_data WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM collection_fields WHERE collection_id NOT IN (SELECT id FROM collections)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM content_versions WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM workflow_history WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Step 8: Delete old activity logs (keep only last 100)\n await db.prepare(`\n DELETE FROM activity_logs\n WHERE id NOT IN (\n SELECT id FROM activity_logs\n ORDER BY created_at DESC\n LIMIT 100\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test data cleaned up successfully'\n })\n } catch (error) {\n console.error('Test cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test users only\n * POST /test-cleanup/users\n */\napp.post('/test-cleanup/users', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test users (preserve admin)\n const result = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com'\n AND (\n email LIKE '%test%'\n OR email LIKE '%example.com%'\n OR first_name = 'Test'\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test users cleaned up successfully'\n })\n } catch (error) {\n console.error('User cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test collections only\n * POST /test-cleanup/collections\n */\napp.post('/test-cleanup/collections', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Get test collection IDs first\n const collections = await db.prepare(`\n SELECT id FROM collections\n WHERE name LIKE 'test_%'\n OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).all()\n\n if (collections.results && collections.results.length > 0) {\n const collectionIds = collections.results.map((c: any) => c.id)\n\n // Delete associated fields\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM collection_fields WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete associated content\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM content WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete the collections\n const result = await db.prepare(`\n DELETE FROM collections\n WHERE id IN (${collectionIds.map(() => '?').join(',')})\n `).bind(...collectionIds).run()\n\n deletedCount = result.meta?.changes || 0\n }\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test collections cleaned up successfully'\n })\n } catch (error) {\n console.error('Collection cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test content only\n * POST /test-cleanup/content\n */\napp.post('/test-cleanup/content', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test content\n const result = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %'\n OR title LIKE '%E2E%'\n OR title LIKE '%Playwright%'\n OR title LIKE '%Sample%'\n `).run()\n\n // Clean up orphaned content_data\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test content cleaned up successfully'\n })\n } catch (error) {\n console.error('Content cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Plugin Middleware\n *\n * Provides middleware functions for checking plugin status and enforcing plugin requirements\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n/**\n * Check if a plugin is active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @returns Promise - True if the plugin is active, false otherwise\n */\nexport async function isPluginActive(db: D1Database, pluginId: string): Promise {\n try {\n const result = await db\n .prepare('SELECT status FROM plugins WHERE id = ?')\n .bind(pluginId)\n .first()\n\n return result?.status === 'active'\n } catch (error) {\n console.error(`[isPluginActive] Error checking plugin status for ${pluginId}:`, error)\n return false\n }\n}\n\n/**\n * Middleware to require a plugin to be active\n * Throws an error if the plugin is not active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @throws Error if plugin is not active\n */\nexport async function requireActivePlugin(db: D1Database, pluginId: string): Promise {\n const isActive = await isPluginActive(db, pluginId)\n if (!isActive) {\n throw new Error(`Plugin '${pluginId}' is required but is not active`)\n }\n}\n\n/**\n * Middleware to require multiple plugins to be active\n * Throws an error if any plugin is not active\n * @param db - The D1 database instance\n * @param pluginIds - Array of plugin IDs to check\n * @throws Error if any plugin is not active\n */\nexport async function requireActivePlugins(db: D1Database, pluginIds: string[]): Promise {\n for (const pluginId of pluginIds) {\n await requireActivePlugin(db, pluginId)\n }\n}\n\n/**\n * Get all active plugins\n * @param db - The D1 database instance\n * @returns Promise - Array of active plugin records\n */\nexport async function getActivePlugins(db: D1Database): Promise {\n try {\n const { results } = await db\n .prepare('SELECT * FROM plugins WHERE status = ?')\n .bind('active')\n .all()\n\n return results || []\n } catch (error) {\n console.error('[getActivePlugins] Error fetching active plugins:', error)\n return []\n }\n}\n","export interface ContentVersion {\n id: string\n version: number\n data: any\n author_id: string\n author_name?: string\n created_at: number\n is_current?: boolean\n}\n\nexport interface VersionHistoryData {\n contentId: string\n versions: ContentVersion[]\n currentVersion: number\n}\n\nexport function renderVersionHistory(data: VersionHistoryData): string {\n return `\n
\n
\n \n
\n
\n
\n

Version History

\n \n
\n
\n \n \n
\n
\n ${data.versions.map((version, index) => `\n
\n
\n
\n \n Version ${version.version}${version.is_current ? ' (Current)' : ''}\n \n \n ${new Date(version.created_at).toLocaleString()}\n \n
\n
\n ${!version.is_current ? `\n \n ` : ''}\n \n
\n
\n \n \n
\n
\n
\n Title:\n ${escapeHtml(version.data?.title || 'Untitled')}\n
\n
\n Author:\n ${escapeHtml(version.author_name || 'Unknown')}\n
\n ${version.data?.excerpt ? `\n
\n Excerpt:\n

${escapeHtml(version.data.excerpt.substring(0, 200))}${version.data.excerpt.length > 200 ? '...' : ''}

\n
\n ` : ''}\n
\n
\n \n \n ${!version.is_current && index < data.versions.length - 1 ? `\n
\n \n
\n Change detection coming soon...\n
\n
\n ` : ''}\n
\n `).join('')}\n
\n
\n \n \n
\n
\n \n ${data.versions.length} version${data.versions.length !== 1 ? 's' : ''} total\n \n \n
\n
\n
\n
\n \n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * EasyMDE Markdown Editor Plugin\n *\n * Provides markdown editing capabilities for richtext fields.\n * When active, this plugin injects the EasyMDE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'easy-mdx',\n version: '1.0.0',\n description: 'Lightweight markdown editor with live preview'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ EasyMDE editor plugin activated')\n },\n deactivate: async () => {\n console.info('❌ EasyMDE editor plugin deactivated')\n }\n})\n\nconst easyMdxPlugin = builder.build() as Plugin\n\nexport default easyMdxPlugin\n\n/**\n * Get EasyMDE CDN script tags\n * @returns HTML script and style tags for EasyMDE\n */\nexport function getMDXEditorScripts(): string {\n return `\n \n \n \n \n `\n}\n\n/**\n * Get EasyMDE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getMDXEditorInitScript(config?: {\n defaultHeight?: number\n toolbar?: string\n placeholder?: string\n}): string {\n const defaultHeight = config?.defaultHeight || 400\n const toolbar = config?.toolbar || 'full'\n const placeholder = config?.placeholder || 'Start writing your content...'\n\n return `\n // Initialize EasyMDE (Markdown Editor) only for markdown-marked fields\n function initializeMDXEditor() {\n if (typeof EasyMDE === 'undefined') {\n console.warn('EasyMDE not loaded yet, retrying...');\n setTimeout(initializeMDXEditor, 100);\n return;\n }\n\n // Find all textareas that need EasyMDE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"easymde\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (textarea.dataset.mdxeditorInitialized === 'true') {\n return;\n }\n\n // Mark as initialized\n textarea.dataset.mdxeditorInitialized = 'true';\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const editorToolbar = container?.dataset.toolbar || '${toolbar}';\n\n // Initialize EasyMDE\n try {\n const toolbarButtons = editorToolbar === 'minimal'\n ? ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'preview']\n : ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', 'table', '|', 'preview', 'side-by-side', 'fullscreen', '|', 'guide'];\n\n const easyMDE = new EasyMDE({\n element: textarea,\n placeholder: '${placeholder}',\n spellChecker: false,\n minHeight: height + 'px',\n toolbar: toolbarButtons,\n status: ['lines', 'words', 'cursor'],\n renderingConfig: {\n singleLineBreaks: false,\n codeSyntaxHighlighting: true\n }\n });\n\n // Store reference to editor instance\n textarea.easyMDEInstance = easyMDE;\n\n // Sync changes back to textarea\n easyMDE.codemirror.on(\"change\", () => {\n textarea.value = easyMDE.value();\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n textarea.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n\n console.log('EasyMDE initialized for field:', textarea.id || textarea.name);\n } catch (error) {\n console.error('Error initializing EasyMDE:', error);\n // Show textarea as fallback\n textarea.style.display = 'block';\n }\n });\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeMDXEditor);\n } else {\n // DOM already loaded, initialize immediately\n initializeMDXEditor();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeMDXEditor, 100);\n });\n `\n}\n\n/**\n * Check if EasyMDE editor plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isEasyMdxActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('easy-mdx')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking EasyMDE editor plugin status:', error)\n return false\n }\n}\n","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * TinyMCE Rich Text Editor Plugin\n *\n * Provides WYSIWYG editing capabilities for richtext fields.\n * When active, this plugin injects the TinyMCE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'tinymce-plugin',\n version: '1.0.0',\n description: 'Powerful WYSIWYG rich text editor for content creation'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ TinyMCE plugin activated')\n },\n deactivate: async () => {\n console.info('❌ TinyMCE plugin deactivated')\n }\n})\n\nconst tinymcePlugin = builder.build() as Plugin\n\nexport default tinymcePlugin\n\n/**\n * Get TinyMCE CDN script tag\n * @param apiKey - Optional TinyMCE API key (defaults to 'no-api-key')\n * @returns HTML script tag for TinyMCE CDN\n */\nexport function getTinyMCEScript(apiKey: string = 'no-api-key'): string {\n return ``\n}\n\n/**\n * Get TinyMCE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getTinyMCEInitScript(config?: {\n skin?: string\n defaultHeight?: number\n defaultToolbar?: string\n}): string {\n const skin = config?.skin || 'oxide-dark'\n const contentCss = skin.includes('dark') ? 'dark' : 'default'\n const defaultHeight = config?.defaultHeight || 300\n\n return `\n // Initialize TinyMCE only for TinyMCE-backed richtext fields\n function initializeTinyMCE() {\n if (typeof tinymce !== 'undefined') {\n // Find all textareas that need TinyMCE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"tinymce\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (tinymce.get(textarea.id)) {\n return;\n }\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const toolbar = container?.dataset.toolbar || 'full';\n\n tinymce.init({\n selector: '#' + textarea.id,\n skin: '${skin}',\n content_css: '${contentCss}',\n height: parseInt(height),\n menubar: false,\n plugins: [\n 'advlist', 'autolink', 'lists', 'link', 'image', 'charmap', 'preview',\n 'anchor', 'searchreplace', 'visualblocks', 'code', 'fullscreen',\n 'insertdatetime', 'media', 'table', 'help', 'wordcount'\n ],\n toolbar: toolbar === 'simple'\n ? 'bold italic underline | bullist numlist | link'\n : toolbar === 'minimal'\n ? 'bold italic | link'\n : 'undo redo | blocks | bold italic forecolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | help',\n content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; font-size: 14px }'\n });\n });\n }\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeTinyMCE);\n } else {\n // DOM already loaded, initialize immediately\n initializeTinyMCE();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeTinyMCE, 100);\n });\n `\n}\n\n/**\n * Check if TinyMCE plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isTinyMCEActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('tinymce-plugin')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking TinyMCE plugin status:', error)\n return false\n }\n}\n","/**\n * Quill Rich Text Editor Plugin\n *\n * Provides Quill editor integration for rich text editing in SonicJS\n * https://quilljs.com/\n */\n\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\n/**\n * Quill Editor Configuration Options\n */\nexport interface QuillOptions {\n theme?: 'snow' | 'bubble'\n placeholder?: string\n height?: number\n toolbar?: 'full' | 'simple' | 'minimal' | string[][]\n modules?: Record\n formats?: string[]\n}\n\n/**\n * Default Quill toolbar configurations\n */\nconst QUILL_TOOLBARS = {\n full: [\n [{ 'header': [1, 2, 3, 4, 5, 6, false] }],\n ['bold', 'italic', 'underline', 'strike'],\n [{ 'color': [] }, { 'background': [] }],\n [{ 'align': [] }],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n [{ 'indent': '-1'}, { 'indent': '+1' }],\n ['blockquote', 'code-block'],\n ['link', 'image', 'video'],\n ['clean']\n ],\n simple: [\n ['bold', 'italic', 'underline'],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n ['link']\n ],\n minimal: [\n ['bold', 'italic'],\n ['link']\n ]\n}\n\n/**\n * Render a Quill editor field\n * @param fieldId - The field ID\n * @param fieldName - The field name\n * @param value - The current value\n * @param options - Quill configuration options\n * @returns HTML string for the Quill editor field\n */\nexport function renderQuillField(\n fieldId: string,\n fieldName: string,\n value: string = '',\n options: QuillOptions = {}\n): string {\n const {\n theme = 'snow',\n placeholder = 'Enter content...',\n height = 300,\n toolbar = 'full'\n } = options\n\n // Escape HTML for hidden input\n const escapeHtml = (str: string) => {\n return str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n }\n\n return `\n
\n \n ${value}
\n\n \n \n \n `\n}\n\n/**\n * Generate Quill initialization script\n * @returns HTML script tag with Quill initialization code\n */\nexport function getQuillInitScript(): string {\n return `\n \n `\n}\n\n/**\n * Generate Quill CDN links\n * @param version - Quill version (default: 2.0.2)\n * @returns HTML script and link tags for Quill CDN\n */\nexport function getQuillCDN(version: string = '2.0.2'): string {\n return `\n \n \n \n\n \n \n\n \n \n `\n}\n\n/**\n * Create the Quill Editor Plugin\n */\nexport function createQuillEditorPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'quill-editor',\n version: '1.0.0',\n description: 'Quill rich text editor integration for SonicJS'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Quill Editor plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Quill Editor plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const quillEditorPlugin = createQuillEditorPlugin()\n","import { getMDXEditorInitScript, getMDXEditorScripts } from '../../plugins/available/easy-mdx'\nimport { getTinyMCEInitScript, getTinyMCEScript } from '../../plugins/available/tinymce-plugin'\nimport { getQuillCDN, getQuillInitScript } from '../../plugins/core-plugins/quill-editor'\nimport { renderAlert } from '../alert.template'\nimport { FieldDefinition, renderDynamicField, renderFieldGroup } from '../components/dynamic-field.template'\nimport { getConfirmationDialogScript, renderConfirmationDialog } from '../confirmation-dialog.template'\nimport { AdminLayoutCatalystData, renderAdminLayoutCatalyst } from '../layouts/admin-layout-catalyst.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n schema: any\n}\n\nexport interface ContentFormData {\n id?: string\n title?: string\n slug?: string\n created_at?: number\n updated_at?: number\n published_at?: number\n data?: any\n status?: string\n scheduled_publish_at?: number\n scheduled_unpublish_at?: number\n review_status?: string\n meta_title?: string\n meta_description?: string\n collection: Collection\n fields: FieldDefinition[]\n isEdit?: boolean\n error?: string\n success?: string\n validationErrors?: Record\n workflowEnabled?: boolean // New flag to indicate if workflow plugin is active\n tinymceEnabled?: boolean // Flag to indicate if TinyMCE plugin is active\n tinymceSettings?: {\n apiKey?: string\n defaultHeight?: number\n defaultToolbar?: string\n skin?: string\n }\n quillEnabled?: boolean // Flag to indicate if Quill plugin is active\n quillSettings?: {\n version?: string\n defaultHeight?: number\n defaultToolbar?: string\n theme?: string\n }\n mdxeditorEnabled?: boolean // Flag to indicate if MDXEditor plugin is active\n mdxeditorSettings?: {\n defaultHeight?: number\n theme?: string\n toolbar?: string\n placeholder?: string\n }\n referrerParams?: string // URL parameters to preserve filters when returning to list\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentFormPage(data: ContentFormData): string {\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? `Edit: ${data.title || 'Content'}` : `New ${data.collection.display_name}`\n const hasValidationErrors = Boolean(data.validationErrors && Object.keys(data.validationErrors).length > 0)\n\n // Construct back URL with preserved filters\n const backUrl = data.referrerParams\n ? `/admin/content?${data.referrerParams}`\n : `/admin/content?collection=${data.collection.id}`\n\n // Group fields by category\n const coreFields = data.fields.filter(f => ['title', 'slug', 'content'].includes(f.field_name))\n const contentFields = data.fields.filter(f => !['title', 'slug', 'content'].includes(f.field_name) && !f.field_name.startsWith('meta_'))\n const metaFields = data.fields.filter(f => f.field_name.startsWith('meta_'))\n\n // Helper function to get field value - title and slug are stored as columns, others in data JSON\n const getFieldValue = (fieldName: string) => {\n if (fieldName === 'title') return data.title || data.data?.[fieldName] || ''\n if (fieldName === 'slug') return data.slug || data.data?.[fieldName] || ''\n return data.data?.[fieldName] || ''\n }\n\n // Prepare plugin statuses for field rendering\n const pluginStatuses = {\n quillEnabled: data.quillEnabled || false,\n mdxeditorEnabled: data.mdxeditorEnabled || false,\n tinymceEnabled: data.tinymceEnabled || false\n }\n\n // Render field groups\n const coreFieldsHTML = coreFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id // Pass content ID when editing\n }))\n\n const contentFieldsHTML = contentFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const metaFieldsHTML = metaFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const pageContent = `\n
\n \n
\n
\n

${isEdit ? 'Edit Content' : 'New Content'}

\n

\n ${data.collection.description || `Manage ${data.collection.display_name.toLowerCase()} content`}\n

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

${data.collection.display_name}

\n

${isEdit ? 'Update your content' : 'Create new content'}

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n
\n \n
\n \n \n ${isEdit ? `` : ''}\n ${data.referrerParams ? `` : ''}\n \n \n ${renderFieldGroup('Basic Information', coreFieldsHTML)}\n \n \n ${contentFields.length > 0 ? renderFieldGroup('Content Details', contentFieldsHTML) : ''}\n \n \n ${metaFields.length > 0 ? renderFieldGroup('SEO & Metadata', metaFieldsHTML, true) : ''}\n \n
\n \n
\n\n \n
\n \n
\n

Publishing

\n\n ${data.workflowEnabled ? `\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n \n

Leave empty to publish immediately

\n
\n\n \n
\n \n \n

Automatically unpublish at this time

\n
\n ` : `\n \n
\n \n
\n \n \n \n \n \n \n \n
\n

Enable Workflow plugin for advanced status management

\n
\n `}\n
\n\n \n ${isEdit ? `\n
\n

Content Info

\n\n
\n
\n
Created
\n
${data.created_at ? new Date(data.created_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Last Modified
\n
${data.updated_at ? new Date(data.updated_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Author
\n
${data.data?.author || 'Unknown'}
\n
\n ${data.published_at ? `\n
\n
Published
\n
${new Date(data.published_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n\n
\n \n \n \n \n View Version History\n \n
\n
\n ` : ''}\n\n \n
\n

Quick Actions

\n\n
\n \n \n \n \n \n Preview Content\n \n\n \n \n \n \n Duplicate Content\n \n\n ${isEdit ? `\n \n \n \n \n Delete Content\n \n ` : ''}\n
\n
\n
\n\n \n
\n \n \n \n \n Cancel\n \n\n
\n \n \n \n \n ${isEdit ? 'Update' : 'Save'}\n \n\n ${data.user?.role !== 'viewer' ? `\n \n \n \n \n ${isEdit ? 'Update' : 'Save'} & Publish\n \n ` : ''}\n
\n
\n
\n
\n
\n\n \n ${renderConfirmationDialog({\n id: 'duplicate-content-confirm',\n title: 'Duplicate Content',\n message: 'Create a copy of this content?',\n confirmText: 'Duplicate',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performDuplicateContent()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-content-confirm',\n title: 'Delete Content',\n message: 'Are you sure you want to delete this content? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: `performDeleteContent('${data.id}')`\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-repeater-item-confirm',\n title: 'Delete Item',\n message: 'Are you sure you want to delete this item? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-block-confirm',\n title: 'Delete Block',\n message: 'Are you sure you want to delete this block? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${getConfirmationDialogScript()}\n\n ${data.tinymceEnabled ? getTinyMCEScript(data.tinymceSettings?.apiKey) : ''}\n\n ${data.quillEnabled ? getQuillCDN(data.quillSettings?.version) : ''}\n\n ${data.quillEnabled ? getQuillInitScript() : ''}\n\n ${data.mdxeditorEnabled ? getMDXEditorScripts() : ''}\n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n content: pageContent,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderTable, TableData, TableColumn } from '../table.template'\nimport type { FilterBarData } from '../filter-bar.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../confirmation-dialog.template'\n\nexport interface ContentItem {\n id: string\n title: string\n slug: string\n modelName: string\n statusBadge: string\n authorName: string\n formattedDate: string\n availableActions: string[]\n}\n\nexport interface ContentListPageData {\n modelName: string\n status: string\n page: number\n search?: string\n models: Array<{\n name: string\n displayName: string\n }>\n contentItems: ContentItem[]\n totalItems: number\n itemsPerPage: number\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentListPage(data: ContentListPageData): string {\n // Build current URL parameters to pass to edit page\n const urlParams = new URLSearchParams()\n if (data.modelName && data.modelName !== 'all') urlParams.set('model', data.modelName)\n if (data.status && data.status !== 'all') urlParams.set('status', data.status)\n if (data.search) urlParams.set('search', data.search)\n if (data.page && data.page !== 1) urlParams.set('page', data.page.toString())\n const currentParams = urlParams.toString()\n\n // Check if filters are active (not in default state)\n const hasActiveFilters = data.modelName !== 'all' || data.status !== 'all' || !!data.search\n\n // Prepare filter bar data\n const filterBarData: FilterBarData = {\n filters: [\n {\n name: 'model',\n label: 'Model',\n options: [\n { value: 'all', label: 'All Models', selected: data.modelName === 'all' },\n ...data.models.map(model => ({\n value: model.name,\n label: model.displayName,\n selected: data.modelName === model.name\n }))\n ]\n },\n {\n name: 'status',\n label: 'Status',\n options: [\n { value: 'all', label: 'All Status', selected: data.status === 'all' },\n { value: 'draft', label: 'Draft', selected: data.status === 'draft' },\n { value: 'review', label: 'Under Review', selected: data.status === 'review' },\n { value: 'scheduled', label: 'Scheduled', selected: data.status === 'scheduled' },\n { value: 'published', label: 'Published', selected: data.status === 'published' },\n { value: 'archived', label: 'Archived', selected: data.status === 'archived' },\n { value: 'deleted', label: 'Deleted', selected: data.status === 'deleted' }\n ]\n }\n ],\n actions: [\n {\n label: 'Advanced Search',\n className: 'btn-primary',\n onclick: 'openAdvancedSearch()'\n },\n {\n label: 'Refresh',\n className: 'btn-secondary',\n onclick: 'location.reload()'\n }\n ],\n bulkActions: [\n { label: 'Publish', value: 'publish', icon: 'check-circle' },\n { label: 'Unpublish', value: 'unpublish', icon: 'x-circle' },\n { label: 'Delete', value: 'delete', icon: 'trash', className: 'text-pink-600' }\n ]\n }\n\n // Prepare table data\n const tableColumns: TableColumn[] = [\n {\n key: 'title',\n label: 'Title',\n sortable: true,\n sortType: 'string',\n render: (value, row) => `\n
\n
\n \n
${row.slug}
\n
\n
\n `\n },\n {\n key: 'modelName',\n label: 'Model',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'statusBadge',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (value) => value\n },\n {\n key: 'authorName',\n label: 'Author',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'formattedDate',\n label: 'Updated',\n sortable: true,\n sortType: 'date',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n className: 'text-sm font-medium',\n render: (value, row) => `\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'content-table',\n columns: tableColumns,\n rows: data.contentItems,\n selectable: true,\n rowClickable: true,\n rowClickUrl: (row: ContentItem) => `/admin/content/${row.id}/edit${currentParams ? `?ref=${encodeURIComponent(currentParams)}` : ''}`,\n emptyMessage: 'No content found. Create your first content item to get started.'\n }\n\n // Prepare pagination data\n const totalPages = Math.ceil(data.totalItems / data.itemsPerPage)\n const startItem = (data.page - 1) * data.itemsPerPage + 1\n const endItem = Math.min(data.page * data.itemsPerPage, data.totalItems)\n\n const paginationData: PaginationData = {\n currentPage: data.page,\n totalPages,\n totalItems: data.totalItems,\n itemsPerPage: data.itemsPerPage,\n startItem,\n endItem,\n baseUrl: '/admin/content',\n queryParams: {\n model: data.modelName,\n status: data.status,\n ...(data.search ? { search: data.search } : {})\n },\n showPageSizeSelector: true,\n pageSizeOptions: [10, 20, 50, 100]\n }\n\n // Generate page content\n const pageContent = `\n
\n \n
\n
\n

Content Management

\n

Manage and organize your content items

\n
\n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n \n
\n \n
\n \n \n ${data.models.map(model => `\n \n `).join('')}\n \n \n \n \n
\n
\n\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n
\n ${data.totalItems} ${data.totalItems === 1 ? 'item' : 'items'}\n ${filterBarData.actions?.map(action => `\n \n ${action.label === 'Refresh' ? `\n \n \n \n ` : ''}\n ${action.label}\n \n `).join('') || ''}\n ${filterBarData.bulkActions && filterBarData.bulkActions.length > 0 ? `\n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n \n Move to Draft\n \n
\n
\n \n \n \n \n Delete Selected\n \n
\n
\n
\n ` : ''}\n
\n
\n
\n
\n
\n \n \n
\n ${renderTable(tableData)}\n ${renderPagination(paginationData)}\n
\n \n
\n \n \n
\n
\n \n \n\n \n ${renderConfirmationDialog({\n id: 'bulk-action-confirm',\n title: 'Confirm Bulk Action',\n message: 'Are you sure you want to perform this action? This operation will affect multiple items.',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n iconColor: 'blue',\n onConfirm: 'executeBulkAction()'\n })}\n\n \n ${getConfirmationDialogScript()}\n\n \n
\n
\n \n
\n\n \n
\n
\n \n
\n

\n 🔍 Advanced Search\n

\n \n
\n\n \n
\n \n
\n \n
\n \n
\n
\n
\n\n \n
\n \n
\n \n \n
\n
\n\n \n
\n

Filters

\n \n
\n \n
\n \n \n \n ${data.models.map(\n (model) => `\n \n `\n ).join('')}\n \n

Hold Ctrl/Cmd to select multiple

\n
\n\n \n
\n \n \n \n \n \n \n \n \n
\n
\n
\n\n \n
\n \n Cancel\n \n \n Search\n \n
\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n // Prepare layout data\n const layoutData: AdminLayoutCatalystData = {\n title: 'Content Management',\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export function resolveSchemaFieldType(fieldConfig: Record): string {\n if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n return 'slug'\n }\n\n if (fieldConfig.type && fieldConfig.type !== 'string') {\n return fieldConfig.type\n }\n\n if (fieldConfig.format === 'richtext') {\n return 'richtext'\n }\n\n if (fieldConfig.format === 'media') {\n return 'media'\n }\n\n if (fieldConfig.format === 'date-time') {\n return 'date'\n }\n\n if (Array.isArray(fieldConfig.enum)) {\n return 'select'\n }\n\n return fieldConfig.type || 'string'\n}\n\nexport function buildSchemaFieldOptions(fieldConfig: Record): Record {\n const fieldOptions = { ...fieldConfig }\n const resolvedFieldType = resolveSchemaFieldType(fieldConfig)\n\n if (resolvedFieldType === 'select' && Array.isArray(fieldConfig.enum)) {\n fieldOptions.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return fieldOptions\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { Bindings, Variables } from '../app'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { CACHE_CONFIGS, getCacheService } from '../services/cache'\nimport { PluginService } from '../services/plugin-service'\nimport { ContentVersion, renderVersionHistory, VersionHistoryData } from '../templates/components/version-history.template'\nimport { ContentFormData, renderContentFormPage } from '../templates/pages/admin-content-form.template'\nimport { ContentListPageData, renderContentListPage } from '../templates/pages/admin-content-list.template'\nimport { getBlocksFieldConfig, parseBlocksValue } from '../utils/blocks'\nimport { escapeHtml, sanitizeRichText } from '../utils/sanitize'\nimport { buildSchemaFieldOptions, resolveSchemaFieldType } from './admin-content-field-types'\n\nconst adminContentRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Field definition type for form processing\ninterface FieldDefinition {\n field_name: string\n field_label: string\n field_type: string\n field_options?: any\n is_required?: boolean\n}\n\n// Result of parsing a single field value\ninterface ParsedFieldResult {\n value: any\n errors: string[]\n}\n\n/**\n * Parse a single field value from form data with validation\n * Centralizes field parsing logic used in POST, PUT, and preview handlers\n */\nfunction parseFieldValue(\n field: FieldDefinition,\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): ParsedFieldResult {\n const { skipValidation = false } = options\n const value = formData.get(field.field_name)\n const errors: string[] = []\n\n // Handle blocks fields (array with blocks config)\n const blocksConfig = getBlocksFieldConfig(field.field_options)\n if (blocksConfig) {\n const parsed = parseBlocksValue(value, blocksConfig)\n if (!skipValidation && field.is_required && parsed.value.length === 0) {\n parsed.errors.push(`${field.field_label} is required`)\n }\n return { value: parsed.value, errors: parsed.errors }\n }\n\n // Required field validation\n if (!skipValidation && field.is_required && (!value || value.toString().trim() === '')) {\n return { value: null, errors: [`${field.field_label} is required`] }\n }\n\n // Type-specific parsing\n switch (field.field_type) {\n case 'number':\n if (value && isNaN(Number(value))) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a valid number`)\n }\n return { value: null, errors }\n }\n return { value: value ? Number(value) : null, errors: [] }\n\n case 'boolean':\n // Check for the hidden _submitted field to determine if checkbox was rendered\n const submitted = formData.get(`${field.field_name}_submitted`)\n return { value: submitted ? value === 'true' : false, errors: [] }\n\n case 'select':\n if (field.field_options?.multiple) {\n return { value: formData.getAll(`${field.field_name}[]`), errors: [] }\n }\n return { value: value, errors: [] }\n\n case 'array': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: [], errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON array`)\n }\n return { value: [], errors }\n }\n if (!skipValidation && field.is_required && parsed.length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: [], errors }\n }\n }\n\n case 'object': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: {}, errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON object`)\n }\n return { value: {}, errors }\n }\n if (!skipValidation && field.is_required && Object.keys(parsed).length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: {}, errors }\n }\n }\n\n case 'json': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: null, errors }\n }\n try {\n return { value: JSON.parse(value.toString()), errors: [] }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: null, errors }\n }\n }\n\n default:\n return { value: value, errors: [] }\n }\n}\n\n/**\n * Extract all field values from form data\n */\nfunction extractFieldData(\n fields: FieldDefinition[],\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): { data: Record; errors: Record } {\n const data: Record = {}\n const errors: Record = {}\n\n for (const field of fields) {\n const result = parseFieldValue(field, formData, options)\n data[field.field_name] = result.value\n if (result.errors.length > 0) {\n errors[field.field_name] = result.errors\n }\n }\n\n return { data, errors }\n}\n\n// Apply authentication middleware\nadminContentRoutes.use('*', requireAuth())\n\n// Get collection fields\nasync function getCollectionFields(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('fields', collectionId),\n async () => {\n // First, check if collection has a schema (code-based collection)\n const collectionStmt = db.prepare('SELECT schema FROM collections WHERE id = ?')\n const collectionRow = await collectionStmt.bind(collectionId).first() as any\n\n if (collectionRow && collectionRow.schema) {\n try {\n const schema = typeof collectionRow.schema === 'string' ? JSON.parse(collectionRow.schema) : collectionRow.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n return Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n const fieldOptions = buildSchemaFieldOptions(fieldConfig)\n\n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: resolveSchemaFieldType(fieldConfig),\n field_label: fieldConfig.title || fieldName,\n field_options: fieldOptions,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table for legacy collections\n const stmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results } = await stmt.bind(collectionId).all()\n\n return (results || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }))\n }\n )\n}\n\n// Get collection by ID\nasync function getCollection(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('collection', collectionId),\n async () => {\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ? AND is_active = 1')\n const collection = await stmt.bind(collectionId).first() as any\n\n if (!collection) return null\n\n return {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n schema: collection.schema ? JSON.parse(collection.schema) : {}\n }\n }\n )\n}\n\n// Content list (main page)\nadminContentRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const db = c.env.DB\n\n // Get query parameters\n const page = parseInt(url.searchParams.get('page') || '1')\n const limit = parseInt(url.searchParams.get('limit') || '20')\n const modelName = url.searchParams.get('model') || 'all'\n const status = url.searchParams.get('status') || 'all'\n const search = url.searchParams.get('search') || ''\n const offset = (page - 1) * limit\n\n // Get all collections for filter dropdown (exclude form-sourced)\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results: collectionsResults } = await collectionsStmt.all()\n const models = (collectionsResults || []).map((row: any) => ({\n name: row.name,\n displayName: row.display_name\n }))\n\n // Build where conditions\n const conditions: string[] = []\n const params: any[] = []\n\n // Hide content from form-sourced collections in the regular content list\n conditions.push(\"(col.source_type IS NULL OR col.source_type = 'user')\")\n\n // Always filter out deleted content unless specifically requested\n if (status !== 'deleted') {\n conditions.push(\"c.status != 'deleted'\")\n }\n\n if (search) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n params.push(`%${search}%`, `%${search}%`, `%${search}%`)\n }\n\n if (modelName !== 'all') {\n conditions.push('col.name = ?')\n params.push(modelName)\n }\n\n if (status !== 'all' && status !== 'deleted') {\n conditions.push('c.status = ?')\n params.push(status)\n } else if (status === 'deleted') {\n conditions.push(\"c.status = 'deleted'\")\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n JOIN collections col ON c.collection_id = col.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalItems = countResult?.count || 0\n\n // Get content items\n const contentStmt = db.prepare(`\n SELECT c.id, c.title, c.slug, c.status, c.created_at, c.updated_at,\n col.name as collection_name, col.display_name as collection_display_name,\n u.first_name, u.last_name, u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n const { results } = await contentStmt.bind(...params, limit, offset).all()\n\n // Process content items\n const contentItems = (results || []).map((row: any) => {\n const statusConfig: Record = {\n draft: {\n class: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-1 ring-inset ring-zinc-600/20 dark:ring-zinc-500/20',\n text: 'Draft'\n },\n review: {\n class: 'bg-amber-50 dark:bg-amber-500/10 text-amber-700 dark:text-amber-400 ring-1 ring-inset ring-amber-600/20 dark:ring-amber-500/20',\n text: 'Under Review'\n },\n scheduled: {\n class: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-600/20 dark:ring-blue-500/20',\n text: 'Scheduled'\n },\n published: {\n class: 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-400 ring-1 ring-inset ring-green-600/20 dark:ring-green-500/20',\n text: 'Published'\n },\n archived: {\n class: 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-400 ring-1 ring-inset ring-purple-600/20 dark:ring-purple-500/20',\n text: 'Archived'\n },\n deleted: {\n class: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-600/20 dark:ring-red-500/20',\n text: 'Deleted'\n }\n }\n\n const config = statusConfig[row.status as keyof typeof statusConfig] || statusConfig.draft\n const statusBadge = `\n \n ${config?.text || row.status}\n \n `\n\n const authorName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.author_email || 'Unknown'\n\n const formattedDate = new Date(row.updated_at).toLocaleDateString()\n\n // Determine available workflow actions based on status\n const availableActions: string[] = []\n switch (row.status) {\n case 'draft':\n availableActions.push('submit_for_review', 'publish')\n break\n case 'review':\n availableActions.push('approve', 'request_changes')\n break\n case 'published':\n availableActions.push('unpublish', 'archive')\n break\n case 'scheduled':\n availableActions.push('unschedule')\n break\n }\n\n return {\n id: row.id,\n title: row.title,\n slug: row.slug,\n modelName: row.collection_display_name,\n statusBadge,\n authorName,\n formattedDate,\n availableActions\n }\n })\n\n const pageData: ContentListPageData = {\n modelName,\n status,\n page,\n search,\n models,\n contentItems,\n totalItems,\n itemsPerPage: limit,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentListPage(pageData))\n } catch (error) {\n console.error('Error fetching content list:', error)\n return c.html(`

Error loading content: ${error}

`)\n }\n})\n\n// New content form\nadminContentRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const collectionId = url.searchParams.get('collection')\n\n if (!collectionId) {\n // Show collection selection page\n const db = c.env.DB\n // Exclude form-sourced collections — users shouldn't manually create content in form collections\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name, description FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results } = await collectionsStmt.all()\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description\n }))\n\n // Render collection selection page\n const selectionHTML = `\n \n \n \n Select Collection - SonicJS AI Admin\n \n \n \n
\n
\n

Create New Content

\n

Select a collection to create content in:

\n \n
\n ${collections.map(collection => `\n \n

${collection.display_name}

\n

${collection.description || 'No description'}

\n
\n `).join('')}\n
\n \n \n
\n
\n \n \n `\n\n return c.html(selectionHTML)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n console.log('[Content Form /new] Editor plugins status:', {\n tinymce: tinymceEnabled,\n quill: quillEnabled,\n mdxeditor: mdxeditorEnabled,\n mdxeditorSettings\n })\n\n const formData: ContentFormData = {\n collection,\n fields,\n isEdit: false,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading new content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content form.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Edit content form\nadminContentRoutes.get('/:id/edit', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n\n // Capture referrer parameters to preserve filters when returning to list\n const referrerParams = url.searchParams.get('ref') || ''\n\n // Get content with caching\n const cache = getCacheService(CACHE_CONFIGS.content!)\n const content = await cache.getOrSet(\n cache.generateKey('content', id),\n async () => {\n const contentStmt = db.prepare(`\n SELECT c.*, col.id as collection_id, col.name as collection_name,\n col.display_name as collection_display_name, col.description as collection_description,\n col.schema as collection_schema\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n return await contentStmt.bind(id).first() as any\n }\n )\n\n if (!content) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Content not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const collection = {\n id: content.collection_id,\n name: content.collection_name,\n display_name: content.collection_display_name,\n description: content.collection_description,\n schema: content.collection_schema ? JSON.parse(content.collection_schema) : {}\n }\n\n const fields = await getCollectionFields(db, content.collection_id)\n const contentData = content.data ? JSON.parse(content.data) : {}\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n const formData: ContentFormData = {\n id: content.id,\n title: content.title,\n slug: content.slug,\n created_at: content.created_at,\n updated_at: content.updated_at,\n published_at: content.published_at,\n data: contentData,\n status: content.status,\n scheduled_publish_at: content.scheduled_publish_at,\n scheduled_unpublish_at: content.scheduled_unpublish_at,\n review_status: content.review_status,\n meta_title: content.meta_title,\n meta_description: content.meta_description,\n collection,\n fields,\n isEdit: true,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n referrerParams,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading edit content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content for editing.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Create content\nadminContentRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n const action = formData.get('action') as string\n\n if (!collectionId) {\n return c.html(html`\n
\n Collection ID is required.\n
\n `)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n // Check for validation errors\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Generate slug if not provided\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || 'draft'\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Create content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n // Invalidate collection content list cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n\n // Create initial version\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n contentId,\n 1,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n contentId,\n 'created',\n 'none',\n status,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${contentId}/edit?success=Content saved successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content created successfully!`\n : `/admin/content?collection=${collectionId}&success=Content created successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error creating content:', error)\n return c.html(html`\n
\n Failed to create content. Please try again.\n
\n `)\n }\n})\n\n// Update content\nadminContentRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const formData = await c.req.formData()\n const action = formData.get('action') as string\n\n const db = c.env.DB\n\n // Get existing content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existingContent = await contentStmt.bind(id).first() as any\n\n if (!existingContent) {\n return c.html(html`\n
\n Content not found.\n
\n `)\n }\n\n const collection = await getCollection(db, existingContent.collection_id)\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, existingContent.collection_id)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n id,\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Update slug if title changed\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || existingContent.status\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Update content\n const now = Date.now()\n\n const updateStmt = db.prepare(`\n UPDATE content SET\n slug = ?, title = ?, data = ?, status = ?,\n scheduled_publish_at = ?, scheduled_unpublish_at = ?,\n meta_title = ?, meta_description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n scheduledPublishAt ? new Date(scheduledPublishAt).getTime() : null,\n scheduledUnpublishAt ? new Date(scheduledUnpublishAt).getTime() : null,\n data.meta_title || null,\n data.meta_description || null,\n now,\n id\n ).run()\n\n // Invalidate content cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existingContent.collection_id}:*`)\n\n // Create new version if content changed\n const existingData = JSON.parse(existingContent.data || '{}')\n if (JSON.stringify(existingData) !== JSON.stringify(data)) {\n // Get next version number\n const versionCountStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const versionResult = await versionCountStmt.bind(id).first() as any\n const nextVersion = (versionResult?.max_version || 0) + 1\n\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Log workflow action if status changed\n if (status !== existingContent.status) {\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'status_changed',\n existingContent.status,\n status,\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${id}/edit?success=Content updated successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content updated successfully!`\n : `/admin/content?collection=${existingContent.collection_id}&success=Content updated successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error updating content:', error)\n return c.html(html`\n
\n Failed to update content. Please try again.\n
\n `)\n }\n})\n\n// Content preview\nadminContentRoutes.post('/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html('

Collection not found

')\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract field data for preview (skip validation)\n const { data } = extractFieldData(fields, formData, { skipValidation: true })\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeStatus = escapeHtml(String(formData.get('status') || 'draft'))\n const safeMetaDesc = data.meta_description ? escapeHtml(data.meta_description) : ''\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Preview: ${safeTitle}\n \n \n \n

${safeTitle}

\n
\n Collection: ${escapeHtml(collection.display_name)}
\n Status: ${safeStatus}
\n ${safeMetaDesc ? `Description: ${safeMetaDesc}
` : ''}\n
\n
\n ${safeContent}\n
\n\n

All Fields:

\n \n \n ${fields.map(field => `\n \n \n \n \n `).join('')}\n
FieldValue
${escapeHtml(field.field_label)}${data[field.field_name] ? escapeHtml(String(data[field.field_name])) : 'empty'}
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating preview:', error)\n return c.html('

Error generating preview

')\n }\n})\n\n// Duplicate content\nadminContentRoutes.post('/duplicate', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const originalId = formData.get('id') as string\n\n if (!originalId) {\n return c.json({ success: false, error: 'Content ID required' })\n }\n\n const db = c.env.DB\n\n // Get original content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const original = await contentStmt.bind(originalId).first() as any\n\n if (!original) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n // Create duplicate\n const newId = crypto.randomUUID()\n const now = Date.now()\n const originalData = JSON.parse(original.data || '{}')\n\n // Modify title to indicate it's a copy\n originalData.title = `${originalData.title || 'Untitled'} (Copy)`\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n newId,\n original.collection_id,\n `${original.slug}-copy-${Date.now()}`,\n originalData.title,\n JSON.stringify(originalData),\n 'draft', // Always start as draft\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n return c.json({ success: true, id: newId })\n } catch (error) {\n console.error('Error duplicating content:', error)\n return c.json({ success: false, error: 'Failed to duplicate content' })\n }\n})\n\n// Get bulk actions modal\nadminContentRoutes.get('/bulk-actions', async (c) => {\n const bulkActionsModal = `\n
\n
\n
\n

Bulk Actions

\n \n
\n

\n Select items from the table below to perform bulk actions.\n

\n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n Move to Draft\n \n \n \n \n \n Delete Selected\n \n
\n
\n
\n \n `\n\n return c.html(bulkActionsModal)\n})\n\n// Perform bulk action\nadminContentRoutes.post('/bulk-action', async (c) => {\n try {\n const user = c.get('user')\n const body = await c.req.json()\n const { action, ids } = body\n\n if (!action || !ids || ids.length === 0) {\n return c.json({ success: false, error: 'Action and IDs required' })\n }\n\n const db = c.env.DB\n const now = Date.now()\n\n if (action === 'delete') {\n // Soft delete by setting status to 'deleted'\n const placeholders = ids.map(() => '?').join(',')\n const stmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(now, ...ids).run()\n } else if (action === 'publish' || action === 'draft') {\n // Update status\n const placeholders = ids.map(() => '?').join(',')\n const publishedAt = action === 'publish' ? now : null\n const stmt = db.prepare(`\n UPDATE content\n SET status = ?, published_at = ?, updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(action, publishedAt, now, ...ids).run()\n } else {\n return c.json({ success: false, error: 'Invalid action' })\n }\n\n // Invalidate cache for all affected content items\n const cache = getCacheService(CACHE_CONFIGS.content!)\n for (const contentId of ids) {\n await cache.delete(cache.generateKey('content', contentId))\n }\n // Also invalidate list caches (they contain content from potentially multiple collections)\n await cache.invalidate('content:list:*')\n\n return c.json({ success: true, count: ids.length })\n } catch (error) {\n console.error('Bulk action error:', error)\n return c.json({ success: false, error: 'Failed to perform bulk action' })\n }\n})\n\n// Delete content\nadminContentRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const user = c.get('user')\n\n // Check if content exists\n const contentStmt = db.prepare('SELECT id, title FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.json({ success: false, error: 'Content not found' }, 404)\n }\n\n // Soft delete by setting status to 'deleted'\n const now = Date.now()\n const deleteStmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id = ?\n `)\n await deleteStmt.bind(now, id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate('content:list:*')\n\n // Return success - let HTMX reload the page\n return c.html(`\n
\n
\n
\n \n \n \n

Content deleted successfully. Refreshing...

\n
\n
\n
\n `)\n } catch (error) {\n console.error('Delete content error:', error)\n return c.json({ success: false, error: 'Failed to delete content' }, 500)\n }\n})\n\n// Get version history\nadminContentRoutes.get('/:id/versions', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.html('

Content not found

')\n }\n\n // Get all versions with author info\n const versionsStmt = db.prepare(`\n SELECT cv.*, u.first_name, u.last_name, u.email\n FROM content_versions cv\n LEFT JOIN users u ON cv.author_id = u.id\n WHERE cv.content_id = ?\n ORDER BY cv.version DESC\n `)\n const { results } = await versionsStmt.bind(id).all()\n\n const versions: ContentVersion[] = (results || []).map((row: any) => ({\n id: row.id,\n version: row.version,\n data: JSON.parse(row.data || '{}'),\n author_id: row.author_id,\n author_name: row.first_name && row.last_name ? `${row.first_name} ${row.last_name}` : row.email,\n created_at: row.created_at,\n is_current: false // Will be set below\n }))\n\n // Mark the latest version as current\n if (versions.length > 0) {\n versions[0]!.is_current = true\n }\n\n const data: VersionHistoryData = {\n contentId: id,\n versions,\n currentVersion: versions.length > 0 ? versions[0]!.version : 1\n }\n\n return c.html(renderVersionHistory(data))\n } catch (error) {\n console.error('Error loading version history:', error)\n return c.html('

Error loading version history

')\n }\n})\n\n// Restore version\nadminContentRoutes.post('/:id/restore/:version', async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const user = c.get('user')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT * FROM content_versions \n WHERE content_id = ? AND version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.json({ success: false, error: 'Version not found' })\n }\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const currentContent = await contentStmt.bind(id).first() as any\n\n if (!currentContent) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n const restoredData = JSON.parse(versionData.data)\n const now = Date.now()\n\n // Update content with restored data\n const updateStmt = db.prepare(`\n UPDATE content SET\n title = ?, data = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n restoredData.title || 'Untitled',\n versionData.data,\n now,\n id\n ).run()\n\n // Create new version for the restoration\n const nextVersionStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const nextVersionResult = await nextVersionStmt.bind(id).first() as any\n const nextVersion = (nextVersionResult?.max_version || 0) + 1\n\n const newVersionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await newVersionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n versionData.data,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, comment, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'version_restored',\n currentContent.status,\n currentContent.status,\n user?.userId || 'unknown',\n `Restored to version ${version}`,\n now\n ).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error restoring version:', error)\n return c.json({ success: false, error: 'Failed to restore version' })\n }\n})\n\n// Preview specific version\nadminContentRoutes.get('/:id/version/:version/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT cv.*, c.collection_id, col.display_name as collection_name\n FROM content_versions cv\n JOIN content c ON cv.content_id = c.id\n JOIN collections col ON c.collection_id = col.id\n WHERE cv.content_id = ? AND cv.version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.html('

Version not found

')\n }\n\n const data = JSON.parse(versionData.data || '{}')\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n const safeExcerpt = data.excerpt ? escapeHtml(data.excerpt) : ''\n const safeCollectionName = escapeHtml(versionData.collection_name || '')\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Version ${version} Preview: ${safeTitle}\n \n \n \n
\n Version ${version}\n Collection: ${safeCollectionName}
\n Created: ${new Date(versionData.created_at).toLocaleString()}
\n This is a historical version preview\n
\n\n

${safeTitle}

\n\n
\n ${safeContent}\n
\n\n ${safeExcerpt ? `

Excerpt:

${safeExcerpt}

` : ''}\n\n

All Field Data:

\n
\n${escapeHtml(JSON.stringify(data, null, 2))}\n        
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating version preview:', error)\n return c.html('

Error generating preview

')\n }\n})\nexport default adminContentRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserProfile {\n id: string\n email: string\n username: string\n first_name: string\n last_name: string\n phone?: string\n bio?: string\n avatar_url?: string\n timezone: string\n language: string\n theme: string\n email_notifications: boolean\n two_factor_enabled: boolean\n role: string\n created_at: number\n last_login_at?: number\n}\n\nexport interface ProfilePageData {\n profile: UserProfile\n timezones: Array<{ value: string; label: string }>\n languages: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderAvatarImage(avatarUrl: string | undefined, firstName: string, lastName: string): string {\n return `
\n ${avatarUrl\n ? `\"Profile`\n : `${firstName.charAt(0)}${lastName.charAt(0)}`\n }\n
`\n}\n\nexport function renderProfilePage(data: ProfilePageData): string {\n const pageContent = `\n
\n \n
\n
\n

User Profile

\n

\n Manage your account settings and preferences\n

\n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n \n
\n
\n \n
\n
\n
\n \n \n \n
\n
\n

Profile Information

\n

Update your account details

\n
\n
\n
\n\n \n
\n
\n\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n ${data.profile.bio || ''}\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Preferences

\n\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Notifications

\n\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n \n

Receive email updates about new features and product announcements.

\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Update Profile\n \n
\n
\n
\n
\n\n \n
\n \n
\n

Profile Picture

\n\n
\n ${renderAvatarImage(data.profile.avatar_url, data.profile.first_name, data.profile.last_name)}\n\n
\n \n \n \n \n \n \n Change Picture\n \n \n\n
\n
\n
\n\n \n
\n

Account Information

\n\n
\n
\n
Role
\n
\n \n ${data.profile.role}\n \n
\n
\n
\n
Member Since
\n
${new Date(data.profile.created_at).toLocaleDateString()}
\n
\n ${data.profile.last_login_at ? `\n
\n
Last Login
\n
${new Date(data.profile.last_login_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Two-Factor Auth
\n
\n ${data.profile.two_factor_enabled\n ? 'Enabled'\n : 'Disabled'\n }\n
\n
\n
\n
\n\n \n
\n

Security

\n\n
\n \n \n \n \n Change Password\n \n\n \n \n \n \n ${data.profile.two_factor_enabled ? 'Disable' : 'Enable'} 2FA\n \n
\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Change Password

\n \n
\n
\n\n
\n
\n\n
\n \n \n
\n\n
\n \n \n

Must be at least 8 characters

\n
\n\n
\n \n \n
\n\n
\n \n Cancel\n \n \n \n \n \n Update Password\n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'User Profile',\n pageTitle: 'Profile',\n currentPath: '/admin/profile',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { escapeHtml } from '../../utils/sanitize'\n\nexport type AlertType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface AlertData {\n type: AlertType\n title?: string\n message: string\n dismissible?: boolean\n className?: string\n icon?: boolean\n}\n\nexport function renderAlert(data: AlertData): string {\n const typeClasses = {\n success: 'bg-green-50 dark:bg-green-500/10 border border-green-600/20 dark:border-green-500/20',\n error: 'bg-error/10 border border-red-600/20 dark:border-red-500/20',\n warning: 'bg-amber-50 dark:bg-amber-500/10 border border-amber-600/20 dark:border-amber-500/20',\n info: 'bg-blue-50 dark:bg-blue-500/10 border border-blue-600/20 dark:border-blue-500/20'\n }\n\n const iconClasses = {\n success: 'text-green-600 dark:text-green-400',\n error: 'text-red-600 dark:text-red-400',\n warning: 'text-amber-600 dark:text-amber-400',\n info: 'text-blue-600 dark:text-blue-400'\n }\n\n const textClasses = {\n success: 'text-green-900 dark:text-green-300',\n error: 'text-red-900 dark:text-red-300',\n warning: 'text-amber-900 dark:text-amber-300',\n info: 'text-blue-900 dark:text-blue-300'\n }\n\n const messageTextClasses = {\n success: 'text-green-700 dark:text-green-400',\n error: 'text-red-700 dark:text-red-400',\n warning: 'text-amber-700 dark:text-amber-400',\n info: 'text-blue-700 dark:text-blue-400'\n }\n\n const icons = {\n success: ``,\n error: ``,\n warning: ``,\n info: ``\n }\n\n return `\n
\n
\n ${data.icon !== false ? `\n
\n \n ${icons[data.type]}\n \n
\n ` : ''}\n
\n ${data.title ? `\n

\n ${escapeHtml(data.title)}\n

\n ` : ''}\n
\n

${escapeHtml(data.message)}

\n
\n
\n ${data.dismissible ? `\n
\n
\n \n Dismiss\n \n \n \n \n
\n
\n ` : ''}\n
\n
\n `\n}\n\nexport function renderSuccessAlert(message: string, title?: string): string {\n return renderAlert({ type: 'success', message, title })\n}\n\nexport function renderErrorAlert(message: string, title?: string): string {\n return renderAlert({ type: 'error', message, title })\n}\n\nexport function renderWarningAlert(message: string, title?: string): string {\n return renderAlert({ type: 'warning', message, title })\n}\n\nexport function renderInfoAlert(message: string, title?: string): string {\n return renderAlert({ type: 'info', message, title })\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\n\nexport interface ActivityLog {\n id: string\n user_id: string\n action: string\n resource_type?: string\n resource_id?: string\n details?: any\n ip_address?: string\n user_agent?: string\n created_at: number\n user_email?: string\n user_name?: string\n}\n\nexport interface ActivityLogsPageData {\n logs: ActivityLog[]\n pagination: {\n page: number\n limit: number\n total: number\n pages: number\n }\n filters: {\n user_id?: string\n action?: string\n resource_type?: string\n date_from?: string\n date_to?: string\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderActivityLogsPage(data: ActivityLogsPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Activity Logs

\n

Monitor user actions and system activity

\n
\n
\n\n \n \n\n \n
\n

Filters

\n \n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n Clear Filters\n \n
\n
\n
\n\n \n
\n
\n
\n
\n

Recent Activity

\n
\n Showing ${data.logs.length} of ${data.pagination.total} logs\n
\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${data.logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimestampUserActionResourceIP AddressDetails
\n ${new Date(log.created_at).toLocaleString()}\n \n
${log.user_name || 'Unknown'}
\n
${log.user_email || 'N/A'}
\n
\n \n ${formatAction(log.action)}\n \n \n ${log.resource_type ? `\n
${log.resource_type}
\n ${log.resource_id ? `
${log.resource_id}
` : ''}\n ` : 'N/A'}\n
\n ${log.ip_address || 'N/A'}\n \n ${log.details ? `\n
\n View Details\n
${JSON.stringify(log.details, null, 2)}
\n
\n ` : 'N/A'}\n
\n
\n\n ${data.logs.length === 0 ? `\n
\n \n \n \n

No activity logs found

\n

Try adjusting your filters or check back later.

\n
\n ` : ''}\n\n \n ${data.pagination.pages > 1 ? `\n
\n
\n Page ${data.pagination.page} of ${data.pagination.pages} (${data.pagination.total} total logs)\n
\n \n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutData = {\n title: 'Activity Logs',\n pageTitle: 'Activity Logs',\n currentPath: '/admin/activity-logs',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction getActionBadgeClass(action: string): string {\n if (action.includes('login') || action.includes('logout')) {\n return 'bg-blue-500/20 text-blue-300'\n } else if (action.includes('create') || action.includes('invite')) {\n return 'bg-green-500/20 text-green-300'\n } else if (action.includes('update') || action.includes('change')) {\n return 'bg-yellow-500/20 text-yellow-300'\n } else if (action.includes('delete') || action.includes('cancel')) {\n return 'bg-red-500/20 text-red-300'\n } else {\n return 'bg-gray-500/20 text-gray-300'\n }\n}\n\nfunction formatAction(action: string): string {\n // Convert action from dot notation to readable format\n return action\n .split('.')\n .map(part => part.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()))\n .join(' - ')\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface UserProfileData {\n displayName?: string\n bio?: string\n company?: string\n jobTitle?: string\n website?: string\n location?: string\n dateOfBirth?: number\n}\n\nexport interface UserEditData {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n phone?: string\n avatarUrl?: string\n role: string\n isActive: boolean\n emailVerified: boolean\n twoFactorEnabled: boolean\n createdAt: number\n lastLoginAt?: number\n profile?: UserProfileData\n}\n\nexport interface UserEditPageData {\n userToEdit: UserEditData\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserEditPage(data: UserEditPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Edit User

\n
\n

Update user account and permissions

\n
\n
\n \n \n \n \n Save Changes\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Profile Information

\n

Extended profile data for this user

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n
\n\n
\n \n ${escapeHtml(data.userToEdit.profile?.bio || '')}\n
\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Set Password

\n

Leave blank to keep the current password

\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User has verified their email address

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

User Details

\n
\n
\n
User ID
\n
${data.userToEdit.id}
\n
\n
\n
Created
\n
${new Date(data.userToEdit.createdAt).toLocaleDateString()}
\n
\n ${data.userToEdit.lastLoginAt ? `\n
\n
Last Login
\n
${new Date(data.userToEdit.lastLoginAt).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Status
\n
\n ${data.userToEdit.isActive\n ? 'Active'\n : 'Inactive'\n }\n
\n
\n ${data.userToEdit.twoFactorEnabled ? `\n
\n
Security
\n
\n 2FA Enabled\n
\n
\n ` : ''}\n
\n
\n\n \n
\n

Danger Zone

\n

Irreversible and destructive actions

\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Permanently remove from database. Unchecked performs soft delete (deactivate only).

\n
\n
\n\n \n \n \n \n Delete User\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-user-confirm',\n title: 'Delete User',\n message: 'Are you sure you want to delete this user? Check the \"Hard Delete\" option to permanently remove all data from the database. This action cannot be undone!',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteUser()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Edit User',\n pageTitle: `Edit User - ${data.userToEdit.firstName} ${data.userToEdit.lastName}`,\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export interface ConfirmationDialogOptions {\n id: string\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmClass?: string\n iconColor?: 'red' | 'yellow' | 'blue'\n onConfirm?: string // JavaScript code to execute on confirm\n}\n\nexport function renderConfirmationDialog(options: ConfirmationDialogOptions): string {\n const {\n id,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmClass = 'bg-red-500 hover:bg-red-400',\n iconColor = 'red',\n onConfirm = ''\n } = options\n\n const iconColorClasses = {\n red: 'bg-red-500/10 text-red-400',\n yellow: 'bg-yellow-500/10 text-yellow-400',\n blue: 'bg-blue-500/10 text-blue-400'\n }\n\n return `\n \n \n \n\n
\n \n
\n
\n \n \n \n
\n
\n

${title}

\n
\n

${message}

\n
\n
\n
\n
\n \n ${confirmText}\n \n \n ${cancelText}\n \n
\n
\n
\n \n
\n `\n}\n\n/**\n * Helper function to show a confirmation dialog programmatically\n * Usage in templates: Add this script and call showConfirmDialog()\n */\nexport function getConfirmationDialogScript(): string {\n return `\n \n \n `\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserNewPageData {\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserNewPage(data: UserNewPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Create New User

\n
\n

Add a new user account to the system

\n
\n
\n \n \n \n \n Create User\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n\n
\n \n \n
\n
\n\n \n
\n

Password

\n
\n
\n \n \n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Mark email as verified

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

Creating a User

\n
\n

Fill in the required fields marked with * to create a new user account.

\n

The password must be at least 8 characters long.

\n

By default, new users are created as active and can sign in immediately.

\n

You can edit user details and permissions after creation.

\n
\n
\n\n \n
\n

Role Descriptions

\n
\n
\n
Administrator
\n
Full system access and permissions
\n
\n
\n
Editor
\n
Can create and edit content
\n
\n
\n
Author
\n
Can create own content
\n
\n
\n
Viewer
\n
Read-only access
\n
\n
\n
\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create User',\n pageTitle: 'Create New User',\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderAlert } from '../alert.template'\nimport { renderTable, TableColumn, TableData } from '../table.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface User {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n role: string\n avatar?: string\n isActive: boolean\n lastLoginAt?: number\n createdAt: number\n updatedAt: number\n formattedLastLogin?: string\n formattedCreatedAt?: string\n}\n\nexport interface UsersListPageData {\n users: User[]\n pagination?: PaginationData\n currentPage: number\n totalPages: number\n totalUsers: number\n statusFilter?: string\n roleFilter?: string\n searchFilter?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderUsersListPage(data: UsersListPageData): string {\n const columns: TableColumn[] = [\n {\n key: 'avatar',\n label: '',\n className: 'w-12',\n sortable: false,\n render: (value: string | null, row: User) => {\n const initials = `${row.firstName.charAt(0)}${row.lastName.charAt(0)}`.toUpperCase()\n if (value) {\n return `\"${row.firstName}`\n }\n return `\n
\n ${initials}\n
\n `\n }\n },\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, row: User) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n \n const truncatedFirstName = row.firstName.length > 25 ? row.firstName.substring(0, 25) + '...' : row.firstName\n const truncatedLastName = row.lastName.length > 25 ? row.lastName.substring(0, 25) + '...' : row.lastName\n const fullName = escapeHtml(`${truncatedFirstName} ${truncatedLastName}`)\n const truncatedUsername = row.username.length > 100 ? row.username.substring(0, 100) + '...' : row.username\n const username = escapeHtml(truncatedUsername)\n const statusBadge = row.isActive ?\n 'Active' :\n 'Inactive'\n return `\n
\n
${fullName}${statusBadge}
\n
@${username}
\n
\n `\n }\n },\n {\n key: 'email',\n label: 'Email',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n const escapedEmail = escapeHtml(value)\n return `${escapedEmail}`\n }\n },\n {\n key: 'role',\n label: 'Role',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const roleColors = {\n admin: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-700/10 dark:ring-red-500/20',\n editor: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-700/10 dark:ring-blue-500/20',\n author: 'bg-cyan-50 dark:bg-cyan-500/10 text-cyan-700 dark:text-cyan-400 ring-1 ring-inset ring-cyan-700/10 dark:ring-cyan-500/20',\n viewer: 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n }\n const colorClass = roleColors[value as keyof typeof roleColors] || 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n return `${value.charAt(0).toUpperCase() + value.slice(1)}`\n }\n },\n {\n key: 'lastLoginAt',\n label: 'Last Login',\n sortable: true,\n sortType: 'date',\n render: (value: number | null) => {\n if (!value) return 'Never'\n return `${new Date(value).toLocaleDateString()}`\n }\n },\n {\n key: 'createdAt',\n label: 'Created',\n sortable: true,\n sortType: 'date',\n render: (value: number) => `${new Date(value).toLocaleDateString()}`\n },\n {\n key: 'actions',\n label: 'Actions',\n className: 'text-right',\n sortable: false,\n render: (_value: any, row: User) => `\n
\n ${row.isActive ?\n `` :\n ``\n }\n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'users-table',\n columns,\n rows: data.users,\n selectable: false,\n rowClickable: true,\n rowClickUrl: (row: User) => `/admin/users/${row.id}/edit`,\n emptyMessage: 'No users found'\n }\n\n const pageContent = `\n
\n \n
\n
\n

User Management

\n

Manage user accounts and permissions

\n
\n
\n \n \n \n \n Add User\n \n \n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n

User Statistics

\n
\n
\n
Total Users
\n
\n
\n ${data.totalUsers}\n
\n
\n \n \n \n Increased by\n 5.2%\n
\n
\n
\n
\n
Active Users
\n
\n
\n ${data.users.filter(u => u.isActive).length}\n
\n
\n \n \n \n Increased by\n 3.1%\n
\n
\n
\n
\n
Administrators
\n
\n
\n ${data.users.filter(u => u.role === 'admin').length}\n
\n
\n \n \n \n Increased by\n 1.8%\n
\n
\n
\n
\n
Active This Week
\n
\n
\n ${data.users.filter(u => u.lastLoginAt && u.lastLoginAt > Date.now() - 7 * 24 * 60 * 60 * 1000).length}\n
\n
\n \n \n \n Decreased by\n 2.3%\n
\n
\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n
\n
\n \n
\n \n
\n {\n input.focus();\n input.setSelectionRange(len, len);\n }, 10);\n }\n \"\n >\n \n
\n \n \n \n
\n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n Clear Filters\n \n
\n
\n
\n
\n
\n
\n\n \n ${renderTable(tableData)}\n\n \n ${data.pagination ? renderPagination(data.pagination) : ''}\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'toggle-user-status-confirm',\n title: 'Toggle User Status',\n message: 'Are you sure you want to activate/deactivate this user?',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performToggleUserStatus()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Users',\n pageTitle: 'User Management',\n currentPath: '/admin/users',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n} ","import { Hono } from 'hono'\nimport { requireAuth, requireRole, logActivity, AuthManager } from '../middleware'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { renderProfilePage, renderAvatarImage, type UserProfile, type ProfilePageData } from '../templates/pages/admin-profile.template'\nimport { renderAlert } from '../templates/components/alert.template'\nimport { renderActivityLogsPage, type ActivityLogsPageData, type ActivityLog } from '../templates/pages/admin-activity-logs.template'\nimport { renderUserEditPage, type UserEditPageData, type UserEditData, type UserProfileData } from '../templates/pages/admin-user-edit.template'\nimport { renderUserNewPage, type UserNewPageData } from '../templates/pages/admin-user-new.template'\nimport { renderUsersListPage, type UsersListPageData, type User } from '../templates/pages/admin-users-list.template'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, renderCustomProfileSection, getCustomData, saveCustomData, extractCustomFieldsFromForm, sanitizeCustomData, validateCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst userRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware to all routes\nuserRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on user management routes\nuserRoutes.use('/users/*', requireRole(['admin']))\nuserRoutes.use('/users', requireRole(['admin']))\nuserRoutes.use('/invite-user', requireRole(['admin']))\nuserRoutes.use('/resend-invitation/*', requireRole(['admin']))\nuserRoutes.use('/cancel-invitation/*', requireRole(['admin']))\nuserRoutes.use('/activity-logs', requireRole(['admin']))\nuserRoutes.use('/activity-logs/*', requireRole(['admin']))\n\n// Redirect /admin to /admin/dashboard\nuserRoutes.get('/', (c) => {\n return c.redirect('/admin/dashboard')\n})\n\n// Timezone options for profile form\nconst TIMEZONES = [\n { value: 'UTC', label: 'UTC' },\n { value: 'America/New_York', label: 'Eastern Time' },\n { value: 'America/Chicago', label: 'Central Time' },\n { value: 'America/Denver', label: 'Mountain Time' },\n { value: 'America/Los_Angeles', label: 'Pacific Time' },\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Australia/Sydney', label: 'Sydney' }\n]\n\n// Language options for profile form\nconst LANGUAGES = [\n { value: 'en', label: 'English' },\n { value: 'es', label: 'Spanish' },\n { value: 'fr', label: 'French' },\n { value: 'de', label: 'German' },\n { value: 'it', label: 'Italian' },\n { value: 'pt', label: 'Portuguese' },\n { value: 'ja', label: 'Japanese' },\n { value: 'ko', label: 'Korean' },\n { value: 'zh', label: 'Chinese' }\n]\n\n// Role options for user form\nconst ROLES = [\n { value: 'admin', label: 'Administrator' },\n { value: 'editor', label: 'Editor' },\n { value: 'author', label: 'Author' },\n { value: 'viewer', label: 'Viewer' }\n]\n\n/**\n * GET /admin/profile - Show user profile page\n */\nuserRoutes.get('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n // Get user profile data\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n timezone, language, theme, email_notifications, two_factor_enabled,\n role, created_at, last_login_at\n FROM users \n WHERE id = ? AND is_active = 1\n `)\n \n const userProfile = await userStmt.bind(user!.userId).first() as any\n\n if (!userProfile) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Convert to UserProfile interface\n const profile: UserProfile = {\n id: userProfile.id,\n email: userProfile.email,\n username: userProfile.username || '',\n first_name: userProfile.first_name || '',\n last_name: userProfile.last_name || '',\n phone: userProfile.phone,\n bio: userProfile.bio,\n avatar_url: userProfile.avatar_url,\n timezone: userProfile.timezone || 'UTC',\n language: userProfile.language || 'en',\n theme: userProfile.theme || 'dark',\n email_notifications: Boolean(userProfile.email_notifications),\n two_factor_enabled: Boolean(userProfile.two_factor_enabled),\n role: userProfile.role,\n created_at: userProfile.created_at,\n last_login_at: userProfile.last_login_at\n }\n\n // Get custom profile data\n const customData = await getCustomData(db, user!.userId)\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n const pageData: ProfilePageData = {\n profile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n customProfileFieldsHtml,\n user: {\n name: `${profile.first_name} ${profile.last_name}`.trim() || profile.username || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n } catch (error) {\n console.error('Profile page error:', error)\n \n const pageData: ProfilePageData = {\n profile: {} as UserProfile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n error: 'Failed to load profile. Please try again.',\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n }\n})\n\n/**\n * PUT /admin/profile - Update user profile\n */\nuserRoutes.put('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const timezone = formData.get('timezone')?.toString() || 'UTC'\n const language = formData.get('language')?.toString() || 'en'\n const emailNotifications = formData.get('email_notifications') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please enter a valid email address.',\n dismissible: true \n }))\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users \n WHERE (username = ? OR email = ?) AND id != ? AND is_active = 1\n `)\n const existingUser = await checkStmt.bind(username, email, user!.userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Username or email is already taken by another user!.',\n dismissible: true \n }))\n }\n\n // Update user profile\n const updateStmt = db.prepare(`\n UPDATE users SET \n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, bio = ?, timezone = ?, language = ?,\n email_notifications = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, bio, timezone, language,\n emailNotifications ? 1 : 0, Date.now(),\n user!.userId\n ).run()\n\n // Save custom profile fields\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n await saveCustomData(db, user!.userId, sanitized)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.update', 'users', user!.userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'bio', 'timezone', 'language', 'email_notifications'] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success', \n message: 'Profile updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Profile update error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update profile. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/avatar - Upload user avatar\n */\nuserRoutes.post('/profile/avatar', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n const avatarFile = formData.get('avatar') as File | null\n\n if (!avatarFile || typeof avatarFile === 'string' || !avatarFile.name) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please select an image file.',\n dismissible: true\n }))\n }\n\n // Validate file type\n const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']\n if (!allowedTypes.includes(avatarFile.type)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please upload a valid image file (JPEG, PNG, GIF, or WebP).',\n dismissible: true \n }))\n }\n\n // Validate file size (5MB max)\n const maxSize = 5 * 1024 * 1024\n if (avatarFile.size > maxSize) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Image file must be smaller than 5MB.',\n dismissible: true \n }))\n }\n\n // For now, we'll simulate storing the avatar\n // In a real implementation, you'd upload to cloud storage (R2, S3, etc.)\n const avatarUrl = `/uploads/avatars/${user!.userId}-${Date.now()}.${avatarFile.type.split('/')[1]}`\n\n // Update user avatar URL in database\n const updateStmt = db.prepare(`\n UPDATE users SET avatar_url = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(avatarUrl, Date.now(), user!.userId).run()\n\n // Get updated user data to render the avatar\n const userStmt = db.prepare(`\n SELECT first_name, last_name FROM users WHERE id = ?\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.avatar_update', 'users', user!.userId,\n { avatar_url: avatarUrl },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return both the alert message and the updated avatar image using HTMX out-of-band swap\n const alertHtml = renderAlert({\n type: 'success',\n message: 'Profile picture updated successfully!',\n dismissible: true\n })\n\n // Add timestamp to avatar URL to bust cache\n const avatarUrlWithCache = `${avatarUrl}?t=${Date.now()}`\n const avatarImageHtml = renderAvatarImage(avatarUrlWithCache, userData.first_name, userData.last_name)\n\n // Use hx-swap-oob to update the avatar image container\n const avatarImageWithOob = avatarImageHtml.replace(\n 'id=\"avatar-image-container\"',\n 'id=\"avatar-image-container\" hx-swap-oob=\"true\"'\n )\n\n return c.html(alertHtml + avatarImageWithOob)\n\n } catch (error) {\n console.error('Avatar upload error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to upload profile picture. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/password - Change user password\n */\nuserRoutes.post('/profile/password', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n \n const currentPassword = formData.get('current_password')?.toString() || ''\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Validate input\n if (!currentPassword || !newPassword || !confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'All password fields are required.',\n dismissible: true \n }))\n }\n\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New passwords do not match.',\n dismissible: true \n }))\n }\n\n if (newPassword.length < 8) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New password must be at least 8 characters long.',\n dismissible: true \n }))\n }\n\n // Get current user data\n const userStmt = db.prepare(`\n SELECT password_hash FROM users WHERE id = ? AND is_active = 1\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n if (!userData) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'User not found.',\n dismissible: true \n }))\n }\n\n // Verify current password\n const validPassword = await AuthManager.verifyPassword(currentPassword, userData.password_hash)\n if (!validPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Current password is incorrect.',\n dismissible: true \n }))\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(newPassword)\n\n // Store old password in history\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user!.userId,\n userData.password_hash,\n Date.now()\n ).run()\n\n // Update user password\n const updateStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(newPasswordHash, Date.now(), user!.userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.password_change', 'users', user!.userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({ \n type: 'success', \n message: 'Password updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Password change error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update password. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * GET /admin/users - List all users\n * Returns HTML for browser requests and JSON for API requests\n * Note: Already protected by requireAuth() and requireRole(['admin', 'editor'])\n */\nuserRoutes.get('/users', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '20')\n const search = c.req.query('search') || ''\n const roleFilter = c.req.query('role') || ''\n const statusFilter = c.req.query('status') || 'active'\n const offset = (page - 1) * limit\n\n // Build search query\n let whereClause = ''\n let params: any[] = []\n\n // Handle status filter\n if (statusFilter === 'active') {\n whereClause = 'WHERE u.is_active = 1'\n } else if (statusFilter === 'inactive') {\n whereClause = 'WHERE u.is_active = 0'\n } else {\n // 'all' - no filter\n whereClause = 'WHERE 1=1'\n }\n\n if (search) {\n whereClause += ' AND (u.first_name LIKE ? OR u.last_name LIKE ? OR u.email LIKE ? OR u.username LIKE ?)'\n const searchParam = `%${search}%`\n params.push(searchParam, searchParam, searchParam, searchParam)\n }\n\n if (roleFilter) {\n whereClause += ' AND u.role = ?'\n params.push(roleFilter)\n }\n\n // Get users\n const usersStmt = db.prepare(`\n SELECT u.id, u.email, u.username, u.first_name, u.last_name,\n u.role, u.avatar_url, u.created_at, u.last_login_at, u.updated_at,\n u.email_verified, u.two_factor_enabled, u.is_active\n FROM users u\n ${whereClause}\n ORDER BY u.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: usersData } = await usersStmt.bind(...params, limit, offset).all()\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total FROM users u ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalUsers = countResult?.total || 0\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'users.list_view', 'users', undefined,\n { search, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Check if this is an API request (accept header contains 'application/json')\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n // Return JSON for API requests\n return c.json({\n users: usersData || [],\n pagination: {\n page,\n limit,\n total: totalUsers,\n pages: Math.ceil(totalUsers / limit)\n }\n })\n }\n\n // Return HTML for browser requests\n const users: User[] = (usersData || []).map((u: any) => ({\n id: u.id,\n email: u.email,\n username: u.username || '',\n firstName: u.first_name || '',\n lastName: u.last_name || '',\n role: u.role,\n avatar: u.avatar_url,\n isActive: Boolean(u.is_active),\n lastLoginAt: u.last_login_at,\n createdAt: u.created_at,\n updatedAt: u.updated_at,\n formattedLastLogin: u.last_login_at ? new Date(u.last_login_at).toLocaleDateString() : undefined,\n formattedCreatedAt: new Date(u.created_at).toLocaleDateString()\n }))\n\n const successMessage = c.req.query('success') || undefined\n\n const pageData: UsersListPageData = {\n users,\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalUsers,\n searchFilter: search,\n roleFilter,\n statusFilter,\n success: successMessage,\n pagination: {\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalItems: totalUsers,\n itemsPerPage: limit,\n startItem: offset + 1,\n endItem: Math.min(offset + limit, totalUsers),\n baseUrl: '/admin/users'\n },\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUsersListPage(pageData))\n\n } catch (error) {\n console.error('Users list error:', error)\n\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n return c.json({ error: 'Failed to load users' }, 500)\n }\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load users. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * GET /admin/users/new - Show new user creation page\n */\nuserRoutes.get('/users/new', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: UserNewPageData = {\n roles: ROLES,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserNewPage(pageData))\n } catch (error) {\n console.error('User new page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user creation page. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * POST /admin/users/new - Create new user\n */\nuserRoutes.post('/users/new', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const password = formData.get('password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email || !password) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, email, and password are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password\n if (password.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n\n if (password !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n\n // Check if username/email are already taken\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE username = ? OR email = ?\n `)\n const existingUser = await checkStmt.bind(username, email).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken.',\n dismissible: true\n }))\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Create user\n const userId = crypto.randomUUID()\n const createStmt = db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name, phone, bio,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createStmt.bind(\n userId, email, username, firstName, lastName, phone, bio,\n passwordHash, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.create', 'users', userId,\n { email, username, role },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Redirect to user list (use HX-Redirect for HTMX requests)\n c.header('HX-Redirect', '/admin/users?success=User created successfully')\n return c.body(null, 200)\n\n } catch (error) {\n console.error('User creation error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to create user!. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * GET /admin/users/:id - Get user by ID\n * Note: This endpoint returns users regardless of is_active status for admin purposes\n */\nuserRoutes.get('/users/:id', async (c) => {\n // Check if this is actually the edit route\n if (c.req.path.endsWith('/edit')) {\n return c.notFound()\n }\n\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (including inactive users for admin access)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userRecord = await userStmt.bind(userId).first() as any\n\n if (!userRecord) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.view', 'users', userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n user: {\n id: userRecord.id,\n email: userRecord.email,\n username: userRecord.username,\n first_name: userRecord.first_name,\n last_name: userRecord.last_name,\n phone: userRecord.phone,\n bio: userRecord.bio,\n avatar_url: userRecord.avatar_url,\n role: userRecord.role,\n is_active: userRecord.is_active,\n email_verified: userRecord.email_verified,\n two_factor_enabled: userRecord.two_factor_enabled,\n created_at: userRecord.created_at,\n last_login_at: userRecord.last_login_at\n }\n })\n\n } catch (error) {\n console.error('User fetch error:', error)\n return c.json({ error: 'Failed to fetch user' }, 500)\n }\n})\n\n/**\n * GET /admin/users/:id/edit - Show user edit page\n */\nuserRoutes.get('/users/:id/edit', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (removed bio - now in profile)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userToEdit = await userStmt.bind(userId).first() as any\n\n if (!userToEdit) {\n return c.html(renderAlert({\n type: 'error',\n message: 'User not found',\n dismissible: true\n }), 404)\n }\n\n // Get user profile data\n const profileStmt = db.prepare(`\n SELECT display_name, bio, company, job_title, website, location, date_of_birth, data\n FROM user_profiles\n WHERE user_id = ?\n `)\n const profileData = await profileStmt.bind(userId).first() as any\n\n // Convert profile to UserProfileData interface\n const profile: UserProfileData | undefined = profileData ? {\n displayName: profileData.display_name,\n bio: profileData.bio,\n company: profileData.company,\n jobTitle: profileData.job_title,\n website: profileData.website,\n location: profileData.location,\n dateOfBirth: profileData.date_of_birth\n } : undefined\n\n // Parse custom profile data\n let customData: Record = {}\n if (profileData?.data) {\n try { customData = JSON.parse(profileData.data) } catch {}\n }\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n // Convert to UserEditData interface\n const editData: UserEditData = {\n id: userToEdit.id,\n email: userToEdit.email,\n username: userToEdit.username || '',\n firstName: userToEdit.first_name || '',\n lastName: userToEdit.last_name || '',\n phone: userToEdit.phone,\n avatarUrl: userToEdit.avatar_url,\n role: userToEdit.role,\n isActive: Boolean(userToEdit.is_active),\n emailVerified: Boolean(userToEdit.email_verified),\n twoFactorEnabled: Boolean(userToEdit.two_factor_enabled),\n createdAt: userToEdit.created_at,\n lastLoginAt: userToEdit.last_login_at,\n profile\n }\n\n const pageData: UserEditPageData = {\n userToEdit: editData,\n roles: ROLES,\n customProfileFieldsHtml,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserEditPage(pageData))\n } catch (error) {\n console.error('User edit page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * PUT /admin/users/:id - Update user\n */\nuserRoutes.put('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Optional password change\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Extract profile fields\n const profileDisplayName = sanitizeInput(formData.get('profile_display_name')?.toString()) || null\n const profileBio = sanitizeInput(formData.get('profile_bio')?.toString()) || null\n const profileCompany = sanitizeInput(formData.get('profile_company')?.toString()) || null\n const profileJobTitle = sanitizeInput(formData.get('profile_job_title')?.toString()) || null\n const profileWebsite = formData.get('profile_website')?.toString()?.trim() || null\n const profileLocation = sanitizeInput(formData.get('profile_location')?.toString()) || null\n const profileDateOfBirthStr = formData.get('profile_date_of_birth')?.toString()?.trim() || null\n const profileDateOfBirth = profileDateOfBirthStr ? new Date(profileDateOfBirthStr).getTime() : null\n\n // Extract custom profile fields\n const profileConfig = getUserProfileConfig()\n let customDataJson: string | null = null\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n // Merge with existing custom data\n const existingCustom = await getCustomData(db, userId)\n const merged = { ...existingCustom, ...sanitized }\n customDataJson = JSON.stringify(merged)\n }\n\n // Validate required fields\n if (!username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password if provided\n if (newPassword) {\n if (newPassword.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n }\n\n // Validate website URL if provided\n if (profileWebsite) {\n try {\n new URL(profileWebsite)\n } catch {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid website URL.',\n dismissible: true\n }))\n }\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE (username = ? OR email = ?) AND id != ?\n `)\n const existingUser = await checkStmt.bind(username, email, userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken by another user.',\n dismissible: true\n }))\n }\n\n // Update user (removed bio - now in profile)\n const updateStmt = db.prepare(`\n UPDATE users SET\n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, role = ?, is_active = ?, email_verified = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), userId\n ).run()\n\n // Update password if provided\n if (newPassword) {\n const passwordHash = await AuthManager.hashPassword(newPassword)\n const updatePasswordStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?\n `)\n await updatePasswordStmt.bind(passwordHash, Date.now(), userId).run()\n }\n\n // Check if any profile field has data\n const hasProfileData = profileDisplayName || profileBio || profileCompany ||\n profileJobTitle || profileWebsite || profileLocation || profileDateOfBirth\n\n if (hasProfileData || customDataJson !== null) {\n const now = Date.now()\n\n // Check if profile exists\n const profileCheckStmt = db.prepare(`SELECT id FROM user_profiles WHERE user_id = ?`)\n const existingProfile = await profileCheckStmt.bind(userId).first() as any\n\n if (existingProfile) {\n // Update existing profile\n const updateProfileStmt = db.prepare(`\n UPDATE user_profiles SET\n display_name = ?, bio = ?, company = ?, job_title = ?,\n website = ?, location = ?, date_of_birth = ?, updated_at = ?\n ${customDataJson !== null ? ', data = ?' : ''}\n WHERE user_id = ?\n `)\n const updateBindings = [\n profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, now,\n ...(customDataJson !== null ? [customDataJson] : []),\n userId\n ]\n await updateProfileStmt.bind(...updateBindings).run()\n } else {\n // Create new profile\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const insertProfileStmt = db.prepare(`\n INSERT INTO user_profiles (id, user_id, display_name, bio, company, job_title, website, location, date_of_birth, data, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n await insertProfileStmt.bind(\n profileId, userId, profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, customDataJson || '{}', now, now\n ).run()\n }\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user.update', 'users', userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'role', 'is_active', 'email_verified', 'profile', ...(newPassword ? ['password'] : [])] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success',\n message: 'User updated successfully!',\n dismissible: true\n }))\n\n } catch (error) {\n console.error('User update error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to update user. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * POST /admin/users/:id/toggle - Toggle user active status\n */\nuserRoutes.post('/users/:id/toggle', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const body = await c.req.json().catch(() => ({ active: true }))\n const active = body.active === true\n\n // Prevent self-deactivation\n if (userId === user!.userId && !active) {\n return c.json({ error: 'You cannot deactivate your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToToggle = await userStmt.bind(userId).first() as any\n\n if (!userToToggle) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Toggle user status\n const toggleStmt = db.prepare(`\n UPDATE users SET is_active = ?, updated_at = ? WHERE id = ?\n `)\n await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, active ? 'user.activate' : 'user.deactivate', 'users', userId,\n { email: userToToggle.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: active ? 'User activated successfully' : 'User deactivated successfully'\n })\n\n } catch (error) {\n console.error('User toggle error:', error)\n return c.json({ error: 'Failed to toggle user status' }, 500)\n }\n})\n\n/**\n * DELETE /admin/users/:id - Delete user\n */\nuserRoutes.delete('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get request body to check for hard delete option\n const body = await c.req.json().catch(() => ({ hardDelete: false }))\n const hardDelete = body.hardDelete === true\n\n // Prevent self-deletion\n if (userId === user!.userId) {\n return c.json({ error: 'You cannot delete your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToDelete = await userStmt.bind(userId).first() as any\n\n if (!userToDelete) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n if (hardDelete) {\n // Hard delete - permanently remove from database\n const deleteStmt = db.prepare(`\n DELETE FROM users WHERE id = ?\n `)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.hard_delete', 'users', userId,\n { email: userToDelete.email, permanent: true },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User permanently deleted'\n })\n } else {\n // Soft delete - deactivate by setting is_active = 0\n const deleteStmt = db.prepare(`\n UPDATE users SET is_active = 0, updated_at = ? WHERE id = ?\n `)\n await deleteStmt.bind(Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.soft_delete', 'users', userId,\n { email: userToDelete.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User deactivated successfully'\n })\n }\n\n } catch (error) {\n console.error('User deletion error:', error)\n return c.json({ error: 'Failed to delete user' }, 500)\n }\n})\n\n/**\n * POST /admin/invite-user - Invite a new user\n */\nuserRoutes.post('/invite-user', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const role = formData.get('role')?.toString()?.trim() || 'viewer'\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n\n // Validate input\n if (!email || !firstName || !lastName) {\n return c.json({ error: 'Email, first name, and last name are required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n // Check if user already exists\n const existingUserStmt = db.prepare(`\n SELECT id FROM users WHERE email = ?\n `)\n const existingUser = await existingUserStmt.bind(email).first()\n\n if (existingUser) {\n return c.json({ error: 'A user with this email already exists' }, 400)\n }\n\n // Generate invitation token\n const invitationToken = crypto.randomUUID()\n // const invitationExpires = Date.now() + (7 * 24 * 60 * 60 * 1000) // 7 days\n\n // Create user record with invitation\n const userId = crypto.randomUUID()\n const createUserStmt = db.prepare(`\n INSERT INTO users (\n id, email, first_name, last_name, role, \n invitation_token, invited_by, invited_at,\n is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createUserStmt.bind(\n userId, email, firstName, lastName, role,\n invitationToken, user!.userId, Date.now(),\n 0, 0, Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invite_sent', 'users', userId,\n { email, role, invited_user_id: userId },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // In a real implementation, you would send an email here\n // For now, we'll return the invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${invitationToken}`\n\n return c.json({\n success: true,\n message: 'User invitation sent successfully',\n user: {\n id: userId,\n email,\n first_name: firstName,\n last_name: lastName,\n role\n },\n invitation_link: invitationLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('User invitation error:', error)\n return c.json({ error: 'Failed to send user invitation' }, 500)\n }\n})\n\n/**\n * POST /admin/resend-invitation/:id - Resend invitation\n */\nuserRoutes.post('/resend-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invitation_token\n FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Generate new invitation token\n const newInvitationToken = crypto.randomUUID()\n\n // Update invitation token and date\n const updateStmt = db.prepare(`\n UPDATE users SET \n invitation_token = ?, \n invited_at = ?, \n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newInvitationToken,\n Date.now(),\n Date.now(),\n userId\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_resent', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Generate new invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${newInvitationToken}`\n\n return c.json({\n success: true,\n message: 'Invitation resent successfully',\n invitation_link: invitationLink\n })\n\n } catch (error) {\n console.error('Resend invitation error:', error)\n return c.json({ error: 'Failed to resend invitation' }, 500)\n }\n})\n\n/**\n * DELETE /admin/cancel-invitation/:id - Cancel invitation\n */\nuserRoutes.delete('/cancel-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Delete the user record (since they haven't activated yet)\n const deleteStmt = db.prepare(`DELETE FROM users WHERE id = ?`)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_cancelled', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'Invitation cancelled successfully'\n })\n\n } catch (error) {\n console.error('Cancel invitation error:', error)\n return c.json({ error: 'Failed to cancel invitation' }, 500)\n }\n})\n\n/**\n * GET /admin/activity-logs - View activity logs\n */\nuserRoutes.get('/activity-logs', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination and filter parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '50')\n const offset = (page - 1) * limit\n\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get activity logs with user information\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: logs } = await logsStmt.bind(...params, limit, offset).all()\n\n // Get total count for pagination\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total \n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalLogs = countResult?.total || 0\n\n // Parse details JSON for each log\n const formattedLogs: ActivityLog[] = (logs || []).map((log: any) => ({\n ...log,\n details: log.details ? JSON.parse(log.details) : null\n }))\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'activity.logs_viewed', undefined, undefined,\n { filters, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n const pageData: ActivityLogsPageData = {\n logs: formattedLogs,\n pagination: {\n page,\n limit,\n total: totalLogs,\n pages: Math.ceil(totalLogs / limit)\n },\n filters,\n user: {\n name: user!.email.split('@')[0] || user!.email, // Use email username as fallback\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n\n } catch (error) {\n console.error('Activity logs error:', error)\n \n const pageData: ActivityLogsPageData = {\n logs: [],\n pagination: { page: 1, limit: 50, total: 0, pages: 0 },\n filters: {},\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n }\n})\n\n/**\n * GET /admin/activity-logs/export - Export activity logs to CSV\n */\nuserRoutes.get('/activity-logs/export', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get filter parameters (same as list view)\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get all matching activity logs (limit to 10,000 for performance)\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT 10000\n `)\n\n const { results: logs } = await logsStmt.bind(...params).all()\n\n // Generate CSV content\n const csvHeaders = ['Timestamp', 'User', 'Email', 'Action', 'Resource Type', 'Resource ID', 'IP Address', 'Details']\n const csvRows = [csvHeaders.join(',')]\n\n for (const log of (logs || [])) {\n const row = [\n `\"${new Date((log as any).created_at).toISOString()}\"`,\n `\"${(log as any).user_name || 'Unknown'}\"`,\n `\"${(log as any).user_email || 'N/A'}\"`,\n `\"${(log as any).action}\"`,\n `\"${(log as any).resource_type || 'N/A'}\"`,\n `\"${(log as any).resource_id || 'N/A'}\"`,\n `\"${(log as any).ip_address || 'N/A'}\"`,\n `\"${(log as any).details ? JSON.stringify(JSON.parse((log as any).details)) : 'N/A'}\"`\n ]\n csvRows.push(row.join(','))\n }\n\n const csvContent = csvRows.join('\\n')\n\n // Log the export activity\n await logActivity(\n db, user!.userId, 'activity.logs_exported', undefined, undefined,\n { filters, count: logs?.length || 0 },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return CSV file\n const filename = `activity-logs-${new Date().toISOString().split('T')[0]}.csv`\n \n return new Response(csvContent, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"${filename}\"`\n }\n })\n\n } catch (error) {\n console.error('Activity logs export error:', error)\n return c.json({ error: 'Failed to export activity logs' }, 500)\n }\n})\n\nexport { userRoutes }","export interface MediaFile {\n id: string;\n filename: string;\n original_name: string;\n mime_type: string;\n size: number;\n public_url: string;\n thumbnail_url?: string;\n alt?: string;\n caption?: string;\n tags: string[];\n uploaded_at: string;\n fileSize: string;\n uploadedAt: string;\n isImage: boolean;\n isVideo: boolean;\n isDocument: boolean;\n}\n\nexport interface MediaGridData {\n files: MediaFile[];\n viewMode?: \"grid\" | \"list\";\n selectable?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function renderMediaGrid(data: MediaGridData): string {\n if (data.files.length === 0) {\n return `\n
\n \n \n \n

No media files

\n

${\n data.emptyMessage || \"Get started by uploading your first file.\"\n }

\n
\n `;\n }\n\n const gridClass = data.viewMode === \"list\" ? \"space-y-4\" : \"media-grid\";\n\n return `\n
\n ${data.files\n .map((file) =>\n renderMediaFileCard(file, data.viewMode, data.selectable)\n )\n .join(\"\")}\n
\n `;\n}\n\nexport function renderMediaFileCard(\n file: MediaFile,\n viewMode: \"grid\" | \"list\" = \"grid\",\n selectable: boolean = false\n): string {\n if (viewMode === \"list\") {\n return `\n
\n
\n ${\n selectable\n ? `\n
\n
\n \n \n \n \n \n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n
\n\n
\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n \n \n \n \n \n
\n
\n
\n ${file.uploadedAt}\n ${\n file.tags.length > 0\n ? `\n \n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n
\n
\n `;\n }\n\n // Grid view\n return `\n
\n ${\n selectable\n ? `\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n ${\n file.uploadedAt\n }\n
\n ${\n file.tags.length > 0\n ? `\n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n `;\n}\n\nfunction getFileIcon(mimeType: string): string {\n if (mimeType.startsWith(\"image/\")) {\n return `\n \n \n \n `;\n } else if (mimeType.startsWith(\"video/\")) {\n return `\n \n \n \n `;\n } else if (mimeType === \"application/pdf\") {\n return `\n \n \n \n `;\n } else {\n return `\n \n \n \n `;\n }\n}\n","import {\n getConfirmationDialogScript,\n renderConfirmationDialog,\n} from \"../components/confirmation-dialog.template\";\nimport { MediaFile, renderMediaGrid } from \"../components/media-grid.template\";\nimport {\n AdminLayoutCatalystData,\n renderAdminLayoutCatalyst,\n} from \"../layouts/admin-layout-catalyst.template\";\n\nexport interface FolderStats {\n folder: string;\n count: number;\n totalSize: number;\n}\n\nexport interface TypeStats {\n type: string;\n count: number;\n}\n\nexport interface MediaLibraryPageData {\n files: MediaFile[];\n folders: FolderStats[];\n types: TypeStats[];\n currentFolder: string;\n currentType: string;\n currentView: \"grid\" | \"list\";\n currentPage: number;\n totalFiles: number;\n hasNextPage: boolean;\n user?: {\n name: string;\n email: string;\n role: string;\n };\n version?: string;\n}\n\nexport function renderMediaLibraryPage(data: MediaLibraryPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Media Library

\n

Manage your media files and assets

\n
\n
\n \n \n \n \n Upload Media\n \n
\n
\n \n
\n \n
\n
\n \n
\n \n Upload Files\n \n
\n\n \n
\n

Folders

\n \n
\n\n \n
\n

File Types

\n \n
\n\n \n
\n

Quick Actions

\n
\n \n Create Folder\n \n \n Cleanup Unused\n \n
\n
\n
\n
\n \n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n ${\n data.files.length\n } files\n \n Select All\n \n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Move to Folder\n \n
\n
\n \n \n \n \n Delete Selected Files\n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n ${renderMediaGrid({\n files: data.files,\n viewMode: data.currentView,\n selectable: true,\n emptyMessage:\n \"No media files found. Upload your first file to get started.\",\n })}\n
\n \n \n ${\n data.hasNextPage\n ? `\n
\n
\n ${\n data.currentPage > 1\n ? `\n \n Previous\n \n `\n : \"\"\n }\n Page ${\n data.currentPage\n }\n \n Next\n \n
\n
\n `\n : \"\"\n }\n
\n
\n \n \n \n
\n
\n
\n

Upload Files

\n \n
\n \n \n { window.location.href = '/admin/media?t=' + Date.now(); }, 1500); }\"\n class=\"space-y-4\"\n >\n \n \n \n \n \n
\n

Drop files here or click to upload

\n

PNG, JPG, GIF, PDF up to 10MB

\n
\n
\n \n \n \n \n
\n \n \n
\n\n \n
\n

Selected Files:

\n
\n
\n\n \n
\n \n Cancel\n \n \n Upload Files\n \n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n
\n
\n\n \n
\n
\n
\n

Move to Folder

\n \n
\n\n

\n Select a folder to move 0 selected file(s) to:\n

\n\n
\n ${\n data.folders.length > 0\n ? data.folders\n .map(\n (folder) => `\n \n
\n ${folder.folder}\n ${folder.count} files\n
\n \n `\n )\n .join(\"\")\n : '

No folders available

'\n }\n
\n\n
\n \n Cancel\n \n
\n
\n
\n\n \n
\n
\n
\n

Create New Folder

\n \n
\n\n
\n
\n \n \n

\n Use lowercase letters, numbers, hyphens, and underscores only\n

\n
\n\n
\n \n Cancel\n \n \n Create Folder\n \n
\n
\n
\n
\n\n \n \n \n\n \n ${renderConfirmationDialog({\n id: \"media-bulk-delete-confirm\",\n title: \"Delete Selected Files\",\n message: `Are you sure you want to delete ${\n data.files.length > 0 ? \"the selected files\" : \"these files\"\n }? This action cannot be undone and the files will be permanently removed.`,\n confirmText: \"Delete Files\",\n cancelText: \"Cancel\",\n confirmClass: \"bg-red-500 hover:bg-red-400\",\n iconColor: \"red\",\n onConfirm: \"performBulkDelete()\",\n })}\n\n \n ${getConfirmationDialogScript()}\n `;\n\n function buildPageUrl(page: number, folder: string, type: string): string {\n const params = new URLSearchParams();\n params.set(\"page\", page.toString());\n if (folder !== \"all\") params.set(\"folder\", folder);\n if (type !== \"all\") params.set(\"type\", type);\n return `/admin/media?${params.toString()}`;\n }\n\n const layoutData: AdminLayoutCatalystData = {\n title: \"Media Library\",\n pageTitle: \"Media Library\",\n currentPath: \"/admin/media\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayoutCatalyst(layoutData);\n}\n","import { MediaFile } from './media-grid.template'\n\nexport interface MediaFileDetailsData {\n file: MediaFile & {\n width?: number\n height?: number\n folder: string\n uploadedAt: string\n }\n}\n\nexport function renderMediaFileDetails(data: MediaFileDetailsData): string {\n const { file } = data\n \n return `\n
\n

File Details

\n \n
\n \n
\n \n
\n
\n ${file.isImage ? `\n \"${file.alt\n ` : file.isVideo ? `\n \n ` : `\n
\n \n \n \n
\n `}\n
\n\n
\n \n Copy URL\n \n \n Open Original\n \n
\n
\n \n \n
\n
\n \n

${file.original_name}

\n
\n\n
\n
\n \n

${file.fileSize}

\n
\n
\n \n

${file.mime_type}

\n
\n
\n\n ${file.width && file.height ? `\n
\n
\n \n

${file.width}px

\n
\n
\n \n

${file.height}px

\n
\n
\n ` : ''}\n\n
\n \n

${file.folder}

\n
\n\n
\n \n

${file.uploadedAt}

\n
\n\n \n
\n
\n \n \n
\n\n
\n \n ${file.caption || ''}\n
\n\n
\n \n \n
\n\n
\n \n Save Changes\n \n \n Delete File\n \n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\nimport { html, raw } from 'hono/html'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth, requireRole } from '../middleware'\nimport { renderMediaLibraryPage, MediaLibraryPageData, FolderStats, TypeStats } from '../templates/pages/admin-media-library.template'\nimport { renderMediaFileDetails, MediaFileDetailsData } from '../templates/components/media-file-details.template'\nimport { MediaFile, renderMediaFileCard } from '../templates/components/media-grid.template'\nimport type { Bindings, Variables } from '../app'\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nconst adminMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminMediaRoutes.use('*', requireAuth())\n\n// Media library main page\nadminMediaRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { searchParams } = new URL(c.req.url)\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const view = searchParams.get('view') || 'grid'\n const page = parseInt(searchParams.get('page') || '1')\n const _cacheBust = searchParams.get('t') // Cache-busting parameter\n const limit = 24\n const offset = (page - 1) * limit\n\n const db = c.env.DB\n\n // TODO: Cache implementation removed during migration - will be added back when cache plugin is migrated\n\n // Build query for media files\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = ['deleted_at IS NULL']\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT ${limit} OFFSET ${offset}`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n // Get folder statistics\n const foldersStmt = db.prepare(`\n SELECT folder, COUNT(*) as count, SUM(size) as totalSize\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY folder\n ORDER BY folder\n `)\n const { results: folders } = await foldersStmt.all()\n \n // Get type statistics\n const typesStmt = db.prepare(`\n SELECT\n CASE\n WHEN mime_type LIKE 'image/%' THEN 'images'\n WHEN mime_type LIKE 'video/%' THEN 'videos'\n WHEN mime_type IN ('application/pdf', 'text/plain') THEN 'documents'\n ELSE 'other'\n END as type,\n COUNT(*) as count\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY type\n `)\n const { results: types } = await typesStmt.all()\n \n // Process media files with local serving URLs\n const mediaFiles: MediaFile[] = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n caption: row.caption,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const pageData: MediaLibraryPageData = {\n files: mediaFiles,\n folders: folders.map((f: any) => ({\n folder: f.folder,\n count: f.count,\n totalSize: f.totalSize\n })) as FolderStats[],\n types: types.map((t: any) => ({\n type: t.type,\n count: t.count\n })) as TypeStats[],\n currentFolder: folder,\n currentType: type,\n currentView: view as 'grid' | 'list',\n currentPage: page,\n totalFiles: results.length,\n hasNextPage: results.length === limit,\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: c.get('appVersion')\n }\n\n // TODO: Cache implementation removed during migration\n\n return c.html(renderMediaLibraryPage(pageData))\n } catch (error) {\n console.error('Error loading media library:', error)\n return c.html(html`

Error loading media library

`)\n }\n})\n\n// Media selector endpoint (HTMX endpoint for content form media selection)\nadminMediaRoutes.get('/selector', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const db = c.env.DB\n\n // Build search query\n let query = 'SELECT * FROM media WHERE deleted_at IS NULL'\n const params: any[] = []\n\n if (search.trim()) {\n query += ' AND (filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n query += ' ORDER BY uploaded_at DESC LIMIT 24'\n\n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n // Render media selector grid\n return c.html(html`\n
\n \n
\n\n
\n ${raw(mediaFiles.map(file => `\n \n
\n ${file.isImage ? `\n \n ` : file.isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n\n
\n \n Select\n \n
\n
\n\n
\n

\n ${file.original_name}\n

\n

\n ${file.fileSize}\n

\n
\n
\n `).join(''))}\n \n\n ${mediaFiles.length === 0 ? html`\n
\n \n \n \n

No media files found

\n
\n ` : ''}\n `)\n } catch (error) {\n console.error('Error loading media selector:', error)\n return c.html(html`
Error loading media files
`)\n }\n})\n\n// Search media files (HTMX endpoint)\nadminMediaRoutes.get('/search', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const db = c.env.DB\n \n // Build search query\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = []\n \n if (search.trim()) {\n conditions.push('(filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)')\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT 24`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n const mediaFiles = results.map((row: any) => ({\n ...row,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n fileSize: formatFileSize(row.size),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const gridHTML = mediaFiles.map(file => generateMediaItemHTML(file)).join('')\n \n return c.html(raw(gridHTML))\n } catch (error) {\n console.error('Error searching media:', error)\n return c.html('
Error searching files
')\n }\n})\n\n// Get file details modal (HTMX endpoint)\nadminMediaRoutes.get('/:id/details', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n \n const stmt = db.prepare('SELECT * FROM media WHERE id = ?')\n const result = await stmt.bind(id).first() as any\n \n if (!result) {\n return c.html('
File not found
')\n }\n \n const file: MediaFile & { width?: number; height?: number; folder: string; uploadedAt: string } = {\n id: result.id,\n filename: result.filename,\n original_name: result.original_name,\n mime_type: result.mime_type,\n size: result.size,\n public_url: `/files/${result.r2_key}`,\n thumbnail_url: result.mime_type.startsWith('image/') ? `/files/${result.r2_key}` : undefined,\n alt: result.alt,\n caption: result.caption,\n tags: result.tags ? JSON.parse(result.tags) : [],\n uploaded_at: result.uploaded_at,\n fileSize: formatFileSize(result.size),\n uploadedAt: new Date(result.uploaded_at).toLocaleString(),\n isImage: result.mime_type.startsWith('image/'),\n isVideo: result.mime_type.startsWith('video/'),\n isDocument: !result.mime_type.startsWith('image/') && !result.mime_type.startsWith('video/'),\n width: result.width,\n height: result.height,\n folder: result.folder\n }\n \n const detailsData: MediaFileDetailsData = { file }\n \n return c.html(renderMediaFileDetails(detailsData))\n } catch (error) {\n console.error('Error fetching file details:', error)\n return c.html('
Error loading file details
')\n }\n})\n\n// Upload files endpoint (HTMX compatible)\nadminMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const fileEntries = formData.getAll('files') as unknown[]\n const files: File[] = []\n\n for (const entry of fileEntries) {\n if (entry instanceof File) {\n files.push(entry)\n }\n }\n \n if (!files || files.length === 0) {\n return c.html(html`\n
\n No files provided\n
\n `)\n }\n\n const uploadResults = []\n const errors = []\n\n // Check if MEDIA_BUCKET is available\n console.log('[MEDIA UPLOAD] c.env keys:', Object.keys(c.env))\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET defined?', !!c.env.MEDIA_BUCKET)\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET type:', typeof c.env.MEDIA_BUCKET)\n\n if (!c.env.MEDIA_BUCKET) {\n console.error('[MEDIA UPLOAD] MEDIA_BUCKET is not available! Available env keys:', Object.keys(c.env))\n return c.html(html`\n
\n Media storage (R2) is not configured. Please check your wrangler.toml configuration.\n
Debug: Available bindings: ${Object.keys(c.env).join(', ')}\n
\n `)\n }\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: validation.error.issues[0]?.message || 'Validation failed'\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = crypto.randomUUID()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user!.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n\n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate URLs - use public serving route\n const publicUrl = `/files/${r2Key}`\n const thumbnailUrl = file.type.startsWith('image/') ? publicUrl : null\n\n // Save to database\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n fileId,\n filename,\n file.name,\n file.type,\n file.size,\n width,\n height,\n folder,\n r2Key,\n publicUrl,\n thumbnailUrl,\n user!.userId,\n Math.floor(Date.now() / 1000)\n ).run()\n\n uploadResults.push({\n id: fileId,\n filename: filename,\n originalName: file.name,\n mimeType: file.type,\n size: file.size,\n publicUrl: publicUrl\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed: ' + (error instanceof Error ? error.message : 'Unknown error')\n })\n }\n }\n\n // TODO: Cache invalidation removed during migration\n\n // Fetch updated media list to include in response\n let mediaGridHTML = ''\n if (uploadResults.length > 0) {\n try {\n const folderEntry = formData.get('folder')\n const folder = typeof folderEntry === 'string' ? folderEntry : 'uploads'\n const query = 'SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT 24'\n const stmt = c.env.DB.prepare(query)\n const { results } = await stmt.all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n mediaGridHTML = mediaFiles.map(file => renderMediaFileCard(file, 'grid', true)).join('')\n } catch (error) {\n console.error('Error fetching updated media list:', error)\n }\n }\n\n // Return HTMX response with results\n return c.html(html`\n ${uploadResults.length > 0 ? html`\n
\n Successfully uploaded ${uploadResults.length} file${uploadResults.length > 1 ? 's' : ''}\n
\n ` : ''}\n\n ${errors.length > 0 ? html`\n
\n

Upload errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n ${uploadResults.length > 0 ? html`\n \n ` : ''}\n `)\n } catch (error) {\n console.error('Upload error:', error)\n return c.html(html`\n
\n Upload failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Serve files from R2 storage\nadminMediaRoutes.get('/file/*', async (c) => {\n try {\n const r2Key = c.req.path.replace('/admin/media/file/', '')\n \n if (!r2Key) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(r2Key)\n \n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n \n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n})\n\n// Update media file metadata (HTMX compatible)\nadminMediaRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n const formData = await c.req.formData()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Extract form data\n const alt = formData.get('alt') as string || null\n const caption = formData.get('caption') as string || null\n const tagsString = formData.get('tags') as string || ''\n const tags = tagsString ? tagsString.split(',').map(tag => tag.trim()).filter(tag => tag) : []\n\n // Update database\n const updateStmt = c.env.DB.prepare(`\n UPDATE media \n SET alt = ?, caption = ?, tags = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n alt,\n caption,\n JSON.stringify(tags),\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n // TODO: Cache invalidation removed during migration\n\n return c.html(html`\n
\n File updated successfully\n
\n \n `)\n } catch (error) {\n console.error('Update error:', error)\n return c.html(html`\n
\n Update failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Cleanup unused media files (HTMX compatible)\nadminMediaRoutes.delete('/cleanup', requireRole('admin'), async (c) => {\n try {\n const db = c.env.DB\n\n // Find all media files\n const allMediaStmt = db.prepare('SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL')\n const { results: allMedia } = await allMediaStmt.all<{ id: string; r2_key: string; filename: string }>()\n\n // Find media files referenced in content\n // Content can reference media in various JSON fields like data, hero_image, etc.\n const contentStmt = db.prepare('SELECT data FROM content')\n const { results: contentRecords } = await contentStmt.all<{ data: unknown }>()\n\n // Extract all media URLs from content\n const referencedUrls = new Set()\n for (const record of contentRecords || []) {\n if (record.data) {\n const dataStr = typeof record.data === 'string' ? record.data : JSON.stringify(record.data)\n // Find all /files/ URLs in the content\n const urlMatches = dataStr.matchAll(/\\/files\\/([^\\s\"',]+)/g)\n for (const match of urlMatches) {\n referencedUrls.add(match[1]!)\n }\n }\n }\n\n // Find unreferenced media files\n const mediaRows = allMedia || []\n const unusedFiles = mediaRows.filter((file) => !referencedUrls.has(file.r2_key))\n\n if (unusedFiles.length === 0) {\n return c.html(html`\n
\n No unused media files found. All files are referenced in content.\n
\n \n `)\n }\n\n // Delete unused files from R2 and database\n let deletedCount = 0\n const errors = []\n\n for (const file of unusedFiles) {\n try {\n // Delete from R2\n await c.env.MEDIA_BUCKET.delete(file.r2_key)\n\n // Soft delete in database\n const deleteStmt = db.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), file.id).run()\n\n deletedCount++\n } catch (error) {\n console.error(`Failed to delete ${file.filename}:`, error)\n errors.push({\n filename: file.filename,\n error: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Return success response\n return c.html(html`\n
\n Successfully cleaned up ${deletedCount} unused media file${deletedCount !== 1 ? 's' : ''}.\n ${errors.length > 0 ? html`\n
Failed to delete ${errors.length} file${errors.length !== 1 ? 's' : ''}.\n ` : ''}\n
\n\n ${errors.length > 0 ? html`\n
\n

Cleanup errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n \n `)\n } catch (error) {\n console.error('Cleanup error:', error)\n return c.html(html`\n
\n Cleanup failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Delete media file (HTMX compatible)\nadminMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // TODO: Cache invalidation removed during migration\n\n // Return HTMX response that redirects to media library\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Delete error:', error)\n return c.html(html`\n
\n Delete failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length - 8) {\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n const segmentLength = (uint8Array[i + 2]! << 8) | uint8Array[i + 3]!\n i += 2 + segmentLength\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\n// Helper function to generate media item HTML\nfunction generateMediaItemHTML(file: any): string {\n const isImage = file.isImage\n const isVideo = file.isVideo\n \n return `\n
\n
\n ${isImage ? `\n \"${file.alt\n ` : isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n \n
\n
\n \n \n
\n
\n
\n \n
\n

\n ${file.original_name}\n

\n
\n ${file.fileSize}\n ${file.uploadedAt}\n
\n ${file.tags.length > 0 ? `\n
\n ${file.tags.slice(0, 2).map((tag: string) => `\n \n ${tag}\n \n `).join('')}\n ${file.tags.length > 2 ? `+${file.tags.length - 2}` : ''}\n
\n ` : ''}\n
\n
\n `\n}\n\n// Helper function to format file size\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n\nexport { adminMediaRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface Plugin {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error' | 'uninstalled'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n}\n\nexport interface PluginsListPageData {\n plugins: Plugin[]\n stats?: {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderPluginsListPage(data: PluginsListPageData): string {\n const categories = [\n { value: 'content', label: 'Content Management' },\n { value: 'media', label: 'Media' },\n { value: 'editor', label: 'Editors' },\n { value: 'seo', label: 'SEO & Analytics' },\n { value: 'security', label: 'Security' },\n { value: 'utilities', label: 'Utilities' },\n { value: 'system', label: 'System' },\n { value: 'development', label: 'Development' },\n { value: 'demo', label: 'Demo' }\n ];\n\n const statuses = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'uninstalled', label: 'Available to Install' },\n { value: 'error', label: 'Error' }\n ];\n\n // Calculate counts\n const categoryCounts: Record = {};\n categories.forEach(cat => {\n categoryCounts[cat.value] = data.plugins.filter(p => p.category === cat.value).length;\n });\n\n // Sort categories by count (descending)\n categories.sort((a, b) => (categoryCounts[b.value] || 0) - (categoryCounts[a.value] || 0));\n\n const statusCounts: Record = {};\n statuses.forEach(status => {\n statusCounts[status.value] = data.plugins.filter(p => p.status === status.value).length;\n });\n\n // Sort statuses by count (descending)\n statuses.sort((a, b) => (statusCounts[b.value] || 0) - (statusCounts[a.value] || 0));\n\n const pageContent = `\n
\n \n
\n
\n

Plugins

\n

Manage and extend functionality with plugins

\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n
\n

\n Experimental Feature\n

\n
\n

\n Plugin management is currently under active development. While functional, some features may change or have limitations.\n Please report any issues you encounter on our Discord community.\n

\n
\n
\n
\n
\n\n
\n \n \n\n \n
\n \n
\n
\n
Total
\n
${data.stats?.total || 0}
\n
\n
\n
Active
\n
${data.stats?.active || 0}
\n
\n
\n
Available
\n
${data.stats?.uninstalled || 0}
\n
\n
\n
Errors
\n
${data.stats?.errors || 0}
\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n \n
\n\n
\n \n\n \n \n \n \n \n
\n
\n\n \n
\n ${data.plugins.map(plugin => renderPluginCard(plugin)).join('')}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'uninstall-plugin-confirm',\n title: 'Uninstall Plugin',\n message: 'Are you sure you want to uninstall this plugin? This action cannot be undone.',\n confirmText: 'Uninstall',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performUninstallPlugin()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Plugins',\n pageTitle: 'Plugin Management',\n currentPath: '/admin/plugins',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderPluginCard(plugin: Plugin): string {\n const statusColors = {\n active: 'bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-400 ring-emerald-600/20',\n inactive: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-zinc-600/20',\n error: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-red-600/20',\n uninstalled: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-600 dark:text-zinc-500 ring-zinc-600/20'\n }\n\n const statusIcons = {\n active: '
',\n inactive: '
',\n error: '
',\n uninstalled: '
'\n }\n\n // Core system plugins that cannot be deactivated\n const criticalCorePlugins = ['core-auth', 'core-media']\n const canToggle = !criticalCorePlugins.includes(plugin.id)\n\n let actionButton = ''\n if (plugin.status === 'uninstalled') {\n actionButton = ``\n } else {\n const isActive = plugin.status === 'active';\n const action = isActive ? 'deactivate' : 'activate';\n // Use bg-emerald-600 for active, bg-zinc-200 (light) / bg-zinc-700 (dark) for inactive\n const bgClass = isActive ? 'bg-emerald-600' : 'bg-zinc-200 dark:bg-zinc-700';\n const translateClass = isActive ? 'translate-x-5' : 'translate-x-0';\n \n if (canToggle) {\n actionButton = `\n \n `\n } else {\n // Critical core plugins cannot be toggled\n actionButton = `\n
\n \n
\n `\n }\n }\n\n return `\n
\n
\n
\n
\n ${plugin.icon || getDefaultPluginIcon(plugin.category)}\n
\n
\n
\n

${plugin.displayName}

\n \n ${statusIcons[plugin.status]}${plugin.status.charAt(0).toUpperCase() + plugin.status.slice(1)}\n \n
\n

v${plugin.version} • ${plugin.author}

\n
\n
\n \n
\n ${!plugin.isCore && plugin.status !== 'uninstalled' ? `\n \n ` : ''}\n
\n
\n\n

${plugin.description}

\n\n
\n \n ${plugin.category}\n \n ${plugin.isCore ? 'Core' : ''}\n \n ${plugin.dependencies && plugin.dependencies.map(dep => `\n \n ${dep}\n \n `).join('') || ''}\n
\n\n
\n
\n ${actionButton}\n
\n
\n
\n `\n}\n\nfunction getDefaultPluginIcon(category: string): string {\n const iconColor = 'text-zinc-600 dark:text-zinc-400'\n\n const icons: Record = {\n 'content': `\n \n \n \n `,\n 'media': `\n \n \n \n `,\n 'seo': `\n \n \n \n `,\n 'analytics': `\n \n \n \n `,\n 'ecommerce': `\n \n \n \n `,\n 'email': `\n \n \n \n `,\n 'workflow': `\n \n \n \n `,\n 'security': `\n \n \n \n `,\n 'social': `\n \n \n \n `,\n 'utility': `\n \n \n \n \n `,\n }\n\n const iconKey = category.toLowerCase() as keyof typeof icons\n return icons[iconKey] || icons['utility'] || ''\n}\n\n// Mock data generator\nexport function generateMockPlugins(): Plugin[] {\n return [\n {\n id: '1',\n name: 'seo-optimizer',\n displayName: 'SEO Optimizer',\n description: 'Advanced SEO optimization tools including meta tag management, sitemap generation, and analytics integration. Boost your search engine rankings with automated optimizations.',\n version: '2.1.4',\n author: 'SonicJS Team',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 15420,\n rating: 4.8,\n lastUpdated: '2 days ago',\n dependencies: ['analytics-plugin'],\n permissions: ['read:content', 'write:meta'],\n isCore: true\n },\n {\n id: '2',\n name: 'image-optimizer',\n displayName: 'Image Optimizer',\n description: 'Automatically compress and optimize images on upload. Supports WebP conversion, lazy loading, and responsive image generation for better performance.',\n version: '1.5.2',\n author: 'MediaPro',\n status: 'active',\n category: 'media',\n icon: ``,\n downloadCount: 8930,\n rating: 4.6,\n lastUpdated: '1 week ago',\n dependencies: [],\n permissions: ['write:media', 'read:settings']\n },\n {\n id: '3',\n name: 'backup-manager',\n displayName: 'Backup Manager',\n description: 'Automated backup solution for content and media files. Schedule regular backups to cloud storage with encryption and restore capabilities.',\n version: '3.0.1',\n author: 'BackupCorp',\n status: 'inactive',\n category: 'utilities',\n icon: ``,\n downloadCount: 12450,\n rating: 4.9,\n lastUpdated: '3 days ago',\n dependencies: ['cloud-storage'],\n permissions: ['read:all', 'write:backups']\n },\n {\n id: '4',\n name: 'security-scanner',\n displayName: 'Security Scanner',\n description: 'Real-time security monitoring and vulnerability scanning. Detects malware, suspicious activities, and provides security recommendations.',\n version: '1.2.8',\n author: 'SecureWeb',\n status: 'error',\n category: 'security',\n icon: ``,\n downloadCount: 5680,\n rating: 4.3,\n lastUpdated: '5 days ago',\n dependencies: ['security-core'],\n permissions: ['read:logs', 'read:files', 'write:security']\n },\n {\n id: '5',\n name: 'social-share',\n displayName: 'Social Share',\n description: 'Easy social media sharing buttons and Open Graph meta tag generation. Supports all major social platforms with customizable styling.',\n version: '2.3.0',\n author: 'SocialPlus',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 22100,\n rating: 4.7,\n lastUpdated: '4 days ago',\n dependencies: [],\n permissions: ['read:content', 'write:meta']\n },\n {\n id: '6',\n name: 'analytics-pro',\n displayName: 'Analytics Pro',\n description: 'Advanced analytics dashboard with custom tracking events, conversion funnels, and detailed visitor insights. GDPR compliant with privacy controls.',\n version: '4.1.2',\n author: 'AnalyticsPro Inc',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 18750,\n rating: 4.9,\n lastUpdated: '1 day ago',\n dependencies: ['gdpr-compliance'],\n permissions: ['read:analytics', 'write:tracking', 'read:users']\n },\n {\n id: '7',\n name: 'form-builder',\n displayName: 'Advanced Form Builder',\n description: 'Drag-and-drop form builder with conditional logic, file uploads, payment integration, and email notifications. Perfect for contact forms and surveys.',\n version: '1.8.5',\n author: 'FormWorks',\n status: 'inactive',\n category: 'content',\n icon: ``,\n downloadCount: 9870,\n rating: 4.4,\n lastUpdated: '1 week ago',\n dependencies: ['email-service'],\n permissions: ['write:forms', 'read:submissions', 'send:emails']\n },\n {\n id: '8',\n name: 'cache-optimizer',\n displayName: 'Cache Optimizer',\n description: 'Intelligent caching system with Redis support, CDN integration, and automatic cache invalidation. Dramatically improves site performance.',\n version: '2.7.3',\n author: 'SpeedBoost',\n status: 'active',\n category: 'utilities',\n icon: ``,\n downloadCount: 13240,\n rating: 4.8,\n lastUpdated: '6 days ago',\n dependencies: ['redis-connector'],\n permissions: ['read:cache', 'write:cache', 'manage:cdn'],\n isCore: true\n },\n {\n id: '9',\n name: 'multilingual',\n displayName: 'Multilingual Support',\n description: 'Complete internationalization solution with automatic translation, language detection, and localized content management for global websites.',\n version: '3.2.1',\n author: 'GlobalWeb',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 7650,\n rating: 4.5,\n lastUpdated: '2 weeks ago',\n dependencies: ['translation-api'],\n permissions: ['read:content', 'write:translations', 'manage:languages']\n }\n ]\n}\n","import type { AuthSettings } from '../../services/auth-validation'\n\nexport function renderAuthSettingsForm(settings: AuthSettings): string {\n const fields = settings.requiredFields\n const validation = settings.validation\n const registration = settings.registration\n\n return `\n
\n \n
\n

Registration Fields

\n

Configure which fields are required during user registration and their minimum lengths.

\n\n
\n ${Object.entries(fields).map(([fieldName, config]: [string, any]) => `\n
\n
\n
\n

${config.label}

\n

Field type: ${config.type}

\n
\n \n
\n\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n `).join('')}\n
\n
\n\n \n
\n

Password Requirements

\n

Additional password complexity requirements.

\n\n
\n
\n
\n \n

Password must contain at least one uppercase letter (A-Z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one lowercase letter (a-z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one number (0-9)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one special character (!@#$%^&*)

\n
\n \n
\n
\n
\n\n \n
\n

Registration Settings

\n

General registration behavior.

\n\n
\n
\n
\n \n

Enable or disable public user registration

\n
\n \n
\n\n
\n
\n \n

Users must verify their email before accessing the system

\n
\n \n
\n\n
\n \n \n \n \n \n \n

Role assigned to new users upon registration

\n
\n
\n
\n\n \n
\n

Validation Settings

\n

Additional validation rules.

\n\n
\n
\n
\n \n

Validate that email addresses are in correct format

\n
\n \n
\n\n
\n
\n \n

Ensure usernames are unique across all users

\n
\n \n
\n
\n
\n
\n `\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAuthSettingsForm } from '../components/auth-settings-form.template'\nimport type { AuthSettings } from '../../services/auth-validation'\n\n/**\n * Escape HTML attribute values to prevent XSS\n */\nfunction escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport interface PluginSettings {\n [key: string]: any\n}\n\nexport interface PluginActivity {\n id: string\n action: string\n message: string\n timestamp: number\n user?: string\n}\n\nexport interface PluginSettingsPageData {\n plugin: {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n settings?: PluginSettings\n }\n activity?: PluginActivity[]\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderPluginSettingsPage(data: PluginSettingsPageData): string {\n const { plugin, activity = [], user } = data\n \n const pageContent = `\n
\n \n
\n
\n

Plugin Settings

\n

\n ${plugin.description}\n

\n
\n \n
\n\n \n
\n
\n
\n
\n ${plugin.icon || plugin.displayName.charAt(0).toUpperCase()}\n
\n
\n

${plugin.displayName}

\n
\n v${plugin.version}\n by ${plugin.author}\n ${plugin.category}\n ${plugin.downloadCount ? `${plugin.downloadCount.toLocaleString()} downloads` : ''}\n ${plugin.rating ? `★ ${plugin.rating}` : ''}\n
\n
\n
\n\n
\n ${renderStatusBadge(plugin.status)}\n ${renderToggleButton(plugin)}\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n \n
\n ${renderSettingsTab(plugin)}\n
\n\n \n
\n ${renderActivityTab(activity)}\n
\n\n \n
\n ${renderInformationTab(plugin)}\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${plugin.displayName} Settings`,\n pageTitle: `${plugin.displayName} Settings`,\n currentPath: `/admin/plugins/${plugin.id}`,\n user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction renderStatusBadge(status: string): string {\n const statusColors: Record = {\n active: 'bg-green-900/50 text-green-300 border-green-600/30',\n inactive: 'bg-gray-800/50 text-gray-400 border-gray-600/30',\n error: 'bg-red-900/50 text-red-300 border-red-600/30'\n }\n\n const statusIcons: Record = {\n active: '
',\n inactive: '
',\n error: '
'\n }\n\n return `\n \n ${statusIcons[status] || statusIcons.inactive}${status.charAt(0).toUpperCase() + status.slice(1)}\n \n `\n}\n\nfunction renderToggleButton(plugin: any): string {\n if (plugin.isCore) {\n return 'Core Plugin'\n }\n\n return plugin.status === 'active' \n ? ``\n : ``\n}\n\nfunction renderSettingsTab(plugin: any): string {\n const settings = plugin.settings || {}\n const pluginId = plugin.id || plugin.name\n\n // Check for custom settings component first\n const customRenderer = pluginSettingsComponents[pluginId]\n if (customRenderer) {\n return `\n
\n ${customRenderer(plugin, settings)}\n\n
\n \n Save Settings\n \n
\n
\n `\n }\n\n const isSeedDataPlugin = plugin.id === 'seed-data' || plugin.name === 'seed-data'\n const isAuthPlugin = plugin.id === 'core-auth' || plugin.name === 'core-auth'\n const isTurnstilePlugin = plugin.id === 'turnstile' || plugin.name === 'turnstile'\n\n return `\n ${isSeedDataPlugin ? `\n
\n
\n
\n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n
\n \n \n \n \n Open Seed Data Tool\n \n
\n
\n ` : ''}\n\n
\n ${isAuthPlugin ? `\n

Authentication Settings

\n

Configure user registration fields and validation rules.

\n ` : isTurnstilePlugin ? `\n

Cloudflare Turnstile Settings

\n

Configure CAPTCHA-free bot protection for your forms.

\n ` : `\n

Plugin Settings

\n `}\n\n
\n ${isAuthPlugin && Object.keys(settings).length > 0\n ? renderAuthSettingsForm(settings as AuthSettings)\n : isTurnstilePlugin && Object.keys(settings).length > 0\n ? renderTurnstileSettingsForm(settings)\n : Object.keys(settings).length > 0\n ? renderSettingsFields(settings)\n : renderNoSettings(plugin)\n }\n\n ${Object.keys(settings).length > 0 ? `\n
\n \n Save Settings\n \n
\n ` : ''}\n
\n
\n `\n}\n\nfunction renderSettingsFields(settings: PluginSettings): string {\n return Object.entries(settings).map(([key, value]) => {\n const fieldId = `setting_${key}`\n const displayName = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase())\n \n if (typeof value === 'boolean') {\n return `\n
\n
\n \n

Enable or disable this feature

\n
\n \n
\n `\n } else if (typeof value === 'number') {\n return `\n
\n \n \n
\n `\n } else {\n return `\n
\n \n \n
\n `\n }\n }).join('')\n}\n\nfunction renderTurnstileSettingsForm(settings: any): string {\n const inputClass = \"backdrop-blur-sm bg-white/10 border border-white/20 rounded-lg px-3 py-2 text-white placeholder-gray-300 focus:border-blue-400 focus:outline-none transition-colors w-full\"\n const selectClass = \"backdrop-blur-sm bg-zinc-800 border border-white/20 rounded-lg px-3 py-2 text-white focus:border-blue-400 focus:outline-none transition-colors w-full [&>option]:bg-zinc-800 [&>option]:text-white\"\n \n return `\n \n
\n
\n \n

Enable or disable Turnstile verification globally

\n
\n \n
\n\n \n
\n \n \n

Your Cloudflare Turnstile site key (public)

\n
\n\n \n
\n \n \n

Your Cloudflare Turnstile secret key (private)

\n
\n\n \n
\n \n \n

Visual appearance of the Turnstile widget

\n
\n\n \n
\n \n \n

Size of the Turnstile challenge widget

\n
\n\n \n
\n \n \n

Managed: Shows challenge only when needed. Non-Interactive: Always shows but doesn't require interaction. Invisible: Runs in background without UI.

\n
\n\n \n
\n \n \n

Controls when Turnstile verification occurs. Always: Verifies immediately (pre-clearance). Execute: Verifies on form submit. Interaction Only: Only after user interaction.

\n
\n `\n}\n\nfunction renderNoSettings(plugin: any): string {\n // Special handling for seed-data plugin\n if (plugin.id === 'seed-data' || plugin.name === 'seed-data') {\n return `\n
\n \n \n \n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n \n \n \n \n Generate Seed Data\n \n
\n `\n }\n\n return `\n
\n \n \n \n \n

No Settings Available

\n

This plugin doesn't have any configurable settings.

\n
\n `\n}\n\nfunction renderActivityTab(activity: PluginActivity[]): string {\n return `\n
\n

Activity Log

\n \n ${activity.length > 0 ? `\n
\n ${activity.map(item => `\n
\n
\n
\n
\n ${item.action}\n ${formatTimestamp(item.timestamp)}\n
\n

${item.message}

\n ${item.user ? `

by ${item.user}

` : ''}\n
\n
\n `).join('')}\n
\n ` : `\n
\n \n \n \n

No Activity

\n

No recent activity for this plugin.

\n
\n `}\n
\n `\n}\n\nfunction renderInformationTab(plugin: any): string {\n return `\n
\n \n
\n

Plugin Details

\n
\n
\n Name:\n ${plugin.displayName}\n
\n
\n Version:\n ${plugin.version}\n
\n
\n Author:\n ${plugin.author}\n
\n
\n Category:\n ${plugin.category}\n
\n
\n Status:\n ${plugin.status}\n
\n
\n Last Updated:\n ${plugin.lastUpdated}\n
\n
\n
\n\n \n
\n

Dependencies & Permissions

\n \n ${plugin.dependencies && plugin.dependencies.length > 0 ? `\n
\n

Dependencies:

\n
\n ${plugin.dependencies.map((dep: string) => `\n
${dep}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${plugin.permissions && plugin.permissions.length > 0 ? `\n
\n

Permissions:

\n
\n ${plugin.permissions.map((perm: string) => `\n
${perm}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${(!plugin.dependencies || plugin.dependencies.length === 0) && (!plugin.permissions || plugin.permissions.length === 0) ? `\n

No dependencies or special permissions required.

\n ` : ''}\n
\n
\n `\n}\n\nfunction formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp * 1000)\n return date.toLocaleString()\n}\n\n// ==================== Plugin Settings Components ====================\n// These render just the settings content, embedded within the shared layout\n\n/**\n * Registry of custom plugin settings components\n * Plugins with custom settings UI register their render functions here\n */\ntype PluginSettingsRenderer = (plugin: any, settings: PluginSettings) => string\n\nconst pluginSettingsComponents: Record = {\n 'otp-login': renderOTPLoginSettingsContent,\n 'email': renderEmailSettingsContent,\n}\n\n/**\n * OTP Login plugin settings content\n */\nfunction renderOTPLoginSettingsContent(plugin: any, settings: PluginSettings): string {\n const siteName = settings.siteName || 'SonicJS'\n const emailConfigured = settings._emailConfigured || false\n const codeLength = settings.codeLength || 6\n const codeExpiryMinutes = settings.codeExpiryMinutes || 10\n const maxAttempts = settings.maxAttempts || 3\n const rateLimitPerHour = settings.rateLimitPerHour || 5\n const allowNewUserRegistration = settings.allowNewUserRegistration || false\n const logoUrl = settings.logoUrl || ''\n const logoWidth = Number(settings.logoWidth) || 150\n const logoBorderWidth = Number(settings.logoBorderWidth) || 0\n const logoBorderColor = settings.logoBorderColor || '#ffffff'\n const loginUrl = settings.loginUrl || ''\n const loginButtonText = settings.loginButtonText || ''\n const previewButtonText = loginButtonText.trim() || `Sign in to ${siteName}`\n const previewLogoBorder = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${escapeHtmlAttr(logoBorderColor)}; border-radius: 8px;`\n : ''\n\n return `\n
\n \n
\n

\n 📧 Test OTP Email\n

\n\n ${!emailConfigured ? `\n
\n

\n ⚠️ Email not configured.\n Configure the Email plugin\n to send real emails. Dev mode will show codes in the response.\n

\n
\n ` : `\n
\n

\n ✅ Email configured. Test emails will be sent via Resend.\n

\n
\n `}\n\n
\n
\n \n \n
\n\n \n Send Test Code\n \n \n \n \n \n \n \n \n\n
\n\n \n
\n

Verify Code

\n
\n
\n \n \n
\n \n Verify Code\n \n \n
\n
\n
\n\n \n
\n

Code Settings

\n\n
\n
\n \n \n

Optional. Displayed at the top of the OTP email.

\n
\n\n
\n
\n \n \n

Max width of the logo (20-600).

\n
\n\n
\n \n \n

0 disables the border.

\n
\n\n
\n \n
\n \n \n
\n

Hex, rgb(), or named color.

\n
\n
\n\n
\n \n \n

Optional. If set, a \"Sign in\" button is added to the email.

\n
\n\n
\n \n \n

Optional. Defaults to \"Sign in to ${siteName}\".

\n
\n\n
\n
\n \n \n

Number of digits (4-8)

\n
\n\n
\n \n \n

How long codes remain valid

\n
\n\n
\n \n \n

Max verification attempts

\n
\n\n
\n \n \n

Max requests per email per hour

\n
\n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

\n 👁️ Email Preview\n

\n

\n This is how the OTP email will appear to users. The site name \"${siteName}\" is configured in\n General Settings.\n

\n\n
\n
\n ${logoUrl ? `\"Logo\"` : ''}\n

Your Login Code

\n

Enter this code to sign in to ${siteName}

\n
\n\n
\n
\n
\n 123456\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${codeExpiryMinutes} minutes\n

\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${siteName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n
\n
\n\n \n
\n

🔢 Features

\n
    \n
  • ✓ Passwordless authentication
  • \n
  • ✓ Secure random code generation
  • \n
  • ✓ Rate limiting protection
  • \n
  • ✓ Brute force prevention
  • \n
  • ✓ Mobile-friendly UX
  • \n
\n
\n\n \n \n
\n\n \n `\n}\n\n/**\n * Email plugin settings content\n */\nfunction renderEmailSettingsContent(plugin: any, settings: PluginSettings): string {\n const apiKey = settings.apiKey || ''\n const fromEmail = settings.fromEmail || ''\n const fromName = settings.fromName || ''\n const replyTo = settings.replyTo || ''\n const logoUrl = settings.logoUrl || ''\n\n return `\n
\n \n
\n

Resend Configuration

\n\n
\n \n
\n \n \n

\n Get your API key from resend.com/api-keys\n

\n
\n\n \n
\n \n \n

Must be a verified domain in Resend

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n

Logo to display in email templates

\n
\n
\n
\n\n \n
\n

Send Test Email

\n
\n \n \n Send Test\n \n
\n
\n
\n\n \n
\n

📧 Email Templates Included

\n
    \n
  • ✓ Registration confirmation
  • \n
  • ✓ Email verification
  • \n
  • ✓ Password reset
  • \n
  • ✓ One-time code (2FA)
  • \n
\n

\n Templates are code-based and can be customized by editing the plugin files.\n

\n
\n
\n\n \n `\n}\n\n/**\n * Check if a plugin has a custom settings component\n */\nexport function hasCustomSettingsComponent(pluginId: string): boolean {\n return pluginId in pluginSettingsComponents\n}\n\n/**\n * Get the custom settings component for a plugin\n */\nexport function getCustomSettingsComponent(pluginId: string): PluginSettingsRenderer | undefined {\n return pluginSettingsComponents[pluginId]\n}","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderPluginsListPage, PluginsListPageData, Plugin } from '../templates/pages/admin-plugins-list.template'\nimport { renderPluginSettingsPage, PluginSettingsPageData } from '../templates/pages/admin-plugin-settings.template'\nimport { SettingsService } from '../services/settings'\nimport { PluginService } from '../services'\nimport { PLUGIN_REGISTRY, findPluginByCodeName } from '../plugins/manifest-registry'\nimport type { Bindings, Variables } from '../app'\n\nconst adminPluginRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminPluginRoutes.use('*', requireAuth())\n\n// Build available plugins list from the auto-generated registry.\n// To add a new plugin to this list, create a manifest.json in the plugin directory\n// and run: node packages/scripts/generate-plugin-registry.mjs\nconst AVAILABLE_PLUGINS = Object.values(PLUGIN_REGISTRY).map(p => ({\n id: p.id,\n name: p.codeName,\n display_name: p.displayName,\n description: p.description,\n version: p.version,\n author: p.author,\n category: p.category,\n icon: p.iconEmoji,\n permissions: p.permissions,\n dependencies: p.dependencies,\n is_core: p.is_core\n}))\n\n// Plugin list page\nadminPluginRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n // TODO: Fix permission system\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n\n const pluginService = new PluginService(db)\n\n // Get all installed plugins with error handling\n let installedPlugins: any[] = []\n let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 }\n\n try {\n installedPlugins = await pluginService.getAllPlugins()\n stats = await pluginService.getPluginStats()\n } catch (error) {\n console.error('Error loading plugins:', error)\n // Continue with empty data\n }\n\n // Get list of installed plugin IDs\n const installedPluginIds = new Set(installedPlugins.map(p => p.id))\n\n // Find uninstalled plugins\n const uninstalledPlugins = AVAILABLE_PLUGINS.filter(p => !installedPluginIds.has(p.id))\n\n // Map installed plugins to template format\n const templatePlugins: Plugin[] = installedPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: p.status,\n category: p.category,\n icon: p.icon,\n downloadCount: p.download_count,\n rating: p.rating,\n lastUpdated: formatLastUpdated(p.last_updated),\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Add uninstalled plugins to the list\n const uninstalledTemplatePlugins: Plugin[] = uninstalledPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: 'uninstalled' as const,\n category: p.category,\n icon: p.icon,\n downloadCount: 0,\n rating: 0,\n lastUpdated: 'Not installed',\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Combine installed and uninstalled plugins\n const allPlugins = [...templatePlugins, ...uninstalledTemplatePlugins]\n\n // Update stats with uninstalled count\n stats.uninstalled = uninstalledPlugins.length\n stats.total = installedPlugins.length + uninstalledPlugins.length\n\n const pageData: PluginsListPageData = {\n plugins: allPlugins,\n stats,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n },\n version: c.get('appVersion')\n }\n\n return c.html(renderPluginsListPage(pageData))\n } catch (error) {\n console.error('Error loading plugins page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Get plugin settings page\nadminPluginRoutes.get('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Check authorization first\n if (user?.role !== 'admin') {\n return c.redirect('/admin/plugins')\n }\n\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin(pluginId)\n\n if (!plugin) {\n return c.text('Plugin not found', 404)\n }\n\n // Get activity log\n const activity = await pluginService.getPluginActivity(pluginId, 20)\n\n // Load additional context for plugins with custom settings components\n let enrichedSettings = plugin.settings || {}\n\n // For OTP Login plugin, add site name and email config status\n if (pluginId === 'otp-login') {\n // Get site name from general settings via SettingsService\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName || 'SonicJS'\n\n // Check if email plugin is configured\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n let emailConfigured = false\n if (emailPlugin?.settings) {\n try {\n const emailSettings = JSON.parse(emailPlugin.settings)\n emailConfigured = !!(emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName)\n } catch (e) { /* ignore */ }\n }\n\n enrichedSettings = {\n ...enrichedSettings,\n siteName,\n _emailConfigured: emailConfigured\n }\n }\n\n // Map plugin data to template format\n const templatePlugin = {\n id: plugin.id,\n name: plugin.name,\n displayName: plugin.display_name,\n description: plugin.description,\n version: plugin.version,\n author: plugin.author,\n status: plugin.status,\n category: plugin.category,\n icon: plugin.icon,\n downloadCount: plugin.download_count,\n rating: plugin.rating,\n lastUpdated: formatLastUpdated(plugin.last_updated),\n dependencies: plugin.dependencies,\n permissions: plugin.permissions,\n isCore: plugin.is_core,\n settings: enrichedSettings\n }\n\n // Map activity data\n const templateActivity = (activity || []).map(item => ({\n id: item.id,\n action: item.action,\n message: item.message,\n timestamp: item.timestamp,\n user: item.user_email\n }))\n\n const pageData: PluginSettingsPageData = {\n plugin: templatePlugin,\n activity: templateActivity,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n }\n }\n\n return c.html(renderPluginSettingsPage(pageData))\n } catch (error) {\n console.error('Error getting plugin settings page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Activate plugin\nadminPluginRoutes.post('/:id/activate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.activatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error activating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to activate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Deactivate plugin\nadminPluginRoutes.post('/:id/deactivate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.deactivatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deactivating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to deactivate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Generic install handler - uses the auto-generated plugin registry.\n// No per-plugin switch/case needed. Adding a manifest.json is enough.\nadminPluginRoutes.post('/install', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const body = await c.req.json()\n const pluginService = new PluginService(db)\n\n // Look up plugin in registry by codeName (what the frontend sends as body.name)\n // or by id\n const registryEntry = findPluginByCodeName(body.name)\n || PLUGIN_REGISTRY[body.name]\n || PLUGIN_REGISTRY[body.id]\n\n if (!registryEntry) {\n return c.json({ error: 'Plugin not found in registry' }, 404)\n }\n\n const plugin = await pluginService.installPlugin({\n id: registryEntry.id,\n name: registryEntry.codeName,\n display_name: registryEntry.displayName,\n description: registryEntry.description,\n version: registryEntry.version,\n author: registryEntry.author,\n category: registryEntry.category,\n icon: registryEntry.iconEmoji,\n permissions: registryEntry.permissions,\n dependencies: registryEntry.dependencies,\n is_core: registryEntry.is_core,\n settings: registryEntry.defaultSettings,\n })\n\n return c.json({ success: true, plugin })\n } catch (error) {\n console.error('Error installing plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to install plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Uninstall plugin\nadminPluginRoutes.post('/:id/uninstall', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.uninstallPlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error uninstalling plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to uninstall plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Update plugin settings\nadminPluginRoutes.post('/:id/settings', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const settings = await c.req.json()\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings(pluginId, settings)\n\n // Clear auth validation cache if updating core-auth plugin\n if (pluginId === 'core-auth') {\n try {\n const cacheKv = c.env.CACHE_KV\n if (cacheKv) {\n await cacheKv.delete('auth:settings')\n await cacheKv.delete('auth:registration-enabled')\n console.log('[AuthSettings] Cache cleared after updating authentication settings')\n }\n } catch (cacheError) {\n console.error('[AuthSettings] Failed to clear cache:', cacheError)\n }\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating plugin settings:', error)\n const message = error instanceof Error ? error.message : 'Failed to update settings'\n return c.json({ error: message }, 400)\n }\n})\n\n// Helper function to format last updated time\nfunction formatLastUpdated(timestamp: number): string {\n const now = Date.now() / 1000\n const diff = now - timestamp\n\n if (diff < 60) return 'just now'\n if (diff < 3600) return `${Math.floor(diff / 60)} minutes ago`\n if (diff < 86400) return `${Math.floor(diff / 3600)} hours ago`\n if (diff < 604800) return `${Math.floor(diff / 86400)} days ago`\n if (diff < 2592000) return `${Math.floor(diff / 604800)} weeks ago`\n return `${Math.floor(diff / 2592000)} months ago`\n}\n\nexport { adminPluginRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogEntry {\n id: string\n level: string\n category: string\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags: string[]\n source?: string\n createdAt: Date\n formattedDate: string\n formattedDuration?: string\n levelClass: string\n categoryClass: string\n}\n\nexport interface LogsListPageData {\n logs: LogEntry[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n baseUrl: string\n }\n filters: {\n level: string\n category: string\n search: string\n startDate: string\n endDate: string\n source: string\n }\n user?: BaseUser\n}\n\nexport function renderLogsListPage(data: LogsListPageData) {\n const { logs, pagination, filters, user } = data\n\n const content = `\n
\n
\n
\n

System Logs

\n

\n Monitor and analyze system activity, errors, and performance metrics.\n

\n
\n
\n \n Configure\n \n \n Export\n \n
\n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n Apply Filters\n \n \n Clear\n \n
\n
\n\n
\n ${pagination.totalItems} ${pagination.totalItems === 1 ? 'entry' : 'entries'}\n
\n
\n
\n
\n
\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
\n Level\n \n Category\n \n Message\n \n Source\n \n Time\n \n Actions\n
\n \n ${log.level}\n \n \n \n ${log.category}\n \n \n
\n
${log.message}
\n ${log.url ? `
${log.method} ${log.url}
` : ''}\n ${log.duration ? `
${log.formattedDuration}
` : ''}\n
\n
\n ${log.source || '-'}\n \n ${log.formattedDate}\n \n \n View Details\n \n
\n
\n\n ${logs.length === 0 ? `\n
\n \n \n \n

No log entries

\n

No log entries found matching your criteria.

\n
\n ` : ''}\n
\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : `\n \n Previous\n \n `}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : `\n \n Next\n \n `}\n
\n
\n
\n

\n Showing ${pagination.startItem} to ${pagination.endItem} of{' '}\n ${pagination.totalItems} results\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'System Logs',\n pageTitle: 'System Logs',\n currentPath: '/admin/logs',\n user,\n content\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport { LogEntry } from './admin-logs-list.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogDetailsPageData {\n log: LogEntry\n user?: BaseUser\n}\n\nexport function renderLogDetailsPage(data: LogDetailsPageData) {\n const { log, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Details

\n

\n Detailed information for log entry ${log.id}\n

\n
\n
\n\n
\n
\n
\n

Log Entry Information

\n
\n \n ${log.level}\n \n \n ${log.category}\n \n
\n
\n
\n \n
\n
\n
\n
ID
\n
${log.id}
\n
\n \n
\n
Timestamp
\n
${log.formattedDate}
\n
\n \n
\n
Level
\n
\n \n ${log.level}\n \n
\n
\n \n
\n
Category
\n
\n \n ${log.category}\n \n
\n
\n \n ${log.source ? html`\n
\n
Source
\n
${log.source}
\n
\n ` : ''}\n \n ${log.userId ? html`\n
\n
User ID
\n
${log.userId}
\n
\n ` : ''}\n \n ${log.sessionId ? html`\n
\n
Session ID
\n
${log.sessionId}
\n
\n ` : ''}\n \n ${log.requestId ? html`\n
\n
Request ID
\n
${log.requestId}
\n
\n ` : ''}\n \n ${log.ipAddress ? html`\n
\n
IP Address
\n
${log.ipAddress}
\n
\n ` : ''}\n \n ${log.method && log.url ? html`\n
\n
HTTP Request
\n
\n ${log.method} ${log.url}\n ${log.statusCode ? html`(${log.statusCode})` : ''}\n
\n
\n ` : ''}\n \n ${log.duration ? html`\n
\n
Duration
\n
${log.formattedDuration}
\n
\n ` : ''}\n \n ${log.userAgent ? html`\n
\n
User Agent
\n
${log.userAgent}
\n
\n ` : ''}\n
\n
\n
\n\n \n
\n
\n

Message

\n
\n
\n
\n ${log.message}\n
\n
\n
\n\n \n ${log.tags && log.tags.length > 0 ? html`\n
\n
\n

Tags

\n
\n
\n
\n ${log.tags.map(tag => html`\n \n ${tag}\n \n `).join('')}\n
\n
\n
\n ` : ''}\n\n \n ${log.data ? html`\n
\n
\n

Additional Data

\n
\n
\n
${JSON.stringify(log.data, null, 2)}
\n
\n
\n ` : ''}\n\n \n ${log.stackTrace ? html`\n
\n
\n

Stack Trace

\n
\n
\n
${log.stackTrace}
\n
\n
\n ` : ''}\n\n \n
\n \n ← Back to Logs\n \n \n
\n ${log.level === 'error' || log.level === 'fatal' ? html`\n \n Report Issue\n \n ` : ''}\n \n alert('Log details copied to clipboard'))\"\n >\n Copy Details\n \n
\n
\n
\n `\n\n return adminLayoutV2({\n title: `Log Details - ${log.id}`,\n user,\n content: content as string\n })\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport type { LogConfig } from '../../db/schema'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogConfigPageData {\n configs: LogConfig[]\n user?: BaseUser\n}\n\nexport function renderLogConfigPage(data: LogConfigPageData) {\n const { configs, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Configuration

\n

\n Configure logging settings for different categories and manage log retention policies.\n

\n
\n
\n \n Run Cleanup\n \n
\n
\n\n
\n\n \n
\n
\n

Log Levels Reference

\n
\n
\n
\n
\n \n debug\n \n

Detailed diagnostic information

\n
\n
\n \n info\n \n

General information messages

\n
\n
\n \n warn\n \n

Warning conditions

\n
\n
\n \n error\n \n

Error conditions

\n
\n
\n \n fatal\n \n

Critical system errors

\n
\n
\n
\n
\n\n \n
\n ${configs.map(config => html`\n
\n
\n
\n

${config.category}

\n
\n ${config.enabled ? html`\n \n Enabled\n \n ` : html`\n \n Disabled\n \n `}\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n \n \n \n \n \n \n

Only logs at this level or higher will be stored

\n
\n \n
\n \n \n

Logs older than this will be deleted

\n
\n \n
\n \n \n

Maximum number of logs to keep for this category

\n
\n
\n \n
\n
\n \n Update Configuration\n \n
\n
\n \n
\n
\n
Created: ${new Date(config.createdAt).toLocaleDateString()}
\n
Updated: ${new Date(config.updatedAt).toLocaleDateString()}
\n
\n
\n
\n `).join('')}\n
\n\n \n
\n
\n

Global Log Settings

\n
\n
\n
\n
\n

Storage Information

\n
\n
\n
-
\n
Total Log Entries
\n
\n
\n
-
\n
Storage Used
\n
\n
\n
-
\n
Oldest Log
\n
\n
\n
\n \n
\n

Log Categories

\n
\n
    \n
  • auth - Authentication and authorization events
  • \n
  • api - API requests and responses
  • \n
  • workflow - Content workflow state changes
  • \n
  • plugin - Plugin-related activities
  • \n
  • media - File upload and media operations
  • \n
  • system - General system events
  • \n
  • security - Security-related events and alerts
  • \n
  • error - General error conditions
  • \n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n return adminLayoutV2({\n title: 'Log Configuration',\n user,\n content: content as string\n })\n}","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { D1Database, KVNamespace } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport { getLogger, type LogLevel, type LogCategory, type LogFilter } from '../services'\nimport { renderLogsListPage, type LogsListPageData } from '../templates/pages/admin-logs-list.template'\nimport { renderLogDetailsPage, type LogDetailsPageData } from '../templates/pages/admin-log-details.template'\nimport { renderLogConfigPage, type LogConfigPageData } from '../templates/pages/admin-log-config.template'\nimport type { Bindings, Variables } from '../app'\n\nconst adminLogsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminLogsRoutes.use('*', requireAuth())\n\n// Main logs listing page\nadminLogsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Use Hono's built-in query method instead of parsing URL\n const query = c.req.query()\n \n // Parse query parameters\n const page = parseInt(query.page || '1')\n const limit = parseInt(query.limit || '50')\n const level = query.level\n const category = query.category\n const search = query.search\n const startDate = query.start_date\n const endDate = query.end_date\n const source = query.source\n \n // Build filter\n const filter: LogFilter = {\n limit,\n offset: (page - 1) * limit,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (search) {\n filter.search = search\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n if (source) {\n filter.source = source\n }\n \n // Get logs and total count\n const { logs, total } = await logger.getLogs(filter)\n \n // Format logs for display\n const formattedLogs = logs.map(log => ({\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }))\n \n const totalPages = Math.ceil(total / limit)\n \n const pageData: LogsListPageData = {\n logs: formattedLogs,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total),\n baseUrl: '/admin/logs'\n },\n filters: {\n level: level || '',\n category: category || '',\n search: search || '',\n startDate: startDate || '',\n endDate: endDate || '',\n source: source || ''\n },\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogsListPage(pageData))\n } catch (error) {\n console.error('Error fetching logs:', error)\n return c.html(html`

Error loading logs: ${error}

`)\n }\n})\n\n// Log details page\nadminLogsRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get single log by ID\n const { logs } = await logger.getLogs({ \n limit: 1, \n offset: 0,\n search: id // Using search to find by ID - this is a simplification\n })\n \n const log = logs.find(l => l.id === id)\n \n if (!log) {\n return c.html(html`

Log entry not found

`)\n }\n \n const formattedLog = {\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n \n const pageData: LogDetailsPageData = {\n log: formattedLog,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogDetailsPage(pageData))\n } catch (error) {\n console.error('Error fetching log details:', error)\n return c.html(html`

Error loading log details: ${error}

`)\n }\n})\n\n// Log configuration page\nadminLogsRoutes.get('/config', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get all log configurations\n const configs = await logger.getAllConfigs()\n \n const pageData: LogConfigPageData = {\n configs,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogConfigPage(pageData))\n } catch (error) {\n console.error('Error fetching log config:', error)\n return c.html(html`

Error loading log configuration: ${error}

`)\n }\n})\n\n// Update log configuration\nadminLogsRoutes.post('/config/:category', async (c) => {\n try {\n const category = c.req.param('category') as LogCategory\n const formData = await c.req.formData()\n \n const enabled = formData.get('enabled') === 'on'\n const level = formData.get('level') as string\n const retention = parseInt(formData.get('retention') as string)\n const maxSize = parseInt(formData.get('max_size') as string)\n \n const logger = getLogger(c.env.DB)\n await logger.updateConfig(category, {\n enabled,\n level,\n retention,\n maxSize\n })\n \n return c.html(html`\n
\n Configuration updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating log config:', error)\n return c.html(html`\n
\n Failed to update configuration. Please try again.\n
\n `)\n }\n})\n\n// Export logs\nadminLogsRoutes.get('/export', async (c) => {\n try {\n const query = c.req.query()\n const format = query.format || 'csv'\n const level = query.level\n const category = query.category\n const startDate = query.start_date\n const endDate = query.end_date\n \n const logger = getLogger(c.env.DB)\n \n // Build filter for export\n const filter: LogFilter = {\n limit: 10000, // Export up to 10k logs\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n const { logs } = await logger.getLogs(filter)\n \n if (format === 'json') {\n return c.json(logs, 200, {\n 'Content-Disposition': 'attachment; filename=\"logs-export.json\"'\n })\n } else {\n // Default to CSV\n const headers = [\n 'ID', 'Level', 'Category', 'Message', 'Source', 'User ID', \n 'IP Address', 'Method', 'URL', 'Status Code', 'Duration', \n 'Created At'\n ]\n const csvRows = [headers.join(',')]\n \n logs.forEach(log => {\n const row = [\n log.id,\n log.level,\n log.category,\n `\"${log.message.replace(/\"/g, '\"\"')}\"`, // Escape quotes\n log.source || '',\n log.userId || '',\n log.ipAddress || '',\n log.method || '',\n log.url || '',\n log.statusCode || '',\n log.duration || '',\n new Date(log.createdAt).toISOString()\n ]\n csvRows.push(row.join(','))\n })\n \n const csv = csvRows.join('\\n')\n \n return new Response(csv, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': 'attachment; filename=\"logs-export.csv\"'\n }\n })\n }\n } catch (error) {\n console.error('Error exporting logs:', error)\n return c.json({ error: 'Failed to export logs' }, 500)\n }\n})\n\n// Clean up old logs\nadminLogsRoutes.post('/cleanup', async (c) => {\n try {\n const user = c.get('user')\n \n // Only allow admin users to run cleanup\n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n \n const logger = getLogger(c.env.DB)\n await logger.cleanupByRetention()\n \n return c.html(html`\n
\n Log cleanup completed successfully!\n
\n `)\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n return c.html(html`\n
\n Failed to clean up logs. Please try again.\n
\n `)\n }\n})\n\n// Search logs (HTMX endpoint)\nadminLogsRoutes.post('/search', async (c) => {\n try {\n const formData = await c.req.formData()\n const search = formData.get('search') as string\n const level = formData.get('level') as string\n const category = formData.get('category') as string\n \n const logger = getLogger(c.env.DB)\n \n const filter: LogFilter = {\n limit: 20,\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (search) filter.search = search\n if (level) filter.level = [level] as LogLevel[]\n if (category) filter.category = [category] as LogCategory[]\n \n const { logs } = await logger.getLogs(filter)\n \n // Return just the logs table rows for HTMX\n const rows = logs.map(log => {\n const formattedLog = {\n ...log,\n formattedDate: new Date(log.createdAt).toLocaleString(),\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n\n return `\n \n \n \n ${formattedLog.level}\n \n \n \n \n ${formattedLog.category}\n \n \n \n
${formattedLog.message}
\n \n ${formattedLog.source || '-'}\n ${formattedLog.formattedDate}\n \n View\n \n \n `\n }).join('')\n\n return c.html(rows)\n } catch (error) {\n console.error('Error searching logs:', error)\n return c.html(html`Error searching logs`)\n }\n})\n\n// Helper functions\nfunction getLevelClass(level: string): string {\n switch (level) {\n case 'debug': return 'bg-gray-100 text-gray-800'\n case 'info': return 'bg-blue-100 text-blue-800'\n case 'warn': return 'bg-yellow-100 text-yellow-800'\n case 'error': return 'bg-red-100 text-red-800'\n case 'fatal': return 'bg-purple-100 text-purple-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nfunction getCategoryClass(category: string): string {\n switch (category) {\n case 'auth': return 'bg-green-100 text-green-800'\n case 'api': return 'bg-blue-100 text-blue-800'\n case 'workflow': return 'bg-purple-100 text-purple-800'\n case 'plugin': return 'bg-indigo-100 text-indigo-800'\n case 'media': return 'bg-pink-100 text-pink-800'\n case 'system': return 'bg-gray-100 text-gray-800'\n case 'security': return 'bg-red-100 text-red-800'\n case 'error': return 'bg-red-100 text-red-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nexport { adminLogsRoutes }","import { Hono } from 'hono'\nimport { renderDesignPage, DesignPageData } from '../templates/pages/admin-design.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminDesignRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminDesignRoutes.get('/', (c) => {\n const user = c.get('user')\n \n const pageData: DesignPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderDesignPage(pageData))\n})","import { Hono } from 'hono'\nimport { renderCheckboxPage, CheckboxPageData } from '../templates/pages/admin-checkboxes.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminCheckboxRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCheckboxRoutes.get('/', (c) => {\n const user = c.get('user')\n\n const pageData: CheckboxPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderCheckboxPage(pageData))\n})\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface Testimonial {\n id?: number\n authorName: string\n authorTitle?: string\n authorCompany?: string\n testimonialText: string\n rating?: number\n isPublished: boolean\n sortOrder: number\n}\n\ninterface TestimonialsFormData {\n testimonial?: Testimonial\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderTestimonialsForm(data: TestimonialsFormData): string {\n const { testimonial, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Testimonial' : 'New Testimonial'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the testimonial details below' : 'Create a new customer testimonial'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Author Information

\n\n \n
\n \n
\n \n
\n ${errors?.authorName ? `\n
\n ${errors.authorName.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.authorTitle ? `\n
\n ${errors.authorTitle.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.authorCompany ? `\n
\n ${errors.authorCompany.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Testimonial

\n\n \n
\n \n
\n \n

\n 0/1000 characters\n

\n
\n ${errors?.testimonialText ? `\n
\n ${errors.testimonialText.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.rating ? `\n
\n ${errors.rating.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/testimonials/${testimonial?.id}` : '/admin/testimonials/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderTestimonialsList } from '../templates/pages/admin-testimonials-list.template'\nimport { renderTestimonialsForm } from '../templates/pages/admin-testimonials-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst testimonialSchema = z.object({\n authorName: z.string().min(1, 'Author name is required').max(100, 'Author name must be under 100 characters'),\n authorTitle: z.string().optional(),\n authorCompany: z.string().optional(),\n testimonialText: z.string().min(1, 'Testimonial is required').max(1000, 'Testimonial must be under 1000 characters'),\n rating: z.string().transform(val => val ? parseInt(val, 10) : undefined).pipe(z.number().min(1).max(5).optional()),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminTestimonialsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminTestimonialsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, minRating, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (minRating) {\n whereClause += ' AND rating >= ?'\n params.push(parseInt(minRating, 10))\n }\n\n if (search) {\n whereClause += ' AND (author_name LIKE ? OR testimonial_text LIKE ? OR author_company LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM testimonials ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM testimonials\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: testimonials } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderTestimonialsList({\n testimonials: testimonials || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonials:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonials',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminTestimonialsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial created successfully')\n } else {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating testimonial:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM testimonials WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/testimonials?message=Testimonial not found&type=error')\n }\n\n const testimonial = results[0] as any\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id: testimonial.id,\n authorName: testimonial.author_name,\n authorTitle: testimonial.author_title,\n authorCompany: testimonial.author_company,\n testimonialText: testimonial.testimonial_text,\n rating: testimonial.rating,\n isPublished: Boolean(testimonial.isPublished),\n sortOrder: testimonial.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonial:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE testimonials\n SET author_name = ?, author_title = ?, author_company = ?, testimonial_text = ?, rating = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial updated successfully')\n } else {\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: validatedData.authorName,\n authorTitle: validatedData.authorTitle,\n authorCompany: validatedData.authorCompany,\n testimonialText: validatedData.testimonialText,\n rating: validatedData.rating,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Testimonial not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating testimonial:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM testimonials WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Testimonial not found' }, 404)\n }\n\n return c.redirect('/admin/testimonials?message=Testimonial deleted successfully')\n } catch (error) {\n console.error('Error deleting testimonial:', error)\n return c.json({ error: 'Failed to delete testimonial' }, 500)\n }\n})\n\nexport default adminTestimonialsRoutes\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface CodeExample {\n id?: number\n title: string\n description?: string\n code: string\n language: string\n category?: string\n tags?: string\n isPublished: boolean\n sortOrder: number\n}\n\ninterface CodeExamplesFormData {\n codeExample?: CodeExample\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderCodeExamplesForm(data: CodeExamplesFormData): string {\n const { codeExample, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Code Example' : 'New Code Example'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the code example details below' : 'Create a new code snippet or example'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Basic Information

\n\n \n
\n \n
\n \n
\n ${errors?.title ? `\n
\n ${errors.title.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

\n 0/500 characters\n

\n
\n ${errors?.description ? `\n
\n ${errors.description.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.language ? `\n
\n ${errors.language.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.category ? `\n
\n ${errors.category.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

Comma-separated tags

\n
\n ${errors?.tags ? `\n
\n ${errors.tags.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Code

\n\n \n
\n \n
\n \n

\n 0 characters\n

\n
\n ${errors?.code ? `\n
\n ${errors.code.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/code-examples/${codeExample?.id}` : '/admin/code-examples/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderCodeExamplesList } from '../templates/pages/admin-code-examples-list.template'\nimport { renderCodeExamplesForm } from '../templates/pages/admin-code-examples-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst codeExampleSchema = z.object({\n title: z.string().min(1, 'Title is required').max(200, 'Title must be under 200 characters'),\n description: z.string().max(500, 'Description must be under 500 characters').optional(),\n code: z.string().min(1, 'Code is required'),\n language: z.string().min(1, 'Language is required'),\n category: z.string().max(50, 'Category must be under 50 characters').optional(),\n tags: z.string().max(200, 'Tags must be under 200 characters').optional(),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminCodeExamplesRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCodeExamplesRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, language, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (language) {\n whereClause += ' AND language = ?'\n params.push(language)\n }\n\n if (search) {\n whereClause += ' AND (title LIKE ? OR description LIKE ? OR code LIKE ? OR tags LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM code_examples ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM code_examples\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: codeExamples } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderCodeExamplesList({\n codeExamples: codeExamples || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code examples:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code examples',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminCodeExamplesRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example created successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating code example:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM code_examples WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/code-examples?message=Code example not found&type=error')\n }\n\n const example = results[0] as any\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id: example.id,\n title: example.title,\n description: example.description,\n code: example.code,\n language: example.language,\n category: example.category,\n tags: example.tags,\n isPublished: Boolean(example.isPublished),\n sortOrder: example.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code example:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE code_examples\n SET title = ?, description = ?, code = ?, language = ?, category = ?, tags = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example updated successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: validatedData.title,\n description: validatedData.description,\n code: validatedData.code,\n language: validatedData.language,\n category: validatedData.category,\n tags: validatedData.tags,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Code example not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating code example:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM code_examples WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Code example not found' }, 404)\n }\n\n return c.redirect('/admin/code-examples?message=Code example deleted successfully')\n } catch (error) {\n console.error('Error deleting code example:', error)\n return c.json({ error: 'Failed to delete code example' }, 500)\n }\n})\n\nexport default adminCodeExamplesRoutes\n","import {\n AdminLayoutData,\n renderAdminLayout,\n} from \"../layouts/admin-layout-v2.template\";\n\nexport interface DashboardStats {\n collections: number;\n contentItems: number;\n mediaFiles: number;\n users: number;\n databaseSize?: number; // Size in bytes\n mediaSize?: number; // Total size of all media files in bytes\n recentActivity?: ActivityItem[];\n analytics?: AnalyticsData;\n}\n\nexport interface ActivityItem {\n id: string;\n type: \"content\" | \"media\" | \"user\" | \"collection\";\n action: string;\n description: string;\n timestamp: string;\n user: string;\n}\n\nexport interface AnalyticsData {\n pageViews: number;\n uniqueVisitors: number;\n contentPublished: number;\n mediaUploaded: number;\n weeklyGrowth: {\n pageViews: number;\n visitors: number;\n content: number;\n media: number;\n };\n}\n\nexport interface DashboardPageData {\n user?: {\n name: string;\n email: string;\n role: string;\n };\n stats?: DashboardStats;\n version?: string;\n enableExperimentalFeatures?: boolean;\n}\n\nexport function renderDashboardPage(data: DashboardPageData): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n \n \n ${renderStatsCardsSkeleton()}\n \n\n \n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n \n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderDashboardPageWithDynamicMenu(\n data: DashboardPageData,\n dynamicMenuItems: Array<{ label: string; path: string; icon: string }>\n): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n
\n ${renderStatsCards({\n collections: 0,\n contentItems: 0,\n mediaFiles: 0,\n users: 0,\n })}\n
\n\n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n enableExperimentalFeatures: data.enableExperimentalFeatures,\n content: pageContent,\n dynamicMenuItems,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderStatsCards(stats: DashboardStats): string {\n const cards = [\n {\n title: \"Total Collections\",\n value: stats.collections.toString(),\n change: \"12.5\",\n isPositive: true,\n },\n {\n title: \"Content Items\",\n value: stats.contentItems.toString(),\n change: \"8.2\",\n isPositive: true,\n },\n {\n title: \"Media Files\",\n value: stats.mediaFiles.toString(),\n change: \"15.3\",\n isPositive: true,\n },\n {\n title: \"Active Users\",\n value: stats.users.toString(),\n change: \"2.4\",\n isPositive: false,\n },\n ];\n\n const cardColors = ['text-cyan-400', 'text-lime-400', 'text-pink-400', 'text-purple-400'];\n\n return `\n
\n

Last 30 days

\n
\n ${cards.map((card, index) => `\n
\n
${card.title}
\n
\n
\n ${card.value}\n
\n
\n \n ${card.isPositive\n ? ''\n : ''\n }\n \n ${card.isPositive ? 'Increased' : 'Decreased'} by\n ${card.change}%\n
\n
\n
\n `).join('')}\n
\n
\n `;\n}\n\nfunction renderStatsCardsSkeleton(): string {\n return `\n
\n
\n
\n ${Array(4)\n .fill(0)\n .map(\n () => `\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n `;\n}\n\nfunction renderAnalyticsChart(): string {\n return `\n
\n
\n
\n
\n

Real-Time Analytics

\n

Requests per second (live)

\n
\n
\n
\n Live\n
\n
\n
\n 0\n req/s\n
\n
\n\n
\n \n
\n\n \n
\n \n\n \n `;\n}\n\nexport function renderRecentActivitySkeleton(): string {\n return `\n
\n
\n
\n
\n
\n
\n ${Array(3).fill(0).map(() => `\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n}\n\nexport function renderRecentActivity(activities?: ActivityItem[]): string {\n // Helper to get user initials\n const getInitials = (user: string): string => {\n const parts = user.split(' ').filter(p => p.length > 0)\n if (parts.length >= 2) {\n const first = parts[0]?.[0] || ''\n const second = parts[1]?.[0] || ''\n return (first + second).toUpperCase()\n }\n return user.substring(0, 2).toUpperCase()\n }\n\n // Helper to get relative time\n const getRelativeTime = (timestamp: string): string => {\n const date = new Date(timestamp)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) return 'just now'\n if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`\n return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`\n }\n\n // Helper to get color classes based on activity type\n const getColorClasses = (type: string): { bgColor: string; textColor: string } => {\n switch (type) {\n case 'content':\n return {\n bgColor: 'bg-lime-500/10 dark:bg-lime-400/10',\n textColor: 'text-lime-700 dark:text-lime-300'\n }\n case 'media':\n return {\n bgColor: 'bg-cyan-500/10 dark:bg-cyan-400/10',\n textColor: 'text-cyan-700 dark:text-cyan-300'\n }\n case 'user':\n return {\n bgColor: 'bg-pink-500/10 dark:bg-pink-400/10',\n textColor: 'text-pink-700 dark:text-pink-300'\n }\n case 'collection':\n return {\n bgColor: 'bg-purple-500/10 dark:bg-purple-400/10',\n textColor: 'text-purple-700 dark:text-purple-300'\n }\n default:\n return {\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300'\n }\n }\n }\n\n // Format activities with colors and times\n const formattedActivities = (activities || []).map(activity => {\n const colors = getColorClasses(activity.type)\n return {\n ...activity,\n initials: getInitials(activity.user),\n time: getRelativeTime(activity.timestamp),\n ...colors\n }\n })\n\n // If no activities, show empty state\n if (formattedActivities.length === 0) {\n formattedActivities.push({\n type: 'content' as const,\n description: 'No recent activity',\n user: 'System',\n time: '',\n initials: 'SY',\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300',\n id: '0',\n action: '',\n timestamp: new Date().toISOString()\n })\n }\n\n return `\n
\n
\n
\n

Recent Activity

\n \n
\n
\n\n
\n
    \n ${formattedActivities\n .map(\n (activity) => `\n
  • \n
    \n ${activity.initials}\n
    \n
    \n

    ${activity.description}

    \n

    \n ${activity.user}\n · \n ${activity.time}\n

    \n
    \n
  • \n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderQuickActions(): string {\n const actions = [\n {\n title: \"Create Content\",\n description: \"Add new blog post or page\",\n href: \"/admin/content/new\",\n icon: `\n \n `,\n },\n {\n title: \"Upload Media\",\n description: \"Add images and files\",\n href: \"/admin/media\",\n icon: `\n \n `,\n },\n {\n title: \"Manage Users\",\n description: \"Add or edit user accounts\",\n href: \"/admin/users\",\n icon: `\n \n `,\n },\n ];\n\n return `\n
\n
\n

Quick Actions

\n
\n\n
\n
\n ${actions\n .map(\n (action) => `\n \n
\n ${action.icon}\n
\n
\n

${action.title}

\n

${action.description}

\n
\n \n \n \n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderSystemStatus(): string {\n return `\n
\n
\n
\n

System Status

\n
\n
\n Live\n
\n
\n
\n\n \n \n
\n ${[\n { color: 'from-blue-500/20 to-cyan-500/20', darkColor: 'dark:from-blue-500/10 dark:to-cyan-500/10' },\n { color: 'from-purple-500/20 to-pink-500/20', darkColor: 'dark:from-purple-500/10 dark:to-pink-500/10' },\n { color: 'from-amber-500/20 to-orange-500/20', darkColor: 'dark:from-amber-500/10 dark:to-orange-500/10' },\n { color: 'from-lime-500/20 to-emerald-500/20', darkColor: 'dark:from-lime-500/10 dark:to-emerald-500/10' }\n ].map((gradient, i) => `\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n \n\n \n `;\n}\n\nexport function renderStorageUsage(databaseSizeBytes?: number, mediaSizeBytes?: number): string {\n // Helper to format bytes to human readable\n const formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`\n }\n\n const dbSizeGB = databaseSizeBytes ? databaseSizeBytes / (1024 ** 3) : 0\n const dbMaxGB = 10\n const dbPercentageRaw = (dbSizeGB / dbMaxGB) * 100\n // Ensure minimum 0.5% visibility for progress bar, max 100%\n const dbPercentage = Math.min(Math.max(dbPercentageRaw, 0.5), 100)\n const dbUsedFormatted = databaseSizeBytes ? formatBytes(databaseSizeBytes) : 'Unknown'\n\n const mediaUsedFormatted = mediaSizeBytes ? formatBytes(mediaSizeBytes) : '0 B'\n\n const storageItems = [\n {\n label: \"Database\",\n used: dbUsedFormatted,\n total: \"10 GB\",\n percentage: dbPercentage,\n color: dbPercentage > 80 ? \"bg-red-500 dark:bg-red-400\" : dbPercentage > 60 ? \"bg-amber-500 dark:bg-amber-400\" : \"bg-cyan-500 dark:bg-cyan-400\",\n },\n {\n label: \"Media Files\",\n used: mediaUsedFormatted,\n total: \"∞\",\n percentage: 0,\n color: \"bg-lime-500 dark:bg-lime-400\",\n note: \"Stored in R2\"\n },\n {\n label: \"Cache (KV)\",\n used: \"N/A\",\n total: \"∞\",\n percentage: 0,\n color: \"bg-purple-500 dark:bg-purple-400\",\n note: \"Unlimited\"\n },\n ];\n\n return `\n
\n
\n

Storage Usage

\n
\n\n
\n
\n ${storageItems\n .map(\n (item: any) => `\n
\n
\n
\n ${item.label}\n ${item.note ? `(${item.note})` : ''}\n
\n
${item.used} / ${item.total}
\n
\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}","import { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderDashboardPage,\n type DashboardPageData,\n renderStatsCards,\n renderStorageUsage,\n renderRecentActivity,\n type ActivityItem\n} from '../templates/pages/admin-dashboard.template'\nimport { getCoreVersion } from '../utils/version'\nimport { metricsTracker } from '../utils/metrics'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin - Admin Dashboard\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: DashboardPageData = {\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n } catch (error) {\n console.error('Dashboard error:', error)\n\n // Return dashboard with error state\n const pageData: DashboardPageData = {\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n }\n})\n\n/**\n * GET /admin/dashboard/stats - Dashboard stats HTML fragment (HTMX endpoint)\n */\nrouter.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n const html = renderStatsCards({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n users: usersCount,\n mediaSize: mediaSize\n })\n\n return c.html(html)\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.html('
Failed to load statistics
')\n }\n})\n\n/**\n * GET /admin/dashboard/storage - Storage usage HTML fragment (HTMX endpoint)\n */\nrouter.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n const html = renderStorageUsage(databaseSize, mediaSize)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.html('
Failed to load storage information
')\n }\n})\n\n/**\n * GET /admin/dashboard/recent-activity - Recent activity HTML fragment (HTMX endpoint)\n */\nrouter.get('/recent-activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '5')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const activities: ActivityItem[] = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n // Format description based on action and resource type\n let description = ''\n if (row.action === 'create') {\n description = `Created new ${row.resource_type}`\n } else if (row.action === 'update') {\n description = `Updated ${row.resource_type}`\n } else if (row.action === 'delete') {\n description = `Deleted ${row.resource_type}`\n } else {\n description = `${row.action} ${row.resource_type}`\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n description,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n const html = renderRecentActivity(activities)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n const html = renderRecentActivity([])\n return c.html(html)\n }\n})\n\n/**\n * GET /admin/api/metrics - Real-time metrics for analytics chart\n * Returns JSON with current requests per second from the metrics tracker\n */\nrouter.get('/api/metrics', async (c) => {\n return c.json({\n requestsPerSecond: metricsTracker.getRequestsPerSecond(),\n totalRequests: metricsTracker.getTotalRequests(),\n averageRPS: Number(metricsTracker.getAverageRPS().toFixed(2)),\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/dashboard/system-status - System status HTML fragment (HTMX endpoint)\n */\nrouter.get('/system-status', async (c) => {\n try {\n const html = `\n
\n
\n
\n
\n
\n API Status\n \n \n \n
\n

Operational

\n
\n
\n\n
\n
\n
\n
\n Database\n \n \n \n
\n

Connected

\n
\n
\n\n
\n
\n
\n
\n R2 Storage\n \n \n \n
\n

Available

\n
\n
\n\n
\n
\n
\n
\n KV Cache\n \n \n \n
\n

Ready

\n
\n
\n
\n `\n return c.html(html)\n } catch (error) {\n console.error('Error fetching system status:', error)\n return c.html('
Failed to load system status
')\n }\n})\n\nexport { router as adminDashboardRoutes }\n","export function isMarkdownEditorType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nexport function normalizeFieldType(fieldType: string): string {\n if (isMarkdownEditorType(fieldType)) {\n return 'markdown'\n }\n\n if (fieldType === 'tinymce') {\n return 'richtext'\n }\n\n return fieldType\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\nexport interface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCollectionsListPage(data: CollectionsListPageData): string {\n const tableData: any = {\n tableId: 'collections-table',\n rowClickable: true,\n rowClickUrl: (collection: Collection) => `/admin/collections/${collection.id}`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => `\n
\n \n ${collection.name}\n \n ${collection.managed ? `\n \n \n \n \n Config\n \n ` : ''}\n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'description',\n label: 'Description',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => collection.description || '-'\n },\n {\n key: 'field_count',\n label: 'Fields',\n sortable: true,\n sortType: 'number',\n render: (_value: any, collection: any) => {\n const count = collection.field_count || 0\n return `\n
\n \n ${count} ${count === 1 ? 'field' : 'fields'}\n \n
\n `\n }\n },\n {\n key: 'managed',\n label: 'Source',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => {\n if (collection.managed) {\n return `\n
\n \n \n \n Code\n
\n `\n } else {\n return `\n
\n \n \n \n \n \n Database\n
\n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Content',\n sortable: false,\n render: (_value: any, collection: any) => {\n if (!collection || !collection.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.collections,\n emptyMessage: 'No collections found.'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Collections

\n

Manage your content collections and their schemas

\n
\n \n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n ${data.collections.length} ${data.collections.length === 1 ? 'collection' : 'collections'}\n \n \n \n \n Refresh\n \n
\n
\n
\n
\n
\n\n \n
\n ${renderTable(tableData)}\n
\n\n \n ${data.collections.length === 0 ? `\n
\n \n \n \n

No collections found

\n

Get started by creating your first collection

\n \n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Collections',\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","export interface TableColumn {\n key: string\n label: string\n sortable?: boolean\n className?: string\n sortType?: 'string' | 'number' | 'date' | 'boolean'\n render?: (value: any, row: any) => string\n}\n\nexport interface TableData {\n columns: TableColumn[]\n rows: T[]\n selectable?: boolean\n className?: string\n emptyMessage?: string\n tableId?: string\n title?: string\n rowClickable?: boolean\n rowClickUrl?: (row: T) => string\n}\n\nexport function renderTable(data: TableData): string {\n const tableId = data.tableId || `table-${Math.random().toString(36).substr(2, 9)}`\n\n if (data.rows.length === 0) {\n return `\n
\n
\n \n \n \n

${data.emptyMessage || 'No data available'}

\n
\n
\n `\n }\n\n return `\n
\n ${data.title ? `\n
\n

${data.title}

\n
\n ` : ''}\n
\n \n \n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, index) => {\n const isFirst = index === 0 && !data.selectable\n const isLast = index === data.columns.length - 1\n return `\n \n `}).join('')}\n \n \n \n ${data.rows.map((row, rowIndex) => {\n if (!row) return ''\n const clickableClass = data.rowClickable ? 'cursor-pointer' : ''\n const clickHandler = data.rowClickable && data.rowClickUrl ? `onclick=\"window.location.href='${data.rowClickUrl(row)}'\"` : ''\n return `\n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, colIndex) => {\n const value = (row as any)[column.key]\n const displayValue = column.render ? column.render(value, row) : value\n const stopPropagation = column.key === 'actions' ? 'onclick=\"event.stopPropagation()\"' : ''\n const isFirst = colIndex === 0 && !data.selectable\n const isLast = colIndex === data.columns.length - 1\n return `\n \n `\n }).join('')}\n \n `\n }).join('')}\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${column.sortable ? `\n \n ${column.label}\n
\n \n \n \n \n \n \n
\n \n ` : column.label}\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${displayValue || ''}\n
\n
\n\n \n
\n `\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm, FormData, FormField } from '../form.template'\nimport { renderAlert } from '../components/alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\n// Helper function to get field type badge with color\nfunction getFieldTypeBadge(fieldType: string): string {\n const typeLabels: Record = {\n 'text': 'Text',\n 'slug': 'URL Slug',\n 'richtext': 'Rich Text (TinyMCE)',\n 'quill': 'Rich Text (Quill)',\n 'markdown': 'Markdown',\n 'mdxeditor': 'Markdown',\n 'easymde': 'Markdown',\n 'number': 'Number',\n 'boolean': 'Boolean',\n 'date': 'Date',\n 'select': 'Select',\n 'media': 'Media',\n 'reference': 'Reference'\n }\n const typeColors: Record = {\n 'text': 'bg-blue-500/10 dark:bg-blue-400/10 text-blue-700 dark:text-blue-300 ring-blue-500/20 dark:ring-blue-400/20',\n 'slug': 'bg-sky-500/10 dark:bg-sky-400/10 text-sky-700 dark:text-sky-300 ring-sky-500/20 dark:ring-sky-400/20',\n 'richtext': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'quill': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'markdown': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'mdxeditor': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'easymde': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'number': 'bg-green-500/10 dark:bg-green-400/10 text-green-700 dark:text-green-300 ring-green-500/20 dark:ring-green-400/20',\n 'boolean': 'bg-amber-500/10 dark:bg-amber-400/10 text-amber-700 dark:text-amber-300 ring-amber-500/20 dark:ring-amber-400/20',\n 'date': 'bg-cyan-500/10 dark:bg-cyan-400/10 text-cyan-700 dark:text-cyan-300 ring-cyan-500/20 dark:ring-cyan-400/20',\n 'select': 'bg-indigo-500/10 dark:bg-indigo-400/10 text-indigo-700 dark:text-indigo-300 ring-indigo-500/20 dark:ring-indigo-400/20',\n 'media': 'bg-rose-500/10 dark:bg-rose-400/10 text-rose-700 dark:text-rose-300 ring-rose-500/20 dark:ring-rose-400/20',\n 'reference': 'bg-teal-500/10 dark:bg-teal-400/10 text-teal-700 dark:text-teal-300 ring-teal-500/20 dark:ring-teal-400/20'\n }\n const label = typeLabels[fieldType] || fieldType\n const color = typeColors[fieldType] || 'bg-zinc-500/10 dark:bg-zinc-400/10 text-zinc-700 dark:text-zinc-300 ring-zinc-500/20 dark:ring-zinc-400/20'\n return `${label}`\n}\n\nexport function renderCollectionFormPage(data: CollectionFormData): string {\n console.log('[renderCollectionFormPage] editorPlugins:', data.editorPlugins)\n\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? 'Edit Collection' : 'Create New Collection'\n const subtitle = isEdit\n ? `Update collection: ${data.display_name}`\n : 'Define a new content collection with custom fields and settings.'\n\n // Pre-compute data attribute for all fields (without badge HTML to avoid escaping issues)\n const fieldsWithData = (data.fields || []).map(field => ({\n ...field,\n dataFieldJSON: JSON.stringify(JSON.stringify(field))\n }))\n\n const fields: FormField[] = [\n {\n name: 'displayName',\n label: 'Display Name',\n type: 'text',\n value: data.display_name || '',\n placeholder: 'Blog Posts',\n required: true,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'name',\n label: 'Collection Name',\n type: 'text',\n value: data.name || '',\n placeholder: 'blog_posts',\n required: true,\n readonly: isEdit,\n helpText: isEdit ? 'Collection name cannot be changed' : 'Lowercase letters, numbers, and underscores only',\n className: isEdit ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'description',\n label: 'Description',\n type: 'textarea',\n value: data.description || '',\n placeholder: 'Description of this collection...',\n rows: 3,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n }\n ]\n\n\n const formData: FormData = {\n id: 'collection-form',\n ...(isEdit\n ? { hxPut: `/admin/collections/${data.id}`, action: `/admin/collections/${data.id}`, method: 'PUT' }\n : { hxPost: '/admin/collections', action: '/admin/collections' }\n ),\n hxTarget: '#form-messages',\n fields: fields,\n submitButtons: data.managed ? [] : [\n {\n label: isEdit ? 'Update Collection' : 'Create Collection',\n type: 'submit',\n className: 'btn-primary'\n }\n ]\n }\n\n const pageContent = `\n
\n \n ${data.managed ? `\n
\n
\n \n \n \n
\n

\n Config-Managed Collection\n

\n
\n

This collection is managed by a configuration file and cannot be edited through the admin interface.

\n

\n Config file:\n \n src/collections/${data.name}.collection.ts\n \n

\n

\n To modify this collection's schema, edit the configuration file directly in your code editor.\n

\n
\n
\n
\n
\n ` : ''}\n\n \n
\n
\n

${title}

\n

${subtitle}

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

Collection Details

\n

Configure your collection settings below

\n
\n\n ${isEdit && data.name ? `\n \n
\n \n \n \n \n \n
\n ` : ''}\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n \n \n ${renderForm(formData)}\n\n ${isEdit && data.managed ? `\n \n
\n
\n

Collection Fields

\n

Fields defined in the configuration file (read-only)

\n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n ${field.field_name}\n
\n
\n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add fields to your collection configuration file to see them here.

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${isEdit && !data.managed ? `\n \n
\n
\n
\n

Collection Fields

\n

Define the fields that content in this collection will have

\n
\n \n \n \n \n Add Field\n \n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n Field name: ${field.field_name}\n
\n
\n
\n
\n \n \n \n \n Edit\n \n \n \n \n \n Delete\n \n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add your first field to get started

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${!isEdit ? `\n
\n
\n \n \n \n
\n

\n Create Collection First\n

\n

\n After creating the collection, you'll be able to add and configure custom fields.\n

\n
\n
\n
\n ` : ''}\n \n \n
\n \n \n \n \n ${data.managed ? 'Back to Collections' : 'Cancel'}\n \n\n ${isEdit && !data.managed ? `\n \n \n \n \n Delete Collection\n \n ` : ''}\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Add Field

\n \n
\n
\n\n
\n \n\n
\n \n \n

Lowercase letters, numbers, and underscores only

\n
\n\n
\n \n
\n \n \n \n \n ${data.editorPlugins?.tinymce ? '' : ''}\n ${data.editorPlugins?.quill ? '' : ''}\n ${data.editorPlugins?.easyMdx ? '' : ''}\n \n \n \n \n \n \n \n \n \n \n \n
\n

\n
\n\n
\n \n \n
\n\n
\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n\n
\n \n \n

JSON configuration for field-specific options

\n
\n\n
\n \n Cancel\n \n \n Add Field\n \n
\n
\n
\n
\n\n ${isEdit && data.name ? `\n \n
\n
\n
\n
\n

\n Code-Based version of ${escapeHtml(data.display_name || 'this collection')}\n

\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n

\n This is a code-based representation of ${data.display_name ? `the ${escapeHtml(data.display_name)}` : 'this'} collection.\n Learn more about\n \n collections here.\n \n

\n Copied!\n
\n
\n\n
\n \n Close\n \n
\n
\n
\n
\n\n \n ` : ''}\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-field-confirm',\n title: 'Delete Field',\n message: 'Are you sure you want to delete this field? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteField()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { normalizeFieldType } from './admin-collections-field-types'\nimport { renderCollectionsListPage } from '../templates/pages/admin-collections-list.template'\nimport { renderCollectionFormPage } from '../templates/pages/admin-collections-form.template'\n\n// Type definitions for collections\ninterface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\ninterface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\ninterface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\ninterface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminCollectionsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminCollectionsRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on collection modification routes\nadminCollectionsRoutes.post('*', requireRole(['admin']))\nadminCollectionsRoutes.put('*', requireRole(['admin']))\nadminCollectionsRoutes.delete('*', requireRole(['admin']))\n\n// Collections management - List all collections\nadminCollectionsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n const search = url.searchParams.get('search') || ''\n\n // Build query based on search\n let stmt\n let results\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, managed, schema\n FROM collections\n WHERE is_active = 1\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(\"SELECT id, name, display_name, description, created_at, managed, schema FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY created_at DESC\")\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Fetch field counts for all collections from content_fields table (legacy)\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections: Collection[] = (results || [])\n .filter((row: any) => row && row.id)\n .map((row: any) => {\n // Calculate field count: use schema if available, otherwise use content_fields table\n let fieldCount = 0\n if (row.schema) {\n try {\n const schema = typeof row.schema === 'string' ? JSON.parse(row.schema) : row.schema\n if (schema && schema.properties) {\n fieldCount = Object.keys(schema.properties).length\n }\n } catch (e) {\n // If schema parsing fails, fall back to content_fields count\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n } else {\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n\n return {\n id: String(row.id || ''),\n name: String(row.name || ''),\n display_name: String(row.display_name || ''),\n description: row.description ? String(row.description) : undefined,\n created_at: Number(row.created_at || 0),\n formattedDate: row.created_at ? new Date(Number(row.created_at)).toLocaleDateString() : 'Unknown',\n field_count: fieldCount,\n managed: row.managed === 1\n }\n })\n\n const pageData: CollectionsListPageData = {\n collections,\n search,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCollectionsListPage(pageData))\n } catch (error) {\n console.error('Error fetching collections:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.html(html`

Error loading collections: ${errorMessage}

`)\n }\n})\n\n// New collection form\nadminCollectionsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /new] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n})\n\n// Create collection\nadminCollectionsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const name = formData.get('name') as string\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n // Check if this is an HTMX request\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n // Basic validation\n if (!name || !displayName) {\n const errorMsg = 'Name and display name are required.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n // For regular form submission, redirect back with error\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Validate name format\n if (!/^[a-z0-9_]+$/.test(name)) {\n const errorMsg = 'Collection name must contain only lowercase letters, numbers, and underscores.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n const db = c.env.DB\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(name).first()\n\n if (existing) {\n const errorMsg = 'A collection with this name already exists.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Create basic schema for the collection\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n // Create collection\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n name,\n displayName,\n description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache (only if CACHE_KV is available)\n if (c.env.CACHE_KV) {\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n }\n\n if (isHtmx) {\n return c.html(html`\n
\n Collection created successfully! Redirecting to edit mode...\n \n
\n `)\n } else {\n // For regular form submission, redirect to edit page\n return c.redirect(`/admin/collections/${collectionId}`)\n }\n } catch (error) {\n console.error('Error creating collection:', error)\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n if (isHtmx) {\n return c.html(html`\n
\n Failed to create collection. Please try again.\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n})\n\n// Edit collection form\nadminCollectionsRoutes.get('/:id', async (c) => {\n const db = c.env.DB\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n\n // Get collection fields - try schema first, then content_fields table\n let fields: CollectionField[] = []\n\n // If collection has a schema, parse it\n if (collection.schema) {\n try {\n const schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n fields = Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n // Normalize schema formats to UI field types\n let fieldType = fieldConfig.type || 'string'\n if (fieldConfig.enum) {\n fieldType = 'select'\n } else if (fieldConfig.format === 'richtext') {\n fieldType = 'richtext'\n } else if (fieldConfig.format === 'media') {\n fieldType = 'media'\n } else if (fieldConfig.format === 'date-time') {\n fieldType = 'date'\n } else if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n fieldType = 'slug'\n }\n \n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: fieldType,\n field_label: fieldConfig.title || fieldName,\n field_options: fieldConfig,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: fieldConfig.searchable === true || false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table if no schema or parsing failed\n if (fields.length === 0) {\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n fields = (fieldsResults || []).map((row: any) => {\n let fieldOptions = {}\n if (row.field_options) {\n try {\n fieldOptions = typeof row.field_options === 'string' ? JSON.parse(row.field_options) : row.field_options\n } catch (e) {\n console.error('Error parsing field_options for field:', row.field_name, e)\n fieldOptions = {}\n }\n }\n return {\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: fieldOptions,\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }\n })\n }\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /:id] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n fields: fields,\n managed: collection.managed === 1,\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n } catch (error) {\n console.error('Error fetching collection:', error)\n const user = c.get('user')\n\n // Check which editor plugins are active (even in error state)\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Failed to load collection.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n})\n\n// Update collection\nadminCollectionsRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const formData = await c.req.formData()\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n if (!displayName) {\n return c.html(html`\n
\n Display name is required.\n
\n `)\n }\n\n const db = c.env.DB\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(displayName, description || null, Date.now(), id).run()\n\n return c.html(html`\n
\n Collection updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.html(html`\n
\n Failed to update collection. Please try again.\n
\n `)\n }\n})\n\n// Delete collection\nadminCollectionsRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.html(html`\n
\n Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.\n
\n `)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.html(html`\n
\n Failed to delete collection. Please try again.\n
\n `)\n }\n})\n\n// Add field to collection\nadminCollectionsRoutes.post('/:id/fields', async (c) => {\n try {\n const collectionId = c.req.param('id')\n const formData = await c.req.formData()\n const fieldName = formData.get('field_name') as string\n const fieldType = formData.get('field_type') as string\n const fieldLabel = formData.get('field_label') as string\n const isRequired = formData.get('is_required') === '1'\n const isSearchable = formData.get('is_searchable') === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n if (!fieldName || !fieldType || !fieldLabel) {\n return c.json({ success: false, error: 'Field name, type, and label are required.' })\n }\n\n // Validate field name format\n if (!/^[a-z0-9_]+$/.test(fieldName)) {\n return c.json({ success: false, error: 'Field name must contain only lowercase letters, numbers, and underscores.' })\n }\n\n const db = c.env.DB\n\n // Get current collection to check its schema\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Check if field already exists in schema\n let schema = collection.schema ? (typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema) : null\n\n if (schema && schema.properties && schema.properties[fieldName]) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Also check content_fields table for legacy support\n const existingStmt = db.prepare('SELECT id FROM content_fields WHERE collection_id = ? AND field_name = ?')\n const existing = await existingStmt.bind(collectionId, fieldName).first()\n\n if (existing) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Parse field options\n let parsedOptions = {}\n try {\n parsedOptions = fieldOptions ? JSON.parse(fieldOptions) : {}\n } catch (e) {\n console.error('Error parsing field options:', e)\n }\n\n // Add field to schema (primary storage method)\n if (schema) {\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Build field config based on type\n const fieldConfig: any = {\n type: fieldType === 'number' ? 'number' : fieldType === 'boolean' ? 'boolean' : 'string',\n title: fieldLabel,\n searchable: isSearchable,\n ...parsedOptions\n }\n\n const normalizedFieldType = normalizeFieldType(fieldType)\n\n // Handle special field types\n if (normalizedFieldType === 'richtext') {\n fieldConfig.format = 'richtext'\n } else if (normalizedFieldType === 'date') {\n fieldConfig.format = 'date-time'\n } else if (normalizedFieldType === 'select') {\n fieldConfig.enum = (parsedOptions as any).options || []\n } else if (fieldType === 'radio') {\n fieldConfig.type = 'radio'\n if (!(parsedOptions as any).enum && (parsedOptions as any).options) {\n fieldConfig.enum = (parsedOptions as any).options\n }\n } else if (fieldType === 'media') {\n fieldConfig.format = 'media'\n } else if (normalizedFieldType === 'slug') {\n fieldConfig.type = 'slug'\n fieldConfig.format = 'slug'\n } else if (normalizedFieldType === 'quill') {\n fieldConfig.type = 'quill'\n } else if (normalizedFieldType === 'markdown') {\n fieldConfig.type = 'markdown'\n } else if (normalizedFieldType === 'reference') {\n fieldConfig.type = 'reference'\n }\n\n schema.properties[fieldName] = fieldConfig\n\n // Add to required array if needed\n if (isRequired && !schema.required.includes(fieldName)) {\n schema.required.push(fieldName)\n }\n\n // Update collection schema in database\n const updateSchemaStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateSchemaStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Add Field] Added field to schema:', fieldName, fieldConfig)\n\n return c.json({ success: true, fieldId: `schema-${fieldName}` })\n }\n\n // Fallback: If no schema exists, use content_fields table\n // Get next field order\n const orderStmt = db.prepare('SELECT MAX(field_order) as max_order FROM content_fields WHERE collection_id = ?')\n const orderResult = await orderStmt.bind(collectionId).first() as any\n const nextOrder = (orderResult?.max_order || 0) + 1\n\n // Create field in content_fields table\n const fieldId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content_fields (\n id, collection_id, field_name, field_type, field_label,\n field_options, field_order, is_required, is_searchable,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n fieldId,\n collectionId,\n fieldName,\n fieldType,\n fieldLabel,\n fieldOptions,\n nextOrder,\n isRequired ? 1 : 0,\n isSearchable ? 1 : 0,\n now,\n now\n ).run()\n\n return c.json({ success: true, fieldId })\n } catch (error) {\n console.error('Error adding field:', error)\n return c.json({ success: false, error: 'Failed to add field.' })\n }\n})\n\n// Update field\nadminCollectionsRoutes.put('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const formData = await c.req.formData()\n const fieldLabel = formData.get('field_label') as string\n const fieldType = formData.get('field_type') as string\n // Use getAll() to handle hidden input + checkbox pattern (get last value)\n const isRequiredValues = formData.getAll('is_required')\n const isSearchableValues = formData.getAll('is_searchable')\n const isRequired = isRequiredValues[isRequiredValues.length - 1] === '1'\n const isSearchable = isSearchableValues[isSearchableValues.length - 1] === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n // Log all form data for debugging\n console.log('[Field Update] Field ID:', fieldId)\n console.log('[Field Update] Form data received:', {\n field_label: fieldLabel,\n field_type: fieldType,\n is_required: formData.get('is_required'),\n is_searchable: formData.get('is_searchable'),\n field_options: fieldOptions\n })\n\n if (!fieldLabel) {\n return c.json({ success: false, error: 'Field label is required.' })\n }\n\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n // Schema fields are part of the collection's JSON schema\n // We need to update the collection's schema in the database\n const fieldName = fieldId.replace('schema-', '')\n\n console.log('[Field Update] Updating schema field:', fieldName)\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first()\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema) {\n schema = { type: 'object', properties: {}, required: [] }\n }\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Update the field in the schema\n if (schema.properties[fieldName]) {\n // Parse field options from form\n let parsedFieldOptions: Record = {}\n try {\n parsedFieldOptions = JSON.parse(fieldOptions)\n } catch (e) {\n console.error('[Field Update] Error parsing field options:', e)\n }\n\n // Build the updated field config - merge in field options\n const updatedFieldConfig: any = {\n ...schema.properties[fieldName],\n ...parsedFieldOptions,\n type: fieldType,\n title: fieldLabel,\n searchable: isSearchable\n }\n\n // Also set/remove the individual required property on the field\n // This ensures consistency regardless of which format is checked in GET\n if (isRequired) {\n updatedFieldConfig.required = true\n } else {\n delete updatedFieldConfig.required\n }\n\n schema.properties[fieldName] = updatedFieldConfig\n\n // Handle required field in the schema's required array (proper JSON Schema way)\n const requiredIndex = schema.required.indexOf(fieldName)\n console.log('[Field Update] Required field handling:', {\n fieldName,\n isRequired,\n currentRequiredArray: schema.required,\n requiredIndex\n })\n\n if (isRequired && requiredIndex === -1) {\n // Add to required array if checked and not already there\n schema.required.push(fieldName)\n console.log('[Field Update] Added field to required array')\n } else if (!isRequired && requiredIndex !== -1) {\n // Remove from required array if unchecked and currently there\n schema.required.splice(requiredIndex, 1)\n console.log('[Field Update] Removed field from required array')\n }\n\n console.log('[Field Update] Final required array:', schema.required)\n console.log('[Field Update] Final field config:', schema.properties[fieldName])\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Field Update] Schema update result:', {\n success: result.success,\n changes: result.meta?.changes\n })\n\n return c.json({ success: true })\n }\n\n // For regular database fields\n const updateStmt = db.prepare(`\n UPDATE content_fields\n SET field_label = ?, field_type = ?, field_options = ?, is_required = ?, is_searchable = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateStmt.bind(fieldLabel, fieldType, fieldOptions, isRequired ? 1 : 0, isSearchable ? 1 : 0, Date.now(), fieldId).run()\n\n console.log('[Field Update] Update result:', {\n success: result.success,\n meta: result.meta,\n changes: result.meta?.changes,\n last_row_id: result.meta?.last_row_id\n })\n\n // Verify the update by reading back the field\n const verifyStmt = db.prepare('SELECT * FROM content_fields WHERE id = ?')\n const verifyResult = await verifyStmt.bind(fieldId).first()\n console.log('[Field Update] Verification - field after update:', verifyResult)\n\n console.log('[Field Update] Successfully updated field with type:', fieldType)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating field:', error)\n return c.json({ success: false, error: 'Failed to update field.' })\n }\n})\n\n// Delete field\nadminCollectionsRoutes.delete('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n const fieldName = fieldId.replace('schema-', '')\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema || !schema.properties) {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n\n // Remove field from schema\n if (schema.properties[fieldName]) {\n delete schema.properties[fieldName]\n\n // Also remove from required array if present\n if (schema.required && Array.isArray(schema.required)) {\n const requiredIndex = schema.required.indexOf(fieldName)\n if (requiredIndex !== -1) {\n schema.required.splice(requiredIndex, 1)\n }\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Delete Field] Removed field from schema:', fieldName)\n\n return c.json({ success: true })\n } else {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n }\n\n // For regular database fields\n const deleteStmt = db.prepare('DELETE FROM content_fields WHERE id = ?')\n await deleteStmt.bind(fieldId).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting field:', error)\n return c.json({ success: false, error: 'Failed to delete field.' })\n }\n})\n\n// Update field order\nadminCollectionsRoutes.post('/:collectionId/fields/reorder', async (c) => {\n try {\n const body = await c.req.json()\n const fieldIds = body.fieldIds as string[]\n\n if (!Array.isArray(fieldIds)) {\n return c.json({ success: false, error: 'Invalid field order data.' })\n }\n\n const db = c.env.DB\n\n // Update field order\n for (let i = 0; i < fieldIds.length; i++) {\n const updateStmt = db.prepare('UPDATE content_fields SET field_order = ?, updated_at = ? WHERE id = ?')\n await updateStmt.bind(i + 1, Date.now(), fieldIds[i]).run()\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error reordering fields:', error)\n return c.json({ success: false, error: 'Failed to reorder fields.' })\n }\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface SettingsPageData {\n user?: {\n name: string\n email: string\n role: string\n }\n settings?: {\n general?: GeneralSettings\n appearance?: AppearanceSettings\n security?: SecuritySettings\n notifications?: NotificationSettings\n storage?: StorageSettings\n migrations?: MigrationSettings\n databaseTools?: DatabaseToolsSettings\n }\n activeTab?: string\n version?: string\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface AppearanceSettings {\n theme: 'light' | 'dark' | 'auto'\n primaryColor: string\n logoUrl: string\n favicon: string\n customCSS: string\n}\n\nexport interface SecuritySettings {\n twoFactorEnabled: boolean\n sessionTimeout: number\n passwordRequirements: {\n minLength: number\n requireUppercase: boolean\n requireNumbers: boolean\n requireSymbols: boolean\n }\n ipWhitelist: string[]\n jwtExpiresIn?: string\n jwtRefreshGraceSeconds?: number\n}\n\nexport interface NotificationSettings {\n emailNotifications: boolean\n contentUpdates: boolean\n systemAlerts: boolean\n userRegistrations: boolean\n emailFrequency: 'immediate' | 'daily' | 'weekly'\n}\n\nexport interface StorageSettings {\n maxFileSize: number\n allowedFileTypes: string[]\n storageProvider: 'local' | 'cloudflare' | 's3'\n backupFrequency: 'daily' | 'weekly' | 'monthly'\n retentionPeriod: number\n}\n\nexport interface MigrationSettings {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Array<{\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n }>\n}\n\nexport interface DatabaseToolsSettings {\n totalTables: number\n totalRows: number\n lastBackup?: string\n databaseSize?: string\n tables: Array<{\n name: string\n rowCount: number\n }>\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const activeTab = data.activeTab || 'general'\n \n const pageContent = `\n
\n \n
\n
\n

Settings

\n

Manage your application settings and preferences

\n
\n
\n\n \n
\n
\n \n
\n
\n\n \n
\n
\n ${renderTabContent(activeTab, data.settings)}\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'run-migrations-confirm',\n title: 'Run Migrations',\n message: 'Are you sure you want to run pending migrations? This action cannot be undone.',\n confirmText: 'Run Migrations',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performRunMigrations()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Settings',\n pageTitle: 'Settings',\n currentPath: '/admin/settings',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderTabButton(tabId: string, label: string, iconPath: string, activeTab: string): string {\n const isActive = activeTab === tabId\n const baseClasses = 'flex items-center space-x-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 whitespace-nowrap no-underline'\n const activeClasses = isActive\n ? 'border-zinc-950 dark:border-white text-zinc-950 dark:text-white'\n : 'border-transparent text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-300 hover:border-zinc-300 dark:hover:border-zinc-700'\n\n return `\n \n \n \n \n ${label}\n \n `\n}\n\nfunction renderTabContent(activeTab: string, settings?: SettingsPageData['settings']): string {\n switch (activeTab) {\n case 'general':\n return renderGeneralSettings(settings?.general)\n case 'appearance':\n return renderAppearanceSettings(settings?.appearance)\n case 'security':\n return renderSecuritySettings(settings?.security)\n case 'notifications':\n return renderNotificationSettings(settings?.notifications)\n case 'storage':\n return renderStorageSettings(settings?.storage)\n case 'migrations':\n return renderMigrationSettings(settings?.migrations)\n case 'database-tools':\n return renderDatabaseToolsSettings(settings?.databaseTools)\n default:\n return renderGeneralSettings(settings?.general)\n }\n}\n\nfunction renderGeneralSettings(settings?: GeneralSettings): string {\n return `\n
\n
\n

General Settings

\n

Configure basic application settings and preferences.

\n
\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n
\n \n ${settings?.siteDescription || ''}\n
\n\n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderAppearanceSettings(settings?: AppearanceSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Appearance Settings

\n

Customize the look and feel of your application.

\n
\n \n
\n
\n
\n \n
\n \n \n \n
\n
\n \n
\n \n
\n \n \n
\n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderSecuritySettings(settings?: SecuritySettings): string {\n const jwtExpiresIn = settings?.jwtExpiresIn ?? '30d'\n const jwtRefreshGraceSeconds =\n typeof settings?.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n\n return `\n
\n \n
\n

Session / JWT

\n

\n Configure how long a signed-in session lasts and how long an expired token can still be refreshed.\n The JWT_EXPIRES_IN and JWT_REFRESH_GRACE_SECONDS\n environment variables, when set, override the values below.\n

\n\n
\n
\n \n \n

\n Accepts 30d, 12h, 3600s, or bare seconds. Default: 30 days.\n

\n
\n\n
\n \n \n

\n How long an expired token can still be exchanged at /auth/refresh. Default: 604800 (7 days).\n

\n
\n
\n\n
\n \n \n \n \n Save Session Settings\n \n
\n
\n\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n The fields below are under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Security Settings

\n

Configure security and authentication settings.

\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n

Leave empty to allow all IPs

\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderNotificationSettings(settings?: NotificationSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Notification Settings

\n

Configure how and when you receive notifications.

\n
\n \n
\n
\n
\n

Email Notifications

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Notification Preferences
\n

\n Critical system alerts will always be sent immediately regardless of your frequency setting.\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderStorageSettings(settings?: StorageSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Storage Settings

\n

Configure file storage and backup settings.

\n
\n \n
\n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Storage Status
\n

\n Current usage: 2.4 GB / 10 GB available\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderMigrationSettings(settings?: MigrationSettings): string {\n return `\n
\n
\n

Database Migrations

\n

View and manage database migrations to keep your schema up to date.

\n
\n \n \n
\n
\n
\n
\n

Total Migrations

\n

${settings?.totalMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Applied

\n

${settings?.appliedMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Pending

\n

${settings?.pendingMigrations || '0'}

\n
\n \n \n \n
\n
\n
\n\n \n
\n \n \n \n\n \n
\n\n \n
\n
\n

Migration History

\n

List of all available database migrations

\n
\n \n
\n
\n \n \n \n

Loading migration status...

\n
\n
\n
\n
\n\n \n `\n}\n\nfunction renderDatabaseToolsSettings(settings?: DatabaseToolsSettings): string {\n return `\n
\n
\n

Database Tools

\n

Manage database operations including backup, restore, and maintenance.

\n
\n\n \n
\n
\n
\n
\n

Total Tables

\n

${settings?.totalTables || '0'}

\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n
\n

Total Rows

\n

${settings?.totalRows?.toLocaleString() || '0'}

\n
\n
\n \n \n \n
\n
\n
\n
\n\n \n
\n \n
\n

Safe Operations

\n
\n \n \n \n \n Refresh Stats\n \n\n \n \n \n \n Create Backup\n \n\n \n \n \n \n Validate Database\n \n
\n
\n
\n\n \n
\n
\n

Database Tables

\n

Click on a table to view its data

\n
\n\n
\n
\n \n \n \n

Loading database statistics...

\n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

Danger Zone

\n

\n These operations are destructive and cannot be undone.\n Your admin account will be preserved, but all other data will be permanently deleted.\n

\n
\n \n \n \n \n Truncate All Data\n \n
\n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\n// import { html } from 'hono/html'\nimport { requireAuth } from '../middleware'\nimport { renderSettingsPage, SettingsPageData } from '../templates/pages/admin-settings.template'\nimport { MigrationService } from '../services/migrations'\nimport { SettingsService } from '../services/settings'\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminSettingsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminSettingsRoutes.use('*', requireAuth())\n\n// Helper function to get mock settings data\nfunction getMockSettings(user: any) {\n return {\n general: {\n siteName: 'SonicJS AI',\n siteDescription: 'A modern headless CMS powered by AI',\n adminEmail: user?.email || 'admin@example.com',\n timezone: 'UTC',\n language: 'en',\n maintenanceMode: false\n },\n appearance: {\n theme: 'dark' as const,\n primaryColor: '#465FFF',\n logoUrl: '',\n favicon: '',\n customCSS: ''\n },\n security: {\n twoFactorEnabled: false,\n sessionTimeout: 30,\n passwordRequirements: {\n minLength: 8,\n requireUppercase: true,\n requireNumbers: true,\n requireSymbols: false\n },\n ipWhitelist: []\n },\n notifications: {\n emailNotifications: true,\n contentUpdates: true,\n systemAlerts: true,\n userRegistrations: false,\n emailFrequency: 'immediate' as const\n },\n storage: {\n maxFileSize: 10,\n allowedFileTypes: ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'docx'],\n storageProvider: 'cloudflare' as const,\n backupFrequency: 'daily' as const,\n retentionPeriod: 30\n },\n migrations: {\n totalMigrations: 0,\n appliedMigrations: 0,\n pendingMigrations: 0,\n lastApplied: undefined,\n migrations: []\n },\n databaseTools: {\n totalTables: 0,\n totalRows: 0,\n lastBackup: undefined,\n databaseSize: '0 MB',\n tables: []\n }\n }\n}\n\n// Settings page (redirects to general settings)\nadminSettingsRoutes.get('/', (c) => {\n return c.redirect('/admin/settings/general')\n})\n\n// General settings\nadminSettingsRoutes.get('/general', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Get real general settings from database\n const generalSettings = await settingsService.getGeneralSettings(user?.email)\n\n const mockSettings = getMockSettings(user)\n mockSettings.general = generalSettings\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'general',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Appearance settings\nadminSettingsRoutes.get('/appearance', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'appearance',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Security settings\nadminSettingsRoutes.get('/security', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Load persisted security settings (JWT TTL + refresh grace)\n const persisted = await settingsService.getSecuritySettings()\n\n const mockSettings = getMockSettings(user)\n mockSettings.security = {\n ...mockSettings.security,\n jwtExpiresIn: persisted.jwtExpiresIn,\n jwtRefreshGraceSeconds: persisted.jwtRefreshGraceSeconds\n } as any\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'security',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Notifications settings\nadminSettingsRoutes.get('/notifications', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'notifications',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Storage settings\nadminSettingsRoutes.get('/storage', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'storage',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Migrations settings\nadminSettingsRoutes.get('/migrations', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'migrations',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Database tools settings\nadminSettingsRoutes.get('/database-tools', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'database-tools',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Get migration status\nadminSettingsRoutes.get('/api/migrations/status', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminSettingsRoutes.post('/api/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n return c.json({\n success: false,\n error: 'Failed to run migrations'\n }, 500)\n }\n})\n\n// Validate database schema\nadminSettingsRoutes.get('/api/migrations/validate', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\n// Get database tools stats\nadminSettingsRoutes.get('/api/database-tools/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get list of all tables\n const tablesQuery = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT LIKE '_cf_%'\n ORDER BY name\n `).all()\n\n const tables = tablesQuery.results || []\n let totalRows = 0\n\n // Get row count for each table\n const tableStats = await Promise.all(\n tables.map(async (table: any) => {\n try {\n const countResult = await db.prepare(`SELECT COUNT(*) as count FROM ${table.name}`).first()\n const rowCount = (countResult as any)?.count || 0\n totalRows += rowCount\n return {\n name: table.name,\n rowCount\n }\n } catch (error) {\n console.error(`Error counting rows in ${table.name}:`, error)\n return {\n name: table.name,\n rowCount: 0\n }\n }\n })\n )\n\n // D1 doesn't expose database size directly, so we'll estimate based on row counts\n // Average row size estimate: 1KB per row (rough approximation)\n const estimatedSizeBytes = totalRows * 1024\n const databaseSizeMB = (estimatedSizeBytes / (1024 * 1024)).toFixed(2)\n\n return c.json({\n success: true,\n data: {\n totalTables: tables.length,\n totalRows,\n databaseSize: `${databaseSizeMB} MB (estimated)`,\n tables: tableStats\n }\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch database statistics'\n }, 500)\n }\n})\n\n// Validate database\nadminSettingsRoutes.get('/api/database-tools/validate', async (c) => {\n try {\n const db = c.env.DB\n\n // Run PRAGMA integrity_check\n const integrityResult = await db.prepare('PRAGMA integrity_check').first()\n const isValid = (integrityResult as any)?.integrity_check === 'ok'\n\n return c.json({\n success: true,\n data: {\n valid: isValid,\n message: isValid ? 'Database integrity check passed' : 'Database integrity check failed'\n }\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n})\n\n// Backup database\nadminSettingsRoutes.post('/api/database-tools/backup', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n // TODO: Implement actual backup functionality\n // For now, return success message\n return c.json({\n success: true,\n message: 'Database backup feature coming soon. Use Cloudflare Dashboard for backups.'\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({\n success: false,\n error: 'Failed to create backup'\n }, 500)\n }\n})\n\n// Truncate tables\nadminSettingsRoutes.post('/api/database-tools/truncate', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const body = await c.req.json()\n const tablesToTruncate = body.tables || []\n\n if (!Array.isArray(tablesToTruncate) || tablesToTruncate.length === 0) {\n return c.json({\n success: false,\n error: 'No tables specified for truncation'\n }, 400)\n }\n\n const db = c.env.DB\n const results = []\n\n // Validate table names against actual database tables (prevents SQL injection)\n const tablesResult = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n `).all()\n const validTables = new Set(\n (tablesResult.results || []).map((row: any) => row.name)\n )\n\n for (const tableName of tablesToTruncate) {\n if (!validTables.has(tableName)) {\n results.push({ table: tableName, success: false, error: 'Table not found' })\n continue\n }\n try {\n await db.prepare(`DELETE FROM ${tableName}`).run()\n results.push({ table: tableName, success: true })\n } catch (error) {\n console.error(`Error truncating ${tableName}:`, error)\n results.push({ table: tableName, success: false, error: String(error) })\n }\n }\n\n return c.json({\n success: true,\n message: `Truncated ${results.filter(r => r.success).length} of ${tablesToTruncate.length} tables`,\n results\n })\n } catch (error) {\n console.error('Error truncating tables:', error)\n return c.json({\n success: false,\n error: 'Failed to truncate tables'\n }, 500)\n }\n})\n\n// Save general settings\nadminSettingsRoutes.post('/general', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Extract general settings from form data\n const settings = {\n siteName: formData.get('siteName') as string,\n siteDescription: formData.get('siteDescription') as string,\n adminEmail: formData.get('adminEmail') as string,\n timezone: formData.get('timezone') as string,\n language: formData.get('language') as string,\n maintenanceMode: formData.get('maintenanceMode') === 'true'\n }\n\n // Validate required fields\n if (!settings.siteName || !settings.siteDescription) {\n return c.json({\n success: false,\n error: 'Site name and description are required'\n }, 400)\n }\n\n // Save settings to database\n const success = await settingsService.saveGeneralSettings(settings)\n\n if (success) {\n return c.json({\n success: true,\n message: 'General settings saved successfully!'\n })\n } else {\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n }\n } catch (error) {\n console.error('Error saving general settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save security settings (JWT TTL + refresh grace)\nadminSettingsRoutes.post('/security', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n const jwtExpiresInRaw = (formData.get('jwtExpiresIn') as string | null)?.trim() || ''\n const graceRaw = (formData.get('jwtRefreshGraceSeconds') as string | null)?.trim() || ''\n\n // Validate jwtExpiresIn: bare seconds or \n if (!/^\\d+(?:s|m|h|d)?$/i.test(jwtExpiresInRaw)) {\n return c.json({\n success: false,\n error: 'JWT expiration must be a number optionally suffixed with s/m/h/d (e.g. 30d, 12h, 3600).'\n }, 400)\n }\n\n const graceSeconds = Number.parseInt(graceRaw, 10)\n if (!Number.isFinite(graceSeconds) || graceSeconds < 0 || graceSeconds > 60 * 60 * 24 * 90) {\n return c.json({\n success: false,\n error: 'Refresh grace must be an integer between 0 and 7776000 seconds (90 days).'\n }, 400)\n }\n\n const success = await settingsService.saveSecuritySettings({\n jwtExpiresIn: jwtExpiresInRaw,\n jwtRefreshGraceSeconds: graceSeconds\n })\n\n if (success) {\n return c.json({\n success: true,\n message: 'Security settings saved successfully!'\n })\n }\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n } catch (error) {\n console.error('Error saving security settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save settings (legacy endpoint - redirect to general)\nadminSettingsRoutes.post('/', async (c) => {\n return c.redirect('/admin/settings/general')\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n formattedDate: string\n}\n\nexport interface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormsListPage(data: FormsListPageData): string {\n const tableData: any = {\n tableId: 'forms-table',\n rowClickable: true,\n rowClickUrl: (form: Form) => `/admin/forms/${form.id}/builder`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => `\n
\n \n ${form.name}\n \n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'category',\n label: 'Category',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n const categoryColors: Record = {\n 'contact': 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 ring-blue-700/10 dark:ring-blue-400/20',\n 'survey': 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-300 ring-purple-700/10 dark:ring-purple-400/20',\n 'registration': 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-300 ring-green-700/10 dark:ring-green-400/20',\n 'feedback': 'bg-orange-50 dark:bg-orange-500/10 text-orange-700 dark:text-orange-300 ring-orange-700/10 dark:ring-orange-400/20',\n 'general': 'bg-gray-50 dark:bg-gray-500/10 text-gray-700 dark:text-gray-300 ring-gray-700/10 dark:ring-gray-400/20'\n }\n const colorClass = categoryColors[form.category] || categoryColors['general']\n return `\n \n ${form.category || 'general'}\n \n `\n }\n },\n {\n key: 'submission_count',\n label: 'Submissions',\n sortable: true,\n sortType: 'number',\n render: (_value: any, form: any) => {\n const count = form.submission_count || 0\n return `\n
\n \n ${count}\n \n
\n `\n }\n },\n {\n key: 'is_active',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n if (form.is_active) {\n return `\n \n Active\n \n `\n } else {\n return `\n \n Inactive\n \n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n render: (_value: any, form: any) => {\n if (!form || !form.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.forms,\n emptyMessage: 'No forms found. Create your first form to get started!'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Forms

\n

Create and manage forms with the visual form builder

\n
\n \n
\n\n \n
\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Forms
\n
${data.forms.length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Active Forms
\n
${data.forms.filter(f => f.is_active).length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Submissions
\n
${data.forms.reduce((sum, f) => sum + (f.submission_count || 0), 0)}
\n
\n
\n
\n
\n
\n\n \n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Filter\n \n ${data.search || data.category ? `\n \n Clear\n \n ` : ''}\n \n
\n\n \n
\n ${renderTable(tableData)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Forms',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface FormBuilderPageData {\n id: string\n name: string\n display_name: string\n description?: string\n category?: string\n formio_schema: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\n// Inline Turnstile component for Form.io builder\nfunction getTurnstileComponentScript(): string {\n return `\n (function() {\n 'use strict';\n\n if (!window.Formio || !window.Formio.Components) {\n console.error('Form.io library not loaded');\n return;\n }\n\n const FieldComponent = Formio.Components.components.field;\n\n class TurnstileComponent extends FieldComponent {\n static schema(...extend) {\n return FieldComponent.schema({\n type: 'turnstile',\n label: 'Turnstile Verification',\n key: 'turnstile',\n input: true,\n persistent: false,\n protected: true,\n unique: false,\n hidden: false,\n clearOnHide: true,\n tableView: false,\n validate: {\n required: false\n },\n siteKey: '',\n theme: 'auto',\n size: 'normal',\n action: '',\n appearance: 'always',\n errorMessage: 'Please complete the security verification'\n }, ...extend);\n }\n\n static get builderInfo() {\n return {\n title: 'Turnstile',\n group: 'premium',\n icon: 'fa fa-shield-alt',\n weight: 120,\n documentation: '/admin/forms/docs#turnstile',\n schema: TurnstileComponent.schema()\n };\n }\n\n constructor(component, options, data) {\n super(component, options, data);\n this.widgetId = null;\n this.scriptLoaded = false;\n }\n\n init() {\n super.init();\n // Only load script if NOT in builder/edit mode\n if (!this.options.editMode && !this.options.builder && !this.builderMode) {\n this.loadTurnstileScript();\n }\n }\n\n loadTurnstileScript() {\n // Extra safety: never load in builder\n if (this.options.editMode || this.options.builder || this.builderMode) {\n console.log('Turnstile: Skipping script load in builder mode');\n return Promise.resolve();\n }\n\n if (window.turnstile) {\n this.scriptLoaded = true;\n return Promise.resolve();\n }\n\n if (this.scriptPromise) {\n return this.scriptPromise;\n }\n\n console.log('Turnstile: Loading script for form mode');\n this.scriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js';\n script.async = true;\n script.defer = true;\n script.onload = () => {\n this.scriptLoaded = true;\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Turnstile'));\n document.head.appendChild(script);\n });\n\n return this.scriptPromise;\n }\n\n render() {\n return super.render(\\`\n
\n
\n \\${this.component.description ? \\`
\\${this.component.description}
\\` : ''}\n
\n \\`);\n }\n\n attach(element) {\n this.loadRefs(element, {\n turnstileContainer: 'single',\n turnstileWidget: 'single'\n });\n\n const superAttach = super.attach(element);\n\n // Check if we're in builder mode or form mode\n if (this.options.editMode || this.options.builder) {\n // Builder mode - show placeholder only\n this.renderPlaceholder();\n } else {\n // Form mode - render actual widget\n this.loadTurnstileScript()\n .then(() => this.renderWidget())\n .catch(err => {\n console.error('Failed to load Turnstile:', err);\n if (this.refs.turnstileWidget) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to load security verification\n
\n \\`;\n }\n });\n }\n\n return superAttach;\n }\n\n renderPlaceholder() {\n if (!this.refs.turnstileWidget) {\n return;\n }\n \n this.refs.turnstileWidget.innerHTML = \\`\n
\n
🛡️
\n
Turnstile Verification
\n
CAPTCHA-free bot protection by Cloudflare
\n
Widget will appear here on the live form
\n
\n \\`;\n }\n\n renderWidget() {\n if (!this.refs.turnstileWidget || !window.turnstile) {\n return;\n }\n\n this.refs.turnstileWidget.innerHTML = '';\n\n const siteKey = this.component.siteKey || \n (this.root && this.root.options && this.root.options.turnstileSiteKey) || \n '';\n \n if (!siteKey) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n ⚠️ Configuration Required: Turnstile site key not configured. \n Please enable the Turnstile plugin in Settings → Plugins.\n
\n \\`;\n return;\n }\n\n try {\n const self = this;\n this.widgetId = window.turnstile.render(this.refs.turnstileWidget, {\n sitekey: siteKey,\n theme: this.component.theme || 'auto',\n size: this.component.size || 'normal',\n action: this.component.action || '',\n appearance: this.component.appearance || 'always',\n callback: function(token) {\n self.updateValue(token);\n self.triggerChange();\n },\n 'error-callback': function() {\n self.updateValue(null);\n self.setCustomValidity(self.component.errorMessage || 'Security verification failed');\n },\n 'expired-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification expired. Please verify again.');\n },\n 'timeout-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification timed out. Please try again.');\n }\n });\n } catch (err) {\n console.error('Failed to render Turnstile widget:', err);\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to render security verification\n
\n \\`;\n }\n }\n\n detach() {\n if (this.widgetId !== null && window.turnstile) {\n try {\n window.turnstile.remove(this.widgetId);\n this.widgetId = null;\n } catch (err) {\n console.error('Failed to remove Turnstile widget:', err);\n }\n }\n return super.detach();\n }\n\n getValue() {\n if (this.widgetId !== null && window.turnstile) {\n return window.turnstile.getResponse(this.widgetId);\n }\n return this.dataValue;\n }\n\n setValue(value, flags) {\n const changed = super.setValue(value, flags);\n return changed;\n }\n\n getValueAsString(value) {\n return value ? '✅ Verified' : '❌ Not Verified';\n }\n\n isEmpty(value) {\n return !value;\n }\n\n updateValue(value, flags) {\n const changed = super.updateValue(value, flags);\n \n if (value) {\n this.setCustomValidity('');\n }\n \n return changed;\n }\n\n checkValidity(data, dirty, row) {\n const result = super.checkValidity(data, dirty, row);\n \n if (this.component.validate && this.component.validate.required) {\n const value = this.getValue();\n if (!value) {\n this.setCustomValidity(this.component.errorMessage || 'Please complete the security verification');\n return false;\n }\n }\n \n return result;\n }\n }\n\n Formio.Components.addComponent('turnstile', TurnstileComponent);\n console.log('✅ Turnstile component registered with Form.io');\n window.TurnstileComponent = TurnstileComponent;\n })();\n `;\n}\n\nexport function renderFormBuilderPage(data: FormBuilderPageData): string {\n const formioSchema = data.formio_schema || { components: [] }\n const settings = data.settings || {}\n const googleMapsApiKey = data.google_maps_api_key || ''\n const turnstileSiteKey = data.turnstile_site_key || ''\n\n const pageContent = `\n \n\n
\n \n
\n
\n
\n \n \n \n \n \n
\n

\n Form Builder: ${data.display_name}\n

\n

\n \n ${data.name}\n \n

\n
\n
\n\n \n
\n \n \n \n \n \n Preview\n \n\n \n \n \n \n Save Form\n \n\n \n \n \n \n View Public Form\n \n\n \n \n \n \n View Submissions\n \n
\n
\n
\n\n \n
\n \n
\n \n \n \n \n Single Page\n \n \n \n \n \n Multi-Page Wizard\n \n
\n \n 💡 Use Panel components (Layout tab) for each page\n \n
\n\n \n
\n\n \n
\n
\n \n \n \n \n

Loading Form Builder...

\n
\n
\n\n \n
\n\n \n
\n
\n
\n

Form Preview

\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n\n \n \n\n \n\n \n \n \n \n \n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Form Builder: ${data.display_name}`,\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm } from '../components/form.template'\n\nexport interface FormCreatePageData {\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormCreatePage(data: FormCreatePageData): string {\n const pageContent = `\n
\n \n
\n
\n \n \n \n \n \n
\n

Create New Form

\n

Enter basic information to create your form. You'll be able to add fields in the builder.

\n
\n
\n
\n\n \n ${data.error ? `\n
\n
\n \n \n \n

${data.error}

\n
\n
\n ` : ''}\n\n ${data.success ? `\n
\n
\n \n \n \n

${data.success}

\n
\n
\n ` : ''}\n\n \n
\n
\n \n
\n \n
\n \n \n

\n Lowercase letters, numbers, and underscores only. Used in URLs and API.\n

\n
\n\n \n
\n \n \n

\n Human-readable name shown in the admin interface.\n

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n \n \n \n \n \n \n

\n Helps organize forms in the admin panel.\n

\n
\n
\n\n \n
\n \n Cancel\n \n \n \n \n \n Create & Open Builder\n \n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

What happens next?

\n
\n

After creating your form, you'll be taken to the Form Builder where you can:

\n
    \n
  • Drag and drop fields onto your form
  • \n
  • Configure field properties and validation
  • \n
  • Add conditional logic
  • \n
  • Preview your form in real-time
  • \n
  • Publish when ready
  • \n
\n
\n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create Form',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderFormsListPage } from '../templates/pages/admin-forms-list.template'\nimport { renderFormBuilderPage, type FormBuilderPageData } from '../templates/pages/admin-forms-builder.template'\nimport { renderFormCreatePage } from '../templates/pages/admin-forms-create.template'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\n\n// Type definitions for forms\ninterface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n updated_at: number\n formattedDate: string\n}\n\ninterface FormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n category?: string\n formio_schema?: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ninterface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminFormsRoutes.use('*', requireAuth())\n\n// Forms management - List all forms\nadminFormsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const category = c.req.query('category') || ''\n\n // Build query\n let query = 'SELECT * FROM forms WHERE 1=1'\n const params: string[] = []\n\n if (search) {\n query += ' AND (name LIKE ? OR display_name LIKE ?)'\n params.push(`%${search}%`, `%${search}%`)\n }\n\n if (category) {\n query += ' AND category = ?'\n params.push(category)\n }\n\n query += ' ORDER BY created_at DESC'\n\n const result = await db.prepare(query).bind(...params).all()\n\n // Format dates\n const forms = result.results.map((form: any) => ({\n ...form,\n formattedDate: new Date(form.created_at).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n }))\n\n const pageData: FormsListPageData = {\n forms,\n search,\n category,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsListPage(pageData))\n } catch (error: any) {\n console.error('Error listing forms:', error)\n return c.html('

Error loading forms

', 500)\n }\n})\n\n// Show create form page\nadminFormsRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n\n const pageData: FormData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormCreatePage(pageData))\n } catch (error: any) {\n console.error('Error showing create form page:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Show docs page\nadminFormsRoutes.get('/docs', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsDocsPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsDocsPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms docs page:', error)\n return c.html('

Error loading documentation

', 500)\n }\n})\n\n// Show examples page\nadminFormsRoutes.get('/examples', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsExamplesPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsExamplesPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms examples page:', error)\n return c.html('

Error loading examples

', 500)\n }\n})\n\n// Create new form\nadminFormsRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const name = body.name as string\n const displayName = body.displayName as string\n const description = (body.description as string) || ''\n const category = (body.category as string) || 'general'\n\n // Validate required fields\n if (!name || !displayName) {\n return c.json({ error: 'Name and display name are required' }, 400)\n }\n\n // Validate name format (lowercase, numbers, underscores only)\n if (!/^[a-z0-9_]+$/.test(name)) {\n return c.json({ \n error: 'Form name must contain only lowercase letters, numbers, and underscores' \n }, 400)\n }\n\n // Check for duplicate name\n const existing = await db.prepare('SELECT id FROM forms WHERE name = ?')\n .bind(name)\n .first()\n\n if (existing) {\n return c.json({ error: 'A form with this name already exists' }, 400)\n }\n\n // Create form with empty schema\n const formId = crypto.randomUUID()\n const now = Date.now()\n const emptySchema = { components: [] } // Empty Form.io schema\n\n await db.prepare(`\n INSERT INTO forms (\n id, name, display_name, description, category,\n formio_schema, settings, is_active, is_public,\n created_by, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n formId,\n name,\n displayName,\n description,\n category,\n JSON.stringify(emptySchema),\n JSON.stringify({\n submitButtonText: 'Submit',\n successMessage: 'Thank you for your submission!',\n requireAuth: false,\n emailNotifications: false\n }),\n 1, // is_active\n 1, // is_public\n user?.userId || null,\n now,\n now\n ).run()\n\n // Redirect to builder\n return c.redirect(`/admin/forms/${formId}/builder`)\n } catch (error: any) {\n console.error('Error creating form:', error)\n return c.json({ error: 'Failed to create form' }, 500)\n }\n})\n\n// Show form builder\nadminFormsRoutes.get('/:id/builder', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get Turnstile configuration\n const turnstileService = new TurnstileService(db)\n const turnstileSettings = await turnstileService.getSettings()\n\n const pageData: FormData = {\n id: form.id as string,\n name: form.name as string,\n display_name: form.display_name as string,\n description: form.description as string | undefined,\n category: form.category as string,\n formio_schema: form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] },\n settings: form.settings ? JSON.parse(form.settings as string) : {},\n is_active: Boolean(form.is_active),\n is_public: Boolean(form.is_public),\n google_maps_api_key: googleMapsApiKey,\n turnstile_site_key: turnstileSettings?.siteKey || '',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormBuilderPage(pageData as FormBuilderPageData))\n } catch (error: any) {\n console.error('Error showing form builder:', error)\n return c.html('

Error loading form builder

', 500)\n }\n})\n\n// Update form (save schema)\nadminFormsRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const body = await c.req.json()\n\n // Check if form exists\n const form = await db.prepare('SELECT id FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const now = Date.now()\n\n // Update form\n await db.prepare(`\n UPDATE forms \n SET formio_schema = ?, \n updated_by = ?, \n updated_at = ?\n WHERE id = ?\n `).bind(\n JSON.stringify(body.formio_schema),\n user?.userId || null,\n now,\n formId\n ).run()\n\n return c.json({ success: true, message: 'Form saved successfully' })\n } catch (error: any) {\n console.error('Error updating form:', error)\n return c.json({ error: 'Failed to save form' }, 500)\n }\n})\n\n// Delete form\nadminFormsRoutes.delete('/:id', async (c) => {\n try {\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Check if form exists\n const form = await db.prepare('SELECT id, submission_count FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Warn if form has submissions\n const submissionCount = form.submission_count as number || 0\n if (submissionCount > 0) {\n return c.json({ \n error: `Cannot delete form with ${submissionCount} submissions. Archive it instead.` \n }, 400)\n }\n\n // Delete form (cascade will delete submissions and files)\n await db.prepare('DELETE FROM forms WHERE id = ?').bind(formId).run()\n\n return c.json({ success: true, message: 'Form deleted successfully' })\n } catch (error: any) {\n console.error('Error deleting form:', error)\n return c.json({ error: 'Failed to delete form' }, 500)\n }\n})\n\n// View form submissions\nadminFormsRoutes.get('/:id/submissions', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get submissions\n const submissions = await db.prepare(\n 'SELECT * FROM form_submissions WHERE form_id = ? ORDER BY submitted_at DESC'\n ).bind(formId).all()\n\n // Simple submissions page for now\n const html = `\n \n \n \n Submissions - ${form.display_name}\n \n \n \n ← Back to Forms\n

Submissions: ${form.display_name}

\n

Total submissions: ${submissions.results.length}

\n ${submissions.results.length > 0 ? `\n \n \n \n \n \n \n \n \n \n ${submissions.results.map((sub: any) => `\n \n \n \n \n \n `).join('')}\n \n
IDSubmittedData
${sub.id.substring(0, 8)}${new Date(sub.submitted_at).toLocaleString()}
${JSON.stringify(JSON.parse(sub.submission_data), null, 2)}
\n ` : '

No submissions yet.

'}\n \n \n `\n \n return c.html(html)\n } catch (error: any) {\n console.error('Error loading submissions:', error)\n return c.html('

Error loading submissions

', 500)\n }\n})\n\nexport default adminFormsRoutes\n","import { Hono } from 'hono'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { createContentFromSubmission } from '../services/form-collection-sync'\n\n/**\n * Recursively sanitize all string values in arbitrary JSON data.\n * HTML-encodes entities (e.g., < becomes <) to prevent stored XSS\n * when form submission data is rendered in admin templates.\n */\nfunction sanitizeDeep(value: unknown): unknown {\n if (typeof value === 'string') {\n return sanitizeInput(value)\n }\n if (Array.isArray(value)) {\n return value.map(sanitizeDeep)\n }\n if (value !== null && typeof value === 'object') {\n const result: Record = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = sanitizeDeep(v)\n }\n return result\n }\n return value // numbers, booleans, null pass through\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const publicFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Get Turnstile configuration for a form (for headless frontends)\npublicFormsRoutes.get('/:identifier/turnstile-config', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form\n const form = await db.prepare(\n 'SELECT id, turnstile_enabled, turnstile_settings FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const turnstileService = new TurnstileService(db)\n const globalSettings = await turnstileService.getSettings()\n \n const formSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string)\n : { inherit: true }\n\n // Determine effective settings\n const enabled = form.turnstile_enabled === 1 || \n (formSettings.inherit && globalSettings?.enabled)\n\n if (!enabled || !globalSettings) {\n return c.json({ enabled: false })\n }\n\n return c.json({\n enabled: true,\n siteKey: formSettings.siteKey || globalSettings.siteKey,\n theme: formSettings.theme || globalSettings.theme || 'auto',\n size: formSettings.size || globalSettings.size || 'normal',\n mode: formSettings.mode || globalSettings.mode || 'managed',\n appearance: formSettings.appearance || globalSettings.appearance || 'always'\n })\n } catch (error: any) {\n console.error('Error fetching Turnstile config:', error)\n return c.json({ error: 'Failed to fetch config' }, 500)\n }\n})\n\n// Get form schema as JSON (for headless frontends)\npublicFormsRoutes.get('/:identifier/schema', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT id, name, display_name, description, category, formio_schema, settings, is_active, is_public FROM forms WHERE (id = ? OR name = ?) AND is_active = 1 AND is_public = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n return c.json({\n id: form.id,\n name: form.name,\n displayName: form.display_name,\n description: form.description,\n category: form.category,\n schema: formioSchema,\n settings: settings,\n submitUrl: `/api/forms/${form.id}/submit`\n })\n } catch (error: any) {\n console.error('Error fetching form schema:', error)\n return c.json({ error: 'Failed to fetch form schema' }, 500)\n }\n})\n\n// Render public form by name\npublicFormsRoutes.get('/:name', async (c) => {\n try {\n const db = c.env.DB\n const formName = c.req.param('name')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form by name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE name = ? AND is_active = 1 AND is_public = 1'\n ).bind(formName).first()\n\n if (!form) {\n return c.html('

Form not found

This form does not exist or is not publicly available.

', 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n const html = `\n \n \n \n \n \n ${form.display_name}\n \n \n \n \n \n \n \n
\n

${form.display_name}

\n ${form.description ? `

${form.description}

` : ''}\n \n
\n \n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n `\n\n return c.html(html)\n } catch (error: any) {\n console.error('Error rendering form:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Handle form submission (accepts either name or ID)\npublicFormsRoutes.post('/:identifier/submit', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n const body = await c.req.json()\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Check if Turnstile is enabled for this form\n const turnstileEnabled = form.turnstile_enabled === 1\n const turnstileSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string) \n : { inherit: true }\n\n // Validate Turnstile if enabled (or inheriting global settings)\n if (turnstileEnabled || turnstileSettings.inherit) {\n const turnstileService = new TurnstileService(db)\n \n // Check if Turnstile is globally enabled\n const globalEnabled = await turnstileService.isEnabled()\n \n if (globalEnabled || turnstileEnabled) {\n // Extract Turnstile token from submission data\n const turnstileToken = body.data?.turnstile || body.turnstile\n \n if (!turnstileToken) {\n return c.json({ \n error: 'Turnstile verification required. Please complete the security check.',\n code: 'TURNSTILE_MISSING'\n }, 400)\n }\n\n // Verify the token\n const clientIp = c.req.header('cf-connecting-ip')\n const verification = await turnstileService.verifyToken(turnstileToken, clientIp)\n \n if (!verification.success) {\n return c.json({ \n error: verification.error || 'Security verification failed. Please try again.',\n code: 'TURNSTILE_INVALID'\n }, 403)\n }\n\n // Remove Turnstile token from submission data before storing\n if (body.data?.turnstile) {\n delete body.data.turnstile\n }\n }\n }\n\n // Sanitize all string values in submission data to prevent stored XSS.\n // HTML-encodes entities (e.g., < becomes <) before storage.\n const sanitizedData = sanitizeDeep(body.data) as Record\n\n // Create submission\n const submissionId = crypto.randomUUID()\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO form_submissions (\n id, form_id, submission_data, user_id, ip_address, user_agent,\n submitted_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n submissionId,\n form.id,\n JSON.stringify(sanitizedData),\n null, // user_id (for authenticated users)\n c.req.header('cf-connecting-ip') || null,\n c.req.header('user-agent') || null,\n now,\n now\n ).run()\n\n // Update submission count\n await db.prepare(`\n UPDATE forms\n SET submission_count = submission_count + 1,\n updated_at = ?\n WHERE id = ?\n `).bind(now, form.id).run()\n\n // Dual-write: create content item for this submission\n let contentId: string | null = null\n try {\n contentId = await createContentFromSubmission(\n db,\n sanitizedData as Record,\n { id: form.id as string, name: form.name as string, display_name: form.display_name as string },\n submissionId,\n {\n ipAddress: c.req.header('cf-connecting-ip') || null,\n userAgent: c.req.header('user-agent') || null,\n userEmail: (sanitizedData as any)?.email || null,\n userId: null // anonymous submission\n }\n )\n if (!contentId) {\n console.warn('[FormSubmit] Content creation returned null for submission:', submissionId)\n }\n } catch (contentError) {\n // Don't fail the submission if content creation fails\n console.error('[FormSubmit] Error creating content from submission:', contentError)\n }\n\n return c.json({\n success: true,\n submissionId,\n contentId,\n message: 'Form submitted successfully'\n })\n } catch (error: any) {\n console.error('Error submitting form:', error)\n return c.json({ error: 'Failed to submit form' }, 500)\n }\n})\n\nexport default publicFormsRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { CATEGORY_INFO } from '../../services/route-metadata'\n\nexport interface APIEndpoint {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented?: boolean\n}\n\nexport interface APIReferencePageData {\n endpoints: APIEndpoint[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nfunction renderAuthBadge(auth: boolean | 'unknown'): string {\n if (auth === true) {\n return `\n \n \n \n \n Auth\n `\n }\n if (auth === false) {\n return `\n \n \n \n \n Public\n `\n }\n // unknown\n return `\n \n \n \n \n Unknown\n `\n}\n\nexport function renderAPIReferencePage(data: APIReferencePageData): string {\n // Group endpoints by category\n const endpointsByCategory = data.endpoints.reduce((acc, endpoint) => {\n if (!acc[endpoint.category]) {\n acc[endpoint.category] = []\n }\n acc[endpoint.category]!.push(endpoint)\n return acc\n }, {} as Record)\n\n // Get unique categories from actual data\n const categories = Object.keys(endpointsByCategory)\n\n // Count stats\n const totalEndpoints = data.endpoints.length\n const publicEndpoints = data.endpoints.filter(e => e.authentication === false).length\n const protectedEndpoints = data.endpoints.filter(e => e.authentication === true).length\n const undocumentedCount = data.endpoints.filter(e => e.documented === false).length\n\n const pageContent = `\n
\n \n
\n
\n

API Reference

\n

Auto-discovered documentation of all registered API endpoints

\n
\n \n
\n\n \n
\n
\n
Total Endpoints
\n
\n ${totalEndpoints}\n
\n
\n
\n
Public Endpoints
\n
\n ${publicEndpoints}\n
\n
\n
\n
Protected Endpoints
\n
\n ${protectedEndpoints}\n
\n
\n
\n
Categories
\n
\n ${categories.length}\n
\n
\n
\n
Undocumented
\n
\n 0 ? 'text-zinc-400 dark:text-zinc-500' : 'text-lime-600 dark:text-lime-400'}\">${undocumentedCount}\n
\n
\n
\n\n \n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n \n \n ${categories.map(category => {\n const info = CATEGORY_INFO[category]\n const title = info ? info.title : category\n return ``\n }).join('\\n ')}\n \n \n \n \n
\n
\n
\n
\n
\n\n \n
\n ${Object.entries(endpointsByCategory).map(([category, endpoints]) => {\n const info = CATEGORY_INFO[category] || { title: category, description: '', icon: '📋' }\n return `\n
\n
\n \n
\n
\n ${info.icon}\n
\n

${info.title}

\n

${info.description}

\n
\n
\n \n ${endpoints.length} endpoint${endpoints.length !== 1 ? 's' : ''}\n \n
\n
\n
\n\n \n
\n ${endpoints.map(endpoint => `\n
\n
\n \n ${endpoint.method}\n \n
\n
\n ${endpoint.path}\n ${renderAuthBadge(endpoint.authentication)}\n ${endpoint.documented === false ? `\n \n Auto-discovered\n \n ` : ''}\n
\n

${endpoint.description || 'No description available'}

\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n }).join('')}\n
\n\n \n
\n \n \n \n

No endpoints found

\n

Try adjusting your search or filter criteria

\n
\n
\n\n \n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'API Reference',\n pageTitle: 'API Reference',\n currentPath: '/admin/api-reference',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","/**\n * Admin API Reference Routes\n *\n * Provides the API Reference page for the admin dashboard.\n * Uses auto-discovery via Hono's inspectRoutes() to always show\n * the complete list of registered API endpoints.\n */\n\nimport { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderAPIReferencePage,\n type APIReferencePageData\n} from '../templates/pages/admin-api-reference.template'\nimport { getCoreVersion } from '../utils/version'\nimport { buildRouteList, getAppInstance } from '../services/route-metadata'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin/api-reference - API Reference Page\n *\n * Auto-discovers all registered routes using Hono's inspectRoutes()\n * and enriches them with metadata from the route-metadata registry.\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const app = getAppInstance()\n const endpoints = buildRouteList(app)\n\n const pageData: APIReferencePageData = {\n endpoints,\n user: user ? {\n name: user.email.split('@')[0] || user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n } catch (error) {\n console.error('API Reference page error:', error)\n\n const pageData: APIReferencePageData = {\n endpoints: [],\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n }\n})\n\nexport { router as adminApiReferenceRoutes }\n","/**\n * Routes Module Exports\n *\n * Routes are being migrated incrementally from the monolith.\n * Each route is refactored to remove monolith-specific dependencies.\n */\n\n// API routes\nexport { default as apiRoutes } from './api'\nexport { default as apiContentCrudRoutes } from './api-content-crud'\nexport { default as apiMediaRoutes } from './api-media'\nexport { default as apiSystemRoutes } from './api-system'\nexport { default as adminApiRoutes } from './admin-api'\n\n// Auth routes\nexport { default as authRoutes } from './auth'\n\n// Test routes (only for development/test environments)\nexport { default as testCleanupRoutes } from './test-cleanup'\n\n// Admin UI routes\nexport { default as adminContentRoutes } from './admin-content'\nexport { userRoutes as adminUsersRoutes } from './admin-users'\nexport { adminMediaRoutes } from './admin-media'\nexport { adminPluginRoutes } from './admin-plugins'\nexport { adminLogsRoutes } from './admin-logs'\nexport { adminDesignRoutes } from './admin-design'\nexport { adminCheckboxRoutes } from './admin-checkboxes'\nexport { default as adminTestimonialsRoutes } from './admin-testimonials'\nexport { default as adminCodeExamplesRoutes } from './admin-code-examples'\nexport { adminDashboardRoutes } from './admin-dashboard'\nexport { adminCollectionsRoutes } from './admin-collections'\nexport { adminSettingsRoutes } from './admin-settings'\nexport { adminFormsRoutes } from './admin-forms'\nexport { default as publicFormsRoutes } from './public-forms'\nexport { adminApiReferenceRoutes } from './admin-api-reference'\n\nexport const ROUTES_INFO = {\n message: 'Core routes available',\n available: [\n 'apiRoutes',\n 'apiContentCrudRoutes',\n 'apiMediaRoutes',\n 'apiSystemRoutes',\n 'adminApiRoutes',\n 'authRoutes',\n 'testCleanupRoutes',\n 'adminContentRoutes',\n 'adminUsersRoutes',\n 'adminMediaRoutes',\n 'adminPluginRoutes',\n 'adminLogsRoutes',\n 'adminDesignRoutes',\n 'adminCheckboxRoutes',\n 'adminTestimonialsRoutes',\n 'adminCodeExamplesRoutes',\n 'adminDashboardRoutes',\n 'adminCollectionsRoutes',\n 'adminSettingsRoutes',\n 'adminFormsRoutes',\n 'publicFormsRoutes',\n 'adminApiReferenceRoutes'\n ],\n status: 'Core package routes ready',\n reference: 'https://github.com/sonicjs/sonicjs'\n} as const\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-GQEIPW3L.js b/packages/core/dist/chunk-QFWHAFEO.js similarity index 99% rename from packages/core/dist/chunk-GQEIPW3L.js rename to packages/core/dist/chunk-QFWHAFEO.js index a60859459..7fc19e6e9 100644 --- a/packages/core/dist/chunk-GQEIPW3L.js +++ b/packages/core/dist/chunk-QFWHAFEO.js @@ -1839,5 +1839,5 @@ function buildRouteList(app) { } export { CACHE_CONFIGS, CATEGORY_INFO, CacheService, Logger, SettingsService, TelemetryService, apiTokens, buildRouteList, collections, content, contentVersions, createInstallationIdentity, getAppInstance, getCacheService, getLogger, getTelemetryService, initLogger, initTelemetry, insertCollectionSchema, insertContentSchema, insertLogConfigSchema, insertMediaSchema, insertPluginActivityLogSchema, insertPluginAssetSchema, insertPluginHookSchema, insertPluginRouteSchema, insertPluginSchema, insertSystemLogSchema, insertUserSchema, insertWorkflowHistorySchema, logConfig, media, pluginActivityLog, pluginAssets, pluginHooks, pluginRoutes, plugins, schema_exports, selectCollectionSchema, selectContentSchema, selectLogConfigSchema, selectMediaSchema, selectPluginActivityLogSchema, selectPluginAssetSchema, selectPluginHookSchema, selectPluginRouteSchema, selectPluginSchema, selectSystemLogSchema, selectUserSchema, selectWorkflowHistorySchema, setAppInstance, systemLogs, users, workflowHistory }; -//# sourceMappingURL=chunk-GQEIPW3L.js.map -//# sourceMappingURL=chunk-GQEIPW3L.js.map \ No newline at end of file +//# sourceMappingURL=chunk-QFWHAFEO.js.map +//# sourceMappingURL=chunk-QFWHAFEO.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-XWQVFWPW.cjs.map b/packages/core/dist/chunk-QFWHAFEO.js.map similarity index 53% rename from packages/core/dist/chunk-XWQVFWPW.cjs.map rename to packages/core/dist/chunk-QFWHAFEO.js.map index dd0120fba..c442b21a0 100644 --- a/packages/core/dist/chunk-XWQVFWPW.cjs.map +++ b/packages/core/dist/chunk-QFWHAFEO.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/db/schema.ts","../../../../../node_modules/src/constants.ts","../../../../../node_modules/src/utils.ts","../../../../../node_modules/src/column.ts","../../../../../node_modules/src/schema.ts","../src/services/logger.ts","../src/services/cache.ts","../src/services/settings.ts","../src/services/telemetry-service.ts","../src/services/route-metadata.ts"],"names":["__export","zod","z","integer","isTable","getTableColumns","getViewSelectedFields","is","Column","SQL","columns","isView","sqliteTable","text","drizzle","inArray","eq","like","gte","lte","and","count","asc","desc","getTelemetryConfig","sanitizeErrorMessage","sanitizeRoute","generateInstallationId","generateProjectId","inspectRoutes"],"mappings":"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","file":"chunk-XWQVFWPW.cjs","sourcesContent":["import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod';\n\n// Users table for authentication and user management\nexport const users = sqliteTable('users', {\n id: text('id').primaryKey(),\n email: text('email').notNull().unique(),\n username: text('username').notNull().unique(),\n firstName: text('first_name').notNull(),\n lastName: text('last_name').notNull(),\n passwordHash: text('password_hash'), // Hashed password, nullable for OAuth users\n role: text('role').notNull().default('viewer'), // 'admin', 'editor', 'author', 'viewer'\n avatar: text('avatar'),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n lastLoginAt: integer('last_login_at'),\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Content collections - dynamic schema definitions\nexport const collections = sqliteTable('collections', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n schema: text('schema', { mode: 'json' }).notNull(), // JSON schema definition\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false), // Config-managed collections cannot be edited in UI\n sourceType: text('source_type').default('user'), // 'user' (normal), 'form' (form-derived)\n sourceId: text('source_id'), // stores the form ID for form-derived collections\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content items - actual content data\nexport const content = sqliteTable('content', {\n id: text('id').primaryKey(),\n collectionId: text('collection_id').notNull().references(() => collections.id),\n slug: text('slug').notNull(),\n title: text('title').notNull(),\n data: text('data', { mode: 'json' }).notNull(), // JSON content data\n status: text('status').notNull().default('draft'), // 'draft', 'published', 'archived'\n publishedAt: integer('published_at', { mode: 'timestamp' }),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content versions for versioning system\nexport const contentVersions = sqliteTable('content_versions', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n version: integer('version').notNull(),\n data: text('data', { mode: 'json' }).notNull(),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Media/Files table\nexport const media = sqliteTable('media', {\n id: text('id').primaryKey(),\n filename: text('filename').notNull(),\n originalName: text('original_name').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n width: integer('width'),\n height: integer('height'),\n folder: text('folder').notNull().default('uploads'),\n r2Key: text('r2_key').notNull(), // R2 storage key\n publicUrl: text('public_url').notNull(), // CDN URL\n thumbnailUrl: text('thumbnail_url'),\n alt: text('alt'),\n caption: text('caption'),\n tags: text('tags', { mode: 'json' }), // JSON array of tags\n uploadedBy: text('uploaded_by').notNull().references(() => users.id),\n uploadedAt: integer('uploaded_at').notNull(),\n updatedAt: integer('updated_at'),\n publishedAt: integer('published_at'),\n scheduledAt: integer('scheduled_at'),\n archivedAt: integer('archived_at'),\n deletedAt: integer('deleted_at'),\n});\n\n// API tokens for programmatic access\nexport const apiTokens = sqliteTable('api_tokens', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n token: text('token').notNull().unique(),\n userId: text('user_id').notNull().references(() => users.id),\n permissions: text('permissions', { mode: 'json' }).notNull(), // Array of permissions\n expiresAt: integer('expires_at', { mode: 'timestamp' }),\n lastUsedAt: integer('last_used_at', { mode: 'timestamp' }),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n\n// Workflow history for content workflow tracking\nexport const workflowHistory = sqliteTable('workflow_history', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n action: text('action').notNull(),\n fromStatus: text('from_status').notNull(),\n toStatus: text('to_status').notNull(),\n userId: text('user_id').notNull().references(() => users.id),\n comment: text('comment'),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Plugin system tables\nexport const plugins = sqliteTable('plugins', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n version: text('version').notNull(),\n author: text('author').notNull(),\n category: text('category').notNull(),\n icon: text('icon'),\n status: text('status').notNull().default('inactive'), // 'active', 'inactive', 'error'\n isCore: integer('is_core', { mode: 'boolean' }).notNull().default(false),\n settings: text('settings', { mode: 'json' }),\n permissions: text('permissions', { mode: 'json' }),\n dependencies: text('dependencies', { mode: 'json' }),\n downloadCount: integer('download_count').notNull().default(0),\n rating: integer('rating').notNull().default(0),\n installedAt: integer('installed_at').notNull(),\n activatedAt: integer('activated_at'),\n lastUpdated: integer('last_updated').notNull(),\n errorMessage: text('error_message'),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n updatedAt: integer('updated_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginHooks = sqliteTable('plugin_hooks', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n hookName: text('hook_name').notNull(),\n handlerName: text('handler_name').notNull(),\n priority: integer('priority').notNull().default(10),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginRoutes = sqliteTable('plugin_routes', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n path: text('path').notNull(),\n method: text('method').notNull(),\n handlerName: text('handler_name').notNull(),\n middleware: text('middleware', { mode: 'json' }),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginAssets = sqliteTable('plugin_assets', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n assetType: text('asset_type').notNull(), // 'css', 'js', 'image', 'font'\n assetPath: text('asset_path').notNull(),\n loadOrder: integer('load_order').notNull().default(100),\n loadLocation: text('load_location').notNull().default('footer'), // 'header', 'footer'\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginActivityLog = sqliteTable('plugin_activity_log', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n action: text('action').notNull(),\n userId: text('user_id'),\n details: text('details', { mode: 'json' }),\n timestamp: integer('timestamp').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\n// Zod schemas for validation\nexport const insertUserSchema = createInsertSchema(users, {\n email: (schema: any) => schema.email(),\n firstName: (schema: any) => schema.min(1),\n lastName: (schema: any) => schema.min(1),\n username: (schema: any) => schema.min(3),\n});\n\nexport const selectUserSchema = createSelectSchema(users);\n\nexport const insertCollectionSchema = createInsertSchema(collections, {\n name: (schema: any) => schema.min(1).regex(/^[a-z0-9_]+$/, 'Collection name must be lowercase with underscores'),\n displayName: (schema: any) => schema.min(1),\n});\n\nexport const selectCollectionSchema = createSelectSchema(collections);\n\nexport const insertContentSchema = createInsertSchema(content, {\n slug: (schema: any) => schema.min(1).regex(/^[a-zA-Z0-9_-]+$/, 'Slug must contain only letters, numbers, underscores, and hyphens'),\n title: (schema: any) => schema.min(1),\n status: (schema: any) => schema,\n});\n\nexport const selectContentSchema = createSelectSchema(content);\n\nexport const insertMediaSchema = createInsertSchema(media, {\n filename: (schema: any) => schema.min(1),\n originalName: (schema: any) => schema.min(1),\n mimeType: (schema: any) => schema.min(1),\n size: (schema: any) => schema.positive(),\n r2Key: (schema: any) => schema.min(1),\n publicUrl: (schema: any) => schema.url(),\n folder: (schema: any) => schema.min(1),\n});\n\nexport const selectMediaSchema = createSelectSchema(media);\n\n\nexport const insertWorkflowHistorySchema = createInsertSchema(workflowHistory, {\n action: (schema: any) => schema.min(1),\n fromStatus: (schema: any) => schema.min(1),\n toStatus: (schema: any) => schema.min(1),\n});\n\nexport const selectWorkflowHistorySchema = createSelectSchema(workflowHistory);\n\nexport const insertPluginSchema = createInsertSchema(plugins, {\n name: (schema: any) => schema.min(1),\n displayName: (schema: any) => schema.min(1),\n version: (schema: any) => schema.min(1),\n author: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginSchema = createSelectSchema(plugins);\n\nexport const insertPluginHookSchema = createInsertSchema(pluginHooks, {\n hookName: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginHookSchema = createSelectSchema(pluginHooks);\n\nexport const insertPluginRouteSchema = createInsertSchema(pluginRoutes, {\n path: (schema: any) => schema.min(1),\n method: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginRouteSchema = createSelectSchema(pluginRoutes);\n\nexport const insertPluginAssetSchema = createInsertSchema(pluginAssets, {\n assetType: (schema: any) => schema.min(1),\n assetPath: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginAssetSchema = createSelectSchema(pluginAssets);\n\nexport const insertPluginActivityLogSchema = createInsertSchema(pluginActivityLog, {\n action: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginActivityLogSchema = createSelectSchema(pluginActivityLog);\n\n// System logs table for comprehensive logging\nexport const systemLogs = sqliteTable('system_logs', {\n id: text('id').primaryKey(),\n level: text('level').notNull(), // 'debug', 'info', 'warn', 'error', 'fatal'\n category: text('category').notNull(), // 'auth', 'api', 'workflow', 'plugin', 'media', 'system', etc.\n message: text('message').notNull(),\n data: text('data', { mode: 'json' }), // Additional structured data\n userId: text('user_id').references(() => users.id),\n sessionId: text('session_id'),\n requestId: text('request_id'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n method: text('method'), // HTTP method for API logs\n url: text('url'), // Request URL for API logs\n statusCode: integer('status_code'), // HTTP status code for API logs\n duration: integer('duration'), // Request duration in milliseconds\n stackTrace: text('stack_trace'), // Error stack trace for error logs\n tags: text('tags', { mode: 'json' }), // Array of tags for categorization\n source: text('source'), // Source component/module that generated the log\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Log configuration table\nexport const logConfig = sqliteTable('log_config', {\n id: text('id').primaryKey(),\n category: text('category').notNull().unique(),\n enabled: integer('enabled', { mode: 'boolean' }).notNull().default(true),\n level: text('level').notNull().default('info'), // minimum log level to store\n retention: integer('retention').notNull().default(30), // days to keep logs\n maxSize: integer('max_size').default(10000), // max number of logs per category\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Insert and select schemas for system logs\nexport const insertSystemLogSchema = createInsertSchema(systemLogs, {\n level: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n message: (schema: any) => schema.min(1),\n});\n\nexport const selectSystemLogSchema = createSelectSchema(systemLogs);\n\nexport const insertLogConfigSchema = createInsertSchema(logConfig, {\n category: (schema: any) => schema.min(1),\n level: (schema: any) => schema.min(1),\n});\n\nexport const selectLogConfigSchema = createSelectSchema(logConfig);\n\n// Type exports\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\nexport type Collection = typeof collections.$inferSelect;\nexport type NewCollection = typeof collections.$inferInsert;\nexport type Content = typeof content.$inferSelect;\nexport type NewContent = typeof content.$inferInsert;\nexport type Media = typeof media.$inferSelect;\nexport type NewMedia = typeof media.$inferInsert;\nexport type WorkflowHistory = typeof workflowHistory.$inferSelect;\nexport type NewWorkflowHistory = typeof workflowHistory.$inferInsert;\nexport type Plugin = typeof plugins.$inferSelect;\nexport type NewPlugin = typeof plugins.$inferInsert;\nexport type PluginHook = typeof pluginHooks.$inferSelect;\nexport type NewPluginHook = typeof pluginHooks.$inferInsert;\nexport type PluginRoute = typeof pluginRoutes.$inferSelect;\nexport type NewPluginRoute = typeof pluginRoutes.$inferInsert;\nexport type PluginAsset = typeof pluginAssets.$inferSelect;\nexport type NewPluginAsset = typeof pluginAssets.$inferInsert;\nexport type PluginActivityLog = typeof pluginActivityLog.$inferSelect;\nexport type NewPluginActivityLog = typeof pluginActivityLog.$inferInsert;\nexport type SystemLog = typeof systemLogs.$inferSelect;\nexport type NewSystemLog = typeof systemLogs.$inferInsert;\nexport type LogConfig = typeof logConfig.$inferSelect;\nexport type NewLogConfig = typeof logConfig.$inferInsert;\n\n// =====================================================\n// Security Audit Plugin Tables\n// =====================================================\n\nexport const securityEvents = sqliteTable('security_events', {\n id: text('id').primaryKey(),\n eventType: text('event_type').notNull(),\n severity: text('severity').notNull().default('info'),\n userId: text('user_id'),\n email: text('email'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n countryCode: text('country_code'),\n requestPath: text('request_path'),\n requestMethod: text('request_method'),\n details: text('details', { mode: 'json' }),\n fingerprint: text('fingerprint'),\n blocked: integer('blocked').notNull().default(0),\n createdAt: integer('created_at').notNull().$defaultFn(() => Date.now()),\n});\n\nexport const insertSecurityEventSchema = createInsertSchema(securityEvents, {\n eventType: (schema: any) => schema.min(1),\n severity: (schema: any) => schema.min(1),\n});\n\nexport const selectSecurityEventSchema = createSelectSchema(securityEvents);\n\nexport type SecurityEventRecord = typeof securityEvents.$inferSelect;\nexport type NewSecurityEventRecord = typeof securityEvents.$inferInsert;\n\n// =====================================================\n// Form.io Integration Tables\n// =====================================================\n\n// Forms table - stores Form.io form definitions\nexport const forms = sqliteTable('forms', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(), // Machine name (e.g., \"contact-form\")\n displayName: text('display_name').notNull(), // Human name (e.g., \"Contact Form\")\n description: text('description'),\n category: text('category').notNull().default('general'), // contact, survey, registration, etc.\n \n // Form.io schema (JSON)\n formioSchema: text('formio_schema', { mode: 'json' }).notNull(), // Complete Form.io JSON schema\n \n // Settings (JSON)\n settings: text('settings', { mode: 'json' }), // emailNotifications, successMessage, etc.\n \n // Status & Management\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n isPublic: integer('is_public', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false),\n \n // Metadata\n icon: text('icon'),\n color: text('color'),\n tags: text('tags', { mode: 'json' }), // JSON array\n \n // Stats\n submissionCount: integer('submission_count').notNull().default(0),\n viewCount: integer('view_count').notNull().default(0),\n \n // Ownership\n createdBy: text('created_by').references(() => users.id),\n updatedBy: text('updated_by').references(() => users.id),\n \n // Timestamps\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form submissions table\nexport const formSubmissions = sqliteTable('form_submissions', {\n id: text('id').primaryKey(),\n formId: text('form_id').notNull().references(() => forms.id, { onDelete: 'cascade' }),\n \n // Submission data\n submissionData: text('submission_data', { mode: 'json' }).notNull(), // The actual form data\n \n // Submission metadata\n status: text('status').notNull().default('pending'), // pending, reviewed, approved, rejected, spam\n submissionNumber: integer('submission_number'),\n \n // User information\n userId: text('user_id').references(() => users.id),\n userEmail: text('user_email'),\n \n // Tracking\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n referrer: text('referrer'),\n utmSource: text('utm_source'),\n utmMedium: text('utm_medium'),\n utmCampaign: text('utm_campaign'),\n \n // Review/Processing\n reviewedBy: text('reviewed_by').references(() => users.id),\n reviewedAt: integer('reviewed_at'),\n reviewNotes: text('review_notes'),\n \n // Flags\n isSpam: integer('is_spam', { mode: 'boolean' }).notNull().default(false),\n isArchived: integer('is_archived', { mode: 'boolean' }).notNull().default(false),\n\n // Content integration\n contentId: text('content_id').references(() => content.id), // Links submission to its content item\n\n // Timestamps\n submittedAt: integer('submitted_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form files table - links submissions to uploaded files\nexport const formFiles = sqliteTable('form_files', {\n id: text('id').primaryKey(),\n submissionId: text('submission_id').notNull().references(() => formSubmissions.id, { onDelete: 'cascade' }),\n mediaId: text('media_id').notNull().references(() => media.id, { onDelete: 'cascade' }),\n fieldName: text('field_name').notNull(), // Form field that uploaded this file\n uploadedAt: integer('uploaded_at').notNull(),\n});\n\n// Zod schemas for validation\nexport const insertFormSchema = createInsertSchema(forms);\nexport const selectFormSchema = createSelectSchema(forms);\nexport const insertFormSubmissionSchema = createInsertSchema(formSubmissions);\nexport const selectFormSubmissionSchema = createSelectSchema(formSubmissions);\nexport const insertFormFileSchema = createInsertSchema(formFiles);\nexport const selectFormFileSchema = createSelectSchema(formFiles);\n\n// TypeScript types\nexport type Form = typeof forms.$inferSelect;\nexport type NewForm = typeof forms.$inferInsert;\nexport type FormSubmission = typeof formSubmissions.$inferSelect;\nexport type NewFormSubmission = typeof formSubmissions.$inferInsert;\nexport type FormFile = typeof formFiles.$inferSelect;\nexport type NewFormFile = typeof formFiles.$inferInsert;",null,null,null,null,"import type { D1Database } from '@cloudflare/workers-types'\nimport { systemLogs, logConfig, type NewSystemLog, type LogConfig } from '../db/schema'\nimport { drizzle } from 'drizzle-orm/d1'\nimport { eq, and, gte, lte, desc, asc, count, like, inArray } from 'drizzle-orm'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal'\nexport type LogCategory = 'auth' | 'api' | 'workflow' | 'plugin' | 'media' | 'system' | 'security' | 'error'\n\nexport interface LogEntry {\n level: LogLevel\n category: LogCategory\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags?: string[]\n source?: string\n}\n\nexport interface LogFilter {\n level?: LogLevel[]\n category?: LogCategory[]\n userId?: string\n source?: string\n search?: string\n startDate?: Date\n endDate?: Date\n tags?: string[]\n limit?: number\n offset?: number\n sortBy?: 'created_at' | 'level' | 'category'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport class Logger {\n private db: ReturnType\n private enabled: boolean = true\n private configCache: Map = new Map()\n private lastConfigRefresh: number = 0\n private configRefreshInterval: number = 60000 // 1 minute\n\n constructor(database: D1Database) {\n this.db = drizzle(database)\n }\n\n /**\n * Log a debug message\n */\n async debug(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('debug', category, message, data, context)\n }\n\n /**\n * Log an info message\n */\n async info(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('info', category, message, data, context)\n }\n\n /**\n * Log a warning message\n */\n async warn(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('warn', category, message, data, context)\n }\n\n /**\n * Log an error message\n */\n async error(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('error', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log a fatal message\n */\n async fatal(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('fatal', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log an API request\n */\n async logRequest(\n method: string,\n url: string,\n statusCode: number,\n duration: number,\n context?: Partial\n ): Promise {\n const level: LogLevel = statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info'\n \n return this.log(level, 'api', `${method} ${url} - ${statusCode}`, {\n method,\n url,\n statusCode,\n duration\n }, {\n ...context,\n method,\n url,\n statusCode,\n duration\n })\n }\n\n /**\n * Log an authentication event\n */\n async logAuth(action: string, userId?: string, success: boolean = true, context?: Partial): Promise {\n const level: LogLevel = success ? 'info' : 'warn'\n \n return this.log(level, 'auth', `Authentication ${action}: ${success ? 'success' : 'failed'}`, {\n action,\n success,\n userId\n }, {\n ...context,\n userId,\n tags: ['authentication', action]\n })\n }\n\n /**\n * Log a security event\n */\n async logSecurity(event: string, severity: 'low' | 'medium' | 'high' | 'critical', context?: Partial): Promise {\n const level: LogLevel = severity === 'critical' ? 'fatal' : severity === 'high' ? 'error' : 'warn'\n \n return this.log(level, 'security', `Security event: ${event}`, {\n event,\n severity\n }, {\n ...context,\n tags: ['security', severity]\n })\n }\n\n /**\n * Core logging method\n */\n private async log(\n level: LogLevel,\n category: LogCategory,\n message: string,\n data?: any,\n context?: Partial\n ): Promise {\n if (!this.enabled) return\n\n try {\n // Check if logging is enabled for this category and level\n const config = await this.getConfig(category)\n if (!config || !config.enabled || !this.shouldLog(level, config.level)) {\n return\n }\n\n const logEntry: NewSystemLog = {\n id: crypto.randomUUID(),\n level,\n category,\n message,\n data: data ? JSON.stringify(data) : null,\n userId: context?.userId || null,\n sessionId: context?.sessionId || null,\n requestId: context?.requestId || null,\n ipAddress: context?.ipAddress || null,\n userAgent: context?.userAgent || null,\n method: context?.method || null,\n url: context?.url || null,\n statusCode: context?.statusCode || null,\n duration: context?.duration || null,\n stackTrace: context?.stackTrace || null,\n tags: context?.tags ? JSON.stringify(context.tags) : null,\n source: context?.source || null,\n createdAt: new Date()\n }\n\n await this.db.insert(systemLogs).values(logEntry)\n\n // Check if we need to clean up old logs\n if (config.maxSize) {\n await this.cleanupCategory(category, config.maxSize)\n }\n\n } catch (error) {\n // Don't log errors in the logger to avoid infinite loops\n console.error('Logger error:', error)\n }\n }\n\n /**\n * Get logs with filtering and pagination\n */\n async getLogs(filter: LogFilter = {}): Promise<{ logs: any[], total: number }> {\n try {\n const conditions = []\n \n if (filter.level && filter.level.length > 0) {\n conditions.push(inArray(systemLogs.level, filter.level))\n }\n \n if (filter.category && filter.category.length > 0) {\n conditions.push(inArray(systemLogs.category, filter.category))\n }\n \n if (filter.userId) {\n conditions.push(eq(systemLogs.userId, filter.userId))\n }\n \n if (filter.source) {\n conditions.push(eq(systemLogs.source, filter.source))\n }\n \n if (filter.search) {\n conditions.push(\n like(systemLogs.message, `%${filter.search}%`)\n )\n }\n \n if (filter.startDate) {\n conditions.push(gte(systemLogs.createdAt, filter.startDate))\n }\n \n if (filter.endDate) {\n conditions.push(lte(systemLogs.createdAt, filter.endDate))\n }\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined\n\n // Get total count\n const totalResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(whereClause)\n\n const total = totalResult[0]?.count || 0\n\n // Get logs with pagination and sorting\n const sortColumn = filter.sortBy === 'level' ? systemLogs.level :\n filter.sortBy === 'category' ? systemLogs.category :\n systemLogs.createdAt\n\n const sortFn = filter.sortOrder === 'asc' ? asc : desc\n\n const logs = await this.db\n .select()\n .from(systemLogs)\n .where(whereClause)\n .orderBy(sortFn(sortColumn))\n .limit(filter.limit || 50)\n .offset(filter.offset || 0)\n\n return { logs, total }\n } catch (error) {\n console.error('Error getting logs:', error)\n return { logs: [], total: 0 }\n }\n }\n\n /**\n * Get log configuration for a category\n */\n private async getConfig(category: LogCategory): Promise {\n try {\n // Check cache first\n const now = Date.now()\n if (this.configCache.has(category) && (now - this.lastConfigRefresh) < this.configRefreshInterval) {\n return this.configCache.get(category) || null\n }\n\n // Refresh config from database\n const configs = await this.db\n .select()\n .from(logConfig)\n .where(eq(logConfig.category, category))\n\n const config = configs[0] || null\n \n if (config) {\n this.configCache.set(category, config)\n this.lastConfigRefresh = now\n }\n\n return config\n } catch (error) {\n console.error('Error getting log config:', error)\n return null\n }\n }\n\n /**\n * Update log configuration\n */\n async updateConfig(category: LogCategory, updates: Partial): Promise {\n try {\n await this.db\n .update(logConfig)\n .set({\n ...updates,\n updatedAt: new Date()\n })\n .where(eq(logConfig.category, category))\n\n // Clear cache for this category\n this.configCache.delete(category)\n } catch (error) {\n console.error('Error updating log config:', error)\n }\n }\n\n /**\n * Get all log configurations\n */\n async getAllConfigs(): Promise {\n try {\n return await this.db.select().from(logConfig)\n } catch (error) {\n console.error('Error getting log configs:', error)\n return []\n }\n }\n\n /**\n * Clean up old logs for a category\n */\n private async cleanupCategory(category: LogCategory, maxSize: number): Promise {\n try {\n // Count current logs for this category\n const countResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n\n const currentCount = countResult[0]?.count || 0\n\n if (currentCount > maxSize) {\n // Get the cutoff date (keep newest maxSize logs)\n const cutoffLogs = await this.db\n .select({ createdAt: systemLogs.createdAt })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n .orderBy(desc(systemLogs.createdAt))\n .limit(1)\n .offset(maxSize - 1)\n\n if (cutoffLogs[0]) {\n // Delete older logs\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, category),\n lte(systemLogs.createdAt, cutoffLogs[0].createdAt)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n }\n }\n\n /**\n * Clean up logs based on retention policy\n */\n async cleanupByRetention(): Promise {\n try {\n const configs = await this.getAllConfigs()\n \n for (const config of configs) {\n if (config.retention > 0) {\n const cutoffDate = new Date()\n cutoffDate.setDate(cutoffDate.getDate() - config.retention)\n\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, config.category),\n lte(systemLogs.createdAt, cutoffDate)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs by retention:', error)\n }\n }\n\n /**\n * Check if a log level should be recorded based on configuration\n */\n private shouldLog(level: LogLevel, configLevel: string): boolean {\n const levels = ['debug', 'info', 'warn', 'error', 'fatal']\n const levelIndex = levels.indexOf(level)\n const configLevelIndex = levels.indexOf(configLevel)\n \n return levelIndex >= configLevelIndex\n }\n\n /**\n * Enable or disable logging\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton logger instance\nlet loggerInstance: Logger | null = null\n\n/**\n * Get the logger instance\n */\nexport function getLogger(database?: D1Database): Logger {\n if (!loggerInstance && database) {\n loggerInstance = new Logger(database)\n }\n \n if (!loggerInstance) {\n throw new Error('Logger not initialized. Call getLogger with a database instance first.')\n }\n \n return loggerInstance\n}\n\n/**\n * Initialize the logger with a database\n */\nexport function initLogger(database: D1Database): Logger {\n loggerInstance = new Logger(database)\n return loggerInstance\n}","/**\n * Simple Cache Service\n *\n * Provides basic caching functionality for the core package\n * Can be extended with KV or other storage backends\n */\n\nexport interface CacheConfig {\n ttl: number // Time to live in seconds\n keyPrefix: string\n}\n\nexport class CacheService {\n private config: CacheConfig\n private memoryCache: Map = new Map()\n\n constructor(config: CacheConfig) {\n this.config = config\n }\n\n /**\n * Generate cache key with prefix\n */\n generateKey(type: string, identifier?: string): string {\n const parts = [this.config.keyPrefix, type]\n if (identifier) {\n parts.push(identifier)\n }\n return parts.join(':')\n }\n\n /**\n * Get value from cache\n */\n async get(key: string): Promise {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return null\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return null\n }\n\n return cached.value as T\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise<{\n hit: boolean\n data: T | null\n source: string\n ttl?: number\n }> {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return {\n hit: false,\n data: null,\n source: 'none'\n }\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return {\n hit: false,\n data: null,\n source: 'expired'\n }\n }\n\n return {\n hit: true,\n data: cached.value as T,\n source: 'memory',\n ttl: (cached.expires - Date.now()) / 1000 // TTL in seconds\n }\n }\n\n /**\n * Set value in cache\n */\n async set(key: string, value: any, ttl?: number): Promise {\n const expires = Date.now() + ((ttl || this.config.ttl) * 1000)\n this.memoryCache.set(key, { value, expires })\n }\n\n /**\n * Delete specific key from cache\n */\n async delete(key: string): Promise {\n this.memoryCache.delete(key)\n }\n\n /**\n * Invalidate cache keys matching a pattern\n * For memory cache, we do simple string matching\n */\n async invalidate(pattern: string): Promise {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.')\n const regex = new RegExp(`^${regexPattern}$`)\n\n // Find and delete matching keys\n for (const key of this.memoryCache.keys()) {\n if (regex.test(key)) {\n this.memoryCache.delete(key)\n }\n }\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise {\n this.memoryCache.clear()\n }\n\n /**\n * Get value from cache or set it using a callback\n */\n async getOrSet(key: string, callback: () => Promise, ttl?: number): Promise {\n const cached = await this.get(key)\n\n if (cached !== null) {\n return cached\n }\n\n const value = await callback()\n await this.set(key, value, ttl)\n return value\n }\n}\n\n/**\n * Cache configurations for different data types\n */\nexport const CACHE_CONFIGS = {\n api: {\n ttl: 300, // 5 minutes\n keyPrefix: 'api'\n },\n user: {\n ttl: 600, // 10 minutes\n keyPrefix: 'user'\n },\n content: {\n ttl: 300, // 5 minutes\n keyPrefix: 'content'\n },\n collection: {\n ttl: 600, // 10 minutes\n keyPrefix: 'collection'\n }\n}\n\n/**\n * Get cache service instance for a config\n */\nexport function getCacheService(config: CacheConfig): CacheService {\n return new CacheService(config)\n}\n","export interface Setting {\n id: string\n category: string\n key: string\n value: string // JSON string\n created_at: number\n updated_at: number\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface SecuritySettings {\n jwtExpiresIn: string\n jwtRefreshGraceSeconds: number\n}\n\nexport class SettingsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get a setting value by category and key\n */\n async getSetting(category: string, key: string): Promise {\n try {\n const result = await this.db\n .prepare('SELECT value FROM settings WHERE category = ? AND key = ?')\n .bind(category, key)\n .first()\n\n if (!result) {\n return null\n }\n\n return JSON.parse((result as any).value)\n } catch (error) {\n console.error(`Error getting setting ${category}.${key}:`, error)\n return null\n }\n }\n\n /**\n * Get all settings for a category\n */\n async getCategorySettings(category: string): Promise> {\n try {\n const { results } = await this.db\n .prepare('SELECT key, value FROM settings WHERE category = ?')\n .bind(category)\n .all()\n\n const settings: Record = {}\n for (const row of results || []) {\n const r = row as any\n settings[r.key] = JSON.parse(r.value)\n }\n\n return settings\n } catch (error) {\n console.error(`Error getting category settings for ${category}:`, error)\n return {}\n }\n }\n\n /**\n * Set a setting value\n */\n async setSetting(category: string, key: string, value: any): Promise {\n try {\n const now = Date.now()\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n\n return true\n } catch (error) {\n console.error(`Error setting ${category}.${key}:`, error)\n return false\n }\n }\n\n /**\n * Set multiple settings at once\n */\n async setMultipleSettings(category: string, settings: Record): Promise {\n try {\n const now = Date.now()\n\n // Use a transaction-like approach with batch operations\n for (const [key, value] of Object.entries(settings)) {\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n }\n\n return true\n } catch (error) {\n console.error(`Error setting multiple settings for ${category}:`, error)\n return false\n }\n }\n\n /**\n * Get general settings with defaults\n */\n async getGeneralSettings(userEmail?: string): Promise {\n const settings = await this.getCategorySettings('general')\n\n return {\n siteName: settings.siteName || 'SonicJS AI',\n siteDescription: settings.siteDescription || 'A modern headless CMS powered by AI',\n adminEmail: settings.adminEmail || userEmail || 'admin@example.com',\n timezone: settings.timezone || 'UTC',\n language: settings.language || 'en',\n maintenanceMode: settings.maintenanceMode || false\n }\n }\n\n /**\n * Save general settings\n */\n async saveGeneralSettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.siteName !== undefined) settingsToSave.siteName = settings.siteName\n if (settings.siteDescription !== undefined) settingsToSave.siteDescription = settings.siteDescription\n if (settings.adminEmail !== undefined) settingsToSave.adminEmail = settings.adminEmail\n if (settings.timezone !== undefined) settingsToSave.timezone = settings.timezone\n if (settings.language !== undefined) settingsToSave.language = settings.language\n if (settings.maintenanceMode !== undefined) settingsToSave.maintenanceMode = settings.maintenanceMode\n\n return await this.setMultipleSettings('general', settingsToSave)\n }\n\n /**\n * Get security settings with defaults\n */\n async getSecuritySettings(): Promise {\n const settings = await this.getCategorySettings('security')\n\n return {\n jwtExpiresIn: settings.jwtExpiresIn || '30d',\n jwtRefreshGraceSeconds:\n typeof settings.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n }\n }\n\n /**\n * Save security settings\n */\n async saveSecuritySettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.jwtExpiresIn !== undefined) settingsToSave.jwtExpiresIn = settings.jwtExpiresIn\n if (settings.jwtRefreshGraceSeconds !== undefined)\n settingsToSave.jwtRefreshGraceSeconds = settings.jwtRefreshGraceSeconds\n\n return await this.setMultipleSettings('security', settingsToSave)\n }\n}\n","/**\n * Telemetry Service\n *\n * Privacy-first telemetry service using custom SonicJS stats endpoint\n * - No PII collection\n * - Opt-out by default\n * - Silent failures (never blocks app)\n */\n\nimport type { TelemetryEvent, TelemetryProperties, TelemetryConfig, TelemetryIdentity } from '../types/telemetry'\nimport { getTelemetryConfig } from '../utils/telemetry-config'\nimport { generateInstallationId, generateProjectId, sanitizeErrorMessage, sanitizeRoute } from '../utils/telemetry-id'\n\n/**\n * TelemetryService class\n *\n * Handles all telemetry tracking in a privacy-conscious way\n */\nexport class TelemetryService {\n private config: TelemetryConfig\n private identity: TelemetryIdentity | null = null\n private enabled: boolean = true\n private eventQueue: Array<{ event: TelemetryEvent; properties?: TelemetryProperties }> = []\n private isInitialized: boolean = false\n\n constructor(config?: Partial) {\n this.config = {\n ...getTelemetryConfig(),\n ...config\n }\n this.enabled = this.config.enabled\n }\n\n /**\n * Initialize the telemetry service\n */\n async initialize(identity: TelemetryIdentity): Promise {\n if (!this.enabled) {\n if (this.config.debug) {\n console.log('[Telemetry] Disabled via configuration')\n }\n return\n }\n\n try {\n this.identity = identity\n\n if (this.config.debug) {\n console.log('[Telemetry] Initialized with installation ID:', identity.installationId)\n }\n\n this.isInitialized = true\n\n // Flush any queued events\n await this.flushQueue()\n\n } catch (error) {\n // Silent fail - telemetry should never break the app\n if (this.config.debug) {\n console.error('[Telemetry] Initialization failed:', error)\n }\n this.enabled = false\n }\n }\n\n /**\n * Track a telemetry event\n */\n async track(event: TelemetryEvent, properties?: TelemetryProperties): Promise {\n if (!this.enabled) return\n\n try {\n // Sanitize properties\n const sanitizedProps = this.sanitizeProperties(properties)\n\n // Add standard properties\n const enrichedProps = {\n ...sanitizedProps,\n timestamp: new Date().toISOString(),\n version: this.getVersion()\n }\n\n // If not initialized, queue the event\n if (!this.isInitialized) {\n this.eventQueue.push({ event, properties: enrichedProps })\n if (this.config.debug) {\n console.log('[Telemetry] Queued event:', event, enrichedProps)\n }\n return\n }\n\n // Send to custom SonicJS stats endpoint\n if (this.identity && this.config.host) {\n const payload = {\n data: {\n installation_id: this.identity.installationId,\n event_type: event,\n properties: enrichedProps,\n timestamp: enrichedProps.timestamp\n }\n }\n\n // Fire and forget - don't block on response\n fetch(`${this.config.host}/v1/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload)\n }).catch(() => {}) // Silent fail\n\n if (this.config.debug) {\n console.log('[Telemetry] Tracked event:', event, enrichedProps)\n }\n } else if (this.config.debug) {\n console.log('[Telemetry] Event (no endpoint):', event, enrichedProps)\n }\n\n } catch (error) {\n // Silent fail\n if (this.config.debug) {\n console.error('[Telemetry] Failed to track event:', error)\n }\n }\n }\n\n /**\n * Track installation started\n */\n async trackInstallationStarted(properties?: TelemetryProperties): Promise {\n await this.track('installation_started', properties)\n }\n\n /**\n * Track installation completed\n */\n async trackInstallationCompleted(properties?: TelemetryProperties): Promise {\n await this.track('installation_completed', properties)\n }\n\n /**\n * Track installation failed\n */\n async trackInstallationFailed(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('installation_failed', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track dev server started\n */\n async trackDevServerStarted(properties?: TelemetryProperties): Promise {\n await this.track('dev_server_started', properties)\n }\n\n /**\n * Track page view in admin UI\n */\n async trackPageView(route: string, properties?: TelemetryProperties): Promise {\n await this.track('page_viewed', {\n ...properties,\n route: sanitizeRoute(route)\n })\n }\n\n /**\n * Track error (sanitized)\n */\n async trackError(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('error_occurred', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track plugin activation\n */\n async trackPluginActivated(properties?: TelemetryProperties): Promise {\n await this.track('plugin_activated', properties)\n }\n\n /**\n * Track migration run\n */\n async trackMigrationRun(properties?: TelemetryProperties): Promise {\n await this.track('migration_run', properties)\n }\n\n /**\n * Flush queued events\n */\n private async flushQueue(): Promise {\n if (this.eventQueue.length === 0) return\n\n const queue = [...this.eventQueue]\n this.eventQueue = []\n\n for (const { event, properties } of queue) {\n await this.track(event, properties)\n }\n }\n\n /**\n * Sanitize properties to ensure no PII\n */\n private sanitizeProperties(properties?: TelemetryProperties): TelemetryProperties {\n if (!properties) return {}\n\n const sanitized: TelemetryProperties = {}\n\n for (const [key, value] of Object.entries(properties)) {\n // Skip undefined values\n if (value === undefined) continue\n\n // Sanitize routes\n if (key === 'route' && typeof value === 'string') {\n sanitized[key] = sanitizeRoute(value)\n continue\n }\n\n // Sanitize error messages\n if (key.toLowerCase().includes('error') && typeof value === 'string') {\n sanitized[key] = sanitizeErrorMessage(value)\n continue\n }\n\n // Only allow specific types\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n sanitized[key] = value\n }\n }\n\n return sanitized\n }\n\n /**\n * Get SonicJS version\n */\n private getVersion(): string {\n try {\n // Safe environment access for Cloudflare Workers compatibility\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SONICJS_VERSION || '2.0.0'\n }\n return '2.0.0'\n } catch {\n return 'unknown'\n }\n }\n\n /**\n * Shutdown the telemetry service (no-op for fetch-based telemetry)\n */\n async shutdown(): Promise {\n // No-op - fetch requests are fire and forget\n }\n\n /**\n * Enable telemetry\n */\n enable(): void {\n this.enabled = true\n }\n\n /**\n * Disable telemetry\n */\n disable(): void {\n this.enabled = false\n }\n\n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton instance\nlet telemetryInstance: TelemetryService | null = null\n\n/**\n * Get the telemetry service instance\n */\nexport function getTelemetryService(config?: Partial): TelemetryService {\n if (!telemetryInstance) {\n telemetryInstance = new TelemetryService(config)\n }\n return telemetryInstance\n}\n\n/**\n * Initialize telemetry service\n */\nexport async function initTelemetry(identity: TelemetryIdentity, config?: Partial): Promise {\n const service = getTelemetryService(config)\n await service.initialize(identity)\n return service\n}\n\n/**\n * Create a new installation identity\n */\nexport function createInstallationIdentity(projectName?: string): TelemetryIdentity {\n const installationId = generateInstallationId()\n const identity: TelemetryIdentity = { installationId }\n\n if (projectName) {\n // Generate anonymous project ID\n identity.projectId = generateProjectId(projectName)\n }\n\n return identity\n}\n","/**\n * Route Metadata Service\n *\n * Auto-discovers API routes using Hono's inspectRoutes() and enriches them\n * with metadata from a static registry. Routes without metadata still appear\n * as \"auto-discovered\" — nothing is ever invisible.\n */\n\nimport { inspectRoutes } from 'hono/dev'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RouteMetadata {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented: boolean\n}\n\ninterface RouteMeta {\n description: string\n authentication: boolean\n category: string\n}\n\nexport interface CategoryInfo {\n title: string\n description: string\n icon: string\n}\n\n// ============================================================================\n// App Instance Storage\n// ============================================================================\n\nlet appInstance: any = null\n\nexport function setAppInstance(app: any): void {\n appInstance = app\n}\n\nexport function getAppInstance(): any {\n return appInstance\n}\n\n// ============================================================================\n// Category Information\n// ============================================================================\n\nexport const CATEGORY_INFO: Record = {\n 'Auth': {\n title: 'Authentication',\n description: 'User authentication and authorization endpoints',\n icon: '🔐'\n },\n 'Content': {\n title: 'Content Management',\n description: 'Content creation, retrieval, and management',\n icon: '📝'\n },\n 'Media': {\n title: 'Media Management',\n description: 'File upload, storage, and media operations',\n icon: '🖼️'\n },\n 'Admin': {\n title: 'Admin Interface',\n description: 'Administrative panel and management features',\n icon: '⚙️'\n },\n 'System': {\n title: 'System',\n description: 'Health checks and system information',\n icon: '🔧'\n },\n 'Search': {\n title: 'Search',\n description: 'AI-powered search, full-text search, and analytics',\n icon: '🔍'\n },\n 'API Keys': {\n title: 'API Keys',\n description: 'API key management and authentication',\n icon: '🔑'\n },\n 'Workflow': {\n title: 'Workflow',\n description: 'Content workflow and approval processes',\n icon: '🔄'\n },\n 'Cache': {\n title: 'Cache',\n description: 'Cache management and invalidation',\n icon: '⚡'\n },\n 'Forms': {\n title: 'Forms',\n description: 'Form submissions and management',\n icon: '📋'\n },\n 'Files': {\n title: 'Files',\n description: 'File serving from R2 storage',\n icon: '📁'\n }\n}\n\n// ============================================================================\n// Route Metadata Registry\n// ============================================================================\n\nconst ROUTE_METADATA: Record = {\n // Auth endpoints\n 'POST /auth/login': { description: 'Authenticate user with email and password (returns JWT)', category: 'Auth', authentication: false },\n 'POST /auth/login/form': { description: 'Form-based login (sets session cookie)', category: 'Auth', authentication: false },\n 'POST /auth/register': { description: 'Register a new user account', category: 'Auth', authentication: false },\n 'POST /auth/logout': { description: 'Log out the current user and invalidate session', category: 'Auth', authentication: true },\n 'GET /auth/me': { description: 'Get current authenticated user information', category: 'Auth', authentication: true },\n 'POST /auth/refresh': { description: 'Refresh authentication token', category: 'Auth', authentication: true },\n 'POST /auth/seed-admin': { description: 'Create or reset the admin user account', category: 'Auth', authentication: false },\n 'POST /auth/magic-link/request': { description: 'Request a magic link login email', category: 'Auth', authentication: false },\n 'GET /auth/magic-link/verify': { description: 'Verify magic link token and authenticate', category: 'Auth', authentication: false },\n 'POST /auth/otp/request': { description: 'Request a one-time password via email', category: 'Auth', authentication: false },\n 'POST /auth/otp/verify': { description: 'Verify OTP code and authenticate', category: 'Auth', authentication: false },\n\n // Content endpoints\n 'GET /api/collections': { description: 'List all available collections', category: 'Content', authentication: false },\n 'GET /api/collections/:collection/content': { description: 'Get all content items from a specific collection', category: 'Content', authentication: false },\n 'GET /api/content/:id': { description: 'Get a specific content item by ID', category: 'Content', authentication: false },\n 'POST /api/content': { description: 'Create a new content item', category: 'Content', authentication: true },\n 'PUT /api/content/:id': { description: 'Update an existing content item', category: 'Content', authentication: true },\n 'DELETE /api/content/:id': { description: 'Delete a content item', category: 'Content', authentication: true },\n 'GET /api/content/:id/versions': { description: 'Get version history for a content item', category: 'Content', authentication: true },\n 'POST /api/content/:id/restore/:versionId': { description: 'Restore a content item to a previous version', category: 'Content', authentication: true },\n\n // Media endpoints\n 'GET /api/media': { description: 'List all media files with pagination', category: 'Media', authentication: false },\n 'GET /api/media/:id': { description: 'Get a specific media file by ID', category: 'Media', authentication: false },\n 'POST /api/media/upload': { description: 'Upload a new media file to R2 storage', category: 'Media', authentication: true },\n 'DELETE /api/media/:id': { description: 'Delete a media file from storage', category: 'Media', authentication: true },\n\n // Admin API endpoints\n 'GET /admin/api/stats': { description: 'Get dashboard statistics (collections, content, media, users)', category: 'Admin', authentication: true },\n 'GET /admin/api/storage': { description: 'Get storage usage information', category: 'Admin', authentication: true },\n 'GET /admin/api/activity': { description: 'Get recent activity logs', category: 'Admin', authentication: true },\n 'GET /admin/api/collections': { description: 'List all collections with field counts', category: 'Admin', authentication: true },\n 'POST /admin/api/collections': { description: 'Create a new collection', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id': { description: 'Get a specific collection with its fields', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id': { description: 'Update an existing collection', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id': { description: 'Delete a collection (must be empty)', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id/fields': { description: 'Get fields for a specific collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields': { description: 'Add a field to a collection', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id/fields/:fieldId': { description: 'Update a collection field', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id/fields/:fieldId': { description: 'Remove a field from a collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields/reorder': { description: 'Reorder fields in a collection', category: 'Admin', authentication: true },\n 'GET /admin/api/migrations/status': { description: 'Get database migration status', category: 'Admin', authentication: true },\n 'POST /admin/api/migrations/run': { description: 'Run pending database migrations', category: 'Admin', authentication: true },\n 'GET /admin/api/content': { description: 'List content items with filtering and pagination', category: 'Admin', authentication: true },\n 'GET /admin/api/content/:id': { description: 'Get a content item for admin editing', category: 'Admin', authentication: true },\n 'POST /admin/api/content': { description: 'Create content via admin API', category: 'Admin', authentication: true },\n 'PUT /admin/api/content/:id': { description: 'Update content via admin API', category: 'Admin', authentication: true },\n 'DELETE /admin/api/content/:id': { description: 'Delete content via admin API', category: 'Admin', authentication: true },\n 'GET /admin/api/media': { description: 'List media files for admin management', category: 'Admin', authentication: true },\n 'POST /admin/api/media/upload': { description: 'Upload media via admin interface', category: 'Admin', authentication: true },\n 'DELETE /admin/api/media/:id': { description: 'Delete media via admin interface', category: 'Admin', authentication: true },\n 'GET /admin/api/users': { description: 'List all users', category: 'Admin', authentication: true },\n 'POST /admin/api/users': { description: 'Create a new user', category: 'Admin', authentication: true },\n 'PUT /admin/api/users/:id': { description: 'Update a user', category: 'Admin', authentication: true },\n 'DELETE /admin/api/users/:id': { description: 'Delete a user', category: 'Admin', authentication: true },\n 'GET /admin/api/logs': { description: 'Get application logs with filtering', category: 'Admin', authentication: true },\n 'GET /admin/api/plugins': { description: 'List all registered plugins', category: 'Admin', authentication: true },\n 'POST /admin/api/plugins/:id/toggle': { description: 'Enable or disable a plugin', category: 'Admin', authentication: true },\n 'GET /admin/api/settings': { description: 'Get application settings', category: 'Admin', authentication: true },\n 'PUT /admin/api/settings': { description: 'Update application settings', category: 'Admin', authentication: true },\n 'GET /admin/api/forms': { description: 'List all forms', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id': { description: 'Get form details and submissions', category: 'Admin', authentication: true },\n 'POST /admin/api/forms': { description: 'Create a new form', category: 'Admin', authentication: true },\n 'PUT /admin/api/forms/:id': { description: 'Update a form', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id': { description: 'Delete a form', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id/submissions': { description: 'Get form submissions', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id/submissions/:submissionId': { description: 'Delete a form submission', category: 'Admin', authentication: true },\n\n // Search endpoints\n 'GET /api/search': { description: 'Search content using AI, FTS5, keyword, or hybrid mode', category: 'Search', authentication: false },\n 'POST /api/search/click': { description: 'Track a search result click for analytics', category: 'Search', authentication: false },\n 'GET /admin/plugins/ai-search/api/status': { description: 'Get search plugin status and configuration', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index': { description: 'Trigger content indexing for search', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index/reset': { description: 'Reset the search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics': { description: 'Get search analytics and metrics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/queries': { description: 'Get top search queries', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/clicks': { description: 'Get click-through analytics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/fts5/status': { description: 'Get FTS5 full-text search status', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/fts5/rebuild': { description: 'Rebuild the FTS5 search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/facets': { description: 'Get available search facets', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments': { description: 'List search A/B test experiments', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments': { description: 'Create a search A/B test experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id': { description: 'Get experiment details', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/experiments/:id': { description: 'Update an experiment', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/experiments/:id': { description: 'Delete an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/start': { description: 'Start an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/stop': { description: 'Stop a running experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id/results': { description: 'Get experiment results and statistics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality': { description: 'Get search quality agent analysis', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/run': { description: 'Run search quality analysis', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality/recommendations': { description: 'Get quality improvement recommendations', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/apply': { description: 'Apply a quality recommendation', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/dismiss': { description: 'Dismiss a quality recommendation', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/synonyms': { description: 'List search synonyms', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/synonyms': { description: 'Add a search synonym', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/synonyms/:id': { description: 'Delete a search synonym', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/query-rules': { description: 'List search query rules', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/query-rules': { description: 'Create a query rule', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/query-rules/:id': { description: 'Update a query rule', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/query-rules/:id': { description: 'Delete a query rule', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/settings': { description: 'Get search plugin settings', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/settings': { description: 'Update search plugin settings', category: 'Search', authentication: true },\n\n // API Key endpoints\n 'GET /admin/api-keys/api/keys': { description: 'List all API keys', category: 'API Keys', authentication: true },\n 'POST /admin/api-keys/api/keys': { description: 'Create a new API key', category: 'API Keys', authentication: true },\n 'DELETE /admin/api-keys/api/keys/:id': { description: 'Revoke an API key', category: 'API Keys', authentication: true },\n 'PUT /admin/api-keys/api/keys/:id': { description: 'Update an API key', category: 'API Keys', authentication: true },\n\n // Cache endpoints\n 'GET /admin/cache/api/stats': { description: 'Get cache statistics', category: 'Cache', authentication: true },\n 'POST /admin/cache/api/purge': { description: 'Purge cache entries', category: 'Cache', authentication: true },\n 'GET /admin/cache/api/entries': { description: 'List cache entries', category: 'Cache', authentication: true },\n 'DELETE /admin/cache/api/entries/:key': { description: 'Delete a specific cache entry', category: 'Cache', authentication: true },\n\n // Workflow endpoints\n 'GET /workflow/status/:id': { description: 'Get workflow status for a content item', category: 'Workflow', authentication: true },\n 'POST /workflow/submit/:id': { description: 'Submit content for review', category: 'Workflow', authentication: true },\n 'POST /workflow/approve/:id': { description: 'Approve content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/reject/:id': { description: 'Reject content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/publish/:id': { description: 'Publish approved content', category: 'Workflow', authentication: true },\n 'POST /workflow/unpublish/:id': { description: 'Unpublish content', category: 'Workflow', authentication: true },\n 'GET /workflow/history/:id': { description: 'Get workflow history for a content item', category: 'Workflow', authentication: true },\n\n // Form endpoints (public)\n 'POST /forms/:formId/submit': { description: 'Submit a form (public endpoint)', category: 'Forms', authentication: false },\n 'GET /forms/:formId': { description: 'Get form definition for rendering', category: 'Forms', authentication: false },\n 'POST /api/forms/:formId/submit': { description: 'Submit a form via API', category: 'Forms', authentication: false },\n 'GET /api/forms/:formId': { description: 'Get form definition via API', category: 'Forms', authentication: false },\n\n // System endpoints\n 'GET /health': { description: 'Health check endpoint for monitoring', category: 'System', authentication: false },\n 'GET /api/health': { description: 'API health check with schema information', category: 'System', authentication: false },\n 'GET /api': { description: 'API root - returns API information and available endpoints', category: 'System', authentication: false },\n 'GET /api/system/info': { description: 'Get system information and version', category: 'System', authentication: false },\n 'GET /api/system/schema': { description: 'Get database schema information', category: 'System', authentication: false },\n\n // File serving\n 'GET /files/*': { description: 'Serve files from R2 storage (public access)', category: 'Files', authentication: false },\n\n // Database tools\n 'POST /admin/database-tools/api/query': { description: 'Execute a database query', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables': { description: 'List database tables', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables/:name': { description: 'Get table schema and sample data', category: 'Admin', authentication: true },\n\n // Seed data\n 'POST /admin/seed-data/api/generate': { description: 'Generate seed data for development', category: 'Admin', authentication: true },\n 'GET /admin/seed-data/api/status': { description: 'Get seed data generation status', category: 'Admin', authentication: true },\n\n // Email plugin\n 'POST /admin/plugins/email/api/send': { description: 'Send an email', category: 'Admin', authentication: true },\n 'GET /admin/plugins/email/api/templates': { description: 'List email templates', category: 'Admin', authentication: true },\n 'POST /admin/plugins/email/api/test': { description: 'Send a test email', category: 'Admin', authentication: true },\n}\n\n// ============================================================================\n// Whitelist Patterns for API routes\n// ============================================================================\n\nconst INCLUDED_ROUTE_PATTERNS: RegExp[] = [\n /^\\/api\\//, // All /api/* routes\n /^\\/api$/, // API root\n /^\\/auth\\/(?!login$|register$)/, // Auth routes except GET login/register HTML pages\n /^\\/auth\\/login$/, // POST /auth/login (method filtered later)\n /^\\/auth\\/register$/, // POST /auth/register (method filtered later)\n /^\\/admin\\/api\\//, // Admin API endpoints\n /^\\/admin\\/api-keys\\/api\\//, // API key management\n /^\\/admin\\/cache\\/api\\//, // Cache management API\n /^\\/admin\\/plugins\\/.*\\/api\\//, // Plugin API endpoints\n /^\\/admin\\/database-tools\\/api\\//, // Database tools API\n /^\\/admin\\/seed-data\\/api\\//, // Seed data API\n /^\\/workflow\\//, // Workflow endpoints\n /^\\/health$/, // Health check\n /^\\/files\\//, // File serving\n /^\\/forms\\//, // Public form endpoints\n]\n\n// Routes to always exclude (even if they match an include pattern)\nconst EXCLUDED_ROUTES = new Set([\n 'GET /auth/login',\n 'GET /auth/register',\n 'GET /auth/login/form',\n])\n\n// ============================================================================\n// Route Discovery\n// ============================================================================\n\nlet cachedRouteList: RouteMetadata[] | null = null\n\nfunction isIncludedRoute(method: string, path: string): boolean {\n // Check exclusions first\n const key = `${method} ${path}`\n if (EXCLUDED_ROUTES.has(key)) {\n return false\n }\n\n // Check if the path matches any include pattern\n return INCLUDED_ROUTE_PATTERNS.some(pattern => pattern.test(path))\n}\n\nfunction inferCategory(path: string): string {\n if (path.startsWith('/auth/')) return 'Auth'\n if (path.startsWith('/api/search')) return 'Search'\n if (path.startsWith('/api/media')) return 'Media'\n if (path.startsWith('/api/system')) return 'System'\n if (path.startsWith('/api/content') || path.startsWith('/api/collections')) return 'Content'\n if (path.startsWith('/api/forms')) return 'Forms'\n if (path.startsWith('/admin/api-keys')) return 'API Keys'\n if (path.startsWith('/admin/cache')) return 'Cache'\n if (path.startsWith('/admin/plugins/ai-search')) return 'Search'\n if (path.startsWith('/admin/api')) return 'Admin'\n if (path.startsWith('/admin/database-tools')) return 'Admin'\n if (path.startsWith('/admin/seed-data')) return 'Admin'\n if (path.startsWith('/admin/plugins/email')) return 'Admin'\n if (path.startsWith('/workflow/')) return 'Workflow'\n if (path.startsWith('/forms/')) return 'Forms'\n if (path.startsWith('/files/')) return 'Files'\n if (path === '/health' || path.startsWith('/api')) return 'System'\n return 'Other'\n}\n\nfunction inferAuth(path: string): boolean | 'unknown' {\n // Known public routes\n if (path === '/health' || path === '/api' || path === '/api/health') return false\n if (path === '/api/system/info' || path === '/api/system/schema') return false\n if (path.startsWith('/files/')) return false\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/')) return false\n\n // Admin routes require auth\n if (path.startsWith('/admin/')) return true\n if (path.startsWith('/workflow/')) return true\n\n return 'unknown'\n}\n\nexport function buildRouteList(app: any): RouteMetadata[] {\n if (cachedRouteList) return cachedRouteList\n\n if (!app) return []\n\n try {\n const routes = inspectRoutes(app as any)\n\n // Deduplicate and filter\n const seen = new Set()\n const result: RouteMetadata[] = []\n\n for (const route of routes) {\n // Skip middleware entries\n if (route.isMiddleware) continue\n // Skip ALL method (middleware-like catch-all)\n if (route.method === 'ALL') continue\n\n const key = `${route.method} ${route.path}`\n\n // Skip duplicates\n if (seen.has(key)) continue\n seen.add(key)\n\n // Apply whitelist filter\n if (!isIncludedRoute(route.method, route.path)) continue\n\n // Look up metadata\n const meta = ROUTE_METADATA[key]\n\n if (meta) {\n result.push({\n method: route.method,\n path: route.path,\n description: meta.description,\n authentication: meta.authentication,\n category: meta.category,\n documented: true\n })\n } else {\n // Auto-discovered: infer category and auth\n result.push({\n method: route.method,\n path: route.path,\n description: '',\n authentication: inferAuth(route.path),\n category: inferCategory(route.path),\n documented: false\n })\n }\n }\n\n // Sort: by category, then method order, then path\n const methodOrder: Record = { GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4 }\n result.sort((a, b) => {\n const catCmp = a.category.localeCompare(b.category)\n if (catCmp !== 0) return catCmp\n const methCmp = (methodOrder[a.method] ?? 5) - (methodOrder[b.method] ?? 5)\n if (methCmp !== 0) return methCmp\n return a.path.localeCompare(b.path)\n })\n\n cachedRouteList = result\n return result\n } catch (error) {\n console.error('Failed to inspect routes:', error)\n return []\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/db/schema.ts","../../../node_modules/src/constants.ts","../../../node_modules/src/utils.ts","../../../node_modules/src/column.ts","../../../node_modules/src/schema.ts","../src/services/logger.ts","../src/services/cache.ts","../src/services/settings.ts","../src/services/telemetry-service.ts","../src/services/route-metadata.ts"],"names":["zod","z","integer","columns"],"mappings":"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","file":"chunk-QFWHAFEO.js","sourcesContent":["import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod';\n\n// Users table for authentication and user management\nexport const users = sqliteTable('users', {\n id: text('id').primaryKey(),\n email: text('email').notNull().unique(),\n username: text('username').notNull().unique(),\n firstName: text('first_name').notNull(),\n lastName: text('last_name').notNull(),\n passwordHash: text('password_hash'), // Hashed password, nullable for OAuth users\n role: text('role').notNull().default('viewer'), // 'admin', 'editor', 'author', 'viewer'\n avatar: text('avatar'),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n lastLoginAt: integer('last_login_at'),\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Content collections - dynamic schema definitions\nexport const collections = sqliteTable('collections', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n schema: text('schema', { mode: 'json' }).notNull(), // JSON schema definition\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false), // Config-managed collections cannot be edited in UI\n sourceType: text('source_type').default('user'), // 'user' (normal), 'form' (form-derived)\n sourceId: text('source_id'), // stores the form ID for form-derived collections\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content items - actual content data\nexport const content = sqliteTable('content', {\n id: text('id').primaryKey(),\n collectionId: text('collection_id').notNull().references(() => collections.id),\n slug: text('slug').notNull(),\n title: text('title').notNull(),\n data: text('data', { mode: 'json' }).notNull(), // JSON content data\n status: text('status').notNull().default('draft'), // 'draft', 'published', 'archived'\n publishedAt: integer('published_at', { mode: 'timestamp' }),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content versions for versioning system\nexport const contentVersions = sqliteTable('content_versions', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n version: integer('version').notNull(),\n data: text('data', { mode: 'json' }).notNull(),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Media/Files table\nexport const media = sqliteTable('media', {\n id: text('id').primaryKey(),\n filename: text('filename').notNull(),\n originalName: text('original_name').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n width: integer('width'),\n height: integer('height'),\n folder: text('folder').notNull().default('uploads'),\n r2Key: text('r2_key').notNull(), // R2 storage key\n publicUrl: text('public_url').notNull(), // CDN URL\n thumbnailUrl: text('thumbnail_url'),\n alt: text('alt'),\n caption: text('caption'),\n tags: text('tags', { mode: 'json' }), // JSON array of tags\n uploadedBy: text('uploaded_by').notNull().references(() => users.id),\n uploadedAt: integer('uploaded_at').notNull(),\n updatedAt: integer('updated_at'),\n publishedAt: integer('published_at'),\n scheduledAt: integer('scheduled_at'),\n archivedAt: integer('archived_at'),\n deletedAt: integer('deleted_at'),\n});\n\n// API tokens for programmatic access\nexport const apiTokens = sqliteTable('api_tokens', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n token: text('token').notNull().unique(),\n userId: text('user_id').notNull().references(() => users.id),\n permissions: text('permissions', { mode: 'json' }).notNull(), // Array of permissions\n expiresAt: integer('expires_at', { mode: 'timestamp' }),\n lastUsedAt: integer('last_used_at', { mode: 'timestamp' }),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n\n// Workflow history for content workflow tracking\nexport const workflowHistory = sqliteTable('workflow_history', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n action: text('action').notNull(),\n fromStatus: text('from_status').notNull(),\n toStatus: text('to_status').notNull(),\n userId: text('user_id').notNull().references(() => users.id),\n comment: text('comment'),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Plugin system tables\nexport const plugins = sqliteTable('plugins', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n version: text('version').notNull(),\n author: text('author').notNull(),\n category: text('category').notNull(),\n icon: text('icon'),\n status: text('status').notNull().default('inactive'), // 'active', 'inactive', 'error'\n isCore: integer('is_core', { mode: 'boolean' }).notNull().default(false),\n settings: text('settings', { mode: 'json' }),\n permissions: text('permissions', { mode: 'json' }),\n dependencies: text('dependencies', { mode: 'json' }),\n downloadCount: integer('download_count').notNull().default(0),\n rating: integer('rating').notNull().default(0),\n installedAt: integer('installed_at').notNull(),\n activatedAt: integer('activated_at'),\n lastUpdated: integer('last_updated').notNull(),\n errorMessage: text('error_message'),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n updatedAt: integer('updated_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginHooks = sqliteTable('plugin_hooks', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n hookName: text('hook_name').notNull(),\n handlerName: text('handler_name').notNull(),\n priority: integer('priority').notNull().default(10),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginRoutes = sqliteTable('plugin_routes', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n path: text('path').notNull(),\n method: text('method').notNull(),\n handlerName: text('handler_name').notNull(),\n middleware: text('middleware', { mode: 'json' }),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginAssets = sqliteTable('plugin_assets', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n assetType: text('asset_type').notNull(), // 'css', 'js', 'image', 'font'\n assetPath: text('asset_path').notNull(),\n loadOrder: integer('load_order').notNull().default(100),\n loadLocation: text('load_location').notNull().default('footer'), // 'header', 'footer'\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginActivityLog = sqliteTable('plugin_activity_log', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n action: text('action').notNull(),\n userId: text('user_id'),\n details: text('details', { mode: 'json' }),\n timestamp: integer('timestamp').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\n// Zod schemas for validation\nexport const insertUserSchema = createInsertSchema(users, {\n email: (schema: any) => schema.email(),\n firstName: (schema: any) => schema.min(1),\n lastName: (schema: any) => schema.min(1),\n username: (schema: any) => schema.min(3),\n});\n\nexport const selectUserSchema = createSelectSchema(users);\n\nexport const insertCollectionSchema = createInsertSchema(collections, {\n name: (schema: any) => schema.min(1).regex(/^[a-z0-9_]+$/, 'Collection name must be lowercase with underscores'),\n displayName: (schema: any) => schema.min(1),\n});\n\nexport const selectCollectionSchema = createSelectSchema(collections);\n\nexport const insertContentSchema = createInsertSchema(content, {\n slug: (schema: any) => schema.min(1).regex(/^[a-zA-Z0-9_-]+$/, 'Slug must contain only letters, numbers, underscores, and hyphens'),\n title: (schema: any) => schema.min(1),\n status: (schema: any) => schema,\n});\n\nexport const selectContentSchema = createSelectSchema(content);\n\nexport const insertMediaSchema = createInsertSchema(media, {\n filename: (schema: any) => schema.min(1),\n originalName: (schema: any) => schema.min(1),\n mimeType: (schema: any) => schema.min(1),\n size: (schema: any) => schema.positive(),\n r2Key: (schema: any) => schema.min(1),\n publicUrl: (schema: any) => schema.url(),\n folder: (schema: any) => schema.min(1),\n});\n\nexport const selectMediaSchema = createSelectSchema(media);\n\n\nexport const insertWorkflowHistorySchema = createInsertSchema(workflowHistory, {\n action: (schema: any) => schema.min(1),\n fromStatus: (schema: any) => schema.min(1),\n toStatus: (schema: any) => schema.min(1),\n});\n\nexport const selectWorkflowHistorySchema = createSelectSchema(workflowHistory);\n\nexport const insertPluginSchema = createInsertSchema(plugins, {\n name: (schema: any) => schema.min(1),\n displayName: (schema: any) => schema.min(1),\n version: (schema: any) => schema.min(1),\n author: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginSchema = createSelectSchema(plugins);\n\nexport const insertPluginHookSchema = createInsertSchema(pluginHooks, {\n hookName: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginHookSchema = createSelectSchema(pluginHooks);\n\nexport const insertPluginRouteSchema = createInsertSchema(pluginRoutes, {\n path: (schema: any) => schema.min(1),\n method: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginRouteSchema = createSelectSchema(pluginRoutes);\n\nexport const insertPluginAssetSchema = createInsertSchema(pluginAssets, {\n assetType: (schema: any) => schema.min(1),\n assetPath: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginAssetSchema = createSelectSchema(pluginAssets);\n\nexport const insertPluginActivityLogSchema = createInsertSchema(pluginActivityLog, {\n action: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginActivityLogSchema = createSelectSchema(pluginActivityLog);\n\n// System logs table for comprehensive logging\nexport const systemLogs = sqliteTable('system_logs', {\n id: text('id').primaryKey(),\n level: text('level').notNull(), // 'debug', 'info', 'warn', 'error', 'fatal'\n category: text('category').notNull(), // 'auth', 'api', 'workflow', 'plugin', 'media', 'system', etc.\n message: text('message').notNull(),\n data: text('data', { mode: 'json' }), // Additional structured data\n userId: text('user_id').references(() => users.id),\n sessionId: text('session_id'),\n requestId: text('request_id'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n method: text('method'), // HTTP method for API logs\n url: text('url'), // Request URL for API logs\n statusCode: integer('status_code'), // HTTP status code for API logs\n duration: integer('duration'), // Request duration in milliseconds\n stackTrace: text('stack_trace'), // Error stack trace for error logs\n tags: text('tags', { mode: 'json' }), // Array of tags for categorization\n source: text('source'), // Source component/module that generated the log\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Log configuration table\nexport const logConfig = sqliteTable('log_config', {\n id: text('id').primaryKey(),\n category: text('category').notNull().unique(),\n enabled: integer('enabled', { mode: 'boolean' }).notNull().default(true),\n level: text('level').notNull().default('info'), // minimum log level to store\n retention: integer('retention').notNull().default(30), // days to keep logs\n maxSize: integer('max_size').default(10000), // max number of logs per category\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Insert and select schemas for system logs\nexport const insertSystemLogSchema = createInsertSchema(systemLogs, {\n level: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n message: (schema: any) => schema.min(1),\n});\n\nexport const selectSystemLogSchema = createSelectSchema(systemLogs);\n\nexport const insertLogConfigSchema = createInsertSchema(logConfig, {\n category: (schema: any) => schema.min(1),\n level: (schema: any) => schema.min(1),\n});\n\nexport const selectLogConfigSchema = createSelectSchema(logConfig);\n\n// Type exports\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\nexport type Collection = typeof collections.$inferSelect;\nexport type NewCollection = typeof collections.$inferInsert;\nexport type Content = typeof content.$inferSelect;\nexport type NewContent = typeof content.$inferInsert;\nexport type Media = typeof media.$inferSelect;\nexport type NewMedia = typeof media.$inferInsert;\nexport type WorkflowHistory = typeof workflowHistory.$inferSelect;\nexport type NewWorkflowHistory = typeof workflowHistory.$inferInsert;\nexport type Plugin = typeof plugins.$inferSelect;\nexport type NewPlugin = typeof plugins.$inferInsert;\nexport type PluginHook = typeof pluginHooks.$inferSelect;\nexport type NewPluginHook = typeof pluginHooks.$inferInsert;\nexport type PluginRoute = typeof pluginRoutes.$inferSelect;\nexport type NewPluginRoute = typeof pluginRoutes.$inferInsert;\nexport type PluginAsset = typeof pluginAssets.$inferSelect;\nexport type NewPluginAsset = typeof pluginAssets.$inferInsert;\nexport type PluginActivityLog = typeof pluginActivityLog.$inferSelect;\nexport type NewPluginActivityLog = typeof pluginActivityLog.$inferInsert;\nexport type SystemLog = typeof systemLogs.$inferSelect;\nexport type NewSystemLog = typeof systemLogs.$inferInsert;\nexport type LogConfig = typeof logConfig.$inferSelect;\nexport type NewLogConfig = typeof logConfig.$inferInsert;\n\n// =====================================================\n// Security Audit Plugin Tables\n// =====================================================\n\nexport const securityEvents = sqliteTable('security_events', {\n id: text('id').primaryKey(),\n eventType: text('event_type').notNull(),\n severity: text('severity').notNull().default('info'),\n userId: text('user_id'),\n email: text('email'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n countryCode: text('country_code'),\n requestPath: text('request_path'),\n requestMethod: text('request_method'),\n details: text('details', { mode: 'json' }),\n fingerprint: text('fingerprint'),\n blocked: integer('blocked').notNull().default(0),\n createdAt: integer('created_at').notNull().$defaultFn(() => Date.now()),\n});\n\nexport const insertSecurityEventSchema = createInsertSchema(securityEvents, {\n eventType: (schema: any) => schema.min(1),\n severity: (schema: any) => schema.min(1),\n});\n\nexport const selectSecurityEventSchema = createSelectSchema(securityEvents);\n\nexport type SecurityEventRecord = typeof securityEvents.$inferSelect;\nexport type NewSecurityEventRecord = typeof securityEvents.$inferInsert;\n\n// =====================================================\n// Form.io Integration Tables\n// =====================================================\n\n// Forms table - stores Form.io form definitions\nexport const forms = sqliteTable('forms', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(), // Machine name (e.g., \"contact-form\")\n displayName: text('display_name').notNull(), // Human name (e.g., \"Contact Form\")\n description: text('description'),\n category: text('category').notNull().default('general'), // contact, survey, registration, etc.\n \n // Form.io schema (JSON)\n formioSchema: text('formio_schema', { mode: 'json' }).notNull(), // Complete Form.io JSON schema\n \n // Settings (JSON)\n settings: text('settings', { mode: 'json' }), // emailNotifications, successMessage, etc.\n \n // Status & Management\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n isPublic: integer('is_public', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false),\n \n // Metadata\n icon: text('icon'),\n color: text('color'),\n tags: text('tags', { mode: 'json' }), // JSON array\n \n // Stats\n submissionCount: integer('submission_count').notNull().default(0),\n viewCount: integer('view_count').notNull().default(0),\n \n // Ownership\n createdBy: text('created_by').references(() => users.id),\n updatedBy: text('updated_by').references(() => users.id),\n \n // Timestamps\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form submissions table\nexport const formSubmissions = sqliteTable('form_submissions', {\n id: text('id').primaryKey(),\n formId: text('form_id').notNull().references(() => forms.id, { onDelete: 'cascade' }),\n \n // Submission data\n submissionData: text('submission_data', { mode: 'json' }).notNull(), // The actual form data\n \n // Submission metadata\n status: text('status').notNull().default('pending'), // pending, reviewed, approved, rejected, spam\n submissionNumber: integer('submission_number'),\n \n // User information\n userId: text('user_id').references(() => users.id),\n userEmail: text('user_email'),\n \n // Tracking\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n referrer: text('referrer'),\n utmSource: text('utm_source'),\n utmMedium: text('utm_medium'),\n utmCampaign: text('utm_campaign'),\n \n // Review/Processing\n reviewedBy: text('reviewed_by').references(() => users.id),\n reviewedAt: integer('reviewed_at'),\n reviewNotes: text('review_notes'),\n \n // Flags\n isSpam: integer('is_spam', { mode: 'boolean' }).notNull().default(false),\n isArchived: integer('is_archived', { mode: 'boolean' }).notNull().default(false),\n\n // Content integration\n contentId: text('content_id').references(() => content.id), // Links submission to its content item\n\n // Timestamps\n submittedAt: integer('submitted_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form files table - links submissions to uploaded files\nexport const formFiles = sqliteTable('form_files', {\n id: text('id').primaryKey(),\n submissionId: text('submission_id').notNull().references(() => formSubmissions.id, { onDelete: 'cascade' }),\n mediaId: text('media_id').notNull().references(() => media.id, { onDelete: 'cascade' }),\n fieldName: text('field_name').notNull(), // Form field that uploaded this file\n uploadedAt: integer('uploaded_at').notNull(),\n});\n\n// Zod schemas for validation\nexport const insertFormSchema = createInsertSchema(forms);\nexport const selectFormSchema = createSelectSchema(forms);\nexport const insertFormSubmissionSchema = createInsertSchema(formSubmissions);\nexport const selectFormSubmissionSchema = createSelectSchema(formSubmissions);\nexport const insertFormFileSchema = createInsertSchema(formFiles);\nexport const selectFormFileSchema = createSelectSchema(formFiles);\n\n// TypeScript types\nexport type Form = typeof forms.$inferSelect;\nexport type NewForm = typeof forms.$inferInsert;\nexport type FormSubmission = typeof formSubmissions.$inferSelect;\nexport type NewFormSubmission = typeof formSubmissions.$inferInsert;\nexport type FormFile = typeof formFiles.$inferSelect;\nexport type NewFormFile = typeof formFiles.$inferInsert;",null,null,null,null,"import type { D1Database } from '@cloudflare/workers-types'\nimport { systemLogs, logConfig, type NewSystemLog, type LogConfig } from '../db/schema'\nimport { drizzle } from 'drizzle-orm/d1'\nimport { eq, and, gte, lte, desc, asc, count, like, inArray } from 'drizzle-orm'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal'\nexport type LogCategory = 'auth' | 'api' | 'workflow' | 'plugin' | 'media' | 'system' | 'security' | 'error'\n\nexport interface LogEntry {\n level: LogLevel\n category: LogCategory\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags?: string[]\n source?: string\n}\n\nexport interface LogFilter {\n level?: LogLevel[]\n category?: LogCategory[]\n userId?: string\n source?: string\n search?: string\n startDate?: Date\n endDate?: Date\n tags?: string[]\n limit?: number\n offset?: number\n sortBy?: 'created_at' | 'level' | 'category'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport class Logger {\n private db: ReturnType\n private enabled: boolean = true\n private configCache: Map = new Map()\n private lastConfigRefresh: number = 0\n private configRefreshInterval: number = 60000 // 1 minute\n\n constructor(database: D1Database) {\n this.db = drizzle(database)\n }\n\n /**\n * Log a debug message\n */\n async debug(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('debug', category, message, data, context)\n }\n\n /**\n * Log an info message\n */\n async info(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('info', category, message, data, context)\n }\n\n /**\n * Log a warning message\n */\n async warn(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('warn', category, message, data, context)\n }\n\n /**\n * Log an error message\n */\n async error(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('error', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log a fatal message\n */\n async fatal(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('fatal', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log an API request\n */\n async logRequest(\n method: string,\n url: string,\n statusCode: number,\n duration: number,\n context?: Partial\n ): Promise {\n const level: LogLevel = statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info'\n \n return this.log(level, 'api', `${method} ${url} - ${statusCode}`, {\n method,\n url,\n statusCode,\n duration\n }, {\n ...context,\n method,\n url,\n statusCode,\n duration\n })\n }\n\n /**\n * Log an authentication event\n */\n async logAuth(action: string, userId?: string, success: boolean = true, context?: Partial): Promise {\n const level: LogLevel = success ? 'info' : 'warn'\n \n return this.log(level, 'auth', `Authentication ${action}: ${success ? 'success' : 'failed'}`, {\n action,\n success,\n userId\n }, {\n ...context,\n userId,\n tags: ['authentication', action]\n })\n }\n\n /**\n * Log a security event\n */\n async logSecurity(event: string, severity: 'low' | 'medium' | 'high' | 'critical', context?: Partial): Promise {\n const level: LogLevel = severity === 'critical' ? 'fatal' : severity === 'high' ? 'error' : 'warn'\n \n return this.log(level, 'security', `Security event: ${event}`, {\n event,\n severity\n }, {\n ...context,\n tags: ['security', severity]\n })\n }\n\n /**\n * Core logging method\n */\n private async log(\n level: LogLevel,\n category: LogCategory,\n message: string,\n data?: any,\n context?: Partial\n ): Promise {\n if (!this.enabled) return\n\n try {\n // Check if logging is enabled for this category and level\n const config = await this.getConfig(category)\n if (!config || !config.enabled || !this.shouldLog(level, config.level)) {\n return\n }\n\n const logEntry: NewSystemLog = {\n id: crypto.randomUUID(),\n level,\n category,\n message,\n data: data ? JSON.stringify(data) : null,\n userId: context?.userId || null,\n sessionId: context?.sessionId || null,\n requestId: context?.requestId || null,\n ipAddress: context?.ipAddress || null,\n userAgent: context?.userAgent || null,\n method: context?.method || null,\n url: context?.url || null,\n statusCode: context?.statusCode || null,\n duration: context?.duration || null,\n stackTrace: context?.stackTrace || null,\n tags: context?.tags ? JSON.stringify(context.tags) : null,\n source: context?.source || null,\n createdAt: new Date()\n }\n\n await this.db.insert(systemLogs).values(logEntry)\n\n // Check if we need to clean up old logs\n if (config.maxSize) {\n await this.cleanupCategory(category, config.maxSize)\n }\n\n } catch (error) {\n // Don't log errors in the logger to avoid infinite loops\n console.error('Logger error:', error)\n }\n }\n\n /**\n * Get logs with filtering and pagination\n */\n async getLogs(filter: LogFilter = {}): Promise<{ logs: any[], total: number }> {\n try {\n const conditions = []\n \n if (filter.level && filter.level.length > 0) {\n conditions.push(inArray(systemLogs.level, filter.level))\n }\n \n if (filter.category && filter.category.length > 0) {\n conditions.push(inArray(systemLogs.category, filter.category))\n }\n \n if (filter.userId) {\n conditions.push(eq(systemLogs.userId, filter.userId))\n }\n \n if (filter.source) {\n conditions.push(eq(systemLogs.source, filter.source))\n }\n \n if (filter.search) {\n conditions.push(\n like(systemLogs.message, `%${filter.search}%`)\n )\n }\n \n if (filter.startDate) {\n conditions.push(gte(systemLogs.createdAt, filter.startDate))\n }\n \n if (filter.endDate) {\n conditions.push(lte(systemLogs.createdAt, filter.endDate))\n }\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined\n\n // Get total count\n const totalResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(whereClause)\n\n const total = totalResult[0]?.count || 0\n\n // Get logs with pagination and sorting\n const sortColumn = filter.sortBy === 'level' ? systemLogs.level :\n filter.sortBy === 'category' ? systemLogs.category :\n systemLogs.createdAt\n\n const sortFn = filter.sortOrder === 'asc' ? asc : desc\n\n const logs = await this.db\n .select()\n .from(systemLogs)\n .where(whereClause)\n .orderBy(sortFn(sortColumn))\n .limit(filter.limit || 50)\n .offset(filter.offset || 0)\n\n return { logs, total }\n } catch (error) {\n console.error('Error getting logs:', error)\n return { logs: [], total: 0 }\n }\n }\n\n /**\n * Get log configuration for a category\n */\n private async getConfig(category: LogCategory): Promise {\n try {\n // Check cache first\n const now = Date.now()\n if (this.configCache.has(category) && (now - this.lastConfigRefresh) < this.configRefreshInterval) {\n return this.configCache.get(category) || null\n }\n\n // Refresh config from database\n const configs = await this.db\n .select()\n .from(logConfig)\n .where(eq(logConfig.category, category))\n\n const config = configs[0] || null\n \n if (config) {\n this.configCache.set(category, config)\n this.lastConfigRefresh = now\n }\n\n return config\n } catch (error) {\n console.error('Error getting log config:', error)\n return null\n }\n }\n\n /**\n * Update log configuration\n */\n async updateConfig(category: LogCategory, updates: Partial): Promise {\n try {\n await this.db\n .update(logConfig)\n .set({\n ...updates,\n updatedAt: new Date()\n })\n .where(eq(logConfig.category, category))\n\n // Clear cache for this category\n this.configCache.delete(category)\n } catch (error) {\n console.error('Error updating log config:', error)\n }\n }\n\n /**\n * Get all log configurations\n */\n async getAllConfigs(): Promise {\n try {\n return await this.db.select().from(logConfig)\n } catch (error) {\n console.error('Error getting log configs:', error)\n return []\n }\n }\n\n /**\n * Clean up old logs for a category\n */\n private async cleanupCategory(category: LogCategory, maxSize: number): Promise {\n try {\n // Count current logs for this category\n const countResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n\n const currentCount = countResult[0]?.count || 0\n\n if (currentCount > maxSize) {\n // Get the cutoff date (keep newest maxSize logs)\n const cutoffLogs = await this.db\n .select({ createdAt: systemLogs.createdAt })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n .orderBy(desc(systemLogs.createdAt))\n .limit(1)\n .offset(maxSize - 1)\n\n if (cutoffLogs[0]) {\n // Delete older logs\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, category),\n lte(systemLogs.createdAt, cutoffLogs[0].createdAt)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n }\n }\n\n /**\n * Clean up logs based on retention policy\n */\n async cleanupByRetention(): Promise {\n try {\n const configs = await this.getAllConfigs()\n \n for (const config of configs) {\n if (config.retention > 0) {\n const cutoffDate = new Date()\n cutoffDate.setDate(cutoffDate.getDate() - config.retention)\n\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, config.category),\n lte(systemLogs.createdAt, cutoffDate)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs by retention:', error)\n }\n }\n\n /**\n * Check if a log level should be recorded based on configuration\n */\n private shouldLog(level: LogLevel, configLevel: string): boolean {\n const levels = ['debug', 'info', 'warn', 'error', 'fatal']\n const levelIndex = levels.indexOf(level)\n const configLevelIndex = levels.indexOf(configLevel)\n \n return levelIndex >= configLevelIndex\n }\n\n /**\n * Enable or disable logging\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton logger instance\nlet loggerInstance: Logger | null = null\n\n/**\n * Get the logger instance\n */\nexport function getLogger(database?: D1Database): Logger {\n if (!loggerInstance && database) {\n loggerInstance = new Logger(database)\n }\n \n if (!loggerInstance) {\n throw new Error('Logger not initialized. Call getLogger with a database instance first.')\n }\n \n return loggerInstance\n}\n\n/**\n * Initialize the logger with a database\n */\nexport function initLogger(database: D1Database): Logger {\n loggerInstance = new Logger(database)\n return loggerInstance\n}","/**\n * Simple Cache Service\n *\n * Provides basic caching functionality for the core package\n * Can be extended with KV or other storage backends\n */\n\nexport interface CacheConfig {\n ttl: number // Time to live in seconds\n keyPrefix: string\n}\n\nexport class CacheService {\n private config: CacheConfig\n private memoryCache: Map = new Map()\n\n constructor(config: CacheConfig) {\n this.config = config\n }\n\n /**\n * Generate cache key with prefix\n */\n generateKey(type: string, identifier?: string): string {\n const parts = [this.config.keyPrefix, type]\n if (identifier) {\n parts.push(identifier)\n }\n return parts.join(':')\n }\n\n /**\n * Get value from cache\n */\n async get(key: string): Promise {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return null\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return null\n }\n\n return cached.value as T\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise<{\n hit: boolean\n data: T | null\n source: string\n ttl?: number\n }> {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return {\n hit: false,\n data: null,\n source: 'none'\n }\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return {\n hit: false,\n data: null,\n source: 'expired'\n }\n }\n\n return {\n hit: true,\n data: cached.value as T,\n source: 'memory',\n ttl: (cached.expires - Date.now()) / 1000 // TTL in seconds\n }\n }\n\n /**\n * Set value in cache\n */\n async set(key: string, value: any, ttl?: number): Promise {\n const expires = Date.now() + ((ttl || this.config.ttl) * 1000)\n this.memoryCache.set(key, { value, expires })\n }\n\n /**\n * Delete specific key from cache\n */\n async delete(key: string): Promise {\n this.memoryCache.delete(key)\n }\n\n /**\n * Invalidate cache keys matching a pattern\n * For memory cache, we do simple string matching\n */\n async invalidate(pattern: string): Promise {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.')\n const regex = new RegExp(`^${regexPattern}$`)\n\n // Find and delete matching keys\n for (const key of this.memoryCache.keys()) {\n if (regex.test(key)) {\n this.memoryCache.delete(key)\n }\n }\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise {\n this.memoryCache.clear()\n }\n\n /**\n * Get value from cache or set it using a callback\n */\n async getOrSet(key: string, callback: () => Promise, ttl?: number): Promise {\n const cached = await this.get(key)\n\n if (cached !== null) {\n return cached\n }\n\n const value = await callback()\n await this.set(key, value, ttl)\n return value\n }\n}\n\n/**\n * Cache configurations for different data types\n */\nexport const CACHE_CONFIGS = {\n api: {\n ttl: 300, // 5 minutes\n keyPrefix: 'api'\n },\n user: {\n ttl: 600, // 10 minutes\n keyPrefix: 'user'\n },\n content: {\n ttl: 300, // 5 minutes\n keyPrefix: 'content'\n },\n collection: {\n ttl: 600, // 10 minutes\n keyPrefix: 'collection'\n }\n}\n\n/**\n * Get cache service instance for a config\n */\nexport function getCacheService(config: CacheConfig): CacheService {\n return new CacheService(config)\n}\n","export interface Setting {\n id: string\n category: string\n key: string\n value: string // JSON string\n created_at: number\n updated_at: number\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface SecuritySettings {\n jwtExpiresIn: string\n jwtRefreshGraceSeconds: number\n}\n\nexport class SettingsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get a setting value by category and key\n */\n async getSetting(category: string, key: string): Promise {\n try {\n const result = await this.db\n .prepare('SELECT value FROM settings WHERE category = ? AND key = ?')\n .bind(category, key)\n .first()\n\n if (!result) {\n return null\n }\n\n return JSON.parse((result as any).value)\n } catch (error) {\n console.error(`Error getting setting ${category}.${key}:`, error)\n return null\n }\n }\n\n /**\n * Get all settings for a category\n */\n async getCategorySettings(category: string): Promise> {\n try {\n const { results } = await this.db\n .prepare('SELECT key, value FROM settings WHERE category = ?')\n .bind(category)\n .all()\n\n const settings: Record = {}\n for (const row of results || []) {\n const r = row as any\n settings[r.key] = JSON.parse(r.value)\n }\n\n return settings\n } catch (error) {\n console.error(`Error getting category settings for ${category}:`, error)\n return {}\n }\n }\n\n /**\n * Set a setting value\n */\n async setSetting(category: string, key: string, value: any): Promise {\n try {\n const now = Date.now()\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n\n return true\n } catch (error) {\n console.error(`Error setting ${category}.${key}:`, error)\n return false\n }\n }\n\n /**\n * Set multiple settings at once\n */\n async setMultipleSettings(category: string, settings: Record): Promise {\n try {\n const now = Date.now()\n\n // Use a transaction-like approach with batch operations\n for (const [key, value] of Object.entries(settings)) {\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n }\n\n return true\n } catch (error) {\n console.error(`Error setting multiple settings for ${category}:`, error)\n return false\n }\n }\n\n /**\n * Get general settings with defaults\n */\n async getGeneralSettings(userEmail?: string): Promise {\n const settings = await this.getCategorySettings('general')\n\n return {\n siteName: settings.siteName || 'SonicJS AI',\n siteDescription: settings.siteDescription || 'A modern headless CMS powered by AI',\n adminEmail: settings.adminEmail || userEmail || 'admin@example.com',\n timezone: settings.timezone || 'UTC',\n language: settings.language || 'en',\n maintenanceMode: settings.maintenanceMode || false\n }\n }\n\n /**\n * Save general settings\n */\n async saveGeneralSettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.siteName !== undefined) settingsToSave.siteName = settings.siteName\n if (settings.siteDescription !== undefined) settingsToSave.siteDescription = settings.siteDescription\n if (settings.adminEmail !== undefined) settingsToSave.adminEmail = settings.adminEmail\n if (settings.timezone !== undefined) settingsToSave.timezone = settings.timezone\n if (settings.language !== undefined) settingsToSave.language = settings.language\n if (settings.maintenanceMode !== undefined) settingsToSave.maintenanceMode = settings.maintenanceMode\n\n return await this.setMultipleSettings('general', settingsToSave)\n }\n\n /**\n * Get security settings with defaults\n */\n async getSecuritySettings(): Promise {\n const settings = await this.getCategorySettings('security')\n\n return {\n jwtExpiresIn: settings.jwtExpiresIn || '30d',\n jwtRefreshGraceSeconds:\n typeof settings.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n }\n }\n\n /**\n * Save security settings\n */\n async saveSecuritySettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.jwtExpiresIn !== undefined) settingsToSave.jwtExpiresIn = settings.jwtExpiresIn\n if (settings.jwtRefreshGraceSeconds !== undefined)\n settingsToSave.jwtRefreshGraceSeconds = settings.jwtRefreshGraceSeconds\n\n return await this.setMultipleSettings('security', settingsToSave)\n }\n}\n","/**\n * Telemetry Service\n *\n * Privacy-first telemetry service using custom SonicJS stats endpoint\n * - No PII collection\n * - Opt-out by default\n * - Silent failures (never blocks app)\n */\n\nimport type { TelemetryEvent, TelemetryProperties, TelemetryConfig, TelemetryIdentity } from '../types/telemetry'\nimport { getTelemetryConfig } from '../utils/telemetry-config'\nimport { generateInstallationId, generateProjectId, sanitizeErrorMessage, sanitizeRoute } from '../utils/telemetry-id'\n\n/**\n * TelemetryService class\n *\n * Handles all telemetry tracking in a privacy-conscious way\n */\nexport class TelemetryService {\n private config: TelemetryConfig\n private identity: TelemetryIdentity | null = null\n private enabled: boolean = true\n private eventQueue: Array<{ event: TelemetryEvent; properties?: TelemetryProperties }> = []\n private isInitialized: boolean = false\n\n constructor(config?: Partial) {\n this.config = {\n ...getTelemetryConfig(),\n ...config\n }\n this.enabled = this.config.enabled\n }\n\n /**\n * Initialize the telemetry service\n */\n async initialize(identity: TelemetryIdentity): Promise {\n if (!this.enabled) {\n if (this.config.debug) {\n console.log('[Telemetry] Disabled via configuration')\n }\n return\n }\n\n try {\n this.identity = identity\n\n if (this.config.debug) {\n console.log('[Telemetry] Initialized with installation ID:', identity.installationId)\n }\n\n this.isInitialized = true\n\n // Flush any queued events\n await this.flushQueue()\n\n } catch (error) {\n // Silent fail - telemetry should never break the app\n if (this.config.debug) {\n console.error('[Telemetry] Initialization failed:', error)\n }\n this.enabled = false\n }\n }\n\n /**\n * Track a telemetry event\n */\n async track(event: TelemetryEvent, properties?: TelemetryProperties): Promise {\n if (!this.enabled) return\n\n try {\n // Sanitize properties\n const sanitizedProps = this.sanitizeProperties(properties)\n\n // Add standard properties\n const enrichedProps = {\n ...sanitizedProps,\n timestamp: new Date().toISOString(),\n version: this.getVersion()\n }\n\n // If not initialized, queue the event\n if (!this.isInitialized) {\n this.eventQueue.push({ event, properties: enrichedProps })\n if (this.config.debug) {\n console.log('[Telemetry] Queued event:', event, enrichedProps)\n }\n return\n }\n\n // Send to custom SonicJS stats endpoint\n if (this.identity && this.config.host) {\n const payload = {\n data: {\n installation_id: this.identity.installationId,\n event_type: event,\n properties: enrichedProps,\n timestamp: enrichedProps.timestamp\n }\n }\n\n // Fire and forget - don't block on response\n fetch(`${this.config.host}/v1/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload)\n }).catch(() => {}) // Silent fail\n\n if (this.config.debug) {\n console.log('[Telemetry] Tracked event:', event, enrichedProps)\n }\n } else if (this.config.debug) {\n console.log('[Telemetry] Event (no endpoint):', event, enrichedProps)\n }\n\n } catch (error) {\n // Silent fail\n if (this.config.debug) {\n console.error('[Telemetry] Failed to track event:', error)\n }\n }\n }\n\n /**\n * Track installation started\n */\n async trackInstallationStarted(properties?: TelemetryProperties): Promise {\n await this.track('installation_started', properties)\n }\n\n /**\n * Track installation completed\n */\n async trackInstallationCompleted(properties?: TelemetryProperties): Promise {\n await this.track('installation_completed', properties)\n }\n\n /**\n * Track installation failed\n */\n async trackInstallationFailed(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('installation_failed', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track dev server started\n */\n async trackDevServerStarted(properties?: TelemetryProperties): Promise {\n await this.track('dev_server_started', properties)\n }\n\n /**\n * Track page view in admin UI\n */\n async trackPageView(route: string, properties?: TelemetryProperties): Promise {\n await this.track('page_viewed', {\n ...properties,\n route: sanitizeRoute(route)\n })\n }\n\n /**\n * Track error (sanitized)\n */\n async trackError(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('error_occurred', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track plugin activation\n */\n async trackPluginActivated(properties?: TelemetryProperties): Promise {\n await this.track('plugin_activated', properties)\n }\n\n /**\n * Track migration run\n */\n async trackMigrationRun(properties?: TelemetryProperties): Promise {\n await this.track('migration_run', properties)\n }\n\n /**\n * Flush queued events\n */\n private async flushQueue(): Promise {\n if (this.eventQueue.length === 0) return\n\n const queue = [...this.eventQueue]\n this.eventQueue = []\n\n for (const { event, properties } of queue) {\n await this.track(event, properties)\n }\n }\n\n /**\n * Sanitize properties to ensure no PII\n */\n private sanitizeProperties(properties?: TelemetryProperties): TelemetryProperties {\n if (!properties) return {}\n\n const sanitized: TelemetryProperties = {}\n\n for (const [key, value] of Object.entries(properties)) {\n // Skip undefined values\n if (value === undefined) continue\n\n // Sanitize routes\n if (key === 'route' && typeof value === 'string') {\n sanitized[key] = sanitizeRoute(value)\n continue\n }\n\n // Sanitize error messages\n if (key.toLowerCase().includes('error') && typeof value === 'string') {\n sanitized[key] = sanitizeErrorMessage(value)\n continue\n }\n\n // Only allow specific types\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n sanitized[key] = value\n }\n }\n\n return sanitized\n }\n\n /**\n * Get SonicJS version\n */\n private getVersion(): string {\n try {\n // Safe environment access for Cloudflare Workers compatibility\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SONICJS_VERSION || '2.0.0'\n }\n return '2.0.0'\n } catch {\n return 'unknown'\n }\n }\n\n /**\n * Shutdown the telemetry service (no-op for fetch-based telemetry)\n */\n async shutdown(): Promise {\n // No-op - fetch requests are fire and forget\n }\n\n /**\n * Enable telemetry\n */\n enable(): void {\n this.enabled = true\n }\n\n /**\n * Disable telemetry\n */\n disable(): void {\n this.enabled = false\n }\n\n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton instance\nlet telemetryInstance: TelemetryService | null = null\n\n/**\n * Get the telemetry service instance\n */\nexport function getTelemetryService(config?: Partial): TelemetryService {\n if (!telemetryInstance) {\n telemetryInstance = new TelemetryService(config)\n }\n return telemetryInstance\n}\n\n/**\n * Initialize telemetry service\n */\nexport async function initTelemetry(identity: TelemetryIdentity, config?: Partial): Promise {\n const service = getTelemetryService(config)\n await service.initialize(identity)\n return service\n}\n\n/**\n * Create a new installation identity\n */\nexport function createInstallationIdentity(projectName?: string): TelemetryIdentity {\n const installationId = generateInstallationId()\n const identity: TelemetryIdentity = { installationId }\n\n if (projectName) {\n // Generate anonymous project ID\n identity.projectId = generateProjectId(projectName)\n }\n\n return identity\n}\n","/**\n * Route Metadata Service\n *\n * Auto-discovers API routes using Hono's inspectRoutes() and enriches them\n * with metadata from a static registry. Routes without metadata still appear\n * as \"auto-discovered\" — nothing is ever invisible.\n */\n\nimport { inspectRoutes } from 'hono/dev'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RouteMetadata {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented: boolean\n}\n\ninterface RouteMeta {\n description: string\n authentication: boolean\n category: string\n}\n\nexport interface CategoryInfo {\n title: string\n description: string\n icon: string\n}\n\n// ============================================================================\n// App Instance Storage\n// ============================================================================\n\nlet appInstance: any = null\n\nexport function setAppInstance(app: any): void {\n appInstance = app\n}\n\nexport function getAppInstance(): any {\n return appInstance\n}\n\n// ============================================================================\n// Category Information\n// ============================================================================\n\nexport const CATEGORY_INFO: Record = {\n 'Auth': {\n title: 'Authentication',\n description: 'User authentication and authorization endpoints',\n icon: '🔐'\n },\n 'Content': {\n title: 'Content Management',\n description: 'Content creation, retrieval, and management',\n icon: '📝'\n },\n 'Media': {\n title: 'Media Management',\n description: 'File upload, storage, and media operations',\n icon: '🖼️'\n },\n 'Admin': {\n title: 'Admin Interface',\n description: 'Administrative panel and management features',\n icon: '⚙️'\n },\n 'System': {\n title: 'System',\n description: 'Health checks and system information',\n icon: '🔧'\n },\n 'Search': {\n title: 'Search',\n description: 'AI-powered search, full-text search, and analytics',\n icon: '🔍'\n },\n 'API Keys': {\n title: 'API Keys',\n description: 'API key management and authentication',\n icon: '🔑'\n },\n 'Workflow': {\n title: 'Workflow',\n description: 'Content workflow and approval processes',\n icon: '🔄'\n },\n 'Cache': {\n title: 'Cache',\n description: 'Cache management and invalidation',\n icon: '⚡'\n },\n 'Forms': {\n title: 'Forms',\n description: 'Form submissions and management',\n icon: '📋'\n },\n 'Files': {\n title: 'Files',\n description: 'File serving from R2 storage',\n icon: '📁'\n }\n}\n\n// ============================================================================\n// Route Metadata Registry\n// ============================================================================\n\nconst ROUTE_METADATA: Record = {\n // Auth endpoints\n 'POST /auth/login': { description: 'Authenticate user with email and password (returns JWT)', category: 'Auth', authentication: false },\n 'POST /auth/login/form': { description: 'Form-based login (sets session cookie)', category: 'Auth', authentication: false },\n 'POST /auth/register': { description: 'Register a new user account', category: 'Auth', authentication: false },\n 'POST /auth/logout': { description: 'Log out the current user and invalidate session', category: 'Auth', authentication: true },\n 'GET /auth/me': { description: 'Get current authenticated user information', category: 'Auth', authentication: true },\n 'POST /auth/refresh': { description: 'Refresh authentication token', category: 'Auth', authentication: true },\n 'POST /auth/seed-admin': { description: 'Create or reset the admin user account', category: 'Auth', authentication: false },\n 'POST /auth/magic-link/request': { description: 'Request a magic link login email', category: 'Auth', authentication: false },\n 'GET /auth/magic-link/verify': { description: 'Verify magic link token and authenticate', category: 'Auth', authentication: false },\n 'POST /auth/otp/request': { description: 'Request a one-time password via email', category: 'Auth', authentication: false },\n 'POST /auth/otp/verify': { description: 'Verify OTP code and authenticate', category: 'Auth', authentication: false },\n\n // Content endpoints\n 'GET /api/collections': { description: 'List all available collections', category: 'Content', authentication: false },\n 'GET /api/collections/:collection/content': { description: 'Get all content items from a specific collection', category: 'Content', authentication: false },\n 'GET /api/content/:id': { description: 'Get a specific content item by ID', category: 'Content', authentication: false },\n 'POST /api/content': { description: 'Create a new content item', category: 'Content', authentication: true },\n 'PUT /api/content/:id': { description: 'Update an existing content item', category: 'Content', authentication: true },\n 'DELETE /api/content/:id': { description: 'Delete a content item', category: 'Content', authentication: true },\n 'GET /api/content/:id/versions': { description: 'Get version history for a content item', category: 'Content', authentication: true },\n 'POST /api/content/:id/restore/:versionId': { description: 'Restore a content item to a previous version', category: 'Content', authentication: true },\n\n // Media endpoints\n 'GET /api/media': { description: 'List all media files with pagination', category: 'Media', authentication: false },\n 'GET /api/media/:id': { description: 'Get a specific media file by ID', category: 'Media', authentication: false },\n 'POST /api/media/upload': { description: 'Upload a new media file to R2 storage', category: 'Media', authentication: true },\n 'DELETE /api/media/:id': { description: 'Delete a media file from storage', category: 'Media', authentication: true },\n\n // Admin API endpoints\n 'GET /admin/api/stats': { description: 'Get dashboard statistics (collections, content, media, users)', category: 'Admin', authentication: true },\n 'GET /admin/api/storage': { description: 'Get storage usage information', category: 'Admin', authentication: true },\n 'GET /admin/api/activity': { description: 'Get recent activity logs', category: 'Admin', authentication: true },\n 'GET /admin/api/collections': { description: 'List all collections with field counts', category: 'Admin', authentication: true },\n 'POST /admin/api/collections': { description: 'Create a new collection', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id': { description: 'Get a specific collection with its fields', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id': { description: 'Update an existing collection', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id': { description: 'Delete a collection (must be empty)', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id/fields': { description: 'Get fields for a specific collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields': { description: 'Add a field to a collection', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id/fields/:fieldId': { description: 'Update a collection field', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id/fields/:fieldId': { description: 'Remove a field from a collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields/reorder': { description: 'Reorder fields in a collection', category: 'Admin', authentication: true },\n 'GET /admin/api/migrations/status': { description: 'Get database migration status', category: 'Admin', authentication: true },\n 'POST /admin/api/migrations/run': { description: 'Run pending database migrations', category: 'Admin', authentication: true },\n 'GET /admin/api/content': { description: 'List content items with filtering and pagination', category: 'Admin', authentication: true },\n 'GET /admin/api/content/:id': { description: 'Get a content item for admin editing', category: 'Admin', authentication: true },\n 'POST /admin/api/content': { description: 'Create content via admin API', category: 'Admin', authentication: true },\n 'PUT /admin/api/content/:id': { description: 'Update content via admin API', category: 'Admin', authentication: true },\n 'DELETE /admin/api/content/:id': { description: 'Delete content via admin API', category: 'Admin', authentication: true },\n 'GET /admin/api/media': { description: 'List media files for admin management', category: 'Admin', authentication: true },\n 'POST /admin/api/media/upload': { description: 'Upload media via admin interface', category: 'Admin', authentication: true },\n 'DELETE /admin/api/media/:id': { description: 'Delete media via admin interface', category: 'Admin', authentication: true },\n 'GET /admin/api/users': { description: 'List all users', category: 'Admin', authentication: true },\n 'POST /admin/api/users': { description: 'Create a new user', category: 'Admin', authentication: true },\n 'PUT /admin/api/users/:id': { description: 'Update a user', category: 'Admin', authentication: true },\n 'DELETE /admin/api/users/:id': { description: 'Delete a user', category: 'Admin', authentication: true },\n 'GET /admin/api/logs': { description: 'Get application logs with filtering', category: 'Admin', authentication: true },\n 'GET /admin/api/plugins': { description: 'List all registered plugins', category: 'Admin', authentication: true },\n 'POST /admin/api/plugins/:id/toggle': { description: 'Enable or disable a plugin', category: 'Admin', authentication: true },\n 'GET /admin/api/settings': { description: 'Get application settings', category: 'Admin', authentication: true },\n 'PUT /admin/api/settings': { description: 'Update application settings', category: 'Admin', authentication: true },\n 'GET /admin/api/forms': { description: 'List all forms', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id': { description: 'Get form details and submissions', category: 'Admin', authentication: true },\n 'POST /admin/api/forms': { description: 'Create a new form', category: 'Admin', authentication: true },\n 'PUT /admin/api/forms/:id': { description: 'Update a form', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id': { description: 'Delete a form', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id/submissions': { description: 'Get form submissions', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id/submissions/:submissionId': { description: 'Delete a form submission', category: 'Admin', authentication: true },\n\n // Search endpoints\n 'GET /api/search': { description: 'Search content using AI, FTS5, keyword, or hybrid mode', category: 'Search', authentication: false },\n 'POST /api/search/click': { description: 'Track a search result click for analytics', category: 'Search', authentication: false },\n 'GET /admin/plugins/ai-search/api/status': { description: 'Get search plugin status and configuration', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index': { description: 'Trigger content indexing for search', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index/reset': { description: 'Reset the search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics': { description: 'Get search analytics and metrics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/queries': { description: 'Get top search queries', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/clicks': { description: 'Get click-through analytics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/fts5/status': { description: 'Get FTS5 full-text search status', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/fts5/rebuild': { description: 'Rebuild the FTS5 search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/facets': { description: 'Get available search facets', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments': { description: 'List search A/B test experiments', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments': { description: 'Create a search A/B test experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id': { description: 'Get experiment details', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/experiments/:id': { description: 'Update an experiment', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/experiments/:id': { description: 'Delete an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/start': { description: 'Start an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/stop': { description: 'Stop a running experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id/results': { description: 'Get experiment results and statistics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality': { description: 'Get search quality agent analysis', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/run': { description: 'Run search quality analysis', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality/recommendations': { description: 'Get quality improvement recommendations', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/apply': { description: 'Apply a quality recommendation', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/dismiss': { description: 'Dismiss a quality recommendation', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/synonyms': { description: 'List search synonyms', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/synonyms': { description: 'Add a search synonym', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/synonyms/:id': { description: 'Delete a search synonym', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/query-rules': { description: 'List search query rules', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/query-rules': { description: 'Create a query rule', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/query-rules/:id': { description: 'Update a query rule', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/query-rules/:id': { description: 'Delete a query rule', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/settings': { description: 'Get search plugin settings', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/settings': { description: 'Update search plugin settings', category: 'Search', authentication: true },\n\n // API Key endpoints\n 'GET /admin/api-keys/api/keys': { description: 'List all API keys', category: 'API Keys', authentication: true },\n 'POST /admin/api-keys/api/keys': { description: 'Create a new API key', category: 'API Keys', authentication: true },\n 'DELETE /admin/api-keys/api/keys/:id': { description: 'Revoke an API key', category: 'API Keys', authentication: true },\n 'PUT /admin/api-keys/api/keys/:id': { description: 'Update an API key', category: 'API Keys', authentication: true },\n\n // Cache endpoints\n 'GET /admin/cache/api/stats': { description: 'Get cache statistics', category: 'Cache', authentication: true },\n 'POST /admin/cache/api/purge': { description: 'Purge cache entries', category: 'Cache', authentication: true },\n 'GET /admin/cache/api/entries': { description: 'List cache entries', category: 'Cache', authentication: true },\n 'DELETE /admin/cache/api/entries/:key': { description: 'Delete a specific cache entry', category: 'Cache', authentication: true },\n\n // Workflow endpoints\n 'GET /workflow/status/:id': { description: 'Get workflow status for a content item', category: 'Workflow', authentication: true },\n 'POST /workflow/submit/:id': { description: 'Submit content for review', category: 'Workflow', authentication: true },\n 'POST /workflow/approve/:id': { description: 'Approve content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/reject/:id': { description: 'Reject content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/publish/:id': { description: 'Publish approved content', category: 'Workflow', authentication: true },\n 'POST /workflow/unpublish/:id': { description: 'Unpublish content', category: 'Workflow', authentication: true },\n 'GET /workflow/history/:id': { description: 'Get workflow history for a content item', category: 'Workflow', authentication: true },\n\n // Form endpoints (public)\n 'POST /forms/:formId/submit': { description: 'Submit a form (public endpoint)', category: 'Forms', authentication: false },\n 'GET /forms/:formId': { description: 'Get form definition for rendering', category: 'Forms', authentication: false },\n 'POST /api/forms/:formId/submit': { description: 'Submit a form via API', category: 'Forms', authentication: false },\n 'GET /api/forms/:formId': { description: 'Get form definition via API', category: 'Forms', authentication: false },\n\n // System endpoints\n 'GET /health': { description: 'Health check endpoint for monitoring', category: 'System', authentication: false },\n 'GET /api/health': { description: 'API health check with schema information', category: 'System', authentication: false },\n 'GET /api': { description: 'API root - returns API information and available endpoints', category: 'System', authentication: false },\n 'GET /api/system/info': { description: 'Get system information and version', category: 'System', authentication: false },\n 'GET /api/system/schema': { description: 'Get database schema information', category: 'System', authentication: false },\n\n // File serving\n 'GET /files/*': { description: 'Serve files from R2 storage (public access)', category: 'Files', authentication: false },\n\n // Database tools\n 'POST /admin/database-tools/api/query': { description: 'Execute a database query', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables': { description: 'List database tables', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables/:name': { description: 'Get table schema and sample data', category: 'Admin', authentication: true },\n\n // Seed data\n 'POST /admin/seed-data/api/generate': { description: 'Generate seed data for development', category: 'Admin', authentication: true },\n 'GET /admin/seed-data/api/status': { description: 'Get seed data generation status', category: 'Admin', authentication: true },\n\n // Email plugin\n 'POST /admin/plugins/email/api/send': { description: 'Send an email', category: 'Admin', authentication: true },\n 'GET /admin/plugins/email/api/templates': { description: 'List email templates', category: 'Admin', authentication: true },\n 'POST /admin/plugins/email/api/test': { description: 'Send a test email', category: 'Admin', authentication: true },\n}\n\n// ============================================================================\n// Whitelist Patterns for API routes\n// ============================================================================\n\nconst INCLUDED_ROUTE_PATTERNS: RegExp[] = [\n /^\\/api\\//, // All /api/* routes\n /^\\/api$/, // API root\n /^\\/auth\\/(?!login$|register$)/, // Auth routes except GET login/register HTML pages\n /^\\/auth\\/login$/, // POST /auth/login (method filtered later)\n /^\\/auth\\/register$/, // POST /auth/register (method filtered later)\n /^\\/admin\\/api\\//, // Admin API endpoints\n /^\\/admin\\/api-keys\\/api\\//, // API key management\n /^\\/admin\\/cache\\/api\\//, // Cache management API\n /^\\/admin\\/plugins\\/.*\\/api\\//, // Plugin API endpoints\n /^\\/admin\\/database-tools\\/api\\//, // Database tools API\n /^\\/admin\\/seed-data\\/api\\//, // Seed data API\n /^\\/workflow\\//, // Workflow endpoints\n /^\\/health$/, // Health check\n /^\\/files\\//, // File serving\n /^\\/forms\\//, // Public form endpoints\n]\n\n// Routes to always exclude (even if they match an include pattern)\nconst EXCLUDED_ROUTES = new Set([\n 'GET /auth/login',\n 'GET /auth/register',\n 'GET /auth/login/form',\n])\n\n// ============================================================================\n// Route Discovery\n// ============================================================================\n\nlet cachedRouteList: RouteMetadata[] | null = null\n\nfunction isIncludedRoute(method: string, path: string): boolean {\n // Check exclusions first\n const key = `${method} ${path}`\n if (EXCLUDED_ROUTES.has(key)) {\n return false\n }\n\n // Check if the path matches any include pattern\n return INCLUDED_ROUTE_PATTERNS.some(pattern => pattern.test(path))\n}\n\nfunction inferCategory(path: string): string {\n if (path.startsWith('/auth/')) return 'Auth'\n if (path.startsWith('/api/search')) return 'Search'\n if (path.startsWith('/api/media')) return 'Media'\n if (path.startsWith('/api/system')) return 'System'\n if (path.startsWith('/api/content') || path.startsWith('/api/collections')) return 'Content'\n if (path.startsWith('/api/forms')) return 'Forms'\n if (path.startsWith('/admin/api-keys')) return 'API Keys'\n if (path.startsWith('/admin/cache')) return 'Cache'\n if (path.startsWith('/admin/plugins/ai-search')) return 'Search'\n if (path.startsWith('/admin/api')) return 'Admin'\n if (path.startsWith('/admin/database-tools')) return 'Admin'\n if (path.startsWith('/admin/seed-data')) return 'Admin'\n if (path.startsWith('/admin/plugins/email')) return 'Admin'\n if (path.startsWith('/workflow/')) return 'Workflow'\n if (path.startsWith('/forms/')) return 'Forms'\n if (path.startsWith('/files/')) return 'Files'\n if (path === '/health' || path.startsWith('/api')) return 'System'\n return 'Other'\n}\n\nfunction inferAuth(path: string): boolean | 'unknown' {\n // Known public routes\n if (path === '/health' || path === '/api' || path === '/api/health') return false\n if (path === '/api/system/info' || path === '/api/system/schema') return false\n if (path.startsWith('/files/')) return false\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/')) return false\n\n // Admin routes require auth\n if (path.startsWith('/admin/')) return true\n if (path.startsWith('/workflow/')) return true\n\n return 'unknown'\n}\n\nexport function buildRouteList(app: any): RouteMetadata[] {\n if (cachedRouteList) return cachedRouteList\n\n if (!app) return []\n\n try {\n const routes = inspectRoutes(app as any)\n\n // Deduplicate and filter\n const seen = new Set()\n const result: RouteMetadata[] = []\n\n for (const route of routes) {\n // Skip middleware entries\n if (route.isMiddleware) continue\n // Skip ALL method (middleware-like catch-all)\n if (route.method === 'ALL') continue\n\n const key = `${route.method} ${route.path}`\n\n // Skip duplicates\n if (seen.has(key)) continue\n seen.add(key)\n\n // Apply whitelist filter\n if (!isIncludedRoute(route.method, route.path)) continue\n\n // Look up metadata\n const meta = ROUTE_METADATA[key]\n\n if (meta) {\n result.push({\n method: route.method,\n path: route.path,\n description: meta.description,\n authentication: meta.authentication,\n category: meta.category,\n documented: true\n })\n } else {\n // Auto-discovered: infer category and auth\n result.push({\n method: route.method,\n path: route.path,\n description: '',\n authentication: inferAuth(route.path),\n category: inferCategory(route.path),\n documented: false\n })\n }\n }\n\n // Sort: by category, then method order, then path\n const methodOrder: Record = { GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4 }\n result.sort((a, b) => {\n const catCmp = a.category.localeCompare(b.category)\n if (catCmp !== 0) return catCmp\n const methCmp = (methodOrder[a.method] ?? 5) - (methodOrder[b.method] ?? 5)\n if (methCmp !== 0) return methCmp\n return a.path.localeCompare(b.path)\n })\n\n cachedRouteList = result\n return result\n } catch (error) {\n console.error('Failed to inspect routes:', error)\n return []\n }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-V4V54BY3.cjs b/packages/core/dist/chunk-TAOOLOUH.cjs similarity index 93% rename from packages/core/dist/chunk-V4V54BY3.cjs rename to packages/core/dist/chunk-TAOOLOUH.cjs index bbffb3673..b38cdc318 100644 --- a/packages/core/dist/chunk-V4V54BY3.cjs +++ b/packages/core/dist/chunk-TAOOLOUH.cjs @@ -1,7 +1,7 @@ 'use strict'; -var chunkQOZZJZ76_cjs = require('./chunk-QOZZJZ76.cjs'); -var chunk7KR6GOY3_cjs = require('./chunk-7KR6GOY3.cjs'); +var chunk656GGECX_cjs = require('./chunk-656GGECX.cjs'); +var chunkICMNCCX2_cjs = require('./chunk-ICMNCCX2.cjs'); var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs'); var jwt = require('hono/jwt'); var cookie = require('hono/cookie'); @@ -57,23 +57,23 @@ function bootstrapMiddleware(config = {}) { try { console.log("[Bootstrap] Starting system initialization..."); console.log("[Bootstrap] Running database migrations..."); - const migrationService = new chunk7KR6GOY3_cjs.MigrationService(c.env.DB); + const migrationService = new chunkICMNCCX2_cjs.MigrationService(c.env.DB); await migrationService.runPendingMigrations(); console.log("[Bootstrap] Syncing collection configurations..."); try { - await chunkQOZZJZ76_cjs.syncCollections(c.env.DB); + await chunk656GGECX_cjs.syncCollections(c.env.DB); } catch (error) { console.error("[Bootstrap] Error syncing collections:", error); } console.log("[Bootstrap] Syncing form collections..."); try { - await chunkQOZZJZ76_cjs.syncAllFormCollections(c.env.DB); + await chunk656GGECX_cjs.syncAllFormCollections(c.env.DB); } catch (error) { console.error("[Bootstrap] Error syncing form collections:", error); } if (!config.plugins?.disableAll) { console.log("[Bootstrap] Bootstrapping core plugins..."); - const bootstrapService = new chunkQOZZJZ76_cjs.PluginBootstrapService(c.env.DB); + const bootstrapService = new chunk656GGECX_cjs.PluginBootstrapService(c.env.DB); const needsBootstrap = await bootstrapService.isBootstrapNeeded(); if (needsBootstrap) { await bootstrapService.bootstrapCorePlugins(); @@ -200,7 +200,7 @@ async function verifyHs256Signature(token, secret) { return false; } } -var AuthManager = class { +var AuthManager = class _AuthManager { static async generateToken(userId, email, role, secret, expiresInSeconds) { const ttl = expiresInSeconds && expiresInSeconds > 0 ? Math.floor(expiresInSeconds) : DEFAULT_JWT_EXPIRES_IN_SECONDS; const now = Math.floor(Date.now() / 1e3); @@ -216,6 +216,13 @@ var AuthManager = class { /** * Verify a token's signature and expiration. * + * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the + * `secret` argument. If omitted, this falls back to a development-only + * placeholder secret — tokens signed with the real `JWT_SECRET` will then + * silently fail verification. From inside a Hono handler prefer + * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction + * and pulls the secret from `c.env` for you. + * * If `graceSeconds` > 0, tokens whose `exp` is within the grace window * (i.e. expired by no more than `graceSeconds`) are still returned. This * supports a sliding-session refresh endpoint that accepts recently-expired @@ -251,6 +258,26 @@ var AuthManager = class { return null; } } + /** + * Verify the JWT on an incoming Hono request using the `JWT_SECRET` + * binding from `c.env`. Reads the token from the `Authorization: Bearer …` + * header first, then falls back to the `auth_token` cookie. Returns the + * decoded payload, or null when the token is missing, malformed, expired, + * or signed with a different secret. + * + * Use this from custom Hono routes mounted alongside SonicJS — it + * resolves the secret the same way `requireAuth()` does, without forcing + * the caller to plumb it through manually. + */ + static async verifyAuthRequest(c) { + let token = c.req.header("Authorization")?.replace("Bearer ", ""); + if (!token) { + token = cookie.getCookie(c, "auth_token"); + } + if (!token) return null; + const secret = c.env?.JWT_SECRET; + return await _AuthManager.verifyToken(token, secret); + } static async hashPassword(password) { const iterations = 1e5; const salt = new Uint8Array(16); @@ -718,5 +745,5 @@ exports.securityHeadersMiddleware = securityHeadersMiddleware; exports.securityLoggingMiddleware = securityLoggingMiddleware; exports.validateCsrfToken = validateCsrfToken; exports.verifySecurityConfig = verifySecurityConfig; -//# sourceMappingURL=chunk-V4V54BY3.cjs.map -//# sourceMappingURL=chunk-V4V54BY3.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-TAOOLOUH.cjs.map +//# sourceMappingURL=chunk-TAOOLOUH.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-TAOOLOUH.cjs.map b/packages/core/dist/chunk-TAOOLOUH.cjs.map new file mode 100644 index 000000000..9edd1dfbd --- /dev/null +++ b/packages/core/dist/chunk-TAOOLOUH.cjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/middleware/bootstrap.ts","../src/middleware/auth.ts","../src/middleware/metrics.ts","../src/middleware/csrf.ts","../src/middleware/rate-limit.ts","../src/middleware/security-headers.ts","../src/middleware/index.ts"],"names":["MigrationService","syncCollections","syncAllFormCollections","PluginBootstrapService","sign","verify","getCookie","result","setCookie","metricsTracker","JWT_SECRET_FALLBACK"],"mappings":"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","file":"chunk-TAOOLOUH.cjs","sourcesContent":["import { Context, Next } from \"hono\";\nimport { syncCollections } from \"../services/collection-sync\";\nimport { syncAllFormCollections } from \"../services/form-collection-sync\";\nimport { MigrationService } from \"../services/migrations\";\nimport { PluginBootstrapService } from \"../services/plugin-bootstrap\";\nimport type { SonicJSConfig } from \"../app\";\n\ntype Bindings = {\n DB: D1Database;\n KV: KVNamespace;\n JWT_SECRET?: string;\n CORS_ORIGINS?: string;\n ENVIRONMENT?: string;\n};\n\n// Track if bootstrap has been run in this worker instance\nlet bootstrapComplete = false;\n\n/**\n * Verify security-critical environment configuration at startup.\n * Logs warnings in development, throws in production to prevent\n * insecure deployments from silently running.\n */\nexport function verifySecurityConfig(env: Bindings): void {\n const warnings: string[] = [];\n\n // Check JWT secret\n if (!env.JWT_SECRET) {\n warnings.push(\n \"JWT_SECRET is not set — using hardcoded fallback. Set via `wrangler secret put JWT_SECRET`\"\n );\n } else if (env.JWT_SECRET.includes(\"change-in-production\")) {\n warnings.push(\n \"JWT_SECRET contains the default value — tokens are forgeable. Generate a strong random secret\"\n );\n }\n\n // Check CORS origins\n if (!env.CORS_ORIGINS) {\n warnings.push(\n \"CORS_ORIGINS is not set — all cross-origin API requests will be rejected\"\n );\n }\n\n // Check environment designation\n if (!env.ENVIRONMENT) {\n warnings.push(\n \"ENVIRONMENT is not set — HSTS header will not be applied. Set to \\\"production\\\" or \\\"development\\\"\"\n );\n }\n\n if (warnings.length === 0) {\n return;\n }\n\n const isProduction = env.ENVIRONMENT === \"production\";\n\n for (const warning of warnings) {\n console.warn(`[SonicJS Security] ${warning}`);\n }\n\n if (isProduction) {\n // In production, a missing or default JWT_SECRET is a hard failure —\n // every token issued would be forgeable by anyone reading the source code.\n const hasCritical =\n !env.JWT_SECRET || env.JWT_SECRET.includes(\"change-in-production\");\n if (hasCritical) {\n throw new Error(\n \"[SonicJS Security] CRITICAL: Production deployment is missing a secure JWT_SECRET. \" +\n \"Set it via `wrangler secret put JWT_SECRET` before deploying.\"\n );\n }\n }\n}\n\n/**\n * Bootstrap middleware that ensures system initialization\n * Runs once per worker instance\n */\nexport function bootstrapMiddleware(config: SonicJSConfig = {}) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n // Skip if already bootstrapped in this worker instance\n if (bootstrapComplete) {\n return next();\n }\n\n // Skip bootstrap for static assets and health checks\n const path = c.req.path;\n if (\n path.startsWith(\"/images/\") ||\n path.startsWith(\"/assets/\") ||\n path === \"/health\" ||\n path.endsWith(\".js\") ||\n path.endsWith(\".css\") ||\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".ico\")\n ) {\n return next();\n }\n\n try {\n console.log(\"[Bootstrap] Starting system initialization...\");\n\n // 1. Run database migrations first\n console.log(\"[Bootstrap] Running database migrations...\");\n const migrationService = new MigrationService(c.env.DB);\n await migrationService.runPendingMigrations();\n\n // 2. Sync collection configurations\n console.log(\"[Bootstrap] Syncing collection configurations...\");\n try {\n await syncCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing collections:\", error);\n // Continue bootstrap even if collection sync fails\n }\n\n // 2b. Sync form-derived shadow collections\n console.log(\"[Bootstrap] Syncing form collections...\");\n try {\n await syncAllFormCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing form collections:\", error);\n }\n\n // 3. Bootstrap core plugins (unless disableAll is set)\n if (!config.plugins?.disableAll) {\n console.log(\"[Bootstrap] Bootstrapping core plugins...\");\n const bootstrapService = new PluginBootstrapService(c.env.DB);\n\n // Check if bootstrap is needed\n const needsBootstrap = await bootstrapService.isBootstrapNeeded();\n if (needsBootstrap) {\n await bootstrapService.bootstrapCorePlugins();\n }\n } else {\n console.log(\"[Bootstrap] Plugin bootstrap skipped (disableAll is true)\");\n }\n\n // Mark bootstrap as complete for this worker instance\n bootstrapComplete = true;\n console.log(\"[Bootstrap] System initialization completed\");\n } catch (error) {\n console.error(\"[Bootstrap] Error during system initialization:\", error);\n // Don't prevent the app from starting, but log the error\n }\n\n // 4. Verify security configuration (outside try/catch so critical\n // errors in production propagate and prevent insecure deployments)\n verifySecurityConfig(c.env as Bindings);\n\n return next();\n };\n}\n\n/**\n * Reset bootstrap flag (useful for testing)\n */\nexport function resetBootstrap() {\n bootstrapComplete = false;\n}\n","import { sign, verify } from 'hono/jwt'\nimport { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\ntype JWTPayload = {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n}\n\n// Fallback JWT secret for local development only (no wrangler secret set)\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// Default JWT TTL: 30 days. Can be overridden via JWT_EXPIRES_IN env var.\nconst DEFAULT_JWT_EXPIRES_IN_SECONDS = 60 * 60 * 24 * 30\n\n/**\n * Parse a TTL string like \"30d\", \"12h\", \"3600s\", or a bare number-of-seconds\n * into a seconds value. Returns null if the input is missing/unparseable.\n */\nfunction parseDuration(input: string | number | undefined | null): number | null {\n if (input === undefined || input === null || input === '') return null\n if (typeof input === 'number' && Number.isFinite(input) && input > 0) {\n return Math.floor(input)\n }\n const raw = String(input).trim()\n if (/^\\d+$/.test(raw)) {\n const n = parseInt(raw, 10)\n return n > 0 ? n : null\n }\n const match = raw.match(/^(\\d+)\\s*(s|sec|secs|seconds|m|min|mins|minutes|h|hr|hrs|hours|d|day|days)$/i)\n if (!match) return null\n const value = parseInt(match[1]!, 10)\n const unit = match[2]!.toLowerCase()\n if (unit.startsWith('s')) return value\n if (unit.startsWith('m')) return value * 60\n if (unit.startsWith('h')) return value * 60 * 60\n if (unit.startsWith('d')) return value * 60 * 60 * 24\n return null\n}\n\n/**\n * Resolve the JWT expiry in seconds from the environment.\n * Honors `JWT_EXPIRES_IN` (seconds or \"30d\"/\"12h\"/\"3600s\") with a 30-day default.\n */\nexport function getJwtExpirySeconds(env?: Record | null): number {\n const configured = parseDuration(env?.JWT_EXPIRES_IN)\n return configured ?? DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the JWT expiry in seconds. Precedence: `JWT_EXPIRES_IN` env var\n * (authoritative ceiling) → `settings.security.jwtExpiresIn` DB value\n * (admin-configurable) → 30-day default.\n *\n * The env var wins so operators can cap runtime overrides — admins can adjust\n * the TTL from /admin/settings/security, but an env var, if set, always wins.\n * DB failures fall back to env/default so auth never breaks if the settings\n * table is unreachable.\n */\nexport async function getJwtExpirySecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const envParsed = parseDuration(env?.JWT_EXPIRES_IN)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtExpiresIn'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* value may already be a bare string */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtExpiresIn from settings, falling back to default:', err)\n }\n }\n return DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the refresh grace window (seconds) for `/auth/refresh`. Precedence:\n * `JWT_REFRESH_GRACE_SECONDS` env var → `settings.security.jwtRefreshGraceSeconds`\n * DB value → 7-day default.\n */\nexport async function getJwtRefreshGraceSecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const DEFAULT_GRACE = 60 * 60 * 24 * 7\n const envParsed = parseDuration(env?.JWT_REFRESH_GRACE_SECONDS)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtRefreshGraceSeconds'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* may be bare */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtRefreshGraceSeconds from settings:', err)\n }\n }\n return DEFAULT_GRACE\n}\n\n/**\n * Decode a JWT payload without verifying the signature. Returns null on any\n * parsing failure. Callers MUST independently verify the signature before\n * trusting this value — used from the grace-window refresh path where the\n * signature is verified explicitly via `verifyHs256Signature`.\n */\nfunction decodeJwtPayload(token: string): JWTPayload | null {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return null\n const b64 = parts[1]!.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const json = atob(padded)\n const obj = JSON.parse(json)\n if (!obj || typeof obj.exp !== 'number') return null\n return obj as JWTPayload\n } catch {\n return null\n }\n}\n\nfunction base64UrlToBytes(b64url: string): Uint8Array {\n const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const bin = atob(padded)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return bytes\n}\n\n/**\n * Verify a JWT's HS256 signature using Web Crypto, independent of hono/jwt.\n * Returns true iff the signature matches the header.payload portion.\n */\nasync function verifyHs256Signature(token: string, secret: string): Promise {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return false\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n )\n const signature = base64UrlToBytes(parts[2]!)\n const message = encoder.encode(`${parts[0]}.${parts[1]}`)\n return await crypto.subtle.verify('HMAC', key, signature, message)\n } catch {\n return false\n }\n}\n\nexport class AuthManager {\n static async generateToken(\n userId: string,\n email: string,\n role: string,\n secret?: string,\n expiresInSeconds?: number\n ): Promise {\n const ttl = expiresInSeconds && expiresInSeconds > 0\n ? Math.floor(expiresInSeconds)\n : DEFAULT_JWT_EXPIRES_IN_SECONDS\n const now = Math.floor(Date.now() / 1000)\n const payload: JWTPayload = {\n userId,\n email,\n role,\n exp: now + ttl,\n iat: now\n }\n\n return await sign(payload, secret || JWT_SECRET_FALLBACK, 'HS256')\n }\n\n /**\n * Verify a token's signature and expiration.\n *\n * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the\n * `secret` argument. If omitted, this falls back to a development-only\n * placeholder secret — tokens signed with the real `JWT_SECRET` will then\n * silently fail verification. From inside a Hono handler prefer\n * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction\n * and pulls the secret from `c.env` for you.\n *\n * If `graceSeconds` > 0, tokens whose `exp` is within the grace window\n * (i.e. expired by no more than `graceSeconds`) are still returned. This\n * supports a sliding-session refresh endpoint that accepts recently-expired\n * tokens. Signature failures always return null.\n */\n static async verifyToken(\n token: string,\n secret?: string,\n graceSeconds: number = 0\n ): Promise {\n const effectiveSecret = secret || JWT_SECRET_FALLBACK\n try {\n let payload: JWTPayload | null = null\n try {\n payload = await verify(token, effectiveSecret, 'HS256') as JWTPayload\n } catch (verifyError: any) {\n // hono/jwt checks `exp` before signature, so a bad-signature token\n // that happens to be expired will throw JwtTokenExpired here. For\n // the grace window, we still require a valid HS256 signature before\n // accepting the payload.\n const name = verifyError?.name || ''\n const message = String(verifyError?.message || '')\n const isExpired = name === 'JwtTokenExpired' || message.includes('expired')\n if (!isExpired || graceSeconds <= 0) {\n throw verifyError\n }\n const signatureValid = await verifyHs256Signature(token, effectiveSecret)\n if (!signatureValid) return null\n const decoded = decodeJwtPayload(token)\n if (!decoded) return null\n payload = decoded\n }\n\n if (!payload) return null\n\n const now = Math.floor(Date.now() / 1000)\n if (payload.exp < now - Math.max(0, Math.floor(graceSeconds))) {\n return null\n }\n\n return payload\n } catch (error) {\n console.error('Token verification failed:', error)\n return null\n }\n }\n\n /**\n * Verify the JWT on an incoming Hono request using the `JWT_SECRET`\n * binding from `c.env`. Reads the token from the `Authorization: Bearer …`\n * header first, then falls back to the `auth_token` cookie. Returns the\n * decoded payload, or null when the token is missing, malformed, expired,\n * or signed with a different secret.\n *\n * Use this from custom Hono routes mounted alongside SonicJS — it\n * resolves the secret the same way `requireAuth()` does, without forcing\n * the caller to plumb it through manually.\n */\n static async verifyAuthRequest(c: Context): Promise {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n if (!token) return null\n const secret = (c.env as any)?.JWT_SECRET\n return await AuthManager.verifyToken(token, secret)\n }\n\n static async hashPassword(password: string): Promise {\n const iterations = 100000\n const salt = new Uint8Array(16)\n crypto.getRandomValues(salt)\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const saltHex = Array.from(salt).map(b => b.toString(16).padStart(2, '0')).join('')\n const hashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n return `pbkdf2:${iterations}:${saltHex}:${hashHex}`\n }\n\n static async hashPasswordLegacy(password: string): Promise {\n const encoder = new TextEncoder()\n const data = encoder.encode(password + 'salt-change-in-production')\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n static async verifyPassword(password: string, storedHash: string): Promise {\n if (storedHash.startsWith('pbkdf2:')) {\n // PBKDF2 format: pbkdf2:::\n const parts = storedHash.split(':')\n if (parts.length !== 4) return false\n\n const iterationsStr = parts[1]!\n const saltHex = parts[2]!\n const expectedHashHex = parts[3]!\n const iterations = parseInt(iterationsStr, 10)\n\n const saltBytes = saltHex.match(/.{2}/g)\n if (!saltBytes) return false\n const salt = new Uint8Array(saltBytes.map(byte => parseInt(byte, 16)))\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const actualHashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n // Constant-time comparison\n if (actualHashHex.length !== expectedHashHex.length) return false\n let result = 0\n for (let i = 0; i < actualHashHex.length; i++) {\n result |= actualHashHex.charCodeAt(i) ^ expectedHashHex.charCodeAt(i)\n }\n return result === 0\n }\n\n // Legacy SHA-256 format (no colons in hash)\n const legacyHash = await this.hashPasswordLegacy(password)\n // Constant-time comparison for legacy too\n if (legacyHash.length !== storedHash.length) return false\n let result = 0\n for (let i = 0; i < legacyHash.length; i++) {\n result |= legacyHash.charCodeAt(i) ^ storedHash.charCodeAt(i)\n }\n return result === 0\n }\n\n static isLegacyHash(storedHash: string): boolean {\n return !storedHash.startsWith('pbkdf2:')\n }\n\n /**\n * Set authentication cookie - useful for plugins implementing alternative auth methods\n * @param c - Hono context\n * @param token - JWT token to set in cookie\n * @param options - Optional cookie configuration\n */\n static setAuthCookie(c: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void {\n setCookie(c, 'auth_token', token, {\n httpOnly: options?.httpOnly ?? true,\n secure: options?.secure ?? true,\n sameSite: options?.sameSite ?? 'Strict',\n maxAge: options?.maxAge ?? getJwtExpirySeconds((c as any)?.env)\n })\n }\n}\n\n// Middleware to require authentication\nexport const requireAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n // Try to get token from Authorization header\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n\n // If no header token, try cookie\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n\n if (!token) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n // Try to get cached token verification from KV\n const kv = c.env?.KV\n let payload: JWTPayload | null = null\n\n if (kv) {\n const cacheKey = `auth:${token.substring(0, 20)}` // Use token prefix as key\n const cached = await kv.get(cacheKey, 'json')\n if (cached) {\n payload = cached as JWTPayload\n }\n }\n\n // If not cached, verify token\n if (!payload) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n payload = await AuthManager.verifyToken(token, jwtSecret)\n\n // Cache the verified payload for 5 minutes\n if (payload && kv) {\n const cacheKey = `auth:${token.substring(0, 20)}`\n await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 })\n }\n }\n\n if (!payload) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Your session has expired, please login again')\n }\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Add user info to context\n c.set('user', payload)\n\n return await next()\n } catch (error) {\n console.error('Auth middleware error:', error)\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Authentication failed, please login again')\n }\n return c.json({ error: 'Authentication failed' }, 401)\n }\n }\n}\n\n// Middleware to require specific role\nexport const requireRole = (requiredRole: string | string[]) => {\n return async (c: Context, next: Next) => {\n const user = c.get('user') as JWTPayload\n \n if (!user) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n \n const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]\n \n if (!roles.includes(user.role)) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=You do not have permission to access this area')\n }\n return c.json({ error: 'Insufficient permissions' }, 403)\n }\n \n return await next()\n }\n}\n\n// Optional auth middleware (doesn't block if no token)\nexport const optionalAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n \n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n \n if (token) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n const payload = await AuthManager.verifyToken(token, jwtSecret)\n if (payload) {\n c.set('user', payload)\n }\n }\n \n return await next()\n } catch (error) {\n // Don't block on auth errors in optional auth\n console.error('Optional auth error:', error)\n return await next()\n }\n }\n}\n","import { MiddlewareHandler } from 'hono'\nimport { metricsTracker } from '../utils/metrics'\n\n/**\n * Middleware to track all HTTP requests for real-time analytics\n * Excludes the metrics endpoint itself to avoid inflating the count\n */\nexport const metricsMiddleware = (): MiddlewareHandler => {\n return async (c, next) => {\n const path = new URL(c.req.url).pathname\n\n // Don't track the metrics endpoint itself to avoid self-inflating counts\n if (path !== '/admin/dashboard/api/metrics') {\n metricsTracker.recordRequest()\n }\n\n // Continue with the request\n await next()\n }\n}\n","/**\n * CSRF Protection Middleware — Signed Double-Submit Cookie\n *\n * Stateless CSRF protection for Cloudflare Workers (no session store needed).\n * Token format: `.` where HMAC-SHA256 is keyed with JWT_SECRET.\n *\n * Flow:\n * GET — ensureCsrfCookie(): reuse existing valid cookie or set a new one\n * POST/PUT/DELETE/PATCH — validate X-CSRF-Token header === csrf_token cookie, HMAC valid\n *\n * Exempt:\n * - Safe methods (GET, HEAD, OPTIONS)\n * - Auth routes that create sessions (/auth/login*, /auth/register*, etc.)\n * - Public form submissions (/forms/*, /api/forms/*) — NOT /admin/forms/*\n * - Requests with no auth_token cookie (Bearer-only or API-key-only)\n */\n\nimport type { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\n// Fallback secret — mirrors auth.ts behavior for local dev without wrangler secret\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Convert ArrayBuffer to URL-safe base64 (no padding). */\nexport function arrayBufferToBase64Url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!)\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Import a string key for HMAC-SHA256. */\nasync function getHmacKey(secret: string): Promise {\n const encoder = new TextEncoder()\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify']\n )\n}\n\n// ============================================================================\n// Token Generation & Validation\n// ============================================================================\n\n/**\n * Generate a signed CSRF token: `.`\n * - nonce = 32 random bytes, base64url-encoded\n * - signature = HMAC-SHA256(nonce, secret), base64url-encoded\n */\nexport async function generateCsrfToken(secret: string): Promise {\n const nonceBytes = new Uint8Array(32)\n crypto.getRandomValues(nonceBytes)\n const nonce = arrayBufferToBase64Url(nonceBytes.buffer)\n\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(nonce))\n const signature = arrayBufferToBase64Url(signatureBuffer)\n\n return `${nonce}.${signature}`\n}\n\n/**\n * Validate a signed CSRF token.\n *\n * Checks that the token has the correct `.` format and that\n * the HMAC signature is valid for the given secret. Uses crypto.subtle.verify\n * which provides constant-time comparison.\n *\n * NOTE: No expiry check here — by design. The security property of signed\n * double-submit comes from the unpredictability of the nonce + the\n * secret-bound HMAC, not from time-bounding. The cookie's maxAge (86400s)\n * handles expiry at the browser level.\n */\nexport async function validateCsrfToken(token: string, secret: string): Promise {\n if (!token || typeof token !== 'string') return false\n\n const dotIndex = token.indexOf('.')\n if (dotIndex === -1) return false\n\n const nonce = token.substring(0, dotIndex)\n const signature = token.substring(dotIndex + 1)\n\n if (!nonce || !signature) return false\n\n try {\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n\n // Decode the signature from base64url\n const sigPadded = signature.replace(/-/g, '+').replace(/_/g, '/')\n const sigBinary = atob(sigPadded)\n const sigBytes = new Uint8Array(sigBinary.length)\n for (let i = 0; i < sigBinary.length; i++) {\n sigBytes[i] = sigBinary.charCodeAt(i)\n }\n\n // crypto.subtle.verify is constant-time\n return await crypto.subtle.verify('HMAC', key, sigBytes.buffer, encoder.encode(nonce))\n } catch {\n return false\n }\n}\n\n// ============================================================================\n// Default Exempt Paths\n// ============================================================================\n\nconst DEFAULT_EXEMPT_PATHS = [\n '/auth/login',\n '/auth/register',\n '/auth/seed-admin',\n '/auth/accept-invitation',\n '/auth/reset-password',\n '/auth/request-password-reset',\n '/auth/otp',\n '/auth/magic-link',\n '/auth/verify',\n '/api/stripe/webhook',\n '/api/events',\n]\n\n/**\n * Check whether a request path is exempt from CSRF validation.\n * - Exact match or startsWith for auth routes (e.g. /auth/login/form)\n * - /forms/* and /api/forms/* are exempt (public submissions)\n * - /api/search* is exempt (read-only POST for complex query params)\n * - /admin/forms/* is NOT exempt\n */\nfunction isExemptPath(path: string, extraExemptPaths: string[] = []): boolean {\n // Public form routes — NOT /admin/forms/*\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/') || path === '/forms' || path === '/api/forms') {\n return true\n }\n\n // Search API — read-only POST (includes /api/search/click, /api/search/facet-click)\n if (path.startsWith('/api/search')) {\n return true\n }\n\n const allExempt = [...DEFAULT_EXEMPT_PATHS, ...extraExemptPaths]\n for (const exempt of allExempt) {\n if (path === exempt || path.startsWith(exempt + '/')) {\n return true\n }\n }\n\n return false\n}\n\n// ============================================================================\n// Middleware\n// ============================================================================\n\nexport interface CsrfOptions {\n /** Additional paths to exempt from CSRF validation. */\n exemptPaths?: string[]\n}\n\n/**\n * CSRF protection middleware (Signed Double-Submit Cookie).\n *\n * - GET/HEAD/OPTIONS: ensure a valid csrf_token cookie exists\n * - POST/PUT/DELETE/PATCH: validate X-CSRF-Token header matches cookie, HMAC valid\n * - Exempt: auth routes, public /forms/*, Bearer-only, API-key-only\n */\nexport function csrfProtection(options: CsrfOptions = {}) {\n return async (c: Context, next: Next): Promise => {\n const method = c.req.method.toUpperCase()\n const path = new URL(c.req.url).pathname\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n\n // Warn if using fallback secret in production\n if (c.env?.ENVIRONMENT === 'production' && !c.env?.JWT_SECRET) {\n console.warn(\n '[CSRF] WARNING: JWT_SECRET is not set in production. ' +\n 'CSRF tokens are signed with the fallback key, which is insecure.'\n )\n }\n\n // Safe methods — just ensure cookie, then pass through\n if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS') {\n await ensureCsrfCookie(c, secret)\n await next()\n return\n }\n\n // Exempt paths — pass through without validation\n if (isExemptPath(path, options.exemptPaths)) {\n await next()\n return\n }\n\n // Bearer-only or API-key-only requests (no auth_token cookie) — exempt\n const authCookie = getCookie(c, 'auth_token')\n if (!authCookie) {\n await next()\n return\n }\n\n // Requests with an Authorization header use token-based auth — the cookie\n // is incidental and CSRF protection is unnecessary (the attacker cannot\n // forge the Authorization header from a cross-origin page).\n const authHeader = c.req.header('Authorization')\n if (authHeader) {\n await next()\n return\n }\n\n // State-changing request with cookie auth — validate CSRF\n const cookieToken = getCookie(c, 'csrf_token')\n let headerToken = c.req.header('X-CSRF-Token')\n\n // Fallback: check _csrf field in form-encoded body (regular HTML form submissions)\n if (!headerToken) {\n const contentType = c.req.header('Content-Type') || ''\n if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n try {\n const body = await c.req.parseBody()\n headerToken = body['_csrf'] as string | undefined\n } catch {\n // Body not parseable — leave headerToken undefined\n }\n }\n }\n\n if (!cookieToken || !headerToken) {\n return csrfError(c, 'CSRF token missing')\n }\n\n if (cookieToken !== headerToken) {\n return csrfError(c, 'CSRF token mismatch')\n }\n\n const isValid = await validateCsrfToken(cookieToken, secret)\n if (!isValid) {\n return csrfError(c, 'CSRF token invalid')\n }\n\n await next()\n }\n}\n\n/**\n * Ensure a valid CSRF cookie exists. Check-then-reuse: if the existing cookie\n * has a valid HMAC signature, reuse it (no new Set-Cookie header). Only\n * generate a fresh token when the cookie is missing or has an invalid signature.\n */\nasync function ensureCsrfCookie(c: Context, secret: string): Promise {\n const existing = getCookie(c, 'csrf_token')\n\n if (existing) {\n const isValid = await validateCsrfToken(existing, secret)\n if (isValid) {\n // Reuse existing valid token — no Set-Cookie needed\n c.set('csrfToken', existing)\n return\n }\n }\n\n // Generate fresh token\n const token = await generateCsrfToken(secret)\n c.set('csrfToken', token)\n\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n setCookie(c, 'csrf_token', token, {\n httpOnly: false, // JS must read this cookie\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: 86400, // 24 hours — browser-side expiry\n })\n}\n\n/** Return a 403 CSRF error — HTML for browser requests, JSON for API. */\nfunction csrfError(c: Context, message: string): Response {\n const accept = c.req.header('Accept') || ''\n if (accept.includes('text/html')) {\n return c.html(\n `403 Forbidden` +\n `

403 Forbidden

${message}

`,\n 403\n )\n }\n return c.json({ error: message, status: 403 }, 403)\n}\n","import { Context, Next } from 'hono'\n\ninterface RateLimitOptions {\n max: number\n windowMs: number\n keyPrefix: string\n}\n\ninterface RateLimitEntry {\n count: number\n resetAt: number\n}\n\n/**\n * KV-based sliding window rate limiter middleware.\n * Gracefully skips if CACHE_KV binding is not available.\n */\nexport function rateLimit(options: RateLimitOptions) {\n const { max, windowMs, keyPrefix } = options\n\n return async (c: Context, next: Next) => {\n const kv = (c.env as any)?.CACHE_KV\n if (!kv) {\n // No KV binding available — skip rate limiting\n return await next()\n }\n\n const ip = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const key = `ratelimit:${keyPrefix}:${ip}`\n\n try {\n const now = Date.now()\n const stored = await kv.get(key, 'json') as RateLimitEntry | null\n\n let entry: RateLimitEntry\n if (stored && stored.resetAt > now) {\n entry = stored\n } else {\n entry = { count: 0, resetAt: now + windowMs }\n }\n\n entry.count++\n\n // Calculate TTL in seconds (KV expiration)\n const ttlSeconds = Math.ceil((entry.resetAt - now) / 1000)\n\n if (entry.count > max) {\n // Store the updated count even when rejecting\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n const retryAfter = Math.ceil((entry.resetAt - now) / 1000)\n c.header('Retry-After', String(retryAfter))\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', '0')\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n return c.json({ error: 'Too many requests. Please try again later.' }, 429)\n }\n\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', String(max - entry.count))\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n\n return await next()\n } catch (error) {\n // Rate limiting should never break the app\n console.error('Rate limiter error (non-fatal):', error)\n return await next()\n }\n }\n}\n","import { Context, Next } from 'hono'\n\n/**\n * Security headers middleware.\n * Sets standard security headers on every response.\n * Skips HSTS in development to avoid local dev issues.\n */\nexport const securityHeadersMiddleware = () => {\n return async (c: Context, next: Next) => {\n await next()\n\n c.header('X-Content-Type-Options', 'nosniff')\n c.header('X-Frame-Options', 'SAMEORIGIN')\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin')\n c.header('Permissions-Policy', 'camera=(), microphone=(), geolocation=()')\n\n // Only set HSTS in non-development environments\n const environment = (c.env as any)?.ENVIRONMENT\n if (environment !== 'development') {\n c.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains')\n }\n }\n}\n","/**\n * Middleware Module Exports\n *\n * Request processing middleware for SonicJS\n *\n * Note: Most middleware is currently in the monolith and will be migrated later.\n * For now, we only export the bootstrap middleware which is used for system initialization.\n */\n\n// Bootstrap middleware\nexport { bootstrapMiddleware, verifySecurityConfig } from './bootstrap'\n\n// Auth middleware\nexport {\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n getJwtExpirySeconds,\n getJwtExpirySecondsFromDb,\n getJwtRefreshGraceSecondsFromDb,\n} from './auth'\n\n// Metrics middleware\nexport { metricsMiddleware } from './metrics'\n\n// CSRF protection middleware\nexport { csrfProtection, generateCsrfToken, validateCsrfToken } from './csrf'\n\n// Rate limiting middleware\nexport { rateLimit } from './rate-limit'\n\n// Re-export types and functions that are referenced but implemented in monolith\n// These are placeholder exports to maintain API compatibility\nexport type Permission = string\nexport type UserPermissions = {\n userId: string\n permissions: Permission[]\n}\n\n// Middleware stubs - these return pass-through middleware that call next()\nexport const loggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const detailedLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const securityLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const performanceLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const cacheHeaders: any = () => async (_c: any, next: any) => await next()\nexport const compressionMiddleware: any = async (_c: any, next: any) => await next()\nexport { securityHeadersMiddleware as securityHeaders } from './security-headers'\n\n// Other stubs\nexport const PermissionManager: any = {}\nexport const requirePermission: any = () => async (_c: any, next: any) => await next()\nexport const requireAnyPermission: any = () => async (_c: any, next: any) => await next()\nexport const logActivity: any = () => {}\nexport const requireActivePlugin: any = () => async (_c: any, next: any) => await next()\nexport const requireActivePlugins: any = () => async (_c: any, next: any) => await next()\nexport const getActivePlugins: any = () => []\nexport const isPluginActive: any = () => false\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-NGTBJJXZ.js b/packages/core/dist/chunk-TFNTM3OA.js similarity index 94% rename from packages/core/dist/chunk-NGTBJJXZ.js rename to packages/core/dist/chunk-TFNTM3OA.js index d1f3a342c..25bf761f1 100644 --- a/packages/core/dist/chunk-NGTBJJXZ.js +++ b/packages/core/dist/chunk-TFNTM3OA.js @@ -4,9 +4,9 @@ import { __commonJS, __toESM } from './chunk-V4OQ3NZ2.js'; import { z } from 'zod'; import { Hono } from 'hono'; -// ../../../../node_modules/semver/internal/constants.js +// ../../node_modules/semver/internal/constants.js var require_constants = __commonJS({ - "../../../../node_modules/semver/internal/constants.js"(exports$1, module) { + "../../node_modules/semver/internal/constants.js"(exports$1, module) { var SEMVER_SPEC_VERSION = "2.0.0"; var MAX_LENGTH = 256; var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */ @@ -35,18 +35,18 @@ var require_constants = __commonJS({ } }); -// ../../../../node_modules/semver/internal/debug.js +// ../../node_modules/semver/internal/debug.js var require_debug = __commonJS({ - "../../../../node_modules/semver/internal/debug.js"(exports$1, module) { + "../../node_modules/semver/internal/debug.js"(exports$1, module) { var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => { }; module.exports = debug; } }); -// ../../../../node_modules/semver/internal/re.js +// ../../node_modules/semver/internal/re.js var require_re = __commonJS({ - "../../../../node_modules/semver/internal/re.js"(exports$1, module) { + "../../node_modules/semver/internal/re.js"(exports$1, module) { var { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, @@ -131,9 +131,9 @@ var require_re = __commonJS({ } }); -// ../../../../node_modules/semver/internal/parse-options.js +// ../../node_modules/semver/internal/parse-options.js var require_parse_options = __commonJS({ - "../../../../node_modules/semver/internal/parse-options.js"(exports$1, module) { + "../../node_modules/semver/internal/parse-options.js"(exports$1, module) { var looseOption = Object.freeze({ loose: true }); var emptyOpts = Object.freeze({}); var parseOptions = (options) => { @@ -149,9 +149,9 @@ var require_parse_options = __commonJS({ } }); -// ../../../../node_modules/semver/internal/identifiers.js +// ../../node_modules/semver/internal/identifiers.js var require_identifiers = __commonJS({ - "../../../../node_modules/semver/internal/identifiers.js"(exports$1, module) { + "../../node_modules/semver/internal/identifiers.js"(exports$1, module) { var numeric = /^[0-9]+$/; var compareIdentifiers = (a, b) => { if (typeof a === "number" && typeof b === "number") { @@ -173,9 +173,9 @@ var require_identifiers = __commonJS({ } }); -// ../../../../node_modules/semver/classes/semver.js +// ../../node_modules/semver/classes/semver.js var require_semver = __commonJS({ - "../../../../node_modules/semver/classes/semver.js"(exports$1, module) { + "../../node_modules/semver/classes/semver.js"(exports$1, module) { var debug = require_debug(); var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants(); var { safeRe: re, t } = require_re(); @@ -451,9 +451,9 @@ var require_semver = __commonJS({ } }); -// ../../../../node_modules/semver/functions/parse.js +// ../../node_modules/semver/functions/parse.js var require_parse = __commonJS({ - "../../../../node_modules/semver/functions/parse.js"(exports$1, module) { + "../../node_modules/semver/functions/parse.js"(exports$1, module) { var SemVer = require_semver(); var parse = (version, options, throwErrors = false) => { if (version instanceof SemVer) { @@ -472,9 +472,9 @@ var require_parse = __commonJS({ } }); -// ../../../../node_modules/semver/functions/valid.js +// ../../node_modules/semver/functions/valid.js var require_valid = __commonJS({ - "../../../../node_modules/semver/functions/valid.js"(exports$1, module) { + "../../node_modules/semver/functions/valid.js"(exports$1, module) { var parse = require_parse(); var valid = (version, options) => { const v = parse(version, options); @@ -484,9 +484,9 @@ var require_valid = __commonJS({ } }); -// ../../../../node_modules/semver/functions/clean.js +// ../../node_modules/semver/functions/clean.js var require_clean = __commonJS({ - "../../../../node_modules/semver/functions/clean.js"(exports$1, module) { + "../../node_modules/semver/functions/clean.js"(exports$1, module) { var parse = require_parse(); var clean = (version, options) => { const s = parse(version.trim().replace(/^[=v]+/, ""), options); @@ -496,9 +496,9 @@ var require_clean = __commonJS({ } }); -// ../../../../node_modules/semver/functions/inc.js +// ../../node_modules/semver/functions/inc.js var require_inc = __commonJS({ - "../../../../node_modules/semver/functions/inc.js"(exports$1, module) { + "../../node_modules/semver/functions/inc.js"(exports$1, module) { var SemVer = require_semver(); var inc = (version, release, options, identifier, identifierBase) => { if (typeof options === "string") { @@ -519,9 +519,9 @@ var require_inc = __commonJS({ } }); -// ../../../../node_modules/semver/functions/diff.js +// ../../node_modules/semver/functions/diff.js var require_diff = __commonJS({ - "../../../../node_modules/semver/functions/diff.js"(exports$1, module) { + "../../node_modules/semver/functions/diff.js"(exports$1, module) { var parse = require_parse(); var diff = (version1, version2) => { const v1 = parse(version1, null, true); @@ -562,36 +562,36 @@ var require_diff = __commonJS({ } }); -// ../../../../node_modules/semver/functions/major.js +// ../../node_modules/semver/functions/major.js var require_major = __commonJS({ - "../../../../node_modules/semver/functions/major.js"(exports$1, module) { + "../../node_modules/semver/functions/major.js"(exports$1, module) { var SemVer = require_semver(); var major = (a, loose) => new SemVer(a, loose).major; module.exports = major; } }); -// ../../../../node_modules/semver/functions/minor.js +// ../../node_modules/semver/functions/minor.js var require_minor = __commonJS({ - "../../../../node_modules/semver/functions/minor.js"(exports$1, module) { + "../../node_modules/semver/functions/minor.js"(exports$1, module) { var SemVer = require_semver(); var minor = (a, loose) => new SemVer(a, loose).minor; module.exports = minor; } }); -// ../../../../node_modules/semver/functions/patch.js +// ../../node_modules/semver/functions/patch.js var require_patch = __commonJS({ - "../../../../node_modules/semver/functions/patch.js"(exports$1, module) { + "../../node_modules/semver/functions/patch.js"(exports$1, module) { var SemVer = require_semver(); var patch = (a, loose) => new SemVer(a, loose).patch; module.exports = patch; } }); -// ../../../../node_modules/semver/functions/prerelease.js +// ../../node_modules/semver/functions/prerelease.js var require_prerelease = __commonJS({ - "../../../../node_modules/semver/functions/prerelease.js"(exports$1, module) { + "../../node_modules/semver/functions/prerelease.js"(exports$1, module) { var parse = require_parse(); var prerelease = (version, options) => { const parsed = parse(version, options); @@ -601,36 +601,36 @@ var require_prerelease = __commonJS({ } }); -// ../../../../node_modules/semver/functions/compare.js +// ../../node_modules/semver/functions/compare.js var require_compare = __commonJS({ - "../../../../node_modules/semver/functions/compare.js"(exports$1, module) { + "../../node_modules/semver/functions/compare.js"(exports$1, module) { var SemVer = require_semver(); var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose)); module.exports = compare; } }); -// ../../../../node_modules/semver/functions/rcompare.js +// ../../node_modules/semver/functions/rcompare.js var require_rcompare = __commonJS({ - "../../../../node_modules/semver/functions/rcompare.js"(exports$1, module) { + "../../node_modules/semver/functions/rcompare.js"(exports$1, module) { var compare = require_compare(); var rcompare = (a, b, loose) => compare(b, a, loose); module.exports = rcompare; } }); -// ../../../../node_modules/semver/functions/compare-loose.js +// ../../node_modules/semver/functions/compare-loose.js var require_compare_loose = __commonJS({ - "../../../../node_modules/semver/functions/compare-loose.js"(exports$1, module) { + "../../node_modules/semver/functions/compare-loose.js"(exports$1, module) { var compare = require_compare(); var compareLoose = (a, b) => compare(a, b, true); module.exports = compareLoose; } }); -// ../../../../node_modules/semver/functions/compare-build.js +// ../../node_modules/semver/functions/compare-build.js var require_compare_build = __commonJS({ - "../../../../node_modules/semver/functions/compare-build.js"(exports$1, module) { + "../../node_modules/semver/functions/compare-build.js"(exports$1, module) { var SemVer = require_semver(); var compareBuild = (a, b, loose) => { const versionA = new SemVer(a, loose); @@ -641,81 +641,81 @@ var require_compare_build = __commonJS({ } }); -// ../../../../node_modules/semver/functions/sort.js +// ../../node_modules/semver/functions/sort.js var require_sort = __commonJS({ - "../../../../node_modules/semver/functions/sort.js"(exports$1, module) { + "../../node_modules/semver/functions/sort.js"(exports$1, module) { var compareBuild = require_compare_build(); var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)); module.exports = sort; } }); -// ../../../../node_modules/semver/functions/rsort.js +// ../../node_modules/semver/functions/rsort.js var require_rsort = __commonJS({ - "../../../../node_modules/semver/functions/rsort.js"(exports$1, module) { + "../../node_modules/semver/functions/rsort.js"(exports$1, module) { var compareBuild = require_compare_build(); var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)); module.exports = rsort; } }); -// ../../../../node_modules/semver/functions/gt.js +// ../../node_modules/semver/functions/gt.js var require_gt = __commonJS({ - "../../../../node_modules/semver/functions/gt.js"(exports$1, module) { + "../../node_modules/semver/functions/gt.js"(exports$1, module) { var compare = require_compare(); var gt = (a, b, loose) => compare(a, b, loose) > 0; module.exports = gt; } }); -// ../../../../node_modules/semver/functions/lt.js +// ../../node_modules/semver/functions/lt.js var require_lt = __commonJS({ - "../../../../node_modules/semver/functions/lt.js"(exports$1, module) { + "../../node_modules/semver/functions/lt.js"(exports$1, module) { var compare = require_compare(); var lt = (a, b, loose) => compare(a, b, loose) < 0; module.exports = lt; } }); -// ../../../../node_modules/semver/functions/eq.js +// ../../node_modules/semver/functions/eq.js var require_eq = __commonJS({ - "../../../../node_modules/semver/functions/eq.js"(exports$1, module) { + "../../node_modules/semver/functions/eq.js"(exports$1, module) { var compare = require_compare(); var eq = (a, b, loose) => compare(a, b, loose) === 0; module.exports = eq; } }); -// ../../../../node_modules/semver/functions/neq.js +// ../../node_modules/semver/functions/neq.js var require_neq = __commonJS({ - "../../../../node_modules/semver/functions/neq.js"(exports$1, module) { + "../../node_modules/semver/functions/neq.js"(exports$1, module) { var compare = require_compare(); var neq = (a, b, loose) => compare(a, b, loose) !== 0; module.exports = neq; } }); -// ../../../../node_modules/semver/functions/gte.js +// ../../node_modules/semver/functions/gte.js var require_gte = __commonJS({ - "../../../../node_modules/semver/functions/gte.js"(exports$1, module) { + "../../node_modules/semver/functions/gte.js"(exports$1, module) { var compare = require_compare(); var gte = (a, b, loose) => compare(a, b, loose) >= 0; module.exports = gte; } }); -// ../../../../node_modules/semver/functions/lte.js +// ../../node_modules/semver/functions/lte.js var require_lte = __commonJS({ - "../../../../node_modules/semver/functions/lte.js"(exports$1, module) { + "../../node_modules/semver/functions/lte.js"(exports$1, module) { var compare = require_compare(); var lte = (a, b, loose) => compare(a, b, loose) <= 0; module.exports = lte; } }); -// ../../../../node_modules/semver/functions/cmp.js +// ../../node_modules/semver/functions/cmp.js var require_cmp = __commonJS({ - "../../../../node_modules/semver/functions/cmp.js"(exports$1, module) { + "../../node_modules/semver/functions/cmp.js"(exports$1, module) { var eq = require_eq(); var neq = require_neq(); var gt = require_gt(); @@ -762,9 +762,9 @@ var require_cmp = __commonJS({ } }); -// ../../../../node_modules/semver/functions/coerce.js +// ../../node_modules/semver/functions/coerce.js var require_coerce = __commonJS({ - "../../../../node_modules/semver/functions/coerce.js"(exports$1, module) { + "../../node_modules/semver/functions/coerce.js"(exports$1, module) { var SemVer = require_semver(); var parse = require_parse(); var { safeRe: re, t } = require_re(); @@ -807,9 +807,9 @@ var require_coerce = __commonJS({ } }); -// ../../../../node_modules/semver/internal/lrucache.js +// ../../node_modules/semver/internal/lrucache.js var require_lrucache = __commonJS({ - "../../../../node_modules/semver/internal/lrucache.js"(exports$1, module) { + "../../node_modules/semver/internal/lrucache.js"(exports$1, module) { var LRUCache = class { constructor() { this.max = 1e3; @@ -844,9 +844,9 @@ var require_lrucache = __commonJS({ } }); -// ../../../../node_modules/semver/classes/range.js +// ../../node_modules/semver/classes/range.js var require_range = __commonJS({ - "../../../../node_modules/semver/classes/range.js"(exports$1, module) { + "../../node_modules/semver/classes/range.js"(exports$1, module) { var SPACE_CHARACTERS = /\s+/g; var Range = class _Range { constructor(range, options) { @@ -1220,9 +1220,9 @@ var require_range = __commonJS({ } }); -// ../../../../node_modules/semver/classes/comparator.js +// ../../node_modules/semver/classes/comparator.js var require_comparator = __commonJS({ - "../../../../node_modules/semver/classes/comparator.js"(exports$1, module) { + "../../node_modules/semver/classes/comparator.js"(exports$1, module) { var ANY = Symbol("SemVer ANY"); var Comparator = class _Comparator { static get ANY() { @@ -1332,9 +1332,9 @@ var require_comparator = __commonJS({ } }); -// ../../../../node_modules/semver/functions/satisfies.js +// ../../node_modules/semver/functions/satisfies.js var require_satisfies = __commonJS({ - "../../../../node_modules/semver/functions/satisfies.js"(exports$1, module) { + "../../node_modules/semver/functions/satisfies.js"(exports$1, module) { var Range = require_range(); var satisfies = (version, range, options) => { try { @@ -1348,18 +1348,18 @@ var require_satisfies = __commonJS({ } }); -// ../../../../node_modules/semver/ranges/to-comparators.js +// ../../node_modules/semver/ranges/to-comparators.js var require_to_comparators = __commonJS({ - "../../../../node_modules/semver/ranges/to-comparators.js"(exports$1, module) { + "../../node_modules/semver/ranges/to-comparators.js"(exports$1, module) { var Range = require_range(); var toComparators = (range, options) => new Range(range, options).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" ")); module.exports = toComparators; } }); -// ../../../../node_modules/semver/ranges/max-satisfying.js +// ../../node_modules/semver/ranges/max-satisfying.js var require_max_satisfying = __commonJS({ - "../../../../node_modules/semver/ranges/max-satisfying.js"(exports$1, module) { + "../../node_modules/semver/ranges/max-satisfying.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var maxSatisfying = (versions, range, options) => { @@ -1385,9 +1385,9 @@ var require_max_satisfying = __commonJS({ } }); -// ../../../../node_modules/semver/ranges/min-satisfying.js +// ../../node_modules/semver/ranges/min-satisfying.js var require_min_satisfying = __commonJS({ - "../../../../node_modules/semver/ranges/min-satisfying.js"(exports$1, module) { + "../../node_modules/semver/ranges/min-satisfying.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var minSatisfying = (versions, range, options) => { @@ -1413,9 +1413,9 @@ var require_min_satisfying = __commonJS({ } }); -// ../../../../node_modules/semver/ranges/min-version.js +// ../../node_modules/semver/ranges/min-version.js var require_min_version = __commonJS({ - "../../../../node_modules/semver/ranges/min-version.js"(exports$1, module) { + "../../node_modules/semver/ranges/min-version.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var gt = require_gt(); @@ -1471,9 +1471,9 @@ var require_min_version = __commonJS({ } }); -// ../../../../node_modules/semver/ranges/valid.js +// ../../node_modules/semver/ranges/valid.js var require_valid2 = __commonJS({ - "../../../../node_modules/semver/ranges/valid.js"(exports$1, module) { + "../../node_modules/semver/ranges/valid.js"(exports$1, module) { var Range = require_range(); var validRange = (range, options) => { try { @@ -1486,9 +1486,9 @@ var require_valid2 = __commonJS({ } }); -// ../../../../node_modules/semver/ranges/outside.js +// ../../node_modules/semver/ranges/outside.js var require_outside = __commonJS({ - "../../../../node_modules/semver/ranges/outside.js"(exports$1, module) { + "../../node_modules/semver/ranges/outside.js"(exports$1, module) { var SemVer = require_semver(); var Comparator = require_comparator(); var { ANY } = Comparator; @@ -1554,27 +1554,27 @@ var require_outside = __commonJS({ } }); -// ../../../../node_modules/semver/ranges/gtr.js +// ../../node_modules/semver/ranges/gtr.js var require_gtr = __commonJS({ - "../../../../node_modules/semver/ranges/gtr.js"(exports$1, module) { + "../../node_modules/semver/ranges/gtr.js"(exports$1, module) { var outside = require_outside(); var gtr = (version, range, options) => outside(version, range, ">", options); module.exports = gtr; } }); -// ../../../../node_modules/semver/ranges/ltr.js +// ../../node_modules/semver/ranges/ltr.js var require_ltr = __commonJS({ - "../../../../node_modules/semver/ranges/ltr.js"(exports$1, module) { + "../../node_modules/semver/ranges/ltr.js"(exports$1, module) { var outside = require_outside(); var ltr = (version, range, options) => outside(version, range, "<", options); module.exports = ltr; } }); -// ../../../../node_modules/semver/ranges/intersects.js +// ../../node_modules/semver/ranges/intersects.js var require_intersects = __commonJS({ - "../../../../node_modules/semver/ranges/intersects.js"(exports$1, module) { + "../../node_modules/semver/ranges/intersects.js"(exports$1, module) { var Range = require_range(); var intersects = (r1, r2, options) => { r1 = new Range(r1, options); @@ -1585,9 +1585,9 @@ var require_intersects = __commonJS({ } }); -// ../../../../node_modules/semver/ranges/simplify.js +// ../../node_modules/semver/ranges/simplify.js var require_simplify = __commonJS({ - "../../../../node_modules/semver/ranges/simplify.js"(exports$1, module) { + "../../node_modules/semver/ranges/simplify.js"(exports$1, module) { var satisfies = require_satisfies(); var compare = require_compare(); module.exports = (versions, range, options) => { @@ -1634,9 +1634,9 @@ var require_simplify = __commonJS({ } }); -// ../../../../node_modules/semver/ranges/subset.js +// ../../node_modules/semver/ranges/subset.js var require_subset = __commonJS({ - "../../../../node_modules/semver/ranges/subset.js"(exports$1, module) { + "../../node_modules/semver/ranges/subset.js"(exports$1, module) { var Range = require_range(); var Comparator = require_comparator(); var { ANY } = Comparator; @@ -1795,9 +1795,9 @@ var require_subset = __commonJS({ } }); -// ../../../../node_modules/semver/index.js +// ../../node_modules/semver/index.js var require_semver2 = __commonJS({ - "../../../../node_modules/semver/index.js"(exports$1, module) { + "../../node_modules/semver/index.js"(exports$1, module) { var internalRe = require_re(); var constants = require_constants(); var SemVer = require_semver(); @@ -3171,5 +3171,5 @@ new PluginBuilder({ }).build(); export { HookSystemImpl, HookUtils, PluginManager, PluginRegistryImpl, PluginValidator, ScopedHookSystem, createTurnstileMiddleware, verifyTurnstile }; -//# sourceMappingURL=chunk-NGTBJJXZ.js.map -//# sourceMappingURL=chunk-NGTBJJXZ.js.map \ No newline at end of file +//# sourceMappingURL=chunk-TFNTM3OA.js.map +//# sourceMappingURL=chunk-TFNTM3OA.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-TFNTM3OA.js.map b/packages/core/dist/chunk-TFNTM3OA.js.map new file mode 100644 index 000000000..eb87c8df2 --- /dev/null +++ b/packages/core/dist/chunk-TFNTM3OA.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../node_modules/semver/internal/constants.js","../../../node_modules/semver/internal/debug.js","../../../node_modules/semver/internal/re.js","../../../node_modules/semver/internal/parse-options.js","../../../node_modules/semver/internal/identifiers.js","../../../node_modules/semver/classes/semver.js","../../../node_modules/semver/functions/parse.js","../../../node_modules/semver/functions/valid.js","../../../node_modules/semver/functions/clean.js","../../../node_modules/semver/functions/inc.js","../../../node_modules/semver/functions/diff.js","../../../node_modules/semver/functions/major.js","../../../node_modules/semver/functions/minor.js","../../../node_modules/semver/functions/patch.js","../../../node_modules/semver/functions/prerelease.js","../../../node_modules/semver/functions/compare.js","../../../node_modules/semver/functions/rcompare.js","../../../node_modules/semver/functions/compare-loose.js","../../../node_modules/semver/functions/compare-build.js","../../../node_modules/semver/functions/sort.js","../../../node_modules/semver/functions/rsort.js","../../../node_modules/semver/functions/gt.js","../../../node_modules/semver/functions/lt.js","../../../node_modules/semver/functions/eq.js","../../../node_modules/semver/functions/neq.js","../../../node_modules/semver/functions/gte.js","../../../node_modules/semver/functions/lte.js","../../../node_modules/semver/functions/cmp.js","../../../node_modules/semver/functions/coerce.js","../../../node_modules/semver/internal/lrucache.js","../../../node_modules/semver/classes/range.js","../../../node_modules/semver/classes/comparator.js","../../../node_modules/semver/functions/satisfies.js","../../../node_modules/semver/ranges/to-comparators.js","../../../node_modules/semver/ranges/max-satisfying.js","../../../node_modules/semver/ranges/min-satisfying.js","../../../node_modules/semver/ranges/min-version.js","../../../node_modules/semver/ranges/valid.js","../../../node_modules/semver/ranges/outside.js","../../../node_modules/semver/ranges/gtr.js","../../../node_modules/semver/ranges/ltr.js","../../../node_modules/semver/ranges/intersects.js","../../../node_modules/semver/ranges/simplify.js","../../../node_modules/semver/ranges/subset.js","../../../node_modules/semver/index.js","../src/plugins/hook-system.ts","../src/plugins/plugin-validator.ts","../src/plugins/plugin-registry.ts","../src/plugins/plugin-manager.ts","../src/plugins/core-plugins/turnstile-plugin/middleware/verify.ts","../src/plugins/core-plugins/turnstile-plugin/index.ts"],"names":["exports","z","require_valid","require_semver","semver"],"mappings":"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","file":"chunk-TFNTM3OA.js","sourcesContent":["'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a === b ? 0 : a < b ? -1 : 1\n }\n\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n if (this.major < other.major) {\n return -1\n }\n if (this.major > other.major) {\n return 1\n }\n if (this.minor < other.minor) {\n return -1\n }\n if (this.minor > other.minor) {\n return 1\n }\n if (this.patch < other.patch) {\n return -1\n }\n if (this.patch > other.patch) {\n return 1\n }\n return 0\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n comp = comp.replace(re[t.BUILD], '')\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","/**\n * Hook System Implementation\n * \n * Provides event-driven extensibility for plugins\n */\n\nimport { HookSystem, HookHandler, PluginHook, HookContext } from '../types'\n\nexport class HookSystemImpl implements HookSystem {\n private hooks: Map = new Map()\n private executing: Set = new Set()\n\n /**\n * Register a hook handler\n */\n register(hookName: string, handler: HookHandler, priority: number = 10): void {\n if (!this.hooks.has(hookName)) {\n this.hooks.set(hookName, [])\n }\n\n const hooks = this.hooks.get(hookName)!\n const hook: PluginHook = {\n name: hookName,\n handler,\n priority,\n }\n\n // Insert hook in priority order (lower priority = earlier execution)\n const insertIndex = hooks.findIndex(h => h.priority! > priority)\n if (insertIndex === -1) {\n hooks.push(hook)\n } else {\n hooks.splice(insertIndex, 0, hook)\n }\n\n console.debug(`Hook registered: ${hookName} (priority: ${priority})`)\n }\n\n /**\n * Execute all handlers for a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n const hooks = this.hooks.get(hookName)\n if (!hooks || hooks.length === 0) {\n return data\n }\n\n // Prevent infinite recursion\n if (this.executing.has(hookName)) {\n console.warn(`Hook recursion detected for: ${hookName}`)\n return data\n }\n\n this.executing.add(hookName)\n\n try {\n let result = data\n let cancelled = false\n\n const hookContext: HookContext = {\n plugin: '', // Will be set by the plugin manager\n context: context || {},\n cancel: () => { cancelled = true }\n }\n\n for (const hook of hooks) {\n if (cancelled) {\n console.debug(`Hook execution cancelled: ${hookName}`)\n break\n }\n\n try {\n console.debug(`Executing hook: ${hookName} (priority: ${hook.priority})`)\n result = await hook.handler(result, hookContext)\n } catch (error) {\n console.error(`Hook execution failed: ${hookName}`, error)\n // Continue executing other hooks unless it's a critical error\n if (error instanceof Error && error.message.includes('CRITICAL')) {\n throw error\n }\n }\n }\n\n return result\n } finally {\n this.executing.delete(hookName)\n }\n }\n\n /**\n * Remove a hook handler\n */\n unregister(hookName: string, handler: HookHandler): void {\n const hooks = this.hooks.get(hookName)\n if (!hooks) return\n\n const index = hooks.findIndex(h => h.handler === handler)\n if (index !== -1) {\n hooks.splice(index, 1)\n console.debug(`Hook unregistered: ${hookName}`)\n }\n\n // Clean up empty hook arrays\n if (hooks.length === 0) {\n this.hooks.delete(hookName)\n }\n }\n\n /**\n * Get all registered hooks for a name\n */\n getHooks(hookName: string): PluginHook[] {\n return this.hooks.get(hookName) || []\n }\n\n /**\n * Get all registered hook names\n */\n getHookNames(): string[] {\n return Array.from(this.hooks.keys())\n }\n\n /**\n * Get hook statistics\n */\n getStats(): { hookName: string; handlerCount: number }[] {\n return Array.from(this.hooks.entries()).map(([hookName, handlers]) => ({\n hookName,\n handlerCount: handlers.length\n }))\n }\n\n /**\n * Clear all hooks (useful for testing)\n */\n clear(): void {\n this.hooks.clear()\n this.executing.clear()\n }\n\n /**\n * Create a scoped hook system for a plugin\n */\n createScope(_pluginName: string): ScopedHookSystem {\n return new ScopedHookSystem(this)\n }\n}\n\n/**\n * Scoped hook system for individual plugins\n */\nexport class ScopedHookSystem {\n private registeredHooks: { hookName: string; handler: HookHandler }[] = []\n\n constructor(\n private parent: HookSystemImpl\n ) {}\n\n /**\n * Register a hook (scoped to this plugin)\n */\n register(hookName: string, handler: HookHandler, priority?: number): void {\n this.parent.register(hookName, handler, priority)\n this.registeredHooks.push({ hookName, handler })\n }\n\n /**\n * Execute a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n return this.parent.execute(hookName, data, context)\n }\n\n /**\n * Unregister a specific hook\n */\n unregister(hookName: string, handler: HookHandler): void {\n this.parent.unregister(hookName, handler)\n const index = this.registeredHooks.findIndex(\n h => h.hookName === hookName && h.handler === handler\n )\n if (index !== -1) {\n this.registeredHooks.splice(index, 1)\n }\n }\n\n /**\n * Unregister all hooks for this plugin\n */\n unregisterAll(): void {\n for (const { hookName, handler } of this.registeredHooks) {\n this.parent.unregister(hookName, handler)\n }\n this.registeredHooks.length = 0\n }\n\n /**\n * Get hooks registered by this plugin\n */\n getRegisteredHooks(): { hookName: string; handler: HookHandler }[] {\n return [...this.registeredHooks]\n }\n}\n\n/**\n * Hook utilities\n */\nexport class HookUtils {\n /**\n * Create a hook name with namespace\n */\n static createHookName(namespace: string, event: string): string {\n return `${namespace}:${event}`\n }\n\n /**\n * Parse a hook name to extract namespace and event\n */\n static parseHookName(hookName: string): { namespace: string; event: string } {\n const parts = hookName.split(':')\n return {\n namespace: parts[0] || '',\n event: parts.slice(1).join(':') || ''\n }\n }\n\n /**\n * Create a middleware that executes hooks\n */\n static createHookMiddleware(\n hookSystem: HookSystem,\n beforeHook?: string,\n afterHook?: string\n ) {\n return async (c: any, next: any) => {\n if (beforeHook) {\n const beforeData = { request: c.req, context: c }\n await hookSystem.execute(beforeHook, beforeData)\n }\n\n await next()\n\n if (afterHook) {\n const afterData = { request: c.req, response: c.res, context: c }\n await hookSystem.execute(afterHook, afterData)\n }\n }\n }\n\n /**\n * Create a debounced hook handler\n */\n static debounce(handler: HookHandler, delay: number): HookHandler {\n let timeoutId: any\n \n return async (data: any, context: HookContext) => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n return new Promise((resolve, reject) => {\n timeoutId = setTimeout(async () => {\n try {\n const result = await handler(data, context)\n resolve(result)\n } catch (error) {\n reject(error)\n }\n }, delay)\n })\n }\n }\n\n /**\n * Create a throttled hook handler\n */\n static throttle(handler: HookHandler, limit: number): HookHandler {\n let lastExecution = 0\n\n return async (data: any, context: HookContext) => {\n const now = Date.now()\n if (now - lastExecution >= limit) {\n lastExecution = now\n return handler(data, context)\n }\n return data\n }\n }\n}","/**\n * Plugin Validator\n * \n * Validates plugin definitions, dependencies, and compatibility\n */\n\nimport { z } from 'zod'\nimport { Plugin, PluginValidator as IPluginValidator, PluginValidationResult, PluginRegistry } from '../types'\nimport semver from 'semver'\n\n// Zod schemas for plugin validation\nconst PluginAuthorSchema = z.object({\n name: z.string().min(1),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n})\n\nconst PluginRoutesSchema = z.object({\n path: z.string().min(1),\n handler: z.any(), // Hono instance\n description: z.string().optional(),\n requiresAuth: z.boolean().optional(),\n roles: z.array(z.string()).optional(),\n priority: z.number().optional(),\n})\n\nconst PluginMiddlewareSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n description: z.string().optional(),\n priority: z.number().optional(),\n routes: z.array(z.string()).optional(),\n global: z.boolean().optional(),\n})\n\nconst PluginModelSchema = z.object({\n name: z.string().min(1),\n tableName: z.string().min(1),\n schema: z.any(), // Zod schema\n migrations: z.array(z.string()),\n relationships: z.array(z.object({\n type: z.enum(['oneToOne', 'oneToMany', 'manyToMany']),\n target: z.string(),\n foreignKey: z.string().optional(),\n joinTable: z.string().optional(),\n })).optional(),\n extendsContent: z.boolean().optional(),\n})\n\nconst PluginServiceSchema = z.object({\n name: z.string().min(1),\n implementation: z.any(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n singleton: z.boolean().optional(),\n})\n\nconst PluginAdminPageSchema = z.object({\n path: z.string().min(1),\n title: z.string().min(1),\n component: z.string().min(1),\n description: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n menuItem: z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n }).optional(),\n icon: z.string().optional(),\n})\n\nconst PluginComponentSchema = z.object({\n name: z.string().min(1),\n template: z.function(),\n description: z.string().optional(),\n propsSchema: z.any().optional(), // Zod schema\n})\n\nconst PluginHookSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n priority: z.number().optional(),\n description: z.string().optional(),\n})\n\nconst PluginSchema = z.object({\n name: z.string().min(1).regex(/^[a-z0-9-]+$/, 'Plugin name must be lowercase with hyphens'),\n version: z.string().refine(v => semver.valid(v), 'Version must be valid semver'),\n description: z.string().optional(),\n author: PluginAuthorSchema.optional(),\n dependencies: z.array(z.string()).optional(),\n compatibility: z.string().optional(),\n license: z.string().optional(),\n \n // Extension points\n routes: z.array(PluginRoutesSchema).optional(),\n middleware: z.array(PluginMiddlewareSchema).optional(),\n models: z.array(PluginModelSchema).optional(),\n services: z.array(PluginServiceSchema).optional(),\n adminPages: z.array(PluginAdminPageSchema).optional(),\n adminComponents: z.array(PluginComponentSchema).optional(),\n menuItems: z.array(z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n })).optional(),\n hooks: z.array(PluginHookSchema).optional(),\n \n // Lifecycle hooks\n install: z.function().optional(),\n uninstall: z.function().optional(),\n activate: z.function().optional(),\n deactivate: z.function().optional(),\n configure: z.function().optional(),\n})\n\nexport class PluginValidator implements IPluginValidator {\n private static readonly RESERVED_NAMES = [\n 'core', 'system', 'admin', 'api', 'auth', 'content', 'media', 'users', 'collections'\n ]\n\n private static readonly RESERVED_PATHS = [\n '/admin', '/api', '/auth', '/docs', '/media', '/_assets'\n ]\n\n /**\n * Validate plugin definition\n */\n validate(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n try {\n // Schema validation\n const result = PluginSchema.safeParse(plugin)\n if (!result.success) {\n result.error.issues.forEach((err: any) => {\n errors.push(`${err.path.join('.')}: ${err.message}`)\n })\n }\n\n // Reserved name validation\n if (PluginValidator.RESERVED_NAMES.includes(plugin.name)) {\n errors.push(`Plugin name \"${plugin.name}\" is reserved`)\n }\n\n // Route path validation\n if (plugin.routes) {\n for (const route of plugin.routes) {\n if (PluginValidator.RESERVED_PATHS.some(path => route.path.startsWith(path))) {\n errors.push(`Route path \"${route.path}\" conflicts with reserved system path`)\n }\n \n if (!route.path.startsWith('/')) {\n errors.push(`Route path \"${route.path}\" must start with /`)\n }\n }\n }\n\n // Model validation\n if (plugin.models) {\n const modelNames = new Set()\n const tableNames = new Set()\n \n for (const model of plugin.models) {\n // Check for duplicate model names\n if (modelNames.has(model.name)) {\n errors.push(`Duplicate model name: ${model.name}`)\n }\n modelNames.add(model.name)\n \n // Check for duplicate table names\n if (tableNames.has(model.tableName)) {\n errors.push(`Duplicate table name: ${model.tableName}`)\n }\n tableNames.add(model.tableName)\n \n // Validate table name format\n if (!/^[a-z][a-z0-9_]*$/.test(model.tableName)) {\n errors.push(`Invalid table name format: ${model.tableName}`)\n }\n \n // Check for system table conflicts\n const systemTables = ['users', 'collections', 'content', 'content_versions', 'media', 'api_tokens']\n if (systemTables.includes(model.tableName)) {\n errors.push(`Table name \"${model.tableName}\" conflicts with system table`)\n }\n }\n }\n\n // Service validation\n if (plugin.services) {\n const serviceNames = new Set()\n \n for (const service of plugin.services) {\n if (serviceNames.has(service.name)) {\n errors.push(`Duplicate service name: ${service.name}`)\n }\n serviceNames.add(service.name)\n \n // Check for system service conflicts\n const systemServices = ['auth', 'content', 'media', 'cdn']\n if (systemServices.includes(service.name)) {\n warnings.push(`Service name \"${service.name}\" conflicts with system service`)\n }\n }\n }\n\n // Admin page validation\n if (plugin.adminPages) {\n const pagePaths = new Set()\n \n for (const page of plugin.adminPages) {\n if (pagePaths.has(page.path)) {\n errors.push(`Duplicate admin page path: ${page.path}`)\n }\n pagePaths.add(page.path)\n \n if (!page.path.startsWith('/')) {\n errors.push(`Admin page path \"${page.path}\" must start with /`)\n }\n \n // Check for system admin page conflicts\n const systemPaths = ['/', '/collections', '/content', '/media', '/users', '/settings']\n if (systemPaths.includes(page.path)) {\n errors.push(`Admin page path \"${page.path}\" conflicts with system page`)\n }\n }\n }\n\n // Component validation\n if (plugin.adminComponents) {\n const componentNames = new Set()\n \n for (const component of plugin.adminComponents) {\n if (componentNames.has(component.name)) {\n errors.push(`Duplicate component name: ${component.name}`)\n }\n componentNames.add(component.name)\n \n // Check for system component conflicts\n const systemComponents = ['table', 'form', 'alert', 'media-grid', 'pagination']\n if (systemComponents.includes(component.name)) {\n warnings.push(`Component name \"${component.name}\" conflicts with system component`)\n }\n }\n }\n\n // Hook validation\n if (plugin.hooks) {\n for (const hook of plugin.hooks) {\n if (!hook.name.includes(':')) {\n warnings.push(`Hook name \"${hook.name}\" should include namespace (e.g., \"plugin:event\")`)\n }\n }\n }\n\n // Dependency cycle detection (basic)\n if (plugin.dependencies?.includes(plugin.name)) {\n errors.push(`Plugin cannot depend on itself`)\n }\n\n // License validation\n if (plugin.license) {\n const validLicenses = ['MIT', 'Apache-2.0', 'GPL-3.0', 'BSD-3-Clause', 'ISC']\n if (!validLicenses.includes(plugin.license)) {\n warnings.push(`License \"${plugin.license}\" is not a common SPDX identifier`)\n }\n }\n\n // Performance warnings\n if (plugin.middleware && plugin.middleware.length > 5) {\n warnings.push(`Plugin defines ${plugin.middleware.length} middleware functions, consider consolidating`)\n }\n\n if (plugin.hooks && plugin.hooks.length > 10) {\n warnings.push(`Plugin defines ${plugin.hooks.length} hooks, ensure they are necessary`)\n }\n\n } catch (error) {\n errors.push(`Validation error: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin dependencies\n */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.dependencies || plugin.dependencies.length === 0) {\n return { valid: true, errors, warnings }\n }\n\n // Check if all dependencies are registered\n for (const depName of plugin.dependencies) {\n if (!registry.has(depName)) {\n errors.push(`Dependency \"${depName}\" is not registered`)\n continue\n }\n\n const dependency = registry.get(depName)!\n \n // Check dependency version compatibility\n if (dependency.compatibility && plugin.compatibility) {\n if (!this.isCompatible(dependency.compatibility, plugin.compatibility)) {\n warnings.push(`Potential compatibility issue with dependency \"${depName}\"`)\n }\n }\n }\n\n // Check for circular dependencies\n const visited = new Set()\n const visiting = new Set()\n \n const checkCircular = (name: string): boolean => {\n if (visiting.has(name)) return true\n if (visited.has(name)) return false\n \n visiting.add(name)\n \n const current = registry.get(name)\n if (current?.dependencies) {\n for (const depName of current.dependencies) {\n if (checkCircular(depName)) {\n errors.push(`Circular dependency detected: ${name} -> ${depName}`)\n return true\n }\n }\n }\n \n visiting.delete(name)\n visited.add(name)\n return false\n }\n\n checkCircular(plugin.name)\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin compatibility with SonicJS version\n */\n validateCompatibility(plugin: Plugin, sonicVersion: string): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.compatibility) {\n warnings.push('Plugin does not specify compatibility version')\n return { valid: true, errors, warnings }\n }\n\n try {\n if (!semver.satisfies(sonicVersion, plugin.compatibility)) {\n errors.push(`Plugin requires SonicJS ${plugin.compatibility}, but current version is ${sonicVersion}`)\n }\n } catch (error) {\n errors.push(`Invalid compatibility version format: ${plugin.compatibility}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Check if two version ranges are compatible\n */\n private isCompatible(version1: string, version2: string): boolean {\n try {\n // Simple compatibility check - can be enhanced\n return semver.intersects(version1, version2)\n } catch {\n return false\n }\n }\n\n /**\n * Validate plugin security constraints\n */\n validateSecurity(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n // Check for potentially dangerous patterns\n const pluginCode = JSON.stringify(plugin)\n \n // Check for eval or Function constructor usage\n if (pluginCode.includes('eval(') || pluginCode.includes('Function(')) {\n errors.push('Plugin contains potentially dangerous code execution patterns')\n }\n\n // Check for file system access attempts\n if (pluginCode.includes('fs.') || pluginCode.includes('require(')) {\n warnings.push('Plugin may attempt file system access (not available in Cloudflare Workers)')\n }\n\n // Check for network access patterns\n if (pluginCode.includes('fetch(') || pluginCode.includes('XMLHttpRequest')) {\n warnings.push('Plugin contains network access code - ensure it follows security guidelines')\n }\n\n // Check for sensitive data patterns\n const sensitivePatterns = ['password', 'secret', 'key', 'token', 'credential']\n for (const pattern of sensitivePatterns) {\n if (pluginCode.toLowerCase().includes(pattern)) {\n warnings.push(`Plugin code contains \"${pattern}\" - ensure sensitive data is properly handled`)\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n}","/**\n * Plugin Registry Implementation\n * \n * Manages plugin registration, activation, and lifecycle\n */\n\nimport { Plugin, PluginRegistry, PluginConfig, PluginStatus } from '../types'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginRegistryImpl implements PluginRegistry {\n private plugins: Map = new Map()\n private configs: Map = new Map()\n private statuses: Map = new Map()\n private validator: PluginValidator\n\n constructor(validator?: PluginValidator) {\n this.validator = validator || new PluginValidator()\n }\n\n /**\n * Get plugin by name\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name)\n }\n\n /**\n * Get all registered plugins\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values())\n }\n\n /**\n * Get active plugins\n */\n getActive(): Plugin[] {\n return this.getAll().filter(plugin => {\n const status = this.statuses.get(plugin.name)\n return status?.active === true\n })\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise {\n console.info(`Registering plugin: ${plugin.name} v${plugin.version}`)\n\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed for ${plugin.name}: ${validation.errors.join(', ')}`)\n }\n\n // Check for conflicts\n if (this.plugins.has(plugin.name)) {\n const existingPlugin = this.plugins.get(plugin.name)!\n if (existingPlugin.version !== plugin.version) {\n console.warn(`Plugin ${plugin.name} is already registered with version ${existingPlugin.version}, replacing with ${plugin.version}`)\n }\n }\n\n // Validate dependencies\n const depValidation = this.validator.validateDependencies(plugin, this)\n if (!depValidation.valid) {\n throw new Error(`Plugin dependency validation failed for ${plugin.name}: ${depValidation.errors.join(', ')}`)\n }\n\n // Register plugin\n this.plugins.set(plugin.name, plugin)\n \n // Initialize status\n this.statuses.set(plugin.name, {\n name: plugin.name,\n version: plugin.version,\n active: false,\n installed: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin registered successfully: ${plugin.name}`)\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise {\n console.info(`Unregistering plugin: ${name}`)\n\n if (!this.plugins.has(name)) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n // Check if other plugins depend on this one\n const dependents = this.getDependents(name)\n if (dependents.length > 0) {\n throw new Error(`Cannot unregister ${name}: plugins ${dependents.join(', ')} depend on it`)\n }\n\n // Remove plugin\n this.plugins.delete(name)\n this.configs.delete(name)\n this.statuses.delete(name)\n\n console.info(`Plugin unregistered: ${name}`)\n }\n\n /**\n * Check if plugin is registered\n */\n has(name: string): boolean {\n return this.plugins.has(name)\n }\n\n /**\n * Activate a plugin\n */\n async activate(name: string): Promise {\n console.info(`Activating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (status?.active) {\n console.warn(`Plugin ${name} is already active`)\n return\n }\n\n try {\n // Activate dependencies first\n if (plugin.dependencies) {\n for (const depName of plugin.dependencies) {\n const depStatus = this.statuses.get(depName)\n if (!depStatus?.active) {\n await this.activate(depName)\n }\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin activated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n active: false,\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to activate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Deactivate a plugin\n */\n async deactivate(name: string): Promise {\n console.info(`Deactivating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (!status?.active) {\n console.warn(`Plugin ${name} is not active`)\n return\n }\n\n try {\n // Deactivate dependents first\n const dependents = this.getDependents(name)\n for (const depName of dependents) {\n const depStatus = this.statuses.get(depName)\n if (depStatus?.active) {\n await this.deactivate(depName)\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: false,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin deactivated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to deactivate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Get plugin configuration\n */\n getConfig(name: string): PluginConfig | undefined {\n return this.configs.get(name)\n }\n\n /**\n * Set plugin configuration\n */\n setConfig(name: string, config: PluginConfig): void {\n this.configs.set(name, {\n ...config,\n updatedAt: Date.now()\n })\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus | undefined {\n return this.statuses.get(name)\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): Map {\n return new Map(this.statuses)\n }\n\n /**\n * Update plugin status\n */\n private updateStatus(name: string, updates: Partial): void {\n const current = this.statuses.get(name)\n if (current) {\n this.statuses.set(name, { ...current, ...updates })\n }\n }\n\n /**\n * Get plugins that depend on the specified plugin\n */\n private getDependents(name: string): string[] {\n const dependents: string[] = []\n \n for (const [pluginName, plugin] of this.plugins) {\n if (plugin.dependencies?.includes(name)) {\n dependents.push(pluginName)\n }\n }\n \n return dependents\n }\n\n /**\n * Get dependency graph\n */\n getDependencyGraph(): Map {\n const graph = new Map()\n \n for (const [name, plugin] of this.plugins) {\n graph.set(name, plugin.dependencies || [])\n }\n \n return graph\n }\n\n /**\n * Resolve plugin load order based on dependencies\n */\n resolveLoadOrder(): string[] {\n const graph = this.getDependencyGraph()\n const visited = new Set()\n const visiting = new Set()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected involving plugin: ${name}`)\n }\n\n visiting.add(name)\n \n const dependencies = graph.get(name) || []\n for (const dep of dependencies) {\n if (!graph.has(dep)) {\n throw new Error(`Plugin ${name} depends on ${dep}, but ${dep} is not registered`)\n }\n visit(dep)\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n for (const name of graph.keys()) {\n visit(name)\n }\n\n return result\n }\n\n /**\n * Export plugin configuration\n */\n exportConfig(): { plugins: PluginConfig[] } {\n const plugins: PluginConfig[] = []\n \n for (const [name, config] of this.configs) {\n plugins.push({\n ...config,\n name\n } as PluginConfig & { name: string })\n }\n \n return { plugins }\n }\n\n /**\n * Import plugin configuration\n */\n importConfig(config: { plugins: PluginConfig[] }): void {\n for (const pluginConfig of config.plugins) {\n if ('name' in pluginConfig) {\n const { name, ...rest } = pluginConfig as PluginConfig & { name: string }\n this.setConfig(name, rest)\n }\n }\n }\n\n /**\n * Clear all plugins (useful for testing)\n */\n clear(): void {\n this.plugins.clear()\n this.configs.clear()\n this.statuses.clear()\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n total: number\n active: number\n inactive: number\n withErrors: number\n } {\n const statuses = Array.from(this.statuses.values())\n \n return {\n total: statuses.length,\n active: statuses.filter(s => s.active).length,\n inactive: statuses.filter(s => !s.active).length,\n withErrors: statuses.filter(s => s.hasErrors).length\n }\n }\n}","/**\n * Plugin Manager\n * \n * Central orchestrator for the plugin system\n */\n\nimport { Hono } from 'hono'\nimport { Plugin, PluginManager as IPluginManager, PluginRegistry, PluginConfig, PluginContext, PluginStatus, HookSystem, PluginLogger, HOOKS } from '../types'\nimport { PluginRegistryImpl } from './plugin-registry'\nimport { HookSystemImpl, ScopedHookSystem } from './hook-system'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginManager implements IPluginManager {\n public readonly registry: PluginRegistry\n public readonly hooks: HookSystem\n private validator: PluginValidator\n private context?: PluginContext\n private scopedHooks: Map = new Map()\n private pluginRoutes: Map = new Map()\n\n constructor() {\n this.validator = new PluginValidator()\n this.registry = new PluginRegistryImpl(this.validator)\n this.hooks = new HookSystemImpl()\n }\n\n /**\n * Initialize plugin system\n */\n async initialize(context: PluginContext): Promise {\n console.info('Initializing plugin system...')\n \n this.context = context\n \n // Execute app init hook\n await this.hooks.execute(HOOKS.APP_INIT, {\n pluginManager: this,\n context\n })\n\n console.info('Plugin system initialized')\n }\n\n /**\n * Load plugins from configuration\n */\n async loadPlugins(configs: PluginConfig[]): Promise {\n console.info(`Loading ${configs.length} plugins...`)\n\n // Filter enabled plugins\n const enabledConfigs = configs.filter(config => config.enabled)\n \n if (enabledConfigs.length === 0) {\n console.info('No enabled plugins to load')\n return\n }\n\n // Load and register plugins (implementation would depend on how plugins are distributed)\n for (const config of enabledConfigs) {\n try {\n // In a real implementation, this would load the plugin from a registry or file system\n // For now, we'll assume plugins are already imported\n console.info(`Loading plugin configuration: ${JSON.stringify(config)}`)\n \n // Store configuration\n if ('name' in config) {\n this.registry.setConfig(config.name as string, config)\n }\n } catch (error) {\n console.error(`Failed to load plugin configuration:`, error)\n }\n }\n\n // Resolve load order based on dependencies\n try {\n const loadOrder = this.registry.resolveLoadOrder()\n console.info(`Plugin load order: ${loadOrder.join(' -> ')}`)\n\n // Activate plugins in dependency order\n for (const pluginName of loadOrder) {\n const config = this.registry.getConfig(pluginName)\n if (config?.enabled) {\n await this.registry.activate(pluginName)\n }\n }\n } catch (error) {\n console.error('Failed to resolve plugin load order:', error)\n }\n\n console.info('Plugin loading completed')\n }\n\n /**\n * Install a plugin\n */\n async install(plugin: Plugin, config?: PluginConfig): Promise {\n console.info(`Installing plugin: ${plugin.name}`)\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed: ${validation.errors.join(', ')}`)\n }\n\n // Register plugin\n await this.registry.register(plugin)\n\n // Set configuration\n const pluginConfig: PluginConfig = {\n enabled: true,\n installedAt: Date.now(),\n ...config\n }\n this.registry.setConfig(plugin.name, pluginConfig)\n\n // Create scoped hook system for plugin\n const scopedHooks = this.hooks.createScope ? \n (this.hooks as HookSystemImpl).createScope(plugin.name) : \n this.hooks\n\n this.scopedHooks.set(plugin.name, scopedHooks as ScopedHookSystem)\n\n // Create plugin context\n const pluginContext: PluginContext = {\n ...this.context,\n config: pluginConfig,\n hooks: scopedHooks,\n logger: this.createLogger(plugin.name)\n }\n\n // Register plugin extensions\n await this.registerPluginExtensions(plugin, pluginContext)\n\n // Run plugin install hook\n if (plugin.install) {\n await plugin.install(pluginContext)\n }\n\n // Execute plugin install hook\n await this.hooks.execute(HOOKS.PLUGIN_INSTALL, {\n plugin: plugin.name,\n version: plugin.version,\n context: pluginContext\n })\n\n console.info(`Plugin installed successfully: ${plugin.name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to install plugin ${plugin.name}:`, errorMessage)\n \n // Update status with error\n const status = this.registry.getStatus(plugin.name)\n if (status) {\n this.updatePluginStatus(plugin.name, {\n hasErrors: true,\n errors: [...(status.errors || []), errorMessage],\n lastError: errorMessage\n })\n }\n \n throw error\n }\n }\n\n /**\n * Uninstall a plugin\n */\n async uninstall(name: string): Promise {\n console.info(`Uninstalling plugin: ${name}`)\n\n const plugin = this.registry.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Deactivate plugin first\n const status = this.registry.getStatus(name)\n if (status?.active) {\n await this.registry.deactivate(name)\n }\n\n // Create plugin context\n const config = this.registry.getConfig(name) || { enabled: false }\n const pluginContext: PluginContext = {\n ...this.context,\n config,\n hooks: this.scopedHooks.get(name) || this.hooks,\n logger: this.createLogger(name)\n }\n\n // Run plugin uninstall hook\n if (plugin.uninstall) {\n await plugin.uninstall(pluginContext)\n }\n\n // Unregister plugin extensions\n await this.unregisterPluginExtensions(plugin)\n\n // Clean up scoped hooks\n const scopedHooks = this.scopedHooks.get(name)\n if (scopedHooks && 'unregisterAll' in scopedHooks) {\n scopedHooks.unregisterAll()\n }\n this.scopedHooks.delete(name)\n\n // Remove plugin routes\n this.pluginRoutes.delete(name)\n\n // Execute plugin uninstall hook\n await this.hooks.execute(HOOKS.PLUGIN_UNINSTALL, {\n plugin: name,\n context: pluginContext\n })\n\n // Unregister plugin\n await this.registry.unregister(name)\n\n console.info(`Plugin uninstalled successfully: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to uninstall plugin ${name}:`, errorMessage)\n throw error\n }\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus {\n const status = this.registry.getStatus(name)\n if (!status) {\n return {\n name,\n version: 'unknown',\n active: false,\n installed: false,\n hasErrors: false\n }\n }\n return status\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): PluginStatus[] {\n return Array.from(this.registry.getAllStatuses().values())\n }\n\n /**\n * Register plugin extensions (routes, middleware, etc.)\n */\n private async registerPluginExtensions(plugin: Plugin, _context: PluginContext): Promise {\n // Register routes\n if (plugin.routes) {\n const pluginApp = new Hono()\n \n for (const route of plugin.routes) {\n console.debug(`Registering plugin route: ${route.path}`)\n pluginApp.route(route.path, route.handler)\n }\n \n this.pluginRoutes.set(plugin.name, pluginApp)\n }\n\n // Register middleware\n if (plugin.middleware) {\n for (const middleware of plugin.middleware) {\n console.debug(`Registering plugin middleware: ${middleware.name}`)\n // Middleware registration would be handled by the main app\n }\n }\n\n // Register hooks\n if (plugin.hooks) {\n const scopedHooks = this.scopedHooks.get(plugin.name)\n for (const hook of plugin.hooks) {\n console.debug(`Registering plugin hook: ${hook.name}`)\n if (scopedHooks) {\n scopedHooks.register(hook.name, hook.handler, hook.priority)\n } else {\n this.hooks.register(hook.name, hook.handler, hook.priority)\n }\n }\n }\n\n // Register services\n if (plugin.services) {\n for (const service of plugin.services) {\n console.debug(`Registering plugin service: ${service.name}`)\n // Service registration would be handled by a service container\n }\n }\n\n // Register database models\n if (plugin.models) {\n for (const model of plugin.models) {\n console.debug(`Registering plugin model: ${model.name}`)\n // Model registration would involve database migrations\n }\n }\n }\n\n /**\n * Unregister plugin extensions\n */\n private async unregisterPluginExtensions(plugin: Plugin): Promise {\n // Clean up is mostly handled by the scoped systems\n console.debug(`Unregistering extensions for plugin: ${plugin.name}`)\n }\n\n /**\n * Update plugin status\n */\n private updatePluginStatus(name: string, updates: Partial): void {\n const current = this.registry.getStatus(name)\n if (current && 'updateStatus' in this.registry) {\n // This would require extending the registry interface\n console.debug(`Updating status for plugin: ${name}`, updates)\n }\n }\n\n /**\n * Create a logger for a plugin\n */\n private createLogger(pluginName: string): PluginLogger {\n return {\n debug: (message: string, data?: any) => {\n console.debug(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n info: (message: string, data?: any) => {\n console.info(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n warn: (message: string, data?: any) => {\n console.warn(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n error: (message: string, error?: Error, data?: any) => {\n console.error(`[Plugin:${pluginName}] ${message}`, error || '', data || '')\n }\n }\n }\n\n /**\n * Get plugin routes for mounting in main app\n */\n getPluginRoutes(): Map {\n return new Map(this.pluginRoutes)\n }\n\n /**\n * Get plugin middleware for main app\n */\n getPluginMiddleware(): Array<{ name: string; handler: any; priority: number; global: boolean }> {\n const middleware: Array<{ name: string; handler: any; priority: number; global: boolean }> = []\n \n for (const plugin of this.registry.getActive()) {\n if (plugin.middleware) {\n for (const mw of plugin.middleware) {\n middleware.push({\n name: `${plugin.name}:${mw.name}`,\n handler: mw.handler,\n priority: mw.priority || 10,\n global: mw.global || false\n })\n }\n }\n }\n \n // Sort by priority\n return middleware.sort((a, b) => a.priority - b.priority)\n }\n\n /**\n * Execute shutdown procedures\n */\n async shutdown(): Promise {\n console.info('Shutting down plugin system...')\n \n // Execute app shutdown hook\n await this.hooks.execute(HOOKS.APP_SHUTDOWN, {\n pluginManager: this\n })\n\n // Deactivate all active plugins\n const activePlugins = this.registry.getActive()\n for (const plugin of activePlugins.reverse()) { // Reverse order\n try {\n await this.registry.deactivate(plugin.name)\n } catch (error) {\n console.error(`Error deactivating plugin ${plugin.name}:`, error)\n }\n }\n\n console.info('Plugin system shutdown completed')\n }\n\n /**\n * Get plugin system statistics\n */\n getStats(): {\n registry: ReturnType\n hooks: Array<{ hookName: string; handlerCount: number }>\n routes: number\n middleware: number\n } {\n return {\n registry: (this.registry as PluginRegistryImpl).getStats(),\n hooks: (this.hooks as HookSystemImpl).getStats(),\n routes: this.pluginRoutes.size,\n middleware: this.getPluginMiddleware().length\n }\n }\n}","import type { Context, Next } from 'hono'\nimport { TurnstileService } from '../services/turnstile'\n\n/**\n * Middleware to verify Turnstile token on form submissions\n * \n * Usage:\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Token already verified, process form...\n * })\n * ```\n */\nexport async function verifyTurnstile(c: Context, next: Next) {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n console.error('Turnstile middleware: Database not available')\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n\n // Check if Turnstile is enabled\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n // Turnstile not enabled, allow through\n return next()\n }\n\n // Get token from request\n let token: string | undefined\n let body: any\n\n if (c.req.method === 'POST') {\n const contentType = c.req.header('content-type') || ''\n \n if (contentType.includes('application/json')) {\n body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n }\n\n if (!token) {\n return c.json({ \n error: 'Turnstile token missing',\n message: 'Please complete the verification challenge'\n }, 400)\n }\n\n // Verify token\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return c.json({ \n error: 'Turnstile verification failed',\n message: result.error || 'Verification failed. Please try again.'\n }, 403)\n }\n\n // Verification successful, continue\n return next()\n}\n\n/**\n * Middleware factory that allows custom error handling\n */\nexport function createTurnstileMiddleware(options?: {\n onError?: (c: Context, error: string) => Response\n onMissing?: (c: Context) => Response\n}) {\n return async (c: Context, next: Next) => {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n return options?.onError?.(c, 'Database not available') || \n c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n return next()\n }\n\n let token: string | undefined\n const contentType = c.req.header('content-type') || ''\n\n if (contentType.includes('application/json')) {\n const body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n\n if (!token) {\n return options?.onMissing?.(c) ||\n c.json({ error: 'Turnstile token missing' }, 400)\n }\n\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return options?.onError?.(c, result.error || 'Verification failed') ||\n c.json({ error: 'Turnstile verification failed', message: result.error }, 403)\n }\n\n return next()\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { TurnstileService } from './services/turnstile'\nimport { verifyTurnstile } from './middleware/verify'\nimport manifest from './manifest.json'\n\n/**\n * Cloudflare Turnstile Plugin\n * \n * Provides CAPTCHA-free bot protection using Cloudflare Turnstile.\n * Can be used with any form by adding the verifyTurnstile middleware.\n * \n * Settings are managed through the generic admin plugin interface.\n * No custom routes needed - the admin system automatically handles settings.\n * \n * @example\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Process form after Turnstile verification\n * })\n * ```\n */\n\n// Build the plugin - no custom routes, generic admin handles settings\nexport const turnstilePlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('turnstile', TurnstileService)\n .addSingleMiddleware('verifyTurnstile', verifyTurnstile, {\n description: 'Verify Cloudflare Turnstile token',\n global: false,\n })\n .build()\n\n// Export service and middleware for easy import\nexport { TurnstileService } from './services/turnstile'\nexport { verifyTurnstile, createTurnstileMiddleware } from './middleware/verify'\nexport { renderTurnstileWidget, renderInlineTurnstile, getTurnstileScript, renderExplicitTurnstile } from './components/widget'\nexport type { TurnstileSettings, TurnstileVerificationResponse } from './services/turnstile'\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-V4V54BY3.cjs.map b/packages/core/dist/chunk-V4V54BY3.cjs.map deleted file mode 100644 index 1ca40d50b..000000000 --- a/packages/core/dist/chunk-V4V54BY3.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/middleware/bootstrap.ts","../src/middleware/auth.ts","../src/middleware/metrics.ts","../src/middleware/csrf.ts","../src/middleware/rate-limit.ts","../src/middleware/security-headers.ts","../src/middleware/index.ts"],"names":["MigrationService","syncCollections","syncAllFormCollections","PluginBootstrapService","sign","verify","result","setCookie","getCookie","metricsTracker","JWT_SECRET_FALLBACK"],"mappings":"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","file":"chunk-V4V54BY3.cjs","sourcesContent":["import { Context, Next } from \"hono\";\nimport { syncCollections } from \"../services/collection-sync\";\nimport { syncAllFormCollections } from \"../services/form-collection-sync\";\nimport { MigrationService } from \"../services/migrations\";\nimport { PluginBootstrapService } from \"../services/plugin-bootstrap\";\nimport type { SonicJSConfig } from \"../app\";\n\ntype Bindings = {\n DB: D1Database;\n KV: KVNamespace;\n JWT_SECRET?: string;\n CORS_ORIGINS?: string;\n ENVIRONMENT?: string;\n};\n\n// Track if bootstrap has been run in this worker instance\nlet bootstrapComplete = false;\n\n/**\n * Verify security-critical environment configuration at startup.\n * Logs warnings in development, throws in production to prevent\n * insecure deployments from silently running.\n */\nexport function verifySecurityConfig(env: Bindings): void {\n const warnings: string[] = [];\n\n // Check JWT secret\n if (!env.JWT_SECRET) {\n warnings.push(\n \"JWT_SECRET is not set — using hardcoded fallback. Set via `wrangler secret put JWT_SECRET`\"\n );\n } else if (env.JWT_SECRET.includes(\"change-in-production\")) {\n warnings.push(\n \"JWT_SECRET contains the default value — tokens are forgeable. Generate a strong random secret\"\n );\n }\n\n // Check CORS origins\n if (!env.CORS_ORIGINS) {\n warnings.push(\n \"CORS_ORIGINS is not set — all cross-origin API requests will be rejected\"\n );\n }\n\n // Check environment designation\n if (!env.ENVIRONMENT) {\n warnings.push(\n \"ENVIRONMENT is not set — HSTS header will not be applied. Set to \\\"production\\\" or \\\"development\\\"\"\n );\n }\n\n if (warnings.length === 0) {\n return;\n }\n\n const isProduction = env.ENVIRONMENT === \"production\";\n\n for (const warning of warnings) {\n console.warn(`[SonicJS Security] ${warning}`);\n }\n\n if (isProduction) {\n // In production, a missing or default JWT_SECRET is a hard failure —\n // every token issued would be forgeable by anyone reading the source code.\n const hasCritical =\n !env.JWT_SECRET || env.JWT_SECRET.includes(\"change-in-production\");\n if (hasCritical) {\n throw new Error(\n \"[SonicJS Security] CRITICAL: Production deployment is missing a secure JWT_SECRET. \" +\n \"Set it via `wrangler secret put JWT_SECRET` before deploying.\"\n );\n }\n }\n}\n\n/**\n * Bootstrap middleware that ensures system initialization\n * Runs once per worker instance\n */\nexport function bootstrapMiddleware(config: SonicJSConfig = {}) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n // Skip if already bootstrapped in this worker instance\n if (bootstrapComplete) {\n return next();\n }\n\n // Skip bootstrap for static assets and health checks\n const path = c.req.path;\n if (\n path.startsWith(\"/images/\") ||\n path.startsWith(\"/assets/\") ||\n path === \"/health\" ||\n path.endsWith(\".js\") ||\n path.endsWith(\".css\") ||\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".ico\")\n ) {\n return next();\n }\n\n try {\n console.log(\"[Bootstrap] Starting system initialization...\");\n\n // 1. Run database migrations first\n console.log(\"[Bootstrap] Running database migrations...\");\n const migrationService = new MigrationService(c.env.DB);\n await migrationService.runPendingMigrations();\n\n // 2. Sync collection configurations\n console.log(\"[Bootstrap] Syncing collection configurations...\");\n try {\n await syncCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing collections:\", error);\n // Continue bootstrap even if collection sync fails\n }\n\n // 2b. Sync form-derived shadow collections\n console.log(\"[Bootstrap] Syncing form collections...\");\n try {\n await syncAllFormCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing form collections:\", error);\n }\n\n // 3. Bootstrap core plugins (unless disableAll is set)\n if (!config.plugins?.disableAll) {\n console.log(\"[Bootstrap] Bootstrapping core plugins...\");\n const bootstrapService = new PluginBootstrapService(c.env.DB);\n\n // Check if bootstrap is needed\n const needsBootstrap = await bootstrapService.isBootstrapNeeded();\n if (needsBootstrap) {\n await bootstrapService.bootstrapCorePlugins();\n }\n } else {\n console.log(\"[Bootstrap] Plugin bootstrap skipped (disableAll is true)\");\n }\n\n // Mark bootstrap as complete for this worker instance\n bootstrapComplete = true;\n console.log(\"[Bootstrap] System initialization completed\");\n } catch (error) {\n console.error(\"[Bootstrap] Error during system initialization:\", error);\n // Don't prevent the app from starting, but log the error\n }\n\n // 4. Verify security configuration (outside try/catch so critical\n // errors in production propagate and prevent insecure deployments)\n verifySecurityConfig(c.env as Bindings);\n\n return next();\n };\n}\n\n/**\n * Reset bootstrap flag (useful for testing)\n */\nexport function resetBootstrap() {\n bootstrapComplete = false;\n}\n","import { sign, verify } from 'hono/jwt'\nimport { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\ntype JWTPayload = {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n}\n\n// Fallback JWT secret for local development only (no wrangler secret set)\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// Default JWT TTL: 30 days. Can be overridden via JWT_EXPIRES_IN env var.\nconst DEFAULT_JWT_EXPIRES_IN_SECONDS = 60 * 60 * 24 * 30\n\n/**\n * Parse a TTL string like \"30d\", \"12h\", \"3600s\", or a bare number-of-seconds\n * into a seconds value. Returns null if the input is missing/unparseable.\n */\nfunction parseDuration(input: string | number | undefined | null): number | null {\n if (input === undefined || input === null || input === '') return null\n if (typeof input === 'number' && Number.isFinite(input) && input > 0) {\n return Math.floor(input)\n }\n const raw = String(input).trim()\n if (/^\\d+$/.test(raw)) {\n const n = parseInt(raw, 10)\n return n > 0 ? n : null\n }\n const match = raw.match(/^(\\d+)\\s*(s|sec|secs|seconds|m|min|mins|minutes|h|hr|hrs|hours|d|day|days)$/i)\n if (!match) return null\n const value = parseInt(match[1]!, 10)\n const unit = match[2]!.toLowerCase()\n if (unit.startsWith('s')) return value\n if (unit.startsWith('m')) return value * 60\n if (unit.startsWith('h')) return value * 60 * 60\n if (unit.startsWith('d')) return value * 60 * 60 * 24\n return null\n}\n\n/**\n * Resolve the JWT expiry in seconds from the environment.\n * Honors `JWT_EXPIRES_IN` (seconds or \"30d\"/\"12h\"/\"3600s\") with a 30-day default.\n */\nexport function getJwtExpirySeconds(env?: Record | null): number {\n const configured = parseDuration(env?.JWT_EXPIRES_IN)\n return configured ?? DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the JWT expiry in seconds. Precedence: `JWT_EXPIRES_IN` env var\n * (authoritative ceiling) → `settings.security.jwtExpiresIn` DB value\n * (admin-configurable) → 30-day default.\n *\n * The env var wins so operators can cap runtime overrides — admins can adjust\n * the TTL from /admin/settings/security, but an env var, if set, always wins.\n * DB failures fall back to env/default so auth never breaks if the settings\n * table is unreachable.\n */\nexport async function getJwtExpirySecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const envParsed = parseDuration(env?.JWT_EXPIRES_IN)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtExpiresIn'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* value may already be a bare string */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtExpiresIn from settings, falling back to default:', err)\n }\n }\n return DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the refresh grace window (seconds) for `/auth/refresh`. Precedence:\n * `JWT_REFRESH_GRACE_SECONDS` env var → `settings.security.jwtRefreshGraceSeconds`\n * DB value → 7-day default.\n */\nexport async function getJwtRefreshGraceSecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const DEFAULT_GRACE = 60 * 60 * 24 * 7\n const envParsed = parseDuration(env?.JWT_REFRESH_GRACE_SECONDS)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtRefreshGraceSeconds'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* may be bare */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtRefreshGraceSeconds from settings:', err)\n }\n }\n return DEFAULT_GRACE\n}\n\n/**\n * Decode a JWT payload without verifying the signature. Returns null on any\n * parsing failure. Callers MUST independently verify the signature before\n * trusting this value — used from the grace-window refresh path where the\n * signature is verified explicitly via `verifyHs256Signature`.\n */\nfunction decodeJwtPayload(token: string): JWTPayload | null {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return null\n const b64 = parts[1]!.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const json = atob(padded)\n const obj = JSON.parse(json)\n if (!obj || typeof obj.exp !== 'number') return null\n return obj as JWTPayload\n } catch {\n return null\n }\n}\n\nfunction base64UrlToBytes(b64url: string): Uint8Array {\n const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const bin = atob(padded)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return bytes\n}\n\n/**\n * Verify a JWT's HS256 signature using Web Crypto, independent of hono/jwt.\n * Returns true iff the signature matches the header.payload portion.\n */\nasync function verifyHs256Signature(token: string, secret: string): Promise {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return false\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n )\n const signature = base64UrlToBytes(parts[2]!)\n const message = encoder.encode(`${parts[0]}.${parts[1]}`)\n return await crypto.subtle.verify('HMAC', key, signature, message)\n } catch {\n return false\n }\n}\n\nexport class AuthManager {\n static async generateToken(\n userId: string,\n email: string,\n role: string,\n secret?: string,\n expiresInSeconds?: number\n ): Promise {\n const ttl = expiresInSeconds && expiresInSeconds > 0\n ? Math.floor(expiresInSeconds)\n : DEFAULT_JWT_EXPIRES_IN_SECONDS\n const now = Math.floor(Date.now() / 1000)\n const payload: JWTPayload = {\n userId,\n email,\n role,\n exp: now + ttl,\n iat: now\n }\n\n return await sign(payload, secret || JWT_SECRET_FALLBACK, 'HS256')\n }\n\n /**\n * Verify a token's signature and expiration.\n *\n * If `graceSeconds` > 0, tokens whose `exp` is within the grace window\n * (i.e. expired by no more than `graceSeconds`) are still returned. This\n * supports a sliding-session refresh endpoint that accepts recently-expired\n * tokens. Signature failures always return null.\n */\n static async verifyToken(\n token: string,\n secret?: string,\n graceSeconds: number = 0\n ): Promise {\n const effectiveSecret = secret || JWT_SECRET_FALLBACK\n try {\n let payload: JWTPayload | null = null\n try {\n payload = await verify(token, effectiveSecret, 'HS256') as JWTPayload\n } catch (verifyError: any) {\n // hono/jwt checks `exp` before signature, so a bad-signature token\n // that happens to be expired will throw JwtTokenExpired here. For\n // the grace window, we still require a valid HS256 signature before\n // accepting the payload.\n const name = verifyError?.name || ''\n const message = String(verifyError?.message || '')\n const isExpired = name === 'JwtTokenExpired' || message.includes('expired')\n if (!isExpired || graceSeconds <= 0) {\n throw verifyError\n }\n const signatureValid = await verifyHs256Signature(token, effectiveSecret)\n if (!signatureValid) return null\n const decoded = decodeJwtPayload(token)\n if (!decoded) return null\n payload = decoded\n }\n\n if (!payload) return null\n\n const now = Math.floor(Date.now() / 1000)\n if (payload.exp < now - Math.max(0, Math.floor(graceSeconds))) {\n return null\n }\n\n return payload\n } catch (error) {\n console.error('Token verification failed:', error)\n return null\n }\n }\n\n static async hashPassword(password: string): Promise {\n const iterations = 100000\n const salt = new Uint8Array(16)\n crypto.getRandomValues(salt)\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const saltHex = Array.from(salt).map(b => b.toString(16).padStart(2, '0')).join('')\n const hashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n return `pbkdf2:${iterations}:${saltHex}:${hashHex}`\n }\n\n static async hashPasswordLegacy(password: string): Promise {\n const encoder = new TextEncoder()\n const data = encoder.encode(password + 'salt-change-in-production')\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n static async verifyPassword(password: string, storedHash: string): Promise {\n if (storedHash.startsWith('pbkdf2:')) {\n // PBKDF2 format: pbkdf2:::\n const parts = storedHash.split(':')\n if (parts.length !== 4) return false\n\n const iterationsStr = parts[1]!\n const saltHex = parts[2]!\n const expectedHashHex = parts[3]!\n const iterations = parseInt(iterationsStr, 10)\n\n const saltBytes = saltHex.match(/.{2}/g)\n if (!saltBytes) return false\n const salt = new Uint8Array(saltBytes.map(byte => parseInt(byte, 16)))\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const actualHashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n // Constant-time comparison\n if (actualHashHex.length !== expectedHashHex.length) return false\n let result = 0\n for (let i = 0; i < actualHashHex.length; i++) {\n result |= actualHashHex.charCodeAt(i) ^ expectedHashHex.charCodeAt(i)\n }\n return result === 0\n }\n\n // Legacy SHA-256 format (no colons in hash)\n const legacyHash = await this.hashPasswordLegacy(password)\n // Constant-time comparison for legacy too\n if (legacyHash.length !== storedHash.length) return false\n let result = 0\n for (let i = 0; i < legacyHash.length; i++) {\n result |= legacyHash.charCodeAt(i) ^ storedHash.charCodeAt(i)\n }\n return result === 0\n }\n\n static isLegacyHash(storedHash: string): boolean {\n return !storedHash.startsWith('pbkdf2:')\n }\n\n /**\n * Set authentication cookie - useful for plugins implementing alternative auth methods\n * @param c - Hono context\n * @param token - JWT token to set in cookie\n * @param options - Optional cookie configuration\n */\n static setAuthCookie(c: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void {\n setCookie(c, 'auth_token', token, {\n httpOnly: options?.httpOnly ?? true,\n secure: options?.secure ?? true,\n sameSite: options?.sameSite ?? 'Strict',\n maxAge: options?.maxAge ?? getJwtExpirySeconds((c as any)?.env)\n })\n }\n}\n\n// Middleware to require authentication\nexport const requireAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n // Try to get token from Authorization header\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n\n // If no header token, try cookie\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n\n if (!token) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n // Try to get cached token verification from KV\n const kv = c.env?.KV\n let payload: JWTPayload | null = null\n\n if (kv) {\n const cacheKey = `auth:${token.substring(0, 20)}` // Use token prefix as key\n const cached = await kv.get(cacheKey, 'json')\n if (cached) {\n payload = cached as JWTPayload\n }\n }\n\n // If not cached, verify token\n if (!payload) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n payload = await AuthManager.verifyToken(token, jwtSecret)\n\n // Cache the verified payload for 5 minutes\n if (payload && kv) {\n const cacheKey = `auth:${token.substring(0, 20)}`\n await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 })\n }\n }\n\n if (!payload) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Your session has expired, please login again')\n }\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Add user info to context\n c.set('user', payload)\n\n return await next()\n } catch (error) {\n console.error('Auth middleware error:', error)\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Authentication failed, please login again')\n }\n return c.json({ error: 'Authentication failed' }, 401)\n }\n }\n}\n\n// Middleware to require specific role\nexport const requireRole = (requiredRole: string | string[]) => {\n return async (c: Context, next: Next) => {\n const user = c.get('user') as JWTPayload\n \n if (!user) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n \n const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]\n \n if (!roles.includes(user.role)) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=You do not have permission to access this area')\n }\n return c.json({ error: 'Insufficient permissions' }, 403)\n }\n \n return await next()\n }\n}\n\n// Optional auth middleware (doesn't block if no token)\nexport const optionalAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n \n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n \n if (token) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n const payload = await AuthManager.verifyToken(token, jwtSecret)\n if (payload) {\n c.set('user', payload)\n }\n }\n \n return await next()\n } catch (error) {\n // Don't block on auth errors in optional auth\n console.error('Optional auth error:', error)\n return await next()\n }\n }\n}\n","import { MiddlewareHandler } from 'hono'\nimport { metricsTracker } from '../utils/metrics'\n\n/**\n * Middleware to track all HTTP requests for real-time analytics\n * Excludes the metrics endpoint itself to avoid inflating the count\n */\nexport const metricsMiddleware = (): MiddlewareHandler => {\n return async (c, next) => {\n const path = new URL(c.req.url).pathname\n\n // Don't track the metrics endpoint itself to avoid self-inflating counts\n if (path !== '/admin/dashboard/api/metrics') {\n metricsTracker.recordRequest()\n }\n\n // Continue with the request\n await next()\n }\n}\n","/**\n * CSRF Protection Middleware — Signed Double-Submit Cookie\n *\n * Stateless CSRF protection for Cloudflare Workers (no session store needed).\n * Token format: `.` where HMAC-SHA256 is keyed with JWT_SECRET.\n *\n * Flow:\n * GET — ensureCsrfCookie(): reuse existing valid cookie or set a new one\n * POST/PUT/DELETE/PATCH — validate X-CSRF-Token header === csrf_token cookie, HMAC valid\n *\n * Exempt:\n * - Safe methods (GET, HEAD, OPTIONS)\n * - Auth routes that create sessions (/auth/login*, /auth/register*, etc.)\n * - Public form submissions (/forms/*, /api/forms/*) — NOT /admin/forms/*\n * - Requests with no auth_token cookie (Bearer-only or API-key-only)\n */\n\nimport type { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\n// Fallback secret — mirrors auth.ts behavior for local dev without wrangler secret\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Convert ArrayBuffer to URL-safe base64 (no padding). */\nexport function arrayBufferToBase64Url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!)\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Import a string key for HMAC-SHA256. */\nasync function getHmacKey(secret: string): Promise {\n const encoder = new TextEncoder()\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify']\n )\n}\n\n// ============================================================================\n// Token Generation & Validation\n// ============================================================================\n\n/**\n * Generate a signed CSRF token: `.`\n * - nonce = 32 random bytes, base64url-encoded\n * - signature = HMAC-SHA256(nonce, secret), base64url-encoded\n */\nexport async function generateCsrfToken(secret: string): Promise {\n const nonceBytes = new Uint8Array(32)\n crypto.getRandomValues(nonceBytes)\n const nonce = arrayBufferToBase64Url(nonceBytes.buffer)\n\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(nonce))\n const signature = arrayBufferToBase64Url(signatureBuffer)\n\n return `${nonce}.${signature}`\n}\n\n/**\n * Validate a signed CSRF token.\n *\n * Checks that the token has the correct `.` format and that\n * the HMAC signature is valid for the given secret. Uses crypto.subtle.verify\n * which provides constant-time comparison.\n *\n * NOTE: No expiry check here — by design. The security property of signed\n * double-submit comes from the unpredictability of the nonce + the\n * secret-bound HMAC, not from time-bounding. The cookie's maxAge (86400s)\n * handles expiry at the browser level.\n */\nexport async function validateCsrfToken(token: string, secret: string): Promise {\n if (!token || typeof token !== 'string') return false\n\n const dotIndex = token.indexOf('.')\n if (dotIndex === -1) return false\n\n const nonce = token.substring(0, dotIndex)\n const signature = token.substring(dotIndex + 1)\n\n if (!nonce || !signature) return false\n\n try {\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n\n // Decode the signature from base64url\n const sigPadded = signature.replace(/-/g, '+').replace(/_/g, '/')\n const sigBinary = atob(sigPadded)\n const sigBytes = new Uint8Array(sigBinary.length)\n for (let i = 0; i < sigBinary.length; i++) {\n sigBytes[i] = sigBinary.charCodeAt(i)\n }\n\n // crypto.subtle.verify is constant-time\n return await crypto.subtle.verify('HMAC', key, sigBytes.buffer, encoder.encode(nonce))\n } catch {\n return false\n }\n}\n\n// ============================================================================\n// Default Exempt Paths\n// ============================================================================\n\nconst DEFAULT_EXEMPT_PATHS = [\n '/auth/login',\n '/auth/register',\n '/auth/seed-admin',\n '/auth/accept-invitation',\n '/auth/reset-password',\n '/auth/request-password-reset',\n '/auth/otp',\n '/auth/magic-link',\n '/auth/verify',\n '/api/stripe/webhook',\n '/api/events',\n]\n\n/**\n * Check whether a request path is exempt from CSRF validation.\n * - Exact match or startsWith for auth routes (e.g. /auth/login/form)\n * - /forms/* and /api/forms/* are exempt (public submissions)\n * - /api/search* is exempt (read-only POST for complex query params)\n * - /admin/forms/* is NOT exempt\n */\nfunction isExemptPath(path: string, extraExemptPaths: string[] = []): boolean {\n // Public form routes — NOT /admin/forms/*\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/') || path === '/forms' || path === '/api/forms') {\n return true\n }\n\n // Search API — read-only POST (includes /api/search/click, /api/search/facet-click)\n if (path.startsWith('/api/search')) {\n return true\n }\n\n const allExempt = [...DEFAULT_EXEMPT_PATHS, ...extraExemptPaths]\n for (const exempt of allExempt) {\n if (path === exempt || path.startsWith(exempt + '/')) {\n return true\n }\n }\n\n return false\n}\n\n// ============================================================================\n// Middleware\n// ============================================================================\n\nexport interface CsrfOptions {\n /** Additional paths to exempt from CSRF validation. */\n exemptPaths?: string[]\n}\n\n/**\n * CSRF protection middleware (Signed Double-Submit Cookie).\n *\n * - GET/HEAD/OPTIONS: ensure a valid csrf_token cookie exists\n * - POST/PUT/DELETE/PATCH: validate X-CSRF-Token header matches cookie, HMAC valid\n * - Exempt: auth routes, public /forms/*, Bearer-only, API-key-only\n */\nexport function csrfProtection(options: CsrfOptions = {}) {\n return async (c: Context, next: Next): Promise => {\n const method = c.req.method.toUpperCase()\n const path = new URL(c.req.url).pathname\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n\n // Warn if using fallback secret in production\n if (c.env?.ENVIRONMENT === 'production' && !c.env?.JWT_SECRET) {\n console.warn(\n '[CSRF] WARNING: JWT_SECRET is not set in production. ' +\n 'CSRF tokens are signed with the fallback key, which is insecure.'\n )\n }\n\n // Safe methods — just ensure cookie, then pass through\n if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS') {\n await ensureCsrfCookie(c, secret)\n await next()\n return\n }\n\n // Exempt paths — pass through without validation\n if (isExemptPath(path, options.exemptPaths)) {\n await next()\n return\n }\n\n // Bearer-only or API-key-only requests (no auth_token cookie) — exempt\n const authCookie = getCookie(c, 'auth_token')\n if (!authCookie) {\n await next()\n return\n }\n\n // Requests with an Authorization header use token-based auth — the cookie\n // is incidental and CSRF protection is unnecessary (the attacker cannot\n // forge the Authorization header from a cross-origin page).\n const authHeader = c.req.header('Authorization')\n if (authHeader) {\n await next()\n return\n }\n\n // State-changing request with cookie auth — validate CSRF\n const cookieToken = getCookie(c, 'csrf_token')\n let headerToken = c.req.header('X-CSRF-Token')\n\n // Fallback: check _csrf field in form-encoded body (regular HTML form submissions)\n if (!headerToken) {\n const contentType = c.req.header('Content-Type') || ''\n if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n try {\n const body = await c.req.parseBody()\n headerToken = body['_csrf'] as string | undefined\n } catch {\n // Body not parseable — leave headerToken undefined\n }\n }\n }\n\n if (!cookieToken || !headerToken) {\n return csrfError(c, 'CSRF token missing')\n }\n\n if (cookieToken !== headerToken) {\n return csrfError(c, 'CSRF token mismatch')\n }\n\n const isValid = await validateCsrfToken(cookieToken, secret)\n if (!isValid) {\n return csrfError(c, 'CSRF token invalid')\n }\n\n await next()\n }\n}\n\n/**\n * Ensure a valid CSRF cookie exists. Check-then-reuse: if the existing cookie\n * has a valid HMAC signature, reuse it (no new Set-Cookie header). Only\n * generate a fresh token when the cookie is missing or has an invalid signature.\n */\nasync function ensureCsrfCookie(c: Context, secret: string): Promise {\n const existing = getCookie(c, 'csrf_token')\n\n if (existing) {\n const isValid = await validateCsrfToken(existing, secret)\n if (isValid) {\n // Reuse existing valid token — no Set-Cookie needed\n c.set('csrfToken', existing)\n return\n }\n }\n\n // Generate fresh token\n const token = await generateCsrfToken(secret)\n c.set('csrfToken', token)\n\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n setCookie(c, 'csrf_token', token, {\n httpOnly: false, // JS must read this cookie\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: 86400, // 24 hours — browser-side expiry\n })\n}\n\n/** Return a 403 CSRF error — HTML for browser requests, JSON for API. */\nfunction csrfError(c: Context, message: string): Response {\n const accept = c.req.header('Accept') || ''\n if (accept.includes('text/html')) {\n return c.html(\n `403 Forbidden` +\n `

403 Forbidden

${message}

`,\n 403\n )\n }\n return c.json({ error: message, status: 403 }, 403)\n}\n","import { Context, Next } from 'hono'\n\ninterface RateLimitOptions {\n max: number\n windowMs: number\n keyPrefix: string\n}\n\ninterface RateLimitEntry {\n count: number\n resetAt: number\n}\n\n/**\n * KV-based sliding window rate limiter middleware.\n * Gracefully skips if CACHE_KV binding is not available.\n */\nexport function rateLimit(options: RateLimitOptions) {\n const { max, windowMs, keyPrefix } = options\n\n return async (c: Context, next: Next) => {\n const kv = (c.env as any)?.CACHE_KV\n if (!kv) {\n // No KV binding available — skip rate limiting\n return await next()\n }\n\n const ip = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const key = `ratelimit:${keyPrefix}:${ip}`\n\n try {\n const now = Date.now()\n const stored = await kv.get(key, 'json') as RateLimitEntry | null\n\n let entry: RateLimitEntry\n if (stored && stored.resetAt > now) {\n entry = stored\n } else {\n entry = { count: 0, resetAt: now + windowMs }\n }\n\n entry.count++\n\n // Calculate TTL in seconds (KV expiration)\n const ttlSeconds = Math.ceil((entry.resetAt - now) / 1000)\n\n if (entry.count > max) {\n // Store the updated count even when rejecting\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n const retryAfter = Math.ceil((entry.resetAt - now) / 1000)\n c.header('Retry-After', String(retryAfter))\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', '0')\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n return c.json({ error: 'Too many requests. Please try again later.' }, 429)\n }\n\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', String(max - entry.count))\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n\n return await next()\n } catch (error) {\n // Rate limiting should never break the app\n console.error('Rate limiter error (non-fatal):', error)\n return await next()\n }\n }\n}\n","import { Context, Next } from 'hono'\n\n/**\n * Security headers middleware.\n * Sets standard security headers on every response.\n * Skips HSTS in development to avoid local dev issues.\n */\nexport const securityHeadersMiddleware = () => {\n return async (c: Context, next: Next) => {\n await next()\n\n c.header('X-Content-Type-Options', 'nosniff')\n c.header('X-Frame-Options', 'SAMEORIGIN')\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin')\n c.header('Permissions-Policy', 'camera=(), microphone=(), geolocation=()')\n\n // Only set HSTS in non-development environments\n const environment = (c.env as any)?.ENVIRONMENT\n if (environment !== 'development') {\n c.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains')\n }\n }\n}\n","/**\n * Middleware Module Exports\n *\n * Request processing middleware for SonicJS\n *\n * Note: Most middleware is currently in the monolith and will be migrated later.\n * For now, we only export the bootstrap middleware which is used for system initialization.\n */\n\n// Bootstrap middleware\nexport { bootstrapMiddleware, verifySecurityConfig } from './bootstrap'\n\n// Auth middleware\nexport {\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n getJwtExpirySeconds,\n getJwtExpirySecondsFromDb,\n getJwtRefreshGraceSecondsFromDb,\n} from './auth'\n\n// Metrics middleware\nexport { metricsMiddleware } from './metrics'\n\n// CSRF protection middleware\nexport { csrfProtection, generateCsrfToken, validateCsrfToken } from './csrf'\n\n// Rate limiting middleware\nexport { rateLimit } from './rate-limit'\n\n// Re-export types and functions that are referenced but implemented in monolith\n// These are placeholder exports to maintain API compatibility\nexport type Permission = string\nexport type UserPermissions = {\n userId: string\n permissions: Permission[]\n}\n\n// Middleware stubs - these return pass-through middleware that call next()\nexport const loggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const detailedLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const securityLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const performanceLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const cacheHeaders: any = () => async (_c: any, next: any) => await next()\nexport const compressionMiddleware: any = async (_c: any, next: any) => await next()\nexport { securityHeadersMiddleware as securityHeaders } from './security-headers'\n\n// Other stubs\nexport const PermissionManager: any = {}\nexport const requirePermission: any = () => async (_c: any, next: any) => await next()\nexport const requireAnyPermission: any = () => async (_c: any, next: any) => await next()\nexport const logActivity: any = () => {}\nexport const requireActivePlugin: any = () => async (_c: any, next: any) => await next()\nexport const requireActivePlugins: any = () => async (_c: any, next: any) => await next()\nexport const getActivePlugins: any = () => []\nexport const isPluginActive: any = () => false\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-XWQVFWPW.cjs b/packages/core/dist/chunk-WAEQXGCX.cjs similarity index 99% rename from packages/core/dist/chunk-XWQVFWPW.cjs rename to packages/core/dist/chunk-WAEQXGCX.cjs index b1549aa0a..de0b8f6cf 100644 --- a/packages/core/dist/chunk-XWQVFWPW.cjs +++ b/packages/core/dist/chunk-WAEQXGCX.cjs @@ -1894,5 +1894,5 @@ exports.setAppInstance = setAppInstance; exports.systemLogs = systemLogs; exports.users = users; exports.workflowHistory = workflowHistory; -//# sourceMappingURL=chunk-XWQVFWPW.cjs.map -//# sourceMappingURL=chunk-XWQVFWPW.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-WAEQXGCX.cjs.map +//# sourceMappingURL=chunk-WAEQXGCX.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-WAEQXGCX.cjs.map b/packages/core/dist/chunk-WAEQXGCX.cjs.map new file mode 100644 index 000000000..44f47d9b4 --- /dev/null +++ b/packages/core/dist/chunk-WAEQXGCX.cjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/db/schema.ts","../../../node_modules/src/constants.ts","../../../node_modules/src/utils.ts","../../../node_modules/src/column.ts","../../../node_modules/src/schema.ts","../src/services/logger.ts","../src/services/cache.ts","../src/services/settings.ts","../src/services/telemetry-service.ts","../src/services/route-metadata.ts"],"names":["__export","zod","z","integer","isTable","getTableColumns","getViewSelectedFields","is","Column","SQL","columns","isView","sqliteTable","text","drizzle","inArray","eq","like","gte","lte","and","count","asc","desc","getTelemetryConfig","sanitizeErrorMessage","sanitizeRoute","generateInstallationId","generateProjectId","inspectRoutes"],"mappings":"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","file":"chunk-WAEQXGCX.cjs","sourcesContent":["import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod';\n\n// Users table for authentication and user management\nexport const users = sqliteTable('users', {\n id: text('id').primaryKey(),\n email: text('email').notNull().unique(),\n username: text('username').notNull().unique(),\n firstName: text('first_name').notNull(),\n lastName: text('last_name').notNull(),\n passwordHash: text('password_hash'), // Hashed password, nullable for OAuth users\n role: text('role').notNull().default('viewer'), // 'admin', 'editor', 'author', 'viewer'\n avatar: text('avatar'),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n lastLoginAt: integer('last_login_at'),\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Content collections - dynamic schema definitions\nexport const collections = sqliteTable('collections', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n schema: text('schema', { mode: 'json' }).notNull(), // JSON schema definition\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false), // Config-managed collections cannot be edited in UI\n sourceType: text('source_type').default('user'), // 'user' (normal), 'form' (form-derived)\n sourceId: text('source_id'), // stores the form ID for form-derived collections\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content items - actual content data\nexport const content = sqliteTable('content', {\n id: text('id').primaryKey(),\n collectionId: text('collection_id').notNull().references(() => collections.id),\n slug: text('slug').notNull(),\n title: text('title').notNull(),\n data: text('data', { mode: 'json' }).notNull(), // JSON content data\n status: text('status').notNull().default('draft'), // 'draft', 'published', 'archived'\n publishedAt: integer('published_at', { mode: 'timestamp' }),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content versions for versioning system\nexport const contentVersions = sqliteTable('content_versions', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n version: integer('version').notNull(),\n data: text('data', { mode: 'json' }).notNull(),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Media/Files table\nexport const media = sqliteTable('media', {\n id: text('id').primaryKey(),\n filename: text('filename').notNull(),\n originalName: text('original_name').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n width: integer('width'),\n height: integer('height'),\n folder: text('folder').notNull().default('uploads'),\n r2Key: text('r2_key').notNull(), // R2 storage key\n publicUrl: text('public_url').notNull(), // CDN URL\n thumbnailUrl: text('thumbnail_url'),\n alt: text('alt'),\n caption: text('caption'),\n tags: text('tags', { mode: 'json' }), // JSON array of tags\n uploadedBy: text('uploaded_by').notNull().references(() => users.id),\n uploadedAt: integer('uploaded_at').notNull(),\n updatedAt: integer('updated_at'),\n publishedAt: integer('published_at'),\n scheduledAt: integer('scheduled_at'),\n archivedAt: integer('archived_at'),\n deletedAt: integer('deleted_at'),\n});\n\n// API tokens for programmatic access\nexport const apiTokens = sqliteTable('api_tokens', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n token: text('token').notNull().unique(),\n userId: text('user_id').notNull().references(() => users.id),\n permissions: text('permissions', { mode: 'json' }).notNull(), // Array of permissions\n expiresAt: integer('expires_at', { mode: 'timestamp' }),\n lastUsedAt: integer('last_used_at', { mode: 'timestamp' }),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n\n// Workflow history for content workflow tracking\nexport const workflowHistory = sqliteTable('workflow_history', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n action: text('action').notNull(),\n fromStatus: text('from_status').notNull(),\n toStatus: text('to_status').notNull(),\n userId: text('user_id').notNull().references(() => users.id),\n comment: text('comment'),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Plugin system tables\nexport const plugins = sqliteTable('plugins', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n version: text('version').notNull(),\n author: text('author').notNull(),\n category: text('category').notNull(),\n icon: text('icon'),\n status: text('status').notNull().default('inactive'), // 'active', 'inactive', 'error'\n isCore: integer('is_core', { mode: 'boolean' }).notNull().default(false),\n settings: text('settings', { mode: 'json' }),\n permissions: text('permissions', { mode: 'json' }),\n dependencies: text('dependencies', { mode: 'json' }),\n downloadCount: integer('download_count').notNull().default(0),\n rating: integer('rating').notNull().default(0),\n installedAt: integer('installed_at').notNull(),\n activatedAt: integer('activated_at'),\n lastUpdated: integer('last_updated').notNull(),\n errorMessage: text('error_message'),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n updatedAt: integer('updated_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginHooks = sqliteTable('plugin_hooks', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n hookName: text('hook_name').notNull(),\n handlerName: text('handler_name').notNull(),\n priority: integer('priority').notNull().default(10),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginRoutes = sqliteTable('plugin_routes', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n path: text('path').notNull(),\n method: text('method').notNull(),\n handlerName: text('handler_name').notNull(),\n middleware: text('middleware', { mode: 'json' }),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginAssets = sqliteTable('plugin_assets', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n assetType: text('asset_type').notNull(), // 'css', 'js', 'image', 'font'\n assetPath: text('asset_path').notNull(),\n loadOrder: integer('load_order').notNull().default(100),\n loadLocation: text('load_location').notNull().default('footer'), // 'header', 'footer'\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginActivityLog = sqliteTable('plugin_activity_log', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n action: text('action').notNull(),\n userId: text('user_id'),\n details: text('details', { mode: 'json' }),\n timestamp: integer('timestamp').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\n// Zod schemas for validation\nexport const insertUserSchema = createInsertSchema(users, {\n email: (schema: any) => schema.email(),\n firstName: (schema: any) => schema.min(1),\n lastName: (schema: any) => schema.min(1),\n username: (schema: any) => schema.min(3),\n});\n\nexport const selectUserSchema = createSelectSchema(users);\n\nexport const insertCollectionSchema = createInsertSchema(collections, {\n name: (schema: any) => schema.min(1).regex(/^[a-z0-9_]+$/, 'Collection name must be lowercase with underscores'),\n displayName: (schema: any) => schema.min(1),\n});\n\nexport const selectCollectionSchema = createSelectSchema(collections);\n\nexport const insertContentSchema = createInsertSchema(content, {\n slug: (schema: any) => schema.min(1).regex(/^[a-zA-Z0-9_-]+$/, 'Slug must contain only letters, numbers, underscores, and hyphens'),\n title: (schema: any) => schema.min(1),\n status: (schema: any) => schema,\n});\n\nexport const selectContentSchema = createSelectSchema(content);\n\nexport const insertMediaSchema = createInsertSchema(media, {\n filename: (schema: any) => schema.min(1),\n originalName: (schema: any) => schema.min(1),\n mimeType: (schema: any) => schema.min(1),\n size: (schema: any) => schema.positive(),\n r2Key: (schema: any) => schema.min(1),\n publicUrl: (schema: any) => schema.url(),\n folder: (schema: any) => schema.min(1),\n});\n\nexport const selectMediaSchema = createSelectSchema(media);\n\n\nexport const insertWorkflowHistorySchema = createInsertSchema(workflowHistory, {\n action: (schema: any) => schema.min(1),\n fromStatus: (schema: any) => schema.min(1),\n toStatus: (schema: any) => schema.min(1),\n});\n\nexport const selectWorkflowHistorySchema = createSelectSchema(workflowHistory);\n\nexport const insertPluginSchema = createInsertSchema(plugins, {\n name: (schema: any) => schema.min(1),\n displayName: (schema: any) => schema.min(1),\n version: (schema: any) => schema.min(1),\n author: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginSchema = createSelectSchema(plugins);\n\nexport const insertPluginHookSchema = createInsertSchema(pluginHooks, {\n hookName: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginHookSchema = createSelectSchema(pluginHooks);\n\nexport const insertPluginRouteSchema = createInsertSchema(pluginRoutes, {\n path: (schema: any) => schema.min(1),\n method: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginRouteSchema = createSelectSchema(pluginRoutes);\n\nexport const insertPluginAssetSchema = createInsertSchema(pluginAssets, {\n assetType: (schema: any) => schema.min(1),\n assetPath: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginAssetSchema = createSelectSchema(pluginAssets);\n\nexport const insertPluginActivityLogSchema = createInsertSchema(pluginActivityLog, {\n action: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginActivityLogSchema = createSelectSchema(pluginActivityLog);\n\n// System logs table for comprehensive logging\nexport const systemLogs = sqliteTable('system_logs', {\n id: text('id').primaryKey(),\n level: text('level').notNull(), // 'debug', 'info', 'warn', 'error', 'fatal'\n category: text('category').notNull(), // 'auth', 'api', 'workflow', 'plugin', 'media', 'system', etc.\n message: text('message').notNull(),\n data: text('data', { mode: 'json' }), // Additional structured data\n userId: text('user_id').references(() => users.id),\n sessionId: text('session_id'),\n requestId: text('request_id'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n method: text('method'), // HTTP method for API logs\n url: text('url'), // Request URL for API logs\n statusCode: integer('status_code'), // HTTP status code for API logs\n duration: integer('duration'), // Request duration in milliseconds\n stackTrace: text('stack_trace'), // Error stack trace for error logs\n tags: text('tags', { mode: 'json' }), // Array of tags for categorization\n source: text('source'), // Source component/module that generated the log\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Log configuration table\nexport const logConfig = sqliteTable('log_config', {\n id: text('id').primaryKey(),\n category: text('category').notNull().unique(),\n enabled: integer('enabled', { mode: 'boolean' }).notNull().default(true),\n level: text('level').notNull().default('info'), // minimum log level to store\n retention: integer('retention').notNull().default(30), // days to keep logs\n maxSize: integer('max_size').default(10000), // max number of logs per category\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Insert and select schemas for system logs\nexport const insertSystemLogSchema = createInsertSchema(systemLogs, {\n level: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n message: (schema: any) => schema.min(1),\n});\n\nexport const selectSystemLogSchema = createSelectSchema(systemLogs);\n\nexport const insertLogConfigSchema = createInsertSchema(logConfig, {\n category: (schema: any) => schema.min(1),\n level: (schema: any) => schema.min(1),\n});\n\nexport const selectLogConfigSchema = createSelectSchema(logConfig);\n\n// Type exports\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\nexport type Collection = typeof collections.$inferSelect;\nexport type NewCollection = typeof collections.$inferInsert;\nexport type Content = typeof content.$inferSelect;\nexport type NewContent = typeof content.$inferInsert;\nexport type Media = typeof media.$inferSelect;\nexport type NewMedia = typeof media.$inferInsert;\nexport type WorkflowHistory = typeof workflowHistory.$inferSelect;\nexport type NewWorkflowHistory = typeof workflowHistory.$inferInsert;\nexport type Plugin = typeof plugins.$inferSelect;\nexport type NewPlugin = typeof plugins.$inferInsert;\nexport type PluginHook = typeof pluginHooks.$inferSelect;\nexport type NewPluginHook = typeof pluginHooks.$inferInsert;\nexport type PluginRoute = typeof pluginRoutes.$inferSelect;\nexport type NewPluginRoute = typeof pluginRoutes.$inferInsert;\nexport type PluginAsset = typeof pluginAssets.$inferSelect;\nexport type NewPluginAsset = typeof pluginAssets.$inferInsert;\nexport type PluginActivityLog = typeof pluginActivityLog.$inferSelect;\nexport type NewPluginActivityLog = typeof pluginActivityLog.$inferInsert;\nexport type SystemLog = typeof systemLogs.$inferSelect;\nexport type NewSystemLog = typeof systemLogs.$inferInsert;\nexport type LogConfig = typeof logConfig.$inferSelect;\nexport type NewLogConfig = typeof logConfig.$inferInsert;\n\n// =====================================================\n// Security Audit Plugin Tables\n// =====================================================\n\nexport const securityEvents = sqliteTable('security_events', {\n id: text('id').primaryKey(),\n eventType: text('event_type').notNull(),\n severity: text('severity').notNull().default('info'),\n userId: text('user_id'),\n email: text('email'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n countryCode: text('country_code'),\n requestPath: text('request_path'),\n requestMethod: text('request_method'),\n details: text('details', { mode: 'json' }),\n fingerprint: text('fingerprint'),\n blocked: integer('blocked').notNull().default(0),\n createdAt: integer('created_at').notNull().$defaultFn(() => Date.now()),\n});\n\nexport const insertSecurityEventSchema = createInsertSchema(securityEvents, {\n eventType: (schema: any) => schema.min(1),\n severity: (schema: any) => schema.min(1),\n});\n\nexport const selectSecurityEventSchema = createSelectSchema(securityEvents);\n\nexport type SecurityEventRecord = typeof securityEvents.$inferSelect;\nexport type NewSecurityEventRecord = typeof securityEvents.$inferInsert;\n\n// =====================================================\n// Form.io Integration Tables\n// =====================================================\n\n// Forms table - stores Form.io form definitions\nexport const forms = sqliteTable('forms', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(), // Machine name (e.g., \"contact-form\")\n displayName: text('display_name').notNull(), // Human name (e.g., \"Contact Form\")\n description: text('description'),\n category: text('category').notNull().default('general'), // contact, survey, registration, etc.\n \n // Form.io schema (JSON)\n formioSchema: text('formio_schema', { mode: 'json' }).notNull(), // Complete Form.io JSON schema\n \n // Settings (JSON)\n settings: text('settings', { mode: 'json' }), // emailNotifications, successMessage, etc.\n \n // Status & Management\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n isPublic: integer('is_public', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false),\n \n // Metadata\n icon: text('icon'),\n color: text('color'),\n tags: text('tags', { mode: 'json' }), // JSON array\n \n // Stats\n submissionCount: integer('submission_count').notNull().default(0),\n viewCount: integer('view_count').notNull().default(0),\n \n // Ownership\n createdBy: text('created_by').references(() => users.id),\n updatedBy: text('updated_by').references(() => users.id),\n \n // Timestamps\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form submissions table\nexport const formSubmissions = sqliteTable('form_submissions', {\n id: text('id').primaryKey(),\n formId: text('form_id').notNull().references(() => forms.id, { onDelete: 'cascade' }),\n \n // Submission data\n submissionData: text('submission_data', { mode: 'json' }).notNull(), // The actual form data\n \n // Submission metadata\n status: text('status').notNull().default('pending'), // pending, reviewed, approved, rejected, spam\n submissionNumber: integer('submission_number'),\n \n // User information\n userId: text('user_id').references(() => users.id),\n userEmail: text('user_email'),\n \n // Tracking\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n referrer: text('referrer'),\n utmSource: text('utm_source'),\n utmMedium: text('utm_medium'),\n utmCampaign: text('utm_campaign'),\n \n // Review/Processing\n reviewedBy: text('reviewed_by').references(() => users.id),\n reviewedAt: integer('reviewed_at'),\n reviewNotes: text('review_notes'),\n \n // Flags\n isSpam: integer('is_spam', { mode: 'boolean' }).notNull().default(false),\n isArchived: integer('is_archived', { mode: 'boolean' }).notNull().default(false),\n\n // Content integration\n contentId: text('content_id').references(() => content.id), // Links submission to its content item\n\n // Timestamps\n submittedAt: integer('submitted_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form files table - links submissions to uploaded files\nexport const formFiles = sqliteTable('form_files', {\n id: text('id').primaryKey(),\n submissionId: text('submission_id').notNull().references(() => formSubmissions.id, { onDelete: 'cascade' }),\n mediaId: text('media_id').notNull().references(() => media.id, { onDelete: 'cascade' }),\n fieldName: text('field_name').notNull(), // Form field that uploaded this file\n uploadedAt: integer('uploaded_at').notNull(),\n});\n\n// Zod schemas for validation\nexport const insertFormSchema = createInsertSchema(forms);\nexport const selectFormSchema = createSelectSchema(forms);\nexport const insertFormSubmissionSchema = createInsertSchema(formSubmissions);\nexport const selectFormSubmissionSchema = createSelectSchema(formSubmissions);\nexport const insertFormFileSchema = createInsertSchema(formFiles);\nexport const selectFormFileSchema = createSelectSchema(formFiles);\n\n// TypeScript types\nexport type Form = typeof forms.$inferSelect;\nexport type NewForm = typeof forms.$inferInsert;\nexport type FormSubmission = typeof formSubmissions.$inferSelect;\nexport type NewFormSubmission = typeof formSubmissions.$inferInsert;\nexport type FormFile = typeof formFiles.$inferSelect;\nexport type NewFormFile = typeof formFiles.$inferInsert;",null,null,null,null,"import type { D1Database } from '@cloudflare/workers-types'\nimport { systemLogs, logConfig, type NewSystemLog, type LogConfig } from '../db/schema'\nimport { drizzle } from 'drizzle-orm/d1'\nimport { eq, and, gte, lte, desc, asc, count, like, inArray } from 'drizzle-orm'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal'\nexport type LogCategory = 'auth' | 'api' | 'workflow' | 'plugin' | 'media' | 'system' | 'security' | 'error'\n\nexport interface LogEntry {\n level: LogLevel\n category: LogCategory\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags?: string[]\n source?: string\n}\n\nexport interface LogFilter {\n level?: LogLevel[]\n category?: LogCategory[]\n userId?: string\n source?: string\n search?: string\n startDate?: Date\n endDate?: Date\n tags?: string[]\n limit?: number\n offset?: number\n sortBy?: 'created_at' | 'level' | 'category'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport class Logger {\n private db: ReturnType\n private enabled: boolean = true\n private configCache: Map = new Map()\n private lastConfigRefresh: number = 0\n private configRefreshInterval: number = 60000 // 1 minute\n\n constructor(database: D1Database) {\n this.db = drizzle(database)\n }\n\n /**\n * Log a debug message\n */\n async debug(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('debug', category, message, data, context)\n }\n\n /**\n * Log an info message\n */\n async info(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('info', category, message, data, context)\n }\n\n /**\n * Log a warning message\n */\n async warn(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('warn', category, message, data, context)\n }\n\n /**\n * Log an error message\n */\n async error(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('error', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log a fatal message\n */\n async fatal(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('fatal', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log an API request\n */\n async logRequest(\n method: string,\n url: string,\n statusCode: number,\n duration: number,\n context?: Partial\n ): Promise {\n const level: LogLevel = statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info'\n \n return this.log(level, 'api', `${method} ${url} - ${statusCode}`, {\n method,\n url,\n statusCode,\n duration\n }, {\n ...context,\n method,\n url,\n statusCode,\n duration\n })\n }\n\n /**\n * Log an authentication event\n */\n async logAuth(action: string, userId?: string, success: boolean = true, context?: Partial): Promise {\n const level: LogLevel = success ? 'info' : 'warn'\n \n return this.log(level, 'auth', `Authentication ${action}: ${success ? 'success' : 'failed'}`, {\n action,\n success,\n userId\n }, {\n ...context,\n userId,\n tags: ['authentication', action]\n })\n }\n\n /**\n * Log a security event\n */\n async logSecurity(event: string, severity: 'low' | 'medium' | 'high' | 'critical', context?: Partial): Promise {\n const level: LogLevel = severity === 'critical' ? 'fatal' : severity === 'high' ? 'error' : 'warn'\n \n return this.log(level, 'security', `Security event: ${event}`, {\n event,\n severity\n }, {\n ...context,\n tags: ['security', severity]\n })\n }\n\n /**\n * Core logging method\n */\n private async log(\n level: LogLevel,\n category: LogCategory,\n message: string,\n data?: any,\n context?: Partial\n ): Promise {\n if (!this.enabled) return\n\n try {\n // Check if logging is enabled for this category and level\n const config = await this.getConfig(category)\n if (!config || !config.enabled || !this.shouldLog(level, config.level)) {\n return\n }\n\n const logEntry: NewSystemLog = {\n id: crypto.randomUUID(),\n level,\n category,\n message,\n data: data ? JSON.stringify(data) : null,\n userId: context?.userId || null,\n sessionId: context?.sessionId || null,\n requestId: context?.requestId || null,\n ipAddress: context?.ipAddress || null,\n userAgent: context?.userAgent || null,\n method: context?.method || null,\n url: context?.url || null,\n statusCode: context?.statusCode || null,\n duration: context?.duration || null,\n stackTrace: context?.stackTrace || null,\n tags: context?.tags ? JSON.stringify(context.tags) : null,\n source: context?.source || null,\n createdAt: new Date()\n }\n\n await this.db.insert(systemLogs).values(logEntry)\n\n // Check if we need to clean up old logs\n if (config.maxSize) {\n await this.cleanupCategory(category, config.maxSize)\n }\n\n } catch (error) {\n // Don't log errors in the logger to avoid infinite loops\n console.error('Logger error:', error)\n }\n }\n\n /**\n * Get logs with filtering and pagination\n */\n async getLogs(filter: LogFilter = {}): Promise<{ logs: any[], total: number }> {\n try {\n const conditions = []\n \n if (filter.level && filter.level.length > 0) {\n conditions.push(inArray(systemLogs.level, filter.level))\n }\n \n if (filter.category && filter.category.length > 0) {\n conditions.push(inArray(systemLogs.category, filter.category))\n }\n \n if (filter.userId) {\n conditions.push(eq(systemLogs.userId, filter.userId))\n }\n \n if (filter.source) {\n conditions.push(eq(systemLogs.source, filter.source))\n }\n \n if (filter.search) {\n conditions.push(\n like(systemLogs.message, `%${filter.search}%`)\n )\n }\n \n if (filter.startDate) {\n conditions.push(gte(systemLogs.createdAt, filter.startDate))\n }\n \n if (filter.endDate) {\n conditions.push(lte(systemLogs.createdAt, filter.endDate))\n }\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined\n\n // Get total count\n const totalResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(whereClause)\n\n const total = totalResult[0]?.count || 0\n\n // Get logs with pagination and sorting\n const sortColumn = filter.sortBy === 'level' ? systemLogs.level :\n filter.sortBy === 'category' ? systemLogs.category :\n systemLogs.createdAt\n\n const sortFn = filter.sortOrder === 'asc' ? asc : desc\n\n const logs = await this.db\n .select()\n .from(systemLogs)\n .where(whereClause)\n .orderBy(sortFn(sortColumn))\n .limit(filter.limit || 50)\n .offset(filter.offset || 0)\n\n return { logs, total }\n } catch (error) {\n console.error('Error getting logs:', error)\n return { logs: [], total: 0 }\n }\n }\n\n /**\n * Get log configuration for a category\n */\n private async getConfig(category: LogCategory): Promise {\n try {\n // Check cache first\n const now = Date.now()\n if (this.configCache.has(category) && (now - this.lastConfigRefresh) < this.configRefreshInterval) {\n return this.configCache.get(category) || null\n }\n\n // Refresh config from database\n const configs = await this.db\n .select()\n .from(logConfig)\n .where(eq(logConfig.category, category))\n\n const config = configs[0] || null\n \n if (config) {\n this.configCache.set(category, config)\n this.lastConfigRefresh = now\n }\n\n return config\n } catch (error) {\n console.error('Error getting log config:', error)\n return null\n }\n }\n\n /**\n * Update log configuration\n */\n async updateConfig(category: LogCategory, updates: Partial): Promise {\n try {\n await this.db\n .update(logConfig)\n .set({\n ...updates,\n updatedAt: new Date()\n })\n .where(eq(logConfig.category, category))\n\n // Clear cache for this category\n this.configCache.delete(category)\n } catch (error) {\n console.error('Error updating log config:', error)\n }\n }\n\n /**\n * Get all log configurations\n */\n async getAllConfigs(): Promise {\n try {\n return await this.db.select().from(logConfig)\n } catch (error) {\n console.error('Error getting log configs:', error)\n return []\n }\n }\n\n /**\n * Clean up old logs for a category\n */\n private async cleanupCategory(category: LogCategory, maxSize: number): Promise {\n try {\n // Count current logs for this category\n const countResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n\n const currentCount = countResult[0]?.count || 0\n\n if (currentCount > maxSize) {\n // Get the cutoff date (keep newest maxSize logs)\n const cutoffLogs = await this.db\n .select({ createdAt: systemLogs.createdAt })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n .orderBy(desc(systemLogs.createdAt))\n .limit(1)\n .offset(maxSize - 1)\n\n if (cutoffLogs[0]) {\n // Delete older logs\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, category),\n lte(systemLogs.createdAt, cutoffLogs[0].createdAt)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n }\n }\n\n /**\n * Clean up logs based on retention policy\n */\n async cleanupByRetention(): Promise {\n try {\n const configs = await this.getAllConfigs()\n \n for (const config of configs) {\n if (config.retention > 0) {\n const cutoffDate = new Date()\n cutoffDate.setDate(cutoffDate.getDate() - config.retention)\n\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, config.category),\n lte(systemLogs.createdAt, cutoffDate)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs by retention:', error)\n }\n }\n\n /**\n * Check if a log level should be recorded based on configuration\n */\n private shouldLog(level: LogLevel, configLevel: string): boolean {\n const levels = ['debug', 'info', 'warn', 'error', 'fatal']\n const levelIndex = levels.indexOf(level)\n const configLevelIndex = levels.indexOf(configLevel)\n \n return levelIndex >= configLevelIndex\n }\n\n /**\n * Enable or disable logging\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton logger instance\nlet loggerInstance: Logger | null = null\n\n/**\n * Get the logger instance\n */\nexport function getLogger(database?: D1Database): Logger {\n if (!loggerInstance && database) {\n loggerInstance = new Logger(database)\n }\n \n if (!loggerInstance) {\n throw new Error('Logger not initialized. Call getLogger with a database instance first.')\n }\n \n return loggerInstance\n}\n\n/**\n * Initialize the logger with a database\n */\nexport function initLogger(database: D1Database): Logger {\n loggerInstance = new Logger(database)\n return loggerInstance\n}","/**\n * Simple Cache Service\n *\n * Provides basic caching functionality for the core package\n * Can be extended with KV or other storage backends\n */\n\nexport interface CacheConfig {\n ttl: number // Time to live in seconds\n keyPrefix: string\n}\n\nexport class CacheService {\n private config: CacheConfig\n private memoryCache: Map = new Map()\n\n constructor(config: CacheConfig) {\n this.config = config\n }\n\n /**\n * Generate cache key with prefix\n */\n generateKey(type: string, identifier?: string): string {\n const parts = [this.config.keyPrefix, type]\n if (identifier) {\n parts.push(identifier)\n }\n return parts.join(':')\n }\n\n /**\n * Get value from cache\n */\n async get(key: string): Promise {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return null\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return null\n }\n\n return cached.value as T\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise<{\n hit: boolean\n data: T | null\n source: string\n ttl?: number\n }> {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return {\n hit: false,\n data: null,\n source: 'none'\n }\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return {\n hit: false,\n data: null,\n source: 'expired'\n }\n }\n\n return {\n hit: true,\n data: cached.value as T,\n source: 'memory',\n ttl: (cached.expires - Date.now()) / 1000 // TTL in seconds\n }\n }\n\n /**\n * Set value in cache\n */\n async set(key: string, value: any, ttl?: number): Promise {\n const expires = Date.now() + ((ttl || this.config.ttl) * 1000)\n this.memoryCache.set(key, { value, expires })\n }\n\n /**\n * Delete specific key from cache\n */\n async delete(key: string): Promise {\n this.memoryCache.delete(key)\n }\n\n /**\n * Invalidate cache keys matching a pattern\n * For memory cache, we do simple string matching\n */\n async invalidate(pattern: string): Promise {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.')\n const regex = new RegExp(`^${regexPattern}$`)\n\n // Find and delete matching keys\n for (const key of this.memoryCache.keys()) {\n if (regex.test(key)) {\n this.memoryCache.delete(key)\n }\n }\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise {\n this.memoryCache.clear()\n }\n\n /**\n * Get value from cache or set it using a callback\n */\n async getOrSet(key: string, callback: () => Promise, ttl?: number): Promise {\n const cached = await this.get(key)\n\n if (cached !== null) {\n return cached\n }\n\n const value = await callback()\n await this.set(key, value, ttl)\n return value\n }\n}\n\n/**\n * Cache configurations for different data types\n */\nexport const CACHE_CONFIGS = {\n api: {\n ttl: 300, // 5 minutes\n keyPrefix: 'api'\n },\n user: {\n ttl: 600, // 10 minutes\n keyPrefix: 'user'\n },\n content: {\n ttl: 300, // 5 minutes\n keyPrefix: 'content'\n },\n collection: {\n ttl: 600, // 10 minutes\n keyPrefix: 'collection'\n }\n}\n\n/**\n * Get cache service instance for a config\n */\nexport function getCacheService(config: CacheConfig): CacheService {\n return new CacheService(config)\n}\n","export interface Setting {\n id: string\n category: string\n key: string\n value: string // JSON string\n created_at: number\n updated_at: number\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface SecuritySettings {\n jwtExpiresIn: string\n jwtRefreshGraceSeconds: number\n}\n\nexport class SettingsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get a setting value by category and key\n */\n async getSetting(category: string, key: string): Promise {\n try {\n const result = await this.db\n .prepare('SELECT value FROM settings WHERE category = ? AND key = ?')\n .bind(category, key)\n .first()\n\n if (!result) {\n return null\n }\n\n return JSON.parse((result as any).value)\n } catch (error) {\n console.error(`Error getting setting ${category}.${key}:`, error)\n return null\n }\n }\n\n /**\n * Get all settings for a category\n */\n async getCategorySettings(category: string): Promise> {\n try {\n const { results } = await this.db\n .prepare('SELECT key, value FROM settings WHERE category = ?')\n .bind(category)\n .all()\n\n const settings: Record = {}\n for (const row of results || []) {\n const r = row as any\n settings[r.key] = JSON.parse(r.value)\n }\n\n return settings\n } catch (error) {\n console.error(`Error getting category settings for ${category}:`, error)\n return {}\n }\n }\n\n /**\n * Set a setting value\n */\n async setSetting(category: string, key: string, value: any): Promise {\n try {\n const now = Date.now()\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n\n return true\n } catch (error) {\n console.error(`Error setting ${category}.${key}:`, error)\n return false\n }\n }\n\n /**\n * Set multiple settings at once\n */\n async setMultipleSettings(category: string, settings: Record): Promise {\n try {\n const now = Date.now()\n\n // Use a transaction-like approach with batch operations\n for (const [key, value] of Object.entries(settings)) {\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n }\n\n return true\n } catch (error) {\n console.error(`Error setting multiple settings for ${category}:`, error)\n return false\n }\n }\n\n /**\n * Get general settings with defaults\n */\n async getGeneralSettings(userEmail?: string): Promise {\n const settings = await this.getCategorySettings('general')\n\n return {\n siteName: settings.siteName || 'SonicJS AI',\n siteDescription: settings.siteDescription || 'A modern headless CMS powered by AI',\n adminEmail: settings.adminEmail || userEmail || 'admin@example.com',\n timezone: settings.timezone || 'UTC',\n language: settings.language || 'en',\n maintenanceMode: settings.maintenanceMode || false\n }\n }\n\n /**\n * Save general settings\n */\n async saveGeneralSettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.siteName !== undefined) settingsToSave.siteName = settings.siteName\n if (settings.siteDescription !== undefined) settingsToSave.siteDescription = settings.siteDescription\n if (settings.adminEmail !== undefined) settingsToSave.adminEmail = settings.adminEmail\n if (settings.timezone !== undefined) settingsToSave.timezone = settings.timezone\n if (settings.language !== undefined) settingsToSave.language = settings.language\n if (settings.maintenanceMode !== undefined) settingsToSave.maintenanceMode = settings.maintenanceMode\n\n return await this.setMultipleSettings('general', settingsToSave)\n }\n\n /**\n * Get security settings with defaults\n */\n async getSecuritySettings(): Promise {\n const settings = await this.getCategorySettings('security')\n\n return {\n jwtExpiresIn: settings.jwtExpiresIn || '30d',\n jwtRefreshGraceSeconds:\n typeof settings.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n }\n }\n\n /**\n * Save security settings\n */\n async saveSecuritySettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.jwtExpiresIn !== undefined) settingsToSave.jwtExpiresIn = settings.jwtExpiresIn\n if (settings.jwtRefreshGraceSeconds !== undefined)\n settingsToSave.jwtRefreshGraceSeconds = settings.jwtRefreshGraceSeconds\n\n return await this.setMultipleSettings('security', settingsToSave)\n }\n}\n","/**\n * Telemetry Service\n *\n * Privacy-first telemetry service using custom SonicJS stats endpoint\n * - No PII collection\n * - Opt-out by default\n * - Silent failures (never blocks app)\n */\n\nimport type { TelemetryEvent, TelemetryProperties, TelemetryConfig, TelemetryIdentity } from '../types/telemetry'\nimport { getTelemetryConfig } from '../utils/telemetry-config'\nimport { generateInstallationId, generateProjectId, sanitizeErrorMessage, sanitizeRoute } from '../utils/telemetry-id'\n\n/**\n * TelemetryService class\n *\n * Handles all telemetry tracking in a privacy-conscious way\n */\nexport class TelemetryService {\n private config: TelemetryConfig\n private identity: TelemetryIdentity | null = null\n private enabled: boolean = true\n private eventQueue: Array<{ event: TelemetryEvent; properties?: TelemetryProperties }> = []\n private isInitialized: boolean = false\n\n constructor(config?: Partial) {\n this.config = {\n ...getTelemetryConfig(),\n ...config\n }\n this.enabled = this.config.enabled\n }\n\n /**\n * Initialize the telemetry service\n */\n async initialize(identity: TelemetryIdentity): Promise {\n if (!this.enabled) {\n if (this.config.debug) {\n console.log('[Telemetry] Disabled via configuration')\n }\n return\n }\n\n try {\n this.identity = identity\n\n if (this.config.debug) {\n console.log('[Telemetry] Initialized with installation ID:', identity.installationId)\n }\n\n this.isInitialized = true\n\n // Flush any queued events\n await this.flushQueue()\n\n } catch (error) {\n // Silent fail - telemetry should never break the app\n if (this.config.debug) {\n console.error('[Telemetry] Initialization failed:', error)\n }\n this.enabled = false\n }\n }\n\n /**\n * Track a telemetry event\n */\n async track(event: TelemetryEvent, properties?: TelemetryProperties): Promise {\n if (!this.enabled) return\n\n try {\n // Sanitize properties\n const sanitizedProps = this.sanitizeProperties(properties)\n\n // Add standard properties\n const enrichedProps = {\n ...sanitizedProps,\n timestamp: new Date().toISOString(),\n version: this.getVersion()\n }\n\n // If not initialized, queue the event\n if (!this.isInitialized) {\n this.eventQueue.push({ event, properties: enrichedProps })\n if (this.config.debug) {\n console.log('[Telemetry] Queued event:', event, enrichedProps)\n }\n return\n }\n\n // Send to custom SonicJS stats endpoint\n if (this.identity && this.config.host) {\n const payload = {\n data: {\n installation_id: this.identity.installationId,\n event_type: event,\n properties: enrichedProps,\n timestamp: enrichedProps.timestamp\n }\n }\n\n // Fire and forget - don't block on response\n fetch(`${this.config.host}/v1/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload)\n }).catch(() => {}) // Silent fail\n\n if (this.config.debug) {\n console.log('[Telemetry] Tracked event:', event, enrichedProps)\n }\n } else if (this.config.debug) {\n console.log('[Telemetry] Event (no endpoint):', event, enrichedProps)\n }\n\n } catch (error) {\n // Silent fail\n if (this.config.debug) {\n console.error('[Telemetry] Failed to track event:', error)\n }\n }\n }\n\n /**\n * Track installation started\n */\n async trackInstallationStarted(properties?: TelemetryProperties): Promise {\n await this.track('installation_started', properties)\n }\n\n /**\n * Track installation completed\n */\n async trackInstallationCompleted(properties?: TelemetryProperties): Promise {\n await this.track('installation_completed', properties)\n }\n\n /**\n * Track installation failed\n */\n async trackInstallationFailed(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('installation_failed', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track dev server started\n */\n async trackDevServerStarted(properties?: TelemetryProperties): Promise {\n await this.track('dev_server_started', properties)\n }\n\n /**\n * Track page view in admin UI\n */\n async trackPageView(route: string, properties?: TelemetryProperties): Promise {\n await this.track('page_viewed', {\n ...properties,\n route: sanitizeRoute(route)\n })\n }\n\n /**\n * Track error (sanitized)\n */\n async trackError(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('error_occurred', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track plugin activation\n */\n async trackPluginActivated(properties?: TelemetryProperties): Promise {\n await this.track('plugin_activated', properties)\n }\n\n /**\n * Track migration run\n */\n async trackMigrationRun(properties?: TelemetryProperties): Promise {\n await this.track('migration_run', properties)\n }\n\n /**\n * Flush queued events\n */\n private async flushQueue(): Promise {\n if (this.eventQueue.length === 0) return\n\n const queue = [...this.eventQueue]\n this.eventQueue = []\n\n for (const { event, properties } of queue) {\n await this.track(event, properties)\n }\n }\n\n /**\n * Sanitize properties to ensure no PII\n */\n private sanitizeProperties(properties?: TelemetryProperties): TelemetryProperties {\n if (!properties) return {}\n\n const sanitized: TelemetryProperties = {}\n\n for (const [key, value] of Object.entries(properties)) {\n // Skip undefined values\n if (value === undefined) continue\n\n // Sanitize routes\n if (key === 'route' && typeof value === 'string') {\n sanitized[key] = sanitizeRoute(value)\n continue\n }\n\n // Sanitize error messages\n if (key.toLowerCase().includes('error') && typeof value === 'string') {\n sanitized[key] = sanitizeErrorMessage(value)\n continue\n }\n\n // Only allow specific types\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n sanitized[key] = value\n }\n }\n\n return sanitized\n }\n\n /**\n * Get SonicJS version\n */\n private getVersion(): string {\n try {\n // Safe environment access for Cloudflare Workers compatibility\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SONICJS_VERSION || '2.0.0'\n }\n return '2.0.0'\n } catch {\n return 'unknown'\n }\n }\n\n /**\n * Shutdown the telemetry service (no-op for fetch-based telemetry)\n */\n async shutdown(): Promise {\n // No-op - fetch requests are fire and forget\n }\n\n /**\n * Enable telemetry\n */\n enable(): void {\n this.enabled = true\n }\n\n /**\n * Disable telemetry\n */\n disable(): void {\n this.enabled = false\n }\n\n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton instance\nlet telemetryInstance: TelemetryService | null = null\n\n/**\n * Get the telemetry service instance\n */\nexport function getTelemetryService(config?: Partial): TelemetryService {\n if (!telemetryInstance) {\n telemetryInstance = new TelemetryService(config)\n }\n return telemetryInstance\n}\n\n/**\n * Initialize telemetry service\n */\nexport async function initTelemetry(identity: TelemetryIdentity, config?: Partial): Promise {\n const service = getTelemetryService(config)\n await service.initialize(identity)\n return service\n}\n\n/**\n * Create a new installation identity\n */\nexport function createInstallationIdentity(projectName?: string): TelemetryIdentity {\n const installationId = generateInstallationId()\n const identity: TelemetryIdentity = { installationId }\n\n if (projectName) {\n // Generate anonymous project ID\n identity.projectId = generateProjectId(projectName)\n }\n\n return identity\n}\n","/**\n * Route Metadata Service\n *\n * Auto-discovers API routes using Hono's inspectRoutes() and enriches them\n * with metadata from a static registry. Routes without metadata still appear\n * as \"auto-discovered\" — nothing is ever invisible.\n */\n\nimport { inspectRoutes } from 'hono/dev'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RouteMetadata {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented: boolean\n}\n\ninterface RouteMeta {\n description: string\n authentication: boolean\n category: string\n}\n\nexport interface CategoryInfo {\n title: string\n description: string\n icon: string\n}\n\n// ============================================================================\n// App Instance Storage\n// ============================================================================\n\nlet appInstance: any = null\n\nexport function setAppInstance(app: any): void {\n appInstance = app\n}\n\nexport function getAppInstance(): any {\n return appInstance\n}\n\n// ============================================================================\n// Category Information\n// ============================================================================\n\nexport const CATEGORY_INFO: Record = {\n 'Auth': {\n title: 'Authentication',\n description: 'User authentication and authorization endpoints',\n icon: '🔐'\n },\n 'Content': {\n title: 'Content Management',\n description: 'Content creation, retrieval, and management',\n icon: '📝'\n },\n 'Media': {\n title: 'Media Management',\n description: 'File upload, storage, and media operations',\n icon: '🖼️'\n },\n 'Admin': {\n title: 'Admin Interface',\n description: 'Administrative panel and management features',\n icon: '⚙️'\n },\n 'System': {\n title: 'System',\n description: 'Health checks and system information',\n icon: '🔧'\n },\n 'Search': {\n title: 'Search',\n description: 'AI-powered search, full-text search, and analytics',\n icon: '🔍'\n },\n 'API Keys': {\n title: 'API Keys',\n description: 'API key management and authentication',\n icon: '🔑'\n },\n 'Workflow': {\n title: 'Workflow',\n description: 'Content workflow and approval processes',\n icon: '🔄'\n },\n 'Cache': {\n title: 'Cache',\n description: 'Cache management and invalidation',\n icon: '⚡'\n },\n 'Forms': {\n title: 'Forms',\n description: 'Form submissions and management',\n icon: '📋'\n },\n 'Files': {\n title: 'Files',\n description: 'File serving from R2 storage',\n icon: '📁'\n }\n}\n\n// ============================================================================\n// Route Metadata Registry\n// ============================================================================\n\nconst ROUTE_METADATA: Record = {\n // Auth endpoints\n 'POST /auth/login': { description: 'Authenticate user with email and password (returns JWT)', category: 'Auth', authentication: false },\n 'POST /auth/login/form': { description: 'Form-based login (sets session cookie)', category: 'Auth', authentication: false },\n 'POST /auth/register': { description: 'Register a new user account', category: 'Auth', authentication: false },\n 'POST /auth/logout': { description: 'Log out the current user and invalidate session', category: 'Auth', authentication: true },\n 'GET /auth/me': { description: 'Get current authenticated user information', category: 'Auth', authentication: true },\n 'POST /auth/refresh': { description: 'Refresh authentication token', category: 'Auth', authentication: true },\n 'POST /auth/seed-admin': { description: 'Create or reset the admin user account', category: 'Auth', authentication: false },\n 'POST /auth/magic-link/request': { description: 'Request a magic link login email', category: 'Auth', authentication: false },\n 'GET /auth/magic-link/verify': { description: 'Verify magic link token and authenticate', category: 'Auth', authentication: false },\n 'POST /auth/otp/request': { description: 'Request a one-time password via email', category: 'Auth', authentication: false },\n 'POST /auth/otp/verify': { description: 'Verify OTP code and authenticate', category: 'Auth', authentication: false },\n\n // Content endpoints\n 'GET /api/collections': { description: 'List all available collections', category: 'Content', authentication: false },\n 'GET /api/collections/:collection/content': { description: 'Get all content items from a specific collection', category: 'Content', authentication: false },\n 'GET /api/content/:id': { description: 'Get a specific content item by ID', category: 'Content', authentication: false },\n 'POST /api/content': { description: 'Create a new content item', category: 'Content', authentication: true },\n 'PUT /api/content/:id': { description: 'Update an existing content item', category: 'Content', authentication: true },\n 'DELETE /api/content/:id': { description: 'Delete a content item', category: 'Content', authentication: true },\n 'GET /api/content/:id/versions': { description: 'Get version history for a content item', category: 'Content', authentication: true },\n 'POST /api/content/:id/restore/:versionId': { description: 'Restore a content item to a previous version', category: 'Content', authentication: true },\n\n // Media endpoints\n 'GET /api/media': { description: 'List all media files with pagination', category: 'Media', authentication: false },\n 'GET /api/media/:id': { description: 'Get a specific media file by ID', category: 'Media', authentication: false },\n 'POST /api/media/upload': { description: 'Upload a new media file to R2 storage', category: 'Media', authentication: true },\n 'DELETE /api/media/:id': { description: 'Delete a media file from storage', category: 'Media', authentication: true },\n\n // Admin API endpoints\n 'GET /admin/api/stats': { description: 'Get dashboard statistics (collections, content, media, users)', category: 'Admin', authentication: true },\n 'GET /admin/api/storage': { description: 'Get storage usage information', category: 'Admin', authentication: true },\n 'GET /admin/api/activity': { description: 'Get recent activity logs', category: 'Admin', authentication: true },\n 'GET /admin/api/collections': { description: 'List all collections with field counts', category: 'Admin', authentication: true },\n 'POST /admin/api/collections': { description: 'Create a new collection', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id': { description: 'Get a specific collection with its fields', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id': { description: 'Update an existing collection', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id': { description: 'Delete a collection (must be empty)', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id/fields': { description: 'Get fields for a specific collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields': { description: 'Add a field to a collection', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id/fields/:fieldId': { description: 'Update a collection field', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id/fields/:fieldId': { description: 'Remove a field from a collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields/reorder': { description: 'Reorder fields in a collection', category: 'Admin', authentication: true },\n 'GET /admin/api/migrations/status': { description: 'Get database migration status', category: 'Admin', authentication: true },\n 'POST /admin/api/migrations/run': { description: 'Run pending database migrations', category: 'Admin', authentication: true },\n 'GET /admin/api/content': { description: 'List content items with filtering and pagination', category: 'Admin', authentication: true },\n 'GET /admin/api/content/:id': { description: 'Get a content item for admin editing', category: 'Admin', authentication: true },\n 'POST /admin/api/content': { description: 'Create content via admin API', category: 'Admin', authentication: true },\n 'PUT /admin/api/content/:id': { description: 'Update content via admin API', category: 'Admin', authentication: true },\n 'DELETE /admin/api/content/:id': { description: 'Delete content via admin API', category: 'Admin', authentication: true },\n 'GET /admin/api/media': { description: 'List media files for admin management', category: 'Admin', authentication: true },\n 'POST /admin/api/media/upload': { description: 'Upload media via admin interface', category: 'Admin', authentication: true },\n 'DELETE /admin/api/media/:id': { description: 'Delete media via admin interface', category: 'Admin', authentication: true },\n 'GET /admin/api/users': { description: 'List all users', category: 'Admin', authentication: true },\n 'POST /admin/api/users': { description: 'Create a new user', category: 'Admin', authentication: true },\n 'PUT /admin/api/users/:id': { description: 'Update a user', category: 'Admin', authentication: true },\n 'DELETE /admin/api/users/:id': { description: 'Delete a user', category: 'Admin', authentication: true },\n 'GET /admin/api/logs': { description: 'Get application logs with filtering', category: 'Admin', authentication: true },\n 'GET /admin/api/plugins': { description: 'List all registered plugins', category: 'Admin', authentication: true },\n 'POST /admin/api/plugins/:id/toggle': { description: 'Enable or disable a plugin', category: 'Admin', authentication: true },\n 'GET /admin/api/settings': { description: 'Get application settings', category: 'Admin', authentication: true },\n 'PUT /admin/api/settings': { description: 'Update application settings', category: 'Admin', authentication: true },\n 'GET /admin/api/forms': { description: 'List all forms', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id': { description: 'Get form details and submissions', category: 'Admin', authentication: true },\n 'POST /admin/api/forms': { description: 'Create a new form', category: 'Admin', authentication: true },\n 'PUT /admin/api/forms/:id': { description: 'Update a form', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id': { description: 'Delete a form', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id/submissions': { description: 'Get form submissions', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id/submissions/:submissionId': { description: 'Delete a form submission', category: 'Admin', authentication: true },\n\n // Search endpoints\n 'GET /api/search': { description: 'Search content using AI, FTS5, keyword, or hybrid mode', category: 'Search', authentication: false },\n 'POST /api/search/click': { description: 'Track a search result click for analytics', category: 'Search', authentication: false },\n 'GET /admin/plugins/ai-search/api/status': { description: 'Get search plugin status and configuration', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index': { description: 'Trigger content indexing for search', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index/reset': { description: 'Reset the search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics': { description: 'Get search analytics and metrics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/queries': { description: 'Get top search queries', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/clicks': { description: 'Get click-through analytics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/fts5/status': { description: 'Get FTS5 full-text search status', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/fts5/rebuild': { description: 'Rebuild the FTS5 search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/facets': { description: 'Get available search facets', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments': { description: 'List search A/B test experiments', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments': { description: 'Create a search A/B test experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id': { description: 'Get experiment details', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/experiments/:id': { description: 'Update an experiment', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/experiments/:id': { description: 'Delete an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/start': { description: 'Start an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/stop': { description: 'Stop a running experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id/results': { description: 'Get experiment results and statistics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality': { description: 'Get search quality agent analysis', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/run': { description: 'Run search quality analysis', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality/recommendations': { description: 'Get quality improvement recommendations', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/apply': { description: 'Apply a quality recommendation', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/dismiss': { description: 'Dismiss a quality recommendation', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/synonyms': { description: 'List search synonyms', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/synonyms': { description: 'Add a search synonym', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/synonyms/:id': { description: 'Delete a search synonym', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/query-rules': { description: 'List search query rules', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/query-rules': { description: 'Create a query rule', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/query-rules/:id': { description: 'Update a query rule', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/query-rules/:id': { description: 'Delete a query rule', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/settings': { description: 'Get search plugin settings', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/settings': { description: 'Update search plugin settings', category: 'Search', authentication: true },\n\n // API Key endpoints\n 'GET /admin/api-keys/api/keys': { description: 'List all API keys', category: 'API Keys', authentication: true },\n 'POST /admin/api-keys/api/keys': { description: 'Create a new API key', category: 'API Keys', authentication: true },\n 'DELETE /admin/api-keys/api/keys/:id': { description: 'Revoke an API key', category: 'API Keys', authentication: true },\n 'PUT /admin/api-keys/api/keys/:id': { description: 'Update an API key', category: 'API Keys', authentication: true },\n\n // Cache endpoints\n 'GET /admin/cache/api/stats': { description: 'Get cache statistics', category: 'Cache', authentication: true },\n 'POST /admin/cache/api/purge': { description: 'Purge cache entries', category: 'Cache', authentication: true },\n 'GET /admin/cache/api/entries': { description: 'List cache entries', category: 'Cache', authentication: true },\n 'DELETE /admin/cache/api/entries/:key': { description: 'Delete a specific cache entry', category: 'Cache', authentication: true },\n\n // Workflow endpoints\n 'GET /workflow/status/:id': { description: 'Get workflow status for a content item', category: 'Workflow', authentication: true },\n 'POST /workflow/submit/:id': { description: 'Submit content for review', category: 'Workflow', authentication: true },\n 'POST /workflow/approve/:id': { description: 'Approve content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/reject/:id': { description: 'Reject content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/publish/:id': { description: 'Publish approved content', category: 'Workflow', authentication: true },\n 'POST /workflow/unpublish/:id': { description: 'Unpublish content', category: 'Workflow', authentication: true },\n 'GET /workflow/history/:id': { description: 'Get workflow history for a content item', category: 'Workflow', authentication: true },\n\n // Form endpoints (public)\n 'POST /forms/:formId/submit': { description: 'Submit a form (public endpoint)', category: 'Forms', authentication: false },\n 'GET /forms/:formId': { description: 'Get form definition for rendering', category: 'Forms', authentication: false },\n 'POST /api/forms/:formId/submit': { description: 'Submit a form via API', category: 'Forms', authentication: false },\n 'GET /api/forms/:formId': { description: 'Get form definition via API', category: 'Forms', authentication: false },\n\n // System endpoints\n 'GET /health': { description: 'Health check endpoint for monitoring', category: 'System', authentication: false },\n 'GET /api/health': { description: 'API health check with schema information', category: 'System', authentication: false },\n 'GET /api': { description: 'API root - returns API information and available endpoints', category: 'System', authentication: false },\n 'GET /api/system/info': { description: 'Get system information and version', category: 'System', authentication: false },\n 'GET /api/system/schema': { description: 'Get database schema information', category: 'System', authentication: false },\n\n // File serving\n 'GET /files/*': { description: 'Serve files from R2 storage (public access)', category: 'Files', authentication: false },\n\n // Database tools\n 'POST /admin/database-tools/api/query': { description: 'Execute a database query', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables': { description: 'List database tables', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables/:name': { description: 'Get table schema and sample data', category: 'Admin', authentication: true },\n\n // Seed data\n 'POST /admin/seed-data/api/generate': { description: 'Generate seed data for development', category: 'Admin', authentication: true },\n 'GET /admin/seed-data/api/status': { description: 'Get seed data generation status', category: 'Admin', authentication: true },\n\n // Email plugin\n 'POST /admin/plugins/email/api/send': { description: 'Send an email', category: 'Admin', authentication: true },\n 'GET /admin/plugins/email/api/templates': { description: 'List email templates', category: 'Admin', authentication: true },\n 'POST /admin/plugins/email/api/test': { description: 'Send a test email', category: 'Admin', authentication: true },\n}\n\n// ============================================================================\n// Whitelist Patterns for API routes\n// ============================================================================\n\nconst INCLUDED_ROUTE_PATTERNS: RegExp[] = [\n /^\\/api\\//, // All /api/* routes\n /^\\/api$/, // API root\n /^\\/auth\\/(?!login$|register$)/, // Auth routes except GET login/register HTML pages\n /^\\/auth\\/login$/, // POST /auth/login (method filtered later)\n /^\\/auth\\/register$/, // POST /auth/register (method filtered later)\n /^\\/admin\\/api\\//, // Admin API endpoints\n /^\\/admin\\/api-keys\\/api\\//, // API key management\n /^\\/admin\\/cache\\/api\\//, // Cache management API\n /^\\/admin\\/plugins\\/.*\\/api\\//, // Plugin API endpoints\n /^\\/admin\\/database-tools\\/api\\//, // Database tools API\n /^\\/admin\\/seed-data\\/api\\//, // Seed data API\n /^\\/workflow\\//, // Workflow endpoints\n /^\\/health$/, // Health check\n /^\\/files\\//, // File serving\n /^\\/forms\\//, // Public form endpoints\n]\n\n// Routes to always exclude (even if they match an include pattern)\nconst EXCLUDED_ROUTES = new Set([\n 'GET /auth/login',\n 'GET /auth/register',\n 'GET /auth/login/form',\n])\n\n// ============================================================================\n// Route Discovery\n// ============================================================================\n\nlet cachedRouteList: RouteMetadata[] | null = null\n\nfunction isIncludedRoute(method: string, path: string): boolean {\n // Check exclusions first\n const key = `${method} ${path}`\n if (EXCLUDED_ROUTES.has(key)) {\n return false\n }\n\n // Check if the path matches any include pattern\n return INCLUDED_ROUTE_PATTERNS.some(pattern => pattern.test(path))\n}\n\nfunction inferCategory(path: string): string {\n if (path.startsWith('/auth/')) return 'Auth'\n if (path.startsWith('/api/search')) return 'Search'\n if (path.startsWith('/api/media')) return 'Media'\n if (path.startsWith('/api/system')) return 'System'\n if (path.startsWith('/api/content') || path.startsWith('/api/collections')) return 'Content'\n if (path.startsWith('/api/forms')) return 'Forms'\n if (path.startsWith('/admin/api-keys')) return 'API Keys'\n if (path.startsWith('/admin/cache')) return 'Cache'\n if (path.startsWith('/admin/plugins/ai-search')) return 'Search'\n if (path.startsWith('/admin/api')) return 'Admin'\n if (path.startsWith('/admin/database-tools')) return 'Admin'\n if (path.startsWith('/admin/seed-data')) return 'Admin'\n if (path.startsWith('/admin/plugins/email')) return 'Admin'\n if (path.startsWith('/workflow/')) return 'Workflow'\n if (path.startsWith('/forms/')) return 'Forms'\n if (path.startsWith('/files/')) return 'Files'\n if (path === '/health' || path.startsWith('/api')) return 'System'\n return 'Other'\n}\n\nfunction inferAuth(path: string): boolean | 'unknown' {\n // Known public routes\n if (path === '/health' || path === '/api' || path === '/api/health') return false\n if (path === '/api/system/info' || path === '/api/system/schema') return false\n if (path.startsWith('/files/')) return false\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/')) return false\n\n // Admin routes require auth\n if (path.startsWith('/admin/')) return true\n if (path.startsWith('/workflow/')) return true\n\n return 'unknown'\n}\n\nexport function buildRouteList(app: any): RouteMetadata[] {\n if (cachedRouteList) return cachedRouteList\n\n if (!app) return []\n\n try {\n const routes = inspectRoutes(app as any)\n\n // Deduplicate and filter\n const seen = new Set()\n const result: RouteMetadata[] = []\n\n for (const route of routes) {\n // Skip middleware entries\n if (route.isMiddleware) continue\n // Skip ALL method (middleware-like catch-all)\n if (route.method === 'ALL') continue\n\n const key = `${route.method} ${route.path}`\n\n // Skip duplicates\n if (seen.has(key)) continue\n seen.add(key)\n\n // Apply whitelist filter\n if (!isIncludedRoute(route.method, route.path)) continue\n\n // Look up metadata\n const meta = ROUTE_METADATA[key]\n\n if (meta) {\n result.push({\n method: route.method,\n path: route.path,\n description: meta.description,\n authentication: meta.authentication,\n category: meta.category,\n documented: true\n })\n } else {\n // Auto-discovered: infer category and auth\n result.push({\n method: route.method,\n path: route.path,\n description: '',\n authentication: inferAuth(route.path),\n category: inferCategory(route.path),\n documented: false\n })\n }\n }\n\n // Sort: by category, then method order, then path\n const methodOrder: Record = { GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4 }\n result.sort((a, b) => {\n const catCmp = a.category.localeCompare(b.category)\n if (catCmp !== 0) return catCmp\n const methCmp = (methodOrder[a.method] ?? 5) - (methodOrder[b.method] ?? 5)\n if (methCmp !== 0) return methCmp\n return a.path.localeCompare(b.path)\n })\n\n cachedRouteList = result\n return result\n } catch (error) {\n console.error('Failed to inspect routes:', error)\n return []\n }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-ZUXOAZWZ.cjs.map b/packages/core/dist/chunk-ZUXOAZWZ.cjs.map deleted file mode 100644 index 7864e3b34..000000000 --- a/packages/core/dist/chunk-ZUXOAZWZ.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../../../../node_modules/semver/internal/constants.js","../../../../../node_modules/semver/internal/debug.js","../../../../../node_modules/semver/internal/re.js","../../../../../node_modules/semver/internal/parse-options.js","../../../../../node_modules/semver/internal/identifiers.js","../../../../../node_modules/semver/classes/semver.js","../../../../../node_modules/semver/functions/parse.js","../../../../../node_modules/semver/functions/valid.js","../../../../../node_modules/semver/functions/clean.js","../../../../../node_modules/semver/functions/inc.js","../../../../../node_modules/semver/functions/diff.js","../../../../../node_modules/semver/functions/major.js","../../../../../node_modules/semver/functions/minor.js","../../../../../node_modules/semver/functions/patch.js","../../../../../node_modules/semver/functions/prerelease.js","../../../../../node_modules/semver/functions/compare.js","../../../../../node_modules/semver/functions/rcompare.js","../../../../../node_modules/semver/functions/compare-loose.js","../../../../../node_modules/semver/functions/compare-build.js","../../../../../node_modules/semver/functions/sort.js","../../../../../node_modules/semver/functions/rsort.js","../../../../../node_modules/semver/functions/gt.js","../../../../../node_modules/semver/functions/lt.js","../../../../../node_modules/semver/functions/eq.js","../../../../../node_modules/semver/functions/neq.js","../../../../../node_modules/semver/functions/gte.js","../../../../../node_modules/semver/functions/lte.js","../../../../../node_modules/semver/functions/cmp.js","../../../../../node_modules/semver/functions/coerce.js","../../../../../node_modules/semver/internal/lrucache.js","../../../../../node_modules/semver/classes/range.js","../../../../../node_modules/semver/classes/comparator.js","../../../../../node_modules/semver/functions/satisfies.js","../../../../../node_modules/semver/ranges/to-comparators.js","../../../../../node_modules/semver/ranges/max-satisfying.js","../../../../../node_modules/semver/ranges/min-satisfying.js","../../../../../node_modules/semver/ranges/min-version.js","../../../../../node_modules/semver/ranges/valid.js","../../../../../node_modules/semver/ranges/outside.js","../../../../../node_modules/semver/ranges/gtr.js","../../../../../node_modules/semver/ranges/ltr.js","../../../../../node_modules/semver/ranges/intersects.js","../../../../../node_modules/semver/ranges/simplify.js","../../../../../node_modules/semver/ranges/subset.js","../../../../../node_modules/semver/index.js","../src/plugins/hook-system.ts","../src/plugins/plugin-validator.ts","../src/plugins/plugin-registry.ts","../src/plugins/plugin-manager.ts","../src/plugins/core-plugins/turnstile-plugin/middleware/verify.ts","../src/plugins/core-plugins/turnstile-plugin/index.ts"],"names":["__commonJS","exports","z","require_valid","require_semver","__toESM","semver","HOOKS","Hono","TurnstileService","PluginBuilder","manifest_default"],"mappings":";;;;;;;;;AAAA,IAAA,iBAAA,GAAAA,4BAAA,CAAA;AAAA,EAAA,uDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAIA,IAAA,IAAM,mBAAA,GAAsB,OAAA;AAE5B,IAAA,IAAM,UAAA,GAAa,GAAA;AACnB,IAAA,IAAM,mBAAmB,MAAA,CAAO,gBAAA;AAAA,IACL,gBAAA;AAG3B,IAAA,IAAM,yBAAA,GAA4B,EAAA;AAIlC,IAAA,IAAM,wBAAwB,UAAA,GAAa,CAAA;AAE3C,IAAA,IAAM,aAAA,GAAgB;AAAA,MACpB,OAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAA,CAAO,OAAA,GAAU;AAAA,MACf,UAAA;AAAA,MACA,yBAAA;AAAA,MACA,qBAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA,mBAAA;AAAA,MACA,uBAAA,EAAyB,CAAA;AAAA,MACzB,UAAA,EAAY;AAAA,KACd;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpCA,IAAA,aAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,mDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,KAAA,GACJ,OAAO,OAAA,KAAY,QAAA,IACnB,QAAQ,GAAA,IACR,OAAA,CAAQ,GAAA,CAAI,UAAA,IACZ,aAAA,CAAc,IAAA,CAAK,QAAQ,GAAA,CAAI,UAAU,CAAA,GACvC,CAAA,GAAI,IAAA,KAAS,OAAA,CAAQ,MAAM,QAAA,EAAU,GAAG,IAAI,CAAA,GAC5C,MAAM;AAAA,IAAC,CAAA;AAEX,IAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACVjB,IAAA,UAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,gDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM;AAAA,MACJ,yBAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACF,GAAI,iBAAA,EAAA;AACJ,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAAA,SAAA,GAAU,MAAA,CAAO,UAAU,EAAC;AAG5B,IAAA,IAAM,EAAA,GAAKA,SAAA,CAAQ,EAAA,GAAK,EAAC;AACzB,IAAA,IAAM,MAAA,GAASA,SAAA,CAAQ,MAAA,GAAS,EAAC;AACjC,IAAA,IAAM,GAAA,GAAMA,SAAA,CAAQ,GAAA,GAAM,EAAC;AAC3B,IAAA,IAAM,OAAA,GAAUA,SAAA,CAAQ,OAAA,GAAU,EAAC;AACnC,IAAA,IAAM,CAAA,GAAIA,SAAA,CAAQ,CAAA,GAAI,EAAC;AACvB,IAAA,IAAI,CAAA,GAAI,CAAA;AAER,IAAA,IAAM,gBAAA,GAAmB,cAAA;AAQzB,IAAA,IAAM,qBAAA,GAAwB;AAAA,MAC5B,CAAC,OAAO,CAAC,CAAA;AAAA,MACT,CAAC,OAAO,UAAU,CAAA;AAAA,MAClB,CAAC,kBAAkB,qBAAqB;AAAA,KAC1C;AAEA,IAAA,IAAM,aAAA,GAAgB,CAAC,KAAA,KAAU;AAC/B,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,CAAA,IAAK,qBAAA,EAAuB;AAChD,QAAA,KAAA,GAAQ,KAAA,CACL,MAAM,CAAA,EAAG,KAAK,GAAG,CAAA,CAAE,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,GAAG,GAAG,CAAA,CAC5C,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,MACjD;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAM,WAAA,GAAc,CAAC,IAAA,EAAM,KAAA,EAAO,QAAA,KAAa;AAC7C,MAAA,MAAM,IAAA,GAAO,cAAc,KAAK,CAAA;AAChC,MAAA,MAAM,KAAA,GAAQ,CAAA,EAAA;AACd,MAAA,KAAA,CAAM,IAAA,EAAM,OAAO,KAAK,CAAA;AACxB,MAAA,CAAA,CAAE,IAAI,CAAA,GAAI,KAAA;AACV,MAAA,GAAA,CAAI,KAAK,CAAA,GAAI,KAAA;AACb,MAAA,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AACjB,MAAA,EAAA,CAAG,KAAK,CAAA,GAAI,IAAI,OAAO,KAAA,EAAO,QAAA,GAAW,MAAM,MAAS,CAAA;AACxD,MAAA,MAAA,CAAO,KAAK,CAAA,GAAI,IAAI,OAAO,IAAA,EAAM,QAAA,GAAW,MAAM,MAAS,CAAA;AAAA,IAC7D,CAAA;AAQA,IAAA,WAAA,CAAY,qBAAqB,aAAa,CAAA;AAC9C,IAAA,WAAA,CAAY,0BAA0B,MAAM,CAAA;AAM5C,IAAA,WAAA,CAAY,sBAAA,EAAwB,CAAA,aAAA,EAAgB,gBAAgB,CAAA,CAAA,CAAG,CAAA;AAKvE,IAAA,WAAA,CAAY,eAAe,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,iBAAiB,CAAC,CAAA,KAAA,EAChC,GAAA,CAAI,CAAA,CAAE,iBAAiB,CAAC,CAAA,KAAA,EACxB,GAAA,CAAI,CAAA,CAAE,iBAAiB,CAAC,CAAA,CAAA,CAAG,CAAA;AAElD,IAAA,WAAA,CAAY,oBAAoB,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,sBAAsB,CAAC,CAAA,KAAA,EACrC,GAAA,CAAI,CAAA,CAAE,sBAAsB,CAAC,CAAA,KAAA,EAC7B,GAAA,CAAI,CAAA,CAAE,sBAAsB,CAAC,CAAA,CAAA,CAAG,CAAA;AAO5D,IAAA,WAAA,CAAY,sBAAA,EAAwB,CAAA,GAAA,EAAM,GAAA,CAAI,CAAA,CAAE,oBAAoB,CACpE,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,iBAAiB,CAAC,CAAA,CAAA,CAAG,CAAA;AAE/B,IAAA,WAAA,CAAY,2BAAA,EAA6B,CAAA,GAAA,EAAM,GAAA,CAAI,CAAA,CAAE,oBAAoB,CACzE,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,sBAAsB,CAAC,CAAA,CAAA,CAAG,CAAA;AAMpC,IAAA,WAAA,CAAY,YAAA,EAAc,CAAA,KAAA,EAAQ,GAAA,CAAI,CAAA,CAAE,oBAAoB,CAC5D,CAAA,MAAA,EAAS,GAAA,CAAI,CAAA,CAAE,oBAAoB,CAAC,CAAA,IAAA,CAAM,CAAA;AAE1C,IAAA,WAAA,CAAY,iBAAA,EAAmB,CAAA,MAAA,EAAS,GAAA,CAAI,CAAA,CAAE,yBAAyB,CACvE,CAAA,MAAA,EAAS,GAAA,CAAI,CAAA,CAAE,yBAAyB,CAAC,CAAA,IAAA,CAAM,CAAA;AAK/C,IAAA,WAAA,CAAY,iBAAA,EAAmB,CAAA,EAAG,gBAAgB,CAAA,CAAA,CAAG,CAAA;AAMrD,IAAA,WAAA,CAAY,OAAA,EAAS,CAAA,OAAA,EAAU,GAAA,CAAI,CAAA,CAAE,eAAe,CACpD,CAAA,MAAA,EAAS,GAAA,CAAI,CAAA,CAAE,eAAe,CAAC,CAAA,IAAA,CAAM,CAAA;AAWrC,IAAA,WAAA,CAAY,aAAa,CAAA,EAAA,EAAK,GAAA,CAAI,CAAA,CAAE,WAAW,CAC/C,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,UAAU,CAAC,CAAA,CAAA,EAClB,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAEjB,IAAA,WAAA,CAAY,QAAQ,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA,CAAA,CAAG,CAAA;AAK3C,IAAA,WAAA,CAAY,cAAc,CAAA,QAAA,EAAW,GAAA,CAAI,CAAA,CAAE,gBAAgB,CAC3D,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,eAAe,CAAC,CAAA,CAAA,EACvB,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAEjB,IAAA,WAAA,CAAY,SAAS,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AAE7C,IAAA,WAAA,CAAY,QAAQ,cAAc,CAAA;AAKlC,IAAA,WAAA,CAAY,yBAAyB,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,sBAAsB,CAAC,CAAA,QAAA,CAAU,CAAA;AAC/E,IAAA,WAAA,CAAY,oBAAoB,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,iBAAiB,CAAC,CAAA,QAAA,CAAU,CAAA;AAErE,IAAA,WAAA,CAAY,aAAA,EAAe,CAAA,SAAA,EAAY,GAAA,CAAI,CAAA,CAAE,gBAAgB,CAAC,CAAA,QAAA,EACjC,GAAA,CAAI,CAAA,CAAE,gBAAgB,CAAC,CAAA,QAAA,EACvB,GAAA,CAAI,EAAE,gBAAgB,CAAC,CAAA,IAAA,EAC3B,GAAA,CAAI,CAAA,CAAE,UAAU,CAAC,CAAA,EAAA,EACrB,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA,KAAA,CACR,CAAA;AAEzB,IAAA,WAAA,CAAY,kBAAA,EAAoB,CAAA,SAAA,EAAY,GAAA,CAAI,CAAA,CAAE,qBAAqB,CAAC,CAAA,QAAA,EACtC,GAAA,CAAI,CAAA,CAAE,qBAAqB,CAAC,CAAA,QAAA,EAC5B,GAAA,CAAI,EAAE,qBAAqB,CAAC,CAAA,IAAA,EAChC,GAAA,CAAI,CAAA,CAAE,eAAe,CAAC,CAAA,EAAA,EAC1B,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA,KAAA,CACR,CAAA;AAE9B,IAAA,WAAA,CAAY,QAAA,EAAU,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,IAAA,EAAO,GAAA,CAAI,CAAA,CAAE,WAAW,CAAC,CAAA,CAAA,CAAG,CAAA;AACjE,IAAA,WAAA,CAAY,aAAA,EAAe,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,IAAA,EAAO,GAAA,CAAI,CAAA,CAAE,gBAAgB,CAAC,CAAA,CAAA,CAAG,CAAA;AAI3E,IAAA,WAAA,CAAY,aAAA,EAAe,GAAG,mBACP,CAAA,EAAG,yBAAyB,CAAA,eAAA,EACrB,yBAAyB,CAAA,iBAAA,EACzB,yBAAyB,CAAA,IAAA,CAAM,CAAA;AAC7D,IAAA,WAAA,CAAY,UAAU,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,WAAW,CAAC,CAAA,YAAA,CAAc,CAAA;AACzD,IAAA,WAAA,CAAY,YAAA,EAAc,GAAA,CAAI,CAAA,CAAE,WAAW,IAC7B,CAAA,GAAA,EAAM,GAAA,CAAI,CAAA,CAAE,UAAU,CAAC,CAAA,KAAA,EACjB,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA,cAAA,CACJ,CAAA;AAC5B,IAAA,WAAA,CAAY,WAAA,EAAa,GAAA,CAAI,CAAA,CAAE,MAAM,GAAG,IAAI,CAAA;AAC5C,IAAA,WAAA,CAAY,eAAA,EAAiB,GAAA,CAAI,CAAA,CAAE,UAAU,GAAG,IAAI,CAAA;AAIpD,IAAA,WAAA,CAAY,aAAa,SAAS,CAAA;AAElC,IAAA,WAAA,CAAY,aAAa,CAAA,MAAA,EAAS,GAAA,CAAI,EAAE,SAAS,CAAC,QAAQ,IAAI,CAAA;AAC9D,IAAAA,SAAA,CAAQ,gBAAA,GAAmB,KAAA;AAE3B,IAAA,WAAA,CAAY,OAAA,EAAS,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,WAAW,CAAC,CAAA,CAAA,CAAG,CAAA;AACjE,IAAA,WAAA,CAAY,YAAA,EAAc,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,gBAAgB,CAAC,CAAA,CAAA,CAAG,CAAA;AAI3E,IAAA,WAAA,CAAY,aAAa,SAAS,CAAA;AAElC,IAAA,WAAA,CAAY,aAAa,CAAA,MAAA,EAAS,GAAA,CAAI,EAAE,SAAS,CAAC,QAAQ,IAAI,CAAA;AAC9D,IAAAA,SAAA,CAAQ,gBAAA,GAAmB,KAAA;AAE3B,IAAA,WAAA,CAAY,OAAA,EAAS,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,WAAW,CAAC,CAAA,CAAA,CAAG,CAAA;AACjE,IAAA,WAAA,CAAY,YAAA,EAAc,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,gBAAgB,CAAC,CAAA,CAAA,CAAG,CAAA;AAG3E,IAAA,WAAA,CAAY,iBAAA,EAAmB,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,KAAA,EAAQ,GAAA,CAAI,CAAA,CAAE,UAAU,CAAC,CAAA,KAAA,CAAO,CAAA;AAC9E,IAAA,WAAA,CAAY,YAAA,EAAc,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,KAAA,EAAQ,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA,KAAA,CAAO,CAAA;AAIxE,IAAA,WAAA,CAAY,kBAAkB,CAAA,MAAA,EAAS,GAAA,CAAI,CAAA,CAAE,IAAI,CACjD,CAAA,KAAA,EAAQ,GAAA,CAAI,CAAA,CAAE,UAAU,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,EAAE,WAAW,CAAC,KAAK,IAAI,CAAA;AACxD,IAAAA,SAAA,CAAQ,qBAAA,GAAwB,QAAA;AAMhC,IAAA,WAAA,CAAY,aAAA,EAAe,CAAA,MAAA,EAAS,GAAA,CAAI,CAAA,CAAE,WAAW,CAAC,CAAA,WAAA,EAE/B,GAAA,CAAI,CAAA,CAAE,WAAW,CAAC,CAAA,MAAA,CACf,CAAA;AAE1B,IAAA,WAAA,CAAY,kBAAA,EAAoB,CAAA,MAAA,EAAS,GAAA,CAAI,CAAA,CAAE,gBAAgB,CAAC,CAAA,WAAA,EAEpC,GAAA,CAAI,CAAA,CAAE,gBAAgB,CAAC,CAAA,MAAA,CACpB,CAAA;AAG/B,IAAA,WAAA,CAAY,QAAQ,iBAAiB,CAAA;AAErC,IAAA,WAAA,CAAY,QAAQ,2BAA2B,CAAA;AAC/C,IAAA,WAAA,CAAY,WAAW,6BAA6B,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9NpD,IAAA,qBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,2DAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAGA,IAAA,IAAM,cAAc,MAAA,CAAO,MAAA,CAAO,EAAE,KAAA,EAAO,MAAM,CAAA;AACjD,IAAA,IAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,EAAG,CAAA;AACnC,IAAA,IAAM,eAAe,CAAA,OAAA,KAAW;AAC9B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,SAAA;AAAA,MACT;AAEA,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,QAAA,OAAO,WAAA;AAAA,MACT;AAEA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,YAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChBjB,IAAA,mBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,yDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,OAAA,GAAU,UAAA;AAChB,IAAA,IAAM,kBAAA,GAAqB,CAAC,CAAA,EAAG,CAAA,KAAM;AACnC,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,MAAM,QAAA,EAAU;AAClD,QAAA,OAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AAAA,MACpC;AAEA,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAE3B,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,CAAA,GAAI,CAAC,CAAA;AACL,QAAA,CAAA,GAAI,CAAC,CAAA;AAAA,MACP;AAEA,MAAA,OAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GACZ,IAAA,IAAQ,CAAC,IAAA,GAAQ,EAAA,GACjB,IAAA,IAAQ,CAAC,IAAA,GAAQ,CAAA,GAClB,CAAA,GAAI,IAAI,EAAA,GACR,CAAA;AAAA,IACN,CAAA;AAEA,IAAA,IAAM,sBAAsB,CAAC,CAAA,EAAG,CAAA,KAAM,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAE7D,IAAA,MAAA,CAAO,OAAA,GAAU;AAAA,MACf,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5BA,IAAA,cAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,mDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,EAAE,UAAA,EAAY,gBAAA,EAAiB,GAAI,iBAAA,EAAA;AACzC,IAAA,IAAM,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,EAAE,GAAI,UAAA,EAAA;AAE1B,IAAA,IAAM,YAAA,GAAe,qBAAA,EAAA;AACrB,IAAA,IAAM,EAAE,oBAAmB,GAAI,mBAAA,EAAA;AAC/B,IAAA,IAAM,MAAA,GAAN,MAAM,OAAA,CAAO;AAAA,MACX,WAAA,CAAa,SAAS,OAAA,EAAS;AAC7B,QAAA,OAAA,GAAU,aAAa,OAAO,CAAA;AAE9B,QAAA,IAAI,mBAAmB,OAAA,EAAQ;AAC7B,UAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,CAAC,CAAC,OAAA,CAAQ,KAAA,IAC9B,OAAA,CAAQ,iBAAA,KAAsB,CAAC,CAAC,OAAA,CAAQ,iBAAA,EAAmB;AAC3D,YAAA,OAAO,OAAA;AAAA,UACT,CAAA,MAAO;AACL,YAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,UACpB;AAAA,QACF,CAAA,MAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AACtC,UAAA,MAAM,IAAI,SAAA,CAAU,CAAA,6CAAA,EAAgD,OAAO,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,QACxF;AAEA,QAAA,IAAI,OAAA,CAAQ,SAAS,UAAA,EAAY;AAC/B,UAAA,MAAM,IAAI,SAAA;AAAA,YACR,0BAA0B,UAAU,CAAA,WAAA;AAAA,WACtC;AAAA,QACF;AAEA,QAAA,KAAA,CAAM,QAAA,EAAU,SAAS,OAAO,CAAA;AAChC,QAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,QAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAC,OAAA,CAAQ,KAAA;AAGvB,QAAA,IAAA,CAAK,iBAAA,GAAoB,CAAC,CAAC,OAAA,CAAQ,iBAAA;AAEnC,QAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAM,OAAA,CAAQ,KAAA,GAAQ,EAAA,CAAG,CAAA,CAAE,KAAK,CAAA,GAAI,EAAA,CAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AAEvE,QAAA,IAAI,CAAC,CAAA,EAAG;AACN,UAAA,MAAM,IAAI,SAAA,CAAU,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAAA,QACnD;AAEA,QAAA,IAAA,CAAK,GAAA,GAAM,OAAA;AAGX,QAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAC,CAAA;AACjB,QAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAC,CAAA;AACjB,QAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAC,CAAA;AAEjB,QAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,gBAAA,IAAoB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACnD,UAAA,MAAM,IAAI,UAAU,uBAAuB,CAAA;AAAA,QAC7C;AAEA,QAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,gBAAA,IAAoB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACnD,UAAA,MAAM,IAAI,UAAU,uBAAuB,CAAA;AAAA,QAC7C;AAEA,QAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,gBAAA,IAAoB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACnD,UAAA,MAAM,IAAI,UAAU,uBAAuB,CAAA;AAAA,QAC7C;AAGA,QAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG;AACT,UAAA,IAAA,CAAK,aAAa,EAAC;AAAA,QACrB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,UAAA,GAAa,EAAE,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO;AAC5C,YAAA,IAAI,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,EAAG;AACvB,cAAA,MAAM,MAAM,CAAC,EAAA;AACb,cAAA,IAAI,GAAA,IAAO,CAAA,IAAK,GAAA,GAAM,gBAAA,EAAkB;AACtC,gBAAA,OAAO,GAAA;AAAA,cACT;AAAA,YACF;AACA,YAAA,OAAO,EAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,GAAI,EAAC;AACvC,QAAA,IAAA,CAAK,MAAA,EAAO;AAAA,MACd;AAAA,MAEA,MAAA,GAAU;AACR,QAAA,IAAA,CAAK,OAAA,GAAU,GAAG,IAAA,CAAK,KAAK,IAAI,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA;AACxD,QAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,UAAA,IAAA,CAAK,WAAW,CAAA,CAAA,EAAI,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,QAC/C;AACA,QAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACd;AAAA,MAEA,QAAA,GAAY;AACV,QAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACd;AAAA,MAEA,QAAS,KAAA,EAAO;AACd,QAAA,KAAA,CAAM,gBAAA,EAAkB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAS,KAAK,CAAA;AACzD,QAAA,IAAI,EAAE,iBAAiB,OAAA,CAAA,EAAS;AAC9B,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,KAAK,OAAA,EAAS;AACvD,YAAA,OAAO,CAAA;AAAA,UACT;AACA,UAAA,KAAA,GAAQ,IAAI,OAAA,CAAO,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,QACxC;AAEA,QAAA,IAAI,KAAA,CAAM,OAAA,KAAY,IAAA,CAAK,OAAA,EAAS;AAClC,UAAA,OAAO,CAAA;AAAA,QACT;AAEA,QAAA,OAAO,KAAK,WAAA,CAAY,KAAK,CAAA,IAAK,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,MACzD;AAAA,MAEA,YAAa,KAAA,EAAO;AAClB,QAAA,IAAI,EAAE,iBAAiB,OAAA,CAAA,EAAS;AAC9B,UAAA,KAAA,GAAQ,IAAI,OAAA,CAAO,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,QACxC;AAEA,QAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO;AAC5B,UAAA,OAAO,EAAA;AAAA,QACT;AACA,QAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO;AAC5B,UAAA,OAAO,CAAA;AAAA,QACT;AACA,QAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO;AAC5B,UAAA,OAAO,EAAA;AAAA,QACT;AACA,QAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO;AAC5B,UAAA,OAAO,CAAA;AAAA,QACT;AACA,QAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO;AAC5B,UAAA,OAAO,EAAA;AAAA,QACT;AACA,QAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO;AAC5B,UAAA,OAAO,CAAA;AAAA,QACT;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,MAEA,WAAY,KAAA,EAAO;AACjB,QAAA,IAAI,EAAE,iBAAiB,OAAA,CAAA,EAAS;AAC9B,UAAA,KAAA,GAAQ,IAAI,OAAA,CAAO,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,QACxC;AAGA,QAAA,IAAI,KAAK,UAAA,CAAW,MAAA,IAAU,CAAC,KAAA,CAAM,WAAW,MAAA,EAAQ;AACtD,UAAA,OAAO,EAAA;AAAA,QACT,WAAW,CAAC,IAAA,CAAK,WAAW,MAAA,IAAU,KAAA,CAAM,WAAW,MAAA,EAAQ;AAC7D,UAAA,OAAO,CAAA;AAAA,QACT,CAAA,MAAA,IAAW,CAAC,IAAA,CAAK,UAAA,CAAW,UAAU,CAAC,KAAA,CAAM,WAAW,MAAA,EAAQ;AAC9D,UAAA,OAAO,CAAA;AAAA,QACT;AAEA,QAAA,IAAI,CAAA,GAAI,CAAA;AACR,QAAA,GAAG;AACD,UAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAC3B,UAAA,MAAM,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAC5B,UAAA,KAAA,CAAM,oBAAA,EAAsB,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACnC,UAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,MAAA,EAAW;AACtC,YAAA,OAAO,CAAA;AAAA,UACT,CAAA,MAAA,IAAW,MAAM,MAAA,EAAW;AAC1B,YAAA,OAAO,CAAA;AAAA,UACT,CAAA,MAAA,IAAW,MAAM,MAAA,EAAW;AAC1B,YAAA,OAAO,EAAA;AAAA,UACT,CAAA,MAAA,IAAW,MAAM,CAAA,EAAG;AAClB,YAAA;AAAA,UACF,CAAA,MAAO;AACL,YAAA,OAAO,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAAA,UAChC;AAAA,QACF,SAAS,EAAE,CAAA;AAAA,MACb;AAAA,MAEA,aAAc,KAAA,EAAO;AACnB,QAAA,IAAI,EAAE,iBAAiB,OAAA,CAAA,EAAS;AAC9B,UAAA,KAAA,GAAQ,IAAI,OAAA,CAAO,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,QACxC;AAEA,QAAA,IAAI,CAAA,GAAI,CAAA;AACR,QAAA,GAAG;AACD,UAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACtB,UAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AACvB,UAAA,KAAA,CAAM,eAAA,EAAiB,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC9B,UAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,MAAA,EAAW;AACtC,YAAA,OAAO,CAAA;AAAA,UACT,CAAA,MAAA,IAAW,MAAM,MAAA,EAAW;AAC1B,YAAA,OAAO,CAAA;AAAA,UACT,CAAA,MAAA,IAAW,MAAM,MAAA,EAAW;AAC1B,YAAA,OAAO,EAAA;AAAA,UACT,CAAA,MAAA,IAAW,MAAM,CAAA,EAAG;AAClB,YAAA;AAAA,UACF,CAAA,MAAO;AACL,YAAA,OAAO,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAAA,UAChC;AAAA,QACF,SAAS,EAAE,CAAA;AAAA,MACb;AAAA;AAAA;AAAA,MAIA,GAAA,CAAK,OAAA,EAAS,UAAA,EAAY,cAAA,EAAgB;AACxC,QAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAC7B,UAAA,IAAI,CAAC,UAAA,IAAc,cAAA,KAAmB,KAAA,EAAO;AAC3C,YAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,UACnE;AAEA,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,MAAM,KAAA,GAAQ,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAG,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,EAAA,CAAG,EAAE,eAAe,CAAA,GAAI,EAAA,CAAG,CAAA,CAAE,UAAU,CAAC,CAAA;AAClG,YAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,CAAC,MAAM,UAAA,EAAY;AACrC,cAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAE,CAAA;AAAA,YACrD;AAAA,UACF;AAAA,QACF;AAEA,QAAA,QAAQ,OAAA;AAAS,UACf,KAAK,UAAA;AACH,YAAA,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA;AACzB,YAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,YAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,YAAA,IAAA,CAAK,KAAA,EAAA;AACL,YAAA,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,UAAA,EAAY,cAAc,CAAA;AAC1C,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA;AACzB,YAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,YAAA,IAAA,CAAK,KAAA,EAAA;AACL,YAAA,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,UAAA,EAAY,cAAc,CAAA;AAC1C,YAAA;AAAA,UACF,KAAK,UAAA;AAIH,YAAA,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA;AACzB,YAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,UAAA,EAAY,cAAc,CAAA;AAC5C,YAAA,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,UAAA,EAAY,cAAc,CAAA;AAC1C,YAAA;AAAA;AAAA;AAAA,UAGF,KAAK,YAAA;AACH,YAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,cAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,UAAA,EAAY,cAAc,CAAA;AAAA,YAC9C;AACA,YAAA,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,UAAA,EAAY,cAAc,CAAA;AAC1C,YAAA;AAAA,UACF,KAAK,SAAA;AACH,YAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,cAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,IAAA,CAAK,GAAG,CAAA,oBAAA,CAAsB,CAAA;AAAA,YAC3D;AACA,YAAA,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA;AACzB,YAAA;AAAA,UAEF,KAAK,OAAA;AAKH,YAAA,IACE,IAAA,CAAK,UAAU,CAAA,IACf,IAAA,CAAK,UAAU,CAAA,IACf,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAC3B;AACA,cAAA,IAAA,CAAK,KAAA,EAAA;AAAA,YACP;AACA,YAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,YAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,YAAA,IAAA,CAAK,aAAa,EAAC;AACnB,YAAA;AAAA,UACF,KAAK,OAAA;AAKH,YAAA,IAAI,KAAK,KAAA,KAAU,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AACpD,cAAA,IAAA,CAAK,KAAA,EAAA;AAAA,YACP;AACA,YAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,YAAA,IAAA,CAAK,aAAa,EAAC;AACnB,YAAA;AAAA,UACF,KAAK,OAAA;AAKH,YAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,cAAA,IAAA,CAAK,KAAA,EAAA;AAAA,YACP;AACA,YAAA,IAAA,CAAK,aAAa,EAAC;AACnB,YAAA;AAAA;AAAA;AAAA,UAGF,KAAK,KAAA,EAAO;AACV,YAAA,MAAM,IAAA,GAAO,MAAA,CAAO,cAAc,CAAA,GAAI,CAAA,GAAI,CAAA;AAE1C,YAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,cAAA,IAAA,CAAK,UAAA,GAAa,CAAC,IAAI,CAAA;AAAA,YACzB,CAAA,MAAO;AACL,cAAA,IAAI,CAAA,GAAI,KAAK,UAAA,CAAW,MAAA;AACxB,cAAA,OAAO,EAAE,KAAK,CAAA,EAAG;AACf,gBAAA,IAAI,OAAO,IAAA,CAAK,UAAA,CAAW,CAAC,MAAM,QAAA,EAAU;AAC1C,kBAAA,IAAA,CAAK,WAAW,CAAC,CAAA,EAAA;AACjB,kBAAA,CAAA,GAAI,EAAA;AAAA,gBACN;AAAA,cACF;AACA,cAAA,IAAI,MAAM,EAAA,EAAI;AAEZ,gBAAA,IAAI,eAAe,IAAA,CAAK,UAAA,CAAW,KAAK,GAAG,CAAA,IAAK,mBAAmB,KAAA,EAAO;AACxE,kBAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,gBACzE;AACA,gBAAA,IAAA,CAAK,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,cAC3B;AAAA,YACF;AACA,YAAA,IAAI,UAAA,EAAY;AAGd,cAAA,IAAI,UAAA,GAAa,CAAC,UAAA,EAAY,IAAI,CAAA;AAClC,cAAA,IAAI,mBAAmB,KAAA,EAAO;AAC5B,gBAAA,UAAA,GAAa,CAAC,UAAU,CAAA;AAAA,cAC1B;AACA,cAAA,IAAI,mBAAmB,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,EAAG,UAAU,MAAM,CAAA,EAAG;AAC5D,gBAAA,IAAI,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA,EAAG;AAC7B,kBAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,gBACpB;AAAA,cACF,CAAA,MAAO;AACL,gBAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,cACpB;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAAA,UACA;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,OAAO,CAAA,CAAE,CAAA;AAAA;AAE5D,QAAA,IAAA,CAAK,GAAA,GAAM,KAAK,MAAA,EAAO;AACvB,QAAA,IAAI,IAAA,CAAK,MAAM,MAAA,EAAQ;AACrB,UAAA,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,QACtC;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AAEA,IAAA,MAAA,CAAO,OAAA,GAAU,MAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5UjB,IAAA,aAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,oDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,KAAA,GAAQ,CAAC,OAAA,EAAS,OAAA,EAAS,cAAc,KAAA,KAAU;AACvD,MAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,QAAA,OAAO,OAAA;AAAA,MACT;AACA,MAAA,IAAI;AACF,QAAA,OAAO,IAAI,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA;AAAA,MACpC,SAAS,EAAA,EAAI;AACX,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,EAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjBjB,IAAA,aAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,oDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,KAAA,GAAQ,CAAC,OAAA,EAAS,OAAA,KAAY;AAClC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,EAAS,OAAO,CAAA;AAChC,MAAA,OAAO,CAAA,GAAI,EAAE,OAAA,GAAU,IAAA;AAAA,IACzB,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACPjB,IAAA,aAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,oDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,KAAA,GAAQ,CAAC,OAAA,EAAS,OAAA,KAAY;AAClC,MAAA,MAAM,CAAA,GAAI,MAAM,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,EAAG,OAAO,CAAA;AAC7D,MAAA,OAAO,CAAA,GAAI,EAAE,OAAA,GAAU,IAAA;AAAA,IACzB,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACPjB,IAAA,WAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,kDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AAEf,IAAA,IAAM,MAAM,CAAC,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,YAAY,cAAA,KAAmB;AACrE,MAAA,IAAI,OAAQ,YAAa,QAAA,EAAU;AACjC,QAAA,cAAA,GAAiB,UAAA;AACjB,QAAA,UAAA,GAAa,OAAA;AACb,QAAA,OAAA,GAAU,MAAA;AAAA,MACZ;AAEA,MAAA,IAAI;AACF,QAAA,OAAO,IAAI,MAAA;AAAA,UACT,OAAA,YAAmB,MAAA,GAAS,OAAA,CAAQ,OAAA,GAAU,OAAA;AAAA,UAC9C;AAAA,SACF,CAAE,GAAA,CAAI,OAAA,EAAS,UAAA,EAAY,cAAc,CAAA,CAAE,OAAA;AAAA,MAC7C,SAAS,EAAA,EAAI;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpBjB,IAAA,YAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,mDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AAEd,IAAA,IAAM,IAAA,GAAO,CAAC,QAAA,EAAU,QAAA,KAAa;AACnC,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,IAAI,CAAA;AACrC,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,IAAI,CAAA;AACrC,MAAA,MAAM,UAAA,GAAa,EAAA,CAAG,OAAA,CAAQ,EAAE,CAAA;AAEhC,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAW,UAAA,GAAa,CAAA;AAC9B,MAAA,MAAM,WAAA,GAAc,WAAW,EAAA,GAAK,EAAA;AACpC,MAAA,MAAM,UAAA,GAAa,WAAW,EAAA,GAAK,EAAA;AACnC,MAAA,MAAM,UAAA,GAAa,CAAC,CAAC,WAAA,CAAY,UAAA,CAAW,MAAA;AAC5C,MAAA,MAAM,SAAA,GAAY,CAAC,CAAC,UAAA,CAAW,UAAA,CAAW,MAAA;AAE1C,MAAA,IAAI,SAAA,IAAa,CAAC,UAAA,EAAY;AAQ5B,QAAA,IAAI,CAAC,UAAA,CAAW,KAAA,IAAS,CAAC,WAAW,KAAA,EAAO;AAC1C,UAAA,OAAO,OAAA;AAAA,QACT;AAGA,QAAA,IAAI,UAAA,CAAW,WAAA,CAAY,WAAW,CAAA,KAAM,CAAA,EAAG;AAC7C,UAAA,IAAI,UAAA,CAAW,KAAA,IAAS,CAAC,UAAA,CAAW,KAAA,EAAO;AACzC,YAAA,OAAO,OAAA;AAAA,UACT;AACA,UAAA,OAAO,OAAA;AAAA,QACT;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAAS,aAAa,KAAA,GAAQ,EAAA;AAEpC,MAAA,IAAI,EAAA,CAAG,KAAA,KAAU,EAAA,CAAG,KAAA,EAAO;AACzB,QAAA,OAAO,MAAA,GAAS,OAAA;AAAA,MAClB;AAEA,MAAA,IAAI,EAAA,CAAG,KAAA,KAAU,EAAA,CAAG,KAAA,EAAO;AACzB,QAAA,OAAO,MAAA,GAAS,OAAA;AAAA,MAClB;AAEA,MAAA,IAAI,EAAA,CAAG,KAAA,KAAU,EAAA,CAAG,KAAA,EAAO;AACzB,QAAA,OAAO,MAAA,GAAS,OAAA;AAAA,MAClB;AAGA,MAAA,OAAO,YAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3DjB,IAAA,aAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,oDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,KAAA,KAAU,IAAI,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA,CAAE,KAAA;AACjD,IAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,aAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,oDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,KAAA,KAAU,IAAI,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA,CAAE,KAAA;AACjD,IAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,aAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,oDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,KAAA,KAAU,IAAI,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA,CAAE,KAAA;AACjD,IAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,kBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,yDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,UAAA,GAAa,CAAC,OAAA,EAAS,OAAA,KAAY;AACvC,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,EAAS,OAAO,CAAA;AACrC,MAAA,OAAQ,MAAA,IAAU,MAAA,CAAO,UAAA,CAAW,MAAA,GAAU,OAAO,UAAA,GAAa,IAAA;AAAA,IACpE,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,UAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACPjB,IAAA,eAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,sDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,OAAA,GAAU,CAAC,CAAA,EAAG,CAAA,EAAG,UACrB,IAAI,MAAA,CAAO,CAAA,EAAG,KAAK,EAAE,OAAA,CAAQ,IAAI,MAAA,CAAO,CAAA,EAAG,KAAK,CAAC,CAAA;AAEnD,IAAA,MAAA,CAAO,OAAA,GAAU,OAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACNjB,IAAA,gBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,uDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,IAAM,QAAA,GAAW,CAAC,CAAA,EAAG,CAAA,EAAG,UAAU,OAAA,CAAQ,CAAA,EAAG,GAAG,KAAK,CAAA;AACrD,IAAA,MAAA,CAAO,OAAA,GAAU,QAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,qBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,4DAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,IAAM,eAAe,CAAC,CAAA,EAAG,MAAM,OAAA,CAAQ,CAAA,EAAG,GAAG,IAAI,CAAA;AACjD,IAAA,MAAA,CAAO,OAAA,GAAU,YAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,qBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,4DAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,YAAA,GAAe,CAAC,CAAA,EAAG,CAAA,EAAG,KAAA,KAAU;AACpC,MAAA,MAAM,QAAA,GAAW,IAAI,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA;AACpC,MAAA,MAAM,QAAA,GAAW,IAAI,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA;AACpC,MAAA,OAAO,SAAS,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,aAAa,QAAQ,CAAA;AAAA,IACrE,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,YAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACRjB,IAAA,YAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,mDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,YAAA,GAAe,qBAAA,EAAA;AACrB,IAAA,IAAM,IAAA,GAAO,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,KAAK,CAAC,CAAA;AAC3E,IAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,aAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,oDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,YAAA,GAAe,qBAAA,EAAA;AACrB,IAAA,IAAM,KAAA,GAAQ,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,KAAK,CAAC,CAAA;AAC5E,IAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,UAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,iDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,IAAM,EAAA,GAAK,CAAC,CAAA,EAAG,CAAA,EAAG,UAAU,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,GAAI,CAAA;AACnD,IAAA,MAAA,CAAO,OAAA,GAAU,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,UAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,iDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,IAAM,EAAA,GAAK,CAAC,CAAA,EAAG,CAAA,EAAG,UAAU,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,GAAI,CAAA;AACnD,IAAA,MAAA,CAAO,OAAA,GAAU,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,UAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,iDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,IAAM,EAAA,GAAK,CAAC,CAAA,EAAG,CAAA,EAAG,UAAU,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,KAAM,CAAA;AACrD,IAAA,MAAA,CAAO,OAAA,GAAU,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,WAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,kDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,IAAM,GAAA,GAAM,CAAC,CAAA,EAAG,CAAA,EAAG,UAAU,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,KAAM,CAAA;AACtD,IAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,WAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,kDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,IAAM,GAAA,GAAM,CAAC,CAAA,EAAG,CAAA,EAAG,UAAU,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,IAAK,CAAA;AACrD,IAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,WAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,kDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,IAAM,GAAA,GAAM,CAAC,CAAA,EAAG,CAAA,EAAG,UAAU,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,IAAK,CAAA;AACrD,IAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJjB,IAAA,WAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,kDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,EAAA,GAAK,UAAA,EAAA;AACX,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AACZ,IAAA,IAAM,EAAA,GAAK,UAAA,EAAA;AACX,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AACZ,IAAA,IAAM,EAAA,GAAK,UAAA,EAAA;AACX,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AAEZ,IAAA,IAAM,GAAA,GAAM,CAAC,CAAA,EAAG,EAAA,EAAI,GAAG,KAAA,KAAU;AAC/B,MAAA,QAAQ,EAAA;AAAI,QACV,KAAK,KAAA;AACH,UAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,YAAA,CAAA,GAAI,CAAA,CAAE,OAAA;AAAA,UACR;AACA,UAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,YAAA,CAAA,GAAI,CAAA,CAAE,OAAA;AAAA,UACR;AACA,UAAA,OAAO,CAAA,KAAM,CAAA;AAAA,QAEf,KAAK,KAAA;AACH,UAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,YAAA,CAAA,GAAI,CAAA,CAAE,OAAA;AAAA,UACR;AACA,UAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,YAAA,CAAA,GAAI,CAAA,CAAE,OAAA;AAAA,UACR;AACA,UAAA,OAAO,CAAA,KAAM,CAAA;AAAA,QAEf,KAAK,EAAA;AAAA,QACL,KAAK,GAAA;AAAA,QACL,KAAK,IAAA;AACH,UAAA,OAAO,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,QAEvB,KAAK,IAAA;AACH,UAAA,OAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,QAExB,KAAK,GAAA;AACH,UAAA,OAAO,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,QAEvB,KAAK,IAAA;AACH,UAAA,OAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,QAExB,KAAK,GAAA;AACH,UAAA,OAAO,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,QAEvB,KAAK,IAAA;AACH,UAAA,OAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,QAExB;AACE,UAAA,MAAM,IAAI,SAAA,CAAU,CAAA,kBAAA,EAAqB,EAAE,CAAA,CAAE,CAAA;AAAA;AACjD,IACF,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrDjB,IAAA,cAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,qDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,EAAE,GAAI,UAAA,EAAA;AAE1B,IAAA,IAAM,MAAA,GAAS,CAAC,OAAA,EAAS,OAAA,KAAY;AACnC,MAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,QAAA,OAAO,OAAA;AAAA,MACT;AAEA,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,QAAA,OAAA,GAAU,OAAO,OAAO,CAAA;AAAA,MAC1B;AAEA,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAA,GAAU,WAAW,EAAC;AAEtB,MAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,IAAI,CAAC,QAAQ,GAAA,EAAK;AAChB,QAAA,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,iBAAA,GAAoB,EAAA,CAAG,CAAA,CAAE,UAAU,CAAA,GAAI,EAAA,CAAG,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,MACnF,CAAA,MAAO;AAUL,QAAA,MAAM,cAAA,GAAiB,QAAQ,iBAAA,GAAoB,EAAA,CAAG,EAAE,aAAa,CAAA,GAAI,EAAA,CAAG,CAAA,CAAE,SAAS,CAAA;AACvF,QAAA,IAAI,IAAA;AACJ,QAAA,OAAA,CAAQ,IAAA,GAAO,cAAA,CAAe,IAAA,CAAK,OAAO,OACrC,CAAC,KAAA,IAAS,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,KAAW,QAAQ,MAAA,CAAA,EACvD;AACA,UAAA,IAAI,CAAC,KAAA,IACC,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,KAAW,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,EAAE,MAAA,EAAQ;AACnE,YAAA,KAAA,GAAQ,IAAA;AAAA,UACV;AACA,UAAA,cAAA,CAAe,SAAA,GAAY,KAAK,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,GAAS,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA;AAAA,QACnE;AAEA,QAAA,cAAA,CAAe,SAAA,GAAY,EAAA;AAAA,MAC7B;AAEA,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,IAAK,GAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,IAAK,GAAA;AAC1B,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,iBAAA,IAAqB,KAAA,CAAM,CAAC,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAAK,EAAA;AAC5E,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,iBAAA,IAAqB,KAAA,CAAM,CAAC,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAAK,EAAA;AAEvE,MAAA,OAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,EAAG,UAAU,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA,IACzE,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,MAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7DjB,IAAA,gBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,sDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,WAAN,MAAe;AAAA,MACb,WAAA,GAAe;AACb,QAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,QAAA,IAAA,CAAK,GAAA,uBAAU,GAAA,EAAI;AAAA,MACrB;AAAA,MAEA,IAAK,GAAA,EAAK;AACR,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC9B,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,OAAO,MAAA;AAAA,QACT,CAAA,MAAO;AAEL,UAAA,IAAA,CAAK,GAAA,CAAI,OAAO,GAAG,CAAA;AACnB,UAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACvB,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,OAAQ,GAAA,EAAK;AACX,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AAAA,MAC5B;AAAA,MAEA,GAAA,CAAK,KAAK,KAAA,EAAO;AACf,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAE/B,QAAA,IAAI,CAAC,OAAA,IAAW,KAAA,KAAU,MAAA,EAAW;AAEnC,UAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,IAAQ,IAAA,CAAK,GAAA,EAAK;AAC7B,YAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACxC,YAAA,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,UACtB;AAEA,UAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,QACzB;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AAEA,IAAA,MAAA,CAAO,OAAA,GAAU,QAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzCjB,IAAA,aAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,kDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,gBAAA,GAAmB,MAAA;AAGzB,IAAA,IAAM,KAAA,GAAN,MAAM,MAAA,CAAM;AAAA,MACV,WAAA,CAAa,OAAO,OAAA,EAAS;AAC3B,QAAA,OAAA,GAAU,aAAa,OAAO,CAAA;AAE9B,QAAA,IAAI,iBAAiB,MAAA,EAAO;AAC1B,UAAA,IACE,KAAA,CAAM,KAAA,KAAU,CAAC,CAAC,OAAA,CAAQ,KAAA,IAC1B,KAAA,CAAM,iBAAA,KAAsB,CAAC,CAAC,OAAA,CAAQ,iBAAA,EACtC;AACA,YAAA,OAAO,KAAA;AAAA,UACT,CAAA,MAAO;AACL,YAAA,OAAO,IAAI,MAAA,CAAM,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAAA,UACrC;AAAA,QACF;AAEA,QAAA,IAAI,iBAAiB,UAAA,EAAY;AAE/B,UAAA,IAAA,CAAK,MAAM,KAAA,CAAM,KAAA;AACjB,UAAA,IAAA,CAAK,GAAA,GAAM,CAAC,CAAC,KAAK,CAAC,CAAA;AACnB,UAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,QAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAC,OAAA,CAAQ,KAAA;AACvB,QAAA,IAAA,CAAK,iBAAA,GAAoB,CAAC,CAAC,OAAA,CAAQ,iBAAA;AAKnC,QAAA,IAAA,CAAK,MAAM,KAAA,CAAM,IAAA,EAAK,CAAE,OAAA,CAAQ,kBAAkB,GAAG,CAAA;AAGrD,QAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,CACb,MAAM,IAAI,CAAA,CAEV,IAAI,CAAA,CAAA,KAAK,IAAA,CAAK,UAAA,CAAW,CAAA,CAAE,MAAM,CAAC,EAIlC,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,MAAM,CAAA;AAEvB,QAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ;AACpB,UAAA,MAAM,IAAI,SAAA,CAAU,CAAA,sBAAA,EAAyB,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAAA,QACzD;AAGA,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG;AAEvB,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACxB,UAAA,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,SAAA,CAAU,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAChD,UAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG;AACzB,YAAA,IAAA,CAAK,GAAA,GAAM,CAAC,KAAK,CAAA;AAAA,UACnB,CAAA,MAAA,IAAW,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG;AAE9B,YAAA,KAAA,MAAW,CAAA,IAAK,KAAK,GAAA,EAAK;AACxB,cAAA,IAAI,EAAE,MAAA,KAAW,CAAA,IAAK,MAAM,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG;AACjC,gBAAA,IAAA,CAAK,GAAA,GAAM,CAAC,CAAC,CAAA;AACb,gBAAA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAAA,MACnB;AAAA,MAEA,IAAI,KAAA,GAAS;AACX,QAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,UAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,UAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACxC,YAAA,IAAI,IAAI,CAAA,EAAG;AACT,cAAA,IAAA,CAAK,SAAA,IAAa,IAAA;AAAA,YACpB;AACA,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACxB,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,cAAA,IAAI,IAAI,CAAA,EAAG;AACT,gBAAA,IAAA,CAAK,SAAA,IAAa,GAAA;AAAA,cACpB;AACA,cAAA,IAAA,CAAK,aAAa,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA,GAAW,IAAA,EAAK;AAAA,YAC7C;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACd;AAAA,MAEA,MAAA,GAAU;AACR,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MACd;AAAA,MAEA,QAAA,GAAY;AACV,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MACd;AAAA,MAEA,WAAY,KAAA,EAAO;AAGjB,QAAA,MAAM,YACH,IAAA,CAAK,OAAA,CAAQ,qBAAqB,uBAAA,KAClC,IAAA,CAAK,QAAQ,KAAA,IAAS,UAAA,CAAA;AACzB,QAAA,MAAM,OAAA,GAAU,WAAW,GAAA,GAAM,KAAA;AACjC,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAChC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,OAAO,MAAA;AAAA,QACT;AAEA,QAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAE3B,QAAA,MAAM,EAAA,GAAK,QAAQ,EAAA,CAAG,CAAA,CAAE,gBAAgB,CAAA,GAAI,EAAA,CAAG,EAAE,WAAW,CAAA;AAC5D,QAAA,KAAA,GAAQ,MAAM,OAAA,CAAQ,EAAA,EAAI,cAAc,IAAA,CAAK,OAAA,CAAQ,iBAAiB,CAAC,CAAA;AACvE,QAAA,KAAA,CAAM,kBAAkB,KAAK,CAAA;AAG7B,QAAA,KAAA,GAAQ,MAAM,OAAA,CAAQ,EAAA,CAAG,CAAA,CAAE,cAAc,GAAG,qBAAqB,CAAA;AACjE,QAAA,KAAA,CAAM,mBAAmB,KAAK,CAAA;AAG9B,QAAA,KAAA,GAAQ,MAAM,OAAA,CAAQ,EAAA,CAAG,CAAA,CAAE,SAAS,GAAG,gBAAgB,CAAA;AACvD,QAAA,KAAA,CAAM,cAAc,KAAK,CAAA;AAGzB,QAAA,KAAA,GAAQ,MAAM,OAAA,CAAQ,EAAA,CAAG,CAAA,CAAE,SAAS,GAAG,gBAAgB,CAAA;AACvD,QAAA,KAAA,CAAM,cAAc,KAAK,CAAA;AAKzB,QAAA,IAAI,SAAA,GAAY,KAAA,CACb,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAA,IAAA,KAAQ,eAAA,CAAgB,IAAA,EAAM,IAAA,CAAK,OAAO,CAAC,EAC/C,IAAA,CAAK,GAAG,CAAA,CACR,KAAA,CAAM,KAAK,CAAA,CAEX,GAAA,CAAI,CAAA,IAAA,KAAQ,WAAA,CAAY,IAAA,EAAM,IAAA,CAAK,OAAO,CAAC,CAAA;AAE9C,QAAA,IAAI,KAAA,EAAO;AAET,UAAA,SAAA,GAAY,SAAA,CAAU,OAAO,CAAA,IAAA,KAAQ;AACnC,YAAA,KAAA,CAAM,sBAAA,EAAwB,IAAA,EAAM,IAAA,CAAK,OAAO,CAAA;AAChD,YAAA,OAAO,CAAC,CAAC,IAAA,CAAK,MAAM,EAAA,CAAG,CAAA,CAAE,eAAe,CAAC,CAAA;AAAA,UAC3C,CAAC,CAAA;AAAA,QACH;AACA,QAAA,KAAA,CAAM,cAAc,SAAS,CAAA;AAK7B,QAAA,MAAM,QAAA,uBAAe,GAAA,EAAI;AACzB,QAAA,MAAM,WAAA,GAAc,UAAU,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAI,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,OAAO,CAAC,CAAA;AAC5E,QAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,UAAA,IAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AACnB,YAAA,OAAO,CAAC,IAAI,CAAA;AAAA,UACd;AACA,UAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AAAA,QAC/B;AACA,QAAA,IAAI,SAAS,IAAA,GAAO,CAAA,IAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACzC,UAAA,QAAA,CAAS,OAAO,EAAE,CAAA;AAAA,QACpB;AAEA,QAAA,MAAM,MAAA,GAAS,CAAC,GAAG,QAAA,CAAS,QAAQ,CAAA;AACpC,QAAA,KAAA,CAAM,GAAA,CAAI,SAAS,MAAM,CAAA;AACzB,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MAEA,UAAA,CAAY,OAAO,OAAA,EAAS;AAC1B,QAAA,IAAI,EAAE,iBAAiB,MAAA,CAAA,EAAQ;AAC7B,UAAA,MAAM,IAAI,UAAU,qBAAqB,CAAA;AAAA,QAC3C;AAEA,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAC,eAAA,KAAoB;AACxC,UAAA,OACE,aAAA,CAAc,iBAAiB,OAAO,CAAA,IACtC,MAAM,GAAA,CAAI,IAAA,CAAK,CAAC,gBAAA,KAAqB;AACnC,YAAA,OACE,cAAc,gBAAA,EAAkB,OAAO,KACvC,eAAA,CAAgB,KAAA,CAAM,CAAC,cAAA,KAAmB;AACxC,cAAA,OAAO,gBAAA,CAAiB,KAAA,CAAM,CAAC,eAAA,KAAoB;AACjD,gBAAA,OAAO,cAAA,CAAe,UAAA,CAAW,eAAA,EAAiB,OAAO,CAAA;AAAA,cAC3D,CAAC,CAAA;AAAA,YACH,CAAC,CAAA;AAAA,UAEL,CAAC,CAAA;AAAA,QAEL,CAAC,CAAA;AAAA,MACH;AAAA;AAAA,MAGA,KAAM,OAAA,EAAS;AACb,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,UAAA,IAAI;AACF,YAAA,OAAA,GAAU,IAAI,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AAAA,UAC5C,SAAS,EAAA,EAAI;AACX,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACxC,UAAA,IAAI,OAAA,CAAQ,KAAK,GAAA,CAAI,CAAC,GAAG,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA,EAAG;AAC/C,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAEA,IAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAEjB,IAAA,IAAM,GAAA,GAAM,gBAAA,EAAA;AACZ,IAAA,IAAM,KAAA,GAAQ,IAAI,GAAA,EAAI;AAEtB,IAAA,IAAM,YAAA,GAAe,qBAAA,EAAA;AACrB,IAAA,IAAM,UAAA,GAAa,kBAAA,EAAA;AACnB,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM;AAAA,MACJ,MAAA,EAAQ,EAAA;AAAA,MACR,CAAA;AAAA,MACA,qBAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF,GAAI,UAAA,EAAA;AACJ,IAAA,IAAM,EAAE,uBAAA,EAAyB,UAAA,EAAW,GAAI,iBAAA,EAAA;AAEhD,IAAA,IAAM,SAAA,GAAY,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,KAAU,UAAA;AACnC,IAAA,IAAM,KAAA,GAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,KAAU,EAAA;AAI/B,IAAA,IAAM,aAAA,GAAgB,CAAC,WAAA,EAAa,OAAA,KAAY;AAC9C,MAAA,IAAI,MAAA,GAAS,IAAA;AACb,MAAA,MAAM,oBAAA,GAAuB,YAAY,KAAA,EAAM;AAC/C,MAAA,IAAI,cAAA,GAAiB,qBAAqB,GAAA,EAAI;AAE9C,MAAA,OAAO,MAAA,IAAU,qBAAqB,MAAA,EAAQ;AAC5C,QAAA,MAAA,GAAS,oBAAA,CAAqB,KAAA,CAAM,CAAC,eAAA,KAAoB;AACvD,UAAA,OAAO,cAAA,CAAe,UAAA,CAAW,eAAA,EAAiB,OAAO,CAAA;AAAA,QAC3D,CAAC,CAAA;AAED,QAAA,cAAA,GAAiB,qBAAqB,GAAA,EAAI;AAAA,MAC5C;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAKA,IAAA,IAAM,eAAA,GAAkB,CAAC,IAAA,EAAM,OAAA,KAAY;AACzC,MAAA,IAAA,GAAO,KAAK,OAAA,CAAQ,EAAA,CAAG,CAAA,CAAE,KAAK,GAAG,EAAE,CAAA;AACnC,MAAA,KAAA,CAAM,MAAA,EAAQ,MAAM,OAAO,CAAA;AAC3B,MAAA,IAAA,GAAO,aAAA,CAAc,MAAM,OAAO,CAAA;AAClC,MAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACnB,MAAA,IAAA,GAAO,aAAA,CAAc,MAAM,OAAO,CAAA;AAClC,MAAA,KAAA,CAAM,UAAU,IAAI,CAAA;AACpB,MAAA,IAAA,GAAO,cAAA,CAAe,MAAM,OAAO,CAAA;AACnC,MAAA,KAAA,CAAM,UAAU,IAAI,CAAA;AACpB,MAAA,IAAA,GAAO,YAAA,CAAa,MAAM,OAAO,CAAA;AACjC,MAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACnB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAM,GAAA,GAAM,QAAM,CAAC,EAAA,IAAM,GAAG,WAAA,EAAY,KAAM,OAAO,EAAA,KAAO,GAAA;AAS5D,IAAA,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAM,OAAA,KAAY;AACvC,MAAA,OAAO,IAAA,CACJ,IAAA,EAAK,CACL,KAAA,CAAM,KAAK,CAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM,aAAa,CAAA,EAAG,OAAO,CAAC,CAAA,CACnC,KAAK,GAAG,CAAA;AAAA,IACb,CAAA;AAEA,IAAA,IAAM,YAAA,GAAe,CAAC,IAAA,EAAM,OAAA,KAAY;AACtC,MAAA,MAAM,CAAA,GAAI,QAAQ,KAAA,GAAQ,EAAA,CAAG,EAAE,UAAU,CAAA,GAAI,EAAA,CAAG,CAAA,CAAE,KAAK,CAAA;AACvD,MAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,EAAG,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,KAAO;AACzC,QAAA,KAAA,CAAM,SAAS,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAE,CAAA;AACnC,QAAA,IAAI,GAAA;AAEJ,QAAA,IAAI,GAAA,CAAI,CAAC,CAAA,EAAG;AACV,UAAA,GAAA,GAAM,EAAA;AAAA,QACR,CAAA,MAAA,IAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AACjB,UAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,MAAA,EAAS,CAAC,IAAI,CAAC,CAAA,MAAA,CAAA;AAAA,QAC7B,CAAA,MAAA,IAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AAEjB,UAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAC,CAAA,IAAA,CAAA;AAAA,QACrC,WAAW,EAAA,EAAI;AACb,UAAA,KAAA,CAAM,mBAAmB,EAAE,CAAA;AAC3B,UAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,EAC1B,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,IAAA,CAAA;AAAA,QAClB,CAAA,MAAO;AAEL,UAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CACrB,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAC,CAAA,IAAA,CAAA;AAAA,QAClB;AAEA,QAAA,KAAA,CAAM,gBAAgB,GAAG,CAAA;AACzB,QAAA,OAAO,GAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAUA,IAAA,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAM,OAAA,KAAY;AACvC,MAAA,OAAO,IAAA,CACJ,IAAA,EAAK,CACL,KAAA,CAAM,KAAK,CAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM,aAAa,CAAA,EAAG,OAAO,CAAC,CAAA,CACnC,KAAK,GAAG,CAAA;AAAA,IACb,CAAA;AAEA,IAAA,IAAM,YAAA,GAAe,CAAC,IAAA,EAAM,OAAA,KAAY;AACtC,MAAA,KAAA,CAAM,OAAA,EAAS,MAAM,OAAO,CAAA;AAC5B,MAAA,MAAM,CAAA,GAAI,QAAQ,KAAA,GAAQ,EAAA,CAAG,EAAE,UAAU,CAAA,GAAI,EAAA,CAAG,CAAA,CAAE,KAAK,CAAA;AACvD,MAAA,MAAMC,EAAAA,GAAI,OAAA,CAAQ,iBAAA,GAAoB,IAAA,GAAO,EAAA;AAC7C,MAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,EAAG,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,KAAO;AACzC,QAAA,KAAA,CAAM,SAAS,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAE,CAAA;AACnC,QAAA,IAAI,GAAA;AAEJ,QAAA,IAAI,GAAA,CAAI,CAAC,CAAA,EAAG;AACV,UAAA,GAAA,GAAM,EAAA;AAAA,QACR,CAAA,MAAA,IAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AACjB,UAAA,GAAA,GAAM,KAAK,CAAC,CAAA,IAAA,EAAOA,EAAC,CAAA,EAAA,EAAK,CAAC,IAAI,CAAC,CAAA,MAAA,CAAA;AAAA,QACjC,CAAA,MAAA,IAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AACjB,UAAA,IAAI,MAAM,GAAA,EAAK;AACb,YAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,EAAA,EAAKA,EAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAC,CAAA,IAAA,CAAA;AAAA,UACzC,CAAA,MAAO;AACL,YAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,KAAKA,EAAC,CAAA,EAAA,EAAK,CAAC,CAAA,GAAI,CAAC,CAAA,MAAA,CAAA;AAAA,UACpC;AAAA,QACF,WAAW,EAAA,EAAI;AACb,UAAA,KAAA,CAAM,mBAAmB,EAAE,CAAA;AAC3B,UAAA,IAAI,MAAM,GAAA,EAAK;AACb,YAAA,IAAI,MAAM,GAAA,EAAK;AACb,cAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,EAC1B,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,EAAA,CAAA;AAAA,YACvB,CAAA,MAAO;AACL,cAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,EAC1B,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,IAAA,CAAA;AAAA,YAClB;AAAA,UACF,CAAA,MAAO;AACL,YAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,EAC1B,CAAA,EAAA,EAAK,CAAC,CAAA,GAAI,CAAC,CAAA,MAAA,CAAA;AAAA,UACb;AAAA,QACF,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,OAAO,CAAA;AACb,UAAA,IAAI,MAAM,GAAA,EAAK;AACb,YAAA,IAAI,MAAM,GAAA,EAAK;AACb,cAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CACrB,CAAA,EAAGA,EAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,EAAA,CAAA;AAAA,YAC3B,CAAA,MAAO;AACL,cAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CACrB,CAAA,EAAGA,EAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,IAAA,CAAA;AAAA,YACtB;AAAA,UACF,CAAA,MAAO;AACL,YAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CACrB,CAAA,EAAA,EAAK,CAAC,CAAA,GAAI,CAAC,CAAA,MAAA,CAAA;AAAA,UACb;AAAA,QACF;AAEA,QAAA,KAAA,CAAM,gBAAgB,GAAG,CAAA;AACzB,QAAA,OAAO,GAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,IAAM,cAAA,GAAiB,CAAC,IAAA,EAAM,OAAA,KAAY;AACxC,MAAA,KAAA,CAAM,gBAAA,EAAkB,MAAM,OAAO,CAAA;AACrC,MAAA,OAAO,IAAA,CACJ,KAAA,CAAM,KAAK,CAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,EAAG,OAAO,CAAC,CAAA,CACpC,KAAK,GAAG,CAAA;AAAA,IACb,CAAA;AAEA,IAAA,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAM,OAAA,KAAY;AACvC,MAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AACjB,MAAA,MAAM,CAAA,GAAI,QAAQ,KAAA,GAAQ,EAAA,CAAG,EAAE,WAAW,CAAA,GAAI,EAAA,CAAG,CAAA,CAAE,MAAM,CAAA;AACzD,MAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,EAAG,CAAC,KAAK,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,KAAO;AACjD,QAAA,KAAA,CAAM,UAAU,IAAA,EAAM,GAAA,EAAK,MAAM,CAAA,EAAG,CAAA,EAAG,GAAG,EAAE,CAAA;AAC5C,QAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,QAAA,MAAM,EAAA,GAAK,EAAA,IAAM,GAAA,CAAI,CAAC,CAAA;AACtB,QAAA,MAAM,EAAA,GAAK,EAAA,IAAM,GAAA,CAAI,CAAC,CAAA;AACtB,QAAA,MAAM,IAAA,GAAO,EAAA;AAEb,QAAA,IAAI,IAAA,KAAS,OAAO,IAAA,EAAM;AACxB,UAAA,IAAA,GAAO,EAAA;AAAA,QACT;AAIA,QAAA,EAAA,GAAK,OAAA,CAAQ,oBAAoB,IAAA,GAAO,EAAA;AAExC,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK;AAEhC,YAAA,GAAA,GAAM,UAAA;AAAA,UACR,CAAA,MAAO;AAEL,YAAA,GAAA,GAAM,GAAA;AAAA,UACR;AAAA,QACF,CAAA,MAAA,IAAW,QAAQ,IAAA,EAAM;AAGvB,UAAA,IAAI,EAAA,EAAI;AACN,YAAA,CAAA,GAAI,CAAA;AAAA,UACN;AACA,UAAA,CAAA,GAAI,CAAA;AAEJ,UAAA,IAAI,SAAS,GAAA,EAAK;AAGhB,YAAA,IAAA,GAAO,IAAA;AACP,YAAA,IAAI,EAAA,EAAI;AACN,cAAA,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AACT,cAAA,CAAA,GAAI,CAAA;AACJ,cAAA,CAAA,GAAI,CAAA;AAAA,YACN,CAAA,MAAO;AACL,cAAA,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AACT,cAAA,CAAA,GAAI,CAAA;AAAA,YACN;AAAA,UACF,CAAA,MAAA,IAAW,SAAS,IAAA,EAAM;AAGxB,YAAA,IAAA,GAAO,GAAA;AACP,YAAA,IAAI,EAAA,EAAI;AACN,cAAA,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAA,YACX,CAAA,MAAO;AACL,cAAA,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAA,YACX;AAAA,UACF;AAEA,UAAA,IAAI,SAAS,GAAA,EAAK;AAChB,YAAA,EAAA,GAAK,IAAA;AAAA,UACP;AAEA,UAAA,GAAA,GAAM,CAAA,EAAG,OAAO,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,EAAE,CAAA,CAAA;AAAA,QAClC,WAAW,EAAA,EAAI;AACb,UAAA,GAAA,GAAM,KAAK,CAAC,CAAA,IAAA,EAAO,EAAE,CAAA,EAAA,EAAK,CAAC,IAAI,CAAC,CAAA,MAAA,CAAA;AAAA,QAClC,WAAW,EAAA,EAAI;AACb,UAAA,GAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,EAAA,EAAK,EACtB,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAC,CAAA,IAAA,CAAA;AAAA,QAClB;AAEA,QAAA,KAAA,CAAM,iBAAiB,GAAG,CAAA;AAE1B,QAAA,OAAO,GAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAIA,IAAA,IAAM,YAAA,GAAe,CAAC,IAAA,EAAM,OAAA,KAAY;AACtC,MAAA,KAAA,CAAM,cAAA,EAAgB,MAAM,OAAO,CAAA;AAEnC,MAAA,OAAO,IAAA,CACJ,MAAK,CACL,OAAA,CAAQ,GAAG,CAAA,CAAE,IAAI,GAAG,EAAE,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,IAAM,WAAA,GAAc,CAAC,IAAA,EAAM,OAAA,KAAY;AACrC,MAAA,KAAA,CAAM,aAAA,EAAe,MAAM,OAAO,CAAA;AAClC,MAAA,OAAO,IAAA,CACJ,IAAA,EAAK,CACL,OAAA,CAAQ,EAAA,CAAG,OAAA,CAAQ,iBAAA,GAAoB,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,IAAI,CAAA,EAAG,EAAE,CAAA;AAAA,IACnE,CAAA;AAQA,IAAA,IAAM,aAAA,GAAgB,CAAA,KAAA,KAAS,CAAC,EAAA,EAC9B,MAAM,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,EAAA,EACvB,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,GAAA,KAAQ;AACxB,MAAA,IAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AACX,QAAA,IAAA,GAAO,EAAA;AAAA,MACT,CAAA,MAAA,IAAW,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,QAAA,IAAA,GAAO,CAAA,EAAA,EAAK,EAAE,CAAA,IAAA,EAAO,KAAA,GAAQ,OAAO,EAAE,CAAA,CAAA;AAAA,MACxC,CAAA,MAAA,IAAW,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,QAAA,IAAA,GAAO,KAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,EAAA,EAAK,KAAA,GAAQ,OAAO,EAAE,CAAA,CAAA;AAAA,MAC5C,WAAW,GAAA,EAAK;AACd,QAAA,IAAA,GAAO,KAAK,IAAI,CAAA,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,EAAG,KAAA,GAAQ,OAAO,EAAE,CAAA,CAAA;AAAA,MACtC;AAEA,MAAA,IAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AACX,QAAA,EAAA,GAAK,EAAA;AAAA,MACP,CAAA,MAAA,IAAW,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,QAAA,EAAA,GAAK,CAAA,CAAA,EAAI,CAAC,EAAA,GAAK,CAAC,CAAA,MAAA,CAAA;AAAA,MAClB,CAAA,MAAA,IAAW,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,QAAA,EAAA,GAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,CAAC,KAAK,CAAC,CAAA,IAAA,CAAA;AAAA,MACxB,WAAW,GAAA,EAAK;AACd,QAAA,EAAA,GAAK,KAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,GAAG,CAAA,CAAA;AAAA,MACjC,WAAW,KAAA,EAAO;AAChB,QAAA,EAAA,GAAK,IAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,CAAC,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,EAAA,GAAK,KAAK,EAAE,CAAA,CAAA;AAAA,MACd;AAEA,MAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,GAAG,IAAA,EAAK;AAAA,IAC9B,CAAA;AAEA,IAAA,IAAM,OAAA,GAAU,CAAC,GAAA,EAAK,OAAA,EAAS,OAAA,KAAY;AACzC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,QAAA,IAAI,CAAC,GAAA,CAAI,CAAC,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA,EAAG;AACzB,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,MAAA,IAAU,CAAC,QAAQ,iBAAA,EAAmB;AAM3D,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,UAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAE,MAAM,CAAA;AACnB,UAAA,IAAI,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,KAAW,WAAW,GAAA,EAAK;AACpC,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AACvC,YAAA,MAAM,OAAA,GAAU,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA;AACvB,YAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,OAAA,CAAQ,KAAA,IAC1B,OAAA,CAAQ,KAAA,KAAU,OAAA,CAAQ,KAAA,IAC1B,OAAA,CAAQ,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO;AACnC,cAAA,OAAO,IAAA;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAGA,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5iBA,IAAA,kBAAA,GAAAF,4BAAA,CAAA;AAAA,EAAA,uDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,GAAA,GAAM,OAAO,YAAY,CAAA;AAE/B,IAAA,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA,MACf,WAAW,GAAA,GAAO;AAChB,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,MAEA,WAAA,CAAa,MAAM,OAAA,EAAS;AAC1B,QAAA,OAAA,GAAU,aAAa,OAAO,CAAA;AAE9B,QAAA,IAAI,gBAAgB,WAAA,EAAY;AAC9B,UAAA,IAAI,IAAA,CAAK,KAAA,KAAU,CAAC,CAAC,QAAQ,KAAA,EAAO;AAClC,YAAA,OAAO,IAAA;AAAA,UACT,CAAA,MAAO;AACL,YAAA,IAAA,GAAO,IAAA,CAAK,KAAA;AAAA,UACd;AAAA,QACF;AAEA,QAAA,IAAA,GAAO,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,KAAK,GAAG,CAAA;AACxC,QAAA,KAAA,CAAM,YAAA,EAAc,MAAM,OAAO,CAAA;AACjC,QAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,QAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAC,OAAA,CAAQ,KAAA;AACvB,QAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AAEf,QAAA,IAAI,IAAA,CAAK,WAAW,GAAA,EAAK;AACvB,UAAA,IAAA,CAAK,KAAA,GAAQ,EAAA;AAAA,QACf,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,OAAA;AAAA,QAC3C;AAEA,QAAA,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,MACpB;AAAA,MAEA,MAAO,IAAA,EAAM;AACX,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,EAAA,CAAG,EAAE,eAAe,CAAA,GAAI,EAAA,CAAG,CAAA,CAAE,UAAU,CAAA;AACtE,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAEtB,QAAA,IAAI,CAAC,CAAA,EAAG;AACN,UAAA,MAAM,IAAI,SAAA,CAAU,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,QACnD;AAEA,QAAA,IAAA,CAAK,WAAW,CAAA,CAAE,CAAC,MAAM,MAAA,GAAY,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAC5C,QAAA,IAAI,IAAA,CAAK,aAAa,GAAA,EAAK;AACzB,UAAA,IAAA,CAAK,QAAA,GAAW,EAAA;AAAA,QAClB;AAGA,QAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG;AACT,UAAA,IAAA,CAAK,MAAA,GAAS,GAAA;AAAA,QAChB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,MAEA,QAAA,GAAY;AACV,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MACd;AAAA,MAEA,KAAM,OAAA,EAAS;AACb,QAAA,KAAA,CAAM,iBAAA,EAAmB,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAEpD,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,OAAA,KAAY,GAAA,EAAK;AAC1C,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,UAAA,IAAI;AACF,YAAA,OAAA,GAAU,IAAI,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AAAA,UAC5C,SAAS,EAAA,EAAI;AACX,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAO,IAAI,OAAA,EAAS,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,EAAQ,KAAK,OAAO,CAAA;AAAA,MAC9D;AAAA,MAEA,UAAA,CAAY,MAAM,OAAA,EAAS;AACzB,QAAA,IAAI,EAAE,gBAAgB,WAAA,CAAA,EAAa;AACjC,UAAA,MAAM,IAAI,UAAU,0BAA0B,CAAA;AAAA,QAChD;AAEA,QAAA,IAAI,IAAA,CAAK,aAAa,EAAA,EAAI;AACxB,UAAA,IAAI,IAAA,CAAK,UAAU,EAAA,EAAI;AACrB,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,OAAO,IAAI,MAAM,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA,CAAE,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACvD,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,KAAa,EAAA,EAAI;AAC/B,UAAA,IAAI,IAAA,CAAK,UAAU,EAAA,EAAI;AACrB,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,OAAO,IAAI,MAAM,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA,CAAE,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,QACxD;AAEA,QAAA,OAAA,GAAU,aAAa,OAAO,CAAA;AAG9B,QAAA,IAAI,QAAQ,iBAAA,KACT,IAAA,CAAK,UAAU,UAAA,IAAc,IAAA,CAAK,UAAU,UAAA,CAAA,EAAa;AAC1D,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,IAAI,CAAC,OAAA,CAAQ,iBAAA,KACV,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,CAAA,EAAI;AACtE,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,IAAA,CAAK,SAAS,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAClE,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,IAAA,CAAK,SAAS,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAClE,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IACG,IAAA,CAAK,MAAA,CAAO,OAAA,KAAY,IAAA,CAAK,OAAO,OAAA,IACrC,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5D,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,IAAI,IAAA,CAAK,MAAA,EAAQ,GAAA,EAAK,IAAA,CAAK,QAAQ,OAAO,CAAA,IAC5C,IAAA,CAAK,QAAA,CAAS,WAAW,GAAG,CAAA,IAAK,KAAK,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAChE,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,IAAI,IAAA,CAAK,MAAA,EAAQ,GAAA,EAAK,IAAA,CAAK,QAAQ,OAAO,CAAA,IAC5C,IAAA,CAAK,QAAA,CAAS,WAAW,GAAG,CAAA,IAAK,KAAK,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAChE,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAEA,IAAA,MAAA,CAAO,OAAA,GAAU,UAAA;AAEjB,IAAA,IAAM,YAAA,GAAe,qBAAA,EAAA;AACrB,IAAA,IAAM,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,EAAE,GAAI,UAAA,EAAA;AAC1B,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AACZ,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9Id,IAAA,iBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,wDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,SAAA,GAAY,CAAC,OAAA,EAAS,KAAA,EAAO,OAAA,KAAY;AAC7C,MAAA,IAAI;AACF,QAAA,KAAA,GAAQ,IAAI,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AAAA,MAClC,SAAS,EAAA,EAAI;AACX,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,IAC3B,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,SAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACXjB,IAAA,sBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,0DAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AAGd,IAAA,IAAM,aAAA,GAAgB,CAAC,KAAA,EAAO,OAAA,KAC5B,IAAI,MAAM,KAAA,EAAO,OAAO,CAAA,CAAE,GAAA,CACvB,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAEnE,IAAA,MAAA,CAAO,OAAA,GAAU,aAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACTjB,IAAA,sBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,0DAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AAEd,IAAA,IAAM,aAAA,GAAgB,CAAC,QAAA,EAAU,KAAA,EAAO,OAAA,KAAY;AAClD,MAAA,IAAI,GAAA,GAAM,IAAA;AACV,MAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,IAAI,QAAA,GAAW,IAAA;AACf,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,IAAI,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AAAA,MACrC,SAAS,EAAA,EAAI;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,KAAM;AACtB,QAAA,IAAI,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG;AAEpB,UAAA,IAAI,CAAC,GAAA,IAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAM,EAAA,EAAI;AAEnC,YAAA,GAAA,GAAM,CAAA;AACN,YAAA,KAAA,GAAQ,IAAI,MAAA,CAAO,GAAA,EAAK,OAAO,CAAA;AAAA,UACjC;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,aAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1BjB,IAAA,sBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,0DAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,aAAA,GAAgB,CAAC,QAAA,EAAU,KAAA,EAAO,OAAA,KAAY;AAClD,MAAA,IAAI,GAAA,GAAM,IAAA;AACV,MAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,IAAI,QAAA,GAAW,IAAA;AACf,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,IAAI,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AAAA,MACrC,SAAS,EAAA,EAAI;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,KAAM;AACtB,QAAA,IAAI,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG;AAEpB,UAAA,IAAI,CAAC,GAAA,IAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAM,CAAA,EAAG;AAElC,YAAA,GAAA,GAAM,CAAA;AACN,YAAA,KAAA,GAAQ,IAAI,MAAA,CAAO,GAAA,EAAK,OAAO,CAAA;AAAA,UACjC;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,aAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzBjB,IAAA,mBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,uDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,EAAA,GAAK,UAAA,EAAA;AAEX,IAAA,IAAM,UAAA,GAAa,CAAC,KAAA,EAAO,KAAA,KAAU;AACnC,MAAA,KAAA,GAAQ,IAAI,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA;AAE9B,MAAA,IAAI,MAAA,GAAS,IAAI,MAAA,CAAO,OAAO,CAAA;AAC/B,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,EAAG;AACtB,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,MAAA,GAAS,IAAI,OAAO,SAAS,CAAA;AAC7B,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,EAAG;AACtB,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAM,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAA,EAAG;AACzC,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AAE/B,QAAA,IAAI,MAAA,GAAS,IAAA;AACb,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,UAAA,KAAe;AAElC,UAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,UAAA,CAAW,OAAO,OAAO,CAAA;AACpD,UAAA,QAAQ,WAAW,QAAA;AAAU,YAC3B,KAAK,GAAA;AACH,cAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AACnC,gBAAA,OAAA,CAAQ,KAAA,EAAA;AAAA,cACV,CAAA,MAAO;AACL,gBAAA,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,cAC3B;AACA,cAAA,OAAA,CAAQ,GAAA,GAAM,QAAQ,MAAA,EAAO;AAAA;AAAA,YAE/B,KAAK,EAAA;AAAA,YACL,KAAK,IAAA;AACH,cAAA,IAAI,CAAC,MAAA,IAAU,EAAA,CAAG,OAAA,EAAS,MAAM,CAAA,EAAG;AAClC,gBAAA,MAAA,GAAS,OAAA;AAAA,cACX;AACA,cAAA;AAAA,YACF,KAAK,GAAA;AAAA,YACL,KAAK,IAAA;AAEH,cAAA;AAAA;AAAA,YAEF;AACE,cAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,UAAA,CAAW,QAAQ,CAAA,CAAE,CAAA;AAAA;AAClE,QACF,CAAC,CAAA;AACD,QAAA,IAAI,WAAW,CAAC,MAAA,IAAU,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,CAAA,EAAI;AAC7C,UAAA,MAAA,GAAS,MAAA;AAAA,QACX;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,EAAG;AAChC,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,UAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9DjB,IAAAE,cAAAA,GAAAH,4BAAA,CAAA;AAAA,EAAA,iDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,UAAA,GAAa,CAAC,KAAA,EAAO,OAAA,KAAY;AACrC,MAAA,IAAI;AAGF,QAAA,OAAO,IAAI,KAAA,CAAM,KAAA,EAAO,OAAO,EAAE,KAAA,IAAS,GAAA;AAAA,MAC5C,SAAS,EAAA,EAAI;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,UAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACZjB,IAAA,eAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,mDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,UAAA,GAAa,kBAAA,EAAA;AACnB,IAAA,IAAM,EAAE,KAAI,GAAI,UAAA;AAChB,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,SAAA,GAAY,iBAAA,EAAA;AAClB,IAAA,IAAM,EAAA,GAAK,UAAA,EAAA;AACX,IAAA,IAAM,EAAA,GAAK,UAAA,EAAA;AACX,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AACZ,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AAEZ,IAAA,IAAM,OAAA,GAAU,CAAC,OAAA,EAAS,KAAA,EAAO,MAAM,OAAA,KAAY;AACjD,MAAA,OAAA,GAAU,IAAI,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA;AACrC,MAAA,KAAA,GAAQ,IAAI,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AAEhC,MAAA,IAAI,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,KAAA;AAC7B,MAAA,QAAQ,IAAA;AAAM,QACZ,KAAK,GAAA;AACH,UAAA,IAAA,GAAO,EAAA;AACP,UAAA,KAAA,GAAQ,GAAA;AACR,UAAA,IAAA,GAAO,EAAA;AACP,UAAA,IAAA,GAAO,GAAA;AACP,UAAA,KAAA,GAAQ,IAAA;AACR,UAAA;AAAA,QACF,KAAK,GAAA;AACH,UAAA,IAAA,GAAO,EAAA;AACP,UAAA,KAAA,GAAQ,GAAA;AACR,UAAA,IAAA,GAAO,EAAA;AACP,UAAA,IAAA,GAAO,GAAA;AACP,UAAA,KAAA,GAAQ,IAAA;AACR,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,UAAU,uCAAuC,CAAA;AAAA;AAI/D,MAAA,IAAI,SAAA,CAAU,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA,EAAG;AACtC,QAAA,OAAO,KAAA;AAAA,MACT;AAKA,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAM,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAA,EAAG;AACzC,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AAE/B,QAAA,IAAI,IAAA,GAAO,IAAA;AACX,QAAA,IAAI,GAAA,GAAM,IAAA;AAEV,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,UAAA,KAAe;AAClC,UAAA,IAAI,UAAA,CAAW,WAAW,GAAA,EAAK;AAC7B,YAAA,UAAA,GAAa,IAAI,WAAW,SAAS,CAAA;AAAA,UACvC;AACA,UAAA,IAAA,GAAO,IAAA,IAAQ,UAAA;AACf,UAAA,GAAA,GAAM,GAAA,IAAO,UAAA;AACb,UAAA,IAAI,KAAK,UAAA,CAAW,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA,EAAG;AACjD,YAAA,IAAA,GAAO,UAAA;AAAA,UACT,WAAW,IAAA,CAAK,UAAA,CAAW,QAAQ,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA,EAAG;AACvD,YAAA,GAAA,GAAM,UAAA;AAAA,UACR;AAAA,QACF,CAAC,CAAA;AAID,QAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,IAAQ,IAAA,CAAK,aAAa,KAAA,EAAO;AACrD,UAAA,OAAO,KAAA;AAAA,QACT;AAIA,QAAA,IAAA,CAAK,CAAC,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,QAAA,KAAa,SACnC,KAAA,CAAM,OAAA,EAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AAC9B,UAAA,OAAO,KAAA;AAAA,QACT,CAAA,MAAA,IAAW,IAAI,QAAA,KAAa,KAAA,IAAS,KAAK,OAAA,EAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AAC9D,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAA,CAAO,OAAA,GAAU,OAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjFjB,IAAA,WAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,+CAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAGA,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,IAAM,GAAA,GAAM,CAAC,OAAA,EAAS,KAAA,EAAO,YAAY,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,GAAA,EAAK,OAAO,CAAA;AAC7E,IAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACLjB,IAAA,WAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,+CAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAEhB,IAAA,IAAM,GAAA,GAAM,CAAC,OAAA,EAAS,KAAA,EAAO,YAAY,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,GAAA,EAAK,OAAO,CAAA;AAC7E,IAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACLjB,IAAA,kBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,sDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,UAAA,GAAa,CAAC,EAAA,EAAI,EAAA,EAAI,OAAA,KAAY;AACtC,MAAA,EAAA,GAAK,IAAI,KAAA,CAAM,EAAA,EAAI,OAAO,CAAA;AAC1B,MAAA,EAAA,GAAK,IAAI,KAAA,CAAM,EAAA,EAAI,OAAO,CAAA;AAC1B,MAAA,OAAO,EAAA,CAAG,UAAA,CAAW,EAAA,EAAI,OAAO,CAAA;AAAA,IAClC,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,UAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACRjB,IAAA,gBAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,oDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAKA,IAAA,IAAM,SAAA,GAAY,iBAAA,EAAA;AAClB,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,MAAA,CAAO,OAAA,GAAU,CAAC,QAAA,EAAU,KAAA,EAAO,OAAA,KAAY;AAC7C,MAAA,MAAM,MAAM,EAAC;AACb,MAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,IAAI,IAAA,GAAO,IAAA;AACX,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,OAAO,CAAC,CAAA;AACxD,MAAA,KAAA,MAAW,WAAW,CAAA,EAAG;AACvB,QAAA,MAAM,QAAA,GAAW,SAAA,CAAU,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA;AAClD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,GAAO,OAAA;AACP,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,KAAA,GAAQ,OAAA;AAAA,UACV;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,GAAA,CAAI,IAAA,CAAK,CAAC,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,UACxB;AACA,UAAA,IAAA,GAAO,IAAA;AACP,UAAA,KAAA,GAAQ,IAAA;AAAA,QACV;AAAA,MACF;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,GAAA,CAAI,IAAA,CAAK,CAAC,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,MACxB;AAEA,MAAA,MAAM,SAAS,EAAC;AAChB,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,CAAA,IAAK,GAAA,EAAK;AAC5B,QAAA,IAAI,QAAQ,GAAA,EAAK;AACf,UAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,QACjB,WAAW,CAAC,GAAA,IAAO,GAAA,KAAQ,CAAA,CAAE,CAAC,CAAA,EAAG;AAC/B,UAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,QACjB,CAAA,MAAA,IAAW,CAAC,GAAA,EAAK;AACf,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,QACxB,CAAA,MAAA,IAAW,GAAA,KAAQ,CAAA,CAAE,CAAC,CAAA,EAAG;AACvB,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,GAAG,CAAA,CAAE,CAAA;AAAA,QAC/B;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AACrC,MAAA,MAAM,QAAA,GAAW,OAAO,KAAA,CAAM,GAAA,KAAQ,WAAW,KAAA,CAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACzE,MAAA,OAAO,UAAA,CAAW,MAAA,GAAS,QAAA,CAAS,MAAA,GAAS,UAAA,GAAa,KAAA;AAAA,IAC5D,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChDA,IAAA,cAAA,GAAAD,4BAAA,CAAA;AAAA,EAAA,kDAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAEA,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,UAAA,GAAa,kBAAA,EAAA;AACnB,IAAA,IAAM,EAAE,KAAI,GAAI,UAAA;AAChB,IAAA,IAAM,SAAA,GAAY,iBAAA,EAAA;AAClB,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAsChB,IAAA,IAAM,SAAS,CAAC,GAAA,EAAK,GAAA,EAAK,OAAA,GAAU,EAAC,KAAM;AACzC,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,GAAA,GAAM,IAAI,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAC5B,MAAA,GAAA,GAAM,IAAI,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAC5B,MAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,MAAA,KAAA,EAAO,KAAA,MAAW,SAAA,IAAa,GAAA,CAAI,GAAA,EAAK;AACtC,QAAA,KAAA,MAAW,SAAA,IAAa,IAAI,GAAA,EAAK;AAC/B,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,SAAA,EAAW,SAAA,EAAW,OAAO,CAAA;AACxD,UAAA,UAAA,GAAa,cAAc,KAAA,KAAU,IAAA;AACrC,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,SAAS,KAAA;AAAA,UACX;AAAA,QACF;AAKA,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAM,4BAAA,GAA+B,CAAC,IAAI,UAAA,CAAW,WAAW,CAAC,CAAA;AACjE,IAAA,IAAM,cAAA,GAAiB,CAAC,IAAI,UAAA,CAAW,SAAS,CAAC,CAAA;AAEjD,IAAA,IAAM,YAAA,GAAe,CAAC,GAAA,EAAK,GAAA,EAAK,OAAA,KAAY;AAC1C,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI,IAAI,MAAA,KAAW,CAAA,IAAK,IAAI,CAAC,CAAA,CAAE,WAAW,GAAA,EAAK;AAC7C,QAAA,IAAI,IAAI,MAAA,KAAW,CAAA,IAAK,IAAI,CAAC,CAAA,CAAE,WAAW,GAAA,EAAK;AAC7C,UAAA,OAAO,IAAA;AAAA,QACT,CAAA,MAAA,IAAW,QAAQ,iBAAA,EAAmB;AACpC,UAAA,GAAA,GAAM,4BAAA;AAAA,QACR,CAAA,MAAO;AACL,UAAA,GAAA,GAAM,cAAA;AAAA,QACR;AAAA,MACF;AAEA,MAAA,IAAI,IAAI,MAAA,KAAW,CAAA,IAAK,IAAI,CAAC,CAAA,CAAE,WAAW,GAAA,EAAK;AAC7C,QAAA,IAAI,QAAQ,iBAAA,EAAmB;AAC7B,UAAA,OAAO,IAAA;AAAA,QACT,CAAA,MAAO;AACL,UAAA,GAAA,GAAM,cAAA;AAAA,QACR;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,uBAAY,GAAA,EAAI;AACtB,MAAA,IAAI,EAAA,EAAI,EAAA;AACR,MAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,QAAA,IAAI,CAAA,CAAE,QAAA,KAAa,GAAA,IAAO,CAAA,CAAE,aAAa,IAAA,EAAM;AAC7C,UAAA,EAAA,GAAK,QAAA,CAAS,EAAA,EAAI,CAAA,EAAG,OAAO,CAAA;AAAA,QAC9B,WAAW,CAAA,CAAE,QAAA,KAAa,GAAA,IAAO,CAAA,CAAE,aAAa,IAAA,EAAM;AACpD,UAAA,EAAA,GAAK,OAAA,CAAQ,EAAA,EAAI,CAAA,EAAG,OAAO,CAAA;AAAA,QAC7B,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,GAAA,CAAI,EAAE,MAAM,CAAA;AAAA,QACpB;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAClB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,QAAA,GAAW,OAAA,CAAQ,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,QAAQ,OAAO,CAAA;AAChD,QAAA,IAAI,WAAW,CAAA,EAAG;AAChB,UAAA,OAAO,IAAA;AAAA,QACT,CAAA,MAAA,IAAW,aAAa,CAAA,KAAM,EAAA,CAAG,aAAa,IAAA,IAAQ,EAAA,CAAG,aAAa,IAAA,CAAA,EAAO;AAC3E,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,QAAA,IAAI,EAAA,IAAM,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,EAAE,CAAA,EAAG,OAAO,CAAA,EAAG;AAC7C,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,EAAA,IAAM,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,EAAE,CAAA,EAAG,OAAO,CAAA,EAAG;AAC7C,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,UAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG;AACtC,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI,MAAA,EAAQ,KAAA;AACZ,MAAA,IAAI,QAAA,EAAU,QAAA;AAGd,MAAA,IAAI,YAAA,GAAe,EAAA,IACjB,CAAC,OAAA,CAAQ,iBAAA,IACT,GAAG,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,EAAA,CAAG,MAAA,GAAS,KAAA;AAC5C,MAAA,IAAI,YAAA,GAAe,EAAA,IACjB,CAAC,OAAA,CAAQ,iBAAA,IACT,GAAG,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,EAAA,CAAG,MAAA,GAAS,KAAA;AAE5C,MAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,UAAA,CAAW,MAAA,KAAW,CAAA,IACnD,EAAA,CAAG,QAAA,KAAa,GAAA,IAAO,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA,KAAM,CAAA,EAAG;AAC3D,QAAA,YAAA,GAAe,KAAA;AAAA,MACjB;AAEA,MAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,QAAA,QAAA,GAAW,QAAA,IAAY,CAAA,CAAE,QAAA,KAAa,GAAA,IAAO,EAAE,QAAA,KAAa,IAAA;AAC5D,QAAA,QAAA,GAAW,QAAA,IAAY,CAAA,CAAE,QAAA,KAAa,GAAA,IAAO,EAAE,QAAA,KAAa,IAAA;AAC5D,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,IAAI,CAAA,CAAE,OAAO,UAAA,IAAc,CAAA,CAAE,OAAO,UAAA,CAAW,MAAA,IAC3C,EAAE,MAAA,CAAO,KAAA,KAAU,aAAa,KAAA,IAChC,CAAA,CAAE,OAAO,KAAA,KAAU,YAAA,CAAa,SAChC,CAAA,CAAE,MAAA,CAAO,KAAA,KAAU,YAAA,CAAa,KAAA,EAAO;AACzC,cAAA,YAAA,GAAe,KAAA;AAAA,YACjB;AAAA,UACF;AACA,UAAA,IAAI,CAAA,CAAE,QAAA,KAAa,GAAA,IAAO,CAAA,CAAE,aAAa,IAAA,EAAM;AAC7C,YAAA,MAAA,GAAS,QAAA,CAAS,EAAA,EAAI,CAAA,EAAG,OAAO,CAAA;AAChC,YAAA,IAAI,MAAA,KAAW,CAAA,IAAK,MAAA,KAAW,EAAA,EAAI;AACjC,cAAA,OAAO,KAAA;AAAA,YACT;AAAA,UACF,CAAA,MAAA,IAAW,EAAA,CAAG,QAAA,KAAa,IAAA,IAAQ,CAAC,SAAA,CAAU,EAAA,CAAG,MAAA,EAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG;AAC5E,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AACA,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,IAAI,CAAA,CAAE,OAAO,UAAA,IAAc,CAAA,CAAE,OAAO,UAAA,CAAW,MAAA,IAC3C,EAAE,MAAA,CAAO,KAAA,KAAU,aAAa,KAAA,IAChC,CAAA,CAAE,OAAO,KAAA,KAAU,YAAA,CAAa,SAChC,CAAA,CAAE,MAAA,CAAO,KAAA,KAAU,YAAA,CAAa,KAAA,EAAO;AACzC,cAAA,YAAA,GAAe,KAAA;AAAA,YACjB;AAAA,UACF;AACA,UAAA,IAAI,CAAA,CAAE,QAAA,KAAa,GAAA,IAAO,CAAA,CAAE,aAAa,IAAA,EAAM;AAC7C,YAAA,KAAA,GAAQ,OAAA,CAAQ,EAAA,EAAI,CAAA,EAAG,OAAO,CAAA;AAC9B,YAAA,IAAI,KAAA,KAAU,CAAA,IAAK,KAAA,KAAU,EAAA,EAAI;AAC/B,cAAA,OAAO,KAAA;AAAA,YACT;AAAA,UACF,CAAA,MAAA,IAAW,EAAA,CAAG,QAAA,KAAa,IAAA,IAAQ,CAAC,SAAA,CAAU,EAAA,CAAG,MAAA,EAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG;AAC5E,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AACA,QAAA,IAAI,CAAC,CAAA,CAAE,QAAA,KAAa,EAAA,IAAM,EAAA,CAAA,IAAO,aAAa,CAAA,EAAG;AAC/C,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAKA,MAAA,IAAI,EAAA,IAAM,QAAA,IAAY,CAAC,EAAA,IAAM,aAAa,CAAA,EAAG;AAC3C,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,EAAA,IAAM,QAAA,IAAY,CAAC,EAAA,IAAM,aAAa,CAAA,EAAG;AAC3C,QAAA,OAAO,KAAA;AAAA,MACT;AAKA,MAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAGA,IAAA,IAAM,QAAA,GAAW,CAAC,CAAA,EAAG,CAAA,EAAG,OAAA,KAAY;AAClC,MAAA,IAAI,CAAC,CAAA,EAAG;AACN,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,MAAM,OAAO,OAAA,CAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAQ,OAAO,CAAA;AAChD,MAAA,OAAO,IAAA,GAAO,CAAA,GAAI,CAAA,GACd,IAAA,GAAO,CAAA,GAAI,CAAA,GACX,CAAA,CAAE,QAAA,KAAa,GAAA,IAAO,CAAA,CAAE,QAAA,KAAa,IAAA,GAAO,CAAA,GAC5C,CAAA;AAAA,IACN,CAAA;AAGA,IAAA,IAAM,OAAA,GAAU,CAAC,CAAA,EAAG,CAAA,EAAG,OAAA,KAAY;AACjC,MAAA,IAAI,CAAC,CAAA,EAAG;AACN,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,MAAM,OAAO,OAAA,CAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAQ,OAAO,CAAA;AAChD,MAAA,OAAO,IAAA,GAAO,CAAA,GAAI,CAAA,GACd,IAAA,GAAO,CAAA,GAAI,CAAA,GACX,CAAA,CAAE,QAAA,KAAa,GAAA,IAAO,CAAA,CAAE,QAAA,KAAa,IAAA,GAAO,CAAA,GAC5C,CAAA;AAAA,IACN,CAAA;AAEA,IAAA,MAAA,CAAO,OAAA,GAAU,MAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACxPjB,IAAAG,eAAAA,GAAAJ,4BAAA,CAAA;AAAA,EAAA,0CAAA,CAAAC,SAAA,EAAA,MAAA,EAAA;AAGA,IAAA,IAAM,UAAA,GAAa,UAAA,EAAA;AACnB,IAAA,IAAM,SAAA,GAAY,iBAAA,EAAA;AAClB,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,WAAA,GAAc,mBAAA,EAAA;AACpB,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AACZ,IAAA,IAAM,IAAA,GAAO,YAAA,EAAA;AACb,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,UAAA,GAAa,kBAAA,EAAA;AACnB,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,IAAM,QAAA,GAAW,gBAAA,EAAA;AACjB,IAAA,IAAM,YAAA,GAAe,qBAAA,EAAA;AACrB,IAAA,IAAM,YAAA,GAAe,qBAAA,EAAA;AACrB,IAAA,IAAM,IAAA,GAAO,YAAA,EAAA;AACb,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,EAAA,GAAK,UAAA,EAAA;AACX,IAAA,IAAM,EAAA,GAAK,UAAA,EAAA;AACX,IAAA,IAAM,EAAA,GAAK,UAAA,EAAA;AACX,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AACZ,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AACZ,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AACZ,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AACZ,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,IAAM,UAAA,GAAa,kBAAA,EAAA;AACnB,IAAA,IAAM,KAAA,GAAQ,aAAA,EAAA;AACd,IAAA,IAAM,SAAA,GAAY,iBAAA,EAAA;AAClB,IAAA,IAAM,aAAA,GAAgB,sBAAA,EAAA;AACtB,IAAA,IAAM,aAAA,GAAgB,sBAAA,EAAA;AACtB,IAAA,IAAM,aAAA,GAAgB,sBAAA,EAAA;AACtB,IAAA,IAAM,UAAA,GAAa,mBAAA,EAAA;AACnB,IAAA,IAAM,UAAA,GAAa,cAAA,EAAA;AACnB,IAAA,IAAM,OAAA,GAAU,eAAA,EAAA;AAChB,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AACZ,IAAA,IAAM,GAAA,GAAM,WAAA,EAAA;AACZ,IAAA,IAAM,UAAA,GAAa,kBAAA,EAAA;AACnB,IAAA,IAAM,aAAA,GAAgB,gBAAA,EAAA;AACtB,IAAA,IAAM,MAAA,GAAS,cAAA,EAAA;AACf,IAAA,MAAA,CAAO,OAAA,GAAU;AAAA,MACf,KAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,EAAA;AAAA,MACA,EAAA;AAAA,MACA,EAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAI,UAAA,CAAW,EAAA;AAAA,MACf,KAAK,UAAA,CAAW,GAAA;AAAA,MAChB,QAAQ,UAAA,CAAW,CAAA;AAAA,MACnB,qBAAqB,SAAA,CAAU,mBAAA;AAAA,MAC/B,eAAe,SAAA,CAAU,aAAA;AAAA,MACzB,oBAAoB,WAAA,CAAY,kBAAA;AAAA,MAChC,qBAAqB,WAAA,CAAY;AAAA,KACnC;AAAA,EAAA;AAAA,CAAA,CAAA;;;AClFO,IAAM,iBAAN,MAA2C;AAAA,EACxC,KAAA,uBAAuC,GAAA,EAAI;AAAA,EAC3C,SAAA,uBAA6B,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAKzC,QAAA,CAAS,QAAA,EAAkB,OAAA,EAAsB,QAAA,GAAmB,EAAA,EAAU;AAC5E,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACrC,IAAA,MAAM,IAAA,GAAmB;AAAA,MACvB,IAAA,EAAM,QAAA;AAAA,MACN,OAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,cAAc,KAAA,CAAM,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,CAAE,WAAY,QAAQ,CAAA;AAC/D,IAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG,IAAI,CAAA;AAAA,IACnC;AAEA,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iBAAA,EAAoB,QAAQ,CAAA,YAAA,EAAe,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,QAAA,EAAkB,IAAA,EAAW,OAAA,EAA6B;AACtE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,EAAG;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAgC,QAAQ,CAAA,CAAE,CAAA;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,MAAA,GAAS,IAAA;AACb,MAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,MAAA,MAAM,WAAA,GAA2B;AAAA,QAC/B,MAAA,EAAQ,EAAA;AAAA;AAAA,QACR,OAAA,EAAS,WAAW,EAAC;AAAA,QACrB,QAAQ,MAAM;AAAE,UAAA,SAAA,GAAY,IAAA;AAAA,QAAK;AAAA,OACnC;AAEA,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAE,CAAA;AACrD,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,MAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,YAAA,EAAe,IAAA,CAAK,QAAQ,CAAA,CAAA,CAAG,CAAA;AACxE,UAAA,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,WAAW,CAAA;AAAA,QACjD,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uBAAA,EAA0B,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA;AAEzD,UAAA,IAAI,iBAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AAChE,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,UAAkB,OAAA,EAA4B;AACvD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,QAAQ,KAAA,CAAM,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,OAAO,CAAA;AACxD,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAChD;AAGA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,QAAQ,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,QAAA,EAAgC;AACvC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,KAAK,EAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAyB;AACvB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAyD;AACvD,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,QAAA,EAAU,QAAQ,CAAA,MAAO;AAAA,MACrE,QAAA;AAAA,MACA,cAAc,QAAA,CAAS;AAAA,KACzB,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,WAAA,EAAuC;AACjD,IAAA,OAAO,IAAI,iBAAiB,IAAI,CAAA;AAAA,EAClC;AACF;AAKO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,YACU,MAAA,EACR;AADQ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACP;AAAA,EAJK,kBAAgE,EAAC;AAAA;AAAA;AAAA;AAAA,EASzE,QAAA,CAAS,QAAA,EAAkB,OAAA,EAAsB,QAAA,EAAyB;AACxE,IAAA,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA;AAChD,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,EAAE,QAAA,EAAU,SAAS,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,QAAA,EAAkB,IAAA,EAAW,OAAA,EAA6B;AACtE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAU,MAAM,OAAO,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,UAAkB,OAAA,EAA4B;AACvD,IAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU,OAAO,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAK,eAAA,CAAgB,SAAA;AAAA,MACjC,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,KAAa,QAAA,IAAY,EAAE,OAAA,KAAY;AAAA,KAChD;AACA,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,KAAA,MAAW,EAAE,QAAA,EAAU,OAAA,EAAQ,IAAK,KAAK,eAAA,EAAiB;AACxD,MAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU,OAAO,CAAA;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,gBAAgB,MAAA,GAAS,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAAmE;AACjE,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA;AAAA,EACjC;AACF;AAKO,IAAM,YAAN,MAAgB;AAAA;AAAA;AAAA;AAAA,EAIrB,OAAO,cAAA,CAAe,SAAA,EAAmB,KAAA,EAAuB;AAC9D,IAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cAAc,QAAA,EAAwD;AAC3E,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAAA,MACvB,OAAO,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK;AAAA,KACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,oBAAA,CACL,UAAA,EACA,UAAA,EACA,SAAA,EACA;AACA,IAAA,OAAO,OAAO,GAAQ,IAAA,KAAc;AAClC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,aAAa,EAAE,OAAA,EAAS,CAAA,CAAE,GAAA,EAAK,SAAS,CAAA,EAAE;AAChD,QAAA,MAAM,UAAA,CAAW,OAAA,CAAQ,UAAA,EAAY,UAAU,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,IAAA,EAAK;AAEX,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,SAAA,GAAY,EAAE,OAAA,EAAS,CAAA,CAAE,KAAK,QAAA,EAAU,CAAA,CAAE,GAAA,EAAK,OAAA,EAAS,CAAA,EAAE;AAChE,QAAA,MAAM,UAAA,CAAW,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAA,CAAS,OAAA,EAAsB,KAAA,EAA4B;AAChE,IAAA,IAAI,SAAA;AAEJ,IAAA,OAAO,OAAO,MAAW,OAAA,KAAyB;AAChD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,CAAa,SAAS,CAAA;AAAA,MACxB;AAEA,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,QAAA,SAAA,GAAY,WAAW,YAAY;AACjC,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AAC1C,YAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,UAChB,SAAS,KAAA,EAAO;AACd,YAAA,MAAA,CAAO,KAAK,CAAA;AAAA,UACd;AAAA,QACF,GAAG,KAAK,CAAA;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAA,CAAS,OAAA,EAAsB,KAAA,EAA4B;AAChE,IAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,IAAA,OAAO,OAAO,MAAW,OAAA,KAAyB;AAChD,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,IAAI,GAAA,GAAM,iBAAiB,KAAA,EAAO;AAChC,QAAA,aAAA,GAAgB,GAAA;AAChB,QAAA,OAAO,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,MAC9B;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,EACF;AACF;;;ACxRA,IAAA,aAAA,GAAmBI,yBAAA,CAAA,eAAA,EAAA,EAAA,CAAA,CAAA;AAGnB,IAAM,kBAAA,GAAqBH,MAAE,MAAA,CAAO;AAAA,EAClC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,OAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,GAAQ,QAAA,EAAS;AAAA,EACnC,KAAKA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA;AACxB,CAAC,CAAA;AAED,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EAClC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,OAAA,EAASA,MAAE,GAAA,EAAI;AAAA;AAAA,EACf,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,YAAA,EAAcA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACnC,OAAOA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACpC,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACvB,CAAC,CAAA;AAED,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EACtC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,OAAA,EAASA,MAAE,QAAA,EAAS;AAAA,EACpB,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAQA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,MAAA,EAAQA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACtB,CAAC,CAAA;AAED,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACjC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC3B,MAAA,EAAQA,MAAE,GAAA,EAAI;AAAA;AAAA,EACd,UAAA,EAAYA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA;AAAA,EAC9B,aAAA,EAAeA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,CAAO;AAAA,IAC9B,MAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,WAAA,EAAa,YAAY,CAAC,CAAA;AAAA,IACpD,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,IACjB,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAChC,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAChC,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACb,cAAA,EAAgBA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAC9B,CAAC,CAAA;AAED,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EACnC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,cAAA,EAAgBA,MAAE,GAAA,EAAI;AAAA,EACtB,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,cAAcA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC3C,SAAA,EAAWA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACzB,CAAC,CAAA;AAED,IAAM,qBAAA,GAAwBA,MAAE,MAAA,CAAO;AAAA,EACrC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC3B,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,aAAaA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC1C,QAAA,EAAUA,MAAE,MAAA,CAAO;AAAA,IACjB,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,IAChB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,IACf,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC5B,aAAaA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IAC1C,MAAA,EAAQA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAC9B,EAAE,QAAA,EAAS;AAAA,EACZ,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACnB,CAAC,CAAA;AAED,IAAM,qBAAA,GAAwBA,MAAE,MAAA,CAAO;AAAA,EACrC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,QAAA,EAAUA,MAAE,QAAA,EAAS;AAAA,EACrB,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,WAAA,EAAaA,KAAA,CAAE,GAAA,EAAI,CAAE,QAAA;AAAS;AAChC,CAAC,CAAA;AAED,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EAChC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,OAAA,EAASA,MAAE,QAAA,EAAS;AAAA,EACpB,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC1B,CAAC,CAAA;AAED,IAAM,YAAA,GAAeA,MAAE,MAAA,CAAO;AAAA,EAC5B,IAAA,EAAMA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,KAAA,CAAM,cAAA,EAAgB,4CAA4C,CAAA;AAAA,EAC1F,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,aAAA,CAAAI,OAAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,8BAA8B,CAAA;AAAA,EAC/E,WAAA,EAAaJ,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,MAAA,EAAQ,mBAAmB,QAAA,EAAS;AAAA,EACpC,cAAcA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC3C,aAAA,EAAeA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAG7B,MAAA,EAAQA,KAAA,CAAE,KAAA,CAAM,kBAAkB,EAAE,QAAA,EAAS;AAAA,EAC7C,UAAA,EAAYA,KAAA,CAAE,KAAA,CAAM,sBAAsB,EAAE,QAAA,EAAS;AAAA,EACrD,MAAA,EAAQA,KAAA,CAAE,KAAA,CAAM,iBAAiB,EAAE,QAAA,EAAS;AAAA,EAC5C,QAAA,EAAUA,KAAA,CAAE,KAAA,CAAM,mBAAmB,EAAE,QAAA,EAAS;AAAA,EAChD,UAAA,EAAYA,KAAA,CAAE,KAAA,CAAM,qBAAqB,EAAE,QAAA,EAAS;AAAA,EACpD,eAAA,EAAiBA,KAAA,CAAE,KAAA,CAAM,qBAAqB,EAAE,QAAA,EAAS;AAAA,EACzD,SAAA,EAAWA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,CAAO;AAAA,IAC1B,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,IAChB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,IACf,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC5B,aAAaA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IAC1C,MAAA,EAAQA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAC9B,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACb,KAAA,EAAOA,KAAA,CAAE,KAAA,CAAM,gBAAgB,EAAE,QAAA,EAAS;AAAA;AAAA,EAG1C,OAAA,EAASA,KAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,EAC/B,SAAA,EAAWA,KAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,EACjC,QAAA,EAAUA,KAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,EAChC,UAAA,EAAYA,KAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,EAClC,SAAA,EAAWA,KAAA,CAAE,QAAA,EAAS,CAAE,QAAA;AAC1B,CAAC,CAAA;AAEM,IAAM,eAAA,GAAN,MAAM,gBAAA,CAA4C;AAAA,EACvD,OAAwB,cAAA,GAAiB;AAAA,IACvC,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS,KAAA;AAAA,IAAO,MAAA;AAAA,IAAQ,SAAA;AAAA,IAAW,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS;AAAA,GACzE;AAAA,EAEA,OAAwB,cAAA,GAAiB;AAAA,IACvC,QAAA;AAAA,IAAU,MAAA;AAAA,IAAQ,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU;AAAA,GAChD;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAA,EAAwC;AAC/C,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,SAAA,CAAU,MAAM,CAAA;AAC5C,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,GAAA,KAAa;AACxC,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,QACrD,CAAC,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,gBAAA,CAAgB,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,EAAG;AACxD,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,MAAA,CAAO,IAAI,CAAA,aAAA,CAAe,CAAA;AAAA,MACxD;AAGA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,UAAA,IAAI,gBAAA,CAAgB,eAAe,IAAA,CAAK,CAAA,IAAA,KAAQ,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA,EAAG;AAC5E,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,KAAA,CAAM,IAAI,CAAA,qCAAA,CAAuC,CAAA;AAAA,UAC9E;AAEA,UAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/B,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,KAAA,CAAM,IAAI,CAAA,mBAAA,CAAqB,CAAA;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,QAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AAEnC,QAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AAEjC,UAAA,IAAI,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAC9B,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,sBAAA,EAAyB,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,UACnD;AACA,UAAA,UAAA,CAAW,GAAA,CAAI,MAAM,IAAI,CAAA;AAGzB,UAAA,IAAI,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACnC,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,sBAAA,EAAyB,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAAA,UACxD;AACA,UAAA,UAAA,CAAW,GAAA,CAAI,MAAM,SAAS,CAAA;AAG9B,UAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG;AAC9C,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,2BAAA,EAA8B,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAAA,UAC7D;AAGA,UAAA,MAAM,eAAe,CAAC,OAAA,EAAS,eAAe,SAAA,EAAW,kBAAA,EAAoB,SAAS,YAAY,CAAA;AAClG,UAAA,IAAI,YAAA,CAAa,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,EAAG;AAC1C,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,KAAA,CAAM,SAAS,CAAA,6BAAA,CAA+B,CAAA;AAAA,UAC3E;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,OAAO,QAAA,EAAU;AACnB,QAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AAErC,QAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,UAAA,IAAI,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,EAAG;AAClC,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAA2B,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,UACvD;AACA,UAAA,YAAA,CAAa,GAAA,CAAI,QAAQ,IAAI,CAAA;AAG7B,UAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAS,KAAK,CAAA;AACzD,UAAA,IAAI,cAAA,CAAe,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzC,YAAA,QAAA,CAAS,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,IAAI,CAAA,+BAAA,CAAiC,CAAA;AAAA,UAC9E;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,QAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,UAAA,EAAY;AACpC,UAAA,IAAI,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5B,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,2BAAA,EAA8B,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,UACvD;AACA,UAAA,SAAA,CAAU,GAAA,CAAI,KAAK,IAAI,CAAA;AAEvB,UAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAC9B,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAI,CAAA,mBAAA,CAAqB,CAAA;AAAA,UAChE;AAGA,UAAA,MAAM,cAAc,CAAC,GAAA,EAAK,gBAAgB,UAAA,EAAY,QAAA,EAAU,UAAU,WAAW,CAAA;AACrF,UAAA,IAAI,WAAA,CAAY,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAI,CAAA,4BAAA,CAA8B,CAAA;AAAA,UACzE;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,QAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AAEvC,QAAA,KAAA,MAAW,SAAA,IAAa,OAAO,eAAA,EAAiB;AAC9C,UAAA,IAAI,cAAA,CAAe,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AACtC,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,0BAAA,EAA6B,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AAAA,UAC3D;AACA,UAAA,cAAA,CAAe,GAAA,CAAI,UAAU,IAAI,CAAA;AAGjC,UAAA,MAAM,mBAAmB,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,cAAc,YAAY,CAAA;AAC9E,UAAA,IAAI,gBAAA,CAAiB,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA,EAAG;AAC7C,YAAA,QAAA,CAAS,IAAA,CAAK,CAAA,gBAAA,EAAmB,SAAA,CAAU,IAAI,CAAA,iCAAA,CAAmC,CAAA;AAAA,UACpF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,UAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,YAAA,QAAA,CAAS,IAAA,CAAK,CAAA,WAAA,EAAc,IAAA,CAAK,IAAI,CAAA,iDAAA,CAAmD,CAAA;AAAA,UAC1F;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,YAAA,EAAc,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,EAAG;AAC9C,QAAA,MAAA,CAAO,KAAK,CAAA,8BAAA,CAAgC,CAAA;AAAA,MAC9C;AAGA,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAM,gBAAgB,CAAC,KAAA,EAAO,YAAA,EAAc,SAAA,EAAW,gBAAgB,KAAK,CAAA;AAC5E,QAAA,IAAI,CAAC,aAAA,CAAc,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA,EAAG;AAC3C,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,SAAA,EAAY,MAAA,CAAO,OAAO,CAAA,iCAAA,CAAmC,CAAA;AAAA,QAC7E;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AACrD,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,eAAA,EAAkB,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,6CAAA,CAA+C,CAAA;AAAA,MACzG;AAEA,MAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,SAAS,EAAA,EAAI;AAC5C,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,eAAA,EAAkB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,iCAAA,CAAmC,CAAA;AAAA,MACxF;AAAA,IAEF,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA,CAAK,qBAAqB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3F;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CAAqB,QAAgB,QAAA,EAAkD;AACrF,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,IAAI,CAAC,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,YAAA,CAAa,WAAW,CAAA,EAAG;AAC5D,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAS;AAAA,IACzC;AAGA,IAAA,KAAA,MAAW,OAAA,IAAW,OAAO,YAAA,EAAc;AACzC,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,OAAO,CAAA,mBAAA,CAAqB,CAAA;AACvD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAGvC,MAAA,IAAI,UAAA,CAAW,aAAA,IAAiB,MAAA,CAAO,aAAA,EAAe;AACpD,QAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,WAAW,aAAA,EAAe,MAAA,CAAO,aAAa,CAAA,EAAG;AACtE,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,+CAAA,EAAkD,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,QAC5E;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,IAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,KAA0B;AAC/C,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,IAAA;AAC/B,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,KAAA;AAE9B,MAAA,QAAA,CAAS,IAAI,IAAI,CAAA;AAEjB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACjC,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,KAAA,MAAW,OAAA,IAAW,QAAQ,YAAA,EAAc;AAC1C,UAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1B,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,8BAAA,EAAiC,IAAI,CAAA,IAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AACjE,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,OAAO,IAAI,CAAA;AACpB,MAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAEA,IAAA,aAAA,CAAc,OAAO,IAAI,CAAA;AAEzB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,CAAsB,QAAgB,YAAA,EAA8C;AAClF,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,IAAI,CAAC,OAAO,aAAA,EAAe;AACzB,MAAA,QAAA,CAAS,KAAK,+CAA+C,CAAA;AAC7D,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAS;AAAA,IACzC;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,aAAA,CAAAI,OAAAA,CAAO,UAAU,YAAA,EAAc,MAAA,CAAO,aAAa,CAAA,EAAG;AACzD,QAAA,MAAA,CAAO,KAAK,CAAA,wBAAA,EAA2B,MAAA,CAAO,aAAa,CAAA,yBAAA,EAA4B,YAAY,CAAA,CAAE,CAAA;AAAA,MACvG;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,sCAAA,EAAyC,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AAAA,IAC7E;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CAAa,UAAkB,QAAA,EAA2B;AAChE,IAAA,IAAI;AAEF,MAAA,OAAO,aAAA,CAAAA,OAAAA,CAAO,UAAA,CAAW,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC7C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAAA,EAAwC;AACvD,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,WAAqB,EAAC;AAG5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGxC,IAAA,IAAI,WAAW,QAAA,CAAS,OAAO,KAAK,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG;AACpE,MAAA,MAAA,CAAO,KAAK,+DAA+D,CAAA;AAAA,IAC7E;AAGA,IAAA,IAAI,WAAW,QAAA,CAAS,KAAK,KAAK,UAAA,CAAW,QAAA,CAAS,UAAU,CAAA,EAAG;AACjE,MAAA,QAAA,CAAS,KAAK,6EAA6E,CAAA;AAAA,IAC7F;AAGA,IAAA,IAAI,WAAW,QAAA,CAAS,QAAQ,KAAK,UAAA,CAAW,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAC1E,MAAA,QAAA,CAAS,KAAK,6EAA6E,CAAA;AAAA,IAC7F;AAGA,IAAA,MAAM,oBAAoB,CAAC,UAAA,EAAY,QAAA,EAAU,KAAA,EAAO,SAAS,YAAY,CAAA;AAC7E,IAAA,KAAA,MAAW,WAAW,iBAAA,EAAmB;AACvC,MAAA,IAAI,UAAA,CAAW,WAAA,EAAY,CAAE,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9C,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,sBAAA,EAAyB,OAAO,CAAA,6CAAA,CAA+C,CAAA;AAAA,MAC/F;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;AC7aO,IAAM,qBAAN,MAAmD;AAAA,EAChD,OAAA,uBAAmC,GAAA,EAAI;AAAA,EACvC,OAAA,uBAAyC,GAAA,EAAI;AAAA,EAC7C,QAAA,uBAA0C,GAAA,EAAI;AAAA,EAC9C,SAAA;AAAA,EAER,YAAY,SAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA,IAAa,IAAI,eAAA,EAAgB;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,EAAkC;AACpC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAmB;AACjB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA,EAAO,CAAE,MAAA,CAAO,CAAA,MAAA,KAAU;AACpC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,IAAI,CAAA;AAC5C,MAAA,OAAO,QAAQ,MAAA,KAAW,IAAA;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,MAAA,EAA+B;AAC5C,IAAA,OAAA,CAAQ,KAAK,CAAA,oBAAA,EAAuB,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAGpE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA;AACjD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAChG;AAGA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACjC,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,IAAI,CAAA;AACnD,MAAA,IAAI,cAAA,CAAe,OAAA,KAAY,MAAA,CAAO,OAAA,EAAS;AAC7C,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,CAAA,oCAAA,EAAuC,eAAe,OAAO,CAAA,iBAAA,EAAoB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,MACrI;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,oBAAA,CAAqB,QAAQ,IAAI,CAAA;AACtE,IAAA,IAAI,CAAC,cAAc,KAAA,EAAO;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9G;AAGA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAGpC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM;AAAA,MAC7B,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAA,EAAQ,KAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,KAAA;AAAA,MACX,QAAQ;AAAC,KACV,CAAA;AAED,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmC,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAA,EAA6B;AAC5C,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAE,CAAA;AAE5C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAC1C,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,IAAI,aAAa,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,aAAA,CAAe,CAAA;AAAA,IAC5F;AAGA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxB,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxB,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,IAAI,CAAA;AAEzB,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,EAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAAA,EAA6B;AAC1C,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,CAAA;AAEzC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACrC,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,kBAAA,CAAoB,CAAA;AAC/C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,OAAO,YAAA,EAAc;AACvB,QAAA,KAAA,MAAW,OAAA,IAAW,OAAO,YAAA,EAAc;AACzC,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAC3C,UAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,YAAA,MAAM,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,aAAa,IAAA,EAAM;AAAA,QACtB,MAAA,EAAQ,IAAA;AAAA,QACR,SAAA,EAAW,KAAA;AAAA,QACX,QAAQ;AAAC,OACV,CAAA;AAED,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC1C,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,IAAA,CAAK,aAAa,IAAA,EAAM;AAAA,QACtB,MAAA,EAAQ,KAAA;AAAA,QACR,SAAA,EAAW,IAAA;AAAA,QACX,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,QACrB,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,IAAI,CAAA,EAAA,EAAK,YAAY,CAAA,CAAE,CAAA;AAAA,IACtE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAA,EAA6B;AAC5C,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAE3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,cAAA,CAAgB,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAC1C,MAAA,KAAA,MAAW,WAAW,UAAA,EAAY;AAChC,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAC3C,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,MAAM,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,QAC/B;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,aAAa,IAAA,EAAM;AAAA,QACtB,MAAA,EAAQ,KAAA;AAAA,QACR,SAAA,EAAW,KAAA;AAAA,QACX,QAAQ;AAAC,OACV,CAAA;AAED,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC5C,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,IAAA,CAAK,aAAa,IAAA,EAAM;AAAA,QACtB,SAAA,EAAW,IAAA;AAAA,QACX,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,QACrB,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAI,CAAA,EAAA,EAAK,YAAY,CAAA,CAAE,CAAA;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAAwC;AAChD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,MAAc,MAAA,EAA4B;AAClD,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,IAAA,EAAM;AAAA,MACrB,GAAG,MAAA;AAAA,MACH,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAAwC;AAChD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAA4C;AAC1C,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CAAa,MAAc,OAAA,EAAsC;AACvE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,QAAA,CAAS,IAAI,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,GAAG,SAAS,CAAA;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,IAAA,EAAwB;AAC5C,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AAC/C,MAAA,IAAI,MAAA,CAAO,YAAA,EAAc,QAAA,CAAS,IAAI,CAAA,EAAG;AACvC,QAAA,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA4C;AAC1C,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AAExC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AACzC,MAAA,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,YAAA,IAAgB,EAAE,CAAA;AAAA,IAC3C;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAA6B;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAK,kBAAA,EAAmB;AACtC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAuB;AACpC,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+CAAA,EAAkD,IAAI,CAAA,CAAE,CAAA;AAAA,MAC1E;AAEA,MAAA,QAAA,CAAS,IAAI,IAAI,CAAA;AAEjB,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,GAAA,CAAI,IAAI,KAAK,EAAC;AACzC,MAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,QAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,UAAA,MAAM,IAAI,MAAM,CAAA,OAAA,EAAU,IAAI,eAAe,GAAG,CAAA,MAAA,EAAS,GAAG,CAAA,kBAAA,CAAoB,CAAA;AAAA,QAClF;AACA,QAAA,KAAA,CAAM,GAAG,CAAA;AAAA,MACX;AAEA,MAAA,QAAA,CAAS,OAAO,IAAI,CAAA;AACpB,MAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,EAAK,EAAG;AAC/B,MAAA,KAAA,CAAM,IAAI,CAAA;AAAA,IACZ;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA4C;AAC1C,IAAA,MAAM,UAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AACzC,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAG,MAAA;AAAA,QACH;AAAA,OACkC,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAA2C;AACtD,IAAA,KAAA,MAAW,YAAA,IAAgB,OAAO,OAAA,EAAS;AACzC,MAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,QAAA,MAAM,EAAE,IAAA,EAAM,GAAG,IAAA,EAAK,GAAI,YAAA;AAC1B,QAAA,IAAA,CAAK,SAAA,CAAU,MAAM,IAAI,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAKE;AACA,IAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAElD,IAAA,OAAO;AAAA,MACL,OAAO,QAAA,CAAS,MAAA;AAAA,MAChB,QAAQ,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAAA,MACvC,UAAU,QAAA,CAAS,MAAA,CAAO,OAAK,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAAA,MAC1C,YAAY,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE;AAAA,KAChD;AAAA,EACF;AACF;ACvWO,IAAM,gBAAN,MAA8C;AAAA,EACnC,QAAA;AAAA,EACA,KAAA;AAAA,EACR,SAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,uBAAiD,GAAA,EAAI;AAAA,EACrD,YAAA,uBAAsC,GAAA,EAAI;AAAA,EAElD,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,eAAA,EAAgB;AACrC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA;AACrD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,cAAA,EAAe;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAAuC;AACtD,IAAA,OAAA,CAAQ,KAAK,+BAA+B,CAAA;AAE5C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAGf,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQC,uBAAA,CAAM,QAAA,EAAU;AAAA,MACvC,aAAA,EAAe,IAAA;AAAA,MACf;AAAA,KACD,CAAA;AAED,IAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAAwC;AACxD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,QAAA,EAAW,OAAA,CAAQ,MAAM,CAAA,WAAA,CAAa,CAAA;AAGnD,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,OAAO,OAAO,CAAA;AAE9D,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,MAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AACzC,MAAA;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,MAAA,IAAI;AAGF,QAAA,OAAA,CAAQ,KAAK,CAAA,8BAAA,EAAiC,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAE,CAAA;AAGtE,QAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,UAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,MAAA,CAAO,IAAA,EAAgB,MAAM,CAAA;AAAA,QACvD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,MAC7D;AAAA,IACF;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,gBAAA,EAAiB;AACjD,MAAA,OAAA,CAAQ,KAAK,CAAA,mBAAA,EAAsB,SAAA,CAAU,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,CAAA;AAG3D,MAAA,KAAA,MAAW,cAAc,SAAA,EAAW;AAClC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,UAAU,CAAA;AACjD,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAA,CAAQ,KAAK,0BAA0B,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,MAAA,EAAgB,MAAA,EAAsC;AAClE,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAEhD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA;AACjD,MAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,QAAA,MAAM,IAAI,MAAM,CAAA,0BAAA,EAA6B,UAAA,CAAW,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAC7E;AAGA,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA;AAGnC,MAAA,MAAM,YAAA,GAA6B;AAAA,QACjC,OAAA,EAAS,IAAA;AAAA,QACT,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,QACtB,GAAG;AAAA,OACL;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,MAAA,CAAO,IAAA,EAAM,YAAY,CAAA;AAGjD,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,WAAA,GAC5B,IAAA,CAAK,MAAyB,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,GACtD,IAAA,CAAK,KAAA;AAEP,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,WAA+B,CAAA;AAGjE,MAAA,MAAM,aAAA,GAA+B;AAAA,QACnC,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,MAAA,EAAQ,YAAA;AAAA,QACR,KAAA,EAAO,WAAA;AAAA,QACP,MAAA,EAAQ,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,IAAI;AAAA,OACvC;AAGA,MAAA,MAAM,IAAA,CAAK,wBAAA,CAAyB,MAAA,EAAQ,aAAa,CAAA;AAGzD,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAM,MAAA,CAAO,QAAQ,aAAa,CAAA;AAAA,MACpC;AAGA,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQA,uBAAA,CAAM,cAAA,EAAgB;AAAA,QAC7C,QAAQ,MAAA,CAAO,IAAA;AAAA,QACf,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,IAC9D,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yBAAA,EAA4B,MAAA,CAAO,IAAI,KAAK,YAAY,CAAA;AAGtE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,OAAO,IAAI,CAAA;AAClD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,IAAA,EAAM;AAAA,UACnC,SAAA,EAAW,IAAA;AAAA,UACX,QAAQ,CAAC,GAAI,OAAO,MAAA,IAAU,IAAK,YAAY,CAAA;AAAA,UAC/C,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,IAAA,EAA6B;AAC3C,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAE3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AAC3C,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAAA,MACrC;AAGA,MAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA,IAAK,EAAE,SAAS,KAAA,EAAM;AACjE,MAAA,MAAM,aAAA,GAA+B;AAAA,QACnC,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,KAAK,IAAA,CAAK,KAAA;AAAA,QAC1C,MAAA,EAAQ,IAAA,CAAK,YAAA,CAAa,IAAI;AAAA,OAChC;AAGA,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,MAAM,MAAA,CAAO,UAAU,aAAa,CAAA;AAAA,MACtC;AAGA,MAAA,MAAM,IAAA,CAAK,2BAA2B,MAAM,CAAA;AAG5C,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC7C,MAAA,IAAI,WAAA,IAAe,mBAAmB,WAAA,EAAa;AACjD,QAAA,WAAA,CAAY,aAAA,EAAc;AAAA,MAC5B;AACA,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,IAAI,CAAA;AAG5B,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,IAAI,CAAA;AAG7B,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQA,uBAAA,CAAM,gBAAA,EAAkB;AAAA,QAC/C,MAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AAGD,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAEnC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iCAAA,EAAoC,IAAI,CAAA,CAAE,CAAA;AAAA,IACzD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAA,CAAA,EAAK,YAAY,CAAA;AACjE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAA4B;AACpC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AAC3C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,MAAA,EAAQ,KAAA;AAAA,QACR,SAAA,EAAW,KAAA;AAAA,QACX,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAiC;AAC/B,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,SAAS,cAAA,EAAe,CAAE,QAAQ,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,wBAAA,CAAyB,MAAA,EAAgB,QAAA,EAAwC;AAE7F,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,MAAM,SAAA,GAAY,IAAIC,SAAA,EAAK;AAE3B,MAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6B,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AACvD,QAAA,SAAA,CAAU,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,OAAO,CAAA;AAAA,MAC3C;AAEA,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,SAAS,CAAA;AAAA,IAC9C;AAGA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,KAAA,MAAW,UAAA,IAAc,OAAO,UAAA,EAAY;AAC1C,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,UAAA,CAAW,IAAI,CAAA,CAAE,CAAA;AAAA,MAEnE;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAO,IAAI,CAAA;AACpD,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yBAAA,EAA4B,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACrD,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,WAAA,CAAY,SAAS,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,OAAA,EAAS,KAAK,QAAQ,CAAA;AAAA,QAC7D,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAM,QAAA,CAAS,IAAA,CAAK,MAAM,IAAA,CAAK,OAAA,EAAS,KAAK,QAAQ,CAAA;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAA+B,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,MAE7D;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6B,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,MAEzD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,2BAA2B,MAAA,EAA+B;AAEtE,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qCAAA,EAAwC,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CAAmB,MAAc,OAAA,EAAsC;AAC7E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AAC5C,IAAA,IAAI,OAAA,IAAW,cAAA,IAAkB,IAAA,CAAK,QAAA,EAAU;AAE9C,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,UAAA,EAAkC;AACrD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAC,OAAA,EAAiB,IAAA,KAAe;AACtC,QAAA,OAAA,CAAQ,MAAM,CAAA,QAAA,EAAW,UAAU,KAAK,OAAO,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,MAC/D,CAAA;AAAA,MACA,IAAA,EAAM,CAAC,OAAA,EAAiB,IAAA,KAAe;AACrC,QAAA,OAAA,CAAQ,KAAK,CAAA,QAAA,EAAW,UAAU,KAAK,OAAO,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,MAC9D,CAAA;AAAA,MACA,IAAA,EAAM,CAAC,OAAA,EAAiB,IAAA,KAAe;AACrC,QAAA,OAAA,CAAQ,KAAK,CAAA,QAAA,EAAW,UAAU,KAAK,OAAO,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,MAC9D,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,OAAA,EAAiB,KAAA,EAAe,IAAA,KAAe;AACrD,QAAA,OAAA,CAAQ,KAAA,CAAM,WAAW,UAAU,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,KAAA,IAAS,EAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,MAC5E;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAqC;AACnC,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAAgG;AAC9F,IAAA,MAAM,aAAuF,EAAC;AAE9F,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,QAAA,CAAS,SAAA,EAAU,EAAG;AAC9C,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,KAAA,MAAW,EAAA,IAAM,OAAO,UAAA,EAAY;AAClC,UAAA,UAAA,CAAW,IAAA,CAAK;AAAA,YACd,MAAM,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA,CAAA;AAAA,YAC/B,SAAS,EAAA,CAAG,OAAA;AAAA,YACZ,QAAA,EAAU,GAAG,QAAA,IAAY,EAAA;AAAA,YACzB,MAAA,EAAQ,GAAG,MAAA,IAAU;AAAA,WACtB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,OAAO,UAAA,CAAW,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAC9B,IAAA,OAAA,CAAQ,KAAK,gCAAgC,CAAA;AAG7C,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQD,uBAAA,CAAM,YAAA,EAAc;AAAA,MAC3C,aAAA,EAAe;AAAA,KAChB,CAAA;AAGD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,QAAA,CAAS,SAAA,EAAU;AAC9C,IAAA,KAAA,MAAW,MAAA,IAAU,aAAA,CAAc,OAAA,EAAQ,EAAG;AAC5C,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AAAA,MAC5C,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6B,MAAA,CAAO,IAAI,KAAK,KAAK,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,KAAK,kCAAkC,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAKE;AACA,IAAA,OAAO;AAAA,MACL,QAAA,EAAW,IAAA,CAAK,QAAA,CAAgC,QAAA,EAAS;AAAA,MACzD,KAAA,EAAQ,IAAA,CAAK,KAAA,CAAyB,QAAA,EAAS;AAAA,MAC/C,MAAA,EAAQ,KAAK,YAAA,CAAa,IAAA;AAAA,MAC1B,UAAA,EAAY,IAAA,CAAK,mBAAA,EAAoB,CAAE;AAAA,KACzC;AAAA,EACF;AACF;;;ACvZA,eAAsB,eAAA,CAAgB,GAAY,IAAA,EAAY;AAC5D,EAAA,MAAM,KAAK,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,IAAM,EAAU,GAAA,EAAK,EAAA;AAE1C,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAA,CAAQ,MAAM,8CAA8C,CAAA;AAC5D,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,wBAAA,IAA4B,GAAG,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,gBAAA,GAAmB,IAAIE,kCAAA,CAAiB,EAAE,CAAA;AAGhD,EAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB,SAAA,EAAU;AAEnD,EAAA,IAAI,CAAC,SAAA,EAAW;AAEd,IAAA,OAAO,IAAA,EAAK;AAAA,EACd;AAGA,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,IAAA;AAEJ,EAAA,IAAI,CAAA,CAAE,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AAC3B,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,cAAc,CAAA,IAAK,EAAA;AAEpD,IAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC5C,MAAA,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AACxB,MAAA,KAAA,GAAQ,IAAA,CAAK,uBAAuB,CAAA,IAAK,IAAA,CAAK,iBAAiB,CAAA;AAE/D,MAAA,CAAA,CAAE,GAAA,CAAI,eAAe,IAAI,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,YAAY,QAAA,CAAS,mCAAmC,KAAK,WAAA,CAAY,QAAA,CAAS,qBAAqB,CAAA,EAAG;AACnH,MAAA,MAAM,QAAA,GAAW,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,EAAS;AACtC,MAAA,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,uBAAuB,CAAA,EAAG,QAAA,MAAc,QAAA,CAAS,GAAA,CAAI,iBAAiB,CAAA,EAAG,QAAA,EAAS;AAAA,IACzG;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,yBAAA;AAAA,MACP,OAAA,EAAS;AAAA,OACR,GAAG,CAAA;AAAA,EACR;AAGA,EAAA,MAAM,QAAA,GAAW,EAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,CAAA,IAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA;AACnF,EAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,WAAA,CAAY,OAAO,QAAQ,CAAA;AAEjE,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,+BAAA;AAAA,MACP,OAAA,EAAS,OAAO,KAAA,IAAS;AAAA,OACxB,GAAG,CAAA;AAAA,EACR;AAGA,EAAA,OAAO,IAAA,EAAK;AACd;AAKO,SAAS,0BAA0B,OAAA,EAGvC;AACD,EAAA,OAAO,OAAO,GAAY,IAAA,KAAe;AACvC,IAAA,MAAM,KAAK,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,IAAM,EAAU,GAAA,EAAK,EAAA;AAE1C,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,OAAO,OAAA,EAAS,OAAA,GAAU,CAAA,EAAG,wBAAwB,CAAA,IACnD,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,wBAAA,EAAyB,EAAG,GAAG,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,gBAAA,GAAmB,IAAIA,kCAAA,CAAiB,EAAE,CAAA;AAChD,IAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB,SAAA,EAAU;AAEnD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,IAAI,KAAA;AACJ,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,cAAc,CAAA,IAAK,EAAA;AAEpD,IAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,KAAA,GAAQ,IAAA,CAAK,uBAAuB,CAAA,IAAK,IAAA,CAAK,iBAAiB,CAAA;AAE/D,MAAA,CAAA,CAAE,GAAA,CAAI,eAAe,IAAI,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,YAAY,QAAA,CAAS,mCAAmC,KAAK,WAAA,CAAY,QAAA,CAAS,qBAAqB,CAAA,EAAG;AACnH,MAAA,MAAM,QAAA,GAAW,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,EAAS;AACtC,MAAA,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,uBAAuB,CAAA,EAAG,QAAA,MAAc,QAAA,CAAS,GAAA,CAAI,iBAAiB,CAAA,EAAG,QAAA,EAAS;AAAA,IACzG;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,OAAA,EAAS,SAAA,GAAY,CAAC,CAAA,IAC3B,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,QAAA,GAAW,EAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,CAAA,IAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA;AACnF,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,WAAA,CAAY,OAAO,QAAQ,CAAA;AAEjE,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO,SAAS,OAAA,GAAU,CAAA,EAAG,MAAA,CAAO,KAAA,IAAS,qBAAqB,CAAA,IAChE,CAAA,CAAE,IAAA,CAAK,EAAE,OAAO,+BAAA,EAAiC,OAAA,EAAS,MAAA,CAAO,KAAA,IAAS,GAAG,CAAA;AAAA,IACjF;AAEA,IAAA,OAAO,IAAA,EAAK;AAAA,EACd,CAAA;AACF;;;AClG+B,IAAIC,+BAAA,CAAc;AAAA,EAC/C,MAAMC,kCAAA,CAAS,IAAA;AAAA,EACf,SAASA,kCAAA,CAAS,OAAA;AAAA,EAClB,aAAaA,kCAAA,CAAS,WAAA;AAAA,EACtB,MAAA,EAAQ,EAAE,IAAA,EAAMA,kCAAA,CAAS,MAAA;AAC3B,CAAC,EACE,QAAA,CAAS;AAAA,EACR,aAAaA,kCAAA,CAAS,WAAA;AAAA,EACtB,MAAA,EAAQ,EAAE,IAAA,EAAMA,kCAAA,CAAS,MAAA;AAC3B,CAAC,EACA,UAAA,CAAW,WAAA,EAAaF,kCAAgB,CAAA,CACxC,mBAAA,CAAoB,mBAAmB,eAAA,EAAiB;AAAA,EACvD,WAAA,EAAa,mCAAA;AAAA,EACb,MAAA,EAAQ;AACV,CAAC,EACA,KAAA","file":"chunk-ZUXOAZWZ.cjs","sourcesContent":["'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a === b ? 0 : a < b ? -1 : 1\n }\n\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n if (this.major < other.major) {\n return -1\n }\n if (this.major > other.major) {\n return 1\n }\n if (this.minor < other.minor) {\n return -1\n }\n if (this.minor > other.minor) {\n return 1\n }\n if (this.patch < other.patch) {\n return -1\n }\n if (this.patch > other.patch) {\n return 1\n }\n return 0\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n comp = comp.replace(re[t.BUILD], '')\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","/**\n * Hook System Implementation\n * \n * Provides event-driven extensibility for plugins\n */\n\nimport { HookSystem, HookHandler, PluginHook, HookContext } from '../types'\n\nexport class HookSystemImpl implements HookSystem {\n private hooks: Map = new Map()\n private executing: Set = new Set()\n\n /**\n * Register a hook handler\n */\n register(hookName: string, handler: HookHandler, priority: number = 10): void {\n if (!this.hooks.has(hookName)) {\n this.hooks.set(hookName, [])\n }\n\n const hooks = this.hooks.get(hookName)!\n const hook: PluginHook = {\n name: hookName,\n handler,\n priority,\n }\n\n // Insert hook in priority order (lower priority = earlier execution)\n const insertIndex = hooks.findIndex(h => h.priority! > priority)\n if (insertIndex === -1) {\n hooks.push(hook)\n } else {\n hooks.splice(insertIndex, 0, hook)\n }\n\n console.debug(`Hook registered: ${hookName} (priority: ${priority})`)\n }\n\n /**\n * Execute all handlers for a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n const hooks = this.hooks.get(hookName)\n if (!hooks || hooks.length === 0) {\n return data\n }\n\n // Prevent infinite recursion\n if (this.executing.has(hookName)) {\n console.warn(`Hook recursion detected for: ${hookName}`)\n return data\n }\n\n this.executing.add(hookName)\n\n try {\n let result = data\n let cancelled = false\n\n const hookContext: HookContext = {\n plugin: '', // Will be set by the plugin manager\n context: context || {},\n cancel: () => { cancelled = true }\n }\n\n for (const hook of hooks) {\n if (cancelled) {\n console.debug(`Hook execution cancelled: ${hookName}`)\n break\n }\n\n try {\n console.debug(`Executing hook: ${hookName} (priority: ${hook.priority})`)\n result = await hook.handler(result, hookContext)\n } catch (error) {\n console.error(`Hook execution failed: ${hookName}`, error)\n // Continue executing other hooks unless it's a critical error\n if (error instanceof Error && error.message.includes('CRITICAL')) {\n throw error\n }\n }\n }\n\n return result\n } finally {\n this.executing.delete(hookName)\n }\n }\n\n /**\n * Remove a hook handler\n */\n unregister(hookName: string, handler: HookHandler): void {\n const hooks = this.hooks.get(hookName)\n if (!hooks) return\n\n const index = hooks.findIndex(h => h.handler === handler)\n if (index !== -1) {\n hooks.splice(index, 1)\n console.debug(`Hook unregistered: ${hookName}`)\n }\n\n // Clean up empty hook arrays\n if (hooks.length === 0) {\n this.hooks.delete(hookName)\n }\n }\n\n /**\n * Get all registered hooks for a name\n */\n getHooks(hookName: string): PluginHook[] {\n return this.hooks.get(hookName) || []\n }\n\n /**\n * Get all registered hook names\n */\n getHookNames(): string[] {\n return Array.from(this.hooks.keys())\n }\n\n /**\n * Get hook statistics\n */\n getStats(): { hookName: string; handlerCount: number }[] {\n return Array.from(this.hooks.entries()).map(([hookName, handlers]) => ({\n hookName,\n handlerCount: handlers.length\n }))\n }\n\n /**\n * Clear all hooks (useful for testing)\n */\n clear(): void {\n this.hooks.clear()\n this.executing.clear()\n }\n\n /**\n * Create a scoped hook system for a plugin\n */\n createScope(_pluginName: string): ScopedHookSystem {\n return new ScopedHookSystem(this)\n }\n}\n\n/**\n * Scoped hook system for individual plugins\n */\nexport class ScopedHookSystem {\n private registeredHooks: { hookName: string; handler: HookHandler }[] = []\n\n constructor(\n private parent: HookSystemImpl\n ) {}\n\n /**\n * Register a hook (scoped to this plugin)\n */\n register(hookName: string, handler: HookHandler, priority?: number): void {\n this.parent.register(hookName, handler, priority)\n this.registeredHooks.push({ hookName, handler })\n }\n\n /**\n * Execute a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n return this.parent.execute(hookName, data, context)\n }\n\n /**\n * Unregister a specific hook\n */\n unregister(hookName: string, handler: HookHandler): void {\n this.parent.unregister(hookName, handler)\n const index = this.registeredHooks.findIndex(\n h => h.hookName === hookName && h.handler === handler\n )\n if (index !== -1) {\n this.registeredHooks.splice(index, 1)\n }\n }\n\n /**\n * Unregister all hooks for this plugin\n */\n unregisterAll(): void {\n for (const { hookName, handler } of this.registeredHooks) {\n this.parent.unregister(hookName, handler)\n }\n this.registeredHooks.length = 0\n }\n\n /**\n * Get hooks registered by this plugin\n */\n getRegisteredHooks(): { hookName: string; handler: HookHandler }[] {\n return [...this.registeredHooks]\n }\n}\n\n/**\n * Hook utilities\n */\nexport class HookUtils {\n /**\n * Create a hook name with namespace\n */\n static createHookName(namespace: string, event: string): string {\n return `${namespace}:${event}`\n }\n\n /**\n * Parse a hook name to extract namespace and event\n */\n static parseHookName(hookName: string): { namespace: string; event: string } {\n const parts = hookName.split(':')\n return {\n namespace: parts[0] || '',\n event: parts.slice(1).join(':') || ''\n }\n }\n\n /**\n * Create a middleware that executes hooks\n */\n static createHookMiddleware(\n hookSystem: HookSystem,\n beforeHook?: string,\n afterHook?: string\n ) {\n return async (c: any, next: any) => {\n if (beforeHook) {\n const beforeData = { request: c.req, context: c }\n await hookSystem.execute(beforeHook, beforeData)\n }\n\n await next()\n\n if (afterHook) {\n const afterData = { request: c.req, response: c.res, context: c }\n await hookSystem.execute(afterHook, afterData)\n }\n }\n }\n\n /**\n * Create a debounced hook handler\n */\n static debounce(handler: HookHandler, delay: number): HookHandler {\n let timeoutId: any\n \n return async (data: any, context: HookContext) => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n return new Promise((resolve, reject) => {\n timeoutId = setTimeout(async () => {\n try {\n const result = await handler(data, context)\n resolve(result)\n } catch (error) {\n reject(error)\n }\n }, delay)\n })\n }\n }\n\n /**\n * Create a throttled hook handler\n */\n static throttle(handler: HookHandler, limit: number): HookHandler {\n let lastExecution = 0\n\n return async (data: any, context: HookContext) => {\n const now = Date.now()\n if (now - lastExecution >= limit) {\n lastExecution = now\n return handler(data, context)\n }\n return data\n }\n }\n}","/**\n * Plugin Validator\n * \n * Validates plugin definitions, dependencies, and compatibility\n */\n\nimport { z } from 'zod'\nimport { Plugin, PluginValidator as IPluginValidator, PluginValidationResult, PluginRegistry } from '../types'\nimport semver from 'semver'\n\n// Zod schemas for plugin validation\nconst PluginAuthorSchema = z.object({\n name: z.string().min(1),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n})\n\nconst PluginRoutesSchema = z.object({\n path: z.string().min(1),\n handler: z.any(), // Hono instance\n description: z.string().optional(),\n requiresAuth: z.boolean().optional(),\n roles: z.array(z.string()).optional(),\n priority: z.number().optional(),\n})\n\nconst PluginMiddlewareSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n description: z.string().optional(),\n priority: z.number().optional(),\n routes: z.array(z.string()).optional(),\n global: z.boolean().optional(),\n})\n\nconst PluginModelSchema = z.object({\n name: z.string().min(1),\n tableName: z.string().min(1),\n schema: z.any(), // Zod schema\n migrations: z.array(z.string()),\n relationships: z.array(z.object({\n type: z.enum(['oneToOne', 'oneToMany', 'manyToMany']),\n target: z.string(),\n foreignKey: z.string().optional(),\n joinTable: z.string().optional(),\n })).optional(),\n extendsContent: z.boolean().optional(),\n})\n\nconst PluginServiceSchema = z.object({\n name: z.string().min(1),\n implementation: z.any(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n singleton: z.boolean().optional(),\n})\n\nconst PluginAdminPageSchema = z.object({\n path: z.string().min(1),\n title: z.string().min(1),\n component: z.string().min(1),\n description: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n menuItem: z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n }).optional(),\n icon: z.string().optional(),\n})\n\nconst PluginComponentSchema = z.object({\n name: z.string().min(1),\n template: z.function(),\n description: z.string().optional(),\n propsSchema: z.any().optional(), // Zod schema\n})\n\nconst PluginHookSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n priority: z.number().optional(),\n description: z.string().optional(),\n})\n\nconst PluginSchema = z.object({\n name: z.string().min(1).regex(/^[a-z0-9-]+$/, 'Plugin name must be lowercase with hyphens'),\n version: z.string().refine(v => semver.valid(v), 'Version must be valid semver'),\n description: z.string().optional(),\n author: PluginAuthorSchema.optional(),\n dependencies: z.array(z.string()).optional(),\n compatibility: z.string().optional(),\n license: z.string().optional(),\n \n // Extension points\n routes: z.array(PluginRoutesSchema).optional(),\n middleware: z.array(PluginMiddlewareSchema).optional(),\n models: z.array(PluginModelSchema).optional(),\n services: z.array(PluginServiceSchema).optional(),\n adminPages: z.array(PluginAdminPageSchema).optional(),\n adminComponents: z.array(PluginComponentSchema).optional(),\n menuItems: z.array(z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n })).optional(),\n hooks: z.array(PluginHookSchema).optional(),\n \n // Lifecycle hooks\n install: z.function().optional(),\n uninstall: z.function().optional(),\n activate: z.function().optional(),\n deactivate: z.function().optional(),\n configure: z.function().optional(),\n})\n\nexport class PluginValidator implements IPluginValidator {\n private static readonly RESERVED_NAMES = [\n 'core', 'system', 'admin', 'api', 'auth', 'content', 'media', 'users', 'collections'\n ]\n\n private static readonly RESERVED_PATHS = [\n '/admin', '/api', '/auth', '/docs', '/media', '/_assets'\n ]\n\n /**\n * Validate plugin definition\n */\n validate(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n try {\n // Schema validation\n const result = PluginSchema.safeParse(plugin)\n if (!result.success) {\n result.error.issues.forEach((err: any) => {\n errors.push(`${err.path.join('.')}: ${err.message}`)\n })\n }\n\n // Reserved name validation\n if (PluginValidator.RESERVED_NAMES.includes(plugin.name)) {\n errors.push(`Plugin name \"${plugin.name}\" is reserved`)\n }\n\n // Route path validation\n if (plugin.routes) {\n for (const route of plugin.routes) {\n if (PluginValidator.RESERVED_PATHS.some(path => route.path.startsWith(path))) {\n errors.push(`Route path \"${route.path}\" conflicts with reserved system path`)\n }\n \n if (!route.path.startsWith('/')) {\n errors.push(`Route path \"${route.path}\" must start with /`)\n }\n }\n }\n\n // Model validation\n if (plugin.models) {\n const modelNames = new Set()\n const tableNames = new Set()\n \n for (const model of plugin.models) {\n // Check for duplicate model names\n if (modelNames.has(model.name)) {\n errors.push(`Duplicate model name: ${model.name}`)\n }\n modelNames.add(model.name)\n \n // Check for duplicate table names\n if (tableNames.has(model.tableName)) {\n errors.push(`Duplicate table name: ${model.tableName}`)\n }\n tableNames.add(model.tableName)\n \n // Validate table name format\n if (!/^[a-z][a-z0-9_]*$/.test(model.tableName)) {\n errors.push(`Invalid table name format: ${model.tableName}`)\n }\n \n // Check for system table conflicts\n const systemTables = ['users', 'collections', 'content', 'content_versions', 'media', 'api_tokens']\n if (systemTables.includes(model.tableName)) {\n errors.push(`Table name \"${model.tableName}\" conflicts with system table`)\n }\n }\n }\n\n // Service validation\n if (plugin.services) {\n const serviceNames = new Set()\n \n for (const service of plugin.services) {\n if (serviceNames.has(service.name)) {\n errors.push(`Duplicate service name: ${service.name}`)\n }\n serviceNames.add(service.name)\n \n // Check for system service conflicts\n const systemServices = ['auth', 'content', 'media', 'cdn']\n if (systemServices.includes(service.name)) {\n warnings.push(`Service name \"${service.name}\" conflicts with system service`)\n }\n }\n }\n\n // Admin page validation\n if (plugin.adminPages) {\n const pagePaths = new Set()\n \n for (const page of plugin.adminPages) {\n if (pagePaths.has(page.path)) {\n errors.push(`Duplicate admin page path: ${page.path}`)\n }\n pagePaths.add(page.path)\n \n if (!page.path.startsWith('/')) {\n errors.push(`Admin page path \"${page.path}\" must start with /`)\n }\n \n // Check for system admin page conflicts\n const systemPaths = ['/', '/collections', '/content', '/media', '/users', '/settings']\n if (systemPaths.includes(page.path)) {\n errors.push(`Admin page path \"${page.path}\" conflicts with system page`)\n }\n }\n }\n\n // Component validation\n if (plugin.adminComponents) {\n const componentNames = new Set()\n \n for (const component of plugin.adminComponents) {\n if (componentNames.has(component.name)) {\n errors.push(`Duplicate component name: ${component.name}`)\n }\n componentNames.add(component.name)\n \n // Check for system component conflicts\n const systemComponents = ['table', 'form', 'alert', 'media-grid', 'pagination']\n if (systemComponents.includes(component.name)) {\n warnings.push(`Component name \"${component.name}\" conflicts with system component`)\n }\n }\n }\n\n // Hook validation\n if (plugin.hooks) {\n for (const hook of plugin.hooks) {\n if (!hook.name.includes(':')) {\n warnings.push(`Hook name \"${hook.name}\" should include namespace (e.g., \"plugin:event\")`)\n }\n }\n }\n\n // Dependency cycle detection (basic)\n if (plugin.dependencies?.includes(plugin.name)) {\n errors.push(`Plugin cannot depend on itself`)\n }\n\n // License validation\n if (plugin.license) {\n const validLicenses = ['MIT', 'Apache-2.0', 'GPL-3.0', 'BSD-3-Clause', 'ISC']\n if (!validLicenses.includes(plugin.license)) {\n warnings.push(`License \"${plugin.license}\" is not a common SPDX identifier`)\n }\n }\n\n // Performance warnings\n if (plugin.middleware && plugin.middleware.length > 5) {\n warnings.push(`Plugin defines ${plugin.middleware.length} middleware functions, consider consolidating`)\n }\n\n if (plugin.hooks && plugin.hooks.length > 10) {\n warnings.push(`Plugin defines ${plugin.hooks.length} hooks, ensure they are necessary`)\n }\n\n } catch (error) {\n errors.push(`Validation error: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin dependencies\n */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.dependencies || plugin.dependencies.length === 0) {\n return { valid: true, errors, warnings }\n }\n\n // Check if all dependencies are registered\n for (const depName of plugin.dependencies) {\n if (!registry.has(depName)) {\n errors.push(`Dependency \"${depName}\" is not registered`)\n continue\n }\n\n const dependency = registry.get(depName)!\n \n // Check dependency version compatibility\n if (dependency.compatibility && plugin.compatibility) {\n if (!this.isCompatible(dependency.compatibility, plugin.compatibility)) {\n warnings.push(`Potential compatibility issue with dependency \"${depName}\"`)\n }\n }\n }\n\n // Check for circular dependencies\n const visited = new Set()\n const visiting = new Set()\n \n const checkCircular = (name: string): boolean => {\n if (visiting.has(name)) return true\n if (visited.has(name)) return false\n \n visiting.add(name)\n \n const current = registry.get(name)\n if (current?.dependencies) {\n for (const depName of current.dependencies) {\n if (checkCircular(depName)) {\n errors.push(`Circular dependency detected: ${name} -> ${depName}`)\n return true\n }\n }\n }\n \n visiting.delete(name)\n visited.add(name)\n return false\n }\n\n checkCircular(plugin.name)\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin compatibility with SonicJS version\n */\n validateCompatibility(plugin: Plugin, sonicVersion: string): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.compatibility) {\n warnings.push('Plugin does not specify compatibility version')\n return { valid: true, errors, warnings }\n }\n\n try {\n if (!semver.satisfies(sonicVersion, plugin.compatibility)) {\n errors.push(`Plugin requires SonicJS ${plugin.compatibility}, but current version is ${sonicVersion}`)\n }\n } catch (error) {\n errors.push(`Invalid compatibility version format: ${plugin.compatibility}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Check if two version ranges are compatible\n */\n private isCompatible(version1: string, version2: string): boolean {\n try {\n // Simple compatibility check - can be enhanced\n return semver.intersects(version1, version2)\n } catch {\n return false\n }\n }\n\n /**\n * Validate plugin security constraints\n */\n validateSecurity(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n // Check for potentially dangerous patterns\n const pluginCode = JSON.stringify(plugin)\n \n // Check for eval or Function constructor usage\n if (pluginCode.includes('eval(') || pluginCode.includes('Function(')) {\n errors.push('Plugin contains potentially dangerous code execution patterns')\n }\n\n // Check for file system access attempts\n if (pluginCode.includes('fs.') || pluginCode.includes('require(')) {\n warnings.push('Plugin may attempt file system access (not available in Cloudflare Workers)')\n }\n\n // Check for network access patterns\n if (pluginCode.includes('fetch(') || pluginCode.includes('XMLHttpRequest')) {\n warnings.push('Plugin contains network access code - ensure it follows security guidelines')\n }\n\n // Check for sensitive data patterns\n const sensitivePatterns = ['password', 'secret', 'key', 'token', 'credential']\n for (const pattern of sensitivePatterns) {\n if (pluginCode.toLowerCase().includes(pattern)) {\n warnings.push(`Plugin code contains \"${pattern}\" - ensure sensitive data is properly handled`)\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n}","/**\n * Plugin Registry Implementation\n * \n * Manages plugin registration, activation, and lifecycle\n */\n\nimport { Plugin, PluginRegistry, PluginConfig, PluginStatus } from '../types'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginRegistryImpl implements PluginRegistry {\n private plugins: Map = new Map()\n private configs: Map = new Map()\n private statuses: Map = new Map()\n private validator: PluginValidator\n\n constructor(validator?: PluginValidator) {\n this.validator = validator || new PluginValidator()\n }\n\n /**\n * Get plugin by name\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name)\n }\n\n /**\n * Get all registered plugins\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values())\n }\n\n /**\n * Get active plugins\n */\n getActive(): Plugin[] {\n return this.getAll().filter(plugin => {\n const status = this.statuses.get(plugin.name)\n return status?.active === true\n })\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise {\n console.info(`Registering plugin: ${plugin.name} v${plugin.version}`)\n\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed for ${plugin.name}: ${validation.errors.join(', ')}`)\n }\n\n // Check for conflicts\n if (this.plugins.has(plugin.name)) {\n const existingPlugin = this.plugins.get(plugin.name)!\n if (existingPlugin.version !== plugin.version) {\n console.warn(`Plugin ${plugin.name} is already registered with version ${existingPlugin.version}, replacing with ${plugin.version}`)\n }\n }\n\n // Validate dependencies\n const depValidation = this.validator.validateDependencies(plugin, this)\n if (!depValidation.valid) {\n throw new Error(`Plugin dependency validation failed for ${plugin.name}: ${depValidation.errors.join(', ')}`)\n }\n\n // Register plugin\n this.plugins.set(plugin.name, plugin)\n \n // Initialize status\n this.statuses.set(plugin.name, {\n name: plugin.name,\n version: plugin.version,\n active: false,\n installed: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin registered successfully: ${plugin.name}`)\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise {\n console.info(`Unregistering plugin: ${name}`)\n\n if (!this.plugins.has(name)) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n // Check if other plugins depend on this one\n const dependents = this.getDependents(name)\n if (dependents.length > 0) {\n throw new Error(`Cannot unregister ${name}: plugins ${dependents.join(', ')} depend on it`)\n }\n\n // Remove plugin\n this.plugins.delete(name)\n this.configs.delete(name)\n this.statuses.delete(name)\n\n console.info(`Plugin unregistered: ${name}`)\n }\n\n /**\n * Check if plugin is registered\n */\n has(name: string): boolean {\n return this.plugins.has(name)\n }\n\n /**\n * Activate a plugin\n */\n async activate(name: string): Promise {\n console.info(`Activating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (status?.active) {\n console.warn(`Plugin ${name} is already active`)\n return\n }\n\n try {\n // Activate dependencies first\n if (plugin.dependencies) {\n for (const depName of plugin.dependencies) {\n const depStatus = this.statuses.get(depName)\n if (!depStatus?.active) {\n await this.activate(depName)\n }\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin activated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n active: false,\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to activate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Deactivate a plugin\n */\n async deactivate(name: string): Promise {\n console.info(`Deactivating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (!status?.active) {\n console.warn(`Plugin ${name} is not active`)\n return\n }\n\n try {\n // Deactivate dependents first\n const dependents = this.getDependents(name)\n for (const depName of dependents) {\n const depStatus = this.statuses.get(depName)\n if (depStatus?.active) {\n await this.deactivate(depName)\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: false,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin deactivated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to deactivate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Get plugin configuration\n */\n getConfig(name: string): PluginConfig | undefined {\n return this.configs.get(name)\n }\n\n /**\n * Set plugin configuration\n */\n setConfig(name: string, config: PluginConfig): void {\n this.configs.set(name, {\n ...config,\n updatedAt: Date.now()\n })\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus | undefined {\n return this.statuses.get(name)\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): Map {\n return new Map(this.statuses)\n }\n\n /**\n * Update plugin status\n */\n private updateStatus(name: string, updates: Partial): void {\n const current = this.statuses.get(name)\n if (current) {\n this.statuses.set(name, { ...current, ...updates })\n }\n }\n\n /**\n * Get plugins that depend on the specified plugin\n */\n private getDependents(name: string): string[] {\n const dependents: string[] = []\n \n for (const [pluginName, plugin] of this.plugins) {\n if (plugin.dependencies?.includes(name)) {\n dependents.push(pluginName)\n }\n }\n \n return dependents\n }\n\n /**\n * Get dependency graph\n */\n getDependencyGraph(): Map {\n const graph = new Map()\n \n for (const [name, plugin] of this.plugins) {\n graph.set(name, plugin.dependencies || [])\n }\n \n return graph\n }\n\n /**\n * Resolve plugin load order based on dependencies\n */\n resolveLoadOrder(): string[] {\n const graph = this.getDependencyGraph()\n const visited = new Set()\n const visiting = new Set()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected involving plugin: ${name}`)\n }\n\n visiting.add(name)\n \n const dependencies = graph.get(name) || []\n for (const dep of dependencies) {\n if (!graph.has(dep)) {\n throw new Error(`Plugin ${name} depends on ${dep}, but ${dep} is not registered`)\n }\n visit(dep)\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n for (const name of graph.keys()) {\n visit(name)\n }\n\n return result\n }\n\n /**\n * Export plugin configuration\n */\n exportConfig(): { plugins: PluginConfig[] } {\n const plugins: PluginConfig[] = []\n \n for (const [name, config] of this.configs) {\n plugins.push({\n ...config,\n name\n } as PluginConfig & { name: string })\n }\n \n return { plugins }\n }\n\n /**\n * Import plugin configuration\n */\n importConfig(config: { plugins: PluginConfig[] }): void {\n for (const pluginConfig of config.plugins) {\n if ('name' in pluginConfig) {\n const { name, ...rest } = pluginConfig as PluginConfig & { name: string }\n this.setConfig(name, rest)\n }\n }\n }\n\n /**\n * Clear all plugins (useful for testing)\n */\n clear(): void {\n this.plugins.clear()\n this.configs.clear()\n this.statuses.clear()\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n total: number\n active: number\n inactive: number\n withErrors: number\n } {\n const statuses = Array.from(this.statuses.values())\n \n return {\n total: statuses.length,\n active: statuses.filter(s => s.active).length,\n inactive: statuses.filter(s => !s.active).length,\n withErrors: statuses.filter(s => s.hasErrors).length\n }\n }\n}","/**\n * Plugin Manager\n * \n * Central orchestrator for the plugin system\n */\n\nimport { Hono } from 'hono'\nimport { Plugin, PluginManager as IPluginManager, PluginRegistry, PluginConfig, PluginContext, PluginStatus, HookSystem, PluginLogger, HOOKS } from '../types'\nimport { PluginRegistryImpl } from './plugin-registry'\nimport { HookSystemImpl, ScopedHookSystem } from './hook-system'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginManager implements IPluginManager {\n public readonly registry: PluginRegistry\n public readonly hooks: HookSystem\n private validator: PluginValidator\n private context?: PluginContext\n private scopedHooks: Map = new Map()\n private pluginRoutes: Map = new Map()\n\n constructor() {\n this.validator = new PluginValidator()\n this.registry = new PluginRegistryImpl(this.validator)\n this.hooks = new HookSystemImpl()\n }\n\n /**\n * Initialize plugin system\n */\n async initialize(context: PluginContext): Promise {\n console.info('Initializing plugin system...')\n \n this.context = context\n \n // Execute app init hook\n await this.hooks.execute(HOOKS.APP_INIT, {\n pluginManager: this,\n context\n })\n\n console.info('Plugin system initialized')\n }\n\n /**\n * Load plugins from configuration\n */\n async loadPlugins(configs: PluginConfig[]): Promise {\n console.info(`Loading ${configs.length} plugins...`)\n\n // Filter enabled plugins\n const enabledConfigs = configs.filter(config => config.enabled)\n \n if (enabledConfigs.length === 0) {\n console.info('No enabled plugins to load')\n return\n }\n\n // Load and register plugins (implementation would depend on how plugins are distributed)\n for (const config of enabledConfigs) {\n try {\n // In a real implementation, this would load the plugin from a registry or file system\n // For now, we'll assume plugins are already imported\n console.info(`Loading plugin configuration: ${JSON.stringify(config)}`)\n \n // Store configuration\n if ('name' in config) {\n this.registry.setConfig(config.name as string, config)\n }\n } catch (error) {\n console.error(`Failed to load plugin configuration:`, error)\n }\n }\n\n // Resolve load order based on dependencies\n try {\n const loadOrder = this.registry.resolveLoadOrder()\n console.info(`Plugin load order: ${loadOrder.join(' -> ')}`)\n\n // Activate plugins in dependency order\n for (const pluginName of loadOrder) {\n const config = this.registry.getConfig(pluginName)\n if (config?.enabled) {\n await this.registry.activate(pluginName)\n }\n }\n } catch (error) {\n console.error('Failed to resolve plugin load order:', error)\n }\n\n console.info('Plugin loading completed')\n }\n\n /**\n * Install a plugin\n */\n async install(plugin: Plugin, config?: PluginConfig): Promise {\n console.info(`Installing plugin: ${plugin.name}`)\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed: ${validation.errors.join(', ')}`)\n }\n\n // Register plugin\n await this.registry.register(plugin)\n\n // Set configuration\n const pluginConfig: PluginConfig = {\n enabled: true,\n installedAt: Date.now(),\n ...config\n }\n this.registry.setConfig(plugin.name, pluginConfig)\n\n // Create scoped hook system for plugin\n const scopedHooks = this.hooks.createScope ? \n (this.hooks as HookSystemImpl).createScope(plugin.name) : \n this.hooks\n\n this.scopedHooks.set(plugin.name, scopedHooks as ScopedHookSystem)\n\n // Create plugin context\n const pluginContext: PluginContext = {\n ...this.context,\n config: pluginConfig,\n hooks: scopedHooks,\n logger: this.createLogger(plugin.name)\n }\n\n // Register plugin extensions\n await this.registerPluginExtensions(plugin, pluginContext)\n\n // Run plugin install hook\n if (plugin.install) {\n await plugin.install(pluginContext)\n }\n\n // Execute plugin install hook\n await this.hooks.execute(HOOKS.PLUGIN_INSTALL, {\n plugin: plugin.name,\n version: plugin.version,\n context: pluginContext\n })\n\n console.info(`Plugin installed successfully: ${plugin.name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to install plugin ${plugin.name}:`, errorMessage)\n \n // Update status with error\n const status = this.registry.getStatus(plugin.name)\n if (status) {\n this.updatePluginStatus(plugin.name, {\n hasErrors: true,\n errors: [...(status.errors || []), errorMessage],\n lastError: errorMessage\n })\n }\n \n throw error\n }\n }\n\n /**\n * Uninstall a plugin\n */\n async uninstall(name: string): Promise {\n console.info(`Uninstalling plugin: ${name}`)\n\n const plugin = this.registry.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Deactivate plugin first\n const status = this.registry.getStatus(name)\n if (status?.active) {\n await this.registry.deactivate(name)\n }\n\n // Create plugin context\n const config = this.registry.getConfig(name) || { enabled: false }\n const pluginContext: PluginContext = {\n ...this.context,\n config,\n hooks: this.scopedHooks.get(name) || this.hooks,\n logger: this.createLogger(name)\n }\n\n // Run plugin uninstall hook\n if (plugin.uninstall) {\n await plugin.uninstall(pluginContext)\n }\n\n // Unregister plugin extensions\n await this.unregisterPluginExtensions(plugin)\n\n // Clean up scoped hooks\n const scopedHooks = this.scopedHooks.get(name)\n if (scopedHooks && 'unregisterAll' in scopedHooks) {\n scopedHooks.unregisterAll()\n }\n this.scopedHooks.delete(name)\n\n // Remove plugin routes\n this.pluginRoutes.delete(name)\n\n // Execute plugin uninstall hook\n await this.hooks.execute(HOOKS.PLUGIN_UNINSTALL, {\n plugin: name,\n context: pluginContext\n })\n\n // Unregister plugin\n await this.registry.unregister(name)\n\n console.info(`Plugin uninstalled successfully: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to uninstall plugin ${name}:`, errorMessage)\n throw error\n }\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus {\n const status = this.registry.getStatus(name)\n if (!status) {\n return {\n name,\n version: 'unknown',\n active: false,\n installed: false,\n hasErrors: false\n }\n }\n return status\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): PluginStatus[] {\n return Array.from(this.registry.getAllStatuses().values())\n }\n\n /**\n * Register plugin extensions (routes, middleware, etc.)\n */\n private async registerPluginExtensions(plugin: Plugin, _context: PluginContext): Promise {\n // Register routes\n if (plugin.routes) {\n const pluginApp = new Hono()\n \n for (const route of plugin.routes) {\n console.debug(`Registering plugin route: ${route.path}`)\n pluginApp.route(route.path, route.handler)\n }\n \n this.pluginRoutes.set(plugin.name, pluginApp)\n }\n\n // Register middleware\n if (plugin.middleware) {\n for (const middleware of plugin.middleware) {\n console.debug(`Registering plugin middleware: ${middleware.name}`)\n // Middleware registration would be handled by the main app\n }\n }\n\n // Register hooks\n if (plugin.hooks) {\n const scopedHooks = this.scopedHooks.get(plugin.name)\n for (const hook of plugin.hooks) {\n console.debug(`Registering plugin hook: ${hook.name}`)\n if (scopedHooks) {\n scopedHooks.register(hook.name, hook.handler, hook.priority)\n } else {\n this.hooks.register(hook.name, hook.handler, hook.priority)\n }\n }\n }\n\n // Register services\n if (plugin.services) {\n for (const service of plugin.services) {\n console.debug(`Registering plugin service: ${service.name}`)\n // Service registration would be handled by a service container\n }\n }\n\n // Register database models\n if (plugin.models) {\n for (const model of plugin.models) {\n console.debug(`Registering plugin model: ${model.name}`)\n // Model registration would involve database migrations\n }\n }\n }\n\n /**\n * Unregister plugin extensions\n */\n private async unregisterPluginExtensions(plugin: Plugin): Promise {\n // Clean up is mostly handled by the scoped systems\n console.debug(`Unregistering extensions for plugin: ${plugin.name}`)\n }\n\n /**\n * Update plugin status\n */\n private updatePluginStatus(name: string, updates: Partial): void {\n const current = this.registry.getStatus(name)\n if (current && 'updateStatus' in this.registry) {\n // This would require extending the registry interface\n console.debug(`Updating status for plugin: ${name}`, updates)\n }\n }\n\n /**\n * Create a logger for a plugin\n */\n private createLogger(pluginName: string): PluginLogger {\n return {\n debug: (message: string, data?: any) => {\n console.debug(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n info: (message: string, data?: any) => {\n console.info(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n warn: (message: string, data?: any) => {\n console.warn(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n error: (message: string, error?: Error, data?: any) => {\n console.error(`[Plugin:${pluginName}] ${message}`, error || '', data || '')\n }\n }\n }\n\n /**\n * Get plugin routes for mounting in main app\n */\n getPluginRoutes(): Map {\n return new Map(this.pluginRoutes)\n }\n\n /**\n * Get plugin middleware for main app\n */\n getPluginMiddleware(): Array<{ name: string; handler: any; priority: number; global: boolean }> {\n const middleware: Array<{ name: string; handler: any; priority: number; global: boolean }> = []\n \n for (const plugin of this.registry.getActive()) {\n if (plugin.middleware) {\n for (const mw of plugin.middleware) {\n middleware.push({\n name: `${plugin.name}:${mw.name}`,\n handler: mw.handler,\n priority: mw.priority || 10,\n global: mw.global || false\n })\n }\n }\n }\n \n // Sort by priority\n return middleware.sort((a, b) => a.priority - b.priority)\n }\n\n /**\n * Execute shutdown procedures\n */\n async shutdown(): Promise {\n console.info('Shutting down plugin system...')\n \n // Execute app shutdown hook\n await this.hooks.execute(HOOKS.APP_SHUTDOWN, {\n pluginManager: this\n })\n\n // Deactivate all active plugins\n const activePlugins = this.registry.getActive()\n for (const plugin of activePlugins.reverse()) { // Reverse order\n try {\n await this.registry.deactivate(plugin.name)\n } catch (error) {\n console.error(`Error deactivating plugin ${plugin.name}:`, error)\n }\n }\n\n console.info('Plugin system shutdown completed')\n }\n\n /**\n * Get plugin system statistics\n */\n getStats(): {\n registry: ReturnType\n hooks: Array<{ hookName: string; handlerCount: number }>\n routes: number\n middleware: number\n } {\n return {\n registry: (this.registry as PluginRegistryImpl).getStats(),\n hooks: (this.hooks as HookSystemImpl).getStats(),\n routes: this.pluginRoutes.size,\n middleware: this.getPluginMiddleware().length\n }\n }\n}","import type { Context, Next } from 'hono'\nimport { TurnstileService } from '../services/turnstile'\n\n/**\n * Middleware to verify Turnstile token on form submissions\n * \n * Usage:\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Token already verified, process form...\n * })\n * ```\n */\nexport async function verifyTurnstile(c: Context, next: Next) {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n console.error('Turnstile middleware: Database not available')\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n\n // Check if Turnstile is enabled\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n // Turnstile not enabled, allow through\n return next()\n }\n\n // Get token from request\n let token: string | undefined\n let body: any\n\n if (c.req.method === 'POST') {\n const contentType = c.req.header('content-type') || ''\n \n if (contentType.includes('application/json')) {\n body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n }\n\n if (!token) {\n return c.json({ \n error: 'Turnstile token missing',\n message: 'Please complete the verification challenge'\n }, 400)\n }\n\n // Verify token\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return c.json({ \n error: 'Turnstile verification failed',\n message: result.error || 'Verification failed. Please try again.'\n }, 403)\n }\n\n // Verification successful, continue\n return next()\n}\n\n/**\n * Middleware factory that allows custom error handling\n */\nexport function createTurnstileMiddleware(options?: {\n onError?: (c: Context, error: string) => Response\n onMissing?: (c: Context) => Response\n}) {\n return async (c: Context, next: Next) => {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n return options?.onError?.(c, 'Database not available') || \n c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n return next()\n }\n\n let token: string | undefined\n const contentType = c.req.header('content-type') || ''\n\n if (contentType.includes('application/json')) {\n const body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n\n if (!token) {\n return options?.onMissing?.(c) ||\n c.json({ error: 'Turnstile token missing' }, 400)\n }\n\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return options?.onError?.(c, result.error || 'Verification failed') ||\n c.json({ error: 'Turnstile verification failed', message: result.error }, 403)\n }\n\n return next()\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { TurnstileService } from './services/turnstile'\nimport { verifyTurnstile } from './middleware/verify'\nimport manifest from './manifest.json'\n\n/**\n * Cloudflare Turnstile Plugin\n * \n * Provides CAPTCHA-free bot protection using Cloudflare Turnstile.\n * Can be used with any form by adding the verifyTurnstile middleware.\n * \n * Settings are managed through the generic admin plugin interface.\n * No custom routes needed - the admin system automatically handles settings.\n * \n * @example\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Process form after Turnstile verification\n * })\n * ```\n */\n\n// Build the plugin - no custom routes, generic admin handles settings\nexport const turnstilePlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('turnstile', TurnstileService)\n .addSingleMiddleware('verifyTurnstile', verifyTurnstile, {\n description: 'Verify Cloudflare Turnstile token',\n global: false,\n })\n .build()\n\n// Export service and middleware for easy import\nexport { TurnstileService } from './services/turnstile'\nexport { verifyTurnstile, createTurnstileMiddleware } from './middleware/verify'\nexport { renderTurnstileWidget, renderInlineTurnstile, getTurnstileScript, renderExplicitTurnstile } from './components/widget'\nexport type { TurnstileSettings, TurnstileVerificationResponse } from './services/turnstile'\n"]} \ No newline at end of file diff --git a/packages/core/dist/index.cjs b/packages/core/dist/index.cjs index fc6b9279e..b84f82e91 100644 --- a/packages/core/dist/index.cjs +++ b/packages/core/dist/index.cjs @@ -1,16 +1,16 @@ 'use strict'; -var chunkBX75LZES_cjs = require('./chunk-BX75LZES.cjs'); -var chunkXWQVFWPW_cjs = require('./chunk-XWQVFWPW.cjs'); -var chunkV4V54BY3_cjs = require('./chunk-V4V54BY3.cjs'); -var chunkQOZZJZ76_cjs = require('./chunk-QOZZJZ76.cjs'); -var chunk7KR6GOY3_cjs = require('./chunk-7KR6GOY3.cjs'); +var chunkLPYFMGAK_cjs = require('./chunk-LPYFMGAK.cjs'); +var chunkWAEQXGCX_cjs = require('./chunk-WAEQXGCX.cjs'); +var chunkTAOOLOUH_cjs = require('./chunk-TAOOLOUH.cjs'); +var chunk656GGECX_cjs = require('./chunk-656GGECX.cjs'); +var chunkICMNCCX2_cjs = require('./chunk-ICMNCCX2.cjs'); var chunk4ZSNJDLS_cjs = require('./chunk-4ZSNJDLS.cjs'); var chunkOHYBNCVL_cjs = require('./chunk-OHYBNCVL.cjs'); var chunkUYJ6TJHX_cjs = require('./chunk-UYJ6TJHX.cjs'); -var chunkZUXOAZWZ_cjs = require('./chunk-ZUXOAZWZ.cjs'); +var chunkABB34XUS_cjs = require('./chunk-ABB34XUS.cjs'); var chunk635JAMSE_cjs = require('./chunk-635JAMSE.cjs'); -var chunk74BFRAQS_cjs = require('./chunk-74BFRAQS.cjs'); +var chunkGLRZAPX6_cjs = require('./chunk-GLRZAPX6.cjs'); require('./chunk-P3XDZL6Q.cjs'); var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs'); var chunkMNWKYY5E_cjs = require('./chunk-MNWKYY5E.cjs'); @@ -560,7 +560,7 @@ function formatCellValue(value) { // src/plugins/core-plugins/database-tools-plugin/admin-routes.ts function createDatabaseToolsAdminRoutes() { const router3 = new hono.Hono(); - router3.use("*", chunkV4V54BY3_cjs.requireAuth()); + router3.use("*", chunkTAOOLOUH_cjs.requireAuth()); router3.get("/api/stats", async (c) => { try { const user = c.get("user"); @@ -1815,7 +1815,7 @@ function createOTPLoginPlugin() { console.warn("Failed to parse OTP plugin settings, using defaults"); } } - const settingsService = new chunkXWQVFWPW_cjs.SettingsService(db); + const settingsService = new chunkWAEQXGCX_cjs.SettingsService(db); const generalSettings = await settingsService.getGeneralSettings(); const siteName = generalSettings.siteName; const canRequest = await otpService.checkRateLimit(normalizedEmail, settings); @@ -1991,16 +1991,16 @@ function createOTPLoginPlugin() { error: "Account is deactivated" }, 403); } - const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(db, c.env); - const token = await chunkV4V54BY3_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(db, c.env); + const token = await chunkTAOOLOUH_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", token, { httpOnly: true, secure: true, sameSite: "Strict", maxAge: tokenTtl }); - const customData = await chunkBX75LZES_cjs.getCustomData(db, user.id); - const { is_active, ...publicUser } = user; + const customData = await chunkLPYFMGAK_cjs.getCustomData(db, user.id); + const { is_active: _isActive, ...publicUser } = user; return c.json({ success: true, user: { @@ -2462,15 +2462,15 @@ function createOAuthProvidersPlugin() { if (!user || !user.is_active) { return c.redirect("/auth/login?error=Account is deactivated"); } - const tokenTtl2 = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const jwt2 = await chunkV4V54BY3_cjs.AuthManager.generateToken( + const tokenTtl2 = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const jwt2 = await chunkTAOOLOUH_cjs.AuthManager.generateToken( user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl2 ); - chunkV4V54BY3_cjs.AuthManager.setAuthCookie(c, jwt2, { sameSite: "Lax", maxAge: tokenTtl2 }); + chunkTAOOLOUH_cjs.AuthManager.setAuthCookie(c, jwt2, { sameSite: "Lax", maxAge: tokenTtl2 }); return c.redirect("/admin"); } const existingUser = await oauthService.findUserByEmail(profile.email); @@ -2487,15 +2487,15 @@ function createOAuthProvidersPlugin() { tokenExpiresAt: tokenExpiresAt ?? void 0, profileData: JSON.stringify(profile) }); - const tokenTtl2 = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const jwt2 = await chunkV4V54BY3_cjs.AuthManager.generateToken( + const tokenTtl2 = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const jwt2 = await chunkTAOOLOUH_cjs.AuthManager.generateToken( existingUser.id, existingUser.email, existingUser.role, c.env.JWT_SECRET, tokenTtl2 ); - chunkV4V54BY3_cjs.AuthManager.setAuthCookie(c, jwt2, { sameSite: "Lax", maxAge: tokenTtl2 }); + chunkTAOOLOUH_cjs.AuthManager.setAuthCookie(c, jwt2, { sameSite: "Lax", maxAge: tokenTtl2 }); return c.redirect("/admin"); } const newUserId = await oauthService.createUserFromOAuth(profile); @@ -2508,15 +2508,15 @@ function createOAuthProvidersPlugin() { tokenExpiresAt: tokenExpiresAt ?? void 0, profileData: JSON.stringify(profile) }); - const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const jwt = await chunkV4V54BY3_cjs.AuthManager.generateToken( + const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const jwt = await chunkTAOOLOUH_cjs.AuthManager.generateToken( newUserId, profile.email.toLowerCase(), "viewer", c.env.JWT_SECRET, tokenTtl ); - chunkV4V54BY3_cjs.AuthManager.setAuthCookie(c, jwt, { sameSite: "Lax", maxAge: tokenTtl }); + chunkTAOOLOUH_cjs.AuthManager.setAuthCookie(c, jwt, { sameSite: "Lax", maxAge: tokenTtl }); return c.redirect("/admin"); } catch (error) { console.error("OAuth callback error:", error); @@ -4209,7 +4209,7 @@ function renderSettingsPage(data) { // src/plugins/core-plugins/ai-search-plugin/routes/admin.ts var adminRoutes = new hono.Hono(); -adminRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); +adminRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); adminRoutes.get("/", async (c) => { try { const user = c.get("user"); @@ -4610,15 +4610,15 @@ function createMagicLinkAuthPlugin() { SET used = 1, used_at = ? WHERE id = ? `).bind(Date.now(), magicLink.id).run(); - const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const jwtToken = await chunkV4V54BY3_cjs.AuthManager.generateToken( + const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const jwtToken = await chunkTAOOLOUH_cjs.AuthManager.generateToken( user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl ); - chunkV4V54BY3_cjs.AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl }); + chunkTAOOLOUH_cjs.AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl }); await db.prepare(` UPDATE users SET last_login_at = ? WHERE id = ? `).bind(Date.now(), user.id).run(); @@ -5628,7 +5628,7 @@ function renderSecuritySettingsPage(data) { // src/plugins/core-plugins/security-audit-plugin/routes/admin.ts var adminRoutes2 = new hono.Hono(); -adminRoutes2.use("*", chunkV4V54BY3_cjs.requireAuth()); +adminRoutes2.use("*", chunkTAOOLOUH_cjs.requireAuth()); adminRoutes2.use("*", async (c, next) => { const user = c.get("user"); if (user?.role !== "admin") { @@ -5638,7 +5638,7 @@ adminRoutes2.use("*", async (c, next) => { }); async function getSettings(db) { try { - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const plugin2 = await pluginService.getPlugin("security-audit"); if (plugin2?.settings) { const settings = typeof plugin2.settings === "string" ? JSON.parse(plugin2.settings) : plugin2.settings; @@ -5743,7 +5743,7 @@ adminRoutes2.post("/settings", async (c) => { autoPurge: body["retention.autoPurge"] === "true" } }; - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); await pluginService.updatePluginSettings("security-audit", settings); if (c.req.header("HX-Request")) { return c.json({ success: true }); @@ -5904,7 +5904,7 @@ var BruteForceDetector = class { // src/plugins/core-plugins/security-audit-plugin/routes/api.ts var apiRoutes2 = new hono.Hono(); -apiRoutes2.use("*", chunkV4V54BY3_cjs.requireAuth()); +apiRoutes2.use("*", chunkTAOOLOUH_cjs.requireAuth()); apiRoutes2.use("*", async (c, next) => { const user = c.get("user"); if (user?.role !== "admin") { @@ -5914,7 +5914,7 @@ apiRoutes2.use("*", async (c, next) => { }); async function getSettings2(db) { try { - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const plugin2 = await pluginService.getPlugin("security-audit"); if (plugin2?.settings) { const settings = typeof plugin2.settings === "string" ? JSON.parse(plugin2.settings) : plugin2.settings; @@ -6062,7 +6062,7 @@ function generateFingerprint(ip, userAgent) { } async function getPluginSettings(db) { try { - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const plugin2 = await pluginService.getPlugin("security-audit"); if (plugin2?.settings) { const settings = typeof plugin2.settings === "string" ? JSON.parse(plugin2.settings) : plugin2.settings; @@ -7072,7 +7072,7 @@ var DEFAULT_SETTINGS3 = { // src/plugins/core-plugins/stripe-plugin/routes/admin.ts var adminRoutes3 = new hono.Hono(); -adminRoutes3.use("*", chunkV4V54BY3_cjs.requireAuth()); +adminRoutes3.use("*", chunkTAOOLOUH_cjs.requireAuth()); adminRoutes3.use("*", async (c, next) => { const user = c.get("user"); if (user?.role !== "admin") { @@ -7082,7 +7082,7 @@ adminRoutes3.use("*", async (c, next) => { }); async function getSettings3(db) { try { - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const plugin2 = await pluginService.getPlugin("stripe"); if (plugin2?.settings) { const settings = typeof plugin2.settings === "string" ? JSON.parse(plugin2.settings) : plugin2.settings; @@ -7404,7 +7404,7 @@ function timingSafeEqual(a, b) { var apiRoutes3 = new hono.Hono(); async function getSettings4(db) { try { - const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const pluginService = new chunk656GGECX_cjs.PluginService(db); const plugin2 = await pluginService.getPlugin("stripe"); if (plugin2?.settings) { const settings = typeof plugin2.settings === "string" ? JSON.parse(plugin2.settings) : plugin2.settings; @@ -7555,7 +7555,7 @@ apiRoutes3.post("/webhook", async (c) => { } return c.json({ received: true }); }); -apiRoutes3.post("/create-checkout-session", chunkV4V54BY3_cjs.requireAuth(), async (c) => { +apiRoutes3.post("/create-checkout-session", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { const db = c.env.DB; const user = c.get("user"); if (!user) return c.json({ error: "Unauthorized" }, 401); @@ -7595,7 +7595,7 @@ apiRoutes3.post("/create-checkout-session", chunkV4V54BY3_cjs.requireAuth(), asy }); return c.json({ sessionId: session.id, url: session.url }); }); -apiRoutes3.get("/subscription", chunkV4V54BY3_cjs.requireAuth(), async (c) => { +apiRoutes3.get("/subscription", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { const user = c.get("user"); if (!user) return c.json({ error: "Unauthorized" }, 401); const db = c.env.DB; @@ -7607,7 +7607,7 @@ apiRoutes3.get("/subscription", chunkV4V54BY3_cjs.requireAuth(), async (c) => { } return c.json({ subscription }); }); -apiRoutes3.get("/subscriptions", chunkV4V54BY3_cjs.requireAuth(), async (c) => { +apiRoutes3.get("/subscriptions", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { const user = c.get("user"); if (user?.role !== "admin") return c.json({ error: "Access denied" }, 403); const db = c.env.DB; @@ -7623,7 +7623,7 @@ apiRoutes3.get("/subscriptions", chunkV4V54BY3_cjs.requireAuth(), async (c) => { const result = await subscriptionService.list(filters); return c.json(result); }); -apiRoutes3.get("/stats", chunkV4V54BY3_cjs.requireAuth(), async (c) => { +apiRoutes3.get("/stats", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { const user = c.get("user"); if (user?.role !== "admin") return c.json({ error: "Access denied" }, 403); const db = c.env.DB; @@ -7632,7 +7632,7 @@ apiRoutes3.get("/stats", chunkV4V54BY3_cjs.requireAuth(), async (c) => { const stats = await subscriptionService.getStats(); return c.json(stats); }); -apiRoutes3.post("/sync-subscriptions", chunkV4V54BY3_cjs.requireAuth(), async (c) => { +apiRoutes3.post("/sync-subscriptions", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { const user = c.get("user"); if (user?.role !== "admin") return c.json({ error: "Access denied" }, 403); const db = c.env.DB; @@ -7680,7 +7680,7 @@ apiRoutes3.post("/sync-subscriptions", chunkV4V54BY3_cjs.requireAuth(), async (c }, 500); } }); -apiRoutes3.get("/events", chunkV4V54BY3_cjs.requireAuth(), async (c) => { +apiRoutes3.get("/events", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { const user = c.get("user"); if (user?.role !== "admin") return c.json({ error: "Access denied" }, 403); const db = c.env.DB; @@ -7746,7 +7746,7 @@ function createStripePlugin() { var stripePlugin = createStripePlugin(); // src/middleware/plugin-menu.ts -var REGISTRY_MENU_PLUGINS = Object.values(chunkQOZZJZ76_cjs.PLUGIN_REGISTRY).filter((p) => p.adminMenu !== null).map((p) => ({ +var REGISTRY_MENU_PLUGINS = Object.values(chunk656GGECX_cjs.PLUGIN_REGISTRY).filter((p) => p.adminMenu !== null).map((p) => ({ codeName: p.codeName, label: p.adminMenu.label, path: p.adminMenu.path, @@ -7845,7 +7845,7 @@ var HOOKS2 = { USER_LOGIN: "user:login"}; chunkUYJ6TJHX_cjs.init_admin_layout_catalyst_template(); var adminRoutes4 = new hono.Hono(); -adminRoutes4.use("*", chunkV4V54BY3_cjs.requireAuth()); +adminRoutes4.use("*", chunkTAOOLOUH_cjs.requireAuth()); adminRoutes4.use("*", async (c, next) => { const user = c.get("user"); if (user?.role !== "admin") { @@ -9644,7 +9644,7 @@ function renderCacheDashboard(data) { - ${chunkBX75LZES_cjs.renderConfirmationDialog({ + ${chunkLPYFMGAK_cjs.renderConfirmationDialog({ id: "clear-all-cache-confirm", title: "Clear All Cache", message: "Are you sure you want to clear all cache entries? This cannot be undone.", @@ -9655,7 +9655,7 @@ function renderCacheDashboard(data) { onConfirm: "performClearAllCaches()" })} - ${chunkBX75LZES_cjs.renderConfirmationDialog({ + ${chunkLPYFMGAK_cjs.renderConfirmationDialog({ id: "clear-namespace-cache-confirm", title: "Clear Namespace Cache", message: "Clear cache for this namespace?", @@ -9666,7 +9666,7 @@ function renderCacheDashboard(data) { onConfirm: "performClearNamespaceCache()" })} - ${chunkBX75LZES_cjs.getConfirmationDialogScript()} + ${chunkLPYFMGAK_cjs.getConfirmationDialogScript()} `; const layoutData = { title: "Cache System", @@ -10352,14 +10352,14 @@ var faviconSvg = ` // src/app.ts function createSonicJSApp(config = {}) { const app2 = new hono.Hono(); - const appVersion = config.version || chunk74BFRAQS_cjs.getCoreVersion(); + const appVersion = config.version || chunkGLRZAPX6_cjs.getCoreVersion(); const appName = config.name || "SonicJS AI"; app2.use("*", async (c, next) => { c.set("appVersion", appVersion); await next(); }); - app2.use("*", chunkV4V54BY3_cjs.metricsMiddleware()); - app2.use("*", chunkV4V54BY3_cjs.bootstrapMiddleware(config)); + app2.use("*", chunkTAOOLOUH_cjs.metricsMiddleware()); + app2.use("*", chunkTAOOLOUH_cjs.bootstrapMiddleware(config)); if (config.middleware?.beforeAuth) { for (const middleware of config.middleware.beforeAuth) { app2.use("*", middleware); @@ -10368,32 +10368,32 @@ function createSonicJSApp(config = {}) { app2.use("*", async (_c, next) => { await next(); }); - app2.use("*", chunkV4V54BY3_cjs.securityHeadersMiddleware()); - app2.use("*", chunkV4V54BY3_cjs.csrfProtection()); + app2.use("*", chunkTAOOLOUH_cjs.securityHeadersMiddleware()); + app2.use("*", chunkTAOOLOUH_cjs.csrfProtection()); if (config.middleware?.afterAuth) { for (const middleware of config.middleware.afterAuth) { app2.use("*", middleware); } } const adminRoles = config.adminAccessRoles || ["admin"]; - app2.use("/admin/*", chunkV4V54BY3_cjs.requireAuth()); - app2.use("/admin/*", chunkV4V54BY3_cjs.requireRole(adminRoles)); + app2.use("/admin/*", chunkTAOOLOUH_cjs.requireAuth()); + app2.use("/admin/*", chunkTAOOLOUH_cjs.requireRole(adminRoles)); app2.use("/admin/*", pluginMenuMiddleware()); - app2.route("/api", chunkBX75LZES_cjs.api_default); - app2.route("/api/media", chunkBX75LZES_cjs.api_media_default); - app2.route("/api/system", chunkBX75LZES_cjs.api_system_default); - app2.route("/admin/api", chunkBX75LZES_cjs.admin_api_default); - app2.route("/admin/dashboard", chunkBX75LZES_cjs.router); - app2.route("/admin/collections", chunkBX75LZES_cjs.adminCollectionsRoutes); - app2.route("/admin/forms", chunkBX75LZES_cjs.adminFormsRoutes); - app2.route("/admin/settings", chunkBX75LZES_cjs.adminSettingsRoutes); - app2.route("/forms", chunkBX75LZES_cjs.public_forms_default); - app2.route("/api/forms", chunkBX75LZES_cjs.public_forms_default); - app2.route("/admin/api-reference", chunkBX75LZES_cjs.router2); + app2.route("/api", chunkLPYFMGAK_cjs.api_default); + app2.route("/api/media", chunkLPYFMGAK_cjs.api_media_default); + app2.route("/api/system", chunkLPYFMGAK_cjs.api_system_default); + app2.route("/admin/api", chunkLPYFMGAK_cjs.admin_api_default); + app2.route("/admin/dashboard", chunkLPYFMGAK_cjs.router); + app2.route("/admin/collections", chunkLPYFMGAK_cjs.adminCollectionsRoutes); + app2.route("/admin/forms", chunkLPYFMGAK_cjs.adminFormsRoutes); + app2.route("/admin/settings", chunkLPYFMGAK_cjs.adminSettingsRoutes); + app2.route("/forms", chunkLPYFMGAK_cjs.public_forms_default); + app2.route("/api/forms", chunkLPYFMGAK_cjs.public_forms_default); + app2.route("/admin/api-reference", chunkLPYFMGAK_cjs.router2); app2.route("/admin/database-tools", createDatabaseToolsAdminRoutes()); app2.route("/admin/seed-data", createSeedDataAdminRoutes()); - app2.route("/admin/content", chunkBX75LZES_cjs.admin_content_default); - app2.route("/admin/media", chunkBX75LZES_cjs.adminMediaRoutes); + app2.route("/admin/content", chunkLPYFMGAK_cjs.admin_content_default); + app2.route("/admin/media", chunkLPYFMGAK_cjs.adminMediaRoutes); app2.use("/auth/*", securityAuditMiddleware()); if (securityAuditPlugin.routes && securityAuditPlugin.routes.length > 0) { for (const route of securityAuditPlugin.routes) { @@ -10411,8 +10411,8 @@ function createSonicJSApp(config = {}) { app2.route(route.path, route.handler); } } - if (chunkBX75LZES_cjs.userProfilesPlugin.routes && chunkBX75LZES_cjs.userProfilesPlugin.routes.length > 0) { - for (const route of chunkBX75LZES_cjs.userProfilesPlugin.routes) { + if (chunkLPYFMGAK_cjs.userProfilesPlugin.routes && chunkLPYFMGAK_cjs.userProfilesPlugin.routes.length > 0) { + for (const route of chunkLPYFMGAK_cjs.userProfilesPlugin.routes) { app2.route(route.path, route.handler); } } @@ -10432,11 +10432,11 @@ function createSonicJSApp(config = {}) { app2.route(route.path, route.handler); } } - app2.route("/admin/plugins", chunkBX75LZES_cjs.adminPluginRoutes); - app2.route("/admin/logs", chunkBX75LZES_cjs.adminLogsRoutes); - app2.route("/admin", chunkBX75LZES_cjs.userRoutes); - app2.route("/auth", chunkBX75LZES_cjs.auth_default); - app2.route("/", chunkBX75LZES_cjs.test_cleanup_default); + app2.route("/admin/plugins", chunkLPYFMGAK_cjs.adminPluginRoutes); + app2.route("/admin/logs", chunkLPYFMGAK_cjs.adminLogsRoutes); + app2.route("/admin", chunkLPYFMGAK_cjs.userRoutes); + app2.route("/auth", chunkLPYFMGAK_cjs.auth_default); + app2.route("/", chunkLPYFMGAK_cjs.test_cleanup_default); if (emailPlugin.routes && emailPlugin.routes.length > 0) { for (const route of emailPlugin.routes) { app2.route(route.path, route.handler); @@ -10499,7 +10499,7 @@ function createSonicJSApp(config = {}) { timestamp: (/* @__PURE__ */ new Date()).toISOString() }); }); - chunkXWQVFWPW_cjs.setAppInstance(app2); + chunkWAEQXGCX_cjs.setAppInstance(app2); app2.notFound((c) => { return c.json({ error: "Not Found", status: 404 }, 404); }); @@ -10516,431 +10516,431 @@ function setupCoreRoutes(_app) { console.warn("setupCoreRoutes is deprecated. Use createSonicJSApp() instead."); } function createDb(d1$1) { - return d1.drizzle(d1$1, { schema: chunkXWQVFWPW_cjs.schema_exports }); + return d1.drizzle(d1$1, { schema: chunkWAEQXGCX_cjs.schema_exports }); } // src/index.ts -var VERSION = chunk74BFRAQS_cjs.package_default.version; +var VERSION = chunkGLRZAPX6_cjs.package_default.version; Object.defineProperty(exports, "ROUTES_INFO", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.ROUTES_INFO; } + get: function () { return chunkLPYFMGAK_cjs.ROUTES_INFO; } }); Object.defineProperty(exports, "adminApiRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.admin_api_default; } + get: function () { return chunkLPYFMGAK_cjs.admin_api_default; } }); Object.defineProperty(exports, "adminCheckboxRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminCheckboxRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminCheckboxRoutes; } }); Object.defineProperty(exports, "adminCodeExamplesRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.admin_code_examples_default; } + get: function () { return chunkLPYFMGAK_cjs.admin_code_examples_default; } }); Object.defineProperty(exports, "adminCollectionsRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminCollectionsRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminCollectionsRoutes; } }); Object.defineProperty(exports, "adminContentRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.admin_content_default; } + get: function () { return chunkLPYFMGAK_cjs.admin_content_default; } }); Object.defineProperty(exports, "adminDashboardRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.router; } + get: function () { return chunkLPYFMGAK_cjs.router; } }); Object.defineProperty(exports, "adminDesignRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminDesignRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminDesignRoutes; } }); Object.defineProperty(exports, "adminLogsRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminLogsRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminLogsRoutes; } }); Object.defineProperty(exports, "adminMediaRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminMediaRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminMediaRoutes; } }); Object.defineProperty(exports, "adminPluginRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminPluginRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminPluginRoutes; } }); Object.defineProperty(exports, "adminSettingsRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminSettingsRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminSettingsRoutes; } }); Object.defineProperty(exports, "adminTestimonialsRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.admin_testimonials_default; } + get: function () { return chunkLPYFMGAK_cjs.admin_testimonials_default; } }); Object.defineProperty(exports, "adminUsersRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.userRoutes; } + get: function () { return chunkLPYFMGAK_cjs.userRoutes; } }); Object.defineProperty(exports, "apiContentCrudRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.api_content_crud_default; } + get: function () { return chunkLPYFMGAK_cjs.api_content_crud_default; } }); Object.defineProperty(exports, "apiMediaRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.api_media_default; } + get: function () { return chunkLPYFMGAK_cjs.api_media_default; } }); Object.defineProperty(exports, "apiRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.api_default; } + get: function () { return chunkLPYFMGAK_cjs.api_default; } }); Object.defineProperty(exports, "apiSystemRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.api_system_default; } + get: function () { return chunkLPYFMGAK_cjs.api_system_default; } }); Object.defineProperty(exports, "authRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.auth_default; } + get: function () { return chunkLPYFMGAK_cjs.auth_default; } }); Object.defineProperty(exports, "createUserProfilesPlugin", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.createUserProfilesPlugin; } + get: function () { return chunkLPYFMGAK_cjs.createUserProfilesPlugin; } }); Object.defineProperty(exports, "defineUserProfile", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.defineUserProfile; } + get: function () { return chunkLPYFMGAK_cjs.defineUserProfile; } }); Object.defineProperty(exports, "getUserProfileConfig", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.getUserProfileConfig; } + get: function () { return chunkLPYFMGAK_cjs.getUserProfileConfig; } }); Object.defineProperty(exports, "userProfilesPlugin", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.userProfilesPlugin; } + get: function () { return chunkLPYFMGAK_cjs.userProfilesPlugin; } }); Object.defineProperty(exports, "Logger", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.Logger; } + get: function () { return chunkWAEQXGCX_cjs.Logger; } }); Object.defineProperty(exports, "apiTokens", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.apiTokens; } + get: function () { return chunkWAEQXGCX_cjs.apiTokens; } }); Object.defineProperty(exports, "collections", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.collections; } + get: function () { return chunkWAEQXGCX_cjs.collections; } }); Object.defineProperty(exports, "content", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.content; } + get: function () { return chunkWAEQXGCX_cjs.content; } }); Object.defineProperty(exports, "contentVersions", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.contentVersions; } + get: function () { return chunkWAEQXGCX_cjs.contentVersions; } }); Object.defineProperty(exports, "getLogger", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.getLogger; } + get: function () { return chunkWAEQXGCX_cjs.getLogger; } }); Object.defineProperty(exports, "initLogger", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.initLogger; } + get: function () { return chunkWAEQXGCX_cjs.initLogger; } }); Object.defineProperty(exports, "insertCollectionSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertCollectionSchema; } + get: function () { return chunkWAEQXGCX_cjs.insertCollectionSchema; } }); Object.defineProperty(exports, "insertContentSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertContentSchema; } + get: function () { return chunkWAEQXGCX_cjs.insertContentSchema; } }); Object.defineProperty(exports, "insertLogConfigSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertLogConfigSchema; } + get: function () { return chunkWAEQXGCX_cjs.insertLogConfigSchema; } }); Object.defineProperty(exports, "insertMediaSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertMediaSchema; } + get: function () { return chunkWAEQXGCX_cjs.insertMediaSchema; } }); Object.defineProperty(exports, "insertPluginActivityLogSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertPluginActivityLogSchema; } + get: function () { return chunkWAEQXGCX_cjs.insertPluginActivityLogSchema; } }); Object.defineProperty(exports, "insertPluginAssetSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertPluginAssetSchema; } + get: function () { return chunkWAEQXGCX_cjs.insertPluginAssetSchema; } }); Object.defineProperty(exports, "insertPluginHookSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertPluginHookSchema; } + get: function () { return chunkWAEQXGCX_cjs.insertPluginHookSchema; } }); Object.defineProperty(exports, "insertPluginRouteSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertPluginRouteSchema; } + get: function () { return chunkWAEQXGCX_cjs.insertPluginRouteSchema; } }); Object.defineProperty(exports, "insertPluginSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertPluginSchema; } + get: function () { return chunkWAEQXGCX_cjs.insertPluginSchema; } }); Object.defineProperty(exports, "insertSystemLogSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertSystemLogSchema; } + get: function () { return chunkWAEQXGCX_cjs.insertSystemLogSchema; } }); Object.defineProperty(exports, "insertUserSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertUserSchema; } + get: function () { return chunkWAEQXGCX_cjs.insertUserSchema; } }); Object.defineProperty(exports, "insertWorkflowHistorySchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.insertWorkflowHistorySchema; } + get: function () { return chunkWAEQXGCX_cjs.insertWorkflowHistorySchema; } }); Object.defineProperty(exports, "logConfig", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.logConfig; } + get: function () { return chunkWAEQXGCX_cjs.logConfig; } }); Object.defineProperty(exports, "media", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.media; } + get: function () { return chunkWAEQXGCX_cjs.media; } }); Object.defineProperty(exports, "pluginActivityLog", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.pluginActivityLog; } + get: function () { return chunkWAEQXGCX_cjs.pluginActivityLog; } }); Object.defineProperty(exports, "pluginAssets", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.pluginAssets; } + get: function () { return chunkWAEQXGCX_cjs.pluginAssets; } }); Object.defineProperty(exports, "pluginHooks", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.pluginHooks; } + get: function () { return chunkWAEQXGCX_cjs.pluginHooks; } }); Object.defineProperty(exports, "pluginRoutes", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.pluginRoutes; } + get: function () { return chunkWAEQXGCX_cjs.pluginRoutes; } }); Object.defineProperty(exports, "plugins", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.plugins; } + get: function () { return chunkWAEQXGCX_cjs.plugins; } }); Object.defineProperty(exports, "selectCollectionSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectCollectionSchema; } + get: function () { return chunkWAEQXGCX_cjs.selectCollectionSchema; } }); Object.defineProperty(exports, "selectContentSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectContentSchema; } + get: function () { return chunkWAEQXGCX_cjs.selectContentSchema; } }); Object.defineProperty(exports, "selectLogConfigSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectLogConfigSchema; } + get: function () { return chunkWAEQXGCX_cjs.selectLogConfigSchema; } }); Object.defineProperty(exports, "selectMediaSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectMediaSchema; } + get: function () { return chunkWAEQXGCX_cjs.selectMediaSchema; } }); Object.defineProperty(exports, "selectPluginActivityLogSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectPluginActivityLogSchema; } + get: function () { return chunkWAEQXGCX_cjs.selectPluginActivityLogSchema; } }); Object.defineProperty(exports, "selectPluginAssetSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectPluginAssetSchema; } + get: function () { return chunkWAEQXGCX_cjs.selectPluginAssetSchema; } }); Object.defineProperty(exports, "selectPluginHookSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectPluginHookSchema; } + get: function () { return chunkWAEQXGCX_cjs.selectPluginHookSchema; } }); Object.defineProperty(exports, "selectPluginRouteSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectPluginRouteSchema; } + get: function () { return chunkWAEQXGCX_cjs.selectPluginRouteSchema; } }); Object.defineProperty(exports, "selectPluginSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectPluginSchema; } + get: function () { return chunkWAEQXGCX_cjs.selectPluginSchema; } }); Object.defineProperty(exports, "selectSystemLogSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectSystemLogSchema; } + get: function () { return chunkWAEQXGCX_cjs.selectSystemLogSchema; } }); Object.defineProperty(exports, "selectUserSchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectUserSchema; } + get: function () { return chunkWAEQXGCX_cjs.selectUserSchema; } }); Object.defineProperty(exports, "selectWorkflowHistorySchema", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.selectWorkflowHistorySchema; } + get: function () { return chunkWAEQXGCX_cjs.selectWorkflowHistorySchema; } }); Object.defineProperty(exports, "systemLogs", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.systemLogs; } + get: function () { return chunkWAEQXGCX_cjs.systemLogs; } }); Object.defineProperty(exports, "users", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.users; } + get: function () { return chunkWAEQXGCX_cjs.users; } }); Object.defineProperty(exports, "workflowHistory", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.workflowHistory; } + get: function () { return chunkWAEQXGCX_cjs.workflowHistory; } }); Object.defineProperty(exports, "AuthManager", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.AuthManager; } + get: function () { return chunkTAOOLOUH_cjs.AuthManager; } }); Object.defineProperty(exports, "PermissionManager", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.PermissionManager; } + get: function () { return chunkTAOOLOUH_cjs.PermissionManager; } }); Object.defineProperty(exports, "bootstrapMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.bootstrapMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.bootstrapMiddleware; } }); Object.defineProperty(exports, "cacheHeaders", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.cacheHeaders; } + get: function () { return chunkTAOOLOUH_cjs.cacheHeaders; } }); Object.defineProperty(exports, "compressionMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.compressionMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.compressionMiddleware; } }); Object.defineProperty(exports, "detailedLoggingMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.detailedLoggingMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.detailedLoggingMiddleware; } }); Object.defineProperty(exports, "getActivePlugins", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.getActivePlugins; } + get: function () { return chunkTAOOLOUH_cjs.getActivePlugins; } }); Object.defineProperty(exports, "isPluginActive", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.isPluginActive; } + get: function () { return chunkTAOOLOUH_cjs.isPluginActive; } }); Object.defineProperty(exports, "logActivity", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.logActivity; } + get: function () { return chunkTAOOLOUH_cjs.logActivity; } }); Object.defineProperty(exports, "loggingMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.loggingMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.loggingMiddleware; } }); Object.defineProperty(exports, "optionalAuth", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.optionalAuth; } + get: function () { return chunkTAOOLOUH_cjs.optionalAuth; } }); Object.defineProperty(exports, "performanceLoggingMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.performanceLoggingMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.performanceLoggingMiddleware; } }); Object.defineProperty(exports, "requireActivePlugin", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requireActivePlugin; } + get: function () { return chunkTAOOLOUH_cjs.requireActivePlugin; } }); Object.defineProperty(exports, "requireActivePlugins", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requireActivePlugins; } + get: function () { return chunkTAOOLOUH_cjs.requireActivePlugins; } }); Object.defineProperty(exports, "requireAnyPermission", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requireAnyPermission; } + get: function () { return chunkTAOOLOUH_cjs.requireAnyPermission; } }); Object.defineProperty(exports, "requireAuth", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requireAuth; } + get: function () { return chunkTAOOLOUH_cjs.requireAuth; } }); Object.defineProperty(exports, "requirePermission", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requirePermission; } + get: function () { return chunkTAOOLOUH_cjs.requirePermission; } }); Object.defineProperty(exports, "requireRole", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requireRole; } + get: function () { return chunkTAOOLOUH_cjs.requireRole; } }); Object.defineProperty(exports, "securityHeaders", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.securityHeadersMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.securityHeadersMiddleware; } }); Object.defineProperty(exports, "securityLoggingMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.securityLoggingMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.securityLoggingMiddleware; } }); Object.defineProperty(exports, "PluginBootstrapService", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.PluginBootstrapService; } + get: function () { return chunk656GGECX_cjs.PluginBootstrapService; } }); Object.defineProperty(exports, "PluginServiceClass", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.PluginService; } + get: function () { return chunk656GGECX_cjs.PluginService; } }); Object.defineProperty(exports, "backfillFormSubmissions", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.backfillFormSubmissions; } + get: function () { return chunk656GGECX_cjs.backfillFormSubmissions; } }); Object.defineProperty(exports, "cleanupRemovedCollections", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.cleanupRemovedCollections; } + get: function () { return chunk656GGECX_cjs.cleanupRemovedCollections; } }); Object.defineProperty(exports, "createContentFromSubmission", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.createContentFromSubmission; } + get: function () { return chunk656GGECX_cjs.createContentFromSubmission; } }); Object.defineProperty(exports, "deriveCollectionSchemaFromFormio", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.deriveCollectionSchemaFromFormio; } + get: function () { return chunk656GGECX_cjs.deriveCollectionSchemaFromFormio; } }); Object.defineProperty(exports, "deriveSubmissionTitle", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.deriveSubmissionTitle; } + get: function () { return chunk656GGECX_cjs.deriveSubmissionTitle; } }); Object.defineProperty(exports, "fullCollectionSync", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.fullCollectionSync; } + get: function () { return chunk656GGECX_cjs.fullCollectionSync; } }); Object.defineProperty(exports, "getAvailableCollectionNames", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.getAvailableCollectionNames; } + get: function () { return chunk656GGECX_cjs.getAvailableCollectionNames; } }); Object.defineProperty(exports, "getManagedCollections", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.getManagedCollections; } + get: function () { return chunk656GGECX_cjs.getManagedCollections; } }); Object.defineProperty(exports, "isCollectionManaged", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.isCollectionManaged; } + get: function () { return chunk656GGECX_cjs.isCollectionManaged; } }); Object.defineProperty(exports, "loadCollectionConfig", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.loadCollectionConfig; } + get: function () { return chunk656GGECX_cjs.loadCollectionConfig; } }); Object.defineProperty(exports, "loadCollectionConfigs", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.loadCollectionConfigs; } + get: function () { return chunk656GGECX_cjs.loadCollectionConfigs; } }); Object.defineProperty(exports, "mapFormStatusToContentStatus", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.mapFormStatusToContentStatus; } + get: function () { return chunk656GGECX_cjs.mapFormStatusToContentStatus; } }); Object.defineProperty(exports, "registerCollections", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.registerCollections; } + get: function () { return chunk656GGECX_cjs.registerCollections; } }); Object.defineProperty(exports, "syncAllFormCollections", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.syncAllFormCollections; } + get: function () { return chunk656GGECX_cjs.syncAllFormCollections; } }); Object.defineProperty(exports, "syncCollection", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.syncCollection; } + get: function () { return chunk656GGECX_cjs.syncCollection; } }); Object.defineProperty(exports, "syncCollections", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.syncCollections; } + get: function () { return chunk656GGECX_cjs.syncCollections; } }); Object.defineProperty(exports, "syncFormCollection", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.syncFormCollection; } + get: function () { return chunk656GGECX_cjs.syncFormCollection; } }); Object.defineProperty(exports, "validateCollectionConfig", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.validateCollectionConfig; } + get: function () { return chunk656GGECX_cjs.validateCollectionConfig; } }); Object.defineProperty(exports, "MigrationService", { enumerable: true, - get: function () { return chunk7KR6GOY3_cjs.MigrationService; } + get: function () { return chunkICMNCCX2_cjs.MigrationService; } }); Object.defineProperty(exports, "renderFilterBar", { enumerable: true, @@ -10976,27 +10976,27 @@ Object.defineProperty(exports, "renderTable", { }); Object.defineProperty(exports, "HookSystemImpl", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.HookSystemImpl; } + get: function () { return chunkABB34XUS_cjs.HookSystemImpl; } }); Object.defineProperty(exports, "HookUtils", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.HookUtils; } + get: function () { return chunkABB34XUS_cjs.HookUtils; } }); Object.defineProperty(exports, "PluginManagerClass", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.PluginManager; } + get: function () { return chunkABB34XUS_cjs.PluginManager; } }); Object.defineProperty(exports, "PluginRegistryImpl", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.PluginRegistryImpl; } + get: function () { return chunkABB34XUS_cjs.PluginRegistryImpl; } }); Object.defineProperty(exports, "PluginValidatorClass", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.PluginValidator; } + get: function () { return chunkABB34XUS_cjs.PluginValidator; } }); Object.defineProperty(exports, "ScopedHookSystemClass", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.ScopedHookSystem; } + get: function () { return chunkABB34XUS_cjs.ScopedHookSystem; } }); Object.defineProperty(exports, "PluginBuilder", { enumerable: true, @@ -11008,31 +11008,31 @@ Object.defineProperty(exports, "PluginHelpers", { }); Object.defineProperty(exports, "QueryFilterBuilder", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.QueryFilterBuilder; } + get: function () { return chunkGLRZAPX6_cjs.QueryFilterBuilder; } }); Object.defineProperty(exports, "SONICJS_VERSION", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.SONICJS_VERSION; } + get: function () { return chunkGLRZAPX6_cjs.SONICJS_VERSION; } }); Object.defineProperty(exports, "TemplateRenderer", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.TemplateRenderer; } + get: function () { return chunkGLRZAPX6_cjs.TemplateRenderer; } }); Object.defineProperty(exports, "buildQuery", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.buildQuery; } + get: function () { return chunkGLRZAPX6_cjs.buildQuery; } }); Object.defineProperty(exports, "getCoreVersion", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.getCoreVersion; } + get: function () { return chunkGLRZAPX6_cjs.getCoreVersion; } }); Object.defineProperty(exports, "renderTemplate", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.renderTemplate; } + get: function () { return chunkGLRZAPX6_cjs.renderTemplate; } }); Object.defineProperty(exports, "templateRenderer", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.templateRenderer; } + get: function () { return chunkGLRZAPX6_cjs.templateRenderer; } }); Object.defineProperty(exports, "metricsTracker", { enumerable: true, diff --git a/packages/core/dist/index.cjs.map b/packages/core/dist/index.cjs.map index bb263e86a..d7ae2d876 100644 --- a/packages/core/dist/index.cjs.map +++ b/packages/core/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/core-plugins/database-tools-plugin/services/database-service.ts","../src/templates/pages/admin-database-table.template.ts","../src/plugins/core-plugins/database-tools-plugin/admin-routes.ts","../src/plugins/core-plugins/seed-data-plugin/services/seed-data-service.ts","../src/plugins/core-plugins/seed-data-plugin/admin-routes.ts","../src/plugins/core-plugins/email-plugin/index.ts","../src/plugins/core-plugins/otp-login-plugin/otp-service.ts","../src/plugins/core-plugins/otp-login-plugin/email-templates.ts","../src/plugins/core-plugins/otp-login-plugin/index.ts","../src/plugins/core-plugins/oauth-providers/oauth-service.ts","../src/plugins/core-plugins/oauth-providers/index.ts","../src/plugins/core-plugins/ai-search-plugin/services/embedding.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/chunking.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/custom-rag.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/ai-search.ts","../src/plugins/core-plugins/ai-search-plugin/services/indexer.ts","../src/plugins/core-plugins/ai-search-plugin/components/settings-page.ts","../src/plugins/core-plugins/ai-search-plugin/routes/admin.ts","../src/plugins/core-plugins/ai-search-plugin/routes/api.ts","../src/plugins/core-plugins/ai-search-plugin/manifest.json","../src/plugins/core-plugins/ai-search-plugin/index.ts","../src/plugins/available/magic-link-auth/index.ts","../src/plugins/core-plugins/security-audit-plugin/types.ts","../src/plugins/core-plugins/security-audit-plugin/services/security-audit-service.ts","../src/plugins/core-plugins/security-audit-plugin/components/dashboard-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/event-log-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/settings-page.ts","../src/plugins/core-plugins/security-audit-plugin/routes/admin.ts","../src/plugins/core-plugins/security-audit-plugin/services/brute-force-detector.ts","../src/plugins/core-plugins/security-audit-plugin/routes/api.ts","../src/plugins/core-plugins/security-audit-plugin/middleware/audit-middleware.ts","../src/plugins/core-plugins/security-audit-plugin/index.ts","../src/plugins/core-plugins/stripe-plugin/services/subscription-service.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-event-service.ts","../src/plugins/core-plugins/stripe-plugin/components/subscriptions-page.ts","../src/plugins/core-plugins/stripe-plugin/components/tab-bar.ts","../src/plugins/core-plugins/stripe-plugin/components/events-page.ts","../src/plugins/core-plugins/stripe-plugin/types.ts","../src/plugins/core-plugins/stripe-plugin/routes/admin.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-api.ts","../src/plugins/core-plugins/stripe-plugin/routes/api.ts","../src/plugins/core-plugins/stripe-plugin/index.ts","../src/middleware/plugin-menu.ts","../src/plugins/types.ts","../src/plugins/core-plugins/analytics/routes/admin.ts","../src/plugins/core-plugins/analytics/index.ts","../src/plugins/core-plugins/analytics/services/event-tracking-service.ts","../src/plugins/core-plugins/analytics/routes/api.ts","../src/plugins/cache/services/cache-config.ts","../src/plugins/cache/services/cache.ts","../src/plugins/cache/services/event-bus.ts","../src/plugins/cache/services/cache-invalidation.ts","../src/plugins/cache/services/cache-warming.ts","../src/templates/pages/admin-cache.template.ts","../src/plugins/cache/routes.ts","../src/plugins/cache/index.ts","../src/assets/favicon.ts","../src/app.ts","../src/db/index.ts","../src/index.ts"],"names":["init_admin_layout_catalyst_template","escapeHtml","renderAdminLayoutCatalyst","router","Hono","requireAuth","PluginBuilder","plugin","z","SettingsService","emailPlugin","getJwtExpirySecondsFromDb","AuthManager","setCookie","getCustomData","getCookie","tokenTtl","jwt","content","collections","statusBadge","renderAdminLayout","api_default","DEFAULT_SETTINGS","formatTimestamp","severityBadge","eventTypeBadge","adminRoutes","PluginService","apiRoutes","getSettings","isPluginActive","logPromise","renderPagination","PLUGIN_REGISTRY","HOOKS","PluginHelpers","media","renderConfirmationDialog","getConfirmationDialogScript","totalRequests","app","getCoreVersion","metricsMiddleware","bootstrapMiddleware","securityHeadersMiddleware","csrfProtection","requireRole","api_media_default","api_system_default","admin_api_default","adminCollectionsRoutes","adminFormsRoutes","adminSettingsRoutes","public_forms_default","admin_content_default","adminMediaRoutes","userProfilesPlugin","adminPluginRoutes","adminLogsRoutes","userRoutes","auth_default","test_cleanup_default","setAppInstance","d1","drizzle","schema_exports","package_default"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyBO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,MAAM,gBAAA,GAA2C;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,QAAQ,EAAC;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,KAAA,MAAW,aAAa,MAAA,EAAQ;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAE,CAAA,CAAE,KAAA,EAAM;AACzF,QAAA,MAAM,QAAA,GAAY,QAAQ,KAAA,IAAoB,CAAA;AAE9C,QAAA,KAAA,CAAM,OAAO,IAAA,CAAK;AAAA,UAChB,IAAA,EAAM,SAAA;AAAA,UACN;AAAA,SACD,CAAA;AACD,QAAA,KAAA,CAAM,SAAA,IAAa,QAAA;AAAA,MACrB,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MACnE;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SAAA,GAA+B;AAC3C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKpC,EAAE,GAAA,EAAI;AAEP,IAAA,OAAO,MAAA,CAAO,SAAS,GAAA,CAAI,CAAC,QAAa,GAAA,CAAI,IAAI,KAAK,EAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,UAAA,EAA6C;AACjE,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,gBAA0B,EAAC;AACjC,IAAA,IAAI,kBAAA,GAAqB,KAAA;AAEzB,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,QAC9B;AAAA,OACF,CAAE,IAAA,CAAK,UAAA,EAAY,OAAO,EAAE,KAAA,EAAM;AAElC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,uDAAA;AAAA,UACT,eAAe,EAAC;AAAA,UAChB,kBAAA,EAAoB,KAAA;AAAA,UACpB,MAAA,EAAQ,CAAC,sBAAsB;AAAA,SACjC;AAAA,MACF;AAGA,MAAA,MAAM,gBAAA,GAAmB;AAAA,QACvB,SAAA;AAAA,QACA,kBAAA;AAAA,QACA,yBAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,eAAA;AAAA,QACA,YAAA;AAAA,QACA,kBAAA;AAAA,QACA,mBAAA;AAAA,QACA,MAAA;AAAA,QACA,gBAAA;AAAA,QACA,SAAA;AAAA,QACA,iBAAA;AAAA,QACA,iBAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,SAAA,EAAU;AAC5C,MAAA,MAAM,gBAAgB,gBAAA,CAAiB,MAAA;AAAA,QAAO,CAAA,KAAA,KAC5C,cAAA,CAAe,QAAA,CAAS,KAAK;AAAA,OAC/B;AAGA,MAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,QAAA,IAAI;AACF,UAAA,MAAM,KAAK,EAAA,CAAG,OAAA,CAAQ,eAAe,SAAS,CAAA,CAAE,EAAE,GAAA,EAAI;AACtD,UAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAAA,QAC9B,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,sBAAA,EAAyB,SAAS,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAC1D,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QAC3D;AAAA,MACF;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ,iDAAiD,EACpE,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,CAAE,GAAA,EAAI;AAGjC,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,UAChC;AAAA,SACF,CAAE,IAAA,CAAK,UAAA,EAAY,OAAO,EAAE,KAAA,EAAM;AAElC,QAAA,kBAAA,GAAqB,CAAC,CAAC,WAAA;AACvB,QAAA,aAAA,CAAc,KAAK,mBAAmB,CAAA;AAAA,MACxC,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iCAAA,EAAoC,KAAK,CAAA,CAAE,CAAA;AACvD,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAAA,MACxD;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,6BAA6B,EAAE,GAAA,EAAI;AAAA,MAC3D,SAAS,KAAA,EAAO;AAAA,MAEhB;AAEA,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,GAAS,CAAA,GAC5B,CAAA,0BAAA,EAA6B,MAAA,CAAO,MAAM,CAAA,SAAA,EAAY,aAAA,CAAc,MAAM,CAAA,gBAAA,CAAA,GAC1E,CAAA,iCAAA,EAAoC,cAAc,MAAM,CAAA,gBAAA,CAAA;AAE5D,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,QAC3B,OAAA;AAAA,QACA,aAAA;AAAA,QACA,kBAAA;AAAA,QACA,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,KAAA;AAAA,OACvC;AAAA,IAEF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,+BAA+B,KAAK,CAAA,CAAA;AAAA,QAC7C,aAAA;AAAA,QACA,kBAAA;AAAA,QACA,MAAA,EAAQ,CAAC,MAAA,CAAO,KAAK,CAAC;AAAA,OACxB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAkF;AACtF,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACrC,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAI1C,MAAA,OAAA,CAAQ,IAAI,CAAA,OAAA,EAAU,QAAQ,CAAA,cAAA,EAAiB,KAAA,CAAM,SAAS,CAAA,WAAA,CAAa,CAAA;AAE3E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,CAAA,6BAAA,EAAgC,KAAA,CAAM,SAAS,CAAA,MAAA,CAAA;AAAA,QACxD;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,kBAAkB,KAAK,CAAA;AAAA,OAClC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,SAAA,EACA,KAAA,GAAgB,KAChB,MAAA,GAAiB,CAAA,EACjB,UAAA,EACA,aAAA,GAAgC,KAAA,EACZ;AACpB,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,SAAS,CAAA,UAAA,CAAY,CAAA;AAAA,MAChD;AAGA,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAA,CAAG,CAAA,CAAE,GAAA,EAAI;AAClF,MAAA,MAAM,OAAA,GAAU,aAAa,OAAA,EAAS,GAAA,CAAI,CAAC,GAAA,KAAa,GAAA,CAAI,IAAI,CAAA,IAAK,EAAC;AAGtE,MAAA,IAAI,UAAA,IAAc,CAAC,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AAC/C,QAAA,UAAA,GAAa,KAAA,CAAA;AAAA,MACf;AAGA,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAE,CAAA,CAAE,KAAA,EAAM;AAC9F,MAAA,MAAM,SAAA,GAAa,aAAa,KAAA,IAAoB,CAAA;AAGpD,MAAA,IAAI,KAAA,GAAQ,iBAAiB,SAAS,CAAA,CAAA;AACtC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,KAAA,IAAS,CAAA,UAAA,EAAa,UAAU,CAAA,CAAA,EAAI,aAAA,CAAc,aAAa,CAAA,CAAA;AAAA,MACjE;AACA,MAAA,KAAA,IAAS,CAAA,OAAA,EAAU,KAAK,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AAGzC,MAAA,MAAM,aAAa,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ,KAAK,EAAE,GAAA,EAAI;AAEpD,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EAAM,UAAA,CAAW,OAAA,IAAW,EAAC;AAAA,QAC7B;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAK,CAAA,CAAE,CAAA;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAkE;AACtE,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,SAAA,EAAW,aAAa,CAAA;AACzD,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,SAAA,EAAU;AAE5C,MAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,QAAA,IAAI,CAAC,cAAA,CAAe,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAA2B,KAAK,CAAA,CAAE,CAAA;AAAA,QAChD;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,QAC/B;AAAA,OACF,CAAE,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,EAAM;AAEtB,MAAA,IAAK,UAAA,EAAY,UAAqB,CAAA,EAAG;AACvC,QAAA,MAAA,CAAO,KAAK,sBAAsB,CAAA;AAAA,MACpC;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,kBAAkB,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ,wBAAwB,EAAE,KAAA,EAAM;AAC9E,QAAA,IAAI,eAAA,IAAoB,eAAA,CAAwB,eAAA,KAAoB,IAAA,EAAM;AACxE,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iCAAA,EAAqC,eAAA,CAAwB,eAAe,CAAA,CAAE,CAAA;AAAA,QAC5F;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAE,CAAA;AAAA,MACvD;AAAA,IAEF,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,kBAAA,EAAqB,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AACF,CAAA;;;AC5SAA,qDAAA,EAAA;AAkBO,SAAS,wBAAwB,IAAA,EAAqC;AAC3E,EAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,KAAK,QAAQ,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAA,CAAY,IAAA,CAAK,WAAA,GAAc,CAAA,IAAK,KAAK,QAAA,GAAW,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,IAAA,CAAK,cAAc,IAAA,CAAK,QAAA,EAAU,KAAK,SAAS,CAAA;AAExE,EAAA,MAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sGAAA,EAgBkF,KAAK,SAAS,CAAA;AAAA;AAAA,oBAAA,EAEhG,QAAA,CAAS,cAAA,EAAgB,CAAA,GAAA,EAAM,MAAA,CAAO,cAAA,EAAgB,CAAA,IAAA,EAAO,IAAA,CAAK,SAAA,CAAU,cAAA,EAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAA,EAa/E,IAAA,CAAK,QAAA,KAAa,EAAA,GAAK,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EACtC,IAAA,CAAK,QAAA,KAAa,EAAA,GAAK,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EACtC,IAAA,CAAK,QAAA,KAAa,EAAA,GAAK,UAAA,GAAa,EAAE,CAAA;AAAA,kCAAA,EACrC,IAAA,CAAK,QAAA,KAAa,GAAA,GAAM,UAAA,GAAa,EAAE,CAAA;AAAA,kCAAA,EACvC,IAAA,CAAK,QAAA,KAAa,GAAA,GAAM,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAsBzD,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,KAAO;AAAA;AAAA;AAAA;AAAA,wCAAA,EAIA,GAAG,CAAA;AAAA;AAAA;AAAA,4BAAA,EAGf,GAAG,CAAA;AAAA,sBAAA,EACT,IAAA,CAAK,eAAe,GAAA,GAAM;AAAA,4CAAA,EACJ,IAAA,CAAK,aAAA,KAAkB,KAAA,GAAQ,EAAA,GAAK,YAAY,CAAA;AAAA;AAAA;AAAA,sBAAA,CAAA,GAGpE;AAAA;AAAA;AAAA;AAAA,sBAAA,CAIH;AAAA;AAAA;AAAA,gBAAA,CAGN,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,cAAA,EAIX,IAAA,CAAK,KAAK,MAAA,GAAS,CAAA,GACjB,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,KAAQ;AAAA,6BAAA,EACf,GAAA,GAAM,CAAA,KAAM,CAAA,GAAI,2BAAA,GAA8B,gCAAgC,CAAA;AAAA,oBAAA,EACvF,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,KAAO;AAAA,qJAAA,EACyGC,YAAW,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,EAAE,CAAC,CAAC,CAAA;AAAA,wBAAA,EAC/J,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAC,CAAC;AAAA;AAAA,oBAAA,CAE9B,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA,gBAAA,CAEd,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GACR;AAAA;AAAA,iCAAA,EAEiB,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,CAQxC;AAAA;AAAA;AAAA;;AAAA;AAAA,QAAA,EAMJ,aAAa,CAAA,GAAI;AAAA;AAAA;AAAA;AAAA,kCAAA,EAIS,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,gBAAA,EACtC,IAAA,CAAK,WAAA,KAAgB,CAAA,GAAI,UAAA,GAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,EAMtB,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,gBAAA,EACtC,IAAA,CAAK,WAAA,KAAgB,UAAA,GAAa,UAAA,GAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAAA,EAShB,IAAA,CAAK,WAAW,CAAA,qCAAA,EAAwC,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,EAM7E,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,oBAAA,EACtC,IAAA,CAAK,WAAA,KAAgB,CAAA,GAAI,UAAA,GAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,kBAAA,EAS1C,mBAAA,CAAoB,IAAA,CAAK,WAAA,EAAa,UAAU,CAAC;;AAAA;AAAA,sCAAA,EAG7B,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,oBAAA,EACtC,IAAA,CAAK,WAAA,KAAgB,UAAA,GAAa,UAAA,GAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,GAY3D,EAAE;AAAA;AAAA;;AAAA;AAAA,gCAAA,EAKoB,KAAK,SAAS,CAAA;AAAA,wBAAA,EACtB,KAAK,WAAW,CAAA;AAAA,4BAAA,EACZ,KAAK,QAAQ,CAAA;AAAA,yBAAA,EAChB,IAAA,CAAK,cAAc,EAAE,CAAA;AAAA,4BAAA,EAClB,IAAA,CAAK,iBAAiB,KAAK,CAAA;;AAAA;AAAA,+BAAA,EAGxB,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAsEzC,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,CAAA,OAAA,EAAU,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,IAC/B,SAAA,EAAW,CAAA,UAAA,EAAa,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,IACtC,WAAA,EAAa,CAAA,6BAAA,EAAgC,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,IAC3D,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,OAAOC,4CAA0B,UAAU,CAAA;AAC7C;AAEA,SAAS,mBAAA,CAAoB,aAAqB,UAAA,EAA4B;AAC5E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,UAAA,GAAa,CAAA;AAEnB,EAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACd;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AACzC,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB,CAAA,MAAA,IAAW,WAAA,IAAe,UAAA,GAAa,CAAA,EAAG;AACxC,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,aAAa,CAAA,EAAG,CAAA,IAAK,YAAY,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACjE,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,cAAc,CAAA,EAAG,CAAA,IAAK,cAAc,CAAA,EAAG,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AACrE,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,IAAI,CAAA,IAAA,KAAQ;AACvB,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,OAAO;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,IAKT;AAEA,IAAA,MAAM,WAAW,IAAA,KAAS,WAAA;AAC1B,IAAA,OAAO;AAAA;AAAA,0BAAA,EAEiB,IAAI,CAAA;AAAA,iFAAA,EAEtB,QAAA,GACI,gJACA,6HACN,CAAA;AAAA;AAAA,QAAA,EAEE,IAAI;AAAA;AAAA,IAAA,CAAA;AAAA,EAGZ,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACZ;AAEA,SAASD,YAAW,IAAA,EAAsB;AACxC,EAAA,MAAM,GAAA,GAA8B;AAAA,IAClC,GAAA,EAAK,OAAA;AAAA,IACL,GAAA,EAAK,MAAA;AAAA,IACL,GAAA,EAAK,MAAA;AAAA,IACL,GAAA,EAAK,QAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AACA,EAAA,OAAO,MAAA,CAAO,IAAI,CAAA,CAAE,OAAA,CAAQ,YAAY,CAAA,CAAA,KAAK,GAAA,CAAI,CAAC,CAAA,IAAK,CAAC,CAAA;AAC1D;AAEA,SAAS,gBAAgB,KAAA,EAAoB;AAC3C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,mEAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,CAAA,qDAAA,EAAwD,KAAA,GAAQ,sEAAA,GAAyE,+DAA+D,KAAK,KAAK,CAAA,OAAA,CAAA;AAAA,EAC3N;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,sEAAsE,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,UAAU,CAAA,EAAG,EAAE,CAAA,IAAK,IAAA,CAAK,UAAU,KAAK,CAAA,CAAE,MAAA,GAAS,EAAA,GAAK,QAAQ,EAAA,CAAA,GAAM,SAAA;AAAA,EAC3K;AACA,EAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,EAAA,IAAI,GAAA,CAAI,SAAS,GAAA,EAAK;AACpB,IAAA,OAAOA,YAAW,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA,GAAI,KAAA;AAAA,EAC7C;AACA,EAAA,OAAOA,YAAW,GAAG,CAAA;AACvB;;;AC/UO,SAAS,8BAAA,GAAiC;AAC/C,EAAA,MAAME,OAAAA,GAAS,IAAIC,SAAA,EAAmD;AAGtE,EAAAD,OAAAA,CAAO,GAAA,CAAI,GAAA,EAAKE,6BAAA,EAAa,CAAA;AAG7B,EAAAF,OAAAA,CAAO,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAM;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,gBAAA,EAAiB;AAE7C,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAAA,OAAAA,CAAO,IAAA,CAAK,eAAA,EAAiB,OAAO,CAAA,KAAM;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,EAAE,aAAY,GAAI,IAAA;AAGxB,MAAA,IAAI,gBAAgB,mBAAA,EAAqB;AACvC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,eAAA,CAAgB,KAAK,KAAK,CAAA;AAEvD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,IAAA,EAAM;AAAA,UACJ,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,oBAAoB,MAAA,CAAO,kBAAA;AAAA,UAC3B,QAAQ,MAAA,CAAO;AAAA;AACjB,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAAA,OAAAA,CAAO,IAAA,CAAK,aAAA,EAAe,OAAO,CAAA,KAAM;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,YAAA,EAAa;AAE1C,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,IAAA,EAAM;AAAA,UACJ,UAAU,MAAA,CAAO;AAAA;AACnB,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAAA,OAAAA,CAAO,GAAA,CAAI,eAAA,EAAiB,OAAO,CAAA,KAAM;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,gBAAA,EAAiB;AAElD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAAA,OAAAA,CAAO,GAAA,CAAI,wBAAA,EAA0B,OAAO,CAAA,KAAM;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,MAAA,MAAM,QAAQ,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,OAAO,KAAK,KAAK,CAAA;AACpD,MAAA,MAAM,SAAS,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,QAAQ,KAAK,GAAG,CAAA;AACpD,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACrC,MAAA,MAAM,aAAA,GAAiB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA;AAE7C,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,YAAA,CAAa,WAAW,KAAA,EAAO,MAAA,EAAQ,YAAY,aAAa,CAAA;AAEhG,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,+BAA+B,KAAK,CAAA;AAAA,SAC1C,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAAA,OAAAA,CAAO,GAAA,CAAI,oBAAA,EAAsB,OAAO,CAAA,KAAM;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,CAAA,CAAE,SAAS,cAAc,CAAA;AAAA,MAClC;AAEA,MAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,MAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,MAAA,MAAM,WAAW,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,UAAU,KAAK,IAAI,CAAA;AACzD,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACrC,MAAA,MAAM,aAAA,GAAiB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA;AAE7C,MAAA,MAAM,MAAA,GAAA,CAAU,OAAO,CAAA,IAAK,QAAA;AAE5B,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,YAAA,CAAa,WAAW,QAAA,EAAU,MAAA,EAAQ,YAAY,aAAa,CAAA;AAEnG,MAAA,MAAM,QAAA,GAAkC;AAAA,QACtC,IAAA,EAAM;AAAA,UACJ,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,SAAA;AAAA,UAClC,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK;AAAA,SACb;AAAA,QACA,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,WAAA,EAAa,IAAA;AAAA,QACb,QAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAC,CAAA;AAAA,IACjD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,CAAA,OAAA,EAAU,KAAK,IAAI,GAAG,CAAA;AAAA,IACtC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAOA,OAAAA;AACT;;;AC5OO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA,EAG7B,UAAA,GAAa;AAAA,IACnB,MAAA;AAAA,IAAQ,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,MAAA;AAAA,IAAQ,KAAA;AAAA,IAAO,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,OAAA;AAAA,IAC5D,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,KAAA;AAAA,IAAO,OAAA;AAAA,IAAS,WAAA;AAAA,IAAa,UAAA;AAAA,IAAY,QAAA;AAAA,IAChE,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU;AAAA,GACxC;AAAA;AAAA,EAGQ,SAAA,GAAY;AAAA,IAClB,OAAA;AAAA,IAAS,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,QAAA;AAAA,IAAU,OAAA;AAAA,IACtE,WAAA;AAAA,IAAa,UAAA;AAAA,IAAY,WAAA;AAAA,IAAa,OAAA;AAAA,IAAS,UAAA;AAAA,IAAY,QAAA;AAAA,IAAU,UAAA;AAAA,IACrE,QAAA;AAAA,IAAU,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS,SAAA;AAAA,IAAW;AAAA,GAC1C;AAAA;AAAA,EAGQ,UAAA,GAAa;AAAA,IACnB,6CAAA;AAAA,IACA,qCAAA;AAAA,IACA,mDAAA;AAAA,IACA,4CAAA;AAAA,IACA,+BAAA;AAAA,IACA,iCAAA;AAAA,IACA,mCAAA;AAAA,IACA,wBAAA;AAAA,IACA,qCAAA;AAAA,IACA,sCAAA;AAAA,IACA,mCAAA;AAAA,IACA,8BAAA;AAAA,IACA,oCAAA;AAAA,IACA,+BAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAGQ,UAAA,GAAa;AAAA,IACnB,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,gBAAA;AAAA,IAAkB,kBAAA;AAAA,IACzC,KAAA;AAAA,IAAO,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,WAAA;AAAA,IAC9B,SAAA;AAAA,IAAW,eAAA;AAAA,IAAiB,SAAA;AAAA,IAAW;AAAA,GACzC;AAAA;AAAA,EAGQ,aAAA,GAAgB;AAAA,IACtB,6BAAA;AAAA,IACA,iBAAA;AAAA,IACA,yBAAA;AAAA,IACA,yBAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA,0BAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,oBAAA;AAAA,IACA,uBAAA;AAAA,IACA,sBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAGQ,WAAA,GAAc;AAAA,IACpB,2GAAA;AAAA,IACA,4FAAA;AAAA,IACA,+EAAA;AAAA,IACA,iGAAA;AAAA,IACA,8EAAA;AAAA,IACA,yFAAA;AAAA,IACA,6EAAA;AAAA,IACA,mFAAA;AAAA,IACA,6EAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAGQ,UAAA,GAAqB;AAC3B,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACjE;AAAA;AAAA,EAGQ,aAAa,KAAA,EAAuB;AAC1C,IAAA,OAAO,KAAA,CACJ,aAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAAA,EAC3B;AAAA;AAAA,EAGQ,UAAA,GAAmB;AACzB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,GAAA,CAAI,WAAA,EAAY,GAAI,CAAA,EAAG,GAAA,CAAI,QAAA,EAAS,EAAG,GAAA,CAAI,OAAA,EAAS,CAAA;AAC7E,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,EAAQ,GAAI,IAAA,CAAK,MAAA,EAAO,IAAK,GAAA,CAAI,OAAA,EAAQ,GAAI,OAAA,CAAQ,OAAA,EAAQ,CAAA;AACxF,IAAA,OAAO,IAAI,KAAK,UAAU,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,MAAM,WAAA,GAA+B;AACnC,IAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,EAAS,QAAA,EAAU,UAAU,QAAQ,CAAA;AAEpD,IAAA,MAAM,cAAA,GAAiB,aAAA;AAEvB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA,IAAK,MAAA;AACzF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,IAAK,KAAA;AACtF,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAA,CAAU,WAAA,EAAa,GAAG,QAAA,CAAS,WAAA,EAAa,CAAA,EAAG,CAAC,CAAA,CAAA;AACxE,MAAA,MAAM,KAAA,GAAQ,GAAG,QAAQ,CAAA,YAAA,CAAA;AACzB,MAAA,MAAM,SAAA,GAAY,KAAK,UAAA,EAAW;AAClC,MAAA,MAAM,qBAAqB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,OAAA,KAAY,GAAI,CAAA;AAEhE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAG5B,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,IAAA;AAAA,QACT,KAAK,UAAA,EAAW;AAAA,QAChB,KAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA;AAAA,QACA,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA,CAAK,QAAO,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,QAC9C,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA;AAAA;AAAA,QAC1B,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,kBAAA,GAAqB,IAAA;AAAA,QAC3C,kBAAA;AAAA,QACA;AAAA,QACA,GAAA,EAAI;AAEN,MAAA,KAAA,EAAA;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,aAAA,GAAiC;AAErC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,qBAAqB,CAAA;AACvD,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,MAAM,UAAU,GAAA,EAAI;AAElD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,2BAA2B,CAAA;AACnE,IAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,MAAM,gBAAgB,GAAA,EAAI;AAE9D,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACtC,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AAClD,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,EAAS,WAAA,EAAa,UAAU,CAAA;AAGlD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,UAAA,GAAkB,eAAe,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,cAAA,CAAe,MAAM,CAAC,CAAA;AACxF,MAAA,MAAM,MAAA,GAAc,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,QAAA,CAAS,MAAM,CAAC,CAAA;AACxE,MAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,QAAA,CAAS,MAAM,CAAC,CAAA;AAEnE,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,WAAA;AAGJ,MAAA,IAAI,WAAW,IAAA,KAAS,YAAA,IAAgB,WAAW,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACxE,QAAA,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA,IAAK,oBAAA;AAC/E,QAAA,WAAA,GAAc;AAAA,UACZ,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA,IAAK,mBAAA;AAAA,UAC/E,OAAA,EAAS,4FAAA;AAAA,UACT,IAAA,EAAM,KAAK,YAAA,EAAa;AAAA,UACxB,QAAA,EAAU,IAAA,CAAK,MAAA,EAAO,GAAI;AAAA,SAC5B;AAAA,MACF,CAAA,MAAA,IAAW,WAAW,IAAA,KAAS,OAAA,IAAW,WAAW,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1E,QAAA,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA,IAAK,eAAA;AAC/E,QAAA,WAAA,GAAc;AAAA,UACZ,IAAA,EAAM,qFAAA;AAAA,UACN,QAAA,EAAU,SAAA;AAAA,UACV,UAAA,EAAY,IAAA,CAAK,MAAA,EAAO,GAAI;AAAA,SAC9B;AAAA,MACF,CAAA,MAAA,IAAW,WAAW,IAAA,KAAS,UAAA,IAAc,WAAW,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAChF,QAAA,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,aAAA,CAAc,MAAM,CAAC,CAAA,IAAK,kBAAA;AACrF,QAAA,WAAA,GAAc;AAAA,UACZ,WAAA,EAAa,yEAAA;AAAA,UACb,QAAQ,IAAA,CAAK,MAAA,KAAW,GAAA,GAAM,EAAA,EAAI,QAAQ,CAAC,CAAA;AAAA,UAC3C,GAAA,EAAK,CAAA,IAAA,EAAO,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,CAAE,aAAa,CAAA,CAAA;AAAA,UACjE,OAAA,EAAS,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA;AAAA,UACzB,SAAS,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,EAAG,QAAQ,CAAC;AAAA;AAAA,SAC3C;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,KAAA,GAAQ,GAAG,UAAA,CAAW,YAAA,IAAgB,WAAW,IAAI,CAAA,MAAA,EAAS,IAAI,CAAC,CAAA,CAAA;AACnE,QAAA,WAAA,GAAc;AAAA,UACZ,WAAA,EAAa,kDAAA;AAAA,UACb,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,GAAI;AAAA,SACxC;AAAA,MACF;AAEA,MAAA,MAAM,OAAO,CAAA,EAAG,IAAA,CAAK,aAAa,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA;AAC7C,MAAA,MAAM,SAAA,GAAY,KAAK,UAAA,EAAW;AAClC,MAAA,MAAM,qBAAqB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,OAAA,KAAY,GAAI,CAAA;AAChE,MAAA,MAAM,oBAAA,GAAuB,MAAA,KAAW,WAAA,GAAc,kBAAA,GAAqB,IAAA;AAE3E,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAG5B,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,IAAA;AAAA,QACT,KAAK,UAAA,EAAW;AAAA,QAChB,UAAA,CAAW,EAAA;AAAA,QACX,IAAA;AAAA,QACA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,QACb,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA,QAC1B,MAAA;AAAA,QACA,oBAAA;AAAA,QACA,MAAA,CAAO,EAAA;AAAA,QACP,kBAAA;AAAA,QACA;AAAA,QACA,GAAA,EAAI;AAEN,MAAA,KAAA,EAAA;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGQ,YAAA,GAAyB;AAC/B,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,UAAA;AAAA,MAAY,OAAA;AAAA,MAAS,YAAA;AAAA,MAAc,YAAA;AAAA,MAAc,SAAA;AAAA,MACjD,SAAA;AAAA,MAAW,UAAA;AAAA,MAAY,gBAAA;AAAA,MAAkB,UAAA;AAAA,MAAY,aAAA;AAAA,MACrD,SAAA;AAAA,MAAW,YAAA;AAAA,MAAc,OAAA;AAAA,MAAS,UAAA;AAAA,MAAY;AAAA,KAChD;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,CAAC,CAAA,GAAI,CAAA;AAChD,IAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,CAAK,MAAM,GAAA,GAAM,IAAA,CAAK,QAAQ,CAAA;AACvD,IAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,MAAM,OAAA,GAAuD;AAC3D,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA,EAAY;AACzC,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,aAAA,EAAc;AAE9C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAA,GAA+B;AAEnC,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,qBAAqB,CAAA;AAC/D,IAAA,MAAM,kBAAkB,GAAA,EAAI;AAG5B,IAAA,MAAM,eAAA,GAAkB,KAAK,EAAA,CAAG,OAAA;AAAA,MAC9B;AAAA,KACF;AACA,IAAA,MAAM,gBAAgB,GAAA,EAAI;AAAA,EAC5B;AACF,CAAA;;;ACpQO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,MAAM,MAAA,GAAS,IAAIC,SAAAA,EAA6B;AAGhD,EAAA,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAC3B,IAAA,MAAM,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAmPb,IAAA,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EACpB,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA,KAAM;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB,EAAE,CAAA;AAE1C,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,OAAA,EAAQ;AAEzC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,CAAM;AAAA,SACZ,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,KAAM;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB,EAAE,CAAA;AAE1C,MAAA,MAAM,YAAY,aAAA,EAAc;AAEhC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,CAAM;AAAA,SACZ,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AChSO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,MAAM,OAAA,GAAUE,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe;AAAA,GAChB,CAAA;AAGD,EAAA,MAAM,WAAA,GAAc,IAAIF,SAAAA,EAAK;AAM7B,EAAA,WAAA,CAAY,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA,KAAW;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,MAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAKhB,EAAE,IAAA,CAAK,IAAA,CAAK,UAAU,IAAI,CAAC,EAAE,GAAA,EAAI;AAElC,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,OAAO,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,OAAO,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,IACzE;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA,KAAW;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAG9B,MAAA,MAAMG,OAAAA,GAAS,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,MAAA,CAE/B,EAAE,KAAA,EAAM;AAET,MAAA,IAAI,CAACA,SAAQ,QAAA,EAAU;AACrB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA;AAG3C,MAAA,IAAI,CAAC,SAAS,MAAA,IAAU,CAAC,SAAS,SAAA,IAAa,CAAC,SAAS,QAAA,EAAU;AACjE,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,QAAA,CAAS,SAAA;AAGzC,MAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,4BAA4B,CAAA,EAAG;AAChD,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,+BAAA,EAAiC;AAAA,QAC5D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,UAC1C,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,MAAM,CAAA,EAAG,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK,SAAS,SAAS,CAAA,CAAA,CAAA;AAAA,UACjD,EAAA,EAAI,CAAC,OAAO,CAAA;AAAA,UACZ,OAAA,EAAS,yBAAA;AAAA,UACT,IAAA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAA,EAMY,QAAA,CAAS,QAAQ,CAAA,KAAA,EAAQ,QAAA,CAAS,SAAS,CAAA;AAAA,8BAAA,EACvC,QAAA,CAAS,WAAW,SAAS,CAAA;AAAA,6BAAA,EAAA,iBAC9B,IAAI,IAAA,EAAK,EAAE,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,UAK7C,QAAA,EAAU,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS;AAAA,SACxC;AAAA,OACF,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,IAAI,CAAA;AACvC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,KAAK,OAAA,IAAW;AAAA,SACzB,EAAG,SAAS,MAAM,CAAA;AAAA,MACpB;AAEA,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,mCAAmC,OAAO,CAAA,CAAA;AAAA,QACnD,SAAS,IAAA,CAAK;AAAA,OACf,CAAA;AAAA,IAEH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,SACvB,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,wBAAwB,WAAA,EAAa;AAAA,IACpD,WAAA,EAAa,uBAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,WAAA,CAAY,SAAS,sBAAA,EAAwB;AAAA,IACnD,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa,CAAC,cAAc;AAAA,GAC7B,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,UAAU,YAAY;AACpB,MAAA,OAAA,CAAQ,KAAK,+BAA0B,CAAA;AAAA,IACzC,CAAA;AAAA,IAEA,YAAY,YAAY;AACtB,MAAA,OAAA,CAAQ,KAAK,iCAA4B,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAGO,IAAM,cAAc,iBAAA,EAAkB;;;AC9ItC,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,YAAA,CAAa,SAAiB,CAAA,EAAW;AACvC,IAAA,MAAM,MAAA,GAAS,YAAA;AACf,IAAA,IAAI,IAAA,GAAO,EAAA;AAEX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,YAAA,GAAe,IAAI,UAAA,CAAW,CAAC,CAAA;AACrC,MAAA,MAAA,CAAO,gBAAgB,YAAY,CAAA;AACnC,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAC,CAAA,IAAK,CAAA;AACvC,MAAA,IAAA,IAAQ,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,MAAM,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,KAAA,EACA,QAAA,EACA,WACA,SAAA,EACkB;AAClB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,UAAU,CAAA;AAClD,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,SAAA,GAAY,GAAA,GAAO,QAAA,CAAS,iBAAA,GAAoB,EAAA,GAAK,GAAA;AAE3D,IAAA,MAAM,OAAA,GAAmB;AAAA,MACvB,EAAA;AAAA,MACA,UAAA,EAAY,MAAM,WAAA,EAAY;AAAA,MAC9B,IAAA;AAAA,MACA,UAAA,EAAY,SAAA;AAAA,MACZ,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,YAAY,SAAA,IAAa,IAAA;AAAA,MACzB,YAAY,SAAA,IAAa,IAAA;AAAA,MACzB,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKrB,CAAA,CAAE,IAAA;AAAA,MACD,OAAA,CAAQ,EAAA;AAAA,MACR,OAAA,CAAQ,UAAA;AAAA,MACR,OAAA,CAAQ,IAAA;AAAA,MACR,OAAA,CAAQ,UAAA;AAAA,MACR,OAAA,CAAQ,IAAA;AAAA,MACR,OAAA,CAAQ,OAAA;AAAA,MACR,OAAA,CAAQ,UAAA;AAAA,MACR,OAAA,CAAQ,UAAA;AAAA,MACR,OAAA,CAAQ,QAAA;AAAA,MACR,OAAA,CAAQ;AAAA,MACR,GAAA,EAAI;AAEN,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,KAAA,EACA,IAAA,EACA,QAAA,EACyE;AACzE,IAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAC1C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKrC,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,IAAI,EAAE,KAAA,EAAM;AAErC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,IAC1D;AAGA,IAAA,IAAI,GAAA,GAAM,QAAQ,UAAA,EAAY;AAC5B,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,kBAAA,EAAmB;AAAA,IACnD;AAGA,IAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,QAAA,CAAS,WAAA,EAAa;AAC5C,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,2BAAA,EAA4B;AAAA,IAC5D;AAGA,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIrB,EAAE,IAAA,CAAK,GAAA,EAAK,OAAA,CAAQ,EAAE,EAAE,GAAA,EAAI;AAE7B,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,KAAA,EAAe,IAAA,EAA+B;AACpE,IAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAE1C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKpC,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,IAAI,EAAE,KAAA,EAAM;AAErC,IAAA,OAAO,QAAQ,QAAA,IAAY,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,KAAA,EAAe,QAAA,EAAyC;AAC3E,IAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAC1C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAK,KAAK,EAAA,GAAK,GAAA;AAE3C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIpC,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,UAAU,EAAE,KAAA,EAAM;AAE3C,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA;AAC/B,IAAA,OAAO,QAAQ,QAAA,CAAS,gBAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,KAAA,GAAgB,EAAA,EAAwB;AAC9D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIpC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,CAAE,GAAA,EAAI;AAEnB,IAAA,MAAM,IAAA,GAAQ,MAAA,CAAO,OAAA,IAAW,EAAC;AACjC,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,WAAA,CAAY,GAAG,CAAC,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,GAAuC;AAC3C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAGpC,CAAA,CAAE,IAAA,CAAK,GAAA,EAAK,GAAA,GAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,GAAK,CAAA,CAAE,GAAA,EAAI;AAEnD,IAAA,OAAO,MAAA,CAAO,KAAK,OAAA,IAAW,CAAA;AAAA,EAChC;AAAA,EAEQ,YAAY,GAAA,EAAuC;AACzD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,MACjB,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,MACrB,YAAY,MAAA,CAAO,GAAA,CAAI,UAAA,IAAc,IAAA,CAAK,KAAK,CAAA;AAAA,MAC/C,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,CAAC,CAAA;AAAA,MAC1B,OAAA,EAAS,GAAA,CAAI,OAAA,KAAY,IAAA,IAAQ,GAAA,CAAI,YAAY,MAAA,GAAY,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAAA,MACtF,YAAY,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,GAAW,IAAI,UAAA,GAAa,IAAA;AAAA,MAClE,YAAY,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,GAAW,IAAI,UAAA,GAAa,IAAA;AAAA,MAClE,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,QAAA,IAAY,CAAC,CAAA;AAAA,MAClC,YAAY,MAAA,CAAO,GAAA,CAAI,UAAA,IAAc,IAAA,CAAK,KAAK;AAAA,KACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,IAAA,GAAe,CAAA,EAK3B;AACD,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,KAAS,IAAA,GAAO,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAElD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQnC,EAAE,IAAA,CAAK,IAAA,CAAK,KAAI,EAAG,KAAK,EAAE,KAAA,EAAM;AAEjC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,KAAA,IAAS,CAAA;AAAA,MACvB,UAAA,EAAY,OAAO,UAAA,IAAc,CAAA;AAAA,MACjC,MAAA,EAAQ,OAAO,MAAA,IAAU,CAAA;AAAA,MACzB,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC7B;AAAA,EACF;AACF,CAAA;;;ACnOA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAA;AAC9C,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAA;AACtC,EAAA,IAAI,sCAAA,CAAuC,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAA;AAC/D,EAAA,OAAO,EAAA;AACT;AAEA,SAASN,YAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,MACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,QAAQ,CAAA,CACtB,QAAQ,IAAA,EAAM,OAAO,EACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,MAAM,MAAM,CAAA;AACzB;AAEO,SAAS,mBAAmB,IAAA,EAA4B;AAC7D,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA,GAAUA,WAAAA,CAAW,IAAA,CAAK,OAAO,CAAA,GAAI,EAAA;AAC1D,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA,GAAWA,WAAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,GAAI,EAAA;AAC7D,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AACvC,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACrB,IAAA,CAAK,mBAAmB,IAAA,CAAK,eAAA,CAAgB,MAAK,IAAM,CAAA,WAAA,EAAc,KAAK,OAAO,CAAA;AAAA,GACrF;AACA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,IAAK,GAAG,CAAC,CAAA;AAC3E,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,IAAK,CAAC,CAAC,CAAA;AACnF,EAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,IAAA,CAAK,eAAe,CAAA;AAC1D,EAAA,MAAM,eAAA,GAAkB,kBAAkB,CAAA,IAAK,eAAA,GAC3C,WAAW,eAAe,CAAA,SAAA,EAAY,eAAe,CAAA,qBAAA,CAAA,GACrD,EAAA;AAEJ,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,IAAA,EAWH,OAAA,GAAU;AAAA;AAAA,gBAAA,EAEE,OAAO,CAAA,OAAA,EAAU,OAAO,CAAA,oBAAA,EAAuB,SAAS,kCAAkC,eAAe,CAAA;AAAA;AAAA,IAAA,CAAA,GAEnH,EAAE;;AAAA;AAAA;AAAA,0FAAA,EAIkF,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,UAAA,EAMvF,KAAK,IAAI;AAAA;AAAA;;AAAA,MAAA,EAIb,QAAA,GAAW;AAAA;AAAA,iBAAA,EAEA,QAAQ,CAAA;AAAA,UAAA,EACf,eAAe;AAAA;AAAA;AAAA,MAAA,CAAA,GAGjB,EAAE;;AAAA;AAAA;AAAA,oDAAA,EAIgC,KAAK,aAAa,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,+CAAA,EAOb,KAAK,UAAU,CAAA;AAAA;AAAA,uBAAA,EAEvC,KAAK,WAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CAAA,EAUM,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,yDAAA,EAYKA,WAAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,QAAA,EACvE,IAAA,CAAK,YAAY,CAAA,sCAAA,EAAyCA,WAAAA,CAAW,KAAK,SAAS,CAAC,SAAS,EAAE;AAAA,wCAAA,EAC/DA,WAAAA,CAAW,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,iCAAA,EAAA,qBAO7B,IAAA,EAAK,EAAE,WAAA,EAAa,IAAI,OAAO,CAAA;AAAA;;AAAA;AAAA,OAAA,CAAA;AAKtE;AAEO,SAAS,mBAAmB,IAAA,EAA4B;AAC7D,EAAA,MAAM,QAAA,GAAY,KAAK,eAAA,IAAmB,IAAA,CAAK,gBAAgB,IAAA,EAAK,IAAM,CAAA,WAAA,EAAc,IAAA,CAAK,OAAO,CAAA,CAAA;AACpG,EAAA,OAAO,CAAA,oBAAA,EAAuB,KAAK,OAAO;;AAAA;;AAAA,EAI1C,KAAK,IAAI;;AAAA,qBAAA,EAEY,KAAK,aAAa,CAAA;AAAA,EACvC,KAAK,QAAA,GAAW;AAAA,EAAK,QAAQ,CAAA,EAAA,EAAK,IAAA,CAAK,QAAQ;AAAA,CAAA,GAAO,EAAE;;AAAA;AAAA,wCAAA,EAGrB,KAAK,UAAU,CAAA;AAAA;AAAA,gBAAA,EAEvC,KAAK,WAAW,CAAA;AAAA;;AAAA;AAAA,mCAAA,EAIQ,KAAK,OAAO,CAAA;;AAAA;AAAA;;AAAA;AAAA,uBAAA,EAMxB,KAAK,KAAK;AAAA,EACjC,KAAK,SAAA,GAAY,CAAA,YAAA,EAAe,IAAA,CAAK,SAAS,KAAK,EAAE;AAAA,MAAA,EAC/C,KAAK,SAAS;;AAAA,KAAA,EAAA,qBAEd,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA,EAAI,KAAK,OAAO,CAAA,sBAAA,CAAA;AAC5C;AAEO,SAAS,eAAe,IAAA,EAAoD;AACjF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,mBAAmB,IAAI,CAAA;AAAA,IAC7B,IAAA,EAAM,mBAAmB,IAAI;AAAA,GAC/B;AACF;;;AC5JA,IAAM,gBAAA,GAAmBO,MAAE,MAAA,CAAO;AAAA,EAChC,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAM,yBAAyB;AACnD,CAAC,CAAA;AAED,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EAC/B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAM,yBAAyB,CAAA;AAAA,EACjD,IAAA,EAAMA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC;AAC/B,CAAC,CAAA;AAGD,IAAM,gBAAA,GAAgC;AAAA,EACpC,UAAA,EAAY,CAAA;AAAA,EACZ,iBAAA,EAAmB,EAAA;AAAA,EACnB,WAAA,EAAa,CAAA;AAAA,EACb,gBAAA,EAAkB,CAAA;AAAA,EAClB,wBAAA,EAA0B,KAAA;AAAA,EAC1B,OAAA,EAAS,EAAA;AAAA,EACT,SAAA,EAAW,GAAA;AAAA,EACX,eAAA,EAAiB,CAAA;AAAA,EACjB,eAAA,EAAiB,SAAA;AAAA,EACjB,QAAA,EAAU,EAAA;AAAA,EACV,eAAA,EAAiB;AACnB,CAAA;AAEO,SAAS,oBAAA,GAA+B;AAC7C,EAAA,MAAM,OAAA,GAAUF,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe;AAAA,GAChB,CAAA;AAID,EAAA,MAAM,MAAA,GAAS,IAAIF,SAAAA,EAAK;AAGxB,EAAA,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,KAAW;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,SAAA,CAAU,IAAI,CAAA;AAElD,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,mBAAA;AAAA,UACP,OAAA,EAAS,WAAW,KAAA,CAAM;AAAA,WACzB,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,UAAA,CAAW,IAAA;AAC7B,MAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAC1C,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,EAAE,CAAA;AAGpC,MAAA,IAAI,QAAA,GAAwB,EAAE,GAAG,gBAAA,EAAiB;AAClD,MAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,MAAA,CAElC,EAAE,KAAA,EAAM;AACT,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA;AACnD,UAAA,QAAA,GAAW,EAAE,GAAG,gBAAA,EAAkB,GAAG,aAAA,EAAc;AAAA,QACrD,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAK,qDAAqD,CAAA;AAAA,QACpE;AAAA,MACF;AAGA,MAAA,MAAM,eAAA,GAAkB,IAAIK,iCAAA,CAAgB,EAAE,CAAA;AAC9C,MAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,kBAAA,EAAmB;AACjE,MAAA,MAAM,WAAW,eAAA,CAAgB,QAAA;AAGjC,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,cAAA,CAAe,iBAAiB,QAAQ,CAAA;AAC5E,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAI7B,CAAA,CAAE,IAAA,CAAK,eAAe,CAAA,CAAE,KAAA,EAAM;AAE/B,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,QAAA,CAAS,wBAAA,EAA0B;AAE/C,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,oFAAA;AAAA,UACT,SAAA,EAAW,SAAS,iBAAA,GAAoB;AAAA,SACzC,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,IAAA,IAAQ,CAAC,IAAA,CAAK,SAAA,EAAW;AAC3B,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,KAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA,IAAK,SAAA;AACzF,MAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,IAAK,SAAA;AAGhD,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,aAAA;AAAA,QAC/B,eAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,WAAA,KAAgB,aAAA;AAExC,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAsB,eAAe,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,QACtE;AAGA,QAAA,MAAM,eAAe,cAAA,CAAe;AAAA,UAClC,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,eAAe,QAAA,CAAS,iBAAA;AAAA,UACxB,YAAY,QAAA,CAAS,UAAA;AAAA,UACrB,aAAa,QAAA,CAAS,WAAA;AAAA,UACtB,KAAA,EAAO,eAAA;AAAA,UACP,SAAA;AAAA,UACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,OAAA,EAAS,QAAA;AAAA,UACT,OAAA,EAAS,SAAS,OAAA,IAAW,EAAA;AAAA,UAC7B,WAAW,QAAA,CAAS,SAAA;AAAA,UACpB,iBAAiB,QAAA,CAAS,eAAA;AAAA,UAC1B,eAAA,EAAiB,SAAS,eAAA,IAAmB,EAAA;AAAA,UAC7C,QAAA,EAAU,SAAS,QAAA,IAAY,EAAA;AAAA,UAC/B,eAAA,EAAiB,SAAS,eAAA,IAAmB;AAAA,SAC9C,CAAA;AAKD,QAAA,MAAMC,YAAAA,GAAc,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,QAAA,CAEpC,EAAE,KAAA,EAAM;AAET,QAAA,IAAIA,cAAa,QAAA,EAAU;AACzB,UAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAMA,YAAAA,CAAY,QAAQ,CAAA;AAErD,UAAA,IAAI,aAAA,CAAc,MAAA,IAAU,aAAA,CAAc,SAAA,IAAa,cAAc,QAAA,EAAU;AAE7E,YAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,+BAAA,EAAiC;AAAA,cACjE,MAAA,EAAQ,MAAA;AAAA,cACR,OAAA,EAAS;AAAA,gBACP,eAAA,EAAiB,CAAA,OAAA,EAAU,aAAA,CAAc,MAAM,CAAA,CAAA;AAAA,gBAC/C,cAAA,EAAgB;AAAA,eAClB;AAAA,cACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,MAAM,CAAA,EAAG,aAAA,CAAc,QAAQ,CAAA,EAAA,EAAK,cAAc,SAAS,CAAA,CAAA,CAAA;AAAA,gBAC3D,EAAA,EAAI,CAAC,eAAe,CAAA;AAAA,gBACpB,OAAA,EAAS,uBAAuB,QAAQ,CAAA,CAAA;AAAA,gBACxC,MAAM,YAAA,CAAa,IAAA;AAAA,gBACnB,MAAM,YAAA,CAAa,IAAA;AAAA,gBACnB,QAAA,EAAU,aAAA,CAAc,OAAA,IAAW,aAAA,CAAc;AAAA,eAClD;AAAA,aACF,CAAA;AAED,YAAA,IAAI,CAAC,cAAc,EAAA,EAAI;AACrB,cAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc,IAAA,EAAK;AAC3C,cAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,SAAS,CAAA;AAAA,YAEjE;AAAA,UACF,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,KAAK,+EAA+E,CAAA;AAAA,UAC9F;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,KAAK,0DAA0D,CAAA;AAAA,QACzE;AAEA,QAAA,MAAM,QAAA,GAAgB;AAAA,UACpB,OAAA,EAAS,oFAAA;AAAA,UACT,SAAA,EAAW,SAAS,iBAAA,GAAoB;AAAA,SAC1C;AAGA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,QAAA,CAAS,WAAW,OAAA,CAAQ,IAAA;AAAA,QAC9B;AAEA,QAAA,OAAO,CAAA,CAAE,KAAK,QAAQ,CAAA;AAAA,MACxB,SAAS,UAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,UAAU,CAAA;AACpD,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA,KAAW;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAEjD,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,mBAAA;AAAA,UACP,OAAA,EAAS,WAAW,KAAA,CAAM;AAAA,WACzB,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,UAAA,CAAW,IAAA;AACnC,MAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAC1C,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,EAAE,CAAA;AAGpC,MAAA,IAAI,QAAA,GAAW,EAAE,GAAG,gBAAA,EAAiB;AACrC,MAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,MAAA,CAElC,EAAE,KAAA,EAAM;AACT,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA;AACnD,UAAA,QAAA,GAAW,EAAE,GAAG,gBAAA,EAAkB,GAAG,aAAA,EAAc;AAAA,QACrD,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAK,qDAAqD,CAAA;AAAA,QACpE;AAAA,MACF;AAGA,MAAA,MAAM,eAAe,MAAM,UAAA,CAAW,UAAA,CAAW,eAAA,EAAiB,MAAM,QAAQ,CAAA;AAEhF,MAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AAEvB,QAAA,MAAM,UAAA,CAAW,iBAAA,CAAkB,eAAA,EAAiB,IAAI,CAAA;AAExD,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,aAAa,KAAA,IAAS,cAAA;AAAA,UAC7B,mBAAmB,YAAA,CAAa;AAAA,WAC/B,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,IAAI,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAI3B,CAAA,CAAE,IAAA,CAAK,eAAe,CAAA,CAAE,KAAA,EAAM;AAE/B,MAAA,IAAI,CAAC,IAAA,IAAQ,QAAA,CAAS,wBAAA,EAA0B;AAE9C,QAAA,MAAM,MAAA,GAAS,OAAO,UAAA,EAAW;AACjC,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,QAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAExE,QAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAKhB,CAAA,CAAE,KAAK,MAAA,EAAQ,eAAA,EAAiB,UAAU,GAAA,EAAK,GAAG,EAAE,GAAA,EAAI;AAEzD,QAAA,IAAA,GAAO;AAAA,UACL,EAAA,EAAI,MAAA;AAAA,UACJ,KAAA,EAAO,eAAA;AAAA,UACP,QAAA;AAAA,UACA,UAAA,EAAY,EAAA;AAAA,UACZ,SAAA,EAAW,EAAA;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,SAAA,EAAW,CAAA;AAAA,UACX,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,QAAA,GAAW,MAAMC,2CAAA,CAA0B,EAAA,EAAI,EAAE,GAAU,CAAA;AACjE,MAAA,MAAM,KAAA,GAAQ,MAAMC,6BAAA,CAAY,aAAA,CAAc,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,IAAA,EAAO,CAAA,CAAE,GAAA,CAAY,YAAY,QAAQ,CAAA;AAGjH,MAAAC,gBAAA,CAAU,CAAA,EAAG,cAAc,KAAA,EAAO;AAAA,QAChC,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,MAAMC,+BAAA,CAAc,EAAA,EAAI,KAAK,EAAE,CAAA;AAClD,MAAA,MAAM,EAAE,SAAA,EAAW,GAAG,UAAA,EAAW,GAAI,IAAA;AAErC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,UACJ,GAAG,UAAA;AAAA,UACH,GAAG;AAAA,SACL;AAAA,QACA,KAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA,KAAW;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,SAAA,CAAU,IAAI,CAAA;AAElD,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,mBAAA;AAAA,UACP,OAAA,EAAS,WAAW,KAAA,CAAM;AAAA,WACzB,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,OAAO,MAAA,CAAO,KAAA;AAAA,QACZ,IAAI,QAAQ,CAAA,CAAE,GAAA,CAAI,IAAI,OAAA,CAAQ,SAAA,EAAW,UAAU,CAAA,EAAG;AAAA,UACpD,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,GAAA,CAAI,OAAA;AAAA,UACnB,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,OAAO,UAAA,CAAW,IAAA,CAAK,OAAO;AAAA,SACtD,CAAA;AAAA,QACD,CAAA,CAAE;AAAA,OACJ;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,aAAa,MAAA,EAAQ;AAAA,IACpC,WAAA,EAAa,8BAAA;AAAA,IACb,YAAA,EAAc,KAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAMD,EAAA,OAAA,CAAQ,WAAA,CAAY,aAAa,0BAAA,EAA4B;AAAA,IAC3D,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa,CAAC,YAAY;AAAA,GAC3B,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,UAAU,YAAY;AACpB,MAAA,OAAA,CAAQ,KAAK,mCAA8B,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,OAAA,CAAQ,KAAK,qCAAgC,CAAA;AAAA,IAC/C;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAEO,IAAM,iBAAiB,oBAAA,EAAqB;;;ACxX5C,IAAM,eAAA,GAAuC;AAAA,EAClD,EAAA,EAAI,QAAA;AAAA,EACJ,IAAA,EAAM,QAAA;AAAA,EACN,YAAA,EAAc,0CAAA;AAAA,EACd,QAAA,EAAU,6CAAA;AAAA,EACV,WAAA,EAAa,6BAAA;AAAA,EACb,MAAA,EAAQ,CAAC,WAAA,EAAa,YAAY,CAAA;AAAA,EAClC,UAAA,EAAY,CAAC,OAAA,MAAa;AAAA,IACxB,iBAAA,EAAmB,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,IACpC,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,IACxB,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,KAAA,IAAS,EAAA;AAAA,IACvC,MAAA,EAAQ,QAAQ,UAAA,IAAc;AAAA,GAChC;AACF,CAAA;AAEO,IAAM,eAAA,GAAuC;AAAA,EAClD,EAAA,EAAI,QAAA;AAAA,EACJ,IAAA,EAAM,QAAA;AAAA,EACN,YAAA,EAAc,8CAAA;AAAA,EACd,QAAA,EAAU,qCAAA;AAAA,EACV,WAAA,EAAa,+CAAA;AAAA,EACb,MAAA,EAAQ,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,CAAA;AAAA,EACrC,UAAA,EAAY,CAAC,OAAA,MAAa;AAAA,IACxB,iBAAA,EAAmB,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,IACpC,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,IACxB,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,IACtB,MAAA,EAAQ,QAAQ,OAAA,IAAW;AAAA,GAC7B;AACF,CAAA;AAEO,IAAM,kBAAA,GAA0D;AAAA,EACrE,MAAA,EAAQ,eAAA;AAAA,EACR,MAAA,EAAQ;AACV;AAmBO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,iBAAA,CACE,QAAA,EACA,QAAA,EACA,WAAA,EACA,KAAA,EACQ;AACR,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,SAAA,EAAW,QAAA;AAAA,MACX,YAAA,EAAc,WAAA;AAAA,MACd,aAAA,EAAe,MAAA;AAAA,MACf,KAAA,EAAO,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,MAC/B;AAAA,KACD,CAAA;AAGD,IAAA,IAAI,QAAA,CAAS,OAAO,QAAA,EAAU;AAC5B,MAAA,MAAA,CAAO,GAAA,CAAI,eAAe,SAAS,CAAA;AACnC,MAAA,MAAA,CAAO,GAAA,CAAI,UAAU,SAAS,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,GAAG,QAAA,CAAS,YAAY,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,QAAA,EACA,QAAA,EACA,YAAA,EACA,MACA,WAAA,EACgF;AAChF,IAAA,MAAM,IAAA,GAA+B;AAAA,MACnC,SAAA,EAAW,QAAA;AAAA,MACX,aAAA,EAAe,YAAA;AAAA,MACf,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,mCAAA;AAAA,QAChB,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,IAAA,EAAM,IAAI,eAAA,CAAgB,IAAI,EAAE,QAAA;AAAS,KAC1C,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,SAAS,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,CAAE,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAK,iBAAA,IAAqB,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IACjF;AAEA,IAAA,OAAO;AAAA,MACL,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,YAAY,IAAA,CAAK,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,GAAI;AAAA,KAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CACJ,QAAA,EACA,WAAA,EAC2B;AAC3B,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,eAAA,EAAiB,UAAU,WAAW,CAAA,CAAA;AAAA,MACtC,QAAA,EAAU;AAAA,KACZ;AAGA,IAAA,IAAI,QAAA,CAAS,OAAO,QAAA,EAAU;AAC5B,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,SAAS,WAAA,EAAa,EAAE,SAAS,CAAA;AAE9D,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AAGpC,IAAA,IAAI,QAAA,CAAS,EAAA,KAAO,QAAA,IAAY,CAAC,QAAQ,KAAA,EAAO;AAC9C,MAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,oCAAA,EAAsC;AAAA,QACtE,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,SAAS,WAAW,CAAA,CAAA;AAAA,UACrC,QAAA,EAAU;AAAA;AACZ,OACD,CAAA;AAED,MAAA,IAAI,cAAc,EAAA,EAAI;AACpB,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,IAAA,EAAK;AACxC,QAAA,MAAM,eAAe,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,OAAA,IAAW,EAAE,QAAQ,CAAA;AAC7D,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,OAAA,CAAQ,QAAQ,YAAA,CAAa,KAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,QAAA,CAAS,WAAW,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,CACJ,QAAA,EACA,iBAAA,EAC8B;AAC9B,IAAA,OAAO,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAG5B,CAAA,CAAE,IAAA,CAAK,QAAA,EAAU,iBAAiB,EAAE,KAAA,EAAM;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,MAAA,EAAyC;AACnE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAEpC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,EAAI;AACpB,IAAA,OAAQ,MAAA,CAAO,WAAW,EAAC;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,MAAA,EAQC;AACxB,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAMrB,CAAA,CAAE,IAAA;AAAA,MACD,EAAA;AAAA,MACA,MAAA,CAAO,MAAA;AAAA,MACP,MAAA,CAAO,QAAA;AAAA,MACP,MAAA,CAAO,iBAAA;AAAA,MACP,MAAA,CAAO,WAAA;AAAA,MACP,OAAO,YAAA,IAAgB,IAAA;AAAA,MACvB,OAAO,cAAA,IAAkB,IAAA;AAAA,MACzB,OAAO,WAAA,IAAe,IAAA;AAAA,MACtB,GAAA;AAAA,MACA;AAAA,MACA,GAAA,EAAI;AAEN,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAS,MAAA,CAAO,MAAA;AAAA,MAChB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,qBAAqB,MAAA,CAAO,iBAAA;AAAA,MAC5B,cAAc,MAAA,CAAO,WAAA;AAAA,MACrB,aAAA,EAAe,OAAO,YAAA,IAAgB,IAAA;AAAA,MACtC,gBAAA,EAAkB,OAAO,cAAA,IAAkB,IAAA;AAAA,MAC3C,YAAA,EAAc,OAAO,WAAA,IAAe,IAAA;AAAA,MACpC,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACJ,EAAA,EACA,WAAA,EACA,cACA,cAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIrB,CAAA,CAAE,IAAA,CAAK,WAAA,EAAa,YAAA,IAAgB,IAAA,EAAM,cAAA,IAAkB,IAAA,EAAM,IAAA,CAAK,GAAA,EAAI,EAAG,EAAE,CAAA,CAAE,GAAA,EAAI;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,MAAA,EAAgB,QAAA,EAAoC;AAE3E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAElC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,EAAM;AAEtB,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAGxC,CAAA,CAAE,IAAA,CAAK,MAAA,EAAQ,QAAQ,EAAE,KAAA,EAAM;AAEhC,IAAA,MAAM,WAAA,GAAc,CAAC,CAAC,IAAA,EAAM,aAAA;AAC5B,IAAA,MAAM,aAAA,GAAA,CAAiB,UAAA,EAAY,KAAA,IAAS,CAAA,IAAK,CAAA;AAEjD,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,aAAA,EAAe;AAClC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,CAAA,CAAE,IAAA,CAAK,MAAA,EAAQ,QAAQ,EAAE,GAAA,EAAI;AAE9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAA,EAOZ;AACR,IAAA,OAAO,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAG5B,EAAE,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,EAAE,KAAA,EAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,OAAA,EAA4C;AACpE,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAY;AACxC,IAAA,MAAM,SAAA,GAAA,CAAa,OAAA,CAAQ,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,MAAA,EAAQ,KAAA,CAAM,GAAG,CAAA;AAC3E,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,CAAC,CAAA,IAAK,MAAA;AAClC,IAAA,MAAM,WAAW,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,EAAA;AACjD,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,CAAG,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AAGzD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC7B;AAAA,KACF,CAAE,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,EAAM;AAEvB,IAAA,MAAM,aAAA,GAAgB,QAAA,GAClB,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,GACjC,QAAA;AAEJ,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKrB,CAAA,CAAE,IAAA;AAAA,MACD,EAAA;AAAA,MAAI,KAAA;AAAA,MAAO,aAAA;AAAA,MAAe,SAAA;AAAA,MAAW,QAAA;AAAA,MACrC,QAAQ,MAAA,IAAU,IAAA;AAAA,MAAM,GAAA;AAAA,MAAK;AAAA,MAC7B,GAAA,EAAI;AAEN,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,IAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,IAAA,OAAO,MAAM,IAAA,CAAK,KAAK,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAC5E;AACF;;;ACvWA,IAAM,iBAAA,GAAoB,aAAA;AAC1B,IAAM,oBAAA,GAAuB,GAAA;AAEtB,SAAS,0BAAA,GAAqC;AACnD,EAAA,MAAM,OAAA,GAAUR,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,iBAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe;AAAA,GAChB,CAAA;AAID,EAAA,SAAS,cAAA,CAAe,GAAQ,QAAA,EAA0B;AACxD,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,mBAAmB,CAAA,IAAK,OAAA;AACnD,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,IAAK,WAAA;AACrC,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,IAAI,eAAe,QAAQ,CAAA,SAAA,CAAA;AAAA,EAClD;AAEA,EAAA,eAAe,aAAa,EAAA,EAA8C;AACxE,IAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,OAAA;AAAA,MACnB,CAAA,yDAAA;AAAA,MACA,KAAA,EAAM;AAER,IAAA,IAAI,CAAC,GAAA,EAAK,QAAA,EAAU,OAAO,IAAA;AAE3B,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,SAAS,sBAAA,CACP,UACA,UAAA,EACmD;AACnD,IAAA,IAAI,CAAC,QAAA,EAAU,SAAA,GAAY,UAAU,GAAG,OAAO,IAAA;AAC/C,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,UAAU,CAAA;AACvC,IAAA,IAAI,CAAC,EAAE,OAAA,IAAW,CAAC,EAAE,QAAA,IAAY,CAAC,CAAA,CAAE,YAAA,EAAc,OAAO,IAAA;AACzD,IAAA,OAAO,EAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,YAAA,EAAc,EAAE,YAAA,EAAa;AAAA,EAC9D;AAIA,EAAA,MAAM,QAAA,GAAW,IAAIF,SAAAA,EAAK;AAG1B,EAAA,QAAA,CAAS,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAW;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AACzC,MAAA,MAAM,cAAA,GAAiB,mBAAmB,UAAU,CAAA;AAEpD,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,2BAA2B,UAAU,CAAA,CAAA,IAAM,GAAG,CAAA;AAAA,MACvE;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,EAAE,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,QAAA,EAAU,UAAU,CAAA;AAEzD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,mBAAmB,UAAU,CAAA,kCAAA;AAAA,WACnC,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,CAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,aAAa,aAAA,EAAc;AACzC,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,EAAG,UAAU,CAAA;AAGhD,MAAAS,gBAAAA,CAAU,CAAA,EAAG,iBAAA,EAAmB,KAAA,EAAO;AAAA,QACrC,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,KAAA;AAAA;AAAA,QACV,MAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,MAAM,eAAe,YAAA,CAAa,iBAAA;AAAA,QAChC,cAAA;AAAA,QACA,KAAA,CAAM,QAAA;AAAA,QACN,WAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,CAAA,CAAE,SAAS,YAAY,CAAA;AAAA,IAChC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,+BAAA,IAAmC,GAAG,CAAA;AAAA,IAC/D;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,GAAA,CAAI,qBAAA,EAAuB,OAAO,CAAA,KAAW;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AACzC,MAAA,MAAM,cAAA,GAAiB,mBAAmB,UAAU,CAAA;AAEpD,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,OAAO,CAAA,CAAE,SAAS,0CAA0C,CAAA;AAAA,MAC9D;AAGA,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AACtC,MAAA,MAAM,WAAA,GAAcE,gBAAA,CAAU,CAAA,EAAG,iBAAiB,CAAA;AAElD,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,WAAA,IAAe,eAAe,WAAA,EAAa;AAC7D,QAAA,OAAO,CAAA,CAAE,SAAS,0DAA0D,CAAA;AAAA,MAC9E;AAGA,MAAAF,gBAAAA,CAAU,CAAA,EAAG,iBAAA,EAAmB,EAAA,EAAI;AAAA,QAClC,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,CAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAGD,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AACtC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,mBAAmB,CAAA,IAAK,UAAA;AACtD,QAAA,OAAO,EAAE,QAAA,CAAS,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,MACxE;AAEA,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAC/B,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,CAAA,CAAE,SAAS,kDAAkD,CAAA;AAAA,MACtE;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,EAAE,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,QAAA,EAAU,UAAU,CAAA;AAEzD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,CAAA,CAAE,SAAS,iDAAiD,CAAA;AAAA,MACrE;AAEA,MAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,CAAA;AACxC,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,EAAG,UAAU,CAAA;AAGhD,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,YAAA;AAAA,QAChC,cAAA;AAAA,QACA,KAAA,CAAM,QAAA;AAAA,QACN,KAAA,CAAM,YAAA;AAAA,QACN,IAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,UAAU,MAAM,YAAA,CAAa,gBAAA,CAAiB,cAAA,EAAgB,OAAO,YAAY,CAAA;AAEvF,MAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,QAAA,OAAO,CAAA,CAAE,SAAS,+HAA+H,CAAA;AAAA,MACnJ;AAEA,MAAA,MAAM,cAAA,GAAiB,OAAO,UAAA,GAC1B,IAAA,CAAK,KAAI,GAAK,MAAA,CAAO,aAAa,GAAA,GAClC,IAAA;AAGJ,MAAA,MAAM,gBAAgB,MAAM,YAAA,CAAa,gBAAA,CAAiB,UAAA,EAAY,QAAQ,iBAAiB,CAAA;AAE/F,MAAA,IAAI,aAAA,EAAe;AAEjB,QAAA,MAAM,YAAA,CAAa,iBAAA;AAAA,UACjB,aAAA,CAAc,EAAA;AAAA,UACd,MAAA,CAAO,YAAA;AAAA,UACP,MAAA,CAAO,aAAA;AAAA,UACP,cAAA,IAAkB,KAAA;AAAA,SACpB;AAGA,QAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA;AAAA,UACpB;AAAA,SACF,CAAE,IAAA,CAAK,aAAA,CAAc,OAAO,EAAE,KAAA,EAAM;AAEpC,QAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,SAAA,EAAW;AAC5B,UAAA,OAAO,CAAA,CAAE,SAAS,0CAA0C,CAAA;AAAA,QAC9D;AAEA,QAAA,MAAMG,YAAW,MAAML,2CAAA,CAA2B,EAAE,GAAA,CAAY,EAAA,EAAI,EAAE,GAAU,CAAA;AAChF,QAAA,MAAMM,IAAAA,GAAM,MAAML,6BAAA,CAAY,aAAA;AAAA,UAC5B,IAAA,CAAK,EAAA;AAAA,UAAI,IAAA,CAAK,KAAA;AAAA,UAAO,IAAA,CAAK,IAAA;AAAA,UACzB,EAAE,GAAA,CAAY,UAAA;AAAA,UAAYI;AAAA,SAC7B;AAEA,QAAAJ,6BAAA,CAAY,aAAA,CAAc,GAAGK,IAAAA,EAAK,EAAE,UAAU,KAAA,EAAO,MAAA,EAAQD,WAAU,CAAA;AACvE,QAAA,OAAO,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,MAC5B;AAGA,MAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,eAAA,CAAgB,QAAQ,KAAK,CAAA;AAErE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,IAAI,CAAC,aAAa,SAAA,EAAW;AAC3B,UAAA,OAAO,CAAA,CAAE,SAAS,0CAA0C,CAAA;AAAA,QAC9D;AAGA,QAAA,MAAM,aAAa,kBAAA,CAAmB;AAAA,UACpC,QAAQ,YAAA,CAAa,EAAA;AAAA,UACrB,QAAA,EAAU,UAAA;AAAA,UACV,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,UAC3B,aAAa,MAAA,CAAO,YAAA;AAAA,UACpB,cAAc,MAAA,CAAO,aAAA;AAAA,UACrB,gBAAgB,cAAA,IAAkB,KAAA,CAAA;AAAA,UAClC,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,SACpC,CAAA;AAED,QAAA,MAAMA,YAAW,MAAML,2CAAA,CAA2B,EAAE,GAAA,CAAY,EAAA,EAAI,EAAE,GAAU,CAAA;AAChF,QAAA,MAAMM,IAAAA,GAAM,MAAML,6BAAA,CAAY,aAAA;AAAA,UAC5B,YAAA,CAAa,EAAA;AAAA,UAAI,YAAA,CAAa,KAAA;AAAA,UAAO,YAAA,CAAa,IAAA;AAAA,UACjD,EAAE,GAAA,CAAY,UAAA;AAAA,UAAYI;AAAA,SAC7B;AAEA,QAAAJ,6BAAA,CAAY,aAAA,CAAc,GAAGK,IAAAA,EAAK,EAAE,UAAU,KAAA,EAAO,MAAA,EAAQD,WAAU,CAAA;AACvE,QAAA,OAAO,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,MAC5B;AAGA,MAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,mBAAA,CAAoB,OAAO,CAAA;AAEhE,MAAA,MAAM,aAAa,kBAAA,CAAmB;AAAA,QACpC,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,UAAA;AAAA,QACV,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,QAC3B,aAAa,MAAA,CAAO,YAAA;AAAA,QACpB,cAAc,MAAA,CAAO,aAAA;AAAA,QACrB,gBAAgB,cAAA,IAAkB,KAAA,CAAA;AAAA,QAClC,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OACpC,CAAA;AAED,MAAA,MAAM,WAAW,MAAML,2CAAA,CAA2B,EAAE,GAAA,CAAY,EAAA,EAAI,EAAE,GAAU,CAAA;AAChF,MAAA,MAAM,GAAA,GAAM,MAAMC,6BAAA,CAAY,aAAA;AAAA,QAC5B,SAAA;AAAA,QAAW,OAAA,CAAQ,MAAM,WAAA,EAAY;AAAA,QAAG,QAAA;AAAA,QACvC,EAAE,GAAA,CAAY,UAAA;AAAA,QAAY;AAAA,OAC7B;AAEA,MAAAA,6BAAA,CAAY,aAAA,CAAc,GAAG,GAAA,EAAK,EAAE,UAAU,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AACvE,MAAA,OAAO,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,IAE5B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,6BAAA;AACzD,MAAA,OAAO,EAAE,QAAA,CAAS,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IACtE;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA,KAAW;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAC9C,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kBAAA,IAAsB,GAAG,CAAA;AAAA,MAClD;AAIA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,EAAE,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,QAAA,EAAU,QAAQ,CAAA;AAEvD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,mBAAmB,QAAQ,CAAA,mBAAA,CAAA,IAAyB,GAAG,CAAA;AAAA,MAChF;AAEA,MAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,CAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,aAAa,aAAA,EAAc;AACzC,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,EAAG,QAAQ,CAAA;AAE9C,MAAAC,gBAAAA,CAAU,CAAA,EAAG,iBAAA,EAAmB,KAAA,EAAO;AAAA,QACrC,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,MAAM,eAAe,YAAA,CAAa,iBAAA;AAAA,QAChC,mBAAmB,QAAQ,CAAA;AAAA,QAC3B,KAAA,CAAM,QAAA;AAAA,QACN,WAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,WAAA,EAAa,cAAc,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oCAAA,IAAwC,GAAG,CAAA;AAAA,IACpE;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA,KAAW;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,MACtD;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,CAAA;AACxC,MAAA,MAAM,UAAU,MAAM,YAAA,CAAa,kBAAA,CAAmB,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAE3E,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,OAAO,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAA,iBAAA,CAAA,EAAqB,CAAA;AAAA,IAC1E,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,0BAAA,IAA8B,GAAG,CAAA;AAAA,IAC1D;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAW;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,CAAA;AACxC,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,qBAAA,CAAsB,KAAK,MAAM,CAAA;AAErE,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,UAC3B,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,mBAAmB,CAAA,CAAE,mBAAA;AAAA,UACrB,UAAU,CAAA,CAAE;AAAA,SACd,CAAE;AAAA,OACH,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,iCAAA,IAAqC,GAAG,CAAA;AAAA,IACjE;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,eAAe,QAAA,EAAU;AAAA,IACxC,WAAA,EAAa,+BAAA;AAAA,IACb,YAAA,EAAc,KAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,WAAA,CAAY,mBAAmB,gCAAA,EAAkC;AAAA,IACvE,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa,CAAC,cAAc;AAAA,GAC7B,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,UAAU,YAAY;AACpB,MAAA,OAAA,CAAQ,KAAK,yCAAoC,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,OAAA,CAAQ,KAAK,2CAAsC,CAAA;AAAA,IACrD;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAEO,IAAM,uBAAuB,0BAAA;;;ACla7B,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,EAAA,EAAS;AAAT,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAU;AAAA;AAAA;AAAA;AAAA,EAK9B,MAAM,kBAAkB,IAAA,EAAiC;AACvD,IAAA,IAAI;AAGF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,2BAAA,EAA6B;AAAA,QAC9D,IAAA,EAAM,IAAA,CAAK,cAAA,CAAe,IAAI;AAAA,OAC/B,CAAA;AAGD,MAAA,IAAI,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7C,QAAA,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,MACxB;AAEA,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kDAAkD,KAAK,CAAA;AACrE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,KAAA,EAAsC;AACxD,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,EAAA;AAClB,MAAA,MAAM,UAAsB,EAAC;AAE7B,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,SAAA,EAAW;AAChD,QAAA,OAAA,CAAQ,KAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,SAAS,CAAC,CAAA;AAAA,MAC5C;AAEA,MAAA,MAAM,gBAA4B,EAAC;AAEnC,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,eAAA,GAAkB,MAAM,OAAA,CAAQ,GAAA;AAAA,UACpC,MAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAC;AAAA,SAChD;AACA,QAAA,aAAA,CAAc,IAAA,CAAK,GAAG,eAAe,CAAA;AAAA,MACvC;AAEA,MAAA,OAAO,aAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yDAAyD,KAAK,CAAA;AAC5E,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,eAAe,IAAA,EAAsB;AAC3C,IAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAGlB,IAAA,IAAI,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAG/C,IAAA,IAAI,SAAA,CAAU,SAAS,GAAA,EAAM;AAC3B,MAAA,SAAA,GAAY,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,GAAI,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAiB,GAAa,CAAA,EAAqB;AACjD,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ;AACzB,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AACrB,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AACrB,MAAA,UAAA,IAAc,IAAA,GAAO,IAAA;AACrB,MAAA,KAAA,IAAS,IAAA,GAAO,IAAA;AAChB,MAAA,KAAA,IAAS,IAAA,GAAO,IAAA;AAAA,IAClB;AAEA,IAAA,OAAO,cAAc,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAK,KAAK,CAAA,CAAA;AAAA,EACzD;AACF,CAAA;;;ACvFO,IAAM,kBAAN,MAAsB;AAAA;AAAA,EAEV,UAAA,GAAa,GAAA;AAAA,EACb,aAAA,GAAgB,EAAA;AAAA;AAAA;AAAA;AAAA,EAKjC,aACE,SAAA,EACA,YAAA,EACA,OACA,IAAA,EACA,QAAA,GAAgC,EAAC,EACjB;AAEhB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAElC,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACrC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4CAAA,EAA+C,SAAS,CAAA,CAAE,CAAA;AACvE,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAG5C,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,EAAW,KAAA,MAAW;AAAA,MAC3C,EAAA,EAAI,CAAA,EAAG,SAAS,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,MAC/B,UAAA,EAAY,SAAA;AAAA,MACZ,aAAA,EAAe,YAAA;AAAA,MACf,KAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,KAAA;AAAA,MACb,QAAA,EAAU;AAAA,QACR,GAAG,QAAA;AAAA,QACH,cAAc,UAAA,CAAW;AAAA;AAC3B,KACF,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,KAAA,EAME;AAClB,IAAA,MAAM,YAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,SAAS,IAAA,CAAK,YAAA;AAAA,QAClB,IAAA,CAAK,EAAA;AAAA,QACL,IAAA,CAAK,aAAA;AAAA,QACL,IAAA,CAAK,KAAA;AAAA,QACL,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AACA,MAAA,SAAA,CAAU,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,IAAA,EAAmB;AACrC,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,IAAI,KAAK,KAAA,EAAO,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAC7C,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,KAAK,WAAA,EAAa,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AACzD,IAAA,IAAI,KAAK,OAAA,EAAS,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AACjD,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,KAAK,OAAA,EAAS,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAGjD,IAAA,MAAM,gBAAA,GAAmB,CAAC,GAAA,KAAmB;AAC3C,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAE3B,QAAA,IAAI,IAAI,MAAA,GAAS,EAAA,IAAM,CAAC,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC9C,UAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,QAChB;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC7B,QAAA,GAAA,CAAI,QAAQ,gBAAgB,CAAA;AAAA,MAC9B,CAAA,MAAA,IAAW,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAEzC,QAAA,MAAM,WAAW,CAAC,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,aAAa,UAAU,CAAA;AAEvE,QAAA,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC5C,UAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,CAAA,EAAG;AACzC,YAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,UACxB;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,gBAAA,CAAiB,IAAI,CAAA;AAErB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,EAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,IAAA,EAAwB;AAE9C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAE9B,IAAA,IAAI,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,UAAA,EAAY;AACnC,MAAA,OAAO,CAAC,IAAI,CAAA;AAAA,IACd;AAEA,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,OAAO,UAAA,GAAa,MAAM,MAAA,EAAQ;AAEhC,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,aAAa,IAAA,CAAK,UAAA,EAAY,MAAM,MAAM,CAAA;AACpE,MAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,YAAY,QAAQ,CAAA,CAAE,KAAK,GAAG,CAAA;AACxD,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAGjB,MAAA,UAAA,IAAc,IAAA,CAAK,aAAa,IAAA,CAAK,aAAA;AAGrC,MAAA,IAAI,UAAA,IAAc,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,aAAA,EAAe;AACnD,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,WAAA,EAA6B;AAC/C,IAAA,QAAQ,WAAA;AAAa,MACnB,KAAK,YAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,OAAO,GAAA;AAAA;AAAA,MACT,KAAK,UAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,OAAO,GAAA;AAAA;AAAA,MACT,KAAK,UAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,OAAO,GAAA;AAAA;AAAA,MACT;AACE,QAAA,OAAO,IAAA,CAAK,UAAA;AAAA;AAChB,EACF;AACF,CAAA;;;ACjKO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,WAAA,CACU,EAAA,EACA,EAAA,EACA,SAAA,EACR;AAHQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAER,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAAA,EAC7C;AAAA,EAVQ,gBAAA;AAAA,EACA,eAAA;AAAA;AAAA;AAAA;AAAA,EAcR,MAAM,gBAAgB,YAAA,EAKnB;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8CAAA,EAAiD,YAAY,CAAA,CAAE,CAAA;AAE3E,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,OAAA,EAAS,YAAA,KAAiB,MAAM,IAAA,CAAK,GAC1C,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAOR,CAAA,CACA,IAAA,CAAK,YAAY,CAAA,CACjB,GAAA,EAWE;AAEL,MAAA,MAAM,UAAA,GAAa,cAAc,MAAA,IAAU,CAAA;AAE3C,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2CAAA,EAA8C,YAAY,CAAA,CAAE,CAAA;AACxE,QAAA,OAAO,EAAE,aAAa,CAAA,EAAG,YAAA,EAAc,GAAG,cAAA,EAAgB,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,MACzE;AAGA,MAAA,MAAM,KAAA,GAAA,CAAS,YAAA,IAAgB,EAAC,EAAG,IAAI,CAAA,IAAA,MAAS;AAAA,QAC9C,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,KAAA,EAAO,KAAK,KAAA,IAAS,UAAA;AAAA,QACrB,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA;AAAA,QACnE,QAAA,EAAU;AAAA,UACR,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,yBAAyB,IAAA,CAAK;AAAA;AAChC,OACF,CAAE,CAAA;AAEF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,iBAAA,CAAkB,KAAK,CAAA;AAC3D,MAAA,MAAM,cAAc,MAAA,CAAO,MAAA;AAE3B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,WAAW,CAAA,aAAA,EAAgB,UAAU,CAAA,MAAA,CAAQ,CAAA;AAGlF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA,CAAiB,aAAA;AAAA,QAC7C,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,EAAE,KAAK;;AAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAE;AAAA,OAC3C;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,UAAA,CAAW,MAAM,CAAA,WAAA,CAAa,CAAA;AAGnE,MAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,MAAM,SAAA,GAAY,GAAA;AAElB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,SAAA,EAAW;AACjD,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AAChD,QAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AAExD,QAAA,IAAI;AACF,UAAA,MAAM,KAAK,SAAA,CAAU,MAAA;AAAA,YACnB,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,MAAS;AAAA,cAC9B,IAAI,KAAA,CAAM,EAAA;AAAA,cACV,MAAA,EAAQ,eAAe,GAAG,CAAA;AAAA,cAC1B,QAAA,EAAU;AAAA,gBACR,YAAY,KAAA,CAAM,UAAA;AAAA,gBAClB,eAAe,KAAA,CAAM,aAAA;AAAA,gBACrB,OAAO,KAAA,CAAM,KAAA;AAAA,gBACb,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA;AAAA,gBACjC,aAAa,KAAA,CAAM,WAAA;AAAA,gBACnB,GAAG,KAAA,CAAM;AAAA;AACX,aACF,CAAE;AAAA,WACJ;AAEA,UAAA,aAAA,IAAiB,UAAA,CAAW,MAAA;AAC5B,UAAA,OAAA,CAAQ,GAAA,CAAI,6BAA6B,CAAA,GAAI,SAAA,GAAY,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,QAC3F,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,MAAM,CAAA,iCAAA,EAAoC,CAAA,GAAI,SAAA,GAAY,CAAC,KAAK,KAAK,CAAA;AAC7E,UAAA,MAAA,IAAU,UAAA,CAAW,MAAA;AAAA,QACvB;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,aAAa,CAAA,CAAA,EAAI,WAAW,CAAA,eAAA,CAAiB,CAAA;AAE3F,MAAA,OAAO;AAAA,QACL,WAAA,EAAa,UAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd,cAAA,EAAgB,aAAA;AAAA,QAChB;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC7E,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,KAAA,EAAoB,QAAA,EAAqD;AACpF,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AAGzD,MAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,iBAAA,CAAkB,MAAM,KAAK,CAAA;AAGhF,MAAA,MAAM,SAAc,EAAC;AAErB,MAAA,IAAI,MAAM,OAAA,EAAS,WAAA,IAAe,MAAM,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AACtE,QAAA,MAAA,CAAO,aAAA,GAAgB,EAAE,GAAA,EAAK,KAAA,CAAM,QAAQ,WAAA,EAAY;AAAA,MAC1D,CAAA,MAAA,IAAW,QAAA,CAAS,oBAAA,CAAqB,MAAA,GAAS,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,aAAA,GAAgB,EAAE,GAAA,EAAK,QAAA,CAAS,oBAAA,EAAqB;AAAA,MAC9D;AAEA,MAAA,IAAI,MAAM,OAAA,EAAS,MAAA,IAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5D,QAAA,MAAA,CAAO,MAAA,GAAS,EAAE,GAAA,EAAK,KAAA,CAAM,QAAQ,MAAA,EAAO;AAAA,MAC9C;AAGA,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,cAAA,EAAgB;AAAA,QAC/D,IAAA,EAAM,EAAA;AAAA;AAAA,QACN,cAAA,EAAgB;AAAA,OACjB,CAAA;AAGD,MAAA,IAAI,eAAA,GAAkB,aAAA,CAAc,OAAA,IAAW,EAAC;AAChD,MAAA,IAAI,MAAA,CAAO,eAAe,GAAA,IAAO,KAAA,CAAM,QAAQ,MAAA,CAAO,aAAA,CAAc,GAAG,CAAA,EAAG;AACxE,QAAA,MAAM,kBAAA,GAAqB,OAAO,aAAA,CAAc,GAAA;AAChD,QAAA,eAAA,GAAkB,eAAA,CAAgB,MAAA;AAAA,UAAO,CAAC,KAAA,KACxC,kBAAA,CAAmB,QAAA,CAAS,KAAA,CAAM,UAAU,aAAa;AAAA,SAC3D;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,QAAQ,GAAA,IAAO,KAAA,CAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,EAAG;AAC1D,QAAA,MAAM,eAAA,GAAkB,OAAO,MAAA,CAAO,GAAA;AACtC,QAAA,eAAA,GAAkB,eAAA,CAAgB,MAAA;AAAA,UAAO,CAAC,KAAA,KACxC,eAAA,CAAgB,QAAA,CAAS,KAAA,CAAM,UAAU,MAAM;AAAA,SACjD;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,IAAS,QAAA,CAAS,aAAA,IAAiB,EAAA;AACtD,MAAA,eAAA,GAAkB,eAAA,CAAgB,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAG/C,MAAA,aAAA,CAAc,OAAA,GAAU,eAAA;AAExB,MAAA,IAAI,CAAC,aAAA,CAAc,OAAA,IAAW,aAAA,CAAc,OAAA,CAAQ,WAAW,CAAA,EAAG;AAChE,QAAA,OAAO;AAAA,UACL,SAAS,EAAC;AAAA,UACV,KAAA,EAAO,CAAA;AAAA,UACP,aAAA,EAAe,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,UAC5B,IAAA,EAAM;AAAA,SACR;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,IAAI,GAAA;AAAA,QACzB,cAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,SAAS,UAAU;AAAA,OAC5D,CAAA;AAGD,MAAA,MAAM,eAAe,UAAA,CAAW,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AACvD,MAAA,MAAM,EAAE,OAAA,EAAS,YAAA,KAAiB,MAAM,IAAA,CAAK,GAC1C,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAMU,YAAY,CAAA;AAAA,QAAA,CAC9B,CAAA,CACA,IAAA,CAAK,GAAG,UAAU,EAClB,GAAA,EAUE;AAGL,MAAA,MAAM,aAAA,GAAA,CAAiC,YAAA,IAAgB,EAAC,EAAG,IAAI,CAAA,IAAA,KAAQ;AAErE,QAAA,MAAM,cAAA,GAAiB,cAAc,OAAA,CAAQ,MAAA;AAAA,UAC3C,CAAC,CAAA,KAAW,CAAA,CAAE,QAAA,CAAS,eAAe,IAAA,CAAK;AAAA,SAC7C;AAEA,QAAA,MAAM,YAAY,cAAA,CAAe,MAAA;AAAA,UAAO,CAAC,MAAW,OAAA,KAClD,OAAA,CAAQ,SAAS,IAAA,EAAM,KAAA,IAAS,KAAK,OAAA,GAAU,IAAA;AAAA,UAC/C;AAAA,SAAI;AAEN,QAAA,OAAO;AAAA,UACL,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,KAAA,EAAO,KAAK,KAAA,IAAS,UAAA;AAAA,UACrB,IAAA,EAAM,KAAK,IAAA,IAAQ,EAAA;AAAA,UACnB,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,IAAA,IAAQ,EAAA;AAAA,UACtC,eAAA,EAAiB,WAAW,KAAA,IAAS,CAAA;AAAA,UACrC,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,YAAY,IAAA,CAAK;AAAA,SACnB;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,eAAA,IAAmB,CAAA,KAAM,CAAA,CAAE,eAAA,IAAmB,CAAA,CAAE,CAAA;AAEhF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC/B,MAAA,OAAA,CAAQ,IAAI,CAAA,gCAAA,EAAmC,SAAS,CAAA,IAAA,EAAO,aAAA,CAAc,MAAM,CAAA,QAAA,CAAU,CAAA;AAE7F,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,aAAA;AAAA,QACT,OAAO,aAAA,CAAc,MAAA;AAAA,QACrB,aAAA,EAAe,SAAA;AAAA,QACf,IAAA,EAAM;AAAA,OACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAAA,EAAkC;AACzD,IAAA,IAAI;AAEF,MAAA,MAAMK,QAAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CACxB,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAOR,CAAA,CACA,IAAA,CAAK,SAAS,CAAA,CACd,KAAA,EAWE;AAEL,MAAA,IAAI,CAACA,QAAAA,EAAS;AACZ,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,SAAS,CAAA,UAAA,CAAY,CAAA;AACzD,QAAA;AAAA,MACF;AAGA,MAAA,IAAIA,QAAAA,CAAQ,WAAW,WAAA,EAAa;AAClC,QAAA,MAAM,IAAA,CAAK,uBAAuB,SAAS,CAAA;AAC3C,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAAS,KAAK,eAAA,CAAgB,YAAA;AAAA,QAClCA,QAAAA,CAAQ,EAAA;AAAA,QACRA,QAAAA,CAAQ,aAAA;AAAA,QACRA,SAAQ,KAAA,IAAS,UAAA;AAAA,QACjB,OAAOA,SAAQ,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAMA,QAAAA,CAAQ,IAAI,CAAA,GAAIA,QAAAA,CAAQ,IAAA;AAAA,QACtE;AAAA,UACE,QAAQA,QAAAA,CAAQ,MAAA;AAAA,UAChB,YAAYA,QAAAA,CAAQ,UAAA;AAAA,UACpB,YAAYA,QAAAA,CAAQ,UAAA;AAAA,UACpB,WAAWA,QAAAA,CAAQ,SAAA;AAAA,UACnB,iBAAiBA,QAAAA,CAAQ,eAAA;AAAA,UACzB,yBAAyBA,QAAAA,CAAQ;AAAA;AACnC,OACF;AAGA,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA,CAAiB,aAAA;AAAA,QAC7C,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,EAAE,KAAK;;AAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAE;AAAA,OAC3C;AAGA,MAAA,MAAM,KAAK,SAAA,CAAU,MAAA;AAAA,QACnB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,MAAS;AAAA,UAC1B,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,MAAA,EAAQ,WAAW,GAAG,CAAA;AAAA,UACtB,QAAA,EAAU;AAAA,YACR,YAAY,KAAA,CAAM,UAAA;AAAA,YAClB,eAAe,KAAA,CAAM,aAAA;AAAA,YACrB,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA,YACjC,aAAa,KAAA,CAAM,WAAA;AAAA,YACnB,GAAG,KAAA,CAAM;AAAA;AACX,SACF,CAAE;AAAA,OACJ;AAEA,MAAA,OAAA,CAAQ,IAAI,CAAA,sCAAA,EAAyC,SAAS,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,IAC3F,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qCAAA,EAAwC,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACzE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,SAAA,EAAkC;AAC7D,IAAA,IAAI;AAKF,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,SAAS,CAAA,WAAA,CAAa,CAAA;AAAA,IAMpE,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mCAAA,EAAsC,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACvE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,YAAA,EAAsB,KAAA,GAAgB,CAAA,EAAsB;AAC/E,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,kBAAkB,YAAY,CAAA;AAGjF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,cAAA,EAAgB;AAAA,QACzD,MAAM,KAAA,GAAQ,CAAA;AAAA;AAAA,QACd,cAAA,EAAgB;AAAA,OACjB,CAAA;AAGD,MAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAI,GAAA;AAAA,QAC1B,OAAA,CAAQ,OAAA,EAAS,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,IAAK;AAAC,OACxE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAEjB,MAAA,OAAO,WAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAC7D,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,CAAC,IAAA,CAAK,EAAA;AAAA,EACpC;AACF,CAAA;;;AChZO,IAAM,kBAAN,MAAsB;AAAA,EAG3B,WAAA,CACU,EAAA,EACA,EAAA,EACA,SAAA,EACR;AAHQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAGR,IAAA,IAAI,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,SAAA,EAAW;AAC7B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB,EAAA,EAAI,IAAI,SAAS,CAAA;AACvD,MAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,uEAAuE,CAAA;AAAA,IACrF;AAAA,EACF;AAAA,EAdQ,SAAA;AAAA;AAAA;AAAA;AAAA,EAmBR,MAAM,WAAA,GAAgD;AACpD,IAAA,IAAI;AACF,MAAA,MAAMX,OAAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CACvB,OAAA,CAAQ,mDAAmD,CAAA,CAC3D,IAAA,CAAK,WAAW,CAAA,CAChB,KAAA,EAAmC;AAEtC,MAAA,IAAI,CAACA,OAAAA,IAAU,CAACA,OAAAA,CAAO,QAAA,EAAU;AAC/B,QAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,MACjC;AAEA,MAAA,OAAO,IAAA,CAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,MAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAAuC;AACrC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,eAAA,EAAiB,IAAA;AAAA,MACjB,sBAAsB,EAAC;AAAA,MACvB,uBAAuB,EAAC;AAAA,MACxB,oBAAA,EAAsB,IAAA;AAAA,MACtB,cAAA,EAAgB,CAAA;AAAA,MAChB,aAAA,EAAe,EAAA;AAAA,MACf,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,QAAA,EAAgE;AACnF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,GAAG,QAAA;AAAA,MACH,GAAG;AAAA,KACL;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAK,GACR,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAKR,EACA,IAAA,CAAK,IAAA,CAAK,UAAU,OAAO,CAAC,EAC5B,GAAA,EAAI;AAEP,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAA6D;AACjE,IAAA,IAAI;AAGF,MAAA,MAAM,eAAA,GAAkB,KAAK,EAAA,CAAG,OAAA;AAAA,QAC9B;AAAA,OACF;AACA,MAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,MAAM,gBAAgB,GAAA,EAKvD;AAGC,MAAA,MAAMY,YAAAA,GAAAA,CAAe,cAAA,IAAkB,EAAC,EAAG,MAAA;AAAA,QACzC,CAAC,GAAA,KAAQ;AACP,UAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAM,OAAO,KAAA;AACtB,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,WAAA,EAAY;AAClC,UAAA,OAAO,CAAC,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,IACxB,CAAC,KAAK,QAAA,CAAS,OAAO,KACtB,IAAA,KAAS,iBAAA,IACT,CAAC,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IACvB,IAAA,KAAS,wBACT,IAAA,KAAS,iBAAA;AAAA,QAClB;AAAA,OACF;AAGJ,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,MAAA,MAAM,QAAA,GAAW,QAAA,EAAU,oBAAA,IAAwB,EAAC;AACpD,MAAA,MAAM,SAAA,GAAY,QAAA,EAAU,qBAAA,IAAyB,EAAC;AAGtD,MAAA,MAAM,gBAA6C,EAAC;AAEpD,MAAA,KAAA,MAAW,UAAA,IAAcA,YAAAA,IAAe,EAAC,EAAG;AAC1C,QAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA;AAGzC,QAAA,IAAI,SAAS,QAAA,CAAS,YAAY,KAAK,SAAA,CAAU,QAAA,CAAS,YAAY,CAAA,EAAG;AACvE,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,SAAA,GAAY,KAAK,EAAA,CAAG,OAAA;AAAA,UACxB;AAAA,SACF;AACA,QAAA,MAAM,cAAc,MAAM,SAAA,CAAU,IAAA,CAAK,YAAY,EAAE,KAAA,EAAyB;AAChF,QAAA,MAAM,SAAA,GAAY,aAAa,KAAA,IAAS,CAAA;AAExC,QAAA,aAAA,CAAc,IAAA,CAAK;AAAA,UACjB,UAAA,EAAY;AAAA,YACV,EAAA,EAAI,YAAA;AAAA,YACJ,MAAM,UAAA,CAAW,IAAA;AAAA,YACjB,cAAc,UAAA,CAAW,YAAA;AAAA,YACzB,aAAa,UAAA,CAAW,WAAA;AAAA,YACxB,UAAA,EAAY,SAAA;AAAA,YACZ,UAAA,EAAY,KAAA;AAAA,YACZ,YAAA,EAAc,KAAA;AAAA,YACd,MAAA,EAAQ;AAAA,WACV;AAAA,UACA,OAAA,EAAS,CAAA,gBAAA,EAAmB,UAAA,CAAW,YAAY,UAAU,SAAS,CAAA,6BAAA;AAAA,SACvE,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,aAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,GAA+C;AACnD,IAAA,IAAI;AAEF,MAAA,MAAM,eAAA,GAAkB,KAAK,EAAA,CAAG,OAAA;AAAA,QAC9B;AAAA,OACF;AACA,MAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,MAAM,gBAAgB,GAAA,EAKvD;AAEH,MAAA,OAAA,CAAQ,GAAA,CAAI,8DAAA,EAAgE,cAAA,EAAgB,MAAA,IAAU,CAAC,CAAA;AACvG,MAAA,MAAM,eAAA,GAAkB,iBAAiB,CAAC,CAAA;AAC1C,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,OAAA,CAAQ,IAAI,wDAAA,EAA0D;AAAA,UACpE,IAAI,eAAA,CAAgB,EAAA;AAAA,UACpB,MAAM,eAAA,CAAgB,IAAA;AAAA,UACtB,cAAc,eAAA,CAAgB;AAAA,SAC/B,CAAA;AAAA,MACH;AAGA,MAAA,MAAMA,YAAAA,GAAAA,CAAe,cAAA,IAAkB,EAAC,EAAG,MAAA;AAAA,QACzC,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI;AAAA,OACzB;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,uEAAA,EAAyEA,YAAAA,CAAY,MAAM,CAAA;AACvG,MAAA,OAAA,CAAQ,GAAA,CAAI,4DAAA,EAA8DA,YAAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAGjH,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,MAAA,MAAM,QAAA,GAAW,QAAA,EAAU,oBAAA,IAAwB,EAAC;AACpD,MAAA,MAAM,SAAA,GAAY,QAAA,EAAU,qBAAA,IAAyB,EAAC;AAEtD,MAAA,OAAA,CAAQ,IAAI,+CAAA,EAAiD;AAAA,QAC3D,gBAAgB,QAAA,CAAS,MAAA;AAAA,QACzB,iBAAiB,SAAA,CAAU,MAAA;AAAA,QAC3B;AAAA,OACD,CAAA;AAGD,MAAA,MAAM,kBAAoC,EAAC;AAE3C,MAAA,KAAA,MAAW,cAAcA,YAAAA,EAAa;AACpC,QAAA,IAAI,CAAC,UAAA,CAAW,EAAA,IAAM,CAAC,WAAW,IAAA,EAAM;AACxC,QAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA;AAEzC,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,OAAA,CAAQ,IAAA,CAAK,kDAAkD,UAAU,CAAA;AACzE,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,SAAA,GAAY,KAAK,EAAA,CAAG,OAAA;AAAA,UACxB;AAAA,SACF;AACA,QAAA,MAAM,cAAc,MAAM,SAAA,CAAU,IAAA,CAAK,YAAY,EAAE,KAAA,EAAyB;AAChF,QAAA,MAAM,SAAA,GAAY,aAAa,KAAA,IAAS,CAAA;AAExC,QAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,UACnB,EAAA,EAAI,YAAA;AAAA,UACJ,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,YAAA,EAAc,UAAA,CAAW,YAAA,IAAgB,UAAA,CAAW,IAAA;AAAA,UACpD,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,UAAA,EAAY,SAAA;AAAA,UACZ,UAAA,EAAY,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA;AAAA,UAC1C,YAAA,EAAc,SAAA,CAAU,QAAA,CAAS,YAAY,CAAA;AAAA,UAC7C,MAAA,EAAQ,CAAC,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,IAAK,CAAC,SAAA,CAAU,QAAA,CAAS,YAAY;AAAA,SAC7E,CAAA;AAAA,MACH;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,gEAAA,EAAkE,eAAA,CAAgB,MAAM,CAAA;AACpG,MAAA,MAAM,SAAA,GAAY,gBAAgB,CAAC,CAAA;AACnC,MAAA,IAAI,eAAA,CAAgB,MAAA,GAAS,CAAA,IAAK,SAAA,EAAW;AAC3C,QAAA,OAAA,CAAQ,IAAI,2DAAA,EAA6D;AAAA,UACvE,IAAI,SAAA,CAAU,EAAA;AAAA,UACd,MAAM,SAAA,CAAU,IAAA;AAAA,UAChB,cAAc,SAAA,CAAU,YAAA;AAAA,UACxB,YAAY,SAAA,CAAU;AAAA,SACvB,CAAA;AAAA,MACH;AACA,MAAA,OAAO,eAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,KAAK,CAAA;AACpE,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,KAAA,EAA6C;AAExD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AAExC,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,MAAA,OAAO;AAAA,QACL,SAAS,EAAC;AAAA,QACV,KAAA,EAAO,CAAA;AAAA,QACP,aAAA,EAAe,CAAA;AAAA,QACf,MAAM,KAAA,CAAM;AAAA,OACd;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,SAAS,IAAA,IAAQ,QAAA,CAAS,mBAAmB,IAAA,CAAK,SAAA,EAAW,aAAY,EAAG;AACpF,MAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAA;AAAA,IACtC;AAGA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QAAA,CAAS,KAAA,EAAoB,QAAA,EAAqD;AAG9F,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,QAAA,OAAA,CAAQ,KAAK,2EAA2E,CAAA;AACxF,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,QAAQ,CAAA;AAAA,MAC3C;AAGA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,OAAO,QAAQ,CAAA;AAE1D,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+DAA+D,KAAK,CAAA;AAElF,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAA,CACZ,KAAA,EACA,QAAA,EACyB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,aAAuB,EAAC;AAC9B,MAAA,MAAM,SAAgB,EAAC;AAGvB,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,UAAA,CAAW,KAAK,oDAAoD,CAAA;AACpE,QAAA,MAAM,UAAA,GAAa,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAA,CAAA,CAAA;AAClC,QAAA,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,UAAA,EAAY,UAAU,CAAA;AAAA,MAChD;AAGA,MAAA,IAAI,MAAM,OAAA,EAAS,WAAA,IAAe,MAAM,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AACtE,QAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,WAAA,CAAY,IAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACtE,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,oBAAA,EAAuB,YAAY,CAAA,CAAA,CAAG,CAAA;AACtD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAAA,MAC1C,CAAA,MAAA,IAAW,QAAA,CAAS,oBAAA,CAAqB,MAAA,GAAS,CAAA,EAAG;AAEnD,QAAA,MAAM,YAAA,GAAe,SAAS,oBAAA,CAAqB,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAC1E,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,oBAAA,EAAuB,YAAY,CAAA,CAAA,CAAG,CAAA;AACtD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,QAAA,CAAS,oBAAoB,CAAA;AAAA,MAC9C;AAGA,MAAA,IAAI,MAAM,OAAA,EAAS,MAAA,IAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5D,QAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACjE,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,aAAA,EAAgB,YAAY,CAAA,CAAA,CAAG,CAAA;AAC/C,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,MACrC,CAAA,MAAO;AAEL,QAAA,UAAA,CAAW,KAAK,uBAAuB,CAAA;AAAA,MACzC;AAGA,MAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAA,IAAS,YAAA;AAC/C,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAA,EAAO;AACjC,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAA,EAAK,KAAK,CAAA,KAAA,CAAO,CAAA;AACjC,UAAA,MAAA,CAAO,KAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA;AAAA,QACrD;AACA,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,GAAA,EAAK;AAC/B,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAA,EAAK,KAAK,CAAA,KAAA,CAAO,CAAA;AACjC,UAAA,MAAA,CAAO,KAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AAAA,QACnD;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,QAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,MAClC;AAEA,MAAA,MAAM,WAAA,GAAc,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAGlF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,QAAA,EAG9B,WAAW;AAAA,MAAA,CACd,CAAA;AACD,MAAA,MAAM,cAAc,MAAM,SAAA,CAAU,KAAK,GAAG,MAAM,EAAE,KAAA,EAAyB;AAC7E,MAAA,MAAM,KAAA,GAAQ,aAAa,KAAA,IAAS,CAAA;AAGpC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,QAAA,CAAS,aAAA;AACtC,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,CAAA;AAE/B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAShC,WAAW;AAAA;AAAA;AAAA,MAAA,CAGd,CAAA;AAED,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,WAAA,CAAY,IAAA,CAAK,GAAG,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,GAAA,EAalE;AAEH,MAAA,MAAM,iBAAiC,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QAClE,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,QACjB,KAAA,EAAO,IAAI,KAAA,IAAS,UAAA;AAAA,QACpB,IAAA,EAAM,IAAI,IAAA,IAAQ,EAAA;AAAA,QAClB,aAAA,EAAe,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA;AAAA,QACvC,eAAA,EAAiB,GAAA,CAAI,uBAAA,IAA2B,GAAA,CAAI,eAAA;AAAA,QACpD,SAAS,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,MAAM,KAAK,CAAA;AAAA,QAClD,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,QACjC,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,QACjC,aAAa,GAAA,CAAI;AAAA,OACnB,CAAE,CAAA;AAEF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG/B,MAAA,MAAM,KAAK,SAAA,CAAU,KAAA,CAAM,OAAO,KAAA,CAAM,IAAA,EAAM,cAAc,MAAM,CAAA;AAElE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,aAAA;AAAA,QACT,KAAA;AAAA,QACA,aAAA,EAAe,SAAA;AAAA,QACf,MAAM,KAAA,CAAM;AAAA,OACd;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO;AAAA,QACL,SAAS,EAAC;AAAA,QACV,KAAA,EAAO,CAAA;AAAA,QACP,aAAA,EAAe,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QAC5B,MAAM,KAAA,CAAM;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CAAe,MAAc,KAAA,EAAuB;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC7D,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAM,EAAE,WAAA,EAAY;AAChD,MAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AAErC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACrC,MAAA,IAAI,UAAU,CAAA,CAAA,EAAI;AAEhB,QAAA,OAAO,KAAK,SAAA,CAAU,MAAM,EAAE,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,MACpD;AAGA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,EAAE,CAAA;AACpC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,KAAA,GAAQ,KAAA,CAAM,SAAS,EAAE,CAAA;AAC3D,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IACtC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,OAAA,EAAoC;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,MAAA,IAAI,CAAC,UAAU,oBAAA,EAAsB;AACnC,QAAA,OAAO,EAAC;AAAA,MACV;AAGA,MAAA,IAAI,IAAA,CAAK,SAAA,EAAW,WAAA,EAAY,EAAG;AACjC,QAAA,IAAI;AACF,UAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,SAAS,CAAC,CAAA;AACpE,UAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,YAAA,OAAO,aAAA;AAAA,UACT;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,mDAAmD,KAAK,CAAA;AAAA,QAExE;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAM5B,CAAA;AACD,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA,CAAE,GAAA,EAAuB;AAE3E,MAAA,OAAA,CAAQ,WAAW,EAAC,EAAG,IAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAAA,IAC3C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SAAA,CAAU,KAAA,EAAe,IAAA,EAAwB,YAAA,EAAqC;AAClG,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAG5B,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,KAAK,KAAA,EAAO,IAAA,EAAM,cAAc,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,GAAA,EAAI;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAMH;AACD,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAIjC,CAAA;AACD,MAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AACvD,MAAA,MAAM,cAAc,MAAM,SAAA,CAAU,IAAA,CAAK,aAAa,EAAE,KAAA,EAAyB;AAGjF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAKhC,CAAA;AACD,MAAA,MAAM,EAAE,SAAS,WAAA,EAAY,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA,CAAE,GAAA,EAGjE;AAEH,MAAA,MAAM,OAAA,GAAU,aAAa,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,EAAG,KAAA,IAAS,CAAA;AACpE,MAAA,MAAM,YAAA,GAAe,aAAa,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,EAAG,KAAA,IAAS,CAAA;AAG9E,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAOnC,CAAA;AACD,MAAA,MAAM,EAAE,SAAS,cAAA,EAAe,GAAI,MAAM,WAAA,CAAY,IAAA,CAAK,aAAa,CAAA,CAAE,GAAA,EAGvE;AAEH,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,aAAa,KAAA,IAAS,CAAA;AAAA,QACrC,UAAA,EAAY,OAAA;AAAA,QACZ,eAAA,EAAiB,YAAA;AAAA,QACjB,kBAAkB,cAAA,IAAkB,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAClD,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,OAAO,CAAA,CAAE;AAAA,SACX,CAAE,CAAA;AAAA,QACF,kBAAA,EAAoB;AAAA;AAAA,OACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,CAAA;AAAA,QACf,UAAA,EAAY,CAAA;AAAA,QACZ,eAAA,EAAiB,CAAA;AAAA,QACjB,iBAAiB,EAAC;AAAA,QAClB,kBAAA,EAAoB;AAAA,OACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,SAAA,EAAW,WAAA,EAAY,IAAK,KAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA6C;AAC3C,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AACF,CAAA;;;ACnmBO,IAAM,eAAN,MAAmB;AAAA,EAGxB,WAAA,CACU,EAAA,EACA,EAAA,EACA,SAAA,EACR;AAHQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAGR,IAAA,IAAI,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,SAAA,EAAW;AAC7B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB,EAAA,EAAI,IAAI,SAAS,CAAA;AACvD,MAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AAAA,IACrD;AAAA,EACF;AAAA,EAZQ,SAAA;AAAA;AAAA;AAAA;AAAA,EAiBR,MAAM,gBAAgB,YAAA,EAA4C;AAChE,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,KAAK,EAAA,CAAG,OAAA;AAAA,QAC7B;AAAA,OACF;AACA,MAAA,MAAM,aAAa,MAAM,cAAA,CAAe,IAAA,CAAK,YAAY,EAAE,KAAA,EAIxD;AAEH,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,YAAY,CAAA,UAAA,CAAY,CAAA;AAAA,MACxD;AAGA,MAAA,MAAM,IAAA,CAAK,kBAAkB,YAAA,EAAc;AAAA,QACzC,aAAA,EAAe,YAAA;AAAA,QACf,iBAAiB,UAAA,CAAW,YAAA;AAAA,QAC5B,WAAA,EAAa,CAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,MAAA,EAAQ;AAAA,OACT,CAAA;AAGD,MAAA,IAAI,IAAA,CAAK,SAAA,EAAW,WAAA,EAAY,EAAG;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oDAAA,EAAuD,YAAY,CAAA,CAAE,CAAA;AAEjF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,gBAAgB,YAAY,CAAA;AAEhE,QAAA,MAAM,WAAA,GAA2B;AAAA,UAC/B,aAAA,EAAe,YAAA;AAAA,UACf,iBAAiB,UAAA,CAAW,YAAA;AAAA,UAC5B,aAAa,MAAA,CAAO,WAAA;AAAA,UACpB,eAAe,MAAA,CAAO,cAAA;AAAA,UACtB,YAAA,EAAc,KAAK,GAAA,EAAI;AAAA,UACvB,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,WAAA;AAAA,UACtC,eAAe,MAAA,CAAO,MAAA,GAAS,IAAI,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,uBAAA,CAAA,GAA4B,KAAA;AAAA,SACjF;AAEA,QAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,YAAA,EAAc,WAAW,CAAA;AACtD,QAAA,OAAO,WAAA;AAAA,MACT;AAGA,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+DAAA,EAAkE,YAAY,CAAA,CAAE,CAAA;AAE7F,MAAA,MAAM,cAAA,GAA8B;AAAA,QAClC,aAAA,EAAe,YAAA;AAAA,QACf,iBAAiB,UAAA,CAAW,YAAA;AAAA,QAC5B,WAAA,EAAa,CAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,YAAA,EAAc,KAAK,GAAA,EAAI;AAAA,QACvB,MAAA,EAAQ,WAAA;AAAA,QACR,aAAA,EAAe;AAAA,OACjB;AAEA,MAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,YAAA,EAAc,cAAc,CAAA;AACzD,MAAA,OAAO,cAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yCAAA,EAA4C,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAChF,MAAA,MAAM,WAAA,GAA2B;AAAA,QAC/B,aAAA,EAAe,YAAA;AAAA,QACf,eAAA,EAAiB,SAAA;AAAA,QACjB,WAAA,EAAa,CAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,MAAA,EAAQ,OAAA;AAAA,QACR,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OACtE;AACA,MAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,YAAA,EAAc,WAAW,CAAA;AACtD,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,IAAA,EAYA,YAAA,EACe;AACX,IAAA,IAAI;AAEF,MAAA,IAAI,aAAkB,EAAC;AACvB,MAAA,IAAI;AACF,QAAA,UAAA,GAAa,OAAO,KAAK,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA;AAAA,MAC5E,CAAA,CAAA,MAAQ;AACN,QAAA,UAAA,GAAa,EAAC;AAAA,MAChB;AAGA,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,EAAA,EAAI,CAAA,QAAA,EAAW,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,QACtB,KAAA,EAAO,KAAK,KAAA,IAAS,UAAA;AAAA,QACrB,IAAA,EAAM,KAAK,IAAA,IAAQ,EAAA;AAAA,QACnB,OAAA,EAAS,IAAA,CAAK,qBAAA,CAAsB,UAAU,CAAA;AAAA,QAC9C,QAAA,EAAU;AAAA,UACR,aAAA,EAAe,YAAA;AAAA,UACf,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,yBAAyB,IAAA,CAAK,uBAAA;AAAA,UAC9B,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,WAAW,IAAA,CAAK;AAAA;AAClB,OACF;AAMJ,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAA,CAAK,EAAE,KAAK,KAAK,CAAA;AAC9D,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,IAAA,EAAmB;AAC/C,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,IAAI,KAAK,KAAA,EAAO,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAC7C,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAG3C,IAAA,IAAI,KAAK,WAAA,EAAa,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AACzD,IAAA,IAAI,KAAK,OAAA,EAAS,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AACjD,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAG3C,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAmB;AACzC,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MAChB,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC7B,QAAA,GAAA,CAAI,QAAQ,cAAc,CAAA;AAAA,MAC5B,CAAA,MAAA,IAAW,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACzC,QAAA,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,cAAc,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA;AAEA,IAAA,cAAA,CAAe,IAAI,CAAA;AAEnB,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,YAAA,EAAsB,SAAA,EAAkC;AACxE,IAAA,IAAI;AAEE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAQ5B,CAAA;AACD,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,KAAK,SAAA,EAAW,YAAY,EAAE,KAAA,EAWnD;AAEP,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,SAAS,CAAA,UAAA,CAAY,CAAA;AAAA,MACvD;AAGA,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,MAAA,CAAO,YAAY,CAAC,CAAA;AAGtD,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,YAAY,CAAC,CAAA;AAC7D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,YAAY,CAAA,EAAG;AAAA,UACjD,GAAG,MAAA;AAAA,UACH,YAAA,EAAc,KAAK,GAAA;AAAI,SACxB,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iCAAA,EAAoC,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACrE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CAAgB,YAAA,EAAsB,SAAA,EAAkC;AAC5E,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,SAAA,EAAW,WAAA,EAAY,EAAG;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAmC,SAAS,CAAA,WAAA,CAAa,CAAA;AACrE,QAAA,MAAM,IAAA,CAAK,SAAA,CAAU,sBAAA,CAAuB,SAAS,CAAA;AAAA,MACvD,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,8DAAA,EAAiE,SAAS,CAAA,CAAE,CAAA;AAAA,MAC3F;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,SAAS,CAAA,YAAA,CAAA,EAAgB,KAAK,CAAA;AACrF,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKI,MAAM,eAAe,YAAA,EAAmD;AAC1E,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CAAG,OAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,YAAY,EAAE,KAAA,EAS1C;AAEH,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA;AAAA,QAC1C,iBAAiB,MAAA,CAAO,eAAA;AAAA,QACxB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,eAAe,MAAA,CAAO;AAAA,OACxB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0CAAA,EAA6C,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACjF,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKI,MAAM,iBAAA,GAA0D;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,oCAAoC,CAAA;AACjE,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAK,GAAA,EAS5B;AAEC,MAAA,MAAM,YAAyC,EAAC;AAEhD,MAAA,KAAA,MAAW,GAAA,IAAO,OAAA,IAAW,EAAC,EAAG;AAC/B,QAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA;AAC7C,QAAA,SAAA,CAAU,YAAY,CAAA,GAAI;AAAA,UACxB,aAAA,EAAe,YAAA;AAAA,UACnB,iBAAiB,GAAA,CAAI,eAAA;AAAA,UACrB,aAAa,GAAA,CAAI,WAAA;AAAA,UACjB,eAAe,GAAA,CAAI,aAAA;AAAA,UACnB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,eAAe,GAAA,CAAI;AAAA,SACrB;AAAA,MACF;AAEA,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKI,MAAc,iBAAA,CAAkB,YAAA,EAAsB,MAAA,EAAoC;AACxF,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,KAAK,EAAA,CAAG,OAAA;AAAA,QACxB;AAAA,OACF;AACA,MAAA,MAAM,WAAW,MAAM,SAAA,CAAU,IAAA,CAAK,YAAY,EAAE,KAAA,EAAsB;AAE1E,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAS5B,CAAA;AACD,QAAA,MAAM,IAAA,CACH,IAAA;AAAA,UACC,MAAA,CAAO,eAAA;AAAA,UACP,MAAA,CAAO,WAAA;AAAA,UACP,MAAA,CAAO,aAAA;AAAA,UACP,OAAO,YAAA,IAAgB,IAAA;AAAA,UACvB,MAAA,CAAO,MAAA;AAAA,UACP,OAAO,aAAA,IAAiB,IAAA;AAAA,UACxB,OAAO,YAAY;AAAA,UAEpB,GAAA,EAAI;AAAA,MACT,CAAA,MAAO;AAEL,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAK5B,CAAA;AACD,QAAA,MAAM,IAAA,CACH,IAAA;AAAA,UACC,MAAA,CAAO,OAAO,aAAa,CAAA;AAAA,UAC3B,MAAA,CAAO,eAAA;AAAA,UACP,MAAA,CAAO,WAAA;AAAA,UACP,MAAA,CAAO,aAAA;AAAA,UACP,OAAO,YAAA,IAAgB,IAAA;AAAA,UACvB,MAAA,CAAO,MAAA;AAAA,UACP,OAAO,aAAA,IAAiB;AAAA,UAEzB,GAAA,EAAI;AAAA,MACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2CAAA,EAA8C,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAClF,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,mBAAA,EAA8C;AAC9D,IAAA,KAAA,MAAW,gBAAgB,mBAAA,EAAqB;AAC9C,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,gBAAgB,YAAY,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yBAAA,EAA4B,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;ACxXO,SAAS,mBAAmB,IAAA,EAAgC;AACjE,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY;AAAA,IAChC,OAAA,EAAS,KAAA;AAAA,IACT,eAAA,EAAiB,IAAA;AAAA,IACjB,sBAAsB,EAAC;AAAA,IACvB,uBAAuB,EAAC;AAAA,IACxB,oBAAA,EAAsB,IAAA;AAAA,IACtB,cAAA,EAAgB,CAAA;AAAA,IAChB,aAAA,EAAe,EAAA;AAAA,IACf,WAAA,EAAa;AAAA,GACf;AAGA,EAAA,MAAM,mBAAA,GAAsB,MAAM,OAAA,CAAQ,QAAA,CAAS,oBAAoB,CAAA,GAAI,QAAA,CAAS,uBAAuB,EAAC;AAC5G,EAAA,MAAM,oBAAA,GAAuB,MAAM,OAAA,CAAQ,QAAA,CAAS,qBAAqB,CAAA,GAAI,QAAA,CAAS,wBAAwB,EAAC;AAE/G,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,KAAY,IAAA;AACrC,EAAA,MAAM,aAAA,GAAgB,SAAS,eAAA,KAAoB,KAAA;AACnD,EAAA,MAAM,mBAAA,GAAsB,SAAS,oBAAA,KAAyB,KAAA;AAC9D,EAAA,MAAM,UAAA,GAAa,SAAS,WAAA,KAAgB,IAAA;AAE5C,EAAA,MAAM,qBAAA,GAAwB,IAAI,GAAA,CAAI,mBAAA,CAAoB,IAAI,CAAA,EAAA,KAAM,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AAC/E,EAAA,MAAM,sBAAA,GAAyB,IAAI,GAAA,CAAI,oBAAA,CAAqB,IAAI,CAAA,EAAA,KAAM,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AAGjF,EAAA,MAAMA,YAAAA,GAAc,MAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA,CAAK,cAAc,EAAC;AAG1E,EAAA,OAAA,CAAQ,GAAA,CAAI,+CAAA,EAAiDA,YAAAA,CAAY,MAAM,CAAA;AAC/E,EAAA,IAAIA,YAAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAI,2CAAA,EAA6CA,YAAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EACzE;AAEA,EAAA,MAAMD,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uEAAA,EA6BuD,OAAA,GAAU,YAAY,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,uFAAA,EAQR,aAAA,GAAgB,YAAY,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EA4BvGC,aAAY,MAAA,KAAW,CAAA,GAC/B,oHACAA,YAAAA,CAAY,GAAA,CAAI,CAAC,UAAA,KAAe;AAChC,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,GAAA,CAAI,YAAY,CAAA;AACxD,IAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,GAAA,CAAI,YAAY,CAAA;AAC3D,IAAA,MAAM,cAAA,GAAsC,IAAA,CAAK,WAAA,IAAe,EAAC;AACjE,IAAA,MAAM,MAAA,GAAS,eAAe,YAAY,CAAA;AAE1C,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAA,KAAW,IAAA,IAAQ,CAAC,eAAe,CAAC,MAAA;AAE7D,IAAA,MAAMC,YAAAA,GAAe,UAAU,SAAA,GAC3B,CAAA,iDAAA,EAAoD,OAAO,MAAA,KAAW,WAAA,GACpE,yEACA,MAAA,CAAO,MAAA,KAAW,aAChB,kEAAA,GACA,MAAA,CAAO,WAAW,OAAA,GAChB,8DAAA,GACA,+DACR,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,OAAA,CAAA,GAChB,EAAA;AAEJ,IAAA,OAAO,CAAA,8FAAA,EAAiG,KAAA,GAAQ,qEAAA,GAAwE,yCAAyC,CAAA;AAAA;AAAA;AAAA,uCAAA,EAGhM,YAAY,CAAA;AAAA;AAAA,+BAAA,EAEpB,YAAY,CAAA;AAAA,wBAAA,EACnB,SAAA,GAAY,YAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,+CAAA,EAKH,YAAY,CAAA;AAAA,0BAAA,EACjC,UAAA,CAAW,YAAA,IAAgB,UAAA,CAAW,IAAA,IAAQ,oBAAoB;AAAA,0BAAA,EAClE,KAAA,GAAQ,oIAAoI,EAAE;AAAA,0BAAA,EAC9IA,YAAW;AAAA;AAAA;AAAA,0BAAA,EAGX,UAAA,CAAW,eAAe,UAAA,CAAW,IAAA,IAAQ,gBAAgB,CAAA,QAAA,EAAM,UAAA,CAAW,cAAc,CAAC,CAAA;AAAA,0BAAA,EAC7F,MAAA,GAAS,WAAM,MAAA,CAAO,aAAa,IAAI,MAAA,CAAO,WAAW,aAAa,EAAE;AAAA;AAAA,wBAAA,EAE1E,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,UAAA,GACxC,CAAA;AAAA,sFAAA,EAC2E,MAAA,CAAO,aAAA,GAAgB,MAAA,CAAO,WAAA,GAAe,GAAG,CAAA;AAAA,kCAAA,CAAA,GAE3H,EAAE;AAAA;AAAA,sBAAA,EAEQ,SAAA,GAAY;AAAA;AAAA;AAAA,sDAAA,EAGoB,YAAY,CAAA;AAAA;AAAA,0BAAA,EAExC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,UAAA,GAAa,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,CAAA,GAO1D,EAAE;AAAA,0BAAA,CAAA;AAAA,EAEtB,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iGAAA,EAWkF,mBAAA,GAAsB,YAAY,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,+EAAA,EAQtD,UAAA,GAAa,YAAY,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,0FAAA,EAShB,QAAA,CAAS,kBAAkB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,wFAAA,EAI9B,QAAA,CAAS,iBAAiB,EAAE,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAwBrC,IAAA,CAAK,UAAU,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA,kFAAA,EAIzB,IAAA,CAAK,UAAU,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,sFAAA,EAIrB,IAAA,CAAK,UAAU,eAAe,CAAA;AAAA;AAAA;AAAA,QAAA,EAG5G,IAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,MAAA,GAAS,CAAA,GAC1C;AAAA;AAAA;AAAA;AAAA,kBAAA,EAIY,IAAA,CAAK,UAAU,eAAA,CAAgB,GAAA;AAAA,IAC3C,CAAC,IAAA,KAAS;AAAA;AAAA,wEAAA,EAEwD,KAAK,KAAK,CAAA;AAAA,uEAAA,EACX,KAAK,KAAK,CAAA;AAAA;AAAA,oBAAA;AAAA,GAG7E,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA,YAAA,CAAA,GAIR,gFAAgF;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AA2HtF,EAAA,OAAOC,mCAAA,CAAkB;AAAA,IACvB,KAAA,EAAO,oBAAA;AAAA,IACP,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,mCAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,OAAA,EAASH;AAAA,GACV,CAAA;AACH;;;AChYA,IAAM,WAAA,GAAc,IAAId,SAAAA,EAAmD;AAG3E,WAAA,CAAY,GAAA,CAAI,GAAA,EAAKC,6BAAA,EAAa,CAAA;AAMlC,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAChC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AAEjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,EAAA,EAAI,IAAI,SAAS,CAAA;AAGlD,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,WAAA,EAAY;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,6CAAA,EAA+C,CAAC,CAAC,QAAQ,CAAA;AAGrE,IAAA,MAAMc,YAAAA,GAAc,MAAM,OAAA,CAAQ,iBAAA,EAAkB;AACpD,IAAA,OAAA,CAAQ,GAAA,CAAI,kDAAA,EAAoDA,YAAAA,CAAY,MAAM,CAAA;AAGlF,IAAA,IAAIA,YAAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,cAAc,MAAM,EAAA,CAAG,OAAA,CAAQ,oEAAoE,EAAE,GAAA,EAAI;AAC/G,MAAA,OAAA,CAAQ,IAAI,mDAAA,EAAqD,WAAA,CAAY,OAAA,EAAS,MAAA,IAAU,GAAG,aAAa,CAAA;AAChH,MAAA,IAAI,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA,EAAG;AACzD,QAAA,OAAA,CAAQ,GAAA,CAAI,4CAAA,EAA8C,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAClF;AAAA,IACF,WAAWA,YAAAA,CAAY,MAAA,GAAS,CAAA,IAAKA,YAAAA,CAAY,CAAC,CAAA,EAAG;AACnD,MAAA,OAAA,CAAQ,IAAI,8CAAA,EAAgD;AAAA,QAC1D,EAAA,EAAIA,YAAAA,CAAY,CAAC,CAAA,CAAE,EAAA;AAAA,QACnB,IAAA,EAAMA,YAAAA,CAAY,CAAC,CAAA,CAAE,IAAA;AAAA,QACrB,YAAA,EAAcA,YAAAA,CAAY,CAAC,CAAA,CAAE;AAAA,OAC9B,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,oBAAA,EAAqB;AAC1D,IAAA,OAAA,CAAQ,GAAA,CAAI,6BAAA,EAA+B,cAAA,CAAe,MAAM,CAAA;AAGhE,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,iBAAA,EAAkB;AACpD,IAAA,OAAA,CAAQ,IAAI,0BAAA,EAA4B,MAAA,CAAO,IAAA,CAAK,WAAW,EAAE,MAAM,CAAA;AAGvE,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,kBAAA,EAAmB;AAEnD,IAAA,OAAO,CAAA,CAAE,IAAA;AAAA,MACP,kBAAA,CAAmB;AAAA,QACjB,QAAA;AAAA,QACA,WAAA,EAAaA,gBAAe,EAAC;AAAA,QAC7B,cAAA,EAAgB,kBAAkB,EAAC;AAAA,QACnC,WAAA,EAAa,eAAe,EAAC;AAAA,QAC7B,SAAA;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,MAAM,IAAA,CAAK,KAAA;AAAA,UACX,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK;AAAA;AACb,OACD;AAAA,KACH;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAC1D,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,CAAA,2BAAA,EAA8B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,IAAA,CAAA,EAAQ,GAAG,CAAA;AAAA,EAC/G;AACF,CAAC,CAAA;AAMD,WAAA,CAAY,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA,KAAM;AACjC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,EAAA,EAAI,IAAI,SAAS,CAAA;AAElD,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,OAAA,CAAQ,IAAI,iCAAA,EAAmC,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAG5E,IAAA,MAAM,eAAA,GAAkB,MAAM,OAAA,CAAQ,WAAA,EAAY;AAClD,IAAA,OAAA,CAAQ,GAAA,CAAI,yDAAA,EAA2D,eAAA,EAAiB,oBAAoB,CAAA;AAG5G,IAAA,MAAM,eAAA,GAA6C;AAAA,MACjD,OAAA,EAAS,KAAK,OAAA,KAAY,KAAA,CAAA,GAAY,QAAQ,IAAA,CAAK,OAAO,IAAI,eAAA,EAAiB,OAAA;AAAA,MAC/E,eAAA,EAAiB,KAAK,eAAA,KAAoB,KAAA,CAAA,GAAY,QAAQ,IAAA,CAAK,eAAe,IAAI,eAAA,EAAiB,eAAA;AAAA,MACvG,oBAAA,EAAsB,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,oBAAoB,CAAA,GAAI,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,MAAM,CAAA,GAAK,eAAA,EAAiB,wBAAwB,EAAC;AAAA,MACpJ,qBAAA,EAAuB,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,qBAAqB,CAAA,GAAI,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,MAAM,CAAA,GAAK,eAAA,EAAiB,yBAAyB,EAAC;AAAA,MACxJ,oBAAA,EAAsB,KAAK,oBAAA,KAAyB,KAAA,CAAA,GAAY,QAAQ,IAAA,CAAK,oBAAoB,IAAI,eAAA,EAAiB,oBAAA;AAAA,MACtH,gBAAgB,IAAA,CAAK,cAAA,GAAiB,OAAO,IAAA,CAAK,cAAc,IAAI,eAAA,EAAiB,cAAA;AAAA,MACrF,eAAe,IAAA,CAAK,aAAA,GAAgB,OAAO,IAAA,CAAK,aAAa,IAAI,eAAA,EAAiB,aAAA;AAAA,MAClF,WAAA,EAAa,KAAK,WAAA,KAAgB,KAAA,CAAA,GAAY,QAAQ,IAAA,CAAK,WAAW,IAAI,eAAA,EAAiB;AAAA,KAC7F;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,yDAAA,EAA2D,eAAA,CAAgB,oBAAoB,CAAA;AAG3G,IAAA,MAAM,kBAAA,GACJ,IAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,oBAAoB,CAAA,KACnD,IAAA,CAAK,SAAA,CAAU,eAAA,EAAiB,oBAAA,IAAwB,EAAE,CAAA;AAE5D,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,cAAA,CAAe,eAAe,CAAA;AAC1D,IAAA,OAAA,CAAQ,GAAA,CAAI,wDAAA,EAA0D,KAAA,CAAM,oBAAoB,CAAA;AAGhG,IAAA,IAAI,kBAAA,IAAsB,gBAAgB,oBAAA,EAAsB;AAC9D,MAAA,OAAA,CAAQ,IAAI,oEAAoE,CAAA;AAEhF,MAAA,CAAA,CAAE,YAAA,CAAa,SAAA;AAAA,QACb,QACG,OAAA,CAAQ,eAAA,CAAgB,oBAAoB,CAAA,CAC5C,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA,CAAI,gDAAgD,CAAC,CAAA,CACxE,MAAM,CAAC,KAAA,KAAU,QAAQ,KAAA,CAAM,6CAAA,EAA+C,KAAK,CAAC;AAAA,OACzF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAAA,EAClD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,2BAAA,IAA+B,GAAG,CAAA;AAAA,EAC3D;AACF,CAAC,CAAA;AAMD,WAAA,CAAY,GAAA,CAAI,eAAA,EAAiB,OAAO,CAAA,KAAM;AAC5C,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AAErD,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,WAAA,EAAY;AAC3C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,UAAU,CAAA;AAAA,EACjD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,0BAAA,IAA8B,GAAG,CAAA;AAAA,EAC1D;AACF,CAAC,CAAA;AAMD,WAAA,CAAY,GAAA,CAAI,sBAAA,EAAwB,OAAO,CAAA,KAAM;AACnD,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AAErD,IAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,oBAAA,EAAqB;AACzD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,eAAe,CAAA;AAAA,EACtD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kCAAA,IAAsC,GAAG,CAAA;AAAA,EAClE;AACF,CAAC,CAAA;AAMD,WAAA,CAAY,GAAA,CAAI,aAAA,EAAe,OAAO,CAAA,KAAM;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,EAAA,EAAI,IAAI,SAAS,CAAA;AAElD,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,iBAAA,EAAkB;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC/C,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,wBAAA,IAA4B,GAAG,CAAA;AAAA,EACxD;AACF,CAAC,CAAA;AAMD,WAAA,CAAY,IAAA,CAAK,cAAA,EAAgB,OAAO,CAAA,KAAM;AAC5C,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,EAAA,EAAI,IAAI,SAAS,CAAA;AAEhD,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,kBAA2B,IAAA,CAAK,aAAA;AACtC,IAAA,MAAM,YAAA,GAAe,eAAA,GAAkB,MAAA,CAAO,eAAe,CAAA,GAAI,EAAA;AAEjE,IAAA,IAAI,CAAC,YAAA,IAAgB,YAAA,KAAiB,WAAA,IAAe,iBAAiB,MAAA,EAAQ;AAC5E,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,2BAAA,IAA+B,GAAG,CAAA;AAAA,IAC3D;AAGA,IAAA,CAAA,CAAE,YAAA,CAAa,SAAA;AAAA,MACb,OAAA,CACG,gBAAgB,YAAY,CAAA,CAC5B,KAAK,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,6CAAA,EAAgD,YAAY,CAAA,CAAE,CAAC,CAAA,CACtF,KAAA,CAAM,CAAC,KAAA,KAAU,OAAA,CAAQ,MAAM,CAAA,yCAAA,EAA4C,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAC;AAAA,KACvG;AAEF,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,uBAAuB,CAAA;AAAA,EACjE,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,6BAAA,IAAiC,GAAG,CAAA;AAAA,EAC7D;AACF,CAAC,CAAA;AAED,IAAO,aAAA,GAAQ,WAAA;ACnOf,IAAM,SAAA,GAAY,IAAIf,SAAAA,EAAmD;AAMzE,SAAA,CAAU,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA,KAAM;AAC/B,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AAErD,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAE9B,IAAA,MAAM,KAAA,GAAqB;AAAA,MACzB,KAAA,EAAO,KAAK,KAAA,IAAS,EAAA;AAAA,MACrB,IAAA,EAAM,KAAK,IAAA,IAAQ,SAAA;AAAA,MACnB,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,MAC1B,OAAO,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA,CAAA;AAAA,MACzC,QAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAAI,KAAA;AAAA,KAC9C;AAGA,IAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,MAAA,IAAI,OAAO,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,UAAU,QAAA,EAAU;AACrD,QAAA,KAAA,CAAM,OAAA,CAAQ,UAAU,KAAA,GAAQ,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,MACxE;AACA,MAAA,IAAI,OAAO,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,QAAQ,QAAA,EAAU;AACnD,QAAA,KAAA,CAAM,OAAA,CAAQ,UAAU,GAAA,GAAM,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,UAAU,GAAG,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAE1C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,KAAK,CAAA;AACpC,IAAA,OAAO,CAAA,CAAE,IAAA;AAAA,MACP;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,eAAA;AAAA,QACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAChE;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAC,CAAA;AAMD,SAAA,CAAU,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA,KAAM;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AAErD,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,IAAK,EAAA;AAElC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,OAAO,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,MAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,oBAAA,CAAqB,KAAK,CAAA;AAE5D,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,IAAA,OAAO,CAAA,CAAE,IAAA;AAAA,MACP;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAC,CAAA;AAMD,SAAA,CAAU,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAM;AACvC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AAErD,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,kBAAA,EAAmB;AAEnD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oBAAoB,KAAK,CAAA;AACvC,IAAA,OAAO,CAAA,CAAE,IAAA;AAAA,MACP;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAOkB,YAAAA,GAAQ,SAAA;;;ACjIf,IAAA,gBAAA,GAAA;AAAA,EAEE,IAAA,EAAQ,WAAA;AAAA,EACR,WAAA,EAAe,sIAAA;AAAA,EACf,OAAA,EAAW,OAAA;AAAA,EACX,MAAA,EAAU,SAoFZ,CAAA;;;ACxDO,IAAM,cAAA,GAAiB,IAAIhB,+BAAA,CAAc;AAAA,EAC9C,MAAM,gBAAA,CAAS,IAAA;AAAA,EACf,SAAS,gBAAA,CAAS,OAAA;AAAA,EAClB,aAAa,gBAAA,CAAS,WAAA;AAAA,EACtB,MAAA,EAAQ,EAAE,IAAA,EAAM,gBAAA,CAAS,MAAA;AAC3B,CAAC,EACE,QAAA,CAAS;AAAA,EACR,aAAa,gBAAA,CAAS,WAAA;AAAA,EACtB,MAAA,EAAQ,EAAE,IAAA,EAAM,gBAAA,CAAS,MAAA;AAC3B,CAAC,EACA,UAAA,CAAW,UAAA,EAAY,eAAe,CAAA,CACtC,WAAW,cAAA,EAAgB,YAAY,CAAA,CACvC,QAAA,CAAS,4BAA4B,aAAkB,CAAA,CACvD,SAAS,aAAA,EAAegB,YAAgB,EACxC,KAAA,EAAM;AClCT,IAAM,sBAAA,GAAyBd,MAAE,MAAA,CAAO;AAAA,EACtC,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAM,yBAAyB;AACnD,CAAC,CAAA;AAEM,SAAS,yBAAA,GAAoC;AAClD,EAAA,MAAM,eAAA,GAAkB,IAAIJ,SAAAA,EAAK;AAGjC,EAAA,eAAA,CAAgB,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,KAAW;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,SAAA,CAAU,IAAI,CAAA;AAExD,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,mBAAA;AAAA,UACP,OAAA,EAAS,WAAW,KAAA,CAAM;AAAA,WACzB,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,UAAA,CAAW,IAAA;AAC7B,MAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAC1C,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAK,KAAK,EAAA,GAAK,GAAA;AAC3C,MAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAIpC,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,UAAU,EAAE,KAAA,EAAM;AAE3C,MAAA,MAAM,gBAAA,GAAmB,CAAA;AACzB,MAAA,IAAI,WAAA,IAAe,WAAA,CAAY,KAAA,IAAS,gBAAA,EAAkB;AACxD,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAI7B,CAAA,CAAE,IAAA,CAAK,eAAe,CAAA,CAAE,KAAA,EAAM;AAE/B,MAAA,MAAM,aAAA,GAAgB,KAAA;AAEtB,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,aAAA,EAAe;AAE3B,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,IAAA,IAAQ,CAAC,IAAA,CAAK,SAAA,EAAW;AAC3B,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,QAAQ,MAAA,CAAO,UAAA,EAAW,GAAI,GAAA,GAAM,OAAO,UAAA,EAAW;AAC5D,MAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,MAAA,MAAM,iBAAA,GAAoB,EAAA;AAC1B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAK,oBAAoB,EAAA,GAAK,GAAA;AAGzD,MAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAIhB,CAAA,CAAE,IAAA;AAAA,QACD,OAAA;AAAA,QACA,eAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAK,GAAA,EAAI;AAAA,QACT,CAAA,CAAE,IAAI,MAAA,CAAO,kBAAkB,KAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA,IAAK,SAAA;AAAA,QACvE,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,IAAK;AAAA,QAC9B,GAAA,EAAI;AAGN,MAAA,MAAM,UAAU,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,MAAA;AACnC,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,8BAAA,EAAiC,KAAK,CAAA,CAAA;AAGlE,MAAA,IAAI;AACF,QAAA,MAAMM,YAAAA,GAAc,CAAA,CAAE,GAAA,CAAI,OAAA,EAAS,IAAI,OAAO,CAAA;AAC9C,QAAA,IAAIA,YAAAA,IAAeA,aAAY,SAAA,EAAW;AACxC,UAAA,MAAMA,aAAY,SAAA,CAAU;AAAA,YAC1B,EAAA,EAAI,eAAA;AAAA,YACJ,OAAA,EAAS,4BAAA;AAAA,YACT,IAAA,EAAM,oBAAA,CAAqB,SAAA,EAAW,iBAAiB;AAAA,WACxD,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,MAAM,4BAA4B,CAAA;AAE1C,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,eAAe,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,QAC/D;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,6EAAA;AAAA;AAAA,QAET,GAAI,CAAA,CAAE,GAAA,CAAI,gBAAgB,aAAA,IAAiB,EAAE,UAAU,SAAA;AAAU,OAClE,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,2BAAA,IAA+B,GAAG,CAAA;AAAA,IAC3D;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAW;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAEjC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,CAAA,CAAE,SAAS,sCAAsC,CAAA;AAAA,MAC1D;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,MAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAGlC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,CAAE,KAAA,EAAM;AAErB,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO,CAAA,CAAE,SAAS,iDAAiD,CAAA;AAAA,MACrE;AAGA,MAAA,IAAI,SAAA,CAAU,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,EAAG;AACrC,QAAA,OAAO,CAAA,CAAE,SAAS,+CAA+C,CAAA;AAAA,MACnE;AAGA,MAAA,IAAI,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,MAAA,CAE3B,CAAA,CAAE,IAAA,CAAK,SAAA,CAAU,UAAU,EAAE,KAAA,EAAM;AAEpC,MAAA,MAAM,aAAA,GAAgB,KAAA;AAEtB,MAAA,IAAI,CAAC,QAAQ,aAAA,EAAe;AAE1B,QAAA,MAAM,MAAA,GAAS,OAAO,UAAA,EAAW;AACjC,QAAA,MAAM,WAAW,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAClD,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,QAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAKhB,CAAA,CAAE,IAAA;AAAA,UACD,MAAA;AAAA,UACA,SAAA,CAAU,UAAA;AAAA,UACV,QAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAA;AAAA,UACA,GAAA;AAAA,UACA;AAAA,UACA,GAAA,EAAI;AAEN,QAAA,IAAA,GAAO;AAAA,UACL,EAAA,EAAI,MAAA;AAAA,UACJ,OAAO,SAAA,CAAU,UAAA;AAAA,UACjB,QAAA;AAAA,UACA,IAAA,EAAM;AAAA,SACR;AAAA,MACF,CAAA,MAAA,IAAW,CAAC,IAAA,EAAM;AAChB,QAAA,OAAO,CAAA,CAAE,SAAS,mDAAmD,CAAA;AAAA,MACvE;AAGA,MAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAIhB,CAAA,CAAE,KAAK,IAAA,CAAK,GAAA,IAAO,SAAA,CAAU,EAAE,EAAE,GAAA,EAAI;AAGtC,MAAA,MAAM,WAAW,MAAMC,2CAAA,CAA2B,EAAE,GAAA,CAAY,EAAA,EAAI,EAAE,GAAU,CAAA;AAChF,MAAA,MAAM,QAAA,GAAW,MAAMC,6BAAA,CAAY,aAAA;AAAA,QACjC,IAAA,CAAK,EAAA;AAAA,QACL,IAAA,CAAK,KAAA;AAAA,QACL,IAAA,CAAK,IAAA;AAAA,QACJ,EAAE,GAAA,CAAY,UAAA;AAAA,QACf;AAAA,OACF;AAGA,MAAAA,6BAAA,CAAY,cAAc,CAAA,EAAG,QAAA,EAAU,EAAE,MAAA,EAAQ,UAAU,CAAA;AAG3D,MAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA,MAAA,CAEhB,CAAA,CAAE,KAAK,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,EAAE,EAAE,GAAA,EAAI;AAGjC,MAAA,OAAO,CAAA,CAAE,SAAS,iDAAiD,CAAA;AAAA,IACrE,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,MAAA,OAAO,CAAA,CAAE,SAAS,yCAAyC,CAAA;AAAA,IAC7D;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,WAAA,EAAa,mDAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,YAAA,EAAc,CAAC,OAAO,CAAA;AAAA,IAEtB,QAAQ,CAAC;AAAA,MACP,IAAA,EAAM,kBAAA;AAAA,MACN,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,qCAAA;AAAA,MACb,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,IAED,MAAM,QAAQ,OAAA,EAAwB;AACpC,MAAA,OAAA,CAAQ,IAAI,sCAAsC,CAAA;AAAA,IAEpD,CAAA;AAAA,IAEA,MAAM,SAAS,OAAA,EAAwB;AACrC,MAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AACjD,MAAA,OAAA,CAAQ,IAAI,oDAAoD,CAAA;AAAA,IAClE,CAAA;AAAA,IAEA,MAAM,WAAW,OAAA,EAAwB;AACvC,MAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AAAA,IACrD,CAAA;AAAA,IAEA,MAAM,UAAU,OAAA,EAAwB;AACtC,MAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AAAA,IAGtD;AAAA,GACF;AACF;AAKA,SAAS,oBAAA,CAAqB,WAAmB,aAAA,EAA+B;AAC9E,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,qBAAA,EAkFc,SAAS,CAAA;AAAA;;AAAA,wDAAA,EAGqB,aAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAgBlE;AAEe,yBAAA;;;AC5QR,IAAMW,iBAAAA,GAA0C;AAAA,EACrD,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,EAAA;AAAA,IACZ,SAAA,EAAW,GAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,sBAAA,EAAwB,EAAA;AAAA,IACxB,yBAAA,EAA2B,CAAA;AAAA,IAC3B,aAAA,EAAe,EAAA;AAAA,IACf,sBAAA,EAAwB,EAAA;AAAA,IACxB,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,mBAAA,EAAqB,IAAA;AAAA,IACrB,UAAA,EAAY,IAAA;AAAA,IACZ,gBAAA,EAAkB,IAAA;AAAA,IAClB,iBAAA,EAAmB,IAAA;AAAA,IACnB,mBAAA,EAAqB;AAAA;AAEzB,CAAA;;;ACnHO,IAAM,uBAAN,MAA2B;AAAA,EAChC,WAAA,CACU,EAAA,EACA,QAAA,GAAkCA,iBAAAA,EAC1C;AAFQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EACP;AAAA,EAEH,MAAM,SAAS,KAAA,EAA6C;AAC1D,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAGrB,CAAA,CAAE,IAAA;AAAA,MACD,EAAA;AAAA,MACA,KAAA,CAAM,SAAA;AAAA,MACN,MAAM,QAAA,IAAY,MAAA;AAAA,MAClB,MAAM,MAAA,IAAU,IAAA;AAAA,MAChB,MAAM,KAAA,IAAS,IAAA;AAAA,MACf,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,MAAM,WAAA,IAAe,IAAA;AAAA,MACrB,MAAM,WAAA,IAAe,IAAA;AAAA,MACrB,MAAM,aAAA,IAAiB,IAAA;AAAA,MACvB,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,GAAI,IAAA;AAAA,MAChD,MAAM,WAAA,IAAe,IAAA;AAAA,MACrB,KAAA,CAAM,UAAU,CAAA,GAAI,CAAA;AAAA,MACpB;AAAA,MACA,GAAA,EAAI;AAEN,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAA,CAAU,OAAA,GAAgC,EAAC,EAAwD;AACvG,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpC,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,eAAA,EAAkB,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC/E,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,OAAA,CAAQ,SAAS,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAChC,QAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACnC,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,aAAA,EAAgB,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC5E,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAC9B,QAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,UAAA,CAAW,KAAK,mBAAmB,CAAA;AACnC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IACtC;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,UAAA,CAAW,KAAK,uDAAuD,CAAA;AACvE,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,EAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,EAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACjF;AAEA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,MAAA,UAAA,CAAW,KAAK,aAAa,CAAA;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,GAAU,CAAA,GAAI,CAAC,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAC5E,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,YAAA;AACjC,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,MAAA;AACvC,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,IAAA,MAAM,MAAA,GAAA,CAAU,OAAO,CAAA,IAAK,KAAA;AAG5B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAChC,iDAAiD,KAAK,CAAA;AAAA,KACxD,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,KAAA,EAAyB;AAC3C,IAAA,MAAM,KAAA,GAAQ,aAAa,KAAA,IAAS,CAAA;AAGpC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC5B,CAAA,8BAAA,EAAiC,KAAK,CAAA,UAAA,EAAa,MAAM,IAAI,SAAS,CAAA,iBAAA;AAAA,MACtE,IAAA,CAAK,GAAG,QAAQ,KAAA,EAAO,MAAM,EAAE,GAAA,EAAI;AAErC,IAAA,MAAM,UAA2B,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACzE,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,eAAe,GAAA,CAAI,cAAA;AAAA,MACnB,SAAS,GAAA,CAAI,OAAA,GAAU,KAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AAAA,MACjD,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,OAAA,EAAS,CAAC,CAAC,GAAA,CAAI,OAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EACzB;AAAA,EAEA,MAAM,SAAS,EAAA,EAA2C;AACxD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACxB;AAAA,KACF,CAAE,IAAA,CAAK,EAAE,CAAA,CAAE,KAAA,EAAW;AAEtB,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,eAAe,GAAA,CAAI,cAAA;AAAA,MACnB,SAAS,GAAA,CAAI,OAAA,GAAU,KAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AAAA,MACjD,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,OAAA,EAAS,CAAC,CAAC,GAAA,CAAI,OAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAAmC;AACvC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,GAAA,GAAM,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AACjC,IAAA,MAAM,GAAA,GAAM,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAGjC,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAChC;AAAA,MACA,KAAA,EAAyB;AAG3B,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACpC;AAAA,KACF,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA,EAAyB;AAGrC,IAAA,MAAM,oBAAA,GAAuB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACzC;AAAA,KACF,CAAE,IAAA,CAAK,GAAA,EAAK,GAAG,EAAE,KAAA,EAAyB;AAE1C,IAAA,MAAM,SAAA,GAAY,iBAAiB,KAAA,IAAS,CAAA;AAC5C,IAAA,MAAM,cAAA,GAAiB,sBAAsB,KAAA,IAAS,CAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,cAAA,GAAiB,CAAA,GAC3B,IAAA,CAAK,KAAA,CAAA,CAAQ,SAAA,GAAY,cAAA,IAAkB,cAAA,GAAkB,GAAG,CAAA,GAC/D,SAAA,GAAY,CAAA,GAAI,GAAA,GAAM,CAAA;AAG3B,IAAA,MAAM,gBAAgB,GAAA,GAAO,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,yBAAyB,EAAA,GAAK,GAAA;AACpF,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACnC;AAAA,KACF,CAAE,IAAA,CAAK,aAAa,CAAA,CAAE,KAAA,EAAyB;AAG/C,IAAA,MAAM,cAAc,GAAA,GAAO,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,gBAAgB,EAAA,GAAK,GAAA;AACzE,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAClC,CAAA;AAAA;AAAA;AAAA;AAAA,OAAA;AAAA,KAKF,CAAE,KAAK,WAAA,EAAa,IAAA,CAAK,SAAS,UAAA,CAAW,sBAAsB,EAAE,KAAA,EAAyB;AAG9F,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAChC;AAAA,KACF,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,GAAA,EAAI;AAEhB,IAAA,MAAM,eAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,GAAA,IAAQ,WAAA,CAAY,OAAA,IAAW,EAAC,EAAa;AACtD,MAAA,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA,GAAI,GAAA,CAAI,KAAA;AAAA,IACrC;AAGA,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACpC;AAAA,KACF,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,GAAA,EAAI;AAEhB,IAAA,MAAM,mBAA2C,EAAC;AAClD,IAAA,KAAA,MAAW,GAAA,IAAQ,eAAA,CAAgB,OAAA,IAAW,EAAC,EAAa;AAC1D,MAAA,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,GAAI,GAAA,CAAI,KAAA;AAAA,IACvC;AAEA,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,aAAa,KAAA,IAAS,CAAA;AAAA,MACnC,eAAA,EAAiB,SAAA;AAAA,MACjB,iBAAA,EAAmB,KAAA;AAAA,MACnB,cAAA,EAAgB,gBAAgB,KAAA,IAAS,CAAA;AAAA,MACzC,UAAA,EAAY,eAAe,KAAA,IAAS,CAAA;AAAA,MACpC,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,GAAgB,EAAA,EAAsB;AACpD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,GAAA,GAAM,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAEjC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAWrC,CAAA,CAAE,IAAA,CAAK,GAAA,EAAK,KAAK,EAAE,GAAA,EAAI;AAGxB,IAAA,MAAM,gBAAgB,GAAA,GAAO,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,yBAAyB,EAAA,GAAK,GAAA;AACpF,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACnC;AAAA,KACF,CAAE,IAAA,CAAK,aAAa,CAAA,CAAE,GAAA,EAAI;AAE1B,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAA,CAAK,cAAA,CAAe,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,UAAU,CAAC,CAAA;AAEtF,IAAA,OAAA,CAAQ,QAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MAChD,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,gBAAgB,GAAA,CAAI,eAAA;AAAA,MACpB,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,MAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,UAAU;AAAA,KACtC,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,cAAA,CAAe,KAAA,GAAgB,EAAA,EAA6B;AAChE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,GAAA;AAGtC,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,GAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,WAAW,CAAA;AACjC,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,WAAA,EAAY,CAAE,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAA;AAAA,QACvD,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQrC,CAAA,CAAE,IAAA,CAAK,KAAA,EAAO,KAAK,EAAE,GAAA,EAAI;AAE1B,IAAA,KAAA,MAAW,GAAA,IAAQ,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAa;AAClD,MAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,MAAA,IAAI,GAAA,IAAO,CAAA,IAAK,GAAA,GAAM,OAAA,CAAQ,MAAA,EAAQ;AACpC,QAAA,OAAA,CAAQ,GAAG,CAAA,CAAG,KAAA,GAAQ,GAAA,CAAI,KAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,UAAA,EAAsC;AACzD,IAAA,MAAM,IAAA,GAAO,UAAA,IAAc,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,UAAA;AACnD,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,KAAQ,IAAA,GAAO,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAElD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,EAAI;AAEnB,IAAA,OAAQ,MAAA,CAAO,MAAc,OAAA,IAAW,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,uBAAA,CAAwB,KAAA,GAAgB,EAAA,EAA8B;AAC1E,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC5B;AAAA,KACF,CAAE,IAAA,CAAK,KAAK,CAAA,CAAE,GAAA,EAAI;AAElB,IAAA,OAAA,CAAQ,QAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MAChD,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,eAAe,GAAA,CAAI,cAAA;AAAA,MACnB,SAAS,GAAA,CAAI,OAAA,GAAU,KAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AAAA,MACjD,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,OAAA,EAAS,CAAC,CAAC,GAAA,CAAI,OAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB,CAAE,CAAA;AAAA,EACJ;AACF,CAAA;;;ACjVAvB,qDAAA,EAAA;AAmBA,SAAS,gBAAgB,EAAA,EAAoB;AAC3C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,EAAE,CAAA;AACxB,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,OAAO,GAAA,GAAM,EAAA;AAEnB,EAAA,IAAI,IAAA,GAAO,KAAO,OAAO,UAAA;AACzB,EAAA,IAAI,IAAA,GAAO,MAAS,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,GAAK,CAAC,CAAA,KAAA,CAAA;AACtD,EAAA,IAAI,IAAA,GAAO,OAAU,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,IAAO,CAAC,CAAA,KAAA,CAAA;AACzD,EAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,CAAA;AAChH;AAEA,SAAS,cAAc,QAAA,EAA0B;AAC/C,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,IAAA,EAAM,kEAAA;AAAA,IACN,OAAA,EAAS,sEAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACA,EAAA,OAAO,kFAAkF,MAAA,CAAO,QAAQ,KAAK,MAAA,CAAO,IAAI,KAAK,QAAQ,CAAA,OAAA,CAAA;AACvI;AAEA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,aAAA,EAAe,UAAA;AAAA,IACf,aAAA,EAAe,cAAA;AAAA,IACf,YAAA,EAAc,cAAA;AAAA,IACd,eAAA,EAAiB,SAAA;AAAA,IACjB,mBAAA,EAAqB,YAAA;AAAA,IACrB,MAAA,EAAQ,QAAA;AAAA,IACR,sBAAA,EAAwB,gBAAA;AAAA,IACxB,iBAAA,EAAmB;AAAA,GACrB;AACA,EAAA,OAAO,MAAA,CAAO,IAAI,CAAA,IAAK,IAAA;AACzB;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,OAAO,CAAA,4BAAA,EAA+B,KAAK,CAAA,QAAA,CAAA;AAC1D,EAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,OAAO,CAAA,+BAAA,EAAkC,KAAK,CAAA,QAAA,CAAA;AAC7D,EAAA,OAAO,CAAA,qCAAA,CAAA;AACT;AAEA,SAAS,eAAe,IAAA,EAA8B;AACpD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,wDAAA;AAE9B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,EAAG,CAAC,CAAA;AAEjD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AACzB,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAK,EAAE,KAAA,GAAQ,GAAA,GAAO,KAAK,CAAC,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,KAAU,CAAA,GACtB,iCACA,CAAA,CAAE,KAAA,IAAS,GAAA,GAAM,IAAA,GACf,YAAA,GACA,CAAA,CAAE,KAAA,IAAS,GAAA,GAAM,MACf,cAAA,GACA,aAAA;AACR,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA,YAAA,EAIG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA;AAAA;AAAA,sBAAA,EAER,KAAK,iEAAiE,MAAM,CAAA;AAAA;AAAA,mDAAA,EAE/C,KAAK,MAAA,GAAS,EAAA,GAAK,oBAAoB,EAAE,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAGvG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAEV,EAAA,OAAO,sCAAsC,IAAI,CAAA,MAAA,CAAA;AACnD;AAEO,SAAS,wBAAwB,IAAA,EAAqC;AAC3E,EAAA,MAAM,EAAE,OAAO,MAAA,EAAQ,WAAA,EAAa,gBAAgB,IAAA,EAAM,OAAA,EAAS,kBAAiB,GAAI,IAAA;AAExF,EAAA,MAAMkB,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,2EAAA,EAyB2D,KAAA,CAAM,WAAA,CAAY,cAAA,EAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAKjG,MAAM,eAAe;AAAA,mDAAA,EACkB,UAAA,CAAW,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAAA,EAK1C,MAAM,cAAA,GAAiB,CAAA,GAAI,mCAAmC,+BAA+B,CAAA,EAAA,EAAK,MAAM,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA,4CAAA,EAItH,MAAM,UAAA,GAAa,CAAA,GAAI,uCAAuC,+BAA+B,CAAA,EAAA,EAAK,MAAM,UAAU,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EASpJ,cAAA,CAAe,WAAW,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAOzB,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,CAAE,MAAA,KAAW,CAAA,GAC5C,qEAAA,GACA,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,YAAY,EAChC,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,CAC5B,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AACzE,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAO,KAAA,GAAQ,KAAA,GAAS,GAAG,CAAA,GAAI,CAAA;AAC5D,IAAA,OAAO;AAAA;AAAA;AAAA,uEAAA,EAGgD,cAAA,CAAe,IAAI,CAAC,CAAA;AAAA,uEAAA,EACpB,KAAK,CAAA;AAAA;AAAA;AAAA,uDAAA,EAGrB,IAAA,KAAS,kBAAkB,YAAA,GAAe,IAAA,KAAS,kBAAkB,gBAAA,GAAmB,aAAa,mBAAmB,GAAG,CAAA;AAAA;AAAA;AAAA,kBAAA,CAAA;AAAA,EAIpK,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CACd;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAYA,MAAA,CAAO,MAAA,KAAW,CAAA,GAChB,sFAAA,GACA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAUI,MAAA,CAAO,IAAI,CAAA,EAAA,KAAM;AAAA;AAAA,6FAAA,EAE4D,GAAG,SAAS,CAAA;AAAA,mFAAA,EACtB,EAAA,CAAG,eAAe,GAAG,CAAA;AAAA,0EAAA,EAC9B,GAAG,cAAA,IAAkB,EAAA,GAAK,mCAAmC,kCAAkC,CAAA,EAAA,EAAK,GAAG,cAAc,CAAA;AAAA;AAAA,sBAAA,EAEzK,EAAA,CAAG,MAAA,GACD,4JAAA,GACA,4KACJ;AAAA;AAAA;AAAA,gBAAA,CAGL,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA,oBAAA,CAGjB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAQE,cAAA,CAAe,MAAA,KAAW,CAAA,GACxB,gFAAA,GACA,CAAA;AAAA,cAAA,EACE,eAAe,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAI,CAAA,KAAA,KAAS;AAAA;AAAA;AAAA;AAAA,sBAAA,EAIjC,aAAA,CAAc,KAAA,CAAM,QAAQ,CAAC;AAAA,yFAAA,EACsC,cAAA,CAAe,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA;AAAA,wDAAA,EAEhE,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA;AAAA;AAAA,oBAAA,EAGpE,MAAM,SAAA,GAAY,CAAA,IAAA,EAAO,KAAA,CAAM,SAAS,KAAK,EAAE;AAAA,oBAAA,EAC/C,MAAM,KAAA,GAAQ,CAAA,GAAA,EAAM,KAAA,CAAM,KAAK,KAAK,EAAE;AAAA;AAAA;AAAA,cAAA,CAG7C,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA,kBAAA,CAEf;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAMR,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,oBAAA;AAAA,IACP,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,+BAAA;AAAA,IACb,IAAA;AAAA,IACA,OAAA,EAAAA,QAAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOhB,4CAA0B,UAAU,CAAA;AAC7C;;;AC1PAF,qDAAA,EAAA;AAyBA,SAASwB,iBAAgB,EAAA,EAAoB;AAC3C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,EAAE,CAAA;AACxB,EAAA,OAAO,IAAA,CAAK,mBAAmB,OAAA,EAAS;AAAA,IACtC,KAAA,EAAO,OAAA;AAAA,IACP,GAAA,EAAK,SAAA;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAEA,SAASC,eAAc,QAAA,EAA0B;AAC/C,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,IAAA,EAAM,kEAAA;AAAA,IACN,OAAA,EAAS,sEAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACA,EAAA,OAAO,kFAAkF,MAAA,CAAO,QAAQ,KAAK,MAAA,CAAO,IAAI,KAAK,QAAQ,CAAA,OAAA,CAAA;AACvI;AAEA,SAASC,gBAAe,IAAA,EAAsB;AAC5C,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,aAAA,EAAe,8EAAA;AAAA,IACf,aAAA,EAAe,8DAAA;AAAA,IACf,YAAA,EAAc,kEAAA;AAAA,IACd,eAAA,EAAiB,8DAAA;AAAA,IACjB,mBAAA,EAAqB,0EAAA;AAAA,IACrB,MAAA,EAAQ,+DAAA;AAAA,IACR,sBAAA,EAAwB,sEAAA;AAAA,IACxB,iBAAA,EAAmB;AAAA,GACrB;AACA,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,aAAA,EAAe,UAAA;AAAA,IACf,aAAA,EAAe,cAAA;AAAA,IACf,YAAA,EAAc,cAAA;AAAA,IACd,eAAA,EAAiB,SAAA;AAAA,IACjB,mBAAA,EAAqB,YAAA;AAAA,IACrB,MAAA,EAAQ,QAAA;AAAA,IACR,sBAAA,EAAwB,gBAAA;AAAA,IACxB,iBAAA,EAAmB;AAAA,GACrB;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,IAAK,+DAAA;AAC9B,EAAA,OAAO,kFAAkF,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,IAAI,KAAK,IAAI,CAAA,OAAA,CAAA;AACzH;AAEA,SAAS,cAAA,CAAe,OAAA,EAA+B,SAAA,GAAoC,EAAC,EAAW;AACrG,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,CAAC,SAAA,CAAU,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAC,CAAA;AACtF,EAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,CAAC,SAAA,CAAU,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC5F,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAC,SAAA,CAAU,OAAO,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AACxE,EAAA,IAAI,OAAA,CAAQ,aAAa,CAAC,SAAA,CAAU,IAAI,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,OAAA,CAAQ,SAAS,CAAA;AAC1E,EAAA,IAAI,OAAA,CAAQ,UAAU,CAAC,SAAA,CAAU,QAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAA;AAE5E,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,IAAA,IAAI,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,EAAA,GAAK,OAAO,QAAA,EAAS;AAC3B,EAAA,OAAO,CAAA,oCAAA,EAAuC,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,EAAE,CAAA,CAAA;AAClE;AAEO,SAAS,mBAAmB,IAAA,EAAgC;AACjE,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAS,IAAA,EAAM,OAAA,EAAS,kBAAiB,GAAI,IAAA;AAEzE,EAAA,MAAMR,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2DAAA,EAM2C,WAAW,SAAS,CAAA,CAAA,EAAI,WAAW,OAAO,CAAA,IAAA,EAAO,WAAW,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAAA,EAkBrF,OAAA,CAAQ,SAAA,KAAc,eAAA,GAAkB,UAAA,GAAa,EAAE,CAAA;AAAA,4CAAA,EACvD,OAAA,CAAQ,SAAA,KAAc,eAAA,GAAkB,UAAA,GAAa,EAAE,CAAA;AAAA,2CAAA,EACxD,OAAA,CAAQ,SAAA,KAAc,cAAA,GAAiB,UAAA,GAAa,EAAE,CAAA;AAAA,8CAAA,EACnD,OAAA,CAAQ,SAAA,KAAc,iBAAA,GAAoB,UAAA,GAAa,EAAE,CAAA;AAAA,kDAAA,EACrD,OAAA,CAAQ,SAAA,KAAc,qBAAA,GAAwB,UAAA,GAAa,EAAE,CAAA;AAAA,qCAAA,EAC1E,OAAA,CAAQ,SAAA,KAAc,QAAA,GAAW,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAAA,EAOlD,OAAA,CAAQ,QAAA,KAAa,MAAA,GAAS,UAAA,GAAa,EAAE,CAAA;AAAA,sCAAA,EAC1C,OAAA,CAAQ,QAAA,KAAa,SAAA,GAAY,UAAA,GAAa,EAAE,CAAA;AAAA,uCAAA,EAC/C,OAAA,CAAQ,QAAA,KAAa,UAAA,GAAa,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mDAAA,EAKrC,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAAA,EAKtB,OAAA,CAAQ,aAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,QAAA,EAkB/D,MAAA,CAAO,WAAW,CAAA,GAChB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,CAAA,GAOA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAcM,MAAA,CAAO,IAAI,CAAA,KAAA,KAAS;AAAA;AAAA,qGAAA,EAEiEM,gBAAAA,CAAgB,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,0CAAA,EAC3FE,eAAAA,CAAe,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,0CAAA,EAC/BD,cAAAA,CAAc,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,0GAAA,EACmC,KAAA,CAAM,SAAS,GAAG,CAAA;AAAA,6FAAA,EAC/B,KAAA,CAAM,aAAa,GAAG,CAAA;AAAA,mFAAA,EAChC,KAAA,CAAM,eAAe,GAAG,CAAA;AAAA;AAAA,sBAAA,EAErF,KAAA,CAAM,OAAA,GACJ,6JAAA,GACA,6KACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+IAAA,EAM2H,KAAA,CAAM,EAAA,CAAG,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,oKAAA,EACH,KAAA,CAAM,aAAa,GAAG,CAAA;AAAA,iIAAA,EACzD,KAAA,CAAM,eAAe,GAAG,CAAA;AAAA,kJAAA,EACP,KAAA,CAAM,eAAe,GAAG,CAAA;AAAA,wBAAA,EAClJ,KAAA,CAAM,OAAA,GAAU,CAAA,+LAAA,EAAkM,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA,YAAA,CAAA,GAAiB,EAAE;AAAA;AAAA;AAAA;AAAA,gBAAA,CAIpR,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA,gBAAA,CAInB;;AAAA;AAAA,QAAA,EAGE,UAAA,CAAW,aAAa,CAAA,GAAI;AAAA;AAAA;AAAA,mBAAA,EAGjB,UAAA,CAAW,WAAW,CAAA,IAAA,EAAO,UAAA,CAAW,UAAU;AAAA;AAAA;AAAA,cAAA,EAGvD,UAAA,CAAW,cAAc,CAAA,GAAI;AAAA,yBAAA,EAClB,cAAA,CAAe,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,CAAO,WAAW,WAAA,GAAc,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA,GAI9E,EAAE;AAAA,cAAA,EACJ,UAAA,CAAW,WAAA,GAAc,UAAA,CAAW,UAAA,GAAa;AAAA,yBAAA,EACtC,cAAA,CAAe,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,CAAO,WAAW,WAAA,GAAc,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA,GAI9E,EAAE;AAAA;AAAA;AAAA,QAAA,CAAA,GAGR,EAAE;AAAA;AAAA;AAAA,EAAA,CAAA;AAKZ,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,oBAAA;AAAA,IACP,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,sCAAA;AAAA,IACb,IAAA;AAAA,IACA,OAAA,EAAAP,QAAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOhB,4CAA0B,UAAU,CAAA;AAC7C;;;ACvPAF,qDAAA,EAAA;AAiBO,SAAS,2BAA2B,IAAA,EAAwC;AACjF,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,kBAAiB,GAAI,IAAA;AAE/D,EAAA,MAAMkB,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAA,EAiBV,OAAA,GAAU;AAAA;AAAA,oEAAA,EAEoD,OAAO,CAAA;AAAA;AAAA,MAAA,CAAA,GAEnE,EAAE;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8EAAA,EAcoE,QAAA,CAAS,UAAA,CAAW,OAAA,GAAU,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mFAAA,EAQvC,QAAA,CAAS,WAAW,sBAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sFAAA,EAKvC,QAAA,CAAS,WAAW,yBAAyB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0EAAA,EAKzD,QAAA,CAAS,WAAW,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mFAAA,EAKxB,QAAA,CAAS,WAAW,sBAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2EAAA,EAKlD,QAAA,CAAS,WAAW,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qFAAA,EAYxB,QAAA,CAAS,OAAA,CAAQ,mBAAA,GAAsB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,4EAAA,EAK9D,QAAA,CAAS,OAAA,CAAQ,UAAA,GAAa,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,kFAAA,EAKtC,QAAA,CAAS,OAAA,CAAQ,gBAAA,GAAmB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,mFAAA,EAKjD,QAAA,CAAS,OAAA,CAAQ,iBAAA,GAAoB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,qFAAA,EAKjD,QAAA,CAAS,OAAA,CAAQ,mBAAA,GAAsB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sEAAA,EAapE,QAAA,CAAS,UAAU,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qEAAA,EAK9B,QAAA,CAAS,UAAU,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAKlB,QAAA,CAAS,SAAA,CAAU,SAAA,GAAY,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAwB5H,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,yBAAA;AAAA,IACP,SAAA,EAAW,yBAAA;AAAA,IACX,WAAA,EAAa,wCAAA;AAAA,IACb,IAAA;AAAA,IACA,OAAA,EAAAA,QAAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOhB,4CAA0B,UAAU,CAAA;AAC7C;;;AClKA,IAAMyB,YAAAA,GAAc,IAAIvB,SAAAA,EAAmD;AAE3EuB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAKtB,6BAAA,EAAa,CAAA;AAGlCsB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAA,KAAS;AACtC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,GAAG,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,IAAA,EAAK;AACd,CAAC,CAAA;AAED,eAAe,YAAY,EAAA,EAAyC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,IAAIC,+BAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAMrB,OAAAA,GAAS,MAAM,aAAA,CAAc,SAAA,CAAU,gBAAgB,CAAA;AAC7D,IAAA,IAAIA,SAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QAAA,GAAW,OAAOA,OAAAA,CAAO,QAAA,KAAa,QAAA,GAAW,KAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA,GAAIA,OAAAA,CAAO,QAAA;AAC5F,MAAA,OAAO,EAAE,GAAGgB,iBAAAA,EAAkB,GAAG,QAAA,EAAS;AAAA,IAC5C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAe;AACvB,EAAA,OAAOA,iBAAAA;AACT;AAGAI,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAChC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AAErD,EAAA,MAAM,CAAC,OAAO,MAAA,EAAQ,WAAA,EAAa,cAAc,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACrE,QAAQ,QAAA,EAAS;AAAA,IACjB,OAAA,CAAQ,UAAU,EAAE,CAAA;AAAA,IACpB,OAAA,CAAQ,eAAe,EAAE,CAAA;AAAA,IACzB,OAAA,CAAQ,wBAAwB,EAAE;AAAA,GACnC,CAAA;AAED,EAAA,MAAM,QAAA,GAAkC;AAAA,IACtC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC3C;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAC,CAAA;AACjD,CAAC,CAAA;AAGDA,YAAAA,CAAY,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAM;AACtC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AAErD,EAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,EAAA;AAEd,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,SAAA,EAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAA2B,MAAA;AAAA,IACzD,QAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,IAA0B,MAAA;AAAA,IAC3D,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,MAAA;AAAA,IAC/B,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,IAAK,MAAA;AAAA,IAChC,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA;AAAA,IACjC,IAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,KAAU,MAAM,OAAA,CAAQ,UAAU,OAAO,CAAA;AACzD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAA;AAE1C,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,WAAA,EAAa,IAAA;AAAA,MACb,UAAA;AAAA,MACA,UAAA,EAAY,KAAA;AAAA,MACZ,YAAA,EAAc,KAAA;AAAA,MACd,WAAW,KAAA,KAAU,CAAA,GAAI,CAAA,GAAA,CAAK,IAAA,GAAO,KAAK,KAAA,GAAQ,CAAA;AAAA,MAClD,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,OAAO,KAAK;AAAA,KACvC;AAAA,IACA,OAAA;AAAA,IACA,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC3C;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGDA,YAAAA,CAAY,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AACxC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,EAAE,CAAA;AAErC,EAAA,MAAM,QAAA,GAAqC;AAAA,IACzC,QAAA;AAAA,IACA,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,IAAK,MAAA;AAAA,IACnC,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC3C;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,0BAAA,CAA2B,QAAQ,CAAC,CAAA;AACpD,CAAC,CAAA;AAGDA,YAAAA,CAAY,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA,KAAM;AACzC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,SAAA,EAAU;AAEnC,EAAA,MAAM,QAAA,GAAkC;AAAA,IACtC,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,IAAA,CAAK,oBAAoB,CAAA,KAAM,MAAA;AAAA,MACxC,sBAAA,EAAwB,QAAA,CAAS,IAAA,CAAK,mCAAmC,CAAW,CAAA,IAAK,EAAA;AAAA,MACzF,yBAAA,EAA2B,QAAA,CAAS,IAAA,CAAK,sCAAsC,CAAW,CAAA,IAAK,CAAA;AAAA,MAC/F,aAAA,EAAe,QAAA,CAAS,IAAA,CAAK,0BAA0B,CAAW,CAAA,IAAK,EAAA;AAAA,MACvE,sBAAA,EAAwB,QAAA,CAAS,IAAA,CAAK,mCAAmC,CAAW,CAAA,IAAK,EAAA;AAAA,MACzF,cAAA,EAAgB,QAAA,CAAS,IAAA,CAAK,2BAA2B,CAAW,CAAA,IAAK;AAAA,KAC3E;AAAA,IACA,OAAA,EAAS;AAAA,MACP,mBAAA,EAAqB,IAAA,CAAK,6BAA6B,CAAA,KAAM,MAAA;AAAA,MAC7D,UAAA,EAAY,IAAA,CAAK,oBAAoB,CAAA,KAAM,MAAA;AAAA,MAC3C,gBAAA,EAAkB,IAAA,CAAK,0BAA0B,CAAA,KAAM,MAAA;AAAA,MACvD,iBAAA,EAAmB,IAAA,CAAK,2BAA2B,CAAA,KAAM,MAAA;AAAA,MACzD,mBAAA,EAAqB,IAAA,CAAK,6BAA6B,CAAA,KAAM;AAAA,KAC/D;AAAA,IACA,SAAA,EAAW;AAAA,MACT,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,sBAAsB,CAAW,CAAA,IAAK,EAAA;AAAA,MAChE,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,qBAAqB,CAAW,CAAA,IAAK,GAAA;AAAA,MAC9D,SAAA,EAAW,IAAA,CAAK,qBAAqB,CAAA,KAAM;AAAA;AAC7C,GACF;AAEA,EAAA,MAAM,aAAA,GAAgB,IAAIC,+BAAA,CAAc,EAAE,CAAA;AAC1C,EAAA,MAAM,aAAA,CAAc,oBAAA,CAAqB,gBAAA,EAAkB,QAAQ,CAAA;AAGnE,EAAA,IAAI,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC9B,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,CAAA,CAAE,SAAS,4EAA4E,CAAA;AAChG,CAAC,CAAA;;;AC3JD,IAAM,SAAA,GAAY,cAAA;AAClB,IAAM,WAAA,GAAc,kBAAA;AAEb,IAAM,qBAAN,MAAyB;AAAA,EAG9B,WAAA,CACU,IACR,QAAA,EACA;AAFQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAGR,IAAA,IAAA,CAAK,QAAA,GAAW,YAAYL,iBAAAA,CAAiB,UAAA;AAAA,EAC/C;AAAA,EAPQ,QAAA;AAAA,EASR,MAAM,mBAAA,CAAoB,EAAA,EAAY,KAAA,EAMnC;AACD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,OAAA,IAAW,CAAC,KAAK,EAAA,EAAI;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,cAAc,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,YAAA,EAAc,KAAA,EAAM;AAAA,IACvG;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,aAAA,GAAgB,EAAA,GAAK,GAAA;AAGpD,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,SAAS,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AAG3D,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AAGjE,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,SAAS,CAAA,UAAA,EAAa,EAAE,CAAA,CAAA;AAC/C,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAA;AAChD,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA;AACtD,IAAA,MAAM,eAAe,YAAA,IAAgB,CAAA;AAErC,IAAA,MAAM,YAAA,GAAe,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,sBAAA;AAC9C,IAAA,MAAM,eAAA,GAAkB,UAAA,IAAc,IAAA,CAAK,QAAA,CAAS,yBAAA;AAEpD,IAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,YAAA,EAAc,iBAAiB,YAAA,EAAa;AAAA,EAC5E;AAAA,EAEA,MAAM,QAAA,CAAS,EAAA,EAAY,KAAA,EAA8D;AACvF,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,OAAA,IAAW,CAAC,KAAK,EAAA,EAAI;AACtC,MAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,IACzB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG,WAAW,CAAA,GAAA,EAAM,EAAE,CAAA,CAAE,CAAA;AAC3D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,sEAAA,EAAuE;AAAA,IACxG;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG,WAAW,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AACpE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,mEAAA,EAAoE;AAAA,IACrG;AAEA,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EACzB;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,sBAAA,GAAyB,EAAA;AACnD,IAAA,MAAM,IAAA,CAAK,GAAG,GAAA,CAAI,CAAA,EAAG,WAAW,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU;AAAA,MACzD,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,MACnB,MAAA,EAAQ;AAAA,KACT,CAAA,EAAG,EAAE,aAAA,EAAe,KAAK,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,UAAU,KAAA,EAA8B;AAC5C,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,sBAAA,GAAyB,EAAA;AACnD,IAAA,MAAM,IAAA,CAAK,GAAG,GAAA,CAAI,CAAA,EAAG,WAAW,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU;AAAA,MAC/D,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,MACnB,MAAA,EAAQ;AAAA,KACT,CAAA,EAAG,EAAE,aAAA,EAAe,KAAK,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,SAAS,EAAA,EAA2B;AACxC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,KAAK,EAAA,CAAG,MAAA,CAAO,GAAG,WAAW,CAAA,GAAA,EAAM,EAAE,CAAA,CAAE,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,YAAY,KAAA,EAA8B;AAC9C,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,KAAK,EAAA,CAAG,MAAA,CAAO,GAAG,WAAW,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,iBAAA,GAA4G;AAChH,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,EAAC;AAEtB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,WAAW,CAAA,GAAA,CAAA,EAAO,CAAA;AAClE,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,WAAW,CAAA,MAAA,CAAA,EAAU,CAAA;AAExE,IAAA,MAAM,WAA0F,EAAC;AAEjG,IAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,IAAA,EAAM;AAC9B,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,IAAI,IAAI,CAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,KAAK,GAAA,CAAI,IAAA;AAAA,UACT,IAAA,EAAM,IAAA;AAAA,UACN,OAAO,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,EAAG,WAAW,OAAO,EAAE,CAAA;AAAA,UAC/C,UAAU,MAAA,CAAO;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,WAAW,IAAA,EAAM;AACjC,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,IAAI,IAAI,CAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,KAAK,GAAA,CAAI,IAAA;AAAA,UACT,IAAA,EAAM,OAAA;AAAA,UACN,OAAO,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,EAAG,WAAW,UAAU,EAAE,CAAA;AAAA,UAClD,UAAU,MAAA,CAAO;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,GAAA,EAA4B;AAC/C,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEA,sBAAsB,KAAA,EAAwB;AAC5C,IAAA,OAAO,KAAA,IAAS,KAAK,QAAA,CAAS,cAAA;AAAA,EAChC;AAAA,EAEA,MAAc,gBAAA,CAAiB,GAAA,EAAa,QAAA,EAAmC;AAC7E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,GAAG,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,UAAoB,EAAC;AACzB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,GAAU,EAAC;AAAA,MACb;AAAA,IACF;AAGA,IAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AACrB,IAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,EAAA,KAAM,EAAA,GAAK,MAAM,CAAA;AAG1C,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAGhB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,GAAI,CAAA;AAC5C,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG,EAAE,aAAA,EAAe,UAAA,EAAY,CAAA;AAE7E,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,EACjB;AAAA,EAEA,MAAc,QAAA,CAAS,GAAA,EAAa,KAAA,EAAe,QAAA,EAAiC;AAClF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,GAAG,CAAA;AACtC,IAAA,IAAI,MAA8B,EAAC;AACnC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AAErB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,MAC3B,CAAA,CAAA,MAAQ;AACN,QAAA,GAAA,GAAM,EAAC;AAAA,MACT;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACzC,MAAA,IAAI,EAAA,GAAK,MAAA,EAAQ,OAAO,GAAA,CAAI,CAAC,CAAA;AAAA,IAC/B;AAEA,IAAA,GAAA,CAAI,KAAK,CAAA,GAAI,GAAA;AAEb,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,GAAI,CAAA;AAC5C,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,EAAG,EAAE,aAAA,EAAe,UAAA,EAAY,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAc,WAAW,GAAA,EAA8B;AACrD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,GAAG,CAAA;AACtC,IAAA,IAAI,CAAC,UAAU,OAAO,CAAA;AAEtB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAC/B,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACF,CAAA;;;ACrMA,IAAMM,UAAAA,GAAY,IAAIzB,SAAAA,EAAmD;AAEzEyB,UAAAA,CAAU,GAAA,CAAI,GAAA,EAAKxB,6BAAA,EAAa,CAAA;AAGhCwB,UAAAA,CAAU,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAA,KAAS;AACpC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,eAAA,IAAmB,GAAG,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA,EAAK;AACd,CAAC,CAAA;AAED,eAAeC,aAAY,EAAA,EAAyC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,IAAIF,+BAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAMrB,OAAAA,GAAS,MAAM,aAAA,CAAc,SAAA,CAAU,gBAAgB,CAAA;AAC7D,IAAA,IAAIA,SAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QAAA,GAAW,OAAOA,OAAAA,CAAO,QAAA,KAAa,QAAA,GAAW,KAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA,GAAIA,OAAAA,CAAO,QAAA;AAC5F,MAAA,OAAO,EAAE,GAAGgB,iBAAAA,EAAkB,GAAG,QAAA,EAAS;AAAA,IAC5C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAe;AACvB,EAAA,OAAOA,iBAAAA;AACT;AAGAM,UAAAA,CAAU,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAM;AACpC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AAErD,EAAA,MAAM,OAAA,GAAgC;AAAA,IACpC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAAA,IAC7B,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AAAA,IAChC,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,MAAA;AAAA,IAC/B,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,IAAK,MAAA;AAAA,IAChC,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA;AAAA,IACjC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,MAAA;AAAA,IACpE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAE,CAAA,GAAI,MAAA;AAAA,IAC9D,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAE,CAAA,GAAI,CAAA;AAAA,IAC7D,OAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,OAAO,CAAE,CAAA,EAAG,GAAG,CAAA,GAAI,EAAA;AAAA,IAC/E,MAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAa,YAAA;AAAA,IAC1C,SAAA,EAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,IAAa;AAAA,GAClD;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAA;AAC9C,EAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AACtB,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,aAAA,EAAe,OAAO,CAAA,KAAM;AACxC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,EAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA;AAEtD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,iBAAA,IAAqB,GAAG,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AACrB,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAM;AACnC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,EAAS;AACrC,EAAA,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AACrB,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAM;AACvC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,EAAA;AACvE,EAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA;AACzC,EAAA,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACnB,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,cAAA,EAAgB,OAAO,CAAA,KAAM;AACzC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,EAAA;AACvE,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA;AAChD,EAAA,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AACrB,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AACtC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,QAAA;AACjB,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,IAAI,kBAAA,CAAmB,EAAA,EAAI,SAAS,UAAU,CAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,iBAAA,EAAkB;AAClD,EAAA,OAAO,CAAA,CAAE,KAAK,QAAQ,CAAA;AACxB,CAAC,CAAA;AAGDD,UAAAA,CAAU,MAAA,CAAO,gBAAA,EAAkB,OAAO,CAAA,KAAM;AAC9C,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,QAAA;AACjB,EAAA,MAAM,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA;AACjD,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,IAAI,kBAAA,CAAmB,EAAA,EAAI,SAAS,UAAU,CAAA;AAC/D,EAAA,MAAM,QAAA,CAAS,eAAe,GAAG,CAAA;AACjC,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AACjC,CAAC,CAAA;AAGDD,UAAAA,CAAU,IAAA,CAAK,eAAA,EAAiB,OAAO,CAAA,KAAM;AAC3C,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,cAAA,CAAe,KAAK,UAAU,CAAA;AAC5D,EAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAC1C,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAM;AACpC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA;AAExC,EAAA,MAAM,OAAA,GAAgC;AAAA,IACpC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAAA,IAC7B,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AAAA,IAChC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,MAAA;AAAA,IACpE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAE,CAAA,GAAI,MAAA;AAAA,IAC9D,KAAA,EAAO,GAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,OAAA,CAAQ,UAAU,OAAO,CAAA;AAElD,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAM,YAAA,EAAc,YAAY,OAAA,EAAS,YAAA,EAAc,cAAA,EAAgB,SAAA,EAAW,YAAY,CAAA;AAC/G,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAClC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,KAAA,CAAM,EAAA;AAAA,QACN,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM,QAAA;AAAA,QACN,MAAM,KAAA,IAAS,EAAA;AAAA,QACf,MAAM,SAAA,IAAa,EAAA;AAAA,QACnB,MAAM,WAAA,IAAe,EAAA;AAAA,QACrB,KAAA,CAAM,UAAU,GAAA,GAAM,GAAA;AAAA,QACtB,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,WAAA;AAAY,OACxC,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAA,EAAI,OAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,IAAI,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,MACtC,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,UAAA;AAAA,QAChB,qBAAA,EAAuB,CAAA,sCAAA,EAAyC,IAAA,CAAK,GAAA,EAAK,CAAA,KAAA;AAAA;AAC5E,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AACtB,CAAC,CAAA;;;ACvKD,SAAS,mBAAmB,CAAA,EAA0D;AACpF,EAAA,MAAM,KAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,KACrC,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,GAAG,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,EAAG,MAAK,IACrD,SAAA;AACL,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,IAAK,SAAA;AAChD,EAAA,MAAM,WAAA,GAAc,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,cAAc,CAAA,IAAK,IAAA;AACpD,EAAA,MAAM,OAAO,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAChC,EAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AAErB,EAAA,OAAO,EAAE,EAAA,EAAI,SAAA,EAAW,WAAA,EAAa,MAAM,MAAA,EAAO;AACpD;AAEA,SAAS,mBAAA,CAAoB,IAAY,SAAA,EAA2B;AAElE,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC7B,IAAA,IAAA,GAAA,CAAS,IAAA,IAAQ,KAAK,IAAA,GAAQ,IAAA;AAC9B,IAAA,IAAA,IAAQ,CAAA;AAAA,EACV;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CAAE,SAAS,EAAE,CAAA;AACnC;AAEA,eAAe,kBAAkB,EAAA,EAAyC;AACxE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,IAAIF,+BAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAMrB,OAAAA,GAAS,MAAM,aAAA,CAAc,SAAA,CAAU,gBAAgB,CAAA;AAC7D,IAAA,IAAIA,SAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QAAA,GAAW,OAAOA,OAAAA,CAAO,QAAA,KAAa,QAAA,GAAW,KAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA,GAAIA,OAAAA,CAAO,QAAA;AAC5F,MAAA,OAAO,EAAE,GAAGgB,iBAAAA,EAAkB,GAAG,QAAA,EAAS;AAAA,IAC5C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAOA,iBAAAA;AACT;AAEA,eAAeQ,gBAAe,EAAA,EAA2B;AACvD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,OAAA;AAAA,MACtB;AAAA,MACA,KAAA,EAAM;AACR,IAAA,OAAO,QAAQ,MAAA,KAAW,QAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAO,OAAO,GAA0D,IAAA,KAAe;AACrF,IAAA,MAAM,OAAO,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAGhC,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,IAAI,CAAC,MAAMA,eAAAA,CAAe,EAAE,CAAA,EAAG;AAC7B,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,CAAkB,EAAE,CAAA;AAC3C,IAAA,MAAM,EAAE,EAAA,EAAI,SAAA,EAAW,aAAa,MAAA,EAAO,GAAI,mBAAmB,CAAC,CAAA;AACnE,IAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,EAAA,EAAI,SAAS,CAAA;AAGrD,IAAA,MAAM,WAAA,GAAA,CAAe,IAAA,KAAS,aAAA,IAAiB,IAAA,KAAS,uBAAuB,MAAA,KAAW,MAAA;AAC1F,IAAA,IAAI,iBAAA,GAAoB,EAAA;AAExB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI;AACF,QAAA,IAAI,SAAS,kBAAA,EAAoB;AAE/B,UAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,GAAA,CAAI,KAAA,EAAM;AAClC,UAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,QAAA,EAAS;AAC1C,UAAA,iBAAA,GAAA,CAAqB,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,IAAe,IAAI,WAAA,EAAY;AAAA,QAC1E,CAAA,MAAO;AAEL,UAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,UAAA,iBAAA,GAAoB,IAAA,EAAM,KAAA,EAAO,WAAA,EAAY,IAAK,EAAA;AAAA,QACpD;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,IAAI,iBAAA,IAAqB,QAAA,CAAS,UAAA,CAAW,OAAA,EAAS;AACpD,QAAA,MAAM,WAAW,IAAI,kBAAA,CAAmB,EAAE,GAAA,CAAI,QAAA,EAAU,SAAS,UAAU,CAAA;AAC3E,QAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,QAAA,CAAS,IAAI,iBAAiB,CAAA;AAEhE,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AAErD,UAAA,MAAMC,WAAAA,GAAa,QAAQ,QAAA,CAAS;AAAA,YAClC,SAAA,EAAW,eAAA;AAAA,YACX,QAAA,EAAU,SAAA;AAAA,YACV,KAAA,EAAO,iBAAA;AAAA,YACP,SAAA,EAAW,EAAA;AAAA,YACX,SAAA;AAAA,YACA,aAAa,WAAA,IAAe,MAAA;AAAA,YAC5B,WAAA,EAAa,IAAA;AAAA,YACb,aAAA,EAAe,MAAA;AAAA,YACf,WAAA;AAAA,YACA,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,EAAE,MAAA,EAAQ,UAAA,CAAW,MAAA;AAAO,WACtC,CAAA;AAED,UAAA,IAAI,CAAA,CAAE,cAAc,SAAA,EAAW;AAC7B,YAAA,CAAA,CAAE,YAAA,CAAa,UAAUA,WAAU,CAAA;AAAA,UACrC;AAEA,UAAA,OAAO,EAAE,IAAA,CAAK;AAAA,YACZ,KAAA,EAAO,WAAW,MAAA,IAAU;AAAA,aAC3B,GAAG,CAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,EAAK;AAGX,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,EAAG,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,WAAA,EAAa,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,iBAAiB,CAAA;AAEzH,IAAA,IAAI,CAAA,CAAE,cAAc,SAAA,EAAW;AAC7B,MAAA,CAAA,CAAE,YAAA,CAAa,UAAU,UAAU,CAAA;AAAA,IACrC;AAAA,EACF,CAAA;AACF;AAEA,eAAe,YAAA,CACb,CAAA,EACA,EAAA,EACA,QAAA,EACA,EAAA,EACA,SAAA,EACA,WAAA,EACA,WAAA,EACA,IAAA,EACA,MAAA,EACA,iBAAA,GAA4B,EAAA,EACb;AACf,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AACrB,IAAA,MAAM,WAAA,GAAA,CAAe,IAAA,KAAS,aAAA,IAAiB,IAAA,KAAS,uBAAuB,MAAA,KAAW,MAAA;AAC1F,IAAA,MAAM,cAAc,IAAA,KAAS,kBAAA;AAG7B,IAAA,IAAI,WAAA,EAAa;AAIf,MAAA,IAAI,cAAA;AACJ,MAAA,IAAI,WAAA,EAAa;AAEf,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,IAAI,aAAa,CAAA;AAClD,QAAA,MAAM,kBAAkB,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,IAAK,EAAA;AAC3D,QAAA,cAAA,GAAiB,CAAC,EAAE,UAAA,EAAY,QAAA,CAAS,QAAQ,CAAA,IAAK,eAAA,CAAgB,SAAS,YAAY,CAAA,CAAA;AAAA,MAC7F,CAAA,MAAO;AACL,QAAA,cAAA,GAAiB,MAAA,KAAW,GAAA;AAAA,MAC9B;AAEA,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,mBAAA,EAAqB;AAG3C,QAAA,IAAI,KAAA,GAAQ,iBAAA;AACZ,QAAA,IAAI,MAAA,GAAS,EAAA;AACb,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,EAAM;AAC3B,YAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,YAAA,KAAA,GAAQ,IAAA,EAAM,MAAM,KAAA,IAAS,KAAA;AAC7B,YAAA,MAAA,GAAS,IAAA,EAAM,MAAM,EAAA,IAAM,EAAA;AAAA,UAC7B,CAAA,CAAA,MAAQ;AAAA,UAAe;AAAA,QACzB;AAEA,QAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,UACrB,SAAA,EAAW,eAAA;AAAA,UACX,QAAA,EAAU,MAAA;AAAA,UACV,QAAQ,MAAA,IAAU,KAAA,CAAA;AAAA,UAClB,OAAO,KAAA,IAAS,KAAA,CAAA;AAAA,UAChB,SAAA,EAAW,EAAA;AAAA,UACX,SAAA;AAAA,UACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,UAC5B,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe,MAAA;AAAA,UACf;AAAA,SACD,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,MAAM,KAAA,GAAQ,iBAAA;AAEd,QAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,UACrB,SAAA,EAAW,eAAA;AAAA,UACX,QAAA,EAAU,SAAA;AAAA,UACV,OAAO,KAAA,IAAS,KAAA,CAAA;AAAA,UAChB,SAAA,EAAW,EAAA;AAAA,UACX,SAAA;AAAA,UACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,UAC5B,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe,MAAA;AAAA,UACf,WAAA;AAAA,UACA,OAAA,EAAS,EAAE,UAAA,EAAY,MAAA;AAAO,SAC/B,CAAA;AAGD,QAAA,IAAI,KAAA,IAAS,QAAA,CAAS,UAAA,CAAW,OAAA,EAAS;AACxC,UAAA,MAAM,WAAW,IAAI,kBAAA,CAAmB,EAAE,GAAA,CAAI,QAAA,EAAU,SAAS,UAAU,CAAA;AAC3E,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,mBAAA,CAAoB,IAAI,KAAK,CAAA;AAE3D,UAAA,IAAI,OAAO,YAAA,EAAc;AACvB,YAAA,MAAM,QAAA,CAAS,OAAO,EAAE,CAAA;AACxB,YAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,cACrB,SAAA,EAAW,iBAAA;AAAA,cACX,QAAA,EAAU,UAAA;AAAA,cACV,KAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,cACX,SAAA;AAAA,cACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,cAC5B,WAAA,EAAa,IAAA;AAAA,cACb,aAAA,EAAe,MAAA;AAAA,cACf,WAAA;AAAA,cACA,SAAS,EAAE,MAAA,EAAQ,gBAAA,EAAkB,YAAA,EAAc,OAAO,OAAA;AAAQ,aACnE,CAAA;AAAA,UACH;AAEA,UAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,YAAA,MAAM,QAAA,CAAS,UAAU,KAAK,CAAA;AAC9B,YAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,cACrB,SAAA,EAAW,iBAAA;AAAA,cACX,QAAA,EAAU,UAAA;AAAA,cACV,KAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,cACX,SAAA;AAAA,cACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,cAC5B,WAAA,EAAa,IAAA;AAAA,cACb,aAAA,EAAe,MAAA;AAAA,cACf,WAAA;AAAA,cACA,SAAS,EAAE,MAAA,EAAQ,mBAAA,EAAqB,YAAA,EAAc,OAAO,UAAA;AAAW,aACzE,CAAA;AAAA,UACH;AAEA,UAAA,IAAI,OAAO,YAAA,EAAc;AACvB,YAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,cACrB,SAAA,EAAW,qBAAA;AAAA,cACX,QAAA,EAAU,UAAA;AAAA,cACV,SAAA,EAAW,EAAA;AAAA,cACX,SAAA;AAAA,cACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,cAC5B,WAAA,EAAa,IAAA;AAAA,cACb,aAAA,EAAe,MAAA;AAAA,cACf,WAAA;AAAA,cACA,SAAS,EAAE,MAAA,EAAQ,yBAAA,EAA2B,OAAA,EAAS,OAAO,OAAA;AAAQ,aACvE,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,SAAS,gBAAA,IAAoB,MAAA,KAAW,MAAA,IAAU,QAAA,CAAS,QAAQ,gBAAA,EAAkB;AACvF,MAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,QAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,QAAA,IAAI,MAAA,GAAS,EAAA;AACb,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,EAAM;AAC3B,UAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,UAAA,KAAA,GAAQ,IAAA,EAAM,MAAM,KAAA,IAAS,EAAA;AAC7B,UAAA,MAAA,GAAS,IAAA,EAAM,MAAM,EAAA,IAAM,EAAA;AAAA,QAC7B,CAAA,CAAA,MAAQ;AAAA,QAAe;AAEvB,QAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,UACrB,SAAA,EAAW,cAAA;AAAA,UACX,QAAA,EAAU,MAAA;AAAA,UACV,QAAQ,MAAA,IAAU,KAAA,CAAA;AAAA,UAClB,OAAO,KAAA,IAAS,KAAA,CAAA;AAAA,UAChB,SAAA,EAAW,EAAA;AAAA,UACX,SAAA;AAAA,UACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,UAC5B,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe,MAAA;AAAA,UACf;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,KAAS,cAAA,IAAkB,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY;AAC1D,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,MAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,QACrB,SAAA,EAAW,QAAA;AAAA,QACX,QAAA,EAAU,MAAA;AAAA,QACV,QAAQ,IAAA,EAAM,MAAA;AAAA,QACd,OAAO,IAAA,EAAM,KAAA;AAAA,QACb,SAAA,EAAW,EAAA;AAAA,QACX,SAAA;AAAA,QACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,QAC5B,WAAA,EAAa,IAAA;AAAA,QACb,aAAA,EAAe,MAAA;AAAA,QACf;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAAA,EAClE;AACF;;;ACxTO,SAAS,yBAAA,GAAoC;AAClD,EAAA,MAAM,OAAA,GAAU1B,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ,EAAE,IAAA,EAAM,cAAA,EAAe;AAAA,IAC/B,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,iCAAiCqB,YAAAA,EAAiC;AAAA,IACjF,WAAA,EAAa,0CAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,uBAAuBE,UAAAA,EAA+B;AAAA,IACrE,WAAA,EAAa,8BAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,WAAA,CAAY,YAAY,+BAAA,EAAiC;AAAA,IAC/D,IAAA,EAAM,CAAA,2VAAA,CAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACR,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,OAAA,EAAS,OAAO,OAAA,KAAY;AAC1B,MAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,QAAA,EAAU,OAAO,OAAA,KAAY;AAC3B,MAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,UAAA,EAAY,OAAO,OAAA,KAAY;AAC7B,MAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,SAAA,EAAW,OAAO,OAAA,KAAY;AAC5B,MAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAAA,IAClD;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAEO,IAAM,sBAAsB,yBAAA,EAA0B;;;AC7CtD,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,MAAM,WAAA,GAA6B;AACjC,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAcrB,EAAE,GAAA,EAAI;AAGP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAAA,EAAiD;AAC5D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIpC,CAAA,CAAE,IAAA;AAAA,MACD,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,gBAAA;AAAA,MACL,IAAA,CAAK,oBAAA;AAAA,MACL,IAAA,CAAK,aAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,kBAAA;AAAA,MACL,IAAA,CAAK,gBAAA;AAAA,MACL,IAAA,CAAK,oBAAoB,CAAA,GAAI;AAAA,MAC7B,KAAA,EAAM;AAER,IAAA,OAAO,IAAA,CAAK,OAAO,MAAa,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAAA,EAAiD;AAC5D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAWpC,CAAA,CAAE,IAAA;AAAA,MACD,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,gBAAA;AAAA,MACL,IAAA,CAAK,oBAAA;AAAA,MACL,IAAA,CAAK,aAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,kBAAA;AAAA,MACL,IAAA,CAAK,gBAAA;AAAA,MACL,IAAA,CAAK,oBAAoB,CAAA,GAAI;AAAA,MAC7B,KAAA,EAAM;AAER,IAAA,OAAO,IAAA,CAAK,OAAO,MAAa,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CAAiB,oBAAA,EAA8B,IAAA,EAAiE;AACpH,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,MAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IACzB;AACA,IAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAW;AACpC,MAAA,IAAA,CAAK,KAAK,qBAAqB,CAAA;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,aAAa,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,IAAA,CAAK,uBAAuB,MAAA,EAAW;AACzC,MAAA,IAAA,CAAK,KAAK,0BAA0B,CAAA;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,kBAAkB,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,IAAA,CAAK,qBAAqB,MAAA,EAAW;AACvC,MAAA,IAAA,CAAK,KAAK,wBAAwB,CAAA;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,gBAAgB,CAAA;AAAA,IACnC;AACA,IAAA,IAAI,IAAA,CAAK,sBAAsB,MAAA,EAAW;AACxC,MAAA,IAAA,CAAK,KAAK,0BAA0B,CAAA;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,iBAAA,GAAoB,CAAA,GAAI,CAAC,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA,CAAK,0BAA0B,oBAAoB,CAAA;AAEjF,IAAA,IAAA,CAAK,KAAK,0BAA0B,CAAA;AACpC,IAAA,MAAA,CAAO,KAAK,oBAAoB,CAAA;AAEhC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA,+BAAA,EACR,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAAA,CAC3C,CAAA,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,KAAA,EAAM;AAEzB,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAa,CAAA,GAAI,IAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,oBAAA,EAA4D;AAC1F,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,oBAAoB,CAAA,CAAE,KAAA,EAAM;AACnC,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAa,CAAA,GAAI,IAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAA,EAA8C;AAC9D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,EAAM;AACrB,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAa,CAAA,GAAI,IAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,gBAAA,EAAwD;AAClF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,gBAAgB,CAAA,CAAE,KAAA,EAAM;AAC/B,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAa,CAAA,GAAI,IAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,gBAAA,EAAkD;AAChF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,gBAAgB,CAAA,CAAE,KAAA,EAAM;AAC/B,IAAA,OAAO,QAAQ,OAAA,IAAW,IAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,OAAA,GAA+B,EAAC,EAA8D;AACvG,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,MAAA,KAAA,CAAM,KAAK,wBAAwB,CAAA;AACnC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,gBAAgB,CAAA;AAAA,IACtC;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,GAAS,CAAA,GAAI,SAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AACxE,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,YAAA;AACjC,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,MAAA;AACvC,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,KAAA,IAAS,IAAI,GAAG,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAA,CAAU,OAAO,CAAA,IAAK,KAAA;AAG5B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAChC,+CAA+C,WAAW,CAAA;AAAA,KAC5D,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,KAAA,EAAM;AAGxB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC5B,CAAA,6FAAA,EAAgG,WAAW,CAAA,UAAA,EAAa,MAAM,IAAI,SAAS,CAAA,iBAAA;AAAA,MAC3I,IAAA,CAAK,GAAG,QAAQ,KAAA,EAAO,MAAM,EAAE,GAAA,EAAI;AAErC,IAAA,OAAO;AAAA,MACL,aAAA,EAAA,CAAgB,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MACrE,KAAA,EAAO,aAAa,KAAA,IAAS;AAAA,KAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAAuC;AAC3C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQpC,EAAE,KAAA,EAAM;AAET,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,QAAQ,KAAA,IAAS,CAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,CAAA;AAAA,MAC1B,QAAA,EAAU,QAAQ,QAAA,IAAY,CAAA;AAAA,MAC9B,OAAA,EAAS,QAAQ,QAAA,IAAY,CAAA;AAAA,MAC7B,QAAA,EAAU,QAAQ,QAAA,IAAY;AAAA,KAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,oBAAA,EAAgD;AACrE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,oBAAoB,CAAA,CAAE,GAAA,EAAI;AACjC,IAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,OAAA,IAAW,CAAA,IAAK,CAAA;AAAA,EACvC;AAAA,EAEQ,OAAO,GAAA,EAAwC;AACrD,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,kBAAkB,GAAA,CAAI,kBAAA;AAAA,MACtB,sBAAsB,GAAA,CAAI,sBAAA;AAAA,MAC1B,eAAe,GAAA,CAAI,eAAA;AAAA,MACnB,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,oBAAoB,GAAA,CAAI,oBAAA;AAAA,MACxB,kBAAkB,GAAA,CAAI,kBAAA;AAAA,MACtB,iBAAA,EAAmB,CAAC,CAAC,GAAA,CAAI,oBAAA;AAAA,MACzB,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI,UAAA;AAAA;AAAA,MAEf,GAAI,IAAI,UAAA,GAAa,EAAE,WAAW,GAAA,CAAI,UAAA,KAAe;AAAC,KACxD;AAAA,EACF;AACF,CAAA;;;AC5QO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA,EAErC,MAAM,WAAA,GAA6B;AACjC,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAYrB,EAAE,GAAA,EAAI;AAEP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,KAAA,EAQQ;AAChB,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAOrB,CAAA,CAAE,IAAA;AAAA,MACD,KAAA,CAAM,aAAA;AAAA,MACN,KAAA,CAAM,IAAA;AAAA,MACN,KAAA,CAAM,QAAA;AAAA,MACN,KAAA,CAAM,UAAA;AAAA,MACN,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,MACzB,KAAA,CAAM,MAAA;AAAA,MACN,MAAM,KAAA,IAAS;AAAA,MACf,GAAA,EAAI;AAAA,EACR;AAAA,EAEA,MAAM,IAAA,CAAK,OAAA,GAA8B,EAAC,EAA4D;AACpG,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,GAAS,CAAA,GAAI,SAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AACxE,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,KAAA,IAAS,IAAI,GAAG,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAA,CAAU,OAAO,CAAA,IAAK,KAAA;AAE5B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAChC,+CAA+C,WAAW,CAAA;AAAA,KAC5D,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,KAAA,EAAM;AAExB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC5B,+BAA+B,WAAW,CAAA,4CAAA;AAAA,MAC1C,IAAA,CAAK,GAAG,QAAQ,KAAA,EAAO,MAAM,EAAE,GAAA,EAAI;AAErC,IAAA,OAAO;AAAA,MACL,MAAA,EAAA,CAAS,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC9D,KAAA,EAAO,aAAa,KAAA,IAAS;AAAA,KAC/B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAAsC;AAC1C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAOpC,EAAE,KAAA,EAAM;AAET,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,QAAQ,KAAA,IAAS,CAAA;AAAA,MACxB,SAAA,EAAW,QAAQ,SAAA,IAAa,CAAA;AAAA,MAChC,MAAA,EAAQ,QAAQ,MAAA,IAAU,CAAA;AAAA,MAC1B,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,KAC9B;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,GAAsC;AAC1C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC5B;AAAA,MACA,GAAA,EAAI;AACN,IAAA,OAAA,CAAQ,OAAA,CAAQ,WAAW,EAAC,EAAG,IAAI,CAAC,CAAA,KAAW,EAAE,IAAI,CAAA;AAAA,EACvD;AAAA,EAEQ,OAAO,GAAA,EAA6C;AAC1D,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,eAAe,GAAA,CAAI,eAAA;AAAA,MACnB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,YAAY,GAAA,CAAI,WAAA;AAAA,MAChB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,KAAA,EAAO,IAAI,KAAA,IAAS;AAAA,KACtB;AAAA,EACF;AACF,CAAA;;;ACvIA7B,qDAAA,EAAA;;;ACGA,IAAM,IAAA,GAAO;AAAA,EACX,EAAE,KAAA,EAAO,eAAA,EAAiB,IAAA,EAAM,uBAAA,EAAwB;AAAA,EACxD,EAAE,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,8BAAA,EAA+B;AAAA,EACxD,EAAE,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,gCAAA;AAC7B,CAAA;AAEO,SAAS,mBAAmB,WAAA,EAA6B;AAC9D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO;AAC3B,IAAA,MAAM,WAAW,WAAA,KAAgB,GAAA,CAAI,QAC/B,GAAA,CAAI,IAAA,KAAS,2BAA2B,WAAA,KAAgB,wBAAA;AAC9D,IAAA,OAAO;AAAA,eAAA,EACM,IAAI,IAAI,CAAA;AAAA,eAAA,EACR,QAAA,GACL,kDACA,mJACJ,CAAA;AAAA,QAAA,EACE,IAAI,KAAK;AAAA,UAAA,CAAA;AAAA,EAEjB,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAEV,EAAA,OAAO;AAAA;AAAA;AAAA,QAAA,EAGC,IAAI;AAAA;AAAA;AAAA,EAAA,CAAA;AAId;;;ADlBO,SAAS,wBAAwB,IAAA,EAA8B;AACpE,EAAA,MAAM,EAAE,aAAA,EAAe,KAAA,EAAO,SAAS,IAAA,EAAM,OAAA,EAAS,kBAAiB,GAAI,IAAA;AAE3E,EAAA,MAAMkB,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAA,EAiBV,kBAAA,CAAmB,uBAAuB,CAAC;;AAAA;AAAA;AAAA,QAAA,EAIzC,SAAA,CAAU,OAAA,EAAS,KAAA,CAAM,KAAA,EAAO,+BAA+B,CAAC;AAAA,QAAA,EAChE,SAAA,CAAU,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,wCAAwC,CAAC;AAAA,QAAA,EAC3E,SAAA,CAAU,UAAA,EAAY,KAAA,CAAM,QAAA,EAAU,kCAAkC,CAAC;AAAA,QAAA,EACzE,SAAA,CAAU,UAAA,EAAY,KAAA,CAAM,OAAA,EAAS,oCAAoC,CAAC;AAAA,QAAA,EAC1E,SAAA,CAAU,UAAA,EAAY,KAAA,CAAM,QAAA,EAAU,gCAAgC,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EASnE,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EACtC,YAAA,CAAa,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EACxC,YAAA,CAAa,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EACxC,YAAA,CAAa,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EACxC,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EACtC,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAC;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAmBtC,aAAA,CAAc,MAAA,KAAW,CAAA,GACvB,qHAAA,GACA,aAAA,CAAc,IAAI,SAAS,CAAA,CAAE,IAAA,CAAK,EAAE,CACxC;AAAA;AAAA;;AAAA,QAAA,EAIFe,kBAAiB,OAAA,CAAQ,IAAA,EAAM,QAAQ,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAC;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAkC1E,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,sBAAA;AAAA,IACP,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,uBAAA;AAAA,IACb,IAAA;AAAA,IACA,OAAA,EAAAf,QAAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOhB,4CAA0B,UAAU,CAAA;AAC7C;AAEA,SAAS,SAAA,CAAU,KAAA,EAAe,KAAA,EAAe,UAAA,EAA4B;AAC3E,EAAA,OAAO;AAAA;AAAA,sEAAA,EAE+D,KAAK,CAAA;AAAA,wCAAA,EACnC,UAAU,KAAK,KAAK,CAAA;AAAA;AAAA,EAAA,CAAA;AAG9D;AAEA,SAAS,YAAA,CAAa,OAAe,OAAA,EAA0B;AAC7D,EAAA,MAAM,QAAA,GAAW,KAAA,KAAU,OAAA,GAAU,UAAA,GAAa,EAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA;AAC3E,EAAA,OAAO,CAAA,eAAA,EAAkB,KAAK,CAAA,EAAA,EAAK,QAAQ,IAAI,KAAK,CAAA,SAAA,CAAA;AACtD;AAEA,SAAS,YAAY,MAAA,EAAoC;AACvD,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,MAAA,EAAQ,8EAAA;AAAA,IACR,QAAA,EAAU,kEAAA;AAAA,IACV,QAAA,EAAU,sEAAA;AAAA,IACV,QAAA,EAAU,8DAAA;AAAA,IACV,MAAA,EAAQ,0EAAA;AAAA,IACR,MAAA,EAAQ,kEAAA;AAAA,IACR,UAAA,EAAY,kEAAA;AAAA,IACZ,kBAAA,EAAoB;AAAA,GACtB;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAA,IAAK,+CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AACrC,EAAA,OAAO,CAAA,mGAAA,EAAsG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,OAAA,CAAA;AAC9H;AAEA,SAAS,WAAW,SAAA,EAA2B;AAC7C,EAAA,IAAI,CAAC,WAAW,OAAO,GAAA;AACvB,EAAA,OAAO,IAAI,IAAA,CAAK,SAAA,GAAY,GAAI,CAAA,CAAE,mBAAmB,OAAA,EAAS;AAAA,IAC5D,KAAA,EAAO,OAAA;AAAA,IACP,GAAA,EAAK,SAAA;AAAA,IACL,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAEA,SAAS,UAAU,GAAA,EAAoD;AACrE,EAAA,OAAO;AAAA;AAAA;AAAA,uEAAA,EAGgE,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,MAAM,CAAA;AAAA,8DAAA,EACpC,IAAI,gBAAgB,CAAA;AAAA;AAAA,8CAAA,EAEpC,WAAA,CAAY,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,uFAAA,EACkB,IAAI,aAAa,CAAA;AAAA;AAAA,QAAA,EAEhG,UAAA,CAAW,IAAI,kBAAkB,CAAC,MAAM,UAAA,CAAW,GAAA,CAAI,gBAAgB,CAAC;AAAA;AAAA;AAAA,QAAA,EAGxE,GAAA,CAAI,iBAAA,GACF,yEAAA,GACA,0DACJ;AAAA;AAAA;AAAA,4DAAA,EAGsD,IAAI,oBAAoB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAQtF;AAEA,SAAS+B,iBAAAA,CAAiB,IAAA,EAAc,UAAA,EAAoB,MAAA,EAAyB;AACnF,EAAA,IAAI,UAAA,IAAc,GAAG,OAAO,EAAA;AAE5B,EAAA,MAAM,MAAA,GAAS,MAAA,GAAS,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA,GAAK,EAAA;AAC9C,EAAA,OAAO;AAAA;AAAA;AAAA,aAAA,EAGM,IAAI,OAAO,UAAU;AAAA;AAAA;AAAA,QAAA,EAG1B,IAAA,GAAO,IACL,CAAA,eAAA,EAAkB,IAAA,GAAO,CAAC,CAAA,EAAG,MAAM,oLACnC,EACJ;AAAA,QAAA,EACE,IAAA,GAAO,aACL,CAAA,eAAA,EAAkB,IAAA,GAAO,CAAC,CAAA,EAAG,MAAM,gLACnC,EACJ;AAAA;AAAA;AAAA,EAAA,CAAA;AAIR;;;AEzNAjC,qDAAA,EAAA;AAaO,SAAS,iBAAiB,IAAA,EAA8B;AAC7D,EAAA,MAAM,EAAE,QAAQ,KAAA,EAAO,KAAA,EAAO,SAAS,IAAA,EAAM,OAAA,EAAS,kBAAiB,GAAI,IAAA;AAE3E,EAAA,MAAMkB,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAA,EAWV,kBAAA,CAAmB,8BAA8B,CAAC;;AAAA;AAAA;AAAA,QAAA,EAIhD,cAAA,CAAe,cAAA,EAAgB,KAAA,CAAM,KAAA,EAAO,+BAA+B,CAAC;AAAA,QAAA,EAC5E,cAAA,CAAe,WAAA,EAAa,KAAA,CAAM,SAAA,EAAW,wCAAwC,CAAC;AAAA,QAAA,EACtF,cAAA,CAAe,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,gCAAgC,CAAC;AAAA,QAAA,EACxE,cAAA,CAAe,SAAA,EAAW,KAAA,CAAM,OAAA,EAAS,kCAAkC,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EASxE,MAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,eAAA,EAAkB,CAAC,KAAK,CAAA,KAAM,OAAA,CAAQ,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA,CAAA,EAAI,CAAC,WAAW,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA,YAAA,EAMrG,iBAAA,CAAkB,WAAA,EAAa,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EAC9C,iBAAA,CAAkB,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EAC3C,iBAAA,CAAkB,SAAA,EAAW,OAAA,CAAQ,MAAM,CAAC;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAkB5C,MAAA,CAAO,MAAA,KAAW,CAAA,GAChB,qHAAA,GACA,MAAA,CAAO,IAAI,cAAc,CAAA,CAAE,IAAA,CAAK,EAAE,CACtC;AAAA;AAAA;;AAAA,QAAA,EAIF,qBAAA,CAAsB,QAAQ,IAAA,EAAM,OAAA,CAAQ,YAAY,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAC;AAAA;AAAA;AAAA,EAAA,CAAA;AAK7F,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,eAAA;AAAA,IACP,SAAA,EAAW,eAAA;AAAA,IACX,WAAA,EAAa,uBAAA;AAAA,IACb,IAAA;AAAA,IACA,OAAA,EAAAA,QAAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOhB,4CAA0B,UAAU,CAAA;AAC7C;AAEA,SAAS,cAAA,CAAe,KAAA,EAAe,KAAA,EAAe,UAAA,EAA4B;AAChF,EAAA,OAAO;AAAA;AAAA,sEAAA,EAE+D,KAAK,CAAA;AAAA,wCAAA,EACnC,UAAU,KAAK,KAAK,CAAA;AAAA;AAAA,EAAA,CAAA;AAG9D;AAEA,SAAS,iBAAA,CAAkB,OAAe,OAAA,EAA0B;AAClE,EAAA,MAAM,QAAA,GAAW,KAAA,KAAU,OAAA,GAAU,UAAA,GAAa,EAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC3D,EAAA,OAAO,CAAA,eAAA,EAAkB,KAAK,CAAA,EAAA,EAAK,QAAQ,IAAI,KAAK,CAAA,SAAA,CAAA;AACtD;AAEA,SAAS,iBAAiB,MAAA,EAAwB;AAChD,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,SAAA,EAAW,8EAAA;AAAA,IACX,MAAA,EAAQ,8DAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAA,IAAK,+CAAA;AAChC,EAAA,OAAO,CAAA,mGAAA,EAAsG,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,OAAA,CAAA;AAC/H;AAEA,SAASsB,iBAAgB,SAAA,EAA2B;AAClD,EAAA,IAAI,CAAC,WAAW,OAAO,GAAA;AACvB,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,SAAA,GAAY,GAAI,CAAA;AACnC,EAAA,OAAO,CAAA,CAAE,eAAe,OAAA,EAAS;AAAA,IAC/B,KAAA,EAAO,OAAA;AAAA,IAAS,GAAA,EAAK,SAAA;AAAA,IAAW,IAAA,EAAM,SAAA;AAAA,IACtC,IAAA,EAAM,SAAA;AAAA,IAAW,MAAA,EAAQ,SAAA;AAAA,IAAW,MAAA,EAAQ;AAAA,GAC7C,CAAA;AACH;AAEA,SAAS,gBAAgB,KAAA,EAA+D;AACtF,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,IAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,IAAA,EAAM,QAAA,EAAU,eAAA,IAAmB,IAAA,EAAM,eAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,cAAA,IAAkB,IAAA,EAAM,iBAAiB,IAAA,EAAM,aAAA;AACnE,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,IAAU,KAAA,CAAA,EAAW,KAAA,EAAO,SAAS,KAAA,CAAA,EAAU;AAAA,EAClE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,eAAe,KAAA,EAAkC;AACxD,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,GAAQ,CAAA,QAAA,EAAW,KAAA,CAAM,MAAM,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACvF,EAAA,MAAM,QAAA,GAAW,gBAAgB,KAAK,CAAA;AACtC,EAAA,MAAM,WAAW,QAAA,CAAS,MAAA,GACtB,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,mEAAA,EAAsE,QAAA,CAAS,KAAA,IAAS,QAAA,CAAS,MAAM,CAAA,IAAA,CAAA,GAC/I,QAAA,CAAS,QACP,CAAA,uDAAA,EAA0D,QAAA,CAAS,KAAK,CAAA,OAAA,CAAA,GACxE,EAAA;AAEN,EAAA,OAAO;AAAA,qEAAA,EAC8D,YAAY,CAAA;AAAA;AAAA,QAAA,EAEzEA,gBAAAA,CAAgB,KAAA,CAAM,WAAW,CAAC;AAAA;AAAA;AAAA,sEAAA,EAG4B,MAAM,IAAI,CAAA;AAAA;AAAA;AAAA,wEAAA,EAGR,KAAA,CAAM,YAAY,GAAG,CAAA;AAAA,8DAAA,EAC/B,MAAM,UAAU,CAAA;AAAA,QAAA,EACtE,QAAA,GAAW,CAAA,kBAAA,EAAqB,QAAQ,CAAA,MAAA,CAAA,GAAW,EAAE;AAAA;AAAA,8CAAA,EAEf,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,iGAAA,EACqB,MAAM,aAAa,CAAA;AAAA;AAAA,EAAA,CAAA;AAGtH;AAEA,SAAS,qBAAA,CAAsB,IAAA,EAAc,UAAA,EAAoB,IAAA,EAAe,MAAA,EAAyB;AACvG,EAAA,IAAI,UAAA,IAAc,GAAG,OAAO,EAAA;AAE5B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACpC,EAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,GAAS,CAAA,GAAI,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,GAAK,EAAA;AAE3D,EAAA,OAAO;AAAA;AAAA;AAAA,aAAA,EAGM,IAAI,OAAO,UAAU;AAAA;AAAA;AAAA,QAAA,EAG1B,IAAA,GAAO,IACL,CAAA,eAAA,EAAkB,IAAA,GAAO,CAAC,CAAA,EAAG,KAAK,oLAClC,EACJ;AAAA,QAAA,EACE,IAAA,GAAO,aACL,CAAA,eAAA,EAAkB,IAAA,GAAO,CAAC,CAAA,EAAG,KAAK,gLAClC,EACJ;AAAA;AAAA;AAAA,EAAA,CAAA;AAIR;;;AC/HO,IAAMD,iBAAAA,GAAyC;AAAA,EACpD,oBAAA,EAAsB,EAAA;AAAA,EACtB,eAAA,EAAiB,EAAA;AAAA,EACjB,mBAAA,EAAqB,EAAA;AAAA,EACrB,aAAA,EAAe,EAAA;AAAA,EACf,UAAA,EAAY,kBAAA;AAAA,EACZ,SAAA,EAAW;AACb,CAAA;;;AC7DA,IAAMI,YAAAA,GAAc,IAAIvB,SAAAA,EAAmD;AAE3EuB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAKtB,6BAAA,EAAa,CAAA;AAGlCsB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAA,KAAS;AACtC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,GAAG,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,IAAA,EAAK;AACd,CAAC,CAAA;AAED,eAAeG,aAAY,EAAA,EAAwC;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,IAAIF,+BAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAMrB,OAAAA,GAAS,MAAM,aAAA,CAAc,SAAA,CAAU,QAAQ,CAAA;AACrD,IAAA,IAAIA,SAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QAAA,GAAW,OAAOA,OAAAA,CAAO,QAAA,KAAa,QAAA,GAAW,KAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA,GAAIA,OAAAA,CAAO,QAAA;AAC5F,MAAA,OAAO,EAAE,GAAGgB,iBAAAA,EAAkB,GAAG,QAAA,EAAS;AAAA,IAC5C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAe;AACvB,EAAA,OAAOA,iBAAAA;AACT;AAGAI,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAChC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAEtC,EAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,EAAA;AACd,EAAA,MAAM,YAAA,GAAe,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AAEzC,EAAA,MAAM,CAAC,EAAE,aAAA,EAAe,KAAA,IAAS,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IAC1D,oBAAoB,IAAA,CAAK,EAAE,QAAQ,YAAA,EAAc,IAAA,EAAM,OAAO,CAAA;AAAA,IAC9D,oBAAoB,QAAA;AAAS,GAC9B,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAA;AAE1C,EAAA,MAAM,OAAO,uBAAA,CAAwB;AAAA,IACnC,aAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS,EAAE,MAAA,EAAQ,YAAA,EAAc,MAAM,UAAA,EAAW;AAAA,IAClD,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC1C,CAAA;AAED,EAAA,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AACpB,CAAC,CAAA;AAGDA,YAAAA,CAAY,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAM;AACtC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,YAAA,GAAe,IAAI,kBAAA,CAAmB,EAAE,CAAA;AAC9C,EAAA,MAAM,aAAa,WAAA,EAAY;AAE/B,EAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,EAAA;AACd,EAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA;AAC1C,EAAA,MAAM,YAAA,GAAe,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AAEzC,EAAA,MAAM,CAAC,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG,OAAO,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IAC1D,YAAA,CAAa,KAAK,EAAE,IAAA,EAAM,YAAY,MAAA,EAAQ,YAAA,EAAc,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,IACzE,aAAa,QAAA,EAAS;AAAA,IACtB,aAAa,gBAAA;AAAiB,GAC/B,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAA;AAE1C,EAAA,MAAM,OAAO,gBAAA,CAAiB;AAAA,IAC5B,MAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAS,EAAE,IAAA,EAAM,YAAY,MAAA,EAAQ,YAAA,EAAc,MAAM,UAAA,EAAW;AAAA,IACpE,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC1C,CAAA;AAED,EAAA,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AACpB,CAAC,CAAA;AAGDA,YAAAA,CAAY,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AACxC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,MAAMG,YAAAA,CAAY,EAAE,CAAA;AAErC,EAAA,MAAM,EAAE,yBAAA,EAAA5B,0BAAAA,EAA0B,GAAI,MAAM,OAAO,+CAA8D,CAAA;AAEjH,EAAA,MAAMgB,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAA,EASV,kBAAA,CAAmB,gCAAgC,CAAC;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,kEAAA,EAQQ,SAAS,oBAAoB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,iEAAA,EAQ9B,SAAS,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,qEAAA,EAQpB,SAAS,mBAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,2DAAA,EAQtC,QAAA,CAAS,iBAAiB,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,wDAAA,EAQ/B,SAAS,UAAU,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,uDAAA,EAOpB,SAAS,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAwCzE,EAAA,OAAO,CAAA,CAAE,KAAKhB,0BAAAA,CAA0B;AAAA,IACtC,KAAA,EAAO,iBAAA;AAAA,IACP,SAAA,EAAW,iBAAA;AAAA,IACX,WAAA,EAAa,uBAAA;AAAA,IACb,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAAgB,QAAAA;AAAA,IACA,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC1C,CAAC,CAAA;AACJ,CAAC,CAAA;AAGDS,YAAAA,CAAY,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA,KAAM;AACzC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAEjB,IAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKhB,EAAE,IAAA,CAAK,IAAA,CAAK,UAAU,IAAI,CAAC,EAAE,GAAA,EAAI;AAElC,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EACjC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACpD,IAAA,OAAO,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,OAAO,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,EACzE;AACF,CAAC,CAAA;;;ACpOM,IAAM,YAAN,MAAgB;AAAA,EAGrB,YAAoB,SAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAoB;AAAA,EAFhC,OAAA,GAAU,2BAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlB,MAAM,sBAAA,CAAuB,OAAA,EAAiB,SAAA,EAAmB,MAAA,EAAkC;AACjG,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AACjC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAC,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AACnE,IAAA,MAAM,UAAA,GAAa,KAAA,CAChB,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,UAAA,CAAW,KAAK,CAAC,CAAA,CAC/B,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,CAAA;AAE1B,IAAA,IAAI,CAAC,SAAA,IAAa,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,KAAA;AAGlD,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,IAAI,GAAA,GAAM,QAAA,CAAS,SAAS,CAAC,CAAA,GAAI,KAAK,OAAO,KAAA;AAGtD,IAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,MAC9B,KAAA;AAAA,MACA,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,MACrB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,MAChC,KAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AACA,IAAA,MAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAC,CAAA;AAC3F,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,IAAI,WAAW,eAAe,CAAC,EACjE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CACxC,KAAK,EAAE,CAAA;AAEV,IAAA,OAAO,WAAW,IAAA,CAAK,CAAA,GAAA,KAAO,eAAA,CAAgB,GAAA,EAAK,iBAAiB,CAAC,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,MAAA,EAOa;AACvC,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,cAAc,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,CAAO,sBAAA,EAAwB,MAAA,CAAO,OAAO,CAAA;AAClD,IAAA,IAAA,CAAK,MAAA,CAAO,2BAA2B,GAAG,CAAA;AAC1C,IAAA,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,UAAU,CAAA;AAC5C,IAAA,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,SAAS,CAAA;AAE1C,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,UAAU,CAAA;AAAA,IAC3C,CAAA,MAAA,IAAW,OAAO,aAAA,EAAe;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB,MAAA,CAAO,aAAa,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC1D,QAAA,IAAA,CAAK,MAAA,CAAO,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,sBAAsB,IAAI,CAAA;AACtE,IAAA,OAAO,EAAE,EAAA,EAAI,QAAA,CAAS,EAAA,EAAI,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,cAAA,EAAsC;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAA,eAAA,EAAkB,cAAc,CAAA,CAAE,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,MAAA,EAAuF;AAC1G,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AACjC,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC1D,QAAA,IAAA,CAAK,MAAA,CAAO,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MACvC;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,YAAA,EAAc,IAAI,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,MAAA,EAIwB;AAC9C,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,IAAA,EAAA,CAAG,OAAO,OAAA,EAAS,MAAA,CAAO,MAAA,EAAQ,KAAA,IAAS,GAAG,CAAC,CAAA;AAC/C,IAAA,IAAI,QAAQ,MAAA,EAAQ,EAAA,CAAG,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AACrD,IAAA,IAAI,QAAQ,aAAA,EAAe,EAAA,CAAG,MAAA,CAAO,gBAAA,EAAkB,OAAO,aAAa,CAAA;AAC3E,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,EAAO,kBAAkB,EAAA,CAAG,QAAA,EAAU,CAAA,CAAE,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAAuC;AAC3C,IAAA,MAAM,MAAa,EAAC;AACpB,IAAA,IAAI,aAAA;AAEJ,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,iBAAA,CAAkB,EAAE,KAAA,EAAO,GAAA,EAAK,eAAe,CAAA;AACzE,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,MAAA,CAAO,IAAI,CAAA;AACvB,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AAClD,MAAA,aAAA,GAAgB,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,EAAA;AAAA,IACtD;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,KAAA,EAA+C;AACvE,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,CAAG,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,SAAS,GAAG,CAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,kBAAA,EAAqB,MAAA,CAAO,QAAA,EAAU,CAAA,CAAE,CAAA;AACjF,IAAA,OAAO,MAAA,CAAO,IAAA,GAAO,CAAC,CAAA,IAAK,IAAA;AAAA,EAC7B;AAAA,EAEA,MAAc,OAAA,CAAQ,MAAA,EAAgB,IAAA,EAAc,IAAA,EAAsC;AACxF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,GAAI,OAAO,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA;AACnE,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,QACzC,GAAI,IAAA,GAAO,EAAE,cAAA,EAAgB,mCAAA,KAAwC;AAAC,OACxE;AAAA,MACA,GAAI,OAAO,EAAE,IAAA,EAAM,KAAK,QAAA,EAAS,KAAM;AAAC,KACzC,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,OAAO,OAAA,IAAW,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAKA,SAAS,eAAA,CAAgB,GAAW,CAAA,EAAoB;AACtD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAA,IAAU,EAAE,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAA,KAAW,CAAA;AACpB;;;AC1JA,IAAME,UAAAA,GAAY,IAAIzB,SAAAA,EAAmD;AAMzE,eAAe0B,aAAY,EAAA,EAAwC;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,IAAIF,+BAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAMrB,OAAAA,GAAS,MAAM,aAAA,CAAc,SAAA,CAAU,QAAQ,CAAA;AACrD,IAAA,IAAIA,SAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QAAA,GAAW,OAAOA,OAAAA,CAAO,QAAA,KAAa,QAAA,GAAW,KAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA,GAAIA,OAAAA,CAAO,QAAA;AAC5F,MAAA,OAAO,EAAE,GAAGgB,iBAAAA,EAAkB,GAAG,QAAA,EAAS;AAAA,IAC5C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAe;AACvB,EAAA,OAAOA,iBAAAA;AACT;AAEA,SAAS,gBAAgB,MAAA,EAAoC;AAC3D,EAAA,MAAM,GAAA,GAA0C;AAAA,IAC9C,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAQ,QAAA;AAAA,IACR,UAAA,EAAY,YAAA;AAAA,IACZ,kBAAA,EAAoB;AAAA,GACtB;AACA,EAAA,OAAO,GAAA,CAAI,MAAM,CAAA,IAAK,YAAA;AACxB;AAMAM,UAAAA,CAAU,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,KAAM;AACtC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AAErC,EAAA,IAAI,CAAC,SAAS,mBAAA,EAAqB;AACjC,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,+BAAA,IAAmC,GAAG,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,OAAA,GAAU,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AACjC,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,CAAA,IAAK,EAAA;AAEtD,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA;AACxD,EAAA,MAAM,UAAU,MAAM,SAAA,CAAU,uBAAuB,OAAA,EAAS,SAAA,EAAW,SAAS,mBAAmB,CAAA;AAEvG,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,KAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC7C,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,IAAI,kBAAA,CAAmB,EAAE,CAAA;AAC9C,EAAA,MAAM,OAAA,CAAQ,IAAI,CAAC,mBAAA,CAAoB,aAAY,EAAG,YAAA,CAAa,WAAA,EAAa,CAAC,CAAA;AAGjF,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA;AACvB,EAAA,MAAM,QAAA,GAAW,KAAK,EAAA,IAAM,EAAA;AAC5B,EAAA,MAAM,UAAA,GAAa,KAAK,MAAA,IAAU,KAAA,CAAM,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAE9D,EAAA,IAAI;AACF,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,+BAAA,EAAiC;AACpC,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA;AACvB,QAAA,MAAM,MAAA,GAAS,IAAI,QAAA,EAAU,eAAA,IAAmB,MAAM,mBAAA,CAAoB,yBAAA,CAA0B,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAA;AAErH,QAAA,MAAM,oBAAoB,MAAA,CAAO;AAAA,UAC/B,MAAA;AAAA,UACA,kBAAkB,GAAA,CAAI,QAAA;AAAA,UACtB,sBAAsB,GAAA,CAAI,EAAA;AAAA,UAC1B,eAAe,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,EAAA,IAAM,EAAA;AAAA,UAC9C,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAAA,UAClC,oBAAoB,GAAA,CAAI,oBAAA;AAAA,UACxB,kBAAkB,GAAA,CAAI,kBAAA;AAAA,UACtB,mBAAmB,GAAA,CAAI;AAAA,SACxB,CAAA;AAED,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,GAAA,CAAI,EAAE,CAAA,CAAE,CAAA;AACtD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,+BAAA,EAAiC;AACpC,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA;AACvB,QAAA,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,GAAA,CAAI,EAAA,EAAI;AAAA,UACjD,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAAA,UAClC,eAAe,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,EAAA,IAAM,KAAA,CAAA;AAAA,UAC9C,oBAAoB,GAAA,CAAI,oBAAA;AAAA,UACxB,kBAAkB,GAAA,CAAI,kBAAA;AAAA,UACtB,mBAAmB,GAAA,CAAI;AAAA,SACxB,CAAA;AAED,QAAA,OAAA,CAAQ,IAAI,CAAA,+BAAA,EAAkC,GAAA,CAAI,EAAE,CAAA,IAAA,EAAO,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACvE,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,+BAAA,EAAiC;AACpC,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA;AACvB,QAAA,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,GAAA,CAAI,EAAA,EAAI;AAAA,UACjD,MAAA,EAAQ;AAAA,SACT,CAAA;AAED,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,GAAA,CAAI,EAAE,CAAA,CAAE,CAAA;AACtD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,4BAAA,EAA8B;AACjC,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA;AAC3B,QAAA,MAAM,MAAA,GAAS,QAAQ,QAAA,EAAU,eAAA;AAEjC,QAAA,IAAI,MAAA,IAAU,QAAQ,YAAA,EAAc;AAClC,UAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,yBAAA,CAA0B,QAAQ,YAAY,CAAA;AACzF,UAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,MAAA,EAAQ;AAChC,YAAA,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,OAAA,CAAQ,YAAA,EAAc;AAAA,cAC/D;AAAA,aACM,CAAA;AAAA,UACV;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,OAAA,CAAQ,EAAE,CAAA,CAAE,CAAA;AACxD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,2BAAA,EAA6B;AAChC,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA;AAC3B,QAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,UAAA,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,OAAA,CAAQ,YAAA,EAAc;AAAA,YAC/D,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wCAAA,EAA2C,OAAA,CAAQ,EAAE,CAAA,CAAE,CAAA;AACnE,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,wBAAA,EAA0B;AAC7B,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA;AAC3B,QAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,UAAA,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,OAAA,CAAQ,YAAA,EAAc;AAAA,YAC/D,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,OAAA,CAAQ,EAAE,CAAA,CAAE,CAAA;AAChE,QAAA;AAAA,MACF;AAAA,MAEA;AACE,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC1D,QAAA,MAAM,aAAa,GAAA,CAAI;AAAA,UACrB,eAAe,KAAA,CAAM,EAAA;AAAA,UACrB,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,EAAM,MAAM,IAAA,CAAK,MAAA;AAAA,UACjB,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA;AAIpC,IAAA,MAAM,aAAa,GAAA,CAAI;AAAA,MACrB,eAAe,KAAA,CAAM,EAAA;AAAA,MACrB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,QAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA,EAAM,MAAM,IAAA,CAAK,MAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AAEd,IAAA,MAAM,aAAa,GAAA,CAAI;AAAA,MACrB,eAAe,KAAA,CAAM,EAAA;AAAA,MACrB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,QAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA,EAAM,MAAM,IAAA,CAAK,MAAA;AAAA,MACjB,MAAA,EAAQ,QAAA;AAAA,MACR,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,KAC7D,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEjB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wCAAA,EAA2C,KAAA,CAAM,IAAI,KAAK,KAAK,CAAA;AAC7E,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,2BAAA,IAA+B,GAAG,CAAA;AAAA,EAC3D;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,QAAA,EAAU,MAAM,CAAA;AAClC,CAAC,CAAA;AAODD,UAAAA,CAAU,IAAA,CAAK,0BAAA,EAA4BxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AACrE,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,MAAM,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,GAAG,CAAA;AAEvD,EAAA,MAAM,QAAA,GAAW,MAAMyB,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,eAAA,EAAiB;AAC7B,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,uBAAA,IAA2B,GAAG,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,QAAA,CAAS,aAAA;AACzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,uBAAA,IAA2B,GAAG,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA;AACxD,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAGtC,EAAA,MAAM,WAAA,GAAc,MAAM,mBAAA,CAAoB,WAAA,CAAY,KAAK,MAAM,CAAA;AACrE,EAAA,IAAI,aAAa,WAAA,EAAa,gBAAA;AAE9B,EAAA,IAAI,CAAC,UAAA,EAAY;AAEf,IAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,mBAAA,CAAoB,KAAK,KAAK,CAAA;AAC/D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,GAAa,QAAA,CAAS,EAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,cAAA,CAAe;AAAA,QAC9C,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAA,EAAU,EAAE,eAAA,EAAiB,IAAA,CAAK,MAAA;AAAO,OAC1C,CAAA;AACD,MAAA,UAAA,GAAa,QAAA,CAAS,EAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,MAAA;AAClC,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,qBAAA,CAAsB;AAAA,IACpD,OAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA,EAAY,CAAA,EAAG,MAAM,CAAA,EAAG,SAAS,UAAU,CAAA,iCAAA,CAAA;AAAA,IAC3C,SAAA,EAAW,CAAA,EAAG,MAAM,CAAA,EAAG,SAAS,SAAS,CAAA,CAAA;AAAA,IACzC,QAAA,EAAU,EAAE,eAAA,EAAiB,IAAA,CAAK,MAAA;AAAO,GAC1C,CAAA;AAED,EAAA,OAAO,CAAA,CAAE,KAAK,EAAE,SAAA,EAAW,QAAQ,EAAA,EAAI,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,CAAA;AAC3D,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,eAAA,EAAiBxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AACzD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,MAAM,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,GAAG,CAAA;AAEvD,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAEtC,EAAA,MAAM,YAAA,GAAe,MAAM,mBAAA,CAAoB,WAAA,CAAY,KAAK,MAAM,CAAA;AACtE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,YAAA,EAAc,MAAM,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,YAAA,EAAc,CAAA;AAChC,CAAC,CAAA;AAODwB,UAAAA,CAAU,GAAA,CAAI,gBAAA,EAAkBxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AAC1D,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,IAAA,KAAS,OAAA,EAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,eAAA,EAAgB,EAAG,GAAG,CAAA;AAEzE,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAEtC,EAAA,MAAM,OAAA,GAA+B;AAAA,IACnC,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AAAA,IAC5B,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAE,CAAA,GAAI,CAAA;AAAA,IAC7D,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,EAAA;AAAA,IAChE,MAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAa,YAAA;AAAA,IAC1C,SAAA,EAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,IAAa;AAAA,GAClD;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAA;AACrD,EAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AACtB,CAAC,CAAA;AAGDwB,UAAAA,CAAU,GAAA,CAAI,QAAA,EAAUxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AAClD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,IAAA,KAAS,OAAA,EAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,eAAA,EAAgB,EAAG,GAAG,CAAA;AAEzE,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAEtC,EAAA,MAAM,KAAA,GAAQ,MAAM,mBAAA,CAAoB,QAAA,EAAS;AACjD,EAAA,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AACrB,CAAC,CAAA;AAMDwB,UAAAA,CAAU,IAAA,CAAK,qBAAA,EAAuBxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AAChE,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,IAAA,KAAS,OAAA,EAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,eAAA,EAAgB,EAAG,GAAG,CAAA;AAEzE,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMyB,YAAAA,CAAY,EAAE,CAAA;AAErC,EAAA,IAAI,CAAC,SAAS,eAAA,EAAiB;AAC7B,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kCAAA,IAAsC,GAAG,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA;AACxD,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAEtC,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,oBAAA,EAAqB;AACrD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAI,QAAA,EAAU,eAAA,IAAmB,MAAM,mBAAA,CAAoB,yBAAA,CAA0B,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAA;AACrH,QAAA,MAAM,oBAAoB,MAAA,CAAO;AAAA,UAC/B,MAAA;AAAA,UACA,gBAAA,EAAkB,OAAO,GAAA,CAAI,QAAA,KAAa,WAAW,GAAA,CAAI,QAAA,GAAW,IAAI,QAAA,CAAS,EAAA;AAAA,UACjF,sBAAsB,GAAA,CAAI,EAAA;AAAA,UAC1B,eAAe,GAAA,CAAI,KAAA,EAAO,OAAO,CAAC,CAAA,EAAG,OAAO,EAAA,IAAM,EAAA;AAAA,UAClD,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAAA,UAClC,oBAAoB,GAAA,CAAI,oBAAA;AAAA,UACxB,kBAAkB,GAAA,CAAI,kBAAA;AAAA,UACtB,mBAAmB,GAAA,CAAI;AAAA,SACxB,CAAA;AACD,QAAA,MAAA,EAAA;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4CAAA,EAA+C,GAAA,CAAI,EAAE,KAAK,GAAG,CAAA;AAC3E,QAAA,MAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAO,OAAA,CAAQ,MAAA;AAAA,MACf,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAC/C,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAMDD,UAAAA,CAAU,GAAA,CAAI,SAAA,EAAWxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AACnD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,IAAA,KAAS,OAAA,EAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,eAAA,EAAgB,EAAG,GAAG,CAAA;AAEzE,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,YAAA,GAAe,IAAI,kBAAA,CAAmB,EAAE,CAAA;AAC9C,EAAA,MAAM,aAAa,WAAA,EAAY;AAE/B,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA;AAAA,IAC7B,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAY,MAAA;AAAA,IACxC,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,IAAK,MAAA;AAAA,IACrC,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAE,CAAA,GAAI,CAAA;AAAA,IAC7D,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI;AAAA,GAClE;AAEA,EAAA,MAAM,CAAC,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC/C,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,IACzB,aAAa,QAAA,EAAS;AAAA,IACtB,aAAa,gBAAA;AAAiB,GAC/B,CAAA;AAED,EAAA,OAAO,EAAE,IAAA,CAAK,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAC3C,CAAC,CAAA;;;AC/YM,SAAS,kBAAA,GAA6B;AAC3C,EAAA,MAAM,OAAA,GAAUC,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ,EAAE,IAAA,EAAM,cAAA,EAAe;AAAA,IAC/B,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,yBAAyBqB,YAAAA,EAA0B;AAAA,IAClE,WAAA,EAAa,sCAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,eAAeE,UAAAA,EAAwB;AAAA,IACtD,WAAA,EAAa,wDAAA;AAAA,IACb,YAAA,EAAc,KAAA;AAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,WAAA,CAAY,UAAU,uBAAA,EAAyB;AAAA,IACrD,IAAA,EAAM,CAAA,mPAAA,CAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACR,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,SAAS,YAAY;AACnB,MAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,UAAU,YAAY;AACpB,MAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,WAAW,YAAY;AACrB,MAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAEO,IAAM,eAAe,kBAAA,EAAmB;;;ACjD/C,IAAM,qBAAA,GAAwB,MAAA,CAAO,MAAA,CAAOK,iCAAe,CAAA,CACxD,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,KAAc,IAAI,CAAA,CAChC,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,EACT,UAAU,CAAA,CAAE,QAAA;AAAA,EACZ,KAAA,EAAO,EAAE,SAAA,CAAW,KAAA;AAAA,EACpB,IAAA,EAAM,EAAE,SAAA,CAAW,IAAA;AAAA,EACnB,IAAA,EAAM,EAAE,SAAA,CAAW,IAAA;AAAA,EACnB,KAAA,EAAO,EAAE,SAAA,CAAW;AACtB,CAAA,CAAE,CAAA;AAGJ,IAAM,QAAA,GAAmC;AAAA,EACvC,kBAAA,EAAoB,4OAAA;AAAA,EACpB,WAAA,EAAa,+lBAAA;AAAA,EACb,OAAA,EAAS,sdAAA;AAAA,EACT,SAAA,EAAW,sjBAAA;AAAA,EACX,UAAA,EAAY,6ZAAA;AAAA,EACZ,aAAA,EAAe,yaAAA;AAAA,EACf,KAAA,EAAO,8WAAA;AAAA,EACP,aAAA,EAAe,kMAAA;AAAA,EACf,cAAA,EAAgB,6VAAA;AAAA,EAChB,aAAA,EAAe;AACjB,CAAA;AAEA,SAAS,YAAY,QAAA,EAA2B;AAC9C,EAAA,IAAI,CAAC,UAAU,OAAO,EAAA;AAEtB,EAAA,IAAI,QAAA,CAAS,WAAW,MAAM,CAAA,IAAK,SAAS,UAAA,CAAW,GAAG,GAAG,OAAO,QAAA;AAEpE,EAAA,OAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,EAAA;AAC/B;AAEA,IAAM,MAAA,GAAS,8BAAA;AAEf,SAAS,cAAA,CAAe,MAAsD,WAAA,EAA6B;AACzG,EAAA,MAAM,WAAW,WAAA,KAAgB,IAAA,CAAK,QAAQ,WAAA,CAAY,UAAA,CAAW,KAAK,IAAI,CAAA;AAC9E,EAAA,MAAM,YAAA,GAAe,CAAA,uLAAA,CAAA;AACrB,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,IAAK,YAAA;AAC/C,EAAA,OAAO;AAAA;AAAA,MAAA,EAED,QAAA,GAAW,qGAAqG,EAAE;AAAA;AAAA,cAAA,EAE1G,KAAK,IAAI,CAAA;AAAA,qGAAA,EAEf,QAAA,GACI,kCACA,yEACN,CAAA;AAAA,QAAA,EACE,QAAA,GAAW,wBAAwB,EAAE;AAAA;AAAA,8BAAA,EAEf,QAAA,GAAW,kCAAkC,kCAAkC,CAAA;AAAA,UAAA,EACnG,YAAY;AAAA;AAAA,+BAAA,EAES,KAAK,KAAK,CAAA;AAAA;AAAA,WAAA,CAAA;AAG3C;AAEO,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAO,OAAO,GAA0D,IAAA,KAAe;AACrF,IAAA,MAAM,OAAO,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAGA,IAAA,IAAI,kBAAwF,EAAC;AAC7F,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,eAAA,GAAkB,qBAAA,CAAsB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AACjE,MAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,QAAA,MAAM,eAAe,eAAA,CAAgB,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAC5D,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,OAAA;AAAA,UACtB,2CAA2C,YAAY,CAAA,uBAAA;AAAA,SACzD,CAAE,IAAA,CAAK,GAAG,eAAe,EAAE,GAAA,EAAI;AAE/B,QAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAA,CAAK,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,IAAI,CAAC,CAAA;AAE1E,QAAA,KAAA,MAAW3B,WAAU,qBAAA,EAAuB;AAC1C,UAAA,IAAI,WAAA,CAAY,GAAA,CAAIA,OAAAA,CAAO,QAAQ,CAAA,EAAG;AACpC,YAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,cACnB,OAAOA,OAAAA,CAAO,KAAA;AAAA,cACd,MAAMA,OAAAA,CAAO,IAAA;AAAA,cACb,MAAMA,OAAAA,CAAO,IAAA;AAAA,cACb,OAAOA,OAAAA,CAAO;AAAA,aACf,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,eAAA,CAAgB,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAAA,MAClD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,CAAA,CAAE,IAAI,iBAAA,EAAmB,eAAA,CAAgB,IAAI,CAAA,CAAA,MAAM,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,MAAM,CAAA,CAAE,IAAA,EAAM,MAAM,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA,IAAK,EAAA,GAAK,CAAC,CAAA;AAEtH,IAAA,MAAM,IAAA,EAAK;AAGX,IAAA,IAAI,eAAA,CAAgB,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,EAAG,QAAA,CAAS,WAAW,CAAA,EAAG;AAC1F,MAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AACrB,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,CAAA,CAAE,IAAI,OAAO,CAAA;AACzC,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAE9B,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACzB,QAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,GAAA,CAAI,CAAA,IAAA,KAAQ,cAAA,CAAe,MAAM,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACrF,QAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,CAAE,KAAK,aAAa,CAAA;AACrD,QAAA,CAAA,CAAE,MAAM,IAAI,QAAA,CAAS,SAAS,EAAE,MAAA,EAAQ,SAAS,CAAA;AAAA,MACnD,CAAA,MAAO;AAEL,QAAA,CAAA,CAAE,MAAM,IAAI,QAAA,CAAS,MAAM,EAAE,MAAA,EAAQ,SAAS,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF,CAAA;AACF;;;AC8QO,IAAM4B,MAAAA,GAAQ;AAAA,EAIL;AAAA,EAGd,aAAA,EAAe,eAAA;AAAA,EACf,WAAA,EAAa,aAAA;AAAA,EAOb,UAAA,EAAY,YA4Bd,CAAA;AClbAnC,qDAAA,EAAA;AAGA,IAAM2B,YAAAA,GAAc,IAAIvB,SAAAA,EAAmD;AAE3EuB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAKtB,6BAAA,EAAa,CAAA;AAElCsB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAA,KAAS;AACtC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,GAAG,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,IAAA,EAAK;AACd,CAAC,CAAA;AAGDA,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAChC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,WAAmD,EAAC;AACxD,EAAA,IAAI,iBAAoH,EAAC;AAEzH,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,MAAM,SAAS,GAAA,GAAM,KAAA;AAErB,IAAA,MAAM,CAAC,cAAA,EAAgB,SAAA,EAAW,cAAA,EAAgB,YAAA,EAAc,aAAa,cAAc,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,MAC/G,EAAA,CAAG,QAAQ,iFAAiF,CAAA,CACzF,KAAK,KAAA,EAAO,MAAM,EAAE,KAAA,EAAM;AAAA,MAC7B,EAAA,CAAG,QAAQ,mGAAmG,CAAA,CAC3G,KAAK,KAAA,EAAO,MAAM,EAAE,KAAA,EAAM;AAAA,MAC7B,EAAA,CAAG,QAAQ,6GAA6G,CAAA,CACrH,KAAK,KAAA,EAAO,MAAM,EAAE,KAAA,EAAM;AAAA,MAC7B,EAAA,CAAG,QAAQ,oFAAoF,CAAA,CAC5F,KAAK,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA,CAAE,KAAA,EAAM;AAAA,MACxC,EAAA,CAAG,QAAQ,oJAAoJ,CAAA,CAC5J,KAAK,KAAA,EAAO,MAAM,EAAE,GAAA,EAAI;AAAA,MAC3B,GAAG,OAAA,CAAQ,6HAA6H,EACrI,IAAA,CAAK,KAAK,EAAE,GAAA;AAAI,KACpB,CAAA;AAED,IAAA,aAAA,GAAgB,gBAAgB,KAAA,IAAS,CAAA;AACzC,IAAA,SAAA,GAAY,WAAW,KAAA,IAAS,CAAA;AAChC,IAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,cAAA,EAAgB,GAAA,IAAO,CAAC,CAAA;AACjD,IAAA,UAAA,GAAa,cAAc,KAAA,IAAS,CAAA;AACpC,IAAA,QAAA,GAAA,CAAY,WAAA,CAAY,OAAA,IAAW,EAAC,EAAG,IAAI,CAAC,CAAA,MAAY,EAAE,IAAA,EAAM,CAAA,CAAE,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,OAAM,CAAE,CAAA;AACxF,IAAA,cAAA,GAAkB,cAAA,CAAe,WAAW,EAAC;AAAA,EAC/C,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAMT,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAW+D,aAAA,CAAc,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAI9B,SAAA,CAAU,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAI1B,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA,gDAAA,EAI1C,aAAa,CAAA,GAAI,gCAAA,GAAmC,+BAA+B,CAAA,EAAA,EAAK,UAAA,CAAW,gBAAgB,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAUzJ,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK;AAAA;AAAA,wFAAA,EAEsCjB,WAAAA,CAAW,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,iFAAA,EACzB,EAAE,KAAK,CAAA;AAAA;AAAA,UAAA,CAE/E,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAI;AAAA;AAAA;AAAA;AAAA,UAAA,CAIb;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAoBK,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,cAAA,CAAe,IAAI,CAAA,CAAA,KAAK;AAAA;AAAA,qGAAA,EAEmCA,WAAAA,CAAW,CAAA,CAAE,GAAA,IAAO,EAAE,CAAC,CAAA;AAAA,wHAAA,EACJ,CAAA,CAAE,WAAW,KAAA,GAAQ,qEAAA,GAAwE,iEAAiE,CAAA,EAAA,EAAK,CAAA,CAAE,UAAU,EAAE,CAAA;AAAA,wHAAA,EAAA,CAChL,CAAA,CAAE,eAAe,CAAA,KAAM,GAAA,GAAM,gEAAgE,qEAAqE,CAAA,EAAA,EAAK,CAAA,CAAE,WAAA,IAAe,EAAE,CAAA;AAAA,yEAAA,EAC1O,CAAA,CAAE,YAAY,CAAC,CAAA;AAAA;AAAA,cAAA,CAE3E,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAI;AAAA;AAAA;AAAA;AAAA,cAAA,CAIb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAQb,EAAA,OAAO,CAAA,CAAE,KAAKC,2CAAA,CAA0B;AAAA,IACtC,KAAA,EAAO,WAAA;AAAA,IACP,SAAA,EAAW,qBAAA;AAAA,IACX,WAAA,EAAa,kBAAA;AAAA,IACb,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,OAAA;AAAA,MAClC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,OAAA,EAAAgB,QAAAA;AAAA,IACA,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC1C,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,SAASjB,YAAW,GAAA,EAAqB;AACvC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,EAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,QAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,QAAQ,CAAA;AACtG;;;AChJO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,MAAM,OAAA,GAAUK,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,YAAA,EAAc,CAAC,WAAW;AAAA;AAAA,GAC3B,CAAA;AAGD,EAAA,MAAM,YAAA,GAAe,IAAIF,SAAAA,EAAK;AAG9B,EAAA,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAM;AACtC,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,IAAA;AAC1C,IAAgB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK;AAEzC,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,iBAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,SAAA,EAAW,KAAA;AAAA,QACX,cAAA,EAAgB,IAAA;AAAA,QAChB,QAAA,EAAU,IAAA;AAAA,QACV,kBAAA,EAAoB,GAAA;AAAA,QACpB,UAAA,EAAY,IAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UACzB,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,IAAA,EAAK;AAAA,UAC9B,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,GAAA;AAAI,SACjC;AAAA,QACA;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,KAAM;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAG/B,IAAA,OAAA,CAAQ,IAAA,CAAK,4BAA4B,KAAK,CAAA;AAE9C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,4BAAA;AAAA,MACT,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,KAC7B,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA,KAAM;AACxC,IAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAAK,SAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAEjC,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,kBAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,UAAA;AAAA,QACA,SAAA,EAAW,EAAE,KAAA,EAAO,SAAA,EAAW,KAAK,OAAA,EAAQ;AAAA,QAC5C,MAAM;AAAC;AACT,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AACzC,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,qBAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,WAAA,EAAa,EAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,CAAA,EAAE;AAAA,UACtB,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,CAAA,EAAE;AAAA,UAC1B,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,CAAA;AAAE,SAChC;AAAA,QACA,cAAc;AAAC;AACjB,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,QAAA,CAAS,kBAAkB,YAAA,EAAc;AAAA,IAC/C,WAAA,EAAa,sCAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,KAAA,EAAO,CAAC,OAAA,EAAS,gBAAgB,CAAA;AAAA,IACjC,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,oBAAoBuB,YAAAA,EAA6B;AAAA,IAChE,WAAA,EAAa,2BAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,mBAAA,CAAoB,mBAAA,EAAqB,OAAO,CAAA,EAAQ,IAAA,KAAc;AAC5E,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,MAAM,IAAA,GAAO,EAAE,GAAA,CAAI,IAAA;AACnB,IAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AACrB,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA;AACtC,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,CAAA,IAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA;AAE7E,IAAA,MAAM,IAAA,EAAK;AAEX,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AAGrB,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,IAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,EAAA;AAAA,MACA,cAAc,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA,IAAK;AAAA,KACvD;AAEA,IAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,aAAa,CAAA;AAAA,EAGpD,CAAA,EAAG;AAAA,IACD,WAAA,EAAa,wCAAA;AAAA,IACb,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU;AAAA;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,WAAW,kBAAA,EAAoB;AAAA,IACrC,UAAA,EAAY,OAAO,KAAA,KAAe;AAEhC,MAAA,OAAA,CAAQ,IAAA,CAAK,mBAAmB,KAAK,CAAA;AACrC,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAG;AAAA,IAC1C,CAAA;AAAA,IAEA,aAAA,EAAe,OAAO,IAAA,KAAc;AAElC,MAAA,OAAA,CAAQ,IAAA,CAAK,oBAAA,EAAsB,IAAA,CAAK,IAAI,CAAA;AAC5C,MAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAG;AAAA,IACxC,CAAA;AAAA,IAEA,QAAA,EAAU,OAAO,UAAA,KAAuB;AAEtC,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,KAAA;AAAA,QACX,QAAA,EAAU,IAAA;AAAA,QACV,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF,CAAA;AAAA,IAEA,cAAA,EAAgB,OAAO,IAAA,EAAc,OAAA,KAAiB;AAEpD,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,IAAI,CAAA,qBAAA,CAAA,EAAyB,OAAO,CAAA;AAC/D,MAAA,OAAO,EAAE,QAAA,EAAU,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAG;AAAA,IAC5C;AAAA,GACF,EAAG;AAAA,IACD,WAAA,EAAa,iCAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACZ,CAAA;AAGD,EAAA,MAAM,cAAA,GAAiBS,gCAAc,YAAA,CAAa;AAAA,IAChD,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,IAChD,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACpD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACpD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACpD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACjD,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA;AAAK,GACpD,CAAA;AAED,EAAA,MAAM,WAAA,GAAcA,gCAAc,YAAA,CAAa;AAAA,IAC7C,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,IACrD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,IACrD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACpD,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IAC/C,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACpD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA;AAAK,GAClD,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoBA,+BAAA,CAAc,eAAA,CAAgB,qBAAA,EAAuB;AAAA,IAC7E,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,YAAY,IAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,UAAU,KAAA,EAAM;AAAA,IAC9C,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC9C,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACjD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,UAAU,IAAA;AAAK,GACrD,CAAA;AAED,EAAA,MAAM,cAAA,GAAiBA,+BAAA,CAAc,eAAA,CAAgB,kBAAA,EAAoB;AAAA,IACvE,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,YAAY,IAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,KAAA,EAAM;AAAA,IACpD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,KAAA,EAAM;AAAA,IACpD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC7C,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,UAAU,IAAA;AAAK,GACpD,CAAA;AAED,EAAA,OAAA,CAAQ,SAAS,UAAA,EAAY;AAAA,IAC3B,SAAA,EAAW,qBAAA;AAAA,IACX,MAAA,EAAQ,cAAA;AAAA,IACR,UAAA,EAAY,CAAC,iBAAiB;AAAA,GAC/B,CAAA;AAED,EAAA,OAAA,CAAQ,SAAS,gBAAA,EAAkB;AAAA,IACjC,SAAA,EAAW,kBAAA;AAAA,IACX,MAAA,EAAQ,WAAA;AAAA,IACR,UAAA,EAAY,CAAC,cAAc;AAAA,GAC5B,CAAA;AAGD,EAAA,OAAA,CAAQ,OAAA,CAAQD,MAAAA,CAAM,aAAA,EAAe,OAAO,MAAW,QAAA,KAAkB;AAEvE,IAAA,IAAA,CAAK,SAAA,GAAY;AAAA,MACf,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,SAAA,EAAW,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,KAC7E;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG;AAAA,IACD,QAAA,EAAU,CAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,OAAA,CAAQA,MAAAA,CAAM,WAAA,EAAa,OAAO,MAAW,QAAA,KAAkB;AAErE,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,SAAA,CAAU,SAAA;AAC7C,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG;AAAA,IACD,QAAA,EAAU,CAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,OAAA,CAAQA,MAAAA,CAAM,UAAA,EAAY,OAAO,MAAW,OAAA,KAAiB;AAEnE,IAAA,MAAM,OAAA,CAAQ,QAAA,EAAU,gBAAA,EAAkB,UAAA,CAAW;AAAA,MACnD,SAAA,EAAW,MAAA;AAAA,MACX,SAAA,EAAW,YAAA;AAAA,MACX,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW,EAAE,WAAA,EAAa,IAAA,CAAK,MAAA;AAAO,KACvC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG;AAAA,IACD,QAAA,EAAU,CAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,OAAO,IAAA,EAAW,OAAA,KAAiB;AAEjE,IAAA,MAAM,OAAA,CAAQ,QAAA,EAAU,gBAAA,EAAkB,UAAA,CAAW;AAAA,MACnD,SAAA,EAAW,SAAA;AAAA,MACX,SAAA,EAAW,cAAA;AAAA,MACX,SAAA,EAAW;AAAA,QACT,WAAW,IAAA,CAAK,EAAA;AAAA,QAChB,aAAa,IAAA,CAAK,IAAA;AAAA,QAClB,OAAO,IAAA,CAAK;AAAA;AACd,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG;AAAA,IACD,QAAA,EAAU,CAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACd,CAAA;AAGD,EAAA,OAAA,CAAQ,YAAA;AAAA,IACN,YAAA;AAAA,IACA,qBAAA;AAAA,IACA,wBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,yCAAA;AAAA,MACb,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB,CAAA;AAAA,MACvC,IAAA,EAAM;AAAA;AACR,GACF;AAEA,EAAA,OAAA,CAAQ,YAAA;AAAA,IACN,oBAAA;AAAA,IACA,mBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,8CAAA;AAAA,MACb,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB,CAAA;AAAA,MACvC,IAAA,EAAM;AAAA;AACR,GACF;AAEA,EAAA,OAAA,CAAQ,YAAA;AAAA,IACN,qBAAA;AAAA,IACA,qBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,iCAAA;AAAA,MACb,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB,CAAA;AAAA,MACvC,IAAA,EAAM;AAAA;AACR,GACF;AAEA,EAAA,OAAA,CAAQ,YAAA;AAAA,IACN,qBAAA;AAAA,IACA,oBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,kDAAA;AAAA,MACb,WAAA,EAAa,CAAC,OAAA,EAAS,qBAAqB,CAAA;AAAA,MAC5C,IAAA,EAAM;AAAA;AACR,GACF;AAGA,EAAA,OAAA,CAAQ,WAAA,CAAY,aAAa,kBAAA,EAAoB;AAAA,IACnD,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB;AAAA,GACxC,CAAA;AAED,EAAA,OAAA,CAAQ,WAAA,CAAY,aAAa,kBAAA,EAAoB;AAAA,IACnD,IAAA,EAAM,WAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB;AAAA,GACxC,CAAA;AAED,EAAA,OAAA,CAAQ,WAAA,CAAY,WAAW,0BAAA,EAA4B;AAAA,IACzD,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB;AAAA,GACxC,CAAA;AAED,EAAA,OAAA,CAAQ,WAAA,CAAY,aAAa,2BAAA,EAA6B;AAAA,IAC5D,IAAA,EAAM,gBAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB;AAAA,GACxC,CAAA;AAED,EAAA,OAAA,CAAQ,WAAA,CAAY,YAAY,2BAAA,EAA6B;AAAA,IAC3D,IAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa,CAAC,OAAA,EAAS,qBAAqB;AAAA,GAC7C,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,SAAS,YAAY;AACnB,MAAA,OAAA,CAAQ,KAAK,gCAAgC,CAAA;AAAA,IAE/C,CAAA;AAAA,IAEA,UAAU,YAAY;AACpB,MAAA,OAAA,CAAQ,KAAK,gCAAgC,CAAA;AAAA,IAE/C,CAAA;AAAA,IAEA,YAAY,YAAY;AACtB,MAAA,OAAA,CAAQ,KAAK,kCAAkC,CAAA;AAAA,IAEjD,CAAA;AAAA,IAEA,SAAA,EAAW,OAAO,MAAA,KAAW;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,mCAAmC,MAAM,CAAA;AAAA,IAExD;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAGO,IAAM,kBAAkB,qBAAA,EAAsB;;;ACpX9C,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA,EAErC,MAAM,WAAW,KAAA,EAAyC;AACxD,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,eAAA;AAEnC,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAGrB,CAAA,CAAE,IAAA;AAAA,MACD,EAAA;AAAA,MACA,KAAA,CAAM,KAAA;AAAA,MACN,QAAA;AAAA,MACA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA,GAAI,IAAA;AAAA,MACtD,MAAM,MAAA,IAAU,IAAA;AAAA,MAChB,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,MAAM,IAAA,IAAQ;AAAA,MACd,GAAA,EAAI;AAEN,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAA8C;AAC7D,IAAA,MAAM,MAAgB,EAAC;AAEvB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS;AAChC,MAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,eAAA;AAEnC,MAAA,OAAO,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAGtB,CAAA,CAAE,IAAA;AAAA,QACD,EAAA;AAAA,QACA,KAAA,CAAM,KAAA;AAAA,QACN,QAAA;AAAA,QACA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA,GAAI,IAAA;AAAA,QACtD,MAAM,MAAA,IAAU,IAAA;AAAA,QAChB,MAAM,SAAA,IAAa,IAAA;AAAA,QACnB,MAAM,SAAA,IAAa,IAAA;AAAA,QACnB,MAAM,SAAA,IAAa,IAAA;AAAA,QACnB,MAAM,IAAA,IAAQ;AAAA,OAChB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA;AACzB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAA,CAAY,OAAA,GAA6B,EAAC,EAA8C;AAC5F,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,UAAA,CAAW,KAAK,WAAW,CAAA;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,IAC9B;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,UAAA,CAAW,KAAK,aAAa,CAAA;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAC5E,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,CAAA;AAEjC,IAAA,MAAM,CAAC,WAAA,EAAa,YAAY,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACpD,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,CAAA,+CAAA,EAAkD,KAAK,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,MAAM,CAAA,CAAE,KAAA,EAAM;AAAA,MACjG,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,CAAA,+BAAA,EAAkC,KAAK,CAAA,0CAAA,CAA4C,CAAA,CAAE,IAAA,CAAK,GAAG,MAAA,EAAQ,KAAA,EAAO,MAAM,EAAE,GAAA;AAAI,KACzI,CAAA;AAED,IAAA,MAAM,UAAU,YAAA,CAAa,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,MAC3D,GAAG,CAAA;AAAA,MACH,YAAY,CAAA,CAAE,UAAA,GAAa,KAAK,KAAA,CAAM,CAAA,CAAE,UAAU,CAAA,GAAI;AAAA,KACxD,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAa,SAAS,CAAA,EAAE;AAAA,EAClD;AAAA,EAEA,MAAM,QAAA,CAAS,SAAA,EAAoB,OAAA,EAAuC;AACxE,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,IACvB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAE5E,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC5C,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAKU,KAAK;AAAA,MAAA,CAC9B,CAAA,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,KAAA,EAAM;AAAA,MACzB,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,8BAAA,EAEU,KAAK;AAAA;AAAA,MAAA,CAE9B,CAAA,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,GAAA;AAAI,KACxB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,QAAQ,YAAA,IAAgB,CAAA;AAAA,MACrC,WAAA,EAAa,QAAQ,YAAA,IAAgB,CAAA;AAAA,MACrC,cAAA,EAAgB,QAAQ,eAAA,IAAmB,CAAA;AAAA,MAC3C,SAAA,EAAA,CAAY,SAAA,CAAU,OAAA,IAAW,IAAI,GAAA,CAAI,CAAC,CAAA,MAAY,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,OAAM,CAAE;AAAA,KAC3F;AAAA,EACF;AACF,CAAA;;;ACnKA,IAAMN,UAAAA,GAAY,IAAIzB,SAAAA,EAAmD;AAGzEyB,UAAAA,CAAU,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA,KAAM;AAC/B,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAE3C,EAAA,MAAM,KAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,KACrC,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,GAAG,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,EAAG,MAAK,IACrD,SAAA;AACL,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,IAAK,EAAA;AAChD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,EACnD;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK;AACrB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,gCAAA,IAAoC,GAAG,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MAC5B,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAA,EAAU,EAAE,QAAA,IAAY,eAAA;AAAA,MACxB,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,MAAA,EAAQ,IAAA,EAAM,MAAA,IAAU,CAAA,CAAE,MAAA;AAAA,MAC1B,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,MACX,SAAA;AAAA,MACA,MAAM,CAAA,CAAE;AAAA,KACV,CAAE,CAAA;AAGF,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAC,EAAE,KAAA,IAAS,OAAO,CAAA,CAAE,KAAA,KAAU,QAAQ,CAAA;AACxE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,8CAAA,IAAkD,GAAG,CAAA;AAAA,IAC9E;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AAC3C,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,GAAA,EAAK,KAAA,EAAO,GAAA,CAAI,MAAA,EAAQ,CAAA;AAAA,EACnE;AAGA,EAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,OAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AACjD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,gDAAA,IAAoD,GAAG,CAAA;AAAA,EAChF;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW;AAAA,IACvC,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAA,EAAU,KAAK,QAAA,IAAY,eAAA;AAAA,IAC3B,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,MAAA,EAAQ,IAAA,EAAM,MAAA,IAAU,IAAA,CAAK,MAAA;AAAA,IAC7B,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,SAAA,EAAW,EAAA;AAAA,IACX,SAAA;AAAA,IACA,MAAM,IAAA,CAAK;AAAA,GACZ,CAAA;AAED,EAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAC1C,CAAC,CAAA;AAGDA,UAAAA,CAAU,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAC9B,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,uBAAA,IAA2B,GAAG,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,MAAA;AAAA,IAC/B,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,IAAK,MAAA;AAAA,IACrC,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA;AAAA,IACjC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,IAAK,MAAA;AAAA,IACvC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAE,CAAA,GAAI,MAAA;AAAA,IAC5E,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAE,CAAA,GAAI,MAAA;AAAA,IACtE,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,EAAA;AAAA,IAChE,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAE,CAAA,GAAI;AAAA,GACrE;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAChD,EAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AACtB,CAAC,CAAA;AAGDA,UAAAA,CAAU,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAM;AACnC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,uBAAA,IAA2B,GAAG,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAE3C,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAE,CAAA,GAAI,MAAA;AACnF,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAE,CAAA,GAAI,MAAA;AAE7E,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,OAAO,CAAA;AACvD,EAAA,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AACrB,CAAC,CAAA;;;AChFM,IAAM,aAAA,GAA6C;AAAA;AAAA,EAExD,OAAA,EAAS;AAAA,IACP,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,SAAA;AAAA,IACX,YAAA,EAAc,CAAC,gBAAA,EAAkB,gBAAA,EAAkB,iBAAiB,CAAA;AAAA,IACpE,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,GAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,MAAA;AAAA,IACX,YAAA,EAAc,CAAC,aAAA,EAAe,aAAA,EAAe,YAAY,CAAA;AAAA,IACzD,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,CAAC,eAAA,EAAiB,iBAAA,EAAmB,mBAAmB,CAAA;AAAA,IACtE,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACL,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,OAAA;AAAA,IACX,YAAA,EAAc,CAAC,cAAA,EAAgB,cAAA,EAAgB,cAAc,CAAA;AAAA,IAC7D,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,GAAA,EAAK;AAAA,IACH,GAAA,EAAK,GAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,KAAA;AAAA,IACX,YAAA,EAAc,CAAC,gBAAA,EAAkB,iBAAiB,CAAA;AAAA,IAClD,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA,IACP,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,KAAA;AAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,SAAA;AAAA,IACX,YAAA,EAAc,CAAC,aAAa,CAAA;AAAA,IAC5B,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,CAAC,iBAAA,EAAmB,mBAAA,EAAqB,eAAe,CAAA;AAAA,IACtE,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,UAAA,EAAY;AAAA,IACV,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,YAAA;AAAA,IACX,YAAA,EAAc,CAAC,mBAAA,EAAqB,mBAAmB,CAAA;AAAA,IACvD,OAAA,EAAS;AAAA;AAEb,CAAA;AAKO,SAAS,eAAe,SAAA,EAAgC;AAC7D,EAAA,OAAO,aAAA,CAAc,SAAS,CAAA,IAAK;AAAA,IACjC,GAAA,EAAK,IAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA;AAAA,IACA,cAAc,EAAC;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AACF;AAMO,SAAS,gBAAA,CACd,SAAA,EACA,IAAA,EACA,UAAA,EACA,OAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAAI,OAAA,IAAW,cAAA,CAAe,SAAS,EAAE,OAAA,IAAW,IAAA;AAC1D,EAAA,OAAO,GAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,UAAU,IAAI,CAAC,CAAA,CAAA;AAChD;AAKO,SAAS,cAAc,GAAA,EAKrB;AACP,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAAA,IACvB,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAAA,IAClB,UAAA,EAAY,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAAA,IACxB,OAAA,EAAS,KAAA,CAAM,CAAC,CAAA,IAAK;AAAA,GACvB;AACF;;;ACxIA,IAAM,cAAN,MAAkB;AAAA,EACR,KAAA,uBAA0C,GAAA,EAAI;AAAA,EAC9C,OAAA,GAAkB,KAAK,IAAA,GAAO,IAAA;AAAA;AAAA,EAC9B,WAAA,GAAsB,CAAA;AAAA;AAAA;AAAA;AAAA,EAK9B,IAAO,GAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAEhC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAO,GAAA,EAAa,KAAA,EAAU,GAAA,EAAa,UAAkB,IAAA,EAAY;AACvE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,MAAO,GAAA,GAAM,GAAA;AAAA,MACxB;AAAA,KACF;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,GAAS,CAAA;AAGjD,IAAA,IAAI,IAAA,CAAK,WAAA,GAAc,SAAA,GAAY,IAAA,CAAK,OAAA,EAAS;AAC/C,MAAA,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,IACzB;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,WAAA,IAAe,SAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAA,EAAsB;AAC3B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,GAAS,CAAA;AACjD,MAAA,IAAA,CAAK,WAAA,IAAe,SAAA;AACpB,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA4C;AAC1C,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,WAAA;AAAA,MACX,KAAA,EAAO,KAAK,KAAA,CAAM;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,WAAA,EAA2B;AAE1C,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,OAAA,EAAS,CAAA,CAAE,IAAA;AAAA,MAC/C,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAE;AAAA,KAClC;AAEA,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAA,EAAS;AAClC,MAAA,IAAI,cAAc,WAAA,EAAa;AAE/B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,GAAS,CAAA;AACjD,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,MAAA,UAAA,IAAc,SAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAA,EAAyB;AACzC,IAAA,MAAM,QAAQ,IAAI,MAAA;AAAA,MAChB,GAAA,GAAM,QAAQ,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,GAAI;AAAA,KAC3D;AAEA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACnC,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG;AACnB,QAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,QAAA,KAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAgBO,IAAM,eAAN,MAAmB;AAAA,EAChB,WAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EAER,WAAA,CAAY,QAAqB,WAAA,EAA2B;AAC1D,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,EAAY;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,UAAA,EAAY,CAAA;AAAA,MACZ,YAAA,EAAc,CAAA;AAAA,MACd,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ,CAAA;AAAA,MACR,aAAA,EAAe,CAAA;AAAA,MACf,OAAA,EAAS,CAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAO,GAAA,EAAgC;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,aAAA,EAAA;AAGX,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAO,GAAG,CAAA;AAC/C,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,IAAA,CAAK,KAAA,CAAM,UAAA,EAAA;AACX,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,OAAO,WAAA;AAAA,MACT;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,YAAA,EAAA;AAAA,IACb;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,WAAA,EAAa;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,MAAM,CAAA;AACtD,QAAA,IAAI,YAAY,IAAA,EAAM;AACpB,UAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAA;AAGX,UAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,YAAA,IAAA,CAAK,WAAA,CAAY,IAAI,GAAA,EAAK,OAAA,EAAc,KAAK,MAAA,CAAO,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAAA,UAC9E;AAEA,UAAA,IAAA,CAAK,aAAA,EAAc;AACnB,UAAA,OAAO,OAAA;AAAA,QACT;AACA,QAAA,IAAA,CAAK,KAAA,CAAM,QAAA,EAAA;AAAA,MACb,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,QAAA,IAAA,CAAK,KAAA,CAAM,QAAA,EAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAiB,GAAA,EAAsC;AAC3D,IAAA,IAAA,CAAK,KAAA,CAAM,aAAA,EAAA;AAGX,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAO,GAAG,CAAA;AAC/C,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,IAAA,CAAK,KAAA,CAAM,UAAA,EAAA;AACX,QAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAY,GAAG,CAAA;AACxC,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,WAAA;AAAA,UACN,MAAA,EAAQ,QAAA;AAAA,UACR,GAAA,EAAK,IAAA;AAAA,UACL,WAAW,KAAA,EAAO,SAAA;AAAA,UAClB,KAAK,KAAA,EAAO;AAAA,SACd;AAAA,MACF;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,YAAA,EAAA;AAAA,IACb;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,WAAA,EAAa;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,MAAM,CAAA;AACtD,QAAA,IAAI,YAAY,IAAA,EAAM;AACpB,UAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAA;AAGX,UAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,YAAA,IAAA,CAAK,WAAA,CAAY,IAAI,GAAA,EAAK,OAAA,EAAc,KAAK,MAAA,CAAO,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAAA,UAC9E;AAEA,UAAA,IAAA,CAAK,aAAA,EAAc;AACnB,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,MAAA,EAAQ,IAAA;AAAA,YACR,GAAA,EAAK;AAAA,WACP;AAAA,QACF;AACA,QAAA,IAAA,CAAK,KAAA,CAAM,QAAA,EAAA;AAAA,MACb,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,QAAA,IAAA,CAAK,KAAA,CAAM,QAAA,EAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CACJ,GAAA,EACA,KAAA,EACA,YAAA,EACe;AACf,IAAA,MAAM,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,YAAA,EAAa;AAGjD,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,IAAA,CAAK,YAAY,GAAA,CAAI,GAAA,EAAK,OAAO,MAAA,CAAO,GAAA,EAAK,OAAO,OAAO,CAAA;AAAA,IAC7D;AAGA,IAAA,IAAI,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,WAAA,EAAa;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,WAAA,CAAY,GAAA,CAAI,KAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AAAA,UACrD,eAAe,MAAA,CAAO;AAAA,SACvB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,GAAA,EAA4B;AAEvC,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,WAAA,EAAa;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,GAAG,CAAA;AAAA,MACnC,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,IACzB;AAGA,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,UAAA,EAAY,CAAA;AAAA,MACZ,YAAA,EAAc,CAAA;AAAA,MACd,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ,CAAA;AAAA,MACR,aAAA,EAAe,CAAA;AAAA,MACf,OAAA,EAAS,CAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAAkC;AACjD,IAAA,IAAI,KAAA,GAAQ,CAAA;AAGZ,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,KAAA,IAAS,IAAA,CAAK,WAAA,CAAY,iBAAA,CAAkB,OAAO,CAAA;AAAA,IACrD;AAKA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,WAAA,EAAa;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,IAAI,MAAA;AAAA,UAChB,GAAA,GAAM,QAAQ,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,GAAI;AAAA,SAC3D;AAGA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,GAAA;AACvC,QAAA,MAAM,OAAO,MAAM,IAAA,CAAK,YAAY,IAAA,CAAK,EAAE,QAAQ,CAAA;AAEnD,QAAA,KAAA,MAAW,GAAA,IAAO,KAAK,IAAA,EAAM;AAC3B,UAAA,IAAI,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACxB,YAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AACtC,YAAA,KAAA,EAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,MACrD;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,OAAA,EAAkC;AACxD,IAAA,OAAO,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAuB;AACrB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,QAAA,EAAS;AAE3C,IAAA,OAAO;AAAA,MACL,GAAG,IAAA,CAAK,KAAA;AAAA,MACR,YAAY,QAAA,CAAS,IAAA;AAAA,MACrB,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAM,UAAA,GAAa,KAAK,KAAA,CAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA;AACzE,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,IAC3C,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,aAAA,GAAiB,GAAA,GACzC,CAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,MAAc,UAAA,EAA4B;AACpD,IAAA,OAAO,gBAAA;AAAA,MACL,KAAK,MAAA,CAAO,SAAA;AAAA,MACZ,IAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAK,MAAA,CAAO;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAa,OAAA,EAA0D;AAC3E,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,GAAA,EAA+B;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,OAAO,KAAA,KAAU,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAW,IAAA,EAAyC;AACxD,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAe;AAEnC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,GAAA,CAAO,GAAG,CAAA;AACnC,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,OAAA,EACA,YAAA,EACe;AACf,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,KAAK,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,OAAO,YAAY,CAAA;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAA,EAA+B;AAC9C,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CACJ,GAAA,EACA,OAAA,EACA,YAAA,EACY;AAEZ,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAO,GAAG,CAAA;AACpC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,EAAQ;AAG5B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,YAAY,CAAA;AAEvC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0F;AAC9F,IAAA,MAAM,OAA6E,EAAC;AAGpF,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,MAAM,KAAA,GAAS,KAAK,WAAA,CAAoB,KAAA;AACxC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AAC1C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,GAAS,CAAA;AAC5C,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA;AAC/B,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,GAAA;AAAA,UACA,IAAA;AAAA,UACA,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAY,GAAA,EAMR;AACR,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAS,KAAK,WAAA,CAAoB,KAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAE3B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,MAAM,IAAA,CAAK,OAAO,GAAG,CAAA;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,GAAS,CAAA;AAC5C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAK,CAAA,GAAI,GAAA;AAExD,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,GAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAYA,IAAM,cAAA,uBAAqB,GAAA,EAA0B;AACrD,IAAI,iBAAA;AAYG,SAAS,eAAA,CAAgB,QAAqB,WAAA,EAAyC;AAC5F,EAAA,MAAM,MAAM,MAAA,CAAO,SAAA;AAEnB,EAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAE5B,IAAA,MAAM,KAAoB,iBAAA;AAC1B,IAAA,cAAA,CAAe,IAAI,GAAA,EAAK,IAAI,YAAA,CAAa,MAAA,EAAQ,EAAE,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,OAAO,cAAA,CAAe,IAAI,GAAG,CAAA;AAC/B;AAKA,eAAsB,cAAA,GAAgC;AACpD,EAAA,KAAA,MAAW,KAAA,IAAS,cAAA,CAAe,MAAA,EAAO,EAAG;AAC3C,IAAA,MAAM,MAAM,KAAA,EAAM;AAAA,EACpB;AACF;AAKO,SAAS,gBAAA,GAA+C;AAC7D,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,CAAA,IAAK,cAAA,CAAe,SAAQ,EAAG;AACzD,IAAA,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA,CAAM,QAAA,EAAS;AAAA,EACpC;AAEA,EAAA,OAAO,KAAA;AACT;;;ACzmBA,IAAM,WAAN,MAAe;AAAA,EACL,aAAA,uBAAiD,GAAA,EAAI;AAAA,EACrD,WAAoE,EAAC;AAAA,EACrE,UAAA,GAAqB,GAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,EAAA,CAAG,OAAe,OAAA,EAAmC;AACnD,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,CAAG,KAAK,OAAO,CAAA;AAG3C,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAC7C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AACtC,QAAA,IAAI,QAAQ,EAAA,EAAI;AACd,UAAA,QAAA,CAAS,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,KAAA,EAAe,IAAA,EAA2B;AAEnD,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,IAAI,CAAA;AAEzB,IAAA,MAAM,WAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,KAAK,EAAC;AAGnD,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,QAAA,CAAS,GAAA,CAAI,OAAO,OAAA,KAAY;AAC9B,QAAA,IAAI;AACF,UAAA,MAAM,QAAQ,IAAI,CAAA;AAAA,QACpB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QAC7D;AAAA,MACF,CAAC;AAAA,KACH;AAGA,IAAA,MAAM,mBAAmB,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAG,KAAK,EAAC;AACzD,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,gBAAA,CAAiB,GAAA,CAAI,OAAO,OAAA,KAAY;AACtC,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,CAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,QAC/B,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAA,EAAqB;AACvB,IAAA,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAsB;AACpB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,KAAA,EAAuB;AACxC,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,GAAG,MAAA,IAAU,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,CAAS,OAAe,IAAA,EAAkB;AAChD,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,MACjB,KAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB;AAAA,KACD,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY;AAC1C,MAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,QAAgB,EAAA,EAA6D;AACvF,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,WAAW,EAAC;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAIE;AACA,IAAA,MAAM,cAAsC,EAAC;AAE7C,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,QAAA,EAAU;AAC/B,MAAA,WAAA,CAAY,IAAI,KAAK,CAAA,GAAA,CAAK,YAAY,GAAA,CAAI,KAAK,KAAK,CAAA,IAAK,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,KAAK,QAAA,CAAS,MAAA;AAAA,MAC3B,kBAAA,EAAoB,KAAK,aAAA,CAAc,IAAA;AAAA,MACvC;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAGA,IAAI,cAAA,GAAkC,IAAA;AAK/B,SAAS,WAAA,GAAwB;AACtC,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,cAAA,GAAiB,IAAI,QAAA,EAAS;AAAA,EAChC;AACA,EAAA,OAAO,cAAA;AACT;AAaO,SAAS,OAAA,CAAQ,OAAe,OAAA,EAAmC;AACxE,EAAA,MAAM,MAAM,WAAA,EAAY;AACxB,EAAA,OAAO,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAC9B;;;ACjKO,SAAS,sBAAA,GAA+B;AAC7C,EAAkB,WAAA;AAGlB,EAAA,wBAAA,EAAyB;AAGzB,EAAA,qBAAA,EAAsB;AAGtB,EAAA,uBAAA,EAAwB;AAGxB,EAAA,sBAAA,EAAuB;AAGvB,EAAA,oBAAA,EAAqB;AAGrB,EAAA,2BAAA,EAA4B;AAE5B,EAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACvD;AAKA,SAAS,wBAAA,GAAiC;AACxC,EAAA,MAAM,SAAS,aAAA,CAAc,OAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,YAAA,GAAe,gBAAgB,MAAM,CAAA;AAG3C,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,KAAA,KAAU;AACzC,IAAA,MAAM,YAAA,CAAa,WAAW,WAAW,CAAA;AACzC,IAAA,OAAA,CAAQ,IAAI,mCAAmC,CAAA;AAAA,EACjD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,IAAA,KAAS;AACxC,IAAA,IAAI,MAAM,EAAA,EAAI;AAEZ,MAAA,MAAM,aAAa,MAAA,CAAO,YAAA,CAAa,YAAY,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,YAAA,CAAa,WAAW,gBAAgB,CAAA;AAC9C,IAAA,OAAA,CAAQ,GAAA,CAAI,mCAAA,EAAqC,IAAA,EAAM,EAAE,CAAA;AAAA,EAC3D,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,IAAA,KAAS;AACxC,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,aAAa,MAAA,CAAO,YAAA,CAAa,YAAY,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACrE;AACA,IAAA,MAAM,YAAA,CAAa,WAAW,WAAW,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,mCAAA,EAAqC,IAAA,EAAM,EAAE,CAAA;AAAA,EAC3D,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,iBAAA,EAAmB,OAAO,KAAA,KAAU;AAC1C,IAAA,MAAM,YAAA,CAAa,WAAW,WAAW,CAAA;AACzC,IAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAAA,EAClD,CAAC,CAAA;AACH;AAKA,SAAS,qBAAA,GAA8B;AACrC,EAAA,MAAM,SAAS,aAAA,CAAc,IAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,SAAA,GAAY,gBAAgB,MAAM,CAAA;AAExC,EAAA,OAAA,CAAQ,aAAA,EAAe,OAAO,IAAA,KAAS;AACrC,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,UAAU,MAAA,CAAO,SAAA,CAAU,YAAY,IAAA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,UAAU,MAAA,CAAO,SAAA,CAAU,YAAY,OAAA,EAAS,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACnE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,gCAAA,EAAkC,IAAA,EAAM,EAAE,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,aAAA,EAAe,OAAO,IAAA,KAAS;AACrC,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,UAAU,MAAA,CAAO,SAAA,CAAU,YAAY,IAAA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,UAAU,MAAA,CAAO,SAAA,CAAU,YAAY,OAAA,EAAS,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACnE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,gCAAA,EAAkC,IAAA,EAAM,EAAE,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,YAAA,EAAc,OAAO,IAAA,KAAS;AACpC,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,MAAM,UAAU,MAAA,CAAO,SAAA,CAAU,YAAY,IAAA,EAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACjE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,+BAAA,EAAiC,IAAA,EAAM,MAAM,CAAA;AAAA,EAC3D,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,aAAA,EAAe,OAAO,IAAA,KAAS;AAErC,IAAA,MAAM,gBAAgB,aAAA,CAAc,OAAA;AACpC,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,YAAA,GAAe,gBAAgB,aAAa,CAAA;AAClD,MAAA,IAAI,MAAM,SAAA,EAAW;AACnB,QAAA,MAAM,aAAa,MAAA,CAAO,YAAA,CAAa,YAAY,SAAA,EAAW,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MAC/E;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAAA,EAC9C,CAAC,CAAA;AACH;AAKA,SAAS,uBAAA,GAAgC;AACvC,EAAA,MAAM,eAAe,aAAA,CAAc,MAAA;AACnC,EAAA,IAAI,CAAC,YAAA,EAAc;AACnB,EAAA,MAAM,WAAA,GAAc,gBAAgB,YAAY,CAAA;AAEhD,EAAA,OAAA,CAAQ,eAAA,EAAiB,OAAO,KAAA,KAAU;AACxC,IAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AACvC,IAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAAA,EAChD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,iBAAA,EAAmB,OAAO,IAAA,KAAS;AACzC,IAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AACvC,IAAA,MAAM,eAAe,aAAA,CAAc,MAAA;AACnC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,WAAA,GAAc,gBAAgB,YAAY,CAAA;AAChD,MAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AAAA,IACzC;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,oCAAA,EAAsC,IAAA,EAAM,QAAQ,CAAA;AAAA,EAClE,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,mBAAA,EAAqB,OAAO,IAAA,KAAS;AAC3C,IAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AACvC,IAAA,MAAM,eAAe,aAAA,CAAc,MAAA;AACnC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,WAAA,GAAc,gBAAgB,YAAY,CAAA;AAChD,MAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AAAA,IACzC;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,sCAAA,EAAwC,IAAA,EAAM,QAAQ,CAAA;AAAA,EACpE,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,eAAA,EAAiB,OAAO,IAAA,KAAS;AACvC,IAAA,MAAM,eAAe,aAAA,CAAc,MAAA;AACnC,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,MAAM,WAAA,GAAc,gBAAgB,YAAY,CAAA;AAChD,IAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AACvC,IAAA,OAAA,CAAQ,GAAA,CAAI,kCAAA,EAAoC,IAAA,EAAM,QAAQ,CAAA;AAAA,EAChE,CAAC,CAAA;AACH;AAKA,SAAS,sBAAA,GAA+B;AACtC,EAAA,MAAM,SAAS,aAAA,CAAc,KAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,UAAA,GAAa,gBAAgB,MAAM,CAAA;AAEzC,EAAA,OAAA,CAAQ,cAAA,EAAgB,OAAO,KAAA,KAAU;AACvC,IAAA,MAAM,UAAA,CAAW,WAAW,SAAS,CAAA;AACrC,IAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA;AAAA,EAC/C,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,cAAA,EAAgB,OAAO,IAAA,KAAS;AACtC,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,WAAW,MAAA,CAAO,UAAA,CAAW,YAAY,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,UAAA,CAAW,WAAW,cAAc,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,iCAAA,EAAmC,IAAA,EAAM,EAAE,CAAA;AAAA,EACzD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,cAAA,EAAgB,OAAO,IAAA,KAAS;AACtC,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,WAAW,MAAA,CAAO,UAAA,CAAW,YAAY,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,UAAA,CAAW,WAAW,cAAc,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,iCAAA,EAAmC,IAAA,EAAM,EAAE,CAAA;AAAA,EACzD,CAAC,CAAA;AACH;AAKA,SAAS,oBAAA,GAA6B;AACpC,EAAA,MAAM,SAAS,aAAA,CAAc,GAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,QAAA,GAAW,gBAAgB,MAAM,CAAA;AAEvC,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,KAAA,KAAU;AACzC,IAAA,MAAM,QAAA,CAAS,WAAW,OAAO,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,iBAAA,EAAmB,OAAO,KAAA,KAAU;AAC1C,IAAA,MAAM,QAAA,CAAS,WAAW,OAAO,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,KAAA,KAAU;AACzC,IAAA,MAAM,QAAA,CAAS,WAAW,OAAO,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,KAAA,KAAU;AACzC,IAAA,MAAM,QAAA,CAAS,WAAW,OAAO,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,mBAAA,EAAqB,OAAO,KAAA,KAAU;AAC5C,IAAA,MAAM,QAAA,CAAS,WAAW,OAAO,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,4CAA4C,CAAA;AAAA,EAC1D,CAAC,CAAA;AACH;AAKA,SAAS,2BAAA,GAAoC;AAC3C,EAAA,MAAM,SAAS,aAAA,CAAc,UAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,eAAA,GAAkB,gBAAgB,MAAM,CAAA;AAE9C,EAAA,OAAA,CAAQ,mBAAA,EAAqB,OAAO,KAAA,KAAU;AAC5C,IAAA,MAAM,eAAA,CAAgB,WAAW,cAAc,CAAA;AAC/C,IAAA,OAAA,CAAQ,IAAI,sCAAsC,CAAA;AAAA,EACpD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,mBAAA,EAAqB,OAAO,IAAA,KAAS;AAC3C,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,gBAAgB,MAAA,CAAO,eAAA,CAAgB,YAAY,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC3E;AACA,IAAA,MAAM,eAAA,CAAgB,WAAW,cAAc,CAAA;AAC/C,IAAA,OAAA,CAAQ,GAAA,CAAI,sCAAA,EAAwC,IAAA,EAAM,EAAE,CAAA;AAAA,EAC9D,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,mBAAA,EAAqB,OAAO,IAAA,KAAS;AAC3C,IAAA,MAAM,eAAA,CAAgB,WAAW,cAAc,CAAA;AAC/C,IAAA,OAAA,CAAQ,GAAA,CAAI,sCAAA,EAAwC,IAAA,EAAM,EAAE,CAAA;AAAA,EAC9D,CAAC,CAAA;AACH;AAKO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,OAAO,SAAS,QAAA,EAAS;AAC3B;AAKO,SAAS,sBAAA,CAAuB,QAAgB,EAAA,EAAI;AACzD,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,OAAO,QAAA,CAAS,YAAY,KAAK,CAAA;AACnC;;;AClQA,eAAsB,iBAAiB,EAAA,EAIpC;AACD,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,MAAM,UAAuD,EAAC;AAE9D,EAAA,IAAI;AAEF,IAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,EAAE,CAAA;AAChD,IAAA,WAAA,IAAe,eAAA;AACf,IAAA,OAAA,CAAQ,KAAK,EAAE,SAAA,EAAW,YAAA,EAAc,KAAA,EAAO,iBAAiB,CAAA;AAGhE,IAAA,MAAM,YAAA,GAAe,MAAM,iBAAA,CAAkB,EAAE,CAAA;AAC/C,IAAA,WAAA,IAAe,YAAA;AACf,IAAA,OAAA,CAAQ,KAAK,EAAE,SAAA,EAAW,SAAA,EAAW,KAAA,EAAO,cAAc,CAAA;AAG1D,IAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,EAAE,CAAA;AAC3C,IAAA,WAAA,IAAe,UAAA;AACf,IAAA,OAAA,CAAQ,KAAK,EAAE,SAAA,EAAW,OAAA,EAAS,KAAA,EAAO,YAAY,CAAA;AAAA,EAExD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,IAAA,WAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,WAAA;AAAA,IACR,MAAA,EAAQ,WAAA;AAAA,IACR;AAAA,GACF;AACF;AAKA,eAAe,gBAAgB,EAAA,EAAiC;AAC9D,EAAA,MAAM,SAAS,aAAA,CAAc,UAAA;AAC7B,EAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AACpB,EAAA,MAAM,eAAA,GAAkB,gBAAgB,MAAM,CAAA;AAC9C,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,+CAA+C,CAAA;AACvE,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAK,GAAA,EAAI;AAEnC,IAAA,KAAA,MAAW,cAAc,OAAA,EAAkB;AACzC,MAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,WAAA,CAAY,MAAA,EAAQ,WAAW,EAAE,CAAA;AAC7D,MAAA,MAAM,eAAA,CAAgB,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AACzC,MAAA,KAAA,EAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AACzD,IAAA,MAAM,eAAA,CAAgB,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAC1C,IAAA,KAAA,EAAA;AAAA,EAEF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,iBAAA,CAAkB,EAAA,EAAgB,KAAA,GAAgB,EAAA,EAAqB;AACpF,EAAA,MAAM,SAAS,aAAA,CAAc,OAAA;AAC7B,EAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AACpB,EAAA,MAAM,YAAA,GAAe,gBAAgB,MAAM,CAAA;AAC3C,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,CAAA,qDAAA,EAAwD,KAAK,CAAA,CAAE,CAAA;AACvF,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAK,GAAA,EAAI;AAEnC,IAAA,KAAA,MAAWX,YAAW,OAAA,EAAkB;AACtC,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,WAAA,CAAY,MAAA,EAAQA,SAAQ,EAAE,CAAA;AACvD,MAAA,MAAM,YAAA,CAAa,GAAA,CAAI,GAAA,EAAKA,QAAO,CAAA;AACnC,MAAA,KAAA,EAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,WAAA,CAAY,MAAA,EAAQ,QAAQ,CAAA;AACzD,IAAA,MAAM,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACvC,IAAA,KAAA,EAAA;AAAA,EAEF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,eAAA,CAAgB,EAAA,EAAgB,KAAA,GAAgB,EAAA,EAAqB;AAClF,EAAA,MAAM,SAAS,aAAA,CAAc,KAAA;AAC7B,EAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AACpB,EAAA,MAAM,UAAA,GAAa,gBAAgB,MAAM,CAAA;AACzC,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,CAAA,6EAAA,EAAgF,KAAK,CAAA,CAAE,CAAA;AAC/G,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAK,GAAA,EAAI;AAEnC,IAAA,KAAA,MAAWmB,UAAS,OAAA,EAAkB;AACpC,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,WAAA,CAAY,MAAA,EAAQA,OAAM,EAAE,CAAA;AACnD,MAAA,MAAM,UAAA,CAAW,GAAA,CAAI,GAAA,EAAKA,MAAK,CAAA;AAC/B,MAAA,KAAA,EAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,WAAA,CAAY,MAAA,EAAQ,QAAQ,CAAA;AACvD,IAAA,MAAM,UAAA,CAAW,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACrC,IAAA,KAAA,EAAA;AAAA,EAEF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,aAAA,CACpB,WACA,OAAA,EACiB;AACjB,EAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAE,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,KAAA,CAAM,QAAQ,OAAO,CAAA;AAE3B,EAAA,OAAO,OAAA,CAAQ,MAAA;AACjB;;;ACvJArC,qDAAA,EAAA;AAkCO,SAAS,qBAAqB,IAAA,EAAkC;AACrE,EAAA,MAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,QAAA,EAkCZ,eAAe,gBAAA,EAAkB,IAAA,CAAK,OAAO,QAAA,CAAS,cAAA,IAAkB,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,QAAA,CAIjF,CAAC;;AAAA,QAAA,EAEA,eAAe,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,KAAK,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,EAI7D,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,OAAO,IAAI,EAAA,GAAK,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,OAAO,OAAO,CAAA,GAAI,EAAA,GAAK,OAAA,GAAU,KAAK,CAAC;;AAAA,QAAA,EAExG,eAAe,cAAA,EAAgB,WAAA,CAAY,KAAK,MAAA,CAAO,UAAU,GAAG,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAI/E,CAAC;;AAAA,QAAA,EAEA,eAAe,gBAAA,EAAkB,IAAA,CAAK,OAAO,UAAA,CAAW,cAAA,IAAkB,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA,QAAA,CAIlF,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAuCM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAA,SAAA,KAAa;AACjC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACjC,IAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,IAAA,OAAO,kBAAA,CAAmB,WAAW,IAAI,CAAA;AAAA,EAC3C,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAaX,uBAAA,CAAwB,gBAAgB,IAAA,CAAK,MAAA,CAAO,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC;AAAA,YAAA,EAC7E,mBAAmB,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,IAAA,EAgE3DsC,0CAAAA,CAAyB;AAAA,IACzB,EAAA,EAAI,yBAAA;AAAA,IACJ,KAAA,EAAO,iBAAA;AAAA,IACP,OAAA,EAAS,0EAAA;AAAA,IACT,WAAA,EAAa,WAAA;AAAA,IACb,UAAA,EAAY,QAAA;AAAA,IACZ,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,mCAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACZ,CAAC;;AAAA,IAAA,EAEAA,0CAAAA,CAAyB;AAAA,IACzB,EAAA,EAAI,+BAAA;AAAA,IACJ,KAAA,EAAO,uBAAA;AAAA,IACP,OAAA,EAAS,iCAAA;AAAA,IACT,WAAA,EAAa,OAAA;AAAA,IACb,UAAA,EAAY,QAAA;AAAA,IACZ,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,mCAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACZ,CAAC;;AAAA,IAAA,EAEAC,+CAA6B;AAAA,EAAA,CAAA;AAGjC,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW,cAAA;AAAA,IACX,WAAA,EAAa,cAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,OAAOrC,4CAA0B,UAAU,CAAA;AAC7C;AAEA,SAAS,cAAA,CAAe,KAAA,EAAe,KAAA,EAAe,KAAA,EAAe,MAAc,aAAA,EAAgC;AACjH,EAAA,MAAM,aAAa,aAAA,IAAiB,KAAA;AACpC,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,IAAA,EAAM,wGAAA;AAAA,IACN,IAAA,EAAM,wGAAA;AAAA,IACN,MAAA,EAAQ,oHAAA;AAAA,IACR,GAAA,EAAK,kGAAA;AAAA,IACL,KAAA,EAAO,8GAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACP;AAEA,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,yDAAA,EAKkD,YAAA,CAAa,UAAuC,CAAC,CAAA;AAAA,cAAA,EAChG,IAAI;AAAA;AAAA;AAAA,kEAAA,EAGgD,KAAK,CAAA;AAAA,mFAAA,EACY,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAO1F;AAEA,SAAS,kBAAA,CAAmB,WAAmB,IAAA,EAA0B;AACvE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AACtC,EAAA,MAAM,YAAA,GAAe,KAAK,OAAA,GAAU,EAAA,GAAK,qCACpB,IAAA,CAAK,OAAA,GAAU,KAAK,oCAAA,GACpB,gCAAA;AAErB,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA,UAAA,EAIG,SAAS;AAAA;AAAA;AAAA;AAAA,QAAA,EAIX,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB;AAAA;AAAA;AAAA,yCAAA,EAGF,YAAY,CAAA;AAAA,UAAA,EAC3C,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAIT,IAAA,CAAK,UAAA,CAAW,cAAA,EAAgB;AAAA;AAAA;AAAA,QAAA,EAGhC,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB;AAAA;AAAA;AAAA,QAAA,EAG5B,IAAA,CAAK,UAAA,CAAW,cAAA,EAAgB;AAAA;AAAA;AAAA,QAAA,EAGhC,WAAA,CAAY,IAAA,CAAK,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA,wCAAA,EAII,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAQnD;AAEA,SAAS,uBAAA,CAAwB,KAAA,EAAe,IAAA,EAAc,MAAA,EAAwB;AACpF,EAAA,MAAM,QAAQ,IAAA,GAAO,MAAA;AACrB,EAAA,MAAM,aAAA,GAAgB,KAAA,GAAQ,CAAA,GAAK,IAAA,GAAO,QAAS,GAAA,GAAM,CAAA;AAEzD,EAAA,OAAO;AAAA;AAAA,4EAAA,EAEqE,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA,qEAAA,EAIZ,IAAA,CAAK,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,qEAAA,EAIrB,MAAA,CAAO,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uEAAA,EAKrB,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;AAAA;AAAA,2EAAA,EAGpB,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAM1F;AAEA,SAAS,mBAAmB,OAAA,EAAyB;AACnD,EAAA,MAAM,SAAS,OAAA,GAAU,EAAA,GAAK,SAAA,GAAY,OAAA,GAAU,KAAK,SAAA,GAAY,UAAA;AACrE,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA;AAAA,YAAA;AAAA,KAGR;AAAA,IACA,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,iBAAA;AAAA,MACP,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA;AAAA,YAAA;AAAA,KAGR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA;AAAA,YAAA;AAAA;AAGR,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,IAAA,EAAM,wGAAA;AAAA,IACN,KAAA,EAAO,8GAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACP;AAEA,EAAA,OAAO;AAAA;AAAA;AAAA,2EAAA,EAGoE,YAAA,CAAa,MAAA,CAAO,KAAkC,CAAC,CAAA;AAAA,QAAA,EAC1H,OAAO,IAAI;AAAA;AAAA,yCAAA,EAEsB,OAAO,KAAK,CAAA;AAAA;AAAA,YAAA,EAEzC,WAAW,SAAA,GAAY,0BAAA,GACvB,MAAA,KAAW,SAAA,GAAY,8CACvB,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAMzC;AAEA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,KAAA;AACxB,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,MAAM,IAAI,CAAA;AACpC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAClD,EAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC3D;;;ACpZA,IAAM,GAAA,GAAM,IAAIE,SAAAA,EAAK;AAMrB,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAe;AACjC,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAC/B,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAGzB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACnC,IAAA,SAAA,IAAa,IAAA,CAAK,aAAa,IAAA,CAAK,MAAA;AACpC,IAAA,WAAA,IAAe,IAAA,CAAK,eAAe,IAAA,CAAK,QAAA;AACxC,IAAA,SAAA,IAAa,IAAA,CAAK,UAAA;AAClB,IAAA,YAAA,IAAgB,IAAA,CAAK,UAAA;AAAA,EACvB,CAAC,CAAA;AAED,EAAA,MAAM,gBAAgB,SAAA,GAAY,WAAA;AAClC,EAAA,MAAM,cAAA,GAAiB,aAAA,GAAgB,CAAA,GAAK,SAAA,GAAY,gBAAiB,GAAA,GAAM,CAAA;AAE/E,EAAA,MAAM,aAAA,GAAoC;AAAA,IACxC,KAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,QAAA,EAAU,aAAA;AAAA,MACV,OAAA,EAAS,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAA;AAAA,MACjC,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,IACA,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,IAC7B,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,oBAAA,CAAqB,aAAa,CAAC,CAAA;AACnD,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAe;AACtC,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAE/B,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,mBAAA,EAAqB,OAAO,CAAA,KAAe;AACjD,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AAEtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,sBAAsB,SAAS,CAAA;AAAA,OACrC,GAAG,CAAA;AAAA,EACR;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,EAAS;AAE7B,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,KAAe;AACvC,EAAA,MAAM,cAAA,EAAe;AAErB,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,2BAAA;AAAA,IACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,IAAA,CAAK,mBAAA,EAAqB,OAAO,CAAA,KAAe;AAClD,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AAEtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,sBAAsB,SAAS,CAAA;AAAA,OACrC,GAAG,CAAA;AAAA,EACR;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,MAAM,KAAA,EAAM;AAElB,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,gCAAgC,SAAS,CAAA,CAAA;AAAA,IAClD,SAAA;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,IAAA,CAAK,aAAA,EAAe,OAAO,CAAA,KAAe;AAC5C,EAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,IAAA;AAE/B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,gBAAA,GAAmB,CAAA;AAEvB,EAAA,IAAI,SAAA,EAAW;AAEb,IAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,sBAAsB,SAAS,CAAA;AAAA,SACrC,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,IAAA,gBAAA,GAAmB,MAAM,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAAA,EACnD,CAAA,MAAO;AAEL,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,EAAG;AACjD,MAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,MAAA,gBAAA,IAAoB,MAAM,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAAA,IACpD;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,gBAAA;AAAA,IACb,OAAA;AAAA,IACA,WAAW,SAAA,IAAa,KAAA;AAAA,IACxB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAe;AACvC,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAG/B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACvC,EAAA,MAAM,eAAe,UAAA,CAAW,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,IAAI,CAAA,KAAM;AACpD,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,UAAA,IAAc,EAAA,GAAK,IAAA,GAAO,IAAA,CAAA;AAEnD,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,QAAQ,OAAA,GAAU,EAAA,GAAK,SAAA,GAAY,OAAA,GAAU,KAAK,SAAA,GAAY,WAAA;AAAA,MAC9D,OAAA;AAAA,MACA,WAAA,EAAA,CAAc,WAAA,GAAc,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AAAA,MAC9C,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,gBAAgB,YAAA,CAAa,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,SAAS,CAAA,GAChE,SAAA,GACA,YAAA,CAAa,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,WAAW,IAC/C,WAAA,GACA,SAAA;AAEJ,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,aAAA;AAAA,MACR,UAAA,EAAY,YAAA;AAAA,MACZ,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY;AACpC,GACD,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA,KAAe;AACxC,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,IAAK,KAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,EAAA;AACxC,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAAK,KAAA;AACtC,EAAA,MAAM,QAAQ,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,OAAO,KAAK,KAAK,CAAA;AAEpD,EAAA,MAAM,UAQD,EAAC;AAEN,EAAA,MAAM,UAAA,GAAa,cAAc,KAAA,GAC7B,MAAA,CAAO,KAAK,aAAa,CAAA,GACzB,CAAC,SAAS,CAAA;AAEd,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,MAAM,MAAA,GAAS,cAAc,EAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,QAAA,EAAS;AAElC,IAAA,KAAA,MAAW,WAAW,IAAA,EAAM;AAE1B,MAAA,IAAI,MAAA,IAAU,CAAC,OAAA,CAAQ,GAAA,CAAI,WAAA,GAAc,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG;AACvE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,GAAG,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,EAAK,CAAA,GAAI,GAAA;AAE1D,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,SAAA,EAAW,EAAA;AAAA,QACX,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,GAAA;AAAA,QACA,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AAAA,EACxC,CAAA,MAAA,IAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA;AAAA,EACtC,CAAA,MAAA,IAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,GAAA,CAAI,aAAA,CAAc,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,EACnD;AAGA,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAE7C,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,cAAA;AAAA,MACT,OAAO,OAAA,CAAQ,MAAA;AAAA,MACf,SAAS,cAAA,CAAe,MAAA;AAAA,MACxB,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,0BAAA,EAA4B,OAAO,CAAA,KAAe;AACxD,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,EAAA,MAAM,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAE,CAAA;AAElD,EAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,sBAAsB,SAAS,CAAA;AAAA,OACrC,GAAG,CAAA;AAAA,EACR;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA;AAEtC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AAEA,EAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAEhC,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAG,KAAA;AAAA,MACH,WAAW,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,WAAA,EAAY;AAAA,MACjD,WAAW,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,WAAA;AAAY,KACnD;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAe;AAC1C,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAC/B,EAAA,MAAM,oBAAoB,yBAAA,EAA0B;AACpD,EAAA,MAAM,mBAAA,GAAsB,uBAAuB,EAAE,CAAA;AAGrD,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,MAAM,sBAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,IAAA,SAAA,IAAa,IAAA,CAAK,aAAa,IAAA,CAAK,MAAA;AACpC,IAAA,WAAA,IAAe,IAAA,CAAK,eAAe,IAAA,CAAK,QAAA;AACxC,IAAA,SAAA,IAAa,IAAA,CAAK,UAAA;AAClB,IAAA,YAAA,IAAgB,IAAA,CAAK,UAAA;AAErB,IAAA,MAAMoC,iBAAgB,IAAA,CAAK,UAAA,GAAa,KAAK,MAAA,GAAS,IAAA,CAAK,eAAe,IAAA,CAAK,QAAA;AAC/E,IAAA,MAAM,OAAA,GAAUA,iBAAgB,CAAA,GAAA,CAAM,IAAA,CAAK,aAAa,IAAA,CAAK,MAAA,IAAUA,iBAAiB,GAAA,GAAM,CAAA;AAC9F,IAAA,MAAM,eAAe,IAAA,CAAK,UAAA,GAAa,IAAI,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,GAAa,CAAA;AAE/E,IAAA,mBAAA,CAAoB,IAAA,CAAK;AAAA,MACvB,SAAA;AAAA,MACA,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC1B,aAAA,EAAAA,cAAAA;AAAA,MACA,aAAA,EAAeA,iBAAgB,CAAA,GAAA,CAAM,IAAA,CAAK,aAAaA,cAAAA,GAAiB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AAAA,MAC1F,SAAA,EAAWA,iBAAgB,CAAA,GAAA,CAAM,IAAA,CAAK,SAASA,cAAAA,GAAiB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AAAA,MAClF,YAAA,EAAc,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAAA,MACrC,WAAW,IAAA,CAAK,UAAA;AAAA,MAChB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAYA,cAAAA,GAAgB,CAAA,GAAA,CAAA,CAAM,IAAA,CAAK,UAAA,GAAa,KAAK,MAAA,KAAW,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,GAAS,CAAA,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAA,GAAI;AAAA,KACpI,CAAA;AAAA,EACH;AAGA,EAAA,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,CAAA,GAAI,UAAA,CAAW,CAAA,CAAE,OAAO,CAAC,CAAA;AAEhF,EAAA,MAAM,gBAAgB,SAAA,GAAY,WAAA;AAClC,EAAA,MAAM,cAAA,GAAiB,aAAA,GAAgB,CAAA,GAAK,SAAA,GAAY,gBAAiB,GAAA,GAAM,CAAA;AAG/E,EAAA,MAAM,gBAAA,GAAmB,SAAA;AACzB,EAAA,MAAM,YAAY,gBAAA,GAAmB,EAAA;AACrC,EAAA,MAAM,oBAAA,GAAwB,mBAAmB,GAAA,GAAW,GAAA;AAE5D,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU;AAAA,QACR,SAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAA;AAAA,QACA,cAAA,EAAgB,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAA;AAAA,QACxC,SAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAc,YAAA,GAAe,CAAA,GAAI,KAAK,KAAA,CAAM,SAAA,GAAY,YAAY,CAAA,GAAI;AAAA,OAC1E;AAAA,MACA,WAAA,EAAa;AAAA,QACX,gBAAA;AAAA,QACA,WAAA,EAAa,SAAA;AAAA,QACb,gBAAA,EAAA,CAAmB,SAAA,GAAY,GAAA,GAAO,EAAA,EAAI,QAAQ,CAAC,CAAA;AAAA,QACnD,oBAAA,EAAsB,oBAAA,CAAqB,OAAA,CAAQ,CAAC;AAAA,OACtD;AAAA,MACA,UAAA,EAAY,mBAAA;AAAA,MACZ,YAAA,EAAc;AAAA,QACZ,GAAG,iBAAA;AAAA,QACH,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,mBAAA,EAAqB,OAAO,CAAA,KAAe;AACjD,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAI/B,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,SAAA,EAAW,IAAI,CAAA,MAAO;AAAA,MACvD,SAAA;AAAA,MACA,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,eAAe,IAAA,CAAK;AAAA,KACtB,CAAE;AAAA,GACJ;AAEA,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,CAAC,SAAS,CAAA;AAAA,MAClB,IAAA,EAAM;AAAA,KACR;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,qBAAA,EAAuB,OAAO,CAAA,KAAe;AACnD,EAAmB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,IAAK;AAC/C,EAAe,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,OAAO,KAAK,IAAI;AAGpD,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,SAAS,EAAC;AAAA,MACV,IAAA,EAAM;AAAA,KACR;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA,KAAe;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,EAAE,CAAA;AAExC,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,yBAAA;AAAA,MACT,GAAG,MAAA;AAAA,MACH,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,sBAAA;AAAA,MACP,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACjD,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAMD,GAAA,CAAI,IAAA,CAAK,kBAAA,EAAoB,OAAO,CAAA,KAAe;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA;AAEpB,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACvC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,SAAA,EAAW,OAAO,CAAA;AAEpD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,CAAA,OAAA,EAAU,KAAK,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAA;AAAA,MAC3D,SAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,0BAAA;AAAA,MACP,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACjD,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAED,IAAO,cAAA,GAAQ,GAAA;;;AC1gBR,IAAM,cAAN,MAAkB;AAAA,EACf,QAAA,GAAiC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKzC,SAAA,GAAY;AACV,IAAA,OAAO,cAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,OAAA,EAAuC;AACpD,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAEhB,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,IAAU,EAAC;AAEpC,IAAA,OAAA,CAAQ,IAAI,+BAAA,EAA4B;AAAA,MACtC,aAAA,EAAe,SAAS,aAAA,IAAiB,IAAA;AAAA,MACzC,SAAA,EAAW,SAAS,SAAA,IAAa,KAAA;AAAA,MACjC,UAAA,EAAY,SAAS,UAAA,IAAc;AAAA,KACpC,CAAA;AAGD,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAChE,MAAA,eAAA,CAAgB;AAAA,QACd,GAAG,MAAA;AAAA,QACH,aAAA,EAAe,QAAA,CAAS,aAAA,IAAiB,MAAA,CAAO,aAAA;AAAA,QAChD,SAAA,EAAW,QAAA,CAAS,SAAA,IAAa,MAAA,CAAO,SAAA;AAAA,QACxC,GAAA,EAAK,QAAA,CAAS,UAAA,IAAc,MAAA,CAAO;AAAA,OACpC,CAAA;AAAA,IACH;AAGA,IAAA,sBAAA,EAAuB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,OAAA,CAAQ,IAAI,uDAAkD,CAAA;AAC9D,IAAA,MAAM,cAAA,EAAe;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,QAAA,EAA8C;AAC5D,IAAA,OAAA,CAAQ,GAAA,CAAI,wCAA8B,QAAQ,CAAA;AAGlD,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAChE,MAAA,eAAA,CAAgB;AAAA,QACd,GAAG,MAAA;AAAA,QACH,aAAA,EAAe,QAAA,CAAS,aAAA,IAAiB,MAAA,CAAO,aAAA;AAAA,QAChD,SAAA,EAAW,QAAA,CAAS,SAAA,IAAa,MAAA,CAAO,SAAA;AAAA,QACxC,GAAA,EAAK,QAAA,CAAS,UAAA,IAAc,MAAA,CAAO;AAAA,OACpC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,CAAA,EAA+B;AAC5C,IAAA,MAAM,QAAQ,gBAAA,EAAiB;AAE/B,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,CAAA,EAA+B;AAC9C,IAAA,MAAM,cAAA,EAAe;AAErB,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,2BAAA;AAAA,MACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,CAAA,EAA+B;AACrD,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,UAAA,EAAW,GAAI,IAAA;AAE3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,IAAI,gBAAA,GAAmB,CAAA;AAEvB,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,aAAA,CAAc,UAAU,CAAA,IAAK;AAAA,QACzD,GAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAW,KAAA;AAAA,QACX,aAAA,EAAe,IAAA;AAAA,QACf,SAAA,EAAW,UAAA;AAAA,QACX,cAAc,EAAC;AAAA,QACf,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA,gBAAA,GAAmB,MAAM,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAAA,IACnD,CAAA,MAAO;AAEL,MAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,EAAG;AACjD,QAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,QAAA,gBAAA,IAAoB,MAAM,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAAA,MACpD;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,gBAAA;AAAA,MACb,OAAA;AAAA,MACA,WAAW,UAAA,IAAc,KAAA;AAAA,MACzB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH;AACF,CAAA;AAgBA,IAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,IAAO,aAAA,GAAQ,MAAA;;;AC/JR,IAAM,UAAA,GAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;;;ACoJnB,SAAS,gBAAA,CAAiB,MAAA,GAAwB,EAAC,EAAe;AACvE,EAAA,MAAMC,IAAAA,GAAM,IAAIrC,SAAAA,EAAmD;AAGnE,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,IAAWsC,gCAAA,EAAe;AACpD,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,IAAQ,YAAA;AAG/B,EAAAD,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAK,OAAO,GAAG,IAAA,KAAS;AAC9B,IAAA,CAAA,CAAE,GAAA,CAAI,cAAc,UAAU,CAAA;AAC9B,IAAA,MAAM,IAAA,EAAK;AAAA,EACb,CAAC,CAAA;AAGD,EAAAA,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAKE,mCAAA,EAAmB,CAAA;AAGhC,EAAAF,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAKG,qCAAA,CAAoB,MAAM,CAAC,CAAA;AAGxC,EAAA,IAAI,MAAA,CAAO,YAAY,UAAA,EAAY;AACjC,IAAA,KAAA,MAAW,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,UAAA,EAAY;AACrD,MAAAH,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAAA,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAK,OAAO,IAAI,IAAA,KAAS;AAE/B,IAAA,MAAM,IAAA,EAAK;AAAA,EACb,CAAC,CAAA;AAGD,EAAAA,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAKI,2CAAA,EAA2B,CAAA;AAGxC,EAAAJ,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAKK,gCAAA,EAAgB,CAAA;AAG7B,EAAA,IAAI,MAAA,CAAO,YAAY,SAAA,EAAW;AAChC,IAAA,KAAA,MAAW,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,SAAA,EAAW;AACpD,MAAAL,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,gBAAA,IAAoB,CAAC,OAAO,CAAA;AACtD,EAAAA,IAAAA,CAAI,GAAA,CAAI,UAAA,EAAYpC,6BAAA,EAAa,CAAA;AACjC,EAAAoC,IAAAA,CAAI,GAAA,CAAI,UAAA,EAAYM,6BAAA,CAAY,UAAU,CAAC,CAAA;AAG3C,EAAAN,IAAAA,CAAI,GAAA,CAAI,UAAA,EAAY,oBAAA,EAAsB,CAAA;AAK1C,EAAAA,IAAAA,CAAI,KAAA,CAAM,MAAA,EAAQnB,6BAAS,CAAA;AAC3B,EAAAmB,IAAAA,CAAI,KAAA,CAAM,YAAA,EAAcO,mCAAc,CAAA;AACtC,EAAAP,IAAAA,CAAI,KAAA,CAAM,aAAA,EAAeQ,oCAAe,CAAA;AACxC,EAAAR,IAAAA,CAAI,KAAA,CAAM,YAAA,EAAcS,mCAAc,CAAA;AACtC,EAAAT,IAAAA,CAAI,KAAA,CAAM,kBAAA,EAAoBtC,wBAAoB,CAAA;AAClD,EAAAsC,IAAAA,CAAI,KAAA,CAAM,oBAAA,EAAsBU,wCAAsB,CAAA;AACtD,EAAAV,IAAAA,CAAI,KAAA,CAAM,cAAA,EAAgBW,kCAAgB,CAAA;AAC1C,EAAAX,IAAAA,CAAI,KAAA,CAAM,iBAAA,EAAmBY,qCAAmB,CAAA;AAChD,EAAAZ,IAAAA,CAAI,KAAA,CAAM,QAAA,EAAUa,sCAAiB,CAAA;AACrC,EAAAb,IAAAA,CAAI,KAAA,CAAM,YAAA,EAAca,sCAAiB,CAAA;AACzC,EAAAb,IAAAA,CAAI,KAAA,CAAM,sBAAA,EAAwBtC,yBAAuB,CAAA;AACzD,EAAAsC,IAAAA,CAAI,KAAA,CAAM,uBAAA,EAAyB,8BAAA,EAAgC,CAAA;AACnE,EAAAA,IAAAA,CAAI,KAAA,CAAM,kBAAA,EAAoB,yBAAA,EAA2B,CAAA;AACzD,EAAAA,IAAAA,CAAI,KAAA,CAAM,gBAAA,EAAkBc,uCAAkB,CAAA;AAC9C,EAAAd,IAAAA,CAAI,KAAA,CAAM,cAAA,EAAgBe,kCAAgB,CAAA;AAE1C,EAAAf,IAAAA,CAAI,GAAA,CAAI,SAAA,EAAW,uBAAA,EAAyB,CAAA;AAG5C,EAAA,IAAI,mBAAA,CAAoB,MAAA,IAAU,mBAAA,CAAoB,MAAA,CAAO,SAAS,CAAA,EAAG;AACvE,IAAA,KAAA,MAAW,KAAA,IAAS,oBAAoB,MAAA,EAAQ;AAC9C,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAIA,EAAA,IAAI,cAAA,CAAe,MAAA,IAAU,cAAA,CAAe,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7D,IAAA,KAAA,MAAW,KAAA,IAAS,eAAe,MAAA,EAAQ;AACzC,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAO,CAAA;AAAA,IACrC;AAAA,EACF;AAIA,EAAAA,IAAAA,CAAI,KAAA,CAAM,cAAA,EAAgB,aAAA,CAAY,WAAW,CAAA;AAGjD,EAAA,IAAI,oBAAA,CAAqB,MAAA,IAAU,oBAAA,CAAqB,MAAA,CAAO,SAAS,CAAA,EAAG;AACzE,IAAA,KAAA,MAAW,KAAA,IAAS,qBAAqB,MAAA,EAAQ;AAC/C,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,IAAIgB,oCAAA,CAAmB,MAAA,IAAUA,oCAAA,CAAmB,MAAA,CAAO,SAAS,CAAA,EAAG;AACrE,IAAA,KAAA,MAAW,KAAA,IAASA,qCAAmB,MAAA,EAAQ;AAC7C,MAAAhB,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAIA,EAAA,IAAI,cAAA,CAAe,MAAA,IAAU,cAAA,CAAe,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7D,IAAA,KAAA,MAAW,KAAA,IAAS,eAAe,MAAA,EAAQ;AACzC,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,IAAI,eAAA,CAAgB,MAAA,IAAU,eAAA,CAAgB,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/D,IAAA,KAAA,MAAW,KAAA,IAAS,gBAAgB,MAAA,EAAQ;AAC1C,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAAA,IAAAA,CAAI,KAAA,CAAM,aAAA,EAAeZ,UAAe,CAAA;AAGxC,EAAA,IAAI,YAAA,CAAa,MAAA,IAAU,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA,EAAG;AACzD,IAAA,KAAA,MAAW,KAAA,IAAS,aAAa,MAAA,EAAQ;AACvC,MAAAY,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAAA,IAAAA,CAAI,KAAA,CAAM,gBAAA,EAAkBiB,mCAAiB,CAAA;AAC7C,EAAAjB,IAAAA,CAAI,KAAA,CAAM,aAAA,EAAekB,iCAAe,CAAA;AACxC,EAAAlB,IAAAA,CAAI,KAAA,CAAM,QAAA,EAAUmB,4BAAgB,CAAA;AACpC,EAAAnB,IAAAA,CAAI,KAAA,CAAM,OAAA,EAASoB,8BAAU,CAAA;AAG7B,EAAApB,IAAAA,CAAI,KAAA,CAAM,GAAA,EAAKqB,sCAAiB,CAAA;AAGhC,EAAA,IAAI,WAAA,CAAY,MAAA,IAAU,WAAA,CAAY,MAAA,CAAO,SAAS,CAAA,EAAG;AACvD,IAAA,KAAA,MAAW,KAAA,IAAS,YAAY,MAAA,EAAQ;AACtC,MAAArB,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,MAAM,kBAAkB,yBAAA,EAA0B;AAClD,EAAA,IAAI,eAAA,CAAgB,MAAA,IAAU,eAAA,CAAgB,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/D,IAAA,KAAA,MAAW,KAAA,IAAS,gBAAgB,MAAA,EAAQ;AAC1C,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAAA,IAAAA,CAAI,GAAA,CAAI,cAAA,EAAgB,CAAC,CAAA,KAAM;AAC7B,IAAA,OAAO,IAAI,SAAS,UAAA,EAAY;AAAA,MAC9B,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,eAAA;AAAA,QAChB,eAAA,EAAiB;AAAA;AACnB,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAAA,IAAAA,CAAI,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA,KAAM;AAC/B,IAAA,IAAI;AAEF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AAC7B,MAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAGrB,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAEnD,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO,EAAE,QAAA,EAAS;AAAA,MACpB;AAGA,MAAA,MAAM,SAAS,MAAM,CAAA,CAAE,GAAA,CAAI,YAAA,CAAa,IAAI,SAAS,CAAA;AAErD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,EAAE,QAAA,EAAS;AAAA,MACpB;AAGA,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,MAAA,MAAA,CAAO,cAAc,WAAA,IAAe,OAAA,CAAQ,IAAI,cAAA,EAAgB,MAAA,CAAO,aAAa,WAAW,CAAA;AAC/F,MAAA,MAAA,CAAO,cAAc,kBAAA,IAAsB,OAAA,CAAQ,IAAI,qBAAA,EAAuB,MAAA,CAAO,aAAa,kBAAkB,CAAA;AACpH,MAAA,OAAA,CAAQ,GAAA,CAAI,iBAAiB,0BAA0B,CAAA;AACvD,MAAA,OAAA,CAAQ,GAAA,CAAI,+BAA+B,GAAG,CAAA;AAC9C,MAAA,OAAA,CAAQ,GAAA,CAAI,gCAAgC,oBAAoB,CAAA;AAChE,MAAA,OAAA,CAAQ,GAAA,CAAI,gCAAgC,cAAc,CAAA;AAE1D,MAAA,OAAO,IAAI,QAAA,CAAS,MAAA,CAAO,IAAA,EAAa;AAAA,QACtC;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,EAAE,QAAA,EAAS;AAAA,IACpB;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAO,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAAA,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA,KAAM;AAClB,IAAA,OAAO,CAAA,CAAE,SAAS,aAAa,CAAA;AAAA,EACjC,CAAC,CAAA;AAGD,EAAAA,IAAAA,CAAI,GAAA,CAAI,SAAA,EAAW,CAAC,CAAA,KAAM;AACxB,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAAsB,gCAAA,CAAetB,IAAG,CAAA;AAGlB,EAAAA,IAAAA,CAAI,QAAA,CAAS,CAAC,CAAA,KAAM;AAClB,IAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,aAAa,MAAA,EAAQ,GAAA,IAAO,GAAG,CAAA;AAAA,EACxD,CAAC,CAAA;AAGD,EAAAA,IAAAA,CAAI,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACtB,IAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AACjB,IAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAyB,MAAA,EAAQ,GAAA,IAAO,GAAG,CAAA;AAAA,EACpE,CAAC,CAAA;AAED,EAAA,OAAOA,IAAAA;AACT;AAQO,SAAS,oBAAoB,IAAA,EAAwB;AAC1D,EAAA,OAAA,CAAQ,KAAK,oEAAoE,CAAA;AAEnF;AAQO,SAAS,gBAAgB,IAAA,EAAwB;AACtD,EAAA,OAAA,CAAQ,KAAK,gEAAgE,CAAA;AAE/E;AC/ZO,SAAS,SAASuB,IAAA,EAAgB;AACvC,EAAA,OAAOC,UAAA,CAAQD,IAAA,EAAI,EAAE,MAAA,EAAAE,gCAAA,EAAQ,CAAA;AAC/B;;;AC8TO,IAAM,UAAUC,iCAAA,CAAY","file":"index.cjs","sourcesContent":["import { D1Database } from '@cloudflare/workers-types'\n\nexport interface TruncateResult {\n success: boolean\n message: string\n tablesCleared: string[]\n adminUserPreserved: boolean\n errors?: string[]\n}\n\nexport interface DatabaseStats {\n tables: Array<{\n name: string\n rowCount: number\n }>\n totalRows: number\n}\n\nexport interface TableData {\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n}\n\nexport class DatabaseToolsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get database statistics\n */\n async getDatabaseStats(): Promise {\n const tables = await this.getTables()\n const stats: DatabaseStats = {\n tables: [],\n totalRows: 0\n }\n\n for (const tableName of tables) {\n try {\n const result = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const rowCount = (result?.count as number) || 0\n \n stats.tables.push({\n name: tableName,\n rowCount\n })\n stats.totalRows += rowCount\n } catch (error) {\n // Skip tables that can't be counted (might be views or system tables)\n console.warn(`Could not count rows in table ${tableName}:`, error)\n }\n }\n\n return stats\n }\n\n /**\n * Get all tables in the database\n */\n private async getTables(): Promise {\n const result = await this.db.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='table' \n AND name NOT LIKE 'sqlite_%'\n ORDER BY name\n `).all()\n\n return result.results?.map((row: any) => row.name) || []\n }\n\n /**\n * Truncate all data except admin user\n */\n async truncateAllData(adminEmail: string): Promise {\n const errors: string[] = []\n const tablesCleared: string[] = []\n let adminUserPreserved = false\n\n try {\n // First, preserve the admin user data\n const adminUser = await this.db.prepare(\n 'SELECT * FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n if (!adminUser) {\n return {\n success: false,\n message: 'Admin user not found. Operation cancelled for safety.',\n tablesCleared: [],\n adminUserPreserved: false,\n errors: ['Admin user not found']\n }\n }\n\n // Define tables to truncate (excluding system tables)\n const tablesToTruncate = [\n 'content',\n 'content_versions', \n 'content_workflow_status',\n 'collections',\n 'media',\n 'sessions',\n 'notifications',\n 'api_tokens',\n 'workflow_history',\n 'scheduled_content',\n 'faqs',\n 'faq_categories',\n 'plugins',\n 'plugin_settings',\n 'email_templates',\n 'email_themes'\n ]\n\n // Check which tables exist\n const existingTables = await this.getTables()\n const tablesToClear = tablesToTruncate.filter(table => \n existingTables.includes(table)\n )\n\n // Clear all data except users table\n for (const tableName of tablesToClear) {\n try {\n await this.db.prepare(`DELETE FROM ${tableName}`).run()\n tablesCleared.push(tableName)\n } catch (error) {\n errors.push(`Failed to clear table ${tableName}: ${error}`)\n console.error(`Error clearing table ${tableName}:`, error)\n }\n }\n\n // Clear users table but preserve admin\n try {\n await this.db.prepare('DELETE FROM users WHERE email != ? OR role != ?')\n .bind(adminEmail, 'admin').run()\n \n // Verify admin user still exists\n const verifyAdmin = await this.db.prepare(\n 'SELECT id FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n adminUserPreserved = !!verifyAdmin\n tablesCleared.push('users (non-admin)')\n } catch (error) {\n errors.push(`Failed to clear non-admin users: ${error}`)\n console.error('Error clearing non-admin users:', error)\n }\n\n // Reset auto-increment counters if supported\n try {\n await this.db.prepare('DELETE FROM sqlite_sequence').run()\n } catch (error) {\n // sqlite_sequence might not exist, ignore\n }\n\n const message = errors.length > 0 \n ? `Truncation completed with ${errors.length} errors. ${tablesCleared.length} tables cleared.`\n : `Successfully truncated database. ${tablesCleared.length} tables cleared.`\n\n return {\n success: errors.length === 0,\n message,\n tablesCleared,\n adminUserPreserved,\n errors: errors.length > 0 ? errors : undefined\n }\n\n } catch (error) {\n return {\n success: false,\n message: `Database truncation failed: ${error}`,\n tablesCleared,\n adminUserPreserved,\n errors: [String(error)]\n }\n }\n }\n\n /**\n * Create a backup of current data (simplified version)\n */\n async createBackup(): Promise<{ success: boolean; message: string; backupId?: string }> {\n try {\n const backupId = `backup_${Date.now()}`\n const stats = await this.getDatabaseStats()\n \n // In a real implementation, this would export data to a file or cloud storage\n // For now, we'll just log the stats and return success\n console.log(`Backup ${backupId} created with ${stats.totalRows} total rows`)\n \n return {\n success: true,\n message: `Backup created successfully (${stats.totalRows} rows)`,\n backupId\n }\n } catch (error) {\n return {\n success: false,\n message: `Backup failed: ${error}`\n }\n }\n }\n\n /**\n * Get table data with optional pagination and sorting\n */\n async getTableData(\n tableName: string,\n limit: number = 100,\n offset: number = 0,\n sortColumn?: string,\n sortDirection: 'asc' | 'desc' = 'asc'\n ): Promise {\n try {\n // Validate table name to prevent SQL injection\n const tables = await this.getTables()\n if (!tables.includes(tableName)) {\n throw new Error(`Table ${tableName} not found`)\n }\n\n // Get column names\n const pragmaResult = await this.db.prepare(`PRAGMA table_info(${tableName})`).all()\n const columns = pragmaResult.results?.map((col: any) => col.name) || []\n\n // Validate sort column if provided\n if (sortColumn && !columns.includes(sortColumn)) {\n sortColumn = undefined\n }\n\n // Get total row count\n const countResult = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const totalRows = (countResult?.count as number) || 0\n\n // Build query with optional sorting\n let query = `SELECT * FROM ${tableName}`\n if (sortColumn) {\n query += ` ORDER BY ${sortColumn} ${sortDirection.toUpperCase()}`\n }\n query += ` LIMIT ${limit} OFFSET ${offset}`\n\n // Get paginated data\n const dataResult = await this.db.prepare(query).all()\n\n return {\n tableName,\n columns,\n rows: dataResult.results || [],\n totalRows\n }\n } catch (error) {\n throw new Error(`Failed to fetch table data: ${error}`)\n }\n }\n\n /**\n * Validate database integrity\n */\n async validateDatabase(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n try {\n // Check critical tables exist\n const requiredTables = ['users', 'content', 'collections']\n const existingTables = await this.getTables()\n\n for (const table of requiredTables) {\n if (!existingTables.includes(table)) {\n issues.push(`Critical table missing: ${table}`)\n }\n }\n\n // Check admin user exists\n const adminCount = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM users WHERE role = ?'\n ).bind('admin').first()\n\n if ((adminCount?.count as number) === 0) {\n issues.push('No admin users found')\n }\n\n // Run SQLite integrity check\n try {\n const integrityResult = await this.db.prepare('PRAGMA integrity_check').first()\n if (integrityResult && (integrityResult as any).integrity_check !== 'ok') {\n issues.push(`Database integrity check failed: ${(integrityResult as any).integrity_check}`)\n }\n } catch (error) {\n issues.push(`Could not run integrity check: ${error}`)\n }\n\n } catch (error) {\n issues.push(`Validation error: ${error}`)\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface DatabaseTablePageData {\n user?: {\n name: string\n email: string\n role: string\n }\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n currentPage: number\n pageSize: number\n sortColumn?: string\n sortDirection?: 'asc' | 'desc'\n}\n\nexport function renderDatabaseTablePage(data: DatabaseTablePageData): string {\n const totalPages = Math.ceil(data.totalRows / data.pageSize)\n const startRow = (data.currentPage - 1) * data.pageSize + 1\n const endRow = Math.min(data.currentPage * data.pageSize, data.totalRows)\n\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n Back to Database Tools\n \n
\n

Table: ${data.tableName}

\n

\n Showing ${startRow.toLocaleString()} - ${endRow.toLocaleString()} of ${data.totalRows.toLocaleString()} rows\n

\n
\n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Refresh\n \n
\n
\n\n \n
\n \n
\n \n \n \n ${data.columns.map(col => `\n \n
\n ${col}\n ${data.sortColumn === col ? `\n \n \n \n ` : `\n \n \n \n `}\n
\n \n `).join('')}\n
\n \n \n ${data.rows.length > 0\n ? data.rows.map((row, idx) => `\n \n ${data.columns.map(col => `\n \n `).join('')}\n \n `).join('')\n : `\n \n \n \n `\n }\n \n
\n ${formatCellValue(row[col])}\n
\n \n \n \n

No data in this table

\n
\n
\n\n \n ${totalPages > 1 ? `\n
\n
\n \n Previous\n \n \n Next\n \n
\n
\n
\n

\n Page ${data.currentPage} of ${totalPages}\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Table: ${data.tableName}`,\n pageTitle: `Database: ${data.tableName}`,\n currentPath: `/admin/database-tools/tables/${data.tableName}`,\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction generatePageNumbers(currentPage: number, totalPages: number): string {\n const pages: number[] = []\n const maxVisible = 7\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (currentPage <= 4) {\n for (let i = 1; i <= 5; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n } else if (currentPage >= totalPages - 3) {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = totalPages - 4; i <= totalPages; i++) pages.push(i)\n } else {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n }\n }\n\n return pages.map(page => {\n if (page === -1) {\n return `\n \n ...\n \n `\n }\n\n const isActive = page === currentPage\n return `\n \n ${page}\n \n `\n }).join('')\n}\n\nfunction escapeHtml(text: string): string {\n const map: Record = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }\n return String(text).replace(/[&<>\"']/g, m => map[m] || m)\n}\n\nfunction formatCellValue(value: any): string {\n if (value === null || value === undefined) {\n return 'null'\n }\n if (typeof value === 'boolean') {\n return `${value}`\n }\n if (typeof value === 'object') {\n return '' + JSON.stringify(value).substring(0, 50) + (JSON.stringify(value).length > 50 ? '...' : '') + ''\n }\n const str = String(value)\n if (str.length > 100) {\n return escapeHtml(str.substring(0, 100)) + '...'\n }\n return escapeHtml(str)\n}\n","import { Hono } from 'hono'\nimport { DatabaseToolsService } from './services/database-service'\nimport { renderDatabaseTablePage, DatabaseTablePageData } from '../../../templates/pages/admin-database-table.template'\nimport { requireAuth } from '../../../middleware'\n\ntype Bindings = {\n DB: D1Database\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport function createDatabaseToolsAdminRoutes() {\n const router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Apply authentication middleware\n router.use('*', requireAuth())\n\n // Get database statistics\n router.get('/api/stats', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const stats = await service.getDatabaseStats()\n\n return c.json({\n success: true,\n data: stats\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({ \n success: false, \n error: 'Failed to fetch database statistics' \n }, 500)\n }\n })\n\n // Truncate all data except admin user\n router.post('/api/truncate', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const body = await c.req.json()\n const { confirmText } = body\n\n // Require confirmation text for safety\n if (confirmText !== 'TRUNCATE ALL DATA') {\n return c.json({\n success: false,\n error: 'Invalid confirmation text. Operation cancelled.'\n }, 400)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.truncateAllData(user.email)\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n tablesCleared: result.tablesCleared,\n adminUserPreserved: result.adminUserPreserved,\n errors: result.errors\n }\n })\n } catch (error) {\n console.error('Error truncating database:', error)\n return c.json({ \n success: false, \n error: 'Failed to truncate database' \n }, 500)\n }\n })\n\n // Create backup\n router.post('/api/backup', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.createBackup()\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n backupId: result.backupId\n }\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({ \n success: false, \n error: 'Failed to create backup' \n }, 500)\n }\n })\n\n // Validate database\n router.get('/api/validate', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const validation = await service.validateDatabase()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n })\n\n // Get table data (API endpoint)\n router.get('/api/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const tableName = c.req.param('tableName')\n const limit = parseInt(c.req.query('limit') || '100')\n const offset = parseInt(c.req.query('offset') || '0')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, limit, offset, sortColumn, sortDirection)\n\n return c.json({\n success: true,\n data: tableData\n })\n } catch (error) {\n console.error('Error fetching table data:', error)\n return c.json({\n success: false,\n error: `Failed to fetch table data: ${error}`\n }, 500)\n }\n })\n\n // View table data page\n router.get('/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.redirect('/admin/login')\n }\n\n const tableName = c.req.param('tableName')\n const page = parseInt(c.req.query('page') || '1')\n const pageSize = parseInt(c.req.query('pageSize') || '20')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const offset = (page - 1) * pageSize\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, pageSize, offset, sortColumn, sortDirection)\n\n const pageData: DatabaseTablePageData = {\n user: {\n name: user.email.split('@')[0] || 'Unknown',\n email: user.email,\n role: user.role\n },\n tableName: tableData.tableName,\n columns: tableData.columns,\n rows: tableData.rows,\n totalRows: tableData.totalRows,\n currentPage: page,\n pageSize: pageSize,\n sortColumn: sortColumn,\n sortDirection: sortDirection\n }\n\n return c.html(renderDatabaseTablePage(pageData))\n } catch (error) {\n console.error('Error rendering table page:', error)\n return c.text(`Error: ${error}`, 500)\n }\n })\n\n return router\n}","import type { D1Database } from '@cloudflare/workers-types'\n\nexport class SeedDataService {\n constructor(private db: D1Database) {}\n\n // First names for generating realistic users\n private firstNames = [\n 'Emma', 'Liam', 'Olivia', 'Noah', 'Ava', 'Ethan', 'Sophia', 'Mason',\n 'Isabella', 'William', 'Mia', 'James', 'Charlotte', 'Benjamin', 'Amelia',\n 'Lucas', 'Harper', 'Henry', 'Evelyn', 'Alexander'\n ]\n\n // Last names for generating realistic users\n private lastNames = [\n 'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis',\n 'Rodriguez', 'Martinez', 'Hernandez', 'Lopez', 'Gonzalez', 'Wilson', 'Anderson',\n 'Thomas', 'Taylor', 'Moore', 'Jackson', 'Martin'\n ]\n\n // Content titles for blog posts\n private blogTitles = [\n 'Getting Started with Modern Web Development',\n 'The Future of JavaScript Frameworks',\n 'Building Scalable Applications with Microservices',\n 'Understanding TypeScript: A Complete Guide',\n 'Best Practices for API Design',\n 'Introduction to Cloud Computing',\n 'Mastering Git and Version Control',\n 'The Art of Code Review',\n 'Performance Optimization Techniques',\n 'Security Best Practices for Web Apps',\n 'Exploring Serverless Architecture',\n 'Database Design Fundamentals',\n 'Testing Strategies for Modern Apps',\n 'CI/CD Pipeline Implementation',\n 'Mobile-First Development Approach'\n ]\n\n // Content titles for pages\n private pageTitles = [\n 'About Us', 'Contact', 'Privacy Policy', 'Terms of Service',\n 'FAQ', 'Our Team', 'Careers', 'Press Kit',\n 'Support', 'Documentation', 'Pricing', 'Features'\n ]\n\n // Content titles for products\n private productTitles = [\n 'Premium Wireless Headphones',\n 'Smart Watch Pro',\n 'Laptop Stand Adjustable',\n 'Mechanical Keyboard RGB',\n 'HD Webcam 4K',\n 'USB-C Hub 7-in-1',\n 'Portable SSD 1TB',\n 'Wireless Mouse Ergonomic',\n 'Monitor 27\" 4K',\n 'Desk Lamp LED',\n 'Phone Case Premium',\n 'Tablet Stand Aluminum',\n 'Cable Management Kit',\n 'Power Bank 20000mAh',\n 'Bluetooth Speaker Portable'\n ]\n\n // Content for generating blog posts\n private blogContent = [\n 'This comprehensive guide covers everything you need to know about modern development practices and tools.',\n 'Learn the fundamentals and advanced concepts that will help you build better applications.',\n 'Discover the latest trends and best practices used by industry professionals.',\n 'A deep dive into the technologies and methodologies shaping the future of software development.',\n 'Practical tips and real-world examples to improve your development workflow.',\n 'Explore cutting-edge techniques and proven strategies for building robust applications.',\n 'Master the essential skills needed to excel in modern software development.',\n 'An in-depth look at the tools and frameworks that power today\\'s web applications.',\n 'Step-by-step instructions and expert insights for developers of all levels.',\n 'Understanding the core principles that drive successful software projects.'\n ]\n\n // Generate a random ID\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n\n // Generate a slug from a title\n private generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n }\n\n // Generate random date within the last year\n private randomDate(): Date {\n const now = new Date()\n const yearAgo = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate())\n const randomTime = yearAgo.getTime() + Math.random() * (now.getTime() - yearAgo.getTime())\n return new Date(randomTime)\n }\n\n // Create 20 example users\n async createUsers(): Promise {\n const roles = ['admin', 'editor', 'author', 'viewer']\n // const hashedPassword = await bcrypt.hash('password123', 10)\n const hashedPassword = 'password123' // TODO: Use actual bcrypt hash\n\n let count = 0\n for (let i = 0; i < 20; i++) {\n const firstName = this.firstNames[Math.floor(Math.random() * this.firstNames.length)] || 'John'\n const lastName = this.lastNames[Math.floor(Math.random() * this.lastNames.length)] || 'Doe'\n const username = `${firstName.toLowerCase()}${lastName.toLowerCase()}${i}`\n const email = `${username}@example.com`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n\n const stmt = this.db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, last_login_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n email,\n username,\n firstName,\n lastName,\n hashedPassword,\n roles[Math.floor(Math.random() * roles.length)],\n Math.random() > 0.1 ? 1 : 0, // 90% active\n Math.random() > 0.3 ? createdAtTimestamp : null,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Create 200 content items across different types\n async createContent(): Promise {\n // Get all users and collections\n const usersStmt = this.db.prepare('SELECT * FROM users')\n const { results: allUsers } = await usersStmt.all()\n\n const collectionsStmt = this.db.prepare('SELECT * FROM collections')\n const { results: allCollections } = await collectionsStmt.all()\n\n if (!allUsers || allUsers.length === 0) {\n throw new Error('No users found. Please create users first.')\n }\n\n if (!allCollections || allCollections.length === 0) {\n throw new Error('No collections found. Please create collections first.')\n }\n\n const statuses = ['draft', 'published', 'archived']\n\n // Create 200 content items\n let count = 0\n for (let i = 0; i < 200; i++) {\n const collection: any = allCollections[Math.floor(Math.random() * allCollections.length)]\n const author: any = allUsers[Math.floor(Math.random() * allUsers.length)]\n const status = statuses[Math.floor(Math.random() * statuses.length)]\n\n let title: string\n let contentData: any\n\n // Generate content based on collection type\n if (collection.name === 'blog_posts' || collection.name.includes('blog')) {\n title = this.blogTitles[Math.floor(Math.random() * this.blogTitles.length)] || 'Untitled Blog Post'\n contentData = {\n body: this.blogContent[Math.floor(Math.random() * this.blogContent.length)] || 'Blog content here',\n excerpt: 'A brief introduction to this article that provides an overview of the main topics covered.',\n tags: this.generateTags(),\n featured: Math.random() > 0.7\n }\n } else if (collection.name === 'pages' || collection.name.includes('page')) {\n title = this.pageTitles[Math.floor(Math.random() * this.pageTitles.length)] || 'Untitled Page'\n contentData = {\n body: 'This is a standard page with important information about our services and policies.',\n template: 'default',\n showInMenu: Math.random() > 0.5\n }\n } else if (collection.name === 'products' || collection.name.includes('product')) {\n title = this.productTitles[Math.floor(Math.random() * this.productTitles.length)] || 'Untitled Product'\n contentData = {\n description: 'High-quality product with excellent features and great value for money.',\n price: (Math.random() * 500 + 10).toFixed(2),\n sku: `SKU-${Math.random().toString(36).substr(2, 9).toUpperCase()}`,\n inStock: Math.random() > 0.2,\n rating: (Math.random() * 2 + 3).toFixed(1) // 3.0 - 5.0\n }\n } else {\n // Generic content\n title = `${collection.display_name || collection.name} Item ${i + 1}`\n contentData = {\n description: 'This is a sample content item with generic data.',\n value: Math.floor(Math.random() * 1000)\n }\n }\n\n const slug = `${this.generateSlug(title)}-${i}`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n const publishedAtTimestamp = status === 'published' ? createdAtTimestamp : null\n\n const stmt = this.db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, published_at, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n collection.id,\n slug,\n `${title} ${i}`,\n JSON.stringify(contentData),\n status,\n publishedAtTimestamp,\n author.id,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Generate random tags for blog posts\n private generateTags(): string[] {\n const allTags = [\n 'tutorial', 'guide', 'javascript', 'typescript', 'web-dev',\n 'backend', 'frontend', 'best-practices', 'security', 'performance',\n 'testing', 'deployment', 'cloud', 'database', 'api'\n ]\n\n const numTags = Math.floor(Math.random() * 4) + 1 // 1-4 tags\n const shuffled = allTags.sort(() => 0.5 - Math.random())\n return shuffled.slice(0, numTags)\n }\n\n // Seed all data\n async seedAll(): Promise<{ users: number; content: number }> {\n const userCount = await this.createUsers()\n const contentCount = await this.createContent()\n\n return {\n users: userCount,\n content: contentCount\n }\n }\n\n // Clear all seed data (optional cleanup method)\n async clearSeedData(): Promise {\n // Delete content first (due to foreign key constraints)\n const deleteContentStmt = this.db.prepare('DELETE FROM content')\n await deleteContentStmt.run()\n\n // Delete users (but keep admin users)\n const deleteUsersStmt = this.db.prepare(\n \"DELETE FROM users WHERE role != 'admin'\"\n )\n await deleteUsersStmt.run()\n }\n}\n","import { Hono } from 'hono'\nimport { SeedDataService } from './services/seed-data-service'\n\ntype Bindings = {\n DB: D1Database\n}\n\nexport function createSeedDataAdminRoutes() {\n const routes = new Hono<{ Bindings: Bindings }>()\n\n // Get seed data status/info\n routes.get('/', async (c) => {\n const html = `\n \n \n \n Seed Data - SonicJS Admin\n \n \n \n \n \n
\n ← Back to Plugin Settings\n

🌱 Seed Data Generator

\n

\n Generate realistic example data for testing and development. This will create 20 users and 200 content items with realistic data.\n

\n\n
\n ⚠️ Warning: This will create new data in your database. Make sure you're not running this in production!\n
\n\n
\n
\n\n
\n

What will be created?

\n
    \n
  • 20 Users: With realistic names, emails, and various roles (admin, editor, author, viewer)
  • \n
  • 200 Content Items: Including blog posts, pages, and products with realistic titles and data
  • \n
  • All passwords: Set to \"password123\" for testing
  • \n
  • Random dates: Created within the last year
  • \n
  • Various statuses: Draft, published, and archived content
  • \n
\n
\n\n
\n

Generate Seed Data

\n

Click the button below to generate example data. This may take a few moments.

\n \n
\n\n
\n

Clear Seed Data

\n

Remove all users and content from the database (except admin users).

\n \n
\n
\n\n \n \n \n `\n return c.html(html)\n })\n\n // Generate seed data\n routes.post('/generate', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n const result = await seedService.seedAll()\n\n return c.json({\n success: true,\n users: result.users,\n content: result.content\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n // Clear seed data\n routes.post('/clear', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n await seedService.clearSeedData()\n\n return c.json({\n success: true\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n return routes\n}\n","/**\n * Email Plugin\n *\n * Send transactional emails using Resend\n * Handles registration, verification, password reset, and one-time codes\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\nexport function createEmailPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'email',\n version: '1.0.0-beta.1',\n description: 'Send transactional emails using Resend'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Create the Email Settings route (POST only - GET is handled by generic plugin settings page)\n const emailRoutes = new Hono()\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // POST endpoint for saving settings\n emailRoutes.post('/settings', async (c: any) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n // Update plugin settings in database\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'email'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving email settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n })\n\n // POST endpoint for test email\n emailRoutes.post('/test', async (c: any) => {\n try {\n const db = c.env.DB\n const body = await c.req.json()\n\n // Load settings from database\n const plugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (!plugin?.settings) {\n return c.json({\n success: false,\n error: 'Email settings not configured. Please save your settings first.'\n }, 400)\n }\n\n const settings = JSON.parse(plugin.settings)\n\n // Validate required settings\n if (!settings.apiKey || !settings.fromEmail || !settings.fromName) {\n return c.json({\n success: false,\n error: 'Missing required settings. Please configure API Key, From Email, and From Name.'\n }, 400)\n }\n\n // Use provided email or fallback to fromEmail\n const toEmail = body.toEmail || settings.fromEmail\n\n // Validate email format\n if (!toEmail.match(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)) {\n return c.json({\n success: false,\n error: 'Invalid email address format'\n }, 400)\n }\n\n // Send test email via Resend API\n const response = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${settings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${settings.fromName} <${settings.fromEmail}>`,\n to: [toEmail],\n subject: 'Test Email from SonicJS',\n html: `\n
\n

Test Email Successful! 🎉

\n

This is a test email from your SonicJS Email plugin.

\n

Configuration:

\n
    \n
  • From: ${settings.fromName} <${settings.fromEmail}>
  • \n
  • Reply-To: ${settings.replyTo || 'Not set'}
  • \n
  • Sent at: ${new Date().toISOString()}
  • \n
\n

Your email settings are working correctly!

\n
\n `,\n reply_to: settings.replyTo || settings.fromEmail\n })\n })\n\n const data = await response.json() as any\n\n if (!response.ok) {\n console.error('Resend API error:', data)\n return c.json({\n success: false,\n error: data.message || 'Failed to send test email. Check your API key and domain verification.'\n }, response.status)\n }\n\n return c.json({\n success: true,\n message: `Test email sent successfully to ${toEmail}`,\n emailId: data.id\n })\n\n } catch (error: any) {\n console.error('Test email error:', error)\n return c.json({\n success: false,\n error: error.message || 'An error occurred while sending test email'\n }, 500)\n }\n })\n\n // Register the route\n builder.addRoute('/admin/plugins/email', emailRoutes, {\n description: 'Email plugin settings',\n requiresAuth: true,\n priority: 80\n })\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('Email', '/admin/plugins/email', {\n icon: 'envelope',\n order: 80,\n permissions: ['email:manage']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Email plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Email plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const emailPlugin = createEmailPlugin()\n","/**\n * OTP Service\n * Handles OTP code generation, verification, and management\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\nexport interface OTPSettings {\n codeLength: number\n codeExpiryMinutes: number\n maxAttempts: number\n rateLimitPerHour: number\n allowNewUserRegistration: boolean\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nexport interface OTPCode {\n id: string\n user_email: string\n code: string\n expires_at: number\n used: number\n used_at: number | null\n ip_address: string | null\n user_agent: string | null\n attempts: number\n created_at: number\n}\n\nexport class OTPService {\n constructor(private db: D1Database) {}\n\n /**\n * Generate a secure random OTP code\n */\n generateCode(length: number = 6): string {\n const digits = '0123456789'\n let code = ''\n\n for (let i = 0; i < length; i++) {\n const randomValues = new Uint8Array(1)\n crypto.getRandomValues(randomValues)\n const randomValue = randomValues[0] ?? 0\n code += digits[randomValue % digits.length]\n }\n\n return code\n }\n\n /**\n * Create and store a new OTP code\n */\n async createOTPCode(\n email: string,\n settings: OTPSettings,\n ipAddress?: string,\n userAgent?: string\n ): Promise {\n const code = this.generateCode(settings.codeLength)\n const id = crypto.randomUUID()\n const now = Date.now()\n const expiresAt = now + (settings.codeExpiryMinutes * 60 * 1000)\n\n const otpCode: OTPCode = {\n id,\n user_email: email.toLowerCase(),\n code,\n expires_at: expiresAt,\n used: 0,\n used_at: null,\n ip_address: ipAddress || null,\n user_agent: userAgent || null,\n attempts: 0,\n created_at: now\n }\n\n await this.db.prepare(`\n INSERT INTO otp_codes (\n id, user_email, code, expires_at, used, used_at,\n ip_address, user_agent, attempts, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n otpCode.id,\n otpCode.user_email,\n otpCode.code,\n otpCode.expires_at,\n otpCode.used,\n otpCode.used_at,\n otpCode.ip_address,\n otpCode.user_agent,\n otpCode.attempts,\n otpCode.created_at\n ).run()\n\n return otpCode\n }\n\n /**\n * Verify an OTP code\n */\n async verifyCode(\n email: string,\n code: string,\n settings: OTPSettings\n ): Promise<{ valid: boolean; attemptsRemaining?: number; error?: string }> {\n const normalizedEmail = email.toLowerCase()\n const now = Date.now()\n\n // Find the most recent unused code for this email\n const otpCode = await this.db.prepare(`\n SELECT * FROM otp_codes\n WHERE user_email = ? AND code = ? AND used = 0\n ORDER BY created_at DESC\n LIMIT 1\n `).bind(normalizedEmail, code).first() as OTPCode | null\n\n if (!otpCode) {\n return { valid: false, error: 'Invalid or expired code' }\n }\n\n // Check if expired\n if (now > otpCode.expires_at) {\n return { valid: false, error: 'Code has expired' }\n }\n\n // Check attempts\n if (otpCode.attempts >= settings.maxAttempts) {\n return { valid: false, error: 'Maximum attempts exceeded' }\n }\n\n // Code is valid - mark as used\n await this.db.prepare(`\n UPDATE otp_codes\n SET used = 1, used_at = ?, attempts = attempts + 1\n WHERE id = ?\n `).bind(now, otpCode.id).run()\n\n return { valid: true }\n }\n\n /**\n * Increment failed attempt count\n */\n async incrementAttempts(email: string, code: string): Promise {\n const normalizedEmail = email.toLowerCase()\n\n const result = await this.db.prepare(`\n UPDATE otp_codes\n SET attempts = attempts + 1\n WHERE user_email = ? AND code = ? AND used = 0\n RETURNING attempts\n `).bind(normalizedEmail, code).first() as { attempts: number } | null\n\n return result?.attempts || 0\n }\n\n /**\n * Check rate limiting\n */\n async checkRateLimit(email: string, settings: OTPSettings): Promise {\n const normalizedEmail = email.toLowerCase()\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n\n const result = await this.db.prepare(`\n SELECT COUNT(*) as count\n FROM otp_codes\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as { count: number } | null\n\n const count = result?.count || 0\n return count < settings.rateLimitPerHour\n }\n\n /**\n * Get recent OTP requests for activity log\n */\n async getRecentRequests(limit: number = 50): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM otp_codes\n ORDER BY created_at DESC\n LIMIT ?\n `).bind(limit).all()\n\n const rows = (result.results || []) as Record[]\n return rows.map(row => this.mapRowToOTP(row))\n }\n\n /**\n * Clean up expired codes (for maintenance)\n */\n async cleanupExpiredCodes(): Promise {\n const now = Date.now()\n\n const result = await this.db.prepare(`\n DELETE FROM otp_codes\n WHERE expires_at < ? OR (used = 1 AND used_at < ?)\n `).bind(now, now - (30 * 24 * 60 * 60 * 1000)).run() // Keep used codes for 30 days\n\n return result.meta.changes || 0\n }\n\n private mapRowToOTP(row: Record): OTPCode {\n return {\n id: String(row.id),\n user_email: String(row.user_email),\n code: String(row.code),\n expires_at: Number(row.expires_at ?? Date.now()),\n used: Number(row.used ?? 0),\n used_at: row.used_at === null || row.used_at === undefined ? null : Number(row.used_at),\n ip_address: typeof row.ip_address === 'string' ? row.ip_address : null,\n user_agent: typeof row.user_agent === 'string' ? row.user_agent : null,\n attempts: Number(row.attempts ?? 0),\n created_at: Number(row.created_at ?? Date.now())\n }\n }\n\n /**\n * Get OTP statistics\n */\n async getStats(days: number = 7): Promise<{\n total: number\n successful: number\n failed: number\n expired: number\n }> {\n const since = Date.now() - (days * 24 * 60 * 60 * 1000)\n\n const stats = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as successful,\n SUM(CASE WHEN attempts >= 3 AND used = 0 THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN expires_at < ? AND used = 0 THEN 1 ELSE 0 END) as expired\n FROM otp_codes\n WHERE created_at > ?\n `).bind(Date.now(), since).first() as any\n\n return {\n total: stats?.total || 0,\n successful: stats?.successful || 0,\n failed: stats?.failed || 0,\n expired: stats?.expired || 0\n }\n }\n}\n","/**\n * OTP Email Templates\n * HTML and plain text templates for OTP codes\n */\n\nexport interface OTPEmailData {\n code: string\n expiryMinutes: number\n codeLength: number\n maxAttempts: number\n email: string\n ipAddress?: string\n timestamp: string\n appName: string\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nfunction sanitizeColor(value?: string): string {\n if (!value) return ''\n // Allow #rgb, #rrggbb, #rrggbbaa, named colors, rgb()/rgba()/hsl()/hsla()\n if (/^#[0-9a-fA-F]{3,8}$/.test(value)) return value\n if (/^[a-zA-Z]+$/.test(value)) return value\n if (/^(rgb|rgba|hsl|hsla)\\([0-9.,\\s%]+\\)$/.test(value)) return value\n return ''\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport function renderOTPEmailHTML(data: OTPEmailData): string {\n const logoUrl = data.logoUrl ? escapeHtml(data.logoUrl) : ''\n const loginUrl = data.loginUrl ? escapeHtml(data.loginUrl) : ''\n const appName = escapeHtml(data.appName)\n const loginButtonText = escapeHtml(\n (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n )\n const logoWidth = Math.max(20, Math.min(600, Number(data.logoWidth) || 150))\n const logoBorderWidth = Math.max(0, Math.min(20, Number(data.logoBorderWidth) || 0))\n const logoBorderColor = sanitizeColor(data.logoBorderColor)\n const logoBorderStyle = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${logoBorderColor}; border-radius: 8px;`\n : ''\n\n return `\n\n\n \n \n Your Login Code\n\n\n\n
\n\n ${logoUrl ? `\n
\n \"${appName}\"\n
\n ` : ''}\n\n
\n

Your Login Code

\n

Enter this code to sign in to ${appName}

\n
\n\n
\n
\n
\n ${data.code}\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${data.expiryMinutes} minutes\n

\n
\n\n
\n

Quick Tips:

\n
    \n
  • Enter the code exactly as shown (${data.codeLength} digits)
  • \n
  • The code can only be used once
  • \n
  • You have ${data.maxAttempts} attempts to enter the correct code
  • \n
  • Request a new code if this one expires
  • \n
\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${appName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n\n
\n

\n Didn't request this code?
\n Someone may have entered your email by mistake. You can safely ignore this email.\n

\n\n
\n

This email was sent to ${escapeHtml(data.email)}

\n ${data.ipAddress ? `

IP Address: ${escapeHtml(data.ipAddress)}

` : ''}\n

Time: ${escapeHtml(data.timestamp)}

\n
\n
\n\n
\n\n
\n

© ${new Date().getFullYear()} ${appName}. All rights reserved.

\n
\n\n\n`\n}\n\nexport function renderOTPEmailText(data: OTPEmailData): string {\n const ctaLabel = (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n return `Your Login Code for ${data.appName}\n\nYour one-time verification code is:\n\n${data.code}\n\nThis code expires in ${data.expiryMinutes} minutes.\n${data.loginUrl ? `\\n${ctaLabel}: ${data.loginUrl}\\n` : ''}\n\nQuick Tips:\n• Enter the code exactly as shown (${data.codeLength} digits)\n• The code can only be used once\n• You have ${data.maxAttempts} attempts to enter the correct code\n• Request a new code if this one expires\n\nSecurity Notice:\nNever share this code with anyone. ${data.appName} will never ask you for this code via phone, email, or social media.\n\nDidn't request this code?\nSomeone may have entered your email by mistake. You can safely ignore this email.\n\n---\nThis email was sent to ${data.email}\n${data.ipAddress ? `IP Address: ${data.ipAddress}` : ''}\nTime: ${data.timestamp}\n\n© ${new Date().getFullYear()} ${data.appName}. All rights reserved.`\n}\n\nexport function renderOTPEmail(data: OTPEmailData): { html: string; text: string } {\n return {\n html: renderOTPEmailHTML(data),\n text: renderOTPEmailText(data)\n }\n}\n","/**\n * OTP Login Plugin\n *\n * Passwordless authentication via email one-time codes\n * Users receive a secure 6-digit code to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { setCookie } from 'hono/cookie'\nimport { z } from 'zod'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\nimport { OTPService, type OTPSettings } from './otp-service'\nimport { renderOTPEmail } from './email-templates'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\nimport { SettingsService } from '../../../services/settings'\nimport { getCustomData } from '../user-profiles'\n\n// Validation schemas\nconst otpRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nconst otpVerifySchema = z.object({\n email: z.string().email('Valid email is required'),\n code: z.string().min(4).max(8)\n})\n\n// Default settings (site name comes from general settings)\nconst DEFAULT_SETTINGS: OTPSettings = {\n codeLength: 6,\n codeExpiryMinutes: 10,\n maxAttempts: 3,\n rateLimitPerHour: 5,\n allowNewUserRegistration: false,\n logoUrl: '',\n logoWidth: 150,\n logoBorderWidth: 0,\n logoBorderColor: '#ffffff',\n loginUrl: '',\n loginButtonText: ''\n}\n\nexport function createOTPLoginPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'otp-login',\n version: '1.0.0-beta.1',\n description: 'Passwordless authentication via email one-time codes'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== API Routes ====================\n\n const otpAPI = new Hono()\n\n // POST /auth/otp/request - Request OTP code\n otpAPI.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings: OTPSettings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Get site name from general settings\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName\n\n // Check rate limiting\n const canRequest = await otpService.checkRateLimit(normalizedEmail, settings)\n if (!canRequest) {\n return c.json({\n error: 'Too many requests. Please try again in an hour.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && !settings.allowNewUserRegistration) {\n // Don't reveal if user exists or not (security)\n return c.json({\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Get IP and user agent\n const ipAddress = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n\n // Create OTP code\n const otpCode = await otpService.createOTPCode(\n normalizedEmail,\n settings,\n ipAddress,\n userAgent\n )\n\n // Send email via Email plugin\n try {\n const isDevMode = c.env.ENVIRONMENT === 'development'\n\n if (isDevMode) {\n console.log(`[DEV] OTP Code for ${normalizedEmail}: ${otpCode.code}`)\n }\n\n // Prepare email content\n const emailContent = renderOTPEmail({\n code: otpCode.code,\n expiryMinutes: settings.codeExpiryMinutes,\n codeLength: settings.codeLength,\n maxAttempts: settings.maxAttempts,\n email: normalizedEmail,\n ipAddress,\n timestamp: new Date().toISOString(),\n appName: siteName,\n logoUrl: settings.logoUrl || '',\n logoWidth: settings.logoWidth,\n logoBorderWidth: settings.logoBorderWidth,\n logoBorderColor: settings.logoBorderColor || '',\n loginUrl: settings.loginUrl || '',\n loginButtonText: settings.loginButtonText || ''\n })\n\n // Load email plugin settings from database\n // Note: We don't check status='active' because the email plugin's\n // settings UI works regardless of status, so we follow the same pattern\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (emailPlugin?.settings) {\n const emailSettings = JSON.parse(emailPlugin.settings)\n\n if (emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName) {\n // Send email via Resend API\n const emailResponse = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${emailSettings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${emailSettings.fromName} <${emailSettings.fromEmail}>`,\n to: [normalizedEmail],\n subject: `Your login code for ${siteName}`,\n html: emailContent.html,\n text: emailContent.text,\n reply_to: emailSettings.replyTo || emailSettings.fromEmail\n })\n })\n\n if (!emailResponse.ok) {\n const errorData = await emailResponse.json() as { message?: string }\n console.error('Failed to send OTP email via Resend:', errorData)\n // Don't expose error to user for security - just log it\n }\n } else {\n console.warn('Email plugin is not fully configured (missing apiKey, fromEmail, or fromName)')\n }\n } else {\n console.warn('Email plugin is not active or has no settings configured')\n }\n\n const response: any = {\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n }\n\n // In development, include the code\n if (isDevMode) {\n response.dev_code = otpCode.code\n }\n\n return c.json(response)\n } catch (emailError) {\n console.error('Error sending OTP email:', emailError)\n return c.json({\n error: 'Failed to send verification code. Please try again.'\n }, 500)\n }\n } catch (error) {\n console.error('OTP request error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/verify - Verify OTP code\n otpAPI.post('/verify', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpVerifySchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email, code } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Verify the code\n const verification = await otpService.verifyCode(normalizedEmail, code, settings)\n\n if (!verification.valid) {\n // Increment attempts on failure\n await otpService.incrementAttempts(normalizedEmail, code)\n\n return c.json({\n error: verification.error || 'Invalid code',\n attemptsRemaining: verification.attemptsRemaining\n }, 401)\n }\n\n // Code is valid - get user\n let user = await db.prepare(`\n SELECT id, email, username, first_name, last_name, role, is_active, created_at\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && settings.allowNewUserRegistration) {\n // Auto-create new user on first OTP verification\n const userId = crypto.randomUUID()\n const now = Date.now()\n const username = normalizedEmail.split('@')[0] + '_' + userId.slice(0, 6)\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, '', '', NULL, 'viewer', 1, 1, ?, ?)\n `).bind(userId, normalizedEmail, username, now, now).run()\n\n user = {\n id: userId,\n email: normalizedEmail,\n username,\n first_name: '',\n last_name: '',\n role: 'viewer',\n is_active: 1,\n created_at: now,\n }\n }\n\n if (!user) {\n return c.json({\n error: 'User not found'\n }, 404)\n }\n\n if (!user.is_active) {\n return c.json({\n error: 'Account is deactivated'\n }, 403)\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env as any)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, (c.env as any).JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n const customData = await getCustomData(db, user.id)\n const { is_active, ...publicUser } = user\n\n return c.json({\n success: true,\n user: {\n ...publicUser,\n ...customData,\n },\n token,\n message: 'Authentication successful'\n })\n } catch (error) {\n console.error('OTP verify error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/resend - Resend OTP code\n otpAPI.post('/resend', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n // Reuse the request endpoint logic\n return otpAPI.fetch(\n new Request(c.req.url.replace('/resend', '/request'), {\n method: 'POST',\n headers: c.req.raw.headers,\n body: JSON.stringify({ email: validation.data.email })\n }),\n c.env\n )\n } catch (error) {\n console.error('OTP resend error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // Register API routes\n builder.addRoute('/auth/otp', otpAPI, {\n description: 'OTP authentication endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('OTP Login', '/admin/plugins/otp-login', {\n icon: 'key',\n order: 85,\n permissions: ['otp:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OTP Login plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OTP Login plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const otpLoginPlugin = createOTPLoginPlugin()\n","/**\n * OAuth Service\n * Handles OAuth2 authorization code flow, token exchange, and user info fetching.\n * Provider-agnostic — each provider is a simple config object.\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n// ─── Provider Configuration ─────────────────────────────────────────────────\n\nexport interface OAuthProviderConfig {\n id: string\n name: string\n authorizeUrl: string\n tokenUrl: string\n userInfoUrl: string\n scopes: string[]\n /** Map provider profile JSON to a normalized user profile */\n mapProfile: (profile: Record) => OAuthUserProfile\n}\n\nexport interface OAuthUserProfile {\n providerAccountId: string\n email: string\n name: string\n avatar?: string\n}\n\nexport interface OAuthPluginSettings {\n providers: Record\n}\n\n// ─── Built-in Providers ─────────────────────────────────────────────────────\n\nexport const GITHUB_PROVIDER: OAuthProviderConfig = {\n id: 'github',\n name: 'GitHub',\n authorizeUrl: 'https://github.com/login/oauth/authorize',\n tokenUrl: 'https://github.com/login/oauth/access_token',\n userInfoUrl: 'https://api.github.com/user',\n scopes: ['read:user', 'user:email'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || profile.login || '',\n avatar: profile.avatar_url || undefined\n })\n}\n\nexport const GOOGLE_PROVIDER: OAuthProviderConfig = {\n id: 'google',\n name: 'Google',\n authorizeUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n scopes: ['openid', 'email', 'profile'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || '',\n avatar: profile.picture || undefined\n })\n}\n\nexport const BUILT_IN_PROVIDERS: Record = {\n github: GITHUB_PROVIDER,\n google: GOOGLE_PROVIDER\n}\n\n// ─── OAuth Account DB Record ────────────────────────────────────────────────\n\nexport interface OAuthAccount {\n id: string\n user_id: string\n provider: string\n provider_account_id: string\n access_token: string | null\n refresh_token: string | null\n token_expires_at: number | null\n profile_data: string | null\n created_at: number\n updated_at: number\n}\n\n// ─── OAuth Service ──────────────────────────────────────────────────────────\n\nexport class OAuthService {\n constructor(private db: D1Database) {}\n\n /**\n * Build the authorization redirect URL for a provider.\n */\n buildAuthorizeUrl(\n provider: OAuthProviderConfig,\n clientId: string,\n redirectUri: string,\n state: string\n ): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope: provider.scopes.join(' '),\n state\n })\n\n // Google requires access_type for refresh tokens\n if (provider.id === 'google') {\n params.set('access_type', 'offline')\n params.set('prompt', 'consent')\n }\n\n return `${provider.authorizeUrl}?${params.toString()}`\n }\n\n /**\n * Exchange authorization code for tokens using native fetch.\n */\n async exchangeCode(\n provider: OAuthProviderConfig,\n clientId: string,\n clientSecret: string,\n code: string,\n redirectUri: string\n ): Promise<{ access_token: string; refresh_token?: string; expires_in?: number }> {\n const body: Record = {\n client_id: clientId,\n client_secret: clientSecret,\n code,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code'\n }\n\n const response = await fetch(provider.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json'\n },\n body: new URLSearchParams(body).toString()\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Token exchange failed (${response.status}): ${errorText}`)\n }\n\n const data = await response.json() as Record\n\n if (data.error) {\n throw new Error(`Token exchange error: ${data.error_description || data.error}`)\n }\n\n return {\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n expires_in: data.expires_in ? Number(data.expires_in) : undefined\n }\n }\n\n /**\n * Fetch user profile from the provider's userinfo endpoint.\n */\n async fetchUserProfile(\n provider: OAuthProviderConfig,\n accessToken: string\n ): Promise {\n const headers: Record = {\n 'Authorization': `Bearer ${accessToken}`,\n 'Accept': 'application/json'\n }\n\n // GitHub uses a different auth header format\n if (provider.id === 'github') {\n headers['Authorization'] = `token ${accessToken}`\n }\n\n const response = await fetch(provider.userInfoUrl, { headers })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch user profile (${response.status})`)\n }\n\n const profile = await response.json() as Record\n\n // For GitHub, email may not be in the profile — fetch from /user/emails\n if (provider.id === 'github' && !profile.email) {\n const emailResponse = await fetch('https://api.github.com/user/emails', {\n headers: {\n 'Authorization': `token ${accessToken}`,\n 'Accept': 'application/json'\n }\n })\n\n if (emailResponse.ok) {\n const emails = await emailResponse.json() as Array<{ email: string; primary: boolean; verified: boolean }>\n const primaryEmail = emails.find(e => e.primary && e.verified)\n if (primaryEmail) {\n profile.email = primaryEmail.email\n }\n }\n }\n\n return provider.mapProfile(profile)\n }\n\n // ─── Database Operations ────────────────────────────────────────────────\n\n /**\n * Find an existing OAuth account link.\n */\n async findOAuthAccount(\n provider: string,\n providerAccountId: string\n ): Promise {\n return await this.db.prepare(`\n SELECT * FROM oauth_accounts\n WHERE provider = ? AND provider_account_id = ?\n `).bind(provider, providerAccountId).first() as OAuthAccount | null\n }\n\n /**\n * Find all OAuth accounts for a user.\n */\n async findUserOAuthAccounts(userId: string): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM oauth_accounts WHERE user_id = ?\n `).bind(userId).all()\n return (result.results || []) as unknown as OAuthAccount[]\n }\n\n /**\n * Create a new OAuth account link.\n */\n async createOAuthAccount(params: {\n userId: string\n provider: string\n providerAccountId: string\n accessToken: string\n refreshToken?: string\n tokenExpiresAt?: number\n profileData?: string\n }): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO oauth_accounts (\n id, user_id, provider, provider_account_id,\n access_token, refresh_token, token_expires_at,\n profile_data, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n params.userId,\n params.provider,\n params.providerAccountId,\n params.accessToken,\n params.refreshToken || null,\n params.tokenExpiresAt || null,\n params.profileData || null,\n now,\n now\n ).run()\n\n return {\n id,\n user_id: params.userId,\n provider: params.provider,\n provider_account_id: params.providerAccountId,\n access_token: params.accessToken,\n refresh_token: params.refreshToken || null,\n token_expires_at: params.tokenExpiresAt || null,\n profile_data: params.profileData || null,\n created_at: now,\n updated_at: now\n }\n }\n\n /**\n * Update tokens for an existing OAuth account.\n */\n async updateOAuthTokens(\n id: string,\n accessToken: string,\n refreshToken?: string,\n tokenExpiresAt?: number\n ): Promise {\n await this.db.prepare(`\n UPDATE oauth_accounts\n SET access_token = ?, refresh_token = ?, token_expires_at = ?, updated_at = ?\n WHERE id = ?\n `).bind(accessToken, refreshToken || null, tokenExpiresAt || null, Date.now(), id).run()\n }\n\n /**\n * Unlink an OAuth account from a user (only if they have another auth method).\n */\n async unlinkOAuthAccount(userId: string, provider: string): Promise {\n // Check user has a password or another OAuth link before unlinking\n const user = await this.db.prepare(`\n SELECT password_hash FROM users WHERE id = ?\n `).bind(userId).first() as { password_hash: string | null } | null\n\n const otherLinks = await this.db.prepare(`\n SELECT COUNT(*) as count FROM oauth_accounts\n WHERE user_id = ? AND provider != ?\n `).bind(userId, provider).first() as { count: number } | null\n\n const hasPassword = !!user?.password_hash\n const hasOtherLinks = (otherLinks?.count || 0) > 0\n\n if (!hasPassword && !hasOtherLinks) {\n return false // Cannot unlink the only auth method\n }\n\n await this.db.prepare(`\n DELETE FROM oauth_accounts WHERE user_id = ? AND provider = ?\n `).bind(userId, provider).run()\n\n return true\n }\n\n /**\n * Find a user by email.\n */\n async findUserByEmail(email: string): Promise<{\n id: string\n email: string\n role: string\n is_active: number\n first_name: string\n last_name: string\n } | null> {\n return await this.db.prepare(`\n SELECT id, email, role, is_active, first_name, last_name\n FROM users WHERE email = ?\n `).bind(email.toLowerCase()).first() as any\n }\n\n /**\n * Create a new user from an OAuth profile.\n */\n async createUserFromOAuth(profile: OAuthUserProfile): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n const email = profile.email.toLowerCase()\n const nameParts = (profile.name || email.split('@')[0] || 'User').split(' ')\n const firstName = nameParts[0] || 'User'\n const lastName = nameParts.slice(1).join(' ') || ''\n const username = email.split('@')[0] || id.substring(0, 8)\n\n // Check for username collision and append random suffix if needed\n const existing = await this.db.prepare(\n 'SELECT id FROM users WHERE username = ?'\n ).bind(username).first()\n\n const finalUsername = existing\n ? `${username}-${id.substring(0, 6)}`\n : username\n\n await this.db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, avatar, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', ?, 1, ?, ?)\n `).bind(\n id, email, finalUsername, firstName, lastName,\n profile.avatar || null, now, now\n ).run()\n\n return id\n }\n\n /**\n * Generate a cryptographically random state parameter for CSRF protection.\n */\n generateState(): string {\n const bytes = new Uint8Array(32)\n crypto.getRandomValues(bytes)\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')\n }\n}\n","/**\n * OAuth Providers Plugin\n *\n * OAuth2/OIDC social login support for SonicJS.\n * Phase 1: Core OAuth2 authorization code flow with GitHub and Google providers.\n *\n * Routes:\n * GET /auth/oauth/:provider → Redirect to provider authorization\n * GET /auth/oauth/:provider/callback → Handle OAuth callback\n * POST /auth/oauth/link → Link OAuth provider to logged-in account\n * POST /auth/oauth/unlink → Unlink OAuth provider from account\n * GET /auth/oauth/accounts → List linked OAuth accounts for current user\n */\n\nimport { Hono } from 'hono'\nimport { setCookie, getCookie } from 'hono/cookie'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport {\n OAuthService,\n BUILT_IN_PROVIDERS,\n type OAuthPluginSettings,\n type OAuthProviderConfig\n} from './oauth-service'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst STATE_COOKIE_NAME = 'oauth_state'\nconst STATE_COOKIE_MAX_AGE = 600 // 10 minutes\n\nexport function createOAuthProvidersPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'oauth-providers',\n version: '1.0.0-beta.1',\n description: 'OAuth2/OIDC social login with GitHub, Google, and more'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== Helper Functions ====================\n\n function getCallbackUrl(c: any, provider: string): string {\n const proto = c.req.header('x-forwarded-proto') || 'https'\n const host = c.req.header('host') || 'localhost'\n return `${proto}://${host}/auth/oauth/${provider}/callback`\n }\n\n async function loadSettings(db: any): Promise {\n const row = await db.prepare(\n `SELECT settings FROM plugins WHERE id = 'oauth-providers'`\n ).first() as { settings: string | null } | null\n\n if (!row?.settings) return null\n\n try {\n return JSON.parse(row.settings) as OAuthPluginSettings\n } catch {\n return null\n }\n }\n\n function getProviderCredentials(\n settings: OAuthPluginSettings | null,\n providerId: string\n ): { clientId: string; clientSecret: string } | null {\n if (!settings?.providers?.[providerId]) return null\n const p = settings.providers[providerId]\n if (!p.enabled || !p.clientId || !p.clientSecret) return null\n return { clientId: p.clientId, clientSecret: p.clientSecret }\n }\n\n // ==================== API Routes ====================\n\n const oauthAPI = new Hono()\n\n // GET /auth/oauth/:provider — Redirect to provider authorization\n oauthAPI.get('/:provider', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.json({ error: `Unknown OAuth provider: ${providerId}` }, 400)\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.json({\n error: `OAuth provider \"${providerId}\" is not configured or not enabled`\n }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Store state in a cookie for CSRF validation on callback\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax', // Lax required for OAuth redirect flow\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n providerConfig,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.redirect(authorizeUrl)\n } catch (error) {\n console.error('OAuth authorize error:', error)\n return c.json({ error: 'Failed to initiate OAuth flow' }, 500)\n }\n })\n\n // GET /auth/oauth/:provider/callback — Handle OAuth callback\n oauthAPI.get('/:provider/callback', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.redirect('/auth/login?error=Unknown OAuth provider')\n }\n\n // Validate state (CSRF protection)\n const stateParam = c.req.query('state')\n const stateCookie = getCookie(c, STATE_COOKIE_NAME)\n\n if (!stateParam || !stateCookie || stateParam !== stateCookie) {\n return c.redirect('/auth/login?error=Invalid OAuth state. Please try again.')\n }\n\n // Clear the state cookie\n setCookie(c, STATE_COOKIE_NAME, '', {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: 0,\n path: '/auth/oauth'\n })\n\n // Check for error from provider\n const errorParam = c.req.query('error')\n if (errorParam) {\n const errorDesc = c.req.query('error_description') || errorParam\n return c.redirect(`/auth/login?error=${encodeURIComponent(errorDesc)}`)\n }\n\n const code = c.req.query('code')\n if (!code) {\n return c.redirect('/auth/login?error=No authorization code received')\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.redirect('/auth/login?error=OAuth provider not configured')\n }\n\n const oauthService = new OAuthService(db)\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Exchange code for tokens\n const tokens = await oauthService.exchangeCode(\n providerConfig,\n creds.clientId,\n creds.clientSecret,\n code,\n redirectUri\n )\n\n // Fetch user profile from provider\n const profile = await oauthService.fetchUserProfile(providerConfig, tokens.access_token)\n\n if (!profile.email) {\n return c.redirect('/auth/login?error=Could not retrieve email from OAuth provider. Please ensure your email is public or grant email permission.')\n }\n\n const tokenExpiresAt = tokens.expires_in\n ? Date.now() + (tokens.expires_in * 1000)\n : null\n\n // Check if this OAuth account is already linked to a user\n const existingOAuth = await oauthService.findOAuthAccount(providerId, profile.providerAccountId)\n\n if (existingOAuth) {\n // Existing OAuth link — update tokens and log in\n await oauthService.updateOAuthTokens(\n existingOAuth.id,\n tokens.access_token,\n tokens.refresh_token,\n tokenExpiresAt ?? undefined\n )\n\n // Fetch user to generate JWT\n const user = await db.prepare(\n 'SELECT id, email, role, is_active FROM users WHERE id = ?'\n ).bind(existingOAuth.user_id).first() as any\n\n if (!user || !user.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n user.id, user.email, user.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // No existing OAuth link — check if user exists by email\n const existingUser = await oauthService.findUserByEmail(profile.email)\n\n if (existingUser) {\n if (!existingUser.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n // Link OAuth to existing account\n await oauthService.createOAuthAccount({\n userId: existingUser.id,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n existingUser.id, existingUser.email, existingUser.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // Brand new user — create account from OAuth profile\n const newUserId = await oauthService.createUserFromOAuth(profile)\n\n await oauthService.createOAuthAccount({\n userId: newUserId,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n newUserId, profile.email.toLowerCase(), 'viewer',\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n\n } catch (error) {\n console.error('OAuth callback error:', error)\n const message = error instanceof Error ? error.message : 'OAuth authentication failed'\n return c.redirect(`/auth/login?error=${encodeURIComponent(message)}`)\n }\n })\n\n // POST /auth/oauth/link — Link an OAuth provider to the current logged-in user\n oauthAPI.post('/link', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider || !BUILT_IN_PROVIDERS[provider]) {\n return c.json({ error: 'Invalid provider' }, 400)\n }\n\n // Redirect the user to the OAuth flow — the callback will auto-link\n // since the user already exists by email\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, provider)\n\n if (!creds) {\n return c.json({ error: `OAuth provider \"${provider}\" is not configured` }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, provider)\n\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n BUILT_IN_PROVIDERS[provider]!,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.json({ redirectUrl: authorizeUrl })\n } catch (error) {\n console.error('OAuth link error:', error)\n return c.json({ error: 'Failed to initiate account linking' }, 500)\n }\n })\n\n // POST /auth/oauth/unlink — Unlink an OAuth provider from the current user\n oauthAPI.post('/unlink', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider) {\n return c.json({ error: 'Provider is required' }, 400)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const success = await oauthService.unlinkOAuthAccount(user.userId, provider)\n\n if (!success) {\n return c.json({\n error: 'Cannot unlink the only authentication method. Set a password first.'\n }, 400)\n }\n\n return c.json({ success: true, message: `${provider} account unlinked` })\n } catch (error) {\n console.error('OAuth unlink error:', error)\n return c.json({ error: 'Failed to unlink account' }, 500)\n }\n })\n\n // GET /auth/oauth/accounts — List linked OAuth accounts for current user\n oauthAPI.get('/accounts', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const accounts = await oauthService.findUserOAuthAccounts(user.userId)\n\n return c.json({\n accounts: accounts.map(a => ({\n provider: a.provider,\n providerAccountId: a.provider_account_id,\n linkedAt: a.created_at\n }))\n })\n } catch (error) {\n console.error('OAuth accounts error:', error)\n return c.json({ error: 'Failed to fetch linked accounts' }, 500)\n }\n })\n\n // Register routes\n builder.addRoute('/auth/oauth', oauthAPI, {\n description: 'OAuth2 social login endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Add menu item for admin settings\n builder.addMenuItem('OAuth Providers', '/admin/plugins/oauth-providers', {\n icon: 'shield',\n order: 86,\n permissions: ['oauth:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OAuth Providers plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OAuth Providers plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const oauthProvidersPlugin = createOAuthProvidersPlugin()\n","/**\n * Embedding Service\n * Generates embeddings using Cloudflare Workers AI\n */\n\nexport class EmbeddingService {\n constructor(private ai: any) {}\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string): Promise {\n try {\n // Use Cloudflare Workers AI embedding model\n // @cf/baai/bge-base-en-v1.5 produces 768-dimensional vectors\n const response = await this.ai.run('@cf/baai/bge-base-en-v1.5', {\n text: this.preprocessText(text)\n })\n\n // Extract embedding vector\n if (response.data && response.data.length > 0) {\n return response.data[0]\n }\n\n throw new Error('No embedding data returned')\n } catch (error) {\n console.error('[EmbeddingService] Error generating embedding:', error)\n throw error\n }\n }\n\n /**\n * Generate embeddings for multiple texts (batch processing)\n */\n async generateBatch(texts: string[]): Promise {\n try {\n // Process in smaller batches to avoid rate limits\n const batchSize = 10\n const batches: string[][] = []\n \n for (let i = 0; i < texts.length; i += batchSize) {\n batches.push(texts.slice(i, i + batchSize))\n }\n\n const allEmbeddings: number[][] = []\n\n for (const batch of batches) {\n const batchEmbeddings = await Promise.all(\n batch.map(text => this.generateEmbedding(text))\n )\n allEmbeddings.push(...batchEmbeddings)\n }\n\n return allEmbeddings\n } catch (error) {\n console.error('[EmbeddingService] Error generating batch embeddings:', error)\n throw error\n }\n }\n\n /**\n * Preprocess text before generating embedding\n * - Trim whitespace\n * - Limit length to avoid token limits\n * - Remove special characters that might cause issues\n */\n private preprocessText(text: string): string {\n if (!text) return ''\n\n // Trim and normalize whitespace\n let processed = text.trim().replace(/\\s+/g, ' ')\n\n // Limit to ~8000 characters (rough token limit)\n if (processed.length > 8000) {\n processed = processed.substring(0, 8000)\n }\n\n return processed\n }\n\n /**\n * Calculate cosine similarity between two embeddings\n */\n cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Embeddings must have same dimensions')\n }\n\n let dotProduct = 0\n let normA = 0\n let normB = 0\n\n for (let i = 0; i < a.length; i++) {\n const aVal = a[i] ?? 0\n const bVal = b[i] ?? 0\n dotProduct += aVal * bVal\n normA += aVal * aVal\n normB += bVal * bVal\n }\n\n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB))\n }\n}\n","/**\n * Chunking Service\n * Splits content into optimal chunks for embedding and search\n */\n\nexport interface ContentChunk {\n id: string\n content_id: string\n collection_id: string\n title: string\n text: string\n chunk_index: number\n metadata: Record\n}\n\nexport class ChunkingService {\n // Default chunk size (in approximate tokens)\n private readonly CHUNK_SIZE = 500\n private readonly CHUNK_OVERLAP = 50\n\n /**\n * Chunk a single content item\n */\n chunkContent(\n contentId: string,\n collectionId: string,\n title: string,\n data: any,\n metadata: Record = {}\n ): ContentChunk[] {\n // Extract all text from content\n const text = this.extractText(data)\n \n if (!text || text.trim().length === 0) {\n console.warn(`[ChunkingService] No text found for content ${contentId}`)\n return []\n }\n\n // Split into chunks\n const textChunks = this.splitIntoChunks(text)\n\n // Create chunk objects\n return textChunks.map((chunkText, index) => ({\n id: `${contentId}_chunk_${index}`,\n content_id: contentId,\n collection_id: collectionId,\n title: title,\n text: chunkText,\n chunk_index: index,\n metadata: {\n ...metadata,\n total_chunks: textChunks.length\n }\n }))\n }\n\n /**\n * Chunk multiple content items\n */\n chunkContentBatch(items: Array<{\n id: string\n collection_id: string\n title: string\n data: any\n metadata?: Record\n }>): ContentChunk[] {\n const allChunks: ContentChunk[] = []\n\n for (const item of items) {\n const chunks = this.chunkContent(\n item.id,\n item.collection_id,\n item.title,\n item.data,\n item.metadata\n )\n allChunks.push(...chunks)\n }\n\n return allChunks\n }\n\n /**\n * Extract all text from content data\n */\n private extractText(data: any): string {\n const parts: string[] = []\n\n // Common text fields\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n if (data.summary) parts.push(String(data.summary))\n\n // Recursively extract from nested objects\n const extractRecursive = (obj: any): void => {\n if (typeof obj === 'string') {\n // Skip very short strings and URLs\n if (obj.length > 10 && !obj.startsWith('http')) {\n parts.push(obj)\n }\n } else if (Array.isArray(obj)) {\n obj.forEach(extractRecursive)\n } else if (obj && typeof obj === 'object') {\n // Skip certain keys\n const skipKeys = ['id', 'slug', 'url', 'image', 'thumbnail', 'metadata']\n \n Object.entries(obj).forEach(([key, value]) => {\n if (!skipKeys.includes(key.toLowerCase())) {\n extractRecursive(value)\n }\n })\n }\n }\n\n extractRecursive(data)\n\n return parts.join('\\n\\n').trim()\n }\n\n /**\n * Split text into overlapping chunks\n */\n private splitIntoChunks(text: string): string[] {\n // Split by words\n const words = text.split(/\\s+/)\n \n if (words.length <= this.CHUNK_SIZE) {\n return [text]\n }\n\n const chunks: string[] = []\n let startIndex = 0\n\n while (startIndex < words.length) {\n // Get chunk with overlap\n const endIndex = Math.min(startIndex + this.CHUNK_SIZE, words.length)\n const chunk = words.slice(startIndex, endIndex).join(' ')\n chunks.push(chunk)\n\n // Move forward by chunk size minus overlap\n startIndex += this.CHUNK_SIZE - this.CHUNK_OVERLAP\n\n // Ensure we don't create a tiny last chunk\n if (startIndex >= words.length - this.CHUNK_OVERLAP) {\n break\n }\n }\n\n return chunks\n }\n\n /**\n * Get optimal chunk size based on content type\n */\n getOptimalChunkSize(contentType: string): number {\n switch (contentType) {\n case 'blog_posts':\n case 'articles':\n return 600 // Larger chunks for long-form content\n case 'products':\n case 'pages':\n return 400 // Medium chunks for structured content\n case 'messages':\n case 'comments':\n return 200 // Small chunks for short content\n default:\n return this.CHUNK_SIZE\n }\n }\n}\n","/**\n * Custom RAG Service\n * Implements full RAG pipeline using Cloudflare Vectorize\n * \n * Fulfills GitHub Issue #362: Advanced search with Cloudflare Search\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { EmbeddingService } from './embedding.service'\nimport { ChunkingService, type ContentChunk } from './chunking.service'\nimport type { SearchQuery, SearchResponse, SearchResult, AISearchSettings } from '../types'\n\nexport class CustomRAGService {\n private embeddingService: EmbeddingService\n private chunkingService: ChunkingService\n\n constructor(\n private db: D1Database,\n private ai: any,\n private vectorize: any\n ) {\n this.embeddingService = new EmbeddingService(ai)\n this.chunkingService = new ChunkingService()\n }\n\n /**\n * Index all content from a collection\n */\n async indexCollection(collectionId: string): Promise<{\n total_items: number\n total_chunks: number\n indexed_chunks: number\n errors: number\n }> {\n console.log(`[CustomRAG] Starting indexing for collection: ${collectionId}`)\n \n try {\n // Get all published content from collection\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.collection_id = ? AND c.status = 'published'\n `)\n .bind(collectionId)\n .all<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n const totalItems = contentItems?.length || 0\n \n if (totalItems === 0) {\n console.log(`[CustomRAG] No content found in collection ${collectionId}`)\n return { total_items: 0, total_chunks: 0, indexed_chunks: 0, errors: 0 }\n }\n\n // Chunk all content\n const items = (contentItems || []).map(item => ({\n id: item.id,\n collection_id: item.collection_id,\n title: item.title || 'Untitled',\n data: typeof item.data === 'string' ? JSON.parse(item.data) : item.data,\n metadata: {\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name\n }\n }))\n\n const chunks = this.chunkingService.chunkContentBatch(items)\n const totalChunks = chunks.length\n\n console.log(`[CustomRAG] Generated ${totalChunks} chunks from ${totalItems} items`)\n\n // Generate embeddings in batches\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n console.log(`[CustomRAG] Generated ${embeddings.length} embeddings`)\n\n // Store in Vectorize\n let indexedChunks = 0\n let errors = 0\n const batchSize = 100\n\n for (let i = 0; i < chunks.length; i += batchSize) {\n const chunkBatch = chunks.slice(i, i + batchSize)\n const embeddingBatch = embeddings.slice(i, i + batchSize)\n\n try {\n await this.vectorize.upsert(\n chunkBatch.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddingBatch[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500), // Store snippet for display\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n indexedChunks += chunkBatch.length\n console.log(`[CustomRAG] Indexed batch ${i / batchSize + 1}: ${chunkBatch.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error indexing batch ${i / batchSize + 1}:`, error)\n errors += chunkBatch.length\n }\n }\n\n console.log(`[CustomRAG] Indexing complete: ${indexedChunks}/${totalChunks} chunks indexed`)\n\n return {\n total_items: totalItems,\n total_chunks: totalChunks,\n indexed_chunks: indexedChunks,\n errors\n }\n } catch (error) {\n console.error(`[CustomRAG] Error indexing collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Search using RAG (semantic search with Vectorize)\n */\n async search(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n\n try {\n console.log(`[CustomRAG] Searching for: \"${query.query}\"`)\n\n // Generate query embedding\n const queryEmbedding = await this.embeddingService.generateEmbedding(query.query)\n\n // Build Vectorize query filters\n const filter: any = {}\n \n if (query.filters?.collections && query.filters.collections.length > 0) {\n filter.collection_id = { $in: query.filters.collections }\n } else if (settings.selected_collections.length > 0) {\n filter.collection_id = { $in: settings.selected_collections }\n }\n\n if (query.filters?.status && query.filters.status.length > 0) {\n filter.status = { $in: query.filters.status }\n }\n\n // Vectorize filters have issues, so we query without filter and manually filter results\n const vectorResults = await this.vectorize.query(queryEmbedding, {\n topK: 50, // Max allowed with returnMetadata: true\n returnMetadata: true\n })\n\n // Manually filter results by collection_id if filter exists\n let filteredMatches = vectorResults.matches || []\n if (filter.collection_id?.$in && Array.isArray(filter.collection_id.$in)) {\n const allowedCollections = filter.collection_id.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedCollections.includes(match.metadata?.collection_id)\n )\n }\n\n // Apply status filter if exists\n if (filter.status?.$in && Array.isArray(filter.status.$in)) {\n const allowedStatuses = filter.status.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedStatuses.includes(match.metadata?.status)\n )\n }\n\n // Limit to requested topK\n const topK = query.limit || settings.results_limit || 20\n filteredMatches = filteredMatches.slice(0, topK)\n\n // Replace matches with filtered results\n vectorResults.matches = filteredMatches\n\n if (!vectorResults.matches || vectorResults.matches.length === 0) {\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: 'ai'\n }\n }\n\n // Get unique content IDs\n const contentIds = [...new Set(\n vectorResults.matches.map((m: any) => m.metadata.content_id)\n )]\n\n // Fetch full content from D1\n const placeholders = contentIds.map(() => '?').join(',')\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.display_name as collection_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id IN (${placeholders})\n `)\n .bind(...contentIds)\n .all<{\n id: string\n title: string\n slug: string\n collection_id: string\n collection_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n }>()\n\n // Map results with relevance scores\n const searchResults: SearchResult[] = (contentItems || []).map(item => {\n // Find best matching chunk for this content\n const matchingChunks = vectorResults.matches.filter(\n (m: any) => m.metadata.content_id === item.id\n )\n \n const bestMatch = matchingChunks.reduce((best: any, current: any) => \n current.score > (best?.score || 0) ? current : best\n , null)\n\n return {\n id: item.id,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n collection_id: item.collection_id,\n collection_name: item.collection_name,\n snippet: bestMatch?.metadata?.text || '',\n relevance_score: bestMatch?.score || 0,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at\n }\n })\n\n // Sort by relevance score\n searchResults.sort((a, b) => (b.relevance_score || 0) - (a.relevance_score || 0))\n\n const queryTime = Date.now() - startTime\n console.log(`[CustomRAG] Search completed in ${queryTime}ms, ${searchResults.length} results`)\n\n return {\n results: searchResults,\n total: searchResults.length,\n query_time_ms: queryTime,\n mode: 'ai'\n }\n } catch (error) {\n console.error('[CustomRAG] Search error:', error)\n throw error\n }\n }\n\n /**\n * Update index for a single content item\n */\n async updateContentIndex(contentId: string): Promise {\n try {\n // Get content item\n const content = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n .bind(contentId)\n .first<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!content) {\n console.warn(`[CustomRAG] Content ${contentId} not found`)\n return\n }\n\n // If content is not published, remove from index\n if (content.status !== 'published') {\n await this.removeContentFromIndex(contentId)\n return\n }\n\n // Chunk content\n const chunks = this.chunkingService.chunkContent(\n content.id,\n content.collection_id,\n content.title || 'Untitled',\n typeof content.data === 'string' ? JSON.parse(content.data) : content.data,\n {\n status: content.status,\n created_at: content.created_at,\n updated_at: content.updated_at,\n author_id: content.author_id,\n collection_name: content.collection_name,\n collection_display_name: content.collection_display_name\n }\n )\n\n // Generate embeddings\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n // Update in Vectorize\n await this.vectorize.upsert(\n chunks.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddings[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500),\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n console.log(`[CustomRAG] Updated index for content ${contentId}: ${chunks.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error updating index for ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove content from index\n */\n async removeContentFromIndex(contentId: string): Promise {\n try {\n // Note: Vectorize doesn't have a bulk delete by metadata filter\n // We need to delete each chunk individually\n // In practice, we would track chunk IDs or use a different approach\n \n console.log(`[CustomRAG] Removing content ${contentId} from index`)\n \n // For now, we'll let stale chunks age out\n // A better approach would be to maintain a mapping in D1\n // TODO: Implement proper chunk tracking\n \n } catch (error) {\n console.error(`[CustomRAG] Error removing content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Get search suggestions based on query\n */\n async getSuggestions(partialQuery: string, limit: number = 5): Promise {\n try {\n // Generate embedding for partial query\n const queryEmbedding = await this.embeddingService.generateEmbedding(partialQuery)\n\n // Search for similar content titles\n const results = await this.vectorize.query(queryEmbedding, {\n topK: limit * 2, // Get more to filter\n returnMetadata: true\n })\n\n // Extract unique titles\n const suggestions = [...new Set(\n results.matches?.map((m: any) => m.metadata.title).filter(Boolean) || []\n )].slice(0, limit)\n\n return suggestions as string[]\n } catch (error) {\n console.error('[CustomRAG] Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Check if Vectorize is available and configured\n */\n isAvailable(): boolean {\n return !!this.vectorize && !!this.ai\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n NewCollectionNotification,\n} from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * AI Search Service\n * Handles search operations, settings management, and collection detection\n * Now uses Custom RAG with Vectorize for semantic search\n */\nexport class AISearchService {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[AISearchService] Custom RAG initialized')\n } else {\n console.log('[AISearchService] Custom RAG not available, using keyword search only')\n }\n }\n\n /**\n * Get plugin settings\n */\n async getSettings(): Promise {\n try {\n const plugin = await this.db\n .prepare(`SELECT settings FROM plugins WHERE id = ? LIMIT 1`)\n .bind('ai-search')\n .first<{ settings: string | null }>()\n\n if (!plugin || !plugin.settings) {\n return this.getDefaultSettings()\n }\n\n return JSON.parse(plugin.settings) as AISearchSettings\n } catch (error) {\n console.error('Error fetching AI Search settings:', error)\n return this.getDefaultSettings()\n }\n }\n\n /**\n * Get default settings\n */\n getDefaultSettings(): AISearchSettings {\n return {\n enabled: true,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n }\n\n /**\n * Update plugin settings\n */\n async updateSettings(settings: Partial): Promise {\n const existing = await this.getSettings()\n const updated: AISearchSettings = {\n ...existing!,\n ...settings,\n }\n\n try {\n // Update plugin settings in plugins table\n await this.db\n .prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'ai-search'\n `)\n .bind(JSON.stringify(updated))\n .run()\n\n return updated\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n throw error\n }\n }\n\n /**\n * Detect new collections that aren't indexed or dismissed\n */\n async detectNewCollections(): Promise {\n try {\n // Get all collections (exclude test collections)\n // Note: D1 doesn't support parameterized LIKE, so we filter in JavaScript\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: number\n name: string\n display_name: string\n description?: string\n }>()\n \n // Filter out test collections (starts with test_, ends with _test, or is test_collection)\n const collections = (allCollections || []).filter(\n (col) => {\n if (!col.name) return false\n const name = col.name.toLowerCase()\n return !name.startsWith('test_') && \n !name.endsWith('_test') && \n name !== 'test_collection' &&\n !name.includes('_test_') &&\n name !== 'large_payload_test' &&\n name !== 'concurrent_test'\n }\n )\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n\n // Get item counts for each collection\n const notifications: NewCollectionNotification[] = []\n\n for (const collection of collections || []) {\n const collectionId = String(collection.id)\n\n // Skip if already selected or dismissed\n if (selected.includes(collectionId) || dismissed.includes(collectionId)) {\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n notifications.push({\n collection: {\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: false,\n is_dismissed: false,\n is_new: true,\n },\n message: `New collection \"${collection.display_name}\" with ${itemCount} items available for indexing`,\n })\n }\n\n return notifications\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return []\n }\n }\n\n /**\n * Get all collections with indexing status\n */\n async getAllCollections(): Promise {\n try {\n // Get all collections (same query as content page)\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1 ORDER BY display_name'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: string\n name: string\n display_name: string\n description?: string\n }>()\n \n console.log('[AISearchService.getAllCollections] Raw collections from DB:', allCollections?.length || 0)\n const firstCollection = allCollections?.[0]\n if (firstCollection) {\n console.log('[AISearchService.getAllCollections] Sample collection:', {\n id: firstCollection.id,\n name: firstCollection.name,\n display_name: firstCollection.display_name\n })\n }\n \n // No filtering needed - test collections are now properly cleaned up by E2E tests\n const collections = (allCollections || []).filter(\n (col) => col.id && col.name\n )\n \n console.log('[AISearchService.getAllCollections] After filtering test collections:', collections.length)\n console.log('[AISearchService.getAllCollections] Remaining collections:', collections.map(c => c.name).join(', '))\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n \n console.log('[AISearchService.getAllCollections] Settings:', {\n selected_count: selected.length,\n dismissed_count: dismissed.length,\n selected: selected\n })\n\n // Get item counts and indexing status\n const collectionInfos: CollectionInfo[] = []\n\n for (const collection of collections) {\n if (!collection.id || !collection.name) continue\n const collectionId = String(collection.id)\n \n if (!collectionId) {\n console.warn('[AISearchService] Skipping invalid collection:', collection)\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n collectionInfos.push({\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name || collection.name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: selected.includes(collectionId),\n is_dismissed: dismissed.includes(collectionId),\n is_new: !selected.includes(collectionId) && !dismissed.includes(collectionId),\n })\n }\n \n console.log('[AISearchService.getAllCollections] Returning collectionInfos:', collectionInfos.length)\n const firstInfo = collectionInfos[0]\n if (collectionInfos.length > 0 && firstInfo) {\n console.log('[AISearchService.getAllCollections] First collectionInfo:', {\n id: firstInfo.id,\n name: firstInfo.name,\n display_name: firstInfo.display_name,\n item_count: firstInfo.item_count\n })\n }\n return collectionInfos\n } catch (error) {\n console.error('[AISearchService] Error fetching collections:', error)\n return []\n }\n }\n\n /**\n * Execute search query\n */\n async search(query: SearchQuery): Promise {\n const startTime = Date.now()\n const settings = await this.getSettings()\n\n if (!settings?.enabled) {\n return {\n results: [],\n total: 0,\n query_time_ms: 0,\n mode: query.mode,\n }\n }\n\n // Use AI Search if enabled and mode is 'ai'\n if (query.mode === 'ai' && settings.ai_mode_enabled && this.customRAG?.isAvailable()) {\n return this.searchAI(query, settings)\n }\n\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n\n /**\n * AI-powered semantic search using Custom RAG\n */\n private async searchAI(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n \n try {\n if (!this.customRAG) {\n console.warn('[AISearchService] CustomRAG not available, falling back to keyword search')\n return this.searchKeyword(query, settings)\n }\n\n // Use Custom RAG for semantic search - pass the full query object and settings\n const result = await this.customRAG.search(query, settings)\n\n return result\n } catch (error) {\n console.error('[AISearchService] AI search error, falling back to keyword:', error)\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n }\n\n /**\n * Traditional keyword search\n */\n private async searchKeyword(\n query: SearchQuery,\n settings: AISearchSettings\n ): Promise {\n const startTime = Date.now()\n\n try {\n const conditions: string[] = []\n const params: any[] = []\n\n // Search query\n if (query.query) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n const searchTerm = `%${query.query}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n // Collection filter\n if (query.filters?.collections && query.filters.collections.length > 0) {\n const placeholders = query.filters.collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...query.filters.collections)\n } else if (settings.selected_collections.length > 0) {\n // Only search indexed collections\n const placeholders = settings.selected_collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...settings.selected_collections)\n }\n\n // Status filter\n if (query.filters?.status && query.filters.status.length > 0) {\n const placeholders = query.filters.status.map(() => '?').join(',')\n conditions.push(`c.status IN (${placeholders})`)\n params.push(...query.filters.status)\n } else {\n // Exclude deleted by default\n conditions.push(\"c.status != 'deleted'\")\n }\n\n // Date range filter\n if (query.filters?.dateRange) {\n const field = query.filters.dateRange.field || 'created_at'\n if (query.filters.dateRange.start) {\n conditions.push(`c.${field} >= ?`)\n params.push(query.filters.dateRange.start.getTime())\n }\n if (query.filters.dateRange.end) {\n conditions.push(`c.${field} <= ?`)\n params.push(query.filters.dateRange.end.getTime())\n }\n }\n\n // Author filter\n if (query.filters?.author) {\n conditions.push('c.author_id = ?')\n params.push(query.filters.author)\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get results\n const limit = query.limit || settings.results_limit\n const offset = query.offset || 0\n\n const resultsStmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id, c.data,\n col.name as collection_name, col.display_name as collection_display_name,\n u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results } = await resultsStmt.bind(...params, limit, offset).all<{\n id: string\n title: string\n slug: string\n collection_id: number\n collection_name: string\n collection_display_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n author_email?: string\n data: string\n }>()\n\n const searchResults: SearchResult[] = (results || []).map((row) => ({\n id: String(row.id),\n title: row.title || 'Untitled',\n slug: row.slug || '',\n collection_id: String(row.collection_id),\n collection_name: row.collection_display_name || row.collection_name,\n snippet: this.extractSnippet(row.data, query.query),\n status: row.status,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n author_name: row.author_email,\n }))\n\n const queryTime = Date.now() - startTime\n\n // Log search history\n await this.logSearch(query.query, query.mode, searchResults.length)\n\n return {\n results: searchResults,\n total,\n query_time_ms: queryTime,\n mode: query.mode,\n }\n } catch (error) {\n console.error('Keyword search error:', error)\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: query.mode,\n }\n }\n }\n\n /**\n * Extract snippet from content data\n */\n private extractSnippet(data: string, query: string): string {\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data\n const text = JSON.stringify(parsed).toLowerCase()\n const queryLower = query.toLowerCase()\n\n const index = text.indexOf(queryLower)\n if (index === -1) {\n // Return first 200 chars\n return JSON.stringify(parsed).substring(0, 200) + '...'\n }\n\n // Extract context around match\n const start = Math.max(0, index - 50)\n const end = Math.min(text.length, index + query.length + 50)\n return text.substring(start, end) + '...'\n } catch {\n return data.substring(0, 200) + '...'\n }\n }\n\n /**\n * Get search suggestions (autocomplete)\n */\n async getSearchSuggestions(partial: string): Promise {\n try {\n const settings = await this.getSettings()\n if (!settings?.autocomplete_enabled) {\n return []\n }\n\n // If Custom RAG is available, use AI-powered suggestions\n if (this.customRAG?.isAvailable()) {\n try {\n const aiSuggestions = await this.customRAG.getSuggestions(partial, 5)\n if (aiSuggestions.length > 0) {\n return aiSuggestions\n }\n } catch (error) {\n console.error('[AISearchService] Error getting AI suggestions:', error)\n // Fall through to history-based suggestions\n }\n }\n\n // Fallback to history-based suggestions\n const stmt = this.db.prepare(`\n SELECT DISTINCT query \n FROM ai_search_history \n WHERE query LIKE ? \n ORDER BY created_at DESC \n LIMIT 10\n `)\n const { results } = await stmt.bind(`%${partial}%`).all<{ query: string }>()\n\n return (results || []).map((r) => r.query)\n } catch (error) {\n console.error('Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Log search query to history\n */\n private async logSearch(query: string, mode: 'ai' | 'keyword', resultsCount: number): Promise {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_history (query, mode, results_count, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await stmt.bind(query, mode, resultsCount, Date.now()).run()\n } catch (error) {\n console.error('Error logging search:', error)\n }\n }\n\n /**\n * Get search analytics\n */\n async getSearchAnalytics(): Promise<{\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }> {\n try {\n // Total queries (last 30 days)\n const totalStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n `)\n const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000\n const totalResult = await totalStmt.bind(thirtyDaysAgo).first<{ count: number }>()\n\n // AI vs Keyword breakdown\n const modeStmt = this.db.prepare(`\n SELECT mode, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY mode\n `)\n const { results: modeResults } = await modeStmt.bind(thirtyDaysAgo).all<{\n mode: string\n count: number\n }>()\n\n const aiCount = modeResults?.find((r) => r.mode === 'ai')?.count || 0\n const keywordCount = modeResults?.find((r) => r.mode === 'keyword')?.count || 0\n\n // Popular queries\n const popularStmt = this.db.prepare(`\n SELECT query, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY query \n ORDER BY count DESC \n LIMIT 10\n `)\n const { results: popularResults } = await popularStmt.bind(thirtyDaysAgo).all<{\n query: string\n count: number\n }>()\n\n return {\n total_queries: totalResult?.count || 0,\n ai_queries: aiCount,\n keyword_queries: keywordCount,\n popular_queries: (popularResults || []).map((r) => ({\n query: r.query,\n count: r.count,\n })),\n average_query_time: 0, // TODO: Track query times\n }\n } catch (error) {\n console.error('Error getting analytics:', error)\n return {\n total_queries: 0,\n ai_queries: 0,\n keyword_queries: 0,\n popular_queries: [],\n average_query_time: 0,\n }\n }\n }\n\n /**\n * Verify Custom RAG is available\n */\n verifyBinding(): boolean {\n return this.customRAG?.isAvailable() ?? false\n }\n\n /**\n * Get Custom RAG service instance (for indexer)\n */\n getCustomRAG(): CustomRAGService | undefined {\n return this.customRAG\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { AISearchSettings, IndexStatus } from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * Index Manager Service\n * Handles indexing of content items using Custom RAG with Vectorize\n */\nexport class IndexManager {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[IndexManager] Custom RAG initialized')\n }\n }\n\n /**\n * Index all content items within a collection using Custom RAG\n */\n async indexCollection(collectionId: string): Promise {\n try {\n // Get collection info\n const collectionStmt = this.db.prepare(\n 'SELECT id, name, display_name FROM collections WHERE id = ?'\n )\n const collection = await collectionStmt.bind(collectionId).first<{\n id: string\n name: string\n display_name: string\n }>()\n\n if (!collection) {\n throw new Error(`Collection ${collectionId} not found`)\n }\n\n // Update status to indexing\n await this.updateIndexStatus(collectionId, {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n status: 'indexing',\n })\n\n // Use Custom RAG for indexing if available\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Using Custom RAG to index collection ${collectionId}`)\n \n const result = await this.customRAG.indexCollection(collectionId)\n\n const finalStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: result.total_items,\n indexed_items: result.indexed_chunks,\n last_sync_at: Date.now(),\n status: result.errors > 0 ? 'error' : 'completed',\n error_message: result.errors > 0 ? `${result.errors} errors during indexing` : undefined\n }\n\n await this.updateIndexStatus(collectionId, finalStatus)\n return finalStatus\n }\n\n // Fallback: No indexing without Custom RAG\n console.warn(`[IndexManager] Custom RAG not available, skipping indexing for ${collectionId}`)\n \n const fallbackStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n last_sync_at: Date.now(),\n status: 'completed',\n error_message: 'Custom RAG not available - using keyword search only'\n }\n\n await this.updateIndexStatus(collectionId, fallbackStatus)\n return fallbackStatus\n } catch (error) {\n console.error(`[IndexManager] Error indexing collection ${collectionId}:`, error)\n const errorStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: 'Unknown',\n total_items: 0,\n indexed_items: 0,\n status: 'error',\n error_message: error instanceof Error ? error.message : String(error),\n }\n await this.updateIndexStatus(collectionId, errorStatus)\n return errorStatus\n }\n }\n\n /**\n * Index a single content item\n */\n private async indexContentItem(\n item: {\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n },\n collectionId: string\n ): Promise {\n try {\n // Parse content data\n let parsedData: any = {}\n try {\n parsedData = typeof item.data === 'string' ? JSON.parse(item.data) : item.data\n } catch {\n parsedData = {}\n }\n\n // Prepare document for AI Search\n const document = {\n id: `content_${item.id}`,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n content: this.extractSearchableText(parsedData),\n metadata: {\n collection_id: collectionId,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n },\n }\n\n // TODO: Call Cloudflare AI Search API to index document\n // await this.aiSearch.index(document)\n\n // For now, just log (actual implementation will use AI Search API)\n console.log(`Indexed content item: ${item.id}`)\n } catch (error) {\n console.error(`Error indexing content item ${item.id}:`, error)\n throw error\n }\n }\n\n /**\n * Extract searchable text from content data\n */\n private extractSearchableText(data: any): string {\n const parts: string[] = []\n\n // Add title if present\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n\n // Add description/content fields\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n\n // Add all string values from data\n const extractStrings = (obj: any): void => {\n if (typeof obj === 'string') {\n parts.push(obj)\n } else if (Array.isArray(obj)) {\n obj.forEach(extractStrings)\n } else if (obj && typeof obj === 'object') {\n Object.values(obj).forEach(extractStrings)\n }\n }\n\n extractStrings(data)\n\n return parts.join(' ')\n }\n\n /**\n * Update a single content item in the index\n */\n async updateIndex(collectionId: number, contentId: string): Promise {\n try {\n // Get content item\n const stmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.data, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ? AND c.collection_id = ?\n `)\n const item = await stmt.bind(contentId, collectionId).first<{\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!item) {\n throw new Error(`Content item ${contentId} not found`)\n }\n\n // Re-index the item\n await this.indexContentItem(item, String(collectionId))\n\n // Update last sync time for collection\n const status = await this.getIndexStatus(String(collectionId))\n if (status) {\n await this.updateIndexStatus(String(collectionId), {\n ...status,\n last_sync_at: Date.now(),\n })\n }\n } catch (error) {\n console.error(`Error updating index for content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove a content item from the index using Custom RAG\n */\n async removeFromIndex(collectionId: string, contentId: string): Promise {\n try {\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Removing content ${contentId} from index`)\n await this.customRAG.removeContentFromIndex(contentId)\n } else {\n console.warn(`[IndexManager] Custom RAG not available, skipping removal for ${contentId}`)\n }\n } catch (error) {\n console.error(`[IndexManager] Error removing content ${contentId} from index:`, error)\n throw error\n }\n }\n\n /**\n * Get indexing status for a collection\n */\n async getIndexStatus(collectionId: string): Promise {\n try {\n const stmt = this.db.prepare(\n 'SELECT * FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const result = await stmt.bind(collectionId).first<{\n id: number\n collection_id: string\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n if (!result) {\n return null\n }\n\n return {\n collection_id: String(result.collection_id),\n collection_name: result.collection_name,\n total_items: result.total_items,\n indexed_items: result.indexed_items,\n last_sync_at: result.last_sync_at,\n status: result.status as IndexStatus['status'],\n error_message: result.error_message,\n }\n } catch (error) {\n console.error(`Error getting index status for collection ${collectionId}:`, error)\n return null\n }\n }\n\n /**\n * Get indexing status for all collections\n */\n async getAllIndexStatus(): Promise> {\n try {\n const stmt = this.db.prepare('SELECT * FROM ai_search_index_meta')\n const { results } = await stmt.all<{\n id: number\n collection_id: number\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n const statusMap: Record = {}\n\n for (const row of results || []) {\n const collectionId = String(row.collection_id)\n statusMap[collectionId] = {\n collection_id: collectionId,\n collection_name: row.collection_name,\n total_items: row.total_items,\n indexed_items: row.indexed_items,\n last_sync_at: row.last_sync_at,\n status: row.status as IndexStatus['status'],\n error_message: row.error_message,\n }\n }\n\n return statusMap\n } catch (error) {\n console.error('Error getting all index status:', error)\n return {}\n }\n }\n\n /**\n * Update index status in database\n */\n private async updateIndexStatus(collectionId: string, status: IndexStatus): Promise {\n try {\n // Check if record exists\n const checkStmt = this.db.prepare(\n 'SELECT id FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const existing = await checkStmt.bind(collectionId).first<{ id: number }>()\n\n if (existing) {\n // Update existing\n const stmt = this.db.prepare(`\n UPDATE ai_search_index_meta \n SET collection_name = ?,\n total_items = ?,\n indexed_items = ?,\n last_sync_at = ?,\n status = ?,\n error_message = ?\n WHERE collection_id = ?\n `)\n await stmt\n .bind(\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null,\n String(collectionId)\n )\n .run()\n } else {\n // Insert new\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_index_meta (\n collection_id, collection_name, total_items, indexed_items,\n last_sync_at, status, error_message\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n await stmt\n .bind(\n String(status.collection_id),\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null\n )\n .run()\n }\n } catch (error) {\n console.error(`Error updating index status for collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Sync all selected collections\n */\n async syncAll(selectedCollections: string[]): Promise {\n for (const collectionId of selectedCollections) {\n try {\n await this.indexCollection(collectionId)\n } catch (error) {\n console.error(`Error syncing collection ${collectionId}:`, error)\n }\n }\n }\n}\n","import { renderAdminLayout } from '../../../../templates/layouts/admin-layout-v2.template'\nimport type {\n AISearchSettings,\n CollectionInfo,\n IndexStatus,\n NewCollectionNotification,\n} from '../types'\n\ninterface SettingsPageData {\n settings: AISearchSettings | null\n collections: CollectionInfo[]\n newCollections: NewCollectionNotification[]\n indexStatus: Record\n analytics: {\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const settings = data.settings || {\n enabled: false,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n\n // Ensure arrays exist\n const selectedCollections = Array.isArray(settings.selected_collections) ? settings.selected_collections : []\n const dismissedCollections = Array.isArray(settings.dismissed_collections) ? settings.dismissed_collections : []\n\n const enabled = settings.enabled === true\n const aiModeEnabled = settings.ai_mode_enabled !== false\n const autocompleteEnabled = settings.autocomplete_enabled !== false\n const indexMedia = settings.index_media === true\n\n const selectedCollectionIds = new Set(selectedCollections.map(id => String(id)))\n const dismissedCollectionIds = new Set(dismissedCollections.map(id => String(id)))\n\n // Ensure collections array exists\n const collections = Array.isArray(data.collections) ? data.collections : []\n\n // Debug: Log collections in template\n console.log('[SettingsPage Template] Collections received:', collections.length)\n if (collections.length > 0) {\n console.log('[SettingsPage Template] First collection:', collections[0])\n }\n\n const content = `\n
\n \n
\n
\n

🔍 AI Search Settings

\n

\n Configure advanced search with Cloudflare AI Search. Select collections to index and manage search preferences.\n

\n
\n \n
\n\n\n \n
\n
\n \n
\n

🔍 Search Settings

\n
\n
\n \n
\n \n

Turn on advanced search capabilities across your content

\n
\n
\n\n
\n \n
\n \n

\n Enable natural language queries (requires Cloudflare Workers AI binding)\n → Setup Guide\n

\n

\n ⚠️ If AI binding unavailable, will fallback to keyword search\n

\n
\n
\n
\n
\n\n
\n\n \n
\n
\n
\n

📚 Collections to Index

\n

\n Select which content collections should be indexed and searchable. Only checked collections will be included in search results.\n

\n
\n
\n
\n ${collections.length === 0\n ? '

No collections available. Create collections first.

'\n : collections.map((collection) => {\n const collectionId = String(collection.id)\n const isChecked = selectedCollectionIds.has(collectionId)\n const isDismissed = dismissedCollectionIds.has(collectionId)\n const indexStatusMap: Record = data.indexStatus || {}\n const status = indexStatusMap[collectionId]\n // Only show NEW badge if collection is new, not dismissed, and has never been indexed\n const isNew = collection.is_new === true && !isDismissed && !status\n // Only show status badge if collection is CHECKED and has status\n const statusBadge = (status && isChecked)\n ? `${status.status}`\n : ''\n\n return `
\n \n
\n \n

\n ${collection.description || collection.name || 'No description'} • ${collection.item_count || 0} items\n ${status ? ` • ${status.indexed_items}/${status.total_items} indexed` : ''}\n

\n ${status && status.status === 'indexing'\n ? `
\n
\n
`\n : ''}\n
\n ${isChecked ? `\n \n \n \n \n Re-index\n \n ` : ''}\n
`\n }).join('')}\n
\n
\n\n
\n\n \n
\n

⚙️ Advanced Options

\n
\n
\n \n
\n \n

Show search suggestions as users type

\n
\n
\n\n
\n \n
\n \n

Include media files in search results

\n
\n
\n\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

\n 💡 Collections marked as NEW haven't been indexed yet\n

\n \n
\n
\n
\n\n\n \n
\n

📊 Search Analytics

\n
\n
\n
Total Queries
\n
${data.analytics.total_queries}
\n
\n
\n
AI Queries
\n
${data.analytics.ai_queries}
\n
\n
\n
Keyword Queries
\n
${data.analytics.keyword_queries}
\n
\n
\n ${data.analytics.popular_queries.length > 0\n ? `\n
\n

Popular Searches

\n
\n ${data.analytics.popular_queries.map(\n (item) => `\n
\n \"${item.query}\"\n ${item.count} times\n
\n `\n ).join('')}\n
\n
\n `\n : '

No search history yet.

'}\n
\n\n \n
\n
\n \n Settings Saved Successfully!\n
\n
\n
\n \n `\n\n return renderAdminLayout({\n title: 'AI Search Settings',\n pageTitle: 'AI Search Settings',\n currentPath: '/admin/plugins/ai-search/settings',\n user: data.user,\n content: content\n })\n}\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { requireAuth } from '../../../../middleware'\nimport { AISearchService } from '../services/ai-search'\nimport { IndexManager } from '../services/indexer'\nimport { renderSettingsPage } from '../components/settings-page'\nimport type { AISearchSettings, SearchQuery } from '../types'\n\ntype Variables = {\n user: {\n id: number\n email: string\n role: string\n }\n}\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminRoutes.use('*', requireAuth())\n\n/**\n * GET /admin/plugins/ai-search\n * Render settings page\n */\nadminRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const ai = (c.env as any).AI // Workers AI for embeddings\n const vectorize = (c.env as any).VECTORIZE_INDEX // Vectorize for vector search\n\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n // Get settings\n const settings = await service.getSettings()\n console.log('[AI Search Settings Route] Settings loaded:', !!settings)\n\n // Get all collections with status\n const collections = await service.getAllCollections()\n console.log('[AI Search Settings Route] Collections returned:', collections.length)\n \n // If no collections, try direct query\n if (collections.length === 0) {\n const directQuery = await db.prepare('SELECT id, name, display_name FROM collections WHERE is_active = 1').all()\n console.log('[AI Search Settings Route] Direct DB query found:', directQuery.results?.length || 0, 'collections')\n if (directQuery.results && directQuery.results.length > 0) {\n console.log('[AI Search Settings Route] Sample from DB:', directQuery.results[0])\n }\n } else if (collections.length > 0 && collections[0]) {\n console.log('[AI Search Settings Route] First collection:', {\n id: collections[0].id,\n name: collections[0].name,\n display_name: collections[0].display_name\n })\n }\n\n // Get new collections notifications\n const newCollections = await service.detectNewCollections()\n console.log('AI Search: New collections:', newCollections.length)\n\n // Get index status for all collections\n const indexStatus = await indexer.getAllIndexStatus()\n console.log('AI Search: Index status:', Object.keys(indexStatus).length)\n\n // Get analytics\n const analytics = await service.getSearchAnalytics()\n\n return c.html(\n renderSettingsPage({\n settings,\n collections: collections || [],\n newCollections: newCollections || [],\n indexStatus: indexStatus || {},\n analytics,\n user: {\n name: user.email,\n email: user.email,\n role: user.role,\n },\n })\n )\n } catch (error) {\n console.error('Error rendering AI Search settings:', error)\n return c.html(`

Error loading settings: ${error instanceof Error ? error.message : String(error)}

`, 500)\n }\n})\n\n/**\n * POST /admin/plugins/ai-search\n * Update settings\n */\nadminRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n console.log('[AI Search POST] Received body:', JSON.stringify(body, null, 2))\n\n // Get current settings\n const currentSettings = await service.getSettings()\n console.log('[AI Search POST] Current settings selected_collections:', currentSettings?.selected_collections)\n\n // Update settings\n const updatedSettings: Partial = {\n enabled: body.enabled !== undefined ? Boolean(body.enabled) : currentSettings?.enabled,\n ai_mode_enabled: body.ai_mode_enabled !== undefined ? Boolean(body.ai_mode_enabled) : currentSettings?.ai_mode_enabled,\n selected_collections: Array.isArray(body.selected_collections) ? body.selected_collections.map(String) : (currentSettings?.selected_collections || []),\n dismissed_collections: Array.isArray(body.dismissed_collections) ? body.dismissed_collections.map(String) : (currentSettings?.dismissed_collections || []),\n autocomplete_enabled: body.autocomplete_enabled !== undefined ? Boolean(body.autocomplete_enabled) : currentSettings?.autocomplete_enabled,\n cache_duration: body.cache_duration ? Number(body.cache_duration) : currentSettings?.cache_duration,\n results_limit: body.results_limit ? Number(body.results_limit) : currentSettings?.results_limit,\n index_media: body.index_media !== undefined ? Boolean(body.index_media) : currentSettings?.index_media,\n }\n\n console.log('[AI Search POST] Updated settings selected_collections:', updatedSettings.selected_collections)\n\n // If collections changed, trigger indexing\n const collectionsChanged =\n JSON.stringify(updatedSettings.selected_collections) !==\n JSON.stringify(currentSettings?.selected_collections || [])\n\n const saved = await service.updateSettings(updatedSettings)\n console.log('[AI Search POST] Settings saved, selected_collections:', saved.selected_collections)\n\n // Start indexing if collections were added\n if (collectionsChanged && updatedSettings.selected_collections) {\n console.log('[AI Search POST] Collections changed, starting background indexing')\n // Start indexing in background (non-blocking) - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .syncAll(updatedSettings.selected_collections)\n .then(() => console.log('[AI Search POST] Background indexing completed'))\n .catch((error) => console.error('[AI Search POST] Background indexing error:', error))\n )\n }\n\n return c.json({ success: true, settings: saved })\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n return c.json({ error: 'Failed to update settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/settings\n * Get settings API endpoint\n */\nadminRoutes.get('/api/settings', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const settings = await service.getSettings()\n return c.json({ success: true, data: settings })\n } catch (error) {\n console.error('Error fetching settings:', error)\n return c.json({ error: 'Failed to fetch settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/new-collections\n * Get new collections that aren't indexed or dismissed\n */\nadminRoutes.get('/api/new-collections', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const notifications = await service.detectNewCollections()\n return c.json({ success: true, data: notifications })\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return c.json({ error: 'Failed to detect new collections' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/status\n * Get indexing status\n */\nadminRoutes.get('/api/status', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const status = await indexer.getAllIndexStatus()\n return c.json({ success: true, data: status })\n } catch (error) {\n console.error('Error fetching index status:', error)\n return c.json({ error: 'Failed to fetch status' }, 500)\n }\n})\n\n/**\n * POST /admin/api/ai-search/reindex\n * Trigger re-indexing for a collection\n */\nadminRoutes.post('/api/reindex', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n const collectionIdRaw: unknown = body.collection_id\n const collectionId = collectionIdRaw ? String(collectionIdRaw) : ''\n\n if (!collectionId || collectionId === 'undefined' || collectionId === 'null') {\n return c.json({ error: 'collection_id is required' }, 400)\n }\n\n // Start indexing in background - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .indexCollection(collectionId)\n .then(() => console.log(`[AI Search Reindex] Completed for collection ${collectionId}`))\n .catch((error) => console.error(`[AI Search Reindex] Error for collection ${collectionId}:`, error))\n )\n\n return c.json({ success: true, message: 'Re-indexing started' })\n } catch (error) {\n console.error('Error starting re-index:', error)\n return c.json({ error: 'Failed to start re-indexing' }, 500)\n }\n})\n\nexport default adminRoutes\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { AISearchService } from '../services/ai-search'\nimport type { SearchQuery } from '../types'\n\ntype Variables = {\n user?: {\n id: number\n email: string\n role: string\n }\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * POST /api/search\n * Execute search query\n */\napiRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const body = await c.req.json()\n\n const query: SearchQuery = {\n query: body.query || '',\n mode: body.mode || 'keyword',\n filters: body.filters || {},\n limit: body.limit ? Number(body.limit) : undefined,\n offset: body.offset ? Number(body.offset) : undefined,\n }\n\n // Convert date strings to Date objects if present\n if (query.filters?.dateRange) {\n if (typeof query.filters.dateRange.start === 'string') {\n query.filters.dateRange.start = new Date(query.filters.dateRange.start)\n }\n if (typeof query.filters.dateRange.end === 'string') {\n query.filters.dateRange.end = new Date(query.filters.dateRange.end)\n }\n }\n\n const results = await service.search(query)\n\n return c.json({\n success: true,\n data: results,\n })\n } catch (error) {\n console.error('Search error:', error)\n return c.json(\n {\n success: false,\n error: 'Search failed',\n message: error instanceof Error ? error.message : String(error),\n },\n 500\n )\n }\n})\n\n/**\n * GET /api/search/suggest\n * Get search suggestions (autocomplete)\n */\napiRoutes.get('/suggest', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const query = c.req.query('q') || ''\n\n if (!query || query.length < 2) {\n return c.json({ success: true, data: [] })\n }\n\n const suggestions = await service.getSearchSuggestions(query)\n\n return c.json({\n success: true,\n data: suggestions,\n })\n } catch (error) {\n console.error('Suggestions error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get suggestions',\n },\n 500\n )\n }\n})\n\n/**\n * GET /admin/api/search/analytics\n * Get search analytics\n */\napiRoutes.get('/analytics', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const analytics = await service.getSearchAnalytics()\n\n return c.json({\n success: true,\n data: analytics,\n })\n } catch (error) {\n console.error('Analytics error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get analytics',\n },\n 500\n )\n }\n})\n\nexport default apiRoutes\n","{\n \"id\": \"ai-search\",\n \"name\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"icon\": \"magnifying-glass\",\n \"homepage\": \"https://developers.cloudflare.com/ai-search/\",\n \"repository\": \"https://github.com/sonicjs/sonicjs\",\n \"license\": \"MIT\",\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"configSchema\": {\n \"enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI Search\",\n \"description\": \"Enable or disable AI Search functionality\",\n \"default\": true\n },\n \"ai_mode_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI/Semantic Search\",\n \"description\": \"Enable AI-powered semantic search (requires Cloudflare Workers AI binding)\",\n \"default\": false\n },\n \"ai_provider\": {\n \"type\": \"string\",\n \"label\": \"AI Provider\",\n \"description\": \"Which AI service to use for semantic search\",\n \"default\": \"cloudflare\",\n \"enum\": [\n \"cloudflare\",\n \"keyword-only\"\n ]\n },\n \"autocomplete_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable Autocomplete\",\n \"description\": \"Show search suggestions as user types\",\n \"default\": true\n },\n \"cache_duration\": {\n \"type\": \"number\",\n \"label\": \"Cache Duration (hours)\",\n \"description\": \"How long to cache search results\",\n \"default\": 1,\n \"min\": 0,\n \"max\": 24\n },\n \"results_limit\": {\n \"type\": \"number\",\n \"label\": \"Results Per Page\",\n \"description\": \"Maximum number of results to show per page\",\n \"default\": 20,\n \"min\": 10,\n \"max\": 100\n },\n \"index_media\": {\n \"type\": \"boolean\",\n \"label\": \"Index Media Metadata\",\n \"description\": \"Include R2 media files in search index\",\n \"default\": false\n }\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"href\": \"/admin/plugins/ai-search\",\n \"parentId\": \"plugins\",\n \"order\": 50\n },\n \"codeName\": \"ai-search-plugin\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { AISearchService } from './services/ai-search'\nimport { IndexManager } from './services/indexer'\nimport adminRoutes from './routes/admin'\nimport apiRoutes from './routes/api'\nimport manifest from './manifest.json'\n\n/**\n * AI Search Plugin\n * \n * Provides advanced search capabilities using Cloudflare AI Search.\n * Features:\n * - Semantic/AI-powered search with natural language queries\n * - Traditional keyword search\n * - Full-text search across all content collections\n * - Advanced filtering (collections, dates, status, tags)\n * - Autocomplete suggestions\n * - Search analytics\n * - Dynamic collection discovery and indexing\n * \n * @example\n * ```typescript\n * import { AISearchService } from '@sonicjs-cms/core/plugins'\n * \n * const service = new AISearchService(db, aiSearch)\n * const results = await service.search({\n * query: 'blog posts about security',\n * mode: 'ai',\n * filters: { collections: [1, 2] }\n * })\n * ```\n */\n\nexport const aiSearchPlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('aiSearch', AISearchService)\n .addService('indexManager', IndexManager)\n .addRoute('/admin/plugins/ai-search', adminRoutes as any)\n .addRoute('/api/search', apiRoutes as any)\n .build()\n\n// Export services and types for easy import\nexport { AISearchService } from './services/ai-search'\nexport { IndexManager } from './services/indexer'\nexport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n IndexStatus,\n} from './types'\n","/**\n * Magic Link Authentication Plugin\n *\n * Provides passwordless authentication via email magic links\n * Users receive a secure one-time link to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\nimport type { Plugin, PluginContext } from '../../types'\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { AuthManager, getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst magicLinkRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nexport function createMagicLinkAuthPlugin(): Plugin {\n const magicLinkRoutes = new Hono()\n\n // Request a magic link\n magicLinkRoutes.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = magicLinkRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB as D1Database\n\n // Check rate limiting\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n const recentLinks = await db.prepare(`\n SELECT COUNT(*) as count\n FROM magic_links\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as any\n\n const rateLimitPerHour = 5 // TODO: Get from plugin settings\n if (recentLinks && recentLinks.count >= rateLimitPerHour) {\n return c.json({\n error: 'Too many requests. Please try again later.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && !allowNewUsers) {\n // Don't reveal if user exists or not for security\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.'\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Generate secure token\n const token = crypto.randomUUID() + '-' + crypto.randomUUID()\n const tokenId = crypto.randomUUID()\n const linkExpiryMinutes = 15 // TODO: Get from plugin settings\n const expiresAt = Date.now() + (linkExpiryMinutes * 60 * 1000)\n\n // Store magic link\n await db.prepare(`\n INSERT INTO magic_links (\n id, user_email, token, expires_at, used, created_at, ip_address, user_agent\n ) VALUES (?, ?, ?, ?, 0, ?, ?, ?)\n `).bind(\n tokenId,\n normalizedEmail,\n token,\n expiresAt,\n Date.now(),\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown',\n c.req.header('user-agent') || 'unknown'\n ).run()\n\n // Generate magic link URL\n const baseUrl = new URL(c.req.url).origin\n const magicLink = `${baseUrl}/auth/magic-link/verify?token=${token}`\n\n // Send email via email plugin\n try {\n const emailPlugin = c.env.plugins?.get('email')\n if (emailPlugin && emailPlugin.sendEmail) {\n await emailPlugin.sendEmail({\n to: normalizedEmail,\n subject: 'Your Magic Link to Sign In',\n html: renderMagicLinkEmail(magicLink, linkExpiryMinutes)\n })\n } else {\n console.error('Email plugin not available')\n // In production, this should fail. For now, log the link for testing\n console.log(`Magic link for ${normalizedEmail}: ${magicLink}`)\n }\n } catch (error) {\n console.error('Failed to send magic link email:', error)\n return c.json({\n error: 'Failed to send email. Please try again later.'\n }, 500)\n }\n\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.',\n // For development only - remove in production\n ...(c.env.ENVIRONMENT === 'development' && { dev_link: magicLink })\n })\n } catch (error) {\n console.error('Magic link request error:', error)\n return c.json({ error: 'Failed to process request' }, 500)\n }\n })\n\n // Verify magic link and sign in\n magicLinkRoutes.get('/verify', async (c: any) => {\n try {\n const token = c.req.query('token')\n\n if (!token) {\n return c.redirect('/auth/login?error=Invalid magic link')\n }\n\n const db = c.env.DB as D1Database\n\n // Find magic link\n const magicLink = await db.prepare(`\n SELECT * FROM magic_links\n WHERE token = ? AND used = 0\n `).bind(token).first() as any\n\n if (!magicLink) {\n return c.redirect('/auth/login?error=Invalid or expired magic link')\n }\n\n // Check expiration\n if (magicLink.expires_at < Date.now()) {\n return c.redirect('/auth/login?error=This magic link has expired')\n }\n\n // Get or create user\n let user = await db.prepare(`\n SELECT * FROM users WHERE email = ? AND is_active = 1\n `).bind(magicLink.user_email).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && allowNewUsers) {\n // Create new user\n const userId = crypto.randomUUID()\n const username = magicLink.user_email.split('@')[0]\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 1, ?, ?)\n `).bind(\n userId,\n magicLink.user_email,\n username,\n username,\n '',\n now,\n now\n ).run()\n\n user = {\n id: userId,\n email: magicLink.user_email,\n username,\n role: 'viewer'\n }\n } else if (!user) {\n return c.redirect('/auth/login?error=No account found for this email')\n }\n\n // Mark magic link as used\n await db.prepare(`\n UPDATE magic_links\n SET used = 1, used_at = ?\n WHERE id = ?\n `).bind(Date.now(), magicLink.id).run()\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwtToken = await AuthManager.generateToken(\n user.id,\n user.email,\n user.role,\n (c.env as any).JWT_SECRET,\n tokenTtl\n )\n\n // Set auth cookie\n AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl })\n\n // Update last login\n await db.prepare(`\n UPDATE users SET last_login_at = ? WHERE id = ?\n `).bind(Date.now(), user.id).run()\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?message=Successfully signed in')\n } catch (error) {\n console.error('Magic link verification error:', error)\n return c.redirect('/auth/login?error=Authentication failed')\n }\n })\n\n return {\n name: 'magic-link-auth',\n version: '1.0.0',\n description: 'Passwordless authentication via email magic links',\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n dependencies: ['email'],\n\n routes: [{\n path: '/auth/magic-link',\n handler: magicLinkRoutes,\n description: 'Magic link authentication endpoints',\n requiresAuth: false\n }],\n\n async install(context: PluginContext) {\n console.log('Installing magic-link-auth plugin...')\n // Migration is handled by plugin system\n },\n\n async activate(context: PluginContext) {\n console.log('Magic link authentication activated')\n console.log('Users can now sign in via /auth/magic-link/request')\n },\n\n async deactivate(context: PluginContext) {\n console.log('Magic link authentication deactivated')\n },\n\n async uninstall(context: PluginContext) {\n console.log('Uninstalling magic-link-auth plugin...')\n // Optionally clean up magic_links table\n // await context.db.prepare('DROP TABLE IF EXISTS magic_links').run()\n }\n }\n}\n\n/**\n * Render magic link email template\n */\nfunction renderMagicLinkEmail(magicLink: string, expiryMinutes: number): string {\n return `\n \n \n \n \n \n Your Magic Link\n \n \n \n
\n
\n

🔗 Your Magic Link

\n
\n\n
\n

Hello!

\n

You requested a magic link to sign in to your account. Click the button below to continue:

\n\n
\n Sign In\n
\n\n

⏰ This link expires in ${expiryMinutes} minutes

\n\n
\n Security Notice: If you didn't request this link, you can safely ignore this email.\n Someone may have entered your email address by mistake.\n
\n
\n\n
\n

This is an automated email from SonicJS.

\n

For security, this link can only be used once.

\n
\n
\n \n \n `\n}\n\nexport default createMagicLinkAuthPlugin()\n","export type SecurityEventType =\n | 'login_success'\n | 'login_failure'\n | 'registration'\n | 'password_reset_request'\n | 'password_reset_complete'\n | 'account_lockout'\n | 'suspicious_activity'\n | 'logout'\n | 'permission_denied'\n\nexport type SecuritySeverity = 'info' | 'warning' | 'critical'\n\nexport interface SecurityEvent {\n id: string\n eventType: SecurityEventType\n severity: SecuritySeverity\n userId?: string | null\n email?: string | null\n ipAddress?: string | null\n userAgent?: string | null\n countryCode?: string | null\n requestPath?: string | null\n requestMethod?: string | null\n details?: Record | null\n fingerprint?: string | null\n blocked: boolean\n createdAt: number\n}\n\nexport interface SecurityEventInsert {\n eventType: SecurityEventType\n severity?: SecuritySeverity\n userId?: string\n email?: string\n ipAddress?: string\n userAgent?: string\n countryCode?: string\n requestPath?: string\n requestMethod?: string\n details?: Record\n fingerprint?: string\n blocked?: boolean\n}\n\nexport interface SecurityEventFilters {\n eventType?: SecurityEventType | SecurityEventType[]\n severity?: SecuritySeverity | SecuritySeverity[]\n email?: string\n ipAddress?: string\n search?: string\n startDate?: number\n endDate?: number\n blocked?: boolean\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'event_type' | 'severity'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SecurityStats {\n totalEvents: number\n failedLogins24h: number\n failedLoginsTrend: number // percentage change vs prior 24h\n activeLockouts: number\n flaggedIPs: number\n eventsByType: Record\n eventsBySeverity: Record\n}\n\nexport interface TopIP {\n ipAddress: string\n countryCode: string | null\n failedAttempts: number\n lastSeen: number\n locked: boolean\n}\n\nexport interface HourlyBucket {\n hour: string\n count: number\n}\n\nexport interface SecurityAuditSettings {\n retention: {\n daysToKeep: number\n maxEvents: number\n autoPurge: boolean\n }\n bruteForce: {\n enabled: boolean\n maxFailedAttemptsPerIP: number\n maxFailedAttemptsPerEmail: number\n windowMinutes: number\n lockoutDurationMinutes: number\n alertThreshold: number\n }\n logging: {\n logSuccessfulLogins: boolean\n logLogouts: boolean\n logRegistrations: boolean\n logPasswordResets: boolean\n logPermissionDenied: boolean\n }\n}\n\nexport const DEFAULT_SETTINGS: SecurityAuditSettings = {\n retention: {\n daysToKeep: 90,\n maxEvents: 100000,\n autoPurge: true\n },\n bruteForce: {\n enabled: true,\n maxFailedAttemptsPerIP: 10,\n maxFailedAttemptsPerEmail: 5,\n windowMinutes: 15,\n lockoutDurationMinutes: 30,\n alertThreshold: 20\n },\n logging: {\n logSuccessfulLogins: true,\n logLogouts: true,\n logRegistrations: true,\n logPasswordResets: true,\n logPermissionDenied: true\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n SecurityEvent,\n SecurityEventInsert,\n SecurityEventFilters,\n SecurityStats,\n TopIP,\n HourlyBucket,\n SecurityAuditSettings\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nexport class SecurityAuditService {\n constructor(\n private db: D1Database,\n private settings: SecurityAuditSettings = DEFAULT_SETTINGS\n ) {}\n\n async logEvent(event: SecurityEventInsert): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO security_events (id, event_type, severity, user_id, email, ip_address, user_agent, country_code, request_path, request_method, details, fingerprint, blocked, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n event.eventType,\n event.severity || 'info',\n event.userId || null,\n event.email || null,\n event.ipAddress || null,\n event.userAgent || null,\n event.countryCode || null,\n event.requestPath || null,\n event.requestMethod || null,\n event.details ? JSON.stringify(event.details) : null,\n event.fingerprint || null,\n event.blocked ? 1 : 0,\n now\n ).run()\n\n return id\n }\n\n async getEvents(filters: SecurityEventFilters = {}): Promise<{ events: SecurityEvent[], total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.eventType) {\n if (Array.isArray(filters.eventType)) {\n conditions.push(`event_type IN (${filters.eventType.map(() => '?').join(',')})`)\n params.push(...filters.eventType)\n } else {\n conditions.push('event_type = ?')\n params.push(filters.eventType)\n }\n }\n\n if (filters.severity) {\n if (Array.isArray(filters.severity)) {\n conditions.push(`severity IN (${filters.severity.map(() => '?').join(',')})`)\n params.push(...filters.severity)\n } else {\n conditions.push('severity = ?')\n params.push(filters.severity)\n }\n }\n\n if (filters.email) {\n conditions.push('email LIKE ?')\n params.push(`%${filters.email}%`)\n }\n\n if (filters.ipAddress) {\n conditions.push('ip_address LIKE ?')\n params.push(`%${filters.ipAddress}%`)\n }\n\n if (filters.search) {\n conditions.push('(email LIKE ? OR ip_address LIKE ? OR details LIKE ?)')\n params.push(`%${filters.search}%`, `%${filters.search}%`, `%${filters.search}%`)\n }\n\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n if (filters.blocked !== undefined) {\n conditions.push('blocked = ?')\n params.push(filters.blocked ? 1 : 0)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const page = filters.page || 1\n const limit = filters.limit || 50\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM security_events ${where}`\n ).bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get page of results\n const results = await this.db.prepare(\n `SELECT * FROM security_events ${where} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...params, limit, offset).all()\n\n const events: SecurityEvent[] = (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n\n return { events, total }\n }\n\n async getEvent(id: string): Promise {\n const row = await this.db.prepare(\n 'SELECT * FROM security_events WHERE id = ?'\n ).bind(id).first()\n\n if (!row) return null\n\n return {\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }\n }\n\n async getStats(): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n const h48 = now - 48 * 60 * 60 * 1000\n\n // Total events\n const totalResult = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM security_events'\n ).first<{ count: number }>()\n\n // Failed logins last 24h\n const failed24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ?\"\n ).bind(h24).first<{ count: number }>()\n\n // Failed logins prior 24h (for trend)\n const failedPrior24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ? AND created_at < ?\"\n ).bind(h48, h24).first<{ count: number }>()\n\n const failed24h = failed24hResult?.count || 0\n const failedPrior24h = failedPrior24hResult?.count || 0\n const trend = failedPrior24h > 0\n ? Math.round(((failed24h - failedPrior24h) / failedPrior24h) * 100)\n : (failed24h > 0 ? 100 : 0)\n\n // Active lockouts (events in last lockout window)\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutsResult = await this.db.prepare(\n \"SELECT COUNT(DISTINCT ip_address) as count FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).first<{ count: number }>()\n\n // Flagged IPs (IPs with more than threshold failed attempts in window)\n const windowStart = now - (this.settings.bruteForce.windowMinutes * 60 * 1000)\n const flaggedResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM (\n SELECT ip_address FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address HAVING COUNT(*) >= ?\n )`\n ).bind(windowStart, this.settings.bruteForce.maxFailedAttemptsPerIP).first<{ count: number }>()\n\n // Events by type\n const typeResults = await this.db.prepare(\n 'SELECT event_type, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY event_type'\n ).bind(h24).all()\n\n const eventsByType: Record = {}\n for (const row of (typeResults.results || []) as any[]) {\n eventsByType[row.event_type] = row.count\n }\n\n // Events by severity\n const severityResults = await this.db.prepare(\n 'SELECT severity, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY severity'\n ).bind(h24).all()\n\n const eventsBySeverity: Record = {}\n for (const row of (severityResults.results || []) as any[]) {\n eventsBySeverity[row.severity] = row.count\n }\n\n return {\n totalEvents: totalResult?.count || 0,\n failedLogins24h: failed24h,\n failedLoginsTrend: trend,\n activeLockouts: lockoutsResult?.count || 0,\n flaggedIPs: flaggedResult?.count || 0,\n eventsByType,\n eventsBySeverity\n }\n }\n\n async getTopIPs(limit: number = 10): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n\n const results = await this.db.prepare(`\n SELECT\n ip_address,\n country_code,\n COUNT(*) as failed_attempts,\n MAX(created_at) as last_seen\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address\n ORDER BY failed_attempts DESC\n LIMIT ?\n `).bind(h24, limit).all()\n\n // Check which IPs are locked\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutResults = await this.db.prepare(\n \"SELECT DISTINCT ip_address FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).all()\n\n const lockedIPs = new Set((lockoutResults.results || []).map((r: any) => r.ip_address))\n\n return (results.results || []).map((row: any) => ({\n ipAddress: row.ip_address,\n countryCode: row.country_code,\n failedAttempts: row.failed_attempts,\n lastSeen: row.last_seen,\n locked: lockedIPs.has(row.ip_address)\n }))\n }\n\n async getHourlyTrend(hours: number = 24): Promise {\n const now = Date.now()\n const start = now - hours * 60 * 60 * 1000\n\n // Build hourly buckets\n const buckets: HourlyBucket[] = []\n for (let i = 0; i < hours; i++) {\n const bucketStart = start + i * 60 * 60 * 1000\n const date = new Date(bucketStart)\n buckets.push({\n hour: `${date.getUTCHours().toString().padStart(2, '0')}:00`,\n count: 0\n })\n }\n\n const results = await this.db.prepare(`\n SELECT\n CAST((created_at - ?) / 3600000 AS INTEGER) as bucket,\n COUNT(*) as count\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY bucket\n ORDER BY bucket\n `).bind(start, start).all()\n\n for (const row of (results.results || []) as any[]) {\n const idx = row.bucket\n if (idx >= 0 && idx < buckets.length) {\n buckets[idx]!.count = row.count\n }\n }\n\n return buckets\n }\n\n async purgeOldEvents(daysToKeep?: number): Promise {\n const days = daysToKeep || this.settings.retention.daysToKeep\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000\n\n const result = await this.db.prepare(\n 'DELETE FROM security_events WHERE created_at < ?'\n ).bind(cutoff).run()\n\n return (result.meta as any)?.changes || 0\n }\n\n async getRecentCriticalEvents(limit: number = 20): Promise {\n const results = await this.db.prepare(\n \"SELECT * FROM security_events WHERE severity = 'critical' ORDER BY created_at DESC LIMIT ?\"\n ).bind(limit).all()\n\n return (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n }\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityStats, TopIP, HourlyBucket, SecurityEvent } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecurityDashboardData {\n stats: SecurityStats\n topIPs: TopIP[]\n hourlyTrend: HourlyBucket[]\n recentCritical: SecurityEvent[]\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n const now = Date.now()\n const diff = now - ts\n\n if (diff < 60000) return 'just now'\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n return labels[type] || type\n}\n\nfunction trendArrow(trend: number): string {\n if (trend > 0) return `+${trend}%`\n if (trend < 0) return `${trend}%`\n return `0%`\n}\n\nfunction renderBarChart(data: HourlyBucket[]): string {\n if (data.length === 0) return '

No data available

'\n\n const max = Math.max(...data.map(d => d.count), 1)\n\n const bars = data.map(d => {\n const height = Math.max((d.count / max) * 100, 2)\n const color = d.count === 0\n ? 'bg-zinc-200 dark:bg-zinc-700'\n : d.count >= max * 0.75\n ? 'bg-red-500'\n : d.count >= max * 0.5\n ? 'bg-amber-500'\n : 'bg-cyan-500'\n return `\n
\n
\n \n
\n
\n 12 ? 'hidden sm:block' : ''}\">${d.hour}\n
\n `\n }).join('')\n\n return `
${bars}
`\n}\n\nexport function renderSecurityDashboard(data: SecurityDashboardData): string {\n const { stats, topIPs, hourlyTrend, recentCritical, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Dashboard

\n

\n Monitor login attempts, brute-force detection, and security events.\n

\n
\n \n
\n\n \n
\n
\n

Total Events

\n

${stats.totalEvents.toLocaleString()}

\n
\n
\n

Failed Logins (24h)

\n

\n ${stats.failedLogins24h}\n ${trendArrow(stats.failedLoginsTrend)}\n

\n
\n
\n

Active Lockouts

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${stats.activeLockouts}

\n
\n
\n

Flagged IPs

\n

0 ? 'text-amber-600 dark:text-amber-400' : 'text-zinc-950 dark:text-white'}\">${stats.flaggedIPs}

\n
\n
\n\n \n
\n \n
\n

Failed Login Attempts (24h)

\n ${renderBarChart(hourlyTrend)}\n
\n\n \n
\n

Events by Type (24h)

\n
\n ${Object.entries(stats.eventsByType).length === 0\n ? '

No events in the last 24 hours

'\n : Object.entries(stats.eventsByType)\n .sort(([, a], [, b]) => b - a)\n .map(([type, count]) => {\n const total = Object.values(stats.eventsByType).reduce((s, v) => s + v, 0)\n const pct = total > 0 ? Math.round((count / total) * 100) : 0\n return `\n
\n
\n ${eventTypeBadge(type)}\n ${count}\n
\n
\n
\n
\n
\n `\n }).join('')\n }\n
\n
\n
\n\n \n
\n \n
\n
\n

Top IPs by Failed Logins (24h)

\n
\n ${topIPs.length === 0\n ? '

No failed login attempts

'\n : `\n \n \n \n \n \n \n \n \n \n ${topIPs.map(ip => `\n \n \n \n \n \n \n `).join('')}\n \n
IP AddressCountryAttemptsStatus
${ip.ipAddress}${ip.countryCode || '-'}= 10 ? 'text-red-600 dark:text-red-400' : 'text-zinc-900 dark:text-zinc-100'}\">${ip.failedAttempts}\n ${ip.locked\n ? 'Locked'\n : 'Active'\n }\n
`\n }\n
\n\n \n
\n
\n

Recent Critical Events

\n
\n ${recentCritical.length === 0\n ? '

No critical events

'\n : `
\n ${recentCritical.slice(0, 10).map(event => `\n
\n
\n
\n ${severityBadge(event.severity)}\n ${eventTypeBadge(event.eventType)}\n
\n ${formatTimestamp(event.createdAt)}\n
\n
\n ${event.ipAddress ? `IP: ${event.ipAddress}` : ''}\n ${event.email ? ` | ${event.email}` : ''}\n
\n
\n `).join('')}\n
`\n }\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Dashboard',\n pageTitle: 'Security Dashboard',\n currentPath: '/admin/plugins/security-audit',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityEvent, SecurityEventFilters } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface EventLogPageData {\n events: SecurityEvent[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n }\n filters: SecurityEventFilters\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const colors: Record = {\n login_success: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400',\n login_failure: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n registration: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n account_lockout: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n suspicious_activity: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\n logout: 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400',\n password_reset_request: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n permission_denied: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400'\n }\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n const color = colors[type] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400'\n return `${labels[type] || type}`\n}\n\nfunction buildFilterUrl(filters: SecurityEventFilters, overrides: Record = {}): string {\n const params = new URLSearchParams()\n if (filters.eventType && !overrides.type) params.set('type', String(filters.eventType))\n if (filters.severity && !overrides.severity) params.set('severity', String(filters.severity))\n if (filters.email && !overrides.email) params.set('email', filters.email)\n if (filters.ipAddress && !overrides.ip) params.set('ip', filters.ipAddress)\n if (filters.search && !overrides.search) params.set('search', filters.search)\n\n for (const [key, value] of Object.entries(overrides)) {\n if (value) params.set(key, value)\n }\n\n const qs = params.toString()\n return `/admin/plugins/security-audit/events${qs ? '?' + qs : ''}`\n}\n\nexport function renderEventLogPage(data: EventLogPageData): string {\n const { events, pagination, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Event Log

\n

\n Browse and filter all security events. Showing ${pagination.startItem}-${pagination.endItem} of ${pagination.totalItems}.\n

\n
\n \n
\n\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n Clear\n \n
\n
\n
\n\n \n
\n ${events.length === 0\n ? `
\n \n \n \n

No events found

\n

No security events match your current filters.

\n
`\n : `
\n \n \n \n \n \n \n \n \n \n \n \n \n \n ${events.map(event => `\n \n \n \n \n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimeTypeSeverityEmailIP AddressCountryStatus
${formatTimestamp(event.createdAt)}${eventTypeBadge(event.eventType)}${severityBadge(event.severity)}${event.email || '-'}${event.ipAddress || '-'}${event.countryCode || '-'}\n ${event.blocked\n ? 'Blocked'\n : 'Allowed'\n }\n
\n
\n
Event ID: ${event.id.substring(0, 8)}...
\n
User Agent: ${event.userAgent || '-'}
\n
Path: ${event.requestPath || '-'}
\n
Fingerprint: ${event.fingerprint || '-'}
\n ${event.details ? `
Details:
${JSON.stringify(event.details, null, 2)}
` : ''}\n
\n
\n
`\n }\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n Page ${pagination.currentPage} of ${pagination.totalPages}\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : ''}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : ''}\n
\n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Event Log',\n pageTitle: 'Security Event Log',\n currentPath: '/admin/plugins/security-audit/events',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityAuditSettings } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecuritySettingsPageData {\n settings: SecurityAuditSettings\n user?: BaseUser\n version?: string\n message?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSecuritySettingsPage(data: SecuritySettingsPageData): string {\n const { settings, user, version, message, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Audit Settings

\n

\n Configure brute-force detection thresholds, event logging, and data retention.\n

\n
\n \n
\n\n ${message ? `\n
\n

${message}

\n
\n ` : ''}\n\n
\n\n \n
\n

Brute-Force Detection

\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n

Events above this count trigger critical severity

\n
\n
\n
\n\n \n
\n

Event Logging

\n
\n \n \n \n \n \n
\n
\n\n \n
\n

Data Retention

\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n\n \n
\n \n \n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Audit Settings',\n pageTitle: 'Security Audit Settings',\n currentPath: '/admin/plugins/security-audit/settings',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { PluginService } from '../../../../services'\nimport { renderSecurityDashboard, SecurityDashboardData } from '../components/dashboard-page'\nimport { renderEventLogPage, EventLogPageData } from '../components/event-log-page'\nimport { renderSecuritySettingsPage, SecuritySettingsPageData } from '../components/settings-page'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const [stats, topIPs, hourlyTrend, recentCritical] = await Promise.all([\n service.getStats(),\n service.getTopIPs(10),\n service.getHourlyTrend(24),\n service.getRecentCriticalEvents(20)\n ])\n\n const pageData: SecurityDashboardData = {\n stats,\n topIPs,\n hourlyTrend,\n recentCritical,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecurityDashboard(pageData))\n})\n\n// Event log\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n\n const filters = {\n eventType: (c.req.query('type') as SecurityEventType) || undefined,\n severity: (c.req.query('severity') as SecuritySeverity) || undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n page,\n limit\n }\n\n const { events, total } = await service.getEvents(filters)\n const totalPages = Math.ceil(total / limit)\n\n const pageData: EventLogPageData = {\n events,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: total === 0 ? 0 : (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total)\n },\n filters,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderEventLogPage(pageData))\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const pageData: SecuritySettingsPageData = {\n settings,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n message: c.req.query('message') || undefined,\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecuritySettingsPage(pageData))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const settings: SecurityAuditSettings = {\n bruteForce: {\n enabled: body['bruteForce.enabled'] === 'true',\n maxFailedAttemptsPerIP: parseInt(body['bruteForce.maxFailedAttemptsPerIP'] as string) || 10,\n maxFailedAttemptsPerEmail: parseInt(body['bruteForce.maxFailedAttemptsPerEmail'] as string) || 5,\n windowMinutes: parseInt(body['bruteForce.windowMinutes'] as string) || 15,\n lockoutDurationMinutes: parseInt(body['bruteForce.lockoutDurationMinutes'] as string) || 30,\n alertThreshold: parseInt(body['bruteForce.alertThreshold'] as string) || 20\n },\n logging: {\n logSuccessfulLogins: body['logging.logSuccessfulLogins'] === 'true',\n logLogouts: body['logging.logLogouts'] === 'true',\n logRegistrations: body['logging.logRegistrations'] === 'true',\n logPasswordResets: body['logging.logPasswordResets'] === 'true',\n logPermissionDenied: body['logging.logPermissionDenied'] === 'true'\n },\n retention: {\n daysToKeep: parseInt(body['retention.daysToKeep'] as string) || 90,\n maxEvents: parseInt(body['retention.maxEvents'] as string) || 100000,\n autoPurge: body['retention.autoPurge'] === 'true'\n }\n }\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings('security-audit', settings)\n\n // For HTMX requests, return 200\n if (c.req.header('HX-Request')) {\n return c.json({ success: true })\n }\n\n return c.redirect('/admin/plugins/security-audit/settings?message=Settings saved successfully')\n})\n\nexport { adminRoutes as securityAuditAdminRoutes }\n","import type { KVNamespace } from '@cloudflare/workers-types'\nimport type { SecurityAuditSettings } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst KV_PREFIX = 'security:bf:'\nconst LOCK_PREFIX = 'security:locked:'\n\nexport class BruteForceDetector {\n private settings: SecurityAuditSettings['bruteForce']\n\n constructor(\n private kv: KVNamespace,\n settings?: SecurityAuditSettings['bruteForce']\n ) {\n this.settings = settings || DEFAULT_SETTINGS.bruteForce\n }\n\n async recordFailedAttempt(ip: string, email: string): Promise<{\n ipCount: number\n emailCount: number\n shouldLockIP: boolean\n shouldLockEmail: boolean\n isSuspicious: boolean\n }> {\n if (!this.settings.enabled || !this.kv) {\n return { ipCount: 0, emailCount: 0, shouldLockIP: false, shouldLockEmail: false, isSuspicious: false }\n }\n\n const now = Date.now()\n const windowMs = this.settings.windowMinutes * 60 * 1000\n\n // Increment IP counter\n const ipKey = `${KV_PREFIX}ip:${ip}`\n const ipCount = await this.incrementCounter(ipKey, windowMs)\n\n // Increment email counter\n const emailKey = `${KV_PREFIX}email:${email}`\n const emailCount = await this.incrementCounter(emailKey, windowMs)\n\n // Check for multi-email from single IP (suspicious)\n const ipEmailsKey = `${KV_PREFIX}ip-emails:${ip}`\n await this.addToSet(ipEmailsKey, email, windowMs)\n const emailsFromIP = await this.getSetSize(ipEmailsKey)\n const isSuspicious = emailsFromIP >= 5\n\n const shouldLockIP = ipCount >= this.settings.maxFailedAttemptsPerIP\n const shouldLockEmail = emailCount >= this.settings.maxFailedAttemptsPerEmail\n\n return { ipCount, emailCount, shouldLockIP, shouldLockEmail, isSuspicious }\n }\n\n async isLocked(ip: string, email: string): Promise<{ locked: boolean, reason?: string }> {\n if (!this.settings.enabled || !this.kv) {\n return { locked: false }\n }\n\n const ipLocked = await this.kv.get(`${LOCK_PREFIX}ip:${ip}`)\n if (ipLocked) {\n return { locked: true, reason: 'IP address temporarily locked due to excessive failed login attempts' }\n }\n\n const emailLocked = await this.kv.get(`${LOCK_PREFIX}email:${email}`)\n if (emailLocked) {\n return { locked: true, reason: 'Account temporarily locked due to excessive failed login attempts' }\n }\n\n return { locked: false }\n }\n\n async lockIP(ip: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}ip:${ip}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_ip'\n }), { expirationTtl: ttl })\n }\n\n async lockEmail(email: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}email:${email}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_email'\n }), { expirationTtl: ttl })\n }\n\n async unlockIP(ip: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}ip:${ip}`)\n }\n\n async unlockEmail(email: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}email:${email}`)\n }\n\n async getActiveLockouts(): Promise> {\n if (!this.kv) return []\n // KV list with prefix to find all active lockouts\n const ipLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}ip:` })\n const emailLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}email:` })\n\n const lockouts: Array<{ key: string, type: 'ip' | 'email', value: string, lockedAt: number }> = []\n\n for (const key of ipLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'ip',\n value: key.name.replace(`${LOCK_PREFIX}ip:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n for (const key of emailLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'email',\n value: key.name.replace(`${LOCK_PREFIX}email:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n return lockouts\n }\n\n async releaseLockout(key: string): Promise {\n if (!this.kv) return\n await this.kv.delete(key)\n }\n\n isAboveAlertThreshold(count: number): boolean {\n return count >= this.settings.alertThreshold\n }\n\n private async incrementCounter(key: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n const now = Date.now()\n\n let entries: number[] = []\n if (existing) {\n try {\n entries = JSON.parse(existing)\n } catch {\n entries = []\n }\n }\n\n // Remove expired entries\n const cutoff = now - windowMs\n entries = entries.filter(ts => ts > cutoff)\n\n // Add new entry\n entries.push(now)\n\n // Store with TTL equal to window\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(entries), { expirationTtl: ttlSeconds })\n\n return entries.length\n }\n\n private async addToSet(key: string, value: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n let set: Record = {}\n const now = Date.now()\n const cutoff = now - windowMs\n\n if (existing) {\n try {\n set = JSON.parse(existing)\n } catch {\n set = {}\n }\n }\n\n // Remove expired entries\n for (const [k, ts] of Object.entries(set)) {\n if (ts < cutoff) delete set[k]\n }\n\n set[value] = now\n\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(set), { expirationTtl: ttlSeconds })\n }\n\n private async getSetSize(key: string): Promise {\n const existing = await this.kv.get(key)\n if (!existing) return 0\n\n try {\n const set = JSON.parse(existing)\n return Object.keys(set).length\n } catch {\n return 0\n }\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventFilters, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\napiRoutes.use('*', requireAuth())\n\n// Check admin role\napiRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// GET /api/security-audit/events\napiRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? Math.min(parseInt(c.req.query('limit')!), 100) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await service.getEvents(filters)\n return c.json(result)\n})\n\n// GET /api/security-audit/events/:id\napiRoutes.get('/events/:id', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const event = await service.getEvent(c.req.param('id'))\n\n if (!event) {\n return c.json({ error: 'Event not found' }, 404)\n }\n\n return c.json(event)\n})\n\n// GET /api/security-audit/stats\napiRoutes.get('/stats', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const stats = await service.getStats()\n return c.json(stats)\n})\n\n// GET /api/security-audit/stats/ips\napiRoutes.get('/stats/ips', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const limit = c.req.query('limit') ? parseInt(c.req.query('limit')!) : 10\n const ips = await service.getTopIPs(limit)\n return c.json(ips)\n})\n\n// GET /api/security-audit/stats/trend\napiRoutes.get('/stats/trend', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const hours = c.req.query('hours') ? parseInt(c.req.query('hours')!) : 24\n const trend = await service.getHourlyTrend(hours)\n return c.json(trend)\n})\n\n// GET /api/security-audit/lockouts\napiRoutes.get('/lockouts', async (c) => {\n const kv = c.env.CACHE_KV\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n const lockouts = await detector.getActiveLockouts()\n return c.json(lockouts)\n})\n\n// DELETE /api/security-audit/lockouts/:key\napiRoutes.delete('/lockouts/:key', async (c) => {\n const kv = c.env.CACHE_KV\n const key = decodeURIComponent(c.req.param('key'))\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n await detector.releaseLockout(key)\n return c.json({ success: true })\n})\n\n// POST /api/security-audit/events/purge\napiRoutes.post('/events/purge', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const body = await c.req.json().catch(() => ({})) as { daysToKeep?: number }\n const deleted = await service.purgeOldEvents(body.daysToKeep)\n return c.json({ success: true, deleted })\n})\n\n// GET /api/security-audit/export\napiRoutes.get('/export', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const format = c.req.query('format') || 'json'\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n limit: 10000,\n page: 1\n }\n\n const { events } = await service.getEvents(filters)\n\n if (format === 'csv') {\n const headers = ['id', 'event_type', 'severity', 'email', 'ip_address', 'country_code', 'blocked', 'created_at']\n const csvRows = [headers.join(',')]\n for (const event of events) {\n csvRows.push([\n event.id,\n event.eventType,\n event.severity,\n event.email || '',\n event.ipAddress || '',\n event.countryCode || '',\n event.blocked ? '1' : '0',\n new Date(event.createdAt).toISOString()\n ].map(v => `\"${String(v).replace(/\"/g, '\"\"')}\"`).join(','))\n }\n\n return new Response(csvRows.join('\\n'), {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"security-events-${Date.now()}.csv\"`\n }\n })\n }\n\n return c.json(events)\n})\n\nexport { apiRoutes as securityAuditApiRoutes }\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../../../../app'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { SecurityAuditSettings, SecurityEventType } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nfunction extractRequestInfo(c: Context<{ Bindings: Bindings; Variables: Variables }>) {\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n const countryCode = c.req.header('cf-ipcountry') || null\n const path = new URL(c.req.url).pathname\n const method = c.req.method\n\n return { ip, userAgent, countryCode, path, method }\n}\n\nfunction generateFingerprint(ip: string, userAgent: string): string {\n // Simple fingerprint from IP + UA - using a basic hash\n const str = `${ip}:${userAgent}`\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash |= 0\n }\n return Math.abs(hash).toString(36)\n}\n\nasync function getPluginSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch {\n // Plugin not installed or DB not ready\n }\n return DEFAULT_SETTINGS\n}\n\nasync function isPluginActive(db: any): Promise {\n try {\n const result = await db.prepare(\n \"SELECT status FROM plugins WHERE id = 'security-audit'\"\n ).first() as { status: string } | null\n return result?.status === 'active'\n } catch {\n return false\n }\n}\n\nexport function securityAuditMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n\n // Only intercept auth-related routes\n if (!path.startsWith('/auth/')) {\n return next()\n }\n\n const db = c.env.DB\n\n // Check if plugin is active\n if (!await isPluginActive(db)) {\n return next()\n }\n\n const settings = await getPluginSettings(db)\n const { ip, userAgent, countryCode, method } = extractRequestInfo(c)\n const fingerprint = generateFingerprint(ip, userAgent)\n\n // For login POST, extract email and check lockout before proceeding\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n let preExtractedEmail = ''\n\n if (isLoginPost) {\n try {\n if (path === '/auth/login/form') {\n // Form-based login: clone request to read formData without consuming it\n const clonedReq = c.req.raw.clone()\n const formData = await clonedReq.formData()\n preExtractedEmail = (formData.get('email') as string || '').toLowerCase()\n } else {\n // JSON login: Hono caches parsed JSON so this is safe\n const body = await c.req.json()\n preExtractedEmail = body?.email?.toLowerCase() || ''\n }\n } catch {\n // Can't parse body, continue\n }\n\n if (preExtractedEmail && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const lockStatus = await detector.isLocked(ip, preExtractedEmail)\n\n if (lockStatus.locked) {\n const service = new SecurityAuditService(db, settings)\n // Log the blocked attempt asynchronously\n const logPromise = service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: preExtractedEmail,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n blocked: true,\n details: { reason: lockStatus.reason }\n })\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n\n return c.json({\n error: lockStatus.reason || 'Too many failed attempts. Please try again later.'\n }, 429)\n }\n }\n }\n\n // Proceed with the request\n await next()\n\n // After response, log the event asynchronously\n const logPromise = logAuthEvent(c, db, settings, ip, userAgent, countryCode, fingerprint, path, method, preExtractedEmail)\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n }\n}\n\nasync function logAuthEvent(\n c: Context<{ Bindings: Bindings; Variables: Variables }>,\n db: any,\n settings: SecurityAuditSettings,\n ip: string,\n userAgent: string,\n countryCode: string | null,\n fingerprint: string,\n path: string,\n method: string,\n preExtractedEmail: string = ''\n): Promise {\n try {\n const service = new SecurityAuditService(db, settings)\n const status = c.res.status\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n const isFormLogin = path === '/auth/login/form'\n\n // Login POST\n if (isLoginPost) {\n // Determine if login succeeded or failed.\n // JSON login: 200 = success, 401/400 = failure\n // Form login: always returns 200 — check if response set an auth cookie (HX-Redirect header indicates success)\n let loginSucceeded: boolean\n if (isFormLogin) {\n // Form login redirects to /admin on success via HX-Redirect header or meta refresh\n const hxRedirect = c.res.headers.get('HX-Redirect')\n const setCookieHeader = c.res.headers.get('set-cookie') || ''\n loginSucceeded = !!(hxRedirect?.includes('/admin') || setCookieHeader.includes('auth_token'))\n } else {\n loginSucceeded = status === 200\n }\n\n if (loginSucceeded) {\n if (!settings.logging.logSuccessfulLogins) return\n\n // Try to get user info from response\n let email = preExtractedEmail\n let userId = ''\n if (!isFormLogin) {\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || email\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n }\n\n await service.logEvent({\n eventType: 'login_success',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n } else {\n // Failed login — use pre-extracted email since body is already consumed\n const email = preExtractedEmail\n\n await service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { statusCode: status }\n })\n\n // Record failed attempt for brute-force detection\n if (email && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const result = await detector.recordFailedAttempt(ip, email)\n\n if (result.shouldLockIP) {\n await detector.lockIP(ip)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_ip', attemptCount: result.ipCount }\n })\n }\n\n if (result.shouldLockEmail) {\n await detector.lockEmail(email)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_email', attemptCount: result.emailCount }\n })\n }\n\n if (result.isSuspicious) {\n await service.logEvent({\n eventType: 'suspicious_activity',\n severity: 'critical',\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'multiple_emails_from_ip', ipCount: result.ipCount }\n })\n }\n }\n }\n }\n\n // Registration POST\n if (path === '/auth/register' && method === 'POST' && settings.logging.logRegistrations) {\n if (status === 201 || status === 200) {\n let email = ''\n let userId = ''\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || ''\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n\n await service.logEvent({\n eventType: 'registration',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n }\n\n // Logout\n if (path === '/auth/logout' && settings.logging.logLogouts) {\n const user = c.get('user')\n await service.logEvent({\n eventType: 'logout',\n severity: 'info',\n userId: user?.userId,\n email: user?.email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n } catch (error) {\n console.error('[SecurityAudit] Error logging auth event:', error)\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { securityAuditAdminRoutes } from './routes/admin'\nimport { securityAuditApiRoutes } from './routes/api'\nimport { securityAuditMiddleware } from './middleware/audit-middleware'\n\nexport function createSecurityAuditPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'security-audit',\n version: '1.0.0-beta.1',\n description: 'Security event logging, brute-force detection, and analytics dashboard'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard and event log routes\n builder.addRoute('/admin/plugins/security-audit', securityAuditAdminRoutes as any, {\n description: 'Security audit dashboard and admin pages',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes\n builder.addRoute('/api/security-audit', securityAuditApiRoutes as any, {\n description: 'Security audit API endpoints',\n requiresAuth: true,\n priority: 50\n })\n\n // Admin menu item — icon is raw SVG to match sidebar rendering\n builder.addMenuItem('Security', '/admin/plugins/security-audit', {\n icon: ``,\n order: 85\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async (context) => {\n console.log('[SecurityAudit] Plugin installed')\n },\n activate: async (context) => {\n console.log('[SecurityAudit] Plugin activated')\n },\n deactivate: async (context) => {\n console.log('[SecurityAudit] Plugin deactivated')\n },\n uninstall: async (context) => {\n console.log('[SecurityAudit] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const securityAuditPlugin = createSecurityAuditPlugin()\nexport { SecurityAuditService } from './services/security-audit-service'\nexport { BruteForceDetector } from './services/brute-force-detector'\nexport { securityAuditMiddleware } from './middleware/audit-middleware'\nexport default securityAuditPlugin\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n Subscription,\n SubscriptionInsert,\n SubscriptionFilters,\n SubscriptionStats,\n SubscriptionStatus\n} from '../types'\n\n/**\n * Manages subscription records in D1\n */\nexport class SubscriptionService {\n constructor(private db: D1Database) {}\n\n /**\n * Ensure the subscriptions table exists\n */\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS subscriptions (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n user_id TEXT NOT NULL,\n stripe_customer_id TEXT NOT NULL,\n stripe_subscription_id TEXT NOT NULL UNIQUE,\n stripe_price_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'incomplete',\n current_period_start INTEGER NOT NULL DEFAULT 0,\n current_period_end INTEGER NOT NULL DEFAULT 0,\n cancel_at_period_end INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\n )\n `).run()\n\n // Indexes for common lookups\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_user_id ON subscriptions(user_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_customer_id ON subscriptions(stripe_customer_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_subscription_id ON subscriptions(stripe_subscription_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_status ON subscriptions(status)\n `).run()\n }\n\n /**\n * Create a new subscription record\n */\n async create(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Upsert a subscription by stripe_subscription_id (INSERT or UPDATE on conflict)\n */\n async upsert(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_subscription_id) DO UPDATE SET\n status = excluded.status,\n stripe_price_id = excluded.stripe_price_id,\n current_period_start = excluded.current_period_start,\n current_period_end = excluded.current_period_end,\n cancel_at_period_end = excluded.cancel_at_period_end,\n updated_at = unixepoch()\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Update a subscription by its Stripe subscription ID\n */\n async updateByStripeId(stripeSubscriptionId: string, data: Partial): Promise {\n const sets: string[] = []\n const values: any[] = []\n\n if (data.status !== undefined) {\n sets.push('status = ?')\n values.push(data.status)\n }\n if (data.stripePriceId !== undefined) {\n sets.push('stripe_price_id = ?')\n values.push(data.stripePriceId)\n }\n if (data.currentPeriodStart !== undefined) {\n sets.push('current_period_start = ?')\n values.push(data.currentPeriodStart)\n }\n if (data.currentPeriodEnd !== undefined) {\n sets.push('current_period_end = ?')\n values.push(data.currentPeriodEnd)\n }\n if (data.cancelAtPeriodEnd !== undefined) {\n sets.push('cancel_at_period_end = ?')\n values.push(data.cancelAtPeriodEnd ? 1 : 0)\n }\n\n if (sets.length === 0) return this.getByStripeSubscriptionId(stripeSubscriptionId)\n\n sets.push('updated_at = unixepoch()')\n values.push(stripeSubscriptionId)\n\n const result = await this.db.prepare(`\n UPDATE subscriptions SET ${sets.join(', ')} WHERE stripe_subscription_id = ? RETURNING *\n `).bind(...values).first()\n\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe subscription ID\n */\n async getByStripeSubscriptionId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get the active subscription for a user\n */\n async getByUserId(userId: string): Promise {\n const result = await this.db.prepare(\n \"SELECT * FROM subscriptions WHERE user_id = ? ORDER BY CASE WHEN status = 'active' THEN 0 WHEN status = 'trialing' THEN 1 ELSE 2 END, updated_at DESC LIMIT 1\"\n ).bind(userId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe customer ID\n */\n async getByStripeCustomerId(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_customer_id = ? ORDER BY updated_at DESC LIMIT 1'\n ).bind(stripeCustomerId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Find the userId linked to a Stripe customer ID\n */\n async getUserIdByStripeCustomer(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT user_id FROM subscriptions WHERE stripe_customer_id = ? LIMIT 1'\n ).bind(stripeCustomerId).first() as { user_id: string } | null\n return result?.user_id ?? null\n }\n\n /**\n * List subscriptions with filters and pagination\n */\n async list(filters: SubscriptionFilters = {}): Promise<{ subscriptions: Subscription[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.userId) {\n where.push('user_id = ?')\n values.push(filters.userId)\n }\n if (filters.stripeCustomerId) {\n where.push('stripe_customer_id = ?')\n values.push(filters.stripeCustomerId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM subscriptions ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n // Get paginated results\n const results = await this.db.prepare(\n `SELECT s.*, u.email as user_email FROM subscriptions s LEFT JOIN users u ON s.user_id = u.id ${whereClause} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n subscriptions: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n /**\n * Get subscription stats\n */\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\n SUM(CASE WHEN status = 'canceled' THEN 1 ELSE 0 END) as canceled,\n SUM(CASE WHEN status = 'past_due' THEN 1 ELSE 0 END) as past_due,\n SUM(CASE WHEN status = 'trialing' THEN 1 ELSE 0 END) as trialing\n FROM subscriptions\n `).first() as any\n\n return {\n total: result?.total || 0,\n active: result?.active || 0,\n canceled: result?.canceled || 0,\n pastDue: result?.past_due || 0,\n trialing: result?.trialing || 0\n }\n }\n\n /**\n * Delete a subscription record by Stripe subscription ID\n */\n async deleteByStripeId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'DELETE FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).run()\n return (result.meta?.changes || 0) > 0\n }\n\n private mapRow(row: Record): Subscription {\n return {\n id: row.id,\n userId: row.user_id,\n stripeCustomerId: row.stripe_customer_id,\n stripeSubscriptionId: row.stripe_subscription_id,\n stripePriceId: row.stripe_price_id,\n status: row.status as SubscriptionStatus,\n currentPeriodStart: row.current_period_start,\n currentPeriodEnd: row.current_period_end,\n cancelAtPeriodEnd: !!row.cancel_at_period_end,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n // Attach email if joined\n ...(row.user_email ? { userEmail: row.user_email } : {})\n } as Subscription\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { StripeEventRecord, StripeEventFilters, StripeEventStats } from '../types'\n\n/**\n * Manages Stripe event log records in D1\n */\nexport class StripeEventService {\n constructor(private db: D1Database) {}\n\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS stripe_events (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n stripe_event_id TEXT NOT NULL UNIQUE,\n type TEXT NOT NULL,\n object_id TEXT NOT NULL DEFAULT '',\n object_type TEXT NOT NULL DEFAULT '',\n data TEXT NOT NULL DEFAULT '{}',\n processed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n status TEXT NOT NULL DEFAULT 'processed',\n error TEXT\n )\n `).run()\n\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_type ON stripe_events(type)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_status ON stripe_events(status)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_processed_at ON stripe_events(processed_at DESC)\n `).run()\n }\n\n async log(event: {\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: Record\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n }): Promise {\n await this.db.prepare(`\n INSERT INTO stripe_events (stripe_event_id, type, object_id, object_type, data, status, error)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_event_id) DO UPDATE SET\n status = excluded.status,\n error = excluded.error,\n processed_at = unixepoch()\n `).bind(\n event.stripeEventId,\n event.type,\n event.objectId,\n event.objectType,\n JSON.stringify(event.data),\n event.status,\n event.error || null\n ).run()\n }\n\n async list(filters: StripeEventFilters = {}): Promise<{ events: StripeEventRecord[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.type) {\n where.push('type = ?')\n values.push(filters.type)\n }\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.objectId) {\n where.push('object_id = ?')\n values.push(filters.objectId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM stripe_events ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n const results = await this.db.prepare(\n `SELECT * FROM stripe_events ${whereClause} ORDER BY processed_at DESC LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n events: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'processed' THEN 1 ELSE 0 END) as processed,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'ignored' THEN 1 ELSE 0 END) as ignored\n FROM stripe_events\n `).first() as any\n\n return {\n total: result?.total || 0,\n processed: result?.processed || 0,\n failed: result?.failed || 0,\n ignored: result?.ignored || 0\n }\n }\n\n async getDistinctTypes(): Promise {\n const results = await this.db.prepare(\n 'SELECT DISTINCT type FROM stripe_events ORDER BY type'\n ).all()\n return (results.results || []).map((r: any) => r.type)\n }\n\n private mapRow(row: Record): StripeEventRecord {\n return {\n id: row.id,\n stripeEventId: row.stripe_event_id,\n type: row.type,\n objectId: row.object_id,\n objectType: row.object_type,\n data: row.data,\n processedAt: row.processed_at,\n status: row.status,\n error: row.error || undefined\n }\n }\n}\n","import type { Subscription, SubscriptionStats, SubscriptionStatus } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface StripePageData {\n subscriptions: (Subscription & { userEmail?: string })[]\n stats: SubscriptionStats\n filters: { status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSubscriptionsPage(data: StripePageData): string {\n const { subscriptions, stats, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Manage subscriptions, view billing status, and monitor payment events.\n

\n
\n
\n \n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe')}\n\n \n
\n ${statsCard('Total', stats.total, 'text-zinc-950 dark:text-white')}\n ${statsCard('Active', stats.active, 'text-emerald-600 dark:text-emerald-400')}\n ${statsCard('Trialing', stats.trialing, 'text-blue-600 dark:text-blue-400')}\n ${statsCard('Past Due', stats.pastDue, 'text-amber-600 dark:text-amber-400')}\n ${statsCard('Canceled', stats.canceled, 'text-red-600 dark:text-red-400')}\n
\n\n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${subscriptions.length === 0\n ? ''\n : subscriptions.map(renderRow).join('')\n }\n \n
UserStatusPrice IDCurrent PeriodCancel at EndStripe
No subscriptions found
\n\n ${renderPagination(filters.page, filters.totalPages, filters.status)}\n
\n\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Subscriptions',\n pageTitle: 'Stripe Subscriptions',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction statsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction statusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.replace('_', ' ').replace(/\\b\\w/g, c => c.toUpperCase())\n return ``\n}\n\nfunction statusBadge(status: SubscriptionStatus): string {\n const colors: Record = {\n active: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n trialing: 'bg-blue-400/10 text-blue-500 dark:text-blue-400 ring-blue-400/20',\n past_due: 'bg-amber-400/10 text-amber-500 dark:text-amber-400 ring-amber-400/20',\n canceled: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n unpaid: 'bg-orange-400/10 text-orange-500 dark:text-orange-400 ring-orange-400/20',\n paused: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete_expired: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n const label = status.replace('_', ' ')\n return `${label}`\n}\n\nfunction formatDate(timestamp: number): string {\n if (!timestamp) return '-'\n return new Date(timestamp * 1000).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })\n}\n\nfunction renderRow(sub: Subscription & { userEmail?: string }): string {\n return `\n \n \n
${sub.userEmail || sub.userId}
\n
${sub.stripeCustomerId}
\n \n ${statusBadge(sub.status)}\n ${sub.stripePriceId}\n \n ${formatDate(sub.currentPeriodStart)} - ${formatDate(sub.currentPeriodEnd)}\n \n \n ${sub.cancelAtPeriodEnd\n ? 'Yes'\n : 'No'\n }\n \n \n \n View in Stripe\n \n \n \n `\n}\n\nfunction renderPagination(page: number, totalPages: number, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params = status ? `&status=${status}` : ''\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","/**\n * Shared tab bar for all Stripe admin pages.\n */\n\nconst TABS = [\n { label: 'Subscriptions', path: '/admin/plugins/stripe' },\n { label: 'Events', path: '/admin/plugins/stripe/events' },\n { label: 'Settings', path: '/admin/plugins/stripe/settings' },\n]\n\nexport function renderStripeTabBar(currentPath: string): string {\n const tabs = TABS.map(tab => {\n const isActive = currentPath === tab.path\n || (tab.path === '/admin/plugins/stripe' && currentPath === '/admin/plugins/stripe/')\n return `\n \n ${tab.label}\n `\n }).join('')\n\n return `\n
\n \n
\n `\n}\n","import type { StripeEventRecord, StripeEventStats } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface EventsPageData {\n events: StripeEventRecord[]\n stats: StripeEventStats\n types: string[]\n filters: { type?: string; status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderEventsPage(data: EventsPageData): string {\n const { events, stats, types, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Webhook event log showing all processed, failed, and ignored Stripe events.\n

\n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/events')}\n\n \n
\n ${eventStatsCard('Total Events', stats.total, 'text-zinc-950 dark:text-white')}\n ${eventStatsCard('Processed', stats.processed, 'text-emerald-600 dark:text-emerald-400')}\n ${eventStatsCard('Failed', stats.failed, 'text-red-600 dark:text-red-400')}\n ${eventStatsCard('Ignored', stats.ignored, 'text-zinc-500 dark:text-zinc-400')}\n
\n\n \n
\n
\n \n \n\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n ${events.length === 0\n ? ''\n : events.map(renderEventRow).join('')\n }\n \n
TimeTypeObject / UserStatusEvent ID
No events recorded yet
\n\n ${renderEventPagination(filters.page, filters.totalPages, filters.type, filters.status)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Events',\n pageTitle: 'Stripe Events',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction eventStatsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction eventStatusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.charAt(0).toUpperCase() + value.slice(1)\n return ``\n}\n\nfunction eventStatusBadge(status: string): string {\n const colors: Record = {\n processed: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n failed: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n ignored: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n return `${status}`\n}\n\nfunction formatTimestamp(timestamp: number): string {\n if (!timestamp) return '-'\n const d = new Date(timestamp * 1000)\n return d.toLocaleString('en-US', {\n month: 'short', day: 'numeric', year: 'numeric',\n hour: '2-digit', minute: '2-digit', second: '2-digit'\n })\n}\n\nfunction extractUserInfo(event: StripeEventRecord): { userId?: string; email?: string } {\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n const userId = data?.metadata?.sonicjs_user_id || data?.sonicjs_user_id\n const email = data?.customer_email || data?.customerEmail || data?.receipt_email\n return { userId: userId || undefined, email: email || undefined }\n } catch {\n return {}\n }\n}\n\nfunction renderEventRow(event: StripeEventRecord): string {\n const errorTooltip = event.error ? ` title=\"${event.error.replace(/\"/g, '"')}\"` : ''\n const userInfo = extractUserInfo(event)\n const userLink = userInfo.userId\n ? `${userInfo.email || userInfo.userId}`\n : userInfo.email\n ? `${userInfo.email}`\n : ''\n\n return `\n \n \n ${formatTimestamp(event.processedAt)}\n \n \n ${event.type}\n \n \n
${event.objectId || '-'}
\n
${event.objectType}
\n ${userLink ? `
${userLink}
` : ''}\n \n ${eventStatusBadge(event.status)}\n ${event.stripeEventId}\n \n `\n}\n\nfunction renderEventPagination(page: number, totalPages: number, type?: string, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params: string[] = []\n if (type) params.push(`type=${type}`)\n if (status) params.push(`status=${status}`)\n const extra = params.length > 0 ? `&${params.join('&')}` : ''\n\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","// ============================================================================\n// Stripe Plugin Types\n// ============================================================================\n\nexport type SubscriptionStatus =\n | 'active'\n | 'canceled'\n | 'past_due'\n | 'trialing'\n | 'unpaid'\n | 'paused'\n | 'incomplete'\n | 'incomplete_expired'\n\nexport interface Subscription {\n id: string\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd: boolean\n createdAt: number\n updatedAt: number\n}\n\nexport interface SubscriptionInsert {\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd?: boolean\n}\n\nexport interface SubscriptionFilters {\n status?: SubscriptionStatus\n userId?: string\n stripeCustomerId?: string\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'updated_at' | 'status'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SubscriptionStats {\n total: number\n active: number\n canceled: number\n pastDue: number\n trialing: number\n}\n\nexport interface StripePluginSettings {\n stripePublishableKey: string\n stripeSecretKey: string\n stripeWebhookSecret: string\n stripePriceId?: string\n successUrl: string\n cancelUrl: string\n}\n\nexport const DEFAULT_SETTINGS: StripePluginSettings = {\n stripePublishableKey: '',\n stripeSecretKey: '',\n stripeWebhookSecret: '',\n stripePriceId: '',\n successUrl: '/admin/dashboard',\n cancelUrl: '/admin/dashboard'\n}\n\n// Stripe webhook event types we handle\nexport type StripeWebhookEventType =\n | 'customer.subscription.created'\n | 'customer.subscription.updated'\n | 'customer.subscription.deleted'\n | 'checkout.session.completed'\n | 'invoice.payment_succeeded'\n | 'invoice.payment_failed'\n\n// Minimal Stripe types (we use fetch, not the SDK)\nexport interface StripeEvent {\n id: string\n type: string\n data: {\n object: Record\n }\n}\n\nexport interface StripeSubscriptionObject {\n id: string\n customer: string\n status: string\n items: {\n data: Array<{\n price: {\n id: string\n }\n }>\n }\n current_period_start: number\n current_period_end: number\n cancel_at_period_end: boolean\n metadata?: Record\n}\n\nexport interface StripeCheckoutSession {\n id: string\n customer: string\n subscription: string\n metadata?: Record\n}\n\nexport interface StripeInvoice {\n id: string\n customer: string\n subscription: string | null\n status: string\n amount_paid: number\n currency: string\n}\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\nexport interface StripeEventRecord {\n id: string\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: string // JSON string\n processedAt: number\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n}\n\nexport interface StripeEventFilters {\n type?: string\n status?: 'processed' | 'failed' | 'ignored'\n objectId?: string\n page?: number\n limit?: number\n}\n\nexport interface StripeEventStats {\n total: number\n processed: number\n failed: number\n ignored: number\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { renderSubscriptionsPage } from '../components/subscriptions-page'\nimport { renderEventsPage } from '../components/events-page'\nimport { renderStripeTabBar } from '../components/tab-bar'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { StripePluginSettings, SubscriptionStatus } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Subscriptions dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const statusFilter = c.req.query('status') as SubscriptionStatus | undefined\n\n const [{ subscriptions, total }, stats] = await Promise.all([\n subscriptionService.list({ status: statusFilter, page, limit }),\n subscriptionService.getStats()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderSubscriptionsPage({\n subscriptions: subscriptions as any,\n stats,\n filters: { status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Events log page\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const typeFilter = c.req.query('type') || undefined\n const statusFilter = c.req.query('status') as 'processed' | 'failed' | 'ignored' | undefined\n\n const [{ events, total }, stats, types] = await Promise.all([\n eventService.list({ type: typeFilter, status: statusFilter, page, limit }),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderEventsPage({\n events,\n stats,\n types,\n filters: { type: typeFilter, status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const { renderAdminLayoutCatalyst } = await import('../../../../templates/layouts/admin-layout-catalyst.template')\n\n const content = `\n
\n
\n

Stripe

\n

\n Configure your Stripe API keys and checkout options.\n

\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/settings')}\n\n
\n\n
\n
\n
\n \n \n

Your Stripe publishable key (starts with pk_)

\n
\n\n
\n \n \n

Your Stripe secret API key (starts with sk_)

\n
\n\n
\n \n \n

Stripe webhook endpoint signing secret (starts with whsec_)

\n
\n\n
\n \n \n

Default Stripe Price ID for checkout sessions (optional)

\n
\n\n
\n \n \n

Redirect URL after successful checkout

\n
\n\n
\n \n \n

Redirect URL if checkout is cancelled

\n
\n
\n\n
\n \n
\n
\n
\n\n \n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Stripe Settings',\n pageTitle: 'Stripe Settings',\n currentPath: '/admin/plugins/stripe',\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n content,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'stripe'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving Stripe settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n})\n\nexport { adminRoutes as stripeAdminRoutes }\n","import type { StripePluginSettings } from '../types'\n\n/**\n * Lightweight Stripe API client using fetch (CF Workers compatible, no SDK needed)\n */\nexport class StripeAPI {\n private baseUrl = 'https://api.stripe.com/v1'\n\n constructor(private secretKey: string) {}\n\n /**\n * Verify a webhook signature\n * Implements Stripe's v1 signature scheme using Web Crypto API\n */\n async verifyWebhookSignature(payload: string, sigHeader: string, secret: string): Promise {\n const parts = sigHeader.split(',')\n const timestamp = parts.find(p => p.startsWith('t='))?.split('=')[1]\n const signatures = parts\n .filter(p => p.startsWith('v1='))\n .map(p => p.substring(3))\n\n if (!timestamp || signatures.length === 0) return false\n\n // Reject events older than 5 minutes (tolerance)\n const now = Math.floor(Date.now() / 1000)\n if (Math.abs(now - parseInt(timestamp)) > 300) return false\n\n // Compute expected signature\n const signedPayload = `${timestamp}.${payload}`\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(signedPayload))\n const expectedSignature = Array.from(new Uint8Array(signatureBuffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n\n return signatures.some(sig => timingSafeEqual(sig, expectedSignature))\n }\n\n /**\n * Create a Checkout Session\n */\n async createCheckoutSession(params: {\n priceId: string\n customerId?: string\n customerEmail?: string\n successUrl: string\n cancelUrl: string\n metadata?: Record\n }): Promise<{ id: string; url: string }> {\n const body = new URLSearchParams()\n body.append('mode', 'subscription')\n body.append('line_items[0][price]', params.priceId)\n body.append('line_items[0][quantity]', '1')\n body.append('success_url', params.successUrl)\n body.append('cancel_url', params.cancelUrl)\n\n if (params.customerId) {\n body.append('customer', params.customerId)\n } else if (params.customerEmail) {\n body.append('customer_email', params.customerEmail)\n }\n\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n\n const response = await this.request('POST', '/checkout/sessions', body)\n return { id: response.id, url: response.url }\n }\n\n /**\n * Retrieve a Stripe subscription\n */\n async getSubscription(subscriptionId: string): Promise {\n return this.request('GET', `/subscriptions/${subscriptionId}`)\n }\n\n /**\n * Create a Stripe customer\n */\n async createCustomer(params: { email: string; metadata?: Record }): Promise<{ id: string }> {\n const body = new URLSearchParams()\n body.append('email', params.email)\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n return this.request('POST', '/customers', body)\n }\n\n /**\n * List subscriptions with pagination (auto-expands across pages)\n */\n async listSubscriptions(params?: {\n status?: string\n limit?: number\n startingAfter?: string\n }): Promise<{ data: any[]; has_more: boolean }> {\n const qs = new URLSearchParams()\n qs.append('limit', String(params?.limit || 100))\n if (params?.status) qs.append('status', params.status)\n if (params?.startingAfter) qs.append('starting_after', params.startingAfter)\n return this.request('GET', `/subscriptions?${qs.toString()}`)\n }\n\n /**\n * Fetch ALL subscriptions from Stripe (handles pagination automatically)\n */\n async listAllSubscriptions(): Promise {\n const all: any[] = []\n let startingAfter: string | undefined\n\n while (true) {\n const result = await this.listSubscriptions({ limit: 100, startingAfter })\n all.push(...result.data)\n if (!result.has_more || result.data.length === 0) break\n startingAfter = result.data[result.data.length - 1].id\n }\n\n return all\n }\n\n /**\n * Search for a customer by email\n */\n async findCustomerByEmail(email: string): Promise<{ id: string } | null> {\n const params = new URLSearchParams()\n params.append('query', `email:'${email}'`)\n params.append('limit', '1')\n const result = await this.request('GET', `/customers/search?${params.toString()}`)\n return result.data?.[0] || null\n }\n\n private async request(method: string, path: string, body?: URLSearchParams): Promise {\n const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${this.secretKey}`,\n ...(body ? { 'Content-Type': 'application/x-www-form-urlencoded' } : {})\n },\n ...(body ? { body: body.toString() } : {})\n })\n\n const data = await response.json() as any\n if (!response.ok) {\n throw new Error(`Stripe API error: ${data.error?.message || response.statusText}`)\n }\n return data\n }\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks on signature verification\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n return result === 0\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { StripeAPI } from '../services/stripe-api'\nimport type { Bindings, Variables } from '../../../../app'\nimport type {\n StripePluginSettings,\n StripeEvent,\n StripeSubscriptionObject,\n StripeCheckoutSession,\n StripeInvoice,\n SubscriptionStatus,\n SubscriptionFilters\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\nfunction mapStripeStatus(status: string): SubscriptionStatus {\n const map: Record = {\n active: 'active',\n canceled: 'canceled',\n past_due: 'past_due',\n trialing: 'trialing',\n unpaid: 'unpaid',\n paused: 'paused',\n incomplete: 'incomplete',\n incomplete_expired: 'incomplete_expired'\n }\n return map[status] || 'incomplete'\n}\n\n// ============================================================================\n// Webhook — No auth, verified by Stripe signature\n// ============================================================================\n\napiRoutes.post('/webhook', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeWebhookSecret) {\n return c.json({ error: 'Webhook secret not configured' }, 500)\n }\n\n // Must read raw body for signature verification\n const rawBody = await c.req.text()\n const sigHeader = c.req.header('stripe-signature') || ''\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const isValid = await stripeApi.verifyWebhookSignature(rawBody, sigHeader, settings.stripeWebhookSecret)\n\n if (!isValid) {\n return c.json({ error: 'Invalid signature' }, 400)\n }\n\n const event: StripeEvent = JSON.parse(rawBody)\n const subscriptionService = new SubscriptionService(db)\n const eventService = new StripeEventService(db)\n await Promise.all([subscriptionService.ensureTable(), eventService.ensureTable()])\n\n // Determine object ID and type for the event log\n const obj = event.data.object as any\n const objectId = obj?.id || ''\n const objectType = obj?.object || event.type.split('.')[0] || ''\n\n try {\n switch (event.type) {\n case 'customer.subscription.created': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n\n await subscriptionService.create({\n userId,\n stripeCustomerId: sub.customer,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items.data[0]?.price.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription created: ${sub.id}`)\n break\n }\n\n case 'customer.subscription.updated': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: mapStripeStatus(sub.status),\n stripePriceId: sub.items.data[0]?.price.id || undefined,\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription updated: ${sub.id} -> ${sub.status}`)\n break\n }\n\n case 'customer.subscription.deleted': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: 'canceled'\n })\n\n console.log(`[Stripe] Subscription deleted: ${sub.id}`)\n break\n }\n\n case 'checkout.session.completed': {\n const session = event.data.object as unknown as StripeCheckoutSession\n const userId = session.metadata?.sonicjs_user_id\n\n if (userId && session.subscription) {\n const existing = await subscriptionService.getByStripeSubscriptionId(session.subscription)\n if (existing && !existing.userId) {\n await subscriptionService.updateByStripeId(session.subscription, {\n userId\n } as any)\n }\n }\n\n console.log(`[Stripe] Checkout completed: ${session.id}`)\n break\n }\n\n case 'invoice.payment_succeeded': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'active'\n })\n }\n console.log(`[Stripe] Payment succeeded for invoice: ${invoice.id}`)\n break\n }\n\n case 'invoice.payment_failed': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'past_due'\n })\n }\n console.log(`[Stripe] Payment failed for invoice: ${invoice.id}`)\n break\n }\n\n default:\n console.log(`[Stripe] Unhandled event type: ${event.type}`)\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'ignored'\n })\n return c.json({ received: true })\n }\n\n // Log successfully processed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'processed'\n })\n } catch (error) {\n // Log failed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error)\n }).catch(() => {}) // Don't let logging failure mask the real error\n\n console.error(`[Stripe] Error processing webhook event ${event.type}:`, error)\n return c.json({ error: 'Webhook processing failed' }, 500)\n }\n\n return c.json({ received: true })\n})\n\n// ============================================================================\n// Authenticated API Routes\n// ============================================================================\n\n// Create checkout session for current user\napiRoutes.post('/create-checkout-session', requireAuth(), async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const settings = await getSettings(db)\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe not configured' }, 500)\n }\n\n const body = await c.req.json().catch(() => ({})) as { priceId?: string }\n const priceId = body.priceId || settings.stripePriceId\n if (!priceId) {\n return c.json({ error: 'No price ID specified' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n // Check if user already has a Stripe customer ID\n const existingSub = await subscriptionService.getByUserId(user.userId)\n let customerId = existingSub?.stripeCustomerId\n\n if (!customerId) {\n // Try to find existing customer by email, or create one\n const existing = await stripeApi.findCustomerByEmail(user.email)\n if (existing) {\n customerId = existing.id\n } else {\n const customer = await stripeApi.createCustomer({\n email: user.email,\n metadata: { sonicjs_user_id: user.userId }\n })\n customerId = customer.id\n }\n }\n\n const origin = new URL(c.req.url).origin\n const session = await stripeApi.createCheckoutSession({\n priceId,\n customerId,\n successUrl: `${origin}${settings.successUrl}?session_id={CHECKOUT_SESSION_ID}`,\n cancelUrl: `${origin}${settings.cancelUrl}`,\n metadata: { sonicjs_user_id: user.userId }\n })\n\n return c.json({ sessionId: session.id, url: session.url })\n})\n\n// Get current user's subscription\napiRoutes.get('/subscription', requireAuth(), async (c) => {\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const subscription = await subscriptionService.getByUserId(user.userId)\n if (!subscription) {\n return c.json({ subscription: null })\n }\n\n return c.json({ subscription })\n})\n\n// ============================================================================\n// Admin API Routes\n// ============================================================================\n\n// List all subscriptions (admin only)\napiRoutes.get('/subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const filters: SubscriptionFilters = {\n status: c.req.query('status') as SubscriptionStatus | undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await subscriptionService.list(filters)\n return c.json(result)\n})\n\n// Get subscription stats (admin only)\napiRoutes.get('/stats', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const stats = await subscriptionService.getStats()\n return c.json(stats)\n})\n\n// ============================================================================\n// Sync Subscriptions from Stripe API\n// ============================================================================\n\napiRoutes.post('/sync-subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe secret key not configured' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n try {\n const allSubs = await stripeApi.listAllSubscriptions()\n let synced = 0\n let errors = 0\n\n for (const sub of allSubs) {\n try {\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n await subscriptionService.upsert({\n userId,\n stripeCustomerId: typeof sub.customer === 'string' ? sub.customer : sub.customer.id,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items?.data?.[0]?.price?.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n synced++\n } catch (err) {\n console.error(`[Stripe Sync] Failed to upsert subscription ${sub.id}:`, err)\n errors++\n }\n }\n\n return c.json({\n success: true,\n total: allSubs.length,\n synced,\n errors\n })\n } catch (error) {\n console.error('[Stripe Sync] Error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Sync failed'\n }, 500)\n }\n})\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\napiRoutes.get('/events', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const filters = {\n type: c.req.query('type') || undefined,\n status: c.req.query('status') as any || undefined,\n objectId: c.req.query('objectId') || undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50\n }\n\n const [result, stats, types] = await Promise.all([\n eventService.list(filters),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n return c.json({ ...result, stats, types })\n})\n\nexport { apiRoutes as stripeApiRoutes }\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { stripeAdminRoutes } from './routes/admin'\nimport { stripeApiRoutes } from './routes/api'\n\nexport function createStripePlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'stripe',\n version: '1.0.0-beta.1',\n description: 'Stripe subscription management with webhook handling, checkout sessions, and subscription gating'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard — subscription management\n builder.addRoute('/admin/plugins/stripe', stripeAdminRoutes as any, {\n description: 'Stripe subscriptions admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes — webhook, checkout, subscription status\n builder.addRoute('/api/stripe', stripeApiRoutes as any, {\n description: 'Stripe API endpoints (webhook, checkout, subscription)',\n requiresAuth: false, // Webhook route handles its own auth via signature\n priority: 50\n })\n\n // Admin menu item\n builder.addMenuItem('Stripe', '/admin/plugins/stripe', {\n icon: ``,\n order: 75\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.log('[Stripe] Plugin installed')\n },\n activate: async () => {\n console.log('[Stripe] Plugin activated')\n },\n deactivate: async () => {\n console.log('[Stripe] Plugin deactivated')\n },\n uninstall: async () => {\n console.log('[Stripe] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const stripePlugin = createStripePlugin()\nexport { SubscriptionService } from './services/subscription-service'\nexport { StripeAPI } from './services/stripe-api'\nexport { requireSubscription } from './middleware/require-subscription'\nexport default stripePlugin\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../app'\nimport { PLUGIN_REGISTRY } from '../plugins/manifest-registry'\n\n// Build menu plugin data from the auto-generated registry.\n// Any plugin with an adminMenu entry in its manifest.json will\n// automatically appear in the sidebar when active.\nconst REGISTRY_MENU_PLUGINS = Object.values(PLUGIN_REGISTRY)\n .filter(p => p.adminMenu !== null)\n .map(p => ({\n codeName: p.codeName,\n label: p.adminMenu!.label,\n path: p.adminMenu!.path,\n icon: p.adminMenu!.icon,\n order: p.adminMenu!.order,\n }))\n\n// Map icon names from manifest.json to Heroicons SVG (outline, 24x24)\nconst ICON_SVG: Record = {\n 'magnifying-glass': '',\n 'chart-bar': '',\n 'image': '',\n 'palette': '',\n 'envelope': '',\n 'hand-raised': '',\n 'key': '',\n 'arrow-right': '',\n 'shield-check': '',\n 'credit-card': '',\n}\n\nfunction resolveIcon(iconName?: string): string {\n if (!iconName) return ''\n // If it's already SVG markup, return as-is\n if (iconName.startsWith('`\n const resolvedIcon = resolveIcon(item.icon) || fallbackIcon\n return `\n \n ${isActive ? '' : ''}\n \n \n ${resolvedIcon}\n \n ${item.label}\n \n `\n}\n\nexport function pluginMenuMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n if (!path.startsWith('/admin')) {\n return next()\n }\n\n // Collect menu items from active plugins using the registry\n let activeMenuItems: Array<{ label: string; path: string; icon?: string; order: number }> = []\n try {\n const db = c.env.DB\n const pluginCodeNames = REGISTRY_MENU_PLUGINS.map(p => p.codeName)\n if (pluginCodeNames.length > 0) {\n const placeholders = pluginCodeNames.map(() => '?').join(',')\n const result = await db.prepare(\n `SELECT name FROM plugins WHERE name IN (${placeholders}) AND status = 'active'`\n ).bind(...pluginCodeNames).all()\n\n const activeNames = new Set((result.results || []).map((r: any) => r.name))\n\n for (const plugin of REGISTRY_MENU_PLUGINS) {\n if (activeNames.has(plugin.codeName)) {\n activeMenuItems.push({\n label: plugin.label,\n path: plugin.path,\n icon: plugin.icon,\n order: plugin.order,\n })\n }\n }\n\n // Sort by order\n activeMenuItems.sort((a, b) => a.order - b.order)\n }\n } catch {\n // DB not ready or plugin table doesn't exist yet\n }\n\n c.set('pluginMenuItems', activeMenuItems.map(m => ({ label: m.label, path: m.path, icon: resolveIcon(m.icon) || '' })))\n\n await next()\n\n // Inject menu items into HTML response by replacing the marker\n if (activeMenuItems.length > 0 && c.res.headers.get('content-type')?.includes('text/html')) {\n const status = c.res.status\n const headers = new Headers(c.res.headers)\n const html = await c.res.text()\n\n if (html.includes(MARKER)) {\n const renderedItems = activeMenuItems.map(item => renderMenuItem(item, path)).join('')\n const newHtml = html.split(MARKER).join(renderedItems)\n c.res = new Response(newHtml, { status, headers })\n } else {\n // Body was consumed by .text(), must create new Response either way\n c.res = new Response(html, { status, headers })\n }\n }\n }\n}\n","/**\n * SonicJS Plugin System Types\n * \n * Defines the core interfaces and types for the plugin system\n */\n\nimport { Hono, Context, Next, MiddlewareHandler } from 'hono'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\n\n// Core plugin definition\nexport interface Plugin {\n /** Unique plugin identifier */\n name: string\n /** Plugin version (semantic versioning) */\n version: string\n /** Human-readable description */\n description?: string\n /** Plugin author information */\n author?: {\n name: string\n email?: string\n url?: string\n }\n /** Plugin dependencies (other plugins required) */\n dependencies?: string[]\n /** SonicJS version compatibility */\n compatibility?: string\n /** Plugin license */\n license?: string\n \n // Extension points\n routes?: PluginRoutes[]\n middleware?: PluginMiddleware[]\n models?: PluginModel[]\n services?: PluginService[]\n adminPages?: PluginAdminPage[]\n adminComponents?: PluginComponent[]\n menuItems?: PluginMenuItem[]\n hooks?: PluginHook[]\n \n // Lifecycle hooks\n install?: (context: PluginContext) => Promise\n uninstall?: (context: PluginContext) => Promise\n activate?: (context: PluginContext) => Promise\n deactivate?: (context: PluginContext) => Promise\n configure?: (config: PluginConfig) => Promise\n}\n\n// Plugin context provides access to SonicJS APIs\nexport interface PluginContext {\n /** Database instance */\n db: D1Database\n /** Key-value storage */\n kv: KVNamespace\n /** R2 storage bucket */\n r2?: R2Bucket\n /** Plugin configuration */\n config: PluginConfig\n /** Core SonicJS services */\n services: {\n auth: AuthService\n content: ContentService\n media: MediaService\n }\n /** Hook system for inter-plugin communication */\n hooks: HookSystem | ScopedHookSystem\n /** Logging utilities */\n logger: PluginLogger\n}\n\n// Authentication service interface for plugins\nexport interface AuthService {\n /** Generate JWT token for a user */\n generateToken(userId: string, email: string, role: string): Promise\n /** Verify and decode JWT token */\n verifyToken(token: string): Promise\n /** Set authentication cookie (useful for alternative auth methods) */\n setAuthCookie(context: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void\n /** Hash password */\n hashPassword(password: string): Promise\n /** Verify password against hash */\n verifyPassword(password: string, hash: string): Promise\n}\n\n// Plugin configuration\nexport interface PluginConfig {\n /** Plugin-specific configuration */\n [key: string]: any\n /** Whether plugin is enabled */\n enabled: boolean\n /** Plugin installation timestamp */\n installedAt?: number\n /** Plugin last update timestamp */\n updatedAt?: number\n}\n\n// Route definitions\nexport interface PluginRoutes {\n /** Route path prefix */\n path: string\n /** Hono route handler */\n handler: Hono\n /** Route description */\n description?: string\n /** Whether route requires authentication */\n requiresAuth?: boolean\n /** Required roles for access */\n roles?: string[]\n /** Route priority (for ordering) */\n priority?: number\n}\n\n// Middleware definitions\nexport interface PluginMiddleware {\n /** Middleware name */\n name: string\n /** Middleware handler function */\n handler: MiddlewareHandler\n /** Middleware description */\n description?: string\n /** Middleware priority (lower = earlier) */\n priority?: number\n /** Routes to apply middleware to */\n routes?: string[]\n /** Whether to apply globally */\n global?: boolean\n}\n\n// Database model definitions\nexport interface PluginModel {\n /** Model name */\n name: string\n /** Database table name */\n tableName: string\n /** Zod schema for validation */\n schema: z.ZodSchema\n /** Database migrations */\n migrations: string[]\n /** Model relationships */\n relationships?: ModelRelationship[]\n /** Whether model extends core content */\n extendsContent?: boolean\n}\n\nexport interface ModelRelationship {\n type: 'oneToOne' | 'oneToMany' | 'manyToMany'\n target: string\n foreignKey?: string\n joinTable?: string\n}\n\n// Service definitions\nexport interface PluginService {\n /** Service name */\n name: string\n /** Service implementation */\n implementation: any\n /** Service description */\n description?: string\n /** Service dependencies */\n dependencies?: string[]\n /** Whether service is singleton */\n singleton?: boolean\n}\n\n// Admin interface extensions\nexport interface PluginAdminPage {\n /** Page path (relative to /admin) */\n path: string\n /** Page title */\n title: string\n /** Page component/template */\n component: string\n /** Page description */\n description?: string\n /** Required permissions */\n permissions?: string[]\n /** Menu item configuration */\n menuItem?: PluginMenuItem\n /** Page icon */\n icon?: string\n}\n\nexport interface PluginComponent {\n /** Component name */\n name: string\n /** Component template function */\n template: (props: any) => string\n /** Component description */\n description?: string\n /** Component props schema */\n propsSchema?: z.ZodSchema\n}\n\nexport interface PluginMenuItem {\n /** Menu item label */\n label: string\n /** Menu item path */\n path: string\n /** Menu item icon */\n icon?: string\n /** Menu item order */\n order?: number\n /** Parent menu item */\n parent?: string\n /** Required permissions */\n permissions?: string[]\n /** Whether item is active */\n active?: boolean\n}\n\n// Hook system for extensibility\nexport interface PluginHook {\n /** Hook name */\n name: string\n /** Hook handler function */\n handler: HookHandler\n /** Hook priority */\n priority?: number\n /** Hook description */\n description?: string\n}\n\nexport type HookHandler = (data: any, context: HookContext) => Promise\n\nexport interface HookContext {\n /** Plugin that registered the hook */\n plugin: string\n /** Hook execution context */\n context: PluginContext\n /** Cancel hook execution */\n cancel?: () => void\n}\n\n// Hook system interface\nexport interface HookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Get all registered hooks */\n getHooks(hookName: string): PluginHook[]\n /** Create a scoped hook system (optional) */\n createScope?(pluginName: string): ScopedHookSystem\n}\n\n// Scoped hook system for plugins\nexport interface ScopedHookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Remove all hooks for this scope */\n unregisterAll(): void\n}\n\n// Plugin registry\nexport interface PluginRegistry {\n /** Get plugin by name */\n get(name: string): Plugin | undefined\n /** Get all registered plugins */\n getAll(): Plugin[]\n /** Get active plugins */\n getActive(): Plugin[]\n /** Register a plugin */\n register(plugin: Plugin): Promise\n /** Unregister a plugin */\n unregister(name: string): Promise\n /** Check if plugin is registered */\n has(name: string): boolean\n /** Activate a plugin */\n activate(name: string): Promise\n /** Deactivate a plugin */\n deactivate(name: string): Promise\n /** Get plugin configuration */\n getConfig(name: string): PluginConfig | undefined\n /** Set plugin configuration */\n setConfig(name: string, config: PluginConfig): void\n /** Get plugin status */\n getStatus(name: string): PluginStatus | undefined\n /** Get all plugin statuses */\n getAllStatuses(): Map\n /** Resolve plugin load order based on dependencies */\n resolveLoadOrder(): string[]\n}\n\n// Plugin manager\nexport interface PluginManager {\n /** Plugin registry */\n registry: PluginRegistry\n /** Hook system */\n hooks: HookSystem\n /** Initialize plugin system */\n initialize(context: PluginContext): Promise\n /** Load plugins from configuration */\n loadPlugins(config: PluginConfig[]): Promise\n /** Install a plugin */\n install(plugin: Plugin, config?: PluginConfig): Promise\n /** Uninstall a plugin */\n uninstall(name: string): Promise\n /** Get plugin status */\n getStatus(name: string): PluginStatus\n}\n\nexport interface PluginStatus {\n name: string\n version: string\n active: boolean\n installed: boolean\n hasErrors: boolean\n errors?: string[]\n lastError?: string\n}\n\n// Service interfaces\nexport interface AuthService {\n /** Verify user permissions */\n hasPermission(userId: string, permission: string): Promise\n /** Get current user */\n getCurrentUser(context: Context): Promise\n /** Create authentication middleware */\n createMiddleware(options?: any): MiddlewareHandler\n}\n\nexport interface ContentService {\n /** Get content by ID */\n getById(id: string): Promise\n /** Create new content */\n create(data: any): Promise\n /** Update content */\n update(id: string, data: any): Promise\n /** Delete content */\n delete(id: string): Promise\n /** Search content */\n search(query: string, options?: any): Promise\n}\n\nexport interface MediaService {\n /** Upload file */\n upload(file: File, options?: any): Promise\n /** Get media by ID */\n getById(id: string): Promise\n /** Delete media */\n delete(id: string): Promise\n /** Transform image */\n transform(id: string, options: any): Promise\n}\n\n// Plugin logger\nexport interface PluginLogger {\n debug(message: string, data?: any): void\n info(message: string, data?: any): void\n warn(message: string, data?: any): void\n error(message: string, error?: Error, data?: any): void\n}\n\n// Plugin development utilities interface\n\nexport interface PluginBuilderOptions {\n name: string\n version: string\n description?: string\n author?: Plugin['author']\n dependencies?: string[]\n}\n\n// Plugin validation\nexport interface PluginValidator {\n /** Validate plugin definition */\n validate(plugin: Plugin): PluginValidationResult\n /** Validate plugin dependencies */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult\n /** Validate plugin compatibility */\n validateCompatibility(plugin: Plugin, version: string): PluginValidationResult\n}\n\nexport interface PluginValidationResult {\n valid: boolean\n errors: string[]\n warnings: string[]\n}\n\n// Standard hook names\nexport const HOOKS = {\n // Application lifecycle\n APP_INIT: 'app:init',\n APP_READY: 'app:ready',\n APP_SHUTDOWN: 'app:shutdown',\n \n // Request lifecycle\n REQUEST_START: 'request:start',\n REQUEST_END: 'request:end',\n REQUEST_ERROR: 'request:error',\n \n // Authentication\n AUTH_LOGIN: 'auth:login',\n AUTH_LOGOUT: 'auth:logout',\n AUTH_REGISTER: 'auth:register',\n USER_LOGIN: 'user:login',\n USER_LOGOUT: 'user:logout',\n \n // Content lifecycle\n CONTENT_CREATE: 'content:create',\n CONTENT_UPDATE: 'content:update',\n CONTENT_DELETE: 'content:delete',\n CONTENT_PUBLISH: 'content:publish',\n CONTENT_SAVE: 'content:save',\n \n // Media lifecycle\n MEDIA_UPLOAD: 'media:upload',\n MEDIA_DELETE: 'media:delete',\n MEDIA_TRANSFORM: 'media:transform',\n \n // Plugin lifecycle\n PLUGIN_INSTALL: 'plugin:install',\n PLUGIN_UNINSTALL: 'plugin:uninstall',\n PLUGIN_ACTIVATE: 'plugin:activate',\n PLUGIN_DEACTIVATE: 'plugin:deactivate',\n \n // Admin interface\n ADMIN_MENU_RENDER: 'admin:menu:render',\n ADMIN_PAGE_RENDER: 'admin:page:render',\n \n // Database\n DB_MIGRATE: 'db:migrate',\n DB_SEED: 'db:seed',\n} as const\n\nexport type HookName = typeof HOOKS[keyof typeof HOOKS]","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { renderAdminLayoutCatalyst } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\n// Analytics Dashboard\nadminRoutes.get('/', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Query real metrics from system_logs\n let totalRequests = 0\n let uniqueIPs = 0\n let avgDuration = 0\n let errorCount = 0\n let topPages: Array<{ path: string; views: number }> = []\n let recentActivity: Array<{ url: string; method: string; status_code: number; duration: number; created_at: number }> = []\n\n try {\n const now = Math.floor(Date.now() / 1000)\n const dayAgo = now - 86400\n\n const [requestsResult, ipsResult, durationResult, errorsResult, pagesResult, activityResult] = await Promise.all([\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT COUNT(DISTINCT ip_address) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT AVG(duration) as avg FROM system_logs WHERE category = ? AND created_at > ? AND duration IS NOT NULL')\n .bind('api', dayAgo).first() as Promise<{ avg: number } | null>,\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE level IN (?, ?) AND created_at > ?')\n .bind('error', 'fatal', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT url, COUNT(*) as views FROM system_logs WHERE category = ? AND created_at > ? AND url IS NOT NULL GROUP BY url ORDER BY views DESC LIMIT 10')\n .bind('api', dayAgo).all(),\n db.prepare('SELECT url, method, status_code, duration, created_at FROM system_logs WHERE category = ? ORDER BY created_at DESC LIMIT 20')\n .bind('api').all(),\n ])\n\n totalRequests = requestsResult?.count || 0\n uniqueIPs = ipsResult?.count || 0\n avgDuration = Math.round(durationResult?.avg || 0)\n errorCount = errorsResult?.count || 0\n topPages = (pagesResult.results || []).map((r: any) => ({ path: r.url, views: r.views }))\n recentActivity = (activityResult.results || []) as any[]\n } catch {\n // Tables may not exist yet\n }\n\n const content = `\n
\n
\n

Analytics Dashboard

\n

Last 24 hours overview from system logs

\n
\n\n \n
\n
\n

Total Requests

\n

${totalRequests.toLocaleString()}

\n
\n
\n

Unique Visitors

\n

${uniqueIPs.toLocaleString()}

\n
\n
\n

Avg Response Time

\n

${avgDuration}ms

\n
\n
\n

Errors

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${errorCount.toLocaleString()}

\n
\n
\n\n \n
\n
\n

Top Pages

\n
\n
\n ${topPages.length > 0 ? topPages.map(p => `\n
\n ${escapeHtml(p.path)}\n ${p.views}\n
\n `).join('') : `\n
\n No page views recorded yet. Analytics data will appear once requests are logged.\n
\n `}\n
\n
\n\n \n
\n
\n

Recent Activity

\n
\n
\n \n \n \n \n \n \n \n \n \n \n ${recentActivity.length > 0 ? recentActivity.map(a => `\n \n \n \n \n \n \n `).join('') : `\n \n \n \n `}\n \n
PathMethodStatusDuration
${escapeHtml(a.url || '')}${a.method || ''}= 400 ? 'bg-red-50 text-red-700 dark:bg-red-900/30 dark:text-red-400' : 'bg-green-50 text-green-700 dark:bg-green-900/30 dark:text-green-400'}\">${a.status_code || ''}${a.duration || 0}ms
No activity recorded yet.
\n
\n
\n
\n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Analytics',\n pageTitle: 'Analytics Dashboard',\n currentPath: '/admin/analytics',\n version: c.get('appVersion'),\n user: user ? {\n name: user.email.split('@')[0] || 'Admin',\n email: user.email,\n role: user.role\n } : undefined,\n content,\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"')\n}\n\nexport { adminRoutes as analyticsAdminRoutes }\n","/**\n * Core Analytics Plugin\n * \n * Provides analytics tracking and reporting extensions\n */\n\nimport { Hono } from 'hono'\n// import { z } from 'zod'\nimport { PluginBuilder, PluginHelpers } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { HOOKS } from '../../types'\nimport { analyticsAdminRoutes } from './routes/admin'\n\nexport function createAnalyticsPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'core-analytics',\n version: '1.0.0-beta.1',\n description: 'Core analytics tracking and reporting plugin'\n })\n\n // Add analytics metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^0.1.0',\n dependencies: ['core-auth'] // Requires auth for admin access\n })\n\n // Create analytics API routes\n const analyticsAPI = new Hono()\n\n // GET /analytics/stats - Get analytics overview\n analyticsAPI.get('/stats', async (c) => {\n const timeRange = c.req.query('range') || '7d' // 1d, 7d, 30d, 90d\n const _metric = c.req.query('metric') || 'all' // pageviews, sessions, users, etc.\n\n return c.json({\n message: 'Analytics stats',\n data: {\n pageviews: 12500,\n uniqueVisitors: 3200,\n sessions: 4800,\n avgSessionDuration: 245,\n bounceRate: 0.35,\n topPages: [\n { path: '/', views: 3200 },\n { path: '/about', views: 1800 },\n { path: '/contact', views: 950 }\n ],\n timeRange\n }\n })\n })\n\n // POST /analytics/track - Track analytics event\n analyticsAPI.post('/track', async (c) => {\n const event = await c.req.json()\n \n // Track event (pageview, click, form submission, etc.)\n console.info('Analytics event tracked:', event)\n \n return c.json({\n message: 'Event tracked successfully',\n eventId: `event-${Date.now()}`\n })\n })\n\n // GET /analytics/reports - Get detailed reports\n analyticsAPI.get('/reports', async (c) => {\n const reportType = c.req.query('type') || 'traffic'\n const startDate = c.req.query('start')\n const endDate = c.req.query('end')\n\n return c.json({\n message: 'Analytics report',\n data: {\n reportType,\n dateRange: { start: startDate, end: endDate },\n data: []\n }\n })\n })\n\n // GET /analytics/realtime - Get real-time analytics\n analyticsAPI.get('/realtime', async (c) => {\n return c.json({\n message: 'Real-time analytics',\n data: {\n activeUsers: 23,\n activePages: [\n { path: '/', users: 8 },\n { path: '/blog', users: 5 },\n { path: '/products', users: 4 }\n ],\n recentEvents: []\n }\n })\n })\n\n builder.addRoute('/api/analytics', analyticsAPI, {\n description: 'Analytics tracking and reporting API',\n requiresAuth: true,\n roles: ['admin', 'analytics:read'],\n priority: 3\n })\n\n // Admin dashboard routes\n builder.addRoute('/admin/analytics', analyticsAdminRoutes as any, {\n description: 'Analytics admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // Add analytics tracking middleware\n builder.addSingleMiddleware('analytics-tracker', async (c: any, next: any) => {\n const start = Date.now()\n const path = c.req.path\n const method = c.req.method\n const userAgent = c.req.header('user-agent')\n const referer = c.req.header('referer')\n const ip = c.req.header('CF-Connecting-IP') || c.req.header('x-forwarded-for')\n\n await next()\n\n const duration = Date.now() - start\n const status = c.res.status\n\n // Track request analytics\n const analyticsData = {\n timestamp: new Date().toISOString(),\n path,\n method,\n status,\n duration,\n userAgent,\n referer,\n ip,\n responseSize: c.res.headers.get('content-length') || 0\n }\n\n console.debug('Analytics tracking:', analyticsData)\n \n // Store analytics data (would integrate with analytics service)\n }, {\n description: 'Track page views and request analytics',\n global: true,\n priority: 99 // Run last to capture response data\n })\n\n // Add analytics service\n builder.addService('analyticsService', {\n trackEvent: async (event: any) => {\n // Event tracking implementation\n console.info('Tracking event:', event)\n return { eventId: `event-${Date.now()}` }\n },\n \n trackPageView: async (data: any) => {\n // Page view tracking implementation\n console.info('Tracking pageview:', data.path)\n return { viewId: `view-${Date.now()}` }\n },\n \n getStats: async (_timeRange: string) => {\n // Get analytics statistics\n return {\n pageviews: 12500,\n sessions: 4800,\n uniqueVisitors: 3200\n }\n },\n \n generateReport: async (type: string, options: any) => {\n // Generate analytics reports\n console.info(`Generating ${type} report with options:`, options)\n return { reportId: `report-${Date.now()}` }\n }\n }, {\n description: 'Core analytics tracking service',\n singleton: true\n })\n\n // Add analytics models\n const pageViewSchema = PluginHelpers.createSchema([\n { name: 'path', type: 'string', optional: false },\n { name: 'title', type: 'string', optional: true },\n { name: 'referrer', type: 'string', optional: true },\n { name: 'userAgent', type: 'string', optional: true },\n { name: 'ipAddress', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true },\n { name: 'duration', type: 'number', optional: true }\n ])\n\n const eventSchema = PluginHelpers.createSchema([\n { name: 'eventType', type: 'string', optional: false },\n { name: 'eventName', type: 'string', optional: false },\n { name: 'eventData', type: 'object', optional: true },\n { name: 'path', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true }\n ])\n\n const pageViewMigration = PluginHelpers.createMigration('analytics_pageviews', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'path', type: 'TEXT', nullable: false },\n { name: 'title', type: 'TEXT', nullable: true },\n { name: 'referrer', type: 'TEXT', nullable: true },\n { name: 'user_agent', type: 'TEXT', nullable: true },\n { name: 'ip_address', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true },\n { name: 'duration', type: 'INTEGER', nullable: true }\n ])\n\n const eventMigration = PluginHelpers.createMigration('analytics_events', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'event_type', type: 'TEXT', nullable: false },\n { name: 'event_name', type: 'TEXT', nullable: false },\n { name: 'event_data', type: 'TEXT', nullable: true },\n { name: 'path', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true }\n ])\n\n builder.addModel('PageView', {\n tableName: 'analytics_pageviews',\n schema: pageViewSchema,\n migrations: [pageViewMigration]\n })\n\n builder.addModel('AnalyticsEvent', {\n tableName: 'analytics_events',\n schema: eventSchema,\n migrations: [eventMigration]\n })\n\n // Add analytics hooks\n builder.addHook(HOOKS.REQUEST_START, async (data: any, _context: any) => {\n // Start tracking request\n data.analytics = {\n startTime: Date.now(),\n sessionId: `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n return data\n }, {\n priority: 1,\n description: 'Initialize analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.REQUEST_END, async (data: any, _context: any) => {\n // Complete request tracking\n if (data.analytics) {\n const duration = Date.now() - data.analytics.startTime\n console.debug(`Request completed in ${duration}ms`)\n }\n return data\n }, {\n priority: 1,\n description: 'Complete analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.USER_LOGIN, async (data: any, context: any) => {\n // Track user login events\n await context.services?.analyticsService?.trackEvent({\n eventType: 'auth',\n eventName: 'user_login',\n userId: data.userId,\n eventData: { loginMethod: data.method }\n })\n return data\n }, {\n priority: 8,\n description: 'Track user login events'\n })\n\n builder.addHook('content:view', async (data: any, context: any) => {\n // Track content views\n await context.services?.analyticsService?.trackEvent({\n eventType: 'content',\n eventName: 'content_view',\n eventData: {\n contentId: data.id,\n contentType: data.type,\n title: data.title\n }\n })\n return data\n }, {\n priority: 8,\n description: 'Track content view events'\n })\n\n // Add admin pages\n builder.addAdminPage(\n '/analytics',\n 'Analytics Dashboard',\n 'AnalyticsDashboardView',\n {\n description: 'View analytics overview and key metrics',\n permissions: ['admin', 'analytics:read'],\n icon: 'chart-bar'\n }\n )\n\n builder.addAdminPage(\n '/analytics/reports',\n 'Analytics Reports',\n 'AnalyticsReportsView',\n {\n description: 'Generate and view detailed analytics reports',\n permissions: ['admin', 'analytics:read'],\n icon: 'document-report'\n }\n )\n\n builder.addAdminPage(\n '/analytics/realtime',\n 'Real-time Analytics',\n 'AnalyticsRealtimeView',\n {\n description: 'View real-time visitor activity',\n permissions: ['admin', 'analytics:read'],\n icon: 'lightning-bolt'\n }\n )\n\n builder.addAdminPage(\n '/analytics/settings',\n 'Analytics Settings',\n 'AnalyticsSettingsView',\n {\n description: 'Configure analytics tracking and data collection',\n permissions: ['admin', 'analytics:configure'],\n icon: 'cog'\n }\n )\n\n // Add menu items\n builder.addMenuItem('Analytics', '/admin/analytics', {\n icon: 'chart-bar',\n order: 40,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Dashboard', '/admin/analytics', {\n icon: 'chart-bar',\n parent: 'Analytics',\n order: 1,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Reports', '/admin/analytics/reports', {\n icon: 'document-report',\n parent: 'Analytics',\n order: 2,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Real-time', '/admin/analytics/realtime', {\n icon: 'lightning-bolt',\n parent: 'Analytics',\n order: 3,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Settings', '/admin/analytics/settings', {\n icon: 'cog',\n parent: 'Analytics',\n order: 4,\n permissions: ['admin', 'analytics:configure']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.info('Installing analytics plugin...')\n // Create analytics database tables and initial configuration\n },\n\n activate: async () => {\n console.info('Activating analytics plugin...')\n // Start analytics tracking services\n },\n\n deactivate: async () => {\n console.info('Deactivating analytics plugin...')\n // Stop analytics tracking and clean up resources\n },\n\n configure: async (config) => {\n console.info('Configuring analytics plugin...', config)\n // Update analytics configuration and settings\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const analyticsPlugin = createAnalyticsPlugin()","import type { D1Database } from '@cloudflare/workers-types'\n\nexport interface TrackEventInput {\n event: string\n properties?: Record\n userId?: string\n sessionId?: string\n ipAddress?: string\n userAgent?: string\n path?: string\n category?: string\n}\n\nexport interface EventQueryFilters {\n event?: string\n category?: string\n userId?: string\n sessionId?: string\n startDate?: number\n endDate?: number\n limit?: number\n offset?: number\n}\n\nexport interface EventStats {\n totalEvents: number\n uniqueUsers: number\n uniqueSessions: number\n topEvents: Array<{ event: string; count: number }>\n}\n\nexport class EventTrackingService {\n constructor(private db: D1Database) {}\n\n async trackEvent(input: TrackEventInput): Promise {\n const id = crypto.randomUUID()\n const category = input.category || 'user-activity'\n\n await this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n ).run()\n\n return id\n }\n\n async trackBatch(events: TrackEventInput[]): Promise {\n const ids: string[] = []\n\n const stmts = events.map(input => {\n const id = crypto.randomUUID()\n ids.push(id)\n const category = input.category || 'user-activity'\n\n return this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n )\n })\n\n await this.db.batch(stmts)\n return ids\n }\n\n async queryEvents(filters: EventQueryFilters = {}): Promise<{ events: any[]; total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.event) {\n conditions.push('event = ?')\n params.push(filters.event)\n }\n if (filters.category) {\n conditions.push('category = ?')\n params.push(filters.category)\n }\n if (filters.userId) {\n conditions.push('user_id = ?')\n params.push(filters.userId)\n }\n if (filters.sessionId) {\n conditions.push('session_id = ?')\n params.push(filters.sessionId)\n }\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const limit = filters.limit || 50\n const offset = filters.offset || 0\n\n const [countResult, eventsResult] = await Promise.all([\n this.db.prepare(`SELECT COUNT(*) as total FROM analytics_events ${where}`).bind(...params).first() as Promise<{ total: number } | null>,\n this.db.prepare(`SELECT * FROM analytics_events ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`).bind(...params, limit, offset).all()\n ])\n\n const events = (eventsResult.results || []).map((e: any) => ({\n ...e,\n properties: e.properties ? JSON.parse(e.properties) : null\n }))\n\n return { events, total: countResult?.total || 0 }\n }\n\n async getStats(startDate?: number, endDate?: number): Promise {\n const conditions: string[] = []\n const params: any[] = []\n\n if (startDate) {\n conditions.push('created_at >= ?')\n params.push(startDate)\n }\n if (endDate) {\n conditions.push('created_at <= ?')\n params.push(endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n const [totals, topEvents] = await Promise.all([\n this.db.prepare(`\n SELECT\n COUNT(*) as total_events,\n COUNT(DISTINCT user_id) as unique_users,\n COUNT(DISTINCT session_id) as unique_sessions\n FROM analytics_events ${where}\n `).bind(...params).first() as Promise<{ total_events: number; unique_users: number; unique_sessions: number } | null>,\n this.db.prepare(`\n SELECT event, COUNT(*) as count\n FROM analytics_events ${where}\n GROUP BY event ORDER BY count DESC LIMIT 20\n `).bind(...params).all()\n ])\n\n return {\n totalEvents: totals?.total_events || 0,\n uniqueUsers: totals?.unique_users || 0,\n uniqueSessions: totals?.unique_sessions || 0,\n topEvents: (topEvents.results || []).map((r: any) => ({ event: r.event, count: r.count }))\n }\n }\n}\n","import { Hono } from 'hono'\nimport { EventTrackingService } from '../services/event-tracking-service'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// POST /api/events - Track a single event or batch of events\napiRoutes.post('/', async (c) => {\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || ''\n const user = c.get('user')\n\n let body: any\n try {\n body = await c.req.json()\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400)\n }\n\n // Batch support: accept an array of events\n if (Array.isArray(body)) {\n if (body.length > 100) {\n return c.json({ error: 'Batch size limit is 100 events' }, 400)\n }\n\n const events = body.map(e => ({\n event: e.event,\n category: e.category || 'user-activity',\n properties: e.properties,\n userId: user?.userId || e.userId,\n sessionId: e.sessionId,\n ipAddress: ip,\n userAgent,\n path: e.path\n }))\n\n // Validate all events have an event name\n const invalid = events.find(e => !e.event || typeof e.event !== 'string')\n if (invalid) {\n return c.json({ error: 'Each event must have an \"event\" string field' }, 400)\n }\n\n const ids = await service.trackBatch(events)\n return c.json({ success: true, eventIds: ids, count: ids.length })\n }\n\n // Single event\n if (!body.event || typeof body.event !== 'string') {\n return c.json({ error: '\"event\" field is required and must be a string' }, 400)\n }\n\n const eventId = await service.trackEvent({\n event: body.event,\n category: body.category || 'user-activity',\n properties: body.properties,\n userId: user?.userId || body.userId,\n sessionId: body.sessionId,\n ipAddress: ip,\n userAgent,\n path: body.path\n })\n\n return c.json({ success: true, eventId })\n})\n\n// GET /api/events - Query events (admin only)\napiRoutes.get('/', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const filters = {\n event: c.req.query('event') || undefined,\n category: c.req.query('category') || undefined,\n userId: c.req.query('userId') || undefined,\n sessionId: c.req.query('sessionId') || undefined,\n startDate: c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined,\n endDate: c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n offset: c.req.query('offset') ? parseInt(c.req.query('offset')!) : 0\n }\n\n const result = await service.queryEvents(filters)\n return c.json(result)\n})\n\n// GET /api/events/stats - Aggregated event stats (admin only)\napiRoutes.get('/stats', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const startDate = c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined\n const endDate = c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined\n\n const stats = await service.getStats(startDate, endDate)\n return c.json(stats)\n})\n\nexport { apiRoutes as eventsApiRoutes }\n","/**\n * Cache Configuration\n *\n * Defines cache configurations for different entity types\n */\n\nexport interface CacheConfig {\n ttl: number // Time-to-live in seconds\n kvEnabled: boolean // Use KV cache tier\n memoryEnabled: boolean // Use in-memory cache tier\n namespace: string // Cache namespace/prefix\n invalidateOn: string[] // Events that invalidate this cache\n version?: string // Cache version for busting\n}\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\n/**\n * Default cache configurations by entity type\n */\nexport const CACHE_CONFIGS: Record = {\n // Content (high read, low write)\n content: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'content',\n invalidateOn: ['content.update', 'content.delete', 'content.publish'],\n version: 'v1'\n },\n\n // User data (medium read, medium write)\n user: {\n ttl: 900, // 15 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'user',\n invalidateOn: ['user.update', 'user.delete', 'auth.login'],\n version: 'v1'\n },\n\n // Configuration (high read, very low write)\n config: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'config',\n invalidateOn: ['config.update', 'plugin.activate', 'plugin.deactivate'],\n version: 'v1'\n },\n\n // Media metadata (high read, low write)\n media: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'media',\n invalidateOn: ['media.upload', 'media.delete', 'media.update'],\n version: 'v1'\n },\n\n // API responses (very high read, low write)\n api: {\n ttl: 300, // 5 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'api',\n invalidateOn: ['content.update', 'content.publish'],\n version: 'v1'\n },\n\n // Session data (very high read, medium write)\n session: {\n ttl: 1800, // 30 minutes\n kvEnabled: false, // Only in-memory for sessions\n memoryEnabled: true,\n namespace: 'session',\n invalidateOn: ['auth.logout'],\n version: 'v1'\n },\n\n // Plugin data\n plugin: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'plugin',\n invalidateOn: ['plugin.activate', 'plugin.deactivate', 'plugin.update'],\n version: 'v1'\n },\n\n // Collections/schema\n collection: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'collection',\n invalidateOn: ['collection.update', 'collection.delete'],\n version: 'v1'\n }\n}\n\n/**\n * Get cache configuration for a specific namespace\n */\nexport function getCacheConfig(namespace: string): CacheConfig {\n return CACHE_CONFIGS[namespace] || {\n ttl: 3600,\n kvEnabled: true,\n memoryEnabled: true,\n namespace,\n invalidateOn: [],\n version: 'v1'\n }\n}\n\n/**\n * Generate a cache key with consistent format\n * Format: {namespace}:{type}:{identifier}:{version}\n */\nexport function generateCacheKey(\n namespace: string,\n type: string,\n identifier: string,\n version?: string\n): string {\n const v = version || getCacheConfig(namespace).version || 'v1'\n return `${namespace}:${type}:${identifier}:${v}`\n}\n\n/**\n * Parse a cache key back into its components\n */\nexport function parseCacheKey(key: string): {\n namespace: string\n type: string\n identifier: string\n version: string\n} | null {\n const parts = key.split(':')\n if (parts.length !== 4) {\n return null\n }\n\n return {\n namespace: parts[0] || '',\n type: parts[1] || '',\n identifier: parts[2] || '',\n version: parts[3] || ''\n }\n}\n\n/**\n * Generate a hash for complex query parameters\n */\nexport function hashQueryParams(params: Record): string {\n // Sort keys for consistent hashing\n const sortedKeys = Object.keys(params).sort()\n const normalized = sortedKeys.map(key => `${key}=${params[key]}`).join('&')\n\n // Simple hash function (for better performance, consider using crypto)\n let hash = 0\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Create a pattern for cache invalidation\n */\nexport function createCachePattern(\n namespace: string,\n type?: string,\n identifier?: string\n): string {\n let pattern = namespace\n if (type) pattern += `:${type}`\n if (identifier) pattern += `:${identifier}`\n return pattern + ':*'\n}\n","/**\n * Cache Service\n *\n * Three-tiered caching implementation:\n * 1. In-Memory Cache (fastest, region-specific)\n * 2. Cloudflare KV Cache (fast, global)\n * 3. Database (fallback, source of truth)\n */\n\nimport { CacheConfig, CacheStats, generateCacheKey } from './cache-config.js'\n\n/**\n * Cache entry with metadata\n */\ninterface CacheEntry {\n data: T\n timestamp: number\n expiresAt: number\n version: string\n}\n\n/**\n * In-memory cache store\n */\nclass MemoryCache {\n private cache: Map> = new Map()\n private maxSize: number = 50 * 1024 * 1024 // 50MB\n private currentSize: number = 0\n\n /**\n * Get item from memory cache\n */\n get(key: string): T | null {\n const entry = this.cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n this.delete(key)\n return null\n }\n\n return entry.data as T\n }\n\n /**\n * Set item in memory cache\n */\n set(key: string, value: T, ttl: number, version: string = 'v1'): void {\n const now = Date.now()\n const entry: CacheEntry = {\n data: value,\n timestamp: now,\n expiresAt: now + (ttl * 1000),\n version\n }\n\n // Estimate size (rough approximation)\n const entrySize = JSON.stringify(entry).length * 2 // UTF-16\n\n // Check if we need to evict\n if (this.currentSize + entrySize > this.maxSize) {\n this.evictLRU(entrySize)\n }\n\n // Delete old entry if exists\n if (this.cache.has(key)) {\n this.delete(key)\n }\n\n this.cache.set(key, entry)\n this.currentSize += entrySize\n }\n\n /**\n * Delete item from memory cache\n */\n delete(key: string): boolean {\n const entry = this.cache.get(key)\n if (entry) {\n const entrySize = JSON.stringify(entry).length * 2\n this.currentSize -= entrySize\n return this.cache.delete(key)\n }\n return false\n }\n\n /**\n * Clear all items from memory cache\n */\n clear(): void {\n this.cache.clear()\n this.currentSize = 0\n }\n\n /**\n * Get cache statistics\n */\n getStats(): { size: number; count: number } {\n return {\n size: this.currentSize,\n count: this.cache.size\n }\n }\n\n /**\n * Evict least recently used items to make space\n */\n private evictLRU(neededSpace: number): void {\n // Sort by timestamp (oldest first)\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp\n )\n\n let freedSpace = 0\n for (const [key, entry] of entries) {\n if (freedSpace >= neededSpace) break\n\n const entrySize = JSON.stringify(entry).length * 2\n this.delete(key)\n freedSpace += entrySize\n }\n }\n\n /**\n * Delete items matching a pattern\n */\n invalidatePattern(pattern: string): number {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n let count = 0\n for (const key of this.cache.keys()) {\n if (regex.test(key)) {\n this.delete(key)\n count++\n }\n }\n\n return count\n }\n}\n\n/**\n * Cache result with source information\n */\nexport interface CacheResult {\n data: T | null\n source: 'memory' | 'kv' | 'miss'\n hit: boolean\n timestamp?: number\n ttl?: number\n}\n\n/**\n * Main cache service with multi-tier support\n */\nexport class CacheService {\n private memoryCache: MemoryCache\n private config: CacheConfig\n private stats: CacheStats\n private kvNamespace?: KVNamespace\n\n constructor(config: CacheConfig, kvNamespace?: KVNamespace) {\n this.memoryCache = new MemoryCache()\n this.config = config\n this.kvNamespace = kvNamespace\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Get value from cache (tries memory first, then KV)\n */\n async get(key: string): Promise {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n return memoryValue\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return kvValue as T\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return null\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise> {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n\n const entry = await this.getEntry(key)\n return {\n data: memoryValue,\n source: 'memory',\n hit: true,\n timestamp: entry?.timestamp,\n ttl: entry?.ttl\n }\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return {\n data: kvValue as T,\n source: 'kv',\n hit: true\n }\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return {\n data: null,\n source: 'miss',\n hit: false\n }\n }\n\n /**\n * Set value in cache (stores in both memory and KV)\n */\n async set(\n key: string,\n value: T,\n customConfig?: Partial\n ): Promise {\n const config = { ...this.config, ...customConfig }\n\n // Store in memory cache (Tier 1)\n if (config.memoryEnabled) {\n this.memoryCache.set(key, value, config.ttl, config.version)\n }\n\n // Store in KV cache (Tier 2)\n if (config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.put(key, JSON.stringify(value), {\n expirationTtl: config.ttl\n })\n } catch (error) {\n console.error('KV cache write error:', error)\n }\n }\n }\n\n /**\n * Delete value from cache (removes from both memory and KV)\n */\n async delete(key: string): Promise {\n // Delete from memory (Tier 1)\n if (this.config.memoryEnabled) {\n this.memoryCache.delete(key)\n }\n\n // Delete from KV (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.delete(key)\n } catch (error) {\n console.error('KV cache delete error:', error)\n }\n }\n }\n\n /**\n * Clear all cache entries for this namespace\n */\n async clear(): Promise {\n if (this.config.memoryEnabled) {\n this.memoryCache.clear()\n }\n\n // Reset stats\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Invalidate cache entries matching a pattern\n */\n async invalidate(pattern: string): Promise {\n let count = 0\n\n // Invalidate from memory (Tier 1)\n if (this.config.memoryEnabled) {\n count += this.memoryCache.invalidatePattern(pattern)\n }\n\n // Invalidate from KV (Tier 2)\n // Note: KV doesn't support pattern matching, so we need to list all keys\n // This is expensive and should be used sparingly\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n // List all keys with the namespace prefix\n const prefix = this.config.namespace + ':'\n const list = await this.kvNamespace.list({ prefix })\n\n for (const key of list.keys) {\n if (regex.test(key.name)) {\n await this.kvNamespace.delete(key.name)\n count++\n }\n }\n } catch (error) {\n console.error('KV cache invalidation error:', error)\n }\n }\n\n return count\n }\n\n /**\n * Invalidate cache entries matching a pattern (alias for invalidate)\n */\n async invalidatePattern(pattern: string): Promise {\n return this.invalidate(pattern)\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const memStats = this.memoryCache.getStats()\n\n return {\n ...this.stats,\n memorySize: memStats.size,\n entryCount: memStats.count\n }\n }\n\n /**\n * Update hit rate calculation\n */\n private updateHitRate(): void {\n const totalHits = this.stats.memoryHits + this.stats.kvHits + this.stats.dbHits\n this.stats.hitRate = this.stats.totalRequests > 0\n ? (totalHits / this.stats.totalRequests) * 100\n : 0\n }\n\n /**\n * Generate a cache key using the configured namespace\n */\n generateKey(type: string, identifier: string): string {\n return generateCacheKey(\n this.config.namespace,\n type,\n identifier,\n this.config.version\n )\n }\n\n /**\n * Warm cache with multiple entries\n */\n async warmCache(entries: Array<{ key: string; value: T }>): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value)\n }\n }\n\n /**\n * Check if a key exists in cache\n */\n async has(key: string): Promise {\n const value = await this.get(key)\n return value !== null\n }\n\n /**\n * Get multiple values at once\n */\n async getMany(keys: string[]): Promise> {\n const results = new Map()\n\n for (const key of keys) {\n const value = await this.get(key)\n if (value !== null) {\n results.set(key, value)\n }\n }\n\n return results\n }\n\n /**\n * Set multiple values at once\n */\n async setMany(\n entries: Array<{ key: string; value: T }>,\n customConfig?: Partial\n ): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value, customConfig)\n }\n }\n\n /**\n * Delete multiple keys at once\n */\n async deleteMany(keys: string[]): Promise {\n for (const key of keys) {\n await this.delete(key)\n }\n }\n\n /**\n * Get or set pattern - fetch from cache or compute if not found\n */\n async getOrSet(\n key: string,\n fetcher: () => Promise,\n customConfig?: Partial\n ): Promise {\n // Try to get from cache\n const cached = await this.get(key)\n if (cached !== null) {\n return cached\n }\n\n // Fetch from source\n const value = await fetcher()\n\n // Store in cache\n await this.set(key, value, customConfig)\n\n return value\n }\n\n /**\n * List all cache keys with metadata\n */\n async listKeys(): Promise> {\n const keys: Array<{ key: string; size: number; expiresAt: number; age: number }> = []\n\n // Get keys from memory cache\n if (this.config.memoryEnabled) {\n const cache = (this.memoryCache as any).cache as Map>\n for (const [key, entry] of cache.entries()) {\n const size = JSON.stringify(entry).length * 2\n const age = Date.now() - entry.timestamp\n keys.push({\n key,\n size,\n expiresAt: entry.expiresAt,\n age\n })\n }\n }\n\n // Sort by age (newest first)\n return keys.sort((a, b) => a.age - b.age)\n }\n\n /**\n * Get cache entry with full metadata\n */\n async getEntry(key: string): Promise<{\n data: T\n timestamp: number\n expiresAt: number\n ttl: number\n size: number\n } | null> {\n if (!this.config.memoryEnabled) {\n return null\n }\n\n const cache = (this.memoryCache as any).cache as Map>\n const entry = cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n await this.delete(key)\n return null\n }\n\n const size = JSON.stringify(entry).length * 2\n const ttl = Math.max(0, entry.expiresAt - Date.now()) / 1000\n\n return {\n data: entry.data as T,\n timestamp: entry.timestamp,\n expiresAt: entry.expiresAt,\n ttl,\n size\n }\n }\n}\n\n/**\n * Create a cache service instance with configuration\n */\nexport function createCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n return new CacheService(config, kvNamespace)\n}\n\n/**\n * Global cache instances by namespace (singleton pattern)\n */\nconst cacheInstances = new Map()\nlet globalKVNamespace: KVNamespace | undefined\n\n/**\n * Set global KV namespace for all cache instances\n */\nexport function setGlobalKVNamespace(kvNamespace: KVNamespace): void {\n globalKVNamespace = kvNamespace\n}\n\n/**\n * Get or create a cache service for a namespace\n */\nexport function getCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n const key = config.namespace\n\n if (!cacheInstances.has(key)) {\n // Use provided KV namespace or global one\n const kv = kvNamespace || globalKVNamespace\n cacheInstances.set(key, new CacheService(config, kv))\n }\n\n return cacheInstances.get(key)!\n}\n\n/**\n * Clear all cache instances\n */\nexport async function clearAllCaches(): Promise {\n for (const cache of cacheInstances.values()) {\n await cache.clear()\n }\n}\n\n/**\n * Get stats from all cache instances\n */\nexport function getAllCacheStats(): Record {\n const stats: Record = {}\n\n for (const [namespace, cache] of cacheInstances.entries()) {\n stats[namespace] = cache.getStats()\n }\n\n return stats\n}\n","/**\n * Event Bus for Cache Invalidation\n *\n * Provides a centralized event system for triggering cache invalidation\n * based on application events.\n */\n\nexport type EventHandler = (data?: any) => Promise | void\n\n// interface EventSubscription {\n// event: string\n// handler: EventHandler\n// }\n\nclass EventBus {\n private subscriptions: Map = new Map()\n private eventLog: Array<{ event: string; timestamp: number; data?: any }> = []\n private maxLogSize: number = 100\n\n /**\n * Subscribe to an event\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.subscriptions.has(event)) {\n this.subscriptions.set(event, [])\n }\n\n this.subscriptions.get(event)!.push(handler)\n\n // Return unsubscribe function\n return () => {\n const handlers = this.subscriptions.get(event)\n if (handlers) {\n const index = handlers.indexOf(handler)\n if (index > -1) {\n handlers.splice(index, 1)\n }\n }\n }\n }\n\n /**\n * Emit an event to all subscribers\n */\n async emit(event: string, data?: any): Promise {\n // Log the event\n this.logEvent(event, data)\n\n const handlers = this.subscriptions.get(event) || []\n\n // Execute all handlers\n await Promise.all(\n handlers.map(async (handler) => {\n try {\n await handler(data)\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error)\n }\n })\n )\n\n // Also emit to wildcard subscribers\n const wildcardHandlers = this.subscriptions.get('*') || []\n await Promise.all(\n wildcardHandlers.map(async (handler) => {\n try {\n await handler({ event, data })\n } catch (error) {\n console.error(`Error in wildcard event handler for ${event}:`, error)\n }\n })\n )\n }\n\n /**\n * Remove all subscribers for an event\n */\n off(event: string): void {\n this.subscriptions.delete(event)\n }\n\n /**\n * Get all registered events\n */\n getEvents(): string[] {\n return Array.from(this.subscriptions.keys())\n }\n\n /**\n * Get subscriber count for an event\n */\n getSubscriberCount(event: string): number {\n return this.subscriptions.get(event)?.length || 0\n }\n\n /**\n * Log an event for debugging\n */\n private logEvent(event: string, data?: any): void {\n this.eventLog.push({\n event,\n timestamp: Date.now(),\n data\n })\n\n // Keep log size manageable\n if (this.eventLog.length > this.maxLogSize) {\n this.eventLog.shift()\n }\n }\n\n /**\n * Get recent event log\n */\n getEventLog(limit: number = 50): Array<{ event: string; timestamp: number; data?: any }> {\n return this.eventLog.slice(-limit)\n }\n\n /**\n * Clear event log\n */\n clearEventLog(): void {\n this.eventLog = []\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n totalEvents: number\n totalSubscriptions: number\n eventCounts: Record\n } {\n const eventCounts: Record = {}\n\n for (const log of this.eventLog) {\n eventCounts[log.event] = (eventCounts[log.event] || 0) + 1\n }\n\n return {\n totalEvents: this.eventLog.length,\n totalSubscriptions: this.subscriptions.size,\n eventCounts\n }\n }\n}\n\n// Global event bus instance\nlet globalEventBus: EventBus | null = null\n\n/**\n * Get or create the global event bus\n */\nexport function getEventBus(): EventBus {\n if (!globalEventBus) {\n globalEventBus = new EventBus()\n }\n return globalEventBus\n}\n\n/**\n * Convenience function to emit an event\n */\nexport async function emitEvent(event: string, data?: any): Promise {\n const bus = getEventBus()\n await bus.emit(event, data)\n}\n\n/**\n * Convenience function to subscribe to an event\n */\nexport function onEvent(event: string, handler: EventHandler): () => void {\n const bus = getEventBus()\n return bus.on(event, handler)\n}\n","/**\n * Cache Invalidation Service\n *\n * Automatically invalidates cache entries based on application events\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\nimport { getEventBus, onEvent } from './event-bus.js'\n\n/**\n * Setup automatic cache invalidation based on events\n */\nexport function setupCacheInvalidation(): void {\n const _eventBus = getEventBus()\n\n // Content cache invalidation\n setupContentInvalidation()\n\n // User cache invalidation\n setupUserInvalidation()\n\n // Config cache invalidation\n setupConfigInvalidation()\n\n // Media cache invalidation\n setupMediaInvalidation()\n\n // API cache invalidation\n setupAPIInvalidation()\n\n // Collection cache invalidation\n setupCollectionInvalidation()\n\n console.log('Cache invalidation listeners registered')\n}\n\n/**\n * Content cache invalidation\n */\nfunction setupContentInvalidation(): void {\n const config = CACHE_CONFIGS.content\n if (!config) return\n const contentCache = getCacheService(config)\n\n // Invalidate on content updates\n onEvent('content.create', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.create')\n })\n\n onEvent('content.update', async (data) => {\n if (data?.id) {\n // Invalidate specific content item\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n // Invalidate all content lists\n await contentCache.invalidate('content:list:*')\n console.log('Cache invalidated: content.update', data?.id)\n })\n\n onEvent('content.delete', async (data) => {\n if (data?.id) {\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.delete', data?.id)\n })\n\n onEvent('content.publish', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.publish')\n })\n}\n\n/**\n * User cache invalidation\n */\nfunction setupUserInvalidation(): void {\n const config = CACHE_CONFIGS.user\n if (!config) return\n const userCache = getCacheService(config)\n\n onEvent('user.update', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.update', data?.id)\n })\n\n onEvent('user.delete', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.delete', data?.id)\n })\n\n onEvent('auth.login', async (data) => {\n if (data?.userId) {\n await userCache.delete(userCache.generateKey('id', data.userId))\n }\n console.log('Cache invalidated: auth.login', data?.userId)\n })\n\n onEvent('auth.logout', async (data) => {\n // Clear session cache\n const sessionConfig = CACHE_CONFIGS.session\n if (sessionConfig) {\n const sessionCache = getCacheService(sessionConfig)\n if (data?.sessionId) {\n await sessionCache.delete(sessionCache.generateKey('session', data.sessionId))\n }\n }\n console.log('Cache invalidated: auth.logout')\n })\n}\n\n/**\n * Config cache invalidation\n */\nfunction setupConfigInvalidation(): void {\n const configConfig = CACHE_CONFIGS.config\n if (!configConfig) return\n const configCache = getCacheService(configConfig)\n\n onEvent('config.update', async (_data) => {\n await configCache.invalidate('config:*')\n console.log('Cache invalidated: config.update')\n })\n\n onEvent('plugin.activate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.activate', data?.pluginId)\n })\n\n onEvent('plugin.deactivate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.deactivate', data?.pluginId)\n })\n\n onEvent('plugin.update', async (data) => {\n const pluginConfig = CACHE_CONFIGS.plugin\n if (!pluginConfig) return\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n console.log('Cache invalidated: plugin.update', data?.pluginId)\n })\n}\n\n/**\n * Media cache invalidation\n */\nfunction setupMediaInvalidation(): void {\n const config = CACHE_CONFIGS.media\n if (!config) return\n const mediaCache = getCacheService(config)\n\n onEvent('media.upload', async (_data) => {\n await mediaCache.invalidate('media:*')\n console.log('Cache invalidated: media.upload')\n })\n\n onEvent('media.delete', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.delete', data?.id)\n })\n\n onEvent('media.update', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.update', data?.id)\n })\n}\n\n/**\n * API cache invalidation (depends on content changes)\n */\nfunction setupAPIInvalidation(): void {\n const config = CACHE_CONFIGS.api\n if (!config) return\n const apiCache = getCacheService(config)\n\n onEvent('content.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.update)')\n })\n\n onEvent('content.publish', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.publish)')\n })\n\n onEvent('content.create', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.create)')\n })\n\n onEvent('content.delete', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.delete)')\n })\n\n onEvent('collection.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (collection.update)')\n })\n}\n\n/**\n * Collection cache invalidation\n */\nfunction setupCollectionInvalidation(): void {\n const config = CACHE_CONFIGS.collection\n if (!config) return\n const collectionCache = getCacheService(config)\n\n onEvent('collection.create', async (_data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.create')\n })\n\n onEvent('collection.update', async (data) => {\n if (data?.id) {\n await collectionCache.delete(collectionCache.generateKey('item', data.id))\n }\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.update', data?.id)\n })\n\n onEvent('collection.delete', async (data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.delete', data?.id)\n })\n}\n\n/**\n * Get invalidation statistics\n */\nexport function getCacheInvalidationStats() {\n const eventBus = getEventBus()\n return eventBus.getStats()\n}\n\n/**\n * Get recent invalidation events\n */\nexport function getRecentInvalidations(limit: number = 50) {\n const eventBus = getEventBus()\n return eventBus.getEventLog(limit)\n}\n","/**\n * Cache Warming Utilities\n *\n * Utilities for preloading and warming cache entries\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\n\n/**\n * Warm cache with common queries\n */\nexport async function warmCommonCaches(db: D1Database): Promise<{\n warmed: number\n errors: number\n details: Array<{ namespace: string; count: number }>\n}> {\n let totalWarmed = 0\n let totalErrors = 0\n const details: Array<{ namespace: string; count: number }> = []\n\n try {\n // Warm collection cache\n const collectionCount = await warmCollections(db)\n totalWarmed += collectionCount\n details.push({ namespace: 'collection', count: collectionCount })\n\n // Warm content cache (most recent items)\n const contentCount = await warmRecentContent(db)\n totalWarmed += contentCount\n details.push({ namespace: 'content', count: contentCount })\n\n // Warm media cache (most recent items)\n const mediaCount = await warmRecentMedia(db)\n totalWarmed += mediaCount\n details.push({ namespace: 'media', count: mediaCount })\n\n } catch (error) {\n console.error('Error warming caches:', error)\n totalErrors++\n }\n\n return {\n warmed: totalWarmed,\n errors: totalErrors,\n details\n }\n}\n\n/**\n * Warm collections cache\n */\nasync function warmCollections(db: D1Database): Promise {\n const config = CACHE_CONFIGS.collection\n if (!config) return 0\n const collectionCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare('SELECT * FROM collections WHERE is_active = 1')\n const { results } = await stmt.all()\n\n for (const collection of results as any[]) {\n const key = collectionCache.generateKey('item', collection.id)\n await collectionCache.set(key, collection)\n count++\n }\n\n // Also cache the full list\n const listKey = collectionCache.generateKey('list', 'all')\n await collectionCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming collections cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent content cache\n */\nasync function warmRecentContent(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.content\n if (!config) return 0\n const contentCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM content ORDER BY created_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const content of results as any[]) {\n const key = contentCache.generateKey('item', content.id)\n await contentCache.set(key, content)\n count++\n }\n\n // Cache the list\n const listKey = contentCache.generateKey('list', 'recent')\n await contentCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming content cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent media cache\n */\nasync function warmRecentMedia(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.media\n if (!config) return 0\n const mediaCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const media of results as any[]) {\n const key = mediaCache.generateKey('item', media.id)\n await mediaCache.set(key, media)\n count++\n }\n\n // Cache the list\n const listKey = mediaCache.generateKey('list', 'recent')\n await mediaCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming media cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm specific namespace with custom data\n */\nexport async function warmNamespace(\n namespace: string,\n entries: Array<{ key: string; value: any }>\n): Promise {\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n throw new Error(`Unknown namespace: ${namespace}`)\n }\n\n const cache = getCacheService(config)\n await cache.setMany(entries)\n\n return entries.length\n}\n\n/**\n * Preload cache on application startup\n */\nexport async function preloadCache(db: D1Database): Promise {\n console.log('🔥 Preloading cache...')\n\n const result = await warmCommonCaches(db)\n\n console.log(`✅ Cache preloaded: ${result.warmed} entries across ${result.details.length} namespaces`)\n result.details.forEach(detail => {\n console.log(` - ${detail.namespace}: ${detail.count} entries`)\n })\n\n if (result.errors > 0) {\n console.warn(`⚠️ ${result.errors} errors during cache preloading`)\n }\n}\n\n/**\n * Schedule periodic cache warming\n */\nexport function schedulePeriodicWarming(\n db: D1Database,\n intervalMs: number = 300000 // 5 minutes default\n): NodeJS.Timeout {\n console.log(`⏰ Scheduling periodic cache warming every ${intervalMs / 1000}s`)\n\n return setInterval(async () => {\n try {\n console.log('🔄 Running periodic cache warming...')\n await warmCommonCaches(db)\n } catch (error) {\n console.error('Error during periodic cache warming:', error)\n }\n }, intervalMs)\n}\n","/**\n * Admin Cache Dashboard Template\n *\n * Moved from @sonicjs-cms/templates to avoid circular dependency\n * during build (templates imports from core, core can't import from templates)\n */\n\nimport { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\nexport interface CacheDashboardData {\n stats: Record\n totals: {\n hits: number\n misses: number\n requests: number\n hitRate: string\n memorySize: number\n entryCount: number\n }\n namespaces: string[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCacheDashboard(data: CacheDashboardData): string {\n const pageContent = `\n
\n \n
\n
\n

Cache System

\n

\n Monitor and manage cache performance across all namespaces\n

\n
\n
\n \n \n \n \n Refresh\n \n \n \n \n \n Clear All\n \n
\n
\n\n \n
\n ${renderStatCard('Total Requests', data.totals.requests.toLocaleString(), 'lime', `\n \n \n \n `)}\n\n ${renderStatCard('Hit Rate', data.totals.hitRate + '%', 'blue', `\n \n \n \n `, parseFloat(data.totals.hitRate) > 70 ? 'lime' : parseFloat(data.totals.hitRate) > 40 ? 'amber' : 'red')}\n\n ${renderStatCard('Memory Usage', formatBytes(data.totals.memorySize), 'purple', `\n \n \n \n `)}\n\n ${renderStatCard('Cached Entries', data.totals.entryCount.toLocaleString(), 'sky', `\n \n \n \n `)}\n
\n\n \n
\n
\n

Cache Namespaces

\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ${data.namespaces.map(namespace => {\n const stat = data.stats[namespace]\n if (!stat) return ''\n return renderNamespaceRow(namespace, stat)\n }).join('')}\n \n
\n Namespace\n \n Requests\n \n Hit Rate\n \n Memory Hits\n \n KV Hits\n \n Entries\n \n Size\n \n Actions\n
\n
\n
\n\n \n
\n
\n

Performance Overview

\n
\n
\n
\n ${renderPerformanceMetric('Memory Cache', data.totals.hits, data.totals.misses)}\n ${renderHealthStatus(parseFloat(data.totals.hitRate))}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'clear-all-cache-confirm',\n title: 'Clear All Cache',\n message: 'Are you sure you want to clear all cache entries? This cannot be undone.',\n confirmText: 'Clear All',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearAllCaches()'\n })}\n\n ${renderConfirmationDialog({\n id: 'clear-namespace-cache-confirm',\n title: 'Clear Namespace Cache',\n message: 'Clear cache for this namespace?',\n confirmText: 'Clear',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearNamespaceCache()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Cache System',\n pageTitle: 'Cache System',\n currentPath: '/admin/cache',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderStatCard(label: string, value: string, color: string, icon: string, colorOverride?: string): string {\n const finalColor = colorOverride || color\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n blue: 'bg-blue-50 dark:bg-blue-500/10 text-blue-600 dark:text-blue-400 ring-blue-600/20 dark:ring-blue-500/20',\n purple: 'bg-purple-50 dark:bg-purple-500/10 text-purple-600 dark:text-purple-400 ring-purple-600/20 dark:ring-purple-500/20',\n sky: 'bg-sky-50 dark:bg-sky-500/10 text-sky-600 dark:text-sky-400 ring-sky-600/20 dark:ring-sky-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n
\n
\n
\n
\n ${icon}\n
\n
\n

${label}

\n

${value}

\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderNamespaceRow(namespace: string, stat: CacheStats): string {\n const hitRate = stat.hitRate.toFixed(1)\n const hitRateColor = stat.hitRate > 70 ? 'text-lime-600 dark:text-lime-400' :\n stat.hitRate > 40 ? 'text-amber-600 dark:text-amber-400' :\n 'text-red-600 dark:text-red-400'\n\n return `\n \n \n \n ${namespace}\n \n \n \n ${stat.totalRequests.toLocaleString()}\n \n \n \n ${hitRate}%\n \n \n \n ${stat.memoryHits.toLocaleString()}\n \n \n ${stat.kvHits.toLocaleString()}\n \n \n ${stat.entryCount.toLocaleString()}\n \n \n ${formatBytes(stat.memorySize)}\n \n \n \n Clear\n \n \n \n `\n}\n\nfunction renderPerformanceMetric(label: string, hits: number, misses: number): string {\n const total = hits + misses\n const hitPercentage = total > 0 ? (hits / total) * 100 : 0\n\n return `\n
\n

${label}

\n
\n
\n Hits\n ${hits.toLocaleString()}\n
\n
\n Misses\n ${misses.toLocaleString()}\n
\n
\n
\n Hit Rate\n ${hitPercentage.toFixed(1)}%\n
\n
\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderHealthStatus(hitRate: number): string {\n const status = hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'critical'\n const statusConfig = {\n healthy: {\n label: 'Healthy',\n color: 'lime',\n icon: `\n \n `\n },\n warning: {\n label: 'Needs Attention',\n color: 'amber',\n icon: `\n \n `\n },\n critical: {\n label: 'Critical',\n color: 'red',\n icon: `\n \n `\n }\n }\n\n const config = statusConfig[status]\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n

System Health

\n
\n ${config.icon}\n
\n

${config.label}

\n

\n ${status === 'healthy' ? 'Cache is performing well' :\n status === 'warning' ? 'Consider increasing cache TTL or capacity' :\n 'Cache hit rate is too low'}\n

\n
\n
\n
\n `\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`\n}\n","/**\n * Cache Plugin Routes\n *\n * Admin routes for cache management\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport { getAllCacheStats, clearAllCaches, getCacheService } from './services/cache.js'\nimport { CACHE_CONFIGS, parseCacheKey } from './services/cache-config.js'\nimport { getRecentInvalidations, getCacheInvalidationStats } from './services/cache-invalidation.js'\nimport { warmCommonCaches, warmNamespace } from './services/cache-warming.js'\nimport { renderCacheDashboard, CacheDashboardData } from '../../templates/pages/admin-cache.template'\n\nconst app = new Hono()\n\n/**\n * GET /admin/cache\n * Cache statistics dashboard\n */\napp.get('/', async (c: Context) => {\n const stats = getAllCacheStats()\n const user = c.get('user')\n\n // Calculate totals\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n Object.values(stats).forEach(stat => {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n })\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n const dashboardData: CacheDashboardData = {\n stats,\n totals: {\n hits: totalHits,\n misses: totalMisses,\n requests: totalRequests,\n hitRate: overallHitRate.toFixed(2),\n memorySize: totalSize,\n entryCount: totalEntries\n },\n namespaces: Object.keys(stats),\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCacheDashboard(dashboardData))\n})\n\n/**\n * GET /admin/cache/stats\n * Detailed statistics for all namespaces\n */\napp.get('/stats', async (c: Context) => {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/stats/:namespace\n * Statistics for a specific namespace\n */\napp.get('/stats/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const stats = cache.getStats()\n\n return c.json({\n success: true,\n data: {\n namespace,\n config,\n stats\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear\n * Clear all cache entries\n */\napp.post('/clear', async (c: Context) => {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear/:namespace\n * Clear cache for a specific namespace\n */\napp.post('/clear/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n await cache.clear()\n\n return c.json({\n success: true,\n message: `Cache cleared for namespace: ${namespace}`,\n namespace,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/invalidate\n * Invalidate cache entries matching a pattern\n */\napp.post('/invalidate', async (c: Context) => {\n const body = await c.req.json()\n const { pattern, namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (namespace) {\n // Invalidate from specific namespace\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: namespace || 'all',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/health\n * Cache system health check\n */\napp.get('/health', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // Calculate health metrics\n const namespaces = Object.entries(stats)\n const healthChecks = namespaces.map(([name, stat]) => {\n const hitRate = stat.hitRate\n const memoryUsage = stat.memorySize / (50 * 1024 * 1024) // Assume 50MB max\n\n return {\n namespace: name,\n status: hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'unhealthy',\n hitRate,\n memoryUsage: (memoryUsage * 100).toFixed(2) + '%',\n entryCount: stat.entryCount\n }\n })\n\n const overallStatus = healthChecks.every(h => h.status === 'healthy')\n ? 'healthy'\n : healthChecks.some(h => h.status === 'unhealthy')\n ? 'unhealthy'\n : 'warning'\n\n return c.json({\n success: true,\n data: {\n status: overallStatus,\n namespaces: healthChecks,\n timestamp: new Date().toISOString()\n }\n })\n})\n\n/**\n * GET /admin/cache/browser\n * Browse all cache entries across namespaces\n */\napp.get('/browser', async (c: Context) => {\n const namespace = c.req.query('namespace') || 'all'\n const search = c.req.query('search') || ''\n const sortBy = c.req.query('sort') || 'age' // age, size, key\n const limit = parseInt(c.req.query('limit') || '100')\n\n const entries: Array<{\n namespace: string\n key: string\n size: number\n age: number\n ttl: number\n expiresAt: number\n parsed: any\n }> = []\n\n const namespaces = namespace === 'all'\n ? Object.keys(CACHE_CONFIGS)\n : [namespace]\n\n for (const ns of namespaces) {\n const config = CACHE_CONFIGS[ns]\n if (!config) continue\n\n const cache = getCacheService(config)\n const keys = await cache.listKeys()\n\n for (const keyInfo of keys) {\n // Apply search filter\n if (search && !keyInfo.key.toLowerCase().includes(search.toLowerCase())) {\n continue\n }\n\n const parsed = parseCacheKey(keyInfo.key)\n const ttl = Math.max(0, keyInfo.expiresAt - Date.now()) / 1000\n\n entries.push({\n namespace: ns,\n key: keyInfo.key,\n size: keyInfo.size,\n age: keyInfo.age,\n ttl,\n expiresAt: keyInfo.expiresAt,\n parsed\n })\n }\n }\n\n // Sort entries\n if (sortBy === 'size') {\n entries.sort((a, b) => b.size - a.size)\n } else if (sortBy === 'age') {\n entries.sort((a, b) => a.age - b.age)\n } else if (sortBy === 'key') {\n entries.sort((a, b) => a.key.localeCompare(b.key))\n }\n\n // Limit results\n const limitedEntries = entries.slice(0, limit)\n\n return c.json({\n success: true,\n data: {\n entries: limitedEntries,\n total: entries.length,\n showing: limitedEntries.length,\n namespace,\n search,\n sortBy\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/browser/:namespace/:key\n * Get detailed information about a specific cache entry\n */\napp.get('/browser/:namespace/:key', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const key = decodeURIComponent(c.req.param('key')!)\n\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const entry = await cache.getEntry(key)\n\n if (!entry) {\n return c.json({\n success: false,\n error: 'Cache entry not found or expired'\n }, 404)\n }\n\n const parsed = parseCacheKey(key)\n\n return c.json({\n success: true,\n data: {\n key,\n namespace,\n parsed,\n ...entry,\n createdAt: new Date(entry.timestamp).toISOString(),\n expiresAt: new Date(entry.expiresAt).toISOString()\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics\n * Advanced cache analytics\n */\napp.get('/analytics', async (c: Context) => {\n const stats = getAllCacheStats()\n const invalidationStats = getCacheInvalidationStats()\n const recentInvalidations = getRecentInvalidations(20)\n\n // Calculate analytics\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n const namespacesAnalytics = []\n\n for (const [namespace, stat] of Object.entries(stats)) {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n\n const totalRequests = stat.memoryHits + stat.kvHits + stat.memoryMisses + stat.kvMisses\n const hitRate = totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / totalRequests) * 100 : 0\n const avgEntrySize = stat.entryCount > 0 ? stat.memorySize / stat.entryCount : 0\n\n namespacesAnalytics.push({\n namespace,\n hitRate: hitRate.toFixed(2),\n totalRequests,\n memoryHitRate: totalRequests > 0 ? ((stat.memoryHits / totalRequests) * 100).toFixed(2) : '0',\n kvHitRate: totalRequests > 0 ? ((stat.kvHits / totalRequests) * 100).toFixed(2) : '0',\n avgEntrySize: Math.round(avgEntrySize),\n totalSize: stat.memorySize,\n entryCount: stat.entryCount,\n efficiency: totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / (stat.memoryHits + stat.kvHits + stat.dbHits + 1)).toFixed(2) : '0'\n })\n }\n\n // Sort by hit rate\n namespacesAnalytics.sort((a, b) => parseFloat(b.hitRate) - parseFloat(a.hitRate))\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n // Calculate cost savings (assume 50ms per DB query vs 2ms for cache)\n const dbQueriesAvoided = totalHits\n const timeSaved = dbQueriesAvoided * 48 // 48ms saved per cache hit\n const estimatedCostSavings = (dbQueriesAvoided / 1000000) * 0.50 // $0.50 per million queries\n\n return c.json({\n success: true,\n data: {\n overview: {\n totalHits,\n totalMisses,\n totalRequests,\n overallHitRate: overallHitRate.toFixed(2),\n totalSize,\n totalEntries,\n avgEntrySize: totalEntries > 0 ? Math.round(totalSize / totalEntries) : 0\n },\n performance: {\n dbQueriesAvoided,\n timeSavedMs: timeSaved,\n timeSavedMinutes: (timeSaved / 1000 / 60).toFixed(2),\n estimatedCostSavings: estimatedCostSavings.toFixed(4)\n },\n namespaces: namespacesAnalytics,\n invalidation: {\n ...invalidationStats,\n recent: recentInvalidations\n }\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/trends\n * Cache trends over time (simplified - would need historical data storage)\n */\napp.get('/analytics/trends', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // For now, return current snapshot as a data point\n // In production, this would query historical data\n const dataPoint = {\n timestamp: Date.now(),\n stats: Object.entries(stats).map(([namespace, stat]) => ({\n namespace,\n hitRate: stat.hitRate,\n entryCount: stat.entryCount,\n memorySize: stat.memorySize,\n totalRequests: stat.totalRequests\n }))\n }\n\n return c.json({\n success: true,\n data: {\n trends: [dataPoint],\n note: 'Historical trends require persistent storage. This returns current snapshot only.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/top-keys\n * Most accessed cache keys (would need hit tracking)\n */\napp.get('/analytics/top-keys', async (c: Context) => {\n const _namespace = c.req.query('namespace') || 'all'\n const _limit = parseInt(c.req.query('limit') || '10')\n\n // This is a placeholder - would need per-key hit tracking\n return c.json({\n success: true,\n data: {\n topKeys: [],\n note: 'Top keys tracking requires per-key hit counting. Feature not yet implemented.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/warm\n * Warm cache with common queries\n */\napp.post('/warm', async (c: Context) => {\n try {\n const db = c.env.DB as D1Database\n const result = await warmCommonCaches(db)\n\n return c.json({\n success: true,\n message: 'Cache warming completed',\n ...result,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Cache warming error:', error)\n return c.json({\n success: false,\n error: 'Cache warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * POST /admin/cache/warm/:namespace\n * Warm specific namespace cache\n */\napp.post('/warm/:namespace', async (c: Context) => {\n try {\n const namespace = c.req.param('namespace')!\n const body = await c.req.json()\n const { entries } = body\n\n if (!entries || !Array.isArray(entries)) {\n return c.json({\n success: false,\n error: 'Entries array is required'\n }, 400)\n }\n\n const count = await warmNamespace(namespace, entries)\n\n return c.json({\n success: true,\n message: `Warmed ${count} entries in namespace: ${namespace}`,\n namespace,\n count,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Namespace warming error:', error)\n return c.json({\n success: false,\n error: 'Namespace warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Cache Plugin\n *\n * Three-tiered caching system for SonicJS\n * - Tier 1: In-Memory (fastest, region-specific)\n * - Tier 2: Cloudflare KV (fast, global)\n * - Tier 3: Database (source of truth)\n */\n\nimport type { Context } from 'hono'\nimport type { PluginContext } from '@sonicjs-cms/core'\nimport { getCacheService, clearAllCaches, getAllCacheStats } from './services/cache.js'\nimport { CACHE_CONFIGS } from './services/cache-config.js'\nimport { setupCacheInvalidation } from './services/cache-invalidation.js'\nimport cacheRoutes from './routes.js'\n\nexport class CachePlugin {\n private _context: PluginContext | null = null\n\n /**\n * Get plugin routes\n */\n getRoutes() {\n return cacheRoutes\n }\n\n /**\n * Activate the cache plugin\n */\n async activate(context: PluginContext): Promise {\n this._context = context\n\n const settings = context.config || {}\n\n console.log('✅ Cache plugin activated', {\n memoryEnabled: settings.memoryEnabled ?? true,\n kvEnabled: settings.kvEnabled ?? false,\n defaultTTL: settings.defaultTTL ?? 3600\n })\n\n // Initialize default cache services\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n\n // Setup event-based cache invalidation\n setupCacheInvalidation()\n }\n\n /**\n * Deactivate the cache plugin\n */\n async deactivate(): Promise {\n console.log('❌ Cache plugin deactivated - clearing all caches')\n await clearAllCaches()\n this._context = null\n }\n\n /**\n * Configure the cache plugin\n */\n async configure(settings: Record): Promise {\n console.log('⚙️ Cache plugin configured', settings)\n\n // Reconfigure all cache instances with new settings\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n }\n\n /**\n * Get cache statistics\n */\n async getStats(c: Context): Promise {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Clear all cache entries\n */\n async clearCache(c: Context): Promise {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Invalidate cache entries matching pattern\n */\n async invalidatePattern(c: Context): Promise {\n const body = await c.req.json()\n const { pattern, namespace: _namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (_namespace) {\n // Invalidate from specific namespace\n const cache = getCacheService(CACHE_CONFIGS[_namespace] || {\n ttl: 3600,\n kvEnabled: false,\n memoryEnabled: true,\n namespace: _namespace,\n invalidateOn: [],\n version: 'v1'\n })\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: _namespace || 'all',\n timestamp: new Date().toISOString()\n })\n }\n}\n\n// Export cache services for use by other plugins/routes when cache plugin is active\nexport {\n getCacheService,\n clearAllCaches,\n getAllCacheStats,\n setGlobalKVNamespace\n} from './services/cache'\nexport { CACHE_CONFIGS, getCacheConfig, generateCacheKey } from './services/cache-config'\nexport type { CacheConfig, CacheStats } from './services/cache-config'\nexport { emitEvent, onEvent, getEventBus } from './services/event-bus'\nexport { getCacheInvalidationStats, getRecentInvalidations } from './services/cache-invalidation'\nexport { warmCommonCaches, warmNamespace, preloadCache } from './services/cache-warming'\n\n// Create and export plugin instance\nconst plugin = new CachePlugin()\nexport default plugin\n","/**\n * SonicJS Favicon SVG\n *\n * Embedded SVG favicon for the admin interface and auth pages.\n * This ensures the favicon is always available without external dependencies.\n */\n\nexport const faviconSvg = `\n\n\n\t\n\t\t\n\t\t\n\t\n\n`;\n","/**\n * Main Application Factory\n *\n * Creates a configured SonicJS application with all core functionality\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport {\n apiRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n testCleanupRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminPluginRoutes,\n adminLogsRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n adminFormsRoutes,\n publicFormsRoutes,\n adminApiReferenceRoutes\n} from './routes'\nimport { getCoreVersion } from './utils/version'\nimport { bootstrapMiddleware } from './middleware/bootstrap'\nimport { metricsMiddleware } from './middleware/metrics'\nimport { csrfProtection } from './middleware/csrf'\nimport { securityHeadersMiddleware } from './middleware/security-headers'\nimport { createDatabaseToolsAdminRoutes } from './plugins/core-plugins/database-tools-plugin/admin-routes'\nimport { createSeedDataAdminRoutes } from './plugins/core-plugins/seed-data-plugin/admin-routes'\nimport { emailPlugin } from './plugins/core-plugins/email-plugin'\nimport { otpLoginPlugin } from './plugins/core-plugins/otp-login-plugin'\nimport { oauthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nimport { userProfilesPlugin } from './plugins/core-plugins/user-profiles'\nimport { aiSearchPlugin } from './plugins/core-plugins/ai-search-plugin'\nimport { createMagicLinkAuthPlugin } from './plugins/available/magic-link-auth'\nimport { securityAuditPlugin } from './plugins/core-plugins/security-audit-plugin'\nimport { securityAuditMiddleware } from './plugins/core-plugins/security-audit-plugin'\nimport { stripePlugin } from './plugins/core-plugins/stripe-plugin'\nimport { requireAuth, requireRole } from './middleware/auth'\nimport { pluginMenuMiddleware } from './middleware/plugin-menu'\nimport { analyticsPlugin } from './plugins/core-plugins/analytics'\nimport { eventsApiRoutes } from './plugins/core-plugins/analytics/routes/api'\nimport cachePlugin from './plugins/cache'\nimport { faviconSvg } from './assets/favicon'\nimport { setAppInstance } from './services/route-metadata'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface Bindings {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n CORS_ORIGINS?: string\n JWT_SECRET?: string\n JWT_EXPIRES_IN?: string\n JWT_REFRESH_GRACE_SECONDS?: string\n BUCKET_NAME?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\nexport interface Variables {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n csrfToken?: string\n pluginMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport interface SonicJSConfig {\n // Collections configuration\n collections?: {\n directory?: string\n autoSync?: boolean\n }\n\n // Plugins configuration\n plugins?: {\n directory?: string\n autoLoad?: boolean\n disableAll?: boolean // Disable all plugins including core plugins\n }\n\n // Custom routes\n routes?: Array<{\n path: string\n handler: Hono\n }>\n\n // Custom middleware\n middleware?: {\n beforeAuth?: Array<(c: Context, next: () => Promise) => Promise>\n afterAuth?: Array<(c: Context, next: () => Promise) => Promise>\n }\n\n // Admin access control\n // Roles allowed to access the /admin panel. Defaults to ['admin'].\n adminAccessRoles?: string[]\n\n // App metadata\n version?: string\n name?: string\n}\n\nexport type SonicJSApp = Hono<{ Bindings: Bindings; Variables: Variables }>\n\n// ============================================================================\n// Application Factory\n// ============================================================================\n\n/**\n * Create a SonicJS application with core functionality\n *\n * @param config - Application configuration\n * @returns Configured Hono application\n *\n * @example\n * ```typescript\n * import { createSonicJSApp } from '@sonicjs-cms/core'\n *\n * const app = createSonicJSApp({\n * collections: {\n * directory: './src/collections',\n * autoSync: true\n * },\n * plugins: {\n * directory: './src/plugins',\n * autoLoad: true\n * }\n * })\n *\n * export default app\n * ```\n */\nexport function createSonicJSApp(config: SonicJSConfig = {}): SonicJSApp {\n const app = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Set app metadata\n const appVersion = config.version || getCoreVersion()\n const appName = config.name || 'SonicJS AI'\n\n // App version middleware\n app.use('*', async (c, next) => {\n c.set('appVersion', appVersion)\n await next()\n })\n\n // Metrics middleware - track all requests for real-time analytics\n app.use('*', metricsMiddleware())\n\n // Bootstrap middleware - runs migrations, syncs collections, and initializes plugins\n app.use('*', bootstrapMiddleware(config))\n\n // Custom middleware - before auth\n if (config.middleware?.beforeAuth) {\n for (const middleware of config.middleware.beforeAuth) {\n app.use('*', middleware)\n }\n }\n\n // Logging middleware\n app.use('*', async (_c, next) => {\n // Logging logic here\n await next()\n })\n\n // Security middleware\n app.use('*', securityHeadersMiddleware())\n\n // CSRF protection middleware\n app.use('*', csrfProtection())\n\n // Custom middleware - after auth\n if (config.middleware?.afterAuth) {\n for (const middleware of config.middleware.afterAuth) {\n app.use('*', middleware)\n }\n }\n\n // Admin panel access control: require authentication and admin role by default\n const adminRoles = config.adminAccessRoles || ['admin']\n app.use('/admin/*', requireAuth())\n app.use('/admin/*', requireRole(adminRoles))\n\n // Plugin dynamic menu items for admin sidebar\n app.use('/admin/*', pluginMenuMiddleware())\n\n // Core routes\n // Routes are being imported incrementally from routes/*\n // Each route is tested and migrated one-by-one\n app.route('/api', apiRoutes)\n app.route('/api/media', apiMediaRoutes)\n app.route('/api/system', apiSystemRoutes)\n app.route('/admin/api', adminApiRoutes)\n app.route('/admin/dashboard', adminDashboardRoutes)\n app.route('/admin/collections', adminCollectionsRoutes)\n app.route('/admin/forms', adminFormsRoutes)\n app.route('/admin/settings', adminSettingsRoutes)\n app.route('/forms', publicFormsRoutes)\n app.route('/api/forms', publicFormsRoutes) // API endpoint for form submissions\n app.route('/admin/api-reference', adminApiReferenceRoutes)\n app.route('/admin/database-tools', createDatabaseToolsAdminRoutes())\n app.route('/admin/seed-data', createSeedDataAdminRoutes())\n app.route('/admin/content', adminContentRoutes)\n app.route('/admin/media', adminMediaRoutes)\n // Security audit middleware - logs auth events (login, register, logout)\n app.use('/auth/*', securityAuditMiddleware())\n\n // Plugin routes - Security Audit (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (securityAuditPlugin.routes && securityAuditPlugin.routes.length > 0) {\n for (const route of securityAuditPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - AI Search (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register AI Search routes first so they take precedence over the generic /:id handler\n if (aiSearchPlugin.routes && aiSearchPlugin.routes.length > 0) {\n for (const route of aiSearchPlugin.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Plugin routes - Cache (dashboard and management API)\n // Fixes GitHub Issue #461: Cache routes were not registered\n app.route('/admin/cache', cachePlugin.getRoutes())\n\n // Plugin routes - OAuth Providers (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (oauthProvidersPlugin.routes && oauthProvidersPlugin.routes.length > 0) {\n for (const route of oauthProvidersPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - User Profiles\n if (userProfilesPlugin.routes && userProfilesPlugin.routes.length > 0) {\n for (const route of userProfilesPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - OTP Login (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register OTP Login routes first so they take precedence over the generic /:id handler\n if (otpLoginPlugin.routes && otpLoginPlugin.routes.length > 0) {\n for (const route of otpLoginPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Analytics (must be before /admin/plugins catch-all)\n if (analyticsPlugin.routes && analyticsPlugin.routes.length > 0) {\n for (const route of analyticsPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Public event tracking API — POST /api/events (open), GET /api/events (admin)\n app.route('/api/events', eventsApiRoutes)\n\n // Plugin routes - Stripe (must be before /admin/plugins catch-all)\n if (stripePlugin.routes && stripePlugin.routes.length > 0) {\n for (const route of stripePlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n app.route('/admin/plugins', adminPluginRoutes)\n app.route('/admin/logs', adminLogsRoutes)\n app.route('/admin', adminUsersRoutes)\n app.route('/auth', authRoutes)\n\n // Test cleanup routes (only for development/test environments)\n app.route('/', testCleanupRoutes)\n\n // Plugin routes - Email\n if (emailPlugin.routes && emailPlugin.routes.length > 0) {\n for (const route of emailPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Magic Link Auth (passwordless authentication via email links)\n const magicLinkPlugin = createMagicLinkAuthPlugin()\n if (magicLinkPlugin.routes && magicLinkPlugin.routes.length > 0) {\n for (const route of magicLinkPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Serve favicon\n app.get('/favicon.svg', (c) => {\n return new Response(faviconSvg, {\n headers: {\n 'Content-Type': 'image/svg+xml',\n 'Cache-Control': 'public, max-age=31536000'\n }\n })\n })\n\n // Serve files from R2 storage (public file access)\n app.get('/files/*', async (c) => {\n try {\n // Extract the path from the URL pathname (everything after /files/)\n const url = new URL(c.req.url)\n const pathname = url.pathname\n\n // Remove the /files/ prefix to get the R2 object key\n const objectKey = pathname.replace(/^\\/files\\//, '')\n\n if (!objectKey) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(objectKey)\n\n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n headers.set('Access-Control-Allow-Origin', '*') // Allow CORS for media files\n headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n headers.set('Access-Control-Allow-Headers', 'Content-Type')\n\n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n })\n\n // Custom routes - User-defined routes\n if (config.routes) {\n for (const route of config.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Root redirect to login\n app.get('/', (c) => {\n return c.redirect('/auth/login')\n })\n\n // Health check\n app.get('/health', (c) => {\n return c.json({\n name: appName,\n version: appVersion,\n status: 'running',\n timestamp: new Date().toISOString()\n })\n })\n\n // Store app instance for route introspection (API reference auto-discovery)\n setAppInstance(app)\n\n // 404 handler\n app.notFound((c) => {\n return c.json({ error: 'Not Found', status: 404 }, 404)\n })\n\n // Error handler\n app.onError((err, c) => {\n console.error(err)\n return c.json({ error: 'Internal Server Error', status: 500 }, 500)\n })\n\n return app\n}\n\n/**\n * Setup core middleware (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreMiddleware(_app: SonicJSApp): void {\n console.warn('setupCoreMiddleware is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n\n/**\n * Setup core routes (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreRoutes(_app: SonicJSApp): void {\n console.warn('setupCoreRoutes is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n","import { drizzle } from 'drizzle-orm/d1';\nimport * as schema from './schema';\n\nexport function createDb(d1: D1Database) {\n return drizzle(d1, { schema });\n}\n\nexport * from './schema';","/**\n * @sonicjs/core - Main Entry Point\n *\n * Core framework for SonicJS headless CMS\n * Built for Cloudflare's edge platform with TypeScript\n *\n * Phase 2 Migration Status:\n * - Week 1: Types, Utils, Database (COMPLETED ✓)\n * - Week 2: Services, Middleware, Plugins (COMPLETED ✓)\n * - Week 3: Routes, Templates (COMPLETED ✓)\n * - Week 4: Integration & Testing (COMPLETED ✓)\n *\n * Test Coverage:\n * - Utilities: 48 tests (sanitize, query-filter, metrics)\n * - Middleware: 51 tests (auth, logging, security, performance)\n * - Total: 99 tests passing\n */\n\n// ============================================================================\n// Main Application API (Phase 2 Week 1)\n// ============================================================================\n\nexport { createSonicJSApp, setupCoreMiddleware, setupCoreRoutes } from './app'\nexport type { SonicJSConfig, SonicJSApp, Bindings, Variables } from './app'\n\n// ============================================================================\n// Placeholders - To be populated in Phase 2\n// ============================================================================\n\n// Services - Week 2 (COMPLETED)\nexport {\n // Collection Management\n loadCollectionConfigs,\n loadCollectionConfig,\n getAvailableCollectionNames,\n validateCollectionConfig,\n registerCollections,\n syncCollections,\n syncCollection,\n isCollectionManaged,\n getManagedCollections,\n cleanupRemovedCollections,\n fullCollectionSync,\n // Form-Collection Sync\n syncAllFormCollections,\n syncFormCollection,\n createContentFromSubmission,\n deriveCollectionSchemaFromFormio,\n deriveSubmissionTitle,\n mapFormStatusToContentStatus,\n backfillFormSubmissions,\n // Database Migrations\n MigrationService,\n // Logging\n Logger,\n getLogger,\n initLogger,\n // Plugin Services - Class implementations\n PluginService as PluginServiceClass,\n PluginBootstrapService,\n} from './services'\n\nexport type { Migration, MigrationStatus, LogLevel, LogCategory, LogEntry, LogFilter, CorePlugin } from './services'\n\n// Middleware - Week 2 (COMPLETED)\nexport {\n // Authentication\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n // Logging\n loggingMiddleware,\n detailedLoggingMiddleware,\n securityLoggingMiddleware,\n performanceLoggingMiddleware,\n // Performance\n cacheHeaders,\n compressionMiddleware,\n securityHeaders,\n // Permissions\n PermissionManager,\n requirePermission,\n requireAnyPermission,\n logActivity,\n // Plugin middleware\n requireActivePlugin,\n requireActivePlugins,\n getActivePlugins,\n isPluginActive,\n // Bootstrap\n bootstrapMiddleware,\n} from './middleware'\n\nexport type { Permission, UserPermissions } from './middleware'\n\n// Plugins - Week 2 (COMPLETED)\nexport {\n // Hook System - Class implementations\n HookSystemImpl,\n ScopedHookSystem as ScopedHookSystemClass,\n HookUtils,\n // Plugin Registry\n PluginRegistryImpl,\n // Plugin Manager - Class implementation\n PluginManager as PluginManagerClass,\n // Plugin Validator - Class implementation\n PluginValidator as PluginValidatorClass,\n} from './plugins'\n\n// Routes - Week 3 (COMPLETED)\nexport {\n ROUTES_INFO,\n apiRoutes,\n apiContentCrudRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminLogsRoutes,\n adminPluginRoutes,\n adminDesignRoutes,\n adminCheckboxRoutes,\n adminTestimonialsRoutes,\n adminCodeExamplesRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n} from './routes'\n\n// Templates - Week 3 (COMPLETED)\nexport {\n // Form templates\n renderForm,\n renderFormField,\n // Table templates\n renderTable,\n // Pagination templates\n renderPagination,\n // Alert templates\n renderAlert,\n // Confirmation dialog templates\n renderConfirmationDialog,\n getConfirmationDialogScript,\n // Filter bar templates\n renderFilterBar,\n} from './templates'\n\nexport type {\n FormField,\n FormData,\n TableColumn,\n TableData,\n PaginationData,\n AlertData,\n ConfirmationDialogOptions,\n FilterBarData,\n Filter,\n FilterOption,\n} from './templates'\n\n// Types - Week 1 (COMPLETED)\nexport type {\n // Collection types\n FieldType,\n FieldConfig,\n CollectionSchema,\n CollectionConfig,\n CollectionConfigModule,\n CollectionSyncResult,\n // Plugin types\n Plugin,\n PluginContext,\n PluginConfig,\n PluginRoutes,\n PluginMiddleware,\n PluginModel,\n PluginService,\n PluginAdminPage,\n PluginComponent,\n PluginMenuItem,\n PluginHook,\n HookHandler,\n HookContext,\n HookSystem,\n ScopedHookSystem,\n PluginRegistry,\n PluginManager,\n PluginStatus,\n AuthService,\n ContentService,\n MediaService,\n PluginLogger,\n PluginBuilderOptions,\n PluginValidator,\n PluginValidationResult,\n HookName,\n // Plugin manifest\n PluginManifest,\n} from './types'\n\nexport { HOOKS } from './types'\n\n// Utils - Week 1 (COMPLETED)\nexport {\n // Sanitization\n escapeHtml,\n sanitizeInput,\n sanitizeObject,\n // Template rendering\n TemplateRenderer,\n templateRenderer,\n renderTemplate,\n // Query filtering\n QueryFilterBuilder,\n buildQuery,\n // Metrics\n metricsTracker,\n // Version\n SONICJS_VERSION,\n getCoreVersion,\n} from './utils'\n\nexport type {\n FilterOperator,\n FilterCondition,\n FilterGroup,\n QueryFilter,\n QueryResult,\n} from './utils'\n\n// Database - Week 1 (COMPLETED)\nexport {\n createDb,\n // Schema exports\n users,\n collections,\n content,\n contentVersions,\n media,\n apiTokens,\n workflowHistory,\n plugins,\n pluginHooks,\n pluginRoutes,\n pluginAssets,\n pluginActivityLog,\n systemLogs,\n logConfig,\n // Zod validation schemas\n insertUserSchema,\n selectUserSchema,\n insertCollectionSchema,\n selectCollectionSchema,\n insertContentSchema,\n selectContentSchema,\n insertMediaSchema,\n selectMediaSchema,\n insertWorkflowHistorySchema,\n selectWorkflowHistorySchema,\n insertPluginSchema,\n selectPluginSchema,\n insertPluginHookSchema,\n selectPluginHookSchema,\n insertPluginRouteSchema,\n selectPluginRouteSchema,\n insertPluginAssetSchema,\n selectPluginAssetSchema,\n insertPluginActivityLogSchema,\n selectPluginActivityLogSchema,\n insertSystemLogSchema,\n selectSystemLogSchema,\n insertLogConfigSchema,\n selectLogConfigSchema,\n} from './db'\n\nexport type {\n User,\n NewUser,\n Collection,\n NewCollection,\n Content,\n NewContent,\n Media,\n NewMedia,\n WorkflowHistory,\n NewWorkflowHistory,\n Plugin as DbPlugin,\n NewPlugin,\n PluginHook as DbPluginHook,\n NewPluginHook,\n PluginRoute,\n NewPluginRoute,\n PluginAsset,\n NewPluginAsset,\n PluginActivityLog,\n NewPluginActivityLog,\n SystemLog,\n NewSystemLog,\n LogConfig,\n NewLogConfig,\n} from './db'\n\n// Plugin SDK (Beta)\nexport { PluginBuilder, PluginHelpers } from './plugins/sdk'\n\n// OAuth Providers Plugin\nexport { oauthProvidersPlugin, createOAuthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nexport { OAuthService, BUILT_IN_PROVIDERS } from './plugins/core-plugins/oauth-providers/oauth-service'\n\n// User Profiles Plugin\nexport { userProfilesPlugin, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig } from './plugins/core-plugins/user-profiles'\nexport type { ProfileFieldDefinition, UserProfileConfig } from './plugins/core-plugins/user-profiles'\n\n// ============================================================================\n// Version\n// ============================================================================\n\n// Import version from package.json\nimport packageJson from '../package.json'\nexport const VERSION = packageJson.version\n\n// ============================================================================\n// Phase 2 Migration Notes\n// ============================================================================\n\n/**\n * This is a work-in-progress package being extracted from the main SonicJS codebase.\n *\n * Current Phase: 2 (Core Module Migration)\n * Current Week: 1 (Types, Utils, Database)\n *\n * Expected completion: 4 weeks from 2025-01-17\n *\n * DO NOT USE IN PRODUCTION - Alpha release for development only\n */\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/core-plugins/database-tools-plugin/services/database-service.ts","../src/templates/pages/admin-database-table.template.ts","../src/plugins/core-plugins/database-tools-plugin/admin-routes.ts","../src/plugins/core-plugins/seed-data-plugin/services/seed-data-service.ts","../src/plugins/core-plugins/seed-data-plugin/admin-routes.ts","../src/plugins/core-plugins/email-plugin/index.ts","../src/plugins/core-plugins/otp-login-plugin/otp-service.ts","../src/plugins/core-plugins/otp-login-plugin/email-templates.ts","../src/plugins/core-plugins/otp-login-plugin/index.ts","../src/plugins/core-plugins/oauth-providers/oauth-service.ts","../src/plugins/core-plugins/oauth-providers/index.ts","../src/plugins/core-plugins/ai-search-plugin/services/embedding.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/chunking.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/custom-rag.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/ai-search.ts","../src/plugins/core-plugins/ai-search-plugin/services/indexer.ts","../src/plugins/core-plugins/ai-search-plugin/components/settings-page.ts","../src/plugins/core-plugins/ai-search-plugin/routes/admin.ts","../src/plugins/core-plugins/ai-search-plugin/routes/api.ts","../src/plugins/core-plugins/ai-search-plugin/manifest.json","../src/plugins/core-plugins/ai-search-plugin/index.ts","../src/plugins/available/magic-link-auth/index.ts","../src/plugins/core-plugins/security-audit-plugin/types.ts","../src/plugins/core-plugins/security-audit-plugin/services/security-audit-service.ts","../src/plugins/core-plugins/security-audit-plugin/components/dashboard-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/event-log-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/settings-page.ts","../src/plugins/core-plugins/security-audit-plugin/routes/admin.ts","../src/plugins/core-plugins/security-audit-plugin/services/brute-force-detector.ts","../src/plugins/core-plugins/security-audit-plugin/routes/api.ts","../src/plugins/core-plugins/security-audit-plugin/middleware/audit-middleware.ts","../src/plugins/core-plugins/security-audit-plugin/index.ts","../src/plugins/core-plugins/stripe-plugin/services/subscription-service.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-event-service.ts","../src/plugins/core-plugins/stripe-plugin/components/subscriptions-page.ts","../src/plugins/core-plugins/stripe-plugin/components/tab-bar.ts","../src/plugins/core-plugins/stripe-plugin/components/events-page.ts","../src/plugins/core-plugins/stripe-plugin/types.ts","../src/plugins/core-plugins/stripe-plugin/routes/admin.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-api.ts","../src/plugins/core-plugins/stripe-plugin/routes/api.ts","../src/plugins/core-plugins/stripe-plugin/index.ts","../src/middleware/plugin-menu.ts","../src/plugins/types.ts","../src/plugins/core-plugins/analytics/routes/admin.ts","../src/plugins/core-plugins/analytics/index.ts","../src/plugins/core-plugins/analytics/services/event-tracking-service.ts","../src/plugins/core-plugins/analytics/routes/api.ts","../src/plugins/cache/services/cache-config.ts","../src/plugins/cache/services/cache.ts","../src/plugins/cache/services/event-bus.ts","../src/plugins/cache/services/cache-invalidation.ts","../src/plugins/cache/services/cache-warming.ts","../src/templates/pages/admin-cache.template.ts","../src/plugins/cache/routes.ts","../src/plugins/cache/index.ts","../src/assets/favicon.ts","../src/app.ts","../src/db/index.ts","../src/index.ts"],"names":["init_admin_layout_catalyst_template","escapeHtml","renderAdminLayoutCatalyst","router","Hono","requireAuth","PluginBuilder","plugin","z","SettingsService","emailPlugin","getJwtExpirySecondsFromDb","AuthManager","setCookie","getCustomData","getCookie","tokenTtl","jwt","content","collections","statusBadge","renderAdminLayout","api_default","DEFAULT_SETTINGS","formatTimestamp","severityBadge","eventTypeBadge","adminRoutes","PluginService","apiRoutes","getSettings","isPluginActive","logPromise","renderPagination","PLUGIN_REGISTRY","HOOKS","PluginHelpers","media","renderConfirmationDialog","getConfirmationDialogScript","totalRequests","app","getCoreVersion","metricsMiddleware","bootstrapMiddleware","securityHeadersMiddleware","csrfProtection","requireRole","api_media_default","api_system_default","admin_api_default","adminCollectionsRoutes","adminFormsRoutes","adminSettingsRoutes","public_forms_default","admin_content_default","adminMediaRoutes","userProfilesPlugin","adminPluginRoutes","adminLogsRoutes","userRoutes","auth_default","test_cleanup_default","setAppInstance","d1","drizzle","schema_exports","package_default"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyBO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,MAAM,gBAAA,GAA2C;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,QAAQ,EAAC;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,KAAA,MAAW,aAAa,MAAA,EAAQ;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAE,CAAA,CAAE,KAAA,EAAM;AACzF,QAAA,MAAM,QAAA,GAAY,QAAQ,KAAA,IAAoB,CAAA;AAE9C,QAAA,KAAA,CAAM,OAAO,IAAA,CAAK;AAAA,UAChB,IAAA,EAAM,SAAA;AAAA,UACN;AAAA,SACD,CAAA;AACD,QAAA,KAAA,CAAM,SAAA,IAAa,QAAA;AAAA,MACrB,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MACnE;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SAAA,GAA+B;AAC3C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKpC,EAAE,GAAA,EAAI;AAEP,IAAA,OAAO,MAAA,CAAO,SAAS,GAAA,CAAI,CAAC,QAAa,GAAA,CAAI,IAAI,KAAK,EAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,UAAA,EAA6C;AACjE,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,gBAA0B,EAAC;AACjC,IAAA,IAAI,kBAAA,GAAqB,KAAA;AAEzB,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,QAC9B;AAAA,OACF,CAAE,IAAA,CAAK,UAAA,EAAY,OAAO,EAAE,KAAA,EAAM;AAElC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,uDAAA;AAAA,UACT,eAAe,EAAC;AAAA,UAChB,kBAAA,EAAoB,KAAA;AAAA,UACpB,MAAA,EAAQ,CAAC,sBAAsB;AAAA,SACjC;AAAA,MACF;AAGA,MAAA,MAAM,gBAAA,GAAmB;AAAA,QACvB,SAAA;AAAA,QACA,kBAAA;AAAA,QACA,yBAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,eAAA;AAAA,QACA,YAAA;AAAA,QACA,kBAAA;AAAA,QACA,mBAAA;AAAA,QACA,MAAA;AAAA,QACA,gBAAA;AAAA,QACA,SAAA;AAAA,QACA,iBAAA;AAAA,QACA,iBAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,SAAA,EAAU;AAC5C,MAAA,MAAM,gBAAgB,gBAAA,CAAiB,MAAA;AAAA,QAAO,CAAA,KAAA,KAC5C,cAAA,CAAe,QAAA,CAAS,KAAK;AAAA,OAC/B;AAGA,MAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,QAAA,IAAI;AACF,UAAA,MAAM,KAAK,EAAA,CAAG,OAAA,CAAQ,eAAe,SAAS,CAAA,CAAE,EAAE,GAAA,EAAI;AACtD,UAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAAA,QAC9B,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,sBAAA,EAAyB,SAAS,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAC1D,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QAC3D;AAAA,MACF;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ,iDAAiD,EACpE,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,CAAE,GAAA,EAAI;AAGjC,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,UAChC;AAAA,SACF,CAAE,IAAA,CAAK,UAAA,EAAY,OAAO,EAAE,KAAA,EAAM;AAElC,QAAA,kBAAA,GAAqB,CAAC,CAAC,WAAA;AACvB,QAAA,aAAA,CAAc,KAAK,mBAAmB,CAAA;AAAA,MACxC,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iCAAA,EAAoC,KAAK,CAAA,CAAE,CAAA;AACvD,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAAA,MACxD;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,6BAA6B,EAAE,GAAA,EAAI;AAAA,MAC3D,SAAS,KAAA,EAAO;AAAA,MAEhB;AAEA,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,GAAS,CAAA,GAC5B,CAAA,0BAAA,EAA6B,MAAA,CAAO,MAAM,CAAA,SAAA,EAAY,aAAA,CAAc,MAAM,CAAA,gBAAA,CAAA,GAC1E,CAAA,iCAAA,EAAoC,cAAc,MAAM,CAAA,gBAAA,CAAA;AAE5D,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,QAC3B,OAAA;AAAA,QACA,aAAA;AAAA,QACA,kBAAA;AAAA,QACA,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,KAAA;AAAA,OACvC;AAAA,IAEF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,+BAA+B,KAAK,CAAA,CAAA;AAAA,QAC7C,aAAA;AAAA,QACA,kBAAA;AAAA,QACA,MAAA,EAAQ,CAAC,MAAA,CAAO,KAAK,CAAC;AAAA,OACxB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAkF;AACtF,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACrC,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAI1C,MAAA,OAAA,CAAQ,IAAI,CAAA,OAAA,EAAU,QAAQ,CAAA,cAAA,EAAiB,KAAA,CAAM,SAAS,CAAA,WAAA,CAAa,CAAA;AAE3E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,CAAA,6BAAA,EAAgC,KAAA,CAAM,SAAS,CAAA,MAAA,CAAA;AAAA,QACxD;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,kBAAkB,KAAK,CAAA;AAAA,OAClC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,SAAA,EACA,KAAA,GAAgB,KAChB,MAAA,GAAiB,CAAA,EACjB,UAAA,EACA,aAAA,GAAgC,KAAA,EACZ;AACpB,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,SAAS,CAAA,UAAA,CAAY,CAAA;AAAA,MAChD;AAGA,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAA,CAAG,CAAA,CAAE,GAAA,EAAI;AAClF,MAAA,MAAM,OAAA,GAAU,aAAa,OAAA,EAAS,GAAA,CAAI,CAAC,GAAA,KAAa,GAAA,CAAI,IAAI,CAAA,IAAK,EAAC;AAGtE,MAAA,IAAI,UAAA,IAAc,CAAC,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AAC/C,QAAA,UAAA,GAAa,KAAA,CAAA;AAAA,MACf;AAGA,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAE,CAAA,CAAE,KAAA,EAAM;AAC9F,MAAA,MAAM,SAAA,GAAa,aAAa,KAAA,IAAoB,CAAA;AAGpD,MAAA,IAAI,KAAA,GAAQ,iBAAiB,SAAS,CAAA,CAAA;AACtC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,KAAA,IAAS,CAAA,UAAA,EAAa,UAAU,CAAA,CAAA,EAAI,aAAA,CAAc,aAAa,CAAA,CAAA;AAAA,MACjE;AACA,MAAA,KAAA,IAAS,CAAA,OAAA,EAAU,KAAK,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AAGzC,MAAA,MAAM,aAAa,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ,KAAK,EAAE,GAAA,EAAI;AAEpD,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EAAM,UAAA,CAAW,OAAA,IAAW,EAAC;AAAA,QAC7B;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAK,CAAA,CAAE,CAAA;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAkE;AACtE,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,SAAA,EAAW,aAAa,CAAA;AACzD,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,SAAA,EAAU;AAE5C,MAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,QAAA,IAAI,CAAC,cAAA,CAAe,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAA2B,KAAK,CAAA,CAAE,CAAA;AAAA,QAChD;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,QAC/B;AAAA,OACF,CAAE,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,EAAM;AAEtB,MAAA,IAAK,UAAA,EAAY,UAAqB,CAAA,EAAG;AACvC,QAAA,MAAA,CAAO,KAAK,sBAAsB,CAAA;AAAA,MACpC;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,kBAAkB,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ,wBAAwB,EAAE,KAAA,EAAM;AAC9E,QAAA,IAAI,eAAA,IAAoB,eAAA,CAAwB,eAAA,KAAoB,IAAA,EAAM;AACxE,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iCAAA,EAAqC,eAAA,CAAwB,eAAe,CAAA,CAAE,CAAA;AAAA,QAC5F;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAE,CAAA;AAAA,MACvD;AAAA,IAEF,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,kBAAA,EAAqB,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AACF,CAAA;;;AC5SAA,qDAAA,EAAA;AAkBO,SAAS,wBAAwB,IAAA,EAAqC;AAC3E,EAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,KAAK,QAAQ,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAA,CAAY,IAAA,CAAK,WAAA,GAAc,CAAA,IAAK,KAAK,QAAA,GAAW,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,IAAA,CAAK,cAAc,IAAA,CAAK,QAAA,EAAU,KAAK,SAAS,CAAA;AAExE,EAAA,MAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sGAAA,EAgBkF,KAAK,SAAS,CAAA;AAAA;AAAA,oBAAA,EAEhG,QAAA,CAAS,cAAA,EAAgB,CAAA,GAAA,EAAM,MAAA,CAAO,cAAA,EAAgB,CAAA,IAAA,EAAO,IAAA,CAAK,SAAA,CAAU,cAAA,EAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAA,EAa/E,IAAA,CAAK,QAAA,KAAa,EAAA,GAAK,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EACtC,IAAA,CAAK,QAAA,KAAa,EAAA,GAAK,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EACtC,IAAA,CAAK,QAAA,KAAa,EAAA,GAAK,UAAA,GAAa,EAAE,CAAA;AAAA,kCAAA,EACrC,IAAA,CAAK,QAAA,KAAa,GAAA,GAAM,UAAA,GAAa,EAAE,CAAA;AAAA,kCAAA,EACvC,IAAA,CAAK,QAAA,KAAa,GAAA,GAAM,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAsBzD,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,KAAO;AAAA;AAAA;AAAA;AAAA,wCAAA,EAIA,GAAG,CAAA;AAAA;AAAA;AAAA,4BAAA,EAGf,GAAG,CAAA;AAAA,sBAAA,EACT,IAAA,CAAK,eAAe,GAAA,GAAM;AAAA,4CAAA,EACJ,IAAA,CAAK,aAAA,KAAkB,KAAA,GAAQ,EAAA,GAAK,YAAY,CAAA;AAAA;AAAA;AAAA,sBAAA,CAAA,GAGpE;AAAA;AAAA;AAAA;AAAA,sBAAA,CAIH;AAAA;AAAA;AAAA,gBAAA,CAGN,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,cAAA,EAIX,IAAA,CAAK,KAAK,MAAA,GAAS,CAAA,GACjB,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,KAAQ;AAAA,6BAAA,EACf,GAAA,GAAM,CAAA,KAAM,CAAA,GAAI,2BAAA,GAA8B,gCAAgC,CAAA;AAAA,oBAAA,EACvF,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,KAAO;AAAA,qJAAA,EACyGC,YAAW,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,EAAE,CAAC,CAAC,CAAA;AAAA,wBAAA,EAC/J,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAC,CAAC;AAAA;AAAA,oBAAA,CAE9B,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA,gBAAA,CAEd,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GACR;AAAA;AAAA,iCAAA,EAEiB,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,CAQxC;AAAA;AAAA;AAAA;;AAAA;AAAA,QAAA,EAMJ,aAAa,CAAA,GAAI;AAAA;AAAA;AAAA;AAAA,kCAAA,EAIS,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,gBAAA,EACtC,IAAA,CAAK,WAAA,KAAgB,CAAA,GAAI,UAAA,GAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,EAMtB,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,gBAAA,EACtC,IAAA,CAAK,WAAA,KAAgB,UAAA,GAAa,UAAA,GAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAAA,EAShB,IAAA,CAAK,WAAW,CAAA,qCAAA,EAAwC,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,EAM7E,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,oBAAA,EACtC,IAAA,CAAK,WAAA,KAAgB,CAAA,GAAI,UAAA,GAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,kBAAA,EAS1C,mBAAA,CAAoB,IAAA,CAAK,WAAA,EAAa,UAAU,CAAC;;AAAA;AAAA,sCAAA,EAG7B,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,oBAAA,EACtC,IAAA,CAAK,WAAA,KAAgB,UAAA,GAAa,UAAA,GAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,GAY3D,EAAE;AAAA;AAAA;;AAAA;AAAA,gCAAA,EAKoB,KAAK,SAAS,CAAA;AAAA,wBAAA,EACtB,KAAK,WAAW,CAAA;AAAA,4BAAA,EACZ,KAAK,QAAQ,CAAA;AAAA,yBAAA,EAChB,IAAA,CAAK,cAAc,EAAE,CAAA;AAAA,4BAAA,EAClB,IAAA,CAAK,iBAAiB,KAAK,CAAA;;AAAA;AAAA,+BAAA,EAGxB,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAsEzC,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,CAAA,OAAA,EAAU,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,IAC/B,SAAA,EAAW,CAAA,UAAA,EAAa,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,IACtC,WAAA,EAAa,CAAA,6BAAA,EAAgC,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,IAC3D,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,OAAOC,4CAA0B,UAAU,CAAA;AAC7C;AAEA,SAAS,mBAAA,CAAoB,aAAqB,UAAA,EAA4B;AAC5E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,UAAA,GAAa,CAAA;AAEnB,EAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACd;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AACzC,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB,CAAA,MAAA,IAAW,WAAA,IAAe,UAAA,GAAa,CAAA,EAAG;AACxC,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,aAAa,CAAA,EAAG,CAAA,IAAK,YAAY,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACjE,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,cAAc,CAAA,EAAG,CAAA,IAAK,cAAc,CAAA,EAAG,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AACrE,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,IAAI,CAAA,IAAA,KAAQ;AACvB,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,OAAO;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,IAKT;AAEA,IAAA,MAAM,WAAW,IAAA,KAAS,WAAA;AAC1B,IAAA,OAAO;AAAA;AAAA,0BAAA,EAEiB,IAAI,CAAA;AAAA,iFAAA,EAEtB,QAAA,GACI,gJACA,6HACN,CAAA;AAAA;AAAA,QAAA,EAEE,IAAI;AAAA;AAAA,IAAA,CAAA;AAAA,EAGZ,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACZ;AAEA,SAASD,YAAW,IAAA,EAAsB;AACxC,EAAA,MAAM,GAAA,GAA8B;AAAA,IAClC,GAAA,EAAK,OAAA;AAAA,IACL,GAAA,EAAK,MAAA;AAAA,IACL,GAAA,EAAK,MAAA;AAAA,IACL,GAAA,EAAK,QAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AACA,EAAA,OAAO,MAAA,CAAO,IAAI,CAAA,CAAE,OAAA,CAAQ,YAAY,CAAA,CAAA,KAAK,GAAA,CAAI,CAAC,CAAA,IAAK,CAAC,CAAA;AAC1D;AAEA,SAAS,gBAAgB,KAAA,EAAoB;AAC3C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,mEAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,CAAA,qDAAA,EAAwD,KAAA,GAAQ,sEAAA,GAAyE,+DAA+D,KAAK,KAAK,CAAA,OAAA,CAAA;AAAA,EAC3N;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,sEAAsE,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,UAAU,CAAA,EAAG,EAAE,CAAA,IAAK,IAAA,CAAK,UAAU,KAAK,CAAA,CAAE,MAAA,GAAS,EAAA,GAAK,QAAQ,EAAA,CAAA,GAAM,SAAA;AAAA,EAC3K;AACA,EAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,EAAA,IAAI,GAAA,CAAI,SAAS,GAAA,EAAK;AACpB,IAAA,OAAOA,YAAW,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA,GAAI,KAAA;AAAA,EAC7C;AACA,EAAA,OAAOA,YAAW,GAAG,CAAA;AACvB;;;AC/UO,SAAS,8BAAA,GAAiC;AAC/C,EAAA,MAAME,OAAAA,GAAS,IAAIC,SAAA,EAAmD;AAGtE,EAAAD,OAAAA,CAAO,GAAA,CAAI,GAAA,EAAKE,6BAAA,EAAa,CAAA;AAG7B,EAAAF,OAAAA,CAAO,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAM;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,gBAAA,EAAiB;AAE7C,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAAA,OAAAA,CAAO,IAAA,CAAK,eAAA,EAAiB,OAAO,CAAA,KAAM;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,EAAE,aAAY,GAAI,IAAA;AAGxB,MAAA,IAAI,gBAAgB,mBAAA,EAAqB;AACvC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,eAAA,CAAgB,KAAK,KAAK,CAAA;AAEvD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,IAAA,EAAM;AAAA,UACJ,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,oBAAoB,MAAA,CAAO,kBAAA;AAAA,UAC3B,QAAQ,MAAA,CAAO;AAAA;AACjB,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAAA,OAAAA,CAAO,IAAA,CAAK,aAAA,EAAe,OAAO,CAAA,KAAM;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,YAAA,EAAa;AAE1C,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,IAAA,EAAM;AAAA,UACJ,UAAU,MAAA,CAAO;AAAA;AACnB,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAAA,OAAAA,CAAO,GAAA,CAAI,eAAA,EAAiB,OAAO,CAAA,KAAM;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,gBAAA,EAAiB;AAElD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAAA,OAAAA,CAAO,GAAA,CAAI,wBAAA,EAA0B,OAAO,CAAA,KAAM;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,MAAA,MAAM,QAAQ,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,OAAO,KAAK,KAAK,CAAA;AACpD,MAAA,MAAM,SAAS,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,QAAQ,KAAK,GAAG,CAAA;AACpD,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACrC,MAAA,MAAM,aAAA,GAAiB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA;AAE7C,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,YAAA,CAAa,WAAW,KAAA,EAAO,MAAA,EAAQ,YAAY,aAAa,CAAA;AAEhG,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,+BAA+B,KAAK,CAAA;AAAA,SAC1C,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAAA,OAAAA,CAAO,GAAA,CAAI,oBAAA,EAAsB,OAAO,CAAA,KAAM;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,QAAA,OAAO,CAAA,CAAE,SAAS,cAAc,CAAA;AAAA,MAClC;AAEA,MAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,MAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,MAAA,MAAM,WAAW,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,UAAU,KAAK,IAAI,CAAA;AACzD,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACrC,MAAA,MAAM,aAAA,GAAiB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA;AAE7C,MAAA,MAAM,MAAA,GAAA,CAAU,OAAO,CAAA,IAAK,QAAA;AAE5B,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC3C,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,YAAA,CAAa,WAAW,QAAA,EAAU,MAAA,EAAQ,YAAY,aAAa,CAAA;AAEnG,MAAA,MAAM,QAAA,GAAkC;AAAA,QACtC,IAAA,EAAM;AAAA,UACJ,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,SAAA;AAAA,UAClC,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK;AAAA,SACb;AAAA,QACA,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,WAAA,EAAa,IAAA;AAAA,QACb,QAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAC,CAAA;AAAA,IACjD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,CAAA,OAAA,EAAU,KAAK,IAAI,GAAG,CAAA;AAAA,IACtC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAOA,OAAAA;AACT;;;AC5OO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA,EAG7B,UAAA,GAAa;AAAA,IACnB,MAAA;AAAA,IAAQ,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,MAAA;AAAA,IAAQ,KAAA;AAAA,IAAO,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,OAAA;AAAA,IAC5D,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,KAAA;AAAA,IAAO,OAAA;AAAA,IAAS,WAAA;AAAA,IAAa,UAAA;AAAA,IAAY,QAAA;AAAA,IAChE,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU;AAAA,GACxC;AAAA;AAAA,EAGQ,SAAA,GAAY;AAAA,IAClB,OAAA;AAAA,IAAS,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,QAAA;AAAA,IAAU,OAAA;AAAA,IACtE,WAAA;AAAA,IAAa,UAAA;AAAA,IAAY,WAAA;AAAA,IAAa,OAAA;AAAA,IAAS,UAAA;AAAA,IAAY,QAAA;AAAA,IAAU,UAAA;AAAA,IACrE,QAAA;AAAA,IAAU,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS,SAAA;AAAA,IAAW;AAAA,GAC1C;AAAA;AAAA,EAGQ,UAAA,GAAa;AAAA,IACnB,6CAAA;AAAA,IACA,qCAAA;AAAA,IACA,mDAAA;AAAA,IACA,4CAAA;AAAA,IACA,+BAAA;AAAA,IACA,iCAAA;AAAA,IACA,mCAAA;AAAA,IACA,wBAAA;AAAA,IACA,qCAAA;AAAA,IACA,sCAAA;AAAA,IACA,mCAAA;AAAA,IACA,8BAAA;AAAA,IACA,oCAAA;AAAA,IACA,+BAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAGQ,UAAA,GAAa;AAAA,IACnB,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,gBAAA;AAAA,IAAkB,kBAAA;AAAA,IACzC,KAAA;AAAA,IAAO,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,WAAA;AAAA,IAC9B,SAAA;AAAA,IAAW,eAAA;AAAA,IAAiB,SAAA;AAAA,IAAW;AAAA,GACzC;AAAA;AAAA,EAGQ,aAAA,GAAgB;AAAA,IACtB,6BAAA;AAAA,IACA,iBAAA;AAAA,IACA,yBAAA;AAAA,IACA,yBAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA,0BAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,oBAAA;AAAA,IACA,uBAAA;AAAA,IACA,sBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAGQ,WAAA,GAAc;AAAA,IACpB,2GAAA;AAAA,IACA,4FAAA;AAAA,IACA,+EAAA;AAAA,IACA,iGAAA;AAAA,IACA,8EAAA;AAAA,IACA,yFAAA;AAAA,IACA,6EAAA;AAAA,IACA,mFAAA;AAAA,IACA,6EAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAGQ,UAAA,GAAqB;AAC3B,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACjE;AAAA;AAAA,EAGQ,aAAa,KAAA,EAAuB;AAC1C,IAAA,OAAO,KAAA,CACJ,aAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAAA,EAC3B;AAAA;AAAA,EAGQ,UAAA,GAAmB;AACzB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,GAAA,CAAI,WAAA,EAAY,GAAI,CAAA,EAAG,GAAA,CAAI,QAAA,EAAS,EAAG,GAAA,CAAI,OAAA,EAAS,CAAA;AAC7E,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,EAAQ,GAAI,IAAA,CAAK,MAAA,EAAO,IAAK,GAAA,CAAI,OAAA,EAAQ,GAAI,OAAA,CAAQ,OAAA,EAAQ,CAAA;AACxF,IAAA,OAAO,IAAI,KAAK,UAAU,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,MAAM,WAAA,GAA+B;AACnC,IAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,EAAS,QAAA,EAAU,UAAU,QAAQ,CAAA;AAEpD,IAAA,MAAM,cAAA,GAAiB,aAAA;AAEvB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA,IAAK,MAAA;AACzF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,IAAK,KAAA;AACtF,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAA,CAAU,WAAA,EAAa,GAAG,QAAA,CAAS,WAAA,EAAa,CAAA,EAAG,CAAC,CAAA,CAAA;AACxE,MAAA,MAAM,KAAA,GAAQ,GAAG,QAAQ,CAAA,YAAA,CAAA;AACzB,MAAA,MAAM,SAAA,GAAY,KAAK,UAAA,EAAW;AAClC,MAAA,MAAM,qBAAqB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,OAAA,KAAY,GAAI,CAAA;AAEhE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAG5B,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,IAAA;AAAA,QACT,KAAK,UAAA,EAAW;AAAA,QAChB,KAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA;AAAA,QACA,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA,CAAK,QAAO,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,QAC9C,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA;AAAA;AAAA,QAC1B,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,kBAAA,GAAqB,IAAA;AAAA,QAC3C,kBAAA;AAAA,QACA;AAAA,QACA,GAAA,EAAI;AAEN,MAAA,KAAA,EAAA;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,aAAA,GAAiC;AAErC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,qBAAqB,CAAA;AACvD,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,MAAM,UAAU,GAAA,EAAI;AAElD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,2BAA2B,CAAA;AACnE,IAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,MAAM,gBAAgB,GAAA,EAAI;AAE9D,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACtC,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AAClD,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,EAAS,WAAA,EAAa,UAAU,CAAA;AAGlD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,UAAA,GAAkB,eAAe,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,cAAA,CAAe,MAAM,CAAC,CAAA;AACxF,MAAA,MAAM,MAAA,GAAc,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,QAAA,CAAS,MAAM,CAAC,CAAA;AACxE,MAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,QAAA,CAAS,MAAM,CAAC,CAAA;AAEnE,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,WAAA;AAGJ,MAAA,IAAI,WAAW,IAAA,KAAS,YAAA,IAAgB,WAAW,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACxE,QAAA,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA,IAAK,oBAAA;AAC/E,QAAA,WAAA,GAAc;AAAA,UACZ,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA,IAAK,mBAAA;AAAA,UAC/E,OAAA,EAAS,4FAAA;AAAA,UACT,IAAA,EAAM,KAAK,YAAA,EAAa;AAAA,UACxB,QAAA,EAAU,IAAA,CAAK,MAAA,EAAO,GAAI;AAAA,SAC5B;AAAA,MACF,CAAA,MAAA,IAAW,WAAW,IAAA,KAAS,OAAA,IAAW,WAAW,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1E,QAAA,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA,IAAK,eAAA;AAC/E,QAAA,WAAA,GAAc;AAAA,UACZ,IAAA,EAAM,qFAAA;AAAA,UACN,QAAA,EAAU,SAAA;AAAA,UACV,UAAA,EAAY,IAAA,CAAK,MAAA,EAAO,GAAI;AAAA,SAC9B;AAAA,MACF,CAAA,MAAA,IAAW,WAAW,IAAA,KAAS,UAAA,IAAc,WAAW,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAChF,QAAA,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,aAAA,CAAc,MAAM,CAAC,CAAA,IAAK,kBAAA;AACrF,QAAA,WAAA,GAAc;AAAA,UACZ,WAAA,EAAa,yEAAA;AAAA,UACb,QAAQ,IAAA,CAAK,MAAA,KAAW,GAAA,GAAM,EAAA,EAAI,QAAQ,CAAC,CAAA;AAAA,UAC3C,GAAA,EAAK,CAAA,IAAA,EAAO,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,CAAE,aAAa,CAAA,CAAA;AAAA,UACjE,OAAA,EAAS,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA;AAAA,UACzB,SAAS,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,EAAG,QAAQ,CAAC;AAAA;AAAA,SAC3C;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,KAAA,GAAQ,GAAG,UAAA,CAAW,YAAA,IAAgB,WAAW,IAAI,CAAA,MAAA,EAAS,IAAI,CAAC,CAAA,CAAA;AACnE,QAAA,WAAA,GAAc;AAAA,UACZ,WAAA,EAAa,kDAAA;AAAA,UACb,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,GAAI;AAAA,SACxC;AAAA,MACF;AAEA,MAAA,MAAM,OAAO,CAAA,EAAG,IAAA,CAAK,aAAa,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA;AAC7C,MAAA,MAAM,SAAA,GAAY,KAAK,UAAA,EAAW;AAClC,MAAA,MAAM,qBAAqB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,OAAA,KAAY,GAAI,CAAA;AAChE,MAAA,MAAM,oBAAA,GAAuB,MAAA,KAAW,WAAA,GAAc,kBAAA,GAAqB,IAAA;AAE3E,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAG5B,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,IAAA;AAAA,QACT,KAAK,UAAA,EAAW;AAAA,QAChB,UAAA,CAAW,EAAA;AAAA,QACX,IAAA;AAAA,QACA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,QACb,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA,QAC1B,MAAA;AAAA,QACA,oBAAA;AAAA,QACA,MAAA,CAAO,EAAA;AAAA,QACP,kBAAA;AAAA,QACA;AAAA,QACA,GAAA,EAAI;AAEN,MAAA,KAAA,EAAA;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGQ,YAAA,GAAyB;AAC/B,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,UAAA;AAAA,MAAY,OAAA;AAAA,MAAS,YAAA;AAAA,MAAc,YAAA;AAAA,MAAc,SAAA;AAAA,MACjD,SAAA;AAAA,MAAW,UAAA;AAAA,MAAY,gBAAA;AAAA,MAAkB,UAAA;AAAA,MAAY,aAAA;AAAA,MACrD,SAAA;AAAA,MAAW,YAAA;AAAA,MAAc,OAAA;AAAA,MAAS,UAAA;AAAA,MAAY;AAAA,KAChD;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,CAAC,CAAA,GAAI,CAAA;AAChD,IAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,CAAK,MAAM,GAAA,GAAM,IAAA,CAAK,QAAQ,CAAA;AACvD,IAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,MAAM,OAAA,GAAuD;AAC3D,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA,EAAY;AACzC,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,aAAA,EAAc;AAE9C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAA,GAA+B;AAEnC,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,qBAAqB,CAAA;AAC/D,IAAA,MAAM,kBAAkB,GAAA,EAAI;AAG5B,IAAA,MAAM,eAAA,GAAkB,KAAK,EAAA,CAAG,OAAA;AAAA,MAC9B;AAAA,KACF;AACA,IAAA,MAAM,gBAAgB,GAAA,EAAI;AAAA,EAC5B;AACF,CAAA;;;ACpQO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,MAAM,MAAA,GAAS,IAAIC,SAAAA,EAA6B;AAGhD,EAAA,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAC3B,IAAA,MAAM,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAmPb,IAAA,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EACpB,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA,KAAM;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB,EAAE,CAAA;AAE1C,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,OAAA,EAAQ;AAEzC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,CAAM;AAAA,SACZ,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,KAAM;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB,EAAE,CAAA;AAE1C,MAAA,MAAM,YAAY,aAAA,EAAc;AAEhC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,CAAM;AAAA,SACZ,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AChSO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,MAAM,OAAA,GAAUE,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe;AAAA,GAChB,CAAA;AAGD,EAAA,MAAM,WAAA,GAAc,IAAIF,SAAAA,EAAK;AAM7B,EAAA,WAAA,CAAY,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA,KAAW;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,MAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAKhB,EAAE,IAAA,CAAK,IAAA,CAAK,UAAU,IAAI,CAAC,EAAE,GAAA,EAAI;AAElC,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,OAAO,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,OAAO,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,IACzE;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA,KAAW;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAG9B,MAAA,MAAMG,OAAAA,GAAS,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,MAAA,CAE/B,EAAE,KAAA,EAAM;AAET,MAAA,IAAI,CAACA,SAAQ,QAAA,EAAU;AACrB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA;AAG3C,MAAA,IAAI,CAAC,SAAS,MAAA,IAAU,CAAC,SAAS,SAAA,IAAa,CAAC,SAAS,QAAA,EAAU;AACjE,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,QAAA,CAAS,SAAA;AAGzC,MAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,4BAA4B,CAAA,EAAG;AAChD,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,+BAAA,EAAiC;AAAA,QAC5D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,UAC1C,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,MAAM,CAAA,EAAG,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK,SAAS,SAAS,CAAA,CAAA,CAAA;AAAA,UACjD,EAAA,EAAI,CAAC,OAAO,CAAA;AAAA,UACZ,OAAA,EAAS,yBAAA;AAAA,UACT,IAAA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAA,EAMY,QAAA,CAAS,QAAQ,CAAA,KAAA,EAAQ,QAAA,CAAS,SAAS,CAAA;AAAA,8BAAA,EACvC,QAAA,CAAS,WAAW,SAAS,CAAA;AAAA,6BAAA,EAAA,iBAC9B,IAAI,IAAA,EAAK,EAAE,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,UAK7C,QAAA,EAAU,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS;AAAA,SACxC;AAAA,OACF,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,IAAI,CAAA;AACvC,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,KAAK,OAAA,IAAW;AAAA,SACzB,EAAG,SAAS,MAAM,CAAA;AAAA,MACpB;AAEA,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,mCAAmC,OAAO,CAAA,CAAA;AAAA,QACnD,SAAS,IAAA,CAAK;AAAA,OACf,CAAA;AAAA,IAEH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,SACvB,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,wBAAwB,WAAA,EAAa;AAAA,IACpD,WAAA,EAAa,uBAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,WAAA,CAAY,SAAS,sBAAA,EAAwB;AAAA,IACnD,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa,CAAC,cAAc;AAAA,GAC7B,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,UAAU,YAAY;AACpB,MAAA,OAAA,CAAQ,KAAK,+BAA0B,CAAA;AAAA,IACzC,CAAA;AAAA,IAEA,YAAY,YAAY;AACtB,MAAA,OAAA,CAAQ,KAAK,iCAA4B,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAGO,IAAM,cAAc,iBAAA,EAAkB;;;AC9ItC,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,YAAA,CAAa,SAAiB,CAAA,EAAW;AACvC,IAAA,MAAM,MAAA,GAAS,YAAA;AACf,IAAA,IAAI,IAAA,GAAO,EAAA;AAEX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,YAAA,GAAe,IAAI,UAAA,CAAW,CAAC,CAAA;AACrC,MAAA,MAAA,CAAO,gBAAgB,YAAY,CAAA;AACnC,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAC,CAAA,IAAK,CAAA;AACvC,MAAA,IAAA,IAAQ,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,MAAM,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,KAAA,EACA,QAAA,EACA,WACA,SAAA,EACkB;AAClB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,UAAU,CAAA;AAClD,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,SAAA,GAAY,GAAA,GAAO,QAAA,CAAS,iBAAA,GAAoB,EAAA,GAAK,GAAA;AAE3D,IAAA,MAAM,OAAA,GAAmB;AAAA,MACvB,EAAA;AAAA,MACA,UAAA,EAAY,MAAM,WAAA,EAAY;AAAA,MAC9B,IAAA;AAAA,MACA,UAAA,EAAY,SAAA;AAAA,MACZ,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,YAAY,SAAA,IAAa,IAAA;AAAA,MACzB,YAAY,SAAA,IAAa,IAAA;AAAA,MACzB,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKrB,CAAA,CAAE,IAAA;AAAA,MACD,OAAA,CAAQ,EAAA;AAAA,MACR,OAAA,CAAQ,UAAA;AAAA,MACR,OAAA,CAAQ,IAAA;AAAA,MACR,OAAA,CAAQ,UAAA;AAAA,MACR,OAAA,CAAQ,IAAA;AAAA,MACR,OAAA,CAAQ,OAAA;AAAA,MACR,OAAA,CAAQ,UAAA;AAAA,MACR,OAAA,CAAQ,UAAA;AAAA,MACR,OAAA,CAAQ,QAAA;AAAA,MACR,OAAA,CAAQ;AAAA,MACR,GAAA,EAAI;AAEN,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,KAAA,EACA,IAAA,EACA,QAAA,EACyE;AACzE,IAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAC1C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKrC,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,IAAI,EAAE,KAAA,EAAM;AAErC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,IAC1D;AAGA,IAAA,IAAI,GAAA,GAAM,QAAQ,UAAA,EAAY;AAC5B,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,kBAAA,EAAmB;AAAA,IACnD;AAGA,IAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,QAAA,CAAS,WAAA,EAAa;AAC5C,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,2BAAA,EAA4B;AAAA,IAC5D;AAGA,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIrB,EAAE,IAAA,CAAK,GAAA,EAAK,OAAA,CAAQ,EAAE,EAAE,GAAA,EAAI;AAE7B,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,KAAA,EAAe,IAAA,EAA+B;AACpE,IAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAE1C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKpC,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,IAAI,EAAE,KAAA,EAAM;AAErC,IAAA,OAAO,QAAQ,QAAA,IAAY,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,KAAA,EAAe,QAAA,EAAyC;AAC3E,IAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAC1C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAK,KAAK,EAAA,GAAK,GAAA;AAE3C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIpC,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,UAAU,EAAE,KAAA,EAAM;AAE3C,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA;AAC/B,IAAA,OAAO,QAAQ,QAAA,CAAS,gBAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,KAAA,GAAgB,EAAA,EAAwB;AAC9D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIpC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,CAAE,GAAA,EAAI;AAEnB,IAAA,MAAM,IAAA,GAAQ,MAAA,CAAO,OAAA,IAAW,EAAC;AACjC,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,WAAA,CAAY,GAAG,CAAC,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,GAAuC;AAC3C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAGpC,CAAA,CAAE,IAAA,CAAK,GAAA,EAAK,GAAA,GAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,GAAK,CAAA,CAAE,GAAA,EAAI;AAEnD,IAAA,OAAO,MAAA,CAAO,KAAK,OAAA,IAAW,CAAA;AAAA,EAChC;AAAA,EAEQ,YAAY,GAAA,EAAuC;AACzD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,MACjB,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,MACrB,YAAY,MAAA,CAAO,GAAA,CAAI,UAAA,IAAc,IAAA,CAAK,KAAK,CAAA;AAAA,MAC/C,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,CAAC,CAAA;AAAA,MAC1B,OAAA,EAAS,GAAA,CAAI,OAAA,KAAY,IAAA,IAAQ,GAAA,CAAI,YAAY,MAAA,GAAY,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAAA,MACtF,YAAY,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,GAAW,IAAI,UAAA,GAAa,IAAA;AAAA,MAClE,YAAY,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,GAAW,IAAI,UAAA,GAAa,IAAA;AAAA,MAClE,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,QAAA,IAAY,CAAC,CAAA;AAAA,MAClC,YAAY,MAAA,CAAO,GAAA,CAAI,UAAA,IAAc,IAAA,CAAK,KAAK;AAAA,KACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,IAAA,GAAe,CAAA,EAK3B;AACD,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,KAAS,IAAA,GAAO,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAElD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQnC,EAAE,IAAA,CAAK,IAAA,CAAK,KAAI,EAAG,KAAK,EAAE,KAAA,EAAM;AAEjC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,KAAA,IAAS,CAAA;AAAA,MACvB,UAAA,EAAY,OAAO,UAAA,IAAc,CAAA;AAAA,MACjC,MAAA,EAAQ,OAAO,MAAA,IAAU,CAAA;AAAA,MACzB,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC7B;AAAA,EACF;AACF,CAAA;;;ACnOA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAA;AAC9C,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAA;AACtC,EAAA,IAAI,sCAAA,CAAuC,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAA;AAC/D,EAAA,OAAO,EAAA;AACT;AAEA,SAASN,YAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,MACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,QAAQ,CAAA,CACtB,QAAQ,IAAA,EAAM,OAAO,EACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,MAAM,MAAM,CAAA;AACzB;AAEO,SAAS,mBAAmB,IAAA,EAA4B;AAC7D,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA,GAAUA,WAAAA,CAAW,IAAA,CAAK,OAAO,CAAA,GAAI,EAAA;AAC1D,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA,GAAWA,WAAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,GAAI,EAAA;AAC7D,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AACvC,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACrB,IAAA,CAAK,mBAAmB,IAAA,CAAK,eAAA,CAAgB,MAAK,IAAM,CAAA,WAAA,EAAc,KAAK,OAAO,CAAA;AAAA,GACrF;AACA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,IAAK,GAAG,CAAC,CAAA;AAC3E,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,IAAK,CAAC,CAAC,CAAA;AACnF,EAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,IAAA,CAAK,eAAe,CAAA;AAC1D,EAAA,MAAM,eAAA,GAAkB,kBAAkB,CAAA,IAAK,eAAA,GAC3C,WAAW,eAAe,CAAA,SAAA,EAAY,eAAe,CAAA,qBAAA,CAAA,GACrD,EAAA;AAEJ,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,IAAA,EAWH,OAAA,GAAU;AAAA;AAAA,gBAAA,EAEE,OAAO,CAAA,OAAA,EAAU,OAAO,CAAA,oBAAA,EAAuB,SAAS,kCAAkC,eAAe,CAAA;AAAA;AAAA,IAAA,CAAA,GAEnH,EAAE;;AAAA;AAAA;AAAA,0FAAA,EAIkF,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,UAAA,EAMvF,KAAK,IAAI;AAAA;AAAA;;AAAA,MAAA,EAIb,QAAA,GAAW;AAAA;AAAA,iBAAA,EAEA,QAAQ,CAAA;AAAA,UAAA,EACf,eAAe;AAAA;AAAA;AAAA,MAAA,CAAA,GAGjB,EAAE;;AAAA;AAAA;AAAA,oDAAA,EAIgC,KAAK,aAAa,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,+CAAA,EAOb,KAAK,UAAU,CAAA;AAAA;AAAA,uBAAA,EAEvC,KAAK,WAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CAAA,EAUM,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,yDAAA,EAYKA,WAAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,QAAA,EACvE,IAAA,CAAK,YAAY,CAAA,sCAAA,EAAyCA,WAAAA,CAAW,KAAK,SAAS,CAAC,SAAS,EAAE;AAAA,wCAAA,EAC/DA,WAAAA,CAAW,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,iCAAA,EAAA,qBAO7B,IAAA,EAAK,EAAE,WAAA,EAAa,IAAI,OAAO,CAAA;AAAA;;AAAA;AAAA,OAAA,CAAA;AAKtE;AAEO,SAAS,mBAAmB,IAAA,EAA4B;AAC7D,EAAA,MAAM,QAAA,GAAY,KAAK,eAAA,IAAmB,IAAA,CAAK,gBAAgB,IAAA,EAAK,IAAM,CAAA,WAAA,EAAc,IAAA,CAAK,OAAO,CAAA,CAAA;AACpG,EAAA,OAAO,CAAA,oBAAA,EAAuB,KAAK,OAAO;;AAAA;;AAAA,EAI1C,KAAK,IAAI;;AAAA,qBAAA,EAEY,KAAK,aAAa,CAAA;AAAA,EACvC,KAAK,QAAA,GAAW;AAAA,EAAK,QAAQ,CAAA,EAAA,EAAK,IAAA,CAAK,QAAQ;AAAA,CAAA,GAAO,EAAE;;AAAA;AAAA,wCAAA,EAGrB,KAAK,UAAU,CAAA;AAAA;AAAA,gBAAA,EAEvC,KAAK,WAAW,CAAA;AAAA;;AAAA;AAAA,mCAAA,EAIQ,KAAK,OAAO,CAAA;;AAAA;AAAA;;AAAA;AAAA,uBAAA,EAMxB,KAAK,KAAK;AAAA,EACjC,KAAK,SAAA,GAAY,CAAA,YAAA,EAAe,IAAA,CAAK,SAAS,KAAK,EAAE;AAAA,MAAA,EAC/C,KAAK,SAAS;;AAAA,KAAA,EAAA,qBAEd,IAAA,EAAK,EAAE,aAAa,CAAA,CAAA,EAAI,KAAK,OAAO,CAAA,sBAAA,CAAA;AAC5C;AAEO,SAAS,eAAe,IAAA,EAAoD;AACjF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,mBAAmB,IAAI,CAAA;AAAA,IAC7B,IAAA,EAAM,mBAAmB,IAAI;AAAA,GAC/B;AACF;;;AC5JA,IAAM,gBAAA,GAAmBO,MAAE,MAAA,CAAO;AAAA,EAChC,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAM,yBAAyB;AACnD,CAAC,CAAA;AAED,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EAC/B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAM,yBAAyB,CAAA;AAAA,EACjD,IAAA,EAAMA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC;AAC/B,CAAC,CAAA;AAGD,IAAM,gBAAA,GAAgC;AAAA,EACpC,UAAA,EAAY,CAAA;AAAA,EACZ,iBAAA,EAAmB,EAAA;AAAA,EACnB,WAAA,EAAa,CAAA;AAAA,EACb,gBAAA,EAAkB,CAAA;AAAA,EAClB,wBAAA,EAA0B,KAAA;AAAA,EAC1B,OAAA,EAAS,EAAA;AAAA,EACT,SAAA,EAAW,GAAA;AAAA,EACX,eAAA,EAAiB,CAAA;AAAA,EACjB,eAAA,EAAiB,SAAA;AAAA,EACjB,QAAA,EAAU,EAAA;AAAA,EACV,eAAA,EAAiB;AACnB,CAAA;AAEO,SAAS,oBAAA,GAA+B;AAC7C,EAAA,MAAM,OAAA,GAAUF,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe;AAAA,GAChB,CAAA;AAID,EAAA,MAAM,MAAA,GAAS,IAAIF,SAAAA,EAAK;AAGxB,EAAA,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,KAAW;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,SAAA,CAAU,IAAI,CAAA;AAElD,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,mBAAA;AAAA,UACP,OAAA,EAAS,WAAW,KAAA,CAAM;AAAA,WACzB,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,UAAA,CAAW,IAAA;AAC7B,MAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAC1C,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,EAAE,CAAA;AAGpC,MAAA,IAAI,QAAA,GAAwB,EAAE,GAAG,gBAAA,EAAiB;AAClD,MAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,MAAA,CAElC,EAAE,KAAA,EAAM;AACT,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA;AACnD,UAAA,QAAA,GAAW,EAAE,GAAG,gBAAA,EAAkB,GAAG,aAAA,EAAc;AAAA,QACrD,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAK,qDAAqD,CAAA;AAAA,QACpE;AAAA,MACF;AAGA,MAAA,MAAM,eAAA,GAAkB,IAAIK,iCAAA,CAAgB,EAAE,CAAA;AAC9C,MAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,kBAAA,EAAmB;AACjE,MAAA,MAAM,WAAW,eAAA,CAAgB,QAAA;AAGjC,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,cAAA,CAAe,iBAAiB,QAAQ,CAAA;AAC5E,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAI7B,CAAA,CAAE,IAAA,CAAK,eAAe,CAAA,CAAE,KAAA,EAAM;AAE/B,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,QAAA,CAAS,wBAAA,EAA0B;AAE/C,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,oFAAA;AAAA,UACT,SAAA,EAAW,SAAS,iBAAA,GAAoB;AAAA,SACzC,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,IAAA,IAAQ,CAAC,IAAA,CAAK,SAAA,EAAW;AAC3B,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,KAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA,IAAK,SAAA;AACzF,MAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,IAAK,SAAA;AAGhD,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,aAAA;AAAA,QAC/B,eAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,WAAA,KAAgB,aAAA;AAExC,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAsB,eAAe,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,QACtE;AAGA,QAAA,MAAM,eAAe,cAAA,CAAe;AAAA,UAClC,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,eAAe,QAAA,CAAS,iBAAA;AAAA,UACxB,YAAY,QAAA,CAAS,UAAA;AAAA,UACrB,aAAa,QAAA,CAAS,WAAA;AAAA,UACtB,KAAA,EAAO,eAAA;AAAA,UACP,SAAA;AAAA,UACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,OAAA,EAAS,QAAA;AAAA,UACT,OAAA,EAAS,SAAS,OAAA,IAAW,EAAA;AAAA,UAC7B,WAAW,QAAA,CAAS,SAAA;AAAA,UACpB,iBAAiB,QAAA,CAAS,eAAA;AAAA,UAC1B,eAAA,EAAiB,SAAS,eAAA,IAAmB,EAAA;AAAA,UAC7C,QAAA,EAAU,SAAS,QAAA,IAAY,EAAA;AAAA,UAC/B,eAAA,EAAiB,SAAS,eAAA,IAAmB;AAAA,SAC9C,CAAA;AAKD,QAAA,MAAMC,YAAAA,GAAc,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,QAAA,CAEpC,EAAE,KAAA,EAAM;AAET,QAAA,IAAIA,cAAa,QAAA,EAAU;AACzB,UAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAMA,YAAAA,CAAY,QAAQ,CAAA;AAErD,UAAA,IAAI,aAAA,CAAc,MAAA,IAAU,aAAA,CAAc,SAAA,IAAa,cAAc,QAAA,EAAU;AAE7E,YAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,+BAAA,EAAiC;AAAA,cACjE,MAAA,EAAQ,MAAA;AAAA,cACR,OAAA,EAAS;AAAA,gBACP,eAAA,EAAiB,CAAA,OAAA,EAAU,aAAA,CAAc,MAAM,CAAA,CAAA;AAAA,gBAC/C,cAAA,EAAgB;AAAA,eAClB;AAAA,cACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,MAAM,CAAA,EAAG,aAAA,CAAc,QAAQ,CAAA,EAAA,EAAK,cAAc,SAAS,CAAA,CAAA,CAAA;AAAA,gBAC3D,EAAA,EAAI,CAAC,eAAe,CAAA;AAAA,gBACpB,OAAA,EAAS,uBAAuB,QAAQ,CAAA,CAAA;AAAA,gBACxC,MAAM,YAAA,CAAa,IAAA;AAAA,gBACnB,MAAM,YAAA,CAAa,IAAA;AAAA,gBACnB,QAAA,EAAU,aAAA,CAAc,OAAA,IAAW,aAAA,CAAc;AAAA,eAClD;AAAA,aACF,CAAA;AAED,YAAA,IAAI,CAAC,cAAc,EAAA,EAAI;AACrB,cAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc,IAAA,EAAK;AAC3C,cAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,SAAS,CAAA;AAAA,YAEjE;AAAA,UACF,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,KAAK,+EAA+E,CAAA;AAAA,UAC9F;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,KAAK,0DAA0D,CAAA;AAAA,QACzE;AAEA,QAAA,MAAM,QAAA,GAAgB;AAAA,UACpB,OAAA,EAAS,oFAAA;AAAA,UACT,SAAA,EAAW,SAAS,iBAAA,GAAoB;AAAA,SAC1C;AAGA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,QAAA,CAAS,WAAW,OAAA,CAAQ,IAAA;AAAA,QAC9B;AAEA,QAAA,OAAO,CAAA,CAAE,KAAK,QAAQ,CAAA;AAAA,MACxB,SAAS,UAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,UAAU,CAAA;AACpD,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA,KAAW;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAEjD,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,mBAAA;AAAA,UACP,OAAA,EAAS,WAAW,KAAA,CAAM;AAAA,WACzB,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,UAAA,CAAW,IAAA;AACnC,MAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAC1C,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,EAAE,CAAA;AAGpC,MAAA,IAAI,QAAA,GAAW,EAAE,GAAG,gBAAA,EAAiB;AACrC,MAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,MAAA,CAElC,EAAE,KAAA,EAAM;AACT,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA;AACnD,UAAA,QAAA,GAAW,EAAE,GAAG,gBAAA,EAAkB,GAAG,aAAA,EAAc;AAAA,QACrD,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAK,qDAAqD,CAAA;AAAA,QACpE;AAAA,MACF;AAGA,MAAA,MAAM,eAAe,MAAM,UAAA,CAAW,UAAA,CAAW,eAAA,EAAiB,MAAM,QAAQ,CAAA;AAEhF,MAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AAEvB,QAAA,MAAM,UAAA,CAAW,iBAAA,CAAkB,eAAA,EAAiB,IAAI,CAAA;AAExD,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,aAAa,KAAA,IAAS,cAAA;AAAA,UAC7B,mBAAmB,YAAA,CAAa;AAAA,WAC/B,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,IAAI,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAI3B,CAAA,CAAE,IAAA,CAAK,eAAe,CAAA,CAAE,KAAA,EAAM;AAE/B,MAAA,IAAI,CAAC,IAAA,IAAQ,QAAA,CAAS,wBAAA,EAA0B;AAE9C,QAAA,MAAM,MAAA,GAAS,OAAO,UAAA,EAAW;AACjC,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,QAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAExE,QAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAKhB,CAAA,CAAE,KAAK,MAAA,EAAQ,eAAA,EAAiB,UAAU,GAAA,EAAK,GAAG,EAAE,GAAA,EAAI;AAEzD,QAAA,IAAA,GAAO;AAAA,UACL,EAAA,EAAI,MAAA;AAAA,UACJ,KAAA,EAAO,eAAA;AAAA,UACP,QAAA;AAAA,UACA,UAAA,EAAY,EAAA;AAAA,UACZ,SAAA,EAAW,EAAA;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,SAAA,EAAW,CAAA;AAAA,UACX,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,QAAA,GAAW,MAAMC,2CAAA,CAA0B,EAAA,EAAI,EAAE,GAAU,CAAA;AACjE,MAAA,MAAM,KAAA,GAAQ,MAAMC,6BAAA,CAAY,aAAA,CAAc,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,IAAA,EAAO,CAAA,CAAE,GAAA,CAAY,YAAY,QAAQ,CAAA;AAGjH,MAAAC,gBAAA,CAAU,CAAA,EAAG,cAAc,KAAA,EAAO;AAAA,QAChC,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,MAAMC,+BAAA,CAAc,EAAA,EAAI,KAAK,EAAE,CAAA;AAClD,MAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,GAAG,YAAW,GAAI,IAAA;AAEhD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,UACJ,GAAG,UAAA;AAAA,UACH,GAAG;AAAA,SACL;AAAA,QACA,KAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA,KAAW;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,SAAA,CAAU,IAAI,CAAA;AAElD,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,mBAAA;AAAA,UACP,OAAA,EAAS,WAAW,KAAA,CAAM;AAAA,WACzB,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,OAAO,MAAA,CAAO,KAAA;AAAA,QACZ,IAAI,QAAQ,CAAA,CAAE,GAAA,CAAI,IAAI,OAAA,CAAQ,SAAA,EAAW,UAAU,CAAA,EAAG;AAAA,UACpD,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,GAAA,CAAI,OAAA;AAAA,UACnB,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,OAAO,UAAA,CAAW,IAAA,CAAK,OAAO;AAAA,SACtD,CAAA;AAAA,QACD,CAAA,CAAE;AAAA,OACJ;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,aAAa,MAAA,EAAQ;AAAA,IACpC,WAAA,EAAa,8BAAA;AAAA,IACb,YAAA,EAAc,KAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAMD,EAAA,OAAA,CAAQ,WAAA,CAAY,aAAa,0BAAA,EAA4B;AAAA,IAC3D,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa,CAAC,YAAY;AAAA,GAC3B,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,UAAU,YAAY;AACpB,MAAA,OAAA,CAAQ,KAAK,mCAA8B,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,OAAA,CAAQ,KAAK,qCAAgC,CAAA;AAAA,IAC/C;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAEO,IAAM,iBAAiB,oBAAA,EAAqB;;;ACxX5C,IAAM,eAAA,GAAuC;AAAA,EAClD,EAAA,EAAI,QAAA;AAAA,EACJ,IAAA,EAAM,QAAA;AAAA,EACN,YAAA,EAAc,0CAAA;AAAA,EACd,QAAA,EAAU,6CAAA;AAAA,EACV,WAAA,EAAa,6BAAA;AAAA,EACb,MAAA,EAAQ,CAAC,WAAA,EAAa,YAAY,CAAA;AAAA,EAClC,UAAA,EAAY,CAAC,OAAA,MAAa;AAAA,IACxB,iBAAA,EAAmB,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,IACpC,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,IACxB,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,KAAA,IAAS,EAAA;AAAA,IACvC,MAAA,EAAQ,QAAQ,UAAA,IAAc;AAAA,GAChC;AACF,CAAA;AAEO,IAAM,eAAA,GAAuC;AAAA,EAClD,EAAA,EAAI,QAAA;AAAA,EACJ,IAAA,EAAM,QAAA;AAAA,EACN,YAAA,EAAc,8CAAA;AAAA,EACd,QAAA,EAAU,qCAAA;AAAA,EACV,WAAA,EAAa,+CAAA;AAAA,EACb,MAAA,EAAQ,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,CAAA;AAAA,EACrC,UAAA,EAAY,CAAC,OAAA,MAAa;AAAA,IACxB,iBAAA,EAAmB,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,IACpC,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,IACxB,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,IACtB,MAAA,EAAQ,QAAQ,OAAA,IAAW;AAAA,GAC7B;AACF,CAAA;AAEO,IAAM,kBAAA,GAA0D;AAAA,EACrE,MAAA,EAAQ,eAAA;AAAA,EACR,MAAA,EAAQ;AACV;AAmBO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,iBAAA,CACE,QAAA,EACA,QAAA,EACA,WAAA,EACA,KAAA,EACQ;AACR,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,SAAA,EAAW,QAAA;AAAA,MACX,YAAA,EAAc,WAAA;AAAA,MACd,aAAA,EAAe,MAAA;AAAA,MACf,KAAA,EAAO,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,MAC/B;AAAA,KACD,CAAA;AAGD,IAAA,IAAI,QAAA,CAAS,OAAO,QAAA,EAAU;AAC5B,MAAA,MAAA,CAAO,GAAA,CAAI,eAAe,SAAS,CAAA;AACnC,MAAA,MAAA,CAAO,GAAA,CAAI,UAAU,SAAS,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,GAAG,QAAA,CAAS,YAAY,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,QAAA,EACA,QAAA,EACA,YAAA,EACA,MACA,WAAA,EACgF;AAChF,IAAA,MAAM,IAAA,GAA+B;AAAA,MACnC,SAAA,EAAW,QAAA;AAAA,MACX,aAAA,EAAe,YAAA;AAAA,MACf,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,mCAAA;AAAA,QAChB,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,IAAA,EAAM,IAAI,eAAA,CAAgB,IAAI,EAAE,QAAA;AAAS,KAC1C,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,SAAS,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,CAAE,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAK,iBAAA,IAAqB,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IACjF;AAEA,IAAA,OAAO;AAAA,MACL,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,YAAY,IAAA,CAAK,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,GAAI;AAAA,KAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CACJ,QAAA,EACA,WAAA,EAC2B;AAC3B,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,eAAA,EAAiB,UAAU,WAAW,CAAA,CAAA;AAAA,MACtC,QAAA,EAAU;AAAA,KACZ;AAGA,IAAA,IAAI,QAAA,CAAS,OAAO,QAAA,EAAU;AAC5B,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,SAAS,WAAA,EAAa,EAAE,SAAS,CAAA;AAE9D,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AAGpC,IAAA,IAAI,QAAA,CAAS,EAAA,KAAO,QAAA,IAAY,CAAC,QAAQ,KAAA,EAAO;AAC9C,MAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,oCAAA,EAAsC;AAAA,QACtE,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,SAAS,WAAW,CAAA,CAAA;AAAA,UACrC,QAAA,EAAU;AAAA;AACZ,OACD,CAAA;AAED,MAAA,IAAI,cAAc,EAAA,EAAI;AACpB,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,IAAA,EAAK;AACxC,QAAA,MAAM,eAAe,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,OAAA,IAAW,EAAE,QAAQ,CAAA;AAC7D,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,OAAA,CAAQ,QAAQ,YAAA,CAAa,KAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,QAAA,CAAS,WAAW,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,CACJ,QAAA,EACA,iBAAA,EAC8B;AAC9B,IAAA,OAAO,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAG5B,CAAA,CAAE,IAAA,CAAK,QAAA,EAAU,iBAAiB,EAAE,KAAA,EAAM;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,MAAA,EAAyC;AACnE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAEpC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,EAAI;AACpB,IAAA,OAAQ,MAAA,CAAO,WAAW,EAAC;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,MAAA,EAQC;AACxB,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAMrB,CAAA,CAAE,IAAA;AAAA,MACD,EAAA;AAAA,MACA,MAAA,CAAO,MAAA;AAAA,MACP,MAAA,CAAO,QAAA;AAAA,MACP,MAAA,CAAO,iBAAA;AAAA,MACP,MAAA,CAAO,WAAA;AAAA,MACP,OAAO,YAAA,IAAgB,IAAA;AAAA,MACvB,OAAO,cAAA,IAAkB,IAAA;AAAA,MACzB,OAAO,WAAA,IAAe,IAAA;AAAA,MACtB,GAAA;AAAA,MACA;AAAA,MACA,GAAA,EAAI;AAEN,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAS,MAAA,CAAO,MAAA;AAAA,MAChB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,qBAAqB,MAAA,CAAO,iBAAA;AAAA,MAC5B,cAAc,MAAA,CAAO,WAAA;AAAA,MACrB,aAAA,EAAe,OAAO,YAAA,IAAgB,IAAA;AAAA,MACtC,gBAAA,EAAkB,OAAO,cAAA,IAAkB,IAAA;AAAA,MAC3C,YAAA,EAAc,OAAO,WAAA,IAAe,IAAA;AAAA,MACpC,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACJ,EAAA,EACA,WAAA,EACA,cACA,cAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIrB,CAAA,CAAE,IAAA,CAAK,WAAA,EAAa,YAAA,IAAgB,IAAA,EAAM,cAAA,IAAkB,IAAA,EAAM,IAAA,CAAK,GAAA,EAAI,EAAG,EAAE,CAAA,CAAE,GAAA,EAAI;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,MAAA,EAAgB,QAAA,EAAoC;AAE3E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAElC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,EAAM;AAEtB,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAGxC,CAAA,CAAE,IAAA,CAAK,MAAA,EAAQ,QAAQ,EAAE,KAAA,EAAM;AAEhC,IAAA,MAAM,WAAA,GAAc,CAAC,CAAC,IAAA,EAAM,aAAA;AAC5B,IAAA,MAAM,aAAA,GAAA,CAAiB,UAAA,EAAY,KAAA,IAAS,CAAA,IAAK,CAAA;AAEjD,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,aAAA,EAAe;AAClC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,CAAA,CAAE,IAAA,CAAK,MAAA,EAAQ,QAAQ,EAAE,GAAA,EAAI;AAE9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAA,EAOZ;AACR,IAAA,OAAO,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAG5B,EAAE,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,EAAE,KAAA,EAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,OAAA,EAA4C;AACpE,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAY;AACxC,IAAA,MAAM,SAAA,GAAA,CAAa,OAAA,CAAQ,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,MAAA,EAAQ,KAAA,CAAM,GAAG,CAAA;AAC3E,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,CAAC,CAAA,IAAK,MAAA;AAClC,IAAA,MAAM,WAAW,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,EAAA;AACjD,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,CAAG,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AAGzD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC7B;AAAA,KACF,CAAE,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,EAAM;AAEvB,IAAA,MAAM,aAAA,GAAgB,QAAA,GAClB,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,GACjC,QAAA;AAEJ,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKrB,CAAA,CAAE,IAAA;AAAA,MACD,EAAA;AAAA,MAAI,KAAA;AAAA,MAAO,aAAA;AAAA,MAAe,SAAA;AAAA,MAAW,QAAA;AAAA,MACrC,QAAQ,MAAA,IAAU,IAAA;AAAA,MAAM,GAAA;AAAA,MAAK;AAAA,MAC7B,GAAA,EAAI;AAEN,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,IAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,IAAA,OAAO,MAAM,IAAA,CAAK,KAAK,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAC5E;AACF;;;ACvWA,IAAM,iBAAA,GAAoB,aAAA;AAC1B,IAAM,oBAAA,GAAuB,GAAA;AAEtB,SAAS,0BAAA,GAAqC;AACnD,EAAA,MAAM,OAAA,GAAUR,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,iBAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe;AAAA,GAChB,CAAA;AAID,EAAA,SAAS,cAAA,CAAe,GAAQ,QAAA,EAA0B;AACxD,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,mBAAmB,CAAA,IAAK,OAAA;AACnD,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,IAAK,WAAA;AACrC,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,IAAI,eAAe,QAAQ,CAAA,SAAA,CAAA;AAAA,EAClD;AAEA,EAAA,eAAe,aAAa,EAAA,EAA8C;AACxE,IAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,OAAA;AAAA,MACnB,CAAA,yDAAA;AAAA,MACA,KAAA,EAAM;AAER,IAAA,IAAI,CAAC,GAAA,EAAK,QAAA,EAAU,OAAO,IAAA;AAE3B,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,SAAS,sBAAA,CACP,UACA,UAAA,EACmD;AACnD,IAAA,IAAI,CAAC,QAAA,EAAU,SAAA,GAAY,UAAU,GAAG,OAAO,IAAA;AAC/C,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,UAAU,CAAA;AACvC,IAAA,IAAI,CAAC,EAAE,OAAA,IAAW,CAAC,EAAE,QAAA,IAAY,CAAC,CAAA,CAAE,YAAA,EAAc,OAAO,IAAA;AACzD,IAAA,OAAO,EAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,YAAA,EAAc,EAAE,YAAA,EAAa;AAAA,EAC9D;AAIA,EAAA,MAAM,QAAA,GAAW,IAAIF,SAAAA,EAAK;AAG1B,EAAA,QAAA,CAAS,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAW;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AACzC,MAAA,MAAM,cAAA,GAAiB,mBAAmB,UAAU,CAAA;AAEpD,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,2BAA2B,UAAU,CAAA,CAAA,IAAM,GAAG,CAAA;AAAA,MACvE;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,EAAE,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,QAAA,EAAU,UAAU,CAAA;AAEzD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,mBAAmB,UAAU,CAAA,kCAAA;AAAA,WACnC,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,CAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,aAAa,aAAA,EAAc;AACzC,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,EAAG,UAAU,CAAA;AAGhD,MAAAS,gBAAAA,CAAU,CAAA,EAAG,iBAAA,EAAmB,KAAA,EAAO;AAAA,QACrC,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,KAAA;AAAA;AAAA,QACV,MAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,MAAM,eAAe,YAAA,CAAa,iBAAA;AAAA,QAChC,cAAA;AAAA,QACA,KAAA,CAAM,QAAA;AAAA,QACN,WAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,CAAA,CAAE,SAAS,YAAY,CAAA;AAAA,IAChC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,+BAAA,IAAmC,GAAG,CAAA;AAAA,IAC/D;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,GAAA,CAAI,qBAAA,EAAuB,OAAO,CAAA,KAAW;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AACzC,MAAA,MAAM,cAAA,GAAiB,mBAAmB,UAAU,CAAA;AAEpD,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,OAAO,CAAA,CAAE,SAAS,0CAA0C,CAAA;AAAA,MAC9D;AAGA,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AACtC,MAAA,MAAM,WAAA,GAAcE,gBAAA,CAAU,CAAA,EAAG,iBAAiB,CAAA;AAElD,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,WAAA,IAAe,eAAe,WAAA,EAAa;AAC7D,QAAA,OAAO,CAAA,CAAE,SAAS,0DAA0D,CAAA;AAAA,MAC9E;AAGA,MAAAF,gBAAAA,CAAU,CAAA,EAAG,iBAAA,EAAmB,EAAA,EAAI;AAAA,QAClC,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,CAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAGD,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AACtC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,mBAAmB,CAAA,IAAK,UAAA;AACtD,QAAA,OAAO,EAAE,QAAA,CAAS,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,MACxE;AAEA,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAC/B,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,CAAA,CAAE,SAAS,kDAAkD,CAAA;AAAA,MACtE;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,EAAE,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,QAAA,EAAU,UAAU,CAAA;AAEzD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,CAAA,CAAE,SAAS,iDAAiD,CAAA;AAAA,MACrE;AAEA,MAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,CAAA;AACxC,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,EAAG,UAAU,CAAA;AAGhD,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,YAAA;AAAA,QAChC,cAAA;AAAA,QACA,KAAA,CAAM,QAAA;AAAA,QACN,KAAA,CAAM,YAAA;AAAA,QACN,IAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,UAAU,MAAM,YAAA,CAAa,gBAAA,CAAiB,cAAA,EAAgB,OAAO,YAAY,CAAA;AAEvF,MAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,QAAA,OAAO,CAAA,CAAE,SAAS,+HAA+H,CAAA;AAAA,MACnJ;AAEA,MAAA,MAAM,cAAA,GAAiB,OAAO,UAAA,GAC1B,IAAA,CAAK,KAAI,GAAK,MAAA,CAAO,aAAa,GAAA,GAClC,IAAA;AAGJ,MAAA,MAAM,gBAAgB,MAAM,YAAA,CAAa,gBAAA,CAAiB,UAAA,EAAY,QAAQ,iBAAiB,CAAA;AAE/F,MAAA,IAAI,aAAA,EAAe;AAEjB,QAAA,MAAM,YAAA,CAAa,iBAAA;AAAA,UACjB,aAAA,CAAc,EAAA;AAAA,UACd,MAAA,CAAO,YAAA;AAAA,UACP,MAAA,CAAO,aAAA;AAAA,UACP,cAAA,IAAkB,KAAA;AAAA,SACpB;AAGA,QAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA;AAAA,UACpB;AAAA,SACF,CAAE,IAAA,CAAK,aAAA,CAAc,OAAO,EAAE,KAAA,EAAM;AAEpC,QAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,SAAA,EAAW;AAC5B,UAAA,OAAO,CAAA,CAAE,SAAS,0CAA0C,CAAA;AAAA,QAC9D;AAEA,QAAA,MAAMG,YAAW,MAAML,2CAAA,CAA2B,EAAE,GAAA,CAAY,EAAA,EAAI,EAAE,GAAU,CAAA;AAChF,QAAA,MAAMM,IAAAA,GAAM,MAAML,6BAAA,CAAY,aAAA;AAAA,UAC5B,IAAA,CAAK,EAAA;AAAA,UAAI,IAAA,CAAK,KAAA;AAAA,UAAO,IAAA,CAAK,IAAA;AAAA,UACzB,EAAE,GAAA,CAAY,UAAA;AAAA,UAAYI;AAAA,SAC7B;AAEA,QAAAJ,6BAAA,CAAY,aAAA,CAAc,GAAGK,IAAAA,EAAK,EAAE,UAAU,KAAA,EAAO,MAAA,EAAQD,WAAU,CAAA;AACvE,QAAA,OAAO,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,MAC5B;AAGA,MAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,eAAA,CAAgB,QAAQ,KAAK,CAAA;AAErE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,IAAI,CAAC,aAAa,SAAA,EAAW;AAC3B,UAAA,OAAO,CAAA,CAAE,SAAS,0CAA0C,CAAA;AAAA,QAC9D;AAGA,QAAA,MAAM,aAAa,kBAAA,CAAmB;AAAA,UACpC,QAAQ,YAAA,CAAa,EAAA;AAAA,UACrB,QAAA,EAAU,UAAA;AAAA,UACV,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,UAC3B,aAAa,MAAA,CAAO,YAAA;AAAA,UACpB,cAAc,MAAA,CAAO,aAAA;AAAA,UACrB,gBAAgB,cAAA,IAAkB,KAAA,CAAA;AAAA,UAClC,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,SACpC,CAAA;AAED,QAAA,MAAMA,YAAW,MAAML,2CAAA,CAA2B,EAAE,GAAA,CAAY,EAAA,EAAI,EAAE,GAAU,CAAA;AAChF,QAAA,MAAMM,IAAAA,GAAM,MAAML,6BAAA,CAAY,aAAA;AAAA,UAC5B,YAAA,CAAa,EAAA;AAAA,UAAI,YAAA,CAAa,KAAA;AAAA,UAAO,YAAA,CAAa,IAAA;AAAA,UACjD,EAAE,GAAA,CAAY,UAAA;AAAA,UAAYI;AAAA,SAC7B;AAEA,QAAAJ,6BAAA,CAAY,aAAA,CAAc,GAAGK,IAAAA,EAAK,EAAE,UAAU,KAAA,EAAO,MAAA,EAAQD,WAAU,CAAA;AACvE,QAAA,OAAO,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,MAC5B;AAGA,MAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,mBAAA,CAAoB,OAAO,CAAA;AAEhE,MAAA,MAAM,aAAa,kBAAA,CAAmB;AAAA,QACpC,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,UAAA;AAAA,QACV,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,QAC3B,aAAa,MAAA,CAAO,YAAA;AAAA,QACpB,cAAc,MAAA,CAAO,aAAA;AAAA,QACrB,gBAAgB,cAAA,IAAkB,KAAA,CAAA;AAAA,QAClC,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OACpC,CAAA;AAED,MAAA,MAAM,WAAW,MAAML,2CAAA,CAA2B,EAAE,GAAA,CAAY,EAAA,EAAI,EAAE,GAAU,CAAA;AAChF,MAAA,MAAM,GAAA,GAAM,MAAMC,6BAAA,CAAY,aAAA;AAAA,QAC5B,SAAA;AAAA,QAAW,OAAA,CAAQ,MAAM,WAAA,EAAY;AAAA,QAAG,QAAA;AAAA,QACvC,EAAE,GAAA,CAAY,UAAA;AAAA,QAAY;AAAA,OAC7B;AAEA,MAAAA,6BAAA,CAAY,aAAA,CAAc,GAAG,GAAA,EAAK,EAAE,UAAU,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AACvE,MAAA,OAAO,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,IAE5B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,6BAAA;AACzD,MAAA,OAAO,EAAE,QAAA,CAAS,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IACtE;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA,KAAW;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAC9C,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kBAAA,IAAsB,GAAG,CAAA;AAAA,MAClD;AAIA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,EAAE,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,QAAA,EAAU,QAAQ,CAAA;AAEvD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,mBAAmB,QAAQ,CAAA,mBAAA,CAAA,IAAyB,GAAG,CAAA;AAAA,MAChF;AAEA,MAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,CAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,aAAa,aAAA,EAAc;AACzC,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,EAAG,QAAQ,CAAA;AAE9C,MAAAC,gBAAAA,CAAU,CAAA,EAAG,iBAAA,EAAmB,KAAA,EAAO;AAAA,QACrC,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,oBAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,MAAM,eAAe,YAAA,CAAa,iBAAA;AAAA,QAChC,mBAAmB,QAAQ,CAAA;AAAA,QAC3B,KAAA,CAAM,QAAA;AAAA,QACN,WAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,WAAA,EAAa,cAAc,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oCAAA,IAAwC,GAAG,CAAA;AAAA,IACpE;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA,KAAW;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,MACtD;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,CAAA;AACxC,MAAA,MAAM,UAAU,MAAM,YAAA,CAAa,kBAAA,CAAmB,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAE3E,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,OAAO,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAA,iBAAA,CAAA,EAAqB,CAAA;AAAA,IAC1E,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,0BAAA,IAA8B,GAAG,CAAA;AAAA,IAC1D;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAW;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,CAAA;AACxC,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,qBAAA,CAAsB,KAAK,MAAM,CAAA;AAErE,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,UAC3B,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,mBAAmB,CAAA,CAAE,mBAAA;AAAA,UACrB,UAAU,CAAA,CAAE;AAAA,SACd,CAAE;AAAA,OACH,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,iCAAA,IAAqC,GAAG,CAAA;AAAA,IACjE;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,eAAe,QAAA,EAAU;AAAA,IACxC,WAAA,EAAa,+BAAA;AAAA,IACb,YAAA,EAAc,KAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,WAAA,CAAY,mBAAmB,gCAAA,EAAkC;AAAA,IACvE,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa,CAAC,cAAc;AAAA,GAC7B,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,UAAU,YAAY;AACpB,MAAA,OAAA,CAAQ,KAAK,yCAAoC,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,OAAA,CAAQ,KAAK,2CAAsC,CAAA;AAAA,IACrD;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAEO,IAAM,uBAAuB,0BAAA;;;ACla7B,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,EAAA,EAAS;AAAT,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAU;AAAA;AAAA;AAAA;AAAA,EAK9B,MAAM,kBAAkB,IAAA,EAAiC;AACvD,IAAA,IAAI;AAGF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,2BAAA,EAA6B;AAAA,QAC9D,IAAA,EAAM,IAAA,CAAK,cAAA,CAAe,IAAI;AAAA,OAC/B,CAAA;AAGD,MAAA,IAAI,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7C,QAAA,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,MACxB;AAEA,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kDAAkD,KAAK,CAAA;AACrE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,KAAA,EAAsC;AACxD,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,EAAA;AAClB,MAAA,MAAM,UAAsB,EAAC;AAE7B,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,SAAA,EAAW;AAChD,QAAA,OAAA,CAAQ,KAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,SAAS,CAAC,CAAA;AAAA,MAC5C;AAEA,MAAA,MAAM,gBAA4B,EAAC;AAEnC,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,eAAA,GAAkB,MAAM,OAAA,CAAQ,GAAA;AAAA,UACpC,MAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAC;AAAA,SAChD;AACA,QAAA,aAAA,CAAc,IAAA,CAAK,GAAG,eAAe,CAAA;AAAA,MACvC;AAEA,MAAA,OAAO,aAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yDAAyD,KAAK,CAAA;AAC5E,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,eAAe,IAAA,EAAsB;AAC3C,IAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAGlB,IAAA,IAAI,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAG/C,IAAA,IAAI,SAAA,CAAU,SAAS,GAAA,EAAM;AAC3B,MAAA,SAAA,GAAY,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,GAAI,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAiB,GAAa,CAAA,EAAqB;AACjD,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ;AACzB,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AACrB,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AACrB,MAAA,UAAA,IAAc,IAAA,GAAO,IAAA;AACrB,MAAA,KAAA,IAAS,IAAA,GAAO,IAAA;AAChB,MAAA,KAAA,IAAS,IAAA,GAAO,IAAA;AAAA,IAClB;AAEA,IAAA,OAAO,cAAc,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAK,KAAK,CAAA,CAAA;AAAA,EACzD;AACF,CAAA;;;ACvFO,IAAM,kBAAN,MAAsB;AAAA;AAAA,EAEV,UAAA,GAAa,GAAA;AAAA,EACb,aAAA,GAAgB,EAAA;AAAA;AAAA;AAAA;AAAA,EAKjC,aACE,SAAA,EACA,YAAA,EACA,OACA,IAAA,EACA,QAAA,GAAgC,EAAC,EACjB;AAEhB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAElC,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACrC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4CAAA,EAA+C,SAAS,CAAA,CAAE,CAAA;AACvE,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAG5C,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,EAAW,KAAA,MAAW;AAAA,MAC3C,EAAA,EAAI,CAAA,EAAG,SAAS,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,MAC/B,UAAA,EAAY,SAAA;AAAA,MACZ,aAAA,EAAe,YAAA;AAAA,MACf,KAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,KAAA;AAAA,MACb,QAAA,EAAU;AAAA,QACR,GAAG,QAAA;AAAA,QACH,cAAc,UAAA,CAAW;AAAA;AAC3B,KACF,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,KAAA,EAME;AAClB,IAAA,MAAM,YAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,SAAS,IAAA,CAAK,YAAA;AAAA,QAClB,IAAA,CAAK,EAAA;AAAA,QACL,IAAA,CAAK,aAAA;AAAA,QACL,IAAA,CAAK,KAAA;AAAA,QACL,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AACA,MAAA,SAAA,CAAU,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,IAAA,EAAmB;AACrC,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,IAAI,KAAK,KAAA,EAAO,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAC7C,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,KAAK,WAAA,EAAa,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AACzD,IAAA,IAAI,KAAK,OAAA,EAAS,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AACjD,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,KAAK,OAAA,EAAS,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAGjD,IAAA,MAAM,gBAAA,GAAmB,CAAC,GAAA,KAAmB;AAC3C,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAE3B,QAAA,IAAI,IAAI,MAAA,GAAS,EAAA,IAAM,CAAC,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC9C,UAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,QAChB;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC7B,QAAA,GAAA,CAAI,QAAQ,gBAAgB,CAAA;AAAA,MAC9B,CAAA,MAAA,IAAW,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAEzC,QAAA,MAAM,WAAW,CAAC,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,aAAa,UAAU,CAAA;AAEvE,QAAA,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC5C,UAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,CAAA,EAAG;AACzC,YAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,UACxB;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,gBAAA,CAAiB,IAAI,CAAA;AAErB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,EAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,IAAA,EAAwB;AAE9C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAE9B,IAAA,IAAI,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,UAAA,EAAY;AACnC,MAAA,OAAO,CAAC,IAAI,CAAA;AAAA,IACd;AAEA,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,OAAO,UAAA,GAAa,MAAM,MAAA,EAAQ;AAEhC,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,aAAa,IAAA,CAAK,UAAA,EAAY,MAAM,MAAM,CAAA;AACpE,MAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,YAAY,QAAQ,CAAA,CAAE,KAAK,GAAG,CAAA;AACxD,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAGjB,MAAA,UAAA,IAAc,IAAA,CAAK,aAAa,IAAA,CAAK,aAAA;AAGrC,MAAA,IAAI,UAAA,IAAc,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,aAAA,EAAe;AACnD,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,WAAA,EAA6B;AAC/C,IAAA,QAAQ,WAAA;AAAa,MACnB,KAAK,YAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,OAAO,GAAA;AAAA;AAAA,MACT,KAAK,UAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,OAAO,GAAA;AAAA;AAAA,MACT,KAAK,UAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,OAAO,GAAA;AAAA;AAAA,MACT;AACE,QAAA,OAAO,IAAA,CAAK,UAAA;AAAA;AAChB,EACF;AACF,CAAA;;;ACjKO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,WAAA,CACU,EAAA,EACA,EAAA,EACA,SAAA,EACR;AAHQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAER,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAAA,EAC7C;AAAA,EAVQ,gBAAA;AAAA,EACA,eAAA;AAAA;AAAA;AAAA;AAAA,EAcR,MAAM,gBAAgB,YAAA,EAKnB;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8CAAA,EAAiD,YAAY,CAAA,CAAE,CAAA;AAE3E,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,OAAA,EAAS,YAAA,KAAiB,MAAM,IAAA,CAAK,GAC1C,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAOR,CAAA,CACA,IAAA,CAAK,YAAY,CAAA,CACjB,GAAA,EAWE;AAEL,MAAA,MAAM,UAAA,GAAa,cAAc,MAAA,IAAU,CAAA;AAE3C,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2CAAA,EAA8C,YAAY,CAAA,CAAE,CAAA;AACxE,QAAA,OAAO,EAAE,aAAa,CAAA,EAAG,YAAA,EAAc,GAAG,cAAA,EAAgB,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,MACzE;AAGA,MAAA,MAAM,KAAA,GAAA,CAAS,YAAA,IAAgB,EAAC,EAAG,IAAI,CAAA,IAAA,MAAS;AAAA,QAC9C,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,KAAA,EAAO,KAAK,KAAA,IAAS,UAAA;AAAA,QACrB,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA;AAAA,QACnE,QAAA,EAAU;AAAA,UACR,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,yBAAyB,IAAA,CAAK;AAAA;AAChC,OACF,CAAE,CAAA;AAEF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,iBAAA,CAAkB,KAAK,CAAA;AAC3D,MAAA,MAAM,cAAc,MAAA,CAAO,MAAA;AAE3B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,WAAW,CAAA,aAAA,EAAgB,UAAU,CAAA,MAAA,CAAQ,CAAA;AAGlF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA,CAAiB,aAAA;AAAA,QAC7C,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,EAAE,KAAK;;AAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAE;AAAA,OAC3C;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,UAAA,CAAW,MAAM,CAAA,WAAA,CAAa,CAAA;AAGnE,MAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,MAAM,SAAA,GAAY,GAAA;AAElB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,SAAA,EAAW;AACjD,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AAChD,QAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AAExD,QAAA,IAAI;AACF,UAAA,MAAM,KAAK,SAAA,CAAU,MAAA;AAAA,YACnB,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,MAAS;AAAA,cAC9B,IAAI,KAAA,CAAM,EAAA;AAAA,cACV,MAAA,EAAQ,eAAe,GAAG,CAAA;AAAA,cAC1B,QAAA,EAAU;AAAA,gBACR,YAAY,KAAA,CAAM,UAAA;AAAA,gBAClB,eAAe,KAAA,CAAM,aAAA;AAAA,gBACrB,OAAO,KAAA,CAAM,KAAA;AAAA,gBACb,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA;AAAA,gBACjC,aAAa,KAAA,CAAM,WAAA;AAAA,gBACnB,GAAG,KAAA,CAAM;AAAA;AACX,aACF,CAAE;AAAA,WACJ;AAEA,UAAA,aAAA,IAAiB,UAAA,CAAW,MAAA;AAC5B,UAAA,OAAA,CAAQ,GAAA,CAAI,6BAA6B,CAAA,GAAI,SAAA,GAAY,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,QAC3F,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,MAAM,CAAA,iCAAA,EAAoC,CAAA,GAAI,SAAA,GAAY,CAAC,KAAK,KAAK,CAAA;AAC7E,UAAA,MAAA,IAAU,UAAA,CAAW,MAAA;AAAA,QACvB;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,aAAa,CAAA,CAAA,EAAI,WAAW,CAAA,eAAA,CAAiB,CAAA;AAE3F,MAAA,OAAO;AAAA,QACL,WAAA,EAAa,UAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd,cAAA,EAAgB,aAAA;AAAA,QAChB;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC7E,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,KAAA,EAAoB,QAAA,EAAqD;AACpF,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AAGzD,MAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,iBAAA,CAAkB,MAAM,KAAK,CAAA;AAGhF,MAAA,MAAM,SAAc,EAAC;AAErB,MAAA,IAAI,MAAM,OAAA,EAAS,WAAA,IAAe,MAAM,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AACtE,QAAA,MAAA,CAAO,aAAA,GAAgB,EAAE,GAAA,EAAK,KAAA,CAAM,QAAQ,WAAA,EAAY;AAAA,MAC1D,CAAA,MAAA,IAAW,QAAA,CAAS,oBAAA,CAAqB,MAAA,GAAS,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,aAAA,GAAgB,EAAE,GAAA,EAAK,QAAA,CAAS,oBAAA,EAAqB;AAAA,MAC9D;AAEA,MAAA,IAAI,MAAM,OAAA,EAAS,MAAA,IAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5D,QAAA,MAAA,CAAO,MAAA,GAAS,EAAE,GAAA,EAAK,KAAA,CAAM,QAAQ,MAAA,EAAO;AAAA,MAC9C;AAGA,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,cAAA,EAAgB;AAAA,QAC/D,IAAA,EAAM,EAAA;AAAA;AAAA,QACN,cAAA,EAAgB;AAAA,OACjB,CAAA;AAGD,MAAA,IAAI,eAAA,GAAkB,aAAA,CAAc,OAAA,IAAW,EAAC;AAChD,MAAA,IAAI,MAAA,CAAO,eAAe,GAAA,IAAO,KAAA,CAAM,QAAQ,MAAA,CAAO,aAAA,CAAc,GAAG,CAAA,EAAG;AACxE,QAAA,MAAM,kBAAA,GAAqB,OAAO,aAAA,CAAc,GAAA;AAChD,QAAA,eAAA,GAAkB,eAAA,CAAgB,MAAA;AAAA,UAAO,CAAC,KAAA,KACxC,kBAAA,CAAmB,QAAA,CAAS,KAAA,CAAM,UAAU,aAAa;AAAA,SAC3D;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,QAAQ,GAAA,IAAO,KAAA,CAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,EAAG;AAC1D,QAAA,MAAM,eAAA,GAAkB,OAAO,MAAA,CAAO,GAAA;AACtC,QAAA,eAAA,GAAkB,eAAA,CAAgB,MAAA;AAAA,UAAO,CAAC,KAAA,KACxC,eAAA,CAAgB,QAAA,CAAS,KAAA,CAAM,UAAU,MAAM;AAAA,SACjD;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,IAAS,QAAA,CAAS,aAAA,IAAiB,EAAA;AACtD,MAAA,eAAA,GAAkB,eAAA,CAAgB,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAG/C,MAAA,aAAA,CAAc,OAAA,GAAU,eAAA;AAExB,MAAA,IAAI,CAAC,aAAA,CAAc,OAAA,IAAW,aAAA,CAAc,OAAA,CAAQ,WAAW,CAAA,EAAG;AAChE,QAAA,OAAO;AAAA,UACL,SAAS,EAAC;AAAA,UACV,KAAA,EAAO,CAAA;AAAA,UACP,aAAA,EAAe,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,UAC5B,IAAA,EAAM;AAAA,SACR;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,IAAI,GAAA;AAAA,QACzB,cAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,SAAS,UAAU;AAAA,OAC5D,CAAA;AAGD,MAAA,MAAM,eAAe,UAAA,CAAW,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AACvD,MAAA,MAAM,EAAE,OAAA,EAAS,YAAA,KAAiB,MAAM,IAAA,CAAK,GAC1C,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAMU,YAAY,CAAA;AAAA,QAAA,CAC9B,CAAA,CACA,IAAA,CAAK,GAAG,UAAU,EAClB,GAAA,EAUE;AAGL,MAAA,MAAM,aAAA,GAAA,CAAiC,YAAA,IAAgB,EAAC,EAAG,IAAI,CAAA,IAAA,KAAQ;AAErE,QAAA,MAAM,cAAA,GAAiB,cAAc,OAAA,CAAQ,MAAA;AAAA,UAC3C,CAAC,CAAA,KAAW,CAAA,CAAE,QAAA,CAAS,eAAe,IAAA,CAAK;AAAA,SAC7C;AAEA,QAAA,MAAM,YAAY,cAAA,CAAe,MAAA;AAAA,UAAO,CAAC,MAAW,OAAA,KAClD,OAAA,CAAQ,SAAS,IAAA,EAAM,KAAA,IAAS,KAAK,OAAA,GAAU,IAAA;AAAA,UAC/C;AAAA,SAAI;AAEN,QAAA,OAAO;AAAA,UACL,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,KAAA,EAAO,KAAK,KAAA,IAAS,UAAA;AAAA,UACrB,IAAA,EAAM,KAAK,IAAA,IAAQ,EAAA;AAAA,UACnB,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,IAAA,IAAQ,EAAA;AAAA,UACtC,eAAA,EAAiB,WAAW,KAAA,IAAS,CAAA;AAAA,UACrC,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,YAAY,IAAA,CAAK;AAAA,SACnB;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,eAAA,IAAmB,CAAA,KAAM,CAAA,CAAE,eAAA,IAAmB,CAAA,CAAE,CAAA;AAEhF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC/B,MAAA,OAAA,CAAQ,IAAI,CAAA,gCAAA,EAAmC,SAAS,CAAA,IAAA,EAAO,aAAA,CAAc,MAAM,CAAA,QAAA,CAAU,CAAA;AAE7F,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,aAAA;AAAA,QACT,OAAO,aAAA,CAAc,MAAA;AAAA,QACrB,aAAA,EAAe,SAAA;AAAA,QACf,IAAA,EAAM;AAAA,OACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAAA,EAAkC;AACzD,IAAA,IAAI;AAEF,MAAA,MAAMK,QAAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CACxB,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAOR,CAAA,CACA,IAAA,CAAK,SAAS,CAAA,CACd,KAAA,EAWE;AAEL,MAAA,IAAI,CAACA,QAAAA,EAAS;AACZ,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,SAAS,CAAA,UAAA,CAAY,CAAA;AACzD,QAAA;AAAA,MACF;AAGA,MAAA,IAAIA,QAAAA,CAAQ,WAAW,WAAA,EAAa;AAClC,QAAA,MAAM,IAAA,CAAK,uBAAuB,SAAS,CAAA;AAC3C,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAAS,KAAK,eAAA,CAAgB,YAAA;AAAA,QAClCA,QAAAA,CAAQ,EAAA;AAAA,QACRA,QAAAA,CAAQ,aAAA;AAAA,QACRA,SAAQ,KAAA,IAAS,UAAA;AAAA,QACjB,OAAOA,SAAQ,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAMA,QAAAA,CAAQ,IAAI,CAAA,GAAIA,QAAAA,CAAQ,IAAA;AAAA,QACtE;AAAA,UACE,QAAQA,QAAAA,CAAQ,MAAA;AAAA,UAChB,YAAYA,QAAAA,CAAQ,UAAA;AAAA,UACpB,YAAYA,QAAAA,CAAQ,UAAA;AAAA,UACpB,WAAWA,QAAAA,CAAQ,SAAA;AAAA,UACnB,iBAAiBA,QAAAA,CAAQ,eAAA;AAAA,UACzB,yBAAyBA,QAAAA,CAAQ;AAAA;AACnC,OACF;AAGA,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA,CAAiB,aAAA;AAAA,QAC7C,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,EAAE,KAAK;;AAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAE;AAAA,OAC3C;AAGA,MAAA,MAAM,KAAK,SAAA,CAAU,MAAA;AAAA,QACnB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,MAAS;AAAA,UAC1B,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,MAAA,EAAQ,WAAW,GAAG,CAAA;AAAA,UACtB,QAAA,EAAU;AAAA,YACR,YAAY,KAAA,CAAM,UAAA;AAAA,YAClB,eAAe,KAAA,CAAM,aAAA;AAAA,YACrB,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA,YACjC,aAAa,KAAA,CAAM,WAAA;AAAA,YACnB,GAAG,KAAA,CAAM;AAAA;AACX,SACF,CAAE;AAAA,OACJ;AAEA,MAAA,OAAA,CAAQ,IAAI,CAAA,sCAAA,EAAyC,SAAS,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,IAC3F,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qCAAA,EAAwC,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACzE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,SAAA,EAAkC;AAC7D,IAAA,IAAI;AAKF,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,SAAS,CAAA,WAAA,CAAa,CAAA;AAAA,IAMpE,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mCAAA,EAAsC,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACvE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,YAAA,EAAsB,KAAA,GAAgB,CAAA,EAAsB;AAC/E,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,kBAAkB,YAAY,CAAA;AAGjF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,cAAA,EAAgB;AAAA,QACzD,MAAM,KAAA,GAAQ,CAAA;AAAA;AAAA,QACd,cAAA,EAAgB;AAAA,OACjB,CAAA;AAGD,MAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAI,GAAA;AAAA,QAC1B,OAAA,CAAQ,OAAA,EAAS,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,IAAK;AAAC,OACxE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAEjB,MAAA,OAAO,WAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAC7D,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,CAAC,IAAA,CAAK,EAAA;AAAA,EACpC;AACF,CAAA;;;AChZO,IAAM,kBAAN,MAAsB;AAAA,EAG3B,WAAA,CACU,EAAA,EACA,EAAA,EACA,SAAA,EACR;AAHQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAGR,IAAA,IAAI,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,SAAA,EAAW;AAC7B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB,EAAA,EAAI,IAAI,SAAS,CAAA;AACvD,MAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,uEAAuE,CAAA;AAAA,IACrF;AAAA,EACF;AAAA,EAdQ,SAAA;AAAA;AAAA;AAAA;AAAA,EAmBR,MAAM,WAAA,GAAgD;AACpD,IAAA,IAAI;AACF,MAAA,MAAMX,OAAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CACvB,OAAA,CAAQ,mDAAmD,CAAA,CAC3D,IAAA,CAAK,WAAW,CAAA,CAChB,KAAA,EAAmC;AAEtC,MAAA,IAAI,CAACA,OAAAA,IAAU,CAACA,OAAAA,CAAO,QAAA,EAAU;AAC/B,QAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,MACjC;AAEA,MAAA,OAAO,IAAA,CAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,MAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAAuC;AACrC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,eAAA,EAAiB,IAAA;AAAA,MACjB,sBAAsB,EAAC;AAAA,MACvB,uBAAuB,EAAC;AAAA,MACxB,oBAAA,EAAsB,IAAA;AAAA,MACtB,cAAA,EAAgB,CAAA;AAAA,MAChB,aAAA,EAAe,EAAA;AAAA,MACf,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,QAAA,EAAgE;AACnF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,GAAG,QAAA;AAAA,MACH,GAAG;AAAA,KACL;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAK,GACR,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAKR,EACA,IAAA,CAAK,IAAA,CAAK,UAAU,OAAO,CAAC,EAC5B,GAAA,EAAI;AAEP,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAA6D;AACjE,IAAA,IAAI;AAGF,MAAA,MAAM,eAAA,GAAkB,KAAK,EAAA,CAAG,OAAA;AAAA,QAC9B;AAAA,OACF;AACA,MAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,MAAM,gBAAgB,GAAA,EAKvD;AAGC,MAAA,MAAMY,YAAAA,GAAAA,CAAe,cAAA,IAAkB,EAAC,EAAG,MAAA;AAAA,QACzC,CAAC,GAAA,KAAQ;AACP,UAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAM,OAAO,KAAA;AACtB,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,WAAA,EAAY;AAClC,UAAA,OAAO,CAAC,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,IACxB,CAAC,KAAK,QAAA,CAAS,OAAO,KACtB,IAAA,KAAS,iBAAA,IACT,CAAC,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IACvB,IAAA,KAAS,wBACT,IAAA,KAAS,iBAAA;AAAA,QAClB;AAAA,OACF;AAGJ,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,MAAA,MAAM,QAAA,GAAW,QAAA,EAAU,oBAAA,IAAwB,EAAC;AACpD,MAAA,MAAM,SAAA,GAAY,QAAA,EAAU,qBAAA,IAAyB,EAAC;AAGtD,MAAA,MAAM,gBAA6C,EAAC;AAEpD,MAAA,KAAA,MAAW,UAAA,IAAcA,YAAAA,IAAe,EAAC,EAAG;AAC1C,QAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA;AAGzC,QAAA,IAAI,SAAS,QAAA,CAAS,YAAY,KAAK,SAAA,CAAU,QAAA,CAAS,YAAY,CAAA,EAAG;AACvE,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,SAAA,GAAY,KAAK,EAAA,CAAG,OAAA;AAAA,UACxB;AAAA,SACF;AACA,QAAA,MAAM,cAAc,MAAM,SAAA,CAAU,IAAA,CAAK,YAAY,EAAE,KAAA,EAAyB;AAChF,QAAA,MAAM,SAAA,GAAY,aAAa,KAAA,IAAS,CAAA;AAExC,QAAA,aAAA,CAAc,IAAA,CAAK;AAAA,UACjB,UAAA,EAAY;AAAA,YACV,EAAA,EAAI,YAAA;AAAA,YACJ,MAAM,UAAA,CAAW,IAAA;AAAA,YACjB,cAAc,UAAA,CAAW,YAAA;AAAA,YACzB,aAAa,UAAA,CAAW,WAAA;AAAA,YACxB,UAAA,EAAY,SAAA;AAAA,YACZ,UAAA,EAAY,KAAA;AAAA,YACZ,YAAA,EAAc,KAAA;AAAA,YACd,MAAA,EAAQ;AAAA,WACV;AAAA,UACA,OAAA,EAAS,CAAA,gBAAA,EAAmB,UAAA,CAAW,YAAY,UAAU,SAAS,CAAA,6BAAA;AAAA,SACvE,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,aAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,GAA+C;AACnD,IAAA,IAAI;AAEF,MAAA,MAAM,eAAA,GAAkB,KAAK,EAAA,CAAG,OAAA;AAAA,QAC9B;AAAA,OACF;AACA,MAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,MAAM,gBAAgB,GAAA,EAKvD;AAEH,MAAA,OAAA,CAAQ,GAAA,CAAI,8DAAA,EAAgE,cAAA,EAAgB,MAAA,IAAU,CAAC,CAAA;AACvG,MAAA,MAAM,eAAA,GAAkB,iBAAiB,CAAC,CAAA;AAC1C,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,OAAA,CAAQ,IAAI,wDAAA,EAA0D;AAAA,UACpE,IAAI,eAAA,CAAgB,EAAA;AAAA,UACpB,MAAM,eAAA,CAAgB,IAAA;AAAA,UACtB,cAAc,eAAA,CAAgB;AAAA,SAC/B,CAAA;AAAA,MACH;AAGA,MAAA,MAAMA,YAAAA,GAAAA,CAAe,cAAA,IAAkB,EAAC,EAAG,MAAA;AAAA,QACzC,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI;AAAA,OACzB;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,uEAAA,EAAyEA,YAAAA,CAAY,MAAM,CAAA;AACvG,MAAA,OAAA,CAAQ,GAAA,CAAI,4DAAA,EAA8DA,YAAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAGjH,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,MAAA,MAAM,QAAA,GAAW,QAAA,EAAU,oBAAA,IAAwB,EAAC;AACpD,MAAA,MAAM,SAAA,GAAY,QAAA,EAAU,qBAAA,IAAyB,EAAC;AAEtD,MAAA,OAAA,CAAQ,IAAI,+CAAA,EAAiD;AAAA,QAC3D,gBAAgB,QAAA,CAAS,MAAA;AAAA,QACzB,iBAAiB,SAAA,CAAU,MAAA;AAAA,QAC3B;AAAA,OACD,CAAA;AAGD,MAAA,MAAM,kBAAoC,EAAC;AAE3C,MAAA,KAAA,MAAW,cAAcA,YAAAA,EAAa;AACpC,QAAA,IAAI,CAAC,UAAA,CAAW,EAAA,IAAM,CAAC,WAAW,IAAA,EAAM;AACxC,QAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA;AAEzC,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,OAAA,CAAQ,IAAA,CAAK,kDAAkD,UAAU,CAAA;AACzE,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,SAAA,GAAY,KAAK,EAAA,CAAG,OAAA;AAAA,UACxB;AAAA,SACF;AACA,QAAA,MAAM,cAAc,MAAM,SAAA,CAAU,IAAA,CAAK,YAAY,EAAE,KAAA,EAAyB;AAChF,QAAA,MAAM,SAAA,GAAY,aAAa,KAAA,IAAS,CAAA;AAExC,QAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,UACnB,EAAA,EAAI,YAAA;AAAA,UACJ,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,YAAA,EAAc,UAAA,CAAW,YAAA,IAAgB,UAAA,CAAW,IAAA;AAAA,UACpD,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,UAAA,EAAY,SAAA;AAAA,UACZ,UAAA,EAAY,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA;AAAA,UAC1C,YAAA,EAAc,SAAA,CAAU,QAAA,CAAS,YAAY,CAAA;AAAA,UAC7C,MAAA,EAAQ,CAAC,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,IAAK,CAAC,SAAA,CAAU,QAAA,CAAS,YAAY;AAAA,SAC7E,CAAA;AAAA,MACH;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,gEAAA,EAAkE,eAAA,CAAgB,MAAM,CAAA;AACpG,MAAA,MAAM,SAAA,GAAY,gBAAgB,CAAC,CAAA;AACnC,MAAA,IAAI,eAAA,CAAgB,MAAA,GAAS,CAAA,IAAK,SAAA,EAAW;AAC3C,QAAA,OAAA,CAAQ,IAAI,2DAAA,EAA6D;AAAA,UACvE,IAAI,SAAA,CAAU,EAAA;AAAA,UACd,MAAM,SAAA,CAAU,IAAA;AAAA,UAChB,cAAc,SAAA,CAAU,YAAA;AAAA,UACxB,YAAY,SAAA,CAAU;AAAA,SACvB,CAAA;AAAA,MACH;AACA,MAAA,OAAO,eAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,KAAK,CAAA;AACpE,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,KAAA,EAA6C;AAExD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AAExC,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,MAAA,OAAO;AAAA,QACL,SAAS,EAAC;AAAA,QACV,KAAA,EAAO,CAAA;AAAA,QACP,aAAA,EAAe,CAAA;AAAA,QACf,MAAM,KAAA,CAAM;AAAA,OACd;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,SAAS,IAAA,IAAQ,QAAA,CAAS,mBAAmB,IAAA,CAAK,SAAA,EAAW,aAAY,EAAG;AACpF,MAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAA;AAAA,IACtC;AAGA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QAAA,CAAS,KAAA,EAAoB,QAAA,EAAqD;AAG9F,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,QAAA,OAAA,CAAQ,KAAK,2EAA2E,CAAA;AACxF,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,QAAQ,CAAA;AAAA,MAC3C;AAGA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,OAAO,QAAQ,CAAA;AAE1D,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+DAA+D,KAAK,CAAA;AAElF,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAA,CACZ,KAAA,EACA,QAAA,EACyB;AACzB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,aAAuB,EAAC;AAC9B,MAAA,MAAM,SAAgB,EAAC;AAGvB,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,UAAA,CAAW,KAAK,oDAAoD,CAAA;AACpE,QAAA,MAAM,UAAA,GAAa,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAA,CAAA,CAAA;AAClC,QAAA,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,UAAA,EAAY,UAAU,CAAA;AAAA,MAChD;AAGA,MAAA,IAAI,MAAM,OAAA,EAAS,WAAA,IAAe,MAAM,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AACtE,QAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,WAAA,CAAY,IAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACtE,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,oBAAA,EAAuB,YAAY,CAAA,CAAA,CAAG,CAAA;AACtD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAAA,MAC1C,CAAA,MAAA,IAAW,QAAA,CAAS,oBAAA,CAAqB,MAAA,GAAS,CAAA,EAAG;AAEnD,QAAA,MAAM,YAAA,GAAe,SAAS,oBAAA,CAAqB,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAC1E,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,oBAAA,EAAuB,YAAY,CAAA,CAAA,CAAG,CAAA;AACtD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,QAAA,CAAS,oBAAoB,CAAA;AAAA,MAC9C;AAGA,MAAA,IAAI,MAAM,OAAA,EAAS,MAAA,IAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5D,QAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACjE,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,aAAA,EAAgB,YAAY,CAAA,CAAA,CAAG,CAAA;AAC/C,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,MACrC,CAAA,MAAO;AAEL,QAAA,UAAA,CAAW,KAAK,uBAAuB,CAAA;AAAA,MACzC;AAGA,MAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAA,IAAS,YAAA;AAC/C,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAA,EAAO;AACjC,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAA,EAAK,KAAK,CAAA,KAAA,CAAO,CAAA;AACjC,UAAA,MAAA,CAAO,KAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA;AAAA,QACrD;AACA,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,GAAA,EAAK;AAC/B,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAA,EAAK,KAAK,CAAA,KAAA,CAAO,CAAA;AACjC,UAAA,MAAA,CAAO,KAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AAAA,QACnD;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,QAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,MAClC;AAEA,MAAA,MAAM,WAAA,GAAc,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAGlF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,QAAA,EAG9B,WAAW;AAAA,MAAA,CACd,CAAA;AACD,MAAA,MAAM,cAAc,MAAM,SAAA,CAAU,KAAK,GAAG,MAAM,EAAE,KAAA,EAAyB;AAC7E,MAAA,MAAM,KAAA,GAAQ,aAAa,KAAA,IAAS,CAAA;AAGpC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,QAAA,CAAS,aAAA;AACtC,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,CAAA;AAE/B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAShC,WAAW;AAAA;AAAA;AAAA,MAAA,CAGd,CAAA;AAED,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,WAAA,CAAY,IAAA,CAAK,GAAG,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,GAAA,EAalE;AAEH,MAAA,MAAM,iBAAiC,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QAClE,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,QACjB,KAAA,EAAO,IAAI,KAAA,IAAS,UAAA;AAAA,QACpB,IAAA,EAAM,IAAI,IAAA,IAAQ,EAAA;AAAA,QAClB,aAAA,EAAe,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA;AAAA,QACvC,eAAA,EAAiB,GAAA,CAAI,uBAAA,IAA2B,GAAA,CAAI,eAAA;AAAA,QACpD,SAAS,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,MAAM,KAAK,CAAA;AAAA,QAClD,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,QACjC,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,QACjC,aAAa,GAAA,CAAI;AAAA,OACnB,CAAE,CAAA;AAEF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG/B,MAAA,MAAM,KAAK,SAAA,CAAU,KAAA,CAAM,OAAO,KAAA,CAAM,IAAA,EAAM,cAAc,MAAM,CAAA;AAElE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,aAAA;AAAA,QACT,KAAA;AAAA,QACA,aAAA,EAAe,SAAA;AAAA,QACf,MAAM,KAAA,CAAM;AAAA,OACd;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO;AAAA,QACL,SAAS,EAAC;AAAA,QACV,KAAA,EAAO,CAAA;AAAA,QACP,aAAA,EAAe,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QAC5B,MAAM,KAAA,CAAM;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CAAe,MAAc,KAAA,EAAuB;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC7D,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAM,EAAE,WAAA,EAAY;AAChD,MAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AAErC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACrC,MAAA,IAAI,UAAU,CAAA,CAAA,EAAI;AAEhB,QAAA,OAAO,KAAK,SAAA,CAAU,MAAM,EAAE,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,MACpD;AAGA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,EAAE,CAAA;AACpC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,KAAA,GAAQ,KAAA,CAAM,SAAS,EAAE,CAAA;AAC3D,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IACtC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,OAAA,EAAoC;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,MAAA,IAAI,CAAC,UAAU,oBAAA,EAAsB;AACnC,QAAA,OAAO,EAAC;AAAA,MACV;AAGA,MAAA,IAAI,IAAA,CAAK,SAAA,EAAW,WAAA,EAAY,EAAG;AACjC,QAAA,IAAI;AACF,UAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,SAAS,CAAC,CAAA;AACpE,UAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,YAAA,OAAO,aAAA;AAAA,UACT;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,mDAAmD,KAAK,CAAA;AAAA,QAExE;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAM5B,CAAA;AACD,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA,CAAE,GAAA,EAAuB;AAE3E,MAAA,OAAA,CAAQ,WAAW,EAAC,EAAG,IAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAAA,IAC3C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SAAA,CAAU,KAAA,EAAe,IAAA,EAAwB,YAAA,EAAqC;AAClG,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAG5B,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,KAAK,KAAA,EAAO,IAAA,EAAM,cAAc,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,GAAA,EAAI;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAMH;AACD,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAIjC,CAAA;AACD,MAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AACvD,MAAA,MAAM,cAAc,MAAM,SAAA,CAAU,IAAA,CAAK,aAAa,EAAE,KAAA,EAAyB;AAGjF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAKhC,CAAA;AACD,MAAA,MAAM,EAAE,SAAS,WAAA,EAAY,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA,CAAE,GAAA,EAGjE;AAEH,MAAA,MAAM,OAAA,GAAU,aAAa,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,EAAG,KAAA,IAAS,CAAA;AACpE,MAAA,MAAM,YAAA,GAAe,aAAa,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,EAAG,KAAA,IAAS,CAAA;AAG9E,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAOnC,CAAA;AACD,MAAA,MAAM,EAAE,SAAS,cAAA,EAAe,GAAI,MAAM,WAAA,CAAY,IAAA,CAAK,aAAa,CAAA,CAAE,GAAA,EAGvE;AAEH,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,aAAa,KAAA,IAAS,CAAA;AAAA,QACrC,UAAA,EAAY,OAAA;AAAA,QACZ,eAAA,EAAiB,YAAA;AAAA,QACjB,kBAAkB,cAAA,IAAkB,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAClD,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,OAAO,CAAA,CAAE;AAAA,SACX,CAAE,CAAA;AAAA,QACF,kBAAA,EAAoB;AAAA;AAAA,OACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,CAAA;AAAA,QACf,UAAA,EAAY,CAAA;AAAA,QACZ,eAAA,EAAiB,CAAA;AAAA,QACjB,iBAAiB,EAAC;AAAA,QAClB,kBAAA,EAAoB;AAAA,OACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,SAAA,EAAW,WAAA,EAAY,IAAK,KAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA6C;AAC3C,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AACF,CAAA;;;ACnmBO,IAAM,eAAN,MAAmB;AAAA,EAGxB,WAAA,CACU,EAAA,EACA,EAAA,EACA,SAAA,EACR;AAHQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAGR,IAAA,IAAI,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,SAAA,EAAW;AAC7B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB,EAAA,EAAI,IAAI,SAAS,CAAA;AACvD,MAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AAAA,IACrD;AAAA,EACF;AAAA,EAZQ,SAAA;AAAA;AAAA;AAAA;AAAA,EAiBR,MAAM,gBAAgB,YAAA,EAA4C;AAChE,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,KAAK,EAAA,CAAG,OAAA;AAAA,QAC7B;AAAA,OACF;AACA,MAAA,MAAM,aAAa,MAAM,cAAA,CAAe,IAAA,CAAK,YAAY,EAAE,KAAA,EAIxD;AAEH,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,YAAY,CAAA,UAAA,CAAY,CAAA;AAAA,MACxD;AAGA,MAAA,MAAM,IAAA,CAAK,kBAAkB,YAAA,EAAc;AAAA,QACzC,aAAA,EAAe,YAAA;AAAA,QACf,iBAAiB,UAAA,CAAW,YAAA;AAAA,QAC5B,WAAA,EAAa,CAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,MAAA,EAAQ;AAAA,OACT,CAAA;AAGD,MAAA,IAAI,IAAA,CAAK,SAAA,EAAW,WAAA,EAAY,EAAG;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oDAAA,EAAuD,YAAY,CAAA,CAAE,CAAA;AAEjF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,gBAAgB,YAAY,CAAA;AAEhE,QAAA,MAAM,WAAA,GAA2B;AAAA,UAC/B,aAAA,EAAe,YAAA;AAAA,UACf,iBAAiB,UAAA,CAAW,YAAA;AAAA,UAC5B,aAAa,MAAA,CAAO,WAAA;AAAA,UACpB,eAAe,MAAA,CAAO,cAAA;AAAA,UACtB,YAAA,EAAc,KAAK,GAAA,EAAI;AAAA,UACvB,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,WAAA;AAAA,UACtC,eAAe,MAAA,CAAO,MAAA,GAAS,IAAI,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,uBAAA,CAAA,GAA4B,KAAA;AAAA,SACjF;AAEA,QAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,YAAA,EAAc,WAAW,CAAA;AACtD,QAAA,OAAO,WAAA;AAAA,MACT;AAGA,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+DAAA,EAAkE,YAAY,CAAA,CAAE,CAAA;AAE7F,MAAA,MAAM,cAAA,GAA8B;AAAA,QAClC,aAAA,EAAe,YAAA;AAAA,QACf,iBAAiB,UAAA,CAAW,YAAA;AAAA,QAC5B,WAAA,EAAa,CAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,YAAA,EAAc,KAAK,GAAA,EAAI;AAAA,QACvB,MAAA,EAAQ,WAAA;AAAA,QACR,aAAA,EAAe;AAAA,OACjB;AAEA,MAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,YAAA,EAAc,cAAc,CAAA;AACzD,MAAA,OAAO,cAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yCAAA,EAA4C,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAChF,MAAA,MAAM,WAAA,GAA2B;AAAA,QAC/B,aAAA,EAAe,YAAA;AAAA,QACf,eAAA,EAAiB,SAAA;AAAA,QACjB,WAAA,EAAa,CAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,MAAA,EAAQ,OAAA;AAAA,QACR,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OACtE;AACA,MAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,YAAA,EAAc,WAAW,CAAA;AACtD,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,IAAA,EAYA,YAAA,EACe;AACX,IAAA,IAAI;AAEF,MAAA,IAAI,aAAkB,EAAC;AACvB,MAAA,IAAI;AACF,QAAA,UAAA,GAAa,OAAO,KAAK,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA;AAAA,MAC5E,CAAA,CAAA,MAAQ;AACN,QAAA,UAAA,GAAa,EAAC;AAAA,MAChB;AAGA,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,EAAA,EAAI,CAAA,QAAA,EAAW,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,QACtB,KAAA,EAAO,KAAK,KAAA,IAAS,UAAA;AAAA,QACrB,IAAA,EAAM,KAAK,IAAA,IAAQ,EAAA;AAAA,QACnB,OAAA,EAAS,IAAA,CAAK,qBAAA,CAAsB,UAAU,CAAA;AAAA,QAC9C,QAAA,EAAU;AAAA,UACR,aAAA,EAAe,YAAA;AAAA,UACf,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,yBAAyB,IAAA,CAAK,uBAAA;AAAA,UAC9B,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,WAAW,IAAA,CAAK;AAAA;AAClB,OACF;AAMJ,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAA,CAAK,EAAE,KAAK,KAAK,CAAA;AAC9D,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,IAAA,EAAmB;AAC/C,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,IAAI,KAAK,KAAA,EAAO,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAC7C,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAG3C,IAAA,IAAI,KAAK,WAAA,EAAa,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AACzD,IAAA,IAAI,KAAK,OAAA,EAAS,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AACjD,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAG3C,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAmB;AACzC,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MAChB,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC7B,QAAA,GAAA,CAAI,QAAQ,cAAc,CAAA;AAAA,MAC5B,CAAA,MAAA,IAAW,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACzC,QAAA,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,cAAc,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA;AAEA,IAAA,cAAA,CAAe,IAAI,CAAA;AAEnB,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,YAAA,EAAsB,SAAA,EAAkC;AACxE,IAAA,IAAI;AAEE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAQ5B,CAAA;AACD,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,KAAK,SAAA,EAAW,YAAY,EAAE,KAAA,EAWnD;AAEP,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,SAAS,CAAA,UAAA,CAAY,CAAA;AAAA,MACvD;AAGA,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,MAAA,CAAO,YAAY,CAAC,CAAA;AAGtD,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,YAAY,CAAC,CAAA;AAC7D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,YAAY,CAAA,EAAG;AAAA,UACjD,GAAG,MAAA;AAAA,UACH,YAAA,EAAc,KAAK,GAAA;AAAI,SACxB,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iCAAA,EAAoC,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACrE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CAAgB,YAAA,EAAsB,SAAA,EAAkC;AAC5E,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,SAAA,EAAW,WAAA,EAAY,EAAG;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAmC,SAAS,CAAA,WAAA,CAAa,CAAA;AACrE,QAAA,MAAM,IAAA,CAAK,SAAA,CAAU,sBAAA,CAAuB,SAAS,CAAA;AAAA,MACvD,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,8DAAA,EAAiE,SAAS,CAAA,CAAE,CAAA;AAAA,MAC3F;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,SAAS,CAAA,YAAA,CAAA,EAAgB,KAAK,CAAA;AACrF,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKI,MAAM,eAAe,YAAA,EAAmD;AAC1E,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CAAG,OAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,YAAY,EAAE,KAAA,EAS1C;AAEH,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA;AAAA,QAC1C,iBAAiB,MAAA,CAAO,eAAA;AAAA,QACxB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,eAAe,MAAA,CAAO;AAAA,OACxB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0CAAA,EAA6C,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACjF,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKI,MAAM,iBAAA,GAA0D;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,oCAAoC,CAAA;AACjE,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAK,GAAA,EAS5B;AAEC,MAAA,MAAM,YAAyC,EAAC;AAEhD,MAAA,KAAA,MAAW,GAAA,IAAO,OAAA,IAAW,EAAC,EAAG;AAC/B,QAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA;AAC7C,QAAA,SAAA,CAAU,YAAY,CAAA,GAAI;AAAA,UACxB,aAAA,EAAe,YAAA;AAAA,UACnB,iBAAiB,GAAA,CAAI,eAAA;AAAA,UACrB,aAAa,GAAA,CAAI,WAAA;AAAA,UACjB,eAAe,GAAA,CAAI,aAAA;AAAA,UACnB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,eAAe,GAAA,CAAI;AAAA,SACrB;AAAA,MACF;AAEA,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKI,MAAc,iBAAA,CAAkB,YAAA,EAAsB,MAAA,EAAoC;AACxF,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,KAAK,EAAA,CAAG,OAAA;AAAA,QACxB;AAAA,OACF;AACA,MAAA,MAAM,WAAW,MAAM,SAAA,CAAU,IAAA,CAAK,YAAY,EAAE,KAAA,EAAsB;AAE1E,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAS5B,CAAA;AACD,QAAA,MAAM,IAAA,CACH,IAAA;AAAA,UACC,MAAA,CAAO,eAAA;AAAA,UACP,MAAA,CAAO,WAAA;AAAA,UACP,MAAA,CAAO,aAAA;AAAA,UACP,OAAO,YAAA,IAAgB,IAAA;AAAA,UACvB,MAAA,CAAO,MAAA;AAAA,UACP,OAAO,aAAA,IAAiB,IAAA;AAAA,UACxB,OAAO,YAAY;AAAA,UAEpB,GAAA,EAAI;AAAA,MACT,CAAA,MAAO;AAEL,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAK5B,CAAA;AACD,QAAA,MAAM,IAAA,CACH,IAAA;AAAA,UACC,MAAA,CAAO,OAAO,aAAa,CAAA;AAAA,UAC3B,MAAA,CAAO,eAAA;AAAA,UACP,MAAA,CAAO,WAAA;AAAA,UACP,MAAA,CAAO,aAAA;AAAA,UACP,OAAO,YAAA,IAAgB,IAAA;AAAA,UACvB,MAAA,CAAO,MAAA;AAAA,UACP,OAAO,aAAA,IAAiB;AAAA,UAEzB,GAAA,EAAI;AAAA,MACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2CAAA,EAA8C,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAClF,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,mBAAA,EAA8C;AAC9D,IAAA,KAAA,MAAW,gBAAgB,mBAAA,EAAqB;AAC9C,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,gBAAgB,YAAY,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yBAAA,EAA4B,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;ACxXO,SAAS,mBAAmB,IAAA,EAAgC;AACjE,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY;AAAA,IAChC,OAAA,EAAS,KAAA;AAAA,IACT,eAAA,EAAiB,IAAA;AAAA,IACjB,sBAAsB,EAAC;AAAA,IACvB,uBAAuB,EAAC;AAAA,IACxB,oBAAA,EAAsB,IAAA;AAAA,IACtB,cAAA,EAAgB,CAAA;AAAA,IAChB,aAAA,EAAe,EAAA;AAAA,IACf,WAAA,EAAa;AAAA,GACf;AAGA,EAAA,MAAM,mBAAA,GAAsB,MAAM,OAAA,CAAQ,QAAA,CAAS,oBAAoB,CAAA,GAAI,QAAA,CAAS,uBAAuB,EAAC;AAC5G,EAAA,MAAM,oBAAA,GAAuB,MAAM,OAAA,CAAQ,QAAA,CAAS,qBAAqB,CAAA,GAAI,QAAA,CAAS,wBAAwB,EAAC;AAE/G,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,KAAY,IAAA;AACrC,EAAA,MAAM,aAAA,GAAgB,SAAS,eAAA,KAAoB,KAAA;AACnD,EAAA,MAAM,mBAAA,GAAsB,SAAS,oBAAA,KAAyB,KAAA;AAC9D,EAAA,MAAM,UAAA,GAAa,SAAS,WAAA,KAAgB,IAAA;AAE5C,EAAA,MAAM,qBAAA,GAAwB,IAAI,GAAA,CAAI,mBAAA,CAAoB,IAAI,CAAA,EAAA,KAAM,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AAC/E,EAAA,MAAM,sBAAA,GAAyB,IAAI,GAAA,CAAI,oBAAA,CAAqB,IAAI,CAAA,EAAA,KAAM,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AAGjF,EAAA,MAAMA,YAAAA,GAAc,MAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA,CAAK,cAAc,EAAC;AAG1E,EAAA,OAAA,CAAQ,GAAA,CAAI,+CAAA,EAAiDA,YAAAA,CAAY,MAAM,CAAA;AAC/E,EAAA,IAAIA,YAAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAI,2CAAA,EAA6CA,YAAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EACzE;AAEA,EAAA,MAAMD,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uEAAA,EA6BuD,OAAA,GAAU,YAAY,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,uFAAA,EAQR,aAAA,GAAgB,YAAY,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EA4BvGC,aAAY,MAAA,KAAW,CAAA,GAC/B,oHACAA,YAAAA,CAAY,GAAA,CAAI,CAAC,UAAA,KAAe;AAChC,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,GAAA,CAAI,YAAY,CAAA;AACxD,IAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,GAAA,CAAI,YAAY,CAAA;AAC3D,IAAA,MAAM,cAAA,GAAsC,IAAA,CAAK,WAAA,IAAe,EAAC;AACjE,IAAA,MAAM,MAAA,GAAS,eAAe,YAAY,CAAA;AAE1C,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAA,KAAW,IAAA,IAAQ,CAAC,eAAe,CAAC,MAAA;AAE7D,IAAA,MAAMC,YAAAA,GAAe,UAAU,SAAA,GAC3B,CAAA,iDAAA,EAAoD,OAAO,MAAA,KAAW,WAAA,GACpE,yEACA,MAAA,CAAO,MAAA,KAAW,aAChB,kEAAA,GACA,MAAA,CAAO,WAAW,OAAA,GAChB,8DAAA,GACA,+DACR,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,OAAA,CAAA,GAChB,EAAA;AAEJ,IAAA,OAAO,CAAA,8FAAA,EAAiG,KAAA,GAAQ,qEAAA,GAAwE,yCAAyC,CAAA;AAAA;AAAA;AAAA,uCAAA,EAGhM,YAAY,CAAA;AAAA;AAAA,+BAAA,EAEpB,YAAY,CAAA;AAAA,wBAAA,EACnB,SAAA,GAAY,YAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,+CAAA,EAKH,YAAY,CAAA;AAAA,0BAAA,EACjC,UAAA,CAAW,YAAA,IAAgB,UAAA,CAAW,IAAA,IAAQ,oBAAoB;AAAA,0BAAA,EAClE,KAAA,GAAQ,oIAAoI,EAAE;AAAA,0BAAA,EAC9IA,YAAW;AAAA;AAAA;AAAA,0BAAA,EAGX,UAAA,CAAW,eAAe,UAAA,CAAW,IAAA,IAAQ,gBAAgB,CAAA,QAAA,EAAM,UAAA,CAAW,cAAc,CAAC,CAAA;AAAA,0BAAA,EAC7F,MAAA,GAAS,WAAM,MAAA,CAAO,aAAa,IAAI,MAAA,CAAO,WAAW,aAAa,EAAE;AAAA;AAAA,wBAAA,EAE1E,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,UAAA,GACxC,CAAA;AAAA,sFAAA,EAC2E,MAAA,CAAO,aAAA,GAAgB,MAAA,CAAO,WAAA,GAAe,GAAG,CAAA;AAAA,kCAAA,CAAA,GAE3H,EAAE;AAAA;AAAA,sBAAA,EAEQ,SAAA,GAAY;AAAA;AAAA;AAAA,sDAAA,EAGoB,YAAY,CAAA;AAAA;AAAA,0BAAA,EAExC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,UAAA,GAAa,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,CAAA,GAO1D,EAAE;AAAA,0BAAA,CAAA;AAAA,EAEtB,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iGAAA,EAWkF,mBAAA,GAAsB,YAAY,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,+EAAA,EAQtD,UAAA,GAAa,YAAY,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,0FAAA,EAShB,QAAA,CAAS,kBAAkB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,wFAAA,EAI9B,QAAA,CAAS,iBAAiB,EAAE,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAwBrC,IAAA,CAAK,UAAU,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA,kFAAA,EAIzB,IAAA,CAAK,UAAU,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,sFAAA,EAIrB,IAAA,CAAK,UAAU,eAAe,CAAA;AAAA;AAAA;AAAA,QAAA,EAG5G,IAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,MAAA,GAAS,CAAA,GAC1C;AAAA;AAAA;AAAA;AAAA,kBAAA,EAIY,IAAA,CAAK,UAAU,eAAA,CAAgB,GAAA;AAAA,IAC3C,CAAC,IAAA,KAAS;AAAA;AAAA,wEAAA,EAEwD,KAAK,KAAK,CAAA;AAAA,uEAAA,EACX,KAAK,KAAK,CAAA;AAAA;AAAA,oBAAA;AAAA,GAG7E,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA,YAAA,CAAA,GAIR,gFAAgF;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AA2HtF,EAAA,OAAOC,mCAAA,CAAkB;AAAA,IACvB,KAAA,EAAO,oBAAA;AAAA,IACP,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,mCAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,OAAA,EAASH;AAAA,GACV,CAAA;AACH;;;AChYA,IAAM,WAAA,GAAc,IAAId,SAAAA,EAAmD;AAG3E,WAAA,CAAY,GAAA,CAAI,GAAA,EAAKC,6BAAA,EAAa,CAAA;AAMlC,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAChC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AAEjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,EAAA,EAAI,IAAI,SAAS,CAAA;AAGlD,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,WAAA,EAAY;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,6CAAA,EAA+C,CAAC,CAAC,QAAQ,CAAA;AAGrE,IAAA,MAAMc,YAAAA,GAAc,MAAM,OAAA,CAAQ,iBAAA,EAAkB;AACpD,IAAA,OAAA,CAAQ,GAAA,CAAI,kDAAA,EAAoDA,YAAAA,CAAY,MAAM,CAAA;AAGlF,IAAA,IAAIA,YAAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,cAAc,MAAM,EAAA,CAAG,OAAA,CAAQ,oEAAoE,EAAE,GAAA,EAAI;AAC/G,MAAA,OAAA,CAAQ,IAAI,mDAAA,EAAqD,WAAA,CAAY,OAAA,EAAS,MAAA,IAAU,GAAG,aAAa,CAAA;AAChH,MAAA,IAAI,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA,EAAG;AACzD,QAAA,OAAA,CAAQ,GAAA,CAAI,4CAAA,EAA8C,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAClF;AAAA,IACF,WAAWA,YAAAA,CAAY,MAAA,GAAS,CAAA,IAAKA,YAAAA,CAAY,CAAC,CAAA,EAAG;AACnD,MAAA,OAAA,CAAQ,IAAI,8CAAA,EAAgD;AAAA,QAC1D,EAAA,EAAIA,YAAAA,CAAY,CAAC,CAAA,CAAE,EAAA;AAAA,QACnB,IAAA,EAAMA,YAAAA,CAAY,CAAC,CAAA,CAAE,IAAA;AAAA,QACrB,YAAA,EAAcA,YAAAA,CAAY,CAAC,CAAA,CAAE;AAAA,OAC9B,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,oBAAA,EAAqB;AAC1D,IAAA,OAAA,CAAQ,GAAA,CAAI,6BAAA,EAA+B,cAAA,CAAe,MAAM,CAAA;AAGhE,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,iBAAA,EAAkB;AACpD,IAAA,OAAA,CAAQ,IAAI,0BAAA,EAA4B,MAAA,CAAO,IAAA,CAAK,WAAW,EAAE,MAAM,CAAA;AAGvE,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,kBAAA,EAAmB;AAEnD,IAAA,OAAO,CAAA,CAAE,IAAA;AAAA,MACP,kBAAA,CAAmB;AAAA,QACjB,QAAA;AAAA,QACA,WAAA,EAAaA,gBAAe,EAAC;AAAA,QAC7B,cAAA,EAAgB,kBAAkB,EAAC;AAAA,QACnC,WAAA,EAAa,eAAe,EAAC;AAAA,QAC7B,SAAA;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,MAAM,IAAA,CAAK,KAAA;AAAA,UACX,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK;AAAA;AACb,OACD;AAAA,KACH;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAC1D,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,CAAA,2BAAA,EAA8B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,IAAA,CAAA,EAAQ,GAAG,CAAA;AAAA,EAC/G;AACF,CAAC,CAAA;AAMD,WAAA,CAAY,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA,KAAM;AACjC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,EAAA,EAAI,IAAI,SAAS,CAAA;AAElD,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,OAAA,CAAQ,IAAI,iCAAA,EAAmC,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAG5E,IAAA,MAAM,eAAA,GAAkB,MAAM,OAAA,CAAQ,WAAA,EAAY;AAClD,IAAA,OAAA,CAAQ,GAAA,CAAI,yDAAA,EAA2D,eAAA,EAAiB,oBAAoB,CAAA;AAG5G,IAAA,MAAM,eAAA,GAA6C;AAAA,MACjD,OAAA,EAAS,KAAK,OAAA,KAAY,KAAA,CAAA,GAAY,QAAQ,IAAA,CAAK,OAAO,IAAI,eAAA,EAAiB,OAAA;AAAA,MAC/E,eAAA,EAAiB,KAAK,eAAA,KAAoB,KAAA,CAAA,GAAY,QAAQ,IAAA,CAAK,eAAe,IAAI,eAAA,EAAiB,eAAA;AAAA,MACvG,oBAAA,EAAsB,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,oBAAoB,CAAA,GAAI,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,MAAM,CAAA,GAAK,eAAA,EAAiB,wBAAwB,EAAC;AAAA,MACpJ,qBAAA,EAAuB,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,qBAAqB,CAAA,GAAI,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,MAAM,CAAA,GAAK,eAAA,EAAiB,yBAAyB,EAAC;AAAA,MACxJ,oBAAA,EAAsB,KAAK,oBAAA,KAAyB,KAAA,CAAA,GAAY,QAAQ,IAAA,CAAK,oBAAoB,IAAI,eAAA,EAAiB,oBAAA;AAAA,MACtH,gBAAgB,IAAA,CAAK,cAAA,GAAiB,OAAO,IAAA,CAAK,cAAc,IAAI,eAAA,EAAiB,cAAA;AAAA,MACrF,eAAe,IAAA,CAAK,aAAA,GAAgB,OAAO,IAAA,CAAK,aAAa,IAAI,eAAA,EAAiB,aAAA;AAAA,MAClF,WAAA,EAAa,KAAK,WAAA,KAAgB,KAAA,CAAA,GAAY,QAAQ,IAAA,CAAK,WAAW,IAAI,eAAA,EAAiB;AAAA,KAC7F;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,yDAAA,EAA2D,eAAA,CAAgB,oBAAoB,CAAA;AAG3G,IAAA,MAAM,kBAAA,GACJ,IAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,oBAAoB,CAAA,KACnD,IAAA,CAAK,SAAA,CAAU,eAAA,EAAiB,oBAAA,IAAwB,EAAE,CAAA;AAE5D,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,cAAA,CAAe,eAAe,CAAA;AAC1D,IAAA,OAAA,CAAQ,GAAA,CAAI,wDAAA,EAA0D,KAAA,CAAM,oBAAoB,CAAA;AAGhG,IAAA,IAAI,kBAAA,IAAsB,gBAAgB,oBAAA,EAAsB;AAC9D,MAAA,OAAA,CAAQ,IAAI,oEAAoE,CAAA;AAEhF,MAAA,CAAA,CAAE,YAAA,CAAa,SAAA;AAAA,QACb,QACG,OAAA,CAAQ,eAAA,CAAgB,oBAAoB,CAAA,CAC5C,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA,CAAI,gDAAgD,CAAC,CAAA,CACxE,MAAM,CAAC,KAAA,KAAU,QAAQ,KAAA,CAAM,6CAAA,EAA+C,KAAK,CAAC;AAAA,OACzF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAAA,EAClD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,2BAAA,IAA+B,GAAG,CAAA;AAAA,EAC3D;AACF,CAAC,CAAA;AAMD,WAAA,CAAY,GAAA,CAAI,eAAA,EAAiB,OAAO,CAAA,KAAM;AAC5C,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AAErD,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,WAAA,EAAY;AAC3C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,UAAU,CAAA;AAAA,EACjD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,0BAAA,IAA8B,GAAG,CAAA;AAAA,EAC1D;AACF,CAAC,CAAA;AAMD,WAAA,CAAY,GAAA,CAAI,sBAAA,EAAwB,OAAO,CAAA,KAAM;AACnD,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AAErD,IAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,oBAAA,EAAqB;AACzD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,eAAe,CAAA;AAAA,EACtD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kCAAA,IAAsC,GAAG,CAAA;AAAA,EAClE;AACF,CAAC,CAAA;AAMD,WAAA,CAAY,GAAA,CAAI,aAAA,EAAe,OAAO,CAAA,KAAM;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,EAAA,EAAI,IAAI,SAAS,CAAA;AAElD,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,iBAAA,EAAkB;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC/C,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,wBAAA,IAA4B,GAAG,CAAA;AAAA,EACxD;AACF,CAAC,CAAA;AAMD,WAAA,CAAY,IAAA,CAAK,cAAA,EAAgB,OAAO,CAAA,KAAM;AAC5C,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,EAAA,EAAI,IAAI,SAAS,CAAA;AAEhD,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,kBAA2B,IAAA,CAAK,aAAA;AACtC,IAAA,MAAM,YAAA,GAAe,eAAA,GAAkB,MAAA,CAAO,eAAe,CAAA,GAAI,EAAA;AAEjE,IAAA,IAAI,CAAC,YAAA,IAAgB,YAAA,KAAiB,WAAA,IAAe,iBAAiB,MAAA,EAAQ;AAC5E,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,2BAAA,IAA+B,GAAG,CAAA;AAAA,IAC3D;AAGA,IAAA,CAAA,CAAE,YAAA,CAAa,SAAA;AAAA,MACb,OAAA,CACG,gBAAgB,YAAY,CAAA,CAC5B,KAAK,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,6CAAA,EAAgD,YAAY,CAAA,CAAE,CAAC,CAAA,CACtF,KAAA,CAAM,CAAC,KAAA,KAAU,OAAA,CAAQ,MAAM,CAAA,yCAAA,EAA4C,YAAY,CAAA,CAAA,CAAA,EAAK,KAAK,CAAC;AAAA,KACvG;AAEF,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,uBAAuB,CAAA;AAAA,EACjE,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,6BAAA,IAAiC,GAAG,CAAA;AAAA,EAC7D;AACF,CAAC,CAAA;AAED,IAAO,aAAA,GAAQ,WAAA;ACnOf,IAAM,SAAA,GAAY,IAAIf,SAAAA,EAAmD;AAMzE,SAAA,CAAU,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA,KAAM;AAC/B,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AAErD,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAE9B,IAAA,MAAM,KAAA,GAAqB;AAAA,MACzB,KAAA,EAAO,KAAK,KAAA,IAAS,EAAA;AAAA,MACrB,IAAA,EAAM,KAAK,IAAA,IAAQ,SAAA;AAAA,MACnB,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,MAC1B,OAAO,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA,CAAA;AAAA,MACzC,QAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAAI,KAAA;AAAA,KAC9C;AAGA,IAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,MAAA,IAAI,OAAO,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,UAAU,QAAA,EAAU;AACrD,QAAA,KAAA,CAAM,OAAA,CAAQ,UAAU,KAAA,GAAQ,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,MACxE;AACA,MAAA,IAAI,OAAO,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,QAAQ,QAAA,EAAU;AACnD,QAAA,KAAA,CAAM,OAAA,CAAQ,UAAU,GAAA,GAAM,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,UAAU,GAAG,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAE1C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,KAAK,CAAA;AACpC,IAAA,OAAO,CAAA,CAAE,IAAA;AAAA,MACP;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,eAAA;AAAA,QACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAChE;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAC,CAAA;AAMD,SAAA,CAAU,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA,KAAM;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AAErD,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,IAAK,EAAA;AAElC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,OAAO,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,MAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,oBAAA,CAAqB,KAAK,CAAA;AAE5D,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,IAAA,OAAO,CAAA,CAAE,IAAA;AAAA,MACP;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAC,CAAA;AAMD,SAAA,CAAU,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAM;AACvC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,EAAA,GAAM,EAAE,GAAA,CAAY,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAa,EAAE,GAAA,CAAY,eAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,EAAA,EAAI,IAAI,SAAS,CAAA;AAErD,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,kBAAA,EAAmB;AAEnD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oBAAoB,KAAK,CAAA;AACvC,IAAA,OAAO,CAAA,CAAE,IAAA;AAAA,MACP;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAOkB,YAAAA,GAAQ,SAAA;;;ACjIf,IAAA,gBAAA,GAAA;AAAA,EAEE,IAAA,EAAQ,WAAA;AAAA,EACR,WAAA,EAAe,sIAAA;AAAA,EACf,OAAA,EAAW,OAAA;AAAA,EACX,MAAA,EAAU,SAoFZ,CAAA;;;ACxDO,IAAM,cAAA,GAAiB,IAAIhB,+BAAA,CAAc;AAAA,EAC9C,MAAM,gBAAA,CAAS,IAAA;AAAA,EACf,SAAS,gBAAA,CAAS,OAAA;AAAA,EAClB,aAAa,gBAAA,CAAS,WAAA;AAAA,EACtB,MAAA,EAAQ,EAAE,IAAA,EAAM,gBAAA,CAAS,MAAA;AAC3B,CAAC,EACE,QAAA,CAAS;AAAA,EACR,aAAa,gBAAA,CAAS,WAAA;AAAA,EACtB,MAAA,EAAQ,EAAE,IAAA,EAAM,gBAAA,CAAS,MAAA;AAC3B,CAAC,EACA,UAAA,CAAW,UAAA,EAAY,eAAe,CAAA,CACtC,WAAW,cAAA,EAAgB,YAAY,CAAA,CACvC,QAAA,CAAS,4BAA4B,aAAkB,CAAA,CACvD,SAAS,aAAA,EAAegB,YAAgB,EACxC,KAAA,EAAM;AClCT,IAAM,sBAAA,GAAyBd,MAAE,MAAA,CAAO;AAAA,EACtC,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAM,yBAAyB;AACnD,CAAC,CAAA;AAEM,SAAS,yBAAA,GAAoC;AAClD,EAAA,MAAM,eAAA,GAAkB,IAAIJ,SAAAA,EAAK;AAGjC,EAAA,eAAA,CAAgB,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,KAAW;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,MAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,SAAA,CAAU,IAAI,CAAA;AAExD,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO,mBAAA;AAAA,UACP,OAAA,EAAS,WAAW,KAAA,CAAM;AAAA,WACzB,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,UAAA,CAAW,IAAA;AAC7B,MAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,EAAY;AAC1C,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAK,KAAK,EAAA,GAAK,GAAA;AAC3C,MAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAIpC,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,UAAU,EAAE,KAAA,EAAM;AAE3C,MAAA,MAAM,gBAAA,GAAmB,CAAA;AACzB,MAAA,IAAI,WAAA,IAAe,WAAA,CAAY,KAAA,IAAS,gBAAA,EAAkB;AACxD,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAI7B,CAAA,CAAE,IAAA,CAAK,eAAe,CAAA,CAAE,KAAA,EAAM;AAE/B,MAAA,MAAM,aAAA,GAAgB,KAAA;AAEtB,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,aAAA,EAAe;AAE3B,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,IAAA,IAAQ,CAAC,IAAA,CAAK,SAAA,EAAW;AAC3B,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAGA,MAAA,MAAM,QAAQ,MAAA,CAAO,UAAA,EAAW,GAAI,GAAA,GAAM,OAAO,UAAA,EAAW;AAC5D,MAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,MAAA,MAAM,iBAAA,GAAoB,EAAA;AAC1B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAK,oBAAoB,EAAA,GAAK,GAAA;AAGzD,MAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAIhB,CAAA,CAAE,IAAA;AAAA,QACD,OAAA;AAAA,QACA,eAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAK,GAAA,EAAI;AAAA,QACT,CAAA,CAAE,IAAI,MAAA,CAAO,kBAAkB,KAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA,IAAK,SAAA;AAAA,QACvE,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,IAAK;AAAA,QAC9B,GAAA,EAAI;AAGN,MAAA,MAAM,UAAU,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,MAAA;AACnC,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,8BAAA,EAAiC,KAAK,CAAA,CAAA;AAGlE,MAAA,IAAI;AACF,QAAA,MAAMM,YAAAA,GAAc,CAAA,CAAE,GAAA,CAAI,OAAA,EAAS,IAAI,OAAO,CAAA;AAC9C,QAAA,IAAIA,YAAAA,IAAeA,aAAY,SAAA,EAAW;AACxC,UAAA,MAAMA,aAAY,SAAA,CAAU;AAAA,YAC1B,EAAA,EAAI,eAAA;AAAA,YACJ,OAAA,EAAS,4BAAA;AAAA,YACT,IAAA,EAAM,oBAAA,CAAqB,SAAA,EAAW,iBAAiB;AAAA,WACxD,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,MAAM,4BAA4B,CAAA;AAE1C,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,eAAe,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,QAC/D;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,KAAA,EAAO;AAAA,WACN,GAAG,CAAA;AAAA,MACR;AAEA,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,6EAAA;AAAA;AAAA,QAET,GAAI,CAAA,CAAE,GAAA,CAAI,gBAAgB,aAAA,IAAiB,EAAE,UAAU,SAAA;AAAU,OAClE,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,2BAAA,IAA+B,GAAG,CAAA;AAAA,IAC3D;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAW;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAEjC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,CAAA,CAAE,SAAS,sCAAsC,CAAA;AAAA,MAC1D;AAEA,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,MAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAGlC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,CAAE,KAAA,EAAM;AAErB,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO,CAAA,CAAE,SAAS,iDAAiD,CAAA;AAAA,MACrE;AAGA,MAAA,IAAI,SAAA,CAAU,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,EAAG;AACrC,QAAA,OAAO,CAAA,CAAE,SAAS,+CAA+C,CAAA;AAAA,MACnE;AAGA,MAAA,IAAI,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA,MAAA,CAE3B,CAAA,CAAE,IAAA,CAAK,SAAA,CAAU,UAAU,EAAE,KAAA,EAAM;AAEpC,MAAA,MAAM,aAAA,GAAgB,KAAA;AAEtB,MAAA,IAAI,CAAC,QAAQ,aAAA,EAAe;AAE1B,QAAA,MAAM,MAAA,GAAS,OAAO,UAAA,EAAW;AACjC,QAAA,MAAM,WAAW,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAClD,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,QAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAKhB,CAAA,CAAE,IAAA;AAAA,UACD,MAAA;AAAA,UACA,SAAA,CAAU,UAAA;AAAA,UACV,QAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAA;AAAA,UACA,GAAA;AAAA,UACA;AAAA,UACA,GAAA,EAAI;AAEN,QAAA,IAAA,GAAO;AAAA,UACL,EAAA,EAAI,MAAA;AAAA,UACJ,OAAO,SAAA,CAAU,UAAA;AAAA,UACjB,QAAA;AAAA,UACA,IAAA,EAAM;AAAA,SACR;AAAA,MACF,CAAA,MAAA,IAAW,CAAC,IAAA,EAAM;AAChB,QAAA,OAAO,CAAA,CAAE,SAAS,mDAAmD,CAAA;AAAA,MACvE;AAGA,MAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAIhB,CAAA,CAAE,KAAK,IAAA,CAAK,GAAA,IAAO,SAAA,CAAU,EAAE,EAAE,GAAA,EAAI;AAGtC,MAAA,MAAM,WAAW,MAAMC,2CAAA,CAA2B,EAAE,GAAA,CAAY,EAAA,EAAI,EAAE,GAAU,CAAA;AAChF,MAAA,MAAM,QAAA,GAAW,MAAMC,6BAAA,CAAY,aAAA;AAAA,QACjC,IAAA,CAAK,EAAA;AAAA,QACL,IAAA,CAAK,KAAA;AAAA,QACL,IAAA,CAAK,IAAA;AAAA,QACJ,EAAE,GAAA,CAAY,UAAA;AAAA,QACf;AAAA,OACF;AAGA,MAAAA,6BAAA,CAAY,cAAc,CAAA,EAAG,QAAA,EAAU,EAAE,MAAA,EAAQ,UAAU,CAAA;AAG3D,MAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA,MAAA,CAEhB,CAAA,CAAE,KAAK,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,EAAE,EAAE,GAAA,EAAI;AAGjC,MAAA,OAAO,CAAA,CAAE,SAAS,iDAAiD,CAAA;AAAA,IACrE,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,MAAA,OAAO,CAAA,CAAE,SAAS,yCAAyC,CAAA;AAAA,IAC7D;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,WAAA,EAAa,mDAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,YAAA,EAAc,CAAC,OAAO,CAAA;AAAA,IAEtB,QAAQ,CAAC;AAAA,MACP,IAAA,EAAM,kBAAA;AAAA,MACN,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,qCAAA;AAAA,MACb,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,IAED,MAAM,QAAQ,OAAA,EAAwB;AACpC,MAAA,OAAA,CAAQ,IAAI,sCAAsC,CAAA;AAAA,IAEpD,CAAA;AAAA,IAEA,MAAM,SAAS,OAAA,EAAwB;AACrC,MAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AACjD,MAAA,OAAA,CAAQ,IAAI,oDAAoD,CAAA;AAAA,IAClE,CAAA;AAAA,IAEA,MAAM,WAAW,OAAA,EAAwB;AACvC,MAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AAAA,IACrD,CAAA;AAAA,IAEA,MAAM,UAAU,OAAA,EAAwB;AACtC,MAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AAAA,IAGtD;AAAA,GACF;AACF;AAKA,SAAS,oBAAA,CAAqB,WAAmB,aAAA,EAA+B;AAC9E,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,qBAAA,EAkFc,SAAS,CAAA;AAAA;;AAAA,wDAAA,EAGqB,aAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAgBlE;AAEe,yBAAA;;;AC5QR,IAAMW,iBAAAA,GAA0C;AAAA,EACrD,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,EAAA;AAAA,IACZ,SAAA,EAAW,GAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,sBAAA,EAAwB,EAAA;AAAA,IACxB,yBAAA,EAA2B,CAAA;AAAA,IAC3B,aAAA,EAAe,EAAA;AAAA,IACf,sBAAA,EAAwB,EAAA;AAAA,IACxB,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,mBAAA,EAAqB,IAAA;AAAA,IACrB,UAAA,EAAY,IAAA;AAAA,IACZ,gBAAA,EAAkB,IAAA;AAAA,IAClB,iBAAA,EAAmB,IAAA;AAAA,IACnB,mBAAA,EAAqB;AAAA;AAEzB,CAAA;;;ACnHO,IAAM,uBAAN,MAA2B;AAAA,EAChC,WAAA,CACU,EAAA,EACA,QAAA,GAAkCA,iBAAAA,EAC1C;AAFQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EACP;AAAA,EAEH,MAAM,SAAS,KAAA,EAA6C;AAC1D,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAGrB,CAAA,CAAE,IAAA;AAAA,MACD,EAAA;AAAA,MACA,KAAA,CAAM,SAAA;AAAA,MACN,MAAM,QAAA,IAAY,MAAA;AAAA,MAClB,MAAM,MAAA,IAAU,IAAA;AAAA,MAChB,MAAM,KAAA,IAAS,IAAA;AAAA,MACf,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,MAAM,WAAA,IAAe,IAAA;AAAA,MACrB,MAAM,WAAA,IAAe,IAAA;AAAA,MACrB,MAAM,aAAA,IAAiB,IAAA;AAAA,MACvB,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,GAAI,IAAA;AAAA,MAChD,MAAM,WAAA,IAAe,IAAA;AAAA,MACrB,KAAA,CAAM,UAAU,CAAA,GAAI,CAAA;AAAA,MACpB;AAAA,MACA,GAAA,EAAI;AAEN,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAA,CAAU,OAAA,GAAgC,EAAC,EAAwD;AACvG,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpC,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,eAAA,EAAkB,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC/E,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,OAAA,CAAQ,SAAS,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAChC,QAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACnC,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,aAAA,EAAgB,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC5E,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAC9B,QAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,UAAA,CAAW,KAAK,mBAAmB,CAAA;AACnC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IACtC;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,UAAA,CAAW,KAAK,uDAAuD,CAAA;AACvE,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,EAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,EAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACjF;AAEA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,MAAA,UAAA,CAAW,KAAK,aAAa,CAAA;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,GAAU,CAAA,GAAI,CAAC,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAC5E,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,YAAA;AACjC,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,MAAA;AACvC,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,IAAA,MAAM,MAAA,GAAA,CAAU,OAAO,CAAA,IAAK,KAAA;AAG5B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAChC,iDAAiD,KAAK,CAAA;AAAA,KACxD,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,KAAA,EAAyB;AAC3C,IAAA,MAAM,KAAA,GAAQ,aAAa,KAAA,IAAS,CAAA;AAGpC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC5B,CAAA,8BAAA,EAAiC,KAAK,CAAA,UAAA,EAAa,MAAM,IAAI,SAAS,CAAA,iBAAA;AAAA,MACtE,IAAA,CAAK,GAAG,QAAQ,KAAA,EAAO,MAAM,EAAE,GAAA,EAAI;AAErC,IAAA,MAAM,UAA2B,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACzE,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,eAAe,GAAA,CAAI,cAAA;AAAA,MACnB,SAAS,GAAA,CAAI,OAAA,GAAU,KAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AAAA,MACjD,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,OAAA,EAAS,CAAC,CAAC,GAAA,CAAI,OAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EACzB;AAAA,EAEA,MAAM,SAAS,EAAA,EAA2C;AACxD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACxB;AAAA,KACF,CAAE,IAAA,CAAK,EAAE,CAAA,CAAE,KAAA,EAAW;AAEtB,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,eAAe,GAAA,CAAI,cAAA;AAAA,MACnB,SAAS,GAAA,CAAI,OAAA,GAAU,KAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AAAA,MACjD,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,OAAA,EAAS,CAAC,CAAC,GAAA,CAAI,OAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAAmC;AACvC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,GAAA,GAAM,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AACjC,IAAA,MAAM,GAAA,GAAM,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAGjC,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAChC;AAAA,MACA,KAAA,EAAyB;AAG3B,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACpC;AAAA,KACF,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA,EAAyB;AAGrC,IAAA,MAAM,oBAAA,GAAuB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACzC;AAAA,KACF,CAAE,IAAA,CAAK,GAAA,EAAK,GAAG,EAAE,KAAA,EAAyB;AAE1C,IAAA,MAAM,SAAA,GAAY,iBAAiB,KAAA,IAAS,CAAA;AAC5C,IAAA,MAAM,cAAA,GAAiB,sBAAsB,KAAA,IAAS,CAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,cAAA,GAAiB,CAAA,GAC3B,IAAA,CAAK,KAAA,CAAA,CAAQ,SAAA,GAAY,cAAA,IAAkB,cAAA,GAAkB,GAAG,CAAA,GAC/D,SAAA,GAAY,CAAA,GAAI,GAAA,GAAM,CAAA;AAG3B,IAAA,MAAM,gBAAgB,GAAA,GAAO,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,yBAAyB,EAAA,GAAK,GAAA;AACpF,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACnC;AAAA,KACF,CAAE,IAAA,CAAK,aAAa,CAAA,CAAE,KAAA,EAAyB;AAG/C,IAAA,MAAM,cAAc,GAAA,GAAO,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,gBAAgB,EAAA,GAAK,GAAA;AACzE,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAClC,CAAA;AAAA;AAAA;AAAA;AAAA,OAAA;AAAA,KAKF,CAAE,KAAK,WAAA,EAAa,IAAA,CAAK,SAAS,UAAA,CAAW,sBAAsB,EAAE,KAAA,EAAyB;AAG9F,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAChC;AAAA,KACF,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,GAAA,EAAI;AAEhB,IAAA,MAAM,eAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,GAAA,IAAQ,WAAA,CAAY,OAAA,IAAW,EAAC,EAAa;AACtD,MAAA,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA,GAAI,GAAA,CAAI,KAAA;AAAA,IACrC;AAGA,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACpC;AAAA,KACF,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,GAAA,EAAI;AAEhB,IAAA,MAAM,mBAA2C,EAAC;AAClD,IAAA,KAAA,MAAW,GAAA,IAAQ,eAAA,CAAgB,OAAA,IAAW,EAAC,EAAa;AAC1D,MAAA,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,GAAI,GAAA,CAAI,KAAA;AAAA,IACvC;AAEA,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,aAAa,KAAA,IAAS,CAAA;AAAA,MACnC,eAAA,EAAiB,SAAA;AAAA,MACjB,iBAAA,EAAmB,KAAA;AAAA,MACnB,cAAA,EAAgB,gBAAgB,KAAA,IAAS,CAAA;AAAA,MACzC,UAAA,EAAY,eAAe,KAAA,IAAS,CAAA;AAAA,MACpC,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,GAAgB,EAAA,EAAsB;AACpD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,GAAA,GAAM,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAEjC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAWrC,CAAA,CAAE,IAAA,CAAK,GAAA,EAAK,KAAK,EAAE,GAAA,EAAI;AAGxB,IAAA,MAAM,gBAAgB,GAAA,GAAO,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,yBAAyB,EAAA,GAAK,GAAA;AACpF,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACnC;AAAA,KACF,CAAE,IAAA,CAAK,aAAa,CAAA,CAAE,GAAA,EAAI;AAE1B,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAA,CAAK,cAAA,CAAe,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,UAAU,CAAC,CAAA;AAEtF,IAAA,OAAA,CAAQ,QAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MAChD,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,gBAAgB,GAAA,CAAI,eAAA;AAAA,MACpB,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,MAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,UAAU;AAAA,KACtC,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,cAAA,CAAe,KAAA,GAAgB,EAAA,EAA6B;AAChE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,GAAA;AAGtC,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,GAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,WAAW,CAAA;AACjC,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,WAAA,EAAY,CAAE,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAA;AAAA,QACvD,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQrC,CAAA,CAAE,IAAA,CAAK,KAAA,EAAO,KAAK,EAAE,GAAA,EAAI;AAE1B,IAAA,KAAA,MAAW,GAAA,IAAQ,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAa;AAClD,MAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,MAAA,IAAI,GAAA,IAAO,CAAA,IAAK,GAAA,GAAM,OAAA,CAAQ,MAAA,EAAQ;AACpC,QAAA,OAAA,CAAQ,GAAG,CAAA,CAAG,KAAA,GAAQ,GAAA,CAAI,KAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,UAAA,EAAsC;AACzD,IAAA,MAAM,IAAA,GAAO,UAAA,IAAc,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,UAAA;AACnD,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,KAAQ,IAAA,GAAO,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAElD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,EAAI;AAEnB,IAAA,OAAQ,MAAA,CAAO,MAAc,OAAA,IAAW,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,uBAAA,CAAwB,KAAA,GAAgB,EAAA,EAA8B;AAC1E,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC5B;AAAA,KACF,CAAE,IAAA,CAAK,KAAK,CAAA,CAAE,GAAA,EAAI;AAElB,IAAA,OAAA,CAAQ,QAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MAChD,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,eAAe,GAAA,CAAI,cAAA;AAAA,MACnB,SAAS,GAAA,CAAI,OAAA,GAAU,KAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AAAA,MACjD,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,OAAA,EAAS,CAAC,CAAC,GAAA,CAAI,OAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB,CAAE,CAAA;AAAA,EACJ;AACF,CAAA;;;ACjVAvB,qDAAA,EAAA;AAmBA,SAAS,gBAAgB,EAAA,EAAoB;AAC3C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,EAAE,CAAA;AACxB,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,OAAO,GAAA,GAAM,EAAA;AAEnB,EAAA,IAAI,IAAA,GAAO,KAAO,OAAO,UAAA;AACzB,EAAA,IAAI,IAAA,GAAO,MAAS,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,GAAK,CAAC,CAAA,KAAA,CAAA;AACtD,EAAA,IAAI,IAAA,GAAO,OAAU,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,IAAO,CAAC,CAAA,KAAA,CAAA;AACzD,EAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,CAAA;AAChH;AAEA,SAAS,cAAc,QAAA,EAA0B;AAC/C,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,IAAA,EAAM,kEAAA;AAAA,IACN,OAAA,EAAS,sEAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACA,EAAA,OAAO,kFAAkF,MAAA,CAAO,QAAQ,KAAK,MAAA,CAAO,IAAI,KAAK,QAAQ,CAAA,OAAA,CAAA;AACvI;AAEA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,aAAA,EAAe,UAAA;AAAA,IACf,aAAA,EAAe,cAAA;AAAA,IACf,YAAA,EAAc,cAAA;AAAA,IACd,eAAA,EAAiB,SAAA;AAAA,IACjB,mBAAA,EAAqB,YAAA;AAAA,IACrB,MAAA,EAAQ,QAAA;AAAA,IACR,sBAAA,EAAwB,gBAAA;AAAA,IACxB,iBAAA,EAAmB;AAAA,GACrB;AACA,EAAA,OAAO,MAAA,CAAO,IAAI,CAAA,IAAK,IAAA;AACzB;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,OAAO,CAAA,4BAAA,EAA+B,KAAK,CAAA,QAAA,CAAA;AAC1D,EAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,OAAO,CAAA,+BAAA,EAAkC,KAAK,CAAA,QAAA,CAAA;AAC7D,EAAA,OAAO,CAAA,qCAAA,CAAA;AACT;AAEA,SAAS,eAAe,IAAA,EAA8B;AACpD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,wDAAA;AAE9B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,EAAG,CAAC,CAAA;AAEjD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AACzB,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAK,EAAE,KAAA,GAAQ,GAAA,GAAO,KAAK,CAAC,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,KAAU,CAAA,GACtB,iCACA,CAAA,CAAE,KAAA,IAAS,GAAA,GAAM,IAAA,GACf,YAAA,GACA,CAAA,CAAE,KAAA,IAAS,GAAA,GAAM,MACf,cAAA,GACA,aAAA;AACR,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA,YAAA,EAIG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA;AAAA;AAAA,sBAAA,EAER,KAAK,iEAAiE,MAAM,CAAA;AAAA;AAAA,mDAAA,EAE/C,KAAK,MAAA,GAAS,EAAA,GAAK,oBAAoB,EAAE,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAGvG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAEV,EAAA,OAAO,sCAAsC,IAAI,CAAA,MAAA,CAAA;AACnD;AAEO,SAAS,wBAAwB,IAAA,EAAqC;AAC3E,EAAA,MAAM,EAAE,OAAO,MAAA,EAAQ,WAAA,EAAa,gBAAgB,IAAA,EAAM,OAAA,EAAS,kBAAiB,GAAI,IAAA;AAExF,EAAA,MAAMkB,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,2EAAA,EAyB2D,KAAA,CAAM,WAAA,CAAY,cAAA,EAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAKjG,MAAM,eAAe;AAAA,mDAAA,EACkB,UAAA,CAAW,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAAA,EAK1C,MAAM,cAAA,GAAiB,CAAA,GAAI,mCAAmC,+BAA+B,CAAA,EAAA,EAAK,MAAM,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA,4CAAA,EAItH,MAAM,UAAA,GAAa,CAAA,GAAI,uCAAuC,+BAA+B,CAAA,EAAA,EAAK,MAAM,UAAU,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EASpJ,cAAA,CAAe,WAAW,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAOzB,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,CAAE,MAAA,KAAW,CAAA,GAC5C,qEAAA,GACA,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,YAAY,EAChC,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,CAC5B,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AACzE,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAO,KAAA,GAAQ,KAAA,GAAS,GAAG,CAAA,GAAI,CAAA;AAC5D,IAAA,OAAO;AAAA;AAAA;AAAA,uEAAA,EAGgD,cAAA,CAAe,IAAI,CAAC,CAAA;AAAA,uEAAA,EACpB,KAAK,CAAA;AAAA;AAAA;AAAA,uDAAA,EAGrB,IAAA,KAAS,kBAAkB,YAAA,GAAe,IAAA,KAAS,kBAAkB,gBAAA,GAAmB,aAAa,mBAAmB,GAAG,CAAA;AAAA;AAAA;AAAA,kBAAA,CAAA;AAAA,EAIpK,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CACd;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAYA,MAAA,CAAO,MAAA,KAAW,CAAA,GAChB,sFAAA,GACA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAUI,MAAA,CAAO,IAAI,CAAA,EAAA,KAAM;AAAA;AAAA,6FAAA,EAE4D,GAAG,SAAS,CAAA;AAAA,mFAAA,EACtB,EAAA,CAAG,eAAe,GAAG,CAAA;AAAA,0EAAA,EAC9B,GAAG,cAAA,IAAkB,EAAA,GAAK,mCAAmC,kCAAkC,CAAA,EAAA,EAAK,GAAG,cAAc,CAAA;AAAA;AAAA,sBAAA,EAEzK,EAAA,CAAG,MAAA,GACD,4JAAA,GACA,4KACJ;AAAA;AAAA;AAAA,gBAAA,CAGL,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA,oBAAA,CAGjB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAQE,cAAA,CAAe,MAAA,KAAW,CAAA,GACxB,gFAAA,GACA,CAAA;AAAA,cAAA,EACE,eAAe,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAI,CAAA,KAAA,KAAS;AAAA;AAAA;AAAA;AAAA,sBAAA,EAIjC,aAAA,CAAc,KAAA,CAAM,QAAQ,CAAC;AAAA,yFAAA,EACsC,cAAA,CAAe,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA;AAAA,wDAAA,EAEhE,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA;AAAA;AAAA,oBAAA,EAGpE,MAAM,SAAA,GAAY,CAAA,IAAA,EAAO,KAAA,CAAM,SAAS,KAAK,EAAE;AAAA,oBAAA,EAC/C,MAAM,KAAA,GAAQ,CAAA,GAAA,EAAM,KAAA,CAAM,KAAK,KAAK,EAAE;AAAA;AAAA;AAAA,cAAA,CAG7C,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA,kBAAA,CAEf;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAMR,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,oBAAA;AAAA,IACP,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,+BAAA;AAAA,IACb,IAAA;AAAA,IACA,OAAA,EAAAA,QAAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOhB,4CAA0B,UAAU,CAAA;AAC7C;;;AC1PAF,qDAAA,EAAA;AAyBA,SAASwB,iBAAgB,EAAA,EAAoB;AAC3C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,EAAE,CAAA;AACxB,EAAA,OAAO,IAAA,CAAK,mBAAmB,OAAA,EAAS;AAAA,IACtC,KAAA,EAAO,OAAA;AAAA,IACP,GAAA,EAAK,SAAA;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAEA,SAASC,eAAc,QAAA,EAA0B;AAC/C,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,IAAA,EAAM,kEAAA;AAAA,IACN,OAAA,EAAS,sEAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACA,EAAA,OAAO,kFAAkF,MAAA,CAAO,QAAQ,KAAK,MAAA,CAAO,IAAI,KAAK,QAAQ,CAAA,OAAA,CAAA;AACvI;AAEA,SAASC,gBAAe,IAAA,EAAsB;AAC5C,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,aAAA,EAAe,8EAAA;AAAA,IACf,aAAA,EAAe,8DAAA;AAAA,IACf,YAAA,EAAc,kEAAA;AAAA,IACd,eAAA,EAAiB,8DAAA;AAAA,IACjB,mBAAA,EAAqB,0EAAA;AAAA,IACrB,MAAA,EAAQ,+DAAA;AAAA,IACR,sBAAA,EAAwB,sEAAA;AAAA,IACxB,iBAAA,EAAmB;AAAA,GACrB;AACA,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,aAAA,EAAe,UAAA;AAAA,IACf,aAAA,EAAe,cAAA;AAAA,IACf,YAAA,EAAc,cAAA;AAAA,IACd,eAAA,EAAiB,SAAA;AAAA,IACjB,mBAAA,EAAqB,YAAA;AAAA,IACrB,MAAA,EAAQ,QAAA;AAAA,IACR,sBAAA,EAAwB,gBAAA;AAAA,IACxB,iBAAA,EAAmB;AAAA,GACrB;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,IAAK,+DAAA;AAC9B,EAAA,OAAO,kFAAkF,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,IAAI,KAAK,IAAI,CAAA,OAAA,CAAA;AACzH;AAEA,SAAS,cAAA,CAAe,OAAA,EAA+B,SAAA,GAAoC,EAAC,EAAW;AACrG,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,CAAC,SAAA,CAAU,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAC,CAAA;AACtF,EAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,CAAC,SAAA,CAAU,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC5F,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAC,SAAA,CAAU,OAAO,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AACxE,EAAA,IAAI,OAAA,CAAQ,aAAa,CAAC,SAAA,CAAU,IAAI,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,OAAA,CAAQ,SAAS,CAAA;AAC1E,EAAA,IAAI,OAAA,CAAQ,UAAU,CAAC,SAAA,CAAU,QAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAA;AAE5E,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,IAAA,IAAI,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,EAAA,GAAK,OAAO,QAAA,EAAS;AAC3B,EAAA,OAAO,CAAA,oCAAA,EAAuC,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,EAAE,CAAA,CAAA;AAClE;AAEO,SAAS,mBAAmB,IAAA,EAAgC;AACjE,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAS,IAAA,EAAM,OAAA,EAAS,kBAAiB,GAAI,IAAA;AAEzE,EAAA,MAAMR,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2DAAA,EAM2C,WAAW,SAAS,CAAA,CAAA,EAAI,WAAW,OAAO,CAAA,IAAA,EAAO,WAAW,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAAA,EAkBrF,OAAA,CAAQ,SAAA,KAAc,eAAA,GAAkB,UAAA,GAAa,EAAE,CAAA;AAAA,4CAAA,EACvD,OAAA,CAAQ,SAAA,KAAc,eAAA,GAAkB,UAAA,GAAa,EAAE,CAAA;AAAA,2CAAA,EACxD,OAAA,CAAQ,SAAA,KAAc,cAAA,GAAiB,UAAA,GAAa,EAAE,CAAA;AAAA,8CAAA,EACnD,OAAA,CAAQ,SAAA,KAAc,iBAAA,GAAoB,UAAA,GAAa,EAAE,CAAA;AAAA,kDAAA,EACrD,OAAA,CAAQ,SAAA,KAAc,qBAAA,GAAwB,UAAA,GAAa,EAAE,CAAA;AAAA,qCAAA,EAC1E,OAAA,CAAQ,SAAA,KAAc,QAAA,GAAW,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAAA,EAOlD,OAAA,CAAQ,QAAA,KAAa,MAAA,GAAS,UAAA,GAAa,EAAE,CAAA;AAAA,sCAAA,EAC1C,OAAA,CAAQ,QAAA,KAAa,SAAA,GAAY,UAAA,GAAa,EAAE,CAAA;AAAA,uCAAA,EAC/C,OAAA,CAAQ,QAAA,KAAa,UAAA,GAAa,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mDAAA,EAKrC,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAAA,EAKtB,OAAA,CAAQ,aAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,QAAA,EAkB/D,MAAA,CAAO,WAAW,CAAA,GAChB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,CAAA,GAOA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAcM,MAAA,CAAO,IAAI,CAAA,KAAA,KAAS;AAAA;AAAA,qGAAA,EAEiEM,gBAAAA,CAAgB,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,0CAAA,EAC3FE,eAAAA,CAAe,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,0CAAA,EAC/BD,cAAAA,CAAc,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,0GAAA,EACmC,KAAA,CAAM,SAAS,GAAG,CAAA;AAAA,6FAAA,EAC/B,KAAA,CAAM,aAAa,GAAG,CAAA;AAAA,mFAAA,EAChC,KAAA,CAAM,eAAe,GAAG,CAAA;AAAA;AAAA,sBAAA,EAErF,KAAA,CAAM,OAAA,GACJ,6JAAA,GACA,6KACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+IAAA,EAM2H,KAAA,CAAM,EAAA,CAAG,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,oKAAA,EACH,KAAA,CAAM,aAAa,GAAG,CAAA;AAAA,iIAAA,EACzD,KAAA,CAAM,eAAe,GAAG,CAAA;AAAA,kJAAA,EACP,KAAA,CAAM,eAAe,GAAG,CAAA;AAAA,wBAAA,EAClJ,KAAA,CAAM,OAAA,GAAU,CAAA,+LAAA,EAAkM,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA,YAAA,CAAA,GAAiB,EAAE;AAAA;AAAA;AAAA;AAAA,gBAAA,CAIpR,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA,gBAAA,CAInB;;AAAA;AAAA,QAAA,EAGE,UAAA,CAAW,aAAa,CAAA,GAAI;AAAA;AAAA;AAAA,mBAAA,EAGjB,UAAA,CAAW,WAAW,CAAA,IAAA,EAAO,UAAA,CAAW,UAAU;AAAA;AAAA;AAAA,cAAA,EAGvD,UAAA,CAAW,cAAc,CAAA,GAAI;AAAA,yBAAA,EAClB,cAAA,CAAe,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,CAAO,WAAW,WAAA,GAAc,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA,GAI9E,EAAE;AAAA,cAAA,EACJ,UAAA,CAAW,WAAA,GAAc,UAAA,CAAW,UAAA,GAAa;AAAA,yBAAA,EACtC,cAAA,CAAe,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,CAAO,WAAW,WAAA,GAAc,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA,GAI9E,EAAE;AAAA;AAAA;AAAA,QAAA,CAAA,GAGR,EAAE;AAAA;AAAA;AAAA,EAAA,CAAA;AAKZ,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,oBAAA;AAAA,IACP,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,sCAAA;AAAA,IACb,IAAA;AAAA,IACA,OAAA,EAAAP,QAAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOhB,4CAA0B,UAAU,CAAA;AAC7C;;;ACvPAF,qDAAA,EAAA;AAiBO,SAAS,2BAA2B,IAAA,EAAwC;AACjF,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,kBAAiB,GAAI,IAAA;AAE/D,EAAA,MAAMkB,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAA,EAiBV,OAAA,GAAU;AAAA;AAAA,oEAAA,EAEoD,OAAO,CAAA;AAAA;AAAA,MAAA,CAAA,GAEnE,EAAE;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8EAAA,EAcoE,QAAA,CAAS,UAAA,CAAW,OAAA,GAAU,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mFAAA,EAQvC,QAAA,CAAS,WAAW,sBAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sFAAA,EAKvC,QAAA,CAAS,WAAW,yBAAyB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0EAAA,EAKzD,QAAA,CAAS,WAAW,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mFAAA,EAKxB,QAAA,CAAS,WAAW,sBAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2EAAA,EAKlD,QAAA,CAAS,WAAW,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qFAAA,EAYxB,QAAA,CAAS,OAAA,CAAQ,mBAAA,GAAsB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,4EAAA,EAK9D,QAAA,CAAS,OAAA,CAAQ,UAAA,GAAa,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,kFAAA,EAKtC,QAAA,CAAS,OAAA,CAAQ,gBAAA,GAAmB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,mFAAA,EAKjD,QAAA,CAAS,OAAA,CAAQ,iBAAA,GAAoB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,qFAAA,EAKjD,QAAA,CAAS,OAAA,CAAQ,mBAAA,GAAsB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sEAAA,EAapE,QAAA,CAAS,UAAU,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qEAAA,EAK9B,QAAA,CAAS,UAAU,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAKlB,QAAA,CAAS,SAAA,CAAU,SAAA,GAAY,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAwB5H,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,yBAAA;AAAA,IACP,SAAA,EAAW,yBAAA;AAAA,IACX,WAAA,EAAa,wCAAA;AAAA,IACb,IAAA;AAAA,IACA,OAAA,EAAAA,QAAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOhB,4CAA0B,UAAU,CAAA;AAC7C;;;AClKA,IAAMyB,YAAAA,GAAc,IAAIvB,SAAAA,EAAmD;AAE3EuB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAKtB,6BAAA,EAAa,CAAA;AAGlCsB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAA,KAAS;AACtC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,GAAG,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,IAAA,EAAK;AACd,CAAC,CAAA;AAED,eAAe,YAAY,EAAA,EAAyC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,IAAIC,+BAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAMrB,OAAAA,GAAS,MAAM,aAAA,CAAc,SAAA,CAAU,gBAAgB,CAAA;AAC7D,IAAA,IAAIA,SAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QAAA,GAAW,OAAOA,OAAAA,CAAO,QAAA,KAAa,QAAA,GAAW,KAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA,GAAIA,OAAAA,CAAO,QAAA;AAC5F,MAAA,OAAO,EAAE,GAAGgB,iBAAAA,EAAkB,GAAG,QAAA,EAAS;AAAA,IAC5C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAe;AACvB,EAAA,OAAOA,iBAAAA;AACT;AAGAI,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAChC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AAErD,EAAA,MAAM,CAAC,OAAO,MAAA,EAAQ,WAAA,EAAa,cAAc,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACrE,QAAQ,QAAA,EAAS;AAAA,IACjB,OAAA,CAAQ,UAAU,EAAE,CAAA;AAAA,IACpB,OAAA,CAAQ,eAAe,EAAE,CAAA;AAAA,IACzB,OAAA,CAAQ,wBAAwB,EAAE;AAAA,GACnC,CAAA;AAED,EAAA,MAAM,QAAA,GAAkC;AAAA,IACtC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC3C;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAC,CAAA;AACjD,CAAC,CAAA;AAGDA,YAAAA,CAAY,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAM;AACtC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AAErD,EAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,EAAA;AAEd,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,SAAA,EAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAA2B,MAAA;AAAA,IACzD,QAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,IAA0B,MAAA;AAAA,IAC3D,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,MAAA;AAAA,IAC/B,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,IAAK,MAAA;AAAA,IAChC,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA;AAAA,IACjC,IAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,KAAU,MAAM,OAAA,CAAQ,UAAU,OAAO,CAAA;AACzD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAA;AAE1C,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,WAAA,EAAa,IAAA;AAAA,MACb,UAAA;AAAA,MACA,UAAA,EAAY,KAAA;AAAA,MACZ,YAAA,EAAc,KAAA;AAAA,MACd,WAAW,KAAA,KAAU,CAAA,GAAI,CAAA,GAAA,CAAK,IAAA,GAAO,KAAK,KAAA,GAAQ,CAAA;AAAA,MAClD,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,OAAO,KAAK;AAAA,KACvC;AAAA,IACA,OAAA;AAAA,IACA,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC3C;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGDA,YAAAA,CAAY,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AACxC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,EAAE,CAAA;AAErC,EAAA,MAAM,QAAA,GAAqC;AAAA,IACzC,QAAA;AAAA,IACA,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,IAAK,MAAA;AAAA,IACnC,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC3C;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,0BAAA,CAA2B,QAAQ,CAAC,CAAA;AACpD,CAAC,CAAA;AAGDA,YAAAA,CAAY,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA,KAAM;AACzC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,SAAA,EAAU;AAEnC,EAAA,MAAM,QAAA,GAAkC;AAAA,IACtC,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,IAAA,CAAK,oBAAoB,CAAA,KAAM,MAAA;AAAA,MACxC,sBAAA,EAAwB,QAAA,CAAS,IAAA,CAAK,mCAAmC,CAAW,CAAA,IAAK,EAAA;AAAA,MACzF,yBAAA,EAA2B,QAAA,CAAS,IAAA,CAAK,sCAAsC,CAAW,CAAA,IAAK,CAAA;AAAA,MAC/F,aAAA,EAAe,QAAA,CAAS,IAAA,CAAK,0BAA0B,CAAW,CAAA,IAAK,EAAA;AAAA,MACvE,sBAAA,EAAwB,QAAA,CAAS,IAAA,CAAK,mCAAmC,CAAW,CAAA,IAAK,EAAA;AAAA,MACzF,cAAA,EAAgB,QAAA,CAAS,IAAA,CAAK,2BAA2B,CAAW,CAAA,IAAK;AAAA,KAC3E;AAAA,IACA,OAAA,EAAS;AAAA,MACP,mBAAA,EAAqB,IAAA,CAAK,6BAA6B,CAAA,KAAM,MAAA;AAAA,MAC7D,UAAA,EAAY,IAAA,CAAK,oBAAoB,CAAA,KAAM,MAAA;AAAA,MAC3C,gBAAA,EAAkB,IAAA,CAAK,0BAA0B,CAAA,KAAM,MAAA;AAAA,MACvD,iBAAA,EAAmB,IAAA,CAAK,2BAA2B,CAAA,KAAM,MAAA;AAAA,MACzD,mBAAA,EAAqB,IAAA,CAAK,6BAA6B,CAAA,KAAM;AAAA,KAC/D;AAAA,IACA,SAAA,EAAW;AAAA,MACT,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,sBAAsB,CAAW,CAAA,IAAK,EAAA;AAAA,MAChE,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,qBAAqB,CAAW,CAAA,IAAK,GAAA;AAAA,MAC9D,SAAA,EAAW,IAAA,CAAK,qBAAqB,CAAA,KAAM;AAAA;AAC7C,GACF;AAEA,EAAA,MAAM,aAAA,GAAgB,IAAIC,+BAAA,CAAc,EAAE,CAAA;AAC1C,EAAA,MAAM,aAAA,CAAc,oBAAA,CAAqB,gBAAA,EAAkB,QAAQ,CAAA;AAGnE,EAAA,IAAI,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC9B,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,CAAA,CAAE,SAAS,4EAA4E,CAAA;AAChG,CAAC,CAAA;;;AC3JD,IAAM,SAAA,GAAY,cAAA;AAClB,IAAM,WAAA,GAAc,kBAAA;AAEb,IAAM,qBAAN,MAAyB;AAAA,EAG9B,WAAA,CACU,IACR,QAAA,EACA;AAFQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAGR,IAAA,IAAA,CAAK,QAAA,GAAW,YAAYL,iBAAAA,CAAiB,UAAA;AAAA,EAC/C;AAAA,EAPQ,QAAA;AAAA,EASR,MAAM,mBAAA,CAAoB,EAAA,EAAY,KAAA,EAMnC;AACD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,OAAA,IAAW,CAAC,KAAK,EAAA,EAAI;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,cAAc,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,YAAA,EAAc,KAAA,EAAM;AAAA,IACvG;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,aAAA,GAAgB,EAAA,GAAK,GAAA;AAGpD,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,SAAS,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AAG3D,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AAGjE,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,SAAS,CAAA,UAAA,EAAa,EAAE,CAAA,CAAA;AAC/C,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAA;AAChD,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA;AACtD,IAAA,MAAM,eAAe,YAAA,IAAgB,CAAA;AAErC,IAAA,MAAM,YAAA,GAAe,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,sBAAA;AAC9C,IAAA,MAAM,eAAA,GAAkB,UAAA,IAAc,IAAA,CAAK,QAAA,CAAS,yBAAA;AAEpD,IAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,YAAA,EAAc,iBAAiB,YAAA,EAAa;AAAA,EAC5E;AAAA,EAEA,MAAM,QAAA,CAAS,EAAA,EAAY,KAAA,EAA8D;AACvF,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,OAAA,IAAW,CAAC,KAAK,EAAA,EAAI;AACtC,MAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,IACzB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG,WAAW,CAAA,GAAA,EAAM,EAAE,CAAA,CAAE,CAAA;AAC3D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,sEAAA,EAAuE;AAAA,IACxG;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG,WAAW,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AACpE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,mEAAA,EAAoE;AAAA,IACrG;AAEA,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EACzB;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,sBAAA,GAAyB,EAAA;AACnD,IAAA,MAAM,IAAA,CAAK,GAAG,GAAA,CAAI,CAAA,EAAG,WAAW,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU;AAAA,MACzD,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,MACnB,MAAA,EAAQ;AAAA,KACT,CAAA,EAAG,EAAE,aAAA,EAAe,KAAK,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,UAAU,KAAA,EAA8B;AAC5C,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,sBAAA,GAAyB,EAAA;AACnD,IAAA,MAAM,IAAA,CAAK,GAAG,GAAA,CAAI,CAAA,EAAG,WAAW,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU;AAAA,MAC/D,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,MACnB,MAAA,EAAQ;AAAA,KACT,CAAA,EAAG,EAAE,aAAA,EAAe,KAAK,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,SAAS,EAAA,EAA2B;AACxC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,KAAK,EAAA,CAAG,MAAA,CAAO,GAAG,WAAW,CAAA,GAAA,EAAM,EAAE,CAAA,CAAE,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,YAAY,KAAA,EAA8B;AAC9C,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,KAAK,EAAA,CAAG,MAAA,CAAO,GAAG,WAAW,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,iBAAA,GAA4G;AAChH,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,EAAC;AAEtB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,WAAW,CAAA,GAAA,CAAA,EAAO,CAAA;AAClE,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,WAAW,CAAA,MAAA,CAAA,EAAU,CAAA;AAExE,IAAA,MAAM,WAA0F,EAAC;AAEjG,IAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,IAAA,EAAM;AAC9B,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,IAAI,IAAI,CAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,KAAK,GAAA,CAAI,IAAA;AAAA,UACT,IAAA,EAAM,IAAA;AAAA,UACN,OAAO,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,EAAG,WAAW,OAAO,EAAE,CAAA;AAAA,UAC/C,UAAU,MAAA,CAAO;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,WAAW,IAAA,EAAM;AACjC,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,IAAI,IAAI,CAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,KAAK,GAAA,CAAI,IAAA;AAAA,UACT,IAAA,EAAM,OAAA;AAAA,UACN,OAAO,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,EAAG,WAAW,UAAU,EAAE,CAAA;AAAA,UAClD,UAAU,MAAA,CAAO;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,GAAA,EAA4B;AAC/C,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACd,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEA,sBAAsB,KAAA,EAAwB;AAC5C,IAAA,OAAO,KAAA,IAAS,KAAK,QAAA,CAAS,cAAA;AAAA,EAChC;AAAA,EAEA,MAAc,gBAAA,CAAiB,GAAA,EAAa,QAAA,EAAmC;AAC7E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,GAAG,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,UAAoB,EAAC;AACzB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,GAAU,EAAC;AAAA,MACb;AAAA,IACF;AAGA,IAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AACrB,IAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,EAAA,KAAM,EAAA,GAAK,MAAM,CAAA;AAG1C,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAGhB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,GAAI,CAAA;AAC5C,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG,EAAE,aAAA,EAAe,UAAA,EAAY,CAAA;AAE7E,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,EACjB;AAAA,EAEA,MAAc,QAAA,CAAS,GAAA,EAAa,KAAA,EAAe,QAAA,EAAiC;AAClF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,GAAG,CAAA;AACtC,IAAA,IAAI,MAA8B,EAAC;AACnC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AAErB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,MAC3B,CAAA,CAAA,MAAQ;AACN,QAAA,GAAA,GAAM,EAAC;AAAA,MACT;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACzC,MAAA,IAAI,EAAA,GAAK,MAAA,EAAQ,OAAO,GAAA,CAAI,CAAC,CAAA;AAAA,IAC/B;AAEA,IAAA,GAAA,CAAI,KAAK,CAAA,GAAI,GAAA;AAEb,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,GAAI,CAAA;AAC5C,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,EAAG,EAAE,aAAA,EAAe,UAAA,EAAY,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAc,WAAW,GAAA,EAA8B;AACrD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAI,GAAG,CAAA;AACtC,IAAA,IAAI,CAAC,UAAU,OAAO,CAAA;AAEtB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAC/B,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACF,CAAA;;;ACrMA,IAAMM,UAAAA,GAAY,IAAIzB,SAAAA,EAAmD;AAEzEyB,UAAAA,CAAU,GAAA,CAAI,GAAA,EAAKxB,6BAAA,EAAa,CAAA;AAGhCwB,UAAAA,CAAU,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAA,KAAS;AACpC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,eAAA,IAAmB,GAAG,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA,EAAK;AACd,CAAC,CAAA;AAED,eAAeC,aAAY,EAAA,EAAyC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,IAAIF,+BAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAMrB,OAAAA,GAAS,MAAM,aAAA,CAAc,SAAA,CAAU,gBAAgB,CAAA;AAC7D,IAAA,IAAIA,SAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QAAA,GAAW,OAAOA,OAAAA,CAAO,QAAA,KAAa,QAAA,GAAW,KAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA,GAAIA,OAAAA,CAAO,QAAA;AAC5F,MAAA,OAAO,EAAE,GAAGgB,iBAAAA,EAAkB,GAAG,QAAA,EAAS;AAAA,IAC5C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAe;AACvB,EAAA,OAAOA,iBAAAA;AACT;AAGAM,UAAAA,CAAU,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAM;AACpC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AAErD,EAAA,MAAM,OAAA,GAAgC;AAAA,IACpC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAAA,IAC7B,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AAAA,IAChC,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,MAAA;AAAA,IAC/B,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,IAAK,MAAA;AAAA,IAChC,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA;AAAA,IACjC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,MAAA;AAAA,IACpE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAE,CAAA,GAAI,MAAA;AAAA,IAC9D,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAE,CAAA,GAAI,CAAA;AAAA,IAC7D,OAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,OAAO,CAAE,CAAA,EAAG,GAAG,CAAA,GAAI,EAAA;AAAA,IAC/E,MAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAa,YAAA;AAAA,IAC1C,SAAA,EAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,IAAa;AAAA,GAClD;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAA;AAC9C,EAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AACtB,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,aAAA,EAAe,OAAO,CAAA,KAAM;AACxC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,EAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA;AAEtD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,iBAAA,IAAqB,GAAG,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AACrB,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAM;AACnC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,EAAS;AACrC,EAAA,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AACrB,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAM;AACvC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,EAAA;AACvE,EAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA;AACzC,EAAA,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACnB,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,cAAA,EAAgB,OAAO,CAAA,KAAM;AACzC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,EAAA;AACvE,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA;AAChD,EAAA,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AACrB,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AACtC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,QAAA;AACjB,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,IAAI,kBAAA,CAAmB,EAAA,EAAI,SAAS,UAAU,CAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,iBAAA,EAAkB;AAClD,EAAA,OAAO,CAAA,CAAE,KAAK,QAAQ,CAAA;AACxB,CAAC,CAAA;AAGDD,UAAAA,CAAU,MAAA,CAAO,gBAAA,EAAkB,OAAO,CAAA,KAAM;AAC9C,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,QAAA;AACjB,EAAA,MAAM,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA;AACjD,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,IAAI,kBAAA,CAAmB,EAAA,EAAI,SAAS,UAAU,CAAA;AAC/D,EAAA,MAAM,QAAA,CAAS,eAAe,GAAG,CAAA;AACjC,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AACjC,CAAC,CAAA;AAGDD,UAAAA,CAAU,IAAA,CAAK,eAAA,EAAiB,OAAO,CAAA,KAAM;AAC3C,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,cAAA,CAAe,KAAK,UAAU,CAAA;AAC5D,EAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAC1C,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAM;AACpC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA;AAExC,EAAA,MAAM,OAAA,GAAgC;AAAA,IACpC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAAA,IAC7B,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AAAA,IAChC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,MAAA;AAAA,IACpE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAE,CAAA,GAAI,MAAA;AAAA,IAC9D,KAAA,EAAO,GAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,OAAA,CAAQ,UAAU,OAAO,CAAA;AAElD,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAM,YAAA,EAAc,YAAY,OAAA,EAAS,YAAA,EAAc,cAAA,EAAgB,SAAA,EAAW,YAAY,CAAA;AAC/G,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAClC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,KAAA,CAAM,EAAA;AAAA,QACN,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM,QAAA;AAAA,QACN,MAAM,KAAA,IAAS,EAAA;AAAA,QACf,MAAM,SAAA,IAAa,EAAA;AAAA,QACnB,MAAM,WAAA,IAAe,EAAA;AAAA,QACrB,KAAA,CAAM,UAAU,GAAA,GAAM,GAAA;AAAA,QACtB,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,WAAA;AAAY,OACxC,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAA,EAAI,OAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,IAAI,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,MACtC,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,UAAA;AAAA,QAChB,qBAAA,EAAuB,CAAA,sCAAA,EAAyC,IAAA,CAAK,GAAA,EAAK,CAAA,KAAA;AAAA;AAC5E,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AACtB,CAAC,CAAA;;;ACvKD,SAAS,mBAAmB,CAAA,EAA0D;AACpF,EAAA,MAAM,KAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,KACrC,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,GAAG,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,EAAG,MAAK,IACrD,SAAA;AACL,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,IAAK,SAAA;AAChD,EAAA,MAAM,WAAA,GAAc,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,cAAc,CAAA,IAAK,IAAA;AACpD,EAAA,MAAM,OAAO,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAChC,EAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AAErB,EAAA,OAAO,EAAE,EAAA,EAAI,SAAA,EAAW,WAAA,EAAa,MAAM,MAAA,EAAO;AACpD;AAEA,SAAS,mBAAA,CAAoB,IAAY,SAAA,EAA2B;AAElE,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC7B,IAAA,IAAA,GAAA,CAAS,IAAA,IAAQ,KAAK,IAAA,GAAQ,IAAA;AAC9B,IAAA,IAAA,IAAQ,CAAA;AAAA,EACV;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CAAE,SAAS,EAAE,CAAA;AACnC;AAEA,eAAe,kBAAkB,EAAA,EAAyC;AACxE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,IAAIF,+BAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAMrB,OAAAA,GAAS,MAAM,aAAA,CAAc,SAAA,CAAU,gBAAgB,CAAA;AAC7D,IAAA,IAAIA,SAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QAAA,GAAW,OAAOA,OAAAA,CAAO,QAAA,KAAa,QAAA,GAAW,KAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA,GAAIA,OAAAA,CAAO,QAAA;AAC5F,MAAA,OAAO,EAAE,GAAGgB,iBAAAA,EAAkB,GAAG,QAAA,EAAS;AAAA,IAC5C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAOA,iBAAAA;AACT;AAEA,eAAeQ,gBAAe,EAAA,EAA2B;AACvD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,OAAA;AAAA,MACtB;AAAA,MACA,KAAA,EAAM;AACR,IAAA,OAAO,QAAQ,MAAA,KAAW,QAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAO,OAAO,GAA0D,IAAA,KAAe;AACrF,IAAA,MAAM,OAAO,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAGhC,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,IAAI,CAAC,MAAMA,eAAAA,CAAe,EAAE,CAAA,EAAG;AAC7B,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,CAAkB,EAAE,CAAA;AAC3C,IAAA,MAAM,EAAE,EAAA,EAAI,SAAA,EAAW,aAAa,MAAA,EAAO,GAAI,mBAAmB,CAAC,CAAA;AACnE,IAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,EAAA,EAAI,SAAS,CAAA;AAGrD,IAAA,MAAM,WAAA,GAAA,CAAe,IAAA,KAAS,aAAA,IAAiB,IAAA,KAAS,uBAAuB,MAAA,KAAW,MAAA;AAC1F,IAAA,IAAI,iBAAA,GAAoB,EAAA;AAExB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI;AACF,QAAA,IAAI,SAAS,kBAAA,EAAoB;AAE/B,UAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,GAAA,CAAI,KAAA,EAAM;AAClC,UAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,QAAA,EAAS;AAC1C,UAAA,iBAAA,GAAA,CAAqB,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,IAAe,IAAI,WAAA,EAAY;AAAA,QAC1E,CAAA,MAAO;AAEL,UAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,UAAA,iBAAA,GAAoB,IAAA,EAAM,KAAA,EAAO,WAAA,EAAY,IAAK,EAAA;AAAA,QACpD;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,IAAI,iBAAA,IAAqB,QAAA,CAAS,UAAA,CAAW,OAAA,EAAS;AACpD,QAAA,MAAM,WAAW,IAAI,kBAAA,CAAmB,EAAE,GAAA,CAAI,QAAA,EAAU,SAAS,UAAU,CAAA;AAC3E,QAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,QAAA,CAAS,IAAI,iBAAiB,CAAA;AAEhE,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AAErD,UAAA,MAAMC,WAAAA,GAAa,QAAQ,QAAA,CAAS;AAAA,YAClC,SAAA,EAAW,eAAA;AAAA,YACX,QAAA,EAAU,SAAA;AAAA,YACV,KAAA,EAAO,iBAAA;AAAA,YACP,SAAA,EAAW,EAAA;AAAA,YACX,SAAA;AAAA,YACA,aAAa,WAAA,IAAe,MAAA;AAAA,YAC5B,WAAA,EAAa,IAAA;AAAA,YACb,aAAA,EAAe,MAAA;AAAA,YACf,WAAA;AAAA,YACA,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,EAAE,MAAA,EAAQ,UAAA,CAAW,MAAA;AAAO,WACtC,CAAA;AAED,UAAA,IAAI,CAAA,CAAE,cAAc,SAAA,EAAW;AAC7B,YAAA,CAAA,CAAE,YAAA,CAAa,UAAUA,WAAU,CAAA;AAAA,UACrC;AAEA,UAAA,OAAO,EAAE,IAAA,CAAK;AAAA,YACZ,KAAA,EAAO,WAAW,MAAA,IAAU;AAAA,aAC3B,GAAG,CAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,EAAK;AAGX,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,EAAG,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,WAAA,EAAa,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,iBAAiB,CAAA;AAEzH,IAAA,IAAI,CAAA,CAAE,cAAc,SAAA,EAAW;AAC7B,MAAA,CAAA,CAAE,YAAA,CAAa,UAAU,UAAU,CAAA;AAAA,IACrC;AAAA,EACF,CAAA;AACF;AAEA,eAAe,YAAA,CACb,CAAA,EACA,EAAA,EACA,QAAA,EACA,EAAA,EACA,SAAA,EACA,WAAA,EACA,WAAA,EACA,IAAA,EACA,MAAA,EACA,iBAAA,GAA4B,EAAA,EACb;AACf,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAA,EAAI,QAAQ,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AACrB,IAAA,MAAM,WAAA,GAAA,CAAe,IAAA,KAAS,aAAA,IAAiB,IAAA,KAAS,uBAAuB,MAAA,KAAW,MAAA;AAC1F,IAAA,MAAM,cAAc,IAAA,KAAS,kBAAA;AAG7B,IAAA,IAAI,WAAA,EAAa;AAIf,MAAA,IAAI,cAAA;AACJ,MAAA,IAAI,WAAA,EAAa;AAEf,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,IAAI,aAAa,CAAA;AAClD,QAAA,MAAM,kBAAkB,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,IAAK,EAAA;AAC3D,QAAA,cAAA,GAAiB,CAAC,EAAE,UAAA,EAAY,QAAA,CAAS,QAAQ,CAAA,IAAK,eAAA,CAAgB,SAAS,YAAY,CAAA,CAAA;AAAA,MAC7F,CAAA,MAAO;AACL,QAAA,cAAA,GAAiB,MAAA,KAAW,GAAA;AAAA,MAC9B;AAEA,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,mBAAA,EAAqB;AAG3C,QAAA,IAAI,KAAA,GAAQ,iBAAA;AACZ,QAAA,IAAI,MAAA,GAAS,EAAA;AACb,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,EAAM;AAC3B,YAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,YAAA,KAAA,GAAQ,IAAA,EAAM,MAAM,KAAA,IAAS,KAAA;AAC7B,YAAA,MAAA,GAAS,IAAA,EAAM,MAAM,EAAA,IAAM,EAAA;AAAA,UAC7B,CAAA,CAAA,MAAQ;AAAA,UAAe;AAAA,QACzB;AAEA,QAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,UACrB,SAAA,EAAW,eAAA;AAAA,UACX,QAAA,EAAU,MAAA;AAAA,UACV,QAAQ,MAAA,IAAU,KAAA,CAAA;AAAA,UAClB,OAAO,KAAA,IAAS,KAAA,CAAA;AAAA,UAChB,SAAA,EAAW,EAAA;AAAA,UACX,SAAA;AAAA,UACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,UAC5B,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe,MAAA;AAAA,UACf;AAAA,SACD,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,MAAM,KAAA,GAAQ,iBAAA;AAEd,QAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,UACrB,SAAA,EAAW,eAAA;AAAA,UACX,QAAA,EAAU,SAAA;AAAA,UACV,OAAO,KAAA,IAAS,KAAA,CAAA;AAAA,UAChB,SAAA,EAAW,EAAA;AAAA,UACX,SAAA;AAAA,UACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,UAC5B,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe,MAAA;AAAA,UACf,WAAA;AAAA,UACA,OAAA,EAAS,EAAE,UAAA,EAAY,MAAA;AAAO,SAC/B,CAAA;AAGD,QAAA,IAAI,KAAA,IAAS,QAAA,CAAS,UAAA,CAAW,OAAA,EAAS;AACxC,UAAA,MAAM,WAAW,IAAI,kBAAA,CAAmB,EAAE,GAAA,CAAI,QAAA,EAAU,SAAS,UAAU,CAAA;AAC3E,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,mBAAA,CAAoB,IAAI,KAAK,CAAA;AAE3D,UAAA,IAAI,OAAO,YAAA,EAAc;AACvB,YAAA,MAAM,QAAA,CAAS,OAAO,EAAE,CAAA;AACxB,YAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,cACrB,SAAA,EAAW,iBAAA;AAAA,cACX,QAAA,EAAU,UAAA;AAAA,cACV,KAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,cACX,SAAA;AAAA,cACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,cAC5B,WAAA,EAAa,IAAA;AAAA,cACb,aAAA,EAAe,MAAA;AAAA,cACf,WAAA;AAAA,cACA,SAAS,EAAE,MAAA,EAAQ,gBAAA,EAAkB,YAAA,EAAc,OAAO,OAAA;AAAQ,aACnE,CAAA;AAAA,UACH;AAEA,UAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,YAAA,MAAM,QAAA,CAAS,UAAU,KAAK,CAAA;AAC9B,YAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,cACrB,SAAA,EAAW,iBAAA;AAAA,cACX,QAAA,EAAU,UAAA;AAAA,cACV,KAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,cACX,SAAA;AAAA,cACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,cAC5B,WAAA,EAAa,IAAA;AAAA,cACb,aAAA,EAAe,MAAA;AAAA,cACf,WAAA;AAAA,cACA,SAAS,EAAE,MAAA,EAAQ,mBAAA,EAAqB,YAAA,EAAc,OAAO,UAAA;AAAW,aACzE,CAAA;AAAA,UACH;AAEA,UAAA,IAAI,OAAO,YAAA,EAAc;AACvB,YAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,cACrB,SAAA,EAAW,qBAAA;AAAA,cACX,QAAA,EAAU,UAAA;AAAA,cACV,SAAA,EAAW,EAAA;AAAA,cACX,SAAA;AAAA,cACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,cAC5B,WAAA,EAAa,IAAA;AAAA,cACb,aAAA,EAAe,MAAA;AAAA,cACf,WAAA;AAAA,cACA,SAAS,EAAE,MAAA,EAAQ,yBAAA,EAA2B,OAAA,EAAS,OAAO,OAAA;AAAQ,aACvE,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,SAAS,gBAAA,IAAoB,MAAA,KAAW,MAAA,IAAU,QAAA,CAAS,QAAQ,gBAAA,EAAkB;AACvF,MAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,QAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,QAAA,IAAI,MAAA,GAAS,EAAA;AACb,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,EAAM;AAC3B,UAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,UAAA,KAAA,GAAQ,IAAA,EAAM,MAAM,KAAA,IAAS,EAAA;AAC7B,UAAA,MAAA,GAAS,IAAA,EAAM,MAAM,EAAA,IAAM,EAAA;AAAA,QAC7B,CAAA,CAAA,MAAQ;AAAA,QAAe;AAEvB,QAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,UACrB,SAAA,EAAW,cAAA;AAAA,UACX,QAAA,EAAU,MAAA;AAAA,UACV,QAAQ,MAAA,IAAU,KAAA,CAAA;AAAA,UAClB,OAAO,KAAA,IAAS,KAAA,CAAA;AAAA,UAChB,SAAA,EAAW,EAAA;AAAA,UACX,SAAA;AAAA,UACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,UAC5B,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe,MAAA;AAAA,UACf;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,KAAS,cAAA,IAAkB,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY;AAC1D,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,MAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,QACrB,SAAA,EAAW,QAAA;AAAA,QACX,QAAA,EAAU,MAAA;AAAA,QACV,QAAQ,IAAA,EAAM,MAAA;AAAA,QACd,OAAO,IAAA,EAAM,KAAA;AAAA,QACb,SAAA,EAAW,EAAA;AAAA,QACX,SAAA;AAAA,QACA,aAAa,WAAA,IAAe,KAAA,CAAA;AAAA,QAC5B,WAAA,EAAa,IAAA;AAAA,QACb,aAAA,EAAe,MAAA;AAAA,QACf;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAAA,EAClE;AACF;;;ACxTO,SAAS,yBAAA,GAAoC;AAClD,EAAA,MAAM,OAAA,GAAU1B,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ,EAAE,IAAA,EAAM,cAAA,EAAe;AAAA,IAC/B,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,iCAAiCqB,YAAAA,EAAiC;AAAA,IACjF,WAAA,EAAa,0CAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,uBAAuBE,UAAAA,EAA+B;AAAA,IACrE,WAAA,EAAa,8BAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,WAAA,CAAY,YAAY,+BAAA,EAAiC;AAAA,IAC/D,IAAA,EAAM,CAAA,2VAAA,CAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACR,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,OAAA,EAAS,OAAO,OAAA,KAAY;AAC1B,MAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,QAAA,EAAU,OAAO,OAAA,KAAY;AAC3B,MAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,UAAA,EAAY,OAAO,OAAA,KAAY;AAC7B,MAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,SAAA,EAAW,OAAO,OAAA,KAAY;AAC5B,MAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAAA,IAClD;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAEO,IAAM,sBAAsB,yBAAA,EAA0B;;;AC7CtD,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,MAAM,WAAA,GAA6B;AACjC,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAcrB,EAAE,GAAA,EAAI;AAGP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAAA,EAAiD;AAC5D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIpC,CAAA,CAAE,IAAA;AAAA,MACD,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,gBAAA;AAAA,MACL,IAAA,CAAK,oBAAA;AAAA,MACL,IAAA,CAAK,aAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,kBAAA;AAAA,MACL,IAAA,CAAK,gBAAA;AAAA,MACL,IAAA,CAAK,oBAAoB,CAAA,GAAI;AAAA,MAC7B,KAAA,EAAM;AAER,IAAA,OAAO,IAAA,CAAK,OAAO,MAAa,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAAA,EAAiD;AAC5D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAWpC,CAAA,CAAE,IAAA;AAAA,MACD,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,gBAAA;AAAA,MACL,IAAA,CAAK,oBAAA;AAAA,MACL,IAAA,CAAK,aAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,kBAAA;AAAA,MACL,IAAA,CAAK,gBAAA;AAAA,MACL,IAAA,CAAK,oBAAoB,CAAA,GAAI;AAAA,MAC7B,KAAA,EAAM;AAER,IAAA,OAAO,IAAA,CAAK,OAAO,MAAa,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CAAiB,oBAAA,EAA8B,IAAA,EAAiE;AACpH,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,MAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IACzB;AACA,IAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAW;AACpC,MAAA,IAAA,CAAK,KAAK,qBAAqB,CAAA;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,aAAa,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,IAAA,CAAK,uBAAuB,MAAA,EAAW;AACzC,MAAA,IAAA,CAAK,KAAK,0BAA0B,CAAA;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,kBAAkB,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,IAAA,CAAK,qBAAqB,MAAA,EAAW;AACvC,MAAA,IAAA,CAAK,KAAK,wBAAwB,CAAA;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,gBAAgB,CAAA;AAAA,IACnC;AACA,IAAA,IAAI,IAAA,CAAK,sBAAsB,MAAA,EAAW;AACxC,MAAA,IAAA,CAAK,KAAK,0BAA0B,CAAA;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,iBAAA,GAAoB,CAAA,GAAI,CAAC,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA,CAAK,0BAA0B,oBAAoB,CAAA;AAEjF,IAAA,IAAA,CAAK,KAAK,0BAA0B,CAAA;AACpC,IAAA,MAAA,CAAO,KAAK,oBAAoB,CAAA;AAEhC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA,+BAAA,EACR,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAAA,CAC3C,CAAA,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,KAAA,EAAM;AAEzB,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAa,CAAA,GAAI,IAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,oBAAA,EAA4D;AAC1F,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,oBAAoB,CAAA,CAAE,KAAA,EAAM;AACnC,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAa,CAAA,GAAI,IAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAA,EAA8C;AAC9D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,EAAM;AACrB,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAa,CAAA,GAAI,IAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,gBAAA,EAAwD;AAClF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,gBAAgB,CAAA,CAAE,KAAA,EAAM;AAC/B,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAa,CAAA,GAAI,IAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,gBAAA,EAAkD;AAChF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,gBAAgB,CAAA,CAAE,KAAA,EAAM;AAC/B,IAAA,OAAO,QAAQ,OAAA,IAAW,IAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,OAAA,GAA+B,EAAC,EAA8D;AACvG,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,MAAA,KAAA,CAAM,KAAK,wBAAwB,CAAA;AACnC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,gBAAgB,CAAA;AAAA,IACtC;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,GAAS,CAAA,GAAI,SAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AACxE,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,YAAA;AACjC,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,MAAA;AACvC,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,KAAA,IAAS,IAAI,GAAG,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAA,CAAU,OAAO,CAAA,IAAK,KAAA;AAG5B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAChC,+CAA+C,WAAW,CAAA;AAAA,KAC5D,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,KAAA,EAAM;AAGxB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC5B,CAAA,6FAAA,EAAgG,WAAW,CAAA,UAAA,EAAa,MAAM,IAAI,SAAS,CAAA,iBAAA;AAAA,MAC3I,IAAA,CAAK,GAAG,QAAQ,KAAA,EAAO,MAAM,EAAE,GAAA,EAAI;AAErC,IAAA,OAAO;AAAA,MACL,aAAA,EAAA,CAAgB,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MACrE,KAAA,EAAO,aAAa,KAAA,IAAS;AAAA,KAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAAuC;AAC3C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQpC,EAAE,KAAA,EAAM;AAET,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,QAAQ,KAAA,IAAS,CAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,CAAA;AAAA,MAC1B,QAAA,EAAU,QAAQ,QAAA,IAAY,CAAA;AAAA,MAC9B,OAAA,EAAS,QAAQ,QAAA,IAAY,CAAA;AAAA,MAC7B,QAAA,EAAU,QAAQ,QAAA,IAAY;AAAA,KAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,oBAAA,EAAgD;AACrE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,oBAAoB,CAAA,CAAE,GAAA,EAAI;AACjC,IAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,OAAA,IAAW,CAAA,IAAK,CAAA;AAAA,EACvC;AAAA,EAEQ,OAAO,GAAA,EAAwC;AACrD,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,kBAAkB,GAAA,CAAI,kBAAA;AAAA,MACtB,sBAAsB,GAAA,CAAI,sBAAA;AAAA,MAC1B,eAAe,GAAA,CAAI,eAAA;AAAA,MACnB,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,oBAAoB,GAAA,CAAI,oBAAA;AAAA,MACxB,kBAAkB,GAAA,CAAI,kBAAA;AAAA,MACtB,iBAAA,EAAmB,CAAC,CAAC,GAAA,CAAI,oBAAA;AAAA,MACzB,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI,UAAA;AAAA;AAAA,MAEf,GAAI,IAAI,UAAA,GAAa,EAAE,WAAW,GAAA,CAAI,UAAA,KAAe;AAAC,KACxD;AAAA,EACF;AACF,CAAA;;;AC5QO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA,EAErC,MAAM,WAAA,GAA6B;AACjC,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAYrB,EAAE,GAAA,EAAI;AAEP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,IAAA,CAErB,EAAE,GAAA,EAAI;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,KAAA,EAQQ;AAChB,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAOrB,CAAA,CAAE,IAAA;AAAA,MACD,KAAA,CAAM,aAAA;AAAA,MACN,KAAA,CAAM,IAAA;AAAA,MACN,KAAA,CAAM,QAAA;AAAA,MACN,KAAA,CAAM,UAAA;AAAA,MACN,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,MACzB,KAAA,CAAM,MAAA;AAAA,MACN,MAAM,KAAA,IAAS;AAAA,MACf,GAAA,EAAI;AAAA,EACR;AAAA,EAEA,MAAM,IAAA,CAAK,OAAA,GAA8B,EAAC,EAA4D;AACpG,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,GAAS,CAAA,GAAI,SAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AACxE,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,KAAA,IAAS,IAAI,GAAG,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAA,CAAU,OAAO,CAAA,IAAK,KAAA;AAE5B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAChC,+CAA+C,WAAW,CAAA;AAAA,KAC5D,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,KAAA,EAAM;AAExB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC5B,+BAA+B,WAAW,CAAA,4CAAA;AAAA,MAC1C,IAAA,CAAK,GAAG,QAAQ,KAAA,EAAO,MAAM,EAAE,GAAA,EAAI;AAErC,IAAA,OAAO;AAAA,MACL,MAAA,EAAA,CAAS,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC9D,KAAA,EAAO,aAAa,KAAA,IAAS;AAAA,KAC/B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAAsC;AAC1C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAOpC,EAAE,KAAA,EAAM;AAET,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,QAAQ,KAAA,IAAS,CAAA;AAAA,MACxB,SAAA,EAAW,QAAQ,SAAA,IAAa,CAAA;AAAA,MAChC,MAAA,EAAQ,QAAQ,MAAA,IAAU,CAAA;AAAA,MAC1B,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,KAC9B;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,GAAsC;AAC1C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC5B;AAAA,MACA,GAAA,EAAI;AACN,IAAA,OAAA,CAAQ,OAAA,CAAQ,WAAW,EAAC,EAAG,IAAI,CAAC,CAAA,KAAW,EAAE,IAAI,CAAA;AAAA,EACvD;AAAA,EAEQ,OAAO,GAAA,EAA6C;AAC1D,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,eAAe,GAAA,CAAI,eAAA;AAAA,MACnB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,YAAY,GAAA,CAAI,WAAA;AAAA,MAChB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,KAAA,EAAO,IAAI,KAAA,IAAS;AAAA,KACtB;AAAA,EACF;AACF,CAAA;;;ACvIA7B,qDAAA,EAAA;;;ACGA,IAAM,IAAA,GAAO;AAAA,EACX,EAAE,KAAA,EAAO,eAAA,EAAiB,IAAA,EAAM,uBAAA,EAAwB;AAAA,EACxD,EAAE,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,8BAAA,EAA+B;AAAA,EACxD,EAAE,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,gCAAA;AAC7B,CAAA;AAEO,SAAS,mBAAmB,WAAA,EAA6B;AAC9D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO;AAC3B,IAAA,MAAM,WAAW,WAAA,KAAgB,GAAA,CAAI,QAC/B,GAAA,CAAI,IAAA,KAAS,2BAA2B,WAAA,KAAgB,wBAAA;AAC9D,IAAA,OAAO;AAAA,eAAA,EACM,IAAI,IAAI,CAAA;AAAA,eAAA,EACR,QAAA,GACL,kDACA,mJACJ,CAAA;AAAA,QAAA,EACE,IAAI,KAAK;AAAA,UAAA,CAAA;AAAA,EAEjB,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAEV,EAAA,OAAO;AAAA;AAAA;AAAA,QAAA,EAGC,IAAI;AAAA;AAAA;AAAA,EAAA,CAAA;AAId;;;ADlBO,SAAS,wBAAwB,IAAA,EAA8B;AACpE,EAAA,MAAM,EAAE,aAAA,EAAe,KAAA,EAAO,SAAS,IAAA,EAAM,OAAA,EAAS,kBAAiB,GAAI,IAAA;AAE3E,EAAA,MAAMkB,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAA,EAiBV,kBAAA,CAAmB,uBAAuB,CAAC;;AAAA;AAAA;AAAA,QAAA,EAIzC,SAAA,CAAU,OAAA,EAAS,KAAA,CAAM,KAAA,EAAO,+BAA+B,CAAC;AAAA,QAAA,EAChE,SAAA,CAAU,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,wCAAwC,CAAC;AAAA,QAAA,EAC3E,SAAA,CAAU,UAAA,EAAY,KAAA,CAAM,QAAA,EAAU,kCAAkC,CAAC;AAAA,QAAA,EACzE,SAAA,CAAU,UAAA,EAAY,KAAA,CAAM,OAAA,EAAS,oCAAoC,CAAC;AAAA,QAAA,EAC1E,SAAA,CAAU,UAAA,EAAY,KAAA,CAAM,QAAA,EAAU,gCAAgC,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EASnE,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EACtC,YAAA,CAAa,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EACxC,YAAA,CAAa,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EACxC,YAAA,CAAa,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EACxC,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EACtC,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAC;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAmBtC,aAAA,CAAc,MAAA,KAAW,CAAA,GACvB,qHAAA,GACA,aAAA,CAAc,IAAI,SAAS,CAAA,CAAE,IAAA,CAAK,EAAE,CACxC;AAAA;AAAA;;AAAA,QAAA,EAIFe,kBAAiB,OAAA,CAAQ,IAAA,EAAM,QAAQ,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAC;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAkC1E,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,sBAAA;AAAA,IACP,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,uBAAA;AAAA,IACb,IAAA;AAAA,IACA,OAAA,EAAAf,QAAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOhB,4CAA0B,UAAU,CAAA;AAC7C;AAEA,SAAS,SAAA,CAAU,KAAA,EAAe,KAAA,EAAe,UAAA,EAA4B;AAC3E,EAAA,OAAO;AAAA;AAAA,sEAAA,EAE+D,KAAK,CAAA;AAAA,wCAAA,EACnC,UAAU,KAAK,KAAK,CAAA;AAAA;AAAA,EAAA,CAAA;AAG9D;AAEA,SAAS,YAAA,CAAa,OAAe,OAAA,EAA0B;AAC7D,EAAA,MAAM,QAAA,GAAW,KAAA,KAAU,OAAA,GAAU,UAAA,GAAa,EAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA;AAC3E,EAAA,OAAO,CAAA,eAAA,EAAkB,KAAK,CAAA,EAAA,EAAK,QAAQ,IAAI,KAAK,CAAA,SAAA,CAAA;AACtD;AAEA,SAAS,YAAY,MAAA,EAAoC;AACvD,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,MAAA,EAAQ,8EAAA;AAAA,IACR,QAAA,EAAU,kEAAA;AAAA,IACV,QAAA,EAAU,sEAAA;AAAA,IACV,QAAA,EAAU,8DAAA;AAAA,IACV,MAAA,EAAQ,0EAAA;AAAA,IACR,MAAA,EAAQ,kEAAA;AAAA,IACR,UAAA,EAAY,kEAAA;AAAA,IACZ,kBAAA,EAAoB;AAAA,GACtB;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAA,IAAK,+CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AACrC,EAAA,OAAO,CAAA,mGAAA,EAAsG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,OAAA,CAAA;AAC9H;AAEA,SAAS,WAAW,SAAA,EAA2B;AAC7C,EAAA,IAAI,CAAC,WAAW,OAAO,GAAA;AACvB,EAAA,OAAO,IAAI,IAAA,CAAK,SAAA,GAAY,GAAI,CAAA,CAAE,mBAAmB,OAAA,EAAS;AAAA,IAC5D,KAAA,EAAO,OAAA;AAAA,IACP,GAAA,EAAK,SAAA;AAAA,IACL,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAEA,SAAS,UAAU,GAAA,EAAoD;AACrE,EAAA,OAAO;AAAA;AAAA;AAAA,uEAAA,EAGgE,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,MAAM,CAAA;AAAA,8DAAA,EACpC,IAAI,gBAAgB,CAAA;AAAA;AAAA,8CAAA,EAEpC,WAAA,CAAY,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,uFAAA,EACkB,IAAI,aAAa,CAAA;AAAA;AAAA,QAAA,EAEhG,UAAA,CAAW,IAAI,kBAAkB,CAAC,MAAM,UAAA,CAAW,GAAA,CAAI,gBAAgB,CAAC;AAAA;AAAA;AAAA,QAAA,EAGxE,GAAA,CAAI,iBAAA,GACF,yEAAA,GACA,0DACJ;AAAA;AAAA;AAAA,4DAAA,EAGsD,IAAI,oBAAoB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAQtF;AAEA,SAAS+B,iBAAAA,CAAiB,IAAA,EAAc,UAAA,EAAoB,MAAA,EAAyB;AACnF,EAAA,IAAI,UAAA,IAAc,GAAG,OAAO,EAAA;AAE5B,EAAA,MAAM,MAAA,GAAS,MAAA,GAAS,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA,GAAK,EAAA;AAC9C,EAAA,OAAO;AAAA;AAAA;AAAA,aAAA,EAGM,IAAI,OAAO,UAAU;AAAA;AAAA;AAAA,QAAA,EAG1B,IAAA,GAAO,IACL,CAAA,eAAA,EAAkB,IAAA,GAAO,CAAC,CAAA,EAAG,MAAM,oLACnC,EACJ;AAAA,QAAA,EACE,IAAA,GAAO,aACL,CAAA,eAAA,EAAkB,IAAA,GAAO,CAAC,CAAA,EAAG,MAAM,gLACnC,EACJ;AAAA;AAAA;AAAA,EAAA,CAAA;AAIR;;;AEzNAjC,qDAAA,EAAA;AAaO,SAAS,iBAAiB,IAAA,EAA8B;AAC7D,EAAA,MAAM,EAAE,QAAQ,KAAA,EAAO,KAAA,EAAO,SAAS,IAAA,EAAM,OAAA,EAAS,kBAAiB,GAAI,IAAA;AAE3E,EAAA,MAAMkB,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAA,EAWV,kBAAA,CAAmB,8BAA8B,CAAC;;AAAA;AAAA;AAAA,QAAA,EAIhD,cAAA,CAAe,cAAA,EAAgB,KAAA,CAAM,KAAA,EAAO,+BAA+B,CAAC;AAAA,QAAA,EAC5E,cAAA,CAAe,WAAA,EAAa,KAAA,CAAM,SAAA,EAAW,wCAAwC,CAAC;AAAA,QAAA,EACtF,cAAA,CAAe,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,gCAAgC,CAAC;AAAA,QAAA,EACxE,cAAA,CAAe,SAAA,EAAW,KAAA,CAAM,OAAA,EAAS,kCAAkC,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EASxE,MAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,eAAA,EAAkB,CAAC,KAAK,CAAA,KAAM,OAAA,CAAQ,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA,CAAA,EAAI,CAAC,WAAW,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA,YAAA,EAMrG,iBAAA,CAAkB,WAAA,EAAa,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EAC9C,iBAAA,CAAkB,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAC;AAAA,YAAA,EAC3C,iBAAA,CAAkB,SAAA,EAAW,OAAA,CAAQ,MAAM,CAAC;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAkB5C,MAAA,CAAO,MAAA,KAAW,CAAA,GAChB,qHAAA,GACA,MAAA,CAAO,IAAI,cAAc,CAAA,CAAE,IAAA,CAAK,EAAE,CACtC;AAAA;AAAA;;AAAA,QAAA,EAIF,qBAAA,CAAsB,QAAQ,IAAA,EAAM,OAAA,CAAQ,YAAY,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAC;AAAA;AAAA;AAAA,EAAA,CAAA;AAK7F,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,eAAA;AAAA,IACP,SAAA,EAAW,eAAA;AAAA,IACX,WAAA,EAAa,uBAAA;AAAA,IACb,IAAA;AAAA,IACA,OAAA,EAAAA,QAAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOhB,4CAA0B,UAAU,CAAA;AAC7C;AAEA,SAAS,cAAA,CAAe,KAAA,EAAe,KAAA,EAAe,UAAA,EAA4B;AAChF,EAAA,OAAO;AAAA;AAAA,sEAAA,EAE+D,KAAK,CAAA;AAAA,wCAAA,EACnC,UAAU,KAAK,KAAK,CAAA;AAAA;AAAA,EAAA,CAAA;AAG9D;AAEA,SAAS,iBAAA,CAAkB,OAAe,OAAA,EAA0B;AAClE,EAAA,MAAM,QAAA,GAAW,KAAA,KAAU,OAAA,GAAU,UAAA,GAAa,EAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC3D,EAAA,OAAO,CAAA,eAAA,EAAkB,KAAK,CAAA,EAAA,EAAK,QAAQ,IAAI,KAAK,CAAA,SAAA,CAAA;AACtD;AAEA,SAAS,iBAAiB,MAAA,EAAwB;AAChD,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,SAAA,EAAW,8EAAA;AAAA,IACX,MAAA,EAAQ,8DAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAA,IAAK,+CAAA;AAChC,EAAA,OAAO,CAAA,mGAAA,EAAsG,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,OAAA,CAAA;AAC/H;AAEA,SAASsB,iBAAgB,SAAA,EAA2B;AAClD,EAAA,IAAI,CAAC,WAAW,OAAO,GAAA;AACvB,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,SAAA,GAAY,GAAI,CAAA;AACnC,EAAA,OAAO,CAAA,CAAE,eAAe,OAAA,EAAS;AAAA,IAC/B,KAAA,EAAO,OAAA;AAAA,IAAS,GAAA,EAAK,SAAA;AAAA,IAAW,IAAA,EAAM,SAAA;AAAA,IACtC,IAAA,EAAM,SAAA;AAAA,IAAW,MAAA,EAAQ,SAAA;AAAA,IAAW,MAAA,EAAQ;AAAA,GAC7C,CAAA;AACH;AAEA,SAAS,gBAAgB,KAAA,EAA+D;AACtF,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,IAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,IAAA,EAAM,QAAA,EAAU,eAAA,IAAmB,IAAA,EAAM,eAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,cAAA,IAAkB,IAAA,EAAM,iBAAiB,IAAA,EAAM,aAAA;AACnE,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,IAAU,KAAA,CAAA,EAAW,KAAA,EAAO,SAAS,KAAA,CAAA,EAAU;AAAA,EAClE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,eAAe,KAAA,EAAkC;AACxD,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,GAAQ,CAAA,QAAA,EAAW,KAAA,CAAM,MAAM,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACvF,EAAA,MAAM,QAAA,GAAW,gBAAgB,KAAK,CAAA;AACtC,EAAA,MAAM,WAAW,QAAA,CAAS,MAAA,GACtB,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,mEAAA,EAAsE,QAAA,CAAS,KAAA,IAAS,QAAA,CAAS,MAAM,CAAA,IAAA,CAAA,GAC/I,QAAA,CAAS,QACP,CAAA,uDAAA,EAA0D,QAAA,CAAS,KAAK,CAAA,OAAA,CAAA,GACxE,EAAA;AAEN,EAAA,OAAO;AAAA,qEAAA,EAC8D,YAAY,CAAA;AAAA;AAAA,QAAA,EAEzEA,gBAAAA,CAAgB,KAAA,CAAM,WAAW,CAAC;AAAA;AAAA;AAAA,sEAAA,EAG4B,MAAM,IAAI,CAAA;AAAA;AAAA;AAAA,wEAAA,EAGR,KAAA,CAAM,YAAY,GAAG,CAAA;AAAA,8DAAA,EAC/B,MAAM,UAAU,CAAA;AAAA,QAAA,EACtE,QAAA,GAAW,CAAA,kBAAA,EAAqB,QAAQ,CAAA,MAAA,CAAA,GAAW,EAAE;AAAA;AAAA,8CAAA,EAEf,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,iGAAA,EACqB,MAAM,aAAa,CAAA;AAAA;AAAA,EAAA,CAAA;AAGtH;AAEA,SAAS,qBAAA,CAAsB,IAAA,EAAc,UAAA,EAAoB,IAAA,EAAe,MAAA,EAAyB;AACvG,EAAA,IAAI,UAAA,IAAc,GAAG,OAAO,EAAA;AAE5B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACpC,EAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,GAAS,CAAA,GAAI,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,GAAK,EAAA;AAE3D,EAAA,OAAO;AAAA;AAAA;AAAA,aAAA,EAGM,IAAI,OAAO,UAAU;AAAA;AAAA;AAAA,QAAA,EAG1B,IAAA,GAAO,IACL,CAAA,eAAA,EAAkB,IAAA,GAAO,CAAC,CAAA,EAAG,KAAK,oLAClC,EACJ;AAAA,QAAA,EACE,IAAA,GAAO,aACL,CAAA,eAAA,EAAkB,IAAA,GAAO,CAAC,CAAA,EAAG,KAAK,gLAClC,EACJ;AAAA;AAAA;AAAA,EAAA,CAAA;AAIR;;;AC/HO,IAAMD,iBAAAA,GAAyC;AAAA,EACpD,oBAAA,EAAsB,EAAA;AAAA,EACtB,eAAA,EAAiB,EAAA;AAAA,EACjB,mBAAA,EAAqB,EAAA;AAAA,EACrB,aAAA,EAAe,EAAA;AAAA,EACf,UAAA,EAAY,kBAAA;AAAA,EACZ,SAAA,EAAW;AACb,CAAA;;;AC7DA,IAAMI,YAAAA,GAAc,IAAIvB,SAAAA,EAAmD;AAE3EuB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAKtB,6BAAA,EAAa,CAAA;AAGlCsB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAA,KAAS;AACtC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,GAAG,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,IAAA,EAAK;AACd,CAAC,CAAA;AAED,eAAeG,aAAY,EAAA,EAAwC;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,IAAIF,+BAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAMrB,OAAAA,GAAS,MAAM,aAAA,CAAc,SAAA,CAAU,QAAQ,CAAA;AACrD,IAAA,IAAIA,SAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QAAA,GAAW,OAAOA,OAAAA,CAAO,QAAA,KAAa,QAAA,GAAW,KAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA,GAAIA,OAAAA,CAAO,QAAA;AAC5F,MAAA,OAAO,EAAE,GAAGgB,iBAAAA,EAAkB,GAAG,QAAA,EAAS;AAAA,IAC5C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAe;AACvB,EAAA,OAAOA,iBAAAA;AACT;AAGAI,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAChC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAEtC,EAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,EAAA;AACd,EAAA,MAAM,YAAA,GAAe,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AAEzC,EAAA,MAAM,CAAC,EAAE,aAAA,EAAe,KAAA,IAAS,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IAC1D,oBAAoB,IAAA,CAAK,EAAE,QAAQ,YAAA,EAAc,IAAA,EAAM,OAAO,CAAA;AAAA,IAC9D,oBAAoB,QAAA;AAAS,GAC9B,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAA;AAE1C,EAAA,MAAM,OAAO,uBAAA,CAAwB;AAAA,IACnC,aAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS,EAAE,MAAA,EAAQ,YAAA,EAAc,MAAM,UAAA,EAAW;AAAA,IAClD,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC1C,CAAA;AAED,EAAA,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AACpB,CAAC,CAAA;AAGDA,YAAAA,CAAY,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAM;AACtC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,YAAA,GAAe,IAAI,kBAAA,CAAmB,EAAE,CAAA;AAC9C,EAAA,MAAM,aAAa,WAAA,EAAY;AAE/B,EAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,MAAM,KAAK,GAAG,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,EAAA;AACd,EAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA;AAC1C,EAAA,MAAM,YAAA,GAAe,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AAEzC,EAAA,MAAM,CAAC,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG,OAAO,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IAC1D,YAAA,CAAa,KAAK,EAAE,IAAA,EAAM,YAAY,MAAA,EAAQ,YAAA,EAAc,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,IACzE,aAAa,QAAA,EAAS;AAAA,IACtB,aAAa,gBAAA;AAAiB,GAC/B,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAA;AAE1C,EAAA,MAAM,OAAO,gBAAA,CAAiB;AAAA,IAC5B,MAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAS,EAAE,IAAA,EAAM,YAAY,MAAA,EAAQ,YAAA,EAAc,MAAM,UAAA,EAAW;AAAA,IACpE,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC1C,CAAA;AAED,EAAA,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AACpB,CAAC,CAAA;AAGDA,YAAAA,CAAY,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AACxC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,MAAMG,YAAAA,CAAY,EAAE,CAAA;AAErC,EAAA,MAAM,EAAE,yBAAA,EAAA5B,0BAAAA,EAA0B,GAAI,MAAM,OAAO,+CAA8D,CAAA;AAEjH,EAAA,MAAMgB,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAA,EASV,kBAAA,CAAmB,gCAAgC,CAAC;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,kEAAA,EAQQ,SAAS,oBAAoB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,iEAAA,EAQ9B,SAAS,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,qEAAA,EAQpB,SAAS,mBAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,2DAAA,EAQtC,QAAA,CAAS,iBAAiB,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,wDAAA,EAQ/B,SAAS,UAAU,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,uDAAA,EAOpB,SAAS,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAwCzE,EAAA,OAAO,CAAA,CAAE,KAAKhB,0BAAAA,CAA0B;AAAA,IACtC,KAAA,EAAO,iBAAA;AAAA,IACP,SAAA,EAAW,iBAAA;AAAA,IACX,WAAA,EAAa,uBAAA;AAAA,IACb,IAAA,EAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA;AAAA,IACxE,OAAA,EAAAgB,QAAAA;AAAA,IACA,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC1C,CAAC,CAAA;AACJ,CAAC,CAAA;AAGDS,YAAAA,CAAY,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA,KAAM;AACzC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAEjB,IAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKhB,EAAE,IAAA,CAAK,IAAA,CAAK,UAAU,IAAI,CAAC,EAAE,GAAA,EAAI;AAElC,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EACjC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACpD,IAAA,OAAO,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,OAAO,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,EACzE;AACF,CAAC,CAAA;;;ACpOM,IAAM,YAAN,MAAgB;AAAA,EAGrB,YAAoB,SAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAoB;AAAA,EAFhC,OAAA,GAAU,2BAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlB,MAAM,sBAAA,CAAuB,OAAA,EAAiB,SAAA,EAAmB,MAAA,EAAkC;AACjG,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AACjC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAC,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AACnE,IAAA,MAAM,UAAA,GAAa,KAAA,CAChB,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,UAAA,CAAW,KAAK,CAAC,CAAA,CAC/B,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,CAAA;AAE1B,IAAA,IAAI,CAAC,SAAA,IAAa,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,KAAA;AAGlD,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,IAAI,GAAA,GAAM,QAAA,CAAS,SAAS,CAAC,CAAA,GAAI,KAAK,OAAO,KAAA;AAGtD,IAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,MAC9B,KAAA;AAAA,MACA,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,MACrB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,MAChC,KAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AACA,IAAA,MAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAC,CAAA;AAC3F,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,IAAI,WAAW,eAAe,CAAC,EACjE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CACxC,KAAK,EAAE,CAAA;AAEV,IAAA,OAAO,WAAW,IAAA,CAAK,CAAA,GAAA,KAAO,eAAA,CAAgB,GAAA,EAAK,iBAAiB,CAAC,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,MAAA,EAOa;AACvC,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,cAAc,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,CAAO,sBAAA,EAAwB,MAAA,CAAO,OAAO,CAAA;AAClD,IAAA,IAAA,CAAK,MAAA,CAAO,2BAA2B,GAAG,CAAA;AAC1C,IAAA,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,UAAU,CAAA;AAC5C,IAAA,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,SAAS,CAAA;AAE1C,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,UAAU,CAAA;AAAA,IAC3C,CAAA,MAAA,IAAW,OAAO,aAAA,EAAe;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB,MAAA,CAAO,aAAa,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC1D,QAAA,IAAA,CAAK,MAAA,CAAO,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,sBAAsB,IAAI,CAAA;AACtE,IAAA,OAAO,EAAE,EAAA,EAAI,QAAA,CAAS,EAAA,EAAI,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,cAAA,EAAsC;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAA,eAAA,EAAkB,cAAc,CAAA,CAAE,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,MAAA,EAAuF;AAC1G,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AACjC,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC1D,QAAA,IAAA,CAAK,MAAA,CAAO,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MACvC;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,YAAA,EAAc,IAAI,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,MAAA,EAIwB;AAC9C,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,IAAA,EAAA,CAAG,OAAO,OAAA,EAAS,MAAA,CAAO,MAAA,EAAQ,KAAA,IAAS,GAAG,CAAC,CAAA;AAC/C,IAAA,IAAI,QAAQ,MAAA,EAAQ,EAAA,CAAG,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AACrD,IAAA,IAAI,QAAQ,aAAA,EAAe,EAAA,CAAG,MAAA,CAAO,gBAAA,EAAkB,OAAO,aAAa,CAAA;AAC3E,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,EAAO,kBAAkB,EAAA,CAAG,QAAA,EAAU,CAAA,CAAE,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAAuC;AAC3C,IAAA,MAAM,MAAa,EAAC;AACpB,IAAA,IAAI,aAAA;AAEJ,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,iBAAA,CAAkB,EAAE,KAAA,EAAO,GAAA,EAAK,eAAe,CAAA;AACzE,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,MAAA,CAAO,IAAI,CAAA;AACvB,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AAClD,MAAA,aAAA,GAAgB,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,EAAA;AAAA,IACtD;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,KAAA,EAA+C;AACvE,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,CAAG,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,SAAS,GAAG,CAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,kBAAA,EAAqB,MAAA,CAAO,QAAA,EAAU,CAAA,CAAE,CAAA;AACjF,IAAA,OAAO,MAAA,CAAO,IAAA,GAAO,CAAC,CAAA,IAAK,IAAA;AAAA,EAC7B;AAAA,EAEA,MAAc,OAAA,CAAQ,MAAA,EAAgB,IAAA,EAAc,IAAA,EAAsC;AACxF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,GAAI,OAAO,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA;AACnE,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,QACzC,GAAI,IAAA,GAAO,EAAE,cAAA,EAAgB,mCAAA,KAAwC;AAAC,OACxE;AAAA,MACA,GAAI,OAAO,EAAE,IAAA,EAAM,KAAK,QAAA,EAAS,KAAM;AAAC,KACzC,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,OAAO,OAAA,IAAW,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAKA,SAAS,eAAA,CAAgB,GAAW,CAAA,EAAoB;AACtD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAA,IAAU,EAAE,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAA,KAAW,CAAA;AACpB;;;AC1JA,IAAME,UAAAA,GAAY,IAAIzB,SAAAA,EAAmD;AAMzE,eAAe0B,aAAY,EAAA,EAAwC;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,IAAIF,+BAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAMrB,OAAAA,GAAS,MAAM,aAAA,CAAc,SAAA,CAAU,QAAQ,CAAA;AACrD,IAAA,IAAIA,SAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QAAA,GAAW,OAAOA,OAAAA,CAAO,QAAA,KAAa,QAAA,GAAW,KAAK,KAAA,CAAMA,OAAAA,CAAO,QAAQ,CAAA,GAAIA,OAAAA,CAAO,QAAA;AAC5F,MAAA,OAAO,EAAE,GAAGgB,iBAAAA,EAAkB,GAAG,QAAA,EAAS;AAAA,IAC5C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAe;AACvB,EAAA,OAAOA,iBAAAA;AACT;AAEA,SAAS,gBAAgB,MAAA,EAAoC;AAC3D,EAAA,MAAM,GAAA,GAA0C;AAAA,IAC9C,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAQ,QAAA;AAAA,IACR,UAAA,EAAY,YAAA;AAAA,IACZ,kBAAA,EAAoB;AAAA,GACtB;AACA,EAAA,OAAO,GAAA,CAAI,MAAM,CAAA,IAAK,YAAA;AACxB;AAMAM,UAAAA,CAAU,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,KAAM;AACtC,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMC,YAAAA,CAAY,EAAE,CAAA;AAErC,EAAA,IAAI,CAAC,SAAS,mBAAA,EAAqB;AACjC,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,+BAAA,IAAmC,GAAG,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,OAAA,GAAU,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AACjC,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,CAAA,IAAK,EAAA;AAEtD,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA;AACxD,EAAA,MAAM,UAAU,MAAM,SAAA,CAAU,uBAAuB,OAAA,EAAS,SAAA,EAAW,SAAS,mBAAmB,CAAA;AAEvG,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,KAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC7C,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,IAAI,kBAAA,CAAmB,EAAE,CAAA;AAC9C,EAAA,MAAM,OAAA,CAAQ,IAAI,CAAC,mBAAA,CAAoB,aAAY,EAAG,YAAA,CAAa,WAAA,EAAa,CAAC,CAAA;AAGjF,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA;AACvB,EAAA,MAAM,QAAA,GAAW,KAAK,EAAA,IAAM,EAAA;AAC5B,EAAA,MAAM,UAAA,GAAa,KAAK,MAAA,IAAU,KAAA,CAAM,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAE9D,EAAA,IAAI;AACF,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,+BAAA,EAAiC;AACpC,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA;AACvB,QAAA,MAAM,MAAA,GAAS,IAAI,QAAA,EAAU,eAAA,IAAmB,MAAM,mBAAA,CAAoB,yBAAA,CAA0B,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAA;AAErH,QAAA,MAAM,oBAAoB,MAAA,CAAO;AAAA,UAC/B,MAAA;AAAA,UACA,kBAAkB,GAAA,CAAI,QAAA;AAAA,UACtB,sBAAsB,GAAA,CAAI,EAAA;AAAA,UAC1B,eAAe,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,EAAA,IAAM,EAAA;AAAA,UAC9C,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAAA,UAClC,oBAAoB,GAAA,CAAI,oBAAA;AAAA,UACxB,kBAAkB,GAAA,CAAI,kBAAA;AAAA,UACtB,mBAAmB,GAAA,CAAI;AAAA,SACxB,CAAA;AAED,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,GAAA,CAAI,EAAE,CAAA,CAAE,CAAA;AACtD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,+BAAA,EAAiC;AACpC,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA;AACvB,QAAA,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,GAAA,CAAI,EAAA,EAAI;AAAA,UACjD,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAAA,UAClC,eAAe,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,EAAA,IAAM,KAAA,CAAA;AAAA,UAC9C,oBAAoB,GAAA,CAAI,oBAAA;AAAA,UACxB,kBAAkB,GAAA,CAAI,kBAAA;AAAA,UACtB,mBAAmB,GAAA,CAAI;AAAA,SACxB,CAAA;AAED,QAAA,OAAA,CAAQ,IAAI,CAAA,+BAAA,EAAkC,GAAA,CAAI,EAAE,CAAA,IAAA,EAAO,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACvE,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,+BAAA,EAAiC;AACpC,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA;AACvB,QAAA,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,GAAA,CAAI,EAAA,EAAI;AAAA,UACjD,MAAA,EAAQ;AAAA,SACT,CAAA;AAED,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,GAAA,CAAI,EAAE,CAAA,CAAE,CAAA;AACtD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,4BAAA,EAA8B;AACjC,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA;AAC3B,QAAA,MAAM,MAAA,GAAS,QAAQ,QAAA,EAAU,eAAA;AAEjC,QAAA,IAAI,MAAA,IAAU,QAAQ,YAAA,EAAc;AAClC,UAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,yBAAA,CAA0B,QAAQ,YAAY,CAAA;AACzF,UAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,MAAA,EAAQ;AAChC,YAAA,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,OAAA,CAAQ,YAAA,EAAc;AAAA,cAC/D;AAAA,aACM,CAAA;AAAA,UACV;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,OAAA,CAAQ,EAAE,CAAA,CAAE,CAAA;AACxD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,2BAAA,EAA6B;AAChC,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA;AAC3B,QAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,UAAA,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,OAAA,CAAQ,YAAA,EAAc;AAAA,YAC/D,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wCAAA,EAA2C,OAAA,CAAQ,EAAE,CAAA,CAAE,CAAA;AACnE,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,wBAAA,EAA0B;AAC7B,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA;AAC3B,QAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,UAAA,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,OAAA,CAAQ,YAAA,EAAc;AAAA,YAC/D,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,OAAA,CAAQ,EAAE,CAAA,CAAE,CAAA;AAChE,QAAA;AAAA,MACF;AAAA,MAEA;AACE,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC1D,QAAA,MAAM,aAAa,GAAA,CAAI;AAAA,UACrB,eAAe,KAAA,CAAM,EAAA;AAAA,UACrB,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,EAAM,MAAM,IAAA,CAAK,MAAA;AAAA,UACjB,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA;AAIpC,IAAA,MAAM,aAAa,GAAA,CAAI;AAAA,MACrB,eAAe,KAAA,CAAM,EAAA;AAAA,MACrB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,QAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA,EAAM,MAAM,IAAA,CAAK,MAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AAEd,IAAA,MAAM,aAAa,GAAA,CAAI;AAAA,MACrB,eAAe,KAAA,CAAM,EAAA;AAAA,MACrB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,QAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA,EAAM,MAAM,IAAA,CAAK,MAAA;AAAA,MACjB,MAAA,EAAQ,QAAA;AAAA,MACR,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,KAC7D,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEjB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wCAAA,EAA2C,KAAA,CAAM,IAAI,KAAK,KAAK,CAAA;AAC7E,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,2BAAA,IAA+B,GAAG,CAAA;AAAA,EAC3D;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,QAAA,EAAU,MAAM,CAAA;AAClC,CAAC,CAAA;AAODD,UAAAA,CAAU,IAAA,CAAK,0BAAA,EAA4BxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AACrE,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,MAAM,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,GAAG,CAAA;AAEvD,EAAA,MAAM,QAAA,GAAW,MAAMyB,YAAAA,CAAY,EAAE,CAAA;AACrC,EAAA,IAAI,CAAC,SAAS,eAAA,EAAiB;AAC7B,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,uBAAA,IAA2B,GAAG,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,QAAA,CAAS,aAAA;AACzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,uBAAA,IAA2B,GAAG,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA;AACxD,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAGtC,EAAA,MAAM,WAAA,GAAc,MAAM,mBAAA,CAAoB,WAAA,CAAY,KAAK,MAAM,CAAA;AACrE,EAAA,IAAI,aAAa,WAAA,EAAa,gBAAA;AAE9B,EAAA,IAAI,CAAC,UAAA,EAAY;AAEf,IAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,mBAAA,CAAoB,KAAK,KAAK,CAAA;AAC/D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,GAAa,QAAA,CAAS,EAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,cAAA,CAAe;AAAA,QAC9C,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAA,EAAU,EAAE,eAAA,EAAiB,IAAA,CAAK,MAAA;AAAO,OAC1C,CAAA;AACD,MAAA,UAAA,GAAa,QAAA,CAAS,EAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,MAAA;AAClC,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,qBAAA,CAAsB;AAAA,IACpD,OAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA,EAAY,CAAA,EAAG,MAAM,CAAA,EAAG,SAAS,UAAU,CAAA,iCAAA,CAAA;AAAA,IAC3C,SAAA,EAAW,CAAA,EAAG,MAAM,CAAA,EAAG,SAAS,SAAS,CAAA,CAAA;AAAA,IACzC,QAAA,EAAU,EAAE,eAAA,EAAiB,IAAA,CAAK,MAAA;AAAO,GAC1C,CAAA;AAED,EAAA,OAAO,CAAA,CAAE,KAAK,EAAE,SAAA,EAAW,QAAQ,EAAA,EAAI,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,CAAA;AAC3D,CAAC,CAAA;AAGDD,UAAAA,CAAU,GAAA,CAAI,eAAA,EAAiBxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AACzD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,MAAM,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,GAAG,CAAA;AAEvD,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAEtC,EAAA,MAAM,YAAA,GAAe,MAAM,mBAAA,CAAoB,WAAA,CAAY,KAAK,MAAM,CAAA;AACtE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,YAAA,EAAc,MAAM,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,YAAA,EAAc,CAAA;AAChC,CAAC,CAAA;AAODwB,UAAAA,CAAU,GAAA,CAAI,gBAAA,EAAkBxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AAC1D,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,IAAA,KAAS,OAAA,EAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,eAAA,EAAgB,EAAG,GAAG,CAAA;AAEzE,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAEtC,EAAA,MAAM,OAAA,GAA+B;AAAA,IACnC,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AAAA,IAC5B,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAE,CAAA,GAAI,CAAA;AAAA,IAC7D,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,EAAA;AAAA,IAChE,MAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAa,YAAA;AAAA,IAC1C,SAAA,EAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,IAAa;AAAA,GAClD;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAA;AACrD,EAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AACtB,CAAC,CAAA;AAGDwB,UAAAA,CAAU,GAAA,CAAI,QAAA,EAAUxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AAClD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,IAAA,KAAS,OAAA,EAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,eAAA,EAAgB,EAAG,GAAG,CAAA;AAEzE,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAEtC,EAAA,MAAM,KAAA,GAAQ,MAAM,mBAAA,CAAoB,QAAA,EAAS;AACjD,EAAA,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AACrB,CAAC,CAAA;AAMDwB,UAAAA,CAAU,IAAA,CAAK,qBAAA,EAAuBxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AAChE,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,IAAA,KAAS,OAAA,EAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,eAAA,EAAgB,EAAG,GAAG,CAAA;AAEzE,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAMyB,YAAAA,CAAY,EAAE,CAAA;AAErC,EAAA,IAAI,CAAC,SAAS,eAAA,EAAiB;AAC7B,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kCAAA,IAAsC,GAAG,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA;AACxD,EAAA,MAAM,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,oBAAoB,WAAA,EAAY;AAEtC,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,oBAAA,EAAqB;AACrD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAI,QAAA,EAAU,eAAA,IAAmB,MAAM,mBAAA,CAAoB,yBAAA,CAA0B,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAA;AACrH,QAAA,MAAM,oBAAoB,MAAA,CAAO;AAAA,UAC/B,MAAA;AAAA,UACA,gBAAA,EAAkB,OAAO,GAAA,CAAI,QAAA,KAAa,WAAW,GAAA,CAAI,QAAA,GAAW,IAAI,QAAA,CAAS,EAAA;AAAA,UACjF,sBAAsB,GAAA,CAAI,EAAA;AAAA,UAC1B,eAAe,GAAA,CAAI,KAAA,EAAO,OAAO,CAAC,CAAA,EAAG,OAAO,EAAA,IAAM,EAAA;AAAA,UAClD,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAAA,UAClC,oBAAoB,GAAA,CAAI,oBAAA;AAAA,UACxB,kBAAkB,GAAA,CAAI,kBAAA;AAAA,UACtB,mBAAmB,GAAA,CAAI;AAAA,SACxB,CAAA;AACD,QAAA,MAAA,EAAA;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4CAAA,EAA+C,GAAA,CAAI,EAAE,KAAK,GAAG,CAAA;AAC3E,QAAA,MAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAO,OAAA,CAAQ,MAAA;AAAA,MACf,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAC/C,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAMDD,UAAAA,CAAU,GAAA,CAAI,SAAA,EAAWxB,6BAAA,EAAY,EAAG,OAAO,CAAA,KAAM;AACnD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,IAAA,KAAS,OAAA,EAAS,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,eAAA,EAAgB,EAAG,GAAG,CAAA;AAEzE,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,YAAA,GAAe,IAAI,kBAAA,CAAmB,EAAE,CAAA;AAC9C,EAAA,MAAM,aAAa,WAAA,EAAY;AAE/B,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA;AAAA,IAC7B,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAY,MAAA;AAAA,IACxC,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,IAAK,MAAA;AAAA,IACrC,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAE,CAAA,GAAI,CAAA;AAAA,IAC7D,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI;AAAA,GAClE;AAEA,EAAA,MAAM,CAAC,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC/C,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,IACzB,aAAa,QAAA,EAAS;AAAA,IACtB,aAAa,gBAAA;AAAiB,GAC/B,CAAA;AAED,EAAA,OAAO,EAAE,IAAA,CAAK,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAC3C,CAAC,CAAA;;;AC/YM,SAAS,kBAAA,GAA6B;AAC3C,EAAA,MAAM,OAAA,GAAUC,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ,EAAE,IAAA,EAAM,cAAA,EAAe;AAAA,IAC/B,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,yBAAyBqB,YAAAA,EAA0B;AAAA,IAClE,WAAA,EAAa,sCAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,eAAeE,UAAAA,EAAwB;AAAA,IACtD,WAAA,EAAa,wDAAA;AAAA,IACb,YAAA,EAAc,KAAA;AAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,WAAA,CAAY,UAAU,uBAAA,EAAyB;AAAA,IACrD,IAAA,EAAM,CAAA,mPAAA,CAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACR,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,SAAS,YAAY;AACnB,MAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,UAAU,YAAY;AACpB,MAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,WAAW,YAAY;AACrB,MAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAEO,IAAM,eAAe,kBAAA,EAAmB;;;ACjD/C,IAAM,qBAAA,GAAwB,MAAA,CAAO,MAAA,CAAOK,iCAAe,CAAA,CACxD,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,KAAc,IAAI,CAAA,CAChC,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,EACT,UAAU,CAAA,CAAE,QAAA;AAAA,EACZ,KAAA,EAAO,EAAE,SAAA,CAAW,KAAA;AAAA,EACpB,IAAA,EAAM,EAAE,SAAA,CAAW,IAAA;AAAA,EACnB,IAAA,EAAM,EAAE,SAAA,CAAW,IAAA;AAAA,EACnB,KAAA,EAAO,EAAE,SAAA,CAAW;AACtB,CAAA,CAAE,CAAA;AAGJ,IAAM,QAAA,GAAmC;AAAA,EACvC,kBAAA,EAAoB,4OAAA;AAAA,EACpB,WAAA,EAAa,+lBAAA;AAAA,EACb,OAAA,EAAS,sdAAA;AAAA,EACT,SAAA,EAAW,sjBAAA;AAAA,EACX,UAAA,EAAY,6ZAAA;AAAA,EACZ,aAAA,EAAe,yaAAA;AAAA,EACf,KAAA,EAAO,8WAAA;AAAA,EACP,aAAA,EAAe,kMAAA;AAAA,EACf,cAAA,EAAgB,6VAAA;AAAA,EAChB,aAAA,EAAe;AACjB,CAAA;AAEA,SAAS,YAAY,QAAA,EAA2B;AAC9C,EAAA,IAAI,CAAC,UAAU,OAAO,EAAA;AAEtB,EAAA,IAAI,QAAA,CAAS,WAAW,MAAM,CAAA,IAAK,SAAS,UAAA,CAAW,GAAG,GAAG,OAAO,QAAA;AAEpE,EAAA,OAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,EAAA;AAC/B;AAEA,IAAM,MAAA,GAAS,8BAAA;AAEf,SAAS,cAAA,CAAe,MAAsD,WAAA,EAA6B;AACzG,EAAA,MAAM,WAAW,WAAA,KAAgB,IAAA,CAAK,QAAQ,WAAA,CAAY,UAAA,CAAW,KAAK,IAAI,CAAA;AAC9E,EAAA,MAAM,YAAA,GAAe,CAAA,uLAAA,CAAA;AACrB,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,IAAK,YAAA;AAC/C,EAAA,OAAO;AAAA;AAAA,MAAA,EAED,QAAA,GAAW,qGAAqG,EAAE;AAAA;AAAA,cAAA,EAE1G,KAAK,IAAI,CAAA;AAAA,qGAAA,EAEf,QAAA,GACI,kCACA,yEACN,CAAA;AAAA,QAAA,EACE,QAAA,GAAW,wBAAwB,EAAE;AAAA;AAAA,8BAAA,EAEf,QAAA,GAAW,kCAAkC,kCAAkC,CAAA;AAAA,UAAA,EACnG,YAAY;AAAA;AAAA,+BAAA,EAES,KAAK,KAAK,CAAA;AAAA;AAAA,WAAA,CAAA;AAG3C;AAEO,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAO,OAAO,GAA0D,IAAA,KAAe;AACrF,IAAA,MAAM,OAAO,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAGA,IAAA,IAAI,kBAAwF,EAAC;AAC7F,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,MAAA,MAAM,eAAA,GAAkB,qBAAA,CAAsB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AACjE,MAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,QAAA,MAAM,eAAe,eAAA,CAAgB,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAC5D,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,OAAA;AAAA,UACtB,2CAA2C,YAAY,CAAA,uBAAA;AAAA,SACzD,CAAE,IAAA,CAAK,GAAG,eAAe,EAAE,GAAA,EAAI;AAE/B,QAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAA,CAAK,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,IAAI,CAAC,CAAA;AAE1E,QAAA,KAAA,MAAW3B,WAAU,qBAAA,EAAuB;AAC1C,UAAA,IAAI,WAAA,CAAY,GAAA,CAAIA,OAAAA,CAAO,QAAQ,CAAA,EAAG;AACpC,YAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,cACnB,OAAOA,OAAAA,CAAO,KAAA;AAAA,cACd,MAAMA,OAAAA,CAAO,IAAA;AAAA,cACb,MAAMA,OAAAA,CAAO,IAAA;AAAA,cACb,OAAOA,OAAAA,CAAO;AAAA,aACf,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,eAAA,CAAgB,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAAA,MAClD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,CAAA,CAAE,IAAI,iBAAA,EAAmB,eAAA,CAAgB,IAAI,CAAA,CAAA,MAAM,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,MAAM,CAAA,CAAE,IAAA,EAAM,MAAM,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA,IAAK,EAAA,GAAK,CAAC,CAAA;AAEtH,IAAA,MAAM,IAAA,EAAK;AAGX,IAAA,IAAI,eAAA,CAAgB,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,EAAG,QAAA,CAAS,WAAW,CAAA,EAAG;AAC1F,MAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AACrB,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,CAAA,CAAE,IAAI,OAAO,CAAA;AACzC,MAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAE9B,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACzB,QAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,GAAA,CAAI,CAAA,IAAA,KAAQ,cAAA,CAAe,MAAM,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACrF,QAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,CAAE,KAAK,aAAa,CAAA;AACrD,QAAA,CAAA,CAAE,MAAM,IAAI,QAAA,CAAS,SAAS,EAAE,MAAA,EAAQ,SAAS,CAAA;AAAA,MACnD,CAAA,MAAO;AAEL,QAAA,CAAA,CAAE,MAAM,IAAI,QAAA,CAAS,MAAM,EAAE,MAAA,EAAQ,SAAS,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF,CAAA;AACF;;;AC8QO,IAAM4B,MAAAA,GAAQ;AAAA,EAIL;AAAA,EAGd,aAAA,EAAe,eAAA;AAAA,EACf,WAAA,EAAa,aAAA;AAAA,EAOb,UAAA,EAAY,YA4Bd,CAAA;AClbAnC,qDAAA,EAAA;AAGA,IAAM2B,YAAAA,GAAc,IAAIvB,SAAAA,EAAmD;AAE3EuB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAKtB,6BAAA,EAAa,CAAA;AAElCsB,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAA,KAAS;AACtC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,IAAA,EAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,eAAA,EAAiB,GAAG,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,IAAA,EAAK;AACd,CAAC,CAAA;AAGDA,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAChC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,WAAmD,EAAC;AACxD,EAAA,IAAI,iBAAoH,EAAC;AAEzH,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,MAAM,SAAS,GAAA,GAAM,KAAA;AAErB,IAAA,MAAM,CAAC,cAAA,EAAgB,SAAA,EAAW,cAAA,EAAgB,YAAA,EAAc,aAAa,cAAc,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,MAC/G,EAAA,CAAG,QAAQ,iFAAiF,CAAA,CACzF,KAAK,KAAA,EAAO,MAAM,EAAE,KAAA,EAAM;AAAA,MAC7B,EAAA,CAAG,QAAQ,mGAAmG,CAAA,CAC3G,KAAK,KAAA,EAAO,MAAM,EAAE,KAAA,EAAM;AAAA,MAC7B,EAAA,CAAG,QAAQ,6GAA6G,CAAA,CACrH,KAAK,KAAA,EAAO,MAAM,EAAE,KAAA,EAAM;AAAA,MAC7B,EAAA,CAAG,QAAQ,oFAAoF,CAAA,CAC5F,KAAK,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA,CAAE,KAAA,EAAM;AAAA,MACxC,EAAA,CAAG,QAAQ,oJAAoJ,CAAA,CAC5J,KAAK,KAAA,EAAO,MAAM,EAAE,GAAA,EAAI;AAAA,MAC3B,GAAG,OAAA,CAAQ,6HAA6H,EACrI,IAAA,CAAK,KAAK,EAAE,GAAA;AAAI,KACpB,CAAA;AAED,IAAA,aAAA,GAAgB,gBAAgB,KAAA,IAAS,CAAA;AACzC,IAAA,SAAA,GAAY,WAAW,KAAA,IAAS,CAAA;AAChC,IAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,cAAA,EAAgB,GAAA,IAAO,CAAC,CAAA;AACjD,IAAA,UAAA,GAAa,cAAc,KAAA,IAAS,CAAA;AACpC,IAAA,QAAA,GAAA,CAAY,WAAA,CAAY,OAAA,IAAW,EAAC,EAAG,IAAI,CAAC,CAAA,MAAY,EAAE,IAAA,EAAM,CAAA,CAAE,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,OAAM,CAAE,CAAA;AACxF,IAAA,cAAA,GAAkB,cAAA,CAAe,WAAW,EAAC;AAAA,EAC/C,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAMT,QAAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAW+D,aAAA,CAAc,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAI9B,SAAA,CAAU,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAI1B,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA,gDAAA,EAI1C,aAAa,CAAA,GAAI,gCAAA,GAAmC,+BAA+B,CAAA,EAAA,EAAK,UAAA,CAAW,gBAAgB,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAUzJ,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK;AAAA;AAAA,wFAAA,EAEsCjB,WAAAA,CAAW,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,iFAAA,EACzB,EAAE,KAAK,CAAA;AAAA;AAAA,UAAA,CAE/E,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAI;AAAA;AAAA;AAAA;AAAA,UAAA,CAIb;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAoBK,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,cAAA,CAAe,IAAI,CAAA,CAAA,KAAK;AAAA;AAAA,qGAAA,EAEmCA,WAAAA,CAAW,CAAA,CAAE,GAAA,IAAO,EAAE,CAAC,CAAA;AAAA,wHAAA,EACJ,CAAA,CAAE,WAAW,KAAA,GAAQ,qEAAA,GAAwE,iEAAiE,CAAA,EAAA,EAAK,CAAA,CAAE,UAAU,EAAE,CAAA;AAAA,wHAAA,EAAA,CAChL,CAAA,CAAE,eAAe,CAAA,KAAM,GAAA,GAAM,gEAAgE,qEAAqE,CAAA,EAAA,EAAK,CAAA,CAAE,WAAA,IAAe,EAAE,CAAA;AAAA,yEAAA,EAC1O,CAAA,CAAE,YAAY,CAAC,CAAA;AAAA;AAAA,cAAA,CAE3E,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAI;AAAA;AAAA;AAAA;AAAA,cAAA,CAIb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAQb,EAAA,OAAO,CAAA,CAAE,KAAKC,2CAAA,CAA0B;AAAA,IACtC,KAAA,EAAO,WAAA;AAAA,IACP,SAAA,EAAW,qBAAA;AAAA,IACX,WAAA,EAAa,kBAAA;AAAA,IACb,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,IAC3B,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,OAAA;AAAA,MAClC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,OAAA,EAAAgB,QAAAA;AAAA,IACA,gBAAA,EAAkB,CAAA,CAAE,GAAA,CAAI,iBAAiB;AAAA,GAC1C,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,SAASjB,YAAW,GAAA,EAAqB;AACvC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,EAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,QAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,QAAQ,CAAA;AACtG;;;AChJO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,MAAM,OAAA,GAAUK,gCAAc,MAAA,CAAO;AAAA,IACnC,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,YAAA,EAAc,CAAC,WAAW;AAAA;AAAA,GAC3B,CAAA;AAGD,EAAA,MAAM,YAAA,GAAe,IAAIF,SAAAA,EAAK;AAG9B,EAAA,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAM;AACtC,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,IAAA;AAC1C,IAAgB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK;AAEzC,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,iBAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,SAAA,EAAW,KAAA;AAAA,QACX,cAAA,EAAgB,IAAA;AAAA,QAChB,QAAA,EAAU,IAAA;AAAA,QACV,kBAAA,EAAoB,GAAA;AAAA,QACpB,UAAA,EAAY,IAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UACzB,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,IAAA,EAAK;AAAA,UAC9B,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,GAAA;AAAI,SACjC;AAAA,QACA;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,KAAM;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAG/B,IAAA,OAAA,CAAQ,IAAA,CAAK,4BAA4B,KAAK,CAAA;AAE9C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,4BAAA;AAAA,MACT,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,KAC7B,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA,KAAM;AACxC,IAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAAK,SAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAEjC,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,kBAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,UAAA;AAAA,QACA,SAAA,EAAW,EAAE,KAAA,EAAO,SAAA,EAAW,KAAK,OAAA,EAAQ;AAAA,QAC5C,MAAM;AAAC;AACT,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AACzC,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,qBAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,WAAA,EAAa,EAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,CAAA,EAAE;AAAA,UACtB,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,CAAA,EAAE;AAAA,UAC1B,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,CAAA;AAAE,SAChC;AAAA,QACA,cAAc;AAAC;AACjB,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,QAAA,CAAS,kBAAkB,YAAA,EAAc;AAAA,IAC/C,WAAA,EAAa,sCAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,KAAA,EAAO,CAAC,OAAA,EAAS,gBAAgB,CAAA;AAAA,IACjC,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,QAAA,CAAS,oBAAoBuB,YAAAA,EAA6B;AAAA,IAChE,WAAA,EAAa,2BAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,mBAAA,CAAoB,mBAAA,EAAqB,OAAO,CAAA,EAAQ,IAAA,KAAc;AAC5E,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,MAAM,IAAA,GAAO,EAAE,GAAA,CAAI,IAAA;AACnB,IAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AACrB,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA;AACtC,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,CAAA,IAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA;AAE7E,IAAA,MAAM,IAAA,EAAK;AAEX,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AAGrB,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,IAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,EAAA;AAAA,MACA,cAAc,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA,IAAK;AAAA,KACvD;AAEA,IAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,aAAa,CAAA;AAAA,EAGpD,CAAA,EAAG;AAAA,IACD,WAAA,EAAa,wCAAA;AAAA,IACb,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU;AAAA;AAAA,GACX,CAAA;AAGD,EAAA,OAAA,CAAQ,WAAW,kBAAA,EAAoB;AAAA,IACrC,UAAA,EAAY,OAAO,KAAA,KAAe;AAEhC,MAAA,OAAA,CAAQ,IAAA,CAAK,mBAAmB,KAAK,CAAA;AACrC,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAG;AAAA,IAC1C,CAAA;AAAA,IAEA,aAAA,EAAe,OAAO,IAAA,KAAc;AAElC,MAAA,OAAA,CAAQ,IAAA,CAAK,oBAAA,EAAsB,IAAA,CAAK,IAAI,CAAA;AAC5C,MAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAG;AAAA,IACxC,CAAA;AAAA,IAEA,QAAA,EAAU,OAAO,UAAA,KAAuB;AAEtC,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,KAAA;AAAA,QACX,QAAA,EAAU,IAAA;AAAA,QACV,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF,CAAA;AAAA,IAEA,cAAA,EAAgB,OAAO,IAAA,EAAc,OAAA,KAAiB;AAEpD,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,IAAI,CAAA,qBAAA,CAAA,EAAyB,OAAO,CAAA;AAC/D,MAAA,OAAO,EAAE,QAAA,EAAU,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAG;AAAA,IAC5C;AAAA,GACF,EAAG;AAAA,IACD,WAAA,EAAa,iCAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACZ,CAAA;AAGD,EAAA,MAAM,cAAA,GAAiBS,gCAAc,YAAA,CAAa;AAAA,IAChD,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,IAChD,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACpD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACpD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACpD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACjD,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA;AAAK,GACpD,CAAA;AAED,EAAA,MAAM,WAAA,GAAcA,gCAAc,YAAA,CAAa;AAAA,IAC7C,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,IACrD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,IACrD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACpD,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IAC/C,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACpD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA;AAAK,GAClD,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoBA,+BAAA,CAAc,eAAA,CAAgB,qBAAA,EAAuB;AAAA,IAC7E,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,YAAY,IAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,UAAU,KAAA,EAAM;AAAA,IAC9C,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC9C,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACjD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,UAAU,IAAA;AAAK,GACrD,CAAA;AAED,EAAA,MAAM,cAAA,GAAiBA,+BAAA,CAAc,eAAA,CAAgB,kBAAA,EAAoB;AAAA,IACvE,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,YAAY,IAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,KAAA,EAAM;AAAA,IACpD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,KAAA,EAAM;AAAA,IACpD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC7C,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,UAAU,IAAA;AAAK,GACpD,CAAA;AAED,EAAA,OAAA,CAAQ,SAAS,UAAA,EAAY;AAAA,IAC3B,SAAA,EAAW,qBAAA;AAAA,IACX,MAAA,EAAQ,cAAA;AAAA,IACR,UAAA,EAAY,CAAC,iBAAiB;AAAA,GAC/B,CAAA;AAED,EAAA,OAAA,CAAQ,SAAS,gBAAA,EAAkB;AAAA,IACjC,SAAA,EAAW,kBAAA;AAAA,IACX,MAAA,EAAQ,WAAA;AAAA,IACR,UAAA,EAAY,CAAC,cAAc;AAAA,GAC5B,CAAA;AAGD,EAAA,OAAA,CAAQ,OAAA,CAAQD,MAAAA,CAAM,aAAA,EAAe,OAAO,MAAW,QAAA,KAAkB;AAEvE,IAAA,IAAA,CAAK,SAAA,GAAY;AAAA,MACf,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,SAAA,EAAW,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,KAC7E;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG;AAAA,IACD,QAAA,EAAU,CAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,OAAA,CAAQA,MAAAA,CAAM,WAAA,EAAa,OAAO,MAAW,QAAA,KAAkB;AAErE,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,SAAA,CAAU,SAAA;AAC7C,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG;AAAA,IACD,QAAA,EAAU,CAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,OAAA,CAAQA,MAAAA,CAAM,UAAA,EAAY,OAAO,MAAW,OAAA,KAAiB;AAEnE,IAAA,MAAM,OAAA,CAAQ,QAAA,EAAU,gBAAA,EAAkB,UAAA,CAAW;AAAA,MACnD,SAAA,EAAW,MAAA;AAAA,MACX,SAAA,EAAW,YAAA;AAAA,MACX,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW,EAAE,WAAA,EAAa,IAAA,CAAK,MAAA;AAAO,KACvC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG;AAAA,IACD,QAAA,EAAU,CAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,OAAO,IAAA,EAAW,OAAA,KAAiB;AAEjE,IAAA,MAAM,OAAA,CAAQ,QAAA,EAAU,gBAAA,EAAkB,UAAA,CAAW;AAAA,MACnD,SAAA,EAAW,SAAA;AAAA,MACX,SAAA,EAAW,cAAA;AAAA,MACX,SAAA,EAAW;AAAA,QACT,WAAW,IAAA,CAAK,EAAA;AAAA,QAChB,aAAa,IAAA,CAAK,IAAA;AAAA,QAClB,OAAO,IAAA,CAAK;AAAA;AACd,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG;AAAA,IACD,QAAA,EAAU,CAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACd,CAAA;AAGD,EAAA,OAAA,CAAQ,YAAA;AAAA,IACN,YAAA;AAAA,IACA,qBAAA;AAAA,IACA,wBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,yCAAA;AAAA,MACb,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB,CAAA;AAAA,MACvC,IAAA,EAAM;AAAA;AACR,GACF;AAEA,EAAA,OAAA,CAAQ,YAAA;AAAA,IACN,oBAAA;AAAA,IACA,mBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,8CAAA;AAAA,MACb,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB,CAAA;AAAA,MACvC,IAAA,EAAM;AAAA;AACR,GACF;AAEA,EAAA,OAAA,CAAQ,YAAA;AAAA,IACN,qBAAA;AAAA,IACA,qBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,iCAAA;AAAA,MACb,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB,CAAA;AAAA,MACvC,IAAA,EAAM;AAAA;AACR,GACF;AAEA,EAAA,OAAA,CAAQ,YAAA;AAAA,IACN,qBAAA;AAAA,IACA,oBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,kDAAA;AAAA,MACb,WAAA,EAAa,CAAC,OAAA,EAAS,qBAAqB,CAAA;AAAA,MAC5C,IAAA,EAAM;AAAA;AACR,GACF;AAGA,EAAA,OAAA,CAAQ,WAAA,CAAY,aAAa,kBAAA,EAAoB;AAAA,IACnD,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB;AAAA,GACxC,CAAA;AAED,EAAA,OAAA,CAAQ,WAAA,CAAY,aAAa,kBAAA,EAAoB;AAAA,IACnD,IAAA,EAAM,WAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB;AAAA,GACxC,CAAA;AAED,EAAA,OAAA,CAAQ,WAAA,CAAY,WAAW,0BAAA,EAA4B;AAAA,IACzD,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB;AAAA,GACxC,CAAA;AAED,EAAA,OAAA,CAAQ,WAAA,CAAY,aAAa,2BAAA,EAA6B;AAAA,IAC5D,IAAA,EAAM,gBAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa,CAAC,OAAA,EAAS,gBAAgB;AAAA,GACxC,CAAA;AAED,EAAA,OAAA,CAAQ,WAAA,CAAY,YAAY,2BAAA,EAA6B;AAAA,IAC3D,IAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa,CAAC,OAAA,EAAS,qBAAqB;AAAA,GAC7C,CAAA;AAGD,EAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,IAChB,SAAS,YAAY;AACnB,MAAA,OAAA,CAAQ,KAAK,gCAAgC,CAAA;AAAA,IAE/C,CAAA;AAAA,IAEA,UAAU,YAAY;AACpB,MAAA,OAAA,CAAQ,KAAK,gCAAgC,CAAA;AAAA,IAE/C,CAAA;AAAA,IAEA,YAAY,YAAY;AACtB,MAAA,OAAA,CAAQ,KAAK,kCAAkC,CAAA;AAAA,IAEjD,CAAA;AAAA,IAEA,SAAA,EAAW,OAAO,MAAA,KAAW;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,mCAAmC,MAAM,CAAA;AAAA,IAExD;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAGO,IAAM,kBAAkB,qBAAA,EAAsB;;;ACpX9C,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA,EAErC,MAAM,WAAW,KAAA,EAAyC;AACxD,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,eAAA;AAEnC,IAAA,MAAM,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAGrB,CAAA,CAAE,IAAA;AAAA,MACD,EAAA;AAAA,MACA,KAAA,CAAM,KAAA;AAAA,MACN,QAAA;AAAA,MACA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA,GAAI,IAAA;AAAA,MACtD,MAAM,MAAA,IAAU,IAAA;AAAA,MAChB,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,MAAM,IAAA,IAAQ;AAAA,MACd,GAAA,EAAI;AAEN,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAA8C;AAC7D,IAAA,MAAM,MAAgB,EAAC;AAEvB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS;AAChC,MAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,eAAA;AAEnC,MAAA,OAAO,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAGtB,CAAA,CAAE,IAAA;AAAA,QACD,EAAA;AAAA,QACA,KAAA,CAAM,KAAA;AAAA,QACN,QAAA;AAAA,QACA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA,GAAI,IAAA;AAAA,QACtD,MAAM,MAAA,IAAU,IAAA;AAAA,QAChB,MAAM,SAAA,IAAa,IAAA;AAAA,QACnB,MAAM,SAAA,IAAa,IAAA;AAAA,QACnB,MAAM,SAAA,IAAa,IAAA;AAAA,QACnB,MAAM,IAAA,IAAQ;AAAA,OAChB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA;AACzB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAA,CAAY,OAAA,GAA6B,EAAC,EAA8C;AAC5F,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,UAAA,CAAW,KAAK,WAAW,CAAA;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,IAC9B;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,UAAA,CAAW,KAAK,aAAa,CAAA;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAC5E,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,CAAA;AAEjC,IAAA,MAAM,CAAC,WAAA,EAAa,YAAY,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACpD,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,CAAA,+CAAA,EAAkD,KAAK,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,MAAM,CAAA,CAAE,KAAA,EAAM;AAAA,MACjG,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,CAAA,+BAAA,EAAkC,KAAK,CAAA,0CAAA,CAA4C,CAAA,CAAE,IAAA,CAAK,GAAG,MAAA,EAAQ,KAAA,EAAO,MAAM,EAAE,GAAA;AAAI,KACzI,CAAA;AAED,IAAA,MAAM,UAAU,YAAA,CAAa,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,MAC3D,GAAG,CAAA;AAAA,MACH,YAAY,CAAA,CAAE,UAAA,GAAa,KAAK,KAAA,CAAM,CAAA,CAAE,UAAU,CAAA,GAAI;AAAA,KACxD,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAa,SAAS,CAAA,EAAE;AAAA,EAClD;AAAA,EAEA,MAAM,QAAA,CAAS,SAAA,EAAoB,OAAA,EAAuC;AACxE,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,IACvB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAE5E,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC5C,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAKU,KAAK;AAAA,MAAA,CAC9B,CAAA,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,KAAA,EAAM;AAAA,MACzB,IAAA,CAAK,GAAG,OAAA,CAAQ;AAAA;AAAA,8BAAA,EAEU,KAAK;AAAA;AAAA,MAAA,CAE9B,CAAA,CAAE,IAAA,CAAK,GAAG,MAAM,EAAE,GAAA;AAAI,KACxB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,QAAQ,YAAA,IAAgB,CAAA;AAAA,MACrC,WAAA,EAAa,QAAQ,YAAA,IAAgB,CAAA;AAAA,MACrC,cAAA,EAAgB,QAAQ,eAAA,IAAmB,CAAA;AAAA,MAC3C,SAAA,EAAA,CAAY,SAAA,CAAU,OAAA,IAAW,IAAI,GAAA,CAAI,CAAC,CAAA,MAAY,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,OAAM,CAAE;AAAA,KAC3F;AAAA,EACF;AACF,CAAA;;;ACnKA,IAAMN,UAAAA,GAAY,IAAIzB,SAAAA,EAAmD;AAGzEyB,UAAAA,CAAU,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA,KAAM;AAC/B,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAE3C,EAAA,MAAM,KAAK,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,kBAAkB,KACrC,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,iBAAiB,GAAG,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,EAAG,MAAK,IACrD,SAAA;AACL,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,IAAK,EAAA;AAChD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,EACnD;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK;AACrB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,gCAAA,IAAoC,GAAG,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MAC5B,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAA,EAAU,EAAE,QAAA,IAAY,eAAA;AAAA,MACxB,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,MAAA,EAAQ,IAAA,EAAM,MAAA,IAAU,CAAA,CAAE,MAAA;AAAA,MAC1B,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,MACX,SAAA;AAAA,MACA,MAAM,CAAA,CAAE;AAAA,KACV,CAAE,CAAA;AAGF,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAC,EAAE,KAAA,IAAS,OAAO,CAAA,CAAE,KAAA,KAAU,QAAQ,CAAA;AACxE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,8CAAA,IAAkD,GAAG,CAAA;AAAA,IAC9E;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AAC3C,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,GAAA,EAAK,KAAA,EAAO,GAAA,CAAI,MAAA,EAAQ,CAAA;AAAA,EACnE;AAGA,EAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,OAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AACjD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,gDAAA,IAAoD,GAAG,CAAA;AAAA,EAChF;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW;AAAA,IACvC,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAA,EAAU,KAAK,QAAA,IAAY,eAAA;AAAA,IAC3B,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,MAAA,EAAQ,IAAA,EAAM,MAAA,IAAU,IAAA,CAAK,MAAA;AAAA,IAC7B,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,SAAA,EAAW,EAAA;AAAA,IACX,SAAA;AAAA,IACA,MAAM,IAAA,CAAK;AAAA,GACZ,CAAA;AAED,EAAA,OAAO,EAAE,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAC1C,CAAC,CAAA;AAGDA,UAAAA,CAAU,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAM;AAC9B,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,uBAAA,IAA2B,GAAG,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,MAAA;AAAA,IAC/B,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,IAAK,MAAA;AAAA,IACrC,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA;AAAA,IACjC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,IAAK,MAAA;AAAA,IACvC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAE,CAAA,GAAI,MAAA;AAAA,IAC5E,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAE,CAAA,GAAI,MAAA;AAAA,IACtE,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,EAAA;AAAA,IAChE,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAE,CAAA,GAAI;AAAA,GACrE;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAChD,EAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AACtB,CAAC,CAAA;AAGDA,UAAAA,CAAU,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAM;AACnC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,uBAAA,IAA2B,GAAG,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAE3C,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAE,CAAA,GAAI,MAAA;AACnF,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAE,CAAA,GAAI,MAAA;AAE7E,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,OAAO,CAAA;AACvD,EAAA,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AACrB,CAAC,CAAA;;;AChFM,IAAM,aAAA,GAA6C;AAAA;AAAA,EAExD,OAAA,EAAS;AAAA,IACP,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,SAAA;AAAA,IACX,YAAA,EAAc,CAAC,gBAAA,EAAkB,gBAAA,EAAkB,iBAAiB,CAAA;AAAA,IACpE,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,GAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,MAAA;AAAA,IACX,YAAA,EAAc,CAAC,aAAA,EAAe,aAAA,EAAe,YAAY,CAAA;AAAA,IACzD,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,CAAC,eAAA,EAAiB,iBAAA,EAAmB,mBAAmB,CAAA;AAAA,IACtE,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACL,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,OAAA;AAAA,IACX,YAAA,EAAc,CAAC,cAAA,EAAgB,cAAA,EAAgB,cAAc,CAAA;AAAA,IAC7D,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,GAAA,EAAK;AAAA,IACH,GAAA,EAAK,GAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,KAAA;AAAA,IACX,YAAA,EAAc,CAAC,gBAAA,EAAkB,iBAAiB,CAAA;AAAA,IAClD,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA,IACP,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,KAAA;AAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,SAAA;AAAA,IACX,YAAA,EAAc,CAAC,aAAa,CAAA;AAAA,IAC5B,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,CAAC,iBAAA,EAAmB,mBAAA,EAAqB,eAAe,CAAA;AAAA,IACtE,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,UAAA,EAAY;AAAA,IACV,GAAA,EAAK,IAAA;AAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,YAAA;AAAA,IACX,YAAA,EAAc,CAAC,mBAAA,EAAqB,mBAAmB,CAAA;AAAA,IACvD,OAAA,EAAS;AAAA;AAEb,CAAA;AAKO,SAAS,eAAe,SAAA,EAAgC;AAC7D,EAAA,OAAO,aAAA,CAAc,SAAS,CAAA,IAAK;AAAA,IACjC,GAAA,EAAK,IAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,SAAA;AAAA,IACA,cAAc,EAAC;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AACF;AAMO,SAAS,gBAAA,CACd,SAAA,EACA,IAAA,EACA,UAAA,EACA,OAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAAI,OAAA,IAAW,cAAA,CAAe,SAAS,EAAE,OAAA,IAAW,IAAA;AAC1D,EAAA,OAAO,GAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,UAAU,IAAI,CAAC,CAAA,CAAA;AAChD;AAKO,SAAS,cAAc,GAAA,EAKrB;AACP,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAAA,IACvB,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAAA,IAClB,UAAA,EAAY,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAAA,IACxB,OAAA,EAAS,KAAA,CAAM,CAAC,CAAA,IAAK;AAAA,GACvB;AACF;;;ACxIA,IAAM,cAAN,MAAkB;AAAA,EACR,KAAA,uBAA0C,GAAA,EAAI;AAAA,EAC9C,OAAA,GAAkB,KAAK,IAAA,GAAO,IAAA;AAAA;AAAA,EAC9B,WAAA,GAAsB,CAAA;AAAA;AAAA;AAAA;AAAA,EAK9B,IAAO,GAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAEhC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAO,GAAA,EAAa,KAAA,EAAU,GAAA,EAAa,UAAkB,IAAA,EAAY;AACvE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,MAAO,GAAA,GAAM,GAAA;AAAA,MACxB;AAAA,KACF;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,GAAS,CAAA;AAGjD,IAAA,IAAI,IAAA,CAAK,WAAA,GAAc,SAAA,GAAY,IAAA,CAAK,OAAA,EAAS;AAC/C,MAAA,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,IACzB;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,WAAA,IAAe,SAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAA,EAAsB;AAC3B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,GAAS,CAAA;AACjD,MAAA,IAAA,CAAK,WAAA,IAAe,SAAA;AACpB,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA4C;AAC1C,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,WAAA;AAAA,MACX,KAAA,EAAO,KAAK,KAAA,CAAM;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,WAAA,EAA2B;AAE1C,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,OAAA,EAAS,CAAA,CAAE,IAAA;AAAA,MAC/C,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAE;AAAA,KAClC;AAEA,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAA,EAAS;AAClC,MAAA,IAAI,cAAc,WAAA,EAAa;AAE/B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,GAAS,CAAA;AACjD,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,MAAA,UAAA,IAAc,SAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAA,EAAyB;AACzC,IAAA,MAAM,QAAQ,IAAI,MAAA;AAAA,MAChB,GAAA,GAAM,QAAQ,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,GAAI;AAAA,KAC3D;AAEA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACnC,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG;AACnB,QAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,QAAA,KAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAgBO,IAAM,eAAN,MAAmB;AAAA,EAChB,WAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EAER,WAAA,CAAY,QAAqB,WAAA,EAA2B;AAC1D,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,EAAY;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,UAAA,EAAY,CAAA;AAAA,MACZ,YAAA,EAAc,CAAA;AAAA,MACd,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ,CAAA;AAAA,MACR,aAAA,EAAe,CAAA;AAAA,MACf,OAAA,EAAS,CAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAO,GAAA,EAAgC;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,aAAA,EAAA;AAGX,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAO,GAAG,CAAA;AAC/C,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,IAAA,CAAK,KAAA,CAAM,UAAA,EAAA;AACX,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,OAAO,WAAA;AAAA,MACT;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,YAAA,EAAA;AAAA,IACb;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,WAAA,EAAa;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,MAAM,CAAA;AACtD,QAAA,IAAI,YAAY,IAAA,EAAM;AACpB,UAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAA;AAGX,UAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,YAAA,IAAA,CAAK,WAAA,CAAY,IAAI,GAAA,EAAK,OAAA,EAAc,KAAK,MAAA,CAAO,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAAA,UAC9E;AAEA,UAAA,IAAA,CAAK,aAAA,EAAc;AACnB,UAAA,OAAO,OAAA;AAAA,QACT;AACA,QAAA,IAAA,CAAK,KAAA,CAAM,QAAA,EAAA;AAAA,MACb,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,QAAA,IAAA,CAAK,KAAA,CAAM,QAAA,EAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAiB,GAAA,EAAsC;AAC3D,IAAA,IAAA,CAAK,KAAA,CAAM,aAAA,EAAA;AAGX,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAO,GAAG,CAAA;AAC/C,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,IAAA,CAAK,KAAA,CAAM,UAAA,EAAA;AACX,QAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAY,GAAG,CAAA;AACxC,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,WAAA;AAAA,UACN,MAAA,EAAQ,QAAA;AAAA,UACR,GAAA,EAAK,IAAA;AAAA,UACL,WAAW,KAAA,EAAO,SAAA;AAAA,UAClB,KAAK,KAAA,EAAO;AAAA,SACd;AAAA,MACF;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,YAAA,EAAA;AAAA,IACb;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,WAAA,EAAa;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,MAAM,CAAA;AACtD,QAAA,IAAI,YAAY,IAAA,EAAM;AACpB,UAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAA;AAGX,UAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,YAAA,IAAA,CAAK,WAAA,CAAY,IAAI,GAAA,EAAK,OAAA,EAAc,KAAK,MAAA,CAAO,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAAA,UAC9E;AAEA,UAAA,IAAA,CAAK,aAAA,EAAc;AACnB,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,MAAA,EAAQ,IAAA;AAAA,YACR,GAAA,EAAK;AAAA,WACP;AAAA,QACF;AACA,QAAA,IAAA,CAAK,KAAA,CAAM,QAAA,EAAA;AAAA,MACb,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,QAAA,IAAA,CAAK,KAAA,CAAM,QAAA,EAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CACJ,GAAA,EACA,KAAA,EACA,YAAA,EACe;AACf,IAAA,MAAM,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,YAAA,EAAa;AAGjD,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,IAAA,CAAK,YAAY,GAAA,CAAI,GAAA,EAAK,OAAO,MAAA,CAAO,GAAA,EAAK,OAAO,OAAO,CAAA;AAAA,IAC7D;AAGA,IAAA,IAAI,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,WAAA,EAAa;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,WAAA,CAAY,GAAA,CAAI,KAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AAAA,UACrD,eAAe,MAAA,CAAO;AAAA,SACvB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,GAAA,EAA4B;AAEvC,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,WAAA,EAAa;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,GAAG,CAAA;AAAA,MACnC,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,IACzB;AAGA,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,UAAA,EAAY,CAAA;AAAA,MACZ,YAAA,EAAc,CAAA;AAAA,MACd,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ,CAAA;AAAA,MACR,aAAA,EAAe,CAAA;AAAA,MACf,OAAA,EAAS,CAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAAkC;AACjD,IAAA,IAAI,KAAA,GAAQ,CAAA;AAGZ,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,KAAA,IAAS,IAAA,CAAK,WAAA,CAAY,iBAAA,CAAkB,OAAO,CAAA;AAAA,IACrD;AAKA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,WAAA,EAAa;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,IAAI,MAAA;AAAA,UAChB,GAAA,GAAM,QAAQ,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,GAAI;AAAA,SAC3D;AAGA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,GAAA;AACvC,QAAA,MAAM,OAAO,MAAM,IAAA,CAAK,YAAY,IAAA,CAAK,EAAE,QAAQ,CAAA;AAEnD,QAAA,KAAA,MAAW,GAAA,IAAO,KAAK,IAAA,EAAM;AAC3B,UAAA,IAAI,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACxB,YAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AACtC,YAAA,KAAA,EAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,MACrD;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,OAAA,EAAkC;AACxD,IAAA,OAAO,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAuB;AACrB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,QAAA,EAAS;AAE3C,IAAA,OAAO;AAAA,MACL,GAAG,IAAA,CAAK,KAAA;AAAA,MACR,YAAY,QAAA,CAAS,IAAA;AAAA,MACrB,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAM,UAAA,GAAa,KAAK,KAAA,CAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA;AACzE,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,IAC3C,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,aAAA,GAAiB,GAAA,GACzC,CAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,MAAc,UAAA,EAA4B;AACpD,IAAA,OAAO,gBAAA;AAAA,MACL,KAAK,MAAA,CAAO,SAAA;AAAA,MACZ,IAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAK,MAAA,CAAO;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAa,OAAA,EAA0D;AAC3E,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,GAAA,EAA+B;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,OAAO,KAAA,KAAU,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAW,IAAA,EAAyC;AACxD,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAe;AAEnC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,GAAA,CAAO,GAAG,CAAA;AACnC,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,OAAA,EACA,YAAA,EACe;AACf,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,KAAK,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,OAAO,YAAY,CAAA;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAA,EAA+B;AAC9C,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CACJ,GAAA,EACA,OAAA,EACA,YAAA,EACY;AAEZ,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAO,GAAG,CAAA;AACpC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,EAAQ;AAG5B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,YAAY,CAAA;AAEvC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0F;AAC9F,IAAA,MAAM,OAA6E,EAAC;AAGpF,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,MAAM,KAAA,GAAS,KAAK,WAAA,CAAoB,KAAA;AACxC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AAC1C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,GAAS,CAAA;AAC5C,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA;AAC/B,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,GAAA;AAAA,UACA,IAAA;AAAA,UACA,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAY,GAAA,EAMR;AACR,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAS,KAAK,WAAA,CAAoB,KAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAE3B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,MAAM,IAAA,CAAK,OAAO,GAAG,CAAA;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,GAAS,CAAA;AAC5C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAK,CAAA,GAAI,GAAA;AAExD,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,GAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAYA,IAAM,cAAA,uBAAqB,GAAA,EAA0B;AACrD,IAAI,iBAAA;AAYG,SAAS,eAAA,CAAgB,QAAqB,WAAA,EAAyC;AAC5F,EAAA,MAAM,MAAM,MAAA,CAAO,SAAA;AAEnB,EAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAE5B,IAAA,MAAM,KAAoB,iBAAA;AAC1B,IAAA,cAAA,CAAe,IAAI,GAAA,EAAK,IAAI,YAAA,CAAa,MAAA,EAAQ,EAAE,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,OAAO,cAAA,CAAe,IAAI,GAAG,CAAA;AAC/B;AAKA,eAAsB,cAAA,GAAgC;AACpD,EAAA,KAAA,MAAW,KAAA,IAAS,cAAA,CAAe,MAAA,EAAO,EAAG;AAC3C,IAAA,MAAM,MAAM,KAAA,EAAM;AAAA,EACpB;AACF;AAKO,SAAS,gBAAA,GAA+C;AAC7D,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,CAAA,IAAK,cAAA,CAAe,SAAQ,EAAG;AACzD,IAAA,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA,CAAM,QAAA,EAAS;AAAA,EACpC;AAEA,EAAA,OAAO,KAAA;AACT;;;ACzmBA,IAAM,WAAN,MAAe;AAAA,EACL,aAAA,uBAAiD,GAAA,EAAI;AAAA,EACrD,WAAoE,EAAC;AAAA,EACrE,UAAA,GAAqB,GAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,EAAA,CAAG,OAAe,OAAA,EAAmC;AACnD,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,CAAG,KAAK,OAAO,CAAA;AAG3C,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAC7C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AACtC,QAAA,IAAI,QAAQ,EAAA,EAAI;AACd,UAAA,QAAA,CAAS,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,KAAA,EAAe,IAAA,EAA2B;AAEnD,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,IAAI,CAAA;AAEzB,IAAA,MAAM,WAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,KAAK,EAAC;AAGnD,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,QAAA,CAAS,GAAA,CAAI,OAAO,OAAA,KAAY;AAC9B,QAAA,IAAI;AACF,UAAA,MAAM,QAAQ,IAAI,CAAA;AAAA,QACpB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QAC7D;AAAA,MACF,CAAC;AAAA,KACH;AAGA,IAAA,MAAM,mBAAmB,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAG,KAAK,EAAC;AACzD,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,gBAAA,CAAiB,GAAA,CAAI,OAAO,OAAA,KAAY;AACtC,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,CAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,QAC/B,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAA,EAAqB;AACvB,IAAA,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAsB;AACpB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,KAAA,EAAuB;AACxC,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,GAAG,MAAA,IAAU,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,CAAS,OAAe,IAAA,EAAkB;AAChD,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,MACjB,KAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB;AAAA,KACD,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY;AAC1C,MAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,QAAgB,EAAA,EAA6D;AACvF,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,WAAW,EAAC;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAIE;AACA,IAAA,MAAM,cAAsC,EAAC;AAE7C,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,QAAA,EAAU;AAC/B,MAAA,WAAA,CAAY,IAAI,KAAK,CAAA,GAAA,CAAK,YAAY,GAAA,CAAI,KAAK,KAAK,CAAA,IAAK,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,KAAK,QAAA,CAAS,MAAA;AAAA,MAC3B,kBAAA,EAAoB,KAAK,aAAA,CAAc,IAAA;AAAA,MACvC;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAGA,IAAI,cAAA,GAAkC,IAAA;AAK/B,SAAS,WAAA,GAAwB;AACtC,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,cAAA,GAAiB,IAAI,QAAA,EAAS;AAAA,EAChC;AACA,EAAA,OAAO,cAAA;AACT;AAaO,SAAS,OAAA,CAAQ,OAAe,OAAA,EAAmC;AACxE,EAAA,MAAM,MAAM,WAAA,EAAY;AACxB,EAAA,OAAO,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAC9B;;;ACjKO,SAAS,sBAAA,GAA+B;AAC7C,EAAkB,WAAA;AAGlB,EAAA,wBAAA,EAAyB;AAGzB,EAAA,qBAAA,EAAsB;AAGtB,EAAA,uBAAA,EAAwB;AAGxB,EAAA,sBAAA,EAAuB;AAGvB,EAAA,oBAAA,EAAqB;AAGrB,EAAA,2BAAA,EAA4B;AAE5B,EAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACvD;AAKA,SAAS,wBAAA,GAAiC;AACxC,EAAA,MAAM,SAAS,aAAA,CAAc,OAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,YAAA,GAAe,gBAAgB,MAAM,CAAA;AAG3C,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,KAAA,KAAU;AACzC,IAAA,MAAM,YAAA,CAAa,WAAW,WAAW,CAAA;AACzC,IAAA,OAAA,CAAQ,IAAI,mCAAmC,CAAA;AAAA,EACjD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,IAAA,KAAS;AACxC,IAAA,IAAI,MAAM,EAAA,EAAI;AAEZ,MAAA,MAAM,aAAa,MAAA,CAAO,YAAA,CAAa,YAAY,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,YAAA,CAAa,WAAW,gBAAgB,CAAA;AAC9C,IAAA,OAAA,CAAQ,GAAA,CAAI,mCAAA,EAAqC,IAAA,EAAM,EAAE,CAAA;AAAA,EAC3D,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,IAAA,KAAS;AACxC,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,aAAa,MAAA,CAAO,YAAA,CAAa,YAAY,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACrE;AACA,IAAA,MAAM,YAAA,CAAa,WAAW,WAAW,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,mCAAA,EAAqC,IAAA,EAAM,EAAE,CAAA;AAAA,EAC3D,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,iBAAA,EAAmB,OAAO,KAAA,KAAU;AAC1C,IAAA,MAAM,YAAA,CAAa,WAAW,WAAW,CAAA;AACzC,IAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAAA,EAClD,CAAC,CAAA;AACH;AAKA,SAAS,qBAAA,GAA8B;AACrC,EAAA,MAAM,SAAS,aAAA,CAAc,IAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,SAAA,GAAY,gBAAgB,MAAM,CAAA;AAExC,EAAA,OAAA,CAAQ,aAAA,EAAe,OAAO,IAAA,KAAS;AACrC,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,UAAU,MAAA,CAAO,SAAA,CAAU,YAAY,IAAA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,UAAU,MAAA,CAAO,SAAA,CAAU,YAAY,OAAA,EAAS,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACnE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,gCAAA,EAAkC,IAAA,EAAM,EAAE,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,aAAA,EAAe,OAAO,IAAA,KAAS;AACrC,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,UAAU,MAAA,CAAO,SAAA,CAAU,YAAY,IAAA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,UAAU,MAAA,CAAO,SAAA,CAAU,YAAY,OAAA,EAAS,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACnE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,gCAAA,EAAkC,IAAA,EAAM,EAAE,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,YAAA,EAAc,OAAO,IAAA,KAAS;AACpC,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,MAAM,UAAU,MAAA,CAAO,SAAA,CAAU,YAAY,IAAA,EAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACjE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,+BAAA,EAAiC,IAAA,EAAM,MAAM,CAAA;AAAA,EAC3D,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,aAAA,EAAe,OAAO,IAAA,KAAS;AAErC,IAAA,MAAM,gBAAgB,aAAA,CAAc,OAAA;AACpC,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,YAAA,GAAe,gBAAgB,aAAa,CAAA;AAClD,MAAA,IAAI,MAAM,SAAA,EAAW;AACnB,QAAA,MAAM,aAAa,MAAA,CAAO,YAAA,CAAa,YAAY,SAAA,EAAW,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MAC/E;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAAA,EAC9C,CAAC,CAAA;AACH;AAKA,SAAS,uBAAA,GAAgC;AACvC,EAAA,MAAM,eAAe,aAAA,CAAc,MAAA;AACnC,EAAA,IAAI,CAAC,YAAA,EAAc;AACnB,EAAA,MAAM,WAAA,GAAc,gBAAgB,YAAY,CAAA;AAEhD,EAAA,OAAA,CAAQ,eAAA,EAAiB,OAAO,KAAA,KAAU;AACxC,IAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AACvC,IAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAAA,EAChD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,iBAAA,EAAmB,OAAO,IAAA,KAAS;AACzC,IAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AACvC,IAAA,MAAM,eAAe,aAAA,CAAc,MAAA;AACnC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,WAAA,GAAc,gBAAgB,YAAY,CAAA;AAChD,MAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AAAA,IACzC;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,oCAAA,EAAsC,IAAA,EAAM,QAAQ,CAAA;AAAA,EAClE,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,mBAAA,EAAqB,OAAO,IAAA,KAAS;AAC3C,IAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AACvC,IAAA,MAAM,eAAe,aAAA,CAAc,MAAA;AACnC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,WAAA,GAAc,gBAAgB,YAAY,CAAA;AAChD,MAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AAAA,IACzC;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,sCAAA,EAAwC,IAAA,EAAM,QAAQ,CAAA;AAAA,EACpE,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,eAAA,EAAiB,OAAO,IAAA,KAAS;AACvC,IAAA,MAAM,eAAe,aAAA,CAAc,MAAA;AACnC,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,MAAM,WAAA,GAAc,gBAAgB,YAAY,CAAA;AAChD,IAAA,MAAM,WAAA,CAAY,WAAW,UAAU,CAAA;AACvC,IAAA,OAAA,CAAQ,GAAA,CAAI,kCAAA,EAAoC,IAAA,EAAM,QAAQ,CAAA;AAAA,EAChE,CAAC,CAAA;AACH;AAKA,SAAS,sBAAA,GAA+B;AACtC,EAAA,MAAM,SAAS,aAAA,CAAc,KAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,UAAA,GAAa,gBAAgB,MAAM,CAAA;AAEzC,EAAA,OAAA,CAAQ,cAAA,EAAgB,OAAO,KAAA,KAAU;AACvC,IAAA,MAAM,UAAA,CAAW,WAAW,SAAS,CAAA;AACrC,IAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA;AAAA,EAC/C,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,cAAA,EAAgB,OAAO,IAAA,KAAS;AACtC,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,WAAW,MAAA,CAAO,UAAA,CAAW,YAAY,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,UAAA,CAAW,WAAW,cAAc,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,iCAAA,EAAmC,IAAA,EAAM,EAAE,CAAA;AAAA,EACzD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,cAAA,EAAgB,OAAO,IAAA,KAAS;AACtC,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,WAAW,MAAA,CAAO,UAAA,CAAW,YAAY,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,UAAA,CAAW,WAAW,cAAc,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,iCAAA,EAAmC,IAAA,EAAM,EAAE,CAAA;AAAA,EACzD,CAAC,CAAA;AACH;AAKA,SAAS,oBAAA,GAA6B;AACpC,EAAA,MAAM,SAAS,aAAA,CAAc,GAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,QAAA,GAAW,gBAAgB,MAAM,CAAA;AAEvC,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,KAAA,KAAU;AACzC,IAAA,MAAM,QAAA,CAAS,WAAW,OAAO,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,iBAAA,EAAmB,OAAO,KAAA,KAAU;AAC1C,IAAA,MAAM,QAAA,CAAS,WAAW,OAAO,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,KAAA,KAAU;AACzC,IAAA,MAAM,QAAA,CAAS,WAAW,OAAO,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,gBAAA,EAAkB,OAAO,KAAA,KAAU;AACzC,IAAA,MAAM,QAAA,CAAS,WAAW,OAAO,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,mBAAA,EAAqB,OAAO,KAAA,KAAU;AAC5C,IAAA,MAAM,QAAA,CAAS,WAAW,OAAO,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,4CAA4C,CAAA;AAAA,EAC1D,CAAC,CAAA;AACH;AAKA,SAAS,2BAAA,GAAoC;AAC3C,EAAA,MAAM,SAAS,aAAA,CAAc,UAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,eAAA,GAAkB,gBAAgB,MAAM,CAAA;AAE9C,EAAA,OAAA,CAAQ,mBAAA,EAAqB,OAAO,KAAA,KAAU;AAC5C,IAAA,MAAM,eAAA,CAAgB,WAAW,cAAc,CAAA;AAC/C,IAAA,OAAA,CAAQ,IAAI,sCAAsC,CAAA;AAAA,EACpD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,mBAAA,EAAqB,OAAO,IAAA,KAAS;AAC3C,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,MAAM,gBAAgB,MAAA,CAAO,eAAA,CAAgB,YAAY,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC3E;AACA,IAAA,MAAM,eAAA,CAAgB,WAAW,cAAc,CAAA;AAC/C,IAAA,OAAA,CAAQ,GAAA,CAAI,sCAAA,EAAwC,IAAA,EAAM,EAAE,CAAA;AAAA,EAC9D,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,mBAAA,EAAqB,OAAO,IAAA,KAAS;AAC3C,IAAA,MAAM,eAAA,CAAgB,WAAW,cAAc,CAAA;AAC/C,IAAA,OAAA,CAAQ,GAAA,CAAI,sCAAA,EAAwC,IAAA,EAAM,EAAE,CAAA;AAAA,EAC9D,CAAC,CAAA;AACH;AAKO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,OAAO,SAAS,QAAA,EAAS;AAC3B;AAKO,SAAS,sBAAA,CAAuB,QAAgB,EAAA,EAAI;AACzD,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,OAAO,QAAA,CAAS,YAAY,KAAK,CAAA;AACnC;;;AClQA,eAAsB,iBAAiB,EAAA,EAIpC;AACD,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,MAAM,UAAuD,EAAC;AAE9D,EAAA,IAAI;AAEF,IAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,EAAE,CAAA;AAChD,IAAA,WAAA,IAAe,eAAA;AACf,IAAA,OAAA,CAAQ,KAAK,EAAE,SAAA,EAAW,YAAA,EAAc,KAAA,EAAO,iBAAiB,CAAA;AAGhE,IAAA,MAAM,YAAA,GAAe,MAAM,iBAAA,CAAkB,EAAE,CAAA;AAC/C,IAAA,WAAA,IAAe,YAAA;AACf,IAAA,OAAA,CAAQ,KAAK,EAAE,SAAA,EAAW,SAAA,EAAW,KAAA,EAAO,cAAc,CAAA;AAG1D,IAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,EAAE,CAAA;AAC3C,IAAA,WAAA,IAAe,UAAA;AACf,IAAA,OAAA,CAAQ,KAAK,EAAE,SAAA,EAAW,OAAA,EAAS,KAAA,EAAO,YAAY,CAAA;AAAA,EAExD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,IAAA,WAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,WAAA;AAAA,IACR,MAAA,EAAQ,WAAA;AAAA,IACR;AAAA,GACF;AACF;AAKA,eAAe,gBAAgB,EAAA,EAAiC;AAC9D,EAAA,MAAM,SAAS,aAAA,CAAc,UAAA;AAC7B,EAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AACpB,EAAA,MAAM,eAAA,GAAkB,gBAAgB,MAAM,CAAA;AAC9C,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,+CAA+C,CAAA;AACvE,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAK,GAAA,EAAI;AAEnC,IAAA,KAAA,MAAW,cAAc,OAAA,EAAkB;AACzC,MAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,WAAA,CAAY,MAAA,EAAQ,WAAW,EAAE,CAAA;AAC7D,MAAA,MAAM,eAAA,CAAgB,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AACzC,MAAA,KAAA,EAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AACzD,IAAA,MAAM,eAAA,CAAgB,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAC1C,IAAA,KAAA,EAAA;AAAA,EAEF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,iBAAA,CAAkB,EAAA,EAAgB,KAAA,GAAgB,EAAA,EAAqB;AACpF,EAAA,MAAM,SAAS,aAAA,CAAc,OAAA;AAC7B,EAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AACpB,EAAA,MAAM,YAAA,GAAe,gBAAgB,MAAM,CAAA;AAC3C,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,CAAA,qDAAA,EAAwD,KAAK,CAAA,CAAE,CAAA;AACvF,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAK,GAAA,EAAI;AAEnC,IAAA,KAAA,MAAWX,YAAW,OAAA,EAAkB;AACtC,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,WAAA,CAAY,MAAA,EAAQA,SAAQ,EAAE,CAAA;AACvD,MAAA,MAAM,YAAA,CAAa,GAAA,CAAI,GAAA,EAAKA,QAAO,CAAA;AACnC,MAAA,KAAA,EAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,WAAA,CAAY,MAAA,EAAQ,QAAQ,CAAA;AACzD,IAAA,MAAM,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACvC,IAAA,KAAA,EAAA;AAAA,EAEF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,eAAA,CAAgB,EAAA,EAAgB,KAAA,GAAgB,EAAA,EAAqB;AAClF,EAAA,MAAM,SAAS,aAAA,CAAc,KAAA;AAC7B,EAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AACpB,EAAA,MAAM,UAAA,GAAa,gBAAgB,MAAM,CAAA;AACzC,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,CAAA,6EAAA,EAAgF,KAAK,CAAA,CAAE,CAAA;AAC/G,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAK,GAAA,EAAI;AAEnC,IAAA,KAAA,MAAWmB,UAAS,OAAA,EAAkB;AACpC,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,WAAA,CAAY,MAAA,EAAQA,OAAM,EAAE,CAAA;AACnD,MAAA,MAAM,UAAA,CAAW,GAAA,CAAI,GAAA,EAAKA,MAAK,CAAA;AAC/B,MAAA,KAAA,EAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,WAAA,CAAY,MAAA,EAAQ,QAAQ,CAAA;AACvD,IAAA,MAAM,UAAA,CAAW,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACrC,IAAA,KAAA,EAAA;AAAA,EAEF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,aAAA,CACpB,WACA,OAAA,EACiB;AACjB,EAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAE,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,KAAA,CAAM,QAAQ,OAAO,CAAA;AAE3B,EAAA,OAAO,OAAA,CAAQ,MAAA;AACjB;;;ACvJArC,qDAAA,EAAA;AAkCO,SAAS,qBAAqB,IAAA,EAAkC;AACrE,EAAA,MAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,QAAA,EAkCZ,eAAe,gBAAA,EAAkB,IAAA,CAAK,OAAO,QAAA,CAAS,cAAA,IAAkB,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,QAAA,CAIjF,CAAC;;AAAA,QAAA,EAEA,eAAe,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,KAAK,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,EAI7D,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,OAAO,IAAI,EAAA,GAAK,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,OAAO,OAAO,CAAA,GAAI,EAAA,GAAK,OAAA,GAAU,KAAK,CAAC;;AAAA,QAAA,EAExG,eAAe,cAAA,EAAgB,WAAA,CAAY,KAAK,MAAA,CAAO,UAAU,GAAG,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAI/E,CAAC;;AAAA,QAAA,EAEA,eAAe,gBAAA,EAAkB,IAAA,CAAK,OAAO,UAAA,CAAW,cAAA,IAAkB,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA,QAAA,CAIlF,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAuCM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAA,SAAA,KAAa;AACjC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACjC,IAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,IAAA,OAAO,kBAAA,CAAmB,WAAW,IAAI,CAAA;AAAA,EAC3C,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAaX,uBAAA,CAAwB,gBAAgB,IAAA,CAAK,MAAA,CAAO,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC;AAAA,YAAA,EAC7E,mBAAmB,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,IAAA,EAgE3DsC,0CAAAA,CAAyB;AAAA,IACzB,EAAA,EAAI,yBAAA;AAAA,IACJ,KAAA,EAAO,iBAAA;AAAA,IACP,OAAA,EAAS,0EAAA;AAAA,IACT,WAAA,EAAa,WAAA;AAAA,IACb,UAAA,EAAY,QAAA;AAAA,IACZ,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,mCAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACZ,CAAC;;AAAA,IAAA,EAEAA,0CAAAA,CAAyB;AAAA,IACzB,EAAA,EAAI,+BAAA;AAAA,IACJ,KAAA,EAAO,uBAAA;AAAA,IACP,OAAA,EAAS,iCAAA;AAAA,IACT,WAAA,EAAa,OAAA;AAAA,IACb,UAAA,EAAY,QAAA;AAAA,IACZ,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,mCAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACZ,CAAC;;AAAA,IAAA,EAEAC,+CAA6B;AAAA,EAAA,CAAA;AAGjC,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW,cAAA;AAAA,IACX,WAAA,EAAa,cAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,OAAOrC,4CAA0B,UAAU,CAAA;AAC7C;AAEA,SAAS,cAAA,CAAe,KAAA,EAAe,KAAA,EAAe,KAAA,EAAe,MAAc,aAAA,EAAgC;AACjH,EAAA,MAAM,aAAa,aAAA,IAAiB,KAAA;AACpC,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,IAAA,EAAM,wGAAA;AAAA,IACN,IAAA,EAAM,wGAAA;AAAA,IACN,MAAA,EAAQ,oHAAA;AAAA,IACR,GAAA,EAAK,kGAAA;AAAA,IACL,KAAA,EAAO,8GAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACP;AAEA,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,yDAAA,EAKkD,YAAA,CAAa,UAAuC,CAAC,CAAA;AAAA,cAAA,EAChG,IAAI;AAAA;AAAA;AAAA,kEAAA,EAGgD,KAAK,CAAA;AAAA,mFAAA,EACY,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAO1F;AAEA,SAAS,kBAAA,CAAmB,WAAmB,IAAA,EAA0B;AACvE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AACtC,EAAA,MAAM,YAAA,GAAe,KAAK,OAAA,GAAU,EAAA,GAAK,qCACpB,IAAA,CAAK,OAAA,GAAU,KAAK,oCAAA,GACpB,gCAAA;AAErB,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA,UAAA,EAIG,SAAS;AAAA;AAAA;AAAA;AAAA,QAAA,EAIX,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB;AAAA;AAAA;AAAA,yCAAA,EAGF,YAAY,CAAA;AAAA,UAAA,EAC3C,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAIT,IAAA,CAAK,UAAA,CAAW,cAAA,EAAgB;AAAA;AAAA;AAAA,QAAA,EAGhC,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB;AAAA;AAAA;AAAA,QAAA,EAG5B,IAAA,CAAK,UAAA,CAAW,cAAA,EAAgB;AAAA;AAAA;AAAA,QAAA,EAGhC,WAAA,CAAY,IAAA,CAAK,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA,wCAAA,EAII,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAQnD;AAEA,SAAS,uBAAA,CAAwB,KAAA,EAAe,IAAA,EAAc,MAAA,EAAwB;AACpF,EAAA,MAAM,QAAQ,IAAA,GAAO,MAAA;AACrB,EAAA,MAAM,aAAA,GAAgB,KAAA,GAAQ,CAAA,GAAK,IAAA,GAAO,QAAS,GAAA,GAAM,CAAA;AAEzD,EAAA,OAAO;AAAA;AAAA,4EAAA,EAEqE,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA,qEAAA,EAIZ,IAAA,CAAK,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,qEAAA,EAIrB,MAAA,CAAO,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uEAAA,EAKrB,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;AAAA;AAAA,2EAAA,EAGpB,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAM1F;AAEA,SAAS,mBAAmB,OAAA,EAAyB;AACnD,EAAA,MAAM,SAAS,OAAA,GAAU,EAAA,GAAK,SAAA,GAAY,OAAA,GAAU,KAAK,SAAA,GAAY,UAAA;AACrE,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA;AAAA,YAAA;AAAA,KAGR;AAAA,IACA,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,iBAAA;AAAA,MACP,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA;AAAA,YAAA;AAAA,KAGR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA;AAAA,YAAA;AAAA;AAGR,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,IAAA,EAAM,wGAAA;AAAA,IACN,KAAA,EAAO,8GAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACP;AAEA,EAAA,OAAO;AAAA;AAAA;AAAA,2EAAA,EAGoE,YAAA,CAAa,MAAA,CAAO,KAAkC,CAAC,CAAA;AAAA,QAAA,EAC1H,OAAO,IAAI;AAAA;AAAA,yCAAA,EAEsB,OAAO,KAAK,CAAA;AAAA;AAAA,YAAA,EAEzC,WAAW,SAAA,GAAY,0BAAA,GACvB,MAAA,KAAW,SAAA,GAAY,8CACvB,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAMzC;AAEA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,KAAA;AACxB,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,MAAM,IAAI,CAAA;AACpC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAClD,EAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC3D;;;ACpZA,IAAM,GAAA,GAAM,IAAIE,SAAAA,EAAK;AAMrB,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,KAAe;AACjC,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAC/B,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAGzB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACnC,IAAA,SAAA,IAAa,IAAA,CAAK,aAAa,IAAA,CAAK,MAAA;AACpC,IAAA,WAAA,IAAe,IAAA,CAAK,eAAe,IAAA,CAAK,QAAA;AACxC,IAAA,SAAA,IAAa,IAAA,CAAK,UAAA;AAClB,IAAA,YAAA,IAAgB,IAAA,CAAK,UAAA;AAAA,EACvB,CAAC,CAAA;AAED,EAAA,MAAM,gBAAgB,SAAA,GAAY,WAAA;AAClC,EAAA,MAAM,cAAA,GAAiB,aAAA,GAAgB,CAAA,GAAK,SAAA,GAAY,gBAAiB,GAAA,GAAM,CAAA;AAE/E,EAAA,MAAM,aAAA,GAAoC;AAAA,IACxC,KAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,QAAA,EAAU,aAAA;AAAA,MACV,OAAA,EAAS,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAA;AAAA,MACjC,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,IACA,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,IAC7B,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AAEA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,oBAAA,CAAqB,aAAa,CAAC,CAAA;AACnD,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAe;AACtC,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAE/B,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,mBAAA,EAAqB,OAAO,CAAA,KAAe;AACjD,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AAEtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,sBAAsB,SAAS,CAAA;AAAA,OACrC,GAAG,CAAA;AAAA,EACR;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,EAAS;AAE7B,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,KAAe;AACvC,EAAA,MAAM,cAAA,EAAe;AAErB,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,2BAAA;AAAA,IACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,IAAA,CAAK,mBAAA,EAAqB,OAAO,CAAA,KAAe;AAClD,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AAEtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,sBAAsB,SAAS,CAAA;AAAA,OACrC,GAAG,CAAA;AAAA,EACR;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,MAAM,KAAA,EAAM;AAElB,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,gCAAgC,SAAS,CAAA,CAAA;AAAA,IAClD,SAAA;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,IAAA,CAAK,aAAA,EAAe,OAAO,CAAA,KAAe;AAC5C,EAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,IAAA;AAE/B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,gBAAA,GAAmB,CAAA;AAEvB,EAAA,IAAI,SAAA,EAAW;AAEb,IAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,sBAAsB,SAAS,CAAA;AAAA,SACrC,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,IAAA,gBAAA,GAAmB,MAAM,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAAA,EACnD,CAAA,MAAO;AAEL,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,EAAG;AACjD,MAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,MAAA,gBAAA,IAAoB,MAAM,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAAA,IACpD;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,gBAAA;AAAA,IACb,OAAA;AAAA,IACA,WAAW,SAAA,IAAa,KAAA;AAAA,IACxB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAe;AACvC,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAG/B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACvC,EAAA,MAAM,eAAe,UAAA,CAAW,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,IAAI,CAAA,KAAM;AACpD,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,UAAA,IAAc,EAAA,GAAK,IAAA,GAAO,IAAA,CAAA;AAEnD,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,QAAQ,OAAA,GAAU,EAAA,GAAK,SAAA,GAAY,OAAA,GAAU,KAAK,SAAA,GAAY,WAAA;AAAA,MAC9D,OAAA;AAAA,MACA,WAAA,EAAA,CAAc,WAAA,GAAc,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AAAA,MAC9C,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,gBAAgB,YAAA,CAAa,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,SAAS,CAAA,GAChE,SAAA,GACA,YAAA,CAAa,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,WAAW,IAC/C,WAAA,GACA,SAAA;AAEJ,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,aAAA;AAAA,MACR,UAAA,EAAY,YAAA;AAAA,MACZ,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY;AACpC,GACD,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA,KAAe;AACxC,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,IAAK,KAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,EAAA;AACxC,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAAK,KAAA;AACtC,EAAA,MAAM,QAAQ,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,OAAO,KAAK,KAAK,CAAA;AAEpD,EAAA,MAAM,UAQD,EAAC;AAEN,EAAA,MAAM,UAAA,GAAa,cAAc,KAAA,GAC7B,MAAA,CAAO,KAAK,aAAa,CAAA,GACzB,CAAC,SAAS,CAAA;AAEd,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,MAAM,MAAA,GAAS,cAAc,EAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,QAAA,EAAS;AAElC,IAAA,KAAA,MAAW,WAAW,IAAA,EAAM;AAE1B,MAAA,IAAI,MAAA,IAAU,CAAC,OAAA,CAAQ,GAAA,CAAI,WAAA,GAAc,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG;AACvE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,GAAG,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,EAAK,CAAA,GAAI,GAAA;AAE1D,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,SAAA,EAAW,EAAA;AAAA,QACX,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,GAAA;AAAA,QACA,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AAAA,EACxC,CAAA,MAAA,IAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA;AAAA,EACtC,CAAA,MAAA,IAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,GAAA,CAAI,aAAA,CAAc,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,EACnD;AAGA,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAE7C,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,cAAA;AAAA,MACT,OAAO,OAAA,CAAQ,MAAA;AAAA,MACf,SAAS,cAAA,CAAe,MAAA;AAAA,MACxB,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,0BAAA,EAA4B,OAAO,CAAA,KAAe;AACxD,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,EAAA,MAAM,MAAM,kBAAA,CAAmB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAE,CAAA;AAElD,EAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,sBAAsB,SAAS,CAAA;AAAA,OACrC,GAAG,CAAA;AAAA,EACR;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA;AAEtC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AAEA,EAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAEhC,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAG,KAAA;AAAA,MACH,WAAW,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,WAAA,EAAY;AAAA,MACjD,WAAW,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,WAAA;AAAY,KACnD;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA,KAAe;AAC1C,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAC/B,EAAA,MAAM,oBAAoB,yBAAA,EAA0B;AACpD,EAAA,MAAM,mBAAA,GAAsB,uBAAuB,EAAE,CAAA;AAGrD,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,MAAM,sBAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,IAAA,SAAA,IAAa,IAAA,CAAK,aAAa,IAAA,CAAK,MAAA;AACpC,IAAA,WAAA,IAAe,IAAA,CAAK,eAAe,IAAA,CAAK,QAAA;AACxC,IAAA,SAAA,IAAa,IAAA,CAAK,UAAA;AAClB,IAAA,YAAA,IAAgB,IAAA,CAAK,UAAA;AAErB,IAAA,MAAMoC,iBAAgB,IAAA,CAAK,UAAA,GAAa,KAAK,MAAA,GAAS,IAAA,CAAK,eAAe,IAAA,CAAK,QAAA;AAC/E,IAAA,MAAM,OAAA,GAAUA,iBAAgB,CAAA,GAAA,CAAM,IAAA,CAAK,aAAa,IAAA,CAAK,MAAA,IAAUA,iBAAiB,GAAA,GAAM,CAAA;AAC9F,IAAA,MAAM,eAAe,IAAA,CAAK,UAAA,GAAa,IAAI,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,GAAa,CAAA;AAE/E,IAAA,mBAAA,CAAoB,IAAA,CAAK;AAAA,MACvB,SAAA;AAAA,MACA,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC1B,aAAA,EAAAA,cAAAA;AAAA,MACA,aAAA,EAAeA,iBAAgB,CAAA,GAAA,CAAM,IAAA,CAAK,aAAaA,cAAAA,GAAiB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AAAA,MAC1F,SAAA,EAAWA,iBAAgB,CAAA,GAAA,CAAM,IAAA,CAAK,SAASA,cAAAA,GAAiB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AAAA,MAClF,YAAA,EAAc,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAAA,MACrC,WAAW,IAAA,CAAK,UAAA;AAAA,MAChB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAYA,cAAAA,GAAgB,CAAA,GAAA,CAAA,CAAM,IAAA,CAAK,UAAA,GAAa,KAAK,MAAA,KAAW,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,GAAS,CAAA,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAA,GAAI;AAAA,KACpI,CAAA;AAAA,EACH;AAGA,EAAA,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,CAAA,GAAI,UAAA,CAAW,CAAA,CAAE,OAAO,CAAC,CAAA;AAEhF,EAAA,MAAM,gBAAgB,SAAA,GAAY,WAAA;AAClC,EAAA,MAAM,cAAA,GAAiB,aAAA,GAAgB,CAAA,GAAK,SAAA,GAAY,gBAAiB,GAAA,GAAM,CAAA;AAG/E,EAAA,MAAM,gBAAA,GAAmB,SAAA;AACzB,EAAA,MAAM,YAAY,gBAAA,GAAmB,EAAA;AACrC,EAAA,MAAM,oBAAA,GAAwB,mBAAmB,GAAA,GAAW,GAAA;AAE5D,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU;AAAA,QACR,SAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAA;AAAA,QACA,cAAA,EAAgB,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAA;AAAA,QACxC,SAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAc,YAAA,GAAe,CAAA,GAAI,KAAK,KAAA,CAAM,SAAA,GAAY,YAAY,CAAA,GAAI;AAAA,OAC1E;AAAA,MACA,WAAA,EAAa;AAAA,QACX,gBAAA;AAAA,QACA,WAAA,EAAa,SAAA;AAAA,QACb,gBAAA,EAAA,CAAmB,SAAA,GAAY,GAAA,GAAO,EAAA,EAAI,QAAQ,CAAC,CAAA;AAAA,QACnD,oBAAA,EAAsB,oBAAA,CAAqB,OAAA,CAAQ,CAAC;AAAA,OACtD;AAAA,MACA,UAAA,EAAY,mBAAA;AAAA,MACZ,YAAA,EAAc;AAAA,QACZ,GAAG,iBAAA;AAAA,QACH,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,mBAAA,EAAqB,OAAO,CAAA,KAAe;AACjD,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAI/B,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,SAAA,EAAW,IAAI,CAAA,MAAO;AAAA,MACvD,SAAA;AAAA,MACA,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,eAAe,IAAA,CAAK;AAAA,KACtB,CAAE;AAAA,GACJ;AAEA,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,CAAC,SAAS,CAAA;AAAA,MAClB,IAAA,EAAM;AAAA,KACR;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,GAAA,CAAI,qBAAA,EAAuB,OAAO,CAAA,KAAe;AACnD,EAAmB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,IAAK;AAC/C,EAAe,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,OAAO,KAAK,IAAI;AAGpD,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,SAAS,EAAC;AAAA,MACV,IAAA,EAAM;AAAA,KACR;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA,KAAe;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,EAAE,CAAA;AAExC,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,yBAAA;AAAA,MACT,GAAG,MAAA;AAAA,MACH,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,sBAAA;AAAA,MACP,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACjD,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAMD,GAAA,CAAI,IAAA,CAAK,kBAAA,EAAoB,OAAO,CAAA,KAAe;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA;AAEpB,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACvC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,SAAA,EAAW,OAAO,CAAA;AAEpD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,CAAA,OAAA,EAAU,KAAK,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAA;AAAA,MAC3D,SAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,0BAAA;AAAA,MACP,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACjD,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAED,IAAO,cAAA,GAAQ,GAAA;;;AC1gBR,IAAM,cAAN,MAAkB;AAAA,EACf,QAAA,GAAiC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKzC,SAAA,GAAY;AACV,IAAA,OAAO,cAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,OAAA,EAAuC;AACpD,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAEhB,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,IAAU,EAAC;AAEpC,IAAA,OAAA,CAAQ,IAAI,+BAAA,EAA4B;AAAA,MACtC,aAAA,EAAe,SAAS,aAAA,IAAiB,IAAA;AAAA,MACzC,SAAA,EAAW,SAAS,SAAA,IAAa,KAAA;AAAA,MACjC,UAAA,EAAY,SAAS,UAAA,IAAc;AAAA,KACpC,CAAA;AAGD,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAChE,MAAA,eAAA,CAAgB;AAAA,QACd,GAAG,MAAA;AAAA,QACH,aAAA,EAAe,QAAA,CAAS,aAAA,IAAiB,MAAA,CAAO,aAAA;AAAA,QAChD,SAAA,EAAW,QAAA,CAAS,SAAA,IAAa,MAAA,CAAO,SAAA;AAAA,QACxC,GAAA,EAAK,QAAA,CAAS,UAAA,IAAc,MAAA,CAAO;AAAA,OACpC,CAAA;AAAA,IACH;AAGA,IAAA,sBAAA,EAAuB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,OAAA,CAAQ,IAAI,uDAAkD,CAAA;AAC9D,IAAA,MAAM,cAAA,EAAe;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,QAAA,EAA8C;AAC5D,IAAA,OAAA,CAAQ,GAAA,CAAI,wCAA8B,QAAQ,CAAA;AAGlD,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAChE,MAAA,eAAA,CAAgB;AAAA,QACd,GAAG,MAAA;AAAA,QACH,aAAA,EAAe,QAAA,CAAS,aAAA,IAAiB,MAAA,CAAO,aAAA;AAAA,QAChD,SAAA,EAAW,QAAA,CAAS,SAAA,IAAa,MAAA,CAAO,SAAA;AAAA,QACxC,GAAA,EAAK,QAAA,CAAS,UAAA,IAAc,MAAA,CAAO;AAAA,OACpC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,CAAA,EAA+B;AAC5C,IAAA,MAAM,QAAQ,gBAAA,EAAiB;AAE/B,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,CAAA,EAA+B;AAC9C,IAAA,MAAM,cAAA,EAAe;AAErB,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,2BAAA;AAAA,MACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,CAAA,EAA+B;AACrD,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,UAAA,EAAW,GAAI,IAAA;AAE3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,IAAI,gBAAA,GAAmB,CAAA;AAEvB,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,aAAA,CAAc,UAAU,CAAA,IAAK;AAAA,QACzD,GAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAW,KAAA;AAAA,QACX,aAAA,EAAe,IAAA;AAAA,QACf,SAAA,EAAW,UAAA;AAAA,QACX,cAAc,EAAC;AAAA,QACf,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA,gBAAA,GAAmB,MAAM,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAAA,IACnD,CAAA,MAAO;AAEL,MAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,EAAG;AACjD,QAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,QAAA,gBAAA,IAAoB,MAAM,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAAA,MACpD;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,gBAAA;AAAA,MACb,OAAA;AAAA,MACA,WAAW,UAAA,IAAc,KAAA;AAAA,MACzB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH;AACF,CAAA;AAgBA,IAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,IAAO,aAAA,GAAQ,MAAA;;;AC/JR,IAAM,UAAA,GAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;;;ACoJnB,SAAS,gBAAA,CAAiB,MAAA,GAAwB,EAAC,EAAe;AACvE,EAAA,MAAMC,IAAAA,GAAM,IAAIrC,SAAAA,EAAmD;AAGnE,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,IAAWsC,gCAAA,EAAe;AACpD,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,IAAQ,YAAA;AAG/B,EAAAD,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAK,OAAO,GAAG,IAAA,KAAS;AAC9B,IAAA,CAAA,CAAE,GAAA,CAAI,cAAc,UAAU,CAAA;AAC9B,IAAA,MAAM,IAAA,EAAK;AAAA,EACb,CAAC,CAAA;AAGD,EAAAA,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAKE,mCAAA,EAAmB,CAAA;AAGhC,EAAAF,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAKG,qCAAA,CAAoB,MAAM,CAAC,CAAA;AAGxC,EAAA,IAAI,MAAA,CAAO,YAAY,UAAA,EAAY;AACjC,IAAA,KAAA,MAAW,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,UAAA,EAAY;AACrD,MAAAH,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAAA,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAK,OAAO,IAAI,IAAA,KAAS;AAE/B,IAAA,MAAM,IAAA,EAAK;AAAA,EACb,CAAC,CAAA;AAGD,EAAAA,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAKI,2CAAA,EAA2B,CAAA;AAGxC,EAAAJ,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAKK,gCAAA,EAAgB,CAAA;AAG7B,EAAA,IAAI,MAAA,CAAO,YAAY,SAAA,EAAW;AAChC,IAAA,KAAA,MAAW,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,SAAA,EAAW;AACpD,MAAAL,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,gBAAA,IAAoB,CAAC,OAAO,CAAA;AACtD,EAAAA,IAAAA,CAAI,GAAA,CAAI,UAAA,EAAYpC,6BAAA,EAAa,CAAA;AACjC,EAAAoC,IAAAA,CAAI,GAAA,CAAI,UAAA,EAAYM,6BAAA,CAAY,UAAU,CAAC,CAAA;AAG3C,EAAAN,IAAAA,CAAI,GAAA,CAAI,UAAA,EAAY,oBAAA,EAAsB,CAAA;AAK1C,EAAAA,IAAAA,CAAI,KAAA,CAAM,MAAA,EAAQnB,6BAAS,CAAA;AAC3B,EAAAmB,IAAAA,CAAI,KAAA,CAAM,YAAA,EAAcO,mCAAc,CAAA;AACtC,EAAAP,IAAAA,CAAI,KAAA,CAAM,aAAA,EAAeQ,oCAAe,CAAA;AACxC,EAAAR,IAAAA,CAAI,KAAA,CAAM,YAAA,EAAcS,mCAAc,CAAA;AACtC,EAAAT,IAAAA,CAAI,KAAA,CAAM,kBAAA,EAAoBtC,wBAAoB,CAAA;AAClD,EAAAsC,IAAAA,CAAI,KAAA,CAAM,oBAAA,EAAsBU,wCAAsB,CAAA;AACtD,EAAAV,IAAAA,CAAI,KAAA,CAAM,cAAA,EAAgBW,kCAAgB,CAAA;AAC1C,EAAAX,IAAAA,CAAI,KAAA,CAAM,iBAAA,EAAmBY,qCAAmB,CAAA;AAChD,EAAAZ,IAAAA,CAAI,KAAA,CAAM,QAAA,EAAUa,sCAAiB,CAAA;AACrC,EAAAb,IAAAA,CAAI,KAAA,CAAM,YAAA,EAAca,sCAAiB,CAAA;AACzC,EAAAb,IAAAA,CAAI,KAAA,CAAM,sBAAA,EAAwBtC,yBAAuB,CAAA;AACzD,EAAAsC,IAAAA,CAAI,KAAA,CAAM,uBAAA,EAAyB,8BAAA,EAAgC,CAAA;AACnE,EAAAA,IAAAA,CAAI,KAAA,CAAM,kBAAA,EAAoB,yBAAA,EAA2B,CAAA;AACzD,EAAAA,IAAAA,CAAI,KAAA,CAAM,gBAAA,EAAkBc,uCAAkB,CAAA;AAC9C,EAAAd,IAAAA,CAAI,KAAA,CAAM,cAAA,EAAgBe,kCAAgB,CAAA;AAE1C,EAAAf,IAAAA,CAAI,GAAA,CAAI,SAAA,EAAW,uBAAA,EAAyB,CAAA;AAG5C,EAAA,IAAI,mBAAA,CAAoB,MAAA,IAAU,mBAAA,CAAoB,MAAA,CAAO,SAAS,CAAA,EAAG;AACvE,IAAA,KAAA,MAAW,KAAA,IAAS,oBAAoB,MAAA,EAAQ;AAC9C,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAIA,EAAA,IAAI,cAAA,CAAe,MAAA,IAAU,cAAA,CAAe,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7D,IAAA,KAAA,MAAW,KAAA,IAAS,eAAe,MAAA,EAAQ;AACzC,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAO,CAAA;AAAA,IACrC;AAAA,EACF;AAIA,EAAAA,IAAAA,CAAI,KAAA,CAAM,cAAA,EAAgB,aAAA,CAAY,WAAW,CAAA;AAGjD,EAAA,IAAI,oBAAA,CAAqB,MAAA,IAAU,oBAAA,CAAqB,MAAA,CAAO,SAAS,CAAA,EAAG;AACzE,IAAA,KAAA,MAAW,KAAA,IAAS,qBAAqB,MAAA,EAAQ;AAC/C,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,IAAIgB,oCAAA,CAAmB,MAAA,IAAUA,oCAAA,CAAmB,MAAA,CAAO,SAAS,CAAA,EAAG;AACrE,IAAA,KAAA,MAAW,KAAA,IAASA,qCAAmB,MAAA,EAAQ;AAC7C,MAAAhB,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAIA,EAAA,IAAI,cAAA,CAAe,MAAA,IAAU,cAAA,CAAe,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7D,IAAA,KAAA,MAAW,KAAA,IAAS,eAAe,MAAA,EAAQ;AACzC,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,IAAI,eAAA,CAAgB,MAAA,IAAU,eAAA,CAAgB,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/D,IAAA,KAAA,MAAW,KAAA,IAAS,gBAAgB,MAAA,EAAQ;AAC1C,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAAA,IAAAA,CAAI,KAAA,CAAM,aAAA,EAAeZ,UAAe,CAAA;AAGxC,EAAA,IAAI,YAAA,CAAa,MAAA,IAAU,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA,EAAG;AACzD,IAAA,KAAA,MAAW,KAAA,IAAS,aAAa,MAAA,EAAQ;AACvC,MAAAY,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAAA,IAAAA,CAAI,KAAA,CAAM,gBAAA,EAAkBiB,mCAAiB,CAAA;AAC7C,EAAAjB,IAAAA,CAAI,KAAA,CAAM,aAAA,EAAekB,iCAAe,CAAA;AACxC,EAAAlB,IAAAA,CAAI,KAAA,CAAM,QAAA,EAAUmB,4BAAgB,CAAA;AACpC,EAAAnB,IAAAA,CAAI,KAAA,CAAM,OAAA,EAASoB,8BAAU,CAAA;AAG7B,EAAApB,IAAAA,CAAI,KAAA,CAAM,GAAA,EAAKqB,sCAAiB,CAAA;AAGhC,EAAA,IAAI,WAAA,CAAY,MAAA,IAAU,WAAA,CAAY,MAAA,CAAO,SAAS,CAAA,EAAG;AACvD,IAAA,KAAA,MAAW,KAAA,IAAS,YAAY,MAAA,EAAQ;AACtC,MAAArB,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,MAAM,kBAAkB,yBAAA,EAA0B;AAClD,EAAA,IAAI,eAAA,CAAgB,MAAA,IAAU,eAAA,CAAgB,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/D,IAAA,KAAA,MAAW,KAAA,IAAS,gBAAgB,MAAA,EAAQ;AAC1C,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAAA,IAAAA,CAAI,GAAA,CAAI,cAAA,EAAgB,CAAC,CAAA,KAAM;AAC7B,IAAA,OAAO,IAAI,SAAS,UAAA,EAAY;AAAA,MAC9B,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,eAAA;AAAA,QAChB,eAAA,EAAiB;AAAA;AACnB,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAAA,IAAAA,CAAI,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA,KAAM;AAC/B,IAAA,IAAI;AAEF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AAC7B,MAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAGrB,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAEnD,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO,EAAE,QAAA,EAAS;AAAA,MACpB;AAGA,MAAA,MAAM,SAAS,MAAM,CAAA,CAAE,GAAA,CAAI,YAAA,CAAa,IAAI,SAAS,CAAA;AAErD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,EAAE,QAAA,EAAS;AAAA,MACpB;AAGA,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,MAAA,MAAA,CAAO,cAAc,WAAA,IAAe,OAAA,CAAQ,IAAI,cAAA,EAAgB,MAAA,CAAO,aAAa,WAAW,CAAA;AAC/F,MAAA,MAAA,CAAO,cAAc,kBAAA,IAAsB,OAAA,CAAQ,IAAI,qBAAA,EAAuB,MAAA,CAAO,aAAa,kBAAkB,CAAA;AACpH,MAAA,OAAA,CAAQ,GAAA,CAAI,iBAAiB,0BAA0B,CAAA;AACvD,MAAA,OAAA,CAAQ,GAAA,CAAI,+BAA+B,GAAG,CAAA;AAC9C,MAAA,OAAA,CAAQ,GAAA,CAAI,gCAAgC,oBAAoB,CAAA;AAChE,MAAA,OAAA,CAAQ,GAAA,CAAI,gCAAgC,cAAc,CAAA;AAE1D,MAAA,OAAO,IAAI,QAAA,CAAS,MAAA,CAAO,IAAA,EAAa;AAAA,QACtC;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,EAAE,QAAA,EAAS;AAAA,IACpB;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAAA,IAAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,OAAO,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAAA,IAAAA,CAAI,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA,KAAM;AAClB,IAAA,OAAO,CAAA,CAAE,SAAS,aAAa,CAAA;AAAA,EACjC,CAAC,CAAA;AAGD,EAAAA,IAAAA,CAAI,GAAA,CAAI,SAAA,EAAW,CAAC,CAAA,KAAM;AACxB,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAAsB,gCAAA,CAAetB,IAAG,CAAA;AAGlB,EAAAA,IAAAA,CAAI,QAAA,CAAS,CAAC,CAAA,KAAM;AAClB,IAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,aAAa,MAAA,EAAQ,GAAA,IAAO,GAAG,CAAA;AAAA,EACxD,CAAC,CAAA;AAGD,EAAAA,IAAAA,CAAI,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACtB,IAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AACjB,IAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAyB,MAAA,EAAQ,GAAA,IAAO,GAAG,CAAA;AAAA,EACpE,CAAC,CAAA;AAED,EAAA,OAAOA,IAAAA;AACT;AAQO,SAAS,oBAAoB,IAAA,EAAwB;AAC1D,EAAA,OAAA,CAAQ,KAAK,oEAAoE,CAAA;AAEnF;AAQO,SAAS,gBAAgB,IAAA,EAAwB;AACtD,EAAA,OAAA,CAAQ,KAAK,gEAAgE,CAAA;AAE/E;AC/ZO,SAAS,SAASuB,IAAA,EAAgB;AACvC,EAAA,OAAOC,UAAA,CAAQD,IAAA,EAAI,EAAE,MAAA,EAAAE,gCAAA,EAAQ,CAAA;AAC/B;;;AC8TO,IAAM,UAAUC,iCAAA,CAAY","file":"index.cjs","sourcesContent":["import { D1Database } from '@cloudflare/workers-types'\n\nexport interface TruncateResult {\n success: boolean\n message: string\n tablesCleared: string[]\n adminUserPreserved: boolean\n errors?: string[]\n}\n\nexport interface DatabaseStats {\n tables: Array<{\n name: string\n rowCount: number\n }>\n totalRows: number\n}\n\nexport interface TableData {\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n}\n\nexport class DatabaseToolsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get database statistics\n */\n async getDatabaseStats(): Promise {\n const tables = await this.getTables()\n const stats: DatabaseStats = {\n tables: [],\n totalRows: 0\n }\n\n for (const tableName of tables) {\n try {\n const result = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const rowCount = (result?.count as number) || 0\n \n stats.tables.push({\n name: tableName,\n rowCount\n })\n stats.totalRows += rowCount\n } catch (error) {\n // Skip tables that can't be counted (might be views or system tables)\n console.warn(`Could not count rows in table ${tableName}:`, error)\n }\n }\n\n return stats\n }\n\n /**\n * Get all tables in the database\n */\n private async getTables(): Promise {\n const result = await this.db.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='table' \n AND name NOT LIKE 'sqlite_%'\n ORDER BY name\n `).all()\n\n return result.results?.map((row: any) => row.name) || []\n }\n\n /**\n * Truncate all data except admin user\n */\n async truncateAllData(adminEmail: string): Promise {\n const errors: string[] = []\n const tablesCleared: string[] = []\n let adminUserPreserved = false\n\n try {\n // First, preserve the admin user data\n const adminUser = await this.db.prepare(\n 'SELECT * FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n if (!adminUser) {\n return {\n success: false,\n message: 'Admin user not found. Operation cancelled for safety.',\n tablesCleared: [],\n adminUserPreserved: false,\n errors: ['Admin user not found']\n }\n }\n\n // Define tables to truncate (excluding system tables)\n const tablesToTruncate = [\n 'content',\n 'content_versions', \n 'content_workflow_status',\n 'collections',\n 'media',\n 'sessions',\n 'notifications',\n 'api_tokens',\n 'workflow_history',\n 'scheduled_content',\n 'faqs',\n 'faq_categories',\n 'plugins',\n 'plugin_settings',\n 'email_templates',\n 'email_themes'\n ]\n\n // Check which tables exist\n const existingTables = await this.getTables()\n const tablesToClear = tablesToTruncate.filter(table => \n existingTables.includes(table)\n )\n\n // Clear all data except users table\n for (const tableName of tablesToClear) {\n try {\n await this.db.prepare(`DELETE FROM ${tableName}`).run()\n tablesCleared.push(tableName)\n } catch (error) {\n errors.push(`Failed to clear table ${tableName}: ${error}`)\n console.error(`Error clearing table ${tableName}:`, error)\n }\n }\n\n // Clear users table but preserve admin\n try {\n await this.db.prepare('DELETE FROM users WHERE email != ? OR role != ?')\n .bind(adminEmail, 'admin').run()\n \n // Verify admin user still exists\n const verifyAdmin = await this.db.prepare(\n 'SELECT id FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n adminUserPreserved = !!verifyAdmin\n tablesCleared.push('users (non-admin)')\n } catch (error) {\n errors.push(`Failed to clear non-admin users: ${error}`)\n console.error('Error clearing non-admin users:', error)\n }\n\n // Reset auto-increment counters if supported\n try {\n await this.db.prepare('DELETE FROM sqlite_sequence').run()\n } catch (error) {\n // sqlite_sequence might not exist, ignore\n }\n\n const message = errors.length > 0 \n ? `Truncation completed with ${errors.length} errors. ${tablesCleared.length} tables cleared.`\n : `Successfully truncated database. ${tablesCleared.length} tables cleared.`\n\n return {\n success: errors.length === 0,\n message,\n tablesCleared,\n adminUserPreserved,\n errors: errors.length > 0 ? errors : undefined\n }\n\n } catch (error) {\n return {\n success: false,\n message: `Database truncation failed: ${error}`,\n tablesCleared,\n adminUserPreserved,\n errors: [String(error)]\n }\n }\n }\n\n /**\n * Create a backup of current data (simplified version)\n */\n async createBackup(): Promise<{ success: boolean; message: string; backupId?: string }> {\n try {\n const backupId = `backup_${Date.now()}`\n const stats = await this.getDatabaseStats()\n \n // In a real implementation, this would export data to a file or cloud storage\n // For now, we'll just log the stats and return success\n console.log(`Backup ${backupId} created with ${stats.totalRows} total rows`)\n \n return {\n success: true,\n message: `Backup created successfully (${stats.totalRows} rows)`,\n backupId\n }\n } catch (error) {\n return {\n success: false,\n message: `Backup failed: ${error}`\n }\n }\n }\n\n /**\n * Get table data with optional pagination and sorting\n */\n async getTableData(\n tableName: string,\n limit: number = 100,\n offset: number = 0,\n sortColumn?: string,\n sortDirection: 'asc' | 'desc' = 'asc'\n ): Promise {\n try {\n // Validate table name to prevent SQL injection\n const tables = await this.getTables()\n if (!tables.includes(tableName)) {\n throw new Error(`Table ${tableName} not found`)\n }\n\n // Get column names\n const pragmaResult = await this.db.prepare(`PRAGMA table_info(${tableName})`).all()\n const columns = pragmaResult.results?.map((col: any) => col.name) || []\n\n // Validate sort column if provided\n if (sortColumn && !columns.includes(sortColumn)) {\n sortColumn = undefined\n }\n\n // Get total row count\n const countResult = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const totalRows = (countResult?.count as number) || 0\n\n // Build query with optional sorting\n let query = `SELECT * FROM ${tableName}`\n if (sortColumn) {\n query += ` ORDER BY ${sortColumn} ${sortDirection.toUpperCase()}`\n }\n query += ` LIMIT ${limit} OFFSET ${offset}`\n\n // Get paginated data\n const dataResult = await this.db.prepare(query).all()\n\n return {\n tableName,\n columns,\n rows: dataResult.results || [],\n totalRows\n }\n } catch (error) {\n throw new Error(`Failed to fetch table data: ${error}`)\n }\n }\n\n /**\n * Validate database integrity\n */\n async validateDatabase(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n try {\n // Check critical tables exist\n const requiredTables = ['users', 'content', 'collections']\n const existingTables = await this.getTables()\n\n for (const table of requiredTables) {\n if (!existingTables.includes(table)) {\n issues.push(`Critical table missing: ${table}`)\n }\n }\n\n // Check admin user exists\n const adminCount = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM users WHERE role = ?'\n ).bind('admin').first()\n\n if ((adminCount?.count as number) === 0) {\n issues.push('No admin users found')\n }\n\n // Run SQLite integrity check\n try {\n const integrityResult = await this.db.prepare('PRAGMA integrity_check').first()\n if (integrityResult && (integrityResult as any).integrity_check !== 'ok') {\n issues.push(`Database integrity check failed: ${(integrityResult as any).integrity_check}`)\n }\n } catch (error) {\n issues.push(`Could not run integrity check: ${error}`)\n }\n\n } catch (error) {\n issues.push(`Validation error: ${error}`)\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface DatabaseTablePageData {\n user?: {\n name: string\n email: string\n role: string\n }\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n currentPage: number\n pageSize: number\n sortColumn?: string\n sortDirection?: 'asc' | 'desc'\n}\n\nexport function renderDatabaseTablePage(data: DatabaseTablePageData): string {\n const totalPages = Math.ceil(data.totalRows / data.pageSize)\n const startRow = (data.currentPage - 1) * data.pageSize + 1\n const endRow = Math.min(data.currentPage * data.pageSize, data.totalRows)\n\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n Back to Database Tools\n \n
\n

Table: ${data.tableName}

\n

\n Showing ${startRow.toLocaleString()} - ${endRow.toLocaleString()} of ${data.totalRows.toLocaleString()} rows\n

\n
\n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Refresh\n \n
\n
\n\n \n
\n \n
\n \n \n \n ${data.columns.map(col => `\n \n
\n ${col}\n ${data.sortColumn === col ? `\n \n \n \n ` : `\n \n \n \n `}\n
\n \n `).join('')}\n
\n \n \n ${data.rows.length > 0\n ? data.rows.map((row, idx) => `\n \n ${data.columns.map(col => `\n \n `).join('')}\n \n `).join('')\n : `\n \n \n \n `\n }\n \n
\n ${formatCellValue(row[col])}\n
\n \n \n \n

No data in this table

\n
\n
\n\n \n ${totalPages > 1 ? `\n
\n
\n \n Previous\n \n \n Next\n \n
\n
\n
\n

\n Page ${data.currentPage} of ${totalPages}\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Table: ${data.tableName}`,\n pageTitle: `Database: ${data.tableName}`,\n currentPath: `/admin/database-tools/tables/${data.tableName}`,\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction generatePageNumbers(currentPage: number, totalPages: number): string {\n const pages: number[] = []\n const maxVisible = 7\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (currentPage <= 4) {\n for (let i = 1; i <= 5; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n } else if (currentPage >= totalPages - 3) {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = totalPages - 4; i <= totalPages; i++) pages.push(i)\n } else {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n }\n }\n\n return pages.map(page => {\n if (page === -1) {\n return `\n \n ...\n \n `\n }\n\n const isActive = page === currentPage\n return `\n \n ${page}\n \n `\n }).join('')\n}\n\nfunction escapeHtml(text: string): string {\n const map: Record = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }\n return String(text).replace(/[&<>\"']/g, m => map[m] || m)\n}\n\nfunction formatCellValue(value: any): string {\n if (value === null || value === undefined) {\n return 'null'\n }\n if (typeof value === 'boolean') {\n return `${value}`\n }\n if (typeof value === 'object') {\n return '' + JSON.stringify(value).substring(0, 50) + (JSON.stringify(value).length > 50 ? '...' : '') + ''\n }\n const str = String(value)\n if (str.length > 100) {\n return escapeHtml(str.substring(0, 100)) + '...'\n }\n return escapeHtml(str)\n}\n","import { Hono } from 'hono'\nimport { DatabaseToolsService } from './services/database-service'\nimport { renderDatabaseTablePage, DatabaseTablePageData } from '../../../templates/pages/admin-database-table.template'\nimport { requireAuth } from '../../../middleware'\n\ntype Bindings = {\n DB: D1Database\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport function createDatabaseToolsAdminRoutes() {\n const router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Apply authentication middleware\n router.use('*', requireAuth())\n\n // Get database statistics\n router.get('/api/stats', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const stats = await service.getDatabaseStats()\n\n return c.json({\n success: true,\n data: stats\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({ \n success: false, \n error: 'Failed to fetch database statistics' \n }, 500)\n }\n })\n\n // Truncate all data except admin user\n router.post('/api/truncate', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const body = await c.req.json()\n const { confirmText } = body\n\n // Require confirmation text for safety\n if (confirmText !== 'TRUNCATE ALL DATA') {\n return c.json({\n success: false,\n error: 'Invalid confirmation text. Operation cancelled.'\n }, 400)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.truncateAllData(user.email)\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n tablesCleared: result.tablesCleared,\n adminUserPreserved: result.adminUserPreserved,\n errors: result.errors\n }\n })\n } catch (error) {\n console.error('Error truncating database:', error)\n return c.json({ \n success: false, \n error: 'Failed to truncate database' \n }, 500)\n }\n })\n\n // Create backup\n router.post('/api/backup', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.createBackup()\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n backupId: result.backupId\n }\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({ \n success: false, \n error: 'Failed to create backup' \n }, 500)\n }\n })\n\n // Validate database\n router.get('/api/validate', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const validation = await service.validateDatabase()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n })\n\n // Get table data (API endpoint)\n router.get('/api/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const tableName = c.req.param('tableName')\n const limit = parseInt(c.req.query('limit') || '100')\n const offset = parseInt(c.req.query('offset') || '0')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, limit, offset, sortColumn, sortDirection)\n\n return c.json({\n success: true,\n data: tableData\n })\n } catch (error) {\n console.error('Error fetching table data:', error)\n return c.json({\n success: false,\n error: `Failed to fetch table data: ${error}`\n }, 500)\n }\n })\n\n // View table data page\n router.get('/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.redirect('/admin/login')\n }\n\n const tableName = c.req.param('tableName')\n const page = parseInt(c.req.query('page') || '1')\n const pageSize = parseInt(c.req.query('pageSize') || '20')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const offset = (page - 1) * pageSize\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, pageSize, offset, sortColumn, sortDirection)\n\n const pageData: DatabaseTablePageData = {\n user: {\n name: user.email.split('@')[0] || 'Unknown',\n email: user.email,\n role: user.role\n },\n tableName: tableData.tableName,\n columns: tableData.columns,\n rows: tableData.rows,\n totalRows: tableData.totalRows,\n currentPage: page,\n pageSize: pageSize,\n sortColumn: sortColumn,\n sortDirection: sortDirection\n }\n\n return c.html(renderDatabaseTablePage(pageData))\n } catch (error) {\n console.error('Error rendering table page:', error)\n return c.text(`Error: ${error}`, 500)\n }\n })\n\n return router\n}","import type { D1Database } from '@cloudflare/workers-types'\n\nexport class SeedDataService {\n constructor(private db: D1Database) {}\n\n // First names for generating realistic users\n private firstNames = [\n 'Emma', 'Liam', 'Olivia', 'Noah', 'Ava', 'Ethan', 'Sophia', 'Mason',\n 'Isabella', 'William', 'Mia', 'James', 'Charlotte', 'Benjamin', 'Amelia',\n 'Lucas', 'Harper', 'Henry', 'Evelyn', 'Alexander'\n ]\n\n // Last names for generating realistic users\n private lastNames = [\n 'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis',\n 'Rodriguez', 'Martinez', 'Hernandez', 'Lopez', 'Gonzalez', 'Wilson', 'Anderson',\n 'Thomas', 'Taylor', 'Moore', 'Jackson', 'Martin'\n ]\n\n // Content titles for blog posts\n private blogTitles = [\n 'Getting Started with Modern Web Development',\n 'The Future of JavaScript Frameworks',\n 'Building Scalable Applications with Microservices',\n 'Understanding TypeScript: A Complete Guide',\n 'Best Practices for API Design',\n 'Introduction to Cloud Computing',\n 'Mastering Git and Version Control',\n 'The Art of Code Review',\n 'Performance Optimization Techniques',\n 'Security Best Practices for Web Apps',\n 'Exploring Serverless Architecture',\n 'Database Design Fundamentals',\n 'Testing Strategies for Modern Apps',\n 'CI/CD Pipeline Implementation',\n 'Mobile-First Development Approach'\n ]\n\n // Content titles for pages\n private pageTitles = [\n 'About Us', 'Contact', 'Privacy Policy', 'Terms of Service',\n 'FAQ', 'Our Team', 'Careers', 'Press Kit',\n 'Support', 'Documentation', 'Pricing', 'Features'\n ]\n\n // Content titles for products\n private productTitles = [\n 'Premium Wireless Headphones',\n 'Smart Watch Pro',\n 'Laptop Stand Adjustable',\n 'Mechanical Keyboard RGB',\n 'HD Webcam 4K',\n 'USB-C Hub 7-in-1',\n 'Portable SSD 1TB',\n 'Wireless Mouse Ergonomic',\n 'Monitor 27\" 4K',\n 'Desk Lamp LED',\n 'Phone Case Premium',\n 'Tablet Stand Aluminum',\n 'Cable Management Kit',\n 'Power Bank 20000mAh',\n 'Bluetooth Speaker Portable'\n ]\n\n // Content for generating blog posts\n private blogContent = [\n 'This comprehensive guide covers everything you need to know about modern development practices and tools.',\n 'Learn the fundamentals and advanced concepts that will help you build better applications.',\n 'Discover the latest trends and best practices used by industry professionals.',\n 'A deep dive into the technologies and methodologies shaping the future of software development.',\n 'Practical tips and real-world examples to improve your development workflow.',\n 'Explore cutting-edge techniques and proven strategies for building robust applications.',\n 'Master the essential skills needed to excel in modern software development.',\n 'An in-depth look at the tools and frameworks that power today\\'s web applications.',\n 'Step-by-step instructions and expert insights for developers of all levels.',\n 'Understanding the core principles that drive successful software projects.'\n ]\n\n // Generate a random ID\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n\n // Generate a slug from a title\n private generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n }\n\n // Generate random date within the last year\n private randomDate(): Date {\n const now = new Date()\n const yearAgo = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate())\n const randomTime = yearAgo.getTime() + Math.random() * (now.getTime() - yearAgo.getTime())\n return new Date(randomTime)\n }\n\n // Create 20 example users\n async createUsers(): Promise {\n const roles = ['admin', 'editor', 'author', 'viewer']\n // const hashedPassword = await bcrypt.hash('password123', 10)\n const hashedPassword = 'password123' // TODO: Use actual bcrypt hash\n\n let count = 0\n for (let i = 0; i < 20; i++) {\n const firstName = this.firstNames[Math.floor(Math.random() * this.firstNames.length)] || 'John'\n const lastName = this.lastNames[Math.floor(Math.random() * this.lastNames.length)] || 'Doe'\n const username = `${firstName.toLowerCase()}${lastName.toLowerCase()}${i}`\n const email = `${username}@example.com`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n\n const stmt = this.db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, last_login_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n email,\n username,\n firstName,\n lastName,\n hashedPassword,\n roles[Math.floor(Math.random() * roles.length)],\n Math.random() > 0.1 ? 1 : 0, // 90% active\n Math.random() > 0.3 ? createdAtTimestamp : null,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Create 200 content items across different types\n async createContent(): Promise {\n // Get all users and collections\n const usersStmt = this.db.prepare('SELECT * FROM users')\n const { results: allUsers } = await usersStmt.all()\n\n const collectionsStmt = this.db.prepare('SELECT * FROM collections')\n const { results: allCollections } = await collectionsStmt.all()\n\n if (!allUsers || allUsers.length === 0) {\n throw new Error('No users found. Please create users first.')\n }\n\n if (!allCollections || allCollections.length === 0) {\n throw new Error('No collections found. Please create collections first.')\n }\n\n const statuses = ['draft', 'published', 'archived']\n\n // Create 200 content items\n let count = 0\n for (let i = 0; i < 200; i++) {\n const collection: any = allCollections[Math.floor(Math.random() * allCollections.length)]\n const author: any = allUsers[Math.floor(Math.random() * allUsers.length)]\n const status = statuses[Math.floor(Math.random() * statuses.length)]\n\n let title: string\n let contentData: any\n\n // Generate content based on collection type\n if (collection.name === 'blog_posts' || collection.name.includes('blog')) {\n title = this.blogTitles[Math.floor(Math.random() * this.blogTitles.length)] || 'Untitled Blog Post'\n contentData = {\n body: this.blogContent[Math.floor(Math.random() * this.blogContent.length)] || 'Blog content here',\n excerpt: 'A brief introduction to this article that provides an overview of the main topics covered.',\n tags: this.generateTags(),\n featured: Math.random() > 0.7\n }\n } else if (collection.name === 'pages' || collection.name.includes('page')) {\n title = this.pageTitles[Math.floor(Math.random() * this.pageTitles.length)] || 'Untitled Page'\n contentData = {\n body: 'This is a standard page with important information about our services and policies.',\n template: 'default',\n showInMenu: Math.random() > 0.5\n }\n } else if (collection.name === 'products' || collection.name.includes('product')) {\n title = this.productTitles[Math.floor(Math.random() * this.productTitles.length)] || 'Untitled Product'\n contentData = {\n description: 'High-quality product with excellent features and great value for money.',\n price: (Math.random() * 500 + 10).toFixed(2),\n sku: `SKU-${Math.random().toString(36).substr(2, 9).toUpperCase()}`,\n inStock: Math.random() > 0.2,\n rating: (Math.random() * 2 + 3).toFixed(1) // 3.0 - 5.0\n }\n } else {\n // Generic content\n title = `${collection.display_name || collection.name} Item ${i + 1}`\n contentData = {\n description: 'This is a sample content item with generic data.',\n value: Math.floor(Math.random() * 1000)\n }\n }\n\n const slug = `${this.generateSlug(title)}-${i}`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n const publishedAtTimestamp = status === 'published' ? createdAtTimestamp : null\n\n const stmt = this.db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, published_at, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n collection.id,\n slug,\n `${title} ${i}`,\n JSON.stringify(contentData),\n status,\n publishedAtTimestamp,\n author.id,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Generate random tags for blog posts\n private generateTags(): string[] {\n const allTags = [\n 'tutorial', 'guide', 'javascript', 'typescript', 'web-dev',\n 'backend', 'frontend', 'best-practices', 'security', 'performance',\n 'testing', 'deployment', 'cloud', 'database', 'api'\n ]\n\n const numTags = Math.floor(Math.random() * 4) + 1 // 1-4 tags\n const shuffled = allTags.sort(() => 0.5 - Math.random())\n return shuffled.slice(0, numTags)\n }\n\n // Seed all data\n async seedAll(): Promise<{ users: number; content: number }> {\n const userCount = await this.createUsers()\n const contentCount = await this.createContent()\n\n return {\n users: userCount,\n content: contentCount\n }\n }\n\n // Clear all seed data (optional cleanup method)\n async clearSeedData(): Promise {\n // Delete content first (due to foreign key constraints)\n const deleteContentStmt = this.db.prepare('DELETE FROM content')\n await deleteContentStmt.run()\n\n // Delete users (but keep admin users)\n const deleteUsersStmt = this.db.prepare(\n \"DELETE FROM users WHERE role != 'admin'\"\n )\n await deleteUsersStmt.run()\n }\n}\n","import { Hono } from 'hono'\nimport { SeedDataService } from './services/seed-data-service'\n\ntype Bindings = {\n DB: D1Database\n}\n\nexport function createSeedDataAdminRoutes() {\n const routes = new Hono<{ Bindings: Bindings }>()\n\n // Get seed data status/info\n routes.get('/', async (c) => {\n const html = `\n \n \n \n Seed Data - SonicJS Admin\n \n \n \n \n \n
\n ← Back to Plugin Settings\n

🌱 Seed Data Generator

\n

\n Generate realistic example data for testing and development. This will create 20 users and 200 content items with realistic data.\n

\n\n
\n ⚠️ Warning: This will create new data in your database. Make sure you're not running this in production!\n
\n\n
\n
\n\n
\n

What will be created?

\n
    \n
  • 20 Users: With realistic names, emails, and various roles (admin, editor, author, viewer)
  • \n
  • 200 Content Items: Including blog posts, pages, and products with realistic titles and data
  • \n
  • All passwords: Set to \"password123\" for testing
  • \n
  • Random dates: Created within the last year
  • \n
  • Various statuses: Draft, published, and archived content
  • \n
\n
\n\n
\n

Generate Seed Data

\n

Click the button below to generate example data. This may take a few moments.

\n \n
\n\n
\n

Clear Seed Data

\n

Remove all users and content from the database (except admin users).

\n \n
\n
\n\n \n \n \n `\n return c.html(html)\n })\n\n // Generate seed data\n routes.post('/generate', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n const result = await seedService.seedAll()\n\n return c.json({\n success: true,\n users: result.users,\n content: result.content\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n // Clear seed data\n routes.post('/clear', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n await seedService.clearSeedData()\n\n return c.json({\n success: true\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n return routes\n}\n","/**\n * Email Plugin\n *\n * Send transactional emails using Resend\n * Handles registration, verification, password reset, and one-time codes\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\nexport function createEmailPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'email',\n version: '1.0.0-beta.1',\n description: 'Send transactional emails using Resend'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Create the Email Settings route (POST only - GET is handled by generic plugin settings page)\n const emailRoutes = new Hono()\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // POST endpoint for saving settings\n emailRoutes.post('/settings', async (c: any) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n // Update plugin settings in database\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'email'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving email settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n })\n\n // POST endpoint for test email\n emailRoutes.post('/test', async (c: any) => {\n try {\n const db = c.env.DB\n const body = await c.req.json()\n\n // Load settings from database\n const plugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (!plugin?.settings) {\n return c.json({\n success: false,\n error: 'Email settings not configured. Please save your settings first.'\n }, 400)\n }\n\n const settings = JSON.parse(plugin.settings)\n\n // Validate required settings\n if (!settings.apiKey || !settings.fromEmail || !settings.fromName) {\n return c.json({\n success: false,\n error: 'Missing required settings. Please configure API Key, From Email, and From Name.'\n }, 400)\n }\n\n // Use provided email or fallback to fromEmail\n const toEmail = body.toEmail || settings.fromEmail\n\n // Validate email format\n if (!toEmail.match(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)) {\n return c.json({\n success: false,\n error: 'Invalid email address format'\n }, 400)\n }\n\n // Send test email via Resend API\n const response = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${settings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${settings.fromName} <${settings.fromEmail}>`,\n to: [toEmail],\n subject: 'Test Email from SonicJS',\n html: `\n
\n

Test Email Successful! 🎉

\n

This is a test email from your SonicJS Email plugin.

\n

Configuration:

\n
    \n
  • From: ${settings.fromName} <${settings.fromEmail}>
  • \n
  • Reply-To: ${settings.replyTo || 'Not set'}
  • \n
  • Sent at: ${new Date().toISOString()}
  • \n
\n

Your email settings are working correctly!

\n
\n `,\n reply_to: settings.replyTo || settings.fromEmail\n })\n })\n\n const data = await response.json() as any\n\n if (!response.ok) {\n console.error('Resend API error:', data)\n return c.json({\n success: false,\n error: data.message || 'Failed to send test email. Check your API key and domain verification.'\n }, response.status)\n }\n\n return c.json({\n success: true,\n message: `Test email sent successfully to ${toEmail}`,\n emailId: data.id\n })\n\n } catch (error: any) {\n console.error('Test email error:', error)\n return c.json({\n success: false,\n error: error.message || 'An error occurred while sending test email'\n }, 500)\n }\n })\n\n // Register the route\n builder.addRoute('/admin/plugins/email', emailRoutes, {\n description: 'Email plugin settings',\n requiresAuth: true,\n priority: 80\n })\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('Email', '/admin/plugins/email', {\n icon: 'envelope',\n order: 80,\n permissions: ['email:manage']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Email plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Email plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const emailPlugin = createEmailPlugin()\n","/**\n * OTP Service\n * Handles OTP code generation, verification, and management\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\nexport interface OTPSettings {\n codeLength: number\n codeExpiryMinutes: number\n maxAttempts: number\n rateLimitPerHour: number\n allowNewUserRegistration: boolean\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nexport interface OTPCode {\n id: string\n user_email: string\n code: string\n expires_at: number\n used: number\n used_at: number | null\n ip_address: string | null\n user_agent: string | null\n attempts: number\n created_at: number\n}\n\nexport class OTPService {\n constructor(private db: D1Database) {}\n\n /**\n * Generate a secure random OTP code\n */\n generateCode(length: number = 6): string {\n const digits = '0123456789'\n let code = ''\n\n for (let i = 0; i < length; i++) {\n const randomValues = new Uint8Array(1)\n crypto.getRandomValues(randomValues)\n const randomValue = randomValues[0] ?? 0\n code += digits[randomValue % digits.length]\n }\n\n return code\n }\n\n /**\n * Create and store a new OTP code\n */\n async createOTPCode(\n email: string,\n settings: OTPSettings,\n ipAddress?: string,\n userAgent?: string\n ): Promise {\n const code = this.generateCode(settings.codeLength)\n const id = crypto.randomUUID()\n const now = Date.now()\n const expiresAt = now + (settings.codeExpiryMinutes * 60 * 1000)\n\n const otpCode: OTPCode = {\n id,\n user_email: email.toLowerCase(),\n code,\n expires_at: expiresAt,\n used: 0,\n used_at: null,\n ip_address: ipAddress || null,\n user_agent: userAgent || null,\n attempts: 0,\n created_at: now\n }\n\n await this.db.prepare(`\n INSERT INTO otp_codes (\n id, user_email, code, expires_at, used, used_at,\n ip_address, user_agent, attempts, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n otpCode.id,\n otpCode.user_email,\n otpCode.code,\n otpCode.expires_at,\n otpCode.used,\n otpCode.used_at,\n otpCode.ip_address,\n otpCode.user_agent,\n otpCode.attempts,\n otpCode.created_at\n ).run()\n\n return otpCode\n }\n\n /**\n * Verify an OTP code\n */\n async verifyCode(\n email: string,\n code: string,\n settings: OTPSettings\n ): Promise<{ valid: boolean; attemptsRemaining?: number; error?: string }> {\n const normalizedEmail = email.toLowerCase()\n const now = Date.now()\n\n // Find the most recent unused code for this email\n const otpCode = await this.db.prepare(`\n SELECT * FROM otp_codes\n WHERE user_email = ? AND code = ? AND used = 0\n ORDER BY created_at DESC\n LIMIT 1\n `).bind(normalizedEmail, code).first() as OTPCode | null\n\n if (!otpCode) {\n return { valid: false, error: 'Invalid or expired code' }\n }\n\n // Check if expired\n if (now > otpCode.expires_at) {\n return { valid: false, error: 'Code has expired' }\n }\n\n // Check attempts\n if (otpCode.attempts >= settings.maxAttempts) {\n return { valid: false, error: 'Maximum attempts exceeded' }\n }\n\n // Code is valid - mark as used\n await this.db.prepare(`\n UPDATE otp_codes\n SET used = 1, used_at = ?, attempts = attempts + 1\n WHERE id = ?\n `).bind(now, otpCode.id).run()\n\n return { valid: true }\n }\n\n /**\n * Increment failed attempt count\n */\n async incrementAttempts(email: string, code: string): Promise {\n const normalizedEmail = email.toLowerCase()\n\n const result = await this.db.prepare(`\n UPDATE otp_codes\n SET attempts = attempts + 1\n WHERE user_email = ? AND code = ? AND used = 0\n RETURNING attempts\n `).bind(normalizedEmail, code).first() as { attempts: number } | null\n\n return result?.attempts || 0\n }\n\n /**\n * Check rate limiting\n */\n async checkRateLimit(email: string, settings: OTPSettings): Promise {\n const normalizedEmail = email.toLowerCase()\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n\n const result = await this.db.prepare(`\n SELECT COUNT(*) as count\n FROM otp_codes\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as { count: number } | null\n\n const count = result?.count || 0\n return count < settings.rateLimitPerHour\n }\n\n /**\n * Get recent OTP requests for activity log\n */\n async getRecentRequests(limit: number = 50): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM otp_codes\n ORDER BY created_at DESC\n LIMIT ?\n `).bind(limit).all()\n\n const rows = (result.results || []) as Record[]\n return rows.map(row => this.mapRowToOTP(row))\n }\n\n /**\n * Clean up expired codes (for maintenance)\n */\n async cleanupExpiredCodes(): Promise {\n const now = Date.now()\n\n const result = await this.db.prepare(`\n DELETE FROM otp_codes\n WHERE expires_at < ? OR (used = 1 AND used_at < ?)\n `).bind(now, now - (30 * 24 * 60 * 60 * 1000)).run() // Keep used codes for 30 days\n\n return result.meta.changes || 0\n }\n\n private mapRowToOTP(row: Record): OTPCode {\n return {\n id: String(row.id),\n user_email: String(row.user_email),\n code: String(row.code),\n expires_at: Number(row.expires_at ?? Date.now()),\n used: Number(row.used ?? 0),\n used_at: row.used_at === null || row.used_at === undefined ? null : Number(row.used_at),\n ip_address: typeof row.ip_address === 'string' ? row.ip_address : null,\n user_agent: typeof row.user_agent === 'string' ? row.user_agent : null,\n attempts: Number(row.attempts ?? 0),\n created_at: Number(row.created_at ?? Date.now())\n }\n }\n\n /**\n * Get OTP statistics\n */\n async getStats(days: number = 7): Promise<{\n total: number\n successful: number\n failed: number\n expired: number\n }> {\n const since = Date.now() - (days * 24 * 60 * 60 * 1000)\n\n const stats = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as successful,\n SUM(CASE WHEN attempts >= 3 AND used = 0 THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN expires_at < ? AND used = 0 THEN 1 ELSE 0 END) as expired\n FROM otp_codes\n WHERE created_at > ?\n `).bind(Date.now(), since).first() as any\n\n return {\n total: stats?.total || 0,\n successful: stats?.successful || 0,\n failed: stats?.failed || 0,\n expired: stats?.expired || 0\n }\n }\n}\n","/**\n * OTP Email Templates\n * HTML and plain text templates for OTP codes\n */\n\nexport interface OTPEmailData {\n code: string\n expiryMinutes: number\n codeLength: number\n maxAttempts: number\n email: string\n ipAddress?: string\n timestamp: string\n appName: string\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nfunction sanitizeColor(value?: string): string {\n if (!value) return ''\n // Allow #rgb, #rrggbb, #rrggbbaa, named colors, rgb()/rgba()/hsl()/hsla()\n if (/^#[0-9a-fA-F]{3,8}$/.test(value)) return value\n if (/^[a-zA-Z]+$/.test(value)) return value\n if (/^(rgb|rgba|hsl|hsla)\\([0-9.,\\s%]+\\)$/.test(value)) return value\n return ''\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport function renderOTPEmailHTML(data: OTPEmailData): string {\n const logoUrl = data.logoUrl ? escapeHtml(data.logoUrl) : ''\n const loginUrl = data.loginUrl ? escapeHtml(data.loginUrl) : ''\n const appName = escapeHtml(data.appName)\n const loginButtonText = escapeHtml(\n (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n )\n const logoWidth = Math.max(20, Math.min(600, Number(data.logoWidth) || 150))\n const logoBorderWidth = Math.max(0, Math.min(20, Number(data.logoBorderWidth) || 0))\n const logoBorderColor = sanitizeColor(data.logoBorderColor)\n const logoBorderStyle = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${logoBorderColor}; border-radius: 8px;`\n : ''\n\n return `\n\n\n \n \n Your Login Code\n\n\n\n
\n\n ${logoUrl ? `\n
\n \"${appName}\"\n
\n ` : ''}\n\n
\n

Your Login Code

\n

Enter this code to sign in to ${appName}

\n
\n\n
\n
\n
\n ${data.code}\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${data.expiryMinutes} minutes\n

\n
\n\n
\n

Quick Tips:

\n
    \n
  • Enter the code exactly as shown (${data.codeLength} digits)
  • \n
  • The code can only be used once
  • \n
  • You have ${data.maxAttempts} attempts to enter the correct code
  • \n
  • Request a new code if this one expires
  • \n
\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${appName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n\n
\n

\n Didn't request this code?
\n Someone may have entered your email by mistake. You can safely ignore this email.\n

\n\n
\n

This email was sent to ${escapeHtml(data.email)}

\n ${data.ipAddress ? `

IP Address: ${escapeHtml(data.ipAddress)}

` : ''}\n

Time: ${escapeHtml(data.timestamp)}

\n
\n
\n\n
\n\n
\n

© ${new Date().getFullYear()} ${appName}. All rights reserved.

\n
\n\n\n`\n}\n\nexport function renderOTPEmailText(data: OTPEmailData): string {\n const ctaLabel = (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n return `Your Login Code for ${data.appName}\n\nYour one-time verification code is:\n\n${data.code}\n\nThis code expires in ${data.expiryMinutes} minutes.\n${data.loginUrl ? `\\n${ctaLabel}: ${data.loginUrl}\\n` : ''}\n\nQuick Tips:\n• Enter the code exactly as shown (${data.codeLength} digits)\n• The code can only be used once\n• You have ${data.maxAttempts} attempts to enter the correct code\n• Request a new code if this one expires\n\nSecurity Notice:\nNever share this code with anyone. ${data.appName} will never ask you for this code via phone, email, or social media.\n\nDidn't request this code?\nSomeone may have entered your email by mistake. You can safely ignore this email.\n\n---\nThis email was sent to ${data.email}\n${data.ipAddress ? `IP Address: ${data.ipAddress}` : ''}\nTime: ${data.timestamp}\n\n© ${new Date().getFullYear()} ${data.appName}. All rights reserved.`\n}\n\nexport function renderOTPEmail(data: OTPEmailData): { html: string; text: string } {\n return {\n html: renderOTPEmailHTML(data),\n text: renderOTPEmailText(data)\n }\n}\n","/**\n * OTP Login Plugin\n *\n * Passwordless authentication via email one-time codes\n * Users receive a secure 6-digit code to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { setCookie } from 'hono/cookie'\nimport { z } from 'zod'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\nimport { OTPService, type OTPSettings } from './otp-service'\nimport { renderOTPEmail } from './email-templates'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\nimport { SettingsService } from '../../../services/settings'\nimport { getCustomData } from '../user-profiles'\n\n// Validation schemas\nconst otpRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nconst otpVerifySchema = z.object({\n email: z.string().email('Valid email is required'),\n code: z.string().min(4).max(8)\n})\n\n// Default settings (site name comes from general settings)\nconst DEFAULT_SETTINGS: OTPSettings = {\n codeLength: 6,\n codeExpiryMinutes: 10,\n maxAttempts: 3,\n rateLimitPerHour: 5,\n allowNewUserRegistration: false,\n logoUrl: '',\n logoWidth: 150,\n logoBorderWidth: 0,\n logoBorderColor: '#ffffff',\n loginUrl: '',\n loginButtonText: ''\n}\n\nexport function createOTPLoginPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'otp-login',\n version: '1.0.0-beta.1',\n description: 'Passwordless authentication via email one-time codes'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== API Routes ====================\n\n const otpAPI = new Hono()\n\n // POST /auth/otp/request - Request OTP code\n otpAPI.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings: OTPSettings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Get site name from general settings\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName\n\n // Check rate limiting\n const canRequest = await otpService.checkRateLimit(normalizedEmail, settings)\n if (!canRequest) {\n return c.json({\n error: 'Too many requests. Please try again in an hour.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && !settings.allowNewUserRegistration) {\n // Don't reveal if user exists or not (security)\n return c.json({\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Get IP and user agent\n const ipAddress = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n\n // Create OTP code\n const otpCode = await otpService.createOTPCode(\n normalizedEmail,\n settings,\n ipAddress,\n userAgent\n )\n\n // Send email via Email plugin\n try {\n const isDevMode = c.env.ENVIRONMENT === 'development'\n\n if (isDevMode) {\n console.log(`[DEV] OTP Code for ${normalizedEmail}: ${otpCode.code}`)\n }\n\n // Prepare email content\n const emailContent = renderOTPEmail({\n code: otpCode.code,\n expiryMinutes: settings.codeExpiryMinutes,\n codeLength: settings.codeLength,\n maxAttempts: settings.maxAttempts,\n email: normalizedEmail,\n ipAddress,\n timestamp: new Date().toISOString(),\n appName: siteName,\n logoUrl: settings.logoUrl || '',\n logoWidth: settings.logoWidth,\n logoBorderWidth: settings.logoBorderWidth,\n logoBorderColor: settings.logoBorderColor || '',\n loginUrl: settings.loginUrl || '',\n loginButtonText: settings.loginButtonText || ''\n })\n\n // Load email plugin settings from database\n // Note: We don't check status='active' because the email plugin's\n // settings UI works regardless of status, so we follow the same pattern\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (emailPlugin?.settings) {\n const emailSettings = JSON.parse(emailPlugin.settings)\n\n if (emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName) {\n // Send email via Resend API\n const emailResponse = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${emailSettings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${emailSettings.fromName} <${emailSettings.fromEmail}>`,\n to: [normalizedEmail],\n subject: `Your login code for ${siteName}`,\n html: emailContent.html,\n text: emailContent.text,\n reply_to: emailSettings.replyTo || emailSettings.fromEmail\n })\n })\n\n if (!emailResponse.ok) {\n const errorData = await emailResponse.json() as { message?: string }\n console.error('Failed to send OTP email via Resend:', errorData)\n // Don't expose error to user for security - just log it\n }\n } else {\n console.warn('Email plugin is not fully configured (missing apiKey, fromEmail, or fromName)')\n }\n } else {\n console.warn('Email plugin is not active or has no settings configured')\n }\n\n const response: any = {\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n }\n\n // In development, include the code\n if (isDevMode) {\n response.dev_code = otpCode.code\n }\n\n return c.json(response)\n } catch (emailError) {\n console.error('Error sending OTP email:', emailError)\n return c.json({\n error: 'Failed to send verification code. Please try again.'\n }, 500)\n }\n } catch (error) {\n console.error('OTP request error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/verify - Verify OTP code\n otpAPI.post('/verify', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpVerifySchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email, code } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Verify the code\n const verification = await otpService.verifyCode(normalizedEmail, code, settings)\n\n if (!verification.valid) {\n // Increment attempts on failure\n await otpService.incrementAttempts(normalizedEmail, code)\n\n return c.json({\n error: verification.error || 'Invalid code',\n attemptsRemaining: verification.attemptsRemaining\n }, 401)\n }\n\n // Code is valid - get user\n let user = await db.prepare(`\n SELECT id, email, username, first_name, last_name, role, is_active, created_at\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && settings.allowNewUserRegistration) {\n // Auto-create new user on first OTP verification\n const userId = crypto.randomUUID()\n const now = Date.now()\n const username = normalizedEmail.split('@')[0] + '_' + userId.slice(0, 6)\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, '', '', NULL, 'viewer', 1, 1, ?, ?)\n `).bind(userId, normalizedEmail, username, now, now).run()\n\n user = {\n id: userId,\n email: normalizedEmail,\n username,\n first_name: '',\n last_name: '',\n role: 'viewer',\n is_active: 1,\n created_at: now,\n }\n }\n\n if (!user) {\n return c.json({\n error: 'User not found'\n }, 404)\n }\n\n if (!user.is_active) {\n return c.json({\n error: 'Account is deactivated'\n }, 403)\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env as any)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, (c.env as any).JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n const customData = await getCustomData(db, user.id)\n const { is_active: _isActive, ...publicUser } = user\n\n return c.json({\n success: true,\n user: {\n ...publicUser,\n ...customData,\n },\n token,\n message: 'Authentication successful'\n })\n } catch (error) {\n console.error('OTP verify error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/resend - Resend OTP code\n otpAPI.post('/resend', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n // Reuse the request endpoint logic\n return otpAPI.fetch(\n new Request(c.req.url.replace('/resend', '/request'), {\n method: 'POST',\n headers: c.req.raw.headers,\n body: JSON.stringify({ email: validation.data.email })\n }),\n c.env\n )\n } catch (error) {\n console.error('OTP resend error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // Register API routes\n builder.addRoute('/auth/otp', otpAPI, {\n description: 'OTP authentication endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('OTP Login', '/admin/plugins/otp-login', {\n icon: 'key',\n order: 85,\n permissions: ['otp:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OTP Login plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OTP Login plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const otpLoginPlugin = createOTPLoginPlugin()\n","/**\n * OAuth Service\n * Handles OAuth2 authorization code flow, token exchange, and user info fetching.\n * Provider-agnostic — each provider is a simple config object.\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n// ─── Provider Configuration ─────────────────────────────────────────────────\n\nexport interface OAuthProviderConfig {\n id: string\n name: string\n authorizeUrl: string\n tokenUrl: string\n userInfoUrl: string\n scopes: string[]\n /** Map provider profile JSON to a normalized user profile */\n mapProfile: (profile: Record) => OAuthUserProfile\n}\n\nexport interface OAuthUserProfile {\n providerAccountId: string\n email: string\n name: string\n avatar?: string\n}\n\nexport interface OAuthPluginSettings {\n providers: Record\n}\n\n// ─── Built-in Providers ─────────────────────────────────────────────────────\n\nexport const GITHUB_PROVIDER: OAuthProviderConfig = {\n id: 'github',\n name: 'GitHub',\n authorizeUrl: 'https://github.com/login/oauth/authorize',\n tokenUrl: 'https://github.com/login/oauth/access_token',\n userInfoUrl: 'https://api.github.com/user',\n scopes: ['read:user', 'user:email'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || profile.login || '',\n avatar: profile.avatar_url || undefined\n })\n}\n\nexport const GOOGLE_PROVIDER: OAuthProviderConfig = {\n id: 'google',\n name: 'Google',\n authorizeUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n scopes: ['openid', 'email', 'profile'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || '',\n avatar: profile.picture || undefined\n })\n}\n\nexport const BUILT_IN_PROVIDERS: Record = {\n github: GITHUB_PROVIDER,\n google: GOOGLE_PROVIDER\n}\n\n// ─── OAuth Account DB Record ────────────────────────────────────────────────\n\nexport interface OAuthAccount {\n id: string\n user_id: string\n provider: string\n provider_account_id: string\n access_token: string | null\n refresh_token: string | null\n token_expires_at: number | null\n profile_data: string | null\n created_at: number\n updated_at: number\n}\n\n// ─── OAuth Service ──────────────────────────────────────────────────────────\n\nexport class OAuthService {\n constructor(private db: D1Database) {}\n\n /**\n * Build the authorization redirect URL for a provider.\n */\n buildAuthorizeUrl(\n provider: OAuthProviderConfig,\n clientId: string,\n redirectUri: string,\n state: string\n ): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope: provider.scopes.join(' '),\n state\n })\n\n // Google requires access_type for refresh tokens\n if (provider.id === 'google') {\n params.set('access_type', 'offline')\n params.set('prompt', 'consent')\n }\n\n return `${provider.authorizeUrl}?${params.toString()}`\n }\n\n /**\n * Exchange authorization code for tokens using native fetch.\n */\n async exchangeCode(\n provider: OAuthProviderConfig,\n clientId: string,\n clientSecret: string,\n code: string,\n redirectUri: string\n ): Promise<{ access_token: string; refresh_token?: string; expires_in?: number }> {\n const body: Record = {\n client_id: clientId,\n client_secret: clientSecret,\n code,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code'\n }\n\n const response = await fetch(provider.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json'\n },\n body: new URLSearchParams(body).toString()\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Token exchange failed (${response.status}): ${errorText}`)\n }\n\n const data = await response.json() as Record\n\n if (data.error) {\n throw new Error(`Token exchange error: ${data.error_description || data.error}`)\n }\n\n return {\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n expires_in: data.expires_in ? Number(data.expires_in) : undefined\n }\n }\n\n /**\n * Fetch user profile from the provider's userinfo endpoint.\n */\n async fetchUserProfile(\n provider: OAuthProviderConfig,\n accessToken: string\n ): Promise {\n const headers: Record = {\n 'Authorization': `Bearer ${accessToken}`,\n 'Accept': 'application/json'\n }\n\n // GitHub uses a different auth header format\n if (provider.id === 'github') {\n headers['Authorization'] = `token ${accessToken}`\n }\n\n const response = await fetch(provider.userInfoUrl, { headers })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch user profile (${response.status})`)\n }\n\n const profile = await response.json() as Record\n\n // For GitHub, email may not be in the profile — fetch from /user/emails\n if (provider.id === 'github' && !profile.email) {\n const emailResponse = await fetch('https://api.github.com/user/emails', {\n headers: {\n 'Authorization': `token ${accessToken}`,\n 'Accept': 'application/json'\n }\n })\n\n if (emailResponse.ok) {\n const emails = await emailResponse.json() as Array<{ email: string; primary: boolean; verified: boolean }>\n const primaryEmail = emails.find(e => e.primary && e.verified)\n if (primaryEmail) {\n profile.email = primaryEmail.email\n }\n }\n }\n\n return provider.mapProfile(profile)\n }\n\n // ─── Database Operations ────────────────────────────────────────────────\n\n /**\n * Find an existing OAuth account link.\n */\n async findOAuthAccount(\n provider: string,\n providerAccountId: string\n ): Promise {\n return await this.db.prepare(`\n SELECT * FROM oauth_accounts\n WHERE provider = ? AND provider_account_id = ?\n `).bind(provider, providerAccountId).first() as OAuthAccount | null\n }\n\n /**\n * Find all OAuth accounts for a user.\n */\n async findUserOAuthAccounts(userId: string): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM oauth_accounts WHERE user_id = ?\n `).bind(userId).all()\n return (result.results || []) as unknown as OAuthAccount[]\n }\n\n /**\n * Create a new OAuth account link.\n */\n async createOAuthAccount(params: {\n userId: string\n provider: string\n providerAccountId: string\n accessToken: string\n refreshToken?: string\n tokenExpiresAt?: number\n profileData?: string\n }): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO oauth_accounts (\n id, user_id, provider, provider_account_id,\n access_token, refresh_token, token_expires_at,\n profile_data, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n params.userId,\n params.provider,\n params.providerAccountId,\n params.accessToken,\n params.refreshToken || null,\n params.tokenExpiresAt || null,\n params.profileData || null,\n now,\n now\n ).run()\n\n return {\n id,\n user_id: params.userId,\n provider: params.provider,\n provider_account_id: params.providerAccountId,\n access_token: params.accessToken,\n refresh_token: params.refreshToken || null,\n token_expires_at: params.tokenExpiresAt || null,\n profile_data: params.profileData || null,\n created_at: now,\n updated_at: now\n }\n }\n\n /**\n * Update tokens for an existing OAuth account.\n */\n async updateOAuthTokens(\n id: string,\n accessToken: string,\n refreshToken?: string,\n tokenExpiresAt?: number\n ): Promise {\n await this.db.prepare(`\n UPDATE oauth_accounts\n SET access_token = ?, refresh_token = ?, token_expires_at = ?, updated_at = ?\n WHERE id = ?\n `).bind(accessToken, refreshToken || null, tokenExpiresAt || null, Date.now(), id).run()\n }\n\n /**\n * Unlink an OAuth account from a user (only if they have another auth method).\n */\n async unlinkOAuthAccount(userId: string, provider: string): Promise {\n // Check user has a password or another OAuth link before unlinking\n const user = await this.db.prepare(`\n SELECT password_hash FROM users WHERE id = ?\n `).bind(userId).first() as { password_hash: string | null } | null\n\n const otherLinks = await this.db.prepare(`\n SELECT COUNT(*) as count FROM oauth_accounts\n WHERE user_id = ? AND provider != ?\n `).bind(userId, provider).first() as { count: number } | null\n\n const hasPassword = !!user?.password_hash\n const hasOtherLinks = (otherLinks?.count || 0) > 0\n\n if (!hasPassword && !hasOtherLinks) {\n return false // Cannot unlink the only auth method\n }\n\n await this.db.prepare(`\n DELETE FROM oauth_accounts WHERE user_id = ? AND provider = ?\n `).bind(userId, provider).run()\n\n return true\n }\n\n /**\n * Find a user by email.\n */\n async findUserByEmail(email: string): Promise<{\n id: string\n email: string\n role: string\n is_active: number\n first_name: string\n last_name: string\n } | null> {\n return await this.db.prepare(`\n SELECT id, email, role, is_active, first_name, last_name\n FROM users WHERE email = ?\n `).bind(email.toLowerCase()).first() as any\n }\n\n /**\n * Create a new user from an OAuth profile.\n */\n async createUserFromOAuth(profile: OAuthUserProfile): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n const email = profile.email.toLowerCase()\n const nameParts = (profile.name || email.split('@')[0] || 'User').split(' ')\n const firstName = nameParts[0] || 'User'\n const lastName = nameParts.slice(1).join(' ') || ''\n const username = email.split('@')[0] || id.substring(0, 8)\n\n // Check for username collision and append random suffix if needed\n const existing = await this.db.prepare(\n 'SELECT id FROM users WHERE username = ?'\n ).bind(username).first()\n\n const finalUsername = existing\n ? `${username}-${id.substring(0, 6)}`\n : username\n\n await this.db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, avatar, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', ?, 1, ?, ?)\n `).bind(\n id, email, finalUsername, firstName, lastName,\n profile.avatar || null, now, now\n ).run()\n\n return id\n }\n\n /**\n * Generate a cryptographically random state parameter for CSRF protection.\n */\n generateState(): string {\n const bytes = new Uint8Array(32)\n crypto.getRandomValues(bytes)\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')\n }\n}\n","/**\n * OAuth Providers Plugin\n *\n * OAuth2/OIDC social login support for SonicJS.\n * Phase 1: Core OAuth2 authorization code flow with GitHub and Google providers.\n *\n * Routes:\n * GET /auth/oauth/:provider → Redirect to provider authorization\n * GET /auth/oauth/:provider/callback → Handle OAuth callback\n * POST /auth/oauth/link → Link OAuth provider to logged-in account\n * POST /auth/oauth/unlink → Unlink OAuth provider from account\n * GET /auth/oauth/accounts → List linked OAuth accounts for current user\n */\n\nimport { Hono } from 'hono'\nimport { setCookie, getCookie } from 'hono/cookie'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport {\n OAuthService,\n BUILT_IN_PROVIDERS,\n type OAuthPluginSettings,\n type OAuthProviderConfig\n} from './oauth-service'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst STATE_COOKIE_NAME = 'oauth_state'\nconst STATE_COOKIE_MAX_AGE = 600 // 10 minutes\n\nexport function createOAuthProvidersPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'oauth-providers',\n version: '1.0.0-beta.1',\n description: 'OAuth2/OIDC social login with GitHub, Google, and more'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== Helper Functions ====================\n\n function getCallbackUrl(c: any, provider: string): string {\n const proto = c.req.header('x-forwarded-proto') || 'https'\n const host = c.req.header('host') || 'localhost'\n return `${proto}://${host}/auth/oauth/${provider}/callback`\n }\n\n async function loadSettings(db: any): Promise {\n const row = await db.prepare(\n `SELECT settings FROM plugins WHERE id = 'oauth-providers'`\n ).first() as { settings: string | null } | null\n\n if (!row?.settings) return null\n\n try {\n return JSON.parse(row.settings) as OAuthPluginSettings\n } catch {\n return null\n }\n }\n\n function getProviderCredentials(\n settings: OAuthPluginSettings | null,\n providerId: string\n ): { clientId: string; clientSecret: string } | null {\n if (!settings?.providers?.[providerId]) return null\n const p = settings.providers[providerId]\n if (!p.enabled || !p.clientId || !p.clientSecret) return null\n return { clientId: p.clientId, clientSecret: p.clientSecret }\n }\n\n // ==================== API Routes ====================\n\n const oauthAPI = new Hono()\n\n // GET /auth/oauth/:provider — Redirect to provider authorization\n oauthAPI.get('/:provider', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.json({ error: `Unknown OAuth provider: ${providerId}` }, 400)\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.json({\n error: `OAuth provider \"${providerId}\" is not configured or not enabled`\n }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Store state in a cookie for CSRF validation on callback\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax', // Lax required for OAuth redirect flow\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n providerConfig,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.redirect(authorizeUrl)\n } catch (error) {\n console.error('OAuth authorize error:', error)\n return c.json({ error: 'Failed to initiate OAuth flow' }, 500)\n }\n })\n\n // GET /auth/oauth/:provider/callback — Handle OAuth callback\n oauthAPI.get('/:provider/callback', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.redirect('/auth/login?error=Unknown OAuth provider')\n }\n\n // Validate state (CSRF protection)\n const stateParam = c.req.query('state')\n const stateCookie = getCookie(c, STATE_COOKIE_NAME)\n\n if (!stateParam || !stateCookie || stateParam !== stateCookie) {\n return c.redirect('/auth/login?error=Invalid OAuth state. Please try again.')\n }\n\n // Clear the state cookie\n setCookie(c, STATE_COOKIE_NAME, '', {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: 0,\n path: '/auth/oauth'\n })\n\n // Check for error from provider\n const errorParam = c.req.query('error')\n if (errorParam) {\n const errorDesc = c.req.query('error_description') || errorParam\n return c.redirect(`/auth/login?error=${encodeURIComponent(errorDesc)}`)\n }\n\n const code = c.req.query('code')\n if (!code) {\n return c.redirect('/auth/login?error=No authorization code received')\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.redirect('/auth/login?error=OAuth provider not configured')\n }\n\n const oauthService = new OAuthService(db)\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Exchange code for tokens\n const tokens = await oauthService.exchangeCode(\n providerConfig,\n creds.clientId,\n creds.clientSecret,\n code,\n redirectUri\n )\n\n // Fetch user profile from provider\n const profile = await oauthService.fetchUserProfile(providerConfig, tokens.access_token)\n\n if (!profile.email) {\n return c.redirect('/auth/login?error=Could not retrieve email from OAuth provider. Please ensure your email is public or grant email permission.')\n }\n\n const tokenExpiresAt = tokens.expires_in\n ? Date.now() + (tokens.expires_in * 1000)\n : null\n\n // Check if this OAuth account is already linked to a user\n const existingOAuth = await oauthService.findOAuthAccount(providerId, profile.providerAccountId)\n\n if (existingOAuth) {\n // Existing OAuth link — update tokens and log in\n await oauthService.updateOAuthTokens(\n existingOAuth.id,\n tokens.access_token,\n tokens.refresh_token,\n tokenExpiresAt ?? undefined\n )\n\n // Fetch user to generate JWT\n const user = await db.prepare(\n 'SELECT id, email, role, is_active FROM users WHERE id = ?'\n ).bind(existingOAuth.user_id).first() as any\n\n if (!user || !user.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n user.id, user.email, user.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // No existing OAuth link — check if user exists by email\n const existingUser = await oauthService.findUserByEmail(profile.email)\n\n if (existingUser) {\n if (!existingUser.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n // Link OAuth to existing account\n await oauthService.createOAuthAccount({\n userId: existingUser.id,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n existingUser.id, existingUser.email, existingUser.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // Brand new user — create account from OAuth profile\n const newUserId = await oauthService.createUserFromOAuth(profile)\n\n await oauthService.createOAuthAccount({\n userId: newUserId,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n newUserId, profile.email.toLowerCase(), 'viewer',\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n\n } catch (error) {\n console.error('OAuth callback error:', error)\n const message = error instanceof Error ? error.message : 'OAuth authentication failed'\n return c.redirect(`/auth/login?error=${encodeURIComponent(message)}`)\n }\n })\n\n // POST /auth/oauth/link — Link an OAuth provider to the current logged-in user\n oauthAPI.post('/link', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider || !BUILT_IN_PROVIDERS[provider]) {\n return c.json({ error: 'Invalid provider' }, 400)\n }\n\n // Redirect the user to the OAuth flow — the callback will auto-link\n // since the user already exists by email\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, provider)\n\n if (!creds) {\n return c.json({ error: `OAuth provider \"${provider}\" is not configured` }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, provider)\n\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n BUILT_IN_PROVIDERS[provider]!,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.json({ redirectUrl: authorizeUrl })\n } catch (error) {\n console.error('OAuth link error:', error)\n return c.json({ error: 'Failed to initiate account linking' }, 500)\n }\n })\n\n // POST /auth/oauth/unlink — Unlink an OAuth provider from the current user\n oauthAPI.post('/unlink', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider) {\n return c.json({ error: 'Provider is required' }, 400)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const success = await oauthService.unlinkOAuthAccount(user.userId, provider)\n\n if (!success) {\n return c.json({\n error: 'Cannot unlink the only authentication method. Set a password first.'\n }, 400)\n }\n\n return c.json({ success: true, message: `${provider} account unlinked` })\n } catch (error) {\n console.error('OAuth unlink error:', error)\n return c.json({ error: 'Failed to unlink account' }, 500)\n }\n })\n\n // GET /auth/oauth/accounts — List linked OAuth accounts for current user\n oauthAPI.get('/accounts', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const accounts = await oauthService.findUserOAuthAccounts(user.userId)\n\n return c.json({\n accounts: accounts.map(a => ({\n provider: a.provider,\n providerAccountId: a.provider_account_id,\n linkedAt: a.created_at\n }))\n })\n } catch (error) {\n console.error('OAuth accounts error:', error)\n return c.json({ error: 'Failed to fetch linked accounts' }, 500)\n }\n })\n\n // Register routes\n builder.addRoute('/auth/oauth', oauthAPI, {\n description: 'OAuth2 social login endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Add menu item for admin settings\n builder.addMenuItem('OAuth Providers', '/admin/plugins/oauth-providers', {\n icon: 'shield',\n order: 86,\n permissions: ['oauth:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OAuth Providers plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OAuth Providers plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const oauthProvidersPlugin = createOAuthProvidersPlugin()\n","/**\n * Embedding Service\n * Generates embeddings using Cloudflare Workers AI\n */\n\nexport class EmbeddingService {\n constructor(private ai: any) {}\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string): Promise {\n try {\n // Use Cloudflare Workers AI embedding model\n // @cf/baai/bge-base-en-v1.5 produces 768-dimensional vectors\n const response = await this.ai.run('@cf/baai/bge-base-en-v1.5', {\n text: this.preprocessText(text)\n })\n\n // Extract embedding vector\n if (response.data && response.data.length > 0) {\n return response.data[0]\n }\n\n throw new Error('No embedding data returned')\n } catch (error) {\n console.error('[EmbeddingService] Error generating embedding:', error)\n throw error\n }\n }\n\n /**\n * Generate embeddings for multiple texts (batch processing)\n */\n async generateBatch(texts: string[]): Promise {\n try {\n // Process in smaller batches to avoid rate limits\n const batchSize = 10\n const batches: string[][] = []\n \n for (let i = 0; i < texts.length; i += batchSize) {\n batches.push(texts.slice(i, i + batchSize))\n }\n\n const allEmbeddings: number[][] = []\n\n for (const batch of batches) {\n const batchEmbeddings = await Promise.all(\n batch.map(text => this.generateEmbedding(text))\n )\n allEmbeddings.push(...batchEmbeddings)\n }\n\n return allEmbeddings\n } catch (error) {\n console.error('[EmbeddingService] Error generating batch embeddings:', error)\n throw error\n }\n }\n\n /**\n * Preprocess text before generating embedding\n * - Trim whitespace\n * - Limit length to avoid token limits\n * - Remove special characters that might cause issues\n */\n private preprocessText(text: string): string {\n if (!text) return ''\n\n // Trim and normalize whitespace\n let processed = text.trim().replace(/\\s+/g, ' ')\n\n // Limit to ~8000 characters (rough token limit)\n if (processed.length > 8000) {\n processed = processed.substring(0, 8000)\n }\n\n return processed\n }\n\n /**\n * Calculate cosine similarity between two embeddings\n */\n cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Embeddings must have same dimensions')\n }\n\n let dotProduct = 0\n let normA = 0\n let normB = 0\n\n for (let i = 0; i < a.length; i++) {\n const aVal = a[i] ?? 0\n const bVal = b[i] ?? 0\n dotProduct += aVal * bVal\n normA += aVal * aVal\n normB += bVal * bVal\n }\n\n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB))\n }\n}\n","/**\n * Chunking Service\n * Splits content into optimal chunks for embedding and search\n */\n\nexport interface ContentChunk {\n id: string\n content_id: string\n collection_id: string\n title: string\n text: string\n chunk_index: number\n metadata: Record\n}\n\nexport class ChunkingService {\n // Default chunk size (in approximate tokens)\n private readonly CHUNK_SIZE = 500\n private readonly CHUNK_OVERLAP = 50\n\n /**\n * Chunk a single content item\n */\n chunkContent(\n contentId: string,\n collectionId: string,\n title: string,\n data: any,\n metadata: Record = {}\n ): ContentChunk[] {\n // Extract all text from content\n const text = this.extractText(data)\n \n if (!text || text.trim().length === 0) {\n console.warn(`[ChunkingService] No text found for content ${contentId}`)\n return []\n }\n\n // Split into chunks\n const textChunks = this.splitIntoChunks(text)\n\n // Create chunk objects\n return textChunks.map((chunkText, index) => ({\n id: `${contentId}_chunk_${index}`,\n content_id: contentId,\n collection_id: collectionId,\n title: title,\n text: chunkText,\n chunk_index: index,\n metadata: {\n ...metadata,\n total_chunks: textChunks.length\n }\n }))\n }\n\n /**\n * Chunk multiple content items\n */\n chunkContentBatch(items: Array<{\n id: string\n collection_id: string\n title: string\n data: any\n metadata?: Record\n }>): ContentChunk[] {\n const allChunks: ContentChunk[] = []\n\n for (const item of items) {\n const chunks = this.chunkContent(\n item.id,\n item.collection_id,\n item.title,\n item.data,\n item.metadata\n )\n allChunks.push(...chunks)\n }\n\n return allChunks\n }\n\n /**\n * Extract all text from content data\n */\n private extractText(data: any): string {\n const parts: string[] = []\n\n // Common text fields\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n if (data.summary) parts.push(String(data.summary))\n\n // Recursively extract from nested objects\n const extractRecursive = (obj: any): void => {\n if (typeof obj === 'string') {\n // Skip very short strings and URLs\n if (obj.length > 10 && !obj.startsWith('http')) {\n parts.push(obj)\n }\n } else if (Array.isArray(obj)) {\n obj.forEach(extractRecursive)\n } else if (obj && typeof obj === 'object') {\n // Skip certain keys\n const skipKeys = ['id', 'slug', 'url', 'image', 'thumbnail', 'metadata']\n \n Object.entries(obj).forEach(([key, value]) => {\n if (!skipKeys.includes(key.toLowerCase())) {\n extractRecursive(value)\n }\n })\n }\n }\n\n extractRecursive(data)\n\n return parts.join('\\n\\n').trim()\n }\n\n /**\n * Split text into overlapping chunks\n */\n private splitIntoChunks(text: string): string[] {\n // Split by words\n const words = text.split(/\\s+/)\n \n if (words.length <= this.CHUNK_SIZE) {\n return [text]\n }\n\n const chunks: string[] = []\n let startIndex = 0\n\n while (startIndex < words.length) {\n // Get chunk with overlap\n const endIndex = Math.min(startIndex + this.CHUNK_SIZE, words.length)\n const chunk = words.slice(startIndex, endIndex).join(' ')\n chunks.push(chunk)\n\n // Move forward by chunk size minus overlap\n startIndex += this.CHUNK_SIZE - this.CHUNK_OVERLAP\n\n // Ensure we don't create a tiny last chunk\n if (startIndex >= words.length - this.CHUNK_OVERLAP) {\n break\n }\n }\n\n return chunks\n }\n\n /**\n * Get optimal chunk size based on content type\n */\n getOptimalChunkSize(contentType: string): number {\n switch (contentType) {\n case 'blog_posts':\n case 'articles':\n return 600 // Larger chunks for long-form content\n case 'products':\n case 'pages':\n return 400 // Medium chunks for structured content\n case 'messages':\n case 'comments':\n return 200 // Small chunks for short content\n default:\n return this.CHUNK_SIZE\n }\n }\n}\n","/**\n * Custom RAG Service\n * Implements full RAG pipeline using Cloudflare Vectorize\n * \n * Fulfills GitHub Issue #362: Advanced search with Cloudflare Search\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { EmbeddingService } from './embedding.service'\nimport { ChunkingService, type ContentChunk } from './chunking.service'\nimport type { SearchQuery, SearchResponse, SearchResult, AISearchSettings } from '../types'\n\nexport class CustomRAGService {\n private embeddingService: EmbeddingService\n private chunkingService: ChunkingService\n\n constructor(\n private db: D1Database,\n private ai: any,\n private vectorize: any\n ) {\n this.embeddingService = new EmbeddingService(ai)\n this.chunkingService = new ChunkingService()\n }\n\n /**\n * Index all content from a collection\n */\n async indexCollection(collectionId: string): Promise<{\n total_items: number\n total_chunks: number\n indexed_chunks: number\n errors: number\n }> {\n console.log(`[CustomRAG] Starting indexing for collection: ${collectionId}`)\n \n try {\n // Get all published content from collection\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.collection_id = ? AND c.status = 'published'\n `)\n .bind(collectionId)\n .all<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n const totalItems = contentItems?.length || 0\n \n if (totalItems === 0) {\n console.log(`[CustomRAG] No content found in collection ${collectionId}`)\n return { total_items: 0, total_chunks: 0, indexed_chunks: 0, errors: 0 }\n }\n\n // Chunk all content\n const items = (contentItems || []).map(item => ({\n id: item.id,\n collection_id: item.collection_id,\n title: item.title || 'Untitled',\n data: typeof item.data === 'string' ? JSON.parse(item.data) : item.data,\n metadata: {\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name\n }\n }))\n\n const chunks = this.chunkingService.chunkContentBatch(items)\n const totalChunks = chunks.length\n\n console.log(`[CustomRAG] Generated ${totalChunks} chunks from ${totalItems} items`)\n\n // Generate embeddings in batches\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n console.log(`[CustomRAG] Generated ${embeddings.length} embeddings`)\n\n // Store in Vectorize\n let indexedChunks = 0\n let errors = 0\n const batchSize = 100\n\n for (let i = 0; i < chunks.length; i += batchSize) {\n const chunkBatch = chunks.slice(i, i + batchSize)\n const embeddingBatch = embeddings.slice(i, i + batchSize)\n\n try {\n await this.vectorize.upsert(\n chunkBatch.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddingBatch[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500), // Store snippet for display\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n indexedChunks += chunkBatch.length\n console.log(`[CustomRAG] Indexed batch ${i / batchSize + 1}: ${chunkBatch.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error indexing batch ${i / batchSize + 1}:`, error)\n errors += chunkBatch.length\n }\n }\n\n console.log(`[CustomRAG] Indexing complete: ${indexedChunks}/${totalChunks} chunks indexed`)\n\n return {\n total_items: totalItems,\n total_chunks: totalChunks,\n indexed_chunks: indexedChunks,\n errors\n }\n } catch (error) {\n console.error(`[CustomRAG] Error indexing collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Search using RAG (semantic search with Vectorize)\n */\n async search(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n\n try {\n console.log(`[CustomRAG] Searching for: \"${query.query}\"`)\n\n // Generate query embedding\n const queryEmbedding = await this.embeddingService.generateEmbedding(query.query)\n\n // Build Vectorize query filters\n const filter: any = {}\n \n if (query.filters?.collections && query.filters.collections.length > 0) {\n filter.collection_id = { $in: query.filters.collections }\n } else if (settings.selected_collections.length > 0) {\n filter.collection_id = { $in: settings.selected_collections }\n }\n\n if (query.filters?.status && query.filters.status.length > 0) {\n filter.status = { $in: query.filters.status }\n }\n\n // Vectorize filters have issues, so we query without filter and manually filter results\n const vectorResults = await this.vectorize.query(queryEmbedding, {\n topK: 50, // Max allowed with returnMetadata: true\n returnMetadata: true\n })\n\n // Manually filter results by collection_id if filter exists\n let filteredMatches = vectorResults.matches || []\n if (filter.collection_id?.$in && Array.isArray(filter.collection_id.$in)) {\n const allowedCollections = filter.collection_id.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedCollections.includes(match.metadata?.collection_id)\n )\n }\n\n // Apply status filter if exists\n if (filter.status?.$in && Array.isArray(filter.status.$in)) {\n const allowedStatuses = filter.status.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedStatuses.includes(match.metadata?.status)\n )\n }\n\n // Limit to requested topK\n const topK = query.limit || settings.results_limit || 20\n filteredMatches = filteredMatches.slice(0, topK)\n\n // Replace matches with filtered results\n vectorResults.matches = filteredMatches\n\n if (!vectorResults.matches || vectorResults.matches.length === 0) {\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: 'ai'\n }\n }\n\n // Get unique content IDs\n const contentIds = [...new Set(\n vectorResults.matches.map((m: any) => m.metadata.content_id)\n )]\n\n // Fetch full content from D1\n const placeholders = contentIds.map(() => '?').join(',')\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.display_name as collection_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id IN (${placeholders})\n `)\n .bind(...contentIds)\n .all<{\n id: string\n title: string\n slug: string\n collection_id: string\n collection_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n }>()\n\n // Map results with relevance scores\n const searchResults: SearchResult[] = (contentItems || []).map(item => {\n // Find best matching chunk for this content\n const matchingChunks = vectorResults.matches.filter(\n (m: any) => m.metadata.content_id === item.id\n )\n \n const bestMatch = matchingChunks.reduce((best: any, current: any) => \n current.score > (best?.score || 0) ? current : best\n , null)\n\n return {\n id: item.id,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n collection_id: item.collection_id,\n collection_name: item.collection_name,\n snippet: bestMatch?.metadata?.text || '',\n relevance_score: bestMatch?.score || 0,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at\n }\n })\n\n // Sort by relevance score\n searchResults.sort((a, b) => (b.relevance_score || 0) - (a.relevance_score || 0))\n\n const queryTime = Date.now() - startTime\n console.log(`[CustomRAG] Search completed in ${queryTime}ms, ${searchResults.length} results`)\n\n return {\n results: searchResults,\n total: searchResults.length,\n query_time_ms: queryTime,\n mode: 'ai'\n }\n } catch (error) {\n console.error('[CustomRAG] Search error:', error)\n throw error\n }\n }\n\n /**\n * Update index for a single content item\n */\n async updateContentIndex(contentId: string): Promise {\n try {\n // Get content item\n const content = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n .bind(contentId)\n .first<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!content) {\n console.warn(`[CustomRAG] Content ${contentId} not found`)\n return\n }\n\n // If content is not published, remove from index\n if (content.status !== 'published') {\n await this.removeContentFromIndex(contentId)\n return\n }\n\n // Chunk content\n const chunks = this.chunkingService.chunkContent(\n content.id,\n content.collection_id,\n content.title || 'Untitled',\n typeof content.data === 'string' ? JSON.parse(content.data) : content.data,\n {\n status: content.status,\n created_at: content.created_at,\n updated_at: content.updated_at,\n author_id: content.author_id,\n collection_name: content.collection_name,\n collection_display_name: content.collection_display_name\n }\n )\n\n // Generate embeddings\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n // Update in Vectorize\n await this.vectorize.upsert(\n chunks.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddings[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500),\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n console.log(`[CustomRAG] Updated index for content ${contentId}: ${chunks.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error updating index for ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove content from index\n */\n async removeContentFromIndex(contentId: string): Promise {\n try {\n // Note: Vectorize doesn't have a bulk delete by metadata filter\n // We need to delete each chunk individually\n // In practice, we would track chunk IDs or use a different approach\n \n console.log(`[CustomRAG] Removing content ${contentId} from index`)\n \n // For now, we'll let stale chunks age out\n // A better approach would be to maintain a mapping in D1\n // TODO: Implement proper chunk tracking\n \n } catch (error) {\n console.error(`[CustomRAG] Error removing content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Get search suggestions based on query\n */\n async getSuggestions(partialQuery: string, limit: number = 5): Promise {\n try {\n // Generate embedding for partial query\n const queryEmbedding = await this.embeddingService.generateEmbedding(partialQuery)\n\n // Search for similar content titles\n const results = await this.vectorize.query(queryEmbedding, {\n topK: limit * 2, // Get more to filter\n returnMetadata: true\n })\n\n // Extract unique titles\n const suggestions = [...new Set(\n results.matches?.map((m: any) => m.metadata.title).filter(Boolean) || []\n )].slice(0, limit)\n\n return suggestions as string[]\n } catch (error) {\n console.error('[CustomRAG] Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Check if Vectorize is available and configured\n */\n isAvailable(): boolean {\n return !!this.vectorize && !!this.ai\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n NewCollectionNotification,\n} from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * AI Search Service\n * Handles search operations, settings management, and collection detection\n * Now uses Custom RAG with Vectorize for semantic search\n */\nexport class AISearchService {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[AISearchService] Custom RAG initialized')\n } else {\n console.log('[AISearchService] Custom RAG not available, using keyword search only')\n }\n }\n\n /**\n * Get plugin settings\n */\n async getSettings(): Promise {\n try {\n const plugin = await this.db\n .prepare(`SELECT settings FROM plugins WHERE id = ? LIMIT 1`)\n .bind('ai-search')\n .first<{ settings: string | null }>()\n\n if (!plugin || !plugin.settings) {\n return this.getDefaultSettings()\n }\n\n return JSON.parse(plugin.settings) as AISearchSettings\n } catch (error) {\n console.error('Error fetching AI Search settings:', error)\n return this.getDefaultSettings()\n }\n }\n\n /**\n * Get default settings\n */\n getDefaultSettings(): AISearchSettings {\n return {\n enabled: true,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n }\n\n /**\n * Update plugin settings\n */\n async updateSettings(settings: Partial): Promise {\n const existing = await this.getSettings()\n const updated: AISearchSettings = {\n ...existing!,\n ...settings,\n }\n\n try {\n // Update plugin settings in plugins table\n await this.db\n .prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'ai-search'\n `)\n .bind(JSON.stringify(updated))\n .run()\n\n return updated\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n throw error\n }\n }\n\n /**\n * Detect new collections that aren't indexed or dismissed\n */\n async detectNewCollections(): Promise {\n try {\n // Get all collections (exclude test collections)\n // Note: D1 doesn't support parameterized LIKE, so we filter in JavaScript\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: number\n name: string\n display_name: string\n description?: string\n }>()\n \n // Filter out test collections (starts with test_, ends with _test, or is test_collection)\n const collections = (allCollections || []).filter(\n (col) => {\n if (!col.name) return false\n const name = col.name.toLowerCase()\n return !name.startsWith('test_') && \n !name.endsWith('_test') && \n name !== 'test_collection' &&\n !name.includes('_test_') &&\n name !== 'large_payload_test' &&\n name !== 'concurrent_test'\n }\n )\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n\n // Get item counts for each collection\n const notifications: NewCollectionNotification[] = []\n\n for (const collection of collections || []) {\n const collectionId = String(collection.id)\n\n // Skip if already selected or dismissed\n if (selected.includes(collectionId) || dismissed.includes(collectionId)) {\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n notifications.push({\n collection: {\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: false,\n is_dismissed: false,\n is_new: true,\n },\n message: `New collection \"${collection.display_name}\" with ${itemCount} items available for indexing`,\n })\n }\n\n return notifications\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return []\n }\n }\n\n /**\n * Get all collections with indexing status\n */\n async getAllCollections(): Promise {\n try {\n // Get all collections (same query as content page)\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1 ORDER BY display_name'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: string\n name: string\n display_name: string\n description?: string\n }>()\n \n console.log('[AISearchService.getAllCollections] Raw collections from DB:', allCollections?.length || 0)\n const firstCollection = allCollections?.[0]\n if (firstCollection) {\n console.log('[AISearchService.getAllCollections] Sample collection:', {\n id: firstCollection.id,\n name: firstCollection.name,\n display_name: firstCollection.display_name\n })\n }\n \n // No filtering needed - test collections are now properly cleaned up by E2E tests\n const collections = (allCollections || []).filter(\n (col) => col.id && col.name\n )\n \n console.log('[AISearchService.getAllCollections] After filtering test collections:', collections.length)\n console.log('[AISearchService.getAllCollections] Remaining collections:', collections.map(c => c.name).join(', '))\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n \n console.log('[AISearchService.getAllCollections] Settings:', {\n selected_count: selected.length,\n dismissed_count: dismissed.length,\n selected: selected\n })\n\n // Get item counts and indexing status\n const collectionInfos: CollectionInfo[] = []\n\n for (const collection of collections) {\n if (!collection.id || !collection.name) continue\n const collectionId = String(collection.id)\n \n if (!collectionId) {\n console.warn('[AISearchService] Skipping invalid collection:', collection)\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n collectionInfos.push({\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name || collection.name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: selected.includes(collectionId),\n is_dismissed: dismissed.includes(collectionId),\n is_new: !selected.includes(collectionId) && !dismissed.includes(collectionId),\n })\n }\n \n console.log('[AISearchService.getAllCollections] Returning collectionInfos:', collectionInfos.length)\n const firstInfo = collectionInfos[0]\n if (collectionInfos.length > 0 && firstInfo) {\n console.log('[AISearchService.getAllCollections] First collectionInfo:', {\n id: firstInfo.id,\n name: firstInfo.name,\n display_name: firstInfo.display_name,\n item_count: firstInfo.item_count\n })\n }\n return collectionInfos\n } catch (error) {\n console.error('[AISearchService] Error fetching collections:', error)\n return []\n }\n }\n\n /**\n * Execute search query\n */\n async search(query: SearchQuery): Promise {\n const startTime = Date.now()\n const settings = await this.getSettings()\n\n if (!settings?.enabled) {\n return {\n results: [],\n total: 0,\n query_time_ms: 0,\n mode: query.mode,\n }\n }\n\n // Use AI Search if enabled and mode is 'ai'\n if (query.mode === 'ai' && settings.ai_mode_enabled && this.customRAG?.isAvailable()) {\n return this.searchAI(query, settings)\n }\n\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n\n /**\n * AI-powered semantic search using Custom RAG\n */\n private async searchAI(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n \n try {\n if (!this.customRAG) {\n console.warn('[AISearchService] CustomRAG not available, falling back to keyword search')\n return this.searchKeyword(query, settings)\n }\n\n // Use Custom RAG for semantic search - pass the full query object and settings\n const result = await this.customRAG.search(query, settings)\n\n return result\n } catch (error) {\n console.error('[AISearchService] AI search error, falling back to keyword:', error)\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n }\n\n /**\n * Traditional keyword search\n */\n private async searchKeyword(\n query: SearchQuery,\n settings: AISearchSettings\n ): Promise {\n const startTime = Date.now()\n\n try {\n const conditions: string[] = []\n const params: any[] = []\n\n // Search query\n if (query.query) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n const searchTerm = `%${query.query}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n // Collection filter\n if (query.filters?.collections && query.filters.collections.length > 0) {\n const placeholders = query.filters.collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...query.filters.collections)\n } else if (settings.selected_collections.length > 0) {\n // Only search indexed collections\n const placeholders = settings.selected_collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...settings.selected_collections)\n }\n\n // Status filter\n if (query.filters?.status && query.filters.status.length > 0) {\n const placeholders = query.filters.status.map(() => '?').join(',')\n conditions.push(`c.status IN (${placeholders})`)\n params.push(...query.filters.status)\n } else {\n // Exclude deleted by default\n conditions.push(\"c.status != 'deleted'\")\n }\n\n // Date range filter\n if (query.filters?.dateRange) {\n const field = query.filters.dateRange.field || 'created_at'\n if (query.filters.dateRange.start) {\n conditions.push(`c.${field} >= ?`)\n params.push(query.filters.dateRange.start.getTime())\n }\n if (query.filters.dateRange.end) {\n conditions.push(`c.${field} <= ?`)\n params.push(query.filters.dateRange.end.getTime())\n }\n }\n\n // Author filter\n if (query.filters?.author) {\n conditions.push('c.author_id = ?')\n params.push(query.filters.author)\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get results\n const limit = query.limit || settings.results_limit\n const offset = query.offset || 0\n\n const resultsStmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id, c.data,\n col.name as collection_name, col.display_name as collection_display_name,\n u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results } = await resultsStmt.bind(...params, limit, offset).all<{\n id: string\n title: string\n slug: string\n collection_id: number\n collection_name: string\n collection_display_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n author_email?: string\n data: string\n }>()\n\n const searchResults: SearchResult[] = (results || []).map((row) => ({\n id: String(row.id),\n title: row.title || 'Untitled',\n slug: row.slug || '',\n collection_id: String(row.collection_id),\n collection_name: row.collection_display_name || row.collection_name,\n snippet: this.extractSnippet(row.data, query.query),\n status: row.status,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n author_name: row.author_email,\n }))\n\n const queryTime = Date.now() - startTime\n\n // Log search history\n await this.logSearch(query.query, query.mode, searchResults.length)\n\n return {\n results: searchResults,\n total,\n query_time_ms: queryTime,\n mode: query.mode,\n }\n } catch (error) {\n console.error('Keyword search error:', error)\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: query.mode,\n }\n }\n }\n\n /**\n * Extract snippet from content data\n */\n private extractSnippet(data: string, query: string): string {\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data\n const text = JSON.stringify(parsed).toLowerCase()\n const queryLower = query.toLowerCase()\n\n const index = text.indexOf(queryLower)\n if (index === -1) {\n // Return first 200 chars\n return JSON.stringify(parsed).substring(0, 200) + '...'\n }\n\n // Extract context around match\n const start = Math.max(0, index - 50)\n const end = Math.min(text.length, index + query.length + 50)\n return text.substring(start, end) + '...'\n } catch {\n return data.substring(0, 200) + '...'\n }\n }\n\n /**\n * Get search suggestions (autocomplete)\n */\n async getSearchSuggestions(partial: string): Promise {\n try {\n const settings = await this.getSettings()\n if (!settings?.autocomplete_enabled) {\n return []\n }\n\n // If Custom RAG is available, use AI-powered suggestions\n if (this.customRAG?.isAvailable()) {\n try {\n const aiSuggestions = await this.customRAG.getSuggestions(partial, 5)\n if (aiSuggestions.length > 0) {\n return aiSuggestions\n }\n } catch (error) {\n console.error('[AISearchService] Error getting AI suggestions:', error)\n // Fall through to history-based suggestions\n }\n }\n\n // Fallback to history-based suggestions\n const stmt = this.db.prepare(`\n SELECT DISTINCT query \n FROM ai_search_history \n WHERE query LIKE ? \n ORDER BY created_at DESC \n LIMIT 10\n `)\n const { results } = await stmt.bind(`%${partial}%`).all<{ query: string }>()\n\n return (results || []).map((r) => r.query)\n } catch (error) {\n console.error('Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Log search query to history\n */\n private async logSearch(query: string, mode: 'ai' | 'keyword', resultsCount: number): Promise {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_history (query, mode, results_count, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await stmt.bind(query, mode, resultsCount, Date.now()).run()\n } catch (error) {\n console.error('Error logging search:', error)\n }\n }\n\n /**\n * Get search analytics\n */\n async getSearchAnalytics(): Promise<{\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }> {\n try {\n // Total queries (last 30 days)\n const totalStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n `)\n const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000\n const totalResult = await totalStmt.bind(thirtyDaysAgo).first<{ count: number }>()\n\n // AI vs Keyword breakdown\n const modeStmt = this.db.prepare(`\n SELECT mode, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY mode\n `)\n const { results: modeResults } = await modeStmt.bind(thirtyDaysAgo).all<{\n mode: string\n count: number\n }>()\n\n const aiCount = modeResults?.find((r) => r.mode === 'ai')?.count || 0\n const keywordCount = modeResults?.find((r) => r.mode === 'keyword')?.count || 0\n\n // Popular queries\n const popularStmt = this.db.prepare(`\n SELECT query, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY query \n ORDER BY count DESC \n LIMIT 10\n `)\n const { results: popularResults } = await popularStmt.bind(thirtyDaysAgo).all<{\n query: string\n count: number\n }>()\n\n return {\n total_queries: totalResult?.count || 0,\n ai_queries: aiCount,\n keyword_queries: keywordCount,\n popular_queries: (popularResults || []).map((r) => ({\n query: r.query,\n count: r.count,\n })),\n average_query_time: 0, // TODO: Track query times\n }\n } catch (error) {\n console.error('Error getting analytics:', error)\n return {\n total_queries: 0,\n ai_queries: 0,\n keyword_queries: 0,\n popular_queries: [],\n average_query_time: 0,\n }\n }\n }\n\n /**\n * Verify Custom RAG is available\n */\n verifyBinding(): boolean {\n return this.customRAG?.isAvailable() ?? false\n }\n\n /**\n * Get Custom RAG service instance (for indexer)\n */\n getCustomRAG(): CustomRAGService | undefined {\n return this.customRAG\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { AISearchSettings, IndexStatus } from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * Index Manager Service\n * Handles indexing of content items using Custom RAG with Vectorize\n */\nexport class IndexManager {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[IndexManager] Custom RAG initialized')\n }\n }\n\n /**\n * Index all content items within a collection using Custom RAG\n */\n async indexCollection(collectionId: string): Promise {\n try {\n // Get collection info\n const collectionStmt = this.db.prepare(\n 'SELECT id, name, display_name FROM collections WHERE id = ?'\n )\n const collection = await collectionStmt.bind(collectionId).first<{\n id: string\n name: string\n display_name: string\n }>()\n\n if (!collection) {\n throw new Error(`Collection ${collectionId} not found`)\n }\n\n // Update status to indexing\n await this.updateIndexStatus(collectionId, {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n status: 'indexing',\n })\n\n // Use Custom RAG for indexing if available\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Using Custom RAG to index collection ${collectionId}`)\n \n const result = await this.customRAG.indexCollection(collectionId)\n\n const finalStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: result.total_items,\n indexed_items: result.indexed_chunks,\n last_sync_at: Date.now(),\n status: result.errors > 0 ? 'error' : 'completed',\n error_message: result.errors > 0 ? `${result.errors} errors during indexing` : undefined\n }\n\n await this.updateIndexStatus(collectionId, finalStatus)\n return finalStatus\n }\n\n // Fallback: No indexing without Custom RAG\n console.warn(`[IndexManager] Custom RAG not available, skipping indexing for ${collectionId}`)\n \n const fallbackStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n last_sync_at: Date.now(),\n status: 'completed',\n error_message: 'Custom RAG not available - using keyword search only'\n }\n\n await this.updateIndexStatus(collectionId, fallbackStatus)\n return fallbackStatus\n } catch (error) {\n console.error(`[IndexManager] Error indexing collection ${collectionId}:`, error)\n const errorStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: 'Unknown',\n total_items: 0,\n indexed_items: 0,\n status: 'error',\n error_message: error instanceof Error ? error.message : String(error),\n }\n await this.updateIndexStatus(collectionId, errorStatus)\n return errorStatus\n }\n }\n\n /**\n * Index a single content item\n */\n private async indexContentItem(\n item: {\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n },\n collectionId: string\n ): Promise {\n try {\n // Parse content data\n let parsedData: any = {}\n try {\n parsedData = typeof item.data === 'string' ? JSON.parse(item.data) : item.data\n } catch {\n parsedData = {}\n }\n\n // Prepare document for AI Search\n const document = {\n id: `content_${item.id}`,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n content: this.extractSearchableText(parsedData),\n metadata: {\n collection_id: collectionId,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n },\n }\n\n // TODO: Call Cloudflare AI Search API to index document\n // await this.aiSearch.index(document)\n\n // For now, just log (actual implementation will use AI Search API)\n console.log(`Indexed content item: ${item.id}`)\n } catch (error) {\n console.error(`Error indexing content item ${item.id}:`, error)\n throw error\n }\n }\n\n /**\n * Extract searchable text from content data\n */\n private extractSearchableText(data: any): string {\n const parts: string[] = []\n\n // Add title if present\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n\n // Add description/content fields\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n\n // Add all string values from data\n const extractStrings = (obj: any): void => {\n if (typeof obj === 'string') {\n parts.push(obj)\n } else if (Array.isArray(obj)) {\n obj.forEach(extractStrings)\n } else if (obj && typeof obj === 'object') {\n Object.values(obj).forEach(extractStrings)\n }\n }\n\n extractStrings(data)\n\n return parts.join(' ')\n }\n\n /**\n * Update a single content item in the index\n */\n async updateIndex(collectionId: number, contentId: string): Promise {\n try {\n // Get content item\n const stmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.data, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ? AND c.collection_id = ?\n `)\n const item = await stmt.bind(contentId, collectionId).first<{\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!item) {\n throw new Error(`Content item ${contentId} not found`)\n }\n\n // Re-index the item\n await this.indexContentItem(item, String(collectionId))\n\n // Update last sync time for collection\n const status = await this.getIndexStatus(String(collectionId))\n if (status) {\n await this.updateIndexStatus(String(collectionId), {\n ...status,\n last_sync_at: Date.now(),\n })\n }\n } catch (error) {\n console.error(`Error updating index for content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove a content item from the index using Custom RAG\n */\n async removeFromIndex(collectionId: string, contentId: string): Promise {\n try {\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Removing content ${contentId} from index`)\n await this.customRAG.removeContentFromIndex(contentId)\n } else {\n console.warn(`[IndexManager] Custom RAG not available, skipping removal for ${contentId}`)\n }\n } catch (error) {\n console.error(`[IndexManager] Error removing content ${contentId} from index:`, error)\n throw error\n }\n }\n\n /**\n * Get indexing status for a collection\n */\n async getIndexStatus(collectionId: string): Promise {\n try {\n const stmt = this.db.prepare(\n 'SELECT * FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const result = await stmt.bind(collectionId).first<{\n id: number\n collection_id: string\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n if (!result) {\n return null\n }\n\n return {\n collection_id: String(result.collection_id),\n collection_name: result.collection_name,\n total_items: result.total_items,\n indexed_items: result.indexed_items,\n last_sync_at: result.last_sync_at,\n status: result.status as IndexStatus['status'],\n error_message: result.error_message,\n }\n } catch (error) {\n console.error(`Error getting index status for collection ${collectionId}:`, error)\n return null\n }\n }\n\n /**\n * Get indexing status for all collections\n */\n async getAllIndexStatus(): Promise> {\n try {\n const stmt = this.db.prepare('SELECT * FROM ai_search_index_meta')\n const { results } = await stmt.all<{\n id: number\n collection_id: number\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n const statusMap: Record = {}\n\n for (const row of results || []) {\n const collectionId = String(row.collection_id)\n statusMap[collectionId] = {\n collection_id: collectionId,\n collection_name: row.collection_name,\n total_items: row.total_items,\n indexed_items: row.indexed_items,\n last_sync_at: row.last_sync_at,\n status: row.status as IndexStatus['status'],\n error_message: row.error_message,\n }\n }\n\n return statusMap\n } catch (error) {\n console.error('Error getting all index status:', error)\n return {}\n }\n }\n\n /**\n * Update index status in database\n */\n private async updateIndexStatus(collectionId: string, status: IndexStatus): Promise {\n try {\n // Check if record exists\n const checkStmt = this.db.prepare(\n 'SELECT id FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const existing = await checkStmt.bind(collectionId).first<{ id: number }>()\n\n if (existing) {\n // Update existing\n const stmt = this.db.prepare(`\n UPDATE ai_search_index_meta \n SET collection_name = ?,\n total_items = ?,\n indexed_items = ?,\n last_sync_at = ?,\n status = ?,\n error_message = ?\n WHERE collection_id = ?\n `)\n await stmt\n .bind(\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null,\n String(collectionId)\n )\n .run()\n } else {\n // Insert new\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_index_meta (\n collection_id, collection_name, total_items, indexed_items,\n last_sync_at, status, error_message\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n await stmt\n .bind(\n String(status.collection_id),\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null\n )\n .run()\n }\n } catch (error) {\n console.error(`Error updating index status for collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Sync all selected collections\n */\n async syncAll(selectedCollections: string[]): Promise {\n for (const collectionId of selectedCollections) {\n try {\n await this.indexCollection(collectionId)\n } catch (error) {\n console.error(`Error syncing collection ${collectionId}:`, error)\n }\n }\n }\n}\n","import { renderAdminLayout } from '../../../../templates/layouts/admin-layout-v2.template'\nimport type {\n AISearchSettings,\n CollectionInfo,\n IndexStatus,\n NewCollectionNotification,\n} from '../types'\n\ninterface SettingsPageData {\n settings: AISearchSettings | null\n collections: CollectionInfo[]\n newCollections: NewCollectionNotification[]\n indexStatus: Record\n analytics: {\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const settings = data.settings || {\n enabled: false,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n\n // Ensure arrays exist\n const selectedCollections = Array.isArray(settings.selected_collections) ? settings.selected_collections : []\n const dismissedCollections = Array.isArray(settings.dismissed_collections) ? settings.dismissed_collections : []\n\n const enabled = settings.enabled === true\n const aiModeEnabled = settings.ai_mode_enabled !== false\n const autocompleteEnabled = settings.autocomplete_enabled !== false\n const indexMedia = settings.index_media === true\n\n const selectedCollectionIds = new Set(selectedCollections.map(id => String(id)))\n const dismissedCollectionIds = new Set(dismissedCollections.map(id => String(id)))\n\n // Ensure collections array exists\n const collections = Array.isArray(data.collections) ? data.collections : []\n\n // Debug: Log collections in template\n console.log('[SettingsPage Template] Collections received:', collections.length)\n if (collections.length > 0) {\n console.log('[SettingsPage Template] First collection:', collections[0])\n }\n\n const content = `\n
\n \n
\n
\n

🔍 AI Search Settings

\n

\n Configure advanced search with Cloudflare AI Search. Select collections to index and manage search preferences.\n

\n
\n \n
\n\n\n \n
\n
\n \n
\n

🔍 Search Settings

\n
\n
\n \n
\n \n

Turn on advanced search capabilities across your content

\n
\n
\n\n
\n \n
\n \n

\n Enable natural language queries (requires Cloudflare Workers AI binding)\n → Setup Guide\n

\n

\n ⚠️ If AI binding unavailable, will fallback to keyword search\n

\n
\n
\n
\n
\n\n
\n\n \n
\n
\n
\n

📚 Collections to Index

\n

\n Select which content collections should be indexed and searchable. Only checked collections will be included in search results.\n

\n
\n
\n
\n ${collections.length === 0\n ? '

No collections available. Create collections first.

'\n : collections.map((collection) => {\n const collectionId = String(collection.id)\n const isChecked = selectedCollectionIds.has(collectionId)\n const isDismissed = dismissedCollectionIds.has(collectionId)\n const indexStatusMap: Record = data.indexStatus || {}\n const status = indexStatusMap[collectionId]\n // Only show NEW badge if collection is new, not dismissed, and has never been indexed\n const isNew = collection.is_new === true && !isDismissed && !status\n // Only show status badge if collection is CHECKED and has status\n const statusBadge = (status && isChecked)\n ? `${status.status}`\n : ''\n\n return `
\n \n
\n \n

\n ${collection.description || collection.name || 'No description'} • ${collection.item_count || 0} items\n ${status ? ` • ${status.indexed_items}/${status.total_items} indexed` : ''}\n

\n ${status && status.status === 'indexing'\n ? `
\n
\n
`\n : ''}\n
\n ${isChecked ? `\n \n \n \n \n Re-index\n \n ` : ''}\n
`\n }).join('')}\n
\n
\n\n
\n\n \n
\n

⚙️ Advanced Options

\n
\n
\n \n
\n \n

Show search suggestions as users type

\n
\n
\n\n
\n \n
\n \n

Include media files in search results

\n
\n
\n\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

\n 💡 Collections marked as NEW haven't been indexed yet\n

\n \n
\n
\n
\n\n\n \n
\n

📊 Search Analytics

\n
\n
\n
Total Queries
\n
${data.analytics.total_queries}
\n
\n
\n
AI Queries
\n
${data.analytics.ai_queries}
\n
\n
\n
Keyword Queries
\n
${data.analytics.keyword_queries}
\n
\n
\n ${data.analytics.popular_queries.length > 0\n ? `\n
\n

Popular Searches

\n
\n ${data.analytics.popular_queries.map(\n (item) => `\n
\n \"${item.query}\"\n ${item.count} times\n
\n `\n ).join('')}\n
\n
\n `\n : '

No search history yet.

'}\n
\n\n \n
\n
\n \n Settings Saved Successfully!\n
\n
\n
\n \n `\n\n return renderAdminLayout({\n title: 'AI Search Settings',\n pageTitle: 'AI Search Settings',\n currentPath: '/admin/plugins/ai-search/settings',\n user: data.user,\n content: content\n })\n}\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { requireAuth } from '../../../../middleware'\nimport { AISearchService } from '../services/ai-search'\nimport { IndexManager } from '../services/indexer'\nimport { renderSettingsPage } from '../components/settings-page'\nimport type { AISearchSettings, SearchQuery } from '../types'\n\ntype Variables = {\n user: {\n id: number\n email: string\n role: string\n }\n}\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminRoutes.use('*', requireAuth())\n\n/**\n * GET /admin/plugins/ai-search\n * Render settings page\n */\nadminRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const ai = (c.env as any).AI // Workers AI for embeddings\n const vectorize = (c.env as any).VECTORIZE_INDEX // Vectorize for vector search\n\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n // Get settings\n const settings = await service.getSettings()\n console.log('[AI Search Settings Route] Settings loaded:', !!settings)\n\n // Get all collections with status\n const collections = await service.getAllCollections()\n console.log('[AI Search Settings Route] Collections returned:', collections.length)\n \n // If no collections, try direct query\n if (collections.length === 0) {\n const directQuery = await db.prepare('SELECT id, name, display_name FROM collections WHERE is_active = 1').all()\n console.log('[AI Search Settings Route] Direct DB query found:', directQuery.results?.length || 0, 'collections')\n if (directQuery.results && directQuery.results.length > 0) {\n console.log('[AI Search Settings Route] Sample from DB:', directQuery.results[0])\n }\n } else if (collections.length > 0 && collections[0]) {\n console.log('[AI Search Settings Route] First collection:', {\n id: collections[0].id,\n name: collections[0].name,\n display_name: collections[0].display_name\n })\n }\n\n // Get new collections notifications\n const newCollections = await service.detectNewCollections()\n console.log('AI Search: New collections:', newCollections.length)\n\n // Get index status for all collections\n const indexStatus = await indexer.getAllIndexStatus()\n console.log('AI Search: Index status:', Object.keys(indexStatus).length)\n\n // Get analytics\n const analytics = await service.getSearchAnalytics()\n\n return c.html(\n renderSettingsPage({\n settings,\n collections: collections || [],\n newCollections: newCollections || [],\n indexStatus: indexStatus || {},\n analytics,\n user: {\n name: user.email,\n email: user.email,\n role: user.role,\n },\n })\n )\n } catch (error) {\n console.error('Error rendering AI Search settings:', error)\n return c.html(`

Error loading settings: ${error instanceof Error ? error.message : String(error)}

`, 500)\n }\n})\n\n/**\n * POST /admin/plugins/ai-search\n * Update settings\n */\nadminRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n console.log('[AI Search POST] Received body:', JSON.stringify(body, null, 2))\n\n // Get current settings\n const currentSettings = await service.getSettings()\n console.log('[AI Search POST] Current settings selected_collections:', currentSettings?.selected_collections)\n\n // Update settings\n const updatedSettings: Partial = {\n enabled: body.enabled !== undefined ? Boolean(body.enabled) : currentSettings?.enabled,\n ai_mode_enabled: body.ai_mode_enabled !== undefined ? Boolean(body.ai_mode_enabled) : currentSettings?.ai_mode_enabled,\n selected_collections: Array.isArray(body.selected_collections) ? body.selected_collections.map(String) : (currentSettings?.selected_collections || []),\n dismissed_collections: Array.isArray(body.dismissed_collections) ? body.dismissed_collections.map(String) : (currentSettings?.dismissed_collections || []),\n autocomplete_enabled: body.autocomplete_enabled !== undefined ? Boolean(body.autocomplete_enabled) : currentSettings?.autocomplete_enabled,\n cache_duration: body.cache_duration ? Number(body.cache_duration) : currentSettings?.cache_duration,\n results_limit: body.results_limit ? Number(body.results_limit) : currentSettings?.results_limit,\n index_media: body.index_media !== undefined ? Boolean(body.index_media) : currentSettings?.index_media,\n }\n\n console.log('[AI Search POST] Updated settings selected_collections:', updatedSettings.selected_collections)\n\n // If collections changed, trigger indexing\n const collectionsChanged =\n JSON.stringify(updatedSettings.selected_collections) !==\n JSON.stringify(currentSettings?.selected_collections || [])\n\n const saved = await service.updateSettings(updatedSettings)\n console.log('[AI Search POST] Settings saved, selected_collections:', saved.selected_collections)\n\n // Start indexing if collections were added\n if (collectionsChanged && updatedSettings.selected_collections) {\n console.log('[AI Search POST] Collections changed, starting background indexing')\n // Start indexing in background (non-blocking) - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .syncAll(updatedSettings.selected_collections)\n .then(() => console.log('[AI Search POST] Background indexing completed'))\n .catch((error) => console.error('[AI Search POST] Background indexing error:', error))\n )\n }\n\n return c.json({ success: true, settings: saved })\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n return c.json({ error: 'Failed to update settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/settings\n * Get settings API endpoint\n */\nadminRoutes.get('/api/settings', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const settings = await service.getSettings()\n return c.json({ success: true, data: settings })\n } catch (error) {\n console.error('Error fetching settings:', error)\n return c.json({ error: 'Failed to fetch settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/new-collections\n * Get new collections that aren't indexed or dismissed\n */\nadminRoutes.get('/api/new-collections', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const notifications = await service.detectNewCollections()\n return c.json({ success: true, data: notifications })\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return c.json({ error: 'Failed to detect new collections' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/status\n * Get indexing status\n */\nadminRoutes.get('/api/status', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const status = await indexer.getAllIndexStatus()\n return c.json({ success: true, data: status })\n } catch (error) {\n console.error('Error fetching index status:', error)\n return c.json({ error: 'Failed to fetch status' }, 500)\n }\n})\n\n/**\n * POST /admin/api/ai-search/reindex\n * Trigger re-indexing for a collection\n */\nadminRoutes.post('/api/reindex', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n const collectionIdRaw: unknown = body.collection_id\n const collectionId = collectionIdRaw ? String(collectionIdRaw) : ''\n\n if (!collectionId || collectionId === 'undefined' || collectionId === 'null') {\n return c.json({ error: 'collection_id is required' }, 400)\n }\n\n // Start indexing in background - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .indexCollection(collectionId)\n .then(() => console.log(`[AI Search Reindex] Completed for collection ${collectionId}`))\n .catch((error) => console.error(`[AI Search Reindex] Error for collection ${collectionId}:`, error))\n )\n\n return c.json({ success: true, message: 'Re-indexing started' })\n } catch (error) {\n console.error('Error starting re-index:', error)\n return c.json({ error: 'Failed to start re-indexing' }, 500)\n }\n})\n\nexport default adminRoutes\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { AISearchService } from '../services/ai-search'\nimport type { SearchQuery } from '../types'\n\ntype Variables = {\n user?: {\n id: number\n email: string\n role: string\n }\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * POST /api/search\n * Execute search query\n */\napiRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const body = await c.req.json()\n\n const query: SearchQuery = {\n query: body.query || '',\n mode: body.mode || 'keyword',\n filters: body.filters || {},\n limit: body.limit ? Number(body.limit) : undefined,\n offset: body.offset ? Number(body.offset) : undefined,\n }\n\n // Convert date strings to Date objects if present\n if (query.filters?.dateRange) {\n if (typeof query.filters.dateRange.start === 'string') {\n query.filters.dateRange.start = new Date(query.filters.dateRange.start)\n }\n if (typeof query.filters.dateRange.end === 'string') {\n query.filters.dateRange.end = new Date(query.filters.dateRange.end)\n }\n }\n\n const results = await service.search(query)\n\n return c.json({\n success: true,\n data: results,\n })\n } catch (error) {\n console.error('Search error:', error)\n return c.json(\n {\n success: false,\n error: 'Search failed',\n message: error instanceof Error ? error.message : String(error),\n },\n 500\n )\n }\n})\n\n/**\n * GET /api/search/suggest\n * Get search suggestions (autocomplete)\n */\napiRoutes.get('/suggest', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const query = c.req.query('q') || ''\n\n if (!query || query.length < 2) {\n return c.json({ success: true, data: [] })\n }\n\n const suggestions = await service.getSearchSuggestions(query)\n\n return c.json({\n success: true,\n data: suggestions,\n })\n } catch (error) {\n console.error('Suggestions error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get suggestions',\n },\n 500\n )\n }\n})\n\n/**\n * GET /admin/api/search/analytics\n * Get search analytics\n */\napiRoutes.get('/analytics', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const analytics = await service.getSearchAnalytics()\n\n return c.json({\n success: true,\n data: analytics,\n })\n } catch (error) {\n console.error('Analytics error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get analytics',\n },\n 500\n )\n }\n})\n\nexport default apiRoutes\n","{\n \"id\": \"ai-search\",\n \"name\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"icon\": \"magnifying-glass\",\n \"homepage\": \"https://developers.cloudflare.com/ai-search/\",\n \"repository\": \"https://github.com/sonicjs/sonicjs\",\n \"license\": \"MIT\",\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"configSchema\": {\n \"enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI Search\",\n \"description\": \"Enable or disable AI Search functionality\",\n \"default\": true\n },\n \"ai_mode_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI/Semantic Search\",\n \"description\": \"Enable AI-powered semantic search (requires Cloudflare Workers AI binding)\",\n \"default\": false\n },\n \"ai_provider\": {\n \"type\": \"string\",\n \"label\": \"AI Provider\",\n \"description\": \"Which AI service to use for semantic search\",\n \"default\": \"cloudflare\",\n \"enum\": [\n \"cloudflare\",\n \"keyword-only\"\n ]\n },\n \"autocomplete_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable Autocomplete\",\n \"description\": \"Show search suggestions as user types\",\n \"default\": true\n },\n \"cache_duration\": {\n \"type\": \"number\",\n \"label\": \"Cache Duration (hours)\",\n \"description\": \"How long to cache search results\",\n \"default\": 1,\n \"min\": 0,\n \"max\": 24\n },\n \"results_limit\": {\n \"type\": \"number\",\n \"label\": \"Results Per Page\",\n \"description\": \"Maximum number of results to show per page\",\n \"default\": 20,\n \"min\": 10,\n \"max\": 100\n },\n \"index_media\": {\n \"type\": \"boolean\",\n \"label\": \"Index Media Metadata\",\n \"description\": \"Include R2 media files in search index\",\n \"default\": false\n }\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"href\": \"/admin/plugins/ai-search\",\n \"parentId\": \"plugins\",\n \"order\": 50\n },\n \"codeName\": \"ai-search-plugin\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { AISearchService } from './services/ai-search'\nimport { IndexManager } from './services/indexer'\nimport adminRoutes from './routes/admin'\nimport apiRoutes from './routes/api'\nimport manifest from './manifest.json'\n\n/**\n * AI Search Plugin\n * \n * Provides advanced search capabilities using Cloudflare AI Search.\n * Features:\n * - Semantic/AI-powered search with natural language queries\n * - Traditional keyword search\n * - Full-text search across all content collections\n * - Advanced filtering (collections, dates, status, tags)\n * - Autocomplete suggestions\n * - Search analytics\n * - Dynamic collection discovery and indexing\n * \n * @example\n * ```typescript\n * import { AISearchService } from '@sonicjs-cms/core/plugins'\n * \n * const service = new AISearchService(db, aiSearch)\n * const results = await service.search({\n * query: 'blog posts about security',\n * mode: 'ai',\n * filters: { collections: [1, 2] }\n * })\n * ```\n */\n\nexport const aiSearchPlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('aiSearch', AISearchService)\n .addService('indexManager', IndexManager)\n .addRoute('/admin/plugins/ai-search', adminRoutes as any)\n .addRoute('/api/search', apiRoutes as any)\n .build()\n\n// Export services and types for easy import\nexport { AISearchService } from './services/ai-search'\nexport { IndexManager } from './services/indexer'\nexport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n IndexStatus,\n} from './types'\n","/**\n * Magic Link Authentication Plugin\n *\n * Provides passwordless authentication via email magic links\n * Users receive a secure one-time link to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\nimport type { Plugin, PluginContext } from '../../types'\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { AuthManager, getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst magicLinkRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nexport function createMagicLinkAuthPlugin(): Plugin {\n const magicLinkRoutes = new Hono()\n\n // Request a magic link\n magicLinkRoutes.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = magicLinkRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB as D1Database\n\n // Check rate limiting\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n const recentLinks = await db.prepare(`\n SELECT COUNT(*) as count\n FROM magic_links\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as any\n\n const rateLimitPerHour = 5 // TODO: Get from plugin settings\n if (recentLinks && recentLinks.count >= rateLimitPerHour) {\n return c.json({\n error: 'Too many requests. Please try again later.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && !allowNewUsers) {\n // Don't reveal if user exists or not for security\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.'\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Generate secure token\n const token = crypto.randomUUID() + '-' + crypto.randomUUID()\n const tokenId = crypto.randomUUID()\n const linkExpiryMinutes = 15 // TODO: Get from plugin settings\n const expiresAt = Date.now() + (linkExpiryMinutes * 60 * 1000)\n\n // Store magic link\n await db.prepare(`\n INSERT INTO magic_links (\n id, user_email, token, expires_at, used, created_at, ip_address, user_agent\n ) VALUES (?, ?, ?, ?, 0, ?, ?, ?)\n `).bind(\n tokenId,\n normalizedEmail,\n token,\n expiresAt,\n Date.now(),\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown',\n c.req.header('user-agent') || 'unknown'\n ).run()\n\n // Generate magic link URL\n const baseUrl = new URL(c.req.url).origin\n const magicLink = `${baseUrl}/auth/magic-link/verify?token=${token}`\n\n // Send email via email plugin\n try {\n const emailPlugin = c.env.plugins?.get('email')\n if (emailPlugin && emailPlugin.sendEmail) {\n await emailPlugin.sendEmail({\n to: normalizedEmail,\n subject: 'Your Magic Link to Sign In',\n html: renderMagicLinkEmail(magicLink, linkExpiryMinutes)\n })\n } else {\n console.error('Email plugin not available')\n // In production, this should fail. For now, log the link for testing\n console.log(`Magic link for ${normalizedEmail}: ${magicLink}`)\n }\n } catch (error) {\n console.error('Failed to send magic link email:', error)\n return c.json({\n error: 'Failed to send email. Please try again later.'\n }, 500)\n }\n\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.',\n // For development only - remove in production\n ...(c.env.ENVIRONMENT === 'development' && { dev_link: magicLink })\n })\n } catch (error) {\n console.error('Magic link request error:', error)\n return c.json({ error: 'Failed to process request' }, 500)\n }\n })\n\n // Verify magic link and sign in\n magicLinkRoutes.get('/verify', async (c: any) => {\n try {\n const token = c.req.query('token')\n\n if (!token) {\n return c.redirect('/auth/login?error=Invalid magic link')\n }\n\n const db = c.env.DB as D1Database\n\n // Find magic link\n const magicLink = await db.prepare(`\n SELECT * FROM magic_links\n WHERE token = ? AND used = 0\n `).bind(token).first() as any\n\n if (!magicLink) {\n return c.redirect('/auth/login?error=Invalid or expired magic link')\n }\n\n // Check expiration\n if (magicLink.expires_at < Date.now()) {\n return c.redirect('/auth/login?error=This magic link has expired')\n }\n\n // Get or create user\n let user = await db.prepare(`\n SELECT * FROM users WHERE email = ? AND is_active = 1\n `).bind(magicLink.user_email).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && allowNewUsers) {\n // Create new user\n const userId = crypto.randomUUID()\n const username = magicLink.user_email.split('@')[0]\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 1, ?, ?)\n `).bind(\n userId,\n magicLink.user_email,\n username,\n username,\n '',\n now,\n now\n ).run()\n\n user = {\n id: userId,\n email: magicLink.user_email,\n username,\n role: 'viewer'\n }\n } else if (!user) {\n return c.redirect('/auth/login?error=No account found for this email')\n }\n\n // Mark magic link as used\n await db.prepare(`\n UPDATE magic_links\n SET used = 1, used_at = ?\n WHERE id = ?\n `).bind(Date.now(), magicLink.id).run()\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwtToken = await AuthManager.generateToken(\n user.id,\n user.email,\n user.role,\n (c.env as any).JWT_SECRET,\n tokenTtl\n )\n\n // Set auth cookie\n AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl })\n\n // Update last login\n await db.prepare(`\n UPDATE users SET last_login_at = ? WHERE id = ?\n `).bind(Date.now(), user.id).run()\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?message=Successfully signed in')\n } catch (error) {\n console.error('Magic link verification error:', error)\n return c.redirect('/auth/login?error=Authentication failed')\n }\n })\n\n return {\n name: 'magic-link-auth',\n version: '1.0.0',\n description: 'Passwordless authentication via email magic links',\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n dependencies: ['email'],\n\n routes: [{\n path: '/auth/magic-link',\n handler: magicLinkRoutes,\n description: 'Magic link authentication endpoints',\n requiresAuth: false\n }],\n\n async install(context: PluginContext) {\n console.log('Installing magic-link-auth plugin...')\n // Migration is handled by plugin system\n },\n\n async activate(context: PluginContext) {\n console.log('Magic link authentication activated')\n console.log('Users can now sign in via /auth/magic-link/request')\n },\n\n async deactivate(context: PluginContext) {\n console.log('Magic link authentication deactivated')\n },\n\n async uninstall(context: PluginContext) {\n console.log('Uninstalling magic-link-auth plugin...')\n // Optionally clean up magic_links table\n // await context.db.prepare('DROP TABLE IF EXISTS magic_links').run()\n }\n }\n}\n\n/**\n * Render magic link email template\n */\nfunction renderMagicLinkEmail(magicLink: string, expiryMinutes: number): string {\n return `\n \n \n \n \n \n Your Magic Link\n \n \n \n
\n
\n

🔗 Your Magic Link

\n
\n\n
\n

Hello!

\n

You requested a magic link to sign in to your account. Click the button below to continue:

\n\n
\n Sign In\n
\n\n

⏰ This link expires in ${expiryMinutes} minutes

\n\n
\n Security Notice: If you didn't request this link, you can safely ignore this email.\n Someone may have entered your email address by mistake.\n
\n
\n\n
\n

This is an automated email from SonicJS.

\n

For security, this link can only be used once.

\n
\n
\n \n \n `\n}\n\nexport default createMagicLinkAuthPlugin()\n","export type SecurityEventType =\n | 'login_success'\n | 'login_failure'\n | 'registration'\n | 'password_reset_request'\n | 'password_reset_complete'\n | 'account_lockout'\n | 'suspicious_activity'\n | 'logout'\n | 'permission_denied'\n\nexport type SecuritySeverity = 'info' | 'warning' | 'critical'\n\nexport interface SecurityEvent {\n id: string\n eventType: SecurityEventType\n severity: SecuritySeverity\n userId?: string | null\n email?: string | null\n ipAddress?: string | null\n userAgent?: string | null\n countryCode?: string | null\n requestPath?: string | null\n requestMethod?: string | null\n details?: Record | null\n fingerprint?: string | null\n blocked: boolean\n createdAt: number\n}\n\nexport interface SecurityEventInsert {\n eventType: SecurityEventType\n severity?: SecuritySeverity\n userId?: string\n email?: string\n ipAddress?: string\n userAgent?: string\n countryCode?: string\n requestPath?: string\n requestMethod?: string\n details?: Record\n fingerprint?: string\n blocked?: boolean\n}\n\nexport interface SecurityEventFilters {\n eventType?: SecurityEventType | SecurityEventType[]\n severity?: SecuritySeverity | SecuritySeverity[]\n email?: string\n ipAddress?: string\n search?: string\n startDate?: number\n endDate?: number\n blocked?: boolean\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'event_type' | 'severity'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SecurityStats {\n totalEvents: number\n failedLogins24h: number\n failedLoginsTrend: number // percentage change vs prior 24h\n activeLockouts: number\n flaggedIPs: number\n eventsByType: Record\n eventsBySeverity: Record\n}\n\nexport interface TopIP {\n ipAddress: string\n countryCode: string | null\n failedAttempts: number\n lastSeen: number\n locked: boolean\n}\n\nexport interface HourlyBucket {\n hour: string\n count: number\n}\n\nexport interface SecurityAuditSettings {\n retention: {\n daysToKeep: number\n maxEvents: number\n autoPurge: boolean\n }\n bruteForce: {\n enabled: boolean\n maxFailedAttemptsPerIP: number\n maxFailedAttemptsPerEmail: number\n windowMinutes: number\n lockoutDurationMinutes: number\n alertThreshold: number\n }\n logging: {\n logSuccessfulLogins: boolean\n logLogouts: boolean\n logRegistrations: boolean\n logPasswordResets: boolean\n logPermissionDenied: boolean\n }\n}\n\nexport const DEFAULT_SETTINGS: SecurityAuditSettings = {\n retention: {\n daysToKeep: 90,\n maxEvents: 100000,\n autoPurge: true\n },\n bruteForce: {\n enabled: true,\n maxFailedAttemptsPerIP: 10,\n maxFailedAttemptsPerEmail: 5,\n windowMinutes: 15,\n lockoutDurationMinutes: 30,\n alertThreshold: 20\n },\n logging: {\n logSuccessfulLogins: true,\n logLogouts: true,\n logRegistrations: true,\n logPasswordResets: true,\n logPermissionDenied: true\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n SecurityEvent,\n SecurityEventInsert,\n SecurityEventFilters,\n SecurityStats,\n TopIP,\n HourlyBucket,\n SecurityAuditSettings\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nexport class SecurityAuditService {\n constructor(\n private db: D1Database,\n private settings: SecurityAuditSettings = DEFAULT_SETTINGS\n ) {}\n\n async logEvent(event: SecurityEventInsert): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO security_events (id, event_type, severity, user_id, email, ip_address, user_agent, country_code, request_path, request_method, details, fingerprint, blocked, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n event.eventType,\n event.severity || 'info',\n event.userId || null,\n event.email || null,\n event.ipAddress || null,\n event.userAgent || null,\n event.countryCode || null,\n event.requestPath || null,\n event.requestMethod || null,\n event.details ? JSON.stringify(event.details) : null,\n event.fingerprint || null,\n event.blocked ? 1 : 0,\n now\n ).run()\n\n return id\n }\n\n async getEvents(filters: SecurityEventFilters = {}): Promise<{ events: SecurityEvent[], total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.eventType) {\n if (Array.isArray(filters.eventType)) {\n conditions.push(`event_type IN (${filters.eventType.map(() => '?').join(',')})`)\n params.push(...filters.eventType)\n } else {\n conditions.push('event_type = ?')\n params.push(filters.eventType)\n }\n }\n\n if (filters.severity) {\n if (Array.isArray(filters.severity)) {\n conditions.push(`severity IN (${filters.severity.map(() => '?').join(',')})`)\n params.push(...filters.severity)\n } else {\n conditions.push('severity = ?')\n params.push(filters.severity)\n }\n }\n\n if (filters.email) {\n conditions.push('email LIKE ?')\n params.push(`%${filters.email}%`)\n }\n\n if (filters.ipAddress) {\n conditions.push('ip_address LIKE ?')\n params.push(`%${filters.ipAddress}%`)\n }\n\n if (filters.search) {\n conditions.push('(email LIKE ? OR ip_address LIKE ? OR details LIKE ?)')\n params.push(`%${filters.search}%`, `%${filters.search}%`, `%${filters.search}%`)\n }\n\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n if (filters.blocked !== undefined) {\n conditions.push('blocked = ?')\n params.push(filters.blocked ? 1 : 0)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const page = filters.page || 1\n const limit = filters.limit || 50\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM security_events ${where}`\n ).bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get page of results\n const results = await this.db.prepare(\n `SELECT * FROM security_events ${where} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...params, limit, offset).all()\n\n const events: SecurityEvent[] = (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n\n return { events, total }\n }\n\n async getEvent(id: string): Promise {\n const row = await this.db.prepare(\n 'SELECT * FROM security_events WHERE id = ?'\n ).bind(id).first()\n\n if (!row) return null\n\n return {\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }\n }\n\n async getStats(): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n const h48 = now - 48 * 60 * 60 * 1000\n\n // Total events\n const totalResult = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM security_events'\n ).first<{ count: number }>()\n\n // Failed logins last 24h\n const failed24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ?\"\n ).bind(h24).first<{ count: number }>()\n\n // Failed logins prior 24h (for trend)\n const failedPrior24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ? AND created_at < ?\"\n ).bind(h48, h24).first<{ count: number }>()\n\n const failed24h = failed24hResult?.count || 0\n const failedPrior24h = failedPrior24hResult?.count || 0\n const trend = failedPrior24h > 0\n ? Math.round(((failed24h - failedPrior24h) / failedPrior24h) * 100)\n : (failed24h > 0 ? 100 : 0)\n\n // Active lockouts (events in last lockout window)\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutsResult = await this.db.prepare(\n \"SELECT COUNT(DISTINCT ip_address) as count FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).first<{ count: number }>()\n\n // Flagged IPs (IPs with more than threshold failed attempts in window)\n const windowStart = now - (this.settings.bruteForce.windowMinutes * 60 * 1000)\n const flaggedResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM (\n SELECT ip_address FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address HAVING COUNT(*) >= ?\n )`\n ).bind(windowStart, this.settings.bruteForce.maxFailedAttemptsPerIP).first<{ count: number }>()\n\n // Events by type\n const typeResults = await this.db.prepare(\n 'SELECT event_type, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY event_type'\n ).bind(h24).all()\n\n const eventsByType: Record = {}\n for (const row of (typeResults.results || []) as any[]) {\n eventsByType[row.event_type] = row.count\n }\n\n // Events by severity\n const severityResults = await this.db.prepare(\n 'SELECT severity, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY severity'\n ).bind(h24).all()\n\n const eventsBySeverity: Record = {}\n for (const row of (severityResults.results || []) as any[]) {\n eventsBySeverity[row.severity] = row.count\n }\n\n return {\n totalEvents: totalResult?.count || 0,\n failedLogins24h: failed24h,\n failedLoginsTrend: trend,\n activeLockouts: lockoutsResult?.count || 0,\n flaggedIPs: flaggedResult?.count || 0,\n eventsByType,\n eventsBySeverity\n }\n }\n\n async getTopIPs(limit: number = 10): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n\n const results = await this.db.prepare(`\n SELECT\n ip_address,\n country_code,\n COUNT(*) as failed_attempts,\n MAX(created_at) as last_seen\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address\n ORDER BY failed_attempts DESC\n LIMIT ?\n `).bind(h24, limit).all()\n\n // Check which IPs are locked\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutResults = await this.db.prepare(\n \"SELECT DISTINCT ip_address FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).all()\n\n const lockedIPs = new Set((lockoutResults.results || []).map((r: any) => r.ip_address))\n\n return (results.results || []).map((row: any) => ({\n ipAddress: row.ip_address,\n countryCode: row.country_code,\n failedAttempts: row.failed_attempts,\n lastSeen: row.last_seen,\n locked: lockedIPs.has(row.ip_address)\n }))\n }\n\n async getHourlyTrend(hours: number = 24): Promise {\n const now = Date.now()\n const start = now - hours * 60 * 60 * 1000\n\n // Build hourly buckets\n const buckets: HourlyBucket[] = []\n for (let i = 0; i < hours; i++) {\n const bucketStart = start + i * 60 * 60 * 1000\n const date = new Date(bucketStart)\n buckets.push({\n hour: `${date.getUTCHours().toString().padStart(2, '0')}:00`,\n count: 0\n })\n }\n\n const results = await this.db.prepare(`\n SELECT\n CAST((created_at - ?) / 3600000 AS INTEGER) as bucket,\n COUNT(*) as count\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY bucket\n ORDER BY bucket\n `).bind(start, start).all()\n\n for (const row of (results.results || []) as any[]) {\n const idx = row.bucket\n if (idx >= 0 && idx < buckets.length) {\n buckets[idx]!.count = row.count\n }\n }\n\n return buckets\n }\n\n async purgeOldEvents(daysToKeep?: number): Promise {\n const days = daysToKeep || this.settings.retention.daysToKeep\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000\n\n const result = await this.db.prepare(\n 'DELETE FROM security_events WHERE created_at < ?'\n ).bind(cutoff).run()\n\n return (result.meta as any)?.changes || 0\n }\n\n async getRecentCriticalEvents(limit: number = 20): Promise {\n const results = await this.db.prepare(\n \"SELECT * FROM security_events WHERE severity = 'critical' ORDER BY created_at DESC LIMIT ?\"\n ).bind(limit).all()\n\n return (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n }\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityStats, TopIP, HourlyBucket, SecurityEvent } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecurityDashboardData {\n stats: SecurityStats\n topIPs: TopIP[]\n hourlyTrend: HourlyBucket[]\n recentCritical: SecurityEvent[]\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n const now = Date.now()\n const diff = now - ts\n\n if (diff < 60000) return 'just now'\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n return labels[type] || type\n}\n\nfunction trendArrow(trend: number): string {\n if (trend > 0) return `+${trend}%`\n if (trend < 0) return `${trend}%`\n return `0%`\n}\n\nfunction renderBarChart(data: HourlyBucket[]): string {\n if (data.length === 0) return '

No data available

'\n\n const max = Math.max(...data.map(d => d.count), 1)\n\n const bars = data.map(d => {\n const height = Math.max((d.count / max) * 100, 2)\n const color = d.count === 0\n ? 'bg-zinc-200 dark:bg-zinc-700'\n : d.count >= max * 0.75\n ? 'bg-red-500'\n : d.count >= max * 0.5\n ? 'bg-amber-500'\n : 'bg-cyan-500'\n return `\n
\n
\n \n
\n
\n 12 ? 'hidden sm:block' : ''}\">${d.hour}\n
\n `\n }).join('')\n\n return `
${bars}
`\n}\n\nexport function renderSecurityDashboard(data: SecurityDashboardData): string {\n const { stats, topIPs, hourlyTrend, recentCritical, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Dashboard

\n

\n Monitor login attempts, brute-force detection, and security events.\n

\n
\n \n
\n\n \n
\n
\n

Total Events

\n

${stats.totalEvents.toLocaleString()}

\n
\n
\n

Failed Logins (24h)

\n

\n ${stats.failedLogins24h}\n ${trendArrow(stats.failedLoginsTrend)}\n

\n
\n
\n

Active Lockouts

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${stats.activeLockouts}

\n
\n
\n

Flagged IPs

\n

0 ? 'text-amber-600 dark:text-amber-400' : 'text-zinc-950 dark:text-white'}\">${stats.flaggedIPs}

\n
\n
\n\n \n
\n \n
\n

Failed Login Attempts (24h)

\n ${renderBarChart(hourlyTrend)}\n
\n\n \n
\n

Events by Type (24h)

\n
\n ${Object.entries(stats.eventsByType).length === 0\n ? '

No events in the last 24 hours

'\n : Object.entries(stats.eventsByType)\n .sort(([, a], [, b]) => b - a)\n .map(([type, count]) => {\n const total = Object.values(stats.eventsByType).reduce((s, v) => s + v, 0)\n const pct = total > 0 ? Math.round((count / total) * 100) : 0\n return `\n
\n
\n ${eventTypeBadge(type)}\n ${count}\n
\n
\n
\n
\n
\n `\n }).join('')\n }\n
\n
\n
\n\n \n
\n \n
\n
\n

Top IPs by Failed Logins (24h)

\n
\n ${topIPs.length === 0\n ? '

No failed login attempts

'\n : `\n \n \n \n \n \n \n \n \n \n ${topIPs.map(ip => `\n \n \n \n \n \n \n `).join('')}\n \n
IP AddressCountryAttemptsStatus
${ip.ipAddress}${ip.countryCode || '-'}= 10 ? 'text-red-600 dark:text-red-400' : 'text-zinc-900 dark:text-zinc-100'}\">${ip.failedAttempts}\n ${ip.locked\n ? 'Locked'\n : 'Active'\n }\n
`\n }\n
\n\n \n
\n
\n

Recent Critical Events

\n
\n ${recentCritical.length === 0\n ? '

No critical events

'\n : `
\n ${recentCritical.slice(0, 10).map(event => `\n
\n
\n
\n ${severityBadge(event.severity)}\n ${eventTypeBadge(event.eventType)}\n
\n ${formatTimestamp(event.createdAt)}\n
\n
\n ${event.ipAddress ? `IP: ${event.ipAddress}` : ''}\n ${event.email ? ` | ${event.email}` : ''}\n
\n
\n `).join('')}\n
`\n }\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Dashboard',\n pageTitle: 'Security Dashboard',\n currentPath: '/admin/plugins/security-audit',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityEvent, SecurityEventFilters } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface EventLogPageData {\n events: SecurityEvent[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n }\n filters: SecurityEventFilters\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const colors: Record = {\n login_success: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400',\n login_failure: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n registration: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n account_lockout: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n suspicious_activity: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\n logout: 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400',\n password_reset_request: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n permission_denied: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400'\n }\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n const color = colors[type] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400'\n return `${labels[type] || type}`\n}\n\nfunction buildFilterUrl(filters: SecurityEventFilters, overrides: Record = {}): string {\n const params = new URLSearchParams()\n if (filters.eventType && !overrides.type) params.set('type', String(filters.eventType))\n if (filters.severity && !overrides.severity) params.set('severity', String(filters.severity))\n if (filters.email && !overrides.email) params.set('email', filters.email)\n if (filters.ipAddress && !overrides.ip) params.set('ip', filters.ipAddress)\n if (filters.search && !overrides.search) params.set('search', filters.search)\n\n for (const [key, value] of Object.entries(overrides)) {\n if (value) params.set(key, value)\n }\n\n const qs = params.toString()\n return `/admin/plugins/security-audit/events${qs ? '?' + qs : ''}`\n}\n\nexport function renderEventLogPage(data: EventLogPageData): string {\n const { events, pagination, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Event Log

\n

\n Browse and filter all security events. Showing ${pagination.startItem}-${pagination.endItem} of ${pagination.totalItems}.\n

\n
\n \n
\n\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n Clear\n \n
\n
\n
\n\n \n
\n ${events.length === 0\n ? `
\n \n \n \n

No events found

\n

No security events match your current filters.

\n
`\n : `
\n \n \n \n \n \n \n \n \n \n \n \n \n \n ${events.map(event => `\n \n \n \n \n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimeTypeSeverityEmailIP AddressCountryStatus
${formatTimestamp(event.createdAt)}${eventTypeBadge(event.eventType)}${severityBadge(event.severity)}${event.email || '-'}${event.ipAddress || '-'}${event.countryCode || '-'}\n ${event.blocked\n ? 'Blocked'\n : 'Allowed'\n }\n
\n
\n
Event ID: ${event.id.substring(0, 8)}...
\n
User Agent: ${event.userAgent || '-'}
\n
Path: ${event.requestPath || '-'}
\n
Fingerprint: ${event.fingerprint || '-'}
\n ${event.details ? `
Details:
${JSON.stringify(event.details, null, 2)}
` : ''}\n
\n
\n
`\n }\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n Page ${pagination.currentPage} of ${pagination.totalPages}\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : ''}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : ''}\n
\n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Event Log',\n pageTitle: 'Security Event Log',\n currentPath: '/admin/plugins/security-audit/events',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityAuditSettings } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecuritySettingsPageData {\n settings: SecurityAuditSettings\n user?: BaseUser\n version?: string\n message?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSecuritySettingsPage(data: SecuritySettingsPageData): string {\n const { settings, user, version, message, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Audit Settings

\n

\n Configure brute-force detection thresholds, event logging, and data retention.\n

\n
\n \n
\n\n ${message ? `\n
\n

${message}

\n
\n ` : ''}\n\n
\n\n \n
\n

Brute-Force Detection

\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n

Events above this count trigger critical severity

\n
\n
\n
\n\n \n
\n

Event Logging

\n
\n \n \n \n \n \n
\n
\n\n \n
\n

Data Retention

\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n\n \n
\n \n \n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Audit Settings',\n pageTitle: 'Security Audit Settings',\n currentPath: '/admin/plugins/security-audit/settings',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { PluginService } from '../../../../services'\nimport { renderSecurityDashboard, SecurityDashboardData } from '../components/dashboard-page'\nimport { renderEventLogPage, EventLogPageData } from '../components/event-log-page'\nimport { renderSecuritySettingsPage, SecuritySettingsPageData } from '../components/settings-page'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const [stats, topIPs, hourlyTrend, recentCritical] = await Promise.all([\n service.getStats(),\n service.getTopIPs(10),\n service.getHourlyTrend(24),\n service.getRecentCriticalEvents(20)\n ])\n\n const pageData: SecurityDashboardData = {\n stats,\n topIPs,\n hourlyTrend,\n recentCritical,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecurityDashboard(pageData))\n})\n\n// Event log\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n\n const filters = {\n eventType: (c.req.query('type') as SecurityEventType) || undefined,\n severity: (c.req.query('severity') as SecuritySeverity) || undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n page,\n limit\n }\n\n const { events, total } = await service.getEvents(filters)\n const totalPages = Math.ceil(total / limit)\n\n const pageData: EventLogPageData = {\n events,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: total === 0 ? 0 : (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total)\n },\n filters,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderEventLogPage(pageData))\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const pageData: SecuritySettingsPageData = {\n settings,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n message: c.req.query('message') || undefined,\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecuritySettingsPage(pageData))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const settings: SecurityAuditSettings = {\n bruteForce: {\n enabled: body['bruteForce.enabled'] === 'true',\n maxFailedAttemptsPerIP: parseInt(body['bruteForce.maxFailedAttemptsPerIP'] as string) || 10,\n maxFailedAttemptsPerEmail: parseInt(body['bruteForce.maxFailedAttemptsPerEmail'] as string) || 5,\n windowMinutes: parseInt(body['bruteForce.windowMinutes'] as string) || 15,\n lockoutDurationMinutes: parseInt(body['bruteForce.lockoutDurationMinutes'] as string) || 30,\n alertThreshold: parseInt(body['bruteForce.alertThreshold'] as string) || 20\n },\n logging: {\n logSuccessfulLogins: body['logging.logSuccessfulLogins'] === 'true',\n logLogouts: body['logging.logLogouts'] === 'true',\n logRegistrations: body['logging.logRegistrations'] === 'true',\n logPasswordResets: body['logging.logPasswordResets'] === 'true',\n logPermissionDenied: body['logging.logPermissionDenied'] === 'true'\n },\n retention: {\n daysToKeep: parseInt(body['retention.daysToKeep'] as string) || 90,\n maxEvents: parseInt(body['retention.maxEvents'] as string) || 100000,\n autoPurge: body['retention.autoPurge'] === 'true'\n }\n }\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings('security-audit', settings)\n\n // For HTMX requests, return 200\n if (c.req.header('HX-Request')) {\n return c.json({ success: true })\n }\n\n return c.redirect('/admin/plugins/security-audit/settings?message=Settings saved successfully')\n})\n\nexport { adminRoutes as securityAuditAdminRoutes }\n","import type { KVNamespace } from '@cloudflare/workers-types'\nimport type { SecurityAuditSettings } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst KV_PREFIX = 'security:bf:'\nconst LOCK_PREFIX = 'security:locked:'\n\nexport class BruteForceDetector {\n private settings: SecurityAuditSettings['bruteForce']\n\n constructor(\n private kv: KVNamespace,\n settings?: SecurityAuditSettings['bruteForce']\n ) {\n this.settings = settings || DEFAULT_SETTINGS.bruteForce\n }\n\n async recordFailedAttempt(ip: string, email: string): Promise<{\n ipCount: number\n emailCount: number\n shouldLockIP: boolean\n shouldLockEmail: boolean\n isSuspicious: boolean\n }> {\n if (!this.settings.enabled || !this.kv) {\n return { ipCount: 0, emailCount: 0, shouldLockIP: false, shouldLockEmail: false, isSuspicious: false }\n }\n\n const now = Date.now()\n const windowMs = this.settings.windowMinutes * 60 * 1000\n\n // Increment IP counter\n const ipKey = `${KV_PREFIX}ip:${ip}`\n const ipCount = await this.incrementCounter(ipKey, windowMs)\n\n // Increment email counter\n const emailKey = `${KV_PREFIX}email:${email}`\n const emailCount = await this.incrementCounter(emailKey, windowMs)\n\n // Check for multi-email from single IP (suspicious)\n const ipEmailsKey = `${KV_PREFIX}ip-emails:${ip}`\n await this.addToSet(ipEmailsKey, email, windowMs)\n const emailsFromIP = await this.getSetSize(ipEmailsKey)\n const isSuspicious = emailsFromIP >= 5\n\n const shouldLockIP = ipCount >= this.settings.maxFailedAttemptsPerIP\n const shouldLockEmail = emailCount >= this.settings.maxFailedAttemptsPerEmail\n\n return { ipCount, emailCount, shouldLockIP, shouldLockEmail, isSuspicious }\n }\n\n async isLocked(ip: string, email: string): Promise<{ locked: boolean, reason?: string }> {\n if (!this.settings.enabled || !this.kv) {\n return { locked: false }\n }\n\n const ipLocked = await this.kv.get(`${LOCK_PREFIX}ip:${ip}`)\n if (ipLocked) {\n return { locked: true, reason: 'IP address temporarily locked due to excessive failed login attempts' }\n }\n\n const emailLocked = await this.kv.get(`${LOCK_PREFIX}email:${email}`)\n if (emailLocked) {\n return { locked: true, reason: 'Account temporarily locked due to excessive failed login attempts' }\n }\n\n return { locked: false }\n }\n\n async lockIP(ip: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}ip:${ip}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_ip'\n }), { expirationTtl: ttl })\n }\n\n async lockEmail(email: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}email:${email}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_email'\n }), { expirationTtl: ttl })\n }\n\n async unlockIP(ip: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}ip:${ip}`)\n }\n\n async unlockEmail(email: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}email:${email}`)\n }\n\n async getActiveLockouts(): Promise> {\n if (!this.kv) return []\n // KV list with prefix to find all active lockouts\n const ipLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}ip:` })\n const emailLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}email:` })\n\n const lockouts: Array<{ key: string, type: 'ip' | 'email', value: string, lockedAt: number }> = []\n\n for (const key of ipLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'ip',\n value: key.name.replace(`${LOCK_PREFIX}ip:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n for (const key of emailLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'email',\n value: key.name.replace(`${LOCK_PREFIX}email:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n return lockouts\n }\n\n async releaseLockout(key: string): Promise {\n if (!this.kv) return\n await this.kv.delete(key)\n }\n\n isAboveAlertThreshold(count: number): boolean {\n return count >= this.settings.alertThreshold\n }\n\n private async incrementCounter(key: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n const now = Date.now()\n\n let entries: number[] = []\n if (existing) {\n try {\n entries = JSON.parse(existing)\n } catch {\n entries = []\n }\n }\n\n // Remove expired entries\n const cutoff = now - windowMs\n entries = entries.filter(ts => ts > cutoff)\n\n // Add new entry\n entries.push(now)\n\n // Store with TTL equal to window\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(entries), { expirationTtl: ttlSeconds })\n\n return entries.length\n }\n\n private async addToSet(key: string, value: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n let set: Record = {}\n const now = Date.now()\n const cutoff = now - windowMs\n\n if (existing) {\n try {\n set = JSON.parse(existing)\n } catch {\n set = {}\n }\n }\n\n // Remove expired entries\n for (const [k, ts] of Object.entries(set)) {\n if (ts < cutoff) delete set[k]\n }\n\n set[value] = now\n\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(set), { expirationTtl: ttlSeconds })\n }\n\n private async getSetSize(key: string): Promise {\n const existing = await this.kv.get(key)\n if (!existing) return 0\n\n try {\n const set = JSON.parse(existing)\n return Object.keys(set).length\n } catch {\n return 0\n }\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventFilters, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\napiRoutes.use('*', requireAuth())\n\n// Check admin role\napiRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// GET /api/security-audit/events\napiRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? Math.min(parseInt(c.req.query('limit')!), 100) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await service.getEvents(filters)\n return c.json(result)\n})\n\n// GET /api/security-audit/events/:id\napiRoutes.get('/events/:id', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const event = await service.getEvent(c.req.param('id'))\n\n if (!event) {\n return c.json({ error: 'Event not found' }, 404)\n }\n\n return c.json(event)\n})\n\n// GET /api/security-audit/stats\napiRoutes.get('/stats', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const stats = await service.getStats()\n return c.json(stats)\n})\n\n// GET /api/security-audit/stats/ips\napiRoutes.get('/stats/ips', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const limit = c.req.query('limit') ? parseInt(c.req.query('limit')!) : 10\n const ips = await service.getTopIPs(limit)\n return c.json(ips)\n})\n\n// GET /api/security-audit/stats/trend\napiRoutes.get('/stats/trend', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const hours = c.req.query('hours') ? parseInt(c.req.query('hours')!) : 24\n const trend = await service.getHourlyTrend(hours)\n return c.json(trend)\n})\n\n// GET /api/security-audit/lockouts\napiRoutes.get('/lockouts', async (c) => {\n const kv = c.env.CACHE_KV\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n const lockouts = await detector.getActiveLockouts()\n return c.json(lockouts)\n})\n\n// DELETE /api/security-audit/lockouts/:key\napiRoutes.delete('/lockouts/:key', async (c) => {\n const kv = c.env.CACHE_KV\n const key = decodeURIComponent(c.req.param('key'))\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n await detector.releaseLockout(key)\n return c.json({ success: true })\n})\n\n// POST /api/security-audit/events/purge\napiRoutes.post('/events/purge', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const body = await c.req.json().catch(() => ({})) as { daysToKeep?: number }\n const deleted = await service.purgeOldEvents(body.daysToKeep)\n return c.json({ success: true, deleted })\n})\n\n// GET /api/security-audit/export\napiRoutes.get('/export', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const format = c.req.query('format') || 'json'\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n limit: 10000,\n page: 1\n }\n\n const { events } = await service.getEvents(filters)\n\n if (format === 'csv') {\n const headers = ['id', 'event_type', 'severity', 'email', 'ip_address', 'country_code', 'blocked', 'created_at']\n const csvRows = [headers.join(',')]\n for (const event of events) {\n csvRows.push([\n event.id,\n event.eventType,\n event.severity,\n event.email || '',\n event.ipAddress || '',\n event.countryCode || '',\n event.blocked ? '1' : '0',\n new Date(event.createdAt).toISOString()\n ].map(v => `\"${String(v).replace(/\"/g, '\"\"')}\"`).join(','))\n }\n\n return new Response(csvRows.join('\\n'), {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"security-events-${Date.now()}.csv\"`\n }\n })\n }\n\n return c.json(events)\n})\n\nexport { apiRoutes as securityAuditApiRoutes }\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../../../../app'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { SecurityAuditSettings, SecurityEventType } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nfunction extractRequestInfo(c: Context<{ Bindings: Bindings; Variables: Variables }>) {\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n const countryCode = c.req.header('cf-ipcountry') || null\n const path = new URL(c.req.url).pathname\n const method = c.req.method\n\n return { ip, userAgent, countryCode, path, method }\n}\n\nfunction generateFingerprint(ip: string, userAgent: string): string {\n // Simple fingerprint from IP + UA - using a basic hash\n const str = `${ip}:${userAgent}`\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash |= 0\n }\n return Math.abs(hash).toString(36)\n}\n\nasync function getPluginSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch {\n // Plugin not installed or DB not ready\n }\n return DEFAULT_SETTINGS\n}\n\nasync function isPluginActive(db: any): Promise {\n try {\n const result = await db.prepare(\n \"SELECT status FROM plugins WHERE id = 'security-audit'\"\n ).first() as { status: string } | null\n return result?.status === 'active'\n } catch {\n return false\n }\n}\n\nexport function securityAuditMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n\n // Only intercept auth-related routes\n if (!path.startsWith('/auth/')) {\n return next()\n }\n\n const db = c.env.DB\n\n // Check if plugin is active\n if (!await isPluginActive(db)) {\n return next()\n }\n\n const settings = await getPluginSettings(db)\n const { ip, userAgent, countryCode, method } = extractRequestInfo(c)\n const fingerprint = generateFingerprint(ip, userAgent)\n\n // For login POST, extract email and check lockout before proceeding\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n let preExtractedEmail = ''\n\n if (isLoginPost) {\n try {\n if (path === '/auth/login/form') {\n // Form-based login: clone request to read formData without consuming it\n const clonedReq = c.req.raw.clone()\n const formData = await clonedReq.formData()\n preExtractedEmail = (formData.get('email') as string || '').toLowerCase()\n } else {\n // JSON login: Hono caches parsed JSON so this is safe\n const body = await c.req.json()\n preExtractedEmail = body?.email?.toLowerCase() || ''\n }\n } catch {\n // Can't parse body, continue\n }\n\n if (preExtractedEmail && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const lockStatus = await detector.isLocked(ip, preExtractedEmail)\n\n if (lockStatus.locked) {\n const service = new SecurityAuditService(db, settings)\n // Log the blocked attempt asynchronously\n const logPromise = service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: preExtractedEmail,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n blocked: true,\n details: { reason: lockStatus.reason }\n })\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n\n return c.json({\n error: lockStatus.reason || 'Too many failed attempts. Please try again later.'\n }, 429)\n }\n }\n }\n\n // Proceed with the request\n await next()\n\n // After response, log the event asynchronously\n const logPromise = logAuthEvent(c, db, settings, ip, userAgent, countryCode, fingerprint, path, method, preExtractedEmail)\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n }\n}\n\nasync function logAuthEvent(\n c: Context<{ Bindings: Bindings; Variables: Variables }>,\n db: any,\n settings: SecurityAuditSettings,\n ip: string,\n userAgent: string,\n countryCode: string | null,\n fingerprint: string,\n path: string,\n method: string,\n preExtractedEmail: string = ''\n): Promise {\n try {\n const service = new SecurityAuditService(db, settings)\n const status = c.res.status\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n const isFormLogin = path === '/auth/login/form'\n\n // Login POST\n if (isLoginPost) {\n // Determine if login succeeded or failed.\n // JSON login: 200 = success, 401/400 = failure\n // Form login: always returns 200 — check if response set an auth cookie (HX-Redirect header indicates success)\n let loginSucceeded: boolean\n if (isFormLogin) {\n // Form login redirects to /admin on success via HX-Redirect header or meta refresh\n const hxRedirect = c.res.headers.get('HX-Redirect')\n const setCookieHeader = c.res.headers.get('set-cookie') || ''\n loginSucceeded = !!(hxRedirect?.includes('/admin') || setCookieHeader.includes('auth_token'))\n } else {\n loginSucceeded = status === 200\n }\n\n if (loginSucceeded) {\n if (!settings.logging.logSuccessfulLogins) return\n\n // Try to get user info from response\n let email = preExtractedEmail\n let userId = ''\n if (!isFormLogin) {\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || email\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n }\n\n await service.logEvent({\n eventType: 'login_success',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n } else {\n // Failed login — use pre-extracted email since body is already consumed\n const email = preExtractedEmail\n\n await service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { statusCode: status }\n })\n\n // Record failed attempt for brute-force detection\n if (email && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const result = await detector.recordFailedAttempt(ip, email)\n\n if (result.shouldLockIP) {\n await detector.lockIP(ip)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_ip', attemptCount: result.ipCount }\n })\n }\n\n if (result.shouldLockEmail) {\n await detector.lockEmail(email)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_email', attemptCount: result.emailCount }\n })\n }\n\n if (result.isSuspicious) {\n await service.logEvent({\n eventType: 'suspicious_activity',\n severity: 'critical',\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'multiple_emails_from_ip', ipCount: result.ipCount }\n })\n }\n }\n }\n }\n\n // Registration POST\n if (path === '/auth/register' && method === 'POST' && settings.logging.logRegistrations) {\n if (status === 201 || status === 200) {\n let email = ''\n let userId = ''\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || ''\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n\n await service.logEvent({\n eventType: 'registration',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n }\n\n // Logout\n if (path === '/auth/logout' && settings.logging.logLogouts) {\n const user = c.get('user')\n await service.logEvent({\n eventType: 'logout',\n severity: 'info',\n userId: user?.userId,\n email: user?.email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n } catch (error) {\n console.error('[SecurityAudit] Error logging auth event:', error)\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { securityAuditAdminRoutes } from './routes/admin'\nimport { securityAuditApiRoutes } from './routes/api'\nimport { securityAuditMiddleware } from './middleware/audit-middleware'\n\nexport function createSecurityAuditPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'security-audit',\n version: '1.0.0-beta.1',\n description: 'Security event logging, brute-force detection, and analytics dashboard'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard and event log routes\n builder.addRoute('/admin/plugins/security-audit', securityAuditAdminRoutes as any, {\n description: 'Security audit dashboard and admin pages',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes\n builder.addRoute('/api/security-audit', securityAuditApiRoutes as any, {\n description: 'Security audit API endpoints',\n requiresAuth: true,\n priority: 50\n })\n\n // Admin menu item — icon is raw SVG to match sidebar rendering\n builder.addMenuItem('Security', '/admin/plugins/security-audit', {\n icon: ``,\n order: 85\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async (context) => {\n console.log('[SecurityAudit] Plugin installed')\n },\n activate: async (context) => {\n console.log('[SecurityAudit] Plugin activated')\n },\n deactivate: async (context) => {\n console.log('[SecurityAudit] Plugin deactivated')\n },\n uninstall: async (context) => {\n console.log('[SecurityAudit] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const securityAuditPlugin = createSecurityAuditPlugin()\nexport { SecurityAuditService } from './services/security-audit-service'\nexport { BruteForceDetector } from './services/brute-force-detector'\nexport { securityAuditMiddleware } from './middleware/audit-middleware'\nexport default securityAuditPlugin\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n Subscription,\n SubscriptionInsert,\n SubscriptionFilters,\n SubscriptionStats,\n SubscriptionStatus\n} from '../types'\n\n/**\n * Manages subscription records in D1\n */\nexport class SubscriptionService {\n constructor(private db: D1Database) {}\n\n /**\n * Ensure the subscriptions table exists\n */\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS subscriptions (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n user_id TEXT NOT NULL,\n stripe_customer_id TEXT NOT NULL,\n stripe_subscription_id TEXT NOT NULL UNIQUE,\n stripe_price_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'incomplete',\n current_period_start INTEGER NOT NULL DEFAULT 0,\n current_period_end INTEGER NOT NULL DEFAULT 0,\n cancel_at_period_end INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\n )\n `).run()\n\n // Indexes for common lookups\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_user_id ON subscriptions(user_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_customer_id ON subscriptions(stripe_customer_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_subscription_id ON subscriptions(stripe_subscription_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_status ON subscriptions(status)\n `).run()\n }\n\n /**\n * Create a new subscription record\n */\n async create(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Upsert a subscription by stripe_subscription_id (INSERT or UPDATE on conflict)\n */\n async upsert(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_subscription_id) DO UPDATE SET\n status = excluded.status,\n stripe_price_id = excluded.stripe_price_id,\n current_period_start = excluded.current_period_start,\n current_period_end = excluded.current_period_end,\n cancel_at_period_end = excluded.cancel_at_period_end,\n updated_at = unixepoch()\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Update a subscription by its Stripe subscription ID\n */\n async updateByStripeId(stripeSubscriptionId: string, data: Partial): Promise {\n const sets: string[] = []\n const values: any[] = []\n\n if (data.status !== undefined) {\n sets.push('status = ?')\n values.push(data.status)\n }\n if (data.stripePriceId !== undefined) {\n sets.push('stripe_price_id = ?')\n values.push(data.stripePriceId)\n }\n if (data.currentPeriodStart !== undefined) {\n sets.push('current_period_start = ?')\n values.push(data.currentPeriodStart)\n }\n if (data.currentPeriodEnd !== undefined) {\n sets.push('current_period_end = ?')\n values.push(data.currentPeriodEnd)\n }\n if (data.cancelAtPeriodEnd !== undefined) {\n sets.push('cancel_at_period_end = ?')\n values.push(data.cancelAtPeriodEnd ? 1 : 0)\n }\n\n if (sets.length === 0) return this.getByStripeSubscriptionId(stripeSubscriptionId)\n\n sets.push('updated_at = unixepoch()')\n values.push(stripeSubscriptionId)\n\n const result = await this.db.prepare(`\n UPDATE subscriptions SET ${sets.join(', ')} WHERE stripe_subscription_id = ? RETURNING *\n `).bind(...values).first()\n\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe subscription ID\n */\n async getByStripeSubscriptionId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get the active subscription for a user\n */\n async getByUserId(userId: string): Promise {\n const result = await this.db.prepare(\n \"SELECT * FROM subscriptions WHERE user_id = ? ORDER BY CASE WHEN status = 'active' THEN 0 WHEN status = 'trialing' THEN 1 ELSE 2 END, updated_at DESC LIMIT 1\"\n ).bind(userId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe customer ID\n */\n async getByStripeCustomerId(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_customer_id = ? ORDER BY updated_at DESC LIMIT 1'\n ).bind(stripeCustomerId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Find the userId linked to a Stripe customer ID\n */\n async getUserIdByStripeCustomer(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT user_id FROM subscriptions WHERE stripe_customer_id = ? LIMIT 1'\n ).bind(stripeCustomerId).first() as { user_id: string } | null\n return result?.user_id ?? null\n }\n\n /**\n * List subscriptions with filters and pagination\n */\n async list(filters: SubscriptionFilters = {}): Promise<{ subscriptions: Subscription[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.userId) {\n where.push('user_id = ?')\n values.push(filters.userId)\n }\n if (filters.stripeCustomerId) {\n where.push('stripe_customer_id = ?')\n values.push(filters.stripeCustomerId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM subscriptions ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n // Get paginated results\n const results = await this.db.prepare(\n `SELECT s.*, u.email as user_email FROM subscriptions s LEFT JOIN users u ON s.user_id = u.id ${whereClause} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n subscriptions: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n /**\n * Get subscription stats\n */\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\n SUM(CASE WHEN status = 'canceled' THEN 1 ELSE 0 END) as canceled,\n SUM(CASE WHEN status = 'past_due' THEN 1 ELSE 0 END) as past_due,\n SUM(CASE WHEN status = 'trialing' THEN 1 ELSE 0 END) as trialing\n FROM subscriptions\n `).first() as any\n\n return {\n total: result?.total || 0,\n active: result?.active || 0,\n canceled: result?.canceled || 0,\n pastDue: result?.past_due || 0,\n trialing: result?.trialing || 0\n }\n }\n\n /**\n * Delete a subscription record by Stripe subscription ID\n */\n async deleteByStripeId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'DELETE FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).run()\n return (result.meta?.changes || 0) > 0\n }\n\n private mapRow(row: Record): Subscription {\n return {\n id: row.id,\n userId: row.user_id,\n stripeCustomerId: row.stripe_customer_id,\n stripeSubscriptionId: row.stripe_subscription_id,\n stripePriceId: row.stripe_price_id,\n status: row.status as SubscriptionStatus,\n currentPeriodStart: row.current_period_start,\n currentPeriodEnd: row.current_period_end,\n cancelAtPeriodEnd: !!row.cancel_at_period_end,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n // Attach email if joined\n ...(row.user_email ? { userEmail: row.user_email } : {})\n } as Subscription\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { StripeEventRecord, StripeEventFilters, StripeEventStats } from '../types'\n\n/**\n * Manages Stripe event log records in D1\n */\nexport class StripeEventService {\n constructor(private db: D1Database) {}\n\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS stripe_events (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n stripe_event_id TEXT NOT NULL UNIQUE,\n type TEXT NOT NULL,\n object_id TEXT NOT NULL DEFAULT '',\n object_type TEXT NOT NULL DEFAULT '',\n data TEXT NOT NULL DEFAULT '{}',\n processed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n status TEXT NOT NULL DEFAULT 'processed',\n error TEXT\n )\n `).run()\n\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_type ON stripe_events(type)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_status ON stripe_events(status)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_processed_at ON stripe_events(processed_at DESC)\n `).run()\n }\n\n async log(event: {\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: Record\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n }): Promise {\n await this.db.prepare(`\n INSERT INTO stripe_events (stripe_event_id, type, object_id, object_type, data, status, error)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_event_id) DO UPDATE SET\n status = excluded.status,\n error = excluded.error,\n processed_at = unixepoch()\n `).bind(\n event.stripeEventId,\n event.type,\n event.objectId,\n event.objectType,\n JSON.stringify(event.data),\n event.status,\n event.error || null\n ).run()\n }\n\n async list(filters: StripeEventFilters = {}): Promise<{ events: StripeEventRecord[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.type) {\n where.push('type = ?')\n values.push(filters.type)\n }\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.objectId) {\n where.push('object_id = ?')\n values.push(filters.objectId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM stripe_events ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n const results = await this.db.prepare(\n `SELECT * FROM stripe_events ${whereClause} ORDER BY processed_at DESC LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n events: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'processed' THEN 1 ELSE 0 END) as processed,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'ignored' THEN 1 ELSE 0 END) as ignored\n FROM stripe_events\n `).first() as any\n\n return {\n total: result?.total || 0,\n processed: result?.processed || 0,\n failed: result?.failed || 0,\n ignored: result?.ignored || 0\n }\n }\n\n async getDistinctTypes(): Promise {\n const results = await this.db.prepare(\n 'SELECT DISTINCT type FROM stripe_events ORDER BY type'\n ).all()\n return (results.results || []).map((r: any) => r.type)\n }\n\n private mapRow(row: Record): StripeEventRecord {\n return {\n id: row.id,\n stripeEventId: row.stripe_event_id,\n type: row.type,\n objectId: row.object_id,\n objectType: row.object_type,\n data: row.data,\n processedAt: row.processed_at,\n status: row.status,\n error: row.error || undefined\n }\n }\n}\n","import type { Subscription, SubscriptionStats, SubscriptionStatus } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface StripePageData {\n subscriptions: (Subscription & { userEmail?: string })[]\n stats: SubscriptionStats\n filters: { status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSubscriptionsPage(data: StripePageData): string {\n const { subscriptions, stats, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Manage subscriptions, view billing status, and monitor payment events.\n

\n
\n
\n \n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe')}\n\n \n
\n ${statsCard('Total', stats.total, 'text-zinc-950 dark:text-white')}\n ${statsCard('Active', stats.active, 'text-emerald-600 dark:text-emerald-400')}\n ${statsCard('Trialing', stats.trialing, 'text-blue-600 dark:text-blue-400')}\n ${statsCard('Past Due', stats.pastDue, 'text-amber-600 dark:text-amber-400')}\n ${statsCard('Canceled', stats.canceled, 'text-red-600 dark:text-red-400')}\n
\n\n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${subscriptions.length === 0\n ? ''\n : subscriptions.map(renderRow).join('')\n }\n \n
UserStatusPrice IDCurrent PeriodCancel at EndStripe
No subscriptions found
\n\n ${renderPagination(filters.page, filters.totalPages, filters.status)}\n
\n\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Subscriptions',\n pageTitle: 'Stripe Subscriptions',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction statsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction statusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.replace('_', ' ').replace(/\\b\\w/g, c => c.toUpperCase())\n return ``\n}\n\nfunction statusBadge(status: SubscriptionStatus): string {\n const colors: Record = {\n active: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n trialing: 'bg-blue-400/10 text-blue-500 dark:text-blue-400 ring-blue-400/20',\n past_due: 'bg-amber-400/10 text-amber-500 dark:text-amber-400 ring-amber-400/20',\n canceled: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n unpaid: 'bg-orange-400/10 text-orange-500 dark:text-orange-400 ring-orange-400/20',\n paused: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete_expired: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n const label = status.replace('_', ' ')\n return `${label}`\n}\n\nfunction formatDate(timestamp: number): string {\n if (!timestamp) return '-'\n return new Date(timestamp * 1000).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })\n}\n\nfunction renderRow(sub: Subscription & { userEmail?: string }): string {\n return `\n \n \n
${sub.userEmail || sub.userId}
\n
${sub.stripeCustomerId}
\n \n ${statusBadge(sub.status)}\n ${sub.stripePriceId}\n \n ${formatDate(sub.currentPeriodStart)} - ${formatDate(sub.currentPeriodEnd)}\n \n \n ${sub.cancelAtPeriodEnd\n ? 'Yes'\n : 'No'\n }\n \n \n \n View in Stripe\n \n \n \n `\n}\n\nfunction renderPagination(page: number, totalPages: number, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params = status ? `&status=${status}` : ''\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","/**\n * Shared tab bar for all Stripe admin pages.\n */\n\nconst TABS = [\n { label: 'Subscriptions', path: '/admin/plugins/stripe' },\n { label: 'Events', path: '/admin/plugins/stripe/events' },\n { label: 'Settings', path: '/admin/plugins/stripe/settings' },\n]\n\nexport function renderStripeTabBar(currentPath: string): string {\n const tabs = TABS.map(tab => {\n const isActive = currentPath === tab.path\n || (tab.path === '/admin/plugins/stripe' && currentPath === '/admin/plugins/stripe/')\n return `\n \n ${tab.label}\n `\n }).join('')\n\n return `\n
\n \n
\n `\n}\n","import type { StripeEventRecord, StripeEventStats } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface EventsPageData {\n events: StripeEventRecord[]\n stats: StripeEventStats\n types: string[]\n filters: { type?: string; status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderEventsPage(data: EventsPageData): string {\n const { events, stats, types, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Webhook event log showing all processed, failed, and ignored Stripe events.\n

\n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/events')}\n\n \n
\n ${eventStatsCard('Total Events', stats.total, 'text-zinc-950 dark:text-white')}\n ${eventStatsCard('Processed', stats.processed, 'text-emerald-600 dark:text-emerald-400')}\n ${eventStatsCard('Failed', stats.failed, 'text-red-600 dark:text-red-400')}\n ${eventStatsCard('Ignored', stats.ignored, 'text-zinc-500 dark:text-zinc-400')}\n
\n\n \n
\n
\n \n \n\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n ${events.length === 0\n ? ''\n : events.map(renderEventRow).join('')\n }\n \n
TimeTypeObject / UserStatusEvent ID
No events recorded yet
\n\n ${renderEventPagination(filters.page, filters.totalPages, filters.type, filters.status)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Events',\n pageTitle: 'Stripe Events',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction eventStatsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction eventStatusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.charAt(0).toUpperCase() + value.slice(1)\n return ``\n}\n\nfunction eventStatusBadge(status: string): string {\n const colors: Record = {\n processed: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n failed: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n ignored: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n return `${status}`\n}\n\nfunction formatTimestamp(timestamp: number): string {\n if (!timestamp) return '-'\n const d = new Date(timestamp * 1000)\n return d.toLocaleString('en-US', {\n month: 'short', day: 'numeric', year: 'numeric',\n hour: '2-digit', minute: '2-digit', second: '2-digit'\n })\n}\n\nfunction extractUserInfo(event: StripeEventRecord): { userId?: string; email?: string } {\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n const userId = data?.metadata?.sonicjs_user_id || data?.sonicjs_user_id\n const email = data?.customer_email || data?.customerEmail || data?.receipt_email\n return { userId: userId || undefined, email: email || undefined }\n } catch {\n return {}\n }\n}\n\nfunction renderEventRow(event: StripeEventRecord): string {\n const errorTooltip = event.error ? ` title=\"${event.error.replace(/\"/g, '"')}\"` : ''\n const userInfo = extractUserInfo(event)\n const userLink = userInfo.userId\n ? `${userInfo.email || userInfo.userId}`\n : userInfo.email\n ? `${userInfo.email}`\n : ''\n\n return `\n \n \n ${formatTimestamp(event.processedAt)}\n \n \n ${event.type}\n \n \n
${event.objectId || '-'}
\n
${event.objectType}
\n ${userLink ? `
${userLink}
` : ''}\n \n ${eventStatusBadge(event.status)}\n ${event.stripeEventId}\n \n `\n}\n\nfunction renderEventPagination(page: number, totalPages: number, type?: string, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params: string[] = []\n if (type) params.push(`type=${type}`)\n if (status) params.push(`status=${status}`)\n const extra = params.length > 0 ? `&${params.join('&')}` : ''\n\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","// ============================================================================\n// Stripe Plugin Types\n// ============================================================================\n\nexport type SubscriptionStatus =\n | 'active'\n | 'canceled'\n | 'past_due'\n | 'trialing'\n | 'unpaid'\n | 'paused'\n | 'incomplete'\n | 'incomplete_expired'\n\nexport interface Subscription {\n id: string\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd: boolean\n createdAt: number\n updatedAt: number\n}\n\nexport interface SubscriptionInsert {\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd?: boolean\n}\n\nexport interface SubscriptionFilters {\n status?: SubscriptionStatus\n userId?: string\n stripeCustomerId?: string\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'updated_at' | 'status'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SubscriptionStats {\n total: number\n active: number\n canceled: number\n pastDue: number\n trialing: number\n}\n\nexport interface StripePluginSettings {\n stripePublishableKey: string\n stripeSecretKey: string\n stripeWebhookSecret: string\n stripePriceId?: string\n successUrl: string\n cancelUrl: string\n}\n\nexport const DEFAULT_SETTINGS: StripePluginSettings = {\n stripePublishableKey: '',\n stripeSecretKey: '',\n stripeWebhookSecret: '',\n stripePriceId: '',\n successUrl: '/admin/dashboard',\n cancelUrl: '/admin/dashboard'\n}\n\n// Stripe webhook event types we handle\nexport type StripeWebhookEventType =\n | 'customer.subscription.created'\n | 'customer.subscription.updated'\n | 'customer.subscription.deleted'\n | 'checkout.session.completed'\n | 'invoice.payment_succeeded'\n | 'invoice.payment_failed'\n\n// Minimal Stripe types (we use fetch, not the SDK)\nexport interface StripeEvent {\n id: string\n type: string\n data: {\n object: Record\n }\n}\n\nexport interface StripeSubscriptionObject {\n id: string\n customer: string\n status: string\n items: {\n data: Array<{\n price: {\n id: string\n }\n }>\n }\n current_period_start: number\n current_period_end: number\n cancel_at_period_end: boolean\n metadata?: Record\n}\n\nexport interface StripeCheckoutSession {\n id: string\n customer: string\n subscription: string\n metadata?: Record\n}\n\nexport interface StripeInvoice {\n id: string\n customer: string\n subscription: string | null\n status: string\n amount_paid: number\n currency: string\n}\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\nexport interface StripeEventRecord {\n id: string\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: string // JSON string\n processedAt: number\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n}\n\nexport interface StripeEventFilters {\n type?: string\n status?: 'processed' | 'failed' | 'ignored'\n objectId?: string\n page?: number\n limit?: number\n}\n\nexport interface StripeEventStats {\n total: number\n processed: number\n failed: number\n ignored: number\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { renderSubscriptionsPage } from '../components/subscriptions-page'\nimport { renderEventsPage } from '../components/events-page'\nimport { renderStripeTabBar } from '../components/tab-bar'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { StripePluginSettings, SubscriptionStatus } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Subscriptions dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const statusFilter = c.req.query('status') as SubscriptionStatus | undefined\n\n const [{ subscriptions, total }, stats] = await Promise.all([\n subscriptionService.list({ status: statusFilter, page, limit }),\n subscriptionService.getStats()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderSubscriptionsPage({\n subscriptions: subscriptions as any,\n stats,\n filters: { status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Events log page\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const typeFilter = c.req.query('type') || undefined\n const statusFilter = c.req.query('status') as 'processed' | 'failed' | 'ignored' | undefined\n\n const [{ events, total }, stats, types] = await Promise.all([\n eventService.list({ type: typeFilter, status: statusFilter, page, limit }),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderEventsPage({\n events,\n stats,\n types,\n filters: { type: typeFilter, status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const { renderAdminLayoutCatalyst } = await import('../../../../templates/layouts/admin-layout-catalyst.template')\n\n const content = `\n
\n
\n

Stripe

\n

\n Configure your Stripe API keys and checkout options.\n

\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/settings')}\n\n
\n\n
\n
\n
\n \n \n

Your Stripe publishable key (starts with pk_)

\n
\n\n
\n \n \n

Your Stripe secret API key (starts with sk_)

\n
\n\n
\n \n \n

Stripe webhook endpoint signing secret (starts with whsec_)

\n
\n\n
\n \n \n

Default Stripe Price ID for checkout sessions (optional)

\n
\n\n
\n \n \n

Redirect URL after successful checkout

\n
\n\n
\n \n \n

Redirect URL if checkout is cancelled

\n
\n
\n\n
\n \n
\n
\n
\n\n \n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Stripe Settings',\n pageTitle: 'Stripe Settings',\n currentPath: '/admin/plugins/stripe',\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n content,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'stripe'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving Stripe settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n})\n\nexport { adminRoutes as stripeAdminRoutes }\n","import type { StripePluginSettings } from '../types'\n\n/**\n * Lightweight Stripe API client using fetch (CF Workers compatible, no SDK needed)\n */\nexport class StripeAPI {\n private baseUrl = 'https://api.stripe.com/v1'\n\n constructor(private secretKey: string) {}\n\n /**\n * Verify a webhook signature\n * Implements Stripe's v1 signature scheme using Web Crypto API\n */\n async verifyWebhookSignature(payload: string, sigHeader: string, secret: string): Promise {\n const parts = sigHeader.split(',')\n const timestamp = parts.find(p => p.startsWith('t='))?.split('=')[1]\n const signatures = parts\n .filter(p => p.startsWith('v1='))\n .map(p => p.substring(3))\n\n if (!timestamp || signatures.length === 0) return false\n\n // Reject events older than 5 minutes (tolerance)\n const now = Math.floor(Date.now() / 1000)\n if (Math.abs(now - parseInt(timestamp)) > 300) return false\n\n // Compute expected signature\n const signedPayload = `${timestamp}.${payload}`\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(signedPayload))\n const expectedSignature = Array.from(new Uint8Array(signatureBuffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n\n return signatures.some(sig => timingSafeEqual(sig, expectedSignature))\n }\n\n /**\n * Create a Checkout Session\n */\n async createCheckoutSession(params: {\n priceId: string\n customerId?: string\n customerEmail?: string\n successUrl: string\n cancelUrl: string\n metadata?: Record\n }): Promise<{ id: string; url: string }> {\n const body = new URLSearchParams()\n body.append('mode', 'subscription')\n body.append('line_items[0][price]', params.priceId)\n body.append('line_items[0][quantity]', '1')\n body.append('success_url', params.successUrl)\n body.append('cancel_url', params.cancelUrl)\n\n if (params.customerId) {\n body.append('customer', params.customerId)\n } else if (params.customerEmail) {\n body.append('customer_email', params.customerEmail)\n }\n\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n\n const response = await this.request('POST', '/checkout/sessions', body)\n return { id: response.id, url: response.url }\n }\n\n /**\n * Retrieve a Stripe subscription\n */\n async getSubscription(subscriptionId: string): Promise {\n return this.request('GET', `/subscriptions/${subscriptionId}`)\n }\n\n /**\n * Create a Stripe customer\n */\n async createCustomer(params: { email: string; metadata?: Record }): Promise<{ id: string }> {\n const body = new URLSearchParams()\n body.append('email', params.email)\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n return this.request('POST', '/customers', body)\n }\n\n /**\n * List subscriptions with pagination (auto-expands across pages)\n */\n async listSubscriptions(params?: {\n status?: string\n limit?: number\n startingAfter?: string\n }): Promise<{ data: any[]; has_more: boolean }> {\n const qs = new URLSearchParams()\n qs.append('limit', String(params?.limit || 100))\n if (params?.status) qs.append('status', params.status)\n if (params?.startingAfter) qs.append('starting_after', params.startingAfter)\n return this.request('GET', `/subscriptions?${qs.toString()}`)\n }\n\n /**\n * Fetch ALL subscriptions from Stripe (handles pagination automatically)\n */\n async listAllSubscriptions(): Promise {\n const all: any[] = []\n let startingAfter: string | undefined\n\n while (true) {\n const result = await this.listSubscriptions({ limit: 100, startingAfter })\n all.push(...result.data)\n if (!result.has_more || result.data.length === 0) break\n startingAfter = result.data[result.data.length - 1].id\n }\n\n return all\n }\n\n /**\n * Search for a customer by email\n */\n async findCustomerByEmail(email: string): Promise<{ id: string } | null> {\n const params = new URLSearchParams()\n params.append('query', `email:'${email}'`)\n params.append('limit', '1')\n const result = await this.request('GET', `/customers/search?${params.toString()}`)\n return result.data?.[0] || null\n }\n\n private async request(method: string, path: string, body?: URLSearchParams): Promise {\n const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${this.secretKey}`,\n ...(body ? { 'Content-Type': 'application/x-www-form-urlencoded' } : {})\n },\n ...(body ? { body: body.toString() } : {})\n })\n\n const data = await response.json() as any\n if (!response.ok) {\n throw new Error(`Stripe API error: ${data.error?.message || response.statusText}`)\n }\n return data\n }\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks on signature verification\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n return result === 0\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { StripeAPI } from '../services/stripe-api'\nimport type { Bindings, Variables } from '../../../../app'\nimport type {\n StripePluginSettings,\n StripeEvent,\n StripeSubscriptionObject,\n StripeCheckoutSession,\n StripeInvoice,\n SubscriptionStatus,\n SubscriptionFilters\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\nfunction mapStripeStatus(status: string): SubscriptionStatus {\n const map: Record = {\n active: 'active',\n canceled: 'canceled',\n past_due: 'past_due',\n trialing: 'trialing',\n unpaid: 'unpaid',\n paused: 'paused',\n incomplete: 'incomplete',\n incomplete_expired: 'incomplete_expired'\n }\n return map[status] || 'incomplete'\n}\n\n// ============================================================================\n// Webhook — No auth, verified by Stripe signature\n// ============================================================================\n\napiRoutes.post('/webhook', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeWebhookSecret) {\n return c.json({ error: 'Webhook secret not configured' }, 500)\n }\n\n // Must read raw body for signature verification\n const rawBody = await c.req.text()\n const sigHeader = c.req.header('stripe-signature') || ''\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const isValid = await stripeApi.verifyWebhookSignature(rawBody, sigHeader, settings.stripeWebhookSecret)\n\n if (!isValid) {\n return c.json({ error: 'Invalid signature' }, 400)\n }\n\n const event: StripeEvent = JSON.parse(rawBody)\n const subscriptionService = new SubscriptionService(db)\n const eventService = new StripeEventService(db)\n await Promise.all([subscriptionService.ensureTable(), eventService.ensureTable()])\n\n // Determine object ID and type for the event log\n const obj = event.data.object as any\n const objectId = obj?.id || ''\n const objectType = obj?.object || event.type.split('.')[0] || ''\n\n try {\n switch (event.type) {\n case 'customer.subscription.created': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n\n await subscriptionService.create({\n userId,\n stripeCustomerId: sub.customer,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items.data[0]?.price.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription created: ${sub.id}`)\n break\n }\n\n case 'customer.subscription.updated': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: mapStripeStatus(sub.status),\n stripePriceId: sub.items.data[0]?.price.id || undefined,\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription updated: ${sub.id} -> ${sub.status}`)\n break\n }\n\n case 'customer.subscription.deleted': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: 'canceled'\n })\n\n console.log(`[Stripe] Subscription deleted: ${sub.id}`)\n break\n }\n\n case 'checkout.session.completed': {\n const session = event.data.object as unknown as StripeCheckoutSession\n const userId = session.metadata?.sonicjs_user_id\n\n if (userId && session.subscription) {\n const existing = await subscriptionService.getByStripeSubscriptionId(session.subscription)\n if (existing && !existing.userId) {\n await subscriptionService.updateByStripeId(session.subscription, {\n userId\n } as any)\n }\n }\n\n console.log(`[Stripe] Checkout completed: ${session.id}`)\n break\n }\n\n case 'invoice.payment_succeeded': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'active'\n })\n }\n console.log(`[Stripe] Payment succeeded for invoice: ${invoice.id}`)\n break\n }\n\n case 'invoice.payment_failed': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'past_due'\n })\n }\n console.log(`[Stripe] Payment failed for invoice: ${invoice.id}`)\n break\n }\n\n default:\n console.log(`[Stripe] Unhandled event type: ${event.type}`)\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'ignored'\n })\n return c.json({ received: true })\n }\n\n // Log successfully processed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'processed'\n })\n } catch (error) {\n // Log failed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error)\n }).catch(() => {}) // Don't let logging failure mask the real error\n\n console.error(`[Stripe] Error processing webhook event ${event.type}:`, error)\n return c.json({ error: 'Webhook processing failed' }, 500)\n }\n\n return c.json({ received: true })\n})\n\n// ============================================================================\n// Authenticated API Routes\n// ============================================================================\n\n// Create checkout session for current user\napiRoutes.post('/create-checkout-session', requireAuth(), async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const settings = await getSettings(db)\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe not configured' }, 500)\n }\n\n const body = await c.req.json().catch(() => ({})) as { priceId?: string }\n const priceId = body.priceId || settings.stripePriceId\n if (!priceId) {\n return c.json({ error: 'No price ID specified' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n // Check if user already has a Stripe customer ID\n const existingSub = await subscriptionService.getByUserId(user.userId)\n let customerId = existingSub?.stripeCustomerId\n\n if (!customerId) {\n // Try to find existing customer by email, or create one\n const existing = await stripeApi.findCustomerByEmail(user.email)\n if (existing) {\n customerId = existing.id\n } else {\n const customer = await stripeApi.createCustomer({\n email: user.email,\n metadata: { sonicjs_user_id: user.userId }\n })\n customerId = customer.id\n }\n }\n\n const origin = new URL(c.req.url).origin\n const session = await stripeApi.createCheckoutSession({\n priceId,\n customerId,\n successUrl: `${origin}${settings.successUrl}?session_id={CHECKOUT_SESSION_ID}`,\n cancelUrl: `${origin}${settings.cancelUrl}`,\n metadata: { sonicjs_user_id: user.userId }\n })\n\n return c.json({ sessionId: session.id, url: session.url })\n})\n\n// Get current user's subscription\napiRoutes.get('/subscription', requireAuth(), async (c) => {\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const subscription = await subscriptionService.getByUserId(user.userId)\n if (!subscription) {\n return c.json({ subscription: null })\n }\n\n return c.json({ subscription })\n})\n\n// ============================================================================\n// Admin API Routes\n// ============================================================================\n\n// List all subscriptions (admin only)\napiRoutes.get('/subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const filters: SubscriptionFilters = {\n status: c.req.query('status') as SubscriptionStatus | undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await subscriptionService.list(filters)\n return c.json(result)\n})\n\n// Get subscription stats (admin only)\napiRoutes.get('/stats', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const stats = await subscriptionService.getStats()\n return c.json(stats)\n})\n\n// ============================================================================\n// Sync Subscriptions from Stripe API\n// ============================================================================\n\napiRoutes.post('/sync-subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe secret key not configured' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n try {\n const allSubs = await stripeApi.listAllSubscriptions()\n let synced = 0\n let errors = 0\n\n for (const sub of allSubs) {\n try {\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n await subscriptionService.upsert({\n userId,\n stripeCustomerId: typeof sub.customer === 'string' ? sub.customer : sub.customer.id,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items?.data?.[0]?.price?.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n synced++\n } catch (err) {\n console.error(`[Stripe Sync] Failed to upsert subscription ${sub.id}:`, err)\n errors++\n }\n }\n\n return c.json({\n success: true,\n total: allSubs.length,\n synced,\n errors\n })\n } catch (error) {\n console.error('[Stripe Sync] Error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Sync failed'\n }, 500)\n }\n})\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\napiRoutes.get('/events', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const filters = {\n type: c.req.query('type') || undefined,\n status: c.req.query('status') as any || undefined,\n objectId: c.req.query('objectId') || undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50\n }\n\n const [result, stats, types] = await Promise.all([\n eventService.list(filters),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n return c.json({ ...result, stats, types })\n})\n\nexport { apiRoutes as stripeApiRoutes }\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { stripeAdminRoutes } from './routes/admin'\nimport { stripeApiRoutes } from './routes/api'\n\nexport function createStripePlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'stripe',\n version: '1.0.0-beta.1',\n description: 'Stripe subscription management with webhook handling, checkout sessions, and subscription gating'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard — subscription management\n builder.addRoute('/admin/plugins/stripe', stripeAdminRoutes as any, {\n description: 'Stripe subscriptions admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes — webhook, checkout, subscription status\n builder.addRoute('/api/stripe', stripeApiRoutes as any, {\n description: 'Stripe API endpoints (webhook, checkout, subscription)',\n requiresAuth: false, // Webhook route handles its own auth via signature\n priority: 50\n })\n\n // Admin menu item\n builder.addMenuItem('Stripe', '/admin/plugins/stripe', {\n icon: ``,\n order: 75\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.log('[Stripe] Plugin installed')\n },\n activate: async () => {\n console.log('[Stripe] Plugin activated')\n },\n deactivate: async () => {\n console.log('[Stripe] Plugin deactivated')\n },\n uninstall: async () => {\n console.log('[Stripe] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const stripePlugin = createStripePlugin()\nexport { SubscriptionService } from './services/subscription-service'\nexport { StripeAPI } from './services/stripe-api'\nexport { requireSubscription } from './middleware/require-subscription'\nexport default stripePlugin\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../app'\nimport { PLUGIN_REGISTRY } from '../plugins/manifest-registry'\n\n// Build menu plugin data from the auto-generated registry.\n// Any plugin with an adminMenu entry in its manifest.json will\n// automatically appear in the sidebar when active.\nconst REGISTRY_MENU_PLUGINS = Object.values(PLUGIN_REGISTRY)\n .filter(p => p.adminMenu !== null)\n .map(p => ({\n codeName: p.codeName,\n label: p.adminMenu!.label,\n path: p.adminMenu!.path,\n icon: p.adminMenu!.icon,\n order: p.adminMenu!.order,\n }))\n\n// Map icon names from manifest.json to Heroicons SVG (outline, 24x24)\nconst ICON_SVG: Record = {\n 'magnifying-glass': '',\n 'chart-bar': '',\n 'image': '',\n 'palette': '',\n 'envelope': '',\n 'hand-raised': '',\n 'key': '',\n 'arrow-right': '',\n 'shield-check': '',\n 'credit-card': '',\n}\n\nfunction resolveIcon(iconName?: string): string {\n if (!iconName) return ''\n // If it's already SVG markup, return as-is\n if (iconName.startsWith('`\n const resolvedIcon = resolveIcon(item.icon) || fallbackIcon\n return `\n \n ${isActive ? '' : ''}\n \n \n ${resolvedIcon}\n \n ${item.label}\n \n `\n}\n\nexport function pluginMenuMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n if (!path.startsWith('/admin')) {\n return next()\n }\n\n // Collect menu items from active plugins using the registry\n let activeMenuItems: Array<{ label: string; path: string; icon?: string; order: number }> = []\n try {\n const db = c.env.DB\n const pluginCodeNames = REGISTRY_MENU_PLUGINS.map(p => p.codeName)\n if (pluginCodeNames.length > 0) {\n const placeholders = pluginCodeNames.map(() => '?').join(',')\n const result = await db.prepare(\n `SELECT name FROM plugins WHERE name IN (${placeholders}) AND status = 'active'`\n ).bind(...pluginCodeNames).all()\n\n const activeNames = new Set((result.results || []).map((r: any) => r.name))\n\n for (const plugin of REGISTRY_MENU_PLUGINS) {\n if (activeNames.has(plugin.codeName)) {\n activeMenuItems.push({\n label: plugin.label,\n path: plugin.path,\n icon: plugin.icon,\n order: plugin.order,\n })\n }\n }\n\n // Sort by order\n activeMenuItems.sort((a, b) => a.order - b.order)\n }\n } catch {\n // DB not ready or plugin table doesn't exist yet\n }\n\n c.set('pluginMenuItems', activeMenuItems.map(m => ({ label: m.label, path: m.path, icon: resolveIcon(m.icon) || '' })))\n\n await next()\n\n // Inject menu items into HTML response by replacing the marker\n if (activeMenuItems.length > 0 && c.res.headers.get('content-type')?.includes('text/html')) {\n const status = c.res.status\n const headers = new Headers(c.res.headers)\n const html = await c.res.text()\n\n if (html.includes(MARKER)) {\n const renderedItems = activeMenuItems.map(item => renderMenuItem(item, path)).join('')\n const newHtml = html.split(MARKER).join(renderedItems)\n c.res = new Response(newHtml, { status, headers })\n } else {\n // Body was consumed by .text(), must create new Response either way\n c.res = new Response(html, { status, headers })\n }\n }\n }\n}\n","/**\n * SonicJS Plugin System Types\n * \n * Defines the core interfaces and types for the plugin system\n */\n\nimport { Hono, Context, Next, MiddlewareHandler } from 'hono'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\n\n// Core plugin definition\nexport interface Plugin {\n /** Unique plugin identifier */\n name: string\n /** Plugin version (semantic versioning) */\n version: string\n /** Human-readable description */\n description?: string\n /** Plugin author information */\n author?: {\n name: string\n email?: string\n url?: string\n }\n /** Plugin dependencies (other plugins required) */\n dependencies?: string[]\n /** SonicJS version compatibility */\n compatibility?: string\n /** Plugin license */\n license?: string\n \n // Extension points\n routes?: PluginRoutes[]\n middleware?: PluginMiddleware[]\n models?: PluginModel[]\n services?: PluginService[]\n adminPages?: PluginAdminPage[]\n adminComponents?: PluginComponent[]\n menuItems?: PluginMenuItem[]\n hooks?: PluginHook[]\n \n // Lifecycle hooks\n install?: (context: PluginContext) => Promise\n uninstall?: (context: PluginContext) => Promise\n activate?: (context: PluginContext) => Promise\n deactivate?: (context: PluginContext) => Promise\n configure?: (config: PluginConfig) => Promise\n}\n\n// Plugin context provides access to SonicJS APIs\nexport interface PluginContext {\n /** Database instance */\n db: D1Database\n /** Key-value storage */\n kv: KVNamespace\n /** R2 storage bucket */\n r2?: R2Bucket\n /** Plugin configuration */\n config: PluginConfig\n /** Core SonicJS services */\n services: {\n auth: AuthService\n content: ContentService\n media: MediaService\n }\n /** Hook system for inter-plugin communication */\n hooks: HookSystem | ScopedHookSystem\n /** Logging utilities */\n logger: PluginLogger\n}\n\n// Authentication service interface for plugins\nexport interface AuthService {\n /** Generate JWT token for a user */\n generateToken(userId: string, email: string, role: string): Promise\n /** Verify and decode JWT token */\n verifyToken(token: string): Promise\n /** Set authentication cookie (useful for alternative auth methods) */\n setAuthCookie(context: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void\n /** Hash password */\n hashPassword(password: string): Promise\n /** Verify password against hash */\n verifyPassword(password: string, hash: string): Promise\n}\n\n// Plugin configuration\nexport interface PluginConfig {\n /** Plugin-specific configuration */\n [key: string]: any\n /** Whether plugin is enabled */\n enabled: boolean\n /** Plugin installation timestamp */\n installedAt?: number\n /** Plugin last update timestamp */\n updatedAt?: number\n}\n\n// Route definitions\nexport interface PluginRoutes {\n /** Route path prefix */\n path: string\n /** Hono route handler */\n handler: Hono\n /** Route description */\n description?: string\n /** Whether route requires authentication */\n requiresAuth?: boolean\n /** Required roles for access */\n roles?: string[]\n /** Route priority (for ordering) */\n priority?: number\n}\n\n// Middleware definitions\nexport interface PluginMiddleware {\n /** Middleware name */\n name: string\n /** Middleware handler function */\n handler: MiddlewareHandler\n /** Middleware description */\n description?: string\n /** Middleware priority (lower = earlier) */\n priority?: number\n /** Routes to apply middleware to */\n routes?: string[]\n /** Whether to apply globally */\n global?: boolean\n}\n\n// Database model definitions\nexport interface PluginModel {\n /** Model name */\n name: string\n /** Database table name */\n tableName: string\n /** Zod schema for validation */\n schema: z.ZodSchema\n /** Database migrations */\n migrations: string[]\n /** Model relationships */\n relationships?: ModelRelationship[]\n /** Whether model extends core content */\n extendsContent?: boolean\n}\n\nexport interface ModelRelationship {\n type: 'oneToOne' | 'oneToMany' | 'manyToMany'\n target: string\n foreignKey?: string\n joinTable?: string\n}\n\n// Service definitions\nexport interface PluginService {\n /** Service name */\n name: string\n /** Service implementation */\n implementation: any\n /** Service description */\n description?: string\n /** Service dependencies */\n dependencies?: string[]\n /** Whether service is singleton */\n singleton?: boolean\n}\n\n// Admin interface extensions\nexport interface PluginAdminPage {\n /** Page path (relative to /admin) */\n path: string\n /** Page title */\n title: string\n /** Page component/template */\n component: string\n /** Page description */\n description?: string\n /** Required permissions */\n permissions?: string[]\n /** Menu item configuration */\n menuItem?: PluginMenuItem\n /** Page icon */\n icon?: string\n}\n\nexport interface PluginComponent {\n /** Component name */\n name: string\n /** Component template function */\n template: (props: any) => string\n /** Component description */\n description?: string\n /** Component props schema */\n propsSchema?: z.ZodSchema\n}\n\nexport interface PluginMenuItem {\n /** Menu item label */\n label: string\n /** Menu item path */\n path: string\n /** Menu item icon */\n icon?: string\n /** Menu item order */\n order?: number\n /** Parent menu item */\n parent?: string\n /** Required permissions */\n permissions?: string[]\n /** Whether item is active */\n active?: boolean\n}\n\n// Hook system for extensibility\nexport interface PluginHook {\n /** Hook name */\n name: string\n /** Hook handler function */\n handler: HookHandler\n /** Hook priority */\n priority?: number\n /** Hook description */\n description?: string\n}\n\nexport type HookHandler = (data: any, context: HookContext) => Promise\n\nexport interface HookContext {\n /** Plugin that registered the hook */\n plugin: string\n /** Hook execution context */\n context: PluginContext\n /** Cancel hook execution */\n cancel?: () => void\n}\n\n// Hook system interface\nexport interface HookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Get all registered hooks */\n getHooks(hookName: string): PluginHook[]\n /** Create a scoped hook system (optional) */\n createScope?(pluginName: string): ScopedHookSystem\n}\n\n// Scoped hook system for plugins\nexport interface ScopedHookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Remove all hooks for this scope */\n unregisterAll(): void\n}\n\n// Plugin registry\nexport interface PluginRegistry {\n /** Get plugin by name */\n get(name: string): Plugin | undefined\n /** Get all registered plugins */\n getAll(): Plugin[]\n /** Get active plugins */\n getActive(): Plugin[]\n /** Register a plugin */\n register(plugin: Plugin): Promise\n /** Unregister a plugin */\n unregister(name: string): Promise\n /** Check if plugin is registered */\n has(name: string): boolean\n /** Activate a plugin */\n activate(name: string): Promise\n /** Deactivate a plugin */\n deactivate(name: string): Promise\n /** Get plugin configuration */\n getConfig(name: string): PluginConfig | undefined\n /** Set plugin configuration */\n setConfig(name: string, config: PluginConfig): void\n /** Get plugin status */\n getStatus(name: string): PluginStatus | undefined\n /** Get all plugin statuses */\n getAllStatuses(): Map\n /** Resolve plugin load order based on dependencies */\n resolveLoadOrder(): string[]\n}\n\n// Plugin manager\nexport interface PluginManager {\n /** Plugin registry */\n registry: PluginRegistry\n /** Hook system */\n hooks: HookSystem\n /** Initialize plugin system */\n initialize(context: PluginContext): Promise\n /** Load plugins from configuration */\n loadPlugins(config: PluginConfig[]): Promise\n /** Install a plugin */\n install(plugin: Plugin, config?: PluginConfig): Promise\n /** Uninstall a plugin */\n uninstall(name: string): Promise\n /** Get plugin status */\n getStatus(name: string): PluginStatus\n}\n\nexport interface PluginStatus {\n name: string\n version: string\n active: boolean\n installed: boolean\n hasErrors: boolean\n errors?: string[]\n lastError?: string\n}\n\n// Service interfaces\nexport interface AuthService {\n /** Verify user permissions */\n hasPermission(userId: string, permission: string): Promise\n /** Get current user */\n getCurrentUser(context: Context): Promise\n /** Create authentication middleware */\n createMiddleware(options?: any): MiddlewareHandler\n}\n\nexport interface ContentService {\n /** Get content by ID */\n getById(id: string): Promise\n /** Create new content */\n create(data: any): Promise\n /** Update content */\n update(id: string, data: any): Promise\n /** Delete content */\n delete(id: string): Promise\n /** Search content */\n search(query: string, options?: any): Promise\n}\n\nexport interface MediaService {\n /** Upload file */\n upload(file: File, options?: any): Promise\n /** Get media by ID */\n getById(id: string): Promise\n /** Delete media */\n delete(id: string): Promise\n /** Transform image */\n transform(id: string, options: any): Promise\n}\n\n// Plugin logger\nexport interface PluginLogger {\n debug(message: string, data?: any): void\n info(message: string, data?: any): void\n warn(message: string, data?: any): void\n error(message: string, error?: Error, data?: any): void\n}\n\n// Plugin development utilities interface\n\nexport interface PluginBuilderOptions {\n name: string\n version: string\n description?: string\n author?: Plugin['author']\n dependencies?: string[]\n}\n\n// Plugin validation\nexport interface PluginValidator {\n /** Validate plugin definition */\n validate(plugin: Plugin): PluginValidationResult\n /** Validate plugin dependencies */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult\n /** Validate plugin compatibility */\n validateCompatibility(plugin: Plugin, version: string): PluginValidationResult\n}\n\nexport interface PluginValidationResult {\n valid: boolean\n errors: string[]\n warnings: string[]\n}\n\n// Standard hook names\nexport const HOOKS = {\n // Application lifecycle\n APP_INIT: 'app:init',\n APP_READY: 'app:ready',\n APP_SHUTDOWN: 'app:shutdown',\n \n // Request lifecycle\n REQUEST_START: 'request:start',\n REQUEST_END: 'request:end',\n REQUEST_ERROR: 'request:error',\n \n // Authentication\n AUTH_LOGIN: 'auth:login',\n AUTH_LOGOUT: 'auth:logout',\n AUTH_REGISTER: 'auth:register',\n USER_LOGIN: 'user:login',\n USER_LOGOUT: 'user:logout',\n \n // Content lifecycle\n CONTENT_CREATE: 'content:create',\n CONTENT_UPDATE: 'content:update',\n CONTENT_DELETE: 'content:delete',\n CONTENT_PUBLISH: 'content:publish',\n CONTENT_SAVE: 'content:save',\n \n // Media lifecycle\n MEDIA_UPLOAD: 'media:upload',\n MEDIA_DELETE: 'media:delete',\n MEDIA_TRANSFORM: 'media:transform',\n \n // Plugin lifecycle\n PLUGIN_INSTALL: 'plugin:install',\n PLUGIN_UNINSTALL: 'plugin:uninstall',\n PLUGIN_ACTIVATE: 'plugin:activate',\n PLUGIN_DEACTIVATE: 'plugin:deactivate',\n \n // Admin interface\n ADMIN_MENU_RENDER: 'admin:menu:render',\n ADMIN_PAGE_RENDER: 'admin:page:render',\n \n // Database\n DB_MIGRATE: 'db:migrate',\n DB_SEED: 'db:seed',\n} as const\n\nexport type HookName = typeof HOOKS[keyof typeof HOOKS]","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { renderAdminLayoutCatalyst } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\n// Analytics Dashboard\nadminRoutes.get('/', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Query real metrics from system_logs\n let totalRequests = 0\n let uniqueIPs = 0\n let avgDuration = 0\n let errorCount = 0\n let topPages: Array<{ path: string; views: number }> = []\n let recentActivity: Array<{ url: string; method: string; status_code: number; duration: number; created_at: number }> = []\n\n try {\n const now = Math.floor(Date.now() / 1000)\n const dayAgo = now - 86400\n\n const [requestsResult, ipsResult, durationResult, errorsResult, pagesResult, activityResult] = await Promise.all([\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT COUNT(DISTINCT ip_address) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT AVG(duration) as avg FROM system_logs WHERE category = ? AND created_at > ? AND duration IS NOT NULL')\n .bind('api', dayAgo).first() as Promise<{ avg: number } | null>,\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE level IN (?, ?) AND created_at > ?')\n .bind('error', 'fatal', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT url, COUNT(*) as views FROM system_logs WHERE category = ? AND created_at > ? AND url IS NOT NULL GROUP BY url ORDER BY views DESC LIMIT 10')\n .bind('api', dayAgo).all(),\n db.prepare('SELECT url, method, status_code, duration, created_at FROM system_logs WHERE category = ? ORDER BY created_at DESC LIMIT 20')\n .bind('api').all(),\n ])\n\n totalRequests = requestsResult?.count || 0\n uniqueIPs = ipsResult?.count || 0\n avgDuration = Math.round(durationResult?.avg || 0)\n errorCount = errorsResult?.count || 0\n topPages = (pagesResult.results || []).map((r: any) => ({ path: r.url, views: r.views }))\n recentActivity = (activityResult.results || []) as any[]\n } catch {\n // Tables may not exist yet\n }\n\n const content = `\n
\n
\n

Analytics Dashboard

\n

Last 24 hours overview from system logs

\n
\n\n \n
\n
\n

Total Requests

\n

${totalRequests.toLocaleString()}

\n
\n
\n

Unique Visitors

\n

${uniqueIPs.toLocaleString()}

\n
\n
\n

Avg Response Time

\n

${avgDuration}ms

\n
\n
\n

Errors

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${errorCount.toLocaleString()}

\n
\n
\n\n \n
\n
\n

Top Pages

\n
\n
\n ${topPages.length > 0 ? topPages.map(p => `\n
\n ${escapeHtml(p.path)}\n ${p.views}\n
\n `).join('') : `\n
\n No page views recorded yet. Analytics data will appear once requests are logged.\n
\n `}\n
\n
\n\n \n
\n
\n

Recent Activity

\n
\n
\n \n \n \n \n \n \n \n \n \n \n ${recentActivity.length > 0 ? recentActivity.map(a => `\n \n \n \n \n \n \n `).join('') : `\n \n \n \n `}\n \n
PathMethodStatusDuration
${escapeHtml(a.url || '')}${a.method || ''}= 400 ? 'bg-red-50 text-red-700 dark:bg-red-900/30 dark:text-red-400' : 'bg-green-50 text-green-700 dark:bg-green-900/30 dark:text-green-400'}\">${a.status_code || ''}${a.duration || 0}ms
No activity recorded yet.
\n
\n
\n
\n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Analytics',\n pageTitle: 'Analytics Dashboard',\n currentPath: '/admin/analytics',\n version: c.get('appVersion'),\n user: user ? {\n name: user.email.split('@')[0] || 'Admin',\n email: user.email,\n role: user.role\n } : undefined,\n content,\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"')\n}\n\nexport { adminRoutes as analyticsAdminRoutes }\n","/**\n * Core Analytics Plugin\n * \n * Provides analytics tracking and reporting extensions\n */\n\nimport { Hono } from 'hono'\n// import { z } from 'zod'\nimport { PluginBuilder, PluginHelpers } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { HOOKS } from '../../types'\nimport { analyticsAdminRoutes } from './routes/admin'\n\nexport function createAnalyticsPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'core-analytics',\n version: '1.0.0-beta.1',\n description: 'Core analytics tracking and reporting plugin'\n })\n\n // Add analytics metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^0.1.0',\n dependencies: ['core-auth'] // Requires auth for admin access\n })\n\n // Create analytics API routes\n const analyticsAPI = new Hono()\n\n // GET /analytics/stats - Get analytics overview\n analyticsAPI.get('/stats', async (c) => {\n const timeRange = c.req.query('range') || '7d' // 1d, 7d, 30d, 90d\n const _metric = c.req.query('metric') || 'all' // pageviews, sessions, users, etc.\n\n return c.json({\n message: 'Analytics stats',\n data: {\n pageviews: 12500,\n uniqueVisitors: 3200,\n sessions: 4800,\n avgSessionDuration: 245,\n bounceRate: 0.35,\n topPages: [\n { path: '/', views: 3200 },\n { path: '/about', views: 1800 },\n { path: '/contact', views: 950 }\n ],\n timeRange\n }\n })\n })\n\n // POST /analytics/track - Track analytics event\n analyticsAPI.post('/track', async (c) => {\n const event = await c.req.json()\n \n // Track event (pageview, click, form submission, etc.)\n console.info('Analytics event tracked:', event)\n \n return c.json({\n message: 'Event tracked successfully',\n eventId: `event-${Date.now()}`\n })\n })\n\n // GET /analytics/reports - Get detailed reports\n analyticsAPI.get('/reports', async (c) => {\n const reportType = c.req.query('type') || 'traffic'\n const startDate = c.req.query('start')\n const endDate = c.req.query('end')\n\n return c.json({\n message: 'Analytics report',\n data: {\n reportType,\n dateRange: { start: startDate, end: endDate },\n data: []\n }\n })\n })\n\n // GET /analytics/realtime - Get real-time analytics\n analyticsAPI.get('/realtime', async (c) => {\n return c.json({\n message: 'Real-time analytics',\n data: {\n activeUsers: 23,\n activePages: [\n { path: '/', users: 8 },\n { path: '/blog', users: 5 },\n { path: '/products', users: 4 }\n ],\n recentEvents: []\n }\n })\n })\n\n builder.addRoute('/api/analytics', analyticsAPI, {\n description: 'Analytics tracking and reporting API',\n requiresAuth: true,\n roles: ['admin', 'analytics:read'],\n priority: 3\n })\n\n // Admin dashboard routes\n builder.addRoute('/admin/analytics', analyticsAdminRoutes as any, {\n description: 'Analytics admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // Add analytics tracking middleware\n builder.addSingleMiddleware('analytics-tracker', async (c: any, next: any) => {\n const start = Date.now()\n const path = c.req.path\n const method = c.req.method\n const userAgent = c.req.header('user-agent')\n const referer = c.req.header('referer')\n const ip = c.req.header('CF-Connecting-IP') || c.req.header('x-forwarded-for')\n\n await next()\n\n const duration = Date.now() - start\n const status = c.res.status\n\n // Track request analytics\n const analyticsData = {\n timestamp: new Date().toISOString(),\n path,\n method,\n status,\n duration,\n userAgent,\n referer,\n ip,\n responseSize: c.res.headers.get('content-length') || 0\n }\n\n console.debug('Analytics tracking:', analyticsData)\n \n // Store analytics data (would integrate with analytics service)\n }, {\n description: 'Track page views and request analytics',\n global: true,\n priority: 99 // Run last to capture response data\n })\n\n // Add analytics service\n builder.addService('analyticsService', {\n trackEvent: async (event: any) => {\n // Event tracking implementation\n console.info('Tracking event:', event)\n return { eventId: `event-${Date.now()}` }\n },\n \n trackPageView: async (data: any) => {\n // Page view tracking implementation\n console.info('Tracking pageview:', data.path)\n return { viewId: `view-${Date.now()}` }\n },\n \n getStats: async (_timeRange: string) => {\n // Get analytics statistics\n return {\n pageviews: 12500,\n sessions: 4800,\n uniqueVisitors: 3200\n }\n },\n \n generateReport: async (type: string, options: any) => {\n // Generate analytics reports\n console.info(`Generating ${type} report with options:`, options)\n return { reportId: `report-${Date.now()}` }\n }\n }, {\n description: 'Core analytics tracking service',\n singleton: true\n })\n\n // Add analytics models\n const pageViewSchema = PluginHelpers.createSchema([\n { name: 'path', type: 'string', optional: false },\n { name: 'title', type: 'string', optional: true },\n { name: 'referrer', type: 'string', optional: true },\n { name: 'userAgent', type: 'string', optional: true },\n { name: 'ipAddress', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true },\n { name: 'duration', type: 'number', optional: true }\n ])\n\n const eventSchema = PluginHelpers.createSchema([\n { name: 'eventType', type: 'string', optional: false },\n { name: 'eventName', type: 'string', optional: false },\n { name: 'eventData', type: 'object', optional: true },\n { name: 'path', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true }\n ])\n\n const pageViewMigration = PluginHelpers.createMigration('analytics_pageviews', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'path', type: 'TEXT', nullable: false },\n { name: 'title', type: 'TEXT', nullable: true },\n { name: 'referrer', type: 'TEXT', nullable: true },\n { name: 'user_agent', type: 'TEXT', nullable: true },\n { name: 'ip_address', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true },\n { name: 'duration', type: 'INTEGER', nullable: true }\n ])\n\n const eventMigration = PluginHelpers.createMigration('analytics_events', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'event_type', type: 'TEXT', nullable: false },\n { name: 'event_name', type: 'TEXT', nullable: false },\n { name: 'event_data', type: 'TEXT', nullable: true },\n { name: 'path', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true }\n ])\n\n builder.addModel('PageView', {\n tableName: 'analytics_pageviews',\n schema: pageViewSchema,\n migrations: [pageViewMigration]\n })\n\n builder.addModel('AnalyticsEvent', {\n tableName: 'analytics_events',\n schema: eventSchema,\n migrations: [eventMigration]\n })\n\n // Add analytics hooks\n builder.addHook(HOOKS.REQUEST_START, async (data: any, _context: any) => {\n // Start tracking request\n data.analytics = {\n startTime: Date.now(),\n sessionId: `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n return data\n }, {\n priority: 1,\n description: 'Initialize analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.REQUEST_END, async (data: any, _context: any) => {\n // Complete request tracking\n if (data.analytics) {\n const duration = Date.now() - data.analytics.startTime\n console.debug(`Request completed in ${duration}ms`)\n }\n return data\n }, {\n priority: 1,\n description: 'Complete analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.USER_LOGIN, async (data: any, context: any) => {\n // Track user login events\n await context.services?.analyticsService?.trackEvent({\n eventType: 'auth',\n eventName: 'user_login',\n userId: data.userId,\n eventData: { loginMethod: data.method }\n })\n return data\n }, {\n priority: 8,\n description: 'Track user login events'\n })\n\n builder.addHook('content:view', async (data: any, context: any) => {\n // Track content views\n await context.services?.analyticsService?.trackEvent({\n eventType: 'content',\n eventName: 'content_view',\n eventData: {\n contentId: data.id,\n contentType: data.type,\n title: data.title\n }\n })\n return data\n }, {\n priority: 8,\n description: 'Track content view events'\n })\n\n // Add admin pages\n builder.addAdminPage(\n '/analytics',\n 'Analytics Dashboard',\n 'AnalyticsDashboardView',\n {\n description: 'View analytics overview and key metrics',\n permissions: ['admin', 'analytics:read'],\n icon: 'chart-bar'\n }\n )\n\n builder.addAdminPage(\n '/analytics/reports',\n 'Analytics Reports',\n 'AnalyticsReportsView',\n {\n description: 'Generate and view detailed analytics reports',\n permissions: ['admin', 'analytics:read'],\n icon: 'document-report'\n }\n )\n\n builder.addAdminPage(\n '/analytics/realtime',\n 'Real-time Analytics',\n 'AnalyticsRealtimeView',\n {\n description: 'View real-time visitor activity',\n permissions: ['admin', 'analytics:read'],\n icon: 'lightning-bolt'\n }\n )\n\n builder.addAdminPage(\n '/analytics/settings',\n 'Analytics Settings',\n 'AnalyticsSettingsView',\n {\n description: 'Configure analytics tracking and data collection',\n permissions: ['admin', 'analytics:configure'],\n icon: 'cog'\n }\n )\n\n // Add menu items\n builder.addMenuItem('Analytics', '/admin/analytics', {\n icon: 'chart-bar',\n order: 40,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Dashboard', '/admin/analytics', {\n icon: 'chart-bar',\n parent: 'Analytics',\n order: 1,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Reports', '/admin/analytics/reports', {\n icon: 'document-report',\n parent: 'Analytics',\n order: 2,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Real-time', '/admin/analytics/realtime', {\n icon: 'lightning-bolt',\n parent: 'Analytics',\n order: 3,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Settings', '/admin/analytics/settings', {\n icon: 'cog',\n parent: 'Analytics',\n order: 4,\n permissions: ['admin', 'analytics:configure']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.info('Installing analytics plugin...')\n // Create analytics database tables and initial configuration\n },\n\n activate: async () => {\n console.info('Activating analytics plugin...')\n // Start analytics tracking services\n },\n\n deactivate: async () => {\n console.info('Deactivating analytics plugin...')\n // Stop analytics tracking and clean up resources\n },\n\n configure: async (config) => {\n console.info('Configuring analytics plugin...', config)\n // Update analytics configuration and settings\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const analyticsPlugin = createAnalyticsPlugin()","import type { D1Database } from '@cloudflare/workers-types'\n\nexport interface TrackEventInput {\n event: string\n properties?: Record\n userId?: string\n sessionId?: string\n ipAddress?: string\n userAgent?: string\n path?: string\n category?: string\n}\n\nexport interface EventQueryFilters {\n event?: string\n category?: string\n userId?: string\n sessionId?: string\n startDate?: number\n endDate?: number\n limit?: number\n offset?: number\n}\n\nexport interface EventStats {\n totalEvents: number\n uniqueUsers: number\n uniqueSessions: number\n topEvents: Array<{ event: string; count: number }>\n}\n\nexport class EventTrackingService {\n constructor(private db: D1Database) {}\n\n async trackEvent(input: TrackEventInput): Promise {\n const id = crypto.randomUUID()\n const category = input.category || 'user-activity'\n\n await this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n ).run()\n\n return id\n }\n\n async trackBatch(events: TrackEventInput[]): Promise {\n const ids: string[] = []\n\n const stmts = events.map(input => {\n const id = crypto.randomUUID()\n ids.push(id)\n const category = input.category || 'user-activity'\n\n return this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n )\n })\n\n await this.db.batch(stmts)\n return ids\n }\n\n async queryEvents(filters: EventQueryFilters = {}): Promise<{ events: any[]; total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.event) {\n conditions.push('event = ?')\n params.push(filters.event)\n }\n if (filters.category) {\n conditions.push('category = ?')\n params.push(filters.category)\n }\n if (filters.userId) {\n conditions.push('user_id = ?')\n params.push(filters.userId)\n }\n if (filters.sessionId) {\n conditions.push('session_id = ?')\n params.push(filters.sessionId)\n }\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const limit = filters.limit || 50\n const offset = filters.offset || 0\n\n const [countResult, eventsResult] = await Promise.all([\n this.db.prepare(`SELECT COUNT(*) as total FROM analytics_events ${where}`).bind(...params).first() as Promise<{ total: number } | null>,\n this.db.prepare(`SELECT * FROM analytics_events ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`).bind(...params, limit, offset).all()\n ])\n\n const events = (eventsResult.results || []).map((e: any) => ({\n ...e,\n properties: e.properties ? JSON.parse(e.properties) : null\n }))\n\n return { events, total: countResult?.total || 0 }\n }\n\n async getStats(startDate?: number, endDate?: number): Promise {\n const conditions: string[] = []\n const params: any[] = []\n\n if (startDate) {\n conditions.push('created_at >= ?')\n params.push(startDate)\n }\n if (endDate) {\n conditions.push('created_at <= ?')\n params.push(endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n const [totals, topEvents] = await Promise.all([\n this.db.prepare(`\n SELECT\n COUNT(*) as total_events,\n COUNT(DISTINCT user_id) as unique_users,\n COUNT(DISTINCT session_id) as unique_sessions\n FROM analytics_events ${where}\n `).bind(...params).first() as Promise<{ total_events: number; unique_users: number; unique_sessions: number } | null>,\n this.db.prepare(`\n SELECT event, COUNT(*) as count\n FROM analytics_events ${where}\n GROUP BY event ORDER BY count DESC LIMIT 20\n `).bind(...params).all()\n ])\n\n return {\n totalEvents: totals?.total_events || 0,\n uniqueUsers: totals?.unique_users || 0,\n uniqueSessions: totals?.unique_sessions || 0,\n topEvents: (topEvents.results || []).map((r: any) => ({ event: r.event, count: r.count }))\n }\n }\n}\n","import { Hono } from 'hono'\nimport { EventTrackingService } from '../services/event-tracking-service'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// POST /api/events - Track a single event or batch of events\napiRoutes.post('/', async (c) => {\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || ''\n const user = c.get('user')\n\n let body: any\n try {\n body = await c.req.json()\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400)\n }\n\n // Batch support: accept an array of events\n if (Array.isArray(body)) {\n if (body.length > 100) {\n return c.json({ error: 'Batch size limit is 100 events' }, 400)\n }\n\n const events = body.map(e => ({\n event: e.event,\n category: e.category || 'user-activity',\n properties: e.properties,\n userId: user?.userId || e.userId,\n sessionId: e.sessionId,\n ipAddress: ip,\n userAgent,\n path: e.path\n }))\n\n // Validate all events have an event name\n const invalid = events.find(e => !e.event || typeof e.event !== 'string')\n if (invalid) {\n return c.json({ error: 'Each event must have an \"event\" string field' }, 400)\n }\n\n const ids = await service.trackBatch(events)\n return c.json({ success: true, eventIds: ids, count: ids.length })\n }\n\n // Single event\n if (!body.event || typeof body.event !== 'string') {\n return c.json({ error: '\"event\" field is required and must be a string' }, 400)\n }\n\n const eventId = await service.trackEvent({\n event: body.event,\n category: body.category || 'user-activity',\n properties: body.properties,\n userId: user?.userId || body.userId,\n sessionId: body.sessionId,\n ipAddress: ip,\n userAgent,\n path: body.path\n })\n\n return c.json({ success: true, eventId })\n})\n\n// GET /api/events - Query events (admin only)\napiRoutes.get('/', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const filters = {\n event: c.req.query('event') || undefined,\n category: c.req.query('category') || undefined,\n userId: c.req.query('userId') || undefined,\n sessionId: c.req.query('sessionId') || undefined,\n startDate: c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined,\n endDate: c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n offset: c.req.query('offset') ? parseInt(c.req.query('offset')!) : 0\n }\n\n const result = await service.queryEvents(filters)\n return c.json(result)\n})\n\n// GET /api/events/stats - Aggregated event stats (admin only)\napiRoutes.get('/stats', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const startDate = c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined\n const endDate = c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined\n\n const stats = await service.getStats(startDate, endDate)\n return c.json(stats)\n})\n\nexport { apiRoutes as eventsApiRoutes }\n","/**\n * Cache Configuration\n *\n * Defines cache configurations for different entity types\n */\n\nexport interface CacheConfig {\n ttl: number // Time-to-live in seconds\n kvEnabled: boolean // Use KV cache tier\n memoryEnabled: boolean // Use in-memory cache tier\n namespace: string // Cache namespace/prefix\n invalidateOn: string[] // Events that invalidate this cache\n version?: string // Cache version for busting\n}\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\n/**\n * Default cache configurations by entity type\n */\nexport const CACHE_CONFIGS: Record = {\n // Content (high read, low write)\n content: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'content',\n invalidateOn: ['content.update', 'content.delete', 'content.publish'],\n version: 'v1'\n },\n\n // User data (medium read, medium write)\n user: {\n ttl: 900, // 15 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'user',\n invalidateOn: ['user.update', 'user.delete', 'auth.login'],\n version: 'v1'\n },\n\n // Configuration (high read, very low write)\n config: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'config',\n invalidateOn: ['config.update', 'plugin.activate', 'plugin.deactivate'],\n version: 'v1'\n },\n\n // Media metadata (high read, low write)\n media: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'media',\n invalidateOn: ['media.upload', 'media.delete', 'media.update'],\n version: 'v1'\n },\n\n // API responses (very high read, low write)\n api: {\n ttl: 300, // 5 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'api',\n invalidateOn: ['content.update', 'content.publish'],\n version: 'v1'\n },\n\n // Session data (very high read, medium write)\n session: {\n ttl: 1800, // 30 minutes\n kvEnabled: false, // Only in-memory for sessions\n memoryEnabled: true,\n namespace: 'session',\n invalidateOn: ['auth.logout'],\n version: 'v1'\n },\n\n // Plugin data\n plugin: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'plugin',\n invalidateOn: ['plugin.activate', 'plugin.deactivate', 'plugin.update'],\n version: 'v1'\n },\n\n // Collections/schema\n collection: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'collection',\n invalidateOn: ['collection.update', 'collection.delete'],\n version: 'v1'\n }\n}\n\n/**\n * Get cache configuration for a specific namespace\n */\nexport function getCacheConfig(namespace: string): CacheConfig {\n return CACHE_CONFIGS[namespace] || {\n ttl: 3600,\n kvEnabled: true,\n memoryEnabled: true,\n namespace,\n invalidateOn: [],\n version: 'v1'\n }\n}\n\n/**\n * Generate a cache key with consistent format\n * Format: {namespace}:{type}:{identifier}:{version}\n */\nexport function generateCacheKey(\n namespace: string,\n type: string,\n identifier: string,\n version?: string\n): string {\n const v = version || getCacheConfig(namespace).version || 'v1'\n return `${namespace}:${type}:${identifier}:${v}`\n}\n\n/**\n * Parse a cache key back into its components\n */\nexport function parseCacheKey(key: string): {\n namespace: string\n type: string\n identifier: string\n version: string\n} | null {\n const parts = key.split(':')\n if (parts.length !== 4) {\n return null\n }\n\n return {\n namespace: parts[0] || '',\n type: parts[1] || '',\n identifier: parts[2] || '',\n version: parts[3] || ''\n }\n}\n\n/**\n * Generate a hash for complex query parameters\n */\nexport function hashQueryParams(params: Record): string {\n // Sort keys for consistent hashing\n const sortedKeys = Object.keys(params).sort()\n const normalized = sortedKeys.map(key => `${key}=${params[key]}`).join('&')\n\n // Simple hash function (for better performance, consider using crypto)\n let hash = 0\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Create a pattern for cache invalidation\n */\nexport function createCachePattern(\n namespace: string,\n type?: string,\n identifier?: string\n): string {\n let pattern = namespace\n if (type) pattern += `:${type}`\n if (identifier) pattern += `:${identifier}`\n return pattern + ':*'\n}\n","/**\n * Cache Service\n *\n * Three-tiered caching implementation:\n * 1. In-Memory Cache (fastest, region-specific)\n * 2. Cloudflare KV Cache (fast, global)\n * 3. Database (fallback, source of truth)\n */\n\nimport { CacheConfig, CacheStats, generateCacheKey } from './cache-config.js'\n\n/**\n * Cache entry with metadata\n */\ninterface CacheEntry {\n data: T\n timestamp: number\n expiresAt: number\n version: string\n}\n\n/**\n * In-memory cache store\n */\nclass MemoryCache {\n private cache: Map> = new Map()\n private maxSize: number = 50 * 1024 * 1024 // 50MB\n private currentSize: number = 0\n\n /**\n * Get item from memory cache\n */\n get(key: string): T | null {\n const entry = this.cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n this.delete(key)\n return null\n }\n\n return entry.data as T\n }\n\n /**\n * Set item in memory cache\n */\n set(key: string, value: T, ttl: number, version: string = 'v1'): void {\n const now = Date.now()\n const entry: CacheEntry = {\n data: value,\n timestamp: now,\n expiresAt: now + (ttl * 1000),\n version\n }\n\n // Estimate size (rough approximation)\n const entrySize = JSON.stringify(entry).length * 2 // UTF-16\n\n // Check if we need to evict\n if (this.currentSize + entrySize > this.maxSize) {\n this.evictLRU(entrySize)\n }\n\n // Delete old entry if exists\n if (this.cache.has(key)) {\n this.delete(key)\n }\n\n this.cache.set(key, entry)\n this.currentSize += entrySize\n }\n\n /**\n * Delete item from memory cache\n */\n delete(key: string): boolean {\n const entry = this.cache.get(key)\n if (entry) {\n const entrySize = JSON.stringify(entry).length * 2\n this.currentSize -= entrySize\n return this.cache.delete(key)\n }\n return false\n }\n\n /**\n * Clear all items from memory cache\n */\n clear(): void {\n this.cache.clear()\n this.currentSize = 0\n }\n\n /**\n * Get cache statistics\n */\n getStats(): { size: number; count: number } {\n return {\n size: this.currentSize,\n count: this.cache.size\n }\n }\n\n /**\n * Evict least recently used items to make space\n */\n private evictLRU(neededSpace: number): void {\n // Sort by timestamp (oldest first)\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp\n )\n\n let freedSpace = 0\n for (const [key, entry] of entries) {\n if (freedSpace >= neededSpace) break\n\n const entrySize = JSON.stringify(entry).length * 2\n this.delete(key)\n freedSpace += entrySize\n }\n }\n\n /**\n * Delete items matching a pattern\n */\n invalidatePattern(pattern: string): number {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n let count = 0\n for (const key of this.cache.keys()) {\n if (regex.test(key)) {\n this.delete(key)\n count++\n }\n }\n\n return count\n }\n}\n\n/**\n * Cache result with source information\n */\nexport interface CacheResult {\n data: T | null\n source: 'memory' | 'kv' | 'miss'\n hit: boolean\n timestamp?: number\n ttl?: number\n}\n\n/**\n * Main cache service with multi-tier support\n */\nexport class CacheService {\n private memoryCache: MemoryCache\n private config: CacheConfig\n private stats: CacheStats\n private kvNamespace?: KVNamespace\n\n constructor(config: CacheConfig, kvNamespace?: KVNamespace) {\n this.memoryCache = new MemoryCache()\n this.config = config\n this.kvNamespace = kvNamespace\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Get value from cache (tries memory first, then KV)\n */\n async get(key: string): Promise {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n return memoryValue\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return kvValue as T\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return null\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise> {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n\n const entry = await this.getEntry(key)\n return {\n data: memoryValue,\n source: 'memory',\n hit: true,\n timestamp: entry?.timestamp,\n ttl: entry?.ttl\n }\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return {\n data: kvValue as T,\n source: 'kv',\n hit: true\n }\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return {\n data: null,\n source: 'miss',\n hit: false\n }\n }\n\n /**\n * Set value in cache (stores in both memory and KV)\n */\n async set(\n key: string,\n value: T,\n customConfig?: Partial\n ): Promise {\n const config = { ...this.config, ...customConfig }\n\n // Store in memory cache (Tier 1)\n if (config.memoryEnabled) {\n this.memoryCache.set(key, value, config.ttl, config.version)\n }\n\n // Store in KV cache (Tier 2)\n if (config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.put(key, JSON.stringify(value), {\n expirationTtl: config.ttl\n })\n } catch (error) {\n console.error('KV cache write error:', error)\n }\n }\n }\n\n /**\n * Delete value from cache (removes from both memory and KV)\n */\n async delete(key: string): Promise {\n // Delete from memory (Tier 1)\n if (this.config.memoryEnabled) {\n this.memoryCache.delete(key)\n }\n\n // Delete from KV (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.delete(key)\n } catch (error) {\n console.error('KV cache delete error:', error)\n }\n }\n }\n\n /**\n * Clear all cache entries for this namespace\n */\n async clear(): Promise {\n if (this.config.memoryEnabled) {\n this.memoryCache.clear()\n }\n\n // Reset stats\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Invalidate cache entries matching a pattern\n */\n async invalidate(pattern: string): Promise {\n let count = 0\n\n // Invalidate from memory (Tier 1)\n if (this.config.memoryEnabled) {\n count += this.memoryCache.invalidatePattern(pattern)\n }\n\n // Invalidate from KV (Tier 2)\n // Note: KV doesn't support pattern matching, so we need to list all keys\n // This is expensive and should be used sparingly\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n // List all keys with the namespace prefix\n const prefix = this.config.namespace + ':'\n const list = await this.kvNamespace.list({ prefix })\n\n for (const key of list.keys) {\n if (regex.test(key.name)) {\n await this.kvNamespace.delete(key.name)\n count++\n }\n }\n } catch (error) {\n console.error('KV cache invalidation error:', error)\n }\n }\n\n return count\n }\n\n /**\n * Invalidate cache entries matching a pattern (alias for invalidate)\n */\n async invalidatePattern(pattern: string): Promise {\n return this.invalidate(pattern)\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const memStats = this.memoryCache.getStats()\n\n return {\n ...this.stats,\n memorySize: memStats.size,\n entryCount: memStats.count\n }\n }\n\n /**\n * Update hit rate calculation\n */\n private updateHitRate(): void {\n const totalHits = this.stats.memoryHits + this.stats.kvHits + this.stats.dbHits\n this.stats.hitRate = this.stats.totalRequests > 0\n ? (totalHits / this.stats.totalRequests) * 100\n : 0\n }\n\n /**\n * Generate a cache key using the configured namespace\n */\n generateKey(type: string, identifier: string): string {\n return generateCacheKey(\n this.config.namespace,\n type,\n identifier,\n this.config.version\n )\n }\n\n /**\n * Warm cache with multiple entries\n */\n async warmCache(entries: Array<{ key: string; value: T }>): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value)\n }\n }\n\n /**\n * Check if a key exists in cache\n */\n async has(key: string): Promise {\n const value = await this.get(key)\n return value !== null\n }\n\n /**\n * Get multiple values at once\n */\n async getMany(keys: string[]): Promise> {\n const results = new Map()\n\n for (const key of keys) {\n const value = await this.get(key)\n if (value !== null) {\n results.set(key, value)\n }\n }\n\n return results\n }\n\n /**\n * Set multiple values at once\n */\n async setMany(\n entries: Array<{ key: string; value: T }>,\n customConfig?: Partial\n ): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value, customConfig)\n }\n }\n\n /**\n * Delete multiple keys at once\n */\n async deleteMany(keys: string[]): Promise {\n for (const key of keys) {\n await this.delete(key)\n }\n }\n\n /**\n * Get or set pattern - fetch from cache or compute if not found\n */\n async getOrSet(\n key: string,\n fetcher: () => Promise,\n customConfig?: Partial\n ): Promise {\n // Try to get from cache\n const cached = await this.get(key)\n if (cached !== null) {\n return cached\n }\n\n // Fetch from source\n const value = await fetcher()\n\n // Store in cache\n await this.set(key, value, customConfig)\n\n return value\n }\n\n /**\n * List all cache keys with metadata\n */\n async listKeys(): Promise> {\n const keys: Array<{ key: string; size: number; expiresAt: number; age: number }> = []\n\n // Get keys from memory cache\n if (this.config.memoryEnabled) {\n const cache = (this.memoryCache as any).cache as Map>\n for (const [key, entry] of cache.entries()) {\n const size = JSON.stringify(entry).length * 2\n const age = Date.now() - entry.timestamp\n keys.push({\n key,\n size,\n expiresAt: entry.expiresAt,\n age\n })\n }\n }\n\n // Sort by age (newest first)\n return keys.sort((a, b) => a.age - b.age)\n }\n\n /**\n * Get cache entry with full metadata\n */\n async getEntry(key: string): Promise<{\n data: T\n timestamp: number\n expiresAt: number\n ttl: number\n size: number\n } | null> {\n if (!this.config.memoryEnabled) {\n return null\n }\n\n const cache = (this.memoryCache as any).cache as Map>\n const entry = cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n await this.delete(key)\n return null\n }\n\n const size = JSON.stringify(entry).length * 2\n const ttl = Math.max(0, entry.expiresAt - Date.now()) / 1000\n\n return {\n data: entry.data as T,\n timestamp: entry.timestamp,\n expiresAt: entry.expiresAt,\n ttl,\n size\n }\n }\n}\n\n/**\n * Create a cache service instance with configuration\n */\nexport function createCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n return new CacheService(config, kvNamespace)\n}\n\n/**\n * Global cache instances by namespace (singleton pattern)\n */\nconst cacheInstances = new Map()\nlet globalKVNamespace: KVNamespace | undefined\n\n/**\n * Set global KV namespace for all cache instances\n */\nexport function setGlobalKVNamespace(kvNamespace: KVNamespace): void {\n globalKVNamespace = kvNamespace\n}\n\n/**\n * Get or create a cache service for a namespace\n */\nexport function getCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n const key = config.namespace\n\n if (!cacheInstances.has(key)) {\n // Use provided KV namespace or global one\n const kv = kvNamespace || globalKVNamespace\n cacheInstances.set(key, new CacheService(config, kv))\n }\n\n return cacheInstances.get(key)!\n}\n\n/**\n * Clear all cache instances\n */\nexport async function clearAllCaches(): Promise {\n for (const cache of cacheInstances.values()) {\n await cache.clear()\n }\n}\n\n/**\n * Get stats from all cache instances\n */\nexport function getAllCacheStats(): Record {\n const stats: Record = {}\n\n for (const [namespace, cache] of cacheInstances.entries()) {\n stats[namespace] = cache.getStats()\n }\n\n return stats\n}\n","/**\n * Event Bus for Cache Invalidation\n *\n * Provides a centralized event system for triggering cache invalidation\n * based on application events.\n */\n\nexport type EventHandler = (data?: any) => Promise | void\n\n// interface EventSubscription {\n// event: string\n// handler: EventHandler\n// }\n\nclass EventBus {\n private subscriptions: Map = new Map()\n private eventLog: Array<{ event: string; timestamp: number; data?: any }> = []\n private maxLogSize: number = 100\n\n /**\n * Subscribe to an event\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.subscriptions.has(event)) {\n this.subscriptions.set(event, [])\n }\n\n this.subscriptions.get(event)!.push(handler)\n\n // Return unsubscribe function\n return () => {\n const handlers = this.subscriptions.get(event)\n if (handlers) {\n const index = handlers.indexOf(handler)\n if (index > -1) {\n handlers.splice(index, 1)\n }\n }\n }\n }\n\n /**\n * Emit an event to all subscribers\n */\n async emit(event: string, data?: any): Promise {\n // Log the event\n this.logEvent(event, data)\n\n const handlers = this.subscriptions.get(event) || []\n\n // Execute all handlers\n await Promise.all(\n handlers.map(async (handler) => {\n try {\n await handler(data)\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error)\n }\n })\n )\n\n // Also emit to wildcard subscribers\n const wildcardHandlers = this.subscriptions.get('*') || []\n await Promise.all(\n wildcardHandlers.map(async (handler) => {\n try {\n await handler({ event, data })\n } catch (error) {\n console.error(`Error in wildcard event handler for ${event}:`, error)\n }\n })\n )\n }\n\n /**\n * Remove all subscribers for an event\n */\n off(event: string): void {\n this.subscriptions.delete(event)\n }\n\n /**\n * Get all registered events\n */\n getEvents(): string[] {\n return Array.from(this.subscriptions.keys())\n }\n\n /**\n * Get subscriber count for an event\n */\n getSubscriberCount(event: string): number {\n return this.subscriptions.get(event)?.length || 0\n }\n\n /**\n * Log an event for debugging\n */\n private logEvent(event: string, data?: any): void {\n this.eventLog.push({\n event,\n timestamp: Date.now(),\n data\n })\n\n // Keep log size manageable\n if (this.eventLog.length > this.maxLogSize) {\n this.eventLog.shift()\n }\n }\n\n /**\n * Get recent event log\n */\n getEventLog(limit: number = 50): Array<{ event: string; timestamp: number; data?: any }> {\n return this.eventLog.slice(-limit)\n }\n\n /**\n * Clear event log\n */\n clearEventLog(): void {\n this.eventLog = []\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n totalEvents: number\n totalSubscriptions: number\n eventCounts: Record\n } {\n const eventCounts: Record = {}\n\n for (const log of this.eventLog) {\n eventCounts[log.event] = (eventCounts[log.event] || 0) + 1\n }\n\n return {\n totalEvents: this.eventLog.length,\n totalSubscriptions: this.subscriptions.size,\n eventCounts\n }\n }\n}\n\n// Global event bus instance\nlet globalEventBus: EventBus | null = null\n\n/**\n * Get or create the global event bus\n */\nexport function getEventBus(): EventBus {\n if (!globalEventBus) {\n globalEventBus = new EventBus()\n }\n return globalEventBus\n}\n\n/**\n * Convenience function to emit an event\n */\nexport async function emitEvent(event: string, data?: any): Promise {\n const bus = getEventBus()\n await bus.emit(event, data)\n}\n\n/**\n * Convenience function to subscribe to an event\n */\nexport function onEvent(event: string, handler: EventHandler): () => void {\n const bus = getEventBus()\n return bus.on(event, handler)\n}\n","/**\n * Cache Invalidation Service\n *\n * Automatically invalidates cache entries based on application events\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\nimport { getEventBus, onEvent } from './event-bus.js'\n\n/**\n * Setup automatic cache invalidation based on events\n */\nexport function setupCacheInvalidation(): void {\n const _eventBus = getEventBus()\n\n // Content cache invalidation\n setupContentInvalidation()\n\n // User cache invalidation\n setupUserInvalidation()\n\n // Config cache invalidation\n setupConfigInvalidation()\n\n // Media cache invalidation\n setupMediaInvalidation()\n\n // API cache invalidation\n setupAPIInvalidation()\n\n // Collection cache invalidation\n setupCollectionInvalidation()\n\n console.log('Cache invalidation listeners registered')\n}\n\n/**\n * Content cache invalidation\n */\nfunction setupContentInvalidation(): void {\n const config = CACHE_CONFIGS.content\n if (!config) return\n const contentCache = getCacheService(config)\n\n // Invalidate on content updates\n onEvent('content.create', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.create')\n })\n\n onEvent('content.update', async (data) => {\n if (data?.id) {\n // Invalidate specific content item\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n // Invalidate all content lists\n await contentCache.invalidate('content:list:*')\n console.log('Cache invalidated: content.update', data?.id)\n })\n\n onEvent('content.delete', async (data) => {\n if (data?.id) {\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.delete', data?.id)\n })\n\n onEvent('content.publish', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.publish')\n })\n}\n\n/**\n * User cache invalidation\n */\nfunction setupUserInvalidation(): void {\n const config = CACHE_CONFIGS.user\n if (!config) return\n const userCache = getCacheService(config)\n\n onEvent('user.update', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.update', data?.id)\n })\n\n onEvent('user.delete', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.delete', data?.id)\n })\n\n onEvent('auth.login', async (data) => {\n if (data?.userId) {\n await userCache.delete(userCache.generateKey('id', data.userId))\n }\n console.log('Cache invalidated: auth.login', data?.userId)\n })\n\n onEvent('auth.logout', async (data) => {\n // Clear session cache\n const sessionConfig = CACHE_CONFIGS.session\n if (sessionConfig) {\n const sessionCache = getCacheService(sessionConfig)\n if (data?.sessionId) {\n await sessionCache.delete(sessionCache.generateKey('session', data.sessionId))\n }\n }\n console.log('Cache invalidated: auth.logout')\n })\n}\n\n/**\n * Config cache invalidation\n */\nfunction setupConfigInvalidation(): void {\n const configConfig = CACHE_CONFIGS.config\n if (!configConfig) return\n const configCache = getCacheService(configConfig)\n\n onEvent('config.update', async (_data) => {\n await configCache.invalidate('config:*')\n console.log('Cache invalidated: config.update')\n })\n\n onEvent('plugin.activate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.activate', data?.pluginId)\n })\n\n onEvent('plugin.deactivate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.deactivate', data?.pluginId)\n })\n\n onEvent('plugin.update', async (data) => {\n const pluginConfig = CACHE_CONFIGS.plugin\n if (!pluginConfig) return\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n console.log('Cache invalidated: plugin.update', data?.pluginId)\n })\n}\n\n/**\n * Media cache invalidation\n */\nfunction setupMediaInvalidation(): void {\n const config = CACHE_CONFIGS.media\n if (!config) return\n const mediaCache = getCacheService(config)\n\n onEvent('media.upload', async (_data) => {\n await mediaCache.invalidate('media:*')\n console.log('Cache invalidated: media.upload')\n })\n\n onEvent('media.delete', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.delete', data?.id)\n })\n\n onEvent('media.update', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.update', data?.id)\n })\n}\n\n/**\n * API cache invalidation (depends on content changes)\n */\nfunction setupAPIInvalidation(): void {\n const config = CACHE_CONFIGS.api\n if (!config) return\n const apiCache = getCacheService(config)\n\n onEvent('content.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.update)')\n })\n\n onEvent('content.publish', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.publish)')\n })\n\n onEvent('content.create', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.create)')\n })\n\n onEvent('content.delete', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.delete)')\n })\n\n onEvent('collection.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (collection.update)')\n })\n}\n\n/**\n * Collection cache invalidation\n */\nfunction setupCollectionInvalidation(): void {\n const config = CACHE_CONFIGS.collection\n if (!config) return\n const collectionCache = getCacheService(config)\n\n onEvent('collection.create', async (_data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.create')\n })\n\n onEvent('collection.update', async (data) => {\n if (data?.id) {\n await collectionCache.delete(collectionCache.generateKey('item', data.id))\n }\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.update', data?.id)\n })\n\n onEvent('collection.delete', async (data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.delete', data?.id)\n })\n}\n\n/**\n * Get invalidation statistics\n */\nexport function getCacheInvalidationStats() {\n const eventBus = getEventBus()\n return eventBus.getStats()\n}\n\n/**\n * Get recent invalidation events\n */\nexport function getRecentInvalidations(limit: number = 50) {\n const eventBus = getEventBus()\n return eventBus.getEventLog(limit)\n}\n","/**\n * Cache Warming Utilities\n *\n * Utilities for preloading and warming cache entries\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\n\n/**\n * Warm cache with common queries\n */\nexport async function warmCommonCaches(db: D1Database): Promise<{\n warmed: number\n errors: number\n details: Array<{ namespace: string; count: number }>\n}> {\n let totalWarmed = 0\n let totalErrors = 0\n const details: Array<{ namespace: string; count: number }> = []\n\n try {\n // Warm collection cache\n const collectionCount = await warmCollections(db)\n totalWarmed += collectionCount\n details.push({ namespace: 'collection', count: collectionCount })\n\n // Warm content cache (most recent items)\n const contentCount = await warmRecentContent(db)\n totalWarmed += contentCount\n details.push({ namespace: 'content', count: contentCount })\n\n // Warm media cache (most recent items)\n const mediaCount = await warmRecentMedia(db)\n totalWarmed += mediaCount\n details.push({ namespace: 'media', count: mediaCount })\n\n } catch (error) {\n console.error('Error warming caches:', error)\n totalErrors++\n }\n\n return {\n warmed: totalWarmed,\n errors: totalErrors,\n details\n }\n}\n\n/**\n * Warm collections cache\n */\nasync function warmCollections(db: D1Database): Promise {\n const config = CACHE_CONFIGS.collection\n if (!config) return 0\n const collectionCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare('SELECT * FROM collections WHERE is_active = 1')\n const { results } = await stmt.all()\n\n for (const collection of results as any[]) {\n const key = collectionCache.generateKey('item', collection.id)\n await collectionCache.set(key, collection)\n count++\n }\n\n // Also cache the full list\n const listKey = collectionCache.generateKey('list', 'all')\n await collectionCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming collections cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent content cache\n */\nasync function warmRecentContent(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.content\n if (!config) return 0\n const contentCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM content ORDER BY created_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const content of results as any[]) {\n const key = contentCache.generateKey('item', content.id)\n await contentCache.set(key, content)\n count++\n }\n\n // Cache the list\n const listKey = contentCache.generateKey('list', 'recent')\n await contentCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming content cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent media cache\n */\nasync function warmRecentMedia(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.media\n if (!config) return 0\n const mediaCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const media of results as any[]) {\n const key = mediaCache.generateKey('item', media.id)\n await mediaCache.set(key, media)\n count++\n }\n\n // Cache the list\n const listKey = mediaCache.generateKey('list', 'recent')\n await mediaCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming media cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm specific namespace with custom data\n */\nexport async function warmNamespace(\n namespace: string,\n entries: Array<{ key: string; value: any }>\n): Promise {\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n throw new Error(`Unknown namespace: ${namespace}`)\n }\n\n const cache = getCacheService(config)\n await cache.setMany(entries)\n\n return entries.length\n}\n\n/**\n * Preload cache on application startup\n */\nexport async function preloadCache(db: D1Database): Promise {\n console.log('🔥 Preloading cache...')\n\n const result = await warmCommonCaches(db)\n\n console.log(`✅ Cache preloaded: ${result.warmed} entries across ${result.details.length} namespaces`)\n result.details.forEach(detail => {\n console.log(` - ${detail.namespace}: ${detail.count} entries`)\n })\n\n if (result.errors > 0) {\n console.warn(`⚠️ ${result.errors} errors during cache preloading`)\n }\n}\n\n/**\n * Schedule periodic cache warming\n */\nexport function schedulePeriodicWarming(\n db: D1Database,\n intervalMs: number = 300000 // 5 minutes default\n): NodeJS.Timeout {\n console.log(`⏰ Scheduling periodic cache warming every ${intervalMs / 1000}s`)\n\n return setInterval(async () => {\n try {\n console.log('🔄 Running periodic cache warming...')\n await warmCommonCaches(db)\n } catch (error) {\n console.error('Error during periodic cache warming:', error)\n }\n }, intervalMs)\n}\n","/**\n * Admin Cache Dashboard Template\n *\n * Moved from @sonicjs-cms/templates to avoid circular dependency\n * during build (templates imports from core, core can't import from templates)\n */\n\nimport { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\nexport interface CacheDashboardData {\n stats: Record\n totals: {\n hits: number\n misses: number\n requests: number\n hitRate: string\n memorySize: number\n entryCount: number\n }\n namespaces: string[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCacheDashboard(data: CacheDashboardData): string {\n const pageContent = `\n
\n \n
\n
\n

Cache System

\n

\n Monitor and manage cache performance across all namespaces\n

\n
\n
\n \n \n \n \n Refresh\n \n \n \n \n \n Clear All\n \n
\n
\n\n \n
\n ${renderStatCard('Total Requests', data.totals.requests.toLocaleString(), 'lime', `\n \n \n \n `)}\n\n ${renderStatCard('Hit Rate', data.totals.hitRate + '%', 'blue', `\n \n \n \n `, parseFloat(data.totals.hitRate) > 70 ? 'lime' : parseFloat(data.totals.hitRate) > 40 ? 'amber' : 'red')}\n\n ${renderStatCard('Memory Usage', formatBytes(data.totals.memorySize), 'purple', `\n \n \n \n `)}\n\n ${renderStatCard('Cached Entries', data.totals.entryCount.toLocaleString(), 'sky', `\n \n \n \n `)}\n
\n\n \n
\n
\n

Cache Namespaces

\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ${data.namespaces.map(namespace => {\n const stat = data.stats[namespace]\n if (!stat) return ''\n return renderNamespaceRow(namespace, stat)\n }).join('')}\n \n
\n Namespace\n \n Requests\n \n Hit Rate\n \n Memory Hits\n \n KV Hits\n \n Entries\n \n Size\n \n Actions\n
\n
\n
\n\n \n
\n
\n

Performance Overview

\n
\n
\n
\n ${renderPerformanceMetric('Memory Cache', data.totals.hits, data.totals.misses)}\n ${renderHealthStatus(parseFloat(data.totals.hitRate))}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'clear-all-cache-confirm',\n title: 'Clear All Cache',\n message: 'Are you sure you want to clear all cache entries? This cannot be undone.',\n confirmText: 'Clear All',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearAllCaches()'\n })}\n\n ${renderConfirmationDialog({\n id: 'clear-namespace-cache-confirm',\n title: 'Clear Namespace Cache',\n message: 'Clear cache for this namespace?',\n confirmText: 'Clear',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearNamespaceCache()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Cache System',\n pageTitle: 'Cache System',\n currentPath: '/admin/cache',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderStatCard(label: string, value: string, color: string, icon: string, colorOverride?: string): string {\n const finalColor = colorOverride || color\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n blue: 'bg-blue-50 dark:bg-blue-500/10 text-blue-600 dark:text-blue-400 ring-blue-600/20 dark:ring-blue-500/20',\n purple: 'bg-purple-50 dark:bg-purple-500/10 text-purple-600 dark:text-purple-400 ring-purple-600/20 dark:ring-purple-500/20',\n sky: 'bg-sky-50 dark:bg-sky-500/10 text-sky-600 dark:text-sky-400 ring-sky-600/20 dark:ring-sky-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n
\n
\n
\n
\n ${icon}\n
\n
\n

${label}

\n

${value}

\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderNamespaceRow(namespace: string, stat: CacheStats): string {\n const hitRate = stat.hitRate.toFixed(1)\n const hitRateColor = stat.hitRate > 70 ? 'text-lime-600 dark:text-lime-400' :\n stat.hitRate > 40 ? 'text-amber-600 dark:text-amber-400' :\n 'text-red-600 dark:text-red-400'\n\n return `\n \n \n \n ${namespace}\n \n \n \n ${stat.totalRequests.toLocaleString()}\n \n \n \n ${hitRate}%\n \n \n \n ${stat.memoryHits.toLocaleString()}\n \n \n ${stat.kvHits.toLocaleString()}\n \n \n ${stat.entryCount.toLocaleString()}\n \n \n ${formatBytes(stat.memorySize)}\n \n \n \n Clear\n \n \n \n `\n}\n\nfunction renderPerformanceMetric(label: string, hits: number, misses: number): string {\n const total = hits + misses\n const hitPercentage = total > 0 ? (hits / total) * 100 : 0\n\n return `\n
\n

${label}

\n
\n
\n Hits\n ${hits.toLocaleString()}\n
\n
\n Misses\n ${misses.toLocaleString()}\n
\n
\n
\n Hit Rate\n ${hitPercentage.toFixed(1)}%\n
\n
\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderHealthStatus(hitRate: number): string {\n const status = hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'critical'\n const statusConfig = {\n healthy: {\n label: 'Healthy',\n color: 'lime',\n icon: `\n \n `\n },\n warning: {\n label: 'Needs Attention',\n color: 'amber',\n icon: `\n \n `\n },\n critical: {\n label: 'Critical',\n color: 'red',\n icon: `\n \n `\n }\n }\n\n const config = statusConfig[status]\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n

System Health

\n
\n ${config.icon}\n
\n

${config.label}

\n

\n ${status === 'healthy' ? 'Cache is performing well' :\n status === 'warning' ? 'Consider increasing cache TTL or capacity' :\n 'Cache hit rate is too low'}\n

\n
\n
\n
\n `\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`\n}\n","/**\n * Cache Plugin Routes\n *\n * Admin routes for cache management\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport { getAllCacheStats, clearAllCaches, getCacheService } from './services/cache.js'\nimport { CACHE_CONFIGS, parseCacheKey } from './services/cache-config.js'\nimport { getRecentInvalidations, getCacheInvalidationStats } from './services/cache-invalidation.js'\nimport { warmCommonCaches, warmNamespace } from './services/cache-warming.js'\nimport { renderCacheDashboard, CacheDashboardData } from '../../templates/pages/admin-cache.template'\n\nconst app = new Hono()\n\n/**\n * GET /admin/cache\n * Cache statistics dashboard\n */\napp.get('/', async (c: Context) => {\n const stats = getAllCacheStats()\n const user = c.get('user')\n\n // Calculate totals\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n Object.values(stats).forEach(stat => {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n })\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n const dashboardData: CacheDashboardData = {\n stats,\n totals: {\n hits: totalHits,\n misses: totalMisses,\n requests: totalRequests,\n hitRate: overallHitRate.toFixed(2),\n memorySize: totalSize,\n entryCount: totalEntries\n },\n namespaces: Object.keys(stats),\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCacheDashboard(dashboardData))\n})\n\n/**\n * GET /admin/cache/stats\n * Detailed statistics for all namespaces\n */\napp.get('/stats', async (c: Context) => {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/stats/:namespace\n * Statistics for a specific namespace\n */\napp.get('/stats/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const stats = cache.getStats()\n\n return c.json({\n success: true,\n data: {\n namespace,\n config,\n stats\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear\n * Clear all cache entries\n */\napp.post('/clear', async (c: Context) => {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear/:namespace\n * Clear cache for a specific namespace\n */\napp.post('/clear/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n await cache.clear()\n\n return c.json({\n success: true,\n message: `Cache cleared for namespace: ${namespace}`,\n namespace,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/invalidate\n * Invalidate cache entries matching a pattern\n */\napp.post('/invalidate', async (c: Context) => {\n const body = await c.req.json()\n const { pattern, namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (namespace) {\n // Invalidate from specific namespace\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: namespace || 'all',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/health\n * Cache system health check\n */\napp.get('/health', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // Calculate health metrics\n const namespaces = Object.entries(stats)\n const healthChecks = namespaces.map(([name, stat]) => {\n const hitRate = stat.hitRate\n const memoryUsage = stat.memorySize / (50 * 1024 * 1024) // Assume 50MB max\n\n return {\n namespace: name,\n status: hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'unhealthy',\n hitRate,\n memoryUsage: (memoryUsage * 100).toFixed(2) + '%',\n entryCount: stat.entryCount\n }\n })\n\n const overallStatus = healthChecks.every(h => h.status === 'healthy')\n ? 'healthy'\n : healthChecks.some(h => h.status === 'unhealthy')\n ? 'unhealthy'\n : 'warning'\n\n return c.json({\n success: true,\n data: {\n status: overallStatus,\n namespaces: healthChecks,\n timestamp: new Date().toISOString()\n }\n })\n})\n\n/**\n * GET /admin/cache/browser\n * Browse all cache entries across namespaces\n */\napp.get('/browser', async (c: Context) => {\n const namespace = c.req.query('namespace') || 'all'\n const search = c.req.query('search') || ''\n const sortBy = c.req.query('sort') || 'age' // age, size, key\n const limit = parseInt(c.req.query('limit') || '100')\n\n const entries: Array<{\n namespace: string\n key: string\n size: number\n age: number\n ttl: number\n expiresAt: number\n parsed: any\n }> = []\n\n const namespaces = namespace === 'all'\n ? Object.keys(CACHE_CONFIGS)\n : [namespace]\n\n for (const ns of namespaces) {\n const config = CACHE_CONFIGS[ns]\n if (!config) continue\n\n const cache = getCacheService(config)\n const keys = await cache.listKeys()\n\n for (const keyInfo of keys) {\n // Apply search filter\n if (search && !keyInfo.key.toLowerCase().includes(search.toLowerCase())) {\n continue\n }\n\n const parsed = parseCacheKey(keyInfo.key)\n const ttl = Math.max(0, keyInfo.expiresAt - Date.now()) / 1000\n\n entries.push({\n namespace: ns,\n key: keyInfo.key,\n size: keyInfo.size,\n age: keyInfo.age,\n ttl,\n expiresAt: keyInfo.expiresAt,\n parsed\n })\n }\n }\n\n // Sort entries\n if (sortBy === 'size') {\n entries.sort((a, b) => b.size - a.size)\n } else if (sortBy === 'age') {\n entries.sort((a, b) => a.age - b.age)\n } else if (sortBy === 'key') {\n entries.sort((a, b) => a.key.localeCompare(b.key))\n }\n\n // Limit results\n const limitedEntries = entries.slice(0, limit)\n\n return c.json({\n success: true,\n data: {\n entries: limitedEntries,\n total: entries.length,\n showing: limitedEntries.length,\n namespace,\n search,\n sortBy\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/browser/:namespace/:key\n * Get detailed information about a specific cache entry\n */\napp.get('/browser/:namespace/:key', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const key = decodeURIComponent(c.req.param('key')!)\n\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const entry = await cache.getEntry(key)\n\n if (!entry) {\n return c.json({\n success: false,\n error: 'Cache entry not found or expired'\n }, 404)\n }\n\n const parsed = parseCacheKey(key)\n\n return c.json({\n success: true,\n data: {\n key,\n namespace,\n parsed,\n ...entry,\n createdAt: new Date(entry.timestamp).toISOString(),\n expiresAt: new Date(entry.expiresAt).toISOString()\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics\n * Advanced cache analytics\n */\napp.get('/analytics', async (c: Context) => {\n const stats = getAllCacheStats()\n const invalidationStats = getCacheInvalidationStats()\n const recentInvalidations = getRecentInvalidations(20)\n\n // Calculate analytics\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n const namespacesAnalytics = []\n\n for (const [namespace, stat] of Object.entries(stats)) {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n\n const totalRequests = stat.memoryHits + stat.kvHits + stat.memoryMisses + stat.kvMisses\n const hitRate = totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / totalRequests) * 100 : 0\n const avgEntrySize = stat.entryCount > 0 ? stat.memorySize / stat.entryCount : 0\n\n namespacesAnalytics.push({\n namespace,\n hitRate: hitRate.toFixed(2),\n totalRequests,\n memoryHitRate: totalRequests > 0 ? ((stat.memoryHits / totalRequests) * 100).toFixed(2) : '0',\n kvHitRate: totalRequests > 0 ? ((stat.kvHits / totalRequests) * 100).toFixed(2) : '0',\n avgEntrySize: Math.round(avgEntrySize),\n totalSize: stat.memorySize,\n entryCount: stat.entryCount,\n efficiency: totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / (stat.memoryHits + stat.kvHits + stat.dbHits + 1)).toFixed(2) : '0'\n })\n }\n\n // Sort by hit rate\n namespacesAnalytics.sort((a, b) => parseFloat(b.hitRate) - parseFloat(a.hitRate))\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n // Calculate cost savings (assume 50ms per DB query vs 2ms for cache)\n const dbQueriesAvoided = totalHits\n const timeSaved = dbQueriesAvoided * 48 // 48ms saved per cache hit\n const estimatedCostSavings = (dbQueriesAvoided / 1000000) * 0.50 // $0.50 per million queries\n\n return c.json({\n success: true,\n data: {\n overview: {\n totalHits,\n totalMisses,\n totalRequests,\n overallHitRate: overallHitRate.toFixed(2),\n totalSize,\n totalEntries,\n avgEntrySize: totalEntries > 0 ? Math.round(totalSize / totalEntries) : 0\n },\n performance: {\n dbQueriesAvoided,\n timeSavedMs: timeSaved,\n timeSavedMinutes: (timeSaved / 1000 / 60).toFixed(2),\n estimatedCostSavings: estimatedCostSavings.toFixed(4)\n },\n namespaces: namespacesAnalytics,\n invalidation: {\n ...invalidationStats,\n recent: recentInvalidations\n }\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/trends\n * Cache trends over time (simplified - would need historical data storage)\n */\napp.get('/analytics/trends', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // For now, return current snapshot as a data point\n // In production, this would query historical data\n const dataPoint = {\n timestamp: Date.now(),\n stats: Object.entries(stats).map(([namespace, stat]) => ({\n namespace,\n hitRate: stat.hitRate,\n entryCount: stat.entryCount,\n memorySize: stat.memorySize,\n totalRequests: stat.totalRequests\n }))\n }\n\n return c.json({\n success: true,\n data: {\n trends: [dataPoint],\n note: 'Historical trends require persistent storage. This returns current snapshot only.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/top-keys\n * Most accessed cache keys (would need hit tracking)\n */\napp.get('/analytics/top-keys', async (c: Context) => {\n const _namespace = c.req.query('namespace') || 'all'\n const _limit = parseInt(c.req.query('limit') || '10')\n\n // This is a placeholder - would need per-key hit tracking\n return c.json({\n success: true,\n data: {\n topKeys: [],\n note: 'Top keys tracking requires per-key hit counting. Feature not yet implemented.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/warm\n * Warm cache with common queries\n */\napp.post('/warm', async (c: Context) => {\n try {\n const db = c.env.DB as D1Database\n const result = await warmCommonCaches(db)\n\n return c.json({\n success: true,\n message: 'Cache warming completed',\n ...result,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Cache warming error:', error)\n return c.json({\n success: false,\n error: 'Cache warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * POST /admin/cache/warm/:namespace\n * Warm specific namespace cache\n */\napp.post('/warm/:namespace', async (c: Context) => {\n try {\n const namespace = c.req.param('namespace')!\n const body = await c.req.json()\n const { entries } = body\n\n if (!entries || !Array.isArray(entries)) {\n return c.json({\n success: false,\n error: 'Entries array is required'\n }, 400)\n }\n\n const count = await warmNamespace(namespace, entries)\n\n return c.json({\n success: true,\n message: `Warmed ${count} entries in namespace: ${namespace}`,\n namespace,\n count,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Namespace warming error:', error)\n return c.json({\n success: false,\n error: 'Namespace warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Cache Plugin\n *\n * Three-tiered caching system for SonicJS\n * - Tier 1: In-Memory (fastest, region-specific)\n * - Tier 2: Cloudflare KV (fast, global)\n * - Tier 3: Database (source of truth)\n */\n\nimport type { Context } from 'hono'\nimport type { PluginContext } from '@sonicjs-cms/core'\nimport { getCacheService, clearAllCaches, getAllCacheStats } from './services/cache.js'\nimport { CACHE_CONFIGS } from './services/cache-config.js'\nimport { setupCacheInvalidation } from './services/cache-invalidation.js'\nimport cacheRoutes from './routes.js'\n\nexport class CachePlugin {\n private _context: PluginContext | null = null\n\n /**\n * Get plugin routes\n */\n getRoutes() {\n return cacheRoutes\n }\n\n /**\n * Activate the cache plugin\n */\n async activate(context: PluginContext): Promise {\n this._context = context\n\n const settings = context.config || {}\n\n console.log('✅ Cache plugin activated', {\n memoryEnabled: settings.memoryEnabled ?? true,\n kvEnabled: settings.kvEnabled ?? false,\n defaultTTL: settings.defaultTTL ?? 3600\n })\n\n // Initialize default cache services\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n\n // Setup event-based cache invalidation\n setupCacheInvalidation()\n }\n\n /**\n * Deactivate the cache plugin\n */\n async deactivate(): Promise {\n console.log('❌ Cache plugin deactivated - clearing all caches')\n await clearAllCaches()\n this._context = null\n }\n\n /**\n * Configure the cache plugin\n */\n async configure(settings: Record): Promise {\n console.log('⚙️ Cache plugin configured', settings)\n\n // Reconfigure all cache instances with new settings\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n }\n\n /**\n * Get cache statistics\n */\n async getStats(c: Context): Promise {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Clear all cache entries\n */\n async clearCache(c: Context): Promise {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Invalidate cache entries matching pattern\n */\n async invalidatePattern(c: Context): Promise {\n const body = await c.req.json()\n const { pattern, namespace: _namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (_namespace) {\n // Invalidate from specific namespace\n const cache = getCacheService(CACHE_CONFIGS[_namespace] || {\n ttl: 3600,\n kvEnabled: false,\n memoryEnabled: true,\n namespace: _namespace,\n invalidateOn: [],\n version: 'v1'\n })\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: _namespace || 'all',\n timestamp: new Date().toISOString()\n })\n }\n}\n\n// Export cache services for use by other plugins/routes when cache plugin is active\nexport {\n getCacheService,\n clearAllCaches,\n getAllCacheStats,\n setGlobalKVNamespace\n} from './services/cache'\nexport { CACHE_CONFIGS, getCacheConfig, generateCacheKey } from './services/cache-config'\nexport type { CacheConfig, CacheStats } from './services/cache-config'\nexport { emitEvent, onEvent, getEventBus } from './services/event-bus'\nexport { getCacheInvalidationStats, getRecentInvalidations } from './services/cache-invalidation'\nexport { warmCommonCaches, warmNamespace, preloadCache } from './services/cache-warming'\n\n// Create and export plugin instance\nconst plugin = new CachePlugin()\nexport default plugin\n","/**\n * SonicJS Favicon SVG\n *\n * Embedded SVG favicon for the admin interface and auth pages.\n * This ensures the favicon is always available without external dependencies.\n */\n\nexport const faviconSvg = `\n\n\n\t\n\t\t\n\t\t\n\t\n\n`;\n","/**\n * Main Application Factory\n *\n * Creates a configured SonicJS application with all core functionality\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport {\n apiRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n testCleanupRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminPluginRoutes,\n adminLogsRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n adminFormsRoutes,\n publicFormsRoutes,\n adminApiReferenceRoutes\n} from './routes'\nimport { getCoreVersion } from './utils/version'\nimport { bootstrapMiddleware } from './middleware/bootstrap'\nimport { metricsMiddleware } from './middleware/metrics'\nimport { csrfProtection } from './middleware/csrf'\nimport { securityHeadersMiddleware } from './middleware/security-headers'\nimport { createDatabaseToolsAdminRoutes } from './plugins/core-plugins/database-tools-plugin/admin-routes'\nimport { createSeedDataAdminRoutes } from './plugins/core-plugins/seed-data-plugin/admin-routes'\nimport { emailPlugin } from './plugins/core-plugins/email-plugin'\nimport { otpLoginPlugin } from './plugins/core-plugins/otp-login-plugin'\nimport { oauthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nimport { userProfilesPlugin } from './plugins/core-plugins/user-profiles'\nimport { aiSearchPlugin } from './plugins/core-plugins/ai-search-plugin'\nimport { createMagicLinkAuthPlugin } from './plugins/available/magic-link-auth'\nimport { securityAuditPlugin } from './plugins/core-plugins/security-audit-plugin'\nimport { securityAuditMiddleware } from './plugins/core-plugins/security-audit-plugin'\nimport { stripePlugin } from './plugins/core-plugins/stripe-plugin'\nimport { requireAuth, requireRole } from './middleware/auth'\nimport { pluginMenuMiddleware } from './middleware/plugin-menu'\nimport { analyticsPlugin } from './plugins/core-plugins/analytics'\nimport { eventsApiRoutes } from './plugins/core-plugins/analytics/routes/api'\nimport cachePlugin from './plugins/cache'\nimport { faviconSvg } from './assets/favicon'\nimport { setAppInstance } from './services/route-metadata'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface Bindings {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n CORS_ORIGINS?: string\n JWT_SECRET?: string\n JWT_EXPIRES_IN?: string\n JWT_REFRESH_GRACE_SECONDS?: string\n BUCKET_NAME?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\nexport interface Variables {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n csrfToken?: string\n pluginMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport interface SonicJSConfig {\n // Collections configuration\n collections?: {\n directory?: string\n autoSync?: boolean\n }\n\n // Plugins configuration\n plugins?: {\n directory?: string\n autoLoad?: boolean\n disableAll?: boolean // Disable all plugins including core plugins\n }\n\n // Custom routes\n routes?: Array<{\n path: string\n handler: Hono\n }>\n\n // Custom middleware\n middleware?: {\n beforeAuth?: Array<(c: Context, next: () => Promise) => Promise>\n afterAuth?: Array<(c: Context, next: () => Promise) => Promise>\n }\n\n // Admin access control\n // Roles allowed to access the /admin panel. Defaults to ['admin'].\n adminAccessRoles?: string[]\n\n // App metadata\n version?: string\n name?: string\n}\n\nexport type SonicJSApp = Hono<{ Bindings: Bindings; Variables: Variables }>\n\n// ============================================================================\n// Application Factory\n// ============================================================================\n\n/**\n * Create a SonicJS application with core functionality\n *\n * @param config - Application configuration\n * @returns Configured Hono application\n *\n * @example\n * ```typescript\n * import { createSonicJSApp } from '@sonicjs-cms/core'\n *\n * const app = createSonicJSApp({\n * collections: {\n * directory: './src/collections',\n * autoSync: true\n * },\n * plugins: {\n * directory: './src/plugins',\n * autoLoad: true\n * }\n * })\n *\n * export default app\n * ```\n */\nexport function createSonicJSApp(config: SonicJSConfig = {}): SonicJSApp {\n const app = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Set app metadata\n const appVersion = config.version || getCoreVersion()\n const appName = config.name || 'SonicJS AI'\n\n // App version middleware\n app.use('*', async (c, next) => {\n c.set('appVersion', appVersion)\n await next()\n })\n\n // Metrics middleware - track all requests for real-time analytics\n app.use('*', metricsMiddleware())\n\n // Bootstrap middleware - runs migrations, syncs collections, and initializes plugins\n app.use('*', bootstrapMiddleware(config))\n\n // Custom middleware - before auth\n if (config.middleware?.beforeAuth) {\n for (const middleware of config.middleware.beforeAuth) {\n app.use('*', middleware)\n }\n }\n\n // Logging middleware\n app.use('*', async (_c, next) => {\n // Logging logic here\n await next()\n })\n\n // Security middleware\n app.use('*', securityHeadersMiddleware())\n\n // CSRF protection middleware\n app.use('*', csrfProtection())\n\n // Custom middleware - after auth\n if (config.middleware?.afterAuth) {\n for (const middleware of config.middleware.afterAuth) {\n app.use('*', middleware)\n }\n }\n\n // Admin panel access control: require authentication and admin role by default\n const adminRoles = config.adminAccessRoles || ['admin']\n app.use('/admin/*', requireAuth())\n app.use('/admin/*', requireRole(adminRoles))\n\n // Plugin dynamic menu items for admin sidebar\n app.use('/admin/*', pluginMenuMiddleware())\n\n // Core routes\n // Routes are being imported incrementally from routes/*\n // Each route is tested and migrated one-by-one\n app.route('/api', apiRoutes)\n app.route('/api/media', apiMediaRoutes)\n app.route('/api/system', apiSystemRoutes)\n app.route('/admin/api', adminApiRoutes)\n app.route('/admin/dashboard', adminDashboardRoutes)\n app.route('/admin/collections', adminCollectionsRoutes)\n app.route('/admin/forms', adminFormsRoutes)\n app.route('/admin/settings', adminSettingsRoutes)\n app.route('/forms', publicFormsRoutes)\n app.route('/api/forms', publicFormsRoutes) // API endpoint for form submissions\n app.route('/admin/api-reference', adminApiReferenceRoutes)\n app.route('/admin/database-tools', createDatabaseToolsAdminRoutes())\n app.route('/admin/seed-data', createSeedDataAdminRoutes())\n app.route('/admin/content', adminContentRoutes)\n app.route('/admin/media', adminMediaRoutes)\n // Security audit middleware - logs auth events (login, register, logout)\n app.use('/auth/*', securityAuditMiddleware())\n\n // Plugin routes - Security Audit (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (securityAuditPlugin.routes && securityAuditPlugin.routes.length > 0) {\n for (const route of securityAuditPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - AI Search (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register AI Search routes first so they take precedence over the generic /:id handler\n if (aiSearchPlugin.routes && aiSearchPlugin.routes.length > 0) {\n for (const route of aiSearchPlugin.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Plugin routes - Cache (dashboard and management API)\n // Fixes GitHub Issue #461: Cache routes were not registered\n app.route('/admin/cache', cachePlugin.getRoutes())\n\n // Plugin routes - OAuth Providers (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (oauthProvidersPlugin.routes && oauthProvidersPlugin.routes.length > 0) {\n for (const route of oauthProvidersPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - User Profiles\n if (userProfilesPlugin.routes && userProfilesPlugin.routes.length > 0) {\n for (const route of userProfilesPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - OTP Login (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register OTP Login routes first so they take precedence over the generic /:id handler\n if (otpLoginPlugin.routes && otpLoginPlugin.routes.length > 0) {\n for (const route of otpLoginPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Analytics (must be before /admin/plugins catch-all)\n if (analyticsPlugin.routes && analyticsPlugin.routes.length > 0) {\n for (const route of analyticsPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Public event tracking API — POST /api/events (open), GET /api/events (admin)\n app.route('/api/events', eventsApiRoutes)\n\n // Plugin routes - Stripe (must be before /admin/plugins catch-all)\n if (stripePlugin.routes && stripePlugin.routes.length > 0) {\n for (const route of stripePlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n app.route('/admin/plugins', adminPluginRoutes)\n app.route('/admin/logs', adminLogsRoutes)\n app.route('/admin', adminUsersRoutes)\n app.route('/auth', authRoutes)\n\n // Test cleanup routes (only for development/test environments)\n app.route('/', testCleanupRoutes)\n\n // Plugin routes - Email\n if (emailPlugin.routes && emailPlugin.routes.length > 0) {\n for (const route of emailPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Magic Link Auth (passwordless authentication via email links)\n const magicLinkPlugin = createMagicLinkAuthPlugin()\n if (magicLinkPlugin.routes && magicLinkPlugin.routes.length > 0) {\n for (const route of magicLinkPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Serve favicon\n app.get('/favicon.svg', (c) => {\n return new Response(faviconSvg, {\n headers: {\n 'Content-Type': 'image/svg+xml',\n 'Cache-Control': 'public, max-age=31536000'\n }\n })\n })\n\n // Serve files from R2 storage (public file access)\n app.get('/files/*', async (c) => {\n try {\n // Extract the path from the URL pathname (everything after /files/)\n const url = new URL(c.req.url)\n const pathname = url.pathname\n\n // Remove the /files/ prefix to get the R2 object key\n const objectKey = pathname.replace(/^\\/files\\//, '')\n\n if (!objectKey) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(objectKey)\n\n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n headers.set('Access-Control-Allow-Origin', '*') // Allow CORS for media files\n headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n headers.set('Access-Control-Allow-Headers', 'Content-Type')\n\n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n })\n\n // Custom routes - User-defined routes\n if (config.routes) {\n for (const route of config.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Root redirect to login\n app.get('/', (c) => {\n return c.redirect('/auth/login')\n })\n\n // Health check\n app.get('/health', (c) => {\n return c.json({\n name: appName,\n version: appVersion,\n status: 'running',\n timestamp: new Date().toISOString()\n })\n })\n\n // Store app instance for route introspection (API reference auto-discovery)\n setAppInstance(app)\n\n // 404 handler\n app.notFound((c) => {\n return c.json({ error: 'Not Found', status: 404 }, 404)\n })\n\n // Error handler\n app.onError((err, c) => {\n console.error(err)\n return c.json({ error: 'Internal Server Error', status: 500 }, 500)\n })\n\n return app\n}\n\n/**\n * Setup core middleware (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreMiddleware(_app: SonicJSApp): void {\n console.warn('setupCoreMiddleware is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n\n/**\n * Setup core routes (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreRoutes(_app: SonicJSApp): void {\n console.warn('setupCoreRoutes is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n","import { drizzle } from 'drizzle-orm/d1';\nimport * as schema from './schema';\n\nexport function createDb(d1: D1Database) {\n return drizzle(d1, { schema });\n}\n\nexport * from './schema';","/**\n * @sonicjs/core - Main Entry Point\n *\n * Core framework for SonicJS headless CMS\n * Built for Cloudflare's edge platform with TypeScript\n *\n * Phase 2 Migration Status:\n * - Week 1: Types, Utils, Database (COMPLETED ✓)\n * - Week 2: Services, Middleware, Plugins (COMPLETED ✓)\n * - Week 3: Routes, Templates (COMPLETED ✓)\n * - Week 4: Integration & Testing (COMPLETED ✓)\n *\n * Test Coverage:\n * - Utilities: 48 tests (sanitize, query-filter, metrics)\n * - Middleware: 51 tests (auth, logging, security, performance)\n * - Total: 99 tests passing\n */\n\n// ============================================================================\n// Main Application API (Phase 2 Week 1)\n// ============================================================================\n\nexport { createSonicJSApp, setupCoreMiddleware, setupCoreRoutes } from './app'\nexport type { SonicJSConfig, SonicJSApp, Bindings, Variables } from './app'\n\n// ============================================================================\n// Placeholders - To be populated in Phase 2\n// ============================================================================\n\n// Services - Week 2 (COMPLETED)\nexport {\n // Collection Management\n loadCollectionConfigs,\n loadCollectionConfig,\n getAvailableCollectionNames,\n validateCollectionConfig,\n registerCollections,\n syncCollections,\n syncCollection,\n isCollectionManaged,\n getManagedCollections,\n cleanupRemovedCollections,\n fullCollectionSync,\n // Form-Collection Sync\n syncAllFormCollections,\n syncFormCollection,\n createContentFromSubmission,\n deriveCollectionSchemaFromFormio,\n deriveSubmissionTitle,\n mapFormStatusToContentStatus,\n backfillFormSubmissions,\n // Database Migrations\n MigrationService,\n // Logging\n Logger,\n getLogger,\n initLogger,\n // Plugin Services - Class implementations\n PluginService as PluginServiceClass,\n PluginBootstrapService,\n} from './services'\n\nexport type { Migration, MigrationStatus, LogLevel, LogCategory, LogEntry, LogFilter, CorePlugin } from './services'\n\n// Middleware - Week 2 (COMPLETED)\nexport {\n // Authentication\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n // Logging\n loggingMiddleware,\n detailedLoggingMiddleware,\n securityLoggingMiddleware,\n performanceLoggingMiddleware,\n // Performance\n cacheHeaders,\n compressionMiddleware,\n securityHeaders,\n // Permissions\n PermissionManager,\n requirePermission,\n requireAnyPermission,\n logActivity,\n // Plugin middleware\n requireActivePlugin,\n requireActivePlugins,\n getActivePlugins,\n isPluginActive,\n // Bootstrap\n bootstrapMiddleware,\n} from './middleware'\n\nexport type { Permission, UserPermissions } from './middleware'\n\n// Plugins - Week 2 (COMPLETED)\nexport {\n // Hook System - Class implementations\n HookSystemImpl,\n ScopedHookSystem as ScopedHookSystemClass,\n HookUtils,\n // Plugin Registry\n PluginRegistryImpl,\n // Plugin Manager - Class implementation\n PluginManager as PluginManagerClass,\n // Plugin Validator - Class implementation\n PluginValidator as PluginValidatorClass,\n} from './plugins'\n\n// Routes - Week 3 (COMPLETED)\nexport {\n ROUTES_INFO,\n apiRoutes,\n apiContentCrudRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminLogsRoutes,\n adminPluginRoutes,\n adminDesignRoutes,\n adminCheckboxRoutes,\n adminTestimonialsRoutes,\n adminCodeExamplesRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n} from './routes'\n\n// Templates - Week 3 (COMPLETED)\nexport {\n // Form templates\n renderForm,\n renderFormField,\n // Table templates\n renderTable,\n // Pagination templates\n renderPagination,\n // Alert templates\n renderAlert,\n // Confirmation dialog templates\n renderConfirmationDialog,\n getConfirmationDialogScript,\n // Filter bar templates\n renderFilterBar,\n} from './templates'\n\nexport type {\n FormField,\n FormData,\n TableColumn,\n TableData,\n PaginationData,\n AlertData,\n ConfirmationDialogOptions,\n FilterBarData,\n Filter,\n FilterOption,\n} from './templates'\n\n// Types - Week 1 (COMPLETED)\nexport type {\n // Collection types\n FieldType,\n FieldConfig,\n CollectionSchema,\n CollectionConfig,\n CollectionConfigModule,\n CollectionSyncResult,\n // Plugin types\n Plugin,\n PluginContext,\n PluginConfig,\n PluginRoutes,\n PluginMiddleware,\n PluginModel,\n PluginService,\n PluginAdminPage,\n PluginComponent,\n PluginMenuItem,\n PluginHook,\n HookHandler,\n HookContext,\n HookSystem,\n ScopedHookSystem,\n PluginRegistry,\n PluginManager,\n PluginStatus,\n AuthService,\n ContentService,\n MediaService,\n PluginLogger,\n PluginBuilderOptions,\n PluginValidator,\n PluginValidationResult,\n HookName,\n // Plugin manifest\n PluginManifest,\n} from './types'\n\nexport { HOOKS } from './types'\n\n// Utils - Week 1 (COMPLETED)\nexport {\n // Sanitization\n escapeHtml,\n sanitizeInput,\n sanitizeObject,\n // Template rendering\n TemplateRenderer,\n templateRenderer,\n renderTemplate,\n // Query filtering\n QueryFilterBuilder,\n buildQuery,\n // Metrics\n metricsTracker,\n // Version\n SONICJS_VERSION,\n getCoreVersion,\n} from './utils'\n\nexport type {\n FilterOperator,\n FilterCondition,\n FilterGroup,\n QueryFilter,\n QueryResult,\n} from './utils'\n\n// Database - Week 1 (COMPLETED)\nexport {\n createDb,\n // Schema exports\n users,\n collections,\n content,\n contentVersions,\n media,\n apiTokens,\n workflowHistory,\n plugins,\n pluginHooks,\n pluginRoutes,\n pluginAssets,\n pluginActivityLog,\n systemLogs,\n logConfig,\n // Zod validation schemas\n insertUserSchema,\n selectUserSchema,\n insertCollectionSchema,\n selectCollectionSchema,\n insertContentSchema,\n selectContentSchema,\n insertMediaSchema,\n selectMediaSchema,\n insertWorkflowHistorySchema,\n selectWorkflowHistorySchema,\n insertPluginSchema,\n selectPluginSchema,\n insertPluginHookSchema,\n selectPluginHookSchema,\n insertPluginRouteSchema,\n selectPluginRouteSchema,\n insertPluginAssetSchema,\n selectPluginAssetSchema,\n insertPluginActivityLogSchema,\n selectPluginActivityLogSchema,\n insertSystemLogSchema,\n selectSystemLogSchema,\n insertLogConfigSchema,\n selectLogConfigSchema,\n} from './db'\n\nexport type {\n User,\n NewUser,\n Collection,\n NewCollection,\n Content,\n NewContent,\n Media,\n NewMedia,\n WorkflowHistory,\n NewWorkflowHistory,\n Plugin as DbPlugin,\n NewPlugin,\n PluginHook as DbPluginHook,\n NewPluginHook,\n PluginRoute,\n NewPluginRoute,\n PluginAsset,\n NewPluginAsset,\n PluginActivityLog,\n NewPluginActivityLog,\n SystemLog,\n NewSystemLog,\n LogConfig,\n NewLogConfig,\n} from './db'\n\n// Plugin SDK (Beta)\nexport { PluginBuilder, PluginHelpers } from './plugins/sdk'\n\n// OAuth Providers Plugin\nexport { oauthProvidersPlugin, createOAuthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nexport { OAuthService, BUILT_IN_PROVIDERS } from './plugins/core-plugins/oauth-providers/oauth-service'\n\n// User Profiles Plugin\nexport { userProfilesPlugin, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig } from './plugins/core-plugins/user-profiles'\nexport type { ProfileFieldDefinition, UserProfileConfig } from './plugins/core-plugins/user-profiles'\n\n// ============================================================================\n// Version\n// ============================================================================\n\n// Import version from package.json\nimport packageJson from '../package.json'\nexport const VERSION = packageJson.version\n\n// ============================================================================\n// Phase 2 Migration Notes\n// ============================================================================\n\n/**\n * This is a work-in-progress package being extracted from the main SonicJS codebase.\n *\n * Current Phase: 2 (Core Module Migration)\n * Current Week: 1 (Types, Utils, Database)\n *\n * Expected completion: 4 weeks from 2025-01-17\n *\n * DO NOT USE IN PRODUCTION - Alpha release for development only\n */\n"]} \ No newline at end of file diff --git a/packages/core/dist/index.js b/packages/core/dist/index.js index 4d02cbbb1..5624cd9bb 100644 --- a/packages/core/dist/index.js +++ b/packages/core/dist/index.js @@ -1,21 +1,21 @@ -import { getCustomData, renderConfirmationDialog, getConfirmationDialogScript, api_default, api_media_default, api_system_default, admin_api_default, router, adminCollectionsRoutes, adminFormsRoutes, adminSettingsRoutes, public_forms_default, router2, admin_content_default, adminMediaRoutes, userProfilesPlugin, adminPluginRoutes, adminLogsRoutes, userRoutes, auth_default, test_cleanup_default } from './chunk-M2PKQJ6J.js'; -export { ROUTES_INFO, admin_api_default as adminApiRoutes, adminCheckboxRoutes, admin_code_examples_default as adminCodeExamplesRoutes, adminCollectionsRoutes, admin_content_default as adminContentRoutes, router as adminDashboardRoutes, adminDesignRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, admin_testimonials_default as adminTestimonialsRoutes, userRoutes as adminUsersRoutes, api_content_crud_default as apiContentCrudRoutes, api_media_default as apiMediaRoutes, api_default as apiRoutes, api_system_default as apiSystemRoutes, auth_default as authRoutes, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig, userProfilesPlugin } from './chunk-M2PKQJ6J.js'; -import { SettingsService, setAppInstance, schema_exports } from './chunk-GQEIPW3L.js'; -export { Logger, apiTokens, collections, content, contentVersions, getLogger, initLogger, insertCollectionSchema, insertContentSchema, insertLogConfigSchema, insertMediaSchema, insertPluginActivityLogSchema, insertPluginAssetSchema, insertPluginHookSchema, insertPluginRouteSchema, insertPluginSchema, insertSystemLogSchema, insertUserSchema, insertWorkflowHistorySchema, logConfig, media, pluginActivityLog, pluginAssets, pluginHooks, pluginRoutes, plugins, selectCollectionSchema, selectContentSchema, selectLogConfigSchema, selectMediaSchema, selectPluginActivityLogSchema, selectPluginAssetSchema, selectPluginHookSchema, selectPluginRouteSchema, selectPluginSchema, selectSystemLogSchema, selectUserSchema, selectWorkflowHistorySchema, systemLogs, users, workflowHistory } from './chunk-GQEIPW3L.js'; -import { requireAuth, getJwtExpirySecondsFromDb, AuthManager, metricsMiddleware, bootstrapMiddleware, securityHeadersMiddleware, csrfProtection, requireRole } from './chunk-5QK3FXKX.js'; -export { AuthManager, PermissionManager, bootstrapMiddleware, cacheHeaders, compressionMiddleware, detailedLoggingMiddleware, getActivePlugins, isPluginActive, logActivity, loggingMiddleware, optionalAuth, performanceLoggingMiddleware, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware as securityHeaders, securityLoggingMiddleware } from './chunk-5QK3FXKX.js'; -import { PluginService, PLUGIN_REGISTRY } from './chunk-CJOLOONT.js'; -export { PluginBootstrapService, PluginService as PluginServiceClass, backfillFormSubmissions, cleanupRemovedCollections, createContentFromSubmission, deriveCollectionSchemaFromFormio, deriveSubmissionTitle, fullCollectionSync, getAvailableCollectionNames, getManagedCollections, isCollectionManaged, loadCollectionConfig, loadCollectionConfigs, mapFormStatusToContentStatus, registerCollections, syncAllFormCollections, syncCollection, syncCollections, syncFormCollection, validateCollectionConfig } from './chunk-CJOLOONT.js'; -export { MigrationService } from './chunk-CSQWOYGZ.js'; +import { getCustomData, renderConfirmationDialog, getConfirmationDialogScript, api_default, api_media_default, api_system_default, admin_api_default, router, adminCollectionsRoutes, adminFormsRoutes, adminSettingsRoutes, public_forms_default, router2, admin_content_default, adminMediaRoutes, userProfilesPlugin, adminPluginRoutes, adminLogsRoutes, userRoutes, auth_default, test_cleanup_default } from './chunk-OO7BOO6H.js'; +export { ROUTES_INFO, admin_api_default as adminApiRoutes, adminCheckboxRoutes, admin_code_examples_default as adminCodeExamplesRoutes, adminCollectionsRoutes, admin_content_default as adminContentRoutes, router as adminDashboardRoutes, adminDesignRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, admin_testimonials_default as adminTestimonialsRoutes, userRoutes as adminUsersRoutes, api_content_crud_default as apiContentCrudRoutes, api_media_default as apiMediaRoutes, api_default as apiRoutes, api_system_default as apiSystemRoutes, auth_default as authRoutes, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig, userProfilesPlugin } from './chunk-OO7BOO6H.js'; +import { SettingsService, setAppInstance, schema_exports } from './chunk-QFWHAFEO.js'; +export { Logger, apiTokens, collections, content, contentVersions, getLogger, initLogger, insertCollectionSchema, insertContentSchema, insertLogConfigSchema, insertMediaSchema, insertPluginActivityLogSchema, insertPluginAssetSchema, insertPluginHookSchema, insertPluginRouteSchema, insertPluginSchema, insertSystemLogSchema, insertUserSchema, insertWorkflowHistorySchema, logConfig, media, pluginActivityLog, pluginAssets, pluginHooks, pluginRoutes, plugins, selectCollectionSchema, selectContentSchema, selectLogConfigSchema, selectMediaSchema, selectPluginActivityLogSchema, selectPluginAssetSchema, selectPluginHookSchema, selectPluginRouteSchema, selectPluginSchema, selectSystemLogSchema, selectUserSchema, selectWorkflowHistorySchema, systemLogs, users, workflowHistory } from './chunk-QFWHAFEO.js'; +import { requireAuth, getJwtExpirySecondsFromDb, AuthManager, metricsMiddleware, bootstrapMiddleware, securityHeadersMiddleware, csrfProtection, requireRole } from './chunk-DMPXZ6JJ.js'; +export { AuthManager, PermissionManager, bootstrapMiddleware, cacheHeaders, compressionMiddleware, detailedLoggingMiddleware, getActivePlugins, isPluginActive, logActivity, loggingMiddleware, optionalAuth, performanceLoggingMiddleware, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware as securityHeaders, securityLoggingMiddleware } from './chunk-DMPXZ6JJ.js'; +import { PluginService, PLUGIN_REGISTRY } from './chunk-NJVY2U43.js'; +export { PluginBootstrapService, PluginService as PluginServiceClass, backfillFormSubmissions, cleanupRemovedCollections, createContentFromSubmission, deriveCollectionSchemaFromFormio, deriveSubmissionTitle, fullCollectionSync, getAvailableCollectionNames, getManagedCollections, isCollectionManaged, loadCollectionConfig, loadCollectionConfigs, mapFormStatusToContentStatus, registerCollections, syncAllFormCollections, syncCollection, syncCollections, syncFormCollection, validateCollectionConfig } from './chunk-NJVY2U43.js'; +export { MigrationService } from './chunk-46DCL763.js'; export { renderFilterBar } from './chunk-ON5ZMSU4.js'; import { renderAdminLayout } from './chunk-XWIA3HVX.js'; export { getConfirmationDialogScript, renderAlert, renderConfirmationDialog, renderForm, renderFormField, renderPagination, renderTable } from './chunk-XWIA3HVX.js'; import { init_admin_layout_catalyst_template, renderAdminLayoutCatalyst } from './chunk-55RDMDOP.js'; -export { HookSystemImpl, HookUtils, PluginManager as PluginManagerClass, PluginRegistryImpl, PluginValidator as PluginValidatorClass, ScopedHookSystem as ScopedHookSystemClass } from './chunk-NGTBJJXZ.js'; +export { HookSystemImpl, HookUtils, PluginManager as PluginManagerClass, PluginRegistryImpl, PluginValidator as PluginValidatorClass, ScopedHookSystem as ScopedHookSystemClass } from './chunk-TFNTM3OA.js'; import { PluginBuilder, PluginHelpers } from './chunk-EXNEW5US.js'; export { PluginBuilder, PluginHelpers } from './chunk-EXNEW5US.js'; -import { package_default, getCoreVersion } from './chunk-NDS4S4AG.js'; -export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, getCoreVersion, renderTemplate, templateRenderer } from './chunk-NDS4S4AG.js'; +import { package_default, getCoreVersion } from './chunk-FE77VWGD.js'; +export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, getCoreVersion, renderTemplate, templateRenderer } from './chunk-FE77VWGD.js'; import './chunk-X7ZAEI5S.js'; export { metricsTracker } from './chunk-FICTAGD4.js'; export { escapeHtml, sanitizeInput, sanitizeObject } from './chunk-TQABQWOP.js'; @@ -2005,7 +2005,7 @@ function createOTPLoginPlugin() { maxAge: tokenTtl }); const customData = await getCustomData(db, user.id); - const { is_active, ...publicUser } = user; + const { is_active: _isActive, ...publicUser } = user; return c.json({ success: true, user: { diff --git a/packages/core/dist/index.js.map b/packages/core/dist/index.js.map index 8de75f503..1ed120d40 100644 --- a/packages/core/dist/index.js.map +++ b/packages/core/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/core-plugins/database-tools-plugin/services/database-service.ts","../src/templates/pages/admin-database-table.template.ts","../src/plugins/core-plugins/database-tools-plugin/admin-routes.ts","../src/plugins/core-plugins/seed-data-plugin/services/seed-data-service.ts","../src/plugins/core-plugins/seed-data-plugin/admin-routes.ts","../src/plugins/core-plugins/email-plugin/index.ts","../src/plugins/core-plugins/otp-login-plugin/otp-service.ts","../src/plugins/core-plugins/otp-login-plugin/email-templates.ts","../src/plugins/core-plugins/otp-login-plugin/index.ts","../src/plugins/core-plugins/oauth-providers/oauth-service.ts","../src/plugins/core-plugins/oauth-providers/index.ts","../src/plugins/core-plugins/ai-search-plugin/services/embedding.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/chunking.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/custom-rag.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/ai-search.ts","../src/plugins/core-plugins/ai-search-plugin/services/indexer.ts","../src/plugins/core-plugins/ai-search-plugin/components/settings-page.ts","../src/plugins/core-plugins/ai-search-plugin/routes/admin.ts","../src/plugins/core-plugins/ai-search-plugin/routes/api.ts","../src/plugins/core-plugins/ai-search-plugin/manifest.json","../src/plugins/core-plugins/ai-search-plugin/index.ts","../src/plugins/available/magic-link-auth/index.ts","../src/plugins/core-plugins/security-audit-plugin/types.ts","../src/plugins/core-plugins/security-audit-plugin/services/security-audit-service.ts","../src/plugins/core-plugins/security-audit-plugin/components/dashboard-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/event-log-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/settings-page.ts","../src/plugins/core-plugins/security-audit-plugin/routes/admin.ts","../src/plugins/core-plugins/security-audit-plugin/services/brute-force-detector.ts","../src/plugins/core-plugins/security-audit-plugin/routes/api.ts","../src/plugins/core-plugins/security-audit-plugin/middleware/audit-middleware.ts","../src/plugins/core-plugins/security-audit-plugin/index.ts","../src/plugins/core-plugins/stripe-plugin/services/subscription-service.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-event-service.ts","../src/plugins/core-plugins/stripe-plugin/components/subscriptions-page.ts","../src/plugins/core-plugins/stripe-plugin/components/tab-bar.ts","../src/plugins/core-plugins/stripe-plugin/components/events-page.ts","../src/plugins/core-plugins/stripe-plugin/types.ts","../src/plugins/core-plugins/stripe-plugin/routes/admin.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-api.ts","../src/plugins/core-plugins/stripe-plugin/routes/api.ts","../src/plugins/core-plugins/stripe-plugin/index.ts","../src/middleware/plugin-menu.ts","../src/plugins/types.ts","../src/plugins/core-plugins/analytics/routes/admin.ts","../src/plugins/core-plugins/analytics/index.ts","../src/plugins/core-plugins/analytics/services/event-tracking-service.ts","../src/plugins/core-plugins/analytics/routes/api.ts","../src/plugins/cache/services/cache-config.ts","../src/plugins/cache/services/cache.ts","../src/plugins/cache/services/event-bus.ts","../src/plugins/cache/services/cache-invalidation.ts","../src/plugins/cache/services/cache-warming.ts","../src/templates/pages/admin-cache.template.ts","../src/plugins/cache/routes.ts","../src/plugins/cache/index.ts","../src/assets/favicon.ts","../src/app.ts","../src/db/index.ts","../src/index.ts"],"names":["escapeHtml","router","Hono","plugin","emailPlugin","setCookie","tokenTtl","jwt","content","collections","statusBadge","api_default","z","DEFAULT_SETTINGS","formatTimestamp","severityBadge","eventTypeBadge","adminRoutes","apiRoutes","getSettings","isPluginActive","logPromise","renderPagination","renderAdminLayoutCatalyst","HOOKS","media","renderConfirmationDialog","getConfirmationDialogScript","totalRequests","app"],"mappings":"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","file":"index.js","sourcesContent":["import { D1Database } from '@cloudflare/workers-types'\n\nexport interface TruncateResult {\n success: boolean\n message: string\n tablesCleared: string[]\n adminUserPreserved: boolean\n errors?: string[]\n}\n\nexport interface DatabaseStats {\n tables: Array<{\n name: string\n rowCount: number\n }>\n totalRows: number\n}\n\nexport interface TableData {\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n}\n\nexport class DatabaseToolsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get database statistics\n */\n async getDatabaseStats(): Promise {\n const tables = await this.getTables()\n const stats: DatabaseStats = {\n tables: [],\n totalRows: 0\n }\n\n for (const tableName of tables) {\n try {\n const result = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const rowCount = (result?.count as number) || 0\n \n stats.tables.push({\n name: tableName,\n rowCount\n })\n stats.totalRows += rowCount\n } catch (error) {\n // Skip tables that can't be counted (might be views or system tables)\n console.warn(`Could not count rows in table ${tableName}:`, error)\n }\n }\n\n return stats\n }\n\n /**\n * Get all tables in the database\n */\n private async getTables(): Promise {\n const result = await this.db.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='table' \n AND name NOT LIKE 'sqlite_%'\n ORDER BY name\n `).all()\n\n return result.results?.map((row: any) => row.name) || []\n }\n\n /**\n * Truncate all data except admin user\n */\n async truncateAllData(adminEmail: string): Promise {\n const errors: string[] = []\n const tablesCleared: string[] = []\n let adminUserPreserved = false\n\n try {\n // First, preserve the admin user data\n const adminUser = await this.db.prepare(\n 'SELECT * FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n if (!adminUser) {\n return {\n success: false,\n message: 'Admin user not found. Operation cancelled for safety.',\n tablesCleared: [],\n adminUserPreserved: false,\n errors: ['Admin user not found']\n }\n }\n\n // Define tables to truncate (excluding system tables)\n const tablesToTruncate = [\n 'content',\n 'content_versions', \n 'content_workflow_status',\n 'collections',\n 'media',\n 'sessions',\n 'notifications',\n 'api_tokens',\n 'workflow_history',\n 'scheduled_content',\n 'faqs',\n 'faq_categories',\n 'plugins',\n 'plugin_settings',\n 'email_templates',\n 'email_themes'\n ]\n\n // Check which tables exist\n const existingTables = await this.getTables()\n const tablesToClear = tablesToTruncate.filter(table => \n existingTables.includes(table)\n )\n\n // Clear all data except users table\n for (const tableName of tablesToClear) {\n try {\n await this.db.prepare(`DELETE FROM ${tableName}`).run()\n tablesCleared.push(tableName)\n } catch (error) {\n errors.push(`Failed to clear table ${tableName}: ${error}`)\n console.error(`Error clearing table ${tableName}:`, error)\n }\n }\n\n // Clear users table but preserve admin\n try {\n await this.db.prepare('DELETE FROM users WHERE email != ? OR role != ?')\n .bind(adminEmail, 'admin').run()\n \n // Verify admin user still exists\n const verifyAdmin = await this.db.prepare(\n 'SELECT id FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n adminUserPreserved = !!verifyAdmin\n tablesCleared.push('users (non-admin)')\n } catch (error) {\n errors.push(`Failed to clear non-admin users: ${error}`)\n console.error('Error clearing non-admin users:', error)\n }\n\n // Reset auto-increment counters if supported\n try {\n await this.db.prepare('DELETE FROM sqlite_sequence').run()\n } catch (error) {\n // sqlite_sequence might not exist, ignore\n }\n\n const message = errors.length > 0 \n ? `Truncation completed with ${errors.length} errors. ${tablesCleared.length} tables cleared.`\n : `Successfully truncated database. ${tablesCleared.length} tables cleared.`\n\n return {\n success: errors.length === 0,\n message,\n tablesCleared,\n adminUserPreserved,\n errors: errors.length > 0 ? errors : undefined\n }\n\n } catch (error) {\n return {\n success: false,\n message: `Database truncation failed: ${error}`,\n tablesCleared,\n adminUserPreserved,\n errors: [String(error)]\n }\n }\n }\n\n /**\n * Create a backup of current data (simplified version)\n */\n async createBackup(): Promise<{ success: boolean; message: string; backupId?: string }> {\n try {\n const backupId = `backup_${Date.now()}`\n const stats = await this.getDatabaseStats()\n \n // In a real implementation, this would export data to a file or cloud storage\n // For now, we'll just log the stats and return success\n console.log(`Backup ${backupId} created with ${stats.totalRows} total rows`)\n \n return {\n success: true,\n message: `Backup created successfully (${stats.totalRows} rows)`,\n backupId\n }\n } catch (error) {\n return {\n success: false,\n message: `Backup failed: ${error}`\n }\n }\n }\n\n /**\n * Get table data with optional pagination and sorting\n */\n async getTableData(\n tableName: string,\n limit: number = 100,\n offset: number = 0,\n sortColumn?: string,\n sortDirection: 'asc' | 'desc' = 'asc'\n ): Promise {\n try {\n // Validate table name to prevent SQL injection\n const tables = await this.getTables()\n if (!tables.includes(tableName)) {\n throw new Error(`Table ${tableName} not found`)\n }\n\n // Get column names\n const pragmaResult = await this.db.prepare(`PRAGMA table_info(${tableName})`).all()\n const columns = pragmaResult.results?.map((col: any) => col.name) || []\n\n // Validate sort column if provided\n if (sortColumn && !columns.includes(sortColumn)) {\n sortColumn = undefined\n }\n\n // Get total row count\n const countResult = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const totalRows = (countResult?.count as number) || 0\n\n // Build query with optional sorting\n let query = `SELECT * FROM ${tableName}`\n if (sortColumn) {\n query += ` ORDER BY ${sortColumn} ${sortDirection.toUpperCase()}`\n }\n query += ` LIMIT ${limit} OFFSET ${offset}`\n\n // Get paginated data\n const dataResult = await this.db.prepare(query).all()\n\n return {\n tableName,\n columns,\n rows: dataResult.results || [],\n totalRows\n }\n } catch (error) {\n throw new Error(`Failed to fetch table data: ${error}`)\n }\n }\n\n /**\n * Validate database integrity\n */\n async validateDatabase(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n try {\n // Check critical tables exist\n const requiredTables = ['users', 'content', 'collections']\n const existingTables = await this.getTables()\n\n for (const table of requiredTables) {\n if (!existingTables.includes(table)) {\n issues.push(`Critical table missing: ${table}`)\n }\n }\n\n // Check admin user exists\n const adminCount = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM users WHERE role = ?'\n ).bind('admin').first()\n\n if ((adminCount?.count as number) === 0) {\n issues.push('No admin users found')\n }\n\n // Run SQLite integrity check\n try {\n const integrityResult = await this.db.prepare('PRAGMA integrity_check').first()\n if (integrityResult && (integrityResult as any).integrity_check !== 'ok') {\n issues.push(`Database integrity check failed: ${(integrityResult as any).integrity_check}`)\n }\n } catch (error) {\n issues.push(`Could not run integrity check: ${error}`)\n }\n\n } catch (error) {\n issues.push(`Validation error: ${error}`)\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface DatabaseTablePageData {\n user?: {\n name: string\n email: string\n role: string\n }\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n currentPage: number\n pageSize: number\n sortColumn?: string\n sortDirection?: 'asc' | 'desc'\n}\n\nexport function renderDatabaseTablePage(data: DatabaseTablePageData): string {\n const totalPages = Math.ceil(data.totalRows / data.pageSize)\n const startRow = (data.currentPage - 1) * data.pageSize + 1\n const endRow = Math.min(data.currentPage * data.pageSize, data.totalRows)\n\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n Back to Database Tools\n \n
\n

Table: ${data.tableName}

\n

\n Showing ${startRow.toLocaleString()} - ${endRow.toLocaleString()} of ${data.totalRows.toLocaleString()} rows\n

\n
\n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Refresh\n \n
\n
\n\n \n
\n \n
\n \n \n \n ${data.columns.map(col => `\n \n
\n ${col}\n ${data.sortColumn === col ? `\n \n \n \n ` : `\n \n \n \n `}\n
\n \n `).join('')}\n
\n \n \n ${data.rows.length > 0\n ? data.rows.map((row, idx) => `\n \n ${data.columns.map(col => `\n \n `).join('')}\n \n `).join('')\n : `\n \n \n \n `\n }\n \n
\n ${formatCellValue(row[col])}\n
\n \n \n \n

No data in this table

\n
\n
\n\n \n ${totalPages > 1 ? `\n
\n
\n \n Previous\n \n \n Next\n \n
\n
\n
\n

\n Page ${data.currentPage} of ${totalPages}\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Table: ${data.tableName}`,\n pageTitle: `Database: ${data.tableName}`,\n currentPath: `/admin/database-tools/tables/${data.tableName}`,\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction generatePageNumbers(currentPage: number, totalPages: number): string {\n const pages: number[] = []\n const maxVisible = 7\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (currentPage <= 4) {\n for (let i = 1; i <= 5; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n } else if (currentPage >= totalPages - 3) {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = totalPages - 4; i <= totalPages; i++) pages.push(i)\n } else {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n }\n }\n\n return pages.map(page => {\n if (page === -1) {\n return `\n \n ...\n \n `\n }\n\n const isActive = page === currentPage\n return `\n \n ${page}\n \n `\n }).join('')\n}\n\nfunction escapeHtml(text: string): string {\n const map: Record = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }\n return String(text).replace(/[&<>\"']/g, m => map[m] || m)\n}\n\nfunction formatCellValue(value: any): string {\n if (value === null || value === undefined) {\n return 'null'\n }\n if (typeof value === 'boolean') {\n return `${value}`\n }\n if (typeof value === 'object') {\n return '' + JSON.stringify(value).substring(0, 50) + (JSON.stringify(value).length > 50 ? '...' : '') + ''\n }\n const str = String(value)\n if (str.length > 100) {\n return escapeHtml(str.substring(0, 100)) + '...'\n }\n return escapeHtml(str)\n}\n","import { Hono } from 'hono'\nimport { DatabaseToolsService } from './services/database-service'\nimport { renderDatabaseTablePage, DatabaseTablePageData } from '../../../templates/pages/admin-database-table.template'\nimport { requireAuth } from '../../../middleware'\n\ntype Bindings = {\n DB: D1Database\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport function createDatabaseToolsAdminRoutes() {\n const router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Apply authentication middleware\n router.use('*', requireAuth())\n\n // Get database statistics\n router.get('/api/stats', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const stats = await service.getDatabaseStats()\n\n return c.json({\n success: true,\n data: stats\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({ \n success: false, \n error: 'Failed to fetch database statistics' \n }, 500)\n }\n })\n\n // Truncate all data except admin user\n router.post('/api/truncate', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const body = await c.req.json()\n const { confirmText } = body\n\n // Require confirmation text for safety\n if (confirmText !== 'TRUNCATE ALL DATA') {\n return c.json({\n success: false,\n error: 'Invalid confirmation text. Operation cancelled.'\n }, 400)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.truncateAllData(user.email)\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n tablesCleared: result.tablesCleared,\n adminUserPreserved: result.adminUserPreserved,\n errors: result.errors\n }\n })\n } catch (error) {\n console.error('Error truncating database:', error)\n return c.json({ \n success: false, \n error: 'Failed to truncate database' \n }, 500)\n }\n })\n\n // Create backup\n router.post('/api/backup', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.createBackup()\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n backupId: result.backupId\n }\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({ \n success: false, \n error: 'Failed to create backup' \n }, 500)\n }\n })\n\n // Validate database\n router.get('/api/validate', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const validation = await service.validateDatabase()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n })\n\n // Get table data (API endpoint)\n router.get('/api/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const tableName = c.req.param('tableName')\n const limit = parseInt(c.req.query('limit') || '100')\n const offset = parseInt(c.req.query('offset') || '0')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, limit, offset, sortColumn, sortDirection)\n\n return c.json({\n success: true,\n data: tableData\n })\n } catch (error) {\n console.error('Error fetching table data:', error)\n return c.json({\n success: false,\n error: `Failed to fetch table data: ${error}`\n }, 500)\n }\n })\n\n // View table data page\n router.get('/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.redirect('/admin/login')\n }\n\n const tableName = c.req.param('tableName')\n const page = parseInt(c.req.query('page') || '1')\n const pageSize = parseInt(c.req.query('pageSize') || '20')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const offset = (page - 1) * pageSize\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, pageSize, offset, sortColumn, sortDirection)\n\n const pageData: DatabaseTablePageData = {\n user: {\n name: user.email.split('@')[0] || 'Unknown',\n email: user.email,\n role: user.role\n },\n tableName: tableData.tableName,\n columns: tableData.columns,\n rows: tableData.rows,\n totalRows: tableData.totalRows,\n currentPage: page,\n pageSize: pageSize,\n sortColumn: sortColumn,\n sortDirection: sortDirection\n }\n\n return c.html(renderDatabaseTablePage(pageData))\n } catch (error) {\n console.error('Error rendering table page:', error)\n return c.text(`Error: ${error}`, 500)\n }\n })\n\n return router\n}","import type { D1Database } from '@cloudflare/workers-types'\n\nexport class SeedDataService {\n constructor(private db: D1Database) {}\n\n // First names for generating realistic users\n private firstNames = [\n 'Emma', 'Liam', 'Olivia', 'Noah', 'Ava', 'Ethan', 'Sophia', 'Mason',\n 'Isabella', 'William', 'Mia', 'James', 'Charlotte', 'Benjamin', 'Amelia',\n 'Lucas', 'Harper', 'Henry', 'Evelyn', 'Alexander'\n ]\n\n // Last names for generating realistic users\n private lastNames = [\n 'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis',\n 'Rodriguez', 'Martinez', 'Hernandez', 'Lopez', 'Gonzalez', 'Wilson', 'Anderson',\n 'Thomas', 'Taylor', 'Moore', 'Jackson', 'Martin'\n ]\n\n // Content titles for blog posts\n private blogTitles = [\n 'Getting Started with Modern Web Development',\n 'The Future of JavaScript Frameworks',\n 'Building Scalable Applications with Microservices',\n 'Understanding TypeScript: A Complete Guide',\n 'Best Practices for API Design',\n 'Introduction to Cloud Computing',\n 'Mastering Git and Version Control',\n 'The Art of Code Review',\n 'Performance Optimization Techniques',\n 'Security Best Practices for Web Apps',\n 'Exploring Serverless Architecture',\n 'Database Design Fundamentals',\n 'Testing Strategies for Modern Apps',\n 'CI/CD Pipeline Implementation',\n 'Mobile-First Development Approach'\n ]\n\n // Content titles for pages\n private pageTitles = [\n 'About Us', 'Contact', 'Privacy Policy', 'Terms of Service',\n 'FAQ', 'Our Team', 'Careers', 'Press Kit',\n 'Support', 'Documentation', 'Pricing', 'Features'\n ]\n\n // Content titles for products\n private productTitles = [\n 'Premium Wireless Headphones',\n 'Smart Watch Pro',\n 'Laptop Stand Adjustable',\n 'Mechanical Keyboard RGB',\n 'HD Webcam 4K',\n 'USB-C Hub 7-in-1',\n 'Portable SSD 1TB',\n 'Wireless Mouse Ergonomic',\n 'Monitor 27\" 4K',\n 'Desk Lamp LED',\n 'Phone Case Premium',\n 'Tablet Stand Aluminum',\n 'Cable Management Kit',\n 'Power Bank 20000mAh',\n 'Bluetooth Speaker Portable'\n ]\n\n // Content for generating blog posts\n private blogContent = [\n 'This comprehensive guide covers everything you need to know about modern development practices and tools.',\n 'Learn the fundamentals and advanced concepts that will help you build better applications.',\n 'Discover the latest trends and best practices used by industry professionals.',\n 'A deep dive into the technologies and methodologies shaping the future of software development.',\n 'Practical tips and real-world examples to improve your development workflow.',\n 'Explore cutting-edge techniques and proven strategies for building robust applications.',\n 'Master the essential skills needed to excel in modern software development.',\n 'An in-depth look at the tools and frameworks that power today\\'s web applications.',\n 'Step-by-step instructions and expert insights for developers of all levels.',\n 'Understanding the core principles that drive successful software projects.'\n ]\n\n // Generate a random ID\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n\n // Generate a slug from a title\n private generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n }\n\n // Generate random date within the last year\n private randomDate(): Date {\n const now = new Date()\n const yearAgo = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate())\n const randomTime = yearAgo.getTime() + Math.random() * (now.getTime() - yearAgo.getTime())\n return new Date(randomTime)\n }\n\n // Create 20 example users\n async createUsers(): Promise {\n const roles = ['admin', 'editor', 'author', 'viewer']\n // const hashedPassword = await bcrypt.hash('password123', 10)\n const hashedPassword = 'password123' // TODO: Use actual bcrypt hash\n\n let count = 0\n for (let i = 0; i < 20; i++) {\n const firstName = this.firstNames[Math.floor(Math.random() * this.firstNames.length)] || 'John'\n const lastName = this.lastNames[Math.floor(Math.random() * this.lastNames.length)] || 'Doe'\n const username = `${firstName.toLowerCase()}${lastName.toLowerCase()}${i}`\n const email = `${username}@example.com`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n\n const stmt = this.db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, last_login_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n email,\n username,\n firstName,\n lastName,\n hashedPassword,\n roles[Math.floor(Math.random() * roles.length)],\n Math.random() > 0.1 ? 1 : 0, // 90% active\n Math.random() > 0.3 ? createdAtTimestamp : null,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Create 200 content items across different types\n async createContent(): Promise {\n // Get all users and collections\n const usersStmt = this.db.prepare('SELECT * FROM users')\n const { results: allUsers } = await usersStmt.all()\n\n const collectionsStmt = this.db.prepare('SELECT * FROM collections')\n const { results: allCollections } = await collectionsStmt.all()\n\n if (!allUsers || allUsers.length === 0) {\n throw new Error('No users found. Please create users first.')\n }\n\n if (!allCollections || allCollections.length === 0) {\n throw new Error('No collections found. Please create collections first.')\n }\n\n const statuses = ['draft', 'published', 'archived']\n\n // Create 200 content items\n let count = 0\n for (let i = 0; i < 200; i++) {\n const collection: any = allCollections[Math.floor(Math.random() * allCollections.length)]\n const author: any = allUsers[Math.floor(Math.random() * allUsers.length)]\n const status = statuses[Math.floor(Math.random() * statuses.length)]\n\n let title: string\n let contentData: any\n\n // Generate content based on collection type\n if (collection.name === 'blog_posts' || collection.name.includes('blog')) {\n title = this.blogTitles[Math.floor(Math.random() * this.blogTitles.length)] || 'Untitled Blog Post'\n contentData = {\n body: this.blogContent[Math.floor(Math.random() * this.blogContent.length)] || 'Blog content here',\n excerpt: 'A brief introduction to this article that provides an overview of the main topics covered.',\n tags: this.generateTags(),\n featured: Math.random() > 0.7\n }\n } else if (collection.name === 'pages' || collection.name.includes('page')) {\n title = this.pageTitles[Math.floor(Math.random() * this.pageTitles.length)] || 'Untitled Page'\n contentData = {\n body: 'This is a standard page with important information about our services and policies.',\n template: 'default',\n showInMenu: Math.random() > 0.5\n }\n } else if (collection.name === 'products' || collection.name.includes('product')) {\n title = this.productTitles[Math.floor(Math.random() * this.productTitles.length)] || 'Untitled Product'\n contentData = {\n description: 'High-quality product with excellent features and great value for money.',\n price: (Math.random() * 500 + 10).toFixed(2),\n sku: `SKU-${Math.random().toString(36).substr(2, 9).toUpperCase()}`,\n inStock: Math.random() > 0.2,\n rating: (Math.random() * 2 + 3).toFixed(1) // 3.0 - 5.0\n }\n } else {\n // Generic content\n title = `${collection.display_name || collection.name} Item ${i + 1}`\n contentData = {\n description: 'This is a sample content item with generic data.',\n value: Math.floor(Math.random() * 1000)\n }\n }\n\n const slug = `${this.generateSlug(title)}-${i}`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n const publishedAtTimestamp = status === 'published' ? createdAtTimestamp : null\n\n const stmt = this.db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, published_at, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n collection.id,\n slug,\n `${title} ${i}`,\n JSON.stringify(contentData),\n status,\n publishedAtTimestamp,\n author.id,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Generate random tags for blog posts\n private generateTags(): string[] {\n const allTags = [\n 'tutorial', 'guide', 'javascript', 'typescript', 'web-dev',\n 'backend', 'frontend', 'best-practices', 'security', 'performance',\n 'testing', 'deployment', 'cloud', 'database', 'api'\n ]\n\n const numTags = Math.floor(Math.random() * 4) + 1 // 1-4 tags\n const shuffled = allTags.sort(() => 0.5 - Math.random())\n return shuffled.slice(0, numTags)\n }\n\n // Seed all data\n async seedAll(): Promise<{ users: number; content: number }> {\n const userCount = await this.createUsers()\n const contentCount = await this.createContent()\n\n return {\n users: userCount,\n content: contentCount\n }\n }\n\n // Clear all seed data (optional cleanup method)\n async clearSeedData(): Promise {\n // Delete content first (due to foreign key constraints)\n const deleteContentStmt = this.db.prepare('DELETE FROM content')\n await deleteContentStmt.run()\n\n // Delete users (but keep admin users)\n const deleteUsersStmt = this.db.prepare(\n \"DELETE FROM users WHERE role != 'admin'\"\n )\n await deleteUsersStmt.run()\n }\n}\n","import { Hono } from 'hono'\nimport { SeedDataService } from './services/seed-data-service'\n\ntype Bindings = {\n DB: D1Database\n}\n\nexport function createSeedDataAdminRoutes() {\n const routes = new Hono<{ Bindings: Bindings }>()\n\n // Get seed data status/info\n routes.get('/', async (c) => {\n const html = `\n \n \n \n Seed Data - SonicJS Admin\n \n \n \n \n \n
\n ← Back to Plugin Settings\n

🌱 Seed Data Generator

\n

\n Generate realistic example data for testing and development. This will create 20 users and 200 content items with realistic data.\n

\n\n
\n ⚠️ Warning: This will create new data in your database. Make sure you're not running this in production!\n
\n\n
\n
\n\n
\n

What will be created?

\n
    \n
  • 20 Users: With realistic names, emails, and various roles (admin, editor, author, viewer)
  • \n
  • 200 Content Items: Including blog posts, pages, and products with realistic titles and data
  • \n
  • All passwords: Set to \"password123\" for testing
  • \n
  • Random dates: Created within the last year
  • \n
  • Various statuses: Draft, published, and archived content
  • \n
\n
\n\n
\n

Generate Seed Data

\n

Click the button below to generate example data. This may take a few moments.

\n \n
\n\n
\n

Clear Seed Data

\n

Remove all users and content from the database (except admin users).

\n \n
\n
\n\n \n \n \n `\n return c.html(html)\n })\n\n // Generate seed data\n routes.post('/generate', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n const result = await seedService.seedAll()\n\n return c.json({\n success: true,\n users: result.users,\n content: result.content\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n // Clear seed data\n routes.post('/clear', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n await seedService.clearSeedData()\n\n return c.json({\n success: true\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n return routes\n}\n","/**\n * Email Plugin\n *\n * Send transactional emails using Resend\n * Handles registration, verification, password reset, and one-time codes\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\nexport function createEmailPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'email',\n version: '1.0.0-beta.1',\n description: 'Send transactional emails using Resend'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Create the Email Settings route (POST only - GET is handled by generic plugin settings page)\n const emailRoutes = new Hono()\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // POST endpoint for saving settings\n emailRoutes.post('/settings', async (c: any) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n // Update plugin settings in database\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'email'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving email settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n })\n\n // POST endpoint for test email\n emailRoutes.post('/test', async (c: any) => {\n try {\n const db = c.env.DB\n const body = await c.req.json()\n\n // Load settings from database\n const plugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (!plugin?.settings) {\n return c.json({\n success: false,\n error: 'Email settings not configured. Please save your settings first.'\n }, 400)\n }\n\n const settings = JSON.parse(plugin.settings)\n\n // Validate required settings\n if (!settings.apiKey || !settings.fromEmail || !settings.fromName) {\n return c.json({\n success: false,\n error: 'Missing required settings. Please configure API Key, From Email, and From Name.'\n }, 400)\n }\n\n // Use provided email or fallback to fromEmail\n const toEmail = body.toEmail || settings.fromEmail\n\n // Validate email format\n if (!toEmail.match(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)) {\n return c.json({\n success: false,\n error: 'Invalid email address format'\n }, 400)\n }\n\n // Send test email via Resend API\n const response = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${settings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${settings.fromName} <${settings.fromEmail}>`,\n to: [toEmail],\n subject: 'Test Email from SonicJS',\n html: `\n
\n

Test Email Successful! 🎉

\n

This is a test email from your SonicJS Email plugin.

\n

Configuration:

\n
    \n
  • From: ${settings.fromName} <${settings.fromEmail}>
  • \n
  • Reply-To: ${settings.replyTo || 'Not set'}
  • \n
  • Sent at: ${new Date().toISOString()}
  • \n
\n

Your email settings are working correctly!

\n
\n `,\n reply_to: settings.replyTo || settings.fromEmail\n })\n })\n\n const data = await response.json() as any\n\n if (!response.ok) {\n console.error('Resend API error:', data)\n return c.json({\n success: false,\n error: data.message || 'Failed to send test email. Check your API key and domain verification.'\n }, response.status)\n }\n\n return c.json({\n success: true,\n message: `Test email sent successfully to ${toEmail}`,\n emailId: data.id\n })\n\n } catch (error: any) {\n console.error('Test email error:', error)\n return c.json({\n success: false,\n error: error.message || 'An error occurred while sending test email'\n }, 500)\n }\n })\n\n // Register the route\n builder.addRoute('/admin/plugins/email', emailRoutes, {\n description: 'Email plugin settings',\n requiresAuth: true,\n priority: 80\n })\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('Email', '/admin/plugins/email', {\n icon: 'envelope',\n order: 80,\n permissions: ['email:manage']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Email plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Email plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const emailPlugin = createEmailPlugin()\n","/**\n * OTP Service\n * Handles OTP code generation, verification, and management\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\nexport interface OTPSettings {\n codeLength: number\n codeExpiryMinutes: number\n maxAttempts: number\n rateLimitPerHour: number\n allowNewUserRegistration: boolean\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nexport interface OTPCode {\n id: string\n user_email: string\n code: string\n expires_at: number\n used: number\n used_at: number | null\n ip_address: string | null\n user_agent: string | null\n attempts: number\n created_at: number\n}\n\nexport class OTPService {\n constructor(private db: D1Database) {}\n\n /**\n * Generate a secure random OTP code\n */\n generateCode(length: number = 6): string {\n const digits = '0123456789'\n let code = ''\n\n for (let i = 0; i < length; i++) {\n const randomValues = new Uint8Array(1)\n crypto.getRandomValues(randomValues)\n const randomValue = randomValues[0] ?? 0\n code += digits[randomValue % digits.length]\n }\n\n return code\n }\n\n /**\n * Create and store a new OTP code\n */\n async createOTPCode(\n email: string,\n settings: OTPSettings,\n ipAddress?: string,\n userAgent?: string\n ): Promise {\n const code = this.generateCode(settings.codeLength)\n const id = crypto.randomUUID()\n const now = Date.now()\n const expiresAt = now + (settings.codeExpiryMinutes * 60 * 1000)\n\n const otpCode: OTPCode = {\n id,\n user_email: email.toLowerCase(),\n code,\n expires_at: expiresAt,\n used: 0,\n used_at: null,\n ip_address: ipAddress || null,\n user_agent: userAgent || null,\n attempts: 0,\n created_at: now\n }\n\n await this.db.prepare(`\n INSERT INTO otp_codes (\n id, user_email, code, expires_at, used, used_at,\n ip_address, user_agent, attempts, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n otpCode.id,\n otpCode.user_email,\n otpCode.code,\n otpCode.expires_at,\n otpCode.used,\n otpCode.used_at,\n otpCode.ip_address,\n otpCode.user_agent,\n otpCode.attempts,\n otpCode.created_at\n ).run()\n\n return otpCode\n }\n\n /**\n * Verify an OTP code\n */\n async verifyCode(\n email: string,\n code: string,\n settings: OTPSettings\n ): Promise<{ valid: boolean; attemptsRemaining?: number; error?: string }> {\n const normalizedEmail = email.toLowerCase()\n const now = Date.now()\n\n // Find the most recent unused code for this email\n const otpCode = await this.db.prepare(`\n SELECT * FROM otp_codes\n WHERE user_email = ? AND code = ? AND used = 0\n ORDER BY created_at DESC\n LIMIT 1\n `).bind(normalizedEmail, code).first() as OTPCode | null\n\n if (!otpCode) {\n return { valid: false, error: 'Invalid or expired code' }\n }\n\n // Check if expired\n if (now > otpCode.expires_at) {\n return { valid: false, error: 'Code has expired' }\n }\n\n // Check attempts\n if (otpCode.attempts >= settings.maxAttempts) {\n return { valid: false, error: 'Maximum attempts exceeded' }\n }\n\n // Code is valid - mark as used\n await this.db.prepare(`\n UPDATE otp_codes\n SET used = 1, used_at = ?, attempts = attempts + 1\n WHERE id = ?\n `).bind(now, otpCode.id).run()\n\n return { valid: true }\n }\n\n /**\n * Increment failed attempt count\n */\n async incrementAttempts(email: string, code: string): Promise {\n const normalizedEmail = email.toLowerCase()\n\n const result = await this.db.prepare(`\n UPDATE otp_codes\n SET attempts = attempts + 1\n WHERE user_email = ? AND code = ? AND used = 0\n RETURNING attempts\n `).bind(normalizedEmail, code).first() as { attempts: number } | null\n\n return result?.attempts || 0\n }\n\n /**\n * Check rate limiting\n */\n async checkRateLimit(email: string, settings: OTPSettings): Promise {\n const normalizedEmail = email.toLowerCase()\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n\n const result = await this.db.prepare(`\n SELECT COUNT(*) as count\n FROM otp_codes\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as { count: number } | null\n\n const count = result?.count || 0\n return count < settings.rateLimitPerHour\n }\n\n /**\n * Get recent OTP requests for activity log\n */\n async getRecentRequests(limit: number = 50): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM otp_codes\n ORDER BY created_at DESC\n LIMIT ?\n `).bind(limit).all()\n\n const rows = (result.results || []) as Record[]\n return rows.map(row => this.mapRowToOTP(row))\n }\n\n /**\n * Clean up expired codes (for maintenance)\n */\n async cleanupExpiredCodes(): Promise {\n const now = Date.now()\n\n const result = await this.db.prepare(`\n DELETE FROM otp_codes\n WHERE expires_at < ? OR (used = 1 AND used_at < ?)\n `).bind(now, now - (30 * 24 * 60 * 60 * 1000)).run() // Keep used codes for 30 days\n\n return result.meta.changes || 0\n }\n\n private mapRowToOTP(row: Record): OTPCode {\n return {\n id: String(row.id),\n user_email: String(row.user_email),\n code: String(row.code),\n expires_at: Number(row.expires_at ?? Date.now()),\n used: Number(row.used ?? 0),\n used_at: row.used_at === null || row.used_at === undefined ? null : Number(row.used_at),\n ip_address: typeof row.ip_address === 'string' ? row.ip_address : null,\n user_agent: typeof row.user_agent === 'string' ? row.user_agent : null,\n attempts: Number(row.attempts ?? 0),\n created_at: Number(row.created_at ?? Date.now())\n }\n }\n\n /**\n * Get OTP statistics\n */\n async getStats(days: number = 7): Promise<{\n total: number\n successful: number\n failed: number\n expired: number\n }> {\n const since = Date.now() - (days * 24 * 60 * 60 * 1000)\n\n const stats = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as successful,\n SUM(CASE WHEN attempts >= 3 AND used = 0 THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN expires_at < ? AND used = 0 THEN 1 ELSE 0 END) as expired\n FROM otp_codes\n WHERE created_at > ?\n `).bind(Date.now(), since).first() as any\n\n return {\n total: stats?.total || 0,\n successful: stats?.successful || 0,\n failed: stats?.failed || 0,\n expired: stats?.expired || 0\n }\n }\n}\n","/**\n * OTP Email Templates\n * HTML and plain text templates for OTP codes\n */\n\nexport interface OTPEmailData {\n code: string\n expiryMinutes: number\n codeLength: number\n maxAttempts: number\n email: string\n ipAddress?: string\n timestamp: string\n appName: string\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nfunction sanitizeColor(value?: string): string {\n if (!value) return ''\n // Allow #rgb, #rrggbb, #rrggbbaa, named colors, rgb()/rgba()/hsl()/hsla()\n if (/^#[0-9a-fA-F]{3,8}$/.test(value)) return value\n if (/^[a-zA-Z]+$/.test(value)) return value\n if (/^(rgb|rgba|hsl|hsla)\\([0-9.,\\s%]+\\)$/.test(value)) return value\n return ''\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport function renderOTPEmailHTML(data: OTPEmailData): string {\n const logoUrl = data.logoUrl ? escapeHtml(data.logoUrl) : ''\n const loginUrl = data.loginUrl ? escapeHtml(data.loginUrl) : ''\n const appName = escapeHtml(data.appName)\n const loginButtonText = escapeHtml(\n (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n )\n const logoWidth = Math.max(20, Math.min(600, Number(data.logoWidth) || 150))\n const logoBorderWidth = Math.max(0, Math.min(20, Number(data.logoBorderWidth) || 0))\n const logoBorderColor = sanitizeColor(data.logoBorderColor)\n const logoBorderStyle = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${logoBorderColor}; border-radius: 8px;`\n : ''\n\n return `\n\n\n \n \n Your Login Code\n\n\n\n
\n\n ${logoUrl ? `\n
\n \"${appName}\"\n
\n ` : ''}\n\n
\n

Your Login Code

\n

Enter this code to sign in to ${appName}

\n
\n\n
\n
\n
\n ${data.code}\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${data.expiryMinutes} minutes\n

\n
\n\n
\n

Quick Tips:

\n
    \n
  • Enter the code exactly as shown (${data.codeLength} digits)
  • \n
  • The code can only be used once
  • \n
  • You have ${data.maxAttempts} attempts to enter the correct code
  • \n
  • Request a new code if this one expires
  • \n
\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${appName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n\n
\n

\n Didn't request this code?
\n Someone may have entered your email by mistake. You can safely ignore this email.\n

\n\n
\n

This email was sent to ${escapeHtml(data.email)}

\n ${data.ipAddress ? `

IP Address: ${escapeHtml(data.ipAddress)}

` : ''}\n

Time: ${escapeHtml(data.timestamp)}

\n
\n
\n\n
\n\n
\n

© ${new Date().getFullYear()} ${appName}. All rights reserved.

\n
\n\n\n`\n}\n\nexport function renderOTPEmailText(data: OTPEmailData): string {\n const ctaLabel = (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n return `Your Login Code for ${data.appName}\n\nYour one-time verification code is:\n\n${data.code}\n\nThis code expires in ${data.expiryMinutes} minutes.\n${data.loginUrl ? `\\n${ctaLabel}: ${data.loginUrl}\\n` : ''}\n\nQuick Tips:\n• Enter the code exactly as shown (${data.codeLength} digits)\n• The code can only be used once\n• You have ${data.maxAttempts} attempts to enter the correct code\n• Request a new code if this one expires\n\nSecurity Notice:\nNever share this code with anyone. ${data.appName} will never ask you for this code via phone, email, or social media.\n\nDidn't request this code?\nSomeone may have entered your email by mistake. You can safely ignore this email.\n\n---\nThis email was sent to ${data.email}\n${data.ipAddress ? `IP Address: ${data.ipAddress}` : ''}\nTime: ${data.timestamp}\n\n© ${new Date().getFullYear()} ${data.appName}. All rights reserved.`\n}\n\nexport function renderOTPEmail(data: OTPEmailData): { html: string; text: string } {\n return {\n html: renderOTPEmailHTML(data),\n text: renderOTPEmailText(data)\n }\n}\n","/**\n * OTP Login Plugin\n *\n * Passwordless authentication via email one-time codes\n * Users receive a secure 6-digit code to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { setCookie } from 'hono/cookie'\nimport { z } from 'zod'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\nimport { OTPService, type OTPSettings } from './otp-service'\nimport { renderOTPEmail } from './email-templates'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\nimport { SettingsService } from '../../../services/settings'\nimport { getCustomData } from '../user-profiles'\n\n// Validation schemas\nconst otpRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nconst otpVerifySchema = z.object({\n email: z.string().email('Valid email is required'),\n code: z.string().min(4).max(8)\n})\n\n// Default settings (site name comes from general settings)\nconst DEFAULT_SETTINGS: OTPSettings = {\n codeLength: 6,\n codeExpiryMinutes: 10,\n maxAttempts: 3,\n rateLimitPerHour: 5,\n allowNewUserRegistration: false,\n logoUrl: '',\n logoWidth: 150,\n logoBorderWidth: 0,\n logoBorderColor: '#ffffff',\n loginUrl: '',\n loginButtonText: ''\n}\n\nexport function createOTPLoginPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'otp-login',\n version: '1.0.0-beta.1',\n description: 'Passwordless authentication via email one-time codes'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== API Routes ====================\n\n const otpAPI = new Hono()\n\n // POST /auth/otp/request - Request OTP code\n otpAPI.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings: OTPSettings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Get site name from general settings\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName\n\n // Check rate limiting\n const canRequest = await otpService.checkRateLimit(normalizedEmail, settings)\n if (!canRequest) {\n return c.json({\n error: 'Too many requests. Please try again in an hour.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && !settings.allowNewUserRegistration) {\n // Don't reveal if user exists or not (security)\n return c.json({\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Get IP and user agent\n const ipAddress = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n\n // Create OTP code\n const otpCode = await otpService.createOTPCode(\n normalizedEmail,\n settings,\n ipAddress,\n userAgent\n )\n\n // Send email via Email plugin\n try {\n const isDevMode = c.env.ENVIRONMENT === 'development'\n\n if (isDevMode) {\n console.log(`[DEV] OTP Code for ${normalizedEmail}: ${otpCode.code}`)\n }\n\n // Prepare email content\n const emailContent = renderOTPEmail({\n code: otpCode.code,\n expiryMinutes: settings.codeExpiryMinutes,\n codeLength: settings.codeLength,\n maxAttempts: settings.maxAttempts,\n email: normalizedEmail,\n ipAddress,\n timestamp: new Date().toISOString(),\n appName: siteName,\n logoUrl: settings.logoUrl || '',\n logoWidth: settings.logoWidth,\n logoBorderWidth: settings.logoBorderWidth,\n logoBorderColor: settings.logoBorderColor || '',\n loginUrl: settings.loginUrl || '',\n loginButtonText: settings.loginButtonText || ''\n })\n\n // Load email plugin settings from database\n // Note: We don't check status='active' because the email plugin's\n // settings UI works regardless of status, so we follow the same pattern\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (emailPlugin?.settings) {\n const emailSettings = JSON.parse(emailPlugin.settings)\n\n if (emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName) {\n // Send email via Resend API\n const emailResponse = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${emailSettings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${emailSettings.fromName} <${emailSettings.fromEmail}>`,\n to: [normalizedEmail],\n subject: `Your login code for ${siteName}`,\n html: emailContent.html,\n text: emailContent.text,\n reply_to: emailSettings.replyTo || emailSettings.fromEmail\n })\n })\n\n if (!emailResponse.ok) {\n const errorData = await emailResponse.json() as { message?: string }\n console.error('Failed to send OTP email via Resend:', errorData)\n // Don't expose error to user for security - just log it\n }\n } else {\n console.warn('Email plugin is not fully configured (missing apiKey, fromEmail, or fromName)')\n }\n } else {\n console.warn('Email plugin is not active or has no settings configured')\n }\n\n const response: any = {\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n }\n\n // In development, include the code\n if (isDevMode) {\n response.dev_code = otpCode.code\n }\n\n return c.json(response)\n } catch (emailError) {\n console.error('Error sending OTP email:', emailError)\n return c.json({\n error: 'Failed to send verification code. Please try again.'\n }, 500)\n }\n } catch (error) {\n console.error('OTP request error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/verify - Verify OTP code\n otpAPI.post('/verify', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpVerifySchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email, code } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Verify the code\n const verification = await otpService.verifyCode(normalizedEmail, code, settings)\n\n if (!verification.valid) {\n // Increment attempts on failure\n await otpService.incrementAttempts(normalizedEmail, code)\n\n return c.json({\n error: verification.error || 'Invalid code',\n attemptsRemaining: verification.attemptsRemaining\n }, 401)\n }\n\n // Code is valid - get user\n let user = await db.prepare(`\n SELECT id, email, username, first_name, last_name, role, is_active, created_at\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && settings.allowNewUserRegistration) {\n // Auto-create new user on first OTP verification\n const userId = crypto.randomUUID()\n const now = Date.now()\n const username = normalizedEmail.split('@')[0] + '_' + userId.slice(0, 6)\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, '', '', NULL, 'viewer', 1, 1, ?, ?)\n `).bind(userId, normalizedEmail, username, now, now).run()\n\n user = {\n id: userId,\n email: normalizedEmail,\n username,\n first_name: '',\n last_name: '',\n role: 'viewer',\n is_active: 1,\n created_at: now,\n }\n }\n\n if (!user) {\n return c.json({\n error: 'User not found'\n }, 404)\n }\n\n if (!user.is_active) {\n return c.json({\n error: 'Account is deactivated'\n }, 403)\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env as any)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, (c.env as any).JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n const customData = await getCustomData(db, user.id)\n const { is_active, ...publicUser } = user\n\n return c.json({\n success: true,\n user: {\n ...publicUser,\n ...customData,\n },\n token,\n message: 'Authentication successful'\n })\n } catch (error) {\n console.error('OTP verify error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/resend - Resend OTP code\n otpAPI.post('/resend', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n // Reuse the request endpoint logic\n return otpAPI.fetch(\n new Request(c.req.url.replace('/resend', '/request'), {\n method: 'POST',\n headers: c.req.raw.headers,\n body: JSON.stringify({ email: validation.data.email })\n }),\n c.env\n )\n } catch (error) {\n console.error('OTP resend error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // Register API routes\n builder.addRoute('/auth/otp', otpAPI, {\n description: 'OTP authentication endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('OTP Login', '/admin/plugins/otp-login', {\n icon: 'key',\n order: 85,\n permissions: ['otp:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OTP Login plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OTP Login plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const otpLoginPlugin = createOTPLoginPlugin()\n","/**\n * OAuth Service\n * Handles OAuth2 authorization code flow, token exchange, and user info fetching.\n * Provider-agnostic — each provider is a simple config object.\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n// ─── Provider Configuration ─────────────────────────────────────────────────\n\nexport interface OAuthProviderConfig {\n id: string\n name: string\n authorizeUrl: string\n tokenUrl: string\n userInfoUrl: string\n scopes: string[]\n /** Map provider profile JSON to a normalized user profile */\n mapProfile: (profile: Record) => OAuthUserProfile\n}\n\nexport interface OAuthUserProfile {\n providerAccountId: string\n email: string\n name: string\n avatar?: string\n}\n\nexport interface OAuthPluginSettings {\n providers: Record\n}\n\n// ─── Built-in Providers ─────────────────────────────────────────────────────\n\nexport const GITHUB_PROVIDER: OAuthProviderConfig = {\n id: 'github',\n name: 'GitHub',\n authorizeUrl: 'https://github.com/login/oauth/authorize',\n tokenUrl: 'https://github.com/login/oauth/access_token',\n userInfoUrl: 'https://api.github.com/user',\n scopes: ['read:user', 'user:email'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || profile.login || '',\n avatar: profile.avatar_url || undefined\n })\n}\n\nexport const GOOGLE_PROVIDER: OAuthProviderConfig = {\n id: 'google',\n name: 'Google',\n authorizeUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n scopes: ['openid', 'email', 'profile'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || '',\n avatar: profile.picture || undefined\n })\n}\n\nexport const BUILT_IN_PROVIDERS: Record = {\n github: GITHUB_PROVIDER,\n google: GOOGLE_PROVIDER\n}\n\n// ─── OAuth Account DB Record ────────────────────────────────────────────────\n\nexport interface OAuthAccount {\n id: string\n user_id: string\n provider: string\n provider_account_id: string\n access_token: string | null\n refresh_token: string | null\n token_expires_at: number | null\n profile_data: string | null\n created_at: number\n updated_at: number\n}\n\n// ─── OAuth Service ──────────────────────────────────────────────────────────\n\nexport class OAuthService {\n constructor(private db: D1Database) {}\n\n /**\n * Build the authorization redirect URL for a provider.\n */\n buildAuthorizeUrl(\n provider: OAuthProviderConfig,\n clientId: string,\n redirectUri: string,\n state: string\n ): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope: provider.scopes.join(' '),\n state\n })\n\n // Google requires access_type for refresh tokens\n if (provider.id === 'google') {\n params.set('access_type', 'offline')\n params.set('prompt', 'consent')\n }\n\n return `${provider.authorizeUrl}?${params.toString()}`\n }\n\n /**\n * Exchange authorization code for tokens using native fetch.\n */\n async exchangeCode(\n provider: OAuthProviderConfig,\n clientId: string,\n clientSecret: string,\n code: string,\n redirectUri: string\n ): Promise<{ access_token: string; refresh_token?: string; expires_in?: number }> {\n const body: Record = {\n client_id: clientId,\n client_secret: clientSecret,\n code,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code'\n }\n\n const response = await fetch(provider.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json'\n },\n body: new URLSearchParams(body).toString()\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Token exchange failed (${response.status}): ${errorText}`)\n }\n\n const data = await response.json() as Record\n\n if (data.error) {\n throw new Error(`Token exchange error: ${data.error_description || data.error}`)\n }\n\n return {\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n expires_in: data.expires_in ? Number(data.expires_in) : undefined\n }\n }\n\n /**\n * Fetch user profile from the provider's userinfo endpoint.\n */\n async fetchUserProfile(\n provider: OAuthProviderConfig,\n accessToken: string\n ): Promise {\n const headers: Record = {\n 'Authorization': `Bearer ${accessToken}`,\n 'Accept': 'application/json'\n }\n\n // GitHub uses a different auth header format\n if (provider.id === 'github') {\n headers['Authorization'] = `token ${accessToken}`\n }\n\n const response = await fetch(provider.userInfoUrl, { headers })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch user profile (${response.status})`)\n }\n\n const profile = await response.json() as Record\n\n // For GitHub, email may not be in the profile — fetch from /user/emails\n if (provider.id === 'github' && !profile.email) {\n const emailResponse = await fetch('https://api.github.com/user/emails', {\n headers: {\n 'Authorization': `token ${accessToken}`,\n 'Accept': 'application/json'\n }\n })\n\n if (emailResponse.ok) {\n const emails = await emailResponse.json() as Array<{ email: string; primary: boolean; verified: boolean }>\n const primaryEmail = emails.find(e => e.primary && e.verified)\n if (primaryEmail) {\n profile.email = primaryEmail.email\n }\n }\n }\n\n return provider.mapProfile(profile)\n }\n\n // ─── Database Operations ────────────────────────────────────────────────\n\n /**\n * Find an existing OAuth account link.\n */\n async findOAuthAccount(\n provider: string,\n providerAccountId: string\n ): Promise {\n return await this.db.prepare(`\n SELECT * FROM oauth_accounts\n WHERE provider = ? AND provider_account_id = ?\n `).bind(provider, providerAccountId).first() as OAuthAccount | null\n }\n\n /**\n * Find all OAuth accounts for a user.\n */\n async findUserOAuthAccounts(userId: string): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM oauth_accounts WHERE user_id = ?\n `).bind(userId).all()\n return (result.results || []) as unknown as OAuthAccount[]\n }\n\n /**\n * Create a new OAuth account link.\n */\n async createOAuthAccount(params: {\n userId: string\n provider: string\n providerAccountId: string\n accessToken: string\n refreshToken?: string\n tokenExpiresAt?: number\n profileData?: string\n }): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO oauth_accounts (\n id, user_id, provider, provider_account_id,\n access_token, refresh_token, token_expires_at,\n profile_data, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n params.userId,\n params.provider,\n params.providerAccountId,\n params.accessToken,\n params.refreshToken || null,\n params.tokenExpiresAt || null,\n params.profileData || null,\n now,\n now\n ).run()\n\n return {\n id,\n user_id: params.userId,\n provider: params.provider,\n provider_account_id: params.providerAccountId,\n access_token: params.accessToken,\n refresh_token: params.refreshToken || null,\n token_expires_at: params.tokenExpiresAt || null,\n profile_data: params.profileData || null,\n created_at: now,\n updated_at: now\n }\n }\n\n /**\n * Update tokens for an existing OAuth account.\n */\n async updateOAuthTokens(\n id: string,\n accessToken: string,\n refreshToken?: string,\n tokenExpiresAt?: number\n ): Promise {\n await this.db.prepare(`\n UPDATE oauth_accounts\n SET access_token = ?, refresh_token = ?, token_expires_at = ?, updated_at = ?\n WHERE id = ?\n `).bind(accessToken, refreshToken || null, tokenExpiresAt || null, Date.now(), id).run()\n }\n\n /**\n * Unlink an OAuth account from a user (only if they have another auth method).\n */\n async unlinkOAuthAccount(userId: string, provider: string): Promise {\n // Check user has a password or another OAuth link before unlinking\n const user = await this.db.prepare(`\n SELECT password_hash FROM users WHERE id = ?\n `).bind(userId).first() as { password_hash: string | null } | null\n\n const otherLinks = await this.db.prepare(`\n SELECT COUNT(*) as count FROM oauth_accounts\n WHERE user_id = ? AND provider != ?\n `).bind(userId, provider).first() as { count: number } | null\n\n const hasPassword = !!user?.password_hash\n const hasOtherLinks = (otherLinks?.count || 0) > 0\n\n if (!hasPassword && !hasOtherLinks) {\n return false // Cannot unlink the only auth method\n }\n\n await this.db.prepare(`\n DELETE FROM oauth_accounts WHERE user_id = ? AND provider = ?\n `).bind(userId, provider).run()\n\n return true\n }\n\n /**\n * Find a user by email.\n */\n async findUserByEmail(email: string): Promise<{\n id: string\n email: string\n role: string\n is_active: number\n first_name: string\n last_name: string\n } | null> {\n return await this.db.prepare(`\n SELECT id, email, role, is_active, first_name, last_name\n FROM users WHERE email = ?\n `).bind(email.toLowerCase()).first() as any\n }\n\n /**\n * Create a new user from an OAuth profile.\n */\n async createUserFromOAuth(profile: OAuthUserProfile): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n const email = profile.email.toLowerCase()\n const nameParts = (profile.name || email.split('@')[0] || 'User').split(' ')\n const firstName = nameParts[0] || 'User'\n const lastName = nameParts.slice(1).join(' ') || ''\n const username = email.split('@')[0] || id.substring(0, 8)\n\n // Check for username collision and append random suffix if needed\n const existing = await this.db.prepare(\n 'SELECT id FROM users WHERE username = ?'\n ).bind(username).first()\n\n const finalUsername = existing\n ? `${username}-${id.substring(0, 6)}`\n : username\n\n await this.db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, avatar, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', ?, 1, ?, ?)\n `).bind(\n id, email, finalUsername, firstName, lastName,\n profile.avatar || null, now, now\n ).run()\n\n return id\n }\n\n /**\n * Generate a cryptographically random state parameter for CSRF protection.\n */\n generateState(): string {\n const bytes = new Uint8Array(32)\n crypto.getRandomValues(bytes)\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')\n }\n}\n","/**\n * OAuth Providers Plugin\n *\n * OAuth2/OIDC social login support for SonicJS.\n * Phase 1: Core OAuth2 authorization code flow with GitHub and Google providers.\n *\n * Routes:\n * GET /auth/oauth/:provider → Redirect to provider authorization\n * GET /auth/oauth/:provider/callback → Handle OAuth callback\n * POST /auth/oauth/link → Link OAuth provider to logged-in account\n * POST /auth/oauth/unlink → Unlink OAuth provider from account\n * GET /auth/oauth/accounts → List linked OAuth accounts for current user\n */\n\nimport { Hono } from 'hono'\nimport { setCookie, getCookie } from 'hono/cookie'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport {\n OAuthService,\n BUILT_IN_PROVIDERS,\n type OAuthPluginSettings,\n type OAuthProviderConfig\n} from './oauth-service'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst STATE_COOKIE_NAME = 'oauth_state'\nconst STATE_COOKIE_MAX_AGE = 600 // 10 minutes\n\nexport function createOAuthProvidersPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'oauth-providers',\n version: '1.0.0-beta.1',\n description: 'OAuth2/OIDC social login with GitHub, Google, and more'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== Helper Functions ====================\n\n function getCallbackUrl(c: any, provider: string): string {\n const proto = c.req.header('x-forwarded-proto') || 'https'\n const host = c.req.header('host') || 'localhost'\n return `${proto}://${host}/auth/oauth/${provider}/callback`\n }\n\n async function loadSettings(db: any): Promise {\n const row = await db.prepare(\n `SELECT settings FROM plugins WHERE id = 'oauth-providers'`\n ).first() as { settings: string | null } | null\n\n if (!row?.settings) return null\n\n try {\n return JSON.parse(row.settings) as OAuthPluginSettings\n } catch {\n return null\n }\n }\n\n function getProviderCredentials(\n settings: OAuthPluginSettings | null,\n providerId: string\n ): { clientId: string; clientSecret: string } | null {\n if (!settings?.providers?.[providerId]) return null\n const p = settings.providers[providerId]\n if (!p.enabled || !p.clientId || !p.clientSecret) return null\n return { clientId: p.clientId, clientSecret: p.clientSecret }\n }\n\n // ==================== API Routes ====================\n\n const oauthAPI = new Hono()\n\n // GET /auth/oauth/:provider — Redirect to provider authorization\n oauthAPI.get('/:provider', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.json({ error: `Unknown OAuth provider: ${providerId}` }, 400)\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.json({\n error: `OAuth provider \"${providerId}\" is not configured or not enabled`\n }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Store state in a cookie for CSRF validation on callback\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax', // Lax required for OAuth redirect flow\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n providerConfig,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.redirect(authorizeUrl)\n } catch (error) {\n console.error('OAuth authorize error:', error)\n return c.json({ error: 'Failed to initiate OAuth flow' }, 500)\n }\n })\n\n // GET /auth/oauth/:provider/callback — Handle OAuth callback\n oauthAPI.get('/:provider/callback', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.redirect('/auth/login?error=Unknown OAuth provider')\n }\n\n // Validate state (CSRF protection)\n const stateParam = c.req.query('state')\n const stateCookie = getCookie(c, STATE_COOKIE_NAME)\n\n if (!stateParam || !stateCookie || stateParam !== stateCookie) {\n return c.redirect('/auth/login?error=Invalid OAuth state. Please try again.')\n }\n\n // Clear the state cookie\n setCookie(c, STATE_COOKIE_NAME, '', {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: 0,\n path: '/auth/oauth'\n })\n\n // Check for error from provider\n const errorParam = c.req.query('error')\n if (errorParam) {\n const errorDesc = c.req.query('error_description') || errorParam\n return c.redirect(`/auth/login?error=${encodeURIComponent(errorDesc)}`)\n }\n\n const code = c.req.query('code')\n if (!code) {\n return c.redirect('/auth/login?error=No authorization code received')\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.redirect('/auth/login?error=OAuth provider not configured')\n }\n\n const oauthService = new OAuthService(db)\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Exchange code for tokens\n const tokens = await oauthService.exchangeCode(\n providerConfig,\n creds.clientId,\n creds.clientSecret,\n code,\n redirectUri\n )\n\n // Fetch user profile from provider\n const profile = await oauthService.fetchUserProfile(providerConfig, tokens.access_token)\n\n if (!profile.email) {\n return c.redirect('/auth/login?error=Could not retrieve email from OAuth provider. Please ensure your email is public or grant email permission.')\n }\n\n const tokenExpiresAt = tokens.expires_in\n ? Date.now() + (tokens.expires_in * 1000)\n : null\n\n // Check if this OAuth account is already linked to a user\n const existingOAuth = await oauthService.findOAuthAccount(providerId, profile.providerAccountId)\n\n if (existingOAuth) {\n // Existing OAuth link — update tokens and log in\n await oauthService.updateOAuthTokens(\n existingOAuth.id,\n tokens.access_token,\n tokens.refresh_token,\n tokenExpiresAt ?? undefined\n )\n\n // Fetch user to generate JWT\n const user = await db.prepare(\n 'SELECT id, email, role, is_active FROM users WHERE id = ?'\n ).bind(existingOAuth.user_id).first() as any\n\n if (!user || !user.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n user.id, user.email, user.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // No existing OAuth link — check if user exists by email\n const existingUser = await oauthService.findUserByEmail(profile.email)\n\n if (existingUser) {\n if (!existingUser.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n // Link OAuth to existing account\n await oauthService.createOAuthAccount({\n userId: existingUser.id,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n existingUser.id, existingUser.email, existingUser.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // Brand new user — create account from OAuth profile\n const newUserId = await oauthService.createUserFromOAuth(profile)\n\n await oauthService.createOAuthAccount({\n userId: newUserId,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n newUserId, profile.email.toLowerCase(), 'viewer',\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n\n } catch (error) {\n console.error('OAuth callback error:', error)\n const message = error instanceof Error ? error.message : 'OAuth authentication failed'\n return c.redirect(`/auth/login?error=${encodeURIComponent(message)}`)\n }\n })\n\n // POST /auth/oauth/link — Link an OAuth provider to the current logged-in user\n oauthAPI.post('/link', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider || !BUILT_IN_PROVIDERS[provider]) {\n return c.json({ error: 'Invalid provider' }, 400)\n }\n\n // Redirect the user to the OAuth flow — the callback will auto-link\n // since the user already exists by email\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, provider)\n\n if (!creds) {\n return c.json({ error: `OAuth provider \"${provider}\" is not configured` }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, provider)\n\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n BUILT_IN_PROVIDERS[provider]!,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.json({ redirectUrl: authorizeUrl })\n } catch (error) {\n console.error('OAuth link error:', error)\n return c.json({ error: 'Failed to initiate account linking' }, 500)\n }\n })\n\n // POST /auth/oauth/unlink — Unlink an OAuth provider from the current user\n oauthAPI.post('/unlink', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider) {\n return c.json({ error: 'Provider is required' }, 400)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const success = await oauthService.unlinkOAuthAccount(user.userId, provider)\n\n if (!success) {\n return c.json({\n error: 'Cannot unlink the only authentication method. Set a password first.'\n }, 400)\n }\n\n return c.json({ success: true, message: `${provider} account unlinked` })\n } catch (error) {\n console.error('OAuth unlink error:', error)\n return c.json({ error: 'Failed to unlink account' }, 500)\n }\n })\n\n // GET /auth/oauth/accounts — List linked OAuth accounts for current user\n oauthAPI.get('/accounts', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const accounts = await oauthService.findUserOAuthAccounts(user.userId)\n\n return c.json({\n accounts: accounts.map(a => ({\n provider: a.provider,\n providerAccountId: a.provider_account_id,\n linkedAt: a.created_at\n }))\n })\n } catch (error) {\n console.error('OAuth accounts error:', error)\n return c.json({ error: 'Failed to fetch linked accounts' }, 500)\n }\n })\n\n // Register routes\n builder.addRoute('/auth/oauth', oauthAPI, {\n description: 'OAuth2 social login endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Add menu item for admin settings\n builder.addMenuItem('OAuth Providers', '/admin/plugins/oauth-providers', {\n icon: 'shield',\n order: 86,\n permissions: ['oauth:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OAuth Providers plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OAuth Providers plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const oauthProvidersPlugin = createOAuthProvidersPlugin()\n","/**\n * Embedding Service\n * Generates embeddings using Cloudflare Workers AI\n */\n\nexport class EmbeddingService {\n constructor(private ai: any) {}\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string): Promise {\n try {\n // Use Cloudflare Workers AI embedding model\n // @cf/baai/bge-base-en-v1.5 produces 768-dimensional vectors\n const response = await this.ai.run('@cf/baai/bge-base-en-v1.5', {\n text: this.preprocessText(text)\n })\n\n // Extract embedding vector\n if (response.data && response.data.length > 0) {\n return response.data[0]\n }\n\n throw new Error('No embedding data returned')\n } catch (error) {\n console.error('[EmbeddingService] Error generating embedding:', error)\n throw error\n }\n }\n\n /**\n * Generate embeddings for multiple texts (batch processing)\n */\n async generateBatch(texts: string[]): Promise {\n try {\n // Process in smaller batches to avoid rate limits\n const batchSize = 10\n const batches: string[][] = []\n \n for (let i = 0; i < texts.length; i += batchSize) {\n batches.push(texts.slice(i, i + batchSize))\n }\n\n const allEmbeddings: number[][] = []\n\n for (const batch of batches) {\n const batchEmbeddings = await Promise.all(\n batch.map(text => this.generateEmbedding(text))\n )\n allEmbeddings.push(...batchEmbeddings)\n }\n\n return allEmbeddings\n } catch (error) {\n console.error('[EmbeddingService] Error generating batch embeddings:', error)\n throw error\n }\n }\n\n /**\n * Preprocess text before generating embedding\n * - Trim whitespace\n * - Limit length to avoid token limits\n * - Remove special characters that might cause issues\n */\n private preprocessText(text: string): string {\n if (!text) return ''\n\n // Trim and normalize whitespace\n let processed = text.trim().replace(/\\s+/g, ' ')\n\n // Limit to ~8000 characters (rough token limit)\n if (processed.length > 8000) {\n processed = processed.substring(0, 8000)\n }\n\n return processed\n }\n\n /**\n * Calculate cosine similarity between two embeddings\n */\n cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Embeddings must have same dimensions')\n }\n\n let dotProduct = 0\n let normA = 0\n let normB = 0\n\n for (let i = 0; i < a.length; i++) {\n const aVal = a[i] ?? 0\n const bVal = b[i] ?? 0\n dotProduct += aVal * bVal\n normA += aVal * aVal\n normB += bVal * bVal\n }\n\n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB))\n }\n}\n","/**\n * Chunking Service\n * Splits content into optimal chunks for embedding and search\n */\n\nexport interface ContentChunk {\n id: string\n content_id: string\n collection_id: string\n title: string\n text: string\n chunk_index: number\n metadata: Record\n}\n\nexport class ChunkingService {\n // Default chunk size (in approximate tokens)\n private readonly CHUNK_SIZE = 500\n private readonly CHUNK_OVERLAP = 50\n\n /**\n * Chunk a single content item\n */\n chunkContent(\n contentId: string,\n collectionId: string,\n title: string,\n data: any,\n metadata: Record = {}\n ): ContentChunk[] {\n // Extract all text from content\n const text = this.extractText(data)\n \n if (!text || text.trim().length === 0) {\n console.warn(`[ChunkingService] No text found for content ${contentId}`)\n return []\n }\n\n // Split into chunks\n const textChunks = this.splitIntoChunks(text)\n\n // Create chunk objects\n return textChunks.map((chunkText, index) => ({\n id: `${contentId}_chunk_${index}`,\n content_id: contentId,\n collection_id: collectionId,\n title: title,\n text: chunkText,\n chunk_index: index,\n metadata: {\n ...metadata,\n total_chunks: textChunks.length\n }\n }))\n }\n\n /**\n * Chunk multiple content items\n */\n chunkContentBatch(items: Array<{\n id: string\n collection_id: string\n title: string\n data: any\n metadata?: Record\n }>): ContentChunk[] {\n const allChunks: ContentChunk[] = []\n\n for (const item of items) {\n const chunks = this.chunkContent(\n item.id,\n item.collection_id,\n item.title,\n item.data,\n item.metadata\n )\n allChunks.push(...chunks)\n }\n\n return allChunks\n }\n\n /**\n * Extract all text from content data\n */\n private extractText(data: any): string {\n const parts: string[] = []\n\n // Common text fields\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n if (data.summary) parts.push(String(data.summary))\n\n // Recursively extract from nested objects\n const extractRecursive = (obj: any): void => {\n if (typeof obj === 'string') {\n // Skip very short strings and URLs\n if (obj.length > 10 && !obj.startsWith('http')) {\n parts.push(obj)\n }\n } else if (Array.isArray(obj)) {\n obj.forEach(extractRecursive)\n } else if (obj && typeof obj === 'object') {\n // Skip certain keys\n const skipKeys = ['id', 'slug', 'url', 'image', 'thumbnail', 'metadata']\n \n Object.entries(obj).forEach(([key, value]) => {\n if (!skipKeys.includes(key.toLowerCase())) {\n extractRecursive(value)\n }\n })\n }\n }\n\n extractRecursive(data)\n\n return parts.join('\\n\\n').trim()\n }\n\n /**\n * Split text into overlapping chunks\n */\n private splitIntoChunks(text: string): string[] {\n // Split by words\n const words = text.split(/\\s+/)\n \n if (words.length <= this.CHUNK_SIZE) {\n return [text]\n }\n\n const chunks: string[] = []\n let startIndex = 0\n\n while (startIndex < words.length) {\n // Get chunk with overlap\n const endIndex = Math.min(startIndex + this.CHUNK_SIZE, words.length)\n const chunk = words.slice(startIndex, endIndex).join(' ')\n chunks.push(chunk)\n\n // Move forward by chunk size minus overlap\n startIndex += this.CHUNK_SIZE - this.CHUNK_OVERLAP\n\n // Ensure we don't create a tiny last chunk\n if (startIndex >= words.length - this.CHUNK_OVERLAP) {\n break\n }\n }\n\n return chunks\n }\n\n /**\n * Get optimal chunk size based on content type\n */\n getOptimalChunkSize(contentType: string): number {\n switch (contentType) {\n case 'blog_posts':\n case 'articles':\n return 600 // Larger chunks for long-form content\n case 'products':\n case 'pages':\n return 400 // Medium chunks for structured content\n case 'messages':\n case 'comments':\n return 200 // Small chunks for short content\n default:\n return this.CHUNK_SIZE\n }\n }\n}\n","/**\n * Custom RAG Service\n * Implements full RAG pipeline using Cloudflare Vectorize\n * \n * Fulfills GitHub Issue #362: Advanced search with Cloudflare Search\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { EmbeddingService } from './embedding.service'\nimport { ChunkingService, type ContentChunk } from './chunking.service'\nimport type { SearchQuery, SearchResponse, SearchResult, AISearchSettings } from '../types'\n\nexport class CustomRAGService {\n private embeddingService: EmbeddingService\n private chunkingService: ChunkingService\n\n constructor(\n private db: D1Database,\n private ai: any,\n private vectorize: any\n ) {\n this.embeddingService = new EmbeddingService(ai)\n this.chunkingService = new ChunkingService()\n }\n\n /**\n * Index all content from a collection\n */\n async indexCollection(collectionId: string): Promise<{\n total_items: number\n total_chunks: number\n indexed_chunks: number\n errors: number\n }> {\n console.log(`[CustomRAG] Starting indexing for collection: ${collectionId}`)\n \n try {\n // Get all published content from collection\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.collection_id = ? AND c.status = 'published'\n `)\n .bind(collectionId)\n .all<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n const totalItems = contentItems?.length || 0\n \n if (totalItems === 0) {\n console.log(`[CustomRAG] No content found in collection ${collectionId}`)\n return { total_items: 0, total_chunks: 0, indexed_chunks: 0, errors: 0 }\n }\n\n // Chunk all content\n const items = (contentItems || []).map(item => ({\n id: item.id,\n collection_id: item.collection_id,\n title: item.title || 'Untitled',\n data: typeof item.data === 'string' ? JSON.parse(item.data) : item.data,\n metadata: {\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name\n }\n }))\n\n const chunks = this.chunkingService.chunkContentBatch(items)\n const totalChunks = chunks.length\n\n console.log(`[CustomRAG] Generated ${totalChunks} chunks from ${totalItems} items`)\n\n // Generate embeddings in batches\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n console.log(`[CustomRAG] Generated ${embeddings.length} embeddings`)\n\n // Store in Vectorize\n let indexedChunks = 0\n let errors = 0\n const batchSize = 100\n\n for (let i = 0; i < chunks.length; i += batchSize) {\n const chunkBatch = chunks.slice(i, i + batchSize)\n const embeddingBatch = embeddings.slice(i, i + batchSize)\n\n try {\n await this.vectorize.upsert(\n chunkBatch.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddingBatch[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500), // Store snippet for display\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n indexedChunks += chunkBatch.length\n console.log(`[CustomRAG] Indexed batch ${i / batchSize + 1}: ${chunkBatch.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error indexing batch ${i / batchSize + 1}:`, error)\n errors += chunkBatch.length\n }\n }\n\n console.log(`[CustomRAG] Indexing complete: ${indexedChunks}/${totalChunks} chunks indexed`)\n\n return {\n total_items: totalItems,\n total_chunks: totalChunks,\n indexed_chunks: indexedChunks,\n errors\n }\n } catch (error) {\n console.error(`[CustomRAG] Error indexing collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Search using RAG (semantic search with Vectorize)\n */\n async search(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n\n try {\n console.log(`[CustomRAG] Searching for: \"${query.query}\"`)\n\n // Generate query embedding\n const queryEmbedding = await this.embeddingService.generateEmbedding(query.query)\n\n // Build Vectorize query filters\n const filter: any = {}\n \n if (query.filters?.collections && query.filters.collections.length > 0) {\n filter.collection_id = { $in: query.filters.collections }\n } else if (settings.selected_collections.length > 0) {\n filter.collection_id = { $in: settings.selected_collections }\n }\n\n if (query.filters?.status && query.filters.status.length > 0) {\n filter.status = { $in: query.filters.status }\n }\n\n // Vectorize filters have issues, so we query without filter and manually filter results\n const vectorResults = await this.vectorize.query(queryEmbedding, {\n topK: 50, // Max allowed with returnMetadata: true\n returnMetadata: true\n })\n\n // Manually filter results by collection_id if filter exists\n let filteredMatches = vectorResults.matches || []\n if (filter.collection_id?.$in && Array.isArray(filter.collection_id.$in)) {\n const allowedCollections = filter.collection_id.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedCollections.includes(match.metadata?.collection_id)\n )\n }\n\n // Apply status filter if exists\n if (filter.status?.$in && Array.isArray(filter.status.$in)) {\n const allowedStatuses = filter.status.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedStatuses.includes(match.metadata?.status)\n )\n }\n\n // Limit to requested topK\n const topK = query.limit || settings.results_limit || 20\n filteredMatches = filteredMatches.slice(0, topK)\n\n // Replace matches with filtered results\n vectorResults.matches = filteredMatches\n\n if (!vectorResults.matches || vectorResults.matches.length === 0) {\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: 'ai'\n }\n }\n\n // Get unique content IDs\n const contentIds = [...new Set(\n vectorResults.matches.map((m: any) => m.metadata.content_id)\n )]\n\n // Fetch full content from D1\n const placeholders = contentIds.map(() => '?').join(',')\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.display_name as collection_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id IN (${placeholders})\n `)\n .bind(...contentIds)\n .all<{\n id: string\n title: string\n slug: string\n collection_id: string\n collection_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n }>()\n\n // Map results with relevance scores\n const searchResults: SearchResult[] = (contentItems || []).map(item => {\n // Find best matching chunk for this content\n const matchingChunks = vectorResults.matches.filter(\n (m: any) => m.metadata.content_id === item.id\n )\n \n const bestMatch = matchingChunks.reduce((best: any, current: any) => \n current.score > (best?.score || 0) ? current : best\n , null)\n\n return {\n id: item.id,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n collection_id: item.collection_id,\n collection_name: item.collection_name,\n snippet: bestMatch?.metadata?.text || '',\n relevance_score: bestMatch?.score || 0,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at\n }\n })\n\n // Sort by relevance score\n searchResults.sort((a, b) => (b.relevance_score || 0) - (a.relevance_score || 0))\n\n const queryTime = Date.now() - startTime\n console.log(`[CustomRAG] Search completed in ${queryTime}ms, ${searchResults.length} results`)\n\n return {\n results: searchResults,\n total: searchResults.length,\n query_time_ms: queryTime,\n mode: 'ai'\n }\n } catch (error) {\n console.error('[CustomRAG] Search error:', error)\n throw error\n }\n }\n\n /**\n * Update index for a single content item\n */\n async updateContentIndex(contentId: string): Promise {\n try {\n // Get content item\n const content = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n .bind(contentId)\n .first<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!content) {\n console.warn(`[CustomRAG] Content ${contentId} not found`)\n return\n }\n\n // If content is not published, remove from index\n if (content.status !== 'published') {\n await this.removeContentFromIndex(contentId)\n return\n }\n\n // Chunk content\n const chunks = this.chunkingService.chunkContent(\n content.id,\n content.collection_id,\n content.title || 'Untitled',\n typeof content.data === 'string' ? JSON.parse(content.data) : content.data,\n {\n status: content.status,\n created_at: content.created_at,\n updated_at: content.updated_at,\n author_id: content.author_id,\n collection_name: content.collection_name,\n collection_display_name: content.collection_display_name\n }\n )\n\n // Generate embeddings\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n // Update in Vectorize\n await this.vectorize.upsert(\n chunks.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddings[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500),\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n console.log(`[CustomRAG] Updated index for content ${contentId}: ${chunks.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error updating index for ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove content from index\n */\n async removeContentFromIndex(contentId: string): Promise {\n try {\n // Note: Vectorize doesn't have a bulk delete by metadata filter\n // We need to delete each chunk individually\n // In practice, we would track chunk IDs or use a different approach\n \n console.log(`[CustomRAG] Removing content ${contentId} from index`)\n \n // For now, we'll let stale chunks age out\n // A better approach would be to maintain a mapping in D1\n // TODO: Implement proper chunk tracking\n \n } catch (error) {\n console.error(`[CustomRAG] Error removing content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Get search suggestions based on query\n */\n async getSuggestions(partialQuery: string, limit: number = 5): Promise {\n try {\n // Generate embedding for partial query\n const queryEmbedding = await this.embeddingService.generateEmbedding(partialQuery)\n\n // Search for similar content titles\n const results = await this.vectorize.query(queryEmbedding, {\n topK: limit * 2, // Get more to filter\n returnMetadata: true\n })\n\n // Extract unique titles\n const suggestions = [...new Set(\n results.matches?.map((m: any) => m.metadata.title).filter(Boolean) || []\n )].slice(0, limit)\n\n return suggestions as string[]\n } catch (error) {\n console.error('[CustomRAG] Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Check if Vectorize is available and configured\n */\n isAvailable(): boolean {\n return !!this.vectorize && !!this.ai\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n NewCollectionNotification,\n} from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * AI Search Service\n * Handles search operations, settings management, and collection detection\n * Now uses Custom RAG with Vectorize for semantic search\n */\nexport class AISearchService {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[AISearchService] Custom RAG initialized')\n } else {\n console.log('[AISearchService] Custom RAG not available, using keyword search only')\n }\n }\n\n /**\n * Get plugin settings\n */\n async getSettings(): Promise {\n try {\n const plugin = await this.db\n .prepare(`SELECT settings FROM plugins WHERE id = ? LIMIT 1`)\n .bind('ai-search')\n .first<{ settings: string | null }>()\n\n if (!plugin || !plugin.settings) {\n return this.getDefaultSettings()\n }\n\n return JSON.parse(plugin.settings) as AISearchSettings\n } catch (error) {\n console.error('Error fetching AI Search settings:', error)\n return this.getDefaultSettings()\n }\n }\n\n /**\n * Get default settings\n */\n getDefaultSettings(): AISearchSettings {\n return {\n enabled: true,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n }\n\n /**\n * Update plugin settings\n */\n async updateSettings(settings: Partial): Promise {\n const existing = await this.getSettings()\n const updated: AISearchSettings = {\n ...existing!,\n ...settings,\n }\n\n try {\n // Update plugin settings in plugins table\n await this.db\n .prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'ai-search'\n `)\n .bind(JSON.stringify(updated))\n .run()\n\n return updated\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n throw error\n }\n }\n\n /**\n * Detect new collections that aren't indexed or dismissed\n */\n async detectNewCollections(): Promise {\n try {\n // Get all collections (exclude test collections)\n // Note: D1 doesn't support parameterized LIKE, so we filter in JavaScript\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: number\n name: string\n display_name: string\n description?: string\n }>()\n \n // Filter out test collections (starts with test_, ends with _test, or is test_collection)\n const collections = (allCollections || []).filter(\n (col) => {\n if (!col.name) return false\n const name = col.name.toLowerCase()\n return !name.startsWith('test_') && \n !name.endsWith('_test') && \n name !== 'test_collection' &&\n !name.includes('_test_') &&\n name !== 'large_payload_test' &&\n name !== 'concurrent_test'\n }\n )\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n\n // Get item counts for each collection\n const notifications: NewCollectionNotification[] = []\n\n for (const collection of collections || []) {\n const collectionId = String(collection.id)\n\n // Skip if already selected or dismissed\n if (selected.includes(collectionId) || dismissed.includes(collectionId)) {\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n notifications.push({\n collection: {\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: false,\n is_dismissed: false,\n is_new: true,\n },\n message: `New collection \"${collection.display_name}\" with ${itemCount} items available for indexing`,\n })\n }\n\n return notifications\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return []\n }\n }\n\n /**\n * Get all collections with indexing status\n */\n async getAllCollections(): Promise {\n try {\n // Get all collections (same query as content page)\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1 ORDER BY display_name'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: string\n name: string\n display_name: string\n description?: string\n }>()\n \n console.log('[AISearchService.getAllCollections] Raw collections from DB:', allCollections?.length || 0)\n const firstCollection = allCollections?.[0]\n if (firstCollection) {\n console.log('[AISearchService.getAllCollections] Sample collection:', {\n id: firstCollection.id,\n name: firstCollection.name,\n display_name: firstCollection.display_name\n })\n }\n \n // No filtering needed - test collections are now properly cleaned up by E2E tests\n const collections = (allCollections || []).filter(\n (col) => col.id && col.name\n )\n \n console.log('[AISearchService.getAllCollections] After filtering test collections:', collections.length)\n console.log('[AISearchService.getAllCollections] Remaining collections:', collections.map(c => c.name).join(', '))\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n \n console.log('[AISearchService.getAllCollections] Settings:', {\n selected_count: selected.length,\n dismissed_count: dismissed.length,\n selected: selected\n })\n\n // Get item counts and indexing status\n const collectionInfos: CollectionInfo[] = []\n\n for (const collection of collections) {\n if (!collection.id || !collection.name) continue\n const collectionId = String(collection.id)\n \n if (!collectionId) {\n console.warn('[AISearchService] Skipping invalid collection:', collection)\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n collectionInfos.push({\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name || collection.name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: selected.includes(collectionId),\n is_dismissed: dismissed.includes(collectionId),\n is_new: !selected.includes(collectionId) && !dismissed.includes(collectionId),\n })\n }\n \n console.log('[AISearchService.getAllCollections] Returning collectionInfos:', collectionInfos.length)\n const firstInfo = collectionInfos[0]\n if (collectionInfos.length > 0 && firstInfo) {\n console.log('[AISearchService.getAllCollections] First collectionInfo:', {\n id: firstInfo.id,\n name: firstInfo.name,\n display_name: firstInfo.display_name,\n item_count: firstInfo.item_count\n })\n }\n return collectionInfos\n } catch (error) {\n console.error('[AISearchService] Error fetching collections:', error)\n return []\n }\n }\n\n /**\n * Execute search query\n */\n async search(query: SearchQuery): Promise {\n const startTime = Date.now()\n const settings = await this.getSettings()\n\n if (!settings?.enabled) {\n return {\n results: [],\n total: 0,\n query_time_ms: 0,\n mode: query.mode,\n }\n }\n\n // Use AI Search if enabled and mode is 'ai'\n if (query.mode === 'ai' && settings.ai_mode_enabled && this.customRAG?.isAvailable()) {\n return this.searchAI(query, settings)\n }\n\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n\n /**\n * AI-powered semantic search using Custom RAG\n */\n private async searchAI(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n \n try {\n if (!this.customRAG) {\n console.warn('[AISearchService] CustomRAG not available, falling back to keyword search')\n return this.searchKeyword(query, settings)\n }\n\n // Use Custom RAG for semantic search - pass the full query object and settings\n const result = await this.customRAG.search(query, settings)\n\n return result\n } catch (error) {\n console.error('[AISearchService] AI search error, falling back to keyword:', error)\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n }\n\n /**\n * Traditional keyword search\n */\n private async searchKeyword(\n query: SearchQuery,\n settings: AISearchSettings\n ): Promise {\n const startTime = Date.now()\n\n try {\n const conditions: string[] = []\n const params: any[] = []\n\n // Search query\n if (query.query) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n const searchTerm = `%${query.query}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n // Collection filter\n if (query.filters?.collections && query.filters.collections.length > 0) {\n const placeholders = query.filters.collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...query.filters.collections)\n } else if (settings.selected_collections.length > 0) {\n // Only search indexed collections\n const placeholders = settings.selected_collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...settings.selected_collections)\n }\n\n // Status filter\n if (query.filters?.status && query.filters.status.length > 0) {\n const placeholders = query.filters.status.map(() => '?').join(',')\n conditions.push(`c.status IN (${placeholders})`)\n params.push(...query.filters.status)\n } else {\n // Exclude deleted by default\n conditions.push(\"c.status != 'deleted'\")\n }\n\n // Date range filter\n if (query.filters?.dateRange) {\n const field = query.filters.dateRange.field || 'created_at'\n if (query.filters.dateRange.start) {\n conditions.push(`c.${field} >= ?`)\n params.push(query.filters.dateRange.start.getTime())\n }\n if (query.filters.dateRange.end) {\n conditions.push(`c.${field} <= ?`)\n params.push(query.filters.dateRange.end.getTime())\n }\n }\n\n // Author filter\n if (query.filters?.author) {\n conditions.push('c.author_id = ?')\n params.push(query.filters.author)\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get results\n const limit = query.limit || settings.results_limit\n const offset = query.offset || 0\n\n const resultsStmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id, c.data,\n col.name as collection_name, col.display_name as collection_display_name,\n u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results } = await resultsStmt.bind(...params, limit, offset).all<{\n id: string\n title: string\n slug: string\n collection_id: number\n collection_name: string\n collection_display_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n author_email?: string\n data: string\n }>()\n\n const searchResults: SearchResult[] = (results || []).map((row) => ({\n id: String(row.id),\n title: row.title || 'Untitled',\n slug: row.slug || '',\n collection_id: String(row.collection_id),\n collection_name: row.collection_display_name || row.collection_name,\n snippet: this.extractSnippet(row.data, query.query),\n status: row.status,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n author_name: row.author_email,\n }))\n\n const queryTime = Date.now() - startTime\n\n // Log search history\n await this.logSearch(query.query, query.mode, searchResults.length)\n\n return {\n results: searchResults,\n total,\n query_time_ms: queryTime,\n mode: query.mode,\n }\n } catch (error) {\n console.error('Keyword search error:', error)\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: query.mode,\n }\n }\n }\n\n /**\n * Extract snippet from content data\n */\n private extractSnippet(data: string, query: string): string {\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data\n const text = JSON.stringify(parsed).toLowerCase()\n const queryLower = query.toLowerCase()\n\n const index = text.indexOf(queryLower)\n if (index === -1) {\n // Return first 200 chars\n return JSON.stringify(parsed).substring(0, 200) + '...'\n }\n\n // Extract context around match\n const start = Math.max(0, index - 50)\n const end = Math.min(text.length, index + query.length + 50)\n return text.substring(start, end) + '...'\n } catch {\n return data.substring(0, 200) + '...'\n }\n }\n\n /**\n * Get search suggestions (autocomplete)\n */\n async getSearchSuggestions(partial: string): Promise {\n try {\n const settings = await this.getSettings()\n if (!settings?.autocomplete_enabled) {\n return []\n }\n\n // If Custom RAG is available, use AI-powered suggestions\n if (this.customRAG?.isAvailable()) {\n try {\n const aiSuggestions = await this.customRAG.getSuggestions(partial, 5)\n if (aiSuggestions.length > 0) {\n return aiSuggestions\n }\n } catch (error) {\n console.error('[AISearchService] Error getting AI suggestions:', error)\n // Fall through to history-based suggestions\n }\n }\n\n // Fallback to history-based suggestions\n const stmt = this.db.prepare(`\n SELECT DISTINCT query \n FROM ai_search_history \n WHERE query LIKE ? \n ORDER BY created_at DESC \n LIMIT 10\n `)\n const { results } = await stmt.bind(`%${partial}%`).all<{ query: string }>()\n\n return (results || []).map((r) => r.query)\n } catch (error) {\n console.error('Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Log search query to history\n */\n private async logSearch(query: string, mode: 'ai' | 'keyword', resultsCount: number): Promise {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_history (query, mode, results_count, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await stmt.bind(query, mode, resultsCount, Date.now()).run()\n } catch (error) {\n console.error('Error logging search:', error)\n }\n }\n\n /**\n * Get search analytics\n */\n async getSearchAnalytics(): Promise<{\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }> {\n try {\n // Total queries (last 30 days)\n const totalStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n `)\n const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000\n const totalResult = await totalStmt.bind(thirtyDaysAgo).first<{ count: number }>()\n\n // AI vs Keyword breakdown\n const modeStmt = this.db.prepare(`\n SELECT mode, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY mode\n `)\n const { results: modeResults } = await modeStmt.bind(thirtyDaysAgo).all<{\n mode: string\n count: number\n }>()\n\n const aiCount = modeResults?.find((r) => r.mode === 'ai')?.count || 0\n const keywordCount = modeResults?.find((r) => r.mode === 'keyword')?.count || 0\n\n // Popular queries\n const popularStmt = this.db.prepare(`\n SELECT query, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY query \n ORDER BY count DESC \n LIMIT 10\n `)\n const { results: popularResults } = await popularStmt.bind(thirtyDaysAgo).all<{\n query: string\n count: number\n }>()\n\n return {\n total_queries: totalResult?.count || 0,\n ai_queries: aiCount,\n keyword_queries: keywordCount,\n popular_queries: (popularResults || []).map((r) => ({\n query: r.query,\n count: r.count,\n })),\n average_query_time: 0, // TODO: Track query times\n }\n } catch (error) {\n console.error('Error getting analytics:', error)\n return {\n total_queries: 0,\n ai_queries: 0,\n keyword_queries: 0,\n popular_queries: [],\n average_query_time: 0,\n }\n }\n }\n\n /**\n * Verify Custom RAG is available\n */\n verifyBinding(): boolean {\n return this.customRAG?.isAvailable() ?? false\n }\n\n /**\n * Get Custom RAG service instance (for indexer)\n */\n getCustomRAG(): CustomRAGService | undefined {\n return this.customRAG\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { AISearchSettings, IndexStatus } from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * Index Manager Service\n * Handles indexing of content items using Custom RAG with Vectorize\n */\nexport class IndexManager {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[IndexManager] Custom RAG initialized')\n }\n }\n\n /**\n * Index all content items within a collection using Custom RAG\n */\n async indexCollection(collectionId: string): Promise {\n try {\n // Get collection info\n const collectionStmt = this.db.prepare(\n 'SELECT id, name, display_name FROM collections WHERE id = ?'\n )\n const collection = await collectionStmt.bind(collectionId).first<{\n id: string\n name: string\n display_name: string\n }>()\n\n if (!collection) {\n throw new Error(`Collection ${collectionId} not found`)\n }\n\n // Update status to indexing\n await this.updateIndexStatus(collectionId, {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n status: 'indexing',\n })\n\n // Use Custom RAG for indexing if available\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Using Custom RAG to index collection ${collectionId}`)\n \n const result = await this.customRAG.indexCollection(collectionId)\n\n const finalStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: result.total_items,\n indexed_items: result.indexed_chunks,\n last_sync_at: Date.now(),\n status: result.errors > 0 ? 'error' : 'completed',\n error_message: result.errors > 0 ? `${result.errors} errors during indexing` : undefined\n }\n\n await this.updateIndexStatus(collectionId, finalStatus)\n return finalStatus\n }\n\n // Fallback: No indexing without Custom RAG\n console.warn(`[IndexManager] Custom RAG not available, skipping indexing for ${collectionId}`)\n \n const fallbackStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n last_sync_at: Date.now(),\n status: 'completed',\n error_message: 'Custom RAG not available - using keyword search only'\n }\n\n await this.updateIndexStatus(collectionId, fallbackStatus)\n return fallbackStatus\n } catch (error) {\n console.error(`[IndexManager] Error indexing collection ${collectionId}:`, error)\n const errorStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: 'Unknown',\n total_items: 0,\n indexed_items: 0,\n status: 'error',\n error_message: error instanceof Error ? error.message : String(error),\n }\n await this.updateIndexStatus(collectionId, errorStatus)\n return errorStatus\n }\n }\n\n /**\n * Index a single content item\n */\n private async indexContentItem(\n item: {\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n },\n collectionId: string\n ): Promise {\n try {\n // Parse content data\n let parsedData: any = {}\n try {\n parsedData = typeof item.data === 'string' ? JSON.parse(item.data) : item.data\n } catch {\n parsedData = {}\n }\n\n // Prepare document for AI Search\n const document = {\n id: `content_${item.id}`,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n content: this.extractSearchableText(parsedData),\n metadata: {\n collection_id: collectionId,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n },\n }\n\n // TODO: Call Cloudflare AI Search API to index document\n // await this.aiSearch.index(document)\n\n // For now, just log (actual implementation will use AI Search API)\n console.log(`Indexed content item: ${item.id}`)\n } catch (error) {\n console.error(`Error indexing content item ${item.id}:`, error)\n throw error\n }\n }\n\n /**\n * Extract searchable text from content data\n */\n private extractSearchableText(data: any): string {\n const parts: string[] = []\n\n // Add title if present\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n\n // Add description/content fields\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n\n // Add all string values from data\n const extractStrings = (obj: any): void => {\n if (typeof obj === 'string') {\n parts.push(obj)\n } else if (Array.isArray(obj)) {\n obj.forEach(extractStrings)\n } else if (obj && typeof obj === 'object') {\n Object.values(obj).forEach(extractStrings)\n }\n }\n\n extractStrings(data)\n\n return parts.join(' ')\n }\n\n /**\n * Update a single content item in the index\n */\n async updateIndex(collectionId: number, contentId: string): Promise {\n try {\n // Get content item\n const stmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.data, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ? AND c.collection_id = ?\n `)\n const item = await stmt.bind(contentId, collectionId).first<{\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!item) {\n throw new Error(`Content item ${contentId} not found`)\n }\n\n // Re-index the item\n await this.indexContentItem(item, String(collectionId))\n\n // Update last sync time for collection\n const status = await this.getIndexStatus(String(collectionId))\n if (status) {\n await this.updateIndexStatus(String(collectionId), {\n ...status,\n last_sync_at: Date.now(),\n })\n }\n } catch (error) {\n console.error(`Error updating index for content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove a content item from the index using Custom RAG\n */\n async removeFromIndex(collectionId: string, contentId: string): Promise {\n try {\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Removing content ${contentId} from index`)\n await this.customRAG.removeContentFromIndex(contentId)\n } else {\n console.warn(`[IndexManager] Custom RAG not available, skipping removal for ${contentId}`)\n }\n } catch (error) {\n console.error(`[IndexManager] Error removing content ${contentId} from index:`, error)\n throw error\n }\n }\n\n /**\n * Get indexing status for a collection\n */\n async getIndexStatus(collectionId: string): Promise {\n try {\n const stmt = this.db.prepare(\n 'SELECT * FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const result = await stmt.bind(collectionId).first<{\n id: number\n collection_id: string\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n if (!result) {\n return null\n }\n\n return {\n collection_id: String(result.collection_id),\n collection_name: result.collection_name,\n total_items: result.total_items,\n indexed_items: result.indexed_items,\n last_sync_at: result.last_sync_at,\n status: result.status as IndexStatus['status'],\n error_message: result.error_message,\n }\n } catch (error) {\n console.error(`Error getting index status for collection ${collectionId}:`, error)\n return null\n }\n }\n\n /**\n * Get indexing status for all collections\n */\n async getAllIndexStatus(): Promise> {\n try {\n const stmt = this.db.prepare('SELECT * FROM ai_search_index_meta')\n const { results } = await stmt.all<{\n id: number\n collection_id: number\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n const statusMap: Record = {}\n\n for (const row of results || []) {\n const collectionId = String(row.collection_id)\n statusMap[collectionId] = {\n collection_id: collectionId,\n collection_name: row.collection_name,\n total_items: row.total_items,\n indexed_items: row.indexed_items,\n last_sync_at: row.last_sync_at,\n status: row.status as IndexStatus['status'],\n error_message: row.error_message,\n }\n }\n\n return statusMap\n } catch (error) {\n console.error('Error getting all index status:', error)\n return {}\n }\n }\n\n /**\n * Update index status in database\n */\n private async updateIndexStatus(collectionId: string, status: IndexStatus): Promise {\n try {\n // Check if record exists\n const checkStmt = this.db.prepare(\n 'SELECT id FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const existing = await checkStmt.bind(collectionId).first<{ id: number }>()\n\n if (existing) {\n // Update existing\n const stmt = this.db.prepare(`\n UPDATE ai_search_index_meta \n SET collection_name = ?,\n total_items = ?,\n indexed_items = ?,\n last_sync_at = ?,\n status = ?,\n error_message = ?\n WHERE collection_id = ?\n `)\n await stmt\n .bind(\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null,\n String(collectionId)\n )\n .run()\n } else {\n // Insert new\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_index_meta (\n collection_id, collection_name, total_items, indexed_items,\n last_sync_at, status, error_message\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n await stmt\n .bind(\n String(status.collection_id),\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null\n )\n .run()\n }\n } catch (error) {\n console.error(`Error updating index status for collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Sync all selected collections\n */\n async syncAll(selectedCollections: string[]): Promise {\n for (const collectionId of selectedCollections) {\n try {\n await this.indexCollection(collectionId)\n } catch (error) {\n console.error(`Error syncing collection ${collectionId}:`, error)\n }\n }\n }\n}\n","import { renderAdminLayout } from '../../../../templates/layouts/admin-layout-v2.template'\nimport type {\n AISearchSettings,\n CollectionInfo,\n IndexStatus,\n NewCollectionNotification,\n} from '../types'\n\ninterface SettingsPageData {\n settings: AISearchSettings | null\n collections: CollectionInfo[]\n newCollections: NewCollectionNotification[]\n indexStatus: Record\n analytics: {\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const settings = data.settings || {\n enabled: false,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n\n // Ensure arrays exist\n const selectedCollections = Array.isArray(settings.selected_collections) ? settings.selected_collections : []\n const dismissedCollections = Array.isArray(settings.dismissed_collections) ? settings.dismissed_collections : []\n\n const enabled = settings.enabled === true\n const aiModeEnabled = settings.ai_mode_enabled !== false\n const autocompleteEnabled = settings.autocomplete_enabled !== false\n const indexMedia = settings.index_media === true\n\n const selectedCollectionIds = new Set(selectedCollections.map(id => String(id)))\n const dismissedCollectionIds = new Set(dismissedCollections.map(id => String(id)))\n\n // Ensure collections array exists\n const collections = Array.isArray(data.collections) ? data.collections : []\n\n // Debug: Log collections in template\n console.log('[SettingsPage Template] Collections received:', collections.length)\n if (collections.length > 0) {\n console.log('[SettingsPage Template] First collection:', collections[0])\n }\n\n const content = `\n
\n \n
\n
\n

🔍 AI Search Settings

\n

\n Configure advanced search with Cloudflare AI Search. Select collections to index and manage search preferences.\n

\n
\n \n
\n\n\n \n
\n
\n \n
\n

🔍 Search Settings

\n
\n
\n \n
\n \n

Turn on advanced search capabilities across your content

\n
\n
\n\n
\n \n
\n \n

\n Enable natural language queries (requires Cloudflare Workers AI binding)\n → Setup Guide\n

\n

\n ⚠️ If AI binding unavailable, will fallback to keyword search\n

\n
\n
\n
\n
\n\n
\n\n \n
\n
\n
\n

📚 Collections to Index

\n

\n Select which content collections should be indexed and searchable. Only checked collections will be included in search results.\n

\n
\n
\n
\n ${collections.length === 0\n ? '

No collections available. Create collections first.

'\n : collections.map((collection) => {\n const collectionId = String(collection.id)\n const isChecked = selectedCollectionIds.has(collectionId)\n const isDismissed = dismissedCollectionIds.has(collectionId)\n const indexStatusMap: Record = data.indexStatus || {}\n const status = indexStatusMap[collectionId]\n // Only show NEW badge if collection is new, not dismissed, and has never been indexed\n const isNew = collection.is_new === true && !isDismissed && !status\n // Only show status badge if collection is CHECKED and has status\n const statusBadge = (status && isChecked)\n ? `${status.status}`\n : ''\n\n return `
\n \n
\n \n

\n ${collection.description || collection.name || 'No description'} • ${collection.item_count || 0} items\n ${status ? ` • ${status.indexed_items}/${status.total_items} indexed` : ''}\n

\n ${status && status.status === 'indexing'\n ? `
\n
\n
`\n : ''}\n
\n ${isChecked ? `\n \n \n \n \n Re-index\n \n ` : ''}\n
`\n }).join('')}\n
\n
\n\n
\n\n \n
\n

⚙️ Advanced Options

\n
\n
\n \n
\n \n

Show search suggestions as users type

\n
\n
\n\n
\n \n
\n \n

Include media files in search results

\n
\n
\n\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

\n 💡 Collections marked as NEW haven't been indexed yet\n

\n \n
\n
\n
\n\n\n \n
\n

📊 Search Analytics

\n
\n
\n
Total Queries
\n
${data.analytics.total_queries}
\n
\n
\n
AI Queries
\n
${data.analytics.ai_queries}
\n
\n
\n
Keyword Queries
\n
${data.analytics.keyword_queries}
\n
\n
\n ${data.analytics.popular_queries.length > 0\n ? `\n
\n

Popular Searches

\n
\n ${data.analytics.popular_queries.map(\n (item) => `\n
\n \"${item.query}\"\n ${item.count} times\n
\n `\n ).join('')}\n
\n
\n `\n : '

No search history yet.

'}\n
\n\n \n
\n
\n \n Settings Saved Successfully!\n
\n
\n
\n \n `\n\n return renderAdminLayout({\n title: 'AI Search Settings',\n pageTitle: 'AI Search Settings',\n currentPath: '/admin/plugins/ai-search/settings',\n user: data.user,\n content: content\n })\n}\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { requireAuth } from '../../../../middleware'\nimport { AISearchService } from '../services/ai-search'\nimport { IndexManager } from '../services/indexer'\nimport { renderSettingsPage } from '../components/settings-page'\nimport type { AISearchSettings, SearchQuery } from '../types'\n\ntype Variables = {\n user: {\n id: number\n email: string\n role: string\n }\n}\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminRoutes.use('*', requireAuth())\n\n/**\n * GET /admin/plugins/ai-search\n * Render settings page\n */\nadminRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const ai = (c.env as any).AI // Workers AI for embeddings\n const vectorize = (c.env as any).VECTORIZE_INDEX // Vectorize for vector search\n\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n // Get settings\n const settings = await service.getSettings()\n console.log('[AI Search Settings Route] Settings loaded:', !!settings)\n\n // Get all collections with status\n const collections = await service.getAllCollections()\n console.log('[AI Search Settings Route] Collections returned:', collections.length)\n \n // If no collections, try direct query\n if (collections.length === 0) {\n const directQuery = await db.prepare('SELECT id, name, display_name FROM collections WHERE is_active = 1').all()\n console.log('[AI Search Settings Route] Direct DB query found:', directQuery.results?.length || 0, 'collections')\n if (directQuery.results && directQuery.results.length > 0) {\n console.log('[AI Search Settings Route] Sample from DB:', directQuery.results[0])\n }\n } else if (collections.length > 0 && collections[0]) {\n console.log('[AI Search Settings Route] First collection:', {\n id: collections[0].id,\n name: collections[0].name,\n display_name: collections[0].display_name\n })\n }\n\n // Get new collections notifications\n const newCollections = await service.detectNewCollections()\n console.log('AI Search: New collections:', newCollections.length)\n\n // Get index status for all collections\n const indexStatus = await indexer.getAllIndexStatus()\n console.log('AI Search: Index status:', Object.keys(indexStatus).length)\n\n // Get analytics\n const analytics = await service.getSearchAnalytics()\n\n return c.html(\n renderSettingsPage({\n settings,\n collections: collections || [],\n newCollections: newCollections || [],\n indexStatus: indexStatus || {},\n analytics,\n user: {\n name: user.email,\n email: user.email,\n role: user.role,\n },\n })\n )\n } catch (error) {\n console.error('Error rendering AI Search settings:', error)\n return c.html(`

Error loading settings: ${error instanceof Error ? error.message : String(error)}

`, 500)\n }\n})\n\n/**\n * POST /admin/plugins/ai-search\n * Update settings\n */\nadminRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n console.log('[AI Search POST] Received body:', JSON.stringify(body, null, 2))\n\n // Get current settings\n const currentSettings = await service.getSettings()\n console.log('[AI Search POST] Current settings selected_collections:', currentSettings?.selected_collections)\n\n // Update settings\n const updatedSettings: Partial = {\n enabled: body.enabled !== undefined ? Boolean(body.enabled) : currentSettings?.enabled,\n ai_mode_enabled: body.ai_mode_enabled !== undefined ? Boolean(body.ai_mode_enabled) : currentSettings?.ai_mode_enabled,\n selected_collections: Array.isArray(body.selected_collections) ? body.selected_collections.map(String) : (currentSettings?.selected_collections || []),\n dismissed_collections: Array.isArray(body.dismissed_collections) ? body.dismissed_collections.map(String) : (currentSettings?.dismissed_collections || []),\n autocomplete_enabled: body.autocomplete_enabled !== undefined ? Boolean(body.autocomplete_enabled) : currentSettings?.autocomplete_enabled,\n cache_duration: body.cache_duration ? Number(body.cache_duration) : currentSettings?.cache_duration,\n results_limit: body.results_limit ? Number(body.results_limit) : currentSettings?.results_limit,\n index_media: body.index_media !== undefined ? Boolean(body.index_media) : currentSettings?.index_media,\n }\n\n console.log('[AI Search POST] Updated settings selected_collections:', updatedSettings.selected_collections)\n\n // If collections changed, trigger indexing\n const collectionsChanged =\n JSON.stringify(updatedSettings.selected_collections) !==\n JSON.stringify(currentSettings?.selected_collections || [])\n\n const saved = await service.updateSettings(updatedSettings)\n console.log('[AI Search POST] Settings saved, selected_collections:', saved.selected_collections)\n\n // Start indexing if collections were added\n if (collectionsChanged && updatedSettings.selected_collections) {\n console.log('[AI Search POST] Collections changed, starting background indexing')\n // Start indexing in background (non-blocking) - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .syncAll(updatedSettings.selected_collections)\n .then(() => console.log('[AI Search POST] Background indexing completed'))\n .catch((error) => console.error('[AI Search POST] Background indexing error:', error))\n )\n }\n\n return c.json({ success: true, settings: saved })\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n return c.json({ error: 'Failed to update settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/settings\n * Get settings API endpoint\n */\nadminRoutes.get('/api/settings', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const settings = await service.getSettings()\n return c.json({ success: true, data: settings })\n } catch (error) {\n console.error('Error fetching settings:', error)\n return c.json({ error: 'Failed to fetch settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/new-collections\n * Get new collections that aren't indexed or dismissed\n */\nadminRoutes.get('/api/new-collections', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const notifications = await service.detectNewCollections()\n return c.json({ success: true, data: notifications })\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return c.json({ error: 'Failed to detect new collections' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/status\n * Get indexing status\n */\nadminRoutes.get('/api/status', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const status = await indexer.getAllIndexStatus()\n return c.json({ success: true, data: status })\n } catch (error) {\n console.error('Error fetching index status:', error)\n return c.json({ error: 'Failed to fetch status' }, 500)\n }\n})\n\n/**\n * POST /admin/api/ai-search/reindex\n * Trigger re-indexing for a collection\n */\nadminRoutes.post('/api/reindex', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n const collectionIdRaw: unknown = body.collection_id\n const collectionId = collectionIdRaw ? String(collectionIdRaw) : ''\n\n if (!collectionId || collectionId === 'undefined' || collectionId === 'null') {\n return c.json({ error: 'collection_id is required' }, 400)\n }\n\n // Start indexing in background - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .indexCollection(collectionId)\n .then(() => console.log(`[AI Search Reindex] Completed for collection ${collectionId}`))\n .catch((error) => console.error(`[AI Search Reindex] Error for collection ${collectionId}:`, error))\n )\n\n return c.json({ success: true, message: 'Re-indexing started' })\n } catch (error) {\n console.error('Error starting re-index:', error)\n return c.json({ error: 'Failed to start re-indexing' }, 500)\n }\n})\n\nexport default adminRoutes\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { AISearchService } from '../services/ai-search'\nimport type { SearchQuery } from '../types'\n\ntype Variables = {\n user?: {\n id: number\n email: string\n role: string\n }\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * POST /api/search\n * Execute search query\n */\napiRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const body = await c.req.json()\n\n const query: SearchQuery = {\n query: body.query || '',\n mode: body.mode || 'keyword',\n filters: body.filters || {},\n limit: body.limit ? Number(body.limit) : undefined,\n offset: body.offset ? Number(body.offset) : undefined,\n }\n\n // Convert date strings to Date objects if present\n if (query.filters?.dateRange) {\n if (typeof query.filters.dateRange.start === 'string') {\n query.filters.dateRange.start = new Date(query.filters.dateRange.start)\n }\n if (typeof query.filters.dateRange.end === 'string') {\n query.filters.dateRange.end = new Date(query.filters.dateRange.end)\n }\n }\n\n const results = await service.search(query)\n\n return c.json({\n success: true,\n data: results,\n })\n } catch (error) {\n console.error('Search error:', error)\n return c.json(\n {\n success: false,\n error: 'Search failed',\n message: error instanceof Error ? error.message : String(error),\n },\n 500\n )\n }\n})\n\n/**\n * GET /api/search/suggest\n * Get search suggestions (autocomplete)\n */\napiRoutes.get('/suggest', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const query = c.req.query('q') || ''\n\n if (!query || query.length < 2) {\n return c.json({ success: true, data: [] })\n }\n\n const suggestions = await service.getSearchSuggestions(query)\n\n return c.json({\n success: true,\n data: suggestions,\n })\n } catch (error) {\n console.error('Suggestions error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get suggestions',\n },\n 500\n )\n }\n})\n\n/**\n * GET /admin/api/search/analytics\n * Get search analytics\n */\napiRoutes.get('/analytics', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const analytics = await service.getSearchAnalytics()\n\n return c.json({\n success: true,\n data: analytics,\n })\n } catch (error) {\n console.error('Analytics error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get analytics',\n },\n 500\n )\n }\n})\n\nexport default apiRoutes\n","{\n \"id\": \"ai-search\",\n \"name\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"icon\": \"magnifying-glass\",\n \"homepage\": \"https://developers.cloudflare.com/ai-search/\",\n \"repository\": \"https://github.com/sonicjs/sonicjs\",\n \"license\": \"MIT\",\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"configSchema\": {\n \"enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI Search\",\n \"description\": \"Enable or disable AI Search functionality\",\n \"default\": true\n },\n \"ai_mode_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI/Semantic Search\",\n \"description\": \"Enable AI-powered semantic search (requires Cloudflare Workers AI binding)\",\n \"default\": false\n },\n \"ai_provider\": {\n \"type\": \"string\",\n \"label\": \"AI Provider\",\n \"description\": \"Which AI service to use for semantic search\",\n \"default\": \"cloudflare\",\n \"enum\": [\n \"cloudflare\",\n \"keyword-only\"\n ]\n },\n \"autocomplete_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable Autocomplete\",\n \"description\": \"Show search suggestions as user types\",\n \"default\": true\n },\n \"cache_duration\": {\n \"type\": \"number\",\n \"label\": \"Cache Duration (hours)\",\n \"description\": \"How long to cache search results\",\n \"default\": 1,\n \"min\": 0,\n \"max\": 24\n },\n \"results_limit\": {\n \"type\": \"number\",\n \"label\": \"Results Per Page\",\n \"description\": \"Maximum number of results to show per page\",\n \"default\": 20,\n \"min\": 10,\n \"max\": 100\n },\n \"index_media\": {\n \"type\": \"boolean\",\n \"label\": \"Index Media Metadata\",\n \"description\": \"Include R2 media files in search index\",\n \"default\": false\n }\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"href\": \"/admin/plugins/ai-search\",\n \"parentId\": \"plugins\",\n \"order\": 50\n },\n \"codeName\": \"ai-search-plugin\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { AISearchService } from './services/ai-search'\nimport { IndexManager } from './services/indexer'\nimport adminRoutes from './routes/admin'\nimport apiRoutes from './routes/api'\nimport manifest from './manifest.json'\n\n/**\n * AI Search Plugin\n * \n * Provides advanced search capabilities using Cloudflare AI Search.\n * Features:\n * - Semantic/AI-powered search with natural language queries\n * - Traditional keyword search\n * - Full-text search across all content collections\n * - Advanced filtering (collections, dates, status, tags)\n * - Autocomplete suggestions\n * - Search analytics\n * - Dynamic collection discovery and indexing\n * \n * @example\n * ```typescript\n * import { AISearchService } from '@sonicjs-cms/core/plugins'\n * \n * const service = new AISearchService(db, aiSearch)\n * const results = await service.search({\n * query: 'blog posts about security',\n * mode: 'ai',\n * filters: { collections: [1, 2] }\n * })\n * ```\n */\n\nexport const aiSearchPlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('aiSearch', AISearchService)\n .addService('indexManager', IndexManager)\n .addRoute('/admin/plugins/ai-search', adminRoutes as any)\n .addRoute('/api/search', apiRoutes as any)\n .build()\n\n// Export services and types for easy import\nexport { AISearchService } from './services/ai-search'\nexport { IndexManager } from './services/indexer'\nexport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n IndexStatus,\n} from './types'\n","/**\n * Magic Link Authentication Plugin\n *\n * Provides passwordless authentication via email magic links\n * Users receive a secure one-time link to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\nimport type { Plugin, PluginContext } from '../../types'\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { AuthManager, getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst magicLinkRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nexport function createMagicLinkAuthPlugin(): Plugin {\n const magicLinkRoutes = new Hono()\n\n // Request a magic link\n magicLinkRoutes.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = magicLinkRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB as D1Database\n\n // Check rate limiting\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n const recentLinks = await db.prepare(`\n SELECT COUNT(*) as count\n FROM magic_links\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as any\n\n const rateLimitPerHour = 5 // TODO: Get from plugin settings\n if (recentLinks && recentLinks.count >= rateLimitPerHour) {\n return c.json({\n error: 'Too many requests. Please try again later.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && !allowNewUsers) {\n // Don't reveal if user exists or not for security\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.'\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Generate secure token\n const token = crypto.randomUUID() + '-' + crypto.randomUUID()\n const tokenId = crypto.randomUUID()\n const linkExpiryMinutes = 15 // TODO: Get from plugin settings\n const expiresAt = Date.now() + (linkExpiryMinutes * 60 * 1000)\n\n // Store magic link\n await db.prepare(`\n INSERT INTO magic_links (\n id, user_email, token, expires_at, used, created_at, ip_address, user_agent\n ) VALUES (?, ?, ?, ?, 0, ?, ?, ?)\n `).bind(\n tokenId,\n normalizedEmail,\n token,\n expiresAt,\n Date.now(),\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown',\n c.req.header('user-agent') || 'unknown'\n ).run()\n\n // Generate magic link URL\n const baseUrl = new URL(c.req.url).origin\n const magicLink = `${baseUrl}/auth/magic-link/verify?token=${token}`\n\n // Send email via email plugin\n try {\n const emailPlugin = c.env.plugins?.get('email')\n if (emailPlugin && emailPlugin.sendEmail) {\n await emailPlugin.sendEmail({\n to: normalizedEmail,\n subject: 'Your Magic Link to Sign In',\n html: renderMagicLinkEmail(magicLink, linkExpiryMinutes)\n })\n } else {\n console.error('Email plugin not available')\n // In production, this should fail. For now, log the link for testing\n console.log(`Magic link for ${normalizedEmail}: ${magicLink}`)\n }\n } catch (error) {\n console.error('Failed to send magic link email:', error)\n return c.json({\n error: 'Failed to send email. Please try again later.'\n }, 500)\n }\n\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.',\n // For development only - remove in production\n ...(c.env.ENVIRONMENT === 'development' && { dev_link: magicLink })\n })\n } catch (error) {\n console.error('Magic link request error:', error)\n return c.json({ error: 'Failed to process request' }, 500)\n }\n })\n\n // Verify magic link and sign in\n magicLinkRoutes.get('/verify', async (c: any) => {\n try {\n const token = c.req.query('token')\n\n if (!token) {\n return c.redirect('/auth/login?error=Invalid magic link')\n }\n\n const db = c.env.DB as D1Database\n\n // Find magic link\n const magicLink = await db.prepare(`\n SELECT * FROM magic_links\n WHERE token = ? AND used = 0\n `).bind(token).first() as any\n\n if (!magicLink) {\n return c.redirect('/auth/login?error=Invalid or expired magic link')\n }\n\n // Check expiration\n if (magicLink.expires_at < Date.now()) {\n return c.redirect('/auth/login?error=This magic link has expired')\n }\n\n // Get or create user\n let user = await db.prepare(`\n SELECT * FROM users WHERE email = ? AND is_active = 1\n `).bind(magicLink.user_email).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && allowNewUsers) {\n // Create new user\n const userId = crypto.randomUUID()\n const username = magicLink.user_email.split('@')[0]\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 1, ?, ?)\n `).bind(\n userId,\n magicLink.user_email,\n username,\n username,\n '',\n now,\n now\n ).run()\n\n user = {\n id: userId,\n email: magicLink.user_email,\n username,\n role: 'viewer'\n }\n } else if (!user) {\n return c.redirect('/auth/login?error=No account found for this email')\n }\n\n // Mark magic link as used\n await db.prepare(`\n UPDATE magic_links\n SET used = 1, used_at = ?\n WHERE id = ?\n `).bind(Date.now(), magicLink.id).run()\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwtToken = await AuthManager.generateToken(\n user.id,\n user.email,\n user.role,\n (c.env as any).JWT_SECRET,\n tokenTtl\n )\n\n // Set auth cookie\n AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl })\n\n // Update last login\n await db.prepare(`\n UPDATE users SET last_login_at = ? WHERE id = ?\n `).bind(Date.now(), user.id).run()\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?message=Successfully signed in')\n } catch (error) {\n console.error('Magic link verification error:', error)\n return c.redirect('/auth/login?error=Authentication failed')\n }\n })\n\n return {\n name: 'magic-link-auth',\n version: '1.0.0',\n description: 'Passwordless authentication via email magic links',\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n dependencies: ['email'],\n\n routes: [{\n path: '/auth/magic-link',\n handler: magicLinkRoutes,\n description: 'Magic link authentication endpoints',\n requiresAuth: false\n }],\n\n async install(context: PluginContext) {\n console.log('Installing magic-link-auth plugin...')\n // Migration is handled by plugin system\n },\n\n async activate(context: PluginContext) {\n console.log('Magic link authentication activated')\n console.log('Users can now sign in via /auth/magic-link/request')\n },\n\n async deactivate(context: PluginContext) {\n console.log('Magic link authentication deactivated')\n },\n\n async uninstall(context: PluginContext) {\n console.log('Uninstalling magic-link-auth plugin...')\n // Optionally clean up magic_links table\n // await context.db.prepare('DROP TABLE IF EXISTS magic_links').run()\n }\n }\n}\n\n/**\n * Render magic link email template\n */\nfunction renderMagicLinkEmail(magicLink: string, expiryMinutes: number): string {\n return `\n \n \n \n \n \n Your Magic Link\n \n \n \n
\n
\n

🔗 Your Magic Link

\n
\n\n
\n

Hello!

\n

You requested a magic link to sign in to your account. Click the button below to continue:

\n\n
\n Sign In\n
\n\n

⏰ This link expires in ${expiryMinutes} minutes

\n\n
\n Security Notice: If you didn't request this link, you can safely ignore this email.\n Someone may have entered your email address by mistake.\n
\n
\n\n
\n

This is an automated email from SonicJS.

\n

For security, this link can only be used once.

\n
\n
\n \n \n `\n}\n\nexport default createMagicLinkAuthPlugin()\n","export type SecurityEventType =\n | 'login_success'\n | 'login_failure'\n | 'registration'\n | 'password_reset_request'\n | 'password_reset_complete'\n | 'account_lockout'\n | 'suspicious_activity'\n | 'logout'\n | 'permission_denied'\n\nexport type SecuritySeverity = 'info' | 'warning' | 'critical'\n\nexport interface SecurityEvent {\n id: string\n eventType: SecurityEventType\n severity: SecuritySeverity\n userId?: string | null\n email?: string | null\n ipAddress?: string | null\n userAgent?: string | null\n countryCode?: string | null\n requestPath?: string | null\n requestMethod?: string | null\n details?: Record | null\n fingerprint?: string | null\n blocked: boolean\n createdAt: number\n}\n\nexport interface SecurityEventInsert {\n eventType: SecurityEventType\n severity?: SecuritySeverity\n userId?: string\n email?: string\n ipAddress?: string\n userAgent?: string\n countryCode?: string\n requestPath?: string\n requestMethod?: string\n details?: Record\n fingerprint?: string\n blocked?: boolean\n}\n\nexport interface SecurityEventFilters {\n eventType?: SecurityEventType | SecurityEventType[]\n severity?: SecuritySeverity | SecuritySeverity[]\n email?: string\n ipAddress?: string\n search?: string\n startDate?: number\n endDate?: number\n blocked?: boolean\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'event_type' | 'severity'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SecurityStats {\n totalEvents: number\n failedLogins24h: number\n failedLoginsTrend: number // percentage change vs prior 24h\n activeLockouts: number\n flaggedIPs: number\n eventsByType: Record\n eventsBySeverity: Record\n}\n\nexport interface TopIP {\n ipAddress: string\n countryCode: string | null\n failedAttempts: number\n lastSeen: number\n locked: boolean\n}\n\nexport interface HourlyBucket {\n hour: string\n count: number\n}\n\nexport interface SecurityAuditSettings {\n retention: {\n daysToKeep: number\n maxEvents: number\n autoPurge: boolean\n }\n bruteForce: {\n enabled: boolean\n maxFailedAttemptsPerIP: number\n maxFailedAttemptsPerEmail: number\n windowMinutes: number\n lockoutDurationMinutes: number\n alertThreshold: number\n }\n logging: {\n logSuccessfulLogins: boolean\n logLogouts: boolean\n logRegistrations: boolean\n logPasswordResets: boolean\n logPermissionDenied: boolean\n }\n}\n\nexport const DEFAULT_SETTINGS: SecurityAuditSettings = {\n retention: {\n daysToKeep: 90,\n maxEvents: 100000,\n autoPurge: true\n },\n bruteForce: {\n enabled: true,\n maxFailedAttemptsPerIP: 10,\n maxFailedAttemptsPerEmail: 5,\n windowMinutes: 15,\n lockoutDurationMinutes: 30,\n alertThreshold: 20\n },\n logging: {\n logSuccessfulLogins: true,\n logLogouts: true,\n logRegistrations: true,\n logPasswordResets: true,\n logPermissionDenied: true\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n SecurityEvent,\n SecurityEventInsert,\n SecurityEventFilters,\n SecurityStats,\n TopIP,\n HourlyBucket,\n SecurityAuditSettings\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nexport class SecurityAuditService {\n constructor(\n private db: D1Database,\n private settings: SecurityAuditSettings = DEFAULT_SETTINGS\n ) {}\n\n async logEvent(event: SecurityEventInsert): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO security_events (id, event_type, severity, user_id, email, ip_address, user_agent, country_code, request_path, request_method, details, fingerprint, blocked, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n event.eventType,\n event.severity || 'info',\n event.userId || null,\n event.email || null,\n event.ipAddress || null,\n event.userAgent || null,\n event.countryCode || null,\n event.requestPath || null,\n event.requestMethod || null,\n event.details ? JSON.stringify(event.details) : null,\n event.fingerprint || null,\n event.blocked ? 1 : 0,\n now\n ).run()\n\n return id\n }\n\n async getEvents(filters: SecurityEventFilters = {}): Promise<{ events: SecurityEvent[], total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.eventType) {\n if (Array.isArray(filters.eventType)) {\n conditions.push(`event_type IN (${filters.eventType.map(() => '?').join(',')})`)\n params.push(...filters.eventType)\n } else {\n conditions.push('event_type = ?')\n params.push(filters.eventType)\n }\n }\n\n if (filters.severity) {\n if (Array.isArray(filters.severity)) {\n conditions.push(`severity IN (${filters.severity.map(() => '?').join(',')})`)\n params.push(...filters.severity)\n } else {\n conditions.push('severity = ?')\n params.push(filters.severity)\n }\n }\n\n if (filters.email) {\n conditions.push('email LIKE ?')\n params.push(`%${filters.email}%`)\n }\n\n if (filters.ipAddress) {\n conditions.push('ip_address LIKE ?')\n params.push(`%${filters.ipAddress}%`)\n }\n\n if (filters.search) {\n conditions.push('(email LIKE ? OR ip_address LIKE ? OR details LIKE ?)')\n params.push(`%${filters.search}%`, `%${filters.search}%`, `%${filters.search}%`)\n }\n\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n if (filters.blocked !== undefined) {\n conditions.push('blocked = ?')\n params.push(filters.blocked ? 1 : 0)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const page = filters.page || 1\n const limit = filters.limit || 50\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM security_events ${where}`\n ).bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get page of results\n const results = await this.db.prepare(\n `SELECT * FROM security_events ${where} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...params, limit, offset).all()\n\n const events: SecurityEvent[] = (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n\n return { events, total }\n }\n\n async getEvent(id: string): Promise {\n const row = await this.db.prepare(\n 'SELECT * FROM security_events WHERE id = ?'\n ).bind(id).first()\n\n if (!row) return null\n\n return {\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }\n }\n\n async getStats(): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n const h48 = now - 48 * 60 * 60 * 1000\n\n // Total events\n const totalResult = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM security_events'\n ).first<{ count: number }>()\n\n // Failed logins last 24h\n const failed24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ?\"\n ).bind(h24).first<{ count: number }>()\n\n // Failed logins prior 24h (for trend)\n const failedPrior24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ? AND created_at < ?\"\n ).bind(h48, h24).first<{ count: number }>()\n\n const failed24h = failed24hResult?.count || 0\n const failedPrior24h = failedPrior24hResult?.count || 0\n const trend = failedPrior24h > 0\n ? Math.round(((failed24h - failedPrior24h) / failedPrior24h) * 100)\n : (failed24h > 0 ? 100 : 0)\n\n // Active lockouts (events in last lockout window)\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutsResult = await this.db.prepare(\n \"SELECT COUNT(DISTINCT ip_address) as count FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).first<{ count: number }>()\n\n // Flagged IPs (IPs with more than threshold failed attempts in window)\n const windowStart = now - (this.settings.bruteForce.windowMinutes * 60 * 1000)\n const flaggedResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM (\n SELECT ip_address FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address HAVING COUNT(*) >= ?\n )`\n ).bind(windowStart, this.settings.bruteForce.maxFailedAttemptsPerIP).first<{ count: number }>()\n\n // Events by type\n const typeResults = await this.db.prepare(\n 'SELECT event_type, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY event_type'\n ).bind(h24).all()\n\n const eventsByType: Record = {}\n for (const row of (typeResults.results || []) as any[]) {\n eventsByType[row.event_type] = row.count\n }\n\n // Events by severity\n const severityResults = await this.db.prepare(\n 'SELECT severity, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY severity'\n ).bind(h24).all()\n\n const eventsBySeverity: Record = {}\n for (const row of (severityResults.results || []) as any[]) {\n eventsBySeverity[row.severity] = row.count\n }\n\n return {\n totalEvents: totalResult?.count || 0,\n failedLogins24h: failed24h,\n failedLoginsTrend: trend,\n activeLockouts: lockoutsResult?.count || 0,\n flaggedIPs: flaggedResult?.count || 0,\n eventsByType,\n eventsBySeverity\n }\n }\n\n async getTopIPs(limit: number = 10): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n\n const results = await this.db.prepare(`\n SELECT\n ip_address,\n country_code,\n COUNT(*) as failed_attempts,\n MAX(created_at) as last_seen\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address\n ORDER BY failed_attempts DESC\n LIMIT ?\n `).bind(h24, limit).all()\n\n // Check which IPs are locked\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutResults = await this.db.prepare(\n \"SELECT DISTINCT ip_address FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).all()\n\n const lockedIPs = new Set((lockoutResults.results || []).map((r: any) => r.ip_address))\n\n return (results.results || []).map((row: any) => ({\n ipAddress: row.ip_address,\n countryCode: row.country_code,\n failedAttempts: row.failed_attempts,\n lastSeen: row.last_seen,\n locked: lockedIPs.has(row.ip_address)\n }))\n }\n\n async getHourlyTrend(hours: number = 24): Promise {\n const now = Date.now()\n const start = now - hours * 60 * 60 * 1000\n\n // Build hourly buckets\n const buckets: HourlyBucket[] = []\n for (let i = 0; i < hours; i++) {\n const bucketStart = start + i * 60 * 60 * 1000\n const date = new Date(bucketStart)\n buckets.push({\n hour: `${date.getUTCHours().toString().padStart(2, '0')}:00`,\n count: 0\n })\n }\n\n const results = await this.db.prepare(`\n SELECT\n CAST((created_at - ?) / 3600000 AS INTEGER) as bucket,\n COUNT(*) as count\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY bucket\n ORDER BY bucket\n `).bind(start, start).all()\n\n for (const row of (results.results || []) as any[]) {\n const idx = row.bucket\n if (idx >= 0 && idx < buckets.length) {\n buckets[idx]!.count = row.count\n }\n }\n\n return buckets\n }\n\n async purgeOldEvents(daysToKeep?: number): Promise {\n const days = daysToKeep || this.settings.retention.daysToKeep\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000\n\n const result = await this.db.prepare(\n 'DELETE FROM security_events WHERE created_at < ?'\n ).bind(cutoff).run()\n\n return (result.meta as any)?.changes || 0\n }\n\n async getRecentCriticalEvents(limit: number = 20): Promise {\n const results = await this.db.prepare(\n \"SELECT * FROM security_events WHERE severity = 'critical' ORDER BY created_at DESC LIMIT ?\"\n ).bind(limit).all()\n\n return (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n }\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityStats, TopIP, HourlyBucket, SecurityEvent } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecurityDashboardData {\n stats: SecurityStats\n topIPs: TopIP[]\n hourlyTrend: HourlyBucket[]\n recentCritical: SecurityEvent[]\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n const now = Date.now()\n const diff = now - ts\n\n if (diff < 60000) return 'just now'\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n return labels[type] || type\n}\n\nfunction trendArrow(trend: number): string {\n if (trend > 0) return `+${trend}%`\n if (trend < 0) return `${trend}%`\n return `0%`\n}\n\nfunction renderBarChart(data: HourlyBucket[]): string {\n if (data.length === 0) return '

No data available

'\n\n const max = Math.max(...data.map(d => d.count), 1)\n\n const bars = data.map(d => {\n const height = Math.max((d.count / max) * 100, 2)\n const color = d.count === 0\n ? 'bg-zinc-200 dark:bg-zinc-700'\n : d.count >= max * 0.75\n ? 'bg-red-500'\n : d.count >= max * 0.5\n ? 'bg-amber-500'\n : 'bg-cyan-500'\n return `\n
\n
\n \n
\n
\n 12 ? 'hidden sm:block' : ''}\">${d.hour}\n
\n `\n }).join('')\n\n return `
${bars}
`\n}\n\nexport function renderSecurityDashboard(data: SecurityDashboardData): string {\n const { stats, topIPs, hourlyTrend, recentCritical, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Dashboard

\n

\n Monitor login attempts, brute-force detection, and security events.\n

\n
\n \n
\n\n \n
\n
\n

Total Events

\n

${stats.totalEvents.toLocaleString()}

\n
\n
\n

Failed Logins (24h)

\n

\n ${stats.failedLogins24h}\n ${trendArrow(stats.failedLoginsTrend)}\n

\n
\n
\n

Active Lockouts

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${stats.activeLockouts}

\n
\n
\n

Flagged IPs

\n

0 ? 'text-amber-600 dark:text-amber-400' : 'text-zinc-950 dark:text-white'}\">${stats.flaggedIPs}

\n
\n
\n\n \n
\n \n
\n

Failed Login Attempts (24h)

\n ${renderBarChart(hourlyTrend)}\n
\n\n \n
\n

Events by Type (24h)

\n
\n ${Object.entries(stats.eventsByType).length === 0\n ? '

No events in the last 24 hours

'\n : Object.entries(stats.eventsByType)\n .sort(([, a], [, b]) => b - a)\n .map(([type, count]) => {\n const total = Object.values(stats.eventsByType).reduce((s, v) => s + v, 0)\n const pct = total > 0 ? Math.round((count / total) * 100) : 0\n return `\n
\n
\n ${eventTypeBadge(type)}\n ${count}\n
\n
\n
\n
\n
\n `\n }).join('')\n }\n
\n
\n
\n\n \n
\n \n
\n
\n

Top IPs by Failed Logins (24h)

\n
\n ${topIPs.length === 0\n ? '

No failed login attempts

'\n : `\n \n \n \n \n \n \n \n \n \n ${topIPs.map(ip => `\n \n \n \n \n \n \n `).join('')}\n \n
IP AddressCountryAttemptsStatus
${ip.ipAddress}${ip.countryCode || '-'}= 10 ? 'text-red-600 dark:text-red-400' : 'text-zinc-900 dark:text-zinc-100'}\">${ip.failedAttempts}\n ${ip.locked\n ? 'Locked'\n : 'Active'\n }\n
`\n }\n
\n\n \n
\n
\n

Recent Critical Events

\n
\n ${recentCritical.length === 0\n ? '

No critical events

'\n : `
\n ${recentCritical.slice(0, 10).map(event => `\n
\n
\n
\n ${severityBadge(event.severity)}\n ${eventTypeBadge(event.eventType)}\n
\n ${formatTimestamp(event.createdAt)}\n
\n
\n ${event.ipAddress ? `IP: ${event.ipAddress}` : ''}\n ${event.email ? ` | ${event.email}` : ''}\n
\n
\n `).join('')}\n
`\n }\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Dashboard',\n pageTitle: 'Security Dashboard',\n currentPath: '/admin/plugins/security-audit',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityEvent, SecurityEventFilters } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface EventLogPageData {\n events: SecurityEvent[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n }\n filters: SecurityEventFilters\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const colors: Record = {\n login_success: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400',\n login_failure: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n registration: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n account_lockout: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n suspicious_activity: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\n logout: 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400',\n password_reset_request: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n permission_denied: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400'\n }\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n const color = colors[type] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400'\n return `${labels[type] || type}`\n}\n\nfunction buildFilterUrl(filters: SecurityEventFilters, overrides: Record = {}): string {\n const params = new URLSearchParams()\n if (filters.eventType && !overrides.type) params.set('type', String(filters.eventType))\n if (filters.severity && !overrides.severity) params.set('severity', String(filters.severity))\n if (filters.email && !overrides.email) params.set('email', filters.email)\n if (filters.ipAddress && !overrides.ip) params.set('ip', filters.ipAddress)\n if (filters.search && !overrides.search) params.set('search', filters.search)\n\n for (const [key, value] of Object.entries(overrides)) {\n if (value) params.set(key, value)\n }\n\n const qs = params.toString()\n return `/admin/plugins/security-audit/events${qs ? '?' + qs : ''}`\n}\n\nexport function renderEventLogPage(data: EventLogPageData): string {\n const { events, pagination, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Event Log

\n

\n Browse and filter all security events. Showing ${pagination.startItem}-${pagination.endItem} of ${pagination.totalItems}.\n

\n
\n \n
\n\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n Clear\n \n
\n
\n
\n\n \n
\n ${events.length === 0\n ? `
\n \n \n \n

No events found

\n

No security events match your current filters.

\n
`\n : `
\n \n \n \n \n \n \n \n \n \n \n \n \n \n ${events.map(event => `\n \n \n \n \n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimeTypeSeverityEmailIP AddressCountryStatus
${formatTimestamp(event.createdAt)}${eventTypeBadge(event.eventType)}${severityBadge(event.severity)}${event.email || '-'}${event.ipAddress || '-'}${event.countryCode || '-'}\n ${event.blocked\n ? 'Blocked'\n : 'Allowed'\n }\n
\n
\n
Event ID: ${event.id.substring(0, 8)}...
\n
User Agent: ${event.userAgent || '-'}
\n
Path: ${event.requestPath || '-'}
\n
Fingerprint: ${event.fingerprint || '-'}
\n ${event.details ? `
Details:
${JSON.stringify(event.details, null, 2)}
` : ''}\n
\n
\n
`\n }\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n Page ${pagination.currentPage} of ${pagination.totalPages}\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : ''}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : ''}\n
\n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Event Log',\n pageTitle: 'Security Event Log',\n currentPath: '/admin/plugins/security-audit/events',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityAuditSettings } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecuritySettingsPageData {\n settings: SecurityAuditSettings\n user?: BaseUser\n version?: string\n message?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSecuritySettingsPage(data: SecuritySettingsPageData): string {\n const { settings, user, version, message, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Audit Settings

\n

\n Configure brute-force detection thresholds, event logging, and data retention.\n

\n
\n \n
\n\n ${message ? `\n
\n

${message}

\n
\n ` : ''}\n\n
\n\n \n
\n

Brute-Force Detection

\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n

Events above this count trigger critical severity

\n
\n
\n
\n\n \n
\n

Event Logging

\n
\n \n \n \n \n \n
\n
\n\n \n
\n

Data Retention

\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n\n \n
\n \n \n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Audit Settings',\n pageTitle: 'Security Audit Settings',\n currentPath: '/admin/plugins/security-audit/settings',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { PluginService } from '../../../../services'\nimport { renderSecurityDashboard, SecurityDashboardData } from '../components/dashboard-page'\nimport { renderEventLogPage, EventLogPageData } from '../components/event-log-page'\nimport { renderSecuritySettingsPage, SecuritySettingsPageData } from '../components/settings-page'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const [stats, topIPs, hourlyTrend, recentCritical] = await Promise.all([\n service.getStats(),\n service.getTopIPs(10),\n service.getHourlyTrend(24),\n service.getRecentCriticalEvents(20)\n ])\n\n const pageData: SecurityDashboardData = {\n stats,\n topIPs,\n hourlyTrend,\n recentCritical,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecurityDashboard(pageData))\n})\n\n// Event log\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n\n const filters = {\n eventType: (c.req.query('type') as SecurityEventType) || undefined,\n severity: (c.req.query('severity') as SecuritySeverity) || undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n page,\n limit\n }\n\n const { events, total } = await service.getEvents(filters)\n const totalPages = Math.ceil(total / limit)\n\n const pageData: EventLogPageData = {\n events,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: total === 0 ? 0 : (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total)\n },\n filters,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderEventLogPage(pageData))\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const pageData: SecuritySettingsPageData = {\n settings,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n message: c.req.query('message') || undefined,\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecuritySettingsPage(pageData))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const settings: SecurityAuditSettings = {\n bruteForce: {\n enabled: body['bruteForce.enabled'] === 'true',\n maxFailedAttemptsPerIP: parseInt(body['bruteForce.maxFailedAttemptsPerIP'] as string) || 10,\n maxFailedAttemptsPerEmail: parseInt(body['bruteForce.maxFailedAttemptsPerEmail'] as string) || 5,\n windowMinutes: parseInt(body['bruteForce.windowMinutes'] as string) || 15,\n lockoutDurationMinutes: parseInt(body['bruteForce.lockoutDurationMinutes'] as string) || 30,\n alertThreshold: parseInt(body['bruteForce.alertThreshold'] as string) || 20\n },\n logging: {\n logSuccessfulLogins: body['logging.logSuccessfulLogins'] === 'true',\n logLogouts: body['logging.logLogouts'] === 'true',\n logRegistrations: body['logging.logRegistrations'] === 'true',\n logPasswordResets: body['logging.logPasswordResets'] === 'true',\n logPermissionDenied: body['logging.logPermissionDenied'] === 'true'\n },\n retention: {\n daysToKeep: parseInt(body['retention.daysToKeep'] as string) || 90,\n maxEvents: parseInt(body['retention.maxEvents'] as string) || 100000,\n autoPurge: body['retention.autoPurge'] === 'true'\n }\n }\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings('security-audit', settings)\n\n // For HTMX requests, return 200\n if (c.req.header('HX-Request')) {\n return c.json({ success: true })\n }\n\n return c.redirect('/admin/plugins/security-audit/settings?message=Settings saved successfully')\n})\n\nexport { adminRoutes as securityAuditAdminRoutes }\n","import type { KVNamespace } from '@cloudflare/workers-types'\nimport type { SecurityAuditSettings } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst KV_PREFIX = 'security:bf:'\nconst LOCK_PREFIX = 'security:locked:'\n\nexport class BruteForceDetector {\n private settings: SecurityAuditSettings['bruteForce']\n\n constructor(\n private kv: KVNamespace,\n settings?: SecurityAuditSettings['bruteForce']\n ) {\n this.settings = settings || DEFAULT_SETTINGS.bruteForce\n }\n\n async recordFailedAttempt(ip: string, email: string): Promise<{\n ipCount: number\n emailCount: number\n shouldLockIP: boolean\n shouldLockEmail: boolean\n isSuspicious: boolean\n }> {\n if (!this.settings.enabled || !this.kv) {\n return { ipCount: 0, emailCount: 0, shouldLockIP: false, shouldLockEmail: false, isSuspicious: false }\n }\n\n const now = Date.now()\n const windowMs = this.settings.windowMinutes * 60 * 1000\n\n // Increment IP counter\n const ipKey = `${KV_PREFIX}ip:${ip}`\n const ipCount = await this.incrementCounter(ipKey, windowMs)\n\n // Increment email counter\n const emailKey = `${KV_PREFIX}email:${email}`\n const emailCount = await this.incrementCounter(emailKey, windowMs)\n\n // Check for multi-email from single IP (suspicious)\n const ipEmailsKey = `${KV_PREFIX}ip-emails:${ip}`\n await this.addToSet(ipEmailsKey, email, windowMs)\n const emailsFromIP = await this.getSetSize(ipEmailsKey)\n const isSuspicious = emailsFromIP >= 5\n\n const shouldLockIP = ipCount >= this.settings.maxFailedAttemptsPerIP\n const shouldLockEmail = emailCount >= this.settings.maxFailedAttemptsPerEmail\n\n return { ipCount, emailCount, shouldLockIP, shouldLockEmail, isSuspicious }\n }\n\n async isLocked(ip: string, email: string): Promise<{ locked: boolean, reason?: string }> {\n if (!this.settings.enabled || !this.kv) {\n return { locked: false }\n }\n\n const ipLocked = await this.kv.get(`${LOCK_PREFIX}ip:${ip}`)\n if (ipLocked) {\n return { locked: true, reason: 'IP address temporarily locked due to excessive failed login attempts' }\n }\n\n const emailLocked = await this.kv.get(`${LOCK_PREFIX}email:${email}`)\n if (emailLocked) {\n return { locked: true, reason: 'Account temporarily locked due to excessive failed login attempts' }\n }\n\n return { locked: false }\n }\n\n async lockIP(ip: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}ip:${ip}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_ip'\n }), { expirationTtl: ttl })\n }\n\n async lockEmail(email: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}email:${email}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_email'\n }), { expirationTtl: ttl })\n }\n\n async unlockIP(ip: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}ip:${ip}`)\n }\n\n async unlockEmail(email: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}email:${email}`)\n }\n\n async getActiveLockouts(): Promise> {\n if (!this.kv) return []\n // KV list with prefix to find all active lockouts\n const ipLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}ip:` })\n const emailLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}email:` })\n\n const lockouts: Array<{ key: string, type: 'ip' | 'email', value: string, lockedAt: number }> = []\n\n for (const key of ipLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'ip',\n value: key.name.replace(`${LOCK_PREFIX}ip:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n for (const key of emailLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'email',\n value: key.name.replace(`${LOCK_PREFIX}email:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n return lockouts\n }\n\n async releaseLockout(key: string): Promise {\n if (!this.kv) return\n await this.kv.delete(key)\n }\n\n isAboveAlertThreshold(count: number): boolean {\n return count >= this.settings.alertThreshold\n }\n\n private async incrementCounter(key: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n const now = Date.now()\n\n let entries: number[] = []\n if (existing) {\n try {\n entries = JSON.parse(existing)\n } catch {\n entries = []\n }\n }\n\n // Remove expired entries\n const cutoff = now - windowMs\n entries = entries.filter(ts => ts > cutoff)\n\n // Add new entry\n entries.push(now)\n\n // Store with TTL equal to window\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(entries), { expirationTtl: ttlSeconds })\n\n return entries.length\n }\n\n private async addToSet(key: string, value: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n let set: Record = {}\n const now = Date.now()\n const cutoff = now - windowMs\n\n if (existing) {\n try {\n set = JSON.parse(existing)\n } catch {\n set = {}\n }\n }\n\n // Remove expired entries\n for (const [k, ts] of Object.entries(set)) {\n if (ts < cutoff) delete set[k]\n }\n\n set[value] = now\n\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(set), { expirationTtl: ttlSeconds })\n }\n\n private async getSetSize(key: string): Promise {\n const existing = await this.kv.get(key)\n if (!existing) return 0\n\n try {\n const set = JSON.parse(existing)\n return Object.keys(set).length\n } catch {\n return 0\n }\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventFilters, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\napiRoutes.use('*', requireAuth())\n\n// Check admin role\napiRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// GET /api/security-audit/events\napiRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? Math.min(parseInt(c.req.query('limit')!), 100) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await service.getEvents(filters)\n return c.json(result)\n})\n\n// GET /api/security-audit/events/:id\napiRoutes.get('/events/:id', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const event = await service.getEvent(c.req.param('id'))\n\n if (!event) {\n return c.json({ error: 'Event not found' }, 404)\n }\n\n return c.json(event)\n})\n\n// GET /api/security-audit/stats\napiRoutes.get('/stats', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const stats = await service.getStats()\n return c.json(stats)\n})\n\n// GET /api/security-audit/stats/ips\napiRoutes.get('/stats/ips', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const limit = c.req.query('limit') ? parseInt(c.req.query('limit')!) : 10\n const ips = await service.getTopIPs(limit)\n return c.json(ips)\n})\n\n// GET /api/security-audit/stats/trend\napiRoutes.get('/stats/trend', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const hours = c.req.query('hours') ? parseInt(c.req.query('hours')!) : 24\n const trend = await service.getHourlyTrend(hours)\n return c.json(trend)\n})\n\n// GET /api/security-audit/lockouts\napiRoutes.get('/lockouts', async (c) => {\n const kv = c.env.CACHE_KV\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n const lockouts = await detector.getActiveLockouts()\n return c.json(lockouts)\n})\n\n// DELETE /api/security-audit/lockouts/:key\napiRoutes.delete('/lockouts/:key', async (c) => {\n const kv = c.env.CACHE_KV\n const key = decodeURIComponent(c.req.param('key'))\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n await detector.releaseLockout(key)\n return c.json({ success: true })\n})\n\n// POST /api/security-audit/events/purge\napiRoutes.post('/events/purge', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const body = await c.req.json().catch(() => ({})) as { daysToKeep?: number }\n const deleted = await service.purgeOldEvents(body.daysToKeep)\n return c.json({ success: true, deleted })\n})\n\n// GET /api/security-audit/export\napiRoutes.get('/export', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const format = c.req.query('format') || 'json'\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n limit: 10000,\n page: 1\n }\n\n const { events } = await service.getEvents(filters)\n\n if (format === 'csv') {\n const headers = ['id', 'event_type', 'severity', 'email', 'ip_address', 'country_code', 'blocked', 'created_at']\n const csvRows = [headers.join(',')]\n for (const event of events) {\n csvRows.push([\n event.id,\n event.eventType,\n event.severity,\n event.email || '',\n event.ipAddress || '',\n event.countryCode || '',\n event.blocked ? '1' : '0',\n new Date(event.createdAt).toISOString()\n ].map(v => `\"${String(v).replace(/\"/g, '\"\"')}\"`).join(','))\n }\n\n return new Response(csvRows.join('\\n'), {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"security-events-${Date.now()}.csv\"`\n }\n })\n }\n\n return c.json(events)\n})\n\nexport { apiRoutes as securityAuditApiRoutes }\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../../../../app'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { SecurityAuditSettings, SecurityEventType } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nfunction extractRequestInfo(c: Context<{ Bindings: Bindings; Variables: Variables }>) {\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n const countryCode = c.req.header('cf-ipcountry') || null\n const path = new URL(c.req.url).pathname\n const method = c.req.method\n\n return { ip, userAgent, countryCode, path, method }\n}\n\nfunction generateFingerprint(ip: string, userAgent: string): string {\n // Simple fingerprint from IP + UA - using a basic hash\n const str = `${ip}:${userAgent}`\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash |= 0\n }\n return Math.abs(hash).toString(36)\n}\n\nasync function getPluginSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch {\n // Plugin not installed or DB not ready\n }\n return DEFAULT_SETTINGS\n}\n\nasync function isPluginActive(db: any): Promise {\n try {\n const result = await db.prepare(\n \"SELECT status FROM plugins WHERE id = 'security-audit'\"\n ).first() as { status: string } | null\n return result?.status === 'active'\n } catch {\n return false\n }\n}\n\nexport function securityAuditMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n\n // Only intercept auth-related routes\n if (!path.startsWith('/auth/')) {\n return next()\n }\n\n const db = c.env.DB\n\n // Check if plugin is active\n if (!await isPluginActive(db)) {\n return next()\n }\n\n const settings = await getPluginSettings(db)\n const { ip, userAgent, countryCode, method } = extractRequestInfo(c)\n const fingerprint = generateFingerprint(ip, userAgent)\n\n // For login POST, extract email and check lockout before proceeding\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n let preExtractedEmail = ''\n\n if (isLoginPost) {\n try {\n if (path === '/auth/login/form') {\n // Form-based login: clone request to read formData without consuming it\n const clonedReq = c.req.raw.clone()\n const formData = await clonedReq.formData()\n preExtractedEmail = (formData.get('email') as string || '').toLowerCase()\n } else {\n // JSON login: Hono caches parsed JSON so this is safe\n const body = await c.req.json()\n preExtractedEmail = body?.email?.toLowerCase() || ''\n }\n } catch {\n // Can't parse body, continue\n }\n\n if (preExtractedEmail && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const lockStatus = await detector.isLocked(ip, preExtractedEmail)\n\n if (lockStatus.locked) {\n const service = new SecurityAuditService(db, settings)\n // Log the blocked attempt asynchronously\n const logPromise = service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: preExtractedEmail,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n blocked: true,\n details: { reason: lockStatus.reason }\n })\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n\n return c.json({\n error: lockStatus.reason || 'Too many failed attempts. Please try again later.'\n }, 429)\n }\n }\n }\n\n // Proceed with the request\n await next()\n\n // After response, log the event asynchronously\n const logPromise = logAuthEvent(c, db, settings, ip, userAgent, countryCode, fingerprint, path, method, preExtractedEmail)\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n }\n}\n\nasync function logAuthEvent(\n c: Context<{ Bindings: Bindings; Variables: Variables }>,\n db: any,\n settings: SecurityAuditSettings,\n ip: string,\n userAgent: string,\n countryCode: string | null,\n fingerprint: string,\n path: string,\n method: string,\n preExtractedEmail: string = ''\n): Promise {\n try {\n const service = new SecurityAuditService(db, settings)\n const status = c.res.status\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n const isFormLogin = path === '/auth/login/form'\n\n // Login POST\n if (isLoginPost) {\n // Determine if login succeeded or failed.\n // JSON login: 200 = success, 401/400 = failure\n // Form login: always returns 200 — check if response set an auth cookie (HX-Redirect header indicates success)\n let loginSucceeded: boolean\n if (isFormLogin) {\n // Form login redirects to /admin on success via HX-Redirect header or meta refresh\n const hxRedirect = c.res.headers.get('HX-Redirect')\n const setCookieHeader = c.res.headers.get('set-cookie') || ''\n loginSucceeded = !!(hxRedirect?.includes('/admin') || setCookieHeader.includes('auth_token'))\n } else {\n loginSucceeded = status === 200\n }\n\n if (loginSucceeded) {\n if (!settings.logging.logSuccessfulLogins) return\n\n // Try to get user info from response\n let email = preExtractedEmail\n let userId = ''\n if (!isFormLogin) {\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || email\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n }\n\n await service.logEvent({\n eventType: 'login_success',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n } else {\n // Failed login — use pre-extracted email since body is already consumed\n const email = preExtractedEmail\n\n await service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { statusCode: status }\n })\n\n // Record failed attempt for brute-force detection\n if (email && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const result = await detector.recordFailedAttempt(ip, email)\n\n if (result.shouldLockIP) {\n await detector.lockIP(ip)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_ip', attemptCount: result.ipCount }\n })\n }\n\n if (result.shouldLockEmail) {\n await detector.lockEmail(email)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_email', attemptCount: result.emailCount }\n })\n }\n\n if (result.isSuspicious) {\n await service.logEvent({\n eventType: 'suspicious_activity',\n severity: 'critical',\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'multiple_emails_from_ip', ipCount: result.ipCount }\n })\n }\n }\n }\n }\n\n // Registration POST\n if (path === '/auth/register' && method === 'POST' && settings.logging.logRegistrations) {\n if (status === 201 || status === 200) {\n let email = ''\n let userId = ''\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || ''\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n\n await service.logEvent({\n eventType: 'registration',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n }\n\n // Logout\n if (path === '/auth/logout' && settings.logging.logLogouts) {\n const user = c.get('user')\n await service.logEvent({\n eventType: 'logout',\n severity: 'info',\n userId: user?.userId,\n email: user?.email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n } catch (error) {\n console.error('[SecurityAudit] Error logging auth event:', error)\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { securityAuditAdminRoutes } from './routes/admin'\nimport { securityAuditApiRoutes } from './routes/api'\nimport { securityAuditMiddleware } from './middleware/audit-middleware'\n\nexport function createSecurityAuditPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'security-audit',\n version: '1.0.0-beta.1',\n description: 'Security event logging, brute-force detection, and analytics dashboard'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard and event log routes\n builder.addRoute('/admin/plugins/security-audit', securityAuditAdminRoutes as any, {\n description: 'Security audit dashboard and admin pages',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes\n builder.addRoute('/api/security-audit', securityAuditApiRoutes as any, {\n description: 'Security audit API endpoints',\n requiresAuth: true,\n priority: 50\n })\n\n // Admin menu item — icon is raw SVG to match sidebar rendering\n builder.addMenuItem('Security', '/admin/plugins/security-audit', {\n icon: ``,\n order: 85\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async (context) => {\n console.log('[SecurityAudit] Plugin installed')\n },\n activate: async (context) => {\n console.log('[SecurityAudit] Plugin activated')\n },\n deactivate: async (context) => {\n console.log('[SecurityAudit] Plugin deactivated')\n },\n uninstall: async (context) => {\n console.log('[SecurityAudit] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const securityAuditPlugin = createSecurityAuditPlugin()\nexport { SecurityAuditService } from './services/security-audit-service'\nexport { BruteForceDetector } from './services/brute-force-detector'\nexport { securityAuditMiddleware } from './middleware/audit-middleware'\nexport default securityAuditPlugin\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n Subscription,\n SubscriptionInsert,\n SubscriptionFilters,\n SubscriptionStats,\n SubscriptionStatus\n} from '../types'\n\n/**\n * Manages subscription records in D1\n */\nexport class SubscriptionService {\n constructor(private db: D1Database) {}\n\n /**\n * Ensure the subscriptions table exists\n */\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS subscriptions (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n user_id TEXT NOT NULL,\n stripe_customer_id TEXT NOT NULL,\n stripe_subscription_id TEXT NOT NULL UNIQUE,\n stripe_price_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'incomplete',\n current_period_start INTEGER NOT NULL DEFAULT 0,\n current_period_end INTEGER NOT NULL DEFAULT 0,\n cancel_at_period_end INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\n )\n `).run()\n\n // Indexes for common lookups\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_user_id ON subscriptions(user_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_customer_id ON subscriptions(stripe_customer_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_subscription_id ON subscriptions(stripe_subscription_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_status ON subscriptions(status)\n `).run()\n }\n\n /**\n * Create a new subscription record\n */\n async create(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Upsert a subscription by stripe_subscription_id (INSERT or UPDATE on conflict)\n */\n async upsert(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_subscription_id) DO UPDATE SET\n status = excluded.status,\n stripe_price_id = excluded.stripe_price_id,\n current_period_start = excluded.current_period_start,\n current_period_end = excluded.current_period_end,\n cancel_at_period_end = excluded.cancel_at_period_end,\n updated_at = unixepoch()\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Update a subscription by its Stripe subscription ID\n */\n async updateByStripeId(stripeSubscriptionId: string, data: Partial): Promise {\n const sets: string[] = []\n const values: any[] = []\n\n if (data.status !== undefined) {\n sets.push('status = ?')\n values.push(data.status)\n }\n if (data.stripePriceId !== undefined) {\n sets.push('stripe_price_id = ?')\n values.push(data.stripePriceId)\n }\n if (data.currentPeriodStart !== undefined) {\n sets.push('current_period_start = ?')\n values.push(data.currentPeriodStart)\n }\n if (data.currentPeriodEnd !== undefined) {\n sets.push('current_period_end = ?')\n values.push(data.currentPeriodEnd)\n }\n if (data.cancelAtPeriodEnd !== undefined) {\n sets.push('cancel_at_period_end = ?')\n values.push(data.cancelAtPeriodEnd ? 1 : 0)\n }\n\n if (sets.length === 0) return this.getByStripeSubscriptionId(stripeSubscriptionId)\n\n sets.push('updated_at = unixepoch()')\n values.push(stripeSubscriptionId)\n\n const result = await this.db.prepare(`\n UPDATE subscriptions SET ${sets.join(', ')} WHERE stripe_subscription_id = ? RETURNING *\n `).bind(...values).first()\n\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe subscription ID\n */\n async getByStripeSubscriptionId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get the active subscription for a user\n */\n async getByUserId(userId: string): Promise {\n const result = await this.db.prepare(\n \"SELECT * FROM subscriptions WHERE user_id = ? ORDER BY CASE WHEN status = 'active' THEN 0 WHEN status = 'trialing' THEN 1 ELSE 2 END, updated_at DESC LIMIT 1\"\n ).bind(userId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe customer ID\n */\n async getByStripeCustomerId(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_customer_id = ? ORDER BY updated_at DESC LIMIT 1'\n ).bind(stripeCustomerId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Find the userId linked to a Stripe customer ID\n */\n async getUserIdByStripeCustomer(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT user_id FROM subscriptions WHERE stripe_customer_id = ? LIMIT 1'\n ).bind(stripeCustomerId).first() as { user_id: string } | null\n return result?.user_id ?? null\n }\n\n /**\n * List subscriptions with filters and pagination\n */\n async list(filters: SubscriptionFilters = {}): Promise<{ subscriptions: Subscription[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.userId) {\n where.push('user_id = ?')\n values.push(filters.userId)\n }\n if (filters.stripeCustomerId) {\n where.push('stripe_customer_id = ?')\n values.push(filters.stripeCustomerId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM subscriptions ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n // Get paginated results\n const results = await this.db.prepare(\n `SELECT s.*, u.email as user_email FROM subscriptions s LEFT JOIN users u ON s.user_id = u.id ${whereClause} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n subscriptions: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n /**\n * Get subscription stats\n */\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\n SUM(CASE WHEN status = 'canceled' THEN 1 ELSE 0 END) as canceled,\n SUM(CASE WHEN status = 'past_due' THEN 1 ELSE 0 END) as past_due,\n SUM(CASE WHEN status = 'trialing' THEN 1 ELSE 0 END) as trialing\n FROM subscriptions\n `).first() as any\n\n return {\n total: result?.total || 0,\n active: result?.active || 0,\n canceled: result?.canceled || 0,\n pastDue: result?.past_due || 0,\n trialing: result?.trialing || 0\n }\n }\n\n /**\n * Delete a subscription record by Stripe subscription ID\n */\n async deleteByStripeId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'DELETE FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).run()\n return (result.meta?.changes || 0) > 0\n }\n\n private mapRow(row: Record): Subscription {\n return {\n id: row.id,\n userId: row.user_id,\n stripeCustomerId: row.stripe_customer_id,\n stripeSubscriptionId: row.stripe_subscription_id,\n stripePriceId: row.stripe_price_id,\n status: row.status as SubscriptionStatus,\n currentPeriodStart: row.current_period_start,\n currentPeriodEnd: row.current_period_end,\n cancelAtPeriodEnd: !!row.cancel_at_period_end,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n // Attach email if joined\n ...(row.user_email ? { userEmail: row.user_email } : {})\n } as Subscription\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { StripeEventRecord, StripeEventFilters, StripeEventStats } from '../types'\n\n/**\n * Manages Stripe event log records in D1\n */\nexport class StripeEventService {\n constructor(private db: D1Database) {}\n\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS stripe_events (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n stripe_event_id TEXT NOT NULL UNIQUE,\n type TEXT NOT NULL,\n object_id TEXT NOT NULL DEFAULT '',\n object_type TEXT NOT NULL DEFAULT '',\n data TEXT NOT NULL DEFAULT '{}',\n processed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n status TEXT NOT NULL DEFAULT 'processed',\n error TEXT\n )\n `).run()\n\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_type ON stripe_events(type)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_status ON stripe_events(status)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_processed_at ON stripe_events(processed_at DESC)\n `).run()\n }\n\n async log(event: {\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: Record\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n }): Promise {\n await this.db.prepare(`\n INSERT INTO stripe_events (stripe_event_id, type, object_id, object_type, data, status, error)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_event_id) DO UPDATE SET\n status = excluded.status,\n error = excluded.error,\n processed_at = unixepoch()\n `).bind(\n event.stripeEventId,\n event.type,\n event.objectId,\n event.objectType,\n JSON.stringify(event.data),\n event.status,\n event.error || null\n ).run()\n }\n\n async list(filters: StripeEventFilters = {}): Promise<{ events: StripeEventRecord[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.type) {\n where.push('type = ?')\n values.push(filters.type)\n }\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.objectId) {\n where.push('object_id = ?')\n values.push(filters.objectId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM stripe_events ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n const results = await this.db.prepare(\n `SELECT * FROM stripe_events ${whereClause} ORDER BY processed_at DESC LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n events: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'processed' THEN 1 ELSE 0 END) as processed,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'ignored' THEN 1 ELSE 0 END) as ignored\n FROM stripe_events\n `).first() as any\n\n return {\n total: result?.total || 0,\n processed: result?.processed || 0,\n failed: result?.failed || 0,\n ignored: result?.ignored || 0\n }\n }\n\n async getDistinctTypes(): Promise {\n const results = await this.db.prepare(\n 'SELECT DISTINCT type FROM stripe_events ORDER BY type'\n ).all()\n return (results.results || []).map((r: any) => r.type)\n }\n\n private mapRow(row: Record): StripeEventRecord {\n return {\n id: row.id,\n stripeEventId: row.stripe_event_id,\n type: row.type,\n objectId: row.object_id,\n objectType: row.object_type,\n data: row.data,\n processedAt: row.processed_at,\n status: row.status,\n error: row.error || undefined\n }\n }\n}\n","import type { Subscription, SubscriptionStats, SubscriptionStatus } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface StripePageData {\n subscriptions: (Subscription & { userEmail?: string })[]\n stats: SubscriptionStats\n filters: { status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSubscriptionsPage(data: StripePageData): string {\n const { subscriptions, stats, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Manage subscriptions, view billing status, and monitor payment events.\n

\n
\n
\n \n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe')}\n\n \n
\n ${statsCard('Total', stats.total, 'text-zinc-950 dark:text-white')}\n ${statsCard('Active', stats.active, 'text-emerald-600 dark:text-emerald-400')}\n ${statsCard('Trialing', stats.trialing, 'text-blue-600 dark:text-blue-400')}\n ${statsCard('Past Due', stats.pastDue, 'text-amber-600 dark:text-amber-400')}\n ${statsCard('Canceled', stats.canceled, 'text-red-600 dark:text-red-400')}\n
\n\n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${subscriptions.length === 0\n ? ''\n : subscriptions.map(renderRow).join('')\n }\n \n
UserStatusPrice IDCurrent PeriodCancel at EndStripe
No subscriptions found
\n\n ${renderPagination(filters.page, filters.totalPages, filters.status)}\n
\n\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Subscriptions',\n pageTitle: 'Stripe Subscriptions',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction statsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction statusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.replace('_', ' ').replace(/\\b\\w/g, c => c.toUpperCase())\n return ``\n}\n\nfunction statusBadge(status: SubscriptionStatus): string {\n const colors: Record = {\n active: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n trialing: 'bg-blue-400/10 text-blue-500 dark:text-blue-400 ring-blue-400/20',\n past_due: 'bg-amber-400/10 text-amber-500 dark:text-amber-400 ring-amber-400/20',\n canceled: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n unpaid: 'bg-orange-400/10 text-orange-500 dark:text-orange-400 ring-orange-400/20',\n paused: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete_expired: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n const label = status.replace('_', ' ')\n return `${label}`\n}\n\nfunction formatDate(timestamp: number): string {\n if (!timestamp) return '-'\n return new Date(timestamp * 1000).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })\n}\n\nfunction renderRow(sub: Subscription & { userEmail?: string }): string {\n return `\n \n \n
${sub.userEmail || sub.userId}
\n
${sub.stripeCustomerId}
\n \n ${statusBadge(sub.status)}\n ${sub.stripePriceId}\n \n ${formatDate(sub.currentPeriodStart)} - ${formatDate(sub.currentPeriodEnd)}\n \n \n ${sub.cancelAtPeriodEnd\n ? 'Yes'\n : 'No'\n }\n \n \n \n View in Stripe\n \n \n \n `\n}\n\nfunction renderPagination(page: number, totalPages: number, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params = status ? `&status=${status}` : ''\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","/**\n * Shared tab bar for all Stripe admin pages.\n */\n\nconst TABS = [\n { label: 'Subscriptions', path: '/admin/plugins/stripe' },\n { label: 'Events', path: '/admin/plugins/stripe/events' },\n { label: 'Settings', path: '/admin/plugins/stripe/settings' },\n]\n\nexport function renderStripeTabBar(currentPath: string): string {\n const tabs = TABS.map(tab => {\n const isActive = currentPath === tab.path\n || (tab.path === '/admin/plugins/stripe' && currentPath === '/admin/plugins/stripe/')\n return `\n \n ${tab.label}\n `\n }).join('')\n\n return `\n
\n \n
\n `\n}\n","import type { StripeEventRecord, StripeEventStats } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface EventsPageData {\n events: StripeEventRecord[]\n stats: StripeEventStats\n types: string[]\n filters: { type?: string; status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderEventsPage(data: EventsPageData): string {\n const { events, stats, types, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Webhook event log showing all processed, failed, and ignored Stripe events.\n

\n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/events')}\n\n \n
\n ${eventStatsCard('Total Events', stats.total, 'text-zinc-950 dark:text-white')}\n ${eventStatsCard('Processed', stats.processed, 'text-emerald-600 dark:text-emerald-400')}\n ${eventStatsCard('Failed', stats.failed, 'text-red-600 dark:text-red-400')}\n ${eventStatsCard('Ignored', stats.ignored, 'text-zinc-500 dark:text-zinc-400')}\n
\n\n \n
\n
\n \n \n\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n ${events.length === 0\n ? ''\n : events.map(renderEventRow).join('')\n }\n \n
TimeTypeObject / UserStatusEvent ID
No events recorded yet
\n\n ${renderEventPagination(filters.page, filters.totalPages, filters.type, filters.status)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Events',\n pageTitle: 'Stripe Events',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction eventStatsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction eventStatusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.charAt(0).toUpperCase() + value.slice(1)\n return ``\n}\n\nfunction eventStatusBadge(status: string): string {\n const colors: Record = {\n processed: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n failed: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n ignored: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n return `${status}`\n}\n\nfunction formatTimestamp(timestamp: number): string {\n if (!timestamp) return '-'\n const d = new Date(timestamp * 1000)\n return d.toLocaleString('en-US', {\n month: 'short', day: 'numeric', year: 'numeric',\n hour: '2-digit', minute: '2-digit', second: '2-digit'\n })\n}\n\nfunction extractUserInfo(event: StripeEventRecord): { userId?: string; email?: string } {\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n const userId = data?.metadata?.sonicjs_user_id || data?.sonicjs_user_id\n const email = data?.customer_email || data?.customerEmail || data?.receipt_email\n return { userId: userId || undefined, email: email || undefined }\n } catch {\n return {}\n }\n}\n\nfunction renderEventRow(event: StripeEventRecord): string {\n const errorTooltip = event.error ? ` title=\"${event.error.replace(/\"/g, '"')}\"` : ''\n const userInfo = extractUserInfo(event)\n const userLink = userInfo.userId\n ? `${userInfo.email || userInfo.userId}`\n : userInfo.email\n ? `${userInfo.email}`\n : ''\n\n return `\n \n \n ${formatTimestamp(event.processedAt)}\n \n \n ${event.type}\n \n \n
${event.objectId || '-'}
\n
${event.objectType}
\n ${userLink ? `
${userLink}
` : ''}\n \n ${eventStatusBadge(event.status)}\n ${event.stripeEventId}\n \n `\n}\n\nfunction renderEventPagination(page: number, totalPages: number, type?: string, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params: string[] = []\n if (type) params.push(`type=${type}`)\n if (status) params.push(`status=${status}`)\n const extra = params.length > 0 ? `&${params.join('&')}` : ''\n\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","// ============================================================================\n// Stripe Plugin Types\n// ============================================================================\n\nexport type SubscriptionStatus =\n | 'active'\n | 'canceled'\n | 'past_due'\n | 'trialing'\n | 'unpaid'\n | 'paused'\n | 'incomplete'\n | 'incomplete_expired'\n\nexport interface Subscription {\n id: string\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd: boolean\n createdAt: number\n updatedAt: number\n}\n\nexport interface SubscriptionInsert {\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd?: boolean\n}\n\nexport interface SubscriptionFilters {\n status?: SubscriptionStatus\n userId?: string\n stripeCustomerId?: string\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'updated_at' | 'status'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SubscriptionStats {\n total: number\n active: number\n canceled: number\n pastDue: number\n trialing: number\n}\n\nexport interface StripePluginSettings {\n stripePublishableKey: string\n stripeSecretKey: string\n stripeWebhookSecret: string\n stripePriceId?: string\n successUrl: string\n cancelUrl: string\n}\n\nexport const DEFAULT_SETTINGS: StripePluginSettings = {\n stripePublishableKey: '',\n stripeSecretKey: '',\n stripeWebhookSecret: '',\n stripePriceId: '',\n successUrl: '/admin/dashboard',\n cancelUrl: '/admin/dashboard'\n}\n\n// Stripe webhook event types we handle\nexport type StripeWebhookEventType =\n | 'customer.subscription.created'\n | 'customer.subscription.updated'\n | 'customer.subscription.deleted'\n | 'checkout.session.completed'\n | 'invoice.payment_succeeded'\n | 'invoice.payment_failed'\n\n// Minimal Stripe types (we use fetch, not the SDK)\nexport interface StripeEvent {\n id: string\n type: string\n data: {\n object: Record\n }\n}\n\nexport interface StripeSubscriptionObject {\n id: string\n customer: string\n status: string\n items: {\n data: Array<{\n price: {\n id: string\n }\n }>\n }\n current_period_start: number\n current_period_end: number\n cancel_at_period_end: boolean\n metadata?: Record\n}\n\nexport interface StripeCheckoutSession {\n id: string\n customer: string\n subscription: string\n metadata?: Record\n}\n\nexport interface StripeInvoice {\n id: string\n customer: string\n subscription: string | null\n status: string\n amount_paid: number\n currency: string\n}\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\nexport interface StripeEventRecord {\n id: string\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: string // JSON string\n processedAt: number\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n}\n\nexport interface StripeEventFilters {\n type?: string\n status?: 'processed' | 'failed' | 'ignored'\n objectId?: string\n page?: number\n limit?: number\n}\n\nexport interface StripeEventStats {\n total: number\n processed: number\n failed: number\n ignored: number\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { renderSubscriptionsPage } from '../components/subscriptions-page'\nimport { renderEventsPage } from '../components/events-page'\nimport { renderStripeTabBar } from '../components/tab-bar'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { StripePluginSettings, SubscriptionStatus } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Subscriptions dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const statusFilter = c.req.query('status') as SubscriptionStatus | undefined\n\n const [{ subscriptions, total }, stats] = await Promise.all([\n subscriptionService.list({ status: statusFilter, page, limit }),\n subscriptionService.getStats()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderSubscriptionsPage({\n subscriptions: subscriptions as any,\n stats,\n filters: { status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Events log page\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const typeFilter = c.req.query('type') || undefined\n const statusFilter = c.req.query('status') as 'processed' | 'failed' | 'ignored' | undefined\n\n const [{ events, total }, stats, types] = await Promise.all([\n eventService.list({ type: typeFilter, status: statusFilter, page, limit }),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderEventsPage({\n events,\n stats,\n types,\n filters: { type: typeFilter, status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const { renderAdminLayoutCatalyst } = await import('../../../../templates/layouts/admin-layout-catalyst.template')\n\n const content = `\n
\n
\n

Stripe

\n

\n Configure your Stripe API keys and checkout options.\n

\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/settings')}\n\n
\n\n
\n
\n
\n \n \n

Your Stripe publishable key (starts with pk_)

\n
\n\n
\n \n \n

Your Stripe secret API key (starts with sk_)

\n
\n\n
\n \n \n

Stripe webhook endpoint signing secret (starts with whsec_)

\n
\n\n
\n \n \n

Default Stripe Price ID for checkout sessions (optional)

\n
\n\n
\n \n \n

Redirect URL after successful checkout

\n
\n\n
\n \n \n

Redirect URL if checkout is cancelled

\n
\n
\n\n
\n \n
\n
\n
\n\n \n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Stripe Settings',\n pageTitle: 'Stripe Settings',\n currentPath: '/admin/plugins/stripe',\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n content,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'stripe'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving Stripe settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n})\n\nexport { adminRoutes as stripeAdminRoutes }\n","import type { StripePluginSettings } from '../types'\n\n/**\n * Lightweight Stripe API client using fetch (CF Workers compatible, no SDK needed)\n */\nexport class StripeAPI {\n private baseUrl = 'https://api.stripe.com/v1'\n\n constructor(private secretKey: string) {}\n\n /**\n * Verify a webhook signature\n * Implements Stripe's v1 signature scheme using Web Crypto API\n */\n async verifyWebhookSignature(payload: string, sigHeader: string, secret: string): Promise {\n const parts = sigHeader.split(',')\n const timestamp = parts.find(p => p.startsWith('t='))?.split('=')[1]\n const signatures = parts\n .filter(p => p.startsWith('v1='))\n .map(p => p.substring(3))\n\n if (!timestamp || signatures.length === 0) return false\n\n // Reject events older than 5 minutes (tolerance)\n const now = Math.floor(Date.now() / 1000)\n if (Math.abs(now - parseInt(timestamp)) > 300) return false\n\n // Compute expected signature\n const signedPayload = `${timestamp}.${payload}`\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(signedPayload))\n const expectedSignature = Array.from(new Uint8Array(signatureBuffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n\n return signatures.some(sig => timingSafeEqual(sig, expectedSignature))\n }\n\n /**\n * Create a Checkout Session\n */\n async createCheckoutSession(params: {\n priceId: string\n customerId?: string\n customerEmail?: string\n successUrl: string\n cancelUrl: string\n metadata?: Record\n }): Promise<{ id: string; url: string }> {\n const body = new URLSearchParams()\n body.append('mode', 'subscription')\n body.append('line_items[0][price]', params.priceId)\n body.append('line_items[0][quantity]', '1')\n body.append('success_url', params.successUrl)\n body.append('cancel_url', params.cancelUrl)\n\n if (params.customerId) {\n body.append('customer', params.customerId)\n } else if (params.customerEmail) {\n body.append('customer_email', params.customerEmail)\n }\n\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n\n const response = await this.request('POST', '/checkout/sessions', body)\n return { id: response.id, url: response.url }\n }\n\n /**\n * Retrieve a Stripe subscription\n */\n async getSubscription(subscriptionId: string): Promise {\n return this.request('GET', `/subscriptions/${subscriptionId}`)\n }\n\n /**\n * Create a Stripe customer\n */\n async createCustomer(params: { email: string; metadata?: Record }): Promise<{ id: string }> {\n const body = new URLSearchParams()\n body.append('email', params.email)\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n return this.request('POST', '/customers', body)\n }\n\n /**\n * List subscriptions with pagination (auto-expands across pages)\n */\n async listSubscriptions(params?: {\n status?: string\n limit?: number\n startingAfter?: string\n }): Promise<{ data: any[]; has_more: boolean }> {\n const qs = new URLSearchParams()\n qs.append('limit', String(params?.limit || 100))\n if (params?.status) qs.append('status', params.status)\n if (params?.startingAfter) qs.append('starting_after', params.startingAfter)\n return this.request('GET', `/subscriptions?${qs.toString()}`)\n }\n\n /**\n * Fetch ALL subscriptions from Stripe (handles pagination automatically)\n */\n async listAllSubscriptions(): Promise {\n const all: any[] = []\n let startingAfter: string | undefined\n\n while (true) {\n const result = await this.listSubscriptions({ limit: 100, startingAfter })\n all.push(...result.data)\n if (!result.has_more || result.data.length === 0) break\n startingAfter = result.data[result.data.length - 1].id\n }\n\n return all\n }\n\n /**\n * Search for a customer by email\n */\n async findCustomerByEmail(email: string): Promise<{ id: string } | null> {\n const params = new URLSearchParams()\n params.append('query', `email:'${email}'`)\n params.append('limit', '1')\n const result = await this.request('GET', `/customers/search?${params.toString()}`)\n return result.data?.[0] || null\n }\n\n private async request(method: string, path: string, body?: URLSearchParams): Promise {\n const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${this.secretKey}`,\n ...(body ? { 'Content-Type': 'application/x-www-form-urlencoded' } : {})\n },\n ...(body ? { body: body.toString() } : {})\n })\n\n const data = await response.json() as any\n if (!response.ok) {\n throw new Error(`Stripe API error: ${data.error?.message || response.statusText}`)\n }\n return data\n }\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks on signature verification\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n return result === 0\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { StripeAPI } from '../services/stripe-api'\nimport type { Bindings, Variables } from '../../../../app'\nimport type {\n StripePluginSettings,\n StripeEvent,\n StripeSubscriptionObject,\n StripeCheckoutSession,\n StripeInvoice,\n SubscriptionStatus,\n SubscriptionFilters\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\nfunction mapStripeStatus(status: string): SubscriptionStatus {\n const map: Record = {\n active: 'active',\n canceled: 'canceled',\n past_due: 'past_due',\n trialing: 'trialing',\n unpaid: 'unpaid',\n paused: 'paused',\n incomplete: 'incomplete',\n incomplete_expired: 'incomplete_expired'\n }\n return map[status] || 'incomplete'\n}\n\n// ============================================================================\n// Webhook — No auth, verified by Stripe signature\n// ============================================================================\n\napiRoutes.post('/webhook', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeWebhookSecret) {\n return c.json({ error: 'Webhook secret not configured' }, 500)\n }\n\n // Must read raw body for signature verification\n const rawBody = await c.req.text()\n const sigHeader = c.req.header('stripe-signature') || ''\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const isValid = await stripeApi.verifyWebhookSignature(rawBody, sigHeader, settings.stripeWebhookSecret)\n\n if (!isValid) {\n return c.json({ error: 'Invalid signature' }, 400)\n }\n\n const event: StripeEvent = JSON.parse(rawBody)\n const subscriptionService = new SubscriptionService(db)\n const eventService = new StripeEventService(db)\n await Promise.all([subscriptionService.ensureTable(), eventService.ensureTable()])\n\n // Determine object ID and type for the event log\n const obj = event.data.object as any\n const objectId = obj?.id || ''\n const objectType = obj?.object || event.type.split('.')[0] || ''\n\n try {\n switch (event.type) {\n case 'customer.subscription.created': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n\n await subscriptionService.create({\n userId,\n stripeCustomerId: sub.customer,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items.data[0]?.price.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription created: ${sub.id}`)\n break\n }\n\n case 'customer.subscription.updated': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: mapStripeStatus(sub.status),\n stripePriceId: sub.items.data[0]?.price.id || undefined,\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription updated: ${sub.id} -> ${sub.status}`)\n break\n }\n\n case 'customer.subscription.deleted': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: 'canceled'\n })\n\n console.log(`[Stripe] Subscription deleted: ${sub.id}`)\n break\n }\n\n case 'checkout.session.completed': {\n const session = event.data.object as unknown as StripeCheckoutSession\n const userId = session.metadata?.sonicjs_user_id\n\n if (userId && session.subscription) {\n const existing = await subscriptionService.getByStripeSubscriptionId(session.subscription)\n if (existing && !existing.userId) {\n await subscriptionService.updateByStripeId(session.subscription, {\n userId\n } as any)\n }\n }\n\n console.log(`[Stripe] Checkout completed: ${session.id}`)\n break\n }\n\n case 'invoice.payment_succeeded': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'active'\n })\n }\n console.log(`[Stripe] Payment succeeded for invoice: ${invoice.id}`)\n break\n }\n\n case 'invoice.payment_failed': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'past_due'\n })\n }\n console.log(`[Stripe] Payment failed for invoice: ${invoice.id}`)\n break\n }\n\n default:\n console.log(`[Stripe] Unhandled event type: ${event.type}`)\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'ignored'\n })\n return c.json({ received: true })\n }\n\n // Log successfully processed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'processed'\n })\n } catch (error) {\n // Log failed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error)\n }).catch(() => {}) // Don't let logging failure mask the real error\n\n console.error(`[Stripe] Error processing webhook event ${event.type}:`, error)\n return c.json({ error: 'Webhook processing failed' }, 500)\n }\n\n return c.json({ received: true })\n})\n\n// ============================================================================\n// Authenticated API Routes\n// ============================================================================\n\n// Create checkout session for current user\napiRoutes.post('/create-checkout-session', requireAuth(), async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const settings = await getSettings(db)\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe not configured' }, 500)\n }\n\n const body = await c.req.json().catch(() => ({})) as { priceId?: string }\n const priceId = body.priceId || settings.stripePriceId\n if (!priceId) {\n return c.json({ error: 'No price ID specified' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n // Check if user already has a Stripe customer ID\n const existingSub = await subscriptionService.getByUserId(user.userId)\n let customerId = existingSub?.stripeCustomerId\n\n if (!customerId) {\n // Try to find existing customer by email, or create one\n const existing = await stripeApi.findCustomerByEmail(user.email)\n if (existing) {\n customerId = existing.id\n } else {\n const customer = await stripeApi.createCustomer({\n email: user.email,\n metadata: { sonicjs_user_id: user.userId }\n })\n customerId = customer.id\n }\n }\n\n const origin = new URL(c.req.url).origin\n const session = await stripeApi.createCheckoutSession({\n priceId,\n customerId,\n successUrl: `${origin}${settings.successUrl}?session_id={CHECKOUT_SESSION_ID}`,\n cancelUrl: `${origin}${settings.cancelUrl}`,\n metadata: { sonicjs_user_id: user.userId }\n })\n\n return c.json({ sessionId: session.id, url: session.url })\n})\n\n// Get current user's subscription\napiRoutes.get('/subscription', requireAuth(), async (c) => {\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const subscription = await subscriptionService.getByUserId(user.userId)\n if (!subscription) {\n return c.json({ subscription: null })\n }\n\n return c.json({ subscription })\n})\n\n// ============================================================================\n// Admin API Routes\n// ============================================================================\n\n// List all subscriptions (admin only)\napiRoutes.get('/subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const filters: SubscriptionFilters = {\n status: c.req.query('status') as SubscriptionStatus | undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await subscriptionService.list(filters)\n return c.json(result)\n})\n\n// Get subscription stats (admin only)\napiRoutes.get('/stats', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const stats = await subscriptionService.getStats()\n return c.json(stats)\n})\n\n// ============================================================================\n// Sync Subscriptions from Stripe API\n// ============================================================================\n\napiRoutes.post('/sync-subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe secret key not configured' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n try {\n const allSubs = await stripeApi.listAllSubscriptions()\n let synced = 0\n let errors = 0\n\n for (const sub of allSubs) {\n try {\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n await subscriptionService.upsert({\n userId,\n stripeCustomerId: typeof sub.customer === 'string' ? sub.customer : sub.customer.id,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items?.data?.[0]?.price?.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n synced++\n } catch (err) {\n console.error(`[Stripe Sync] Failed to upsert subscription ${sub.id}:`, err)\n errors++\n }\n }\n\n return c.json({\n success: true,\n total: allSubs.length,\n synced,\n errors\n })\n } catch (error) {\n console.error('[Stripe Sync] Error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Sync failed'\n }, 500)\n }\n})\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\napiRoutes.get('/events', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const filters = {\n type: c.req.query('type') || undefined,\n status: c.req.query('status') as any || undefined,\n objectId: c.req.query('objectId') || undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50\n }\n\n const [result, stats, types] = await Promise.all([\n eventService.list(filters),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n return c.json({ ...result, stats, types })\n})\n\nexport { apiRoutes as stripeApiRoutes }\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { stripeAdminRoutes } from './routes/admin'\nimport { stripeApiRoutes } from './routes/api'\n\nexport function createStripePlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'stripe',\n version: '1.0.0-beta.1',\n description: 'Stripe subscription management with webhook handling, checkout sessions, and subscription gating'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard — subscription management\n builder.addRoute('/admin/plugins/stripe', stripeAdminRoutes as any, {\n description: 'Stripe subscriptions admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes — webhook, checkout, subscription status\n builder.addRoute('/api/stripe', stripeApiRoutes as any, {\n description: 'Stripe API endpoints (webhook, checkout, subscription)',\n requiresAuth: false, // Webhook route handles its own auth via signature\n priority: 50\n })\n\n // Admin menu item\n builder.addMenuItem('Stripe', '/admin/plugins/stripe', {\n icon: ``,\n order: 75\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.log('[Stripe] Plugin installed')\n },\n activate: async () => {\n console.log('[Stripe] Plugin activated')\n },\n deactivate: async () => {\n console.log('[Stripe] Plugin deactivated')\n },\n uninstall: async () => {\n console.log('[Stripe] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const stripePlugin = createStripePlugin()\nexport { SubscriptionService } from './services/subscription-service'\nexport { StripeAPI } from './services/stripe-api'\nexport { requireSubscription } from './middleware/require-subscription'\nexport default stripePlugin\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../app'\nimport { PLUGIN_REGISTRY } from '../plugins/manifest-registry'\n\n// Build menu plugin data from the auto-generated registry.\n// Any plugin with an adminMenu entry in its manifest.json will\n// automatically appear in the sidebar when active.\nconst REGISTRY_MENU_PLUGINS = Object.values(PLUGIN_REGISTRY)\n .filter(p => p.adminMenu !== null)\n .map(p => ({\n codeName: p.codeName,\n label: p.adminMenu!.label,\n path: p.adminMenu!.path,\n icon: p.adminMenu!.icon,\n order: p.adminMenu!.order,\n }))\n\n// Map icon names from manifest.json to Heroicons SVG (outline, 24x24)\nconst ICON_SVG: Record = {\n 'magnifying-glass': '',\n 'chart-bar': '',\n 'image': '',\n 'palette': '',\n 'envelope': '',\n 'hand-raised': '',\n 'key': '',\n 'arrow-right': '',\n 'shield-check': '',\n 'credit-card': '',\n}\n\nfunction resolveIcon(iconName?: string): string {\n if (!iconName) return ''\n // If it's already SVG markup, return as-is\n if (iconName.startsWith('`\n const resolvedIcon = resolveIcon(item.icon) || fallbackIcon\n return `\n \n ${isActive ? '' : ''}\n \n \n ${resolvedIcon}\n \n ${item.label}\n \n `\n}\n\nexport function pluginMenuMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n if (!path.startsWith('/admin')) {\n return next()\n }\n\n // Collect menu items from active plugins using the registry\n let activeMenuItems: Array<{ label: string; path: string; icon?: string; order: number }> = []\n try {\n const db = c.env.DB\n const pluginCodeNames = REGISTRY_MENU_PLUGINS.map(p => p.codeName)\n if (pluginCodeNames.length > 0) {\n const placeholders = pluginCodeNames.map(() => '?').join(',')\n const result = await db.prepare(\n `SELECT name FROM plugins WHERE name IN (${placeholders}) AND status = 'active'`\n ).bind(...pluginCodeNames).all()\n\n const activeNames = new Set((result.results || []).map((r: any) => r.name))\n\n for (const plugin of REGISTRY_MENU_PLUGINS) {\n if (activeNames.has(plugin.codeName)) {\n activeMenuItems.push({\n label: plugin.label,\n path: plugin.path,\n icon: plugin.icon,\n order: plugin.order,\n })\n }\n }\n\n // Sort by order\n activeMenuItems.sort((a, b) => a.order - b.order)\n }\n } catch {\n // DB not ready or plugin table doesn't exist yet\n }\n\n c.set('pluginMenuItems', activeMenuItems.map(m => ({ label: m.label, path: m.path, icon: resolveIcon(m.icon) || '' })))\n\n await next()\n\n // Inject menu items into HTML response by replacing the marker\n if (activeMenuItems.length > 0 && c.res.headers.get('content-type')?.includes('text/html')) {\n const status = c.res.status\n const headers = new Headers(c.res.headers)\n const html = await c.res.text()\n\n if (html.includes(MARKER)) {\n const renderedItems = activeMenuItems.map(item => renderMenuItem(item, path)).join('')\n const newHtml = html.split(MARKER).join(renderedItems)\n c.res = new Response(newHtml, { status, headers })\n } else {\n // Body was consumed by .text(), must create new Response either way\n c.res = new Response(html, { status, headers })\n }\n }\n }\n}\n","/**\n * SonicJS Plugin System Types\n * \n * Defines the core interfaces and types for the plugin system\n */\n\nimport { Hono, Context, Next, MiddlewareHandler } from 'hono'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\n\n// Core plugin definition\nexport interface Plugin {\n /** Unique plugin identifier */\n name: string\n /** Plugin version (semantic versioning) */\n version: string\n /** Human-readable description */\n description?: string\n /** Plugin author information */\n author?: {\n name: string\n email?: string\n url?: string\n }\n /** Plugin dependencies (other plugins required) */\n dependencies?: string[]\n /** SonicJS version compatibility */\n compatibility?: string\n /** Plugin license */\n license?: string\n \n // Extension points\n routes?: PluginRoutes[]\n middleware?: PluginMiddleware[]\n models?: PluginModel[]\n services?: PluginService[]\n adminPages?: PluginAdminPage[]\n adminComponents?: PluginComponent[]\n menuItems?: PluginMenuItem[]\n hooks?: PluginHook[]\n \n // Lifecycle hooks\n install?: (context: PluginContext) => Promise\n uninstall?: (context: PluginContext) => Promise\n activate?: (context: PluginContext) => Promise\n deactivate?: (context: PluginContext) => Promise\n configure?: (config: PluginConfig) => Promise\n}\n\n// Plugin context provides access to SonicJS APIs\nexport interface PluginContext {\n /** Database instance */\n db: D1Database\n /** Key-value storage */\n kv: KVNamespace\n /** R2 storage bucket */\n r2?: R2Bucket\n /** Plugin configuration */\n config: PluginConfig\n /** Core SonicJS services */\n services: {\n auth: AuthService\n content: ContentService\n media: MediaService\n }\n /** Hook system for inter-plugin communication */\n hooks: HookSystem | ScopedHookSystem\n /** Logging utilities */\n logger: PluginLogger\n}\n\n// Authentication service interface for plugins\nexport interface AuthService {\n /** Generate JWT token for a user */\n generateToken(userId: string, email: string, role: string): Promise\n /** Verify and decode JWT token */\n verifyToken(token: string): Promise\n /** Set authentication cookie (useful for alternative auth methods) */\n setAuthCookie(context: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void\n /** Hash password */\n hashPassword(password: string): Promise\n /** Verify password against hash */\n verifyPassword(password: string, hash: string): Promise\n}\n\n// Plugin configuration\nexport interface PluginConfig {\n /** Plugin-specific configuration */\n [key: string]: any\n /** Whether plugin is enabled */\n enabled: boolean\n /** Plugin installation timestamp */\n installedAt?: number\n /** Plugin last update timestamp */\n updatedAt?: number\n}\n\n// Route definitions\nexport interface PluginRoutes {\n /** Route path prefix */\n path: string\n /** Hono route handler */\n handler: Hono\n /** Route description */\n description?: string\n /** Whether route requires authentication */\n requiresAuth?: boolean\n /** Required roles for access */\n roles?: string[]\n /** Route priority (for ordering) */\n priority?: number\n}\n\n// Middleware definitions\nexport interface PluginMiddleware {\n /** Middleware name */\n name: string\n /** Middleware handler function */\n handler: MiddlewareHandler\n /** Middleware description */\n description?: string\n /** Middleware priority (lower = earlier) */\n priority?: number\n /** Routes to apply middleware to */\n routes?: string[]\n /** Whether to apply globally */\n global?: boolean\n}\n\n// Database model definitions\nexport interface PluginModel {\n /** Model name */\n name: string\n /** Database table name */\n tableName: string\n /** Zod schema for validation */\n schema: z.ZodSchema\n /** Database migrations */\n migrations: string[]\n /** Model relationships */\n relationships?: ModelRelationship[]\n /** Whether model extends core content */\n extendsContent?: boolean\n}\n\nexport interface ModelRelationship {\n type: 'oneToOne' | 'oneToMany' | 'manyToMany'\n target: string\n foreignKey?: string\n joinTable?: string\n}\n\n// Service definitions\nexport interface PluginService {\n /** Service name */\n name: string\n /** Service implementation */\n implementation: any\n /** Service description */\n description?: string\n /** Service dependencies */\n dependencies?: string[]\n /** Whether service is singleton */\n singleton?: boolean\n}\n\n// Admin interface extensions\nexport interface PluginAdminPage {\n /** Page path (relative to /admin) */\n path: string\n /** Page title */\n title: string\n /** Page component/template */\n component: string\n /** Page description */\n description?: string\n /** Required permissions */\n permissions?: string[]\n /** Menu item configuration */\n menuItem?: PluginMenuItem\n /** Page icon */\n icon?: string\n}\n\nexport interface PluginComponent {\n /** Component name */\n name: string\n /** Component template function */\n template: (props: any) => string\n /** Component description */\n description?: string\n /** Component props schema */\n propsSchema?: z.ZodSchema\n}\n\nexport interface PluginMenuItem {\n /** Menu item label */\n label: string\n /** Menu item path */\n path: string\n /** Menu item icon */\n icon?: string\n /** Menu item order */\n order?: number\n /** Parent menu item */\n parent?: string\n /** Required permissions */\n permissions?: string[]\n /** Whether item is active */\n active?: boolean\n}\n\n// Hook system for extensibility\nexport interface PluginHook {\n /** Hook name */\n name: string\n /** Hook handler function */\n handler: HookHandler\n /** Hook priority */\n priority?: number\n /** Hook description */\n description?: string\n}\n\nexport type HookHandler = (data: any, context: HookContext) => Promise\n\nexport interface HookContext {\n /** Plugin that registered the hook */\n plugin: string\n /** Hook execution context */\n context: PluginContext\n /** Cancel hook execution */\n cancel?: () => void\n}\n\n// Hook system interface\nexport interface HookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Get all registered hooks */\n getHooks(hookName: string): PluginHook[]\n /** Create a scoped hook system (optional) */\n createScope?(pluginName: string): ScopedHookSystem\n}\n\n// Scoped hook system for plugins\nexport interface ScopedHookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Remove all hooks for this scope */\n unregisterAll(): void\n}\n\n// Plugin registry\nexport interface PluginRegistry {\n /** Get plugin by name */\n get(name: string): Plugin | undefined\n /** Get all registered plugins */\n getAll(): Plugin[]\n /** Get active plugins */\n getActive(): Plugin[]\n /** Register a plugin */\n register(plugin: Plugin): Promise\n /** Unregister a plugin */\n unregister(name: string): Promise\n /** Check if plugin is registered */\n has(name: string): boolean\n /** Activate a plugin */\n activate(name: string): Promise\n /** Deactivate a plugin */\n deactivate(name: string): Promise\n /** Get plugin configuration */\n getConfig(name: string): PluginConfig | undefined\n /** Set plugin configuration */\n setConfig(name: string, config: PluginConfig): void\n /** Get plugin status */\n getStatus(name: string): PluginStatus | undefined\n /** Get all plugin statuses */\n getAllStatuses(): Map\n /** Resolve plugin load order based on dependencies */\n resolveLoadOrder(): string[]\n}\n\n// Plugin manager\nexport interface PluginManager {\n /** Plugin registry */\n registry: PluginRegistry\n /** Hook system */\n hooks: HookSystem\n /** Initialize plugin system */\n initialize(context: PluginContext): Promise\n /** Load plugins from configuration */\n loadPlugins(config: PluginConfig[]): Promise\n /** Install a plugin */\n install(plugin: Plugin, config?: PluginConfig): Promise\n /** Uninstall a plugin */\n uninstall(name: string): Promise\n /** Get plugin status */\n getStatus(name: string): PluginStatus\n}\n\nexport interface PluginStatus {\n name: string\n version: string\n active: boolean\n installed: boolean\n hasErrors: boolean\n errors?: string[]\n lastError?: string\n}\n\n// Service interfaces\nexport interface AuthService {\n /** Verify user permissions */\n hasPermission(userId: string, permission: string): Promise\n /** Get current user */\n getCurrentUser(context: Context): Promise\n /** Create authentication middleware */\n createMiddleware(options?: any): MiddlewareHandler\n}\n\nexport interface ContentService {\n /** Get content by ID */\n getById(id: string): Promise\n /** Create new content */\n create(data: any): Promise\n /** Update content */\n update(id: string, data: any): Promise\n /** Delete content */\n delete(id: string): Promise\n /** Search content */\n search(query: string, options?: any): Promise\n}\n\nexport interface MediaService {\n /** Upload file */\n upload(file: File, options?: any): Promise\n /** Get media by ID */\n getById(id: string): Promise\n /** Delete media */\n delete(id: string): Promise\n /** Transform image */\n transform(id: string, options: any): Promise\n}\n\n// Plugin logger\nexport interface PluginLogger {\n debug(message: string, data?: any): void\n info(message: string, data?: any): void\n warn(message: string, data?: any): void\n error(message: string, error?: Error, data?: any): void\n}\n\n// Plugin development utilities interface\n\nexport interface PluginBuilderOptions {\n name: string\n version: string\n description?: string\n author?: Plugin['author']\n dependencies?: string[]\n}\n\n// Plugin validation\nexport interface PluginValidator {\n /** Validate plugin definition */\n validate(plugin: Plugin): PluginValidationResult\n /** Validate plugin dependencies */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult\n /** Validate plugin compatibility */\n validateCompatibility(plugin: Plugin, version: string): PluginValidationResult\n}\n\nexport interface PluginValidationResult {\n valid: boolean\n errors: string[]\n warnings: string[]\n}\n\n// Standard hook names\nexport const HOOKS = {\n // Application lifecycle\n APP_INIT: 'app:init',\n APP_READY: 'app:ready',\n APP_SHUTDOWN: 'app:shutdown',\n \n // Request lifecycle\n REQUEST_START: 'request:start',\n REQUEST_END: 'request:end',\n REQUEST_ERROR: 'request:error',\n \n // Authentication\n AUTH_LOGIN: 'auth:login',\n AUTH_LOGOUT: 'auth:logout',\n AUTH_REGISTER: 'auth:register',\n USER_LOGIN: 'user:login',\n USER_LOGOUT: 'user:logout',\n \n // Content lifecycle\n CONTENT_CREATE: 'content:create',\n CONTENT_UPDATE: 'content:update',\n CONTENT_DELETE: 'content:delete',\n CONTENT_PUBLISH: 'content:publish',\n CONTENT_SAVE: 'content:save',\n \n // Media lifecycle\n MEDIA_UPLOAD: 'media:upload',\n MEDIA_DELETE: 'media:delete',\n MEDIA_TRANSFORM: 'media:transform',\n \n // Plugin lifecycle\n PLUGIN_INSTALL: 'plugin:install',\n PLUGIN_UNINSTALL: 'plugin:uninstall',\n PLUGIN_ACTIVATE: 'plugin:activate',\n PLUGIN_DEACTIVATE: 'plugin:deactivate',\n \n // Admin interface\n ADMIN_MENU_RENDER: 'admin:menu:render',\n ADMIN_PAGE_RENDER: 'admin:page:render',\n \n // Database\n DB_MIGRATE: 'db:migrate',\n DB_SEED: 'db:seed',\n} as const\n\nexport type HookName = typeof HOOKS[keyof typeof HOOKS]","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { renderAdminLayoutCatalyst } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\n// Analytics Dashboard\nadminRoutes.get('/', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Query real metrics from system_logs\n let totalRequests = 0\n let uniqueIPs = 0\n let avgDuration = 0\n let errorCount = 0\n let topPages: Array<{ path: string; views: number }> = []\n let recentActivity: Array<{ url: string; method: string; status_code: number; duration: number; created_at: number }> = []\n\n try {\n const now = Math.floor(Date.now() / 1000)\n const dayAgo = now - 86400\n\n const [requestsResult, ipsResult, durationResult, errorsResult, pagesResult, activityResult] = await Promise.all([\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT COUNT(DISTINCT ip_address) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT AVG(duration) as avg FROM system_logs WHERE category = ? AND created_at > ? AND duration IS NOT NULL')\n .bind('api', dayAgo).first() as Promise<{ avg: number } | null>,\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE level IN (?, ?) AND created_at > ?')\n .bind('error', 'fatal', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT url, COUNT(*) as views FROM system_logs WHERE category = ? AND created_at > ? AND url IS NOT NULL GROUP BY url ORDER BY views DESC LIMIT 10')\n .bind('api', dayAgo).all(),\n db.prepare('SELECT url, method, status_code, duration, created_at FROM system_logs WHERE category = ? ORDER BY created_at DESC LIMIT 20')\n .bind('api').all(),\n ])\n\n totalRequests = requestsResult?.count || 0\n uniqueIPs = ipsResult?.count || 0\n avgDuration = Math.round(durationResult?.avg || 0)\n errorCount = errorsResult?.count || 0\n topPages = (pagesResult.results || []).map((r: any) => ({ path: r.url, views: r.views }))\n recentActivity = (activityResult.results || []) as any[]\n } catch {\n // Tables may not exist yet\n }\n\n const content = `\n
\n
\n

Analytics Dashboard

\n

Last 24 hours overview from system logs

\n
\n\n \n
\n
\n

Total Requests

\n

${totalRequests.toLocaleString()}

\n
\n
\n

Unique Visitors

\n

${uniqueIPs.toLocaleString()}

\n
\n
\n

Avg Response Time

\n

${avgDuration}ms

\n
\n
\n

Errors

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${errorCount.toLocaleString()}

\n
\n
\n\n \n
\n
\n

Top Pages

\n
\n
\n ${topPages.length > 0 ? topPages.map(p => `\n
\n ${escapeHtml(p.path)}\n ${p.views}\n
\n `).join('') : `\n
\n No page views recorded yet. Analytics data will appear once requests are logged.\n
\n `}\n
\n
\n\n \n
\n
\n

Recent Activity

\n
\n
\n \n \n \n \n \n \n \n \n \n \n ${recentActivity.length > 0 ? recentActivity.map(a => `\n \n \n \n \n \n \n `).join('') : `\n \n \n \n `}\n \n
PathMethodStatusDuration
${escapeHtml(a.url || '')}${a.method || ''}= 400 ? 'bg-red-50 text-red-700 dark:bg-red-900/30 dark:text-red-400' : 'bg-green-50 text-green-700 dark:bg-green-900/30 dark:text-green-400'}\">${a.status_code || ''}${a.duration || 0}ms
No activity recorded yet.
\n
\n
\n
\n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Analytics',\n pageTitle: 'Analytics Dashboard',\n currentPath: '/admin/analytics',\n version: c.get('appVersion'),\n user: user ? {\n name: user.email.split('@')[0] || 'Admin',\n email: user.email,\n role: user.role\n } : undefined,\n content,\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"')\n}\n\nexport { adminRoutes as analyticsAdminRoutes }\n","/**\n * Core Analytics Plugin\n * \n * Provides analytics tracking and reporting extensions\n */\n\nimport { Hono } from 'hono'\n// import { z } from 'zod'\nimport { PluginBuilder, PluginHelpers } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { HOOKS } from '../../types'\nimport { analyticsAdminRoutes } from './routes/admin'\n\nexport function createAnalyticsPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'core-analytics',\n version: '1.0.0-beta.1',\n description: 'Core analytics tracking and reporting plugin'\n })\n\n // Add analytics metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^0.1.0',\n dependencies: ['core-auth'] // Requires auth for admin access\n })\n\n // Create analytics API routes\n const analyticsAPI = new Hono()\n\n // GET /analytics/stats - Get analytics overview\n analyticsAPI.get('/stats', async (c) => {\n const timeRange = c.req.query('range') || '7d' // 1d, 7d, 30d, 90d\n const _metric = c.req.query('metric') || 'all' // pageviews, sessions, users, etc.\n\n return c.json({\n message: 'Analytics stats',\n data: {\n pageviews: 12500,\n uniqueVisitors: 3200,\n sessions: 4800,\n avgSessionDuration: 245,\n bounceRate: 0.35,\n topPages: [\n { path: '/', views: 3200 },\n { path: '/about', views: 1800 },\n { path: '/contact', views: 950 }\n ],\n timeRange\n }\n })\n })\n\n // POST /analytics/track - Track analytics event\n analyticsAPI.post('/track', async (c) => {\n const event = await c.req.json()\n \n // Track event (pageview, click, form submission, etc.)\n console.info('Analytics event tracked:', event)\n \n return c.json({\n message: 'Event tracked successfully',\n eventId: `event-${Date.now()}`\n })\n })\n\n // GET /analytics/reports - Get detailed reports\n analyticsAPI.get('/reports', async (c) => {\n const reportType = c.req.query('type') || 'traffic'\n const startDate = c.req.query('start')\n const endDate = c.req.query('end')\n\n return c.json({\n message: 'Analytics report',\n data: {\n reportType,\n dateRange: { start: startDate, end: endDate },\n data: []\n }\n })\n })\n\n // GET /analytics/realtime - Get real-time analytics\n analyticsAPI.get('/realtime', async (c) => {\n return c.json({\n message: 'Real-time analytics',\n data: {\n activeUsers: 23,\n activePages: [\n { path: '/', users: 8 },\n { path: '/blog', users: 5 },\n { path: '/products', users: 4 }\n ],\n recentEvents: []\n }\n })\n })\n\n builder.addRoute('/api/analytics', analyticsAPI, {\n description: 'Analytics tracking and reporting API',\n requiresAuth: true,\n roles: ['admin', 'analytics:read'],\n priority: 3\n })\n\n // Admin dashboard routes\n builder.addRoute('/admin/analytics', analyticsAdminRoutes as any, {\n description: 'Analytics admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // Add analytics tracking middleware\n builder.addSingleMiddleware('analytics-tracker', async (c: any, next: any) => {\n const start = Date.now()\n const path = c.req.path\n const method = c.req.method\n const userAgent = c.req.header('user-agent')\n const referer = c.req.header('referer')\n const ip = c.req.header('CF-Connecting-IP') || c.req.header('x-forwarded-for')\n\n await next()\n\n const duration = Date.now() - start\n const status = c.res.status\n\n // Track request analytics\n const analyticsData = {\n timestamp: new Date().toISOString(),\n path,\n method,\n status,\n duration,\n userAgent,\n referer,\n ip,\n responseSize: c.res.headers.get('content-length') || 0\n }\n\n console.debug('Analytics tracking:', analyticsData)\n \n // Store analytics data (would integrate with analytics service)\n }, {\n description: 'Track page views and request analytics',\n global: true,\n priority: 99 // Run last to capture response data\n })\n\n // Add analytics service\n builder.addService('analyticsService', {\n trackEvent: async (event: any) => {\n // Event tracking implementation\n console.info('Tracking event:', event)\n return { eventId: `event-${Date.now()}` }\n },\n \n trackPageView: async (data: any) => {\n // Page view tracking implementation\n console.info('Tracking pageview:', data.path)\n return { viewId: `view-${Date.now()}` }\n },\n \n getStats: async (_timeRange: string) => {\n // Get analytics statistics\n return {\n pageviews: 12500,\n sessions: 4800,\n uniqueVisitors: 3200\n }\n },\n \n generateReport: async (type: string, options: any) => {\n // Generate analytics reports\n console.info(`Generating ${type} report with options:`, options)\n return { reportId: `report-${Date.now()}` }\n }\n }, {\n description: 'Core analytics tracking service',\n singleton: true\n })\n\n // Add analytics models\n const pageViewSchema = PluginHelpers.createSchema([\n { name: 'path', type: 'string', optional: false },\n { name: 'title', type: 'string', optional: true },\n { name: 'referrer', type: 'string', optional: true },\n { name: 'userAgent', type: 'string', optional: true },\n { name: 'ipAddress', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true },\n { name: 'duration', type: 'number', optional: true }\n ])\n\n const eventSchema = PluginHelpers.createSchema([\n { name: 'eventType', type: 'string', optional: false },\n { name: 'eventName', type: 'string', optional: false },\n { name: 'eventData', type: 'object', optional: true },\n { name: 'path', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true }\n ])\n\n const pageViewMigration = PluginHelpers.createMigration('analytics_pageviews', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'path', type: 'TEXT', nullable: false },\n { name: 'title', type: 'TEXT', nullable: true },\n { name: 'referrer', type: 'TEXT', nullable: true },\n { name: 'user_agent', type: 'TEXT', nullable: true },\n { name: 'ip_address', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true },\n { name: 'duration', type: 'INTEGER', nullable: true }\n ])\n\n const eventMigration = PluginHelpers.createMigration('analytics_events', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'event_type', type: 'TEXT', nullable: false },\n { name: 'event_name', type: 'TEXT', nullable: false },\n { name: 'event_data', type: 'TEXT', nullable: true },\n { name: 'path', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true }\n ])\n\n builder.addModel('PageView', {\n tableName: 'analytics_pageviews',\n schema: pageViewSchema,\n migrations: [pageViewMigration]\n })\n\n builder.addModel('AnalyticsEvent', {\n tableName: 'analytics_events',\n schema: eventSchema,\n migrations: [eventMigration]\n })\n\n // Add analytics hooks\n builder.addHook(HOOKS.REQUEST_START, async (data: any, _context: any) => {\n // Start tracking request\n data.analytics = {\n startTime: Date.now(),\n sessionId: `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n return data\n }, {\n priority: 1,\n description: 'Initialize analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.REQUEST_END, async (data: any, _context: any) => {\n // Complete request tracking\n if (data.analytics) {\n const duration = Date.now() - data.analytics.startTime\n console.debug(`Request completed in ${duration}ms`)\n }\n return data\n }, {\n priority: 1,\n description: 'Complete analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.USER_LOGIN, async (data: any, context: any) => {\n // Track user login events\n await context.services?.analyticsService?.trackEvent({\n eventType: 'auth',\n eventName: 'user_login',\n userId: data.userId,\n eventData: { loginMethod: data.method }\n })\n return data\n }, {\n priority: 8,\n description: 'Track user login events'\n })\n\n builder.addHook('content:view', async (data: any, context: any) => {\n // Track content views\n await context.services?.analyticsService?.trackEvent({\n eventType: 'content',\n eventName: 'content_view',\n eventData: {\n contentId: data.id,\n contentType: data.type,\n title: data.title\n }\n })\n return data\n }, {\n priority: 8,\n description: 'Track content view events'\n })\n\n // Add admin pages\n builder.addAdminPage(\n '/analytics',\n 'Analytics Dashboard',\n 'AnalyticsDashboardView',\n {\n description: 'View analytics overview and key metrics',\n permissions: ['admin', 'analytics:read'],\n icon: 'chart-bar'\n }\n )\n\n builder.addAdminPage(\n '/analytics/reports',\n 'Analytics Reports',\n 'AnalyticsReportsView',\n {\n description: 'Generate and view detailed analytics reports',\n permissions: ['admin', 'analytics:read'],\n icon: 'document-report'\n }\n )\n\n builder.addAdminPage(\n '/analytics/realtime',\n 'Real-time Analytics',\n 'AnalyticsRealtimeView',\n {\n description: 'View real-time visitor activity',\n permissions: ['admin', 'analytics:read'],\n icon: 'lightning-bolt'\n }\n )\n\n builder.addAdminPage(\n '/analytics/settings',\n 'Analytics Settings',\n 'AnalyticsSettingsView',\n {\n description: 'Configure analytics tracking and data collection',\n permissions: ['admin', 'analytics:configure'],\n icon: 'cog'\n }\n )\n\n // Add menu items\n builder.addMenuItem('Analytics', '/admin/analytics', {\n icon: 'chart-bar',\n order: 40,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Dashboard', '/admin/analytics', {\n icon: 'chart-bar',\n parent: 'Analytics',\n order: 1,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Reports', '/admin/analytics/reports', {\n icon: 'document-report',\n parent: 'Analytics',\n order: 2,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Real-time', '/admin/analytics/realtime', {\n icon: 'lightning-bolt',\n parent: 'Analytics',\n order: 3,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Settings', '/admin/analytics/settings', {\n icon: 'cog',\n parent: 'Analytics',\n order: 4,\n permissions: ['admin', 'analytics:configure']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.info('Installing analytics plugin...')\n // Create analytics database tables and initial configuration\n },\n\n activate: async () => {\n console.info('Activating analytics plugin...')\n // Start analytics tracking services\n },\n\n deactivate: async () => {\n console.info('Deactivating analytics plugin...')\n // Stop analytics tracking and clean up resources\n },\n\n configure: async (config) => {\n console.info('Configuring analytics plugin...', config)\n // Update analytics configuration and settings\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const analyticsPlugin = createAnalyticsPlugin()","import type { D1Database } from '@cloudflare/workers-types'\n\nexport interface TrackEventInput {\n event: string\n properties?: Record\n userId?: string\n sessionId?: string\n ipAddress?: string\n userAgent?: string\n path?: string\n category?: string\n}\n\nexport interface EventQueryFilters {\n event?: string\n category?: string\n userId?: string\n sessionId?: string\n startDate?: number\n endDate?: number\n limit?: number\n offset?: number\n}\n\nexport interface EventStats {\n totalEvents: number\n uniqueUsers: number\n uniqueSessions: number\n topEvents: Array<{ event: string; count: number }>\n}\n\nexport class EventTrackingService {\n constructor(private db: D1Database) {}\n\n async trackEvent(input: TrackEventInput): Promise {\n const id = crypto.randomUUID()\n const category = input.category || 'user-activity'\n\n await this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n ).run()\n\n return id\n }\n\n async trackBatch(events: TrackEventInput[]): Promise {\n const ids: string[] = []\n\n const stmts = events.map(input => {\n const id = crypto.randomUUID()\n ids.push(id)\n const category = input.category || 'user-activity'\n\n return this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n )\n })\n\n await this.db.batch(stmts)\n return ids\n }\n\n async queryEvents(filters: EventQueryFilters = {}): Promise<{ events: any[]; total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.event) {\n conditions.push('event = ?')\n params.push(filters.event)\n }\n if (filters.category) {\n conditions.push('category = ?')\n params.push(filters.category)\n }\n if (filters.userId) {\n conditions.push('user_id = ?')\n params.push(filters.userId)\n }\n if (filters.sessionId) {\n conditions.push('session_id = ?')\n params.push(filters.sessionId)\n }\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const limit = filters.limit || 50\n const offset = filters.offset || 0\n\n const [countResult, eventsResult] = await Promise.all([\n this.db.prepare(`SELECT COUNT(*) as total FROM analytics_events ${where}`).bind(...params).first() as Promise<{ total: number } | null>,\n this.db.prepare(`SELECT * FROM analytics_events ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`).bind(...params, limit, offset).all()\n ])\n\n const events = (eventsResult.results || []).map((e: any) => ({\n ...e,\n properties: e.properties ? JSON.parse(e.properties) : null\n }))\n\n return { events, total: countResult?.total || 0 }\n }\n\n async getStats(startDate?: number, endDate?: number): Promise {\n const conditions: string[] = []\n const params: any[] = []\n\n if (startDate) {\n conditions.push('created_at >= ?')\n params.push(startDate)\n }\n if (endDate) {\n conditions.push('created_at <= ?')\n params.push(endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n const [totals, topEvents] = await Promise.all([\n this.db.prepare(`\n SELECT\n COUNT(*) as total_events,\n COUNT(DISTINCT user_id) as unique_users,\n COUNT(DISTINCT session_id) as unique_sessions\n FROM analytics_events ${where}\n `).bind(...params).first() as Promise<{ total_events: number; unique_users: number; unique_sessions: number } | null>,\n this.db.prepare(`\n SELECT event, COUNT(*) as count\n FROM analytics_events ${where}\n GROUP BY event ORDER BY count DESC LIMIT 20\n `).bind(...params).all()\n ])\n\n return {\n totalEvents: totals?.total_events || 0,\n uniqueUsers: totals?.unique_users || 0,\n uniqueSessions: totals?.unique_sessions || 0,\n topEvents: (topEvents.results || []).map((r: any) => ({ event: r.event, count: r.count }))\n }\n }\n}\n","import { Hono } from 'hono'\nimport { EventTrackingService } from '../services/event-tracking-service'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// POST /api/events - Track a single event or batch of events\napiRoutes.post('/', async (c) => {\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || ''\n const user = c.get('user')\n\n let body: any\n try {\n body = await c.req.json()\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400)\n }\n\n // Batch support: accept an array of events\n if (Array.isArray(body)) {\n if (body.length > 100) {\n return c.json({ error: 'Batch size limit is 100 events' }, 400)\n }\n\n const events = body.map(e => ({\n event: e.event,\n category: e.category || 'user-activity',\n properties: e.properties,\n userId: user?.userId || e.userId,\n sessionId: e.sessionId,\n ipAddress: ip,\n userAgent,\n path: e.path\n }))\n\n // Validate all events have an event name\n const invalid = events.find(e => !e.event || typeof e.event !== 'string')\n if (invalid) {\n return c.json({ error: 'Each event must have an \"event\" string field' }, 400)\n }\n\n const ids = await service.trackBatch(events)\n return c.json({ success: true, eventIds: ids, count: ids.length })\n }\n\n // Single event\n if (!body.event || typeof body.event !== 'string') {\n return c.json({ error: '\"event\" field is required and must be a string' }, 400)\n }\n\n const eventId = await service.trackEvent({\n event: body.event,\n category: body.category || 'user-activity',\n properties: body.properties,\n userId: user?.userId || body.userId,\n sessionId: body.sessionId,\n ipAddress: ip,\n userAgent,\n path: body.path\n })\n\n return c.json({ success: true, eventId })\n})\n\n// GET /api/events - Query events (admin only)\napiRoutes.get('/', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const filters = {\n event: c.req.query('event') || undefined,\n category: c.req.query('category') || undefined,\n userId: c.req.query('userId') || undefined,\n sessionId: c.req.query('sessionId') || undefined,\n startDate: c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined,\n endDate: c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n offset: c.req.query('offset') ? parseInt(c.req.query('offset')!) : 0\n }\n\n const result = await service.queryEvents(filters)\n return c.json(result)\n})\n\n// GET /api/events/stats - Aggregated event stats (admin only)\napiRoutes.get('/stats', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const startDate = c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined\n const endDate = c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined\n\n const stats = await service.getStats(startDate, endDate)\n return c.json(stats)\n})\n\nexport { apiRoutes as eventsApiRoutes }\n","/**\n * Cache Configuration\n *\n * Defines cache configurations for different entity types\n */\n\nexport interface CacheConfig {\n ttl: number // Time-to-live in seconds\n kvEnabled: boolean // Use KV cache tier\n memoryEnabled: boolean // Use in-memory cache tier\n namespace: string // Cache namespace/prefix\n invalidateOn: string[] // Events that invalidate this cache\n version?: string // Cache version for busting\n}\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\n/**\n * Default cache configurations by entity type\n */\nexport const CACHE_CONFIGS: Record = {\n // Content (high read, low write)\n content: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'content',\n invalidateOn: ['content.update', 'content.delete', 'content.publish'],\n version: 'v1'\n },\n\n // User data (medium read, medium write)\n user: {\n ttl: 900, // 15 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'user',\n invalidateOn: ['user.update', 'user.delete', 'auth.login'],\n version: 'v1'\n },\n\n // Configuration (high read, very low write)\n config: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'config',\n invalidateOn: ['config.update', 'plugin.activate', 'plugin.deactivate'],\n version: 'v1'\n },\n\n // Media metadata (high read, low write)\n media: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'media',\n invalidateOn: ['media.upload', 'media.delete', 'media.update'],\n version: 'v1'\n },\n\n // API responses (very high read, low write)\n api: {\n ttl: 300, // 5 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'api',\n invalidateOn: ['content.update', 'content.publish'],\n version: 'v1'\n },\n\n // Session data (very high read, medium write)\n session: {\n ttl: 1800, // 30 minutes\n kvEnabled: false, // Only in-memory for sessions\n memoryEnabled: true,\n namespace: 'session',\n invalidateOn: ['auth.logout'],\n version: 'v1'\n },\n\n // Plugin data\n plugin: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'plugin',\n invalidateOn: ['plugin.activate', 'plugin.deactivate', 'plugin.update'],\n version: 'v1'\n },\n\n // Collections/schema\n collection: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'collection',\n invalidateOn: ['collection.update', 'collection.delete'],\n version: 'v1'\n }\n}\n\n/**\n * Get cache configuration for a specific namespace\n */\nexport function getCacheConfig(namespace: string): CacheConfig {\n return CACHE_CONFIGS[namespace] || {\n ttl: 3600,\n kvEnabled: true,\n memoryEnabled: true,\n namespace,\n invalidateOn: [],\n version: 'v1'\n }\n}\n\n/**\n * Generate a cache key with consistent format\n * Format: {namespace}:{type}:{identifier}:{version}\n */\nexport function generateCacheKey(\n namespace: string,\n type: string,\n identifier: string,\n version?: string\n): string {\n const v = version || getCacheConfig(namespace).version || 'v1'\n return `${namespace}:${type}:${identifier}:${v}`\n}\n\n/**\n * Parse a cache key back into its components\n */\nexport function parseCacheKey(key: string): {\n namespace: string\n type: string\n identifier: string\n version: string\n} | null {\n const parts = key.split(':')\n if (parts.length !== 4) {\n return null\n }\n\n return {\n namespace: parts[0] || '',\n type: parts[1] || '',\n identifier: parts[2] || '',\n version: parts[3] || ''\n }\n}\n\n/**\n * Generate a hash for complex query parameters\n */\nexport function hashQueryParams(params: Record): string {\n // Sort keys for consistent hashing\n const sortedKeys = Object.keys(params).sort()\n const normalized = sortedKeys.map(key => `${key}=${params[key]}`).join('&')\n\n // Simple hash function (for better performance, consider using crypto)\n let hash = 0\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Create a pattern for cache invalidation\n */\nexport function createCachePattern(\n namespace: string,\n type?: string,\n identifier?: string\n): string {\n let pattern = namespace\n if (type) pattern += `:${type}`\n if (identifier) pattern += `:${identifier}`\n return pattern + ':*'\n}\n","/**\n * Cache Service\n *\n * Three-tiered caching implementation:\n * 1. In-Memory Cache (fastest, region-specific)\n * 2. Cloudflare KV Cache (fast, global)\n * 3. Database (fallback, source of truth)\n */\n\nimport { CacheConfig, CacheStats, generateCacheKey } from './cache-config.js'\n\n/**\n * Cache entry with metadata\n */\ninterface CacheEntry {\n data: T\n timestamp: number\n expiresAt: number\n version: string\n}\n\n/**\n * In-memory cache store\n */\nclass MemoryCache {\n private cache: Map> = new Map()\n private maxSize: number = 50 * 1024 * 1024 // 50MB\n private currentSize: number = 0\n\n /**\n * Get item from memory cache\n */\n get(key: string): T | null {\n const entry = this.cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n this.delete(key)\n return null\n }\n\n return entry.data as T\n }\n\n /**\n * Set item in memory cache\n */\n set(key: string, value: T, ttl: number, version: string = 'v1'): void {\n const now = Date.now()\n const entry: CacheEntry = {\n data: value,\n timestamp: now,\n expiresAt: now + (ttl * 1000),\n version\n }\n\n // Estimate size (rough approximation)\n const entrySize = JSON.stringify(entry).length * 2 // UTF-16\n\n // Check if we need to evict\n if (this.currentSize + entrySize > this.maxSize) {\n this.evictLRU(entrySize)\n }\n\n // Delete old entry if exists\n if (this.cache.has(key)) {\n this.delete(key)\n }\n\n this.cache.set(key, entry)\n this.currentSize += entrySize\n }\n\n /**\n * Delete item from memory cache\n */\n delete(key: string): boolean {\n const entry = this.cache.get(key)\n if (entry) {\n const entrySize = JSON.stringify(entry).length * 2\n this.currentSize -= entrySize\n return this.cache.delete(key)\n }\n return false\n }\n\n /**\n * Clear all items from memory cache\n */\n clear(): void {\n this.cache.clear()\n this.currentSize = 0\n }\n\n /**\n * Get cache statistics\n */\n getStats(): { size: number; count: number } {\n return {\n size: this.currentSize,\n count: this.cache.size\n }\n }\n\n /**\n * Evict least recently used items to make space\n */\n private evictLRU(neededSpace: number): void {\n // Sort by timestamp (oldest first)\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp\n )\n\n let freedSpace = 0\n for (const [key, entry] of entries) {\n if (freedSpace >= neededSpace) break\n\n const entrySize = JSON.stringify(entry).length * 2\n this.delete(key)\n freedSpace += entrySize\n }\n }\n\n /**\n * Delete items matching a pattern\n */\n invalidatePattern(pattern: string): number {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n let count = 0\n for (const key of this.cache.keys()) {\n if (regex.test(key)) {\n this.delete(key)\n count++\n }\n }\n\n return count\n }\n}\n\n/**\n * Cache result with source information\n */\nexport interface CacheResult {\n data: T | null\n source: 'memory' | 'kv' | 'miss'\n hit: boolean\n timestamp?: number\n ttl?: number\n}\n\n/**\n * Main cache service with multi-tier support\n */\nexport class CacheService {\n private memoryCache: MemoryCache\n private config: CacheConfig\n private stats: CacheStats\n private kvNamespace?: KVNamespace\n\n constructor(config: CacheConfig, kvNamespace?: KVNamespace) {\n this.memoryCache = new MemoryCache()\n this.config = config\n this.kvNamespace = kvNamespace\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Get value from cache (tries memory first, then KV)\n */\n async get(key: string): Promise {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n return memoryValue\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return kvValue as T\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return null\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise> {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n\n const entry = await this.getEntry(key)\n return {\n data: memoryValue,\n source: 'memory',\n hit: true,\n timestamp: entry?.timestamp,\n ttl: entry?.ttl\n }\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return {\n data: kvValue as T,\n source: 'kv',\n hit: true\n }\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return {\n data: null,\n source: 'miss',\n hit: false\n }\n }\n\n /**\n * Set value in cache (stores in both memory and KV)\n */\n async set(\n key: string,\n value: T,\n customConfig?: Partial\n ): Promise {\n const config = { ...this.config, ...customConfig }\n\n // Store in memory cache (Tier 1)\n if (config.memoryEnabled) {\n this.memoryCache.set(key, value, config.ttl, config.version)\n }\n\n // Store in KV cache (Tier 2)\n if (config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.put(key, JSON.stringify(value), {\n expirationTtl: config.ttl\n })\n } catch (error) {\n console.error('KV cache write error:', error)\n }\n }\n }\n\n /**\n * Delete value from cache (removes from both memory and KV)\n */\n async delete(key: string): Promise {\n // Delete from memory (Tier 1)\n if (this.config.memoryEnabled) {\n this.memoryCache.delete(key)\n }\n\n // Delete from KV (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.delete(key)\n } catch (error) {\n console.error('KV cache delete error:', error)\n }\n }\n }\n\n /**\n * Clear all cache entries for this namespace\n */\n async clear(): Promise {\n if (this.config.memoryEnabled) {\n this.memoryCache.clear()\n }\n\n // Reset stats\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Invalidate cache entries matching a pattern\n */\n async invalidate(pattern: string): Promise {\n let count = 0\n\n // Invalidate from memory (Tier 1)\n if (this.config.memoryEnabled) {\n count += this.memoryCache.invalidatePattern(pattern)\n }\n\n // Invalidate from KV (Tier 2)\n // Note: KV doesn't support pattern matching, so we need to list all keys\n // This is expensive and should be used sparingly\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n // List all keys with the namespace prefix\n const prefix = this.config.namespace + ':'\n const list = await this.kvNamespace.list({ prefix })\n\n for (const key of list.keys) {\n if (regex.test(key.name)) {\n await this.kvNamespace.delete(key.name)\n count++\n }\n }\n } catch (error) {\n console.error('KV cache invalidation error:', error)\n }\n }\n\n return count\n }\n\n /**\n * Invalidate cache entries matching a pattern (alias for invalidate)\n */\n async invalidatePattern(pattern: string): Promise {\n return this.invalidate(pattern)\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const memStats = this.memoryCache.getStats()\n\n return {\n ...this.stats,\n memorySize: memStats.size,\n entryCount: memStats.count\n }\n }\n\n /**\n * Update hit rate calculation\n */\n private updateHitRate(): void {\n const totalHits = this.stats.memoryHits + this.stats.kvHits + this.stats.dbHits\n this.stats.hitRate = this.stats.totalRequests > 0\n ? (totalHits / this.stats.totalRequests) * 100\n : 0\n }\n\n /**\n * Generate a cache key using the configured namespace\n */\n generateKey(type: string, identifier: string): string {\n return generateCacheKey(\n this.config.namespace,\n type,\n identifier,\n this.config.version\n )\n }\n\n /**\n * Warm cache with multiple entries\n */\n async warmCache(entries: Array<{ key: string; value: T }>): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value)\n }\n }\n\n /**\n * Check if a key exists in cache\n */\n async has(key: string): Promise {\n const value = await this.get(key)\n return value !== null\n }\n\n /**\n * Get multiple values at once\n */\n async getMany(keys: string[]): Promise> {\n const results = new Map()\n\n for (const key of keys) {\n const value = await this.get(key)\n if (value !== null) {\n results.set(key, value)\n }\n }\n\n return results\n }\n\n /**\n * Set multiple values at once\n */\n async setMany(\n entries: Array<{ key: string; value: T }>,\n customConfig?: Partial\n ): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value, customConfig)\n }\n }\n\n /**\n * Delete multiple keys at once\n */\n async deleteMany(keys: string[]): Promise {\n for (const key of keys) {\n await this.delete(key)\n }\n }\n\n /**\n * Get or set pattern - fetch from cache or compute if not found\n */\n async getOrSet(\n key: string,\n fetcher: () => Promise,\n customConfig?: Partial\n ): Promise {\n // Try to get from cache\n const cached = await this.get(key)\n if (cached !== null) {\n return cached\n }\n\n // Fetch from source\n const value = await fetcher()\n\n // Store in cache\n await this.set(key, value, customConfig)\n\n return value\n }\n\n /**\n * List all cache keys with metadata\n */\n async listKeys(): Promise> {\n const keys: Array<{ key: string; size: number; expiresAt: number; age: number }> = []\n\n // Get keys from memory cache\n if (this.config.memoryEnabled) {\n const cache = (this.memoryCache as any).cache as Map>\n for (const [key, entry] of cache.entries()) {\n const size = JSON.stringify(entry).length * 2\n const age = Date.now() - entry.timestamp\n keys.push({\n key,\n size,\n expiresAt: entry.expiresAt,\n age\n })\n }\n }\n\n // Sort by age (newest first)\n return keys.sort((a, b) => a.age - b.age)\n }\n\n /**\n * Get cache entry with full metadata\n */\n async getEntry(key: string): Promise<{\n data: T\n timestamp: number\n expiresAt: number\n ttl: number\n size: number\n } | null> {\n if (!this.config.memoryEnabled) {\n return null\n }\n\n const cache = (this.memoryCache as any).cache as Map>\n const entry = cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n await this.delete(key)\n return null\n }\n\n const size = JSON.stringify(entry).length * 2\n const ttl = Math.max(0, entry.expiresAt - Date.now()) / 1000\n\n return {\n data: entry.data as T,\n timestamp: entry.timestamp,\n expiresAt: entry.expiresAt,\n ttl,\n size\n }\n }\n}\n\n/**\n * Create a cache service instance with configuration\n */\nexport function createCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n return new CacheService(config, kvNamespace)\n}\n\n/**\n * Global cache instances by namespace (singleton pattern)\n */\nconst cacheInstances = new Map()\nlet globalKVNamespace: KVNamespace | undefined\n\n/**\n * Set global KV namespace for all cache instances\n */\nexport function setGlobalKVNamespace(kvNamespace: KVNamespace): void {\n globalKVNamespace = kvNamespace\n}\n\n/**\n * Get or create a cache service for a namespace\n */\nexport function getCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n const key = config.namespace\n\n if (!cacheInstances.has(key)) {\n // Use provided KV namespace or global one\n const kv = kvNamespace || globalKVNamespace\n cacheInstances.set(key, new CacheService(config, kv))\n }\n\n return cacheInstances.get(key)!\n}\n\n/**\n * Clear all cache instances\n */\nexport async function clearAllCaches(): Promise {\n for (const cache of cacheInstances.values()) {\n await cache.clear()\n }\n}\n\n/**\n * Get stats from all cache instances\n */\nexport function getAllCacheStats(): Record {\n const stats: Record = {}\n\n for (const [namespace, cache] of cacheInstances.entries()) {\n stats[namespace] = cache.getStats()\n }\n\n return stats\n}\n","/**\n * Event Bus for Cache Invalidation\n *\n * Provides a centralized event system for triggering cache invalidation\n * based on application events.\n */\n\nexport type EventHandler = (data?: any) => Promise | void\n\n// interface EventSubscription {\n// event: string\n// handler: EventHandler\n// }\n\nclass EventBus {\n private subscriptions: Map = new Map()\n private eventLog: Array<{ event: string; timestamp: number; data?: any }> = []\n private maxLogSize: number = 100\n\n /**\n * Subscribe to an event\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.subscriptions.has(event)) {\n this.subscriptions.set(event, [])\n }\n\n this.subscriptions.get(event)!.push(handler)\n\n // Return unsubscribe function\n return () => {\n const handlers = this.subscriptions.get(event)\n if (handlers) {\n const index = handlers.indexOf(handler)\n if (index > -1) {\n handlers.splice(index, 1)\n }\n }\n }\n }\n\n /**\n * Emit an event to all subscribers\n */\n async emit(event: string, data?: any): Promise {\n // Log the event\n this.logEvent(event, data)\n\n const handlers = this.subscriptions.get(event) || []\n\n // Execute all handlers\n await Promise.all(\n handlers.map(async (handler) => {\n try {\n await handler(data)\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error)\n }\n })\n )\n\n // Also emit to wildcard subscribers\n const wildcardHandlers = this.subscriptions.get('*') || []\n await Promise.all(\n wildcardHandlers.map(async (handler) => {\n try {\n await handler({ event, data })\n } catch (error) {\n console.error(`Error in wildcard event handler for ${event}:`, error)\n }\n })\n )\n }\n\n /**\n * Remove all subscribers for an event\n */\n off(event: string): void {\n this.subscriptions.delete(event)\n }\n\n /**\n * Get all registered events\n */\n getEvents(): string[] {\n return Array.from(this.subscriptions.keys())\n }\n\n /**\n * Get subscriber count for an event\n */\n getSubscriberCount(event: string): number {\n return this.subscriptions.get(event)?.length || 0\n }\n\n /**\n * Log an event for debugging\n */\n private logEvent(event: string, data?: any): void {\n this.eventLog.push({\n event,\n timestamp: Date.now(),\n data\n })\n\n // Keep log size manageable\n if (this.eventLog.length > this.maxLogSize) {\n this.eventLog.shift()\n }\n }\n\n /**\n * Get recent event log\n */\n getEventLog(limit: number = 50): Array<{ event: string; timestamp: number; data?: any }> {\n return this.eventLog.slice(-limit)\n }\n\n /**\n * Clear event log\n */\n clearEventLog(): void {\n this.eventLog = []\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n totalEvents: number\n totalSubscriptions: number\n eventCounts: Record\n } {\n const eventCounts: Record = {}\n\n for (const log of this.eventLog) {\n eventCounts[log.event] = (eventCounts[log.event] || 0) + 1\n }\n\n return {\n totalEvents: this.eventLog.length,\n totalSubscriptions: this.subscriptions.size,\n eventCounts\n }\n }\n}\n\n// Global event bus instance\nlet globalEventBus: EventBus | null = null\n\n/**\n * Get or create the global event bus\n */\nexport function getEventBus(): EventBus {\n if (!globalEventBus) {\n globalEventBus = new EventBus()\n }\n return globalEventBus\n}\n\n/**\n * Convenience function to emit an event\n */\nexport async function emitEvent(event: string, data?: any): Promise {\n const bus = getEventBus()\n await bus.emit(event, data)\n}\n\n/**\n * Convenience function to subscribe to an event\n */\nexport function onEvent(event: string, handler: EventHandler): () => void {\n const bus = getEventBus()\n return bus.on(event, handler)\n}\n","/**\n * Cache Invalidation Service\n *\n * Automatically invalidates cache entries based on application events\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\nimport { getEventBus, onEvent } from './event-bus.js'\n\n/**\n * Setup automatic cache invalidation based on events\n */\nexport function setupCacheInvalidation(): void {\n const _eventBus = getEventBus()\n\n // Content cache invalidation\n setupContentInvalidation()\n\n // User cache invalidation\n setupUserInvalidation()\n\n // Config cache invalidation\n setupConfigInvalidation()\n\n // Media cache invalidation\n setupMediaInvalidation()\n\n // API cache invalidation\n setupAPIInvalidation()\n\n // Collection cache invalidation\n setupCollectionInvalidation()\n\n console.log('Cache invalidation listeners registered')\n}\n\n/**\n * Content cache invalidation\n */\nfunction setupContentInvalidation(): void {\n const config = CACHE_CONFIGS.content\n if (!config) return\n const contentCache = getCacheService(config)\n\n // Invalidate on content updates\n onEvent('content.create', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.create')\n })\n\n onEvent('content.update', async (data) => {\n if (data?.id) {\n // Invalidate specific content item\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n // Invalidate all content lists\n await contentCache.invalidate('content:list:*')\n console.log('Cache invalidated: content.update', data?.id)\n })\n\n onEvent('content.delete', async (data) => {\n if (data?.id) {\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.delete', data?.id)\n })\n\n onEvent('content.publish', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.publish')\n })\n}\n\n/**\n * User cache invalidation\n */\nfunction setupUserInvalidation(): void {\n const config = CACHE_CONFIGS.user\n if (!config) return\n const userCache = getCacheService(config)\n\n onEvent('user.update', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.update', data?.id)\n })\n\n onEvent('user.delete', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.delete', data?.id)\n })\n\n onEvent('auth.login', async (data) => {\n if (data?.userId) {\n await userCache.delete(userCache.generateKey('id', data.userId))\n }\n console.log('Cache invalidated: auth.login', data?.userId)\n })\n\n onEvent('auth.logout', async (data) => {\n // Clear session cache\n const sessionConfig = CACHE_CONFIGS.session\n if (sessionConfig) {\n const sessionCache = getCacheService(sessionConfig)\n if (data?.sessionId) {\n await sessionCache.delete(sessionCache.generateKey('session', data.sessionId))\n }\n }\n console.log('Cache invalidated: auth.logout')\n })\n}\n\n/**\n * Config cache invalidation\n */\nfunction setupConfigInvalidation(): void {\n const configConfig = CACHE_CONFIGS.config\n if (!configConfig) return\n const configCache = getCacheService(configConfig)\n\n onEvent('config.update', async (_data) => {\n await configCache.invalidate('config:*')\n console.log('Cache invalidated: config.update')\n })\n\n onEvent('plugin.activate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.activate', data?.pluginId)\n })\n\n onEvent('plugin.deactivate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.deactivate', data?.pluginId)\n })\n\n onEvent('plugin.update', async (data) => {\n const pluginConfig = CACHE_CONFIGS.plugin\n if (!pluginConfig) return\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n console.log('Cache invalidated: plugin.update', data?.pluginId)\n })\n}\n\n/**\n * Media cache invalidation\n */\nfunction setupMediaInvalidation(): void {\n const config = CACHE_CONFIGS.media\n if (!config) return\n const mediaCache = getCacheService(config)\n\n onEvent('media.upload', async (_data) => {\n await mediaCache.invalidate('media:*')\n console.log('Cache invalidated: media.upload')\n })\n\n onEvent('media.delete', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.delete', data?.id)\n })\n\n onEvent('media.update', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.update', data?.id)\n })\n}\n\n/**\n * API cache invalidation (depends on content changes)\n */\nfunction setupAPIInvalidation(): void {\n const config = CACHE_CONFIGS.api\n if (!config) return\n const apiCache = getCacheService(config)\n\n onEvent('content.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.update)')\n })\n\n onEvent('content.publish', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.publish)')\n })\n\n onEvent('content.create', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.create)')\n })\n\n onEvent('content.delete', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.delete)')\n })\n\n onEvent('collection.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (collection.update)')\n })\n}\n\n/**\n * Collection cache invalidation\n */\nfunction setupCollectionInvalidation(): void {\n const config = CACHE_CONFIGS.collection\n if (!config) return\n const collectionCache = getCacheService(config)\n\n onEvent('collection.create', async (_data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.create')\n })\n\n onEvent('collection.update', async (data) => {\n if (data?.id) {\n await collectionCache.delete(collectionCache.generateKey('item', data.id))\n }\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.update', data?.id)\n })\n\n onEvent('collection.delete', async (data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.delete', data?.id)\n })\n}\n\n/**\n * Get invalidation statistics\n */\nexport function getCacheInvalidationStats() {\n const eventBus = getEventBus()\n return eventBus.getStats()\n}\n\n/**\n * Get recent invalidation events\n */\nexport function getRecentInvalidations(limit: number = 50) {\n const eventBus = getEventBus()\n return eventBus.getEventLog(limit)\n}\n","/**\n * Cache Warming Utilities\n *\n * Utilities for preloading and warming cache entries\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\n\n/**\n * Warm cache with common queries\n */\nexport async function warmCommonCaches(db: D1Database): Promise<{\n warmed: number\n errors: number\n details: Array<{ namespace: string; count: number }>\n}> {\n let totalWarmed = 0\n let totalErrors = 0\n const details: Array<{ namespace: string; count: number }> = []\n\n try {\n // Warm collection cache\n const collectionCount = await warmCollections(db)\n totalWarmed += collectionCount\n details.push({ namespace: 'collection', count: collectionCount })\n\n // Warm content cache (most recent items)\n const contentCount = await warmRecentContent(db)\n totalWarmed += contentCount\n details.push({ namespace: 'content', count: contentCount })\n\n // Warm media cache (most recent items)\n const mediaCount = await warmRecentMedia(db)\n totalWarmed += mediaCount\n details.push({ namespace: 'media', count: mediaCount })\n\n } catch (error) {\n console.error('Error warming caches:', error)\n totalErrors++\n }\n\n return {\n warmed: totalWarmed,\n errors: totalErrors,\n details\n }\n}\n\n/**\n * Warm collections cache\n */\nasync function warmCollections(db: D1Database): Promise {\n const config = CACHE_CONFIGS.collection\n if (!config) return 0\n const collectionCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare('SELECT * FROM collections WHERE is_active = 1')\n const { results } = await stmt.all()\n\n for (const collection of results as any[]) {\n const key = collectionCache.generateKey('item', collection.id)\n await collectionCache.set(key, collection)\n count++\n }\n\n // Also cache the full list\n const listKey = collectionCache.generateKey('list', 'all')\n await collectionCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming collections cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent content cache\n */\nasync function warmRecentContent(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.content\n if (!config) return 0\n const contentCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM content ORDER BY created_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const content of results as any[]) {\n const key = contentCache.generateKey('item', content.id)\n await contentCache.set(key, content)\n count++\n }\n\n // Cache the list\n const listKey = contentCache.generateKey('list', 'recent')\n await contentCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming content cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent media cache\n */\nasync function warmRecentMedia(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.media\n if (!config) return 0\n const mediaCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const media of results as any[]) {\n const key = mediaCache.generateKey('item', media.id)\n await mediaCache.set(key, media)\n count++\n }\n\n // Cache the list\n const listKey = mediaCache.generateKey('list', 'recent')\n await mediaCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming media cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm specific namespace with custom data\n */\nexport async function warmNamespace(\n namespace: string,\n entries: Array<{ key: string; value: any }>\n): Promise {\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n throw new Error(`Unknown namespace: ${namespace}`)\n }\n\n const cache = getCacheService(config)\n await cache.setMany(entries)\n\n return entries.length\n}\n\n/**\n * Preload cache on application startup\n */\nexport async function preloadCache(db: D1Database): Promise {\n console.log('🔥 Preloading cache...')\n\n const result = await warmCommonCaches(db)\n\n console.log(`✅ Cache preloaded: ${result.warmed} entries across ${result.details.length} namespaces`)\n result.details.forEach(detail => {\n console.log(` - ${detail.namespace}: ${detail.count} entries`)\n })\n\n if (result.errors > 0) {\n console.warn(`⚠️ ${result.errors} errors during cache preloading`)\n }\n}\n\n/**\n * Schedule periodic cache warming\n */\nexport function schedulePeriodicWarming(\n db: D1Database,\n intervalMs: number = 300000 // 5 minutes default\n): NodeJS.Timeout {\n console.log(`⏰ Scheduling periodic cache warming every ${intervalMs / 1000}s`)\n\n return setInterval(async () => {\n try {\n console.log('🔄 Running periodic cache warming...')\n await warmCommonCaches(db)\n } catch (error) {\n console.error('Error during periodic cache warming:', error)\n }\n }, intervalMs)\n}\n","/**\n * Admin Cache Dashboard Template\n *\n * Moved from @sonicjs-cms/templates to avoid circular dependency\n * during build (templates imports from core, core can't import from templates)\n */\n\nimport { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\nexport interface CacheDashboardData {\n stats: Record\n totals: {\n hits: number\n misses: number\n requests: number\n hitRate: string\n memorySize: number\n entryCount: number\n }\n namespaces: string[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCacheDashboard(data: CacheDashboardData): string {\n const pageContent = `\n
\n \n
\n
\n

Cache System

\n

\n Monitor and manage cache performance across all namespaces\n

\n
\n
\n \n \n \n \n Refresh\n \n \n \n \n \n Clear All\n \n
\n
\n\n \n
\n ${renderStatCard('Total Requests', data.totals.requests.toLocaleString(), 'lime', `\n \n \n \n `)}\n\n ${renderStatCard('Hit Rate', data.totals.hitRate + '%', 'blue', `\n \n \n \n `, parseFloat(data.totals.hitRate) > 70 ? 'lime' : parseFloat(data.totals.hitRate) > 40 ? 'amber' : 'red')}\n\n ${renderStatCard('Memory Usage', formatBytes(data.totals.memorySize), 'purple', `\n \n \n \n `)}\n\n ${renderStatCard('Cached Entries', data.totals.entryCount.toLocaleString(), 'sky', `\n \n \n \n `)}\n
\n\n \n
\n
\n

Cache Namespaces

\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ${data.namespaces.map(namespace => {\n const stat = data.stats[namespace]\n if (!stat) return ''\n return renderNamespaceRow(namespace, stat)\n }).join('')}\n \n
\n Namespace\n \n Requests\n \n Hit Rate\n \n Memory Hits\n \n KV Hits\n \n Entries\n \n Size\n \n Actions\n
\n
\n
\n\n \n
\n
\n

Performance Overview

\n
\n
\n
\n ${renderPerformanceMetric('Memory Cache', data.totals.hits, data.totals.misses)}\n ${renderHealthStatus(parseFloat(data.totals.hitRate))}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'clear-all-cache-confirm',\n title: 'Clear All Cache',\n message: 'Are you sure you want to clear all cache entries? This cannot be undone.',\n confirmText: 'Clear All',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearAllCaches()'\n })}\n\n ${renderConfirmationDialog({\n id: 'clear-namespace-cache-confirm',\n title: 'Clear Namespace Cache',\n message: 'Clear cache for this namespace?',\n confirmText: 'Clear',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearNamespaceCache()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Cache System',\n pageTitle: 'Cache System',\n currentPath: '/admin/cache',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderStatCard(label: string, value: string, color: string, icon: string, colorOverride?: string): string {\n const finalColor = colorOverride || color\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n blue: 'bg-blue-50 dark:bg-blue-500/10 text-blue-600 dark:text-blue-400 ring-blue-600/20 dark:ring-blue-500/20',\n purple: 'bg-purple-50 dark:bg-purple-500/10 text-purple-600 dark:text-purple-400 ring-purple-600/20 dark:ring-purple-500/20',\n sky: 'bg-sky-50 dark:bg-sky-500/10 text-sky-600 dark:text-sky-400 ring-sky-600/20 dark:ring-sky-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n
\n
\n
\n
\n ${icon}\n
\n
\n

${label}

\n

${value}

\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderNamespaceRow(namespace: string, stat: CacheStats): string {\n const hitRate = stat.hitRate.toFixed(1)\n const hitRateColor = stat.hitRate > 70 ? 'text-lime-600 dark:text-lime-400' :\n stat.hitRate > 40 ? 'text-amber-600 dark:text-amber-400' :\n 'text-red-600 dark:text-red-400'\n\n return `\n \n \n \n ${namespace}\n \n \n \n ${stat.totalRequests.toLocaleString()}\n \n \n \n ${hitRate}%\n \n \n \n ${stat.memoryHits.toLocaleString()}\n \n \n ${stat.kvHits.toLocaleString()}\n \n \n ${stat.entryCount.toLocaleString()}\n \n \n ${formatBytes(stat.memorySize)}\n \n \n \n Clear\n \n \n \n `\n}\n\nfunction renderPerformanceMetric(label: string, hits: number, misses: number): string {\n const total = hits + misses\n const hitPercentage = total > 0 ? (hits / total) * 100 : 0\n\n return `\n
\n

${label}

\n
\n
\n Hits\n ${hits.toLocaleString()}\n
\n
\n Misses\n ${misses.toLocaleString()}\n
\n
\n
\n Hit Rate\n ${hitPercentage.toFixed(1)}%\n
\n
\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderHealthStatus(hitRate: number): string {\n const status = hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'critical'\n const statusConfig = {\n healthy: {\n label: 'Healthy',\n color: 'lime',\n icon: `\n \n `\n },\n warning: {\n label: 'Needs Attention',\n color: 'amber',\n icon: `\n \n `\n },\n critical: {\n label: 'Critical',\n color: 'red',\n icon: `\n \n `\n }\n }\n\n const config = statusConfig[status]\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n

System Health

\n
\n ${config.icon}\n
\n

${config.label}

\n

\n ${status === 'healthy' ? 'Cache is performing well' :\n status === 'warning' ? 'Consider increasing cache TTL or capacity' :\n 'Cache hit rate is too low'}\n

\n
\n
\n
\n `\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`\n}\n","/**\n * Cache Plugin Routes\n *\n * Admin routes for cache management\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport { getAllCacheStats, clearAllCaches, getCacheService } from './services/cache.js'\nimport { CACHE_CONFIGS, parseCacheKey } from './services/cache-config.js'\nimport { getRecentInvalidations, getCacheInvalidationStats } from './services/cache-invalidation.js'\nimport { warmCommonCaches, warmNamespace } from './services/cache-warming.js'\nimport { renderCacheDashboard, CacheDashboardData } from '../../templates/pages/admin-cache.template'\n\nconst app = new Hono()\n\n/**\n * GET /admin/cache\n * Cache statistics dashboard\n */\napp.get('/', async (c: Context) => {\n const stats = getAllCacheStats()\n const user = c.get('user')\n\n // Calculate totals\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n Object.values(stats).forEach(stat => {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n })\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n const dashboardData: CacheDashboardData = {\n stats,\n totals: {\n hits: totalHits,\n misses: totalMisses,\n requests: totalRequests,\n hitRate: overallHitRate.toFixed(2),\n memorySize: totalSize,\n entryCount: totalEntries\n },\n namespaces: Object.keys(stats),\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCacheDashboard(dashboardData))\n})\n\n/**\n * GET /admin/cache/stats\n * Detailed statistics for all namespaces\n */\napp.get('/stats', async (c: Context) => {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/stats/:namespace\n * Statistics for a specific namespace\n */\napp.get('/stats/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const stats = cache.getStats()\n\n return c.json({\n success: true,\n data: {\n namespace,\n config,\n stats\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear\n * Clear all cache entries\n */\napp.post('/clear', async (c: Context) => {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear/:namespace\n * Clear cache for a specific namespace\n */\napp.post('/clear/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n await cache.clear()\n\n return c.json({\n success: true,\n message: `Cache cleared for namespace: ${namespace}`,\n namespace,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/invalidate\n * Invalidate cache entries matching a pattern\n */\napp.post('/invalidate', async (c: Context) => {\n const body = await c.req.json()\n const { pattern, namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (namespace) {\n // Invalidate from specific namespace\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: namespace || 'all',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/health\n * Cache system health check\n */\napp.get('/health', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // Calculate health metrics\n const namespaces = Object.entries(stats)\n const healthChecks = namespaces.map(([name, stat]) => {\n const hitRate = stat.hitRate\n const memoryUsage = stat.memorySize / (50 * 1024 * 1024) // Assume 50MB max\n\n return {\n namespace: name,\n status: hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'unhealthy',\n hitRate,\n memoryUsage: (memoryUsage * 100).toFixed(2) + '%',\n entryCount: stat.entryCount\n }\n })\n\n const overallStatus = healthChecks.every(h => h.status === 'healthy')\n ? 'healthy'\n : healthChecks.some(h => h.status === 'unhealthy')\n ? 'unhealthy'\n : 'warning'\n\n return c.json({\n success: true,\n data: {\n status: overallStatus,\n namespaces: healthChecks,\n timestamp: new Date().toISOString()\n }\n })\n})\n\n/**\n * GET /admin/cache/browser\n * Browse all cache entries across namespaces\n */\napp.get('/browser', async (c: Context) => {\n const namespace = c.req.query('namespace') || 'all'\n const search = c.req.query('search') || ''\n const sortBy = c.req.query('sort') || 'age' // age, size, key\n const limit = parseInt(c.req.query('limit') || '100')\n\n const entries: Array<{\n namespace: string\n key: string\n size: number\n age: number\n ttl: number\n expiresAt: number\n parsed: any\n }> = []\n\n const namespaces = namespace === 'all'\n ? Object.keys(CACHE_CONFIGS)\n : [namespace]\n\n for (const ns of namespaces) {\n const config = CACHE_CONFIGS[ns]\n if (!config) continue\n\n const cache = getCacheService(config)\n const keys = await cache.listKeys()\n\n for (const keyInfo of keys) {\n // Apply search filter\n if (search && !keyInfo.key.toLowerCase().includes(search.toLowerCase())) {\n continue\n }\n\n const parsed = parseCacheKey(keyInfo.key)\n const ttl = Math.max(0, keyInfo.expiresAt - Date.now()) / 1000\n\n entries.push({\n namespace: ns,\n key: keyInfo.key,\n size: keyInfo.size,\n age: keyInfo.age,\n ttl,\n expiresAt: keyInfo.expiresAt,\n parsed\n })\n }\n }\n\n // Sort entries\n if (sortBy === 'size') {\n entries.sort((a, b) => b.size - a.size)\n } else if (sortBy === 'age') {\n entries.sort((a, b) => a.age - b.age)\n } else if (sortBy === 'key') {\n entries.sort((a, b) => a.key.localeCompare(b.key))\n }\n\n // Limit results\n const limitedEntries = entries.slice(0, limit)\n\n return c.json({\n success: true,\n data: {\n entries: limitedEntries,\n total: entries.length,\n showing: limitedEntries.length,\n namespace,\n search,\n sortBy\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/browser/:namespace/:key\n * Get detailed information about a specific cache entry\n */\napp.get('/browser/:namespace/:key', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const key = decodeURIComponent(c.req.param('key')!)\n\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const entry = await cache.getEntry(key)\n\n if (!entry) {\n return c.json({\n success: false,\n error: 'Cache entry not found or expired'\n }, 404)\n }\n\n const parsed = parseCacheKey(key)\n\n return c.json({\n success: true,\n data: {\n key,\n namespace,\n parsed,\n ...entry,\n createdAt: new Date(entry.timestamp).toISOString(),\n expiresAt: new Date(entry.expiresAt).toISOString()\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics\n * Advanced cache analytics\n */\napp.get('/analytics', async (c: Context) => {\n const stats = getAllCacheStats()\n const invalidationStats = getCacheInvalidationStats()\n const recentInvalidations = getRecentInvalidations(20)\n\n // Calculate analytics\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n const namespacesAnalytics = []\n\n for (const [namespace, stat] of Object.entries(stats)) {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n\n const totalRequests = stat.memoryHits + stat.kvHits + stat.memoryMisses + stat.kvMisses\n const hitRate = totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / totalRequests) * 100 : 0\n const avgEntrySize = stat.entryCount > 0 ? stat.memorySize / stat.entryCount : 0\n\n namespacesAnalytics.push({\n namespace,\n hitRate: hitRate.toFixed(2),\n totalRequests,\n memoryHitRate: totalRequests > 0 ? ((stat.memoryHits / totalRequests) * 100).toFixed(2) : '0',\n kvHitRate: totalRequests > 0 ? ((stat.kvHits / totalRequests) * 100).toFixed(2) : '0',\n avgEntrySize: Math.round(avgEntrySize),\n totalSize: stat.memorySize,\n entryCount: stat.entryCount,\n efficiency: totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / (stat.memoryHits + stat.kvHits + stat.dbHits + 1)).toFixed(2) : '0'\n })\n }\n\n // Sort by hit rate\n namespacesAnalytics.sort((a, b) => parseFloat(b.hitRate) - parseFloat(a.hitRate))\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n // Calculate cost savings (assume 50ms per DB query vs 2ms for cache)\n const dbQueriesAvoided = totalHits\n const timeSaved = dbQueriesAvoided * 48 // 48ms saved per cache hit\n const estimatedCostSavings = (dbQueriesAvoided / 1000000) * 0.50 // $0.50 per million queries\n\n return c.json({\n success: true,\n data: {\n overview: {\n totalHits,\n totalMisses,\n totalRequests,\n overallHitRate: overallHitRate.toFixed(2),\n totalSize,\n totalEntries,\n avgEntrySize: totalEntries > 0 ? Math.round(totalSize / totalEntries) : 0\n },\n performance: {\n dbQueriesAvoided,\n timeSavedMs: timeSaved,\n timeSavedMinutes: (timeSaved / 1000 / 60).toFixed(2),\n estimatedCostSavings: estimatedCostSavings.toFixed(4)\n },\n namespaces: namespacesAnalytics,\n invalidation: {\n ...invalidationStats,\n recent: recentInvalidations\n }\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/trends\n * Cache trends over time (simplified - would need historical data storage)\n */\napp.get('/analytics/trends', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // For now, return current snapshot as a data point\n // In production, this would query historical data\n const dataPoint = {\n timestamp: Date.now(),\n stats: Object.entries(stats).map(([namespace, stat]) => ({\n namespace,\n hitRate: stat.hitRate,\n entryCount: stat.entryCount,\n memorySize: stat.memorySize,\n totalRequests: stat.totalRequests\n }))\n }\n\n return c.json({\n success: true,\n data: {\n trends: [dataPoint],\n note: 'Historical trends require persistent storage. This returns current snapshot only.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/top-keys\n * Most accessed cache keys (would need hit tracking)\n */\napp.get('/analytics/top-keys', async (c: Context) => {\n const _namespace = c.req.query('namespace') || 'all'\n const _limit = parseInt(c.req.query('limit') || '10')\n\n // This is a placeholder - would need per-key hit tracking\n return c.json({\n success: true,\n data: {\n topKeys: [],\n note: 'Top keys tracking requires per-key hit counting. Feature not yet implemented.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/warm\n * Warm cache with common queries\n */\napp.post('/warm', async (c: Context) => {\n try {\n const db = c.env.DB as D1Database\n const result = await warmCommonCaches(db)\n\n return c.json({\n success: true,\n message: 'Cache warming completed',\n ...result,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Cache warming error:', error)\n return c.json({\n success: false,\n error: 'Cache warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * POST /admin/cache/warm/:namespace\n * Warm specific namespace cache\n */\napp.post('/warm/:namespace', async (c: Context) => {\n try {\n const namespace = c.req.param('namespace')!\n const body = await c.req.json()\n const { entries } = body\n\n if (!entries || !Array.isArray(entries)) {\n return c.json({\n success: false,\n error: 'Entries array is required'\n }, 400)\n }\n\n const count = await warmNamespace(namespace, entries)\n\n return c.json({\n success: true,\n message: `Warmed ${count} entries in namespace: ${namespace}`,\n namespace,\n count,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Namespace warming error:', error)\n return c.json({\n success: false,\n error: 'Namespace warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Cache Plugin\n *\n * Three-tiered caching system for SonicJS\n * - Tier 1: In-Memory (fastest, region-specific)\n * - Tier 2: Cloudflare KV (fast, global)\n * - Tier 3: Database (source of truth)\n */\n\nimport type { Context } from 'hono'\nimport type { PluginContext } from '@sonicjs-cms/core'\nimport { getCacheService, clearAllCaches, getAllCacheStats } from './services/cache.js'\nimport { CACHE_CONFIGS } from './services/cache-config.js'\nimport { setupCacheInvalidation } from './services/cache-invalidation.js'\nimport cacheRoutes from './routes.js'\n\nexport class CachePlugin {\n private _context: PluginContext | null = null\n\n /**\n * Get plugin routes\n */\n getRoutes() {\n return cacheRoutes\n }\n\n /**\n * Activate the cache plugin\n */\n async activate(context: PluginContext): Promise {\n this._context = context\n\n const settings = context.config || {}\n\n console.log('✅ Cache plugin activated', {\n memoryEnabled: settings.memoryEnabled ?? true,\n kvEnabled: settings.kvEnabled ?? false,\n defaultTTL: settings.defaultTTL ?? 3600\n })\n\n // Initialize default cache services\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n\n // Setup event-based cache invalidation\n setupCacheInvalidation()\n }\n\n /**\n * Deactivate the cache plugin\n */\n async deactivate(): Promise {\n console.log('❌ Cache plugin deactivated - clearing all caches')\n await clearAllCaches()\n this._context = null\n }\n\n /**\n * Configure the cache plugin\n */\n async configure(settings: Record): Promise {\n console.log('⚙️ Cache plugin configured', settings)\n\n // Reconfigure all cache instances with new settings\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n }\n\n /**\n * Get cache statistics\n */\n async getStats(c: Context): Promise {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Clear all cache entries\n */\n async clearCache(c: Context): Promise {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Invalidate cache entries matching pattern\n */\n async invalidatePattern(c: Context): Promise {\n const body = await c.req.json()\n const { pattern, namespace: _namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (_namespace) {\n // Invalidate from specific namespace\n const cache = getCacheService(CACHE_CONFIGS[_namespace] || {\n ttl: 3600,\n kvEnabled: false,\n memoryEnabled: true,\n namespace: _namespace,\n invalidateOn: [],\n version: 'v1'\n })\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: _namespace || 'all',\n timestamp: new Date().toISOString()\n })\n }\n}\n\n// Export cache services for use by other plugins/routes when cache plugin is active\nexport {\n getCacheService,\n clearAllCaches,\n getAllCacheStats,\n setGlobalKVNamespace\n} from './services/cache'\nexport { CACHE_CONFIGS, getCacheConfig, generateCacheKey } from './services/cache-config'\nexport type { CacheConfig, CacheStats } from './services/cache-config'\nexport { emitEvent, onEvent, getEventBus } from './services/event-bus'\nexport { getCacheInvalidationStats, getRecentInvalidations } from './services/cache-invalidation'\nexport { warmCommonCaches, warmNamespace, preloadCache } from './services/cache-warming'\n\n// Create and export plugin instance\nconst plugin = new CachePlugin()\nexport default plugin\n","/**\n * SonicJS Favicon SVG\n *\n * Embedded SVG favicon for the admin interface and auth pages.\n * This ensures the favicon is always available without external dependencies.\n */\n\nexport const faviconSvg = `\n\n\n\t\n\t\t\n\t\t\n\t\n\n`;\n","/**\n * Main Application Factory\n *\n * Creates a configured SonicJS application with all core functionality\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport {\n apiRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n testCleanupRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminPluginRoutes,\n adminLogsRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n adminFormsRoutes,\n publicFormsRoutes,\n adminApiReferenceRoutes\n} from './routes'\nimport { getCoreVersion } from './utils/version'\nimport { bootstrapMiddleware } from './middleware/bootstrap'\nimport { metricsMiddleware } from './middleware/metrics'\nimport { csrfProtection } from './middleware/csrf'\nimport { securityHeadersMiddleware } from './middleware/security-headers'\nimport { createDatabaseToolsAdminRoutes } from './plugins/core-plugins/database-tools-plugin/admin-routes'\nimport { createSeedDataAdminRoutes } from './plugins/core-plugins/seed-data-plugin/admin-routes'\nimport { emailPlugin } from './plugins/core-plugins/email-plugin'\nimport { otpLoginPlugin } from './plugins/core-plugins/otp-login-plugin'\nimport { oauthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nimport { userProfilesPlugin } from './plugins/core-plugins/user-profiles'\nimport { aiSearchPlugin } from './plugins/core-plugins/ai-search-plugin'\nimport { createMagicLinkAuthPlugin } from './plugins/available/magic-link-auth'\nimport { securityAuditPlugin } from './plugins/core-plugins/security-audit-plugin'\nimport { securityAuditMiddleware } from './plugins/core-plugins/security-audit-plugin'\nimport { stripePlugin } from './plugins/core-plugins/stripe-plugin'\nimport { requireAuth, requireRole } from './middleware/auth'\nimport { pluginMenuMiddleware } from './middleware/plugin-menu'\nimport { analyticsPlugin } from './plugins/core-plugins/analytics'\nimport { eventsApiRoutes } from './plugins/core-plugins/analytics/routes/api'\nimport cachePlugin from './plugins/cache'\nimport { faviconSvg } from './assets/favicon'\nimport { setAppInstance } from './services/route-metadata'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface Bindings {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n CORS_ORIGINS?: string\n JWT_SECRET?: string\n JWT_EXPIRES_IN?: string\n JWT_REFRESH_GRACE_SECONDS?: string\n BUCKET_NAME?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\nexport interface Variables {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n csrfToken?: string\n pluginMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport interface SonicJSConfig {\n // Collections configuration\n collections?: {\n directory?: string\n autoSync?: boolean\n }\n\n // Plugins configuration\n plugins?: {\n directory?: string\n autoLoad?: boolean\n disableAll?: boolean // Disable all plugins including core plugins\n }\n\n // Custom routes\n routes?: Array<{\n path: string\n handler: Hono\n }>\n\n // Custom middleware\n middleware?: {\n beforeAuth?: Array<(c: Context, next: () => Promise) => Promise>\n afterAuth?: Array<(c: Context, next: () => Promise) => Promise>\n }\n\n // Admin access control\n // Roles allowed to access the /admin panel. Defaults to ['admin'].\n adminAccessRoles?: string[]\n\n // App metadata\n version?: string\n name?: string\n}\n\nexport type SonicJSApp = Hono<{ Bindings: Bindings; Variables: Variables }>\n\n// ============================================================================\n// Application Factory\n// ============================================================================\n\n/**\n * Create a SonicJS application with core functionality\n *\n * @param config - Application configuration\n * @returns Configured Hono application\n *\n * @example\n * ```typescript\n * import { createSonicJSApp } from '@sonicjs-cms/core'\n *\n * const app = createSonicJSApp({\n * collections: {\n * directory: './src/collections',\n * autoSync: true\n * },\n * plugins: {\n * directory: './src/plugins',\n * autoLoad: true\n * }\n * })\n *\n * export default app\n * ```\n */\nexport function createSonicJSApp(config: SonicJSConfig = {}): SonicJSApp {\n const app = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Set app metadata\n const appVersion = config.version || getCoreVersion()\n const appName = config.name || 'SonicJS AI'\n\n // App version middleware\n app.use('*', async (c, next) => {\n c.set('appVersion', appVersion)\n await next()\n })\n\n // Metrics middleware - track all requests for real-time analytics\n app.use('*', metricsMiddleware())\n\n // Bootstrap middleware - runs migrations, syncs collections, and initializes plugins\n app.use('*', bootstrapMiddleware(config))\n\n // Custom middleware - before auth\n if (config.middleware?.beforeAuth) {\n for (const middleware of config.middleware.beforeAuth) {\n app.use('*', middleware)\n }\n }\n\n // Logging middleware\n app.use('*', async (_c, next) => {\n // Logging logic here\n await next()\n })\n\n // Security middleware\n app.use('*', securityHeadersMiddleware())\n\n // CSRF protection middleware\n app.use('*', csrfProtection())\n\n // Custom middleware - after auth\n if (config.middleware?.afterAuth) {\n for (const middleware of config.middleware.afterAuth) {\n app.use('*', middleware)\n }\n }\n\n // Admin panel access control: require authentication and admin role by default\n const adminRoles = config.adminAccessRoles || ['admin']\n app.use('/admin/*', requireAuth())\n app.use('/admin/*', requireRole(adminRoles))\n\n // Plugin dynamic menu items for admin sidebar\n app.use('/admin/*', pluginMenuMiddleware())\n\n // Core routes\n // Routes are being imported incrementally from routes/*\n // Each route is tested and migrated one-by-one\n app.route('/api', apiRoutes)\n app.route('/api/media', apiMediaRoutes)\n app.route('/api/system', apiSystemRoutes)\n app.route('/admin/api', adminApiRoutes)\n app.route('/admin/dashboard', adminDashboardRoutes)\n app.route('/admin/collections', adminCollectionsRoutes)\n app.route('/admin/forms', adminFormsRoutes)\n app.route('/admin/settings', adminSettingsRoutes)\n app.route('/forms', publicFormsRoutes)\n app.route('/api/forms', publicFormsRoutes) // API endpoint for form submissions\n app.route('/admin/api-reference', adminApiReferenceRoutes)\n app.route('/admin/database-tools', createDatabaseToolsAdminRoutes())\n app.route('/admin/seed-data', createSeedDataAdminRoutes())\n app.route('/admin/content', adminContentRoutes)\n app.route('/admin/media', adminMediaRoutes)\n // Security audit middleware - logs auth events (login, register, logout)\n app.use('/auth/*', securityAuditMiddleware())\n\n // Plugin routes - Security Audit (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (securityAuditPlugin.routes && securityAuditPlugin.routes.length > 0) {\n for (const route of securityAuditPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - AI Search (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register AI Search routes first so they take precedence over the generic /:id handler\n if (aiSearchPlugin.routes && aiSearchPlugin.routes.length > 0) {\n for (const route of aiSearchPlugin.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Plugin routes - Cache (dashboard and management API)\n // Fixes GitHub Issue #461: Cache routes were not registered\n app.route('/admin/cache', cachePlugin.getRoutes())\n\n // Plugin routes - OAuth Providers (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (oauthProvidersPlugin.routes && oauthProvidersPlugin.routes.length > 0) {\n for (const route of oauthProvidersPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - User Profiles\n if (userProfilesPlugin.routes && userProfilesPlugin.routes.length > 0) {\n for (const route of userProfilesPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - OTP Login (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register OTP Login routes first so they take precedence over the generic /:id handler\n if (otpLoginPlugin.routes && otpLoginPlugin.routes.length > 0) {\n for (const route of otpLoginPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Analytics (must be before /admin/plugins catch-all)\n if (analyticsPlugin.routes && analyticsPlugin.routes.length > 0) {\n for (const route of analyticsPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Public event tracking API — POST /api/events (open), GET /api/events (admin)\n app.route('/api/events', eventsApiRoutes)\n\n // Plugin routes - Stripe (must be before /admin/plugins catch-all)\n if (stripePlugin.routes && stripePlugin.routes.length > 0) {\n for (const route of stripePlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n app.route('/admin/plugins', adminPluginRoutes)\n app.route('/admin/logs', adminLogsRoutes)\n app.route('/admin', adminUsersRoutes)\n app.route('/auth', authRoutes)\n\n // Test cleanup routes (only for development/test environments)\n app.route('/', testCleanupRoutes)\n\n // Plugin routes - Email\n if (emailPlugin.routes && emailPlugin.routes.length > 0) {\n for (const route of emailPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Magic Link Auth (passwordless authentication via email links)\n const magicLinkPlugin = createMagicLinkAuthPlugin()\n if (magicLinkPlugin.routes && magicLinkPlugin.routes.length > 0) {\n for (const route of magicLinkPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Serve favicon\n app.get('/favicon.svg', (c) => {\n return new Response(faviconSvg, {\n headers: {\n 'Content-Type': 'image/svg+xml',\n 'Cache-Control': 'public, max-age=31536000'\n }\n })\n })\n\n // Serve files from R2 storage (public file access)\n app.get('/files/*', async (c) => {\n try {\n // Extract the path from the URL pathname (everything after /files/)\n const url = new URL(c.req.url)\n const pathname = url.pathname\n\n // Remove the /files/ prefix to get the R2 object key\n const objectKey = pathname.replace(/^\\/files\\//, '')\n\n if (!objectKey) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(objectKey)\n\n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n headers.set('Access-Control-Allow-Origin', '*') // Allow CORS for media files\n headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n headers.set('Access-Control-Allow-Headers', 'Content-Type')\n\n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n })\n\n // Custom routes - User-defined routes\n if (config.routes) {\n for (const route of config.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Root redirect to login\n app.get('/', (c) => {\n return c.redirect('/auth/login')\n })\n\n // Health check\n app.get('/health', (c) => {\n return c.json({\n name: appName,\n version: appVersion,\n status: 'running',\n timestamp: new Date().toISOString()\n })\n })\n\n // Store app instance for route introspection (API reference auto-discovery)\n setAppInstance(app)\n\n // 404 handler\n app.notFound((c) => {\n return c.json({ error: 'Not Found', status: 404 }, 404)\n })\n\n // Error handler\n app.onError((err, c) => {\n console.error(err)\n return c.json({ error: 'Internal Server Error', status: 500 }, 500)\n })\n\n return app\n}\n\n/**\n * Setup core middleware (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreMiddleware(_app: SonicJSApp): void {\n console.warn('setupCoreMiddleware is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n\n/**\n * Setup core routes (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreRoutes(_app: SonicJSApp): void {\n console.warn('setupCoreRoutes is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n","import { drizzle } from 'drizzle-orm/d1';\nimport * as schema from './schema';\n\nexport function createDb(d1: D1Database) {\n return drizzle(d1, { schema });\n}\n\nexport * from './schema';","/**\n * @sonicjs/core - Main Entry Point\n *\n * Core framework for SonicJS headless CMS\n * Built for Cloudflare's edge platform with TypeScript\n *\n * Phase 2 Migration Status:\n * - Week 1: Types, Utils, Database (COMPLETED ✓)\n * - Week 2: Services, Middleware, Plugins (COMPLETED ✓)\n * - Week 3: Routes, Templates (COMPLETED ✓)\n * - Week 4: Integration & Testing (COMPLETED ✓)\n *\n * Test Coverage:\n * - Utilities: 48 tests (sanitize, query-filter, metrics)\n * - Middleware: 51 tests (auth, logging, security, performance)\n * - Total: 99 tests passing\n */\n\n// ============================================================================\n// Main Application API (Phase 2 Week 1)\n// ============================================================================\n\nexport { createSonicJSApp, setupCoreMiddleware, setupCoreRoutes } from './app'\nexport type { SonicJSConfig, SonicJSApp, Bindings, Variables } from './app'\n\n// ============================================================================\n// Placeholders - To be populated in Phase 2\n// ============================================================================\n\n// Services - Week 2 (COMPLETED)\nexport {\n // Collection Management\n loadCollectionConfigs,\n loadCollectionConfig,\n getAvailableCollectionNames,\n validateCollectionConfig,\n registerCollections,\n syncCollections,\n syncCollection,\n isCollectionManaged,\n getManagedCollections,\n cleanupRemovedCollections,\n fullCollectionSync,\n // Form-Collection Sync\n syncAllFormCollections,\n syncFormCollection,\n createContentFromSubmission,\n deriveCollectionSchemaFromFormio,\n deriveSubmissionTitle,\n mapFormStatusToContentStatus,\n backfillFormSubmissions,\n // Database Migrations\n MigrationService,\n // Logging\n Logger,\n getLogger,\n initLogger,\n // Plugin Services - Class implementations\n PluginService as PluginServiceClass,\n PluginBootstrapService,\n} from './services'\n\nexport type { Migration, MigrationStatus, LogLevel, LogCategory, LogEntry, LogFilter, CorePlugin } from './services'\n\n// Middleware - Week 2 (COMPLETED)\nexport {\n // Authentication\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n // Logging\n loggingMiddleware,\n detailedLoggingMiddleware,\n securityLoggingMiddleware,\n performanceLoggingMiddleware,\n // Performance\n cacheHeaders,\n compressionMiddleware,\n securityHeaders,\n // Permissions\n PermissionManager,\n requirePermission,\n requireAnyPermission,\n logActivity,\n // Plugin middleware\n requireActivePlugin,\n requireActivePlugins,\n getActivePlugins,\n isPluginActive,\n // Bootstrap\n bootstrapMiddleware,\n} from './middleware'\n\nexport type { Permission, UserPermissions } from './middleware'\n\n// Plugins - Week 2 (COMPLETED)\nexport {\n // Hook System - Class implementations\n HookSystemImpl,\n ScopedHookSystem as ScopedHookSystemClass,\n HookUtils,\n // Plugin Registry\n PluginRegistryImpl,\n // Plugin Manager - Class implementation\n PluginManager as PluginManagerClass,\n // Plugin Validator - Class implementation\n PluginValidator as PluginValidatorClass,\n} from './plugins'\n\n// Routes - Week 3 (COMPLETED)\nexport {\n ROUTES_INFO,\n apiRoutes,\n apiContentCrudRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminLogsRoutes,\n adminPluginRoutes,\n adminDesignRoutes,\n adminCheckboxRoutes,\n adminTestimonialsRoutes,\n adminCodeExamplesRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n} from './routes'\n\n// Templates - Week 3 (COMPLETED)\nexport {\n // Form templates\n renderForm,\n renderFormField,\n // Table templates\n renderTable,\n // Pagination templates\n renderPagination,\n // Alert templates\n renderAlert,\n // Confirmation dialog templates\n renderConfirmationDialog,\n getConfirmationDialogScript,\n // Filter bar templates\n renderFilterBar,\n} from './templates'\n\nexport type {\n FormField,\n FormData,\n TableColumn,\n TableData,\n PaginationData,\n AlertData,\n ConfirmationDialogOptions,\n FilterBarData,\n Filter,\n FilterOption,\n} from './templates'\n\n// Types - Week 1 (COMPLETED)\nexport type {\n // Collection types\n FieldType,\n FieldConfig,\n CollectionSchema,\n CollectionConfig,\n CollectionConfigModule,\n CollectionSyncResult,\n // Plugin types\n Plugin,\n PluginContext,\n PluginConfig,\n PluginRoutes,\n PluginMiddleware,\n PluginModel,\n PluginService,\n PluginAdminPage,\n PluginComponent,\n PluginMenuItem,\n PluginHook,\n HookHandler,\n HookContext,\n HookSystem,\n ScopedHookSystem,\n PluginRegistry,\n PluginManager,\n PluginStatus,\n AuthService,\n ContentService,\n MediaService,\n PluginLogger,\n PluginBuilderOptions,\n PluginValidator,\n PluginValidationResult,\n HookName,\n // Plugin manifest\n PluginManifest,\n} from './types'\n\nexport { HOOKS } from './types'\n\n// Utils - Week 1 (COMPLETED)\nexport {\n // Sanitization\n escapeHtml,\n sanitizeInput,\n sanitizeObject,\n // Template rendering\n TemplateRenderer,\n templateRenderer,\n renderTemplate,\n // Query filtering\n QueryFilterBuilder,\n buildQuery,\n // Metrics\n metricsTracker,\n // Version\n SONICJS_VERSION,\n getCoreVersion,\n} from './utils'\n\nexport type {\n FilterOperator,\n FilterCondition,\n FilterGroup,\n QueryFilter,\n QueryResult,\n} from './utils'\n\n// Database - Week 1 (COMPLETED)\nexport {\n createDb,\n // Schema exports\n users,\n collections,\n content,\n contentVersions,\n media,\n apiTokens,\n workflowHistory,\n plugins,\n pluginHooks,\n pluginRoutes,\n pluginAssets,\n pluginActivityLog,\n systemLogs,\n logConfig,\n // Zod validation schemas\n insertUserSchema,\n selectUserSchema,\n insertCollectionSchema,\n selectCollectionSchema,\n insertContentSchema,\n selectContentSchema,\n insertMediaSchema,\n selectMediaSchema,\n insertWorkflowHistorySchema,\n selectWorkflowHistorySchema,\n insertPluginSchema,\n selectPluginSchema,\n insertPluginHookSchema,\n selectPluginHookSchema,\n insertPluginRouteSchema,\n selectPluginRouteSchema,\n insertPluginAssetSchema,\n selectPluginAssetSchema,\n insertPluginActivityLogSchema,\n selectPluginActivityLogSchema,\n insertSystemLogSchema,\n selectSystemLogSchema,\n insertLogConfigSchema,\n selectLogConfigSchema,\n} from './db'\n\nexport type {\n User,\n NewUser,\n Collection,\n NewCollection,\n Content,\n NewContent,\n Media,\n NewMedia,\n WorkflowHistory,\n NewWorkflowHistory,\n Plugin as DbPlugin,\n NewPlugin,\n PluginHook as DbPluginHook,\n NewPluginHook,\n PluginRoute,\n NewPluginRoute,\n PluginAsset,\n NewPluginAsset,\n PluginActivityLog,\n NewPluginActivityLog,\n SystemLog,\n NewSystemLog,\n LogConfig,\n NewLogConfig,\n} from './db'\n\n// Plugin SDK (Beta)\nexport { PluginBuilder, PluginHelpers } from './plugins/sdk'\n\n// OAuth Providers Plugin\nexport { oauthProvidersPlugin, createOAuthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nexport { OAuthService, BUILT_IN_PROVIDERS } from './plugins/core-plugins/oauth-providers/oauth-service'\n\n// User Profiles Plugin\nexport { userProfilesPlugin, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig } from './plugins/core-plugins/user-profiles'\nexport type { ProfileFieldDefinition, UserProfileConfig } from './plugins/core-plugins/user-profiles'\n\n// ============================================================================\n// Version\n// ============================================================================\n\n// Import version from package.json\nimport packageJson from '../package.json'\nexport const VERSION = packageJson.version\n\n// ============================================================================\n// Phase 2 Migration Notes\n// ============================================================================\n\n/**\n * This is a work-in-progress package being extracted from the main SonicJS codebase.\n *\n * Current Phase: 2 (Core Module Migration)\n * Current Week: 1 (Types, Utils, Database)\n *\n * Expected completion: 4 weeks from 2025-01-17\n *\n * DO NOT USE IN PRODUCTION - Alpha release for development only\n */\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/core-plugins/database-tools-plugin/services/database-service.ts","../src/templates/pages/admin-database-table.template.ts","../src/plugins/core-plugins/database-tools-plugin/admin-routes.ts","../src/plugins/core-plugins/seed-data-plugin/services/seed-data-service.ts","../src/plugins/core-plugins/seed-data-plugin/admin-routes.ts","../src/plugins/core-plugins/email-plugin/index.ts","../src/plugins/core-plugins/otp-login-plugin/otp-service.ts","../src/plugins/core-plugins/otp-login-plugin/email-templates.ts","../src/plugins/core-plugins/otp-login-plugin/index.ts","../src/plugins/core-plugins/oauth-providers/oauth-service.ts","../src/plugins/core-plugins/oauth-providers/index.ts","../src/plugins/core-plugins/ai-search-plugin/services/embedding.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/chunking.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/custom-rag.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/ai-search.ts","../src/plugins/core-plugins/ai-search-plugin/services/indexer.ts","../src/plugins/core-plugins/ai-search-plugin/components/settings-page.ts","../src/plugins/core-plugins/ai-search-plugin/routes/admin.ts","../src/plugins/core-plugins/ai-search-plugin/routes/api.ts","../src/plugins/core-plugins/ai-search-plugin/manifest.json","../src/plugins/core-plugins/ai-search-plugin/index.ts","../src/plugins/available/magic-link-auth/index.ts","../src/plugins/core-plugins/security-audit-plugin/types.ts","../src/plugins/core-plugins/security-audit-plugin/services/security-audit-service.ts","../src/plugins/core-plugins/security-audit-plugin/components/dashboard-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/event-log-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/settings-page.ts","../src/plugins/core-plugins/security-audit-plugin/routes/admin.ts","../src/plugins/core-plugins/security-audit-plugin/services/brute-force-detector.ts","../src/plugins/core-plugins/security-audit-plugin/routes/api.ts","../src/plugins/core-plugins/security-audit-plugin/middleware/audit-middleware.ts","../src/plugins/core-plugins/security-audit-plugin/index.ts","../src/plugins/core-plugins/stripe-plugin/services/subscription-service.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-event-service.ts","../src/plugins/core-plugins/stripe-plugin/components/subscriptions-page.ts","../src/plugins/core-plugins/stripe-plugin/components/tab-bar.ts","../src/plugins/core-plugins/stripe-plugin/components/events-page.ts","../src/plugins/core-plugins/stripe-plugin/types.ts","../src/plugins/core-plugins/stripe-plugin/routes/admin.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-api.ts","../src/plugins/core-plugins/stripe-plugin/routes/api.ts","../src/plugins/core-plugins/stripe-plugin/index.ts","../src/middleware/plugin-menu.ts","../src/plugins/types.ts","../src/plugins/core-plugins/analytics/routes/admin.ts","../src/plugins/core-plugins/analytics/index.ts","../src/plugins/core-plugins/analytics/services/event-tracking-service.ts","../src/plugins/core-plugins/analytics/routes/api.ts","../src/plugins/cache/services/cache-config.ts","../src/plugins/cache/services/cache.ts","../src/plugins/cache/services/event-bus.ts","../src/plugins/cache/services/cache-invalidation.ts","../src/plugins/cache/services/cache-warming.ts","../src/templates/pages/admin-cache.template.ts","../src/plugins/cache/routes.ts","../src/plugins/cache/index.ts","../src/assets/favicon.ts","../src/app.ts","../src/db/index.ts","../src/index.ts"],"names":["escapeHtml","router","Hono","plugin","emailPlugin","setCookie","tokenTtl","jwt","content","collections","statusBadge","api_default","z","DEFAULT_SETTINGS","formatTimestamp","severityBadge","eventTypeBadge","adminRoutes","apiRoutes","getSettings","isPluginActive","logPromise","renderPagination","renderAdminLayoutCatalyst","HOOKS","media","renderConfirmationDialog","getConfirmationDialogScript","totalRequests","app"],"mappings":"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","file":"index.js","sourcesContent":["import { D1Database } from '@cloudflare/workers-types'\n\nexport interface TruncateResult {\n success: boolean\n message: string\n tablesCleared: string[]\n adminUserPreserved: boolean\n errors?: string[]\n}\n\nexport interface DatabaseStats {\n tables: Array<{\n name: string\n rowCount: number\n }>\n totalRows: number\n}\n\nexport interface TableData {\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n}\n\nexport class DatabaseToolsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get database statistics\n */\n async getDatabaseStats(): Promise {\n const tables = await this.getTables()\n const stats: DatabaseStats = {\n tables: [],\n totalRows: 0\n }\n\n for (const tableName of tables) {\n try {\n const result = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const rowCount = (result?.count as number) || 0\n \n stats.tables.push({\n name: tableName,\n rowCount\n })\n stats.totalRows += rowCount\n } catch (error) {\n // Skip tables that can't be counted (might be views or system tables)\n console.warn(`Could not count rows in table ${tableName}:`, error)\n }\n }\n\n return stats\n }\n\n /**\n * Get all tables in the database\n */\n private async getTables(): Promise {\n const result = await this.db.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='table' \n AND name NOT LIKE 'sqlite_%'\n ORDER BY name\n `).all()\n\n return result.results?.map((row: any) => row.name) || []\n }\n\n /**\n * Truncate all data except admin user\n */\n async truncateAllData(adminEmail: string): Promise {\n const errors: string[] = []\n const tablesCleared: string[] = []\n let adminUserPreserved = false\n\n try {\n // First, preserve the admin user data\n const adminUser = await this.db.prepare(\n 'SELECT * FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n if (!adminUser) {\n return {\n success: false,\n message: 'Admin user not found. Operation cancelled for safety.',\n tablesCleared: [],\n adminUserPreserved: false,\n errors: ['Admin user not found']\n }\n }\n\n // Define tables to truncate (excluding system tables)\n const tablesToTruncate = [\n 'content',\n 'content_versions', \n 'content_workflow_status',\n 'collections',\n 'media',\n 'sessions',\n 'notifications',\n 'api_tokens',\n 'workflow_history',\n 'scheduled_content',\n 'faqs',\n 'faq_categories',\n 'plugins',\n 'plugin_settings',\n 'email_templates',\n 'email_themes'\n ]\n\n // Check which tables exist\n const existingTables = await this.getTables()\n const tablesToClear = tablesToTruncate.filter(table => \n existingTables.includes(table)\n )\n\n // Clear all data except users table\n for (const tableName of tablesToClear) {\n try {\n await this.db.prepare(`DELETE FROM ${tableName}`).run()\n tablesCleared.push(tableName)\n } catch (error) {\n errors.push(`Failed to clear table ${tableName}: ${error}`)\n console.error(`Error clearing table ${tableName}:`, error)\n }\n }\n\n // Clear users table but preserve admin\n try {\n await this.db.prepare('DELETE FROM users WHERE email != ? OR role != ?')\n .bind(adminEmail, 'admin').run()\n \n // Verify admin user still exists\n const verifyAdmin = await this.db.prepare(\n 'SELECT id FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n adminUserPreserved = !!verifyAdmin\n tablesCleared.push('users (non-admin)')\n } catch (error) {\n errors.push(`Failed to clear non-admin users: ${error}`)\n console.error('Error clearing non-admin users:', error)\n }\n\n // Reset auto-increment counters if supported\n try {\n await this.db.prepare('DELETE FROM sqlite_sequence').run()\n } catch (error) {\n // sqlite_sequence might not exist, ignore\n }\n\n const message = errors.length > 0 \n ? `Truncation completed with ${errors.length} errors. ${tablesCleared.length} tables cleared.`\n : `Successfully truncated database. ${tablesCleared.length} tables cleared.`\n\n return {\n success: errors.length === 0,\n message,\n tablesCleared,\n adminUserPreserved,\n errors: errors.length > 0 ? errors : undefined\n }\n\n } catch (error) {\n return {\n success: false,\n message: `Database truncation failed: ${error}`,\n tablesCleared,\n adminUserPreserved,\n errors: [String(error)]\n }\n }\n }\n\n /**\n * Create a backup of current data (simplified version)\n */\n async createBackup(): Promise<{ success: boolean; message: string; backupId?: string }> {\n try {\n const backupId = `backup_${Date.now()}`\n const stats = await this.getDatabaseStats()\n \n // In a real implementation, this would export data to a file or cloud storage\n // For now, we'll just log the stats and return success\n console.log(`Backup ${backupId} created with ${stats.totalRows} total rows`)\n \n return {\n success: true,\n message: `Backup created successfully (${stats.totalRows} rows)`,\n backupId\n }\n } catch (error) {\n return {\n success: false,\n message: `Backup failed: ${error}`\n }\n }\n }\n\n /**\n * Get table data with optional pagination and sorting\n */\n async getTableData(\n tableName: string,\n limit: number = 100,\n offset: number = 0,\n sortColumn?: string,\n sortDirection: 'asc' | 'desc' = 'asc'\n ): Promise {\n try {\n // Validate table name to prevent SQL injection\n const tables = await this.getTables()\n if (!tables.includes(tableName)) {\n throw new Error(`Table ${tableName} not found`)\n }\n\n // Get column names\n const pragmaResult = await this.db.prepare(`PRAGMA table_info(${tableName})`).all()\n const columns = pragmaResult.results?.map((col: any) => col.name) || []\n\n // Validate sort column if provided\n if (sortColumn && !columns.includes(sortColumn)) {\n sortColumn = undefined\n }\n\n // Get total row count\n const countResult = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const totalRows = (countResult?.count as number) || 0\n\n // Build query with optional sorting\n let query = `SELECT * FROM ${tableName}`\n if (sortColumn) {\n query += ` ORDER BY ${sortColumn} ${sortDirection.toUpperCase()}`\n }\n query += ` LIMIT ${limit} OFFSET ${offset}`\n\n // Get paginated data\n const dataResult = await this.db.prepare(query).all()\n\n return {\n tableName,\n columns,\n rows: dataResult.results || [],\n totalRows\n }\n } catch (error) {\n throw new Error(`Failed to fetch table data: ${error}`)\n }\n }\n\n /**\n * Validate database integrity\n */\n async validateDatabase(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n try {\n // Check critical tables exist\n const requiredTables = ['users', 'content', 'collections']\n const existingTables = await this.getTables()\n\n for (const table of requiredTables) {\n if (!existingTables.includes(table)) {\n issues.push(`Critical table missing: ${table}`)\n }\n }\n\n // Check admin user exists\n const adminCount = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM users WHERE role = ?'\n ).bind('admin').first()\n\n if ((adminCount?.count as number) === 0) {\n issues.push('No admin users found')\n }\n\n // Run SQLite integrity check\n try {\n const integrityResult = await this.db.prepare('PRAGMA integrity_check').first()\n if (integrityResult && (integrityResult as any).integrity_check !== 'ok') {\n issues.push(`Database integrity check failed: ${(integrityResult as any).integrity_check}`)\n }\n } catch (error) {\n issues.push(`Could not run integrity check: ${error}`)\n }\n\n } catch (error) {\n issues.push(`Validation error: ${error}`)\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface DatabaseTablePageData {\n user?: {\n name: string\n email: string\n role: string\n }\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n currentPage: number\n pageSize: number\n sortColumn?: string\n sortDirection?: 'asc' | 'desc'\n}\n\nexport function renderDatabaseTablePage(data: DatabaseTablePageData): string {\n const totalPages = Math.ceil(data.totalRows / data.pageSize)\n const startRow = (data.currentPage - 1) * data.pageSize + 1\n const endRow = Math.min(data.currentPage * data.pageSize, data.totalRows)\n\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n Back to Database Tools\n \n
\n

Table: ${data.tableName}

\n

\n Showing ${startRow.toLocaleString()} - ${endRow.toLocaleString()} of ${data.totalRows.toLocaleString()} rows\n

\n
\n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Refresh\n \n
\n
\n\n \n
\n \n
\n \n \n \n ${data.columns.map(col => `\n \n
\n ${col}\n ${data.sortColumn === col ? `\n \n \n \n ` : `\n \n \n \n `}\n
\n \n `).join('')}\n
\n \n \n ${data.rows.length > 0\n ? data.rows.map((row, idx) => `\n \n ${data.columns.map(col => `\n \n `).join('')}\n \n `).join('')\n : `\n \n \n \n `\n }\n \n
\n ${formatCellValue(row[col])}\n
\n \n \n \n

No data in this table

\n
\n
\n\n \n ${totalPages > 1 ? `\n
\n
\n \n Previous\n \n \n Next\n \n
\n
\n
\n

\n Page ${data.currentPage} of ${totalPages}\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Table: ${data.tableName}`,\n pageTitle: `Database: ${data.tableName}`,\n currentPath: `/admin/database-tools/tables/${data.tableName}`,\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction generatePageNumbers(currentPage: number, totalPages: number): string {\n const pages: number[] = []\n const maxVisible = 7\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (currentPage <= 4) {\n for (let i = 1; i <= 5; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n } else if (currentPage >= totalPages - 3) {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = totalPages - 4; i <= totalPages; i++) pages.push(i)\n } else {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n }\n }\n\n return pages.map(page => {\n if (page === -1) {\n return `\n \n ...\n \n `\n }\n\n const isActive = page === currentPage\n return `\n \n ${page}\n \n `\n }).join('')\n}\n\nfunction escapeHtml(text: string): string {\n const map: Record = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }\n return String(text).replace(/[&<>\"']/g, m => map[m] || m)\n}\n\nfunction formatCellValue(value: any): string {\n if (value === null || value === undefined) {\n return 'null'\n }\n if (typeof value === 'boolean') {\n return `${value}`\n }\n if (typeof value === 'object') {\n return '' + JSON.stringify(value).substring(0, 50) + (JSON.stringify(value).length > 50 ? '...' : '') + ''\n }\n const str = String(value)\n if (str.length > 100) {\n return escapeHtml(str.substring(0, 100)) + '...'\n }\n return escapeHtml(str)\n}\n","import { Hono } from 'hono'\nimport { DatabaseToolsService } from './services/database-service'\nimport { renderDatabaseTablePage, DatabaseTablePageData } from '../../../templates/pages/admin-database-table.template'\nimport { requireAuth } from '../../../middleware'\n\ntype Bindings = {\n DB: D1Database\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport function createDatabaseToolsAdminRoutes() {\n const router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Apply authentication middleware\n router.use('*', requireAuth())\n\n // Get database statistics\n router.get('/api/stats', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const stats = await service.getDatabaseStats()\n\n return c.json({\n success: true,\n data: stats\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({ \n success: false, \n error: 'Failed to fetch database statistics' \n }, 500)\n }\n })\n\n // Truncate all data except admin user\n router.post('/api/truncate', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const body = await c.req.json()\n const { confirmText } = body\n\n // Require confirmation text for safety\n if (confirmText !== 'TRUNCATE ALL DATA') {\n return c.json({\n success: false,\n error: 'Invalid confirmation text. Operation cancelled.'\n }, 400)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.truncateAllData(user.email)\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n tablesCleared: result.tablesCleared,\n adminUserPreserved: result.adminUserPreserved,\n errors: result.errors\n }\n })\n } catch (error) {\n console.error('Error truncating database:', error)\n return c.json({ \n success: false, \n error: 'Failed to truncate database' \n }, 500)\n }\n })\n\n // Create backup\n router.post('/api/backup', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.createBackup()\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n backupId: result.backupId\n }\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({ \n success: false, \n error: 'Failed to create backup' \n }, 500)\n }\n })\n\n // Validate database\n router.get('/api/validate', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const validation = await service.validateDatabase()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n })\n\n // Get table data (API endpoint)\n router.get('/api/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const tableName = c.req.param('tableName')\n const limit = parseInt(c.req.query('limit') || '100')\n const offset = parseInt(c.req.query('offset') || '0')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, limit, offset, sortColumn, sortDirection)\n\n return c.json({\n success: true,\n data: tableData\n })\n } catch (error) {\n console.error('Error fetching table data:', error)\n return c.json({\n success: false,\n error: `Failed to fetch table data: ${error}`\n }, 500)\n }\n })\n\n // View table data page\n router.get('/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.redirect('/admin/login')\n }\n\n const tableName = c.req.param('tableName')\n const page = parseInt(c.req.query('page') || '1')\n const pageSize = parseInt(c.req.query('pageSize') || '20')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const offset = (page - 1) * pageSize\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, pageSize, offset, sortColumn, sortDirection)\n\n const pageData: DatabaseTablePageData = {\n user: {\n name: user.email.split('@')[0] || 'Unknown',\n email: user.email,\n role: user.role\n },\n tableName: tableData.tableName,\n columns: tableData.columns,\n rows: tableData.rows,\n totalRows: tableData.totalRows,\n currentPage: page,\n pageSize: pageSize,\n sortColumn: sortColumn,\n sortDirection: sortDirection\n }\n\n return c.html(renderDatabaseTablePage(pageData))\n } catch (error) {\n console.error('Error rendering table page:', error)\n return c.text(`Error: ${error}`, 500)\n }\n })\n\n return router\n}","import type { D1Database } from '@cloudflare/workers-types'\n\nexport class SeedDataService {\n constructor(private db: D1Database) {}\n\n // First names for generating realistic users\n private firstNames = [\n 'Emma', 'Liam', 'Olivia', 'Noah', 'Ava', 'Ethan', 'Sophia', 'Mason',\n 'Isabella', 'William', 'Mia', 'James', 'Charlotte', 'Benjamin', 'Amelia',\n 'Lucas', 'Harper', 'Henry', 'Evelyn', 'Alexander'\n ]\n\n // Last names for generating realistic users\n private lastNames = [\n 'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis',\n 'Rodriguez', 'Martinez', 'Hernandez', 'Lopez', 'Gonzalez', 'Wilson', 'Anderson',\n 'Thomas', 'Taylor', 'Moore', 'Jackson', 'Martin'\n ]\n\n // Content titles for blog posts\n private blogTitles = [\n 'Getting Started with Modern Web Development',\n 'The Future of JavaScript Frameworks',\n 'Building Scalable Applications with Microservices',\n 'Understanding TypeScript: A Complete Guide',\n 'Best Practices for API Design',\n 'Introduction to Cloud Computing',\n 'Mastering Git and Version Control',\n 'The Art of Code Review',\n 'Performance Optimization Techniques',\n 'Security Best Practices for Web Apps',\n 'Exploring Serverless Architecture',\n 'Database Design Fundamentals',\n 'Testing Strategies for Modern Apps',\n 'CI/CD Pipeline Implementation',\n 'Mobile-First Development Approach'\n ]\n\n // Content titles for pages\n private pageTitles = [\n 'About Us', 'Contact', 'Privacy Policy', 'Terms of Service',\n 'FAQ', 'Our Team', 'Careers', 'Press Kit',\n 'Support', 'Documentation', 'Pricing', 'Features'\n ]\n\n // Content titles for products\n private productTitles = [\n 'Premium Wireless Headphones',\n 'Smart Watch Pro',\n 'Laptop Stand Adjustable',\n 'Mechanical Keyboard RGB',\n 'HD Webcam 4K',\n 'USB-C Hub 7-in-1',\n 'Portable SSD 1TB',\n 'Wireless Mouse Ergonomic',\n 'Monitor 27\" 4K',\n 'Desk Lamp LED',\n 'Phone Case Premium',\n 'Tablet Stand Aluminum',\n 'Cable Management Kit',\n 'Power Bank 20000mAh',\n 'Bluetooth Speaker Portable'\n ]\n\n // Content for generating blog posts\n private blogContent = [\n 'This comprehensive guide covers everything you need to know about modern development practices and tools.',\n 'Learn the fundamentals and advanced concepts that will help you build better applications.',\n 'Discover the latest trends and best practices used by industry professionals.',\n 'A deep dive into the technologies and methodologies shaping the future of software development.',\n 'Practical tips and real-world examples to improve your development workflow.',\n 'Explore cutting-edge techniques and proven strategies for building robust applications.',\n 'Master the essential skills needed to excel in modern software development.',\n 'An in-depth look at the tools and frameworks that power today\\'s web applications.',\n 'Step-by-step instructions and expert insights for developers of all levels.',\n 'Understanding the core principles that drive successful software projects.'\n ]\n\n // Generate a random ID\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n\n // Generate a slug from a title\n private generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n }\n\n // Generate random date within the last year\n private randomDate(): Date {\n const now = new Date()\n const yearAgo = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate())\n const randomTime = yearAgo.getTime() + Math.random() * (now.getTime() - yearAgo.getTime())\n return new Date(randomTime)\n }\n\n // Create 20 example users\n async createUsers(): Promise {\n const roles = ['admin', 'editor', 'author', 'viewer']\n // const hashedPassword = await bcrypt.hash('password123', 10)\n const hashedPassword = 'password123' // TODO: Use actual bcrypt hash\n\n let count = 0\n for (let i = 0; i < 20; i++) {\n const firstName = this.firstNames[Math.floor(Math.random() * this.firstNames.length)] || 'John'\n const lastName = this.lastNames[Math.floor(Math.random() * this.lastNames.length)] || 'Doe'\n const username = `${firstName.toLowerCase()}${lastName.toLowerCase()}${i}`\n const email = `${username}@example.com`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n\n const stmt = this.db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, last_login_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n email,\n username,\n firstName,\n lastName,\n hashedPassword,\n roles[Math.floor(Math.random() * roles.length)],\n Math.random() > 0.1 ? 1 : 0, // 90% active\n Math.random() > 0.3 ? createdAtTimestamp : null,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Create 200 content items across different types\n async createContent(): Promise {\n // Get all users and collections\n const usersStmt = this.db.prepare('SELECT * FROM users')\n const { results: allUsers } = await usersStmt.all()\n\n const collectionsStmt = this.db.prepare('SELECT * FROM collections')\n const { results: allCollections } = await collectionsStmt.all()\n\n if (!allUsers || allUsers.length === 0) {\n throw new Error('No users found. Please create users first.')\n }\n\n if (!allCollections || allCollections.length === 0) {\n throw new Error('No collections found. Please create collections first.')\n }\n\n const statuses = ['draft', 'published', 'archived']\n\n // Create 200 content items\n let count = 0\n for (let i = 0; i < 200; i++) {\n const collection: any = allCollections[Math.floor(Math.random() * allCollections.length)]\n const author: any = allUsers[Math.floor(Math.random() * allUsers.length)]\n const status = statuses[Math.floor(Math.random() * statuses.length)]\n\n let title: string\n let contentData: any\n\n // Generate content based on collection type\n if (collection.name === 'blog_posts' || collection.name.includes('blog')) {\n title = this.blogTitles[Math.floor(Math.random() * this.blogTitles.length)] || 'Untitled Blog Post'\n contentData = {\n body: this.blogContent[Math.floor(Math.random() * this.blogContent.length)] || 'Blog content here',\n excerpt: 'A brief introduction to this article that provides an overview of the main topics covered.',\n tags: this.generateTags(),\n featured: Math.random() > 0.7\n }\n } else if (collection.name === 'pages' || collection.name.includes('page')) {\n title = this.pageTitles[Math.floor(Math.random() * this.pageTitles.length)] || 'Untitled Page'\n contentData = {\n body: 'This is a standard page with important information about our services and policies.',\n template: 'default',\n showInMenu: Math.random() > 0.5\n }\n } else if (collection.name === 'products' || collection.name.includes('product')) {\n title = this.productTitles[Math.floor(Math.random() * this.productTitles.length)] || 'Untitled Product'\n contentData = {\n description: 'High-quality product with excellent features and great value for money.',\n price: (Math.random() * 500 + 10).toFixed(2),\n sku: `SKU-${Math.random().toString(36).substr(2, 9).toUpperCase()}`,\n inStock: Math.random() > 0.2,\n rating: (Math.random() * 2 + 3).toFixed(1) // 3.0 - 5.0\n }\n } else {\n // Generic content\n title = `${collection.display_name || collection.name} Item ${i + 1}`\n contentData = {\n description: 'This is a sample content item with generic data.',\n value: Math.floor(Math.random() * 1000)\n }\n }\n\n const slug = `${this.generateSlug(title)}-${i}`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n const publishedAtTimestamp = status === 'published' ? createdAtTimestamp : null\n\n const stmt = this.db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, published_at, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n collection.id,\n slug,\n `${title} ${i}`,\n JSON.stringify(contentData),\n status,\n publishedAtTimestamp,\n author.id,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Generate random tags for blog posts\n private generateTags(): string[] {\n const allTags = [\n 'tutorial', 'guide', 'javascript', 'typescript', 'web-dev',\n 'backend', 'frontend', 'best-practices', 'security', 'performance',\n 'testing', 'deployment', 'cloud', 'database', 'api'\n ]\n\n const numTags = Math.floor(Math.random() * 4) + 1 // 1-4 tags\n const shuffled = allTags.sort(() => 0.5 - Math.random())\n return shuffled.slice(0, numTags)\n }\n\n // Seed all data\n async seedAll(): Promise<{ users: number; content: number }> {\n const userCount = await this.createUsers()\n const contentCount = await this.createContent()\n\n return {\n users: userCount,\n content: contentCount\n }\n }\n\n // Clear all seed data (optional cleanup method)\n async clearSeedData(): Promise {\n // Delete content first (due to foreign key constraints)\n const deleteContentStmt = this.db.prepare('DELETE FROM content')\n await deleteContentStmt.run()\n\n // Delete users (but keep admin users)\n const deleteUsersStmt = this.db.prepare(\n \"DELETE FROM users WHERE role != 'admin'\"\n )\n await deleteUsersStmt.run()\n }\n}\n","import { Hono } from 'hono'\nimport { SeedDataService } from './services/seed-data-service'\n\ntype Bindings = {\n DB: D1Database\n}\n\nexport function createSeedDataAdminRoutes() {\n const routes = new Hono<{ Bindings: Bindings }>()\n\n // Get seed data status/info\n routes.get('/', async (c) => {\n const html = `\n \n \n \n Seed Data - SonicJS Admin\n \n \n \n \n \n
\n ← Back to Plugin Settings\n

🌱 Seed Data Generator

\n

\n Generate realistic example data for testing and development. This will create 20 users and 200 content items with realistic data.\n

\n\n
\n ⚠️ Warning: This will create new data in your database. Make sure you're not running this in production!\n
\n\n
\n
\n\n
\n

What will be created?

\n
    \n
  • 20 Users: With realistic names, emails, and various roles (admin, editor, author, viewer)
  • \n
  • 200 Content Items: Including blog posts, pages, and products with realistic titles and data
  • \n
  • All passwords: Set to \"password123\" for testing
  • \n
  • Random dates: Created within the last year
  • \n
  • Various statuses: Draft, published, and archived content
  • \n
\n
\n\n
\n

Generate Seed Data

\n

Click the button below to generate example data. This may take a few moments.

\n \n
\n\n
\n

Clear Seed Data

\n

Remove all users and content from the database (except admin users).

\n \n
\n
\n\n \n \n \n `\n return c.html(html)\n })\n\n // Generate seed data\n routes.post('/generate', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n const result = await seedService.seedAll()\n\n return c.json({\n success: true,\n users: result.users,\n content: result.content\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n // Clear seed data\n routes.post('/clear', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n await seedService.clearSeedData()\n\n return c.json({\n success: true\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n return routes\n}\n","/**\n * Email Plugin\n *\n * Send transactional emails using Resend\n * Handles registration, verification, password reset, and one-time codes\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\nexport function createEmailPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'email',\n version: '1.0.0-beta.1',\n description: 'Send transactional emails using Resend'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Create the Email Settings route (POST only - GET is handled by generic plugin settings page)\n const emailRoutes = new Hono()\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // POST endpoint for saving settings\n emailRoutes.post('/settings', async (c: any) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n // Update plugin settings in database\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'email'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving email settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n })\n\n // POST endpoint for test email\n emailRoutes.post('/test', async (c: any) => {\n try {\n const db = c.env.DB\n const body = await c.req.json()\n\n // Load settings from database\n const plugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (!plugin?.settings) {\n return c.json({\n success: false,\n error: 'Email settings not configured. Please save your settings first.'\n }, 400)\n }\n\n const settings = JSON.parse(plugin.settings)\n\n // Validate required settings\n if (!settings.apiKey || !settings.fromEmail || !settings.fromName) {\n return c.json({\n success: false,\n error: 'Missing required settings. Please configure API Key, From Email, and From Name.'\n }, 400)\n }\n\n // Use provided email or fallback to fromEmail\n const toEmail = body.toEmail || settings.fromEmail\n\n // Validate email format\n if (!toEmail.match(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)) {\n return c.json({\n success: false,\n error: 'Invalid email address format'\n }, 400)\n }\n\n // Send test email via Resend API\n const response = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${settings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${settings.fromName} <${settings.fromEmail}>`,\n to: [toEmail],\n subject: 'Test Email from SonicJS',\n html: `\n
\n

Test Email Successful! 🎉

\n

This is a test email from your SonicJS Email plugin.

\n

Configuration:

\n
    \n
  • From: ${settings.fromName} <${settings.fromEmail}>
  • \n
  • Reply-To: ${settings.replyTo || 'Not set'}
  • \n
  • Sent at: ${new Date().toISOString()}
  • \n
\n

Your email settings are working correctly!

\n
\n `,\n reply_to: settings.replyTo || settings.fromEmail\n })\n })\n\n const data = await response.json() as any\n\n if (!response.ok) {\n console.error('Resend API error:', data)\n return c.json({\n success: false,\n error: data.message || 'Failed to send test email. Check your API key and domain verification.'\n }, response.status)\n }\n\n return c.json({\n success: true,\n message: `Test email sent successfully to ${toEmail}`,\n emailId: data.id\n })\n\n } catch (error: any) {\n console.error('Test email error:', error)\n return c.json({\n success: false,\n error: error.message || 'An error occurred while sending test email'\n }, 500)\n }\n })\n\n // Register the route\n builder.addRoute('/admin/plugins/email', emailRoutes, {\n description: 'Email plugin settings',\n requiresAuth: true,\n priority: 80\n })\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('Email', '/admin/plugins/email', {\n icon: 'envelope',\n order: 80,\n permissions: ['email:manage']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Email plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Email plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const emailPlugin = createEmailPlugin()\n","/**\n * OTP Service\n * Handles OTP code generation, verification, and management\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\nexport interface OTPSettings {\n codeLength: number\n codeExpiryMinutes: number\n maxAttempts: number\n rateLimitPerHour: number\n allowNewUserRegistration: boolean\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nexport interface OTPCode {\n id: string\n user_email: string\n code: string\n expires_at: number\n used: number\n used_at: number | null\n ip_address: string | null\n user_agent: string | null\n attempts: number\n created_at: number\n}\n\nexport class OTPService {\n constructor(private db: D1Database) {}\n\n /**\n * Generate a secure random OTP code\n */\n generateCode(length: number = 6): string {\n const digits = '0123456789'\n let code = ''\n\n for (let i = 0; i < length; i++) {\n const randomValues = new Uint8Array(1)\n crypto.getRandomValues(randomValues)\n const randomValue = randomValues[0] ?? 0\n code += digits[randomValue % digits.length]\n }\n\n return code\n }\n\n /**\n * Create and store a new OTP code\n */\n async createOTPCode(\n email: string,\n settings: OTPSettings,\n ipAddress?: string,\n userAgent?: string\n ): Promise {\n const code = this.generateCode(settings.codeLength)\n const id = crypto.randomUUID()\n const now = Date.now()\n const expiresAt = now + (settings.codeExpiryMinutes * 60 * 1000)\n\n const otpCode: OTPCode = {\n id,\n user_email: email.toLowerCase(),\n code,\n expires_at: expiresAt,\n used: 0,\n used_at: null,\n ip_address: ipAddress || null,\n user_agent: userAgent || null,\n attempts: 0,\n created_at: now\n }\n\n await this.db.prepare(`\n INSERT INTO otp_codes (\n id, user_email, code, expires_at, used, used_at,\n ip_address, user_agent, attempts, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n otpCode.id,\n otpCode.user_email,\n otpCode.code,\n otpCode.expires_at,\n otpCode.used,\n otpCode.used_at,\n otpCode.ip_address,\n otpCode.user_agent,\n otpCode.attempts,\n otpCode.created_at\n ).run()\n\n return otpCode\n }\n\n /**\n * Verify an OTP code\n */\n async verifyCode(\n email: string,\n code: string,\n settings: OTPSettings\n ): Promise<{ valid: boolean; attemptsRemaining?: number; error?: string }> {\n const normalizedEmail = email.toLowerCase()\n const now = Date.now()\n\n // Find the most recent unused code for this email\n const otpCode = await this.db.prepare(`\n SELECT * FROM otp_codes\n WHERE user_email = ? AND code = ? AND used = 0\n ORDER BY created_at DESC\n LIMIT 1\n `).bind(normalizedEmail, code).first() as OTPCode | null\n\n if (!otpCode) {\n return { valid: false, error: 'Invalid or expired code' }\n }\n\n // Check if expired\n if (now > otpCode.expires_at) {\n return { valid: false, error: 'Code has expired' }\n }\n\n // Check attempts\n if (otpCode.attempts >= settings.maxAttempts) {\n return { valid: false, error: 'Maximum attempts exceeded' }\n }\n\n // Code is valid - mark as used\n await this.db.prepare(`\n UPDATE otp_codes\n SET used = 1, used_at = ?, attempts = attempts + 1\n WHERE id = ?\n `).bind(now, otpCode.id).run()\n\n return { valid: true }\n }\n\n /**\n * Increment failed attempt count\n */\n async incrementAttempts(email: string, code: string): Promise {\n const normalizedEmail = email.toLowerCase()\n\n const result = await this.db.prepare(`\n UPDATE otp_codes\n SET attempts = attempts + 1\n WHERE user_email = ? AND code = ? AND used = 0\n RETURNING attempts\n `).bind(normalizedEmail, code).first() as { attempts: number } | null\n\n return result?.attempts || 0\n }\n\n /**\n * Check rate limiting\n */\n async checkRateLimit(email: string, settings: OTPSettings): Promise {\n const normalizedEmail = email.toLowerCase()\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n\n const result = await this.db.prepare(`\n SELECT COUNT(*) as count\n FROM otp_codes\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as { count: number } | null\n\n const count = result?.count || 0\n return count < settings.rateLimitPerHour\n }\n\n /**\n * Get recent OTP requests for activity log\n */\n async getRecentRequests(limit: number = 50): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM otp_codes\n ORDER BY created_at DESC\n LIMIT ?\n `).bind(limit).all()\n\n const rows = (result.results || []) as Record[]\n return rows.map(row => this.mapRowToOTP(row))\n }\n\n /**\n * Clean up expired codes (for maintenance)\n */\n async cleanupExpiredCodes(): Promise {\n const now = Date.now()\n\n const result = await this.db.prepare(`\n DELETE FROM otp_codes\n WHERE expires_at < ? OR (used = 1 AND used_at < ?)\n `).bind(now, now - (30 * 24 * 60 * 60 * 1000)).run() // Keep used codes for 30 days\n\n return result.meta.changes || 0\n }\n\n private mapRowToOTP(row: Record): OTPCode {\n return {\n id: String(row.id),\n user_email: String(row.user_email),\n code: String(row.code),\n expires_at: Number(row.expires_at ?? Date.now()),\n used: Number(row.used ?? 0),\n used_at: row.used_at === null || row.used_at === undefined ? null : Number(row.used_at),\n ip_address: typeof row.ip_address === 'string' ? row.ip_address : null,\n user_agent: typeof row.user_agent === 'string' ? row.user_agent : null,\n attempts: Number(row.attempts ?? 0),\n created_at: Number(row.created_at ?? Date.now())\n }\n }\n\n /**\n * Get OTP statistics\n */\n async getStats(days: number = 7): Promise<{\n total: number\n successful: number\n failed: number\n expired: number\n }> {\n const since = Date.now() - (days * 24 * 60 * 60 * 1000)\n\n const stats = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as successful,\n SUM(CASE WHEN attempts >= 3 AND used = 0 THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN expires_at < ? AND used = 0 THEN 1 ELSE 0 END) as expired\n FROM otp_codes\n WHERE created_at > ?\n `).bind(Date.now(), since).first() as any\n\n return {\n total: stats?.total || 0,\n successful: stats?.successful || 0,\n failed: stats?.failed || 0,\n expired: stats?.expired || 0\n }\n }\n}\n","/**\n * OTP Email Templates\n * HTML and plain text templates for OTP codes\n */\n\nexport interface OTPEmailData {\n code: string\n expiryMinutes: number\n codeLength: number\n maxAttempts: number\n email: string\n ipAddress?: string\n timestamp: string\n appName: string\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nfunction sanitizeColor(value?: string): string {\n if (!value) return ''\n // Allow #rgb, #rrggbb, #rrggbbaa, named colors, rgb()/rgba()/hsl()/hsla()\n if (/^#[0-9a-fA-F]{3,8}$/.test(value)) return value\n if (/^[a-zA-Z]+$/.test(value)) return value\n if (/^(rgb|rgba|hsl|hsla)\\([0-9.,\\s%]+\\)$/.test(value)) return value\n return ''\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport function renderOTPEmailHTML(data: OTPEmailData): string {\n const logoUrl = data.logoUrl ? escapeHtml(data.logoUrl) : ''\n const loginUrl = data.loginUrl ? escapeHtml(data.loginUrl) : ''\n const appName = escapeHtml(data.appName)\n const loginButtonText = escapeHtml(\n (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n )\n const logoWidth = Math.max(20, Math.min(600, Number(data.logoWidth) || 150))\n const logoBorderWidth = Math.max(0, Math.min(20, Number(data.logoBorderWidth) || 0))\n const logoBorderColor = sanitizeColor(data.logoBorderColor)\n const logoBorderStyle = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${logoBorderColor}; border-radius: 8px;`\n : ''\n\n return `\n\n\n \n \n Your Login Code\n\n\n\n
\n\n ${logoUrl ? `\n
\n \"${appName}\"\n
\n ` : ''}\n\n
\n

Your Login Code

\n

Enter this code to sign in to ${appName}

\n
\n\n
\n
\n
\n ${data.code}\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${data.expiryMinutes} minutes\n

\n
\n\n
\n

Quick Tips:

\n
    \n
  • Enter the code exactly as shown (${data.codeLength} digits)
  • \n
  • The code can only be used once
  • \n
  • You have ${data.maxAttempts} attempts to enter the correct code
  • \n
  • Request a new code if this one expires
  • \n
\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${appName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n\n
\n

\n Didn't request this code?
\n Someone may have entered your email by mistake. You can safely ignore this email.\n

\n\n
\n

This email was sent to ${escapeHtml(data.email)}

\n ${data.ipAddress ? `

IP Address: ${escapeHtml(data.ipAddress)}

` : ''}\n

Time: ${escapeHtml(data.timestamp)}

\n
\n
\n\n
\n\n
\n

© ${new Date().getFullYear()} ${appName}. All rights reserved.

\n
\n\n\n`\n}\n\nexport function renderOTPEmailText(data: OTPEmailData): string {\n const ctaLabel = (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n return `Your Login Code for ${data.appName}\n\nYour one-time verification code is:\n\n${data.code}\n\nThis code expires in ${data.expiryMinutes} minutes.\n${data.loginUrl ? `\\n${ctaLabel}: ${data.loginUrl}\\n` : ''}\n\nQuick Tips:\n• Enter the code exactly as shown (${data.codeLength} digits)\n• The code can only be used once\n• You have ${data.maxAttempts} attempts to enter the correct code\n• Request a new code if this one expires\n\nSecurity Notice:\nNever share this code with anyone. ${data.appName} will never ask you for this code via phone, email, or social media.\n\nDidn't request this code?\nSomeone may have entered your email by mistake. You can safely ignore this email.\n\n---\nThis email was sent to ${data.email}\n${data.ipAddress ? `IP Address: ${data.ipAddress}` : ''}\nTime: ${data.timestamp}\n\n© ${new Date().getFullYear()} ${data.appName}. All rights reserved.`\n}\n\nexport function renderOTPEmail(data: OTPEmailData): { html: string; text: string } {\n return {\n html: renderOTPEmailHTML(data),\n text: renderOTPEmailText(data)\n }\n}\n","/**\n * OTP Login Plugin\n *\n * Passwordless authentication via email one-time codes\n * Users receive a secure 6-digit code to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { setCookie } from 'hono/cookie'\nimport { z } from 'zod'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\nimport { OTPService, type OTPSettings } from './otp-service'\nimport { renderOTPEmail } from './email-templates'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\nimport { SettingsService } from '../../../services/settings'\nimport { getCustomData } from '../user-profiles'\n\n// Validation schemas\nconst otpRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nconst otpVerifySchema = z.object({\n email: z.string().email('Valid email is required'),\n code: z.string().min(4).max(8)\n})\n\n// Default settings (site name comes from general settings)\nconst DEFAULT_SETTINGS: OTPSettings = {\n codeLength: 6,\n codeExpiryMinutes: 10,\n maxAttempts: 3,\n rateLimitPerHour: 5,\n allowNewUserRegistration: false,\n logoUrl: '',\n logoWidth: 150,\n logoBorderWidth: 0,\n logoBorderColor: '#ffffff',\n loginUrl: '',\n loginButtonText: ''\n}\n\nexport function createOTPLoginPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'otp-login',\n version: '1.0.0-beta.1',\n description: 'Passwordless authentication via email one-time codes'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== API Routes ====================\n\n const otpAPI = new Hono()\n\n // POST /auth/otp/request - Request OTP code\n otpAPI.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings: OTPSettings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Get site name from general settings\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName\n\n // Check rate limiting\n const canRequest = await otpService.checkRateLimit(normalizedEmail, settings)\n if (!canRequest) {\n return c.json({\n error: 'Too many requests. Please try again in an hour.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && !settings.allowNewUserRegistration) {\n // Don't reveal if user exists or not (security)\n return c.json({\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Get IP and user agent\n const ipAddress = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n\n // Create OTP code\n const otpCode = await otpService.createOTPCode(\n normalizedEmail,\n settings,\n ipAddress,\n userAgent\n )\n\n // Send email via Email plugin\n try {\n const isDevMode = c.env.ENVIRONMENT === 'development'\n\n if (isDevMode) {\n console.log(`[DEV] OTP Code for ${normalizedEmail}: ${otpCode.code}`)\n }\n\n // Prepare email content\n const emailContent = renderOTPEmail({\n code: otpCode.code,\n expiryMinutes: settings.codeExpiryMinutes,\n codeLength: settings.codeLength,\n maxAttempts: settings.maxAttempts,\n email: normalizedEmail,\n ipAddress,\n timestamp: new Date().toISOString(),\n appName: siteName,\n logoUrl: settings.logoUrl || '',\n logoWidth: settings.logoWidth,\n logoBorderWidth: settings.logoBorderWidth,\n logoBorderColor: settings.logoBorderColor || '',\n loginUrl: settings.loginUrl || '',\n loginButtonText: settings.loginButtonText || ''\n })\n\n // Load email plugin settings from database\n // Note: We don't check status='active' because the email plugin's\n // settings UI works regardless of status, so we follow the same pattern\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (emailPlugin?.settings) {\n const emailSettings = JSON.parse(emailPlugin.settings)\n\n if (emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName) {\n // Send email via Resend API\n const emailResponse = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${emailSettings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${emailSettings.fromName} <${emailSettings.fromEmail}>`,\n to: [normalizedEmail],\n subject: `Your login code for ${siteName}`,\n html: emailContent.html,\n text: emailContent.text,\n reply_to: emailSettings.replyTo || emailSettings.fromEmail\n })\n })\n\n if (!emailResponse.ok) {\n const errorData = await emailResponse.json() as { message?: string }\n console.error('Failed to send OTP email via Resend:', errorData)\n // Don't expose error to user for security - just log it\n }\n } else {\n console.warn('Email plugin is not fully configured (missing apiKey, fromEmail, or fromName)')\n }\n } else {\n console.warn('Email plugin is not active or has no settings configured')\n }\n\n const response: any = {\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n }\n\n // In development, include the code\n if (isDevMode) {\n response.dev_code = otpCode.code\n }\n\n return c.json(response)\n } catch (emailError) {\n console.error('Error sending OTP email:', emailError)\n return c.json({\n error: 'Failed to send verification code. Please try again.'\n }, 500)\n }\n } catch (error) {\n console.error('OTP request error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/verify - Verify OTP code\n otpAPI.post('/verify', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpVerifySchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email, code } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Verify the code\n const verification = await otpService.verifyCode(normalizedEmail, code, settings)\n\n if (!verification.valid) {\n // Increment attempts on failure\n await otpService.incrementAttempts(normalizedEmail, code)\n\n return c.json({\n error: verification.error || 'Invalid code',\n attemptsRemaining: verification.attemptsRemaining\n }, 401)\n }\n\n // Code is valid - get user\n let user = await db.prepare(`\n SELECT id, email, username, first_name, last_name, role, is_active, created_at\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && settings.allowNewUserRegistration) {\n // Auto-create new user on first OTP verification\n const userId = crypto.randomUUID()\n const now = Date.now()\n const username = normalizedEmail.split('@')[0] + '_' + userId.slice(0, 6)\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, '', '', NULL, 'viewer', 1, 1, ?, ?)\n `).bind(userId, normalizedEmail, username, now, now).run()\n\n user = {\n id: userId,\n email: normalizedEmail,\n username,\n first_name: '',\n last_name: '',\n role: 'viewer',\n is_active: 1,\n created_at: now,\n }\n }\n\n if (!user) {\n return c.json({\n error: 'User not found'\n }, 404)\n }\n\n if (!user.is_active) {\n return c.json({\n error: 'Account is deactivated'\n }, 403)\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env as any)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, (c.env as any).JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n const customData = await getCustomData(db, user.id)\n const { is_active: _isActive, ...publicUser } = user\n\n return c.json({\n success: true,\n user: {\n ...publicUser,\n ...customData,\n },\n token,\n message: 'Authentication successful'\n })\n } catch (error) {\n console.error('OTP verify error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/resend - Resend OTP code\n otpAPI.post('/resend', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n // Reuse the request endpoint logic\n return otpAPI.fetch(\n new Request(c.req.url.replace('/resend', '/request'), {\n method: 'POST',\n headers: c.req.raw.headers,\n body: JSON.stringify({ email: validation.data.email })\n }),\n c.env\n )\n } catch (error) {\n console.error('OTP resend error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // Register API routes\n builder.addRoute('/auth/otp', otpAPI, {\n description: 'OTP authentication endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('OTP Login', '/admin/plugins/otp-login', {\n icon: 'key',\n order: 85,\n permissions: ['otp:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OTP Login plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OTP Login plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const otpLoginPlugin = createOTPLoginPlugin()\n","/**\n * OAuth Service\n * Handles OAuth2 authorization code flow, token exchange, and user info fetching.\n * Provider-agnostic — each provider is a simple config object.\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n// ─── Provider Configuration ─────────────────────────────────────────────────\n\nexport interface OAuthProviderConfig {\n id: string\n name: string\n authorizeUrl: string\n tokenUrl: string\n userInfoUrl: string\n scopes: string[]\n /** Map provider profile JSON to a normalized user profile */\n mapProfile: (profile: Record) => OAuthUserProfile\n}\n\nexport interface OAuthUserProfile {\n providerAccountId: string\n email: string\n name: string\n avatar?: string\n}\n\nexport interface OAuthPluginSettings {\n providers: Record\n}\n\n// ─── Built-in Providers ─────────────────────────────────────────────────────\n\nexport const GITHUB_PROVIDER: OAuthProviderConfig = {\n id: 'github',\n name: 'GitHub',\n authorizeUrl: 'https://github.com/login/oauth/authorize',\n tokenUrl: 'https://github.com/login/oauth/access_token',\n userInfoUrl: 'https://api.github.com/user',\n scopes: ['read:user', 'user:email'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || profile.login || '',\n avatar: profile.avatar_url || undefined\n })\n}\n\nexport const GOOGLE_PROVIDER: OAuthProviderConfig = {\n id: 'google',\n name: 'Google',\n authorizeUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n scopes: ['openid', 'email', 'profile'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || '',\n avatar: profile.picture || undefined\n })\n}\n\nexport const BUILT_IN_PROVIDERS: Record = {\n github: GITHUB_PROVIDER,\n google: GOOGLE_PROVIDER\n}\n\n// ─── OAuth Account DB Record ────────────────────────────────────────────────\n\nexport interface OAuthAccount {\n id: string\n user_id: string\n provider: string\n provider_account_id: string\n access_token: string | null\n refresh_token: string | null\n token_expires_at: number | null\n profile_data: string | null\n created_at: number\n updated_at: number\n}\n\n// ─── OAuth Service ──────────────────────────────────────────────────────────\n\nexport class OAuthService {\n constructor(private db: D1Database) {}\n\n /**\n * Build the authorization redirect URL for a provider.\n */\n buildAuthorizeUrl(\n provider: OAuthProviderConfig,\n clientId: string,\n redirectUri: string,\n state: string\n ): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope: provider.scopes.join(' '),\n state\n })\n\n // Google requires access_type for refresh tokens\n if (provider.id === 'google') {\n params.set('access_type', 'offline')\n params.set('prompt', 'consent')\n }\n\n return `${provider.authorizeUrl}?${params.toString()}`\n }\n\n /**\n * Exchange authorization code for tokens using native fetch.\n */\n async exchangeCode(\n provider: OAuthProviderConfig,\n clientId: string,\n clientSecret: string,\n code: string,\n redirectUri: string\n ): Promise<{ access_token: string; refresh_token?: string; expires_in?: number }> {\n const body: Record = {\n client_id: clientId,\n client_secret: clientSecret,\n code,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code'\n }\n\n const response = await fetch(provider.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json'\n },\n body: new URLSearchParams(body).toString()\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Token exchange failed (${response.status}): ${errorText}`)\n }\n\n const data = await response.json() as Record\n\n if (data.error) {\n throw new Error(`Token exchange error: ${data.error_description || data.error}`)\n }\n\n return {\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n expires_in: data.expires_in ? Number(data.expires_in) : undefined\n }\n }\n\n /**\n * Fetch user profile from the provider's userinfo endpoint.\n */\n async fetchUserProfile(\n provider: OAuthProviderConfig,\n accessToken: string\n ): Promise {\n const headers: Record = {\n 'Authorization': `Bearer ${accessToken}`,\n 'Accept': 'application/json'\n }\n\n // GitHub uses a different auth header format\n if (provider.id === 'github') {\n headers['Authorization'] = `token ${accessToken}`\n }\n\n const response = await fetch(provider.userInfoUrl, { headers })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch user profile (${response.status})`)\n }\n\n const profile = await response.json() as Record\n\n // For GitHub, email may not be in the profile — fetch from /user/emails\n if (provider.id === 'github' && !profile.email) {\n const emailResponse = await fetch('https://api.github.com/user/emails', {\n headers: {\n 'Authorization': `token ${accessToken}`,\n 'Accept': 'application/json'\n }\n })\n\n if (emailResponse.ok) {\n const emails = await emailResponse.json() as Array<{ email: string; primary: boolean; verified: boolean }>\n const primaryEmail = emails.find(e => e.primary && e.verified)\n if (primaryEmail) {\n profile.email = primaryEmail.email\n }\n }\n }\n\n return provider.mapProfile(profile)\n }\n\n // ─── Database Operations ────────────────────────────────────────────────\n\n /**\n * Find an existing OAuth account link.\n */\n async findOAuthAccount(\n provider: string,\n providerAccountId: string\n ): Promise {\n return await this.db.prepare(`\n SELECT * FROM oauth_accounts\n WHERE provider = ? AND provider_account_id = ?\n `).bind(provider, providerAccountId).first() as OAuthAccount | null\n }\n\n /**\n * Find all OAuth accounts for a user.\n */\n async findUserOAuthAccounts(userId: string): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM oauth_accounts WHERE user_id = ?\n `).bind(userId).all()\n return (result.results || []) as unknown as OAuthAccount[]\n }\n\n /**\n * Create a new OAuth account link.\n */\n async createOAuthAccount(params: {\n userId: string\n provider: string\n providerAccountId: string\n accessToken: string\n refreshToken?: string\n tokenExpiresAt?: number\n profileData?: string\n }): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO oauth_accounts (\n id, user_id, provider, provider_account_id,\n access_token, refresh_token, token_expires_at,\n profile_data, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n params.userId,\n params.provider,\n params.providerAccountId,\n params.accessToken,\n params.refreshToken || null,\n params.tokenExpiresAt || null,\n params.profileData || null,\n now,\n now\n ).run()\n\n return {\n id,\n user_id: params.userId,\n provider: params.provider,\n provider_account_id: params.providerAccountId,\n access_token: params.accessToken,\n refresh_token: params.refreshToken || null,\n token_expires_at: params.tokenExpiresAt || null,\n profile_data: params.profileData || null,\n created_at: now,\n updated_at: now\n }\n }\n\n /**\n * Update tokens for an existing OAuth account.\n */\n async updateOAuthTokens(\n id: string,\n accessToken: string,\n refreshToken?: string,\n tokenExpiresAt?: number\n ): Promise {\n await this.db.prepare(`\n UPDATE oauth_accounts\n SET access_token = ?, refresh_token = ?, token_expires_at = ?, updated_at = ?\n WHERE id = ?\n `).bind(accessToken, refreshToken || null, tokenExpiresAt || null, Date.now(), id).run()\n }\n\n /**\n * Unlink an OAuth account from a user (only if they have another auth method).\n */\n async unlinkOAuthAccount(userId: string, provider: string): Promise {\n // Check user has a password or another OAuth link before unlinking\n const user = await this.db.prepare(`\n SELECT password_hash FROM users WHERE id = ?\n `).bind(userId).first() as { password_hash: string | null } | null\n\n const otherLinks = await this.db.prepare(`\n SELECT COUNT(*) as count FROM oauth_accounts\n WHERE user_id = ? AND provider != ?\n `).bind(userId, provider).first() as { count: number } | null\n\n const hasPassword = !!user?.password_hash\n const hasOtherLinks = (otherLinks?.count || 0) > 0\n\n if (!hasPassword && !hasOtherLinks) {\n return false // Cannot unlink the only auth method\n }\n\n await this.db.prepare(`\n DELETE FROM oauth_accounts WHERE user_id = ? AND provider = ?\n `).bind(userId, provider).run()\n\n return true\n }\n\n /**\n * Find a user by email.\n */\n async findUserByEmail(email: string): Promise<{\n id: string\n email: string\n role: string\n is_active: number\n first_name: string\n last_name: string\n } | null> {\n return await this.db.prepare(`\n SELECT id, email, role, is_active, first_name, last_name\n FROM users WHERE email = ?\n `).bind(email.toLowerCase()).first() as any\n }\n\n /**\n * Create a new user from an OAuth profile.\n */\n async createUserFromOAuth(profile: OAuthUserProfile): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n const email = profile.email.toLowerCase()\n const nameParts = (profile.name || email.split('@')[0] || 'User').split(' ')\n const firstName = nameParts[0] || 'User'\n const lastName = nameParts.slice(1).join(' ') || ''\n const username = email.split('@')[0] || id.substring(0, 8)\n\n // Check for username collision and append random suffix if needed\n const existing = await this.db.prepare(\n 'SELECT id FROM users WHERE username = ?'\n ).bind(username).first()\n\n const finalUsername = existing\n ? `${username}-${id.substring(0, 6)}`\n : username\n\n await this.db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, avatar, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', ?, 1, ?, ?)\n `).bind(\n id, email, finalUsername, firstName, lastName,\n profile.avatar || null, now, now\n ).run()\n\n return id\n }\n\n /**\n * Generate a cryptographically random state parameter for CSRF protection.\n */\n generateState(): string {\n const bytes = new Uint8Array(32)\n crypto.getRandomValues(bytes)\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')\n }\n}\n","/**\n * OAuth Providers Plugin\n *\n * OAuth2/OIDC social login support for SonicJS.\n * Phase 1: Core OAuth2 authorization code flow with GitHub and Google providers.\n *\n * Routes:\n * GET /auth/oauth/:provider → Redirect to provider authorization\n * GET /auth/oauth/:provider/callback → Handle OAuth callback\n * POST /auth/oauth/link → Link OAuth provider to logged-in account\n * POST /auth/oauth/unlink → Unlink OAuth provider from account\n * GET /auth/oauth/accounts → List linked OAuth accounts for current user\n */\n\nimport { Hono } from 'hono'\nimport { setCookie, getCookie } from 'hono/cookie'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport {\n OAuthService,\n BUILT_IN_PROVIDERS,\n type OAuthPluginSettings,\n type OAuthProviderConfig\n} from './oauth-service'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst STATE_COOKIE_NAME = 'oauth_state'\nconst STATE_COOKIE_MAX_AGE = 600 // 10 minutes\n\nexport function createOAuthProvidersPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'oauth-providers',\n version: '1.0.0-beta.1',\n description: 'OAuth2/OIDC social login with GitHub, Google, and more'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== Helper Functions ====================\n\n function getCallbackUrl(c: any, provider: string): string {\n const proto = c.req.header('x-forwarded-proto') || 'https'\n const host = c.req.header('host') || 'localhost'\n return `${proto}://${host}/auth/oauth/${provider}/callback`\n }\n\n async function loadSettings(db: any): Promise {\n const row = await db.prepare(\n `SELECT settings FROM plugins WHERE id = 'oauth-providers'`\n ).first() as { settings: string | null } | null\n\n if (!row?.settings) return null\n\n try {\n return JSON.parse(row.settings) as OAuthPluginSettings\n } catch {\n return null\n }\n }\n\n function getProviderCredentials(\n settings: OAuthPluginSettings | null,\n providerId: string\n ): { clientId: string; clientSecret: string } | null {\n if (!settings?.providers?.[providerId]) return null\n const p = settings.providers[providerId]\n if (!p.enabled || !p.clientId || !p.clientSecret) return null\n return { clientId: p.clientId, clientSecret: p.clientSecret }\n }\n\n // ==================== API Routes ====================\n\n const oauthAPI = new Hono()\n\n // GET /auth/oauth/:provider — Redirect to provider authorization\n oauthAPI.get('/:provider', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.json({ error: `Unknown OAuth provider: ${providerId}` }, 400)\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.json({\n error: `OAuth provider \"${providerId}\" is not configured or not enabled`\n }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Store state in a cookie for CSRF validation on callback\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax', // Lax required for OAuth redirect flow\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n providerConfig,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.redirect(authorizeUrl)\n } catch (error) {\n console.error('OAuth authorize error:', error)\n return c.json({ error: 'Failed to initiate OAuth flow' }, 500)\n }\n })\n\n // GET /auth/oauth/:provider/callback — Handle OAuth callback\n oauthAPI.get('/:provider/callback', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.redirect('/auth/login?error=Unknown OAuth provider')\n }\n\n // Validate state (CSRF protection)\n const stateParam = c.req.query('state')\n const stateCookie = getCookie(c, STATE_COOKIE_NAME)\n\n if (!stateParam || !stateCookie || stateParam !== stateCookie) {\n return c.redirect('/auth/login?error=Invalid OAuth state. Please try again.')\n }\n\n // Clear the state cookie\n setCookie(c, STATE_COOKIE_NAME, '', {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: 0,\n path: '/auth/oauth'\n })\n\n // Check for error from provider\n const errorParam = c.req.query('error')\n if (errorParam) {\n const errorDesc = c.req.query('error_description') || errorParam\n return c.redirect(`/auth/login?error=${encodeURIComponent(errorDesc)}`)\n }\n\n const code = c.req.query('code')\n if (!code) {\n return c.redirect('/auth/login?error=No authorization code received')\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.redirect('/auth/login?error=OAuth provider not configured')\n }\n\n const oauthService = new OAuthService(db)\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Exchange code for tokens\n const tokens = await oauthService.exchangeCode(\n providerConfig,\n creds.clientId,\n creds.clientSecret,\n code,\n redirectUri\n )\n\n // Fetch user profile from provider\n const profile = await oauthService.fetchUserProfile(providerConfig, tokens.access_token)\n\n if (!profile.email) {\n return c.redirect('/auth/login?error=Could not retrieve email from OAuth provider. Please ensure your email is public or grant email permission.')\n }\n\n const tokenExpiresAt = tokens.expires_in\n ? Date.now() + (tokens.expires_in * 1000)\n : null\n\n // Check if this OAuth account is already linked to a user\n const existingOAuth = await oauthService.findOAuthAccount(providerId, profile.providerAccountId)\n\n if (existingOAuth) {\n // Existing OAuth link — update tokens and log in\n await oauthService.updateOAuthTokens(\n existingOAuth.id,\n tokens.access_token,\n tokens.refresh_token,\n tokenExpiresAt ?? undefined\n )\n\n // Fetch user to generate JWT\n const user = await db.prepare(\n 'SELECT id, email, role, is_active FROM users WHERE id = ?'\n ).bind(existingOAuth.user_id).first() as any\n\n if (!user || !user.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n user.id, user.email, user.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // No existing OAuth link — check if user exists by email\n const existingUser = await oauthService.findUserByEmail(profile.email)\n\n if (existingUser) {\n if (!existingUser.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n // Link OAuth to existing account\n await oauthService.createOAuthAccount({\n userId: existingUser.id,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n existingUser.id, existingUser.email, existingUser.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // Brand new user — create account from OAuth profile\n const newUserId = await oauthService.createUserFromOAuth(profile)\n\n await oauthService.createOAuthAccount({\n userId: newUserId,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n newUserId, profile.email.toLowerCase(), 'viewer',\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n\n } catch (error) {\n console.error('OAuth callback error:', error)\n const message = error instanceof Error ? error.message : 'OAuth authentication failed'\n return c.redirect(`/auth/login?error=${encodeURIComponent(message)}`)\n }\n })\n\n // POST /auth/oauth/link — Link an OAuth provider to the current logged-in user\n oauthAPI.post('/link', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider || !BUILT_IN_PROVIDERS[provider]) {\n return c.json({ error: 'Invalid provider' }, 400)\n }\n\n // Redirect the user to the OAuth flow — the callback will auto-link\n // since the user already exists by email\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, provider)\n\n if (!creds) {\n return c.json({ error: `OAuth provider \"${provider}\" is not configured` }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, provider)\n\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n BUILT_IN_PROVIDERS[provider]!,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.json({ redirectUrl: authorizeUrl })\n } catch (error) {\n console.error('OAuth link error:', error)\n return c.json({ error: 'Failed to initiate account linking' }, 500)\n }\n })\n\n // POST /auth/oauth/unlink — Unlink an OAuth provider from the current user\n oauthAPI.post('/unlink', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider) {\n return c.json({ error: 'Provider is required' }, 400)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const success = await oauthService.unlinkOAuthAccount(user.userId, provider)\n\n if (!success) {\n return c.json({\n error: 'Cannot unlink the only authentication method. Set a password first.'\n }, 400)\n }\n\n return c.json({ success: true, message: `${provider} account unlinked` })\n } catch (error) {\n console.error('OAuth unlink error:', error)\n return c.json({ error: 'Failed to unlink account' }, 500)\n }\n })\n\n // GET /auth/oauth/accounts — List linked OAuth accounts for current user\n oauthAPI.get('/accounts', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const accounts = await oauthService.findUserOAuthAccounts(user.userId)\n\n return c.json({\n accounts: accounts.map(a => ({\n provider: a.provider,\n providerAccountId: a.provider_account_id,\n linkedAt: a.created_at\n }))\n })\n } catch (error) {\n console.error('OAuth accounts error:', error)\n return c.json({ error: 'Failed to fetch linked accounts' }, 500)\n }\n })\n\n // Register routes\n builder.addRoute('/auth/oauth', oauthAPI, {\n description: 'OAuth2 social login endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Add menu item for admin settings\n builder.addMenuItem('OAuth Providers', '/admin/plugins/oauth-providers', {\n icon: 'shield',\n order: 86,\n permissions: ['oauth:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OAuth Providers plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OAuth Providers plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const oauthProvidersPlugin = createOAuthProvidersPlugin()\n","/**\n * Embedding Service\n * Generates embeddings using Cloudflare Workers AI\n */\n\nexport class EmbeddingService {\n constructor(private ai: any) {}\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string): Promise {\n try {\n // Use Cloudflare Workers AI embedding model\n // @cf/baai/bge-base-en-v1.5 produces 768-dimensional vectors\n const response = await this.ai.run('@cf/baai/bge-base-en-v1.5', {\n text: this.preprocessText(text)\n })\n\n // Extract embedding vector\n if (response.data && response.data.length > 0) {\n return response.data[0]\n }\n\n throw new Error('No embedding data returned')\n } catch (error) {\n console.error('[EmbeddingService] Error generating embedding:', error)\n throw error\n }\n }\n\n /**\n * Generate embeddings for multiple texts (batch processing)\n */\n async generateBatch(texts: string[]): Promise {\n try {\n // Process in smaller batches to avoid rate limits\n const batchSize = 10\n const batches: string[][] = []\n \n for (let i = 0; i < texts.length; i += batchSize) {\n batches.push(texts.slice(i, i + batchSize))\n }\n\n const allEmbeddings: number[][] = []\n\n for (const batch of batches) {\n const batchEmbeddings = await Promise.all(\n batch.map(text => this.generateEmbedding(text))\n )\n allEmbeddings.push(...batchEmbeddings)\n }\n\n return allEmbeddings\n } catch (error) {\n console.error('[EmbeddingService] Error generating batch embeddings:', error)\n throw error\n }\n }\n\n /**\n * Preprocess text before generating embedding\n * - Trim whitespace\n * - Limit length to avoid token limits\n * - Remove special characters that might cause issues\n */\n private preprocessText(text: string): string {\n if (!text) return ''\n\n // Trim and normalize whitespace\n let processed = text.trim().replace(/\\s+/g, ' ')\n\n // Limit to ~8000 characters (rough token limit)\n if (processed.length > 8000) {\n processed = processed.substring(0, 8000)\n }\n\n return processed\n }\n\n /**\n * Calculate cosine similarity between two embeddings\n */\n cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Embeddings must have same dimensions')\n }\n\n let dotProduct = 0\n let normA = 0\n let normB = 0\n\n for (let i = 0; i < a.length; i++) {\n const aVal = a[i] ?? 0\n const bVal = b[i] ?? 0\n dotProduct += aVal * bVal\n normA += aVal * aVal\n normB += bVal * bVal\n }\n\n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB))\n }\n}\n","/**\n * Chunking Service\n * Splits content into optimal chunks for embedding and search\n */\n\nexport interface ContentChunk {\n id: string\n content_id: string\n collection_id: string\n title: string\n text: string\n chunk_index: number\n metadata: Record\n}\n\nexport class ChunkingService {\n // Default chunk size (in approximate tokens)\n private readonly CHUNK_SIZE = 500\n private readonly CHUNK_OVERLAP = 50\n\n /**\n * Chunk a single content item\n */\n chunkContent(\n contentId: string,\n collectionId: string,\n title: string,\n data: any,\n metadata: Record = {}\n ): ContentChunk[] {\n // Extract all text from content\n const text = this.extractText(data)\n \n if (!text || text.trim().length === 0) {\n console.warn(`[ChunkingService] No text found for content ${contentId}`)\n return []\n }\n\n // Split into chunks\n const textChunks = this.splitIntoChunks(text)\n\n // Create chunk objects\n return textChunks.map((chunkText, index) => ({\n id: `${contentId}_chunk_${index}`,\n content_id: contentId,\n collection_id: collectionId,\n title: title,\n text: chunkText,\n chunk_index: index,\n metadata: {\n ...metadata,\n total_chunks: textChunks.length\n }\n }))\n }\n\n /**\n * Chunk multiple content items\n */\n chunkContentBatch(items: Array<{\n id: string\n collection_id: string\n title: string\n data: any\n metadata?: Record\n }>): ContentChunk[] {\n const allChunks: ContentChunk[] = []\n\n for (const item of items) {\n const chunks = this.chunkContent(\n item.id,\n item.collection_id,\n item.title,\n item.data,\n item.metadata\n )\n allChunks.push(...chunks)\n }\n\n return allChunks\n }\n\n /**\n * Extract all text from content data\n */\n private extractText(data: any): string {\n const parts: string[] = []\n\n // Common text fields\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n if (data.summary) parts.push(String(data.summary))\n\n // Recursively extract from nested objects\n const extractRecursive = (obj: any): void => {\n if (typeof obj === 'string') {\n // Skip very short strings and URLs\n if (obj.length > 10 && !obj.startsWith('http')) {\n parts.push(obj)\n }\n } else if (Array.isArray(obj)) {\n obj.forEach(extractRecursive)\n } else if (obj && typeof obj === 'object') {\n // Skip certain keys\n const skipKeys = ['id', 'slug', 'url', 'image', 'thumbnail', 'metadata']\n \n Object.entries(obj).forEach(([key, value]) => {\n if (!skipKeys.includes(key.toLowerCase())) {\n extractRecursive(value)\n }\n })\n }\n }\n\n extractRecursive(data)\n\n return parts.join('\\n\\n').trim()\n }\n\n /**\n * Split text into overlapping chunks\n */\n private splitIntoChunks(text: string): string[] {\n // Split by words\n const words = text.split(/\\s+/)\n \n if (words.length <= this.CHUNK_SIZE) {\n return [text]\n }\n\n const chunks: string[] = []\n let startIndex = 0\n\n while (startIndex < words.length) {\n // Get chunk with overlap\n const endIndex = Math.min(startIndex + this.CHUNK_SIZE, words.length)\n const chunk = words.slice(startIndex, endIndex).join(' ')\n chunks.push(chunk)\n\n // Move forward by chunk size minus overlap\n startIndex += this.CHUNK_SIZE - this.CHUNK_OVERLAP\n\n // Ensure we don't create a tiny last chunk\n if (startIndex >= words.length - this.CHUNK_OVERLAP) {\n break\n }\n }\n\n return chunks\n }\n\n /**\n * Get optimal chunk size based on content type\n */\n getOptimalChunkSize(contentType: string): number {\n switch (contentType) {\n case 'blog_posts':\n case 'articles':\n return 600 // Larger chunks for long-form content\n case 'products':\n case 'pages':\n return 400 // Medium chunks for structured content\n case 'messages':\n case 'comments':\n return 200 // Small chunks for short content\n default:\n return this.CHUNK_SIZE\n }\n }\n}\n","/**\n * Custom RAG Service\n * Implements full RAG pipeline using Cloudflare Vectorize\n * \n * Fulfills GitHub Issue #362: Advanced search with Cloudflare Search\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { EmbeddingService } from './embedding.service'\nimport { ChunkingService, type ContentChunk } from './chunking.service'\nimport type { SearchQuery, SearchResponse, SearchResult, AISearchSettings } from '../types'\n\nexport class CustomRAGService {\n private embeddingService: EmbeddingService\n private chunkingService: ChunkingService\n\n constructor(\n private db: D1Database,\n private ai: any,\n private vectorize: any\n ) {\n this.embeddingService = new EmbeddingService(ai)\n this.chunkingService = new ChunkingService()\n }\n\n /**\n * Index all content from a collection\n */\n async indexCollection(collectionId: string): Promise<{\n total_items: number\n total_chunks: number\n indexed_chunks: number\n errors: number\n }> {\n console.log(`[CustomRAG] Starting indexing for collection: ${collectionId}`)\n \n try {\n // Get all published content from collection\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.collection_id = ? AND c.status = 'published'\n `)\n .bind(collectionId)\n .all<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n const totalItems = contentItems?.length || 0\n \n if (totalItems === 0) {\n console.log(`[CustomRAG] No content found in collection ${collectionId}`)\n return { total_items: 0, total_chunks: 0, indexed_chunks: 0, errors: 0 }\n }\n\n // Chunk all content\n const items = (contentItems || []).map(item => ({\n id: item.id,\n collection_id: item.collection_id,\n title: item.title || 'Untitled',\n data: typeof item.data === 'string' ? JSON.parse(item.data) : item.data,\n metadata: {\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name\n }\n }))\n\n const chunks = this.chunkingService.chunkContentBatch(items)\n const totalChunks = chunks.length\n\n console.log(`[CustomRAG] Generated ${totalChunks} chunks from ${totalItems} items`)\n\n // Generate embeddings in batches\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n console.log(`[CustomRAG] Generated ${embeddings.length} embeddings`)\n\n // Store in Vectorize\n let indexedChunks = 0\n let errors = 0\n const batchSize = 100\n\n for (let i = 0; i < chunks.length; i += batchSize) {\n const chunkBatch = chunks.slice(i, i + batchSize)\n const embeddingBatch = embeddings.slice(i, i + batchSize)\n\n try {\n await this.vectorize.upsert(\n chunkBatch.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddingBatch[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500), // Store snippet for display\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n indexedChunks += chunkBatch.length\n console.log(`[CustomRAG] Indexed batch ${i / batchSize + 1}: ${chunkBatch.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error indexing batch ${i / batchSize + 1}:`, error)\n errors += chunkBatch.length\n }\n }\n\n console.log(`[CustomRAG] Indexing complete: ${indexedChunks}/${totalChunks} chunks indexed`)\n\n return {\n total_items: totalItems,\n total_chunks: totalChunks,\n indexed_chunks: indexedChunks,\n errors\n }\n } catch (error) {\n console.error(`[CustomRAG] Error indexing collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Search using RAG (semantic search with Vectorize)\n */\n async search(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n\n try {\n console.log(`[CustomRAG] Searching for: \"${query.query}\"`)\n\n // Generate query embedding\n const queryEmbedding = await this.embeddingService.generateEmbedding(query.query)\n\n // Build Vectorize query filters\n const filter: any = {}\n \n if (query.filters?.collections && query.filters.collections.length > 0) {\n filter.collection_id = { $in: query.filters.collections }\n } else if (settings.selected_collections.length > 0) {\n filter.collection_id = { $in: settings.selected_collections }\n }\n\n if (query.filters?.status && query.filters.status.length > 0) {\n filter.status = { $in: query.filters.status }\n }\n\n // Vectorize filters have issues, so we query without filter and manually filter results\n const vectorResults = await this.vectorize.query(queryEmbedding, {\n topK: 50, // Max allowed with returnMetadata: true\n returnMetadata: true\n })\n\n // Manually filter results by collection_id if filter exists\n let filteredMatches = vectorResults.matches || []\n if (filter.collection_id?.$in && Array.isArray(filter.collection_id.$in)) {\n const allowedCollections = filter.collection_id.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedCollections.includes(match.metadata?.collection_id)\n )\n }\n\n // Apply status filter if exists\n if (filter.status?.$in && Array.isArray(filter.status.$in)) {\n const allowedStatuses = filter.status.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedStatuses.includes(match.metadata?.status)\n )\n }\n\n // Limit to requested topK\n const topK = query.limit || settings.results_limit || 20\n filteredMatches = filteredMatches.slice(0, topK)\n\n // Replace matches with filtered results\n vectorResults.matches = filteredMatches\n\n if (!vectorResults.matches || vectorResults.matches.length === 0) {\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: 'ai'\n }\n }\n\n // Get unique content IDs\n const contentIds = [...new Set(\n vectorResults.matches.map((m: any) => m.metadata.content_id)\n )]\n\n // Fetch full content from D1\n const placeholders = contentIds.map(() => '?').join(',')\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.display_name as collection_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id IN (${placeholders})\n `)\n .bind(...contentIds)\n .all<{\n id: string\n title: string\n slug: string\n collection_id: string\n collection_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n }>()\n\n // Map results with relevance scores\n const searchResults: SearchResult[] = (contentItems || []).map(item => {\n // Find best matching chunk for this content\n const matchingChunks = vectorResults.matches.filter(\n (m: any) => m.metadata.content_id === item.id\n )\n \n const bestMatch = matchingChunks.reduce((best: any, current: any) => \n current.score > (best?.score || 0) ? current : best\n , null)\n\n return {\n id: item.id,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n collection_id: item.collection_id,\n collection_name: item.collection_name,\n snippet: bestMatch?.metadata?.text || '',\n relevance_score: bestMatch?.score || 0,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at\n }\n })\n\n // Sort by relevance score\n searchResults.sort((a, b) => (b.relevance_score || 0) - (a.relevance_score || 0))\n\n const queryTime = Date.now() - startTime\n console.log(`[CustomRAG] Search completed in ${queryTime}ms, ${searchResults.length} results`)\n\n return {\n results: searchResults,\n total: searchResults.length,\n query_time_ms: queryTime,\n mode: 'ai'\n }\n } catch (error) {\n console.error('[CustomRAG] Search error:', error)\n throw error\n }\n }\n\n /**\n * Update index for a single content item\n */\n async updateContentIndex(contentId: string): Promise {\n try {\n // Get content item\n const content = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n .bind(contentId)\n .first<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!content) {\n console.warn(`[CustomRAG] Content ${contentId} not found`)\n return\n }\n\n // If content is not published, remove from index\n if (content.status !== 'published') {\n await this.removeContentFromIndex(contentId)\n return\n }\n\n // Chunk content\n const chunks = this.chunkingService.chunkContent(\n content.id,\n content.collection_id,\n content.title || 'Untitled',\n typeof content.data === 'string' ? JSON.parse(content.data) : content.data,\n {\n status: content.status,\n created_at: content.created_at,\n updated_at: content.updated_at,\n author_id: content.author_id,\n collection_name: content.collection_name,\n collection_display_name: content.collection_display_name\n }\n )\n\n // Generate embeddings\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n // Update in Vectorize\n await this.vectorize.upsert(\n chunks.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddings[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500),\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n console.log(`[CustomRAG] Updated index for content ${contentId}: ${chunks.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error updating index for ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove content from index\n */\n async removeContentFromIndex(contentId: string): Promise {\n try {\n // Note: Vectorize doesn't have a bulk delete by metadata filter\n // We need to delete each chunk individually\n // In practice, we would track chunk IDs or use a different approach\n \n console.log(`[CustomRAG] Removing content ${contentId} from index`)\n \n // For now, we'll let stale chunks age out\n // A better approach would be to maintain a mapping in D1\n // TODO: Implement proper chunk tracking\n \n } catch (error) {\n console.error(`[CustomRAG] Error removing content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Get search suggestions based on query\n */\n async getSuggestions(partialQuery: string, limit: number = 5): Promise {\n try {\n // Generate embedding for partial query\n const queryEmbedding = await this.embeddingService.generateEmbedding(partialQuery)\n\n // Search for similar content titles\n const results = await this.vectorize.query(queryEmbedding, {\n topK: limit * 2, // Get more to filter\n returnMetadata: true\n })\n\n // Extract unique titles\n const suggestions = [...new Set(\n results.matches?.map((m: any) => m.metadata.title).filter(Boolean) || []\n )].slice(0, limit)\n\n return suggestions as string[]\n } catch (error) {\n console.error('[CustomRAG] Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Check if Vectorize is available and configured\n */\n isAvailable(): boolean {\n return !!this.vectorize && !!this.ai\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n NewCollectionNotification,\n} from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * AI Search Service\n * Handles search operations, settings management, and collection detection\n * Now uses Custom RAG with Vectorize for semantic search\n */\nexport class AISearchService {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[AISearchService] Custom RAG initialized')\n } else {\n console.log('[AISearchService] Custom RAG not available, using keyword search only')\n }\n }\n\n /**\n * Get plugin settings\n */\n async getSettings(): Promise {\n try {\n const plugin = await this.db\n .prepare(`SELECT settings FROM plugins WHERE id = ? LIMIT 1`)\n .bind('ai-search')\n .first<{ settings: string | null }>()\n\n if (!plugin || !plugin.settings) {\n return this.getDefaultSettings()\n }\n\n return JSON.parse(plugin.settings) as AISearchSettings\n } catch (error) {\n console.error('Error fetching AI Search settings:', error)\n return this.getDefaultSettings()\n }\n }\n\n /**\n * Get default settings\n */\n getDefaultSettings(): AISearchSettings {\n return {\n enabled: true,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n }\n\n /**\n * Update plugin settings\n */\n async updateSettings(settings: Partial): Promise {\n const existing = await this.getSettings()\n const updated: AISearchSettings = {\n ...existing!,\n ...settings,\n }\n\n try {\n // Update plugin settings in plugins table\n await this.db\n .prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'ai-search'\n `)\n .bind(JSON.stringify(updated))\n .run()\n\n return updated\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n throw error\n }\n }\n\n /**\n * Detect new collections that aren't indexed or dismissed\n */\n async detectNewCollections(): Promise {\n try {\n // Get all collections (exclude test collections)\n // Note: D1 doesn't support parameterized LIKE, so we filter in JavaScript\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: number\n name: string\n display_name: string\n description?: string\n }>()\n \n // Filter out test collections (starts with test_, ends with _test, or is test_collection)\n const collections = (allCollections || []).filter(\n (col) => {\n if (!col.name) return false\n const name = col.name.toLowerCase()\n return !name.startsWith('test_') && \n !name.endsWith('_test') && \n name !== 'test_collection' &&\n !name.includes('_test_') &&\n name !== 'large_payload_test' &&\n name !== 'concurrent_test'\n }\n )\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n\n // Get item counts for each collection\n const notifications: NewCollectionNotification[] = []\n\n for (const collection of collections || []) {\n const collectionId = String(collection.id)\n\n // Skip if already selected or dismissed\n if (selected.includes(collectionId) || dismissed.includes(collectionId)) {\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n notifications.push({\n collection: {\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: false,\n is_dismissed: false,\n is_new: true,\n },\n message: `New collection \"${collection.display_name}\" with ${itemCount} items available for indexing`,\n })\n }\n\n return notifications\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return []\n }\n }\n\n /**\n * Get all collections with indexing status\n */\n async getAllCollections(): Promise {\n try {\n // Get all collections (same query as content page)\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1 ORDER BY display_name'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: string\n name: string\n display_name: string\n description?: string\n }>()\n \n console.log('[AISearchService.getAllCollections] Raw collections from DB:', allCollections?.length || 0)\n const firstCollection = allCollections?.[0]\n if (firstCollection) {\n console.log('[AISearchService.getAllCollections] Sample collection:', {\n id: firstCollection.id,\n name: firstCollection.name,\n display_name: firstCollection.display_name\n })\n }\n \n // No filtering needed - test collections are now properly cleaned up by E2E tests\n const collections = (allCollections || []).filter(\n (col) => col.id && col.name\n )\n \n console.log('[AISearchService.getAllCollections] After filtering test collections:', collections.length)\n console.log('[AISearchService.getAllCollections] Remaining collections:', collections.map(c => c.name).join(', '))\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n \n console.log('[AISearchService.getAllCollections] Settings:', {\n selected_count: selected.length,\n dismissed_count: dismissed.length,\n selected: selected\n })\n\n // Get item counts and indexing status\n const collectionInfos: CollectionInfo[] = []\n\n for (const collection of collections) {\n if (!collection.id || !collection.name) continue\n const collectionId = String(collection.id)\n \n if (!collectionId) {\n console.warn('[AISearchService] Skipping invalid collection:', collection)\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n collectionInfos.push({\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name || collection.name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: selected.includes(collectionId),\n is_dismissed: dismissed.includes(collectionId),\n is_new: !selected.includes(collectionId) && !dismissed.includes(collectionId),\n })\n }\n \n console.log('[AISearchService.getAllCollections] Returning collectionInfos:', collectionInfos.length)\n const firstInfo = collectionInfos[0]\n if (collectionInfos.length > 0 && firstInfo) {\n console.log('[AISearchService.getAllCollections] First collectionInfo:', {\n id: firstInfo.id,\n name: firstInfo.name,\n display_name: firstInfo.display_name,\n item_count: firstInfo.item_count\n })\n }\n return collectionInfos\n } catch (error) {\n console.error('[AISearchService] Error fetching collections:', error)\n return []\n }\n }\n\n /**\n * Execute search query\n */\n async search(query: SearchQuery): Promise {\n const startTime = Date.now()\n const settings = await this.getSettings()\n\n if (!settings?.enabled) {\n return {\n results: [],\n total: 0,\n query_time_ms: 0,\n mode: query.mode,\n }\n }\n\n // Use AI Search if enabled and mode is 'ai'\n if (query.mode === 'ai' && settings.ai_mode_enabled && this.customRAG?.isAvailable()) {\n return this.searchAI(query, settings)\n }\n\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n\n /**\n * AI-powered semantic search using Custom RAG\n */\n private async searchAI(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n \n try {\n if (!this.customRAG) {\n console.warn('[AISearchService] CustomRAG not available, falling back to keyword search')\n return this.searchKeyword(query, settings)\n }\n\n // Use Custom RAG for semantic search - pass the full query object and settings\n const result = await this.customRAG.search(query, settings)\n\n return result\n } catch (error) {\n console.error('[AISearchService] AI search error, falling back to keyword:', error)\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n }\n\n /**\n * Traditional keyword search\n */\n private async searchKeyword(\n query: SearchQuery,\n settings: AISearchSettings\n ): Promise {\n const startTime = Date.now()\n\n try {\n const conditions: string[] = []\n const params: any[] = []\n\n // Search query\n if (query.query) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n const searchTerm = `%${query.query}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n // Collection filter\n if (query.filters?.collections && query.filters.collections.length > 0) {\n const placeholders = query.filters.collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...query.filters.collections)\n } else if (settings.selected_collections.length > 0) {\n // Only search indexed collections\n const placeholders = settings.selected_collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...settings.selected_collections)\n }\n\n // Status filter\n if (query.filters?.status && query.filters.status.length > 0) {\n const placeholders = query.filters.status.map(() => '?').join(',')\n conditions.push(`c.status IN (${placeholders})`)\n params.push(...query.filters.status)\n } else {\n // Exclude deleted by default\n conditions.push(\"c.status != 'deleted'\")\n }\n\n // Date range filter\n if (query.filters?.dateRange) {\n const field = query.filters.dateRange.field || 'created_at'\n if (query.filters.dateRange.start) {\n conditions.push(`c.${field} >= ?`)\n params.push(query.filters.dateRange.start.getTime())\n }\n if (query.filters.dateRange.end) {\n conditions.push(`c.${field} <= ?`)\n params.push(query.filters.dateRange.end.getTime())\n }\n }\n\n // Author filter\n if (query.filters?.author) {\n conditions.push('c.author_id = ?')\n params.push(query.filters.author)\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get results\n const limit = query.limit || settings.results_limit\n const offset = query.offset || 0\n\n const resultsStmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id, c.data,\n col.name as collection_name, col.display_name as collection_display_name,\n u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results } = await resultsStmt.bind(...params, limit, offset).all<{\n id: string\n title: string\n slug: string\n collection_id: number\n collection_name: string\n collection_display_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n author_email?: string\n data: string\n }>()\n\n const searchResults: SearchResult[] = (results || []).map((row) => ({\n id: String(row.id),\n title: row.title || 'Untitled',\n slug: row.slug || '',\n collection_id: String(row.collection_id),\n collection_name: row.collection_display_name || row.collection_name,\n snippet: this.extractSnippet(row.data, query.query),\n status: row.status,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n author_name: row.author_email,\n }))\n\n const queryTime = Date.now() - startTime\n\n // Log search history\n await this.logSearch(query.query, query.mode, searchResults.length)\n\n return {\n results: searchResults,\n total,\n query_time_ms: queryTime,\n mode: query.mode,\n }\n } catch (error) {\n console.error('Keyword search error:', error)\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: query.mode,\n }\n }\n }\n\n /**\n * Extract snippet from content data\n */\n private extractSnippet(data: string, query: string): string {\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data\n const text = JSON.stringify(parsed).toLowerCase()\n const queryLower = query.toLowerCase()\n\n const index = text.indexOf(queryLower)\n if (index === -1) {\n // Return first 200 chars\n return JSON.stringify(parsed).substring(0, 200) + '...'\n }\n\n // Extract context around match\n const start = Math.max(0, index - 50)\n const end = Math.min(text.length, index + query.length + 50)\n return text.substring(start, end) + '...'\n } catch {\n return data.substring(0, 200) + '...'\n }\n }\n\n /**\n * Get search suggestions (autocomplete)\n */\n async getSearchSuggestions(partial: string): Promise {\n try {\n const settings = await this.getSettings()\n if (!settings?.autocomplete_enabled) {\n return []\n }\n\n // If Custom RAG is available, use AI-powered suggestions\n if (this.customRAG?.isAvailable()) {\n try {\n const aiSuggestions = await this.customRAG.getSuggestions(partial, 5)\n if (aiSuggestions.length > 0) {\n return aiSuggestions\n }\n } catch (error) {\n console.error('[AISearchService] Error getting AI suggestions:', error)\n // Fall through to history-based suggestions\n }\n }\n\n // Fallback to history-based suggestions\n const stmt = this.db.prepare(`\n SELECT DISTINCT query \n FROM ai_search_history \n WHERE query LIKE ? \n ORDER BY created_at DESC \n LIMIT 10\n `)\n const { results } = await stmt.bind(`%${partial}%`).all<{ query: string }>()\n\n return (results || []).map((r) => r.query)\n } catch (error) {\n console.error('Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Log search query to history\n */\n private async logSearch(query: string, mode: 'ai' | 'keyword', resultsCount: number): Promise {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_history (query, mode, results_count, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await stmt.bind(query, mode, resultsCount, Date.now()).run()\n } catch (error) {\n console.error('Error logging search:', error)\n }\n }\n\n /**\n * Get search analytics\n */\n async getSearchAnalytics(): Promise<{\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }> {\n try {\n // Total queries (last 30 days)\n const totalStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n `)\n const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000\n const totalResult = await totalStmt.bind(thirtyDaysAgo).first<{ count: number }>()\n\n // AI vs Keyword breakdown\n const modeStmt = this.db.prepare(`\n SELECT mode, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY mode\n `)\n const { results: modeResults } = await modeStmt.bind(thirtyDaysAgo).all<{\n mode: string\n count: number\n }>()\n\n const aiCount = modeResults?.find((r) => r.mode === 'ai')?.count || 0\n const keywordCount = modeResults?.find((r) => r.mode === 'keyword')?.count || 0\n\n // Popular queries\n const popularStmt = this.db.prepare(`\n SELECT query, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY query \n ORDER BY count DESC \n LIMIT 10\n `)\n const { results: popularResults } = await popularStmt.bind(thirtyDaysAgo).all<{\n query: string\n count: number\n }>()\n\n return {\n total_queries: totalResult?.count || 0,\n ai_queries: aiCount,\n keyword_queries: keywordCount,\n popular_queries: (popularResults || []).map((r) => ({\n query: r.query,\n count: r.count,\n })),\n average_query_time: 0, // TODO: Track query times\n }\n } catch (error) {\n console.error('Error getting analytics:', error)\n return {\n total_queries: 0,\n ai_queries: 0,\n keyword_queries: 0,\n popular_queries: [],\n average_query_time: 0,\n }\n }\n }\n\n /**\n * Verify Custom RAG is available\n */\n verifyBinding(): boolean {\n return this.customRAG?.isAvailable() ?? false\n }\n\n /**\n * Get Custom RAG service instance (for indexer)\n */\n getCustomRAG(): CustomRAGService | undefined {\n return this.customRAG\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { AISearchSettings, IndexStatus } from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * Index Manager Service\n * Handles indexing of content items using Custom RAG with Vectorize\n */\nexport class IndexManager {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[IndexManager] Custom RAG initialized')\n }\n }\n\n /**\n * Index all content items within a collection using Custom RAG\n */\n async indexCollection(collectionId: string): Promise {\n try {\n // Get collection info\n const collectionStmt = this.db.prepare(\n 'SELECT id, name, display_name FROM collections WHERE id = ?'\n )\n const collection = await collectionStmt.bind(collectionId).first<{\n id: string\n name: string\n display_name: string\n }>()\n\n if (!collection) {\n throw new Error(`Collection ${collectionId} not found`)\n }\n\n // Update status to indexing\n await this.updateIndexStatus(collectionId, {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n status: 'indexing',\n })\n\n // Use Custom RAG for indexing if available\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Using Custom RAG to index collection ${collectionId}`)\n \n const result = await this.customRAG.indexCollection(collectionId)\n\n const finalStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: result.total_items,\n indexed_items: result.indexed_chunks,\n last_sync_at: Date.now(),\n status: result.errors > 0 ? 'error' : 'completed',\n error_message: result.errors > 0 ? `${result.errors} errors during indexing` : undefined\n }\n\n await this.updateIndexStatus(collectionId, finalStatus)\n return finalStatus\n }\n\n // Fallback: No indexing without Custom RAG\n console.warn(`[IndexManager] Custom RAG not available, skipping indexing for ${collectionId}`)\n \n const fallbackStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n last_sync_at: Date.now(),\n status: 'completed',\n error_message: 'Custom RAG not available - using keyword search only'\n }\n\n await this.updateIndexStatus(collectionId, fallbackStatus)\n return fallbackStatus\n } catch (error) {\n console.error(`[IndexManager] Error indexing collection ${collectionId}:`, error)\n const errorStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: 'Unknown',\n total_items: 0,\n indexed_items: 0,\n status: 'error',\n error_message: error instanceof Error ? error.message : String(error),\n }\n await this.updateIndexStatus(collectionId, errorStatus)\n return errorStatus\n }\n }\n\n /**\n * Index a single content item\n */\n private async indexContentItem(\n item: {\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n },\n collectionId: string\n ): Promise {\n try {\n // Parse content data\n let parsedData: any = {}\n try {\n parsedData = typeof item.data === 'string' ? JSON.parse(item.data) : item.data\n } catch {\n parsedData = {}\n }\n\n // Prepare document for AI Search\n const document = {\n id: `content_${item.id}`,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n content: this.extractSearchableText(parsedData),\n metadata: {\n collection_id: collectionId,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n },\n }\n\n // TODO: Call Cloudflare AI Search API to index document\n // await this.aiSearch.index(document)\n\n // For now, just log (actual implementation will use AI Search API)\n console.log(`Indexed content item: ${item.id}`)\n } catch (error) {\n console.error(`Error indexing content item ${item.id}:`, error)\n throw error\n }\n }\n\n /**\n * Extract searchable text from content data\n */\n private extractSearchableText(data: any): string {\n const parts: string[] = []\n\n // Add title if present\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n\n // Add description/content fields\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n\n // Add all string values from data\n const extractStrings = (obj: any): void => {\n if (typeof obj === 'string') {\n parts.push(obj)\n } else if (Array.isArray(obj)) {\n obj.forEach(extractStrings)\n } else if (obj && typeof obj === 'object') {\n Object.values(obj).forEach(extractStrings)\n }\n }\n\n extractStrings(data)\n\n return parts.join(' ')\n }\n\n /**\n * Update a single content item in the index\n */\n async updateIndex(collectionId: number, contentId: string): Promise {\n try {\n // Get content item\n const stmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.data, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ? AND c.collection_id = ?\n `)\n const item = await stmt.bind(contentId, collectionId).first<{\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!item) {\n throw new Error(`Content item ${contentId} not found`)\n }\n\n // Re-index the item\n await this.indexContentItem(item, String(collectionId))\n\n // Update last sync time for collection\n const status = await this.getIndexStatus(String(collectionId))\n if (status) {\n await this.updateIndexStatus(String(collectionId), {\n ...status,\n last_sync_at: Date.now(),\n })\n }\n } catch (error) {\n console.error(`Error updating index for content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove a content item from the index using Custom RAG\n */\n async removeFromIndex(collectionId: string, contentId: string): Promise {\n try {\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Removing content ${contentId} from index`)\n await this.customRAG.removeContentFromIndex(contentId)\n } else {\n console.warn(`[IndexManager] Custom RAG not available, skipping removal for ${contentId}`)\n }\n } catch (error) {\n console.error(`[IndexManager] Error removing content ${contentId} from index:`, error)\n throw error\n }\n }\n\n /**\n * Get indexing status for a collection\n */\n async getIndexStatus(collectionId: string): Promise {\n try {\n const stmt = this.db.prepare(\n 'SELECT * FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const result = await stmt.bind(collectionId).first<{\n id: number\n collection_id: string\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n if (!result) {\n return null\n }\n\n return {\n collection_id: String(result.collection_id),\n collection_name: result.collection_name,\n total_items: result.total_items,\n indexed_items: result.indexed_items,\n last_sync_at: result.last_sync_at,\n status: result.status as IndexStatus['status'],\n error_message: result.error_message,\n }\n } catch (error) {\n console.error(`Error getting index status for collection ${collectionId}:`, error)\n return null\n }\n }\n\n /**\n * Get indexing status for all collections\n */\n async getAllIndexStatus(): Promise> {\n try {\n const stmt = this.db.prepare('SELECT * FROM ai_search_index_meta')\n const { results } = await stmt.all<{\n id: number\n collection_id: number\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n const statusMap: Record = {}\n\n for (const row of results || []) {\n const collectionId = String(row.collection_id)\n statusMap[collectionId] = {\n collection_id: collectionId,\n collection_name: row.collection_name,\n total_items: row.total_items,\n indexed_items: row.indexed_items,\n last_sync_at: row.last_sync_at,\n status: row.status as IndexStatus['status'],\n error_message: row.error_message,\n }\n }\n\n return statusMap\n } catch (error) {\n console.error('Error getting all index status:', error)\n return {}\n }\n }\n\n /**\n * Update index status in database\n */\n private async updateIndexStatus(collectionId: string, status: IndexStatus): Promise {\n try {\n // Check if record exists\n const checkStmt = this.db.prepare(\n 'SELECT id FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const existing = await checkStmt.bind(collectionId).first<{ id: number }>()\n\n if (existing) {\n // Update existing\n const stmt = this.db.prepare(`\n UPDATE ai_search_index_meta \n SET collection_name = ?,\n total_items = ?,\n indexed_items = ?,\n last_sync_at = ?,\n status = ?,\n error_message = ?\n WHERE collection_id = ?\n `)\n await stmt\n .bind(\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null,\n String(collectionId)\n )\n .run()\n } else {\n // Insert new\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_index_meta (\n collection_id, collection_name, total_items, indexed_items,\n last_sync_at, status, error_message\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n await stmt\n .bind(\n String(status.collection_id),\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null\n )\n .run()\n }\n } catch (error) {\n console.error(`Error updating index status for collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Sync all selected collections\n */\n async syncAll(selectedCollections: string[]): Promise {\n for (const collectionId of selectedCollections) {\n try {\n await this.indexCollection(collectionId)\n } catch (error) {\n console.error(`Error syncing collection ${collectionId}:`, error)\n }\n }\n }\n}\n","import { renderAdminLayout } from '../../../../templates/layouts/admin-layout-v2.template'\nimport type {\n AISearchSettings,\n CollectionInfo,\n IndexStatus,\n NewCollectionNotification,\n} from '../types'\n\ninterface SettingsPageData {\n settings: AISearchSettings | null\n collections: CollectionInfo[]\n newCollections: NewCollectionNotification[]\n indexStatus: Record\n analytics: {\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const settings = data.settings || {\n enabled: false,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n\n // Ensure arrays exist\n const selectedCollections = Array.isArray(settings.selected_collections) ? settings.selected_collections : []\n const dismissedCollections = Array.isArray(settings.dismissed_collections) ? settings.dismissed_collections : []\n\n const enabled = settings.enabled === true\n const aiModeEnabled = settings.ai_mode_enabled !== false\n const autocompleteEnabled = settings.autocomplete_enabled !== false\n const indexMedia = settings.index_media === true\n\n const selectedCollectionIds = new Set(selectedCollections.map(id => String(id)))\n const dismissedCollectionIds = new Set(dismissedCollections.map(id => String(id)))\n\n // Ensure collections array exists\n const collections = Array.isArray(data.collections) ? data.collections : []\n\n // Debug: Log collections in template\n console.log('[SettingsPage Template] Collections received:', collections.length)\n if (collections.length > 0) {\n console.log('[SettingsPage Template] First collection:', collections[0])\n }\n\n const content = `\n
\n \n
\n
\n

🔍 AI Search Settings

\n

\n Configure advanced search with Cloudflare AI Search. Select collections to index and manage search preferences.\n

\n
\n \n
\n\n\n \n
\n
\n \n
\n

🔍 Search Settings

\n
\n
\n \n
\n \n

Turn on advanced search capabilities across your content

\n
\n
\n\n
\n \n
\n \n

\n Enable natural language queries (requires Cloudflare Workers AI binding)\n → Setup Guide\n

\n

\n ⚠️ If AI binding unavailable, will fallback to keyword search\n

\n
\n
\n
\n
\n\n
\n\n \n
\n
\n
\n

📚 Collections to Index

\n

\n Select which content collections should be indexed and searchable. Only checked collections will be included in search results.\n

\n
\n
\n
\n ${collections.length === 0\n ? '

No collections available. Create collections first.

'\n : collections.map((collection) => {\n const collectionId = String(collection.id)\n const isChecked = selectedCollectionIds.has(collectionId)\n const isDismissed = dismissedCollectionIds.has(collectionId)\n const indexStatusMap: Record = data.indexStatus || {}\n const status = indexStatusMap[collectionId]\n // Only show NEW badge if collection is new, not dismissed, and has never been indexed\n const isNew = collection.is_new === true && !isDismissed && !status\n // Only show status badge if collection is CHECKED and has status\n const statusBadge = (status && isChecked)\n ? `${status.status}`\n : ''\n\n return `
\n \n
\n \n

\n ${collection.description || collection.name || 'No description'} • ${collection.item_count || 0} items\n ${status ? ` • ${status.indexed_items}/${status.total_items} indexed` : ''}\n

\n ${status && status.status === 'indexing'\n ? `
\n
\n
`\n : ''}\n
\n ${isChecked ? `\n \n \n \n \n Re-index\n \n ` : ''}\n
`\n }).join('')}\n
\n
\n\n
\n\n \n
\n

⚙️ Advanced Options

\n
\n
\n \n
\n \n

Show search suggestions as users type

\n
\n
\n\n
\n \n
\n \n

Include media files in search results

\n
\n
\n\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

\n 💡 Collections marked as NEW haven't been indexed yet\n

\n \n
\n
\n
\n\n\n \n
\n

📊 Search Analytics

\n
\n
\n
Total Queries
\n
${data.analytics.total_queries}
\n
\n
\n
AI Queries
\n
${data.analytics.ai_queries}
\n
\n
\n
Keyword Queries
\n
${data.analytics.keyword_queries}
\n
\n
\n ${data.analytics.popular_queries.length > 0\n ? `\n
\n

Popular Searches

\n
\n ${data.analytics.popular_queries.map(\n (item) => `\n
\n \"${item.query}\"\n ${item.count} times\n
\n `\n ).join('')}\n
\n
\n `\n : '

No search history yet.

'}\n
\n\n \n
\n
\n \n Settings Saved Successfully!\n
\n
\n
\n \n `\n\n return renderAdminLayout({\n title: 'AI Search Settings',\n pageTitle: 'AI Search Settings',\n currentPath: '/admin/plugins/ai-search/settings',\n user: data.user,\n content: content\n })\n}\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { requireAuth } from '../../../../middleware'\nimport { AISearchService } from '../services/ai-search'\nimport { IndexManager } from '../services/indexer'\nimport { renderSettingsPage } from '../components/settings-page'\nimport type { AISearchSettings, SearchQuery } from '../types'\n\ntype Variables = {\n user: {\n id: number\n email: string\n role: string\n }\n}\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminRoutes.use('*', requireAuth())\n\n/**\n * GET /admin/plugins/ai-search\n * Render settings page\n */\nadminRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const ai = (c.env as any).AI // Workers AI for embeddings\n const vectorize = (c.env as any).VECTORIZE_INDEX // Vectorize for vector search\n\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n // Get settings\n const settings = await service.getSettings()\n console.log('[AI Search Settings Route] Settings loaded:', !!settings)\n\n // Get all collections with status\n const collections = await service.getAllCollections()\n console.log('[AI Search Settings Route] Collections returned:', collections.length)\n \n // If no collections, try direct query\n if (collections.length === 0) {\n const directQuery = await db.prepare('SELECT id, name, display_name FROM collections WHERE is_active = 1').all()\n console.log('[AI Search Settings Route] Direct DB query found:', directQuery.results?.length || 0, 'collections')\n if (directQuery.results && directQuery.results.length > 0) {\n console.log('[AI Search Settings Route] Sample from DB:', directQuery.results[0])\n }\n } else if (collections.length > 0 && collections[0]) {\n console.log('[AI Search Settings Route] First collection:', {\n id: collections[0].id,\n name: collections[0].name,\n display_name: collections[0].display_name\n })\n }\n\n // Get new collections notifications\n const newCollections = await service.detectNewCollections()\n console.log('AI Search: New collections:', newCollections.length)\n\n // Get index status for all collections\n const indexStatus = await indexer.getAllIndexStatus()\n console.log('AI Search: Index status:', Object.keys(indexStatus).length)\n\n // Get analytics\n const analytics = await service.getSearchAnalytics()\n\n return c.html(\n renderSettingsPage({\n settings,\n collections: collections || [],\n newCollections: newCollections || [],\n indexStatus: indexStatus || {},\n analytics,\n user: {\n name: user.email,\n email: user.email,\n role: user.role,\n },\n })\n )\n } catch (error) {\n console.error('Error rendering AI Search settings:', error)\n return c.html(`

Error loading settings: ${error instanceof Error ? error.message : String(error)}

`, 500)\n }\n})\n\n/**\n * POST /admin/plugins/ai-search\n * Update settings\n */\nadminRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n console.log('[AI Search POST] Received body:', JSON.stringify(body, null, 2))\n\n // Get current settings\n const currentSettings = await service.getSettings()\n console.log('[AI Search POST] Current settings selected_collections:', currentSettings?.selected_collections)\n\n // Update settings\n const updatedSettings: Partial = {\n enabled: body.enabled !== undefined ? Boolean(body.enabled) : currentSettings?.enabled,\n ai_mode_enabled: body.ai_mode_enabled !== undefined ? Boolean(body.ai_mode_enabled) : currentSettings?.ai_mode_enabled,\n selected_collections: Array.isArray(body.selected_collections) ? body.selected_collections.map(String) : (currentSettings?.selected_collections || []),\n dismissed_collections: Array.isArray(body.dismissed_collections) ? body.dismissed_collections.map(String) : (currentSettings?.dismissed_collections || []),\n autocomplete_enabled: body.autocomplete_enabled !== undefined ? Boolean(body.autocomplete_enabled) : currentSettings?.autocomplete_enabled,\n cache_duration: body.cache_duration ? Number(body.cache_duration) : currentSettings?.cache_duration,\n results_limit: body.results_limit ? Number(body.results_limit) : currentSettings?.results_limit,\n index_media: body.index_media !== undefined ? Boolean(body.index_media) : currentSettings?.index_media,\n }\n\n console.log('[AI Search POST] Updated settings selected_collections:', updatedSettings.selected_collections)\n\n // If collections changed, trigger indexing\n const collectionsChanged =\n JSON.stringify(updatedSettings.selected_collections) !==\n JSON.stringify(currentSettings?.selected_collections || [])\n\n const saved = await service.updateSettings(updatedSettings)\n console.log('[AI Search POST] Settings saved, selected_collections:', saved.selected_collections)\n\n // Start indexing if collections were added\n if (collectionsChanged && updatedSettings.selected_collections) {\n console.log('[AI Search POST] Collections changed, starting background indexing')\n // Start indexing in background (non-blocking) - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .syncAll(updatedSettings.selected_collections)\n .then(() => console.log('[AI Search POST] Background indexing completed'))\n .catch((error) => console.error('[AI Search POST] Background indexing error:', error))\n )\n }\n\n return c.json({ success: true, settings: saved })\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n return c.json({ error: 'Failed to update settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/settings\n * Get settings API endpoint\n */\nadminRoutes.get('/api/settings', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const settings = await service.getSettings()\n return c.json({ success: true, data: settings })\n } catch (error) {\n console.error('Error fetching settings:', error)\n return c.json({ error: 'Failed to fetch settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/new-collections\n * Get new collections that aren't indexed or dismissed\n */\nadminRoutes.get('/api/new-collections', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const notifications = await service.detectNewCollections()\n return c.json({ success: true, data: notifications })\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return c.json({ error: 'Failed to detect new collections' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/status\n * Get indexing status\n */\nadminRoutes.get('/api/status', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const status = await indexer.getAllIndexStatus()\n return c.json({ success: true, data: status })\n } catch (error) {\n console.error('Error fetching index status:', error)\n return c.json({ error: 'Failed to fetch status' }, 500)\n }\n})\n\n/**\n * POST /admin/api/ai-search/reindex\n * Trigger re-indexing for a collection\n */\nadminRoutes.post('/api/reindex', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n const collectionIdRaw: unknown = body.collection_id\n const collectionId = collectionIdRaw ? String(collectionIdRaw) : ''\n\n if (!collectionId || collectionId === 'undefined' || collectionId === 'null') {\n return c.json({ error: 'collection_id is required' }, 400)\n }\n\n // Start indexing in background - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .indexCollection(collectionId)\n .then(() => console.log(`[AI Search Reindex] Completed for collection ${collectionId}`))\n .catch((error) => console.error(`[AI Search Reindex] Error for collection ${collectionId}:`, error))\n )\n\n return c.json({ success: true, message: 'Re-indexing started' })\n } catch (error) {\n console.error('Error starting re-index:', error)\n return c.json({ error: 'Failed to start re-indexing' }, 500)\n }\n})\n\nexport default adminRoutes\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { AISearchService } from '../services/ai-search'\nimport type { SearchQuery } from '../types'\n\ntype Variables = {\n user?: {\n id: number\n email: string\n role: string\n }\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * POST /api/search\n * Execute search query\n */\napiRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const body = await c.req.json()\n\n const query: SearchQuery = {\n query: body.query || '',\n mode: body.mode || 'keyword',\n filters: body.filters || {},\n limit: body.limit ? Number(body.limit) : undefined,\n offset: body.offset ? Number(body.offset) : undefined,\n }\n\n // Convert date strings to Date objects if present\n if (query.filters?.dateRange) {\n if (typeof query.filters.dateRange.start === 'string') {\n query.filters.dateRange.start = new Date(query.filters.dateRange.start)\n }\n if (typeof query.filters.dateRange.end === 'string') {\n query.filters.dateRange.end = new Date(query.filters.dateRange.end)\n }\n }\n\n const results = await service.search(query)\n\n return c.json({\n success: true,\n data: results,\n })\n } catch (error) {\n console.error('Search error:', error)\n return c.json(\n {\n success: false,\n error: 'Search failed',\n message: error instanceof Error ? error.message : String(error),\n },\n 500\n )\n }\n})\n\n/**\n * GET /api/search/suggest\n * Get search suggestions (autocomplete)\n */\napiRoutes.get('/suggest', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const query = c.req.query('q') || ''\n\n if (!query || query.length < 2) {\n return c.json({ success: true, data: [] })\n }\n\n const suggestions = await service.getSearchSuggestions(query)\n\n return c.json({\n success: true,\n data: suggestions,\n })\n } catch (error) {\n console.error('Suggestions error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get suggestions',\n },\n 500\n )\n }\n})\n\n/**\n * GET /admin/api/search/analytics\n * Get search analytics\n */\napiRoutes.get('/analytics', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const analytics = await service.getSearchAnalytics()\n\n return c.json({\n success: true,\n data: analytics,\n })\n } catch (error) {\n console.error('Analytics error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get analytics',\n },\n 500\n )\n }\n})\n\nexport default apiRoutes\n","{\n \"id\": \"ai-search\",\n \"name\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"icon\": \"magnifying-glass\",\n \"homepage\": \"https://developers.cloudflare.com/ai-search/\",\n \"repository\": \"https://github.com/sonicjs/sonicjs\",\n \"license\": \"MIT\",\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"configSchema\": {\n \"enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI Search\",\n \"description\": \"Enable or disable AI Search functionality\",\n \"default\": true\n },\n \"ai_mode_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI/Semantic Search\",\n \"description\": \"Enable AI-powered semantic search (requires Cloudflare Workers AI binding)\",\n \"default\": false\n },\n \"ai_provider\": {\n \"type\": \"string\",\n \"label\": \"AI Provider\",\n \"description\": \"Which AI service to use for semantic search\",\n \"default\": \"cloudflare\",\n \"enum\": [\n \"cloudflare\",\n \"keyword-only\"\n ]\n },\n \"autocomplete_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable Autocomplete\",\n \"description\": \"Show search suggestions as user types\",\n \"default\": true\n },\n \"cache_duration\": {\n \"type\": \"number\",\n \"label\": \"Cache Duration (hours)\",\n \"description\": \"How long to cache search results\",\n \"default\": 1,\n \"min\": 0,\n \"max\": 24\n },\n \"results_limit\": {\n \"type\": \"number\",\n \"label\": \"Results Per Page\",\n \"description\": \"Maximum number of results to show per page\",\n \"default\": 20,\n \"min\": 10,\n \"max\": 100\n },\n \"index_media\": {\n \"type\": \"boolean\",\n \"label\": \"Index Media Metadata\",\n \"description\": \"Include R2 media files in search index\",\n \"default\": false\n }\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"href\": \"/admin/plugins/ai-search\",\n \"parentId\": \"plugins\",\n \"order\": 50\n },\n \"codeName\": \"ai-search-plugin\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { AISearchService } from './services/ai-search'\nimport { IndexManager } from './services/indexer'\nimport adminRoutes from './routes/admin'\nimport apiRoutes from './routes/api'\nimport manifest from './manifest.json'\n\n/**\n * AI Search Plugin\n * \n * Provides advanced search capabilities using Cloudflare AI Search.\n * Features:\n * - Semantic/AI-powered search with natural language queries\n * - Traditional keyword search\n * - Full-text search across all content collections\n * - Advanced filtering (collections, dates, status, tags)\n * - Autocomplete suggestions\n * - Search analytics\n * - Dynamic collection discovery and indexing\n * \n * @example\n * ```typescript\n * import { AISearchService } from '@sonicjs-cms/core/plugins'\n * \n * const service = new AISearchService(db, aiSearch)\n * const results = await service.search({\n * query: 'blog posts about security',\n * mode: 'ai',\n * filters: { collections: [1, 2] }\n * })\n * ```\n */\n\nexport const aiSearchPlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('aiSearch', AISearchService)\n .addService('indexManager', IndexManager)\n .addRoute('/admin/plugins/ai-search', adminRoutes as any)\n .addRoute('/api/search', apiRoutes as any)\n .build()\n\n// Export services and types for easy import\nexport { AISearchService } from './services/ai-search'\nexport { IndexManager } from './services/indexer'\nexport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n IndexStatus,\n} from './types'\n","/**\n * Magic Link Authentication Plugin\n *\n * Provides passwordless authentication via email magic links\n * Users receive a secure one-time link to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\nimport type { Plugin, PluginContext } from '../../types'\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { AuthManager, getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst magicLinkRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nexport function createMagicLinkAuthPlugin(): Plugin {\n const magicLinkRoutes = new Hono()\n\n // Request a magic link\n magicLinkRoutes.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = magicLinkRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB as D1Database\n\n // Check rate limiting\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n const recentLinks = await db.prepare(`\n SELECT COUNT(*) as count\n FROM magic_links\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as any\n\n const rateLimitPerHour = 5 // TODO: Get from plugin settings\n if (recentLinks && recentLinks.count >= rateLimitPerHour) {\n return c.json({\n error: 'Too many requests. Please try again later.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && !allowNewUsers) {\n // Don't reveal if user exists or not for security\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.'\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Generate secure token\n const token = crypto.randomUUID() + '-' + crypto.randomUUID()\n const tokenId = crypto.randomUUID()\n const linkExpiryMinutes = 15 // TODO: Get from plugin settings\n const expiresAt = Date.now() + (linkExpiryMinutes * 60 * 1000)\n\n // Store magic link\n await db.prepare(`\n INSERT INTO magic_links (\n id, user_email, token, expires_at, used, created_at, ip_address, user_agent\n ) VALUES (?, ?, ?, ?, 0, ?, ?, ?)\n `).bind(\n tokenId,\n normalizedEmail,\n token,\n expiresAt,\n Date.now(),\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown',\n c.req.header('user-agent') || 'unknown'\n ).run()\n\n // Generate magic link URL\n const baseUrl = new URL(c.req.url).origin\n const magicLink = `${baseUrl}/auth/magic-link/verify?token=${token}`\n\n // Send email via email plugin\n try {\n const emailPlugin = c.env.plugins?.get('email')\n if (emailPlugin && emailPlugin.sendEmail) {\n await emailPlugin.sendEmail({\n to: normalizedEmail,\n subject: 'Your Magic Link to Sign In',\n html: renderMagicLinkEmail(magicLink, linkExpiryMinutes)\n })\n } else {\n console.error('Email plugin not available')\n // In production, this should fail. For now, log the link for testing\n console.log(`Magic link for ${normalizedEmail}: ${magicLink}`)\n }\n } catch (error) {\n console.error('Failed to send magic link email:', error)\n return c.json({\n error: 'Failed to send email. Please try again later.'\n }, 500)\n }\n\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.',\n // For development only - remove in production\n ...(c.env.ENVIRONMENT === 'development' && { dev_link: magicLink })\n })\n } catch (error) {\n console.error('Magic link request error:', error)\n return c.json({ error: 'Failed to process request' }, 500)\n }\n })\n\n // Verify magic link and sign in\n magicLinkRoutes.get('/verify', async (c: any) => {\n try {\n const token = c.req.query('token')\n\n if (!token) {\n return c.redirect('/auth/login?error=Invalid magic link')\n }\n\n const db = c.env.DB as D1Database\n\n // Find magic link\n const magicLink = await db.prepare(`\n SELECT * FROM magic_links\n WHERE token = ? AND used = 0\n `).bind(token).first() as any\n\n if (!magicLink) {\n return c.redirect('/auth/login?error=Invalid or expired magic link')\n }\n\n // Check expiration\n if (magicLink.expires_at < Date.now()) {\n return c.redirect('/auth/login?error=This magic link has expired')\n }\n\n // Get or create user\n let user = await db.prepare(`\n SELECT * FROM users WHERE email = ? AND is_active = 1\n `).bind(magicLink.user_email).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && allowNewUsers) {\n // Create new user\n const userId = crypto.randomUUID()\n const username = magicLink.user_email.split('@')[0]\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 1, ?, ?)\n `).bind(\n userId,\n magicLink.user_email,\n username,\n username,\n '',\n now,\n now\n ).run()\n\n user = {\n id: userId,\n email: magicLink.user_email,\n username,\n role: 'viewer'\n }\n } else if (!user) {\n return c.redirect('/auth/login?error=No account found for this email')\n }\n\n // Mark magic link as used\n await db.prepare(`\n UPDATE magic_links\n SET used = 1, used_at = ?\n WHERE id = ?\n `).bind(Date.now(), magicLink.id).run()\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwtToken = await AuthManager.generateToken(\n user.id,\n user.email,\n user.role,\n (c.env as any).JWT_SECRET,\n tokenTtl\n )\n\n // Set auth cookie\n AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl })\n\n // Update last login\n await db.prepare(`\n UPDATE users SET last_login_at = ? WHERE id = ?\n `).bind(Date.now(), user.id).run()\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?message=Successfully signed in')\n } catch (error) {\n console.error('Magic link verification error:', error)\n return c.redirect('/auth/login?error=Authentication failed')\n }\n })\n\n return {\n name: 'magic-link-auth',\n version: '1.0.0',\n description: 'Passwordless authentication via email magic links',\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n dependencies: ['email'],\n\n routes: [{\n path: '/auth/magic-link',\n handler: magicLinkRoutes,\n description: 'Magic link authentication endpoints',\n requiresAuth: false\n }],\n\n async install(context: PluginContext) {\n console.log('Installing magic-link-auth plugin...')\n // Migration is handled by plugin system\n },\n\n async activate(context: PluginContext) {\n console.log('Magic link authentication activated')\n console.log('Users can now sign in via /auth/magic-link/request')\n },\n\n async deactivate(context: PluginContext) {\n console.log('Magic link authentication deactivated')\n },\n\n async uninstall(context: PluginContext) {\n console.log('Uninstalling magic-link-auth plugin...')\n // Optionally clean up magic_links table\n // await context.db.prepare('DROP TABLE IF EXISTS magic_links').run()\n }\n }\n}\n\n/**\n * Render magic link email template\n */\nfunction renderMagicLinkEmail(magicLink: string, expiryMinutes: number): string {\n return `\n \n \n \n \n \n Your Magic Link\n \n \n \n
\n
\n

🔗 Your Magic Link

\n
\n\n
\n

Hello!

\n

You requested a magic link to sign in to your account. Click the button below to continue:

\n\n
\n Sign In\n
\n\n

⏰ This link expires in ${expiryMinutes} minutes

\n\n
\n Security Notice: If you didn't request this link, you can safely ignore this email.\n Someone may have entered your email address by mistake.\n
\n
\n\n
\n

This is an automated email from SonicJS.

\n

For security, this link can only be used once.

\n
\n
\n \n \n `\n}\n\nexport default createMagicLinkAuthPlugin()\n","export type SecurityEventType =\n | 'login_success'\n | 'login_failure'\n | 'registration'\n | 'password_reset_request'\n | 'password_reset_complete'\n | 'account_lockout'\n | 'suspicious_activity'\n | 'logout'\n | 'permission_denied'\n\nexport type SecuritySeverity = 'info' | 'warning' | 'critical'\n\nexport interface SecurityEvent {\n id: string\n eventType: SecurityEventType\n severity: SecuritySeverity\n userId?: string | null\n email?: string | null\n ipAddress?: string | null\n userAgent?: string | null\n countryCode?: string | null\n requestPath?: string | null\n requestMethod?: string | null\n details?: Record | null\n fingerprint?: string | null\n blocked: boolean\n createdAt: number\n}\n\nexport interface SecurityEventInsert {\n eventType: SecurityEventType\n severity?: SecuritySeverity\n userId?: string\n email?: string\n ipAddress?: string\n userAgent?: string\n countryCode?: string\n requestPath?: string\n requestMethod?: string\n details?: Record\n fingerprint?: string\n blocked?: boolean\n}\n\nexport interface SecurityEventFilters {\n eventType?: SecurityEventType | SecurityEventType[]\n severity?: SecuritySeverity | SecuritySeverity[]\n email?: string\n ipAddress?: string\n search?: string\n startDate?: number\n endDate?: number\n blocked?: boolean\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'event_type' | 'severity'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SecurityStats {\n totalEvents: number\n failedLogins24h: number\n failedLoginsTrend: number // percentage change vs prior 24h\n activeLockouts: number\n flaggedIPs: number\n eventsByType: Record\n eventsBySeverity: Record\n}\n\nexport interface TopIP {\n ipAddress: string\n countryCode: string | null\n failedAttempts: number\n lastSeen: number\n locked: boolean\n}\n\nexport interface HourlyBucket {\n hour: string\n count: number\n}\n\nexport interface SecurityAuditSettings {\n retention: {\n daysToKeep: number\n maxEvents: number\n autoPurge: boolean\n }\n bruteForce: {\n enabled: boolean\n maxFailedAttemptsPerIP: number\n maxFailedAttemptsPerEmail: number\n windowMinutes: number\n lockoutDurationMinutes: number\n alertThreshold: number\n }\n logging: {\n logSuccessfulLogins: boolean\n logLogouts: boolean\n logRegistrations: boolean\n logPasswordResets: boolean\n logPermissionDenied: boolean\n }\n}\n\nexport const DEFAULT_SETTINGS: SecurityAuditSettings = {\n retention: {\n daysToKeep: 90,\n maxEvents: 100000,\n autoPurge: true\n },\n bruteForce: {\n enabled: true,\n maxFailedAttemptsPerIP: 10,\n maxFailedAttemptsPerEmail: 5,\n windowMinutes: 15,\n lockoutDurationMinutes: 30,\n alertThreshold: 20\n },\n logging: {\n logSuccessfulLogins: true,\n logLogouts: true,\n logRegistrations: true,\n logPasswordResets: true,\n logPermissionDenied: true\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n SecurityEvent,\n SecurityEventInsert,\n SecurityEventFilters,\n SecurityStats,\n TopIP,\n HourlyBucket,\n SecurityAuditSettings\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nexport class SecurityAuditService {\n constructor(\n private db: D1Database,\n private settings: SecurityAuditSettings = DEFAULT_SETTINGS\n ) {}\n\n async logEvent(event: SecurityEventInsert): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO security_events (id, event_type, severity, user_id, email, ip_address, user_agent, country_code, request_path, request_method, details, fingerprint, blocked, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n event.eventType,\n event.severity || 'info',\n event.userId || null,\n event.email || null,\n event.ipAddress || null,\n event.userAgent || null,\n event.countryCode || null,\n event.requestPath || null,\n event.requestMethod || null,\n event.details ? JSON.stringify(event.details) : null,\n event.fingerprint || null,\n event.blocked ? 1 : 0,\n now\n ).run()\n\n return id\n }\n\n async getEvents(filters: SecurityEventFilters = {}): Promise<{ events: SecurityEvent[], total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.eventType) {\n if (Array.isArray(filters.eventType)) {\n conditions.push(`event_type IN (${filters.eventType.map(() => '?').join(',')})`)\n params.push(...filters.eventType)\n } else {\n conditions.push('event_type = ?')\n params.push(filters.eventType)\n }\n }\n\n if (filters.severity) {\n if (Array.isArray(filters.severity)) {\n conditions.push(`severity IN (${filters.severity.map(() => '?').join(',')})`)\n params.push(...filters.severity)\n } else {\n conditions.push('severity = ?')\n params.push(filters.severity)\n }\n }\n\n if (filters.email) {\n conditions.push('email LIKE ?')\n params.push(`%${filters.email}%`)\n }\n\n if (filters.ipAddress) {\n conditions.push('ip_address LIKE ?')\n params.push(`%${filters.ipAddress}%`)\n }\n\n if (filters.search) {\n conditions.push('(email LIKE ? OR ip_address LIKE ? OR details LIKE ?)')\n params.push(`%${filters.search}%`, `%${filters.search}%`, `%${filters.search}%`)\n }\n\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n if (filters.blocked !== undefined) {\n conditions.push('blocked = ?')\n params.push(filters.blocked ? 1 : 0)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const page = filters.page || 1\n const limit = filters.limit || 50\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM security_events ${where}`\n ).bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get page of results\n const results = await this.db.prepare(\n `SELECT * FROM security_events ${where} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...params, limit, offset).all()\n\n const events: SecurityEvent[] = (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n\n return { events, total }\n }\n\n async getEvent(id: string): Promise {\n const row = await this.db.prepare(\n 'SELECT * FROM security_events WHERE id = ?'\n ).bind(id).first()\n\n if (!row) return null\n\n return {\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }\n }\n\n async getStats(): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n const h48 = now - 48 * 60 * 60 * 1000\n\n // Total events\n const totalResult = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM security_events'\n ).first<{ count: number }>()\n\n // Failed logins last 24h\n const failed24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ?\"\n ).bind(h24).first<{ count: number }>()\n\n // Failed logins prior 24h (for trend)\n const failedPrior24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ? AND created_at < ?\"\n ).bind(h48, h24).first<{ count: number }>()\n\n const failed24h = failed24hResult?.count || 0\n const failedPrior24h = failedPrior24hResult?.count || 0\n const trend = failedPrior24h > 0\n ? Math.round(((failed24h - failedPrior24h) / failedPrior24h) * 100)\n : (failed24h > 0 ? 100 : 0)\n\n // Active lockouts (events in last lockout window)\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutsResult = await this.db.prepare(\n \"SELECT COUNT(DISTINCT ip_address) as count FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).first<{ count: number }>()\n\n // Flagged IPs (IPs with more than threshold failed attempts in window)\n const windowStart = now - (this.settings.bruteForce.windowMinutes * 60 * 1000)\n const flaggedResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM (\n SELECT ip_address FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address HAVING COUNT(*) >= ?\n )`\n ).bind(windowStart, this.settings.bruteForce.maxFailedAttemptsPerIP).first<{ count: number }>()\n\n // Events by type\n const typeResults = await this.db.prepare(\n 'SELECT event_type, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY event_type'\n ).bind(h24).all()\n\n const eventsByType: Record = {}\n for (const row of (typeResults.results || []) as any[]) {\n eventsByType[row.event_type] = row.count\n }\n\n // Events by severity\n const severityResults = await this.db.prepare(\n 'SELECT severity, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY severity'\n ).bind(h24).all()\n\n const eventsBySeverity: Record = {}\n for (const row of (severityResults.results || []) as any[]) {\n eventsBySeverity[row.severity] = row.count\n }\n\n return {\n totalEvents: totalResult?.count || 0,\n failedLogins24h: failed24h,\n failedLoginsTrend: trend,\n activeLockouts: lockoutsResult?.count || 0,\n flaggedIPs: flaggedResult?.count || 0,\n eventsByType,\n eventsBySeverity\n }\n }\n\n async getTopIPs(limit: number = 10): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n\n const results = await this.db.prepare(`\n SELECT\n ip_address,\n country_code,\n COUNT(*) as failed_attempts,\n MAX(created_at) as last_seen\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address\n ORDER BY failed_attempts DESC\n LIMIT ?\n `).bind(h24, limit).all()\n\n // Check which IPs are locked\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutResults = await this.db.prepare(\n \"SELECT DISTINCT ip_address FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).all()\n\n const lockedIPs = new Set((lockoutResults.results || []).map((r: any) => r.ip_address))\n\n return (results.results || []).map((row: any) => ({\n ipAddress: row.ip_address,\n countryCode: row.country_code,\n failedAttempts: row.failed_attempts,\n lastSeen: row.last_seen,\n locked: lockedIPs.has(row.ip_address)\n }))\n }\n\n async getHourlyTrend(hours: number = 24): Promise {\n const now = Date.now()\n const start = now - hours * 60 * 60 * 1000\n\n // Build hourly buckets\n const buckets: HourlyBucket[] = []\n for (let i = 0; i < hours; i++) {\n const bucketStart = start + i * 60 * 60 * 1000\n const date = new Date(bucketStart)\n buckets.push({\n hour: `${date.getUTCHours().toString().padStart(2, '0')}:00`,\n count: 0\n })\n }\n\n const results = await this.db.prepare(`\n SELECT\n CAST((created_at - ?) / 3600000 AS INTEGER) as bucket,\n COUNT(*) as count\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY bucket\n ORDER BY bucket\n `).bind(start, start).all()\n\n for (const row of (results.results || []) as any[]) {\n const idx = row.bucket\n if (idx >= 0 && idx < buckets.length) {\n buckets[idx]!.count = row.count\n }\n }\n\n return buckets\n }\n\n async purgeOldEvents(daysToKeep?: number): Promise {\n const days = daysToKeep || this.settings.retention.daysToKeep\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000\n\n const result = await this.db.prepare(\n 'DELETE FROM security_events WHERE created_at < ?'\n ).bind(cutoff).run()\n\n return (result.meta as any)?.changes || 0\n }\n\n async getRecentCriticalEvents(limit: number = 20): Promise {\n const results = await this.db.prepare(\n \"SELECT * FROM security_events WHERE severity = 'critical' ORDER BY created_at DESC LIMIT ?\"\n ).bind(limit).all()\n\n return (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n }\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityStats, TopIP, HourlyBucket, SecurityEvent } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecurityDashboardData {\n stats: SecurityStats\n topIPs: TopIP[]\n hourlyTrend: HourlyBucket[]\n recentCritical: SecurityEvent[]\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n const now = Date.now()\n const diff = now - ts\n\n if (diff < 60000) return 'just now'\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n return labels[type] || type\n}\n\nfunction trendArrow(trend: number): string {\n if (trend > 0) return `+${trend}%`\n if (trend < 0) return `${trend}%`\n return `0%`\n}\n\nfunction renderBarChart(data: HourlyBucket[]): string {\n if (data.length === 0) return '

No data available

'\n\n const max = Math.max(...data.map(d => d.count), 1)\n\n const bars = data.map(d => {\n const height = Math.max((d.count / max) * 100, 2)\n const color = d.count === 0\n ? 'bg-zinc-200 dark:bg-zinc-700'\n : d.count >= max * 0.75\n ? 'bg-red-500'\n : d.count >= max * 0.5\n ? 'bg-amber-500'\n : 'bg-cyan-500'\n return `\n
\n
\n \n
\n
\n 12 ? 'hidden sm:block' : ''}\">${d.hour}\n
\n `\n }).join('')\n\n return `
${bars}
`\n}\n\nexport function renderSecurityDashboard(data: SecurityDashboardData): string {\n const { stats, topIPs, hourlyTrend, recentCritical, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Dashboard

\n

\n Monitor login attempts, brute-force detection, and security events.\n

\n
\n \n
\n\n \n
\n
\n

Total Events

\n

${stats.totalEvents.toLocaleString()}

\n
\n
\n

Failed Logins (24h)

\n

\n ${stats.failedLogins24h}\n ${trendArrow(stats.failedLoginsTrend)}\n

\n
\n
\n

Active Lockouts

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${stats.activeLockouts}

\n
\n
\n

Flagged IPs

\n

0 ? 'text-amber-600 dark:text-amber-400' : 'text-zinc-950 dark:text-white'}\">${stats.flaggedIPs}

\n
\n
\n\n \n
\n \n
\n

Failed Login Attempts (24h)

\n ${renderBarChart(hourlyTrend)}\n
\n\n \n
\n

Events by Type (24h)

\n
\n ${Object.entries(stats.eventsByType).length === 0\n ? '

No events in the last 24 hours

'\n : Object.entries(stats.eventsByType)\n .sort(([, a], [, b]) => b - a)\n .map(([type, count]) => {\n const total = Object.values(stats.eventsByType).reduce((s, v) => s + v, 0)\n const pct = total > 0 ? Math.round((count / total) * 100) : 0\n return `\n
\n
\n ${eventTypeBadge(type)}\n ${count}\n
\n
\n
\n
\n
\n `\n }).join('')\n }\n
\n
\n
\n\n \n
\n \n
\n
\n

Top IPs by Failed Logins (24h)

\n
\n ${topIPs.length === 0\n ? '

No failed login attempts

'\n : `\n \n \n \n \n \n \n \n \n \n ${topIPs.map(ip => `\n \n \n \n \n \n \n `).join('')}\n \n
IP AddressCountryAttemptsStatus
${ip.ipAddress}${ip.countryCode || '-'}= 10 ? 'text-red-600 dark:text-red-400' : 'text-zinc-900 dark:text-zinc-100'}\">${ip.failedAttempts}\n ${ip.locked\n ? 'Locked'\n : 'Active'\n }\n
`\n }\n
\n\n \n
\n
\n

Recent Critical Events

\n
\n ${recentCritical.length === 0\n ? '

No critical events

'\n : `
\n ${recentCritical.slice(0, 10).map(event => `\n
\n
\n
\n ${severityBadge(event.severity)}\n ${eventTypeBadge(event.eventType)}\n
\n ${formatTimestamp(event.createdAt)}\n
\n
\n ${event.ipAddress ? `IP: ${event.ipAddress}` : ''}\n ${event.email ? ` | ${event.email}` : ''}\n
\n
\n `).join('')}\n
`\n }\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Dashboard',\n pageTitle: 'Security Dashboard',\n currentPath: '/admin/plugins/security-audit',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityEvent, SecurityEventFilters } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface EventLogPageData {\n events: SecurityEvent[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n }\n filters: SecurityEventFilters\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const colors: Record = {\n login_success: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400',\n login_failure: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n registration: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n account_lockout: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n suspicious_activity: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\n logout: 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400',\n password_reset_request: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n permission_denied: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400'\n }\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n const color = colors[type] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400'\n return `${labels[type] || type}`\n}\n\nfunction buildFilterUrl(filters: SecurityEventFilters, overrides: Record = {}): string {\n const params = new URLSearchParams()\n if (filters.eventType && !overrides.type) params.set('type', String(filters.eventType))\n if (filters.severity && !overrides.severity) params.set('severity', String(filters.severity))\n if (filters.email && !overrides.email) params.set('email', filters.email)\n if (filters.ipAddress && !overrides.ip) params.set('ip', filters.ipAddress)\n if (filters.search && !overrides.search) params.set('search', filters.search)\n\n for (const [key, value] of Object.entries(overrides)) {\n if (value) params.set(key, value)\n }\n\n const qs = params.toString()\n return `/admin/plugins/security-audit/events${qs ? '?' + qs : ''}`\n}\n\nexport function renderEventLogPage(data: EventLogPageData): string {\n const { events, pagination, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Event Log

\n

\n Browse and filter all security events. Showing ${pagination.startItem}-${pagination.endItem} of ${pagination.totalItems}.\n

\n
\n \n
\n\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n Clear\n \n
\n
\n
\n\n \n
\n ${events.length === 0\n ? `
\n \n \n \n

No events found

\n

No security events match your current filters.

\n
`\n : `
\n \n \n \n \n \n \n \n \n \n \n \n \n \n ${events.map(event => `\n \n \n \n \n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimeTypeSeverityEmailIP AddressCountryStatus
${formatTimestamp(event.createdAt)}${eventTypeBadge(event.eventType)}${severityBadge(event.severity)}${event.email || '-'}${event.ipAddress || '-'}${event.countryCode || '-'}\n ${event.blocked\n ? 'Blocked'\n : 'Allowed'\n }\n
\n
\n
Event ID: ${event.id.substring(0, 8)}...
\n
User Agent: ${event.userAgent || '-'}
\n
Path: ${event.requestPath || '-'}
\n
Fingerprint: ${event.fingerprint || '-'}
\n ${event.details ? `
Details:
${JSON.stringify(event.details, null, 2)}
` : ''}\n
\n
\n
`\n }\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n Page ${pagination.currentPage} of ${pagination.totalPages}\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : ''}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : ''}\n
\n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Event Log',\n pageTitle: 'Security Event Log',\n currentPath: '/admin/plugins/security-audit/events',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityAuditSettings } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecuritySettingsPageData {\n settings: SecurityAuditSettings\n user?: BaseUser\n version?: string\n message?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSecuritySettingsPage(data: SecuritySettingsPageData): string {\n const { settings, user, version, message, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Audit Settings

\n

\n Configure brute-force detection thresholds, event logging, and data retention.\n

\n
\n \n
\n\n ${message ? `\n
\n

${message}

\n
\n ` : ''}\n\n
\n\n \n
\n

Brute-Force Detection

\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n

Events above this count trigger critical severity

\n
\n
\n
\n\n \n
\n

Event Logging

\n
\n \n \n \n \n \n
\n
\n\n \n
\n

Data Retention

\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n\n \n
\n \n \n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Audit Settings',\n pageTitle: 'Security Audit Settings',\n currentPath: '/admin/plugins/security-audit/settings',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { PluginService } from '../../../../services'\nimport { renderSecurityDashboard, SecurityDashboardData } from '../components/dashboard-page'\nimport { renderEventLogPage, EventLogPageData } from '../components/event-log-page'\nimport { renderSecuritySettingsPage, SecuritySettingsPageData } from '../components/settings-page'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const [stats, topIPs, hourlyTrend, recentCritical] = await Promise.all([\n service.getStats(),\n service.getTopIPs(10),\n service.getHourlyTrend(24),\n service.getRecentCriticalEvents(20)\n ])\n\n const pageData: SecurityDashboardData = {\n stats,\n topIPs,\n hourlyTrend,\n recentCritical,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecurityDashboard(pageData))\n})\n\n// Event log\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n\n const filters = {\n eventType: (c.req.query('type') as SecurityEventType) || undefined,\n severity: (c.req.query('severity') as SecuritySeverity) || undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n page,\n limit\n }\n\n const { events, total } = await service.getEvents(filters)\n const totalPages = Math.ceil(total / limit)\n\n const pageData: EventLogPageData = {\n events,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: total === 0 ? 0 : (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total)\n },\n filters,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderEventLogPage(pageData))\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const pageData: SecuritySettingsPageData = {\n settings,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n message: c.req.query('message') || undefined,\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecuritySettingsPage(pageData))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const settings: SecurityAuditSettings = {\n bruteForce: {\n enabled: body['bruteForce.enabled'] === 'true',\n maxFailedAttemptsPerIP: parseInt(body['bruteForce.maxFailedAttemptsPerIP'] as string) || 10,\n maxFailedAttemptsPerEmail: parseInt(body['bruteForce.maxFailedAttemptsPerEmail'] as string) || 5,\n windowMinutes: parseInt(body['bruteForce.windowMinutes'] as string) || 15,\n lockoutDurationMinutes: parseInt(body['bruteForce.lockoutDurationMinutes'] as string) || 30,\n alertThreshold: parseInt(body['bruteForce.alertThreshold'] as string) || 20\n },\n logging: {\n logSuccessfulLogins: body['logging.logSuccessfulLogins'] === 'true',\n logLogouts: body['logging.logLogouts'] === 'true',\n logRegistrations: body['logging.logRegistrations'] === 'true',\n logPasswordResets: body['logging.logPasswordResets'] === 'true',\n logPermissionDenied: body['logging.logPermissionDenied'] === 'true'\n },\n retention: {\n daysToKeep: parseInt(body['retention.daysToKeep'] as string) || 90,\n maxEvents: parseInt(body['retention.maxEvents'] as string) || 100000,\n autoPurge: body['retention.autoPurge'] === 'true'\n }\n }\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings('security-audit', settings)\n\n // For HTMX requests, return 200\n if (c.req.header('HX-Request')) {\n return c.json({ success: true })\n }\n\n return c.redirect('/admin/plugins/security-audit/settings?message=Settings saved successfully')\n})\n\nexport { adminRoutes as securityAuditAdminRoutes }\n","import type { KVNamespace } from '@cloudflare/workers-types'\nimport type { SecurityAuditSettings } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst KV_PREFIX = 'security:bf:'\nconst LOCK_PREFIX = 'security:locked:'\n\nexport class BruteForceDetector {\n private settings: SecurityAuditSettings['bruteForce']\n\n constructor(\n private kv: KVNamespace,\n settings?: SecurityAuditSettings['bruteForce']\n ) {\n this.settings = settings || DEFAULT_SETTINGS.bruteForce\n }\n\n async recordFailedAttempt(ip: string, email: string): Promise<{\n ipCount: number\n emailCount: number\n shouldLockIP: boolean\n shouldLockEmail: boolean\n isSuspicious: boolean\n }> {\n if (!this.settings.enabled || !this.kv) {\n return { ipCount: 0, emailCount: 0, shouldLockIP: false, shouldLockEmail: false, isSuspicious: false }\n }\n\n const now = Date.now()\n const windowMs = this.settings.windowMinutes * 60 * 1000\n\n // Increment IP counter\n const ipKey = `${KV_PREFIX}ip:${ip}`\n const ipCount = await this.incrementCounter(ipKey, windowMs)\n\n // Increment email counter\n const emailKey = `${KV_PREFIX}email:${email}`\n const emailCount = await this.incrementCounter(emailKey, windowMs)\n\n // Check for multi-email from single IP (suspicious)\n const ipEmailsKey = `${KV_PREFIX}ip-emails:${ip}`\n await this.addToSet(ipEmailsKey, email, windowMs)\n const emailsFromIP = await this.getSetSize(ipEmailsKey)\n const isSuspicious = emailsFromIP >= 5\n\n const shouldLockIP = ipCount >= this.settings.maxFailedAttemptsPerIP\n const shouldLockEmail = emailCount >= this.settings.maxFailedAttemptsPerEmail\n\n return { ipCount, emailCount, shouldLockIP, shouldLockEmail, isSuspicious }\n }\n\n async isLocked(ip: string, email: string): Promise<{ locked: boolean, reason?: string }> {\n if (!this.settings.enabled || !this.kv) {\n return { locked: false }\n }\n\n const ipLocked = await this.kv.get(`${LOCK_PREFIX}ip:${ip}`)\n if (ipLocked) {\n return { locked: true, reason: 'IP address temporarily locked due to excessive failed login attempts' }\n }\n\n const emailLocked = await this.kv.get(`${LOCK_PREFIX}email:${email}`)\n if (emailLocked) {\n return { locked: true, reason: 'Account temporarily locked due to excessive failed login attempts' }\n }\n\n return { locked: false }\n }\n\n async lockIP(ip: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}ip:${ip}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_ip'\n }), { expirationTtl: ttl })\n }\n\n async lockEmail(email: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}email:${email}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_email'\n }), { expirationTtl: ttl })\n }\n\n async unlockIP(ip: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}ip:${ip}`)\n }\n\n async unlockEmail(email: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}email:${email}`)\n }\n\n async getActiveLockouts(): Promise> {\n if (!this.kv) return []\n // KV list with prefix to find all active lockouts\n const ipLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}ip:` })\n const emailLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}email:` })\n\n const lockouts: Array<{ key: string, type: 'ip' | 'email', value: string, lockedAt: number }> = []\n\n for (const key of ipLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'ip',\n value: key.name.replace(`${LOCK_PREFIX}ip:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n for (const key of emailLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'email',\n value: key.name.replace(`${LOCK_PREFIX}email:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n return lockouts\n }\n\n async releaseLockout(key: string): Promise {\n if (!this.kv) return\n await this.kv.delete(key)\n }\n\n isAboveAlertThreshold(count: number): boolean {\n return count >= this.settings.alertThreshold\n }\n\n private async incrementCounter(key: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n const now = Date.now()\n\n let entries: number[] = []\n if (existing) {\n try {\n entries = JSON.parse(existing)\n } catch {\n entries = []\n }\n }\n\n // Remove expired entries\n const cutoff = now - windowMs\n entries = entries.filter(ts => ts > cutoff)\n\n // Add new entry\n entries.push(now)\n\n // Store with TTL equal to window\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(entries), { expirationTtl: ttlSeconds })\n\n return entries.length\n }\n\n private async addToSet(key: string, value: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n let set: Record = {}\n const now = Date.now()\n const cutoff = now - windowMs\n\n if (existing) {\n try {\n set = JSON.parse(existing)\n } catch {\n set = {}\n }\n }\n\n // Remove expired entries\n for (const [k, ts] of Object.entries(set)) {\n if (ts < cutoff) delete set[k]\n }\n\n set[value] = now\n\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(set), { expirationTtl: ttlSeconds })\n }\n\n private async getSetSize(key: string): Promise {\n const existing = await this.kv.get(key)\n if (!existing) return 0\n\n try {\n const set = JSON.parse(existing)\n return Object.keys(set).length\n } catch {\n return 0\n }\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventFilters, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\napiRoutes.use('*', requireAuth())\n\n// Check admin role\napiRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// GET /api/security-audit/events\napiRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? Math.min(parseInt(c.req.query('limit')!), 100) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await service.getEvents(filters)\n return c.json(result)\n})\n\n// GET /api/security-audit/events/:id\napiRoutes.get('/events/:id', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const event = await service.getEvent(c.req.param('id'))\n\n if (!event) {\n return c.json({ error: 'Event not found' }, 404)\n }\n\n return c.json(event)\n})\n\n// GET /api/security-audit/stats\napiRoutes.get('/stats', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const stats = await service.getStats()\n return c.json(stats)\n})\n\n// GET /api/security-audit/stats/ips\napiRoutes.get('/stats/ips', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const limit = c.req.query('limit') ? parseInt(c.req.query('limit')!) : 10\n const ips = await service.getTopIPs(limit)\n return c.json(ips)\n})\n\n// GET /api/security-audit/stats/trend\napiRoutes.get('/stats/trend', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const hours = c.req.query('hours') ? parseInt(c.req.query('hours')!) : 24\n const trend = await service.getHourlyTrend(hours)\n return c.json(trend)\n})\n\n// GET /api/security-audit/lockouts\napiRoutes.get('/lockouts', async (c) => {\n const kv = c.env.CACHE_KV\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n const lockouts = await detector.getActiveLockouts()\n return c.json(lockouts)\n})\n\n// DELETE /api/security-audit/lockouts/:key\napiRoutes.delete('/lockouts/:key', async (c) => {\n const kv = c.env.CACHE_KV\n const key = decodeURIComponent(c.req.param('key'))\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n await detector.releaseLockout(key)\n return c.json({ success: true })\n})\n\n// POST /api/security-audit/events/purge\napiRoutes.post('/events/purge', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const body = await c.req.json().catch(() => ({})) as { daysToKeep?: number }\n const deleted = await service.purgeOldEvents(body.daysToKeep)\n return c.json({ success: true, deleted })\n})\n\n// GET /api/security-audit/export\napiRoutes.get('/export', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const format = c.req.query('format') || 'json'\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n limit: 10000,\n page: 1\n }\n\n const { events } = await service.getEvents(filters)\n\n if (format === 'csv') {\n const headers = ['id', 'event_type', 'severity', 'email', 'ip_address', 'country_code', 'blocked', 'created_at']\n const csvRows = [headers.join(',')]\n for (const event of events) {\n csvRows.push([\n event.id,\n event.eventType,\n event.severity,\n event.email || '',\n event.ipAddress || '',\n event.countryCode || '',\n event.blocked ? '1' : '0',\n new Date(event.createdAt).toISOString()\n ].map(v => `\"${String(v).replace(/\"/g, '\"\"')}\"`).join(','))\n }\n\n return new Response(csvRows.join('\\n'), {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"security-events-${Date.now()}.csv\"`\n }\n })\n }\n\n return c.json(events)\n})\n\nexport { apiRoutes as securityAuditApiRoutes }\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../../../../app'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { SecurityAuditSettings, SecurityEventType } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nfunction extractRequestInfo(c: Context<{ Bindings: Bindings; Variables: Variables }>) {\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n const countryCode = c.req.header('cf-ipcountry') || null\n const path = new URL(c.req.url).pathname\n const method = c.req.method\n\n return { ip, userAgent, countryCode, path, method }\n}\n\nfunction generateFingerprint(ip: string, userAgent: string): string {\n // Simple fingerprint from IP + UA - using a basic hash\n const str = `${ip}:${userAgent}`\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash |= 0\n }\n return Math.abs(hash).toString(36)\n}\n\nasync function getPluginSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch {\n // Plugin not installed or DB not ready\n }\n return DEFAULT_SETTINGS\n}\n\nasync function isPluginActive(db: any): Promise {\n try {\n const result = await db.prepare(\n \"SELECT status FROM plugins WHERE id = 'security-audit'\"\n ).first() as { status: string } | null\n return result?.status === 'active'\n } catch {\n return false\n }\n}\n\nexport function securityAuditMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n\n // Only intercept auth-related routes\n if (!path.startsWith('/auth/')) {\n return next()\n }\n\n const db = c.env.DB\n\n // Check if plugin is active\n if (!await isPluginActive(db)) {\n return next()\n }\n\n const settings = await getPluginSettings(db)\n const { ip, userAgent, countryCode, method } = extractRequestInfo(c)\n const fingerprint = generateFingerprint(ip, userAgent)\n\n // For login POST, extract email and check lockout before proceeding\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n let preExtractedEmail = ''\n\n if (isLoginPost) {\n try {\n if (path === '/auth/login/form') {\n // Form-based login: clone request to read formData without consuming it\n const clonedReq = c.req.raw.clone()\n const formData = await clonedReq.formData()\n preExtractedEmail = (formData.get('email') as string || '').toLowerCase()\n } else {\n // JSON login: Hono caches parsed JSON so this is safe\n const body = await c.req.json()\n preExtractedEmail = body?.email?.toLowerCase() || ''\n }\n } catch {\n // Can't parse body, continue\n }\n\n if (preExtractedEmail && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const lockStatus = await detector.isLocked(ip, preExtractedEmail)\n\n if (lockStatus.locked) {\n const service = new SecurityAuditService(db, settings)\n // Log the blocked attempt asynchronously\n const logPromise = service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: preExtractedEmail,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n blocked: true,\n details: { reason: lockStatus.reason }\n })\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n\n return c.json({\n error: lockStatus.reason || 'Too many failed attempts. Please try again later.'\n }, 429)\n }\n }\n }\n\n // Proceed with the request\n await next()\n\n // After response, log the event asynchronously\n const logPromise = logAuthEvent(c, db, settings, ip, userAgent, countryCode, fingerprint, path, method, preExtractedEmail)\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n }\n}\n\nasync function logAuthEvent(\n c: Context<{ Bindings: Bindings; Variables: Variables }>,\n db: any,\n settings: SecurityAuditSettings,\n ip: string,\n userAgent: string,\n countryCode: string | null,\n fingerprint: string,\n path: string,\n method: string,\n preExtractedEmail: string = ''\n): Promise {\n try {\n const service = new SecurityAuditService(db, settings)\n const status = c.res.status\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n const isFormLogin = path === '/auth/login/form'\n\n // Login POST\n if (isLoginPost) {\n // Determine if login succeeded or failed.\n // JSON login: 200 = success, 401/400 = failure\n // Form login: always returns 200 — check if response set an auth cookie (HX-Redirect header indicates success)\n let loginSucceeded: boolean\n if (isFormLogin) {\n // Form login redirects to /admin on success via HX-Redirect header or meta refresh\n const hxRedirect = c.res.headers.get('HX-Redirect')\n const setCookieHeader = c.res.headers.get('set-cookie') || ''\n loginSucceeded = !!(hxRedirect?.includes('/admin') || setCookieHeader.includes('auth_token'))\n } else {\n loginSucceeded = status === 200\n }\n\n if (loginSucceeded) {\n if (!settings.logging.logSuccessfulLogins) return\n\n // Try to get user info from response\n let email = preExtractedEmail\n let userId = ''\n if (!isFormLogin) {\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || email\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n }\n\n await service.logEvent({\n eventType: 'login_success',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n } else {\n // Failed login — use pre-extracted email since body is already consumed\n const email = preExtractedEmail\n\n await service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { statusCode: status }\n })\n\n // Record failed attempt for brute-force detection\n if (email && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const result = await detector.recordFailedAttempt(ip, email)\n\n if (result.shouldLockIP) {\n await detector.lockIP(ip)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_ip', attemptCount: result.ipCount }\n })\n }\n\n if (result.shouldLockEmail) {\n await detector.lockEmail(email)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_email', attemptCount: result.emailCount }\n })\n }\n\n if (result.isSuspicious) {\n await service.logEvent({\n eventType: 'suspicious_activity',\n severity: 'critical',\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'multiple_emails_from_ip', ipCount: result.ipCount }\n })\n }\n }\n }\n }\n\n // Registration POST\n if (path === '/auth/register' && method === 'POST' && settings.logging.logRegistrations) {\n if (status === 201 || status === 200) {\n let email = ''\n let userId = ''\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || ''\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n\n await service.logEvent({\n eventType: 'registration',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n }\n\n // Logout\n if (path === '/auth/logout' && settings.logging.logLogouts) {\n const user = c.get('user')\n await service.logEvent({\n eventType: 'logout',\n severity: 'info',\n userId: user?.userId,\n email: user?.email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n } catch (error) {\n console.error('[SecurityAudit] Error logging auth event:', error)\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { securityAuditAdminRoutes } from './routes/admin'\nimport { securityAuditApiRoutes } from './routes/api'\nimport { securityAuditMiddleware } from './middleware/audit-middleware'\n\nexport function createSecurityAuditPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'security-audit',\n version: '1.0.0-beta.1',\n description: 'Security event logging, brute-force detection, and analytics dashboard'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard and event log routes\n builder.addRoute('/admin/plugins/security-audit', securityAuditAdminRoutes as any, {\n description: 'Security audit dashboard and admin pages',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes\n builder.addRoute('/api/security-audit', securityAuditApiRoutes as any, {\n description: 'Security audit API endpoints',\n requiresAuth: true,\n priority: 50\n })\n\n // Admin menu item — icon is raw SVG to match sidebar rendering\n builder.addMenuItem('Security', '/admin/plugins/security-audit', {\n icon: ``,\n order: 85\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async (context) => {\n console.log('[SecurityAudit] Plugin installed')\n },\n activate: async (context) => {\n console.log('[SecurityAudit] Plugin activated')\n },\n deactivate: async (context) => {\n console.log('[SecurityAudit] Plugin deactivated')\n },\n uninstall: async (context) => {\n console.log('[SecurityAudit] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const securityAuditPlugin = createSecurityAuditPlugin()\nexport { SecurityAuditService } from './services/security-audit-service'\nexport { BruteForceDetector } from './services/brute-force-detector'\nexport { securityAuditMiddleware } from './middleware/audit-middleware'\nexport default securityAuditPlugin\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n Subscription,\n SubscriptionInsert,\n SubscriptionFilters,\n SubscriptionStats,\n SubscriptionStatus\n} from '../types'\n\n/**\n * Manages subscription records in D1\n */\nexport class SubscriptionService {\n constructor(private db: D1Database) {}\n\n /**\n * Ensure the subscriptions table exists\n */\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS subscriptions (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n user_id TEXT NOT NULL,\n stripe_customer_id TEXT NOT NULL,\n stripe_subscription_id TEXT NOT NULL UNIQUE,\n stripe_price_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'incomplete',\n current_period_start INTEGER NOT NULL DEFAULT 0,\n current_period_end INTEGER NOT NULL DEFAULT 0,\n cancel_at_period_end INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\n )\n `).run()\n\n // Indexes for common lookups\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_user_id ON subscriptions(user_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_customer_id ON subscriptions(stripe_customer_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_subscription_id ON subscriptions(stripe_subscription_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_status ON subscriptions(status)\n `).run()\n }\n\n /**\n * Create a new subscription record\n */\n async create(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Upsert a subscription by stripe_subscription_id (INSERT or UPDATE on conflict)\n */\n async upsert(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_subscription_id) DO UPDATE SET\n status = excluded.status,\n stripe_price_id = excluded.stripe_price_id,\n current_period_start = excluded.current_period_start,\n current_period_end = excluded.current_period_end,\n cancel_at_period_end = excluded.cancel_at_period_end,\n updated_at = unixepoch()\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Update a subscription by its Stripe subscription ID\n */\n async updateByStripeId(stripeSubscriptionId: string, data: Partial): Promise {\n const sets: string[] = []\n const values: any[] = []\n\n if (data.status !== undefined) {\n sets.push('status = ?')\n values.push(data.status)\n }\n if (data.stripePriceId !== undefined) {\n sets.push('stripe_price_id = ?')\n values.push(data.stripePriceId)\n }\n if (data.currentPeriodStart !== undefined) {\n sets.push('current_period_start = ?')\n values.push(data.currentPeriodStart)\n }\n if (data.currentPeriodEnd !== undefined) {\n sets.push('current_period_end = ?')\n values.push(data.currentPeriodEnd)\n }\n if (data.cancelAtPeriodEnd !== undefined) {\n sets.push('cancel_at_period_end = ?')\n values.push(data.cancelAtPeriodEnd ? 1 : 0)\n }\n\n if (sets.length === 0) return this.getByStripeSubscriptionId(stripeSubscriptionId)\n\n sets.push('updated_at = unixepoch()')\n values.push(stripeSubscriptionId)\n\n const result = await this.db.prepare(`\n UPDATE subscriptions SET ${sets.join(', ')} WHERE stripe_subscription_id = ? RETURNING *\n `).bind(...values).first()\n\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe subscription ID\n */\n async getByStripeSubscriptionId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get the active subscription for a user\n */\n async getByUserId(userId: string): Promise {\n const result = await this.db.prepare(\n \"SELECT * FROM subscriptions WHERE user_id = ? ORDER BY CASE WHEN status = 'active' THEN 0 WHEN status = 'trialing' THEN 1 ELSE 2 END, updated_at DESC LIMIT 1\"\n ).bind(userId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe customer ID\n */\n async getByStripeCustomerId(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_customer_id = ? ORDER BY updated_at DESC LIMIT 1'\n ).bind(stripeCustomerId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Find the userId linked to a Stripe customer ID\n */\n async getUserIdByStripeCustomer(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT user_id FROM subscriptions WHERE stripe_customer_id = ? LIMIT 1'\n ).bind(stripeCustomerId).first() as { user_id: string } | null\n return result?.user_id ?? null\n }\n\n /**\n * List subscriptions with filters and pagination\n */\n async list(filters: SubscriptionFilters = {}): Promise<{ subscriptions: Subscription[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.userId) {\n where.push('user_id = ?')\n values.push(filters.userId)\n }\n if (filters.stripeCustomerId) {\n where.push('stripe_customer_id = ?')\n values.push(filters.stripeCustomerId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM subscriptions ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n // Get paginated results\n const results = await this.db.prepare(\n `SELECT s.*, u.email as user_email FROM subscriptions s LEFT JOIN users u ON s.user_id = u.id ${whereClause} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n subscriptions: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n /**\n * Get subscription stats\n */\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\n SUM(CASE WHEN status = 'canceled' THEN 1 ELSE 0 END) as canceled,\n SUM(CASE WHEN status = 'past_due' THEN 1 ELSE 0 END) as past_due,\n SUM(CASE WHEN status = 'trialing' THEN 1 ELSE 0 END) as trialing\n FROM subscriptions\n `).first() as any\n\n return {\n total: result?.total || 0,\n active: result?.active || 0,\n canceled: result?.canceled || 0,\n pastDue: result?.past_due || 0,\n trialing: result?.trialing || 0\n }\n }\n\n /**\n * Delete a subscription record by Stripe subscription ID\n */\n async deleteByStripeId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'DELETE FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).run()\n return (result.meta?.changes || 0) > 0\n }\n\n private mapRow(row: Record): Subscription {\n return {\n id: row.id,\n userId: row.user_id,\n stripeCustomerId: row.stripe_customer_id,\n stripeSubscriptionId: row.stripe_subscription_id,\n stripePriceId: row.stripe_price_id,\n status: row.status as SubscriptionStatus,\n currentPeriodStart: row.current_period_start,\n currentPeriodEnd: row.current_period_end,\n cancelAtPeriodEnd: !!row.cancel_at_period_end,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n // Attach email if joined\n ...(row.user_email ? { userEmail: row.user_email } : {})\n } as Subscription\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { StripeEventRecord, StripeEventFilters, StripeEventStats } from '../types'\n\n/**\n * Manages Stripe event log records in D1\n */\nexport class StripeEventService {\n constructor(private db: D1Database) {}\n\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS stripe_events (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n stripe_event_id TEXT NOT NULL UNIQUE,\n type TEXT NOT NULL,\n object_id TEXT NOT NULL DEFAULT '',\n object_type TEXT NOT NULL DEFAULT '',\n data TEXT NOT NULL DEFAULT '{}',\n processed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n status TEXT NOT NULL DEFAULT 'processed',\n error TEXT\n )\n `).run()\n\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_type ON stripe_events(type)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_status ON stripe_events(status)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_processed_at ON stripe_events(processed_at DESC)\n `).run()\n }\n\n async log(event: {\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: Record\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n }): Promise {\n await this.db.prepare(`\n INSERT INTO stripe_events (stripe_event_id, type, object_id, object_type, data, status, error)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_event_id) DO UPDATE SET\n status = excluded.status,\n error = excluded.error,\n processed_at = unixepoch()\n `).bind(\n event.stripeEventId,\n event.type,\n event.objectId,\n event.objectType,\n JSON.stringify(event.data),\n event.status,\n event.error || null\n ).run()\n }\n\n async list(filters: StripeEventFilters = {}): Promise<{ events: StripeEventRecord[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.type) {\n where.push('type = ?')\n values.push(filters.type)\n }\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.objectId) {\n where.push('object_id = ?')\n values.push(filters.objectId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM stripe_events ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n const results = await this.db.prepare(\n `SELECT * FROM stripe_events ${whereClause} ORDER BY processed_at DESC LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n events: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'processed' THEN 1 ELSE 0 END) as processed,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'ignored' THEN 1 ELSE 0 END) as ignored\n FROM stripe_events\n `).first() as any\n\n return {\n total: result?.total || 0,\n processed: result?.processed || 0,\n failed: result?.failed || 0,\n ignored: result?.ignored || 0\n }\n }\n\n async getDistinctTypes(): Promise {\n const results = await this.db.prepare(\n 'SELECT DISTINCT type FROM stripe_events ORDER BY type'\n ).all()\n return (results.results || []).map((r: any) => r.type)\n }\n\n private mapRow(row: Record): StripeEventRecord {\n return {\n id: row.id,\n stripeEventId: row.stripe_event_id,\n type: row.type,\n objectId: row.object_id,\n objectType: row.object_type,\n data: row.data,\n processedAt: row.processed_at,\n status: row.status,\n error: row.error || undefined\n }\n }\n}\n","import type { Subscription, SubscriptionStats, SubscriptionStatus } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface StripePageData {\n subscriptions: (Subscription & { userEmail?: string })[]\n stats: SubscriptionStats\n filters: { status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSubscriptionsPage(data: StripePageData): string {\n const { subscriptions, stats, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Manage subscriptions, view billing status, and monitor payment events.\n

\n
\n
\n \n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe')}\n\n \n
\n ${statsCard('Total', stats.total, 'text-zinc-950 dark:text-white')}\n ${statsCard('Active', stats.active, 'text-emerald-600 dark:text-emerald-400')}\n ${statsCard('Trialing', stats.trialing, 'text-blue-600 dark:text-blue-400')}\n ${statsCard('Past Due', stats.pastDue, 'text-amber-600 dark:text-amber-400')}\n ${statsCard('Canceled', stats.canceled, 'text-red-600 dark:text-red-400')}\n
\n\n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${subscriptions.length === 0\n ? ''\n : subscriptions.map(renderRow).join('')\n }\n \n
UserStatusPrice IDCurrent PeriodCancel at EndStripe
No subscriptions found
\n\n ${renderPagination(filters.page, filters.totalPages, filters.status)}\n
\n\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Subscriptions',\n pageTitle: 'Stripe Subscriptions',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction statsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction statusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.replace('_', ' ').replace(/\\b\\w/g, c => c.toUpperCase())\n return ``\n}\n\nfunction statusBadge(status: SubscriptionStatus): string {\n const colors: Record = {\n active: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n trialing: 'bg-blue-400/10 text-blue-500 dark:text-blue-400 ring-blue-400/20',\n past_due: 'bg-amber-400/10 text-amber-500 dark:text-amber-400 ring-amber-400/20',\n canceled: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n unpaid: 'bg-orange-400/10 text-orange-500 dark:text-orange-400 ring-orange-400/20',\n paused: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete_expired: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n const label = status.replace('_', ' ')\n return `${label}`\n}\n\nfunction formatDate(timestamp: number): string {\n if (!timestamp) return '-'\n return new Date(timestamp * 1000).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })\n}\n\nfunction renderRow(sub: Subscription & { userEmail?: string }): string {\n return `\n \n \n
${sub.userEmail || sub.userId}
\n
${sub.stripeCustomerId}
\n \n ${statusBadge(sub.status)}\n ${sub.stripePriceId}\n \n ${formatDate(sub.currentPeriodStart)} - ${formatDate(sub.currentPeriodEnd)}\n \n \n ${sub.cancelAtPeriodEnd\n ? 'Yes'\n : 'No'\n }\n \n \n \n View in Stripe\n \n \n \n `\n}\n\nfunction renderPagination(page: number, totalPages: number, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params = status ? `&status=${status}` : ''\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","/**\n * Shared tab bar for all Stripe admin pages.\n */\n\nconst TABS = [\n { label: 'Subscriptions', path: '/admin/plugins/stripe' },\n { label: 'Events', path: '/admin/plugins/stripe/events' },\n { label: 'Settings', path: '/admin/plugins/stripe/settings' },\n]\n\nexport function renderStripeTabBar(currentPath: string): string {\n const tabs = TABS.map(tab => {\n const isActive = currentPath === tab.path\n || (tab.path === '/admin/plugins/stripe' && currentPath === '/admin/plugins/stripe/')\n return `\n \n ${tab.label}\n `\n }).join('')\n\n return `\n
\n \n
\n `\n}\n","import type { StripeEventRecord, StripeEventStats } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface EventsPageData {\n events: StripeEventRecord[]\n stats: StripeEventStats\n types: string[]\n filters: { type?: string; status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderEventsPage(data: EventsPageData): string {\n const { events, stats, types, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Webhook event log showing all processed, failed, and ignored Stripe events.\n

\n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/events')}\n\n \n
\n ${eventStatsCard('Total Events', stats.total, 'text-zinc-950 dark:text-white')}\n ${eventStatsCard('Processed', stats.processed, 'text-emerald-600 dark:text-emerald-400')}\n ${eventStatsCard('Failed', stats.failed, 'text-red-600 dark:text-red-400')}\n ${eventStatsCard('Ignored', stats.ignored, 'text-zinc-500 dark:text-zinc-400')}\n
\n\n \n
\n
\n \n \n\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n ${events.length === 0\n ? ''\n : events.map(renderEventRow).join('')\n }\n \n
TimeTypeObject / UserStatusEvent ID
No events recorded yet
\n\n ${renderEventPagination(filters.page, filters.totalPages, filters.type, filters.status)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Events',\n pageTitle: 'Stripe Events',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction eventStatsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction eventStatusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.charAt(0).toUpperCase() + value.slice(1)\n return ``\n}\n\nfunction eventStatusBadge(status: string): string {\n const colors: Record = {\n processed: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n failed: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n ignored: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n return `${status}`\n}\n\nfunction formatTimestamp(timestamp: number): string {\n if (!timestamp) return '-'\n const d = new Date(timestamp * 1000)\n return d.toLocaleString('en-US', {\n month: 'short', day: 'numeric', year: 'numeric',\n hour: '2-digit', minute: '2-digit', second: '2-digit'\n })\n}\n\nfunction extractUserInfo(event: StripeEventRecord): { userId?: string; email?: string } {\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n const userId = data?.metadata?.sonicjs_user_id || data?.sonicjs_user_id\n const email = data?.customer_email || data?.customerEmail || data?.receipt_email\n return { userId: userId || undefined, email: email || undefined }\n } catch {\n return {}\n }\n}\n\nfunction renderEventRow(event: StripeEventRecord): string {\n const errorTooltip = event.error ? ` title=\"${event.error.replace(/\"/g, '"')}\"` : ''\n const userInfo = extractUserInfo(event)\n const userLink = userInfo.userId\n ? `${userInfo.email || userInfo.userId}`\n : userInfo.email\n ? `${userInfo.email}`\n : ''\n\n return `\n \n \n ${formatTimestamp(event.processedAt)}\n \n \n ${event.type}\n \n \n
${event.objectId || '-'}
\n
${event.objectType}
\n ${userLink ? `
${userLink}
` : ''}\n \n ${eventStatusBadge(event.status)}\n ${event.stripeEventId}\n \n `\n}\n\nfunction renderEventPagination(page: number, totalPages: number, type?: string, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params: string[] = []\n if (type) params.push(`type=${type}`)\n if (status) params.push(`status=${status}`)\n const extra = params.length > 0 ? `&${params.join('&')}` : ''\n\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","// ============================================================================\n// Stripe Plugin Types\n// ============================================================================\n\nexport type SubscriptionStatus =\n | 'active'\n | 'canceled'\n | 'past_due'\n | 'trialing'\n | 'unpaid'\n | 'paused'\n | 'incomplete'\n | 'incomplete_expired'\n\nexport interface Subscription {\n id: string\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd: boolean\n createdAt: number\n updatedAt: number\n}\n\nexport interface SubscriptionInsert {\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd?: boolean\n}\n\nexport interface SubscriptionFilters {\n status?: SubscriptionStatus\n userId?: string\n stripeCustomerId?: string\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'updated_at' | 'status'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SubscriptionStats {\n total: number\n active: number\n canceled: number\n pastDue: number\n trialing: number\n}\n\nexport interface StripePluginSettings {\n stripePublishableKey: string\n stripeSecretKey: string\n stripeWebhookSecret: string\n stripePriceId?: string\n successUrl: string\n cancelUrl: string\n}\n\nexport const DEFAULT_SETTINGS: StripePluginSettings = {\n stripePublishableKey: '',\n stripeSecretKey: '',\n stripeWebhookSecret: '',\n stripePriceId: '',\n successUrl: '/admin/dashboard',\n cancelUrl: '/admin/dashboard'\n}\n\n// Stripe webhook event types we handle\nexport type StripeWebhookEventType =\n | 'customer.subscription.created'\n | 'customer.subscription.updated'\n | 'customer.subscription.deleted'\n | 'checkout.session.completed'\n | 'invoice.payment_succeeded'\n | 'invoice.payment_failed'\n\n// Minimal Stripe types (we use fetch, not the SDK)\nexport interface StripeEvent {\n id: string\n type: string\n data: {\n object: Record\n }\n}\n\nexport interface StripeSubscriptionObject {\n id: string\n customer: string\n status: string\n items: {\n data: Array<{\n price: {\n id: string\n }\n }>\n }\n current_period_start: number\n current_period_end: number\n cancel_at_period_end: boolean\n metadata?: Record\n}\n\nexport interface StripeCheckoutSession {\n id: string\n customer: string\n subscription: string\n metadata?: Record\n}\n\nexport interface StripeInvoice {\n id: string\n customer: string\n subscription: string | null\n status: string\n amount_paid: number\n currency: string\n}\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\nexport interface StripeEventRecord {\n id: string\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: string // JSON string\n processedAt: number\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n}\n\nexport interface StripeEventFilters {\n type?: string\n status?: 'processed' | 'failed' | 'ignored'\n objectId?: string\n page?: number\n limit?: number\n}\n\nexport interface StripeEventStats {\n total: number\n processed: number\n failed: number\n ignored: number\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { renderSubscriptionsPage } from '../components/subscriptions-page'\nimport { renderEventsPage } from '../components/events-page'\nimport { renderStripeTabBar } from '../components/tab-bar'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { StripePluginSettings, SubscriptionStatus } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Subscriptions dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const statusFilter = c.req.query('status') as SubscriptionStatus | undefined\n\n const [{ subscriptions, total }, stats] = await Promise.all([\n subscriptionService.list({ status: statusFilter, page, limit }),\n subscriptionService.getStats()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderSubscriptionsPage({\n subscriptions: subscriptions as any,\n stats,\n filters: { status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Events log page\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const typeFilter = c.req.query('type') || undefined\n const statusFilter = c.req.query('status') as 'processed' | 'failed' | 'ignored' | undefined\n\n const [{ events, total }, stats, types] = await Promise.all([\n eventService.list({ type: typeFilter, status: statusFilter, page, limit }),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderEventsPage({\n events,\n stats,\n types,\n filters: { type: typeFilter, status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const { renderAdminLayoutCatalyst } = await import('../../../../templates/layouts/admin-layout-catalyst.template')\n\n const content = `\n
\n
\n

Stripe

\n

\n Configure your Stripe API keys and checkout options.\n

\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/settings')}\n\n
\n\n
\n
\n
\n \n \n

Your Stripe publishable key (starts with pk_)

\n
\n\n
\n \n \n

Your Stripe secret API key (starts with sk_)

\n
\n\n
\n \n \n

Stripe webhook endpoint signing secret (starts with whsec_)

\n
\n\n
\n \n \n

Default Stripe Price ID for checkout sessions (optional)

\n
\n\n
\n \n \n

Redirect URL after successful checkout

\n
\n\n
\n \n \n

Redirect URL if checkout is cancelled

\n
\n
\n\n
\n \n
\n
\n
\n\n \n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Stripe Settings',\n pageTitle: 'Stripe Settings',\n currentPath: '/admin/plugins/stripe',\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n content,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'stripe'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving Stripe settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n})\n\nexport { adminRoutes as stripeAdminRoutes }\n","import type { StripePluginSettings } from '../types'\n\n/**\n * Lightweight Stripe API client using fetch (CF Workers compatible, no SDK needed)\n */\nexport class StripeAPI {\n private baseUrl = 'https://api.stripe.com/v1'\n\n constructor(private secretKey: string) {}\n\n /**\n * Verify a webhook signature\n * Implements Stripe's v1 signature scheme using Web Crypto API\n */\n async verifyWebhookSignature(payload: string, sigHeader: string, secret: string): Promise {\n const parts = sigHeader.split(',')\n const timestamp = parts.find(p => p.startsWith('t='))?.split('=')[1]\n const signatures = parts\n .filter(p => p.startsWith('v1='))\n .map(p => p.substring(3))\n\n if (!timestamp || signatures.length === 0) return false\n\n // Reject events older than 5 minutes (tolerance)\n const now = Math.floor(Date.now() / 1000)\n if (Math.abs(now - parseInt(timestamp)) > 300) return false\n\n // Compute expected signature\n const signedPayload = `${timestamp}.${payload}`\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(signedPayload))\n const expectedSignature = Array.from(new Uint8Array(signatureBuffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n\n return signatures.some(sig => timingSafeEqual(sig, expectedSignature))\n }\n\n /**\n * Create a Checkout Session\n */\n async createCheckoutSession(params: {\n priceId: string\n customerId?: string\n customerEmail?: string\n successUrl: string\n cancelUrl: string\n metadata?: Record\n }): Promise<{ id: string; url: string }> {\n const body = new URLSearchParams()\n body.append('mode', 'subscription')\n body.append('line_items[0][price]', params.priceId)\n body.append('line_items[0][quantity]', '1')\n body.append('success_url', params.successUrl)\n body.append('cancel_url', params.cancelUrl)\n\n if (params.customerId) {\n body.append('customer', params.customerId)\n } else if (params.customerEmail) {\n body.append('customer_email', params.customerEmail)\n }\n\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n\n const response = await this.request('POST', '/checkout/sessions', body)\n return { id: response.id, url: response.url }\n }\n\n /**\n * Retrieve a Stripe subscription\n */\n async getSubscription(subscriptionId: string): Promise {\n return this.request('GET', `/subscriptions/${subscriptionId}`)\n }\n\n /**\n * Create a Stripe customer\n */\n async createCustomer(params: { email: string; metadata?: Record }): Promise<{ id: string }> {\n const body = new URLSearchParams()\n body.append('email', params.email)\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n return this.request('POST', '/customers', body)\n }\n\n /**\n * List subscriptions with pagination (auto-expands across pages)\n */\n async listSubscriptions(params?: {\n status?: string\n limit?: number\n startingAfter?: string\n }): Promise<{ data: any[]; has_more: boolean }> {\n const qs = new URLSearchParams()\n qs.append('limit', String(params?.limit || 100))\n if (params?.status) qs.append('status', params.status)\n if (params?.startingAfter) qs.append('starting_after', params.startingAfter)\n return this.request('GET', `/subscriptions?${qs.toString()}`)\n }\n\n /**\n * Fetch ALL subscriptions from Stripe (handles pagination automatically)\n */\n async listAllSubscriptions(): Promise {\n const all: any[] = []\n let startingAfter: string | undefined\n\n while (true) {\n const result = await this.listSubscriptions({ limit: 100, startingAfter })\n all.push(...result.data)\n if (!result.has_more || result.data.length === 0) break\n startingAfter = result.data[result.data.length - 1].id\n }\n\n return all\n }\n\n /**\n * Search for a customer by email\n */\n async findCustomerByEmail(email: string): Promise<{ id: string } | null> {\n const params = new URLSearchParams()\n params.append('query', `email:'${email}'`)\n params.append('limit', '1')\n const result = await this.request('GET', `/customers/search?${params.toString()}`)\n return result.data?.[0] || null\n }\n\n private async request(method: string, path: string, body?: URLSearchParams): Promise {\n const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${this.secretKey}`,\n ...(body ? { 'Content-Type': 'application/x-www-form-urlencoded' } : {})\n },\n ...(body ? { body: body.toString() } : {})\n })\n\n const data = await response.json() as any\n if (!response.ok) {\n throw new Error(`Stripe API error: ${data.error?.message || response.statusText}`)\n }\n return data\n }\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks on signature verification\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n return result === 0\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { StripeAPI } from '../services/stripe-api'\nimport type { Bindings, Variables } from '../../../../app'\nimport type {\n StripePluginSettings,\n StripeEvent,\n StripeSubscriptionObject,\n StripeCheckoutSession,\n StripeInvoice,\n SubscriptionStatus,\n SubscriptionFilters\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\nfunction mapStripeStatus(status: string): SubscriptionStatus {\n const map: Record = {\n active: 'active',\n canceled: 'canceled',\n past_due: 'past_due',\n trialing: 'trialing',\n unpaid: 'unpaid',\n paused: 'paused',\n incomplete: 'incomplete',\n incomplete_expired: 'incomplete_expired'\n }\n return map[status] || 'incomplete'\n}\n\n// ============================================================================\n// Webhook — No auth, verified by Stripe signature\n// ============================================================================\n\napiRoutes.post('/webhook', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeWebhookSecret) {\n return c.json({ error: 'Webhook secret not configured' }, 500)\n }\n\n // Must read raw body for signature verification\n const rawBody = await c.req.text()\n const sigHeader = c.req.header('stripe-signature') || ''\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const isValid = await stripeApi.verifyWebhookSignature(rawBody, sigHeader, settings.stripeWebhookSecret)\n\n if (!isValid) {\n return c.json({ error: 'Invalid signature' }, 400)\n }\n\n const event: StripeEvent = JSON.parse(rawBody)\n const subscriptionService = new SubscriptionService(db)\n const eventService = new StripeEventService(db)\n await Promise.all([subscriptionService.ensureTable(), eventService.ensureTable()])\n\n // Determine object ID and type for the event log\n const obj = event.data.object as any\n const objectId = obj?.id || ''\n const objectType = obj?.object || event.type.split('.')[0] || ''\n\n try {\n switch (event.type) {\n case 'customer.subscription.created': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n\n await subscriptionService.create({\n userId,\n stripeCustomerId: sub.customer,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items.data[0]?.price.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription created: ${sub.id}`)\n break\n }\n\n case 'customer.subscription.updated': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: mapStripeStatus(sub.status),\n stripePriceId: sub.items.data[0]?.price.id || undefined,\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription updated: ${sub.id} -> ${sub.status}`)\n break\n }\n\n case 'customer.subscription.deleted': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: 'canceled'\n })\n\n console.log(`[Stripe] Subscription deleted: ${sub.id}`)\n break\n }\n\n case 'checkout.session.completed': {\n const session = event.data.object as unknown as StripeCheckoutSession\n const userId = session.metadata?.sonicjs_user_id\n\n if (userId && session.subscription) {\n const existing = await subscriptionService.getByStripeSubscriptionId(session.subscription)\n if (existing && !existing.userId) {\n await subscriptionService.updateByStripeId(session.subscription, {\n userId\n } as any)\n }\n }\n\n console.log(`[Stripe] Checkout completed: ${session.id}`)\n break\n }\n\n case 'invoice.payment_succeeded': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'active'\n })\n }\n console.log(`[Stripe] Payment succeeded for invoice: ${invoice.id}`)\n break\n }\n\n case 'invoice.payment_failed': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'past_due'\n })\n }\n console.log(`[Stripe] Payment failed for invoice: ${invoice.id}`)\n break\n }\n\n default:\n console.log(`[Stripe] Unhandled event type: ${event.type}`)\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'ignored'\n })\n return c.json({ received: true })\n }\n\n // Log successfully processed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'processed'\n })\n } catch (error) {\n // Log failed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error)\n }).catch(() => {}) // Don't let logging failure mask the real error\n\n console.error(`[Stripe] Error processing webhook event ${event.type}:`, error)\n return c.json({ error: 'Webhook processing failed' }, 500)\n }\n\n return c.json({ received: true })\n})\n\n// ============================================================================\n// Authenticated API Routes\n// ============================================================================\n\n// Create checkout session for current user\napiRoutes.post('/create-checkout-session', requireAuth(), async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const settings = await getSettings(db)\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe not configured' }, 500)\n }\n\n const body = await c.req.json().catch(() => ({})) as { priceId?: string }\n const priceId = body.priceId || settings.stripePriceId\n if (!priceId) {\n return c.json({ error: 'No price ID specified' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n // Check if user already has a Stripe customer ID\n const existingSub = await subscriptionService.getByUserId(user.userId)\n let customerId = existingSub?.stripeCustomerId\n\n if (!customerId) {\n // Try to find existing customer by email, or create one\n const existing = await stripeApi.findCustomerByEmail(user.email)\n if (existing) {\n customerId = existing.id\n } else {\n const customer = await stripeApi.createCustomer({\n email: user.email,\n metadata: { sonicjs_user_id: user.userId }\n })\n customerId = customer.id\n }\n }\n\n const origin = new URL(c.req.url).origin\n const session = await stripeApi.createCheckoutSession({\n priceId,\n customerId,\n successUrl: `${origin}${settings.successUrl}?session_id={CHECKOUT_SESSION_ID}`,\n cancelUrl: `${origin}${settings.cancelUrl}`,\n metadata: { sonicjs_user_id: user.userId }\n })\n\n return c.json({ sessionId: session.id, url: session.url })\n})\n\n// Get current user's subscription\napiRoutes.get('/subscription', requireAuth(), async (c) => {\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const subscription = await subscriptionService.getByUserId(user.userId)\n if (!subscription) {\n return c.json({ subscription: null })\n }\n\n return c.json({ subscription })\n})\n\n// ============================================================================\n// Admin API Routes\n// ============================================================================\n\n// List all subscriptions (admin only)\napiRoutes.get('/subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const filters: SubscriptionFilters = {\n status: c.req.query('status') as SubscriptionStatus | undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await subscriptionService.list(filters)\n return c.json(result)\n})\n\n// Get subscription stats (admin only)\napiRoutes.get('/stats', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const stats = await subscriptionService.getStats()\n return c.json(stats)\n})\n\n// ============================================================================\n// Sync Subscriptions from Stripe API\n// ============================================================================\n\napiRoutes.post('/sync-subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe secret key not configured' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n try {\n const allSubs = await stripeApi.listAllSubscriptions()\n let synced = 0\n let errors = 0\n\n for (const sub of allSubs) {\n try {\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n await subscriptionService.upsert({\n userId,\n stripeCustomerId: typeof sub.customer === 'string' ? sub.customer : sub.customer.id,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items?.data?.[0]?.price?.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n synced++\n } catch (err) {\n console.error(`[Stripe Sync] Failed to upsert subscription ${sub.id}:`, err)\n errors++\n }\n }\n\n return c.json({\n success: true,\n total: allSubs.length,\n synced,\n errors\n })\n } catch (error) {\n console.error('[Stripe Sync] Error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Sync failed'\n }, 500)\n }\n})\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\napiRoutes.get('/events', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const filters = {\n type: c.req.query('type') || undefined,\n status: c.req.query('status') as any || undefined,\n objectId: c.req.query('objectId') || undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50\n }\n\n const [result, stats, types] = await Promise.all([\n eventService.list(filters),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n return c.json({ ...result, stats, types })\n})\n\nexport { apiRoutes as stripeApiRoutes }\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { stripeAdminRoutes } from './routes/admin'\nimport { stripeApiRoutes } from './routes/api'\n\nexport function createStripePlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'stripe',\n version: '1.0.0-beta.1',\n description: 'Stripe subscription management with webhook handling, checkout sessions, and subscription gating'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard — subscription management\n builder.addRoute('/admin/plugins/stripe', stripeAdminRoutes as any, {\n description: 'Stripe subscriptions admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes — webhook, checkout, subscription status\n builder.addRoute('/api/stripe', stripeApiRoutes as any, {\n description: 'Stripe API endpoints (webhook, checkout, subscription)',\n requiresAuth: false, // Webhook route handles its own auth via signature\n priority: 50\n })\n\n // Admin menu item\n builder.addMenuItem('Stripe', '/admin/plugins/stripe', {\n icon: ``,\n order: 75\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.log('[Stripe] Plugin installed')\n },\n activate: async () => {\n console.log('[Stripe] Plugin activated')\n },\n deactivate: async () => {\n console.log('[Stripe] Plugin deactivated')\n },\n uninstall: async () => {\n console.log('[Stripe] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const stripePlugin = createStripePlugin()\nexport { SubscriptionService } from './services/subscription-service'\nexport { StripeAPI } from './services/stripe-api'\nexport { requireSubscription } from './middleware/require-subscription'\nexport default stripePlugin\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../app'\nimport { PLUGIN_REGISTRY } from '../plugins/manifest-registry'\n\n// Build menu plugin data from the auto-generated registry.\n// Any plugin with an adminMenu entry in its manifest.json will\n// automatically appear in the sidebar when active.\nconst REGISTRY_MENU_PLUGINS = Object.values(PLUGIN_REGISTRY)\n .filter(p => p.adminMenu !== null)\n .map(p => ({\n codeName: p.codeName,\n label: p.adminMenu!.label,\n path: p.adminMenu!.path,\n icon: p.adminMenu!.icon,\n order: p.adminMenu!.order,\n }))\n\n// Map icon names from manifest.json to Heroicons SVG (outline, 24x24)\nconst ICON_SVG: Record = {\n 'magnifying-glass': '',\n 'chart-bar': '',\n 'image': '',\n 'palette': '',\n 'envelope': '',\n 'hand-raised': '',\n 'key': '',\n 'arrow-right': '',\n 'shield-check': '',\n 'credit-card': '',\n}\n\nfunction resolveIcon(iconName?: string): string {\n if (!iconName) return ''\n // If it's already SVG markup, return as-is\n if (iconName.startsWith('`\n const resolvedIcon = resolveIcon(item.icon) || fallbackIcon\n return `\n \n ${isActive ? '' : ''}\n \n \n ${resolvedIcon}\n \n ${item.label}\n \n `\n}\n\nexport function pluginMenuMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n if (!path.startsWith('/admin')) {\n return next()\n }\n\n // Collect menu items from active plugins using the registry\n let activeMenuItems: Array<{ label: string; path: string; icon?: string; order: number }> = []\n try {\n const db = c.env.DB\n const pluginCodeNames = REGISTRY_MENU_PLUGINS.map(p => p.codeName)\n if (pluginCodeNames.length > 0) {\n const placeholders = pluginCodeNames.map(() => '?').join(',')\n const result = await db.prepare(\n `SELECT name FROM plugins WHERE name IN (${placeholders}) AND status = 'active'`\n ).bind(...pluginCodeNames).all()\n\n const activeNames = new Set((result.results || []).map((r: any) => r.name))\n\n for (const plugin of REGISTRY_MENU_PLUGINS) {\n if (activeNames.has(plugin.codeName)) {\n activeMenuItems.push({\n label: plugin.label,\n path: plugin.path,\n icon: plugin.icon,\n order: plugin.order,\n })\n }\n }\n\n // Sort by order\n activeMenuItems.sort((a, b) => a.order - b.order)\n }\n } catch {\n // DB not ready or plugin table doesn't exist yet\n }\n\n c.set('pluginMenuItems', activeMenuItems.map(m => ({ label: m.label, path: m.path, icon: resolveIcon(m.icon) || '' })))\n\n await next()\n\n // Inject menu items into HTML response by replacing the marker\n if (activeMenuItems.length > 0 && c.res.headers.get('content-type')?.includes('text/html')) {\n const status = c.res.status\n const headers = new Headers(c.res.headers)\n const html = await c.res.text()\n\n if (html.includes(MARKER)) {\n const renderedItems = activeMenuItems.map(item => renderMenuItem(item, path)).join('')\n const newHtml = html.split(MARKER).join(renderedItems)\n c.res = new Response(newHtml, { status, headers })\n } else {\n // Body was consumed by .text(), must create new Response either way\n c.res = new Response(html, { status, headers })\n }\n }\n }\n}\n","/**\n * SonicJS Plugin System Types\n * \n * Defines the core interfaces and types for the plugin system\n */\n\nimport { Hono, Context, Next, MiddlewareHandler } from 'hono'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\n\n// Core plugin definition\nexport interface Plugin {\n /** Unique plugin identifier */\n name: string\n /** Plugin version (semantic versioning) */\n version: string\n /** Human-readable description */\n description?: string\n /** Plugin author information */\n author?: {\n name: string\n email?: string\n url?: string\n }\n /** Plugin dependencies (other plugins required) */\n dependencies?: string[]\n /** SonicJS version compatibility */\n compatibility?: string\n /** Plugin license */\n license?: string\n \n // Extension points\n routes?: PluginRoutes[]\n middleware?: PluginMiddleware[]\n models?: PluginModel[]\n services?: PluginService[]\n adminPages?: PluginAdminPage[]\n adminComponents?: PluginComponent[]\n menuItems?: PluginMenuItem[]\n hooks?: PluginHook[]\n \n // Lifecycle hooks\n install?: (context: PluginContext) => Promise\n uninstall?: (context: PluginContext) => Promise\n activate?: (context: PluginContext) => Promise\n deactivate?: (context: PluginContext) => Promise\n configure?: (config: PluginConfig) => Promise\n}\n\n// Plugin context provides access to SonicJS APIs\nexport interface PluginContext {\n /** Database instance */\n db: D1Database\n /** Key-value storage */\n kv: KVNamespace\n /** R2 storage bucket */\n r2?: R2Bucket\n /** Plugin configuration */\n config: PluginConfig\n /** Core SonicJS services */\n services: {\n auth: AuthService\n content: ContentService\n media: MediaService\n }\n /** Hook system for inter-plugin communication */\n hooks: HookSystem | ScopedHookSystem\n /** Logging utilities */\n logger: PluginLogger\n}\n\n// Authentication service interface for plugins\nexport interface AuthService {\n /** Generate JWT token for a user */\n generateToken(userId: string, email: string, role: string): Promise\n /** Verify and decode JWT token */\n verifyToken(token: string): Promise\n /** Set authentication cookie (useful for alternative auth methods) */\n setAuthCookie(context: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void\n /** Hash password */\n hashPassword(password: string): Promise\n /** Verify password against hash */\n verifyPassword(password: string, hash: string): Promise\n}\n\n// Plugin configuration\nexport interface PluginConfig {\n /** Plugin-specific configuration */\n [key: string]: any\n /** Whether plugin is enabled */\n enabled: boolean\n /** Plugin installation timestamp */\n installedAt?: number\n /** Plugin last update timestamp */\n updatedAt?: number\n}\n\n// Route definitions\nexport interface PluginRoutes {\n /** Route path prefix */\n path: string\n /** Hono route handler */\n handler: Hono\n /** Route description */\n description?: string\n /** Whether route requires authentication */\n requiresAuth?: boolean\n /** Required roles for access */\n roles?: string[]\n /** Route priority (for ordering) */\n priority?: number\n}\n\n// Middleware definitions\nexport interface PluginMiddleware {\n /** Middleware name */\n name: string\n /** Middleware handler function */\n handler: MiddlewareHandler\n /** Middleware description */\n description?: string\n /** Middleware priority (lower = earlier) */\n priority?: number\n /** Routes to apply middleware to */\n routes?: string[]\n /** Whether to apply globally */\n global?: boolean\n}\n\n// Database model definitions\nexport interface PluginModel {\n /** Model name */\n name: string\n /** Database table name */\n tableName: string\n /** Zod schema for validation */\n schema: z.ZodSchema\n /** Database migrations */\n migrations: string[]\n /** Model relationships */\n relationships?: ModelRelationship[]\n /** Whether model extends core content */\n extendsContent?: boolean\n}\n\nexport interface ModelRelationship {\n type: 'oneToOne' | 'oneToMany' | 'manyToMany'\n target: string\n foreignKey?: string\n joinTable?: string\n}\n\n// Service definitions\nexport interface PluginService {\n /** Service name */\n name: string\n /** Service implementation */\n implementation: any\n /** Service description */\n description?: string\n /** Service dependencies */\n dependencies?: string[]\n /** Whether service is singleton */\n singleton?: boolean\n}\n\n// Admin interface extensions\nexport interface PluginAdminPage {\n /** Page path (relative to /admin) */\n path: string\n /** Page title */\n title: string\n /** Page component/template */\n component: string\n /** Page description */\n description?: string\n /** Required permissions */\n permissions?: string[]\n /** Menu item configuration */\n menuItem?: PluginMenuItem\n /** Page icon */\n icon?: string\n}\n\nexport interface PluginComponent {\n /** Component name */\n name: string\n /** Component template function */\n template: (props: any) => string\n /** Component description */\n description?: string\n /** Component props schema */\n propsSchema?: z.ZodSchema\n}\n\nexport interface PluginMenuItem {\n /** Menu item label */\n label: string\n /** Menu item path */\n path: string\n /** Menu item icon */\n icon?: string\n /** Menu item order */\n order?: number\n /** Parent menu item */\n parent?: string\n /** Required permissions */\n permissions?: string[]\n /** Whether item is active */\n active?: boolean\n}\n\n// Hook system for extensibility\nexport interface PluginHook {\n /** Hook name */\n name: string\n /** Hook handler function */\n handler: HookHandler\n /** Hook priority */\n priority?: number\n /** Hook description */\n description?: string\n}\n\nexport type HookHandler = (data: any, context: HookContext) => Promise\n\nexport interface HookContext {\n /** Plugin that registered the hook */\n plugin: string\n /** Hook execution context */\n context: PluginContext\n /** Cancel hook execution */\n cancel?: () => void\n}\n\n// Hook system interface\nexport interface HookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Get all registered hooks */\n getHooks(hookName: string): PluginHook[]\n /** Create a scoped hook system (optional) */\n createScope?(pluginName: string): ScopedHookSystem\n}\n\n// Scoped hook system for plugins\nexport interface ScopedHookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Remove all hooks for this scope */\n unregisterAll(): void\n}\n\n// Plugin registry\nexport interface PluginRegistry {\n /** Get plugin by name */\n get(name: string): Plugin | undefined\n /** Get all registered plugins */\n getAll(): Plugin[]\n /** Get active plugins */\n getActive(): Plugin[]\n /** Register a plugin */\n register(plugin: Plugin): Promise\n /** Unregister a plugin */\n unregister(name: string): Promise\n /** Check if plugin is registered */\n has(name: string): boolean\n /** Activate a plugin */\n activate(name: string): Promise\n /** Deactivate a plugin */\n deactivate(name: string): Promise\n /** Get plugin configuration */\n getConfig(name: string): PluginConfig | undefined\n /** Set plugin configuration */\n setConfig(name: string, config: PluginConfig): void\n /** Get plugin status */\n getStatus(name: string): PluginStatus | undefined\n /** Get all plugin statuses */\n getAllStatuses(): Map\n /** Resolve plugin load order based on dependencies */\n resolveLoadOrder(): string[]\n}\n\n// Plugin manager\nexport interface PluginManager {\n /** Plugin registry */\n registry: PluginRegistry\n /** Hook system */\n hooks: HookSystem\n /** Initialize plugin system */\n initialize(context: PluginContext): Promise\n /** Load plugins from configuration */\n loadPlugins(config: PluginConfig[]): Promise\n /** Install a plugin */\n install(plugin: Plugin, config?: PluginConfig): Promise\n /** Uninstall a plugin */\n uninstall(name: string): Promise\n /** Get plugin status */\n getStatus(name: string): PluginStatus\n}\n\nexport interface PluginStatus {\n name: string\n version: string\n active: boolean\n installed: boolean\n hasErrors: boolean\n errors?: string[]\n lastError?: string\n}\n\n// Service interfaces\nexport interface AuthService {\n /** Verify user permissions */\n hasPermission(userId: string, permission: string): Promise\n /** Get current user */\n getCurrentUser(context: Context): Promise\n /** Create authentication middleware */\n createMiddleware(options?: any): MiddlewareHandler\n}\n\nexport interface ContentService {\n /** Get content by ID */\n getById(id: string): Promise\n /** Create new content */\n create(data: any): Promise\n /** Update content */\n update(id: string, data: any): Promise\n /** Delete content */\n delete(id: string): Promise\n /** Search content */\n search(query: string, options?: any): Promise\n}\n\nexport interface MediaService {\n /** Upload file */\n upload(file: File, options?: any): Promise\n /** Get media by ID */\n getById(id: string): Promise\n /** Delete media */\n delete(id: string): Promise\n /** Transform image */\n transform(id: string, options: any): Promise\n}\n\n// Plugin logger\nexport interface PluginLogger {\n debug(message: string, data?: any): void\n info(message: string, data?: any): void\n warn(message: string, data?: any): void\n error(message: string, error?: Error, data?: any): void\n}\n\n// Plugin development utilities interface\n\nexport interface PluginBuilderOptions {\n name: string\n version: string\n description?: string\n author?: Plugin['author']\n dependencies?: string[]\n}\n\n// Plugin validation\nexport interface PluginValidator {\n /** Validate plugin definition */\n validate(plugin: Plugin): PluginValidationResult\n /** Validate plugin dependencies */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult\n /** Validate plugin compatibility */\n validateCompatibility(plugin: Plugin, version: string): PluginValidationResult\n}\n\nexport interface PluginValidationResult {\n valid: boolean\n errors: string[]\n warnings: string[]\n}\n\n// Standard hook names\nexport const HOOKS = {\n // Application lifecycle\n APP_INIT: 'app:init',\n APP_READY: 'app:ready',\n APP_SHUTDOWN: 'app:shutdown',\n \n // Request lifecycle\n REQUEST_START: 'request:start',\n REQUEST_END: 'request:end',\n REQUEST_ERROR: 'request:error',\n \n // Authentication\n AUTH_LOGIN: 'auth:login',\n AUTH_LOGOUT: 'auth:logout',\n AUTH_REGISTER: 'auth:register',\n USER_LOGIN: 'user:login',\n USER_LOGOUT: 'user:logout',\n \n // Content lifecycle\n CONTENT_CREATE: 'content:create',\n CONTENT_UPDATE: 'content:update',\n CONTENT_DELETE: 'content:delete',\n CONTENT_PUBLISH: 'content:publish',\n CONTENT_SAVE: 'content:save',\n \n // Media lifecycle\n MEDIA_UPLOAD: 'media:upload',\n MEDIA_DELETE: 'media:delete',\n MEDIA_TRANSFORM: 'media:transform',\n \n // Plugin lifecycle\n PLUGIN_INSTALL: 'plugin:install',\n PLUGIN_UNINSTALL: 'plugin:uninstall',\n PLUGIN_ACTIVATE: 'plugin:activate',\n PLUGIN_DEACTIVATE: 'plugin:deactivate',\n \n // Admin interface\n ADMIN_MENU_RENDER: 'admin:menu:render',\n ADMIN_PAGE_RENDER: 'admin:page:render',\n \n // Database\n DB_MIGRATE: 'db:migrate',\n DB_SEED: 'db:seed',\n} as const\n\nexport type HookName = typeof HOOKS[keyof typeof HOOKS]","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { renderAdminLayoutCatalyst } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\n// Analytics Dashboard\nadminRoutes.get('/', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Query real metrics from system_logs\n let totalRequests = 0\n let uniqueIPs = 0\n let avgDuration = 0\n let errorCount = 0\n let topPages: Array<{ path: string; views: number }> = []\n let recentActivity: Array<{ url: string; method: string; status_code: number; duration: number; created_at: number }> = []\n\n try {\n const now = Math.floor(Date.now() / 1000)\n const dayAgo = now - 86400\n\n const [requestsResult, ipsResult, durationResult, errorsResult, pagesResult, activityResult] = await Promise.all([\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT COUNT(DISTINCT ip_address) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT AVG(duration) as avg FROM system_logs WHERE category = ? AND created_at > ? AND duration IS NOT NULL')\n .bind('api', dayAgo).first() as Promise<{ avg: number } | null>,\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE level IN (?, ?) AND created_at > ?')\n .bind('error', 'fatal', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT url, COUNT(*) as views FROM system_logs WHERE category = ? AND created_at > ? AND url IS NOT NULL GROUP BY url ORDER BY views DESC LIMIT 10')\n .bind('api', dayAgo).all(),\n db.prepare('SELECT url, method, status_code, duration, created_at FROM system_logs WHERE category = ? ORDER BY created_at DESC LIMIT 20')\n .bind('api').all(),\n ])\n\n totalRequests = requestsResult?.count || 0\n uniqueIPs = ipsResult?.count || 0\n avgDuration = Math.round(durationResult?.avg || 0)\n errorCount = errorsResult?.count || 0\n topPages = (pagesResult.results || []).map((r: any) => ({ path: r.url, views: r.views }))\n recentActivity = (activityResult.results || []) as any[]\n } catch {\n // Tables may not exist yet\n }\n\n const content = `\n
\n
\n

Analytics Dashboard

\n

Last 24 hours overview from system logs

\n
\n\n \n
\n
\n

Total Requests

\n

${totalRequests.toLocaleString()}

\n
\n
\n

Unique Visitors

\n

${uniqueIPs.toLocaleString()}

\n
\n
\n

Avg Response Time

\n

${avgDuration}ms

\n
\n
\n

Errors

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${errorCount.toLocaleString()}

\n
\n
\n\n \n
\n
\n

Top Pages

\n
\n
\n ${topPages.length > 0 ? topPages.map(p => `\n
\n ${escapeHtml(p.path)}\n ${p.views}\n
\n `).join('') : `\n
\n No page views recorded yet. Analytics data will appear once requests are logged.\n
\n `}\n
\n
\n\n \n
\n
\n

Recent Activity

\n
\n
\n \n \n \n \n \n \n \n \n \n \n ${recentActivity.length > 0 ? recentActivity.map(a => `\n \n \n \n \n \n \n `).join('') : `\n \n \n \n `}\n \n
PathMethodStatusDuration
${escapeHtml(a.url || '')}${a.method || ''}= 400 ? 'bg-red-50 text-red-700 dark:bg-red-900/30 dark:text-red-400' : 'bg-green-50 text-green-700 dark:bg-green-900/30 dark:text-green-400'}\">${a.status_code || ''}${a.duration || 0}ms
No activity recorded yet.
\n
\n
\n
\n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Analytics',\n pageTitle: 'Analytics Dashboard',\n currentPath: '/admin/analytics',\n version: c.get('appVersion'),\n user: user ? {\n name: user.email.split('@')[0] || 'Admin',\n email: user.email,\n role: user.role\n } : undefined,\n content,\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"')\n}\n\nexport { adminRoutes as analyticsAdminRoutes }\n","/**\n * Core Analytics Plugin\n * \n * Provides analytics tracking and reporting extensions\n */\n\nimport { Hono } from 'hono'\n// import { z } from 'zod'\nimport { PluginBuilder, PluginHelpers } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { HOOKS } from '../../types'\nimport { analyticsAdminRoutes } from './routes/admin'\n\nexport function createAnalyticsPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'core-analytics',\n version: '1.0.0-beta.1',\n description: 'Core analytics tracking and reporting plugin'\n })\n\n // Add analytics metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^0.1.0',\n dependencies: ['core-auth'] // Requires auth for admin access\n })\n\n // Create analytics API routes\n const analyticsAPI = new Hono()\n\n // GET /analytics/stats - Get analytics overview\n analyticsAPI.get('/stats', async (c) => {\n const timeRange = c.req.query('range') || '7d' // 1d, 7d, 30d, 90d\n const _metric = c.req.query('metric') || 'all' // pageviews, sessions, users, etc.\n\n return c.json({\n message: 'Analytics stats',\n data: {\n pageviews: 12500,\n uniqueVisitors: 3200,\n sessions: 4800,\n avgSessionDuration: 245,\n bounceRate: 0.35,\n topPages: [\n { path: '/', views: 3200 },\n { path: '/about', views: 1800 },\n { path: '/contact', views: 950 }\n ],\n timeRange\n }\n })\n })\n\n // POST /analytics/track - Track analytics event\n analyticsAPI.post('/track', async (c) => {\n const event = await c.req.json()\n \n // Track event (pageview, click, form submission, etc.)\n console.info('Analytics event tracked:', event)\n \n return c.json({\n message: 'Event tracked successfully',\n eventId: `event-${Date.now()}`\n })\n })\n\n // GET /analytics/reports - Get detailed reports\n analyticsAPI.get('/reports', async (c) => {\n const reportType = c.req.query('type') || 'traffic'\n const startDate = c.req.query('start')\n const endDate = c.req.query('end')\n\n return c.json({\n message: 'Analytics report',\n data: {\n reportType,\n dateRange: { start: startDate, end: endDate },\n data: []\n }\n })\n })\n\n // GET /analytics/realtime - Get real-time analytics\n analyticsAPI.get('/realtime', async (c) => {\n return c.json({\n message: 'Real-time analytics',\n data: {\n activeUsers: 23,\n activePages: [\n { path: '/', users: 8 },\n { path: '/blog', users: 5 },\n { path: '/products', users: 4 }\n ],\n recentEvents: []\n }\n })\n })\n\n builder.addRoute('/api/analytics', analyticsAPI, {\n description: 'Analytics tracking and reporting API',\n requiresAuth: true,\n roles: ['admin', 'analytics:read'],\n priority: 3\n })\n\n // Admin dashboard routes\n builder.addRoute('/admin/analytics', analyticsAdminRoutes as any, {\n description: 'Analytics admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // Add analytics tracking middleware\n builder.addSingleMiddleware('analytics-tracker', async (c: any, next: any) => {\n const start = Date.now()\n const path = c.req.path\n const method = c.req.method\n const userAgent = c.req.header('user-agent')\n const referer = c.req.header('referer')\n const ip = c.req.header('CF-Connecting-IP') || c.req.header('x-forwarded-for')\n\n await next()\n\n const duration = Date.now() - start\n const status = c.res.status\n\n // Track request analytics\n const analyticsData = {\n timestamp: new Date().toISOString(),\n path,\n method,\n status,\n duration,\n userAgent,\n referer,\n ip,\n responseSize: c.res.headers.get('content-length') || 0\n }\n\n console.debug('Analytics tracking:', analyticsData)\n \n // Store analytics data (would integrate with analytics service)\n }, {\n description: 'Track page views and request analytics',\n global: true,\n priority: 99 // Run last to capture response data\n })\n\n // Add analytics service\n builder.addService('analyticsService', {\n trackEvent: async (event: any) => {\n // Event tracking implementation\n console.info('Tracking event:', event)\n return { eventId: `event-${Date.now()}` }\n },\n \n trackPageView: async (data: any) => {\n // Page view tracking implementation\n console.info('Tracking pageview:', data.path)\n return { viewId: `view-${Date.now()}` }\n },\n \n getStats: async (_timeRange: string) => {\n // Get analytics statistics\n return {\n pageviews: 12500,\n sessions: 4800,\n uniqueVisitors: 3200\n }\n },\n \n generateReport: async (type: string, options: any) => {\n // Generate analytics reports\n console.info(`Generating ${type} report with options:`, options)\n return { reportId: `report-${Date.now()}` }\n }\n }, {\n description: 'Core analytics tracking service',\n singleton: true\n })\n\n // Add analytics models\n const pageViewSchema = PluginHelpers.createSchema([\n { name: 'path', type: 'string', optional: false },\n { name: 'title', type: 'string', optional: true },\n { name: 'referrer', type: 'string', optional: true },\n { name: 'userAgent', type: 'string', optional: true },\n { name: 'ipAddress', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true },\n { name: 'duration', type: 'number', optional: true }\n ])\n\n const eventSchema = PluginHelpers.createSchema([\n { name: 'eventType', type: 'string', optional: false },\n { name: 'eventName', type: 'string', optional: false },\n { name: 'eventData', type: 'object', optional: true },\n { name: 'path', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true }\n ])\n\n const pageViewMigration = PluginHelpers.createMigration('analytics_pageviews', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'path', type: 'TEXT', nullable: false },\n { name: 'title', type: 'TEXT', nullable: true },\n { name: 'referrer', type: 'TEXT', nullable: true },\n { name: 'user_agent', type: 'TEXT', nullable: true },\n { name: 'ip_address', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true },\n { name: 'duration', type: 'INTEGER', nullable: true }\n ])\n\n const eventMigration = PluginHelpers.createMigration('analytics_events', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'event_type', type: 'TEXT', nullable: false },\n { name: 'event_name', type: 'TEXT', nullable: false },\n { name: 'event_data', type: 'TEXT', nullable: true },\n { name: 'path', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true }\n ])\n\n builder.addModel('PageView', {\n tableName: 'analytics_pageviews',\n schema: pageViewSchema,\n migrations: [pageViewMigration]\n })\n\n builder.addModel('AnalyticsEvent', {\n tableName: 'analytics_events',\n schema: eventSchema,\n migrations: [eventMigration]\n })\n\n // Add analytics hooks\n builder.addHook(HOOKS.REQUEST_START, async (data: any, _context: any) => {\n // Start tracking request\n data.analytics = {\n startTime: Date.now(),\n sessionId: `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n return data\n }, {\n priority: 1,\n description: 'Initialize analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.REQUEST_END, async (data: any, _context: any) => {\n // Complete request tracking\n if (data.analytics) {\n const duration = Date.now() - data.analytics.startTime\n console.debug(`Request completed in ${duration}ms`)\n }\n return data\n }, {\n priority: 1,\n description: 'Complete analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.USER_LOGIN, async (data: any, context: any) => {\n // Track user login events\n await context.services?.analyticsService?.trackEvent({\n eventType: 'auth',\n eventName: 'user_login',\n userId: data.userId,\n eventData: { loginMethod: data.method }\n })\n return data\n }, {\n priority: 8,\n description: 'Track user login events'\n })\n\n builder.addHook('content:view', async (data: any, context: any) => {\n // Track content views\n await context.services?.analyticsService?.trackEvent({\n eventType: 'content',\n eventName: 'content_view',\n eventData: {\n contentId: data.id,\n contentType: data.type,\n title: data.title\n }\n })\n return data\n }, {\n priority: 8,\n description: 'Track content view events'\n })\n\n // Add admin pages\n builder.addAdminPage(\n '/analytics',\n 'Analytics Dashboard',\n 'AnalyticsDashboardView',\n {\n description: 'View analytics overview and key metrics',\n permissions: ['admin', 'analytics:read'],\n icon: 'chart-bar'\n }\n )\n\n builder.addAdminPage(\n '/analytics/reports',\n 'Analytics Reports',\n 'AnalyticsReportsView',\n {\n description: 'Generate and view detailed analytics reports',\n permissions: ['admin', 'analytics:read'],\n icon: 'document-report'\n }\n )\n\n builder.addAdminPage(\n '/analytics/realtime',\n 'Real-time Analytics',\n 'AnalyticsRealtimeView',\n {\n description: 'View real-time visitor activity',\n permissions: ['admin', 'analytics:read'],\n icon: 'lightning-bolt'\n }\n )\n\n builder.addAdminPage(\n '/analytics/settings',\n 'Analytics Settings',\n 'AnalyticsSettingsView',\n {\n description: 'Configure analytics tracking and data collection',\n permissions: ['admin', 'analytics:configure'],\n icon: 'cog'\n }\n )\n\n // Add menu items\n builder.addMenuItem('Analytics', '/admin/analytics', {\n icon: 'chart-bar',\n order: 40,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Dashboard', '/admin/analytics', {\n icon: 'chart-bar',\n parent: 'Analytics',\n order: 1,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Reports', '/admin/analytics/reports', {\n icon: 'document-report',\n parent: 'Analytics',\n order: 2,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Real-time', '/admin/analytics/realtime', {\n icon: 'lightning-bolt',\n parent: 'Analytics',\n order: 3,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Settings', '/admin/analytics/settings', {\n icon: 'cog',\n parent: 'Analytics',\n order: 4,\n permissions: ['admin', 'analytics:configure']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.info('Installing analytics plugin...')\n // Create analytics database tables and initial configuration\n },\n\n activate: async () => {\n console.info('Activating analytics plugin...')\n // Start analytics tracking services\n },\n\n deactivate: async () => {\n console.info('Deactivating analytics plugin...')\n // Stop analytics tracking and clean up resources\n },\n\n configure: async (config) => {\n console.info('Configuring analytics plugin...', config)\n // Update analytics configuration and settings\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const analyticsPlugin = createAnalyticsPlugin()","import type { D1Database } from '@cloudflare/workers-types'\n\nexport interface TrackEventInput {\n event: string\n properties?: Record\n userId?: string\n sessionId?: string\n ipAddress?: string\n userAgent?: string\n path?: string\n category?: string\n}\n\nexport interface EventQueryFilters {\n event?: string\n category?: string\n userId?: string\n sessionId?: string\n startDate?: number\n endDate?: number\n limit?: number\n offset?: number\n}\n\nexport interface EventStats {\n totalEvents: number\n uniqueUsers: number\n uniqueSessions: number\n topEvents: Array<{ event: string; count: number }>\n}\n\nexport class EventTrackingService {\n constructor(private db: D1Database) {}\n\n async trackEvent(input: TrackEventInput): Promise {\n const id = crypto.randomUUID()\n const category = input.category || 'user-activity'\n\n await this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n ).run()\n\n return id\n }\n\n async trackBatch(events: TrackEventInput[]): Promise {\n const ids: string[] = []\n\n const stmts = events.map(input => {\n const id = crypto.randomUUID()\n ids.push(id)\n const category = input.category || 'user-activity'\n\n return this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n )\n })\n\n await this.db.batch(stmts)\n return ids\n }\n\n async queryEvents(filters: EventQueryFilters = {}): Promise<{ events: any[]; total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.event) {\n conditions.push('event = ?')\n params.push(filters.event)\n }\n if (filters.category) {\n conditions.push('category = ?')\n params.push(filters.category)\n }\n if (filters.userId) {\n conditions.push('user_id = ?')\n params.push(filters.userId)\n }\n if (filters.sessionId) {\n conditions.push('session_id = ?')\n params.push(filters.sessionId)\n }\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const limit = filters.limit || 50\n const offset = filters.offset || 0\n\n const [countResult, eventsResult] = await Promise.all([\n this.db.prepare(`SELECT COUNT(*) as total FROM analytics_events ${where}`).bind(...params).first() as Promise<{ total: number } | null>,\n this.db.prepare(`SELECT * FROM analytics_events ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`).bind(...params, limit, offset).all()\n ])\n\n const events = (eventsResult.results || []).map((e: any) => ({\n ...e,\n properties: e.properties ? JSON.parse(e.properties) : null\n }))\n\n return { events, total: countResult?.total || 0 }\n }\n\n async getStats(startDate?: number, endDate?: number): Promise {\n const conditions: string[] = []\n const params: any[] = []\n\n if (startDate) {\n conditions.push('created_at >= ?')\n params.push(startDate)\n }\n if (endDate) {\n conditions.push('created_at <= ?')\n params.push(endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n const [totals, topEvents] = await Promise.all([\n this.db.prepare(`\n SELECT\n COUNT(*) as total_events,\n COUNT(DISTINCT user_id) as unique_users,\n COUNT(DISTINCT session_id) as unique_sessions\n FROM analytics_events ${where}\n `).bind(...params).first() as Promise<{ total_events: number; unique_users: number; unique_sessions: number } | null>,\n this.db.prepare(`\n SELECT event, COUNT(*) as count\n FROM analytics_events ${where}\n GROUP BY event ORDER BY count DESC LIMIT 20\n `).bind(...params).all()\n ])\n\n return {\n totalEvents: totals?.total_events || 0,\n uniqueUsers: totals?.unique_users || 0,\n uniqueSessions: totals?.unique_sessions || 0,\n topEvents: (topEvents.results || []).map((r: any) => ({ event: r.event, count: r.count }))\n }\n }\n}\n","import { Hono } from 'hono'\nimport { EventTrackingService } from '../services/event-tracking-service'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// POST /api/events - Track a single event or batch of events\napiRoutes.post('/', async (c) => {\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || ''\n const user = c.get('user')\n\n let body: any\n try {\n body = await c.req.json()\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400)\n }\n\n // Batch support: accept an array of events\n if (Array.isArray(body)) {\n if (body.length > 100) {\n return c.json({ error: 'Batch size limit is 100 events' }, 400)\n }\n\n const events = body.map(e => ({\n event: e.event,\n category: e.category || 'user-activity',\n properties: e.properties,\n userId: user?.userId || e.userId,\n sessionId: e.sessionId,\n ipAddress: ip,\n userAgent,\n path: e.path\n }))\n\n // Validate all events have an event name\n const invalid = events.find(e => !e.event || typeof e.event !== 'string')\n if (invalid) {\n return c.json({ error: 'Each event must have an \"event\" string field' }, 400)\n }\n\n const ids = await service.trackBatch(events)\n return c.json({ success: true, eventIds: ids, count: ids.length })\n }\n\n // Single event\n if (!body.event || typeof body.event !== 'string') {\n return c.json({ error: '\"event\" field is required and must be a string' }, 400)\n }\n\n const eventId = await service.trackEvent({\n event: body.event,\n category: body.category || 'user-activity',\n properties: body.properties,\n userId: user?.userId || body.userId,\n sessionId: body.sessionId,\n ipAddress: ip,\n userAgent,\n path: body.path\n })\n\n return c.json({ success: true, eventId })\n})\n\n// GET /api/events - Query events (admin only)\napiRoutes.get('/', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const filters = {\n event: c.req.query('event') || undefined,\n category: c.req.query('category') || undefined,\n userId: c.req.query('userId') || undefined,\n sessionId: c.req.query('sessionId') || undefined,\n startDate: c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined,\n endDate: c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n offset: c.req.query('offset') ? parseInt(c.req.query('offset')!) : 0\n }\n\n const result = await service.queryEvents(filters)\n return c.json(result)\n})\n\n// GET /api/events/stats - Aggregated event stats (admin only)\napiRoutes.get('/stats', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const startDate = c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined\n const endDate = c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined\n\n const stats = await service.getStats(startDate, endDate)\n return c.json(stats)\n})\n\nexport { apiRoutes as eventsApiRoutes }\n","/**\n * Cache Configuration\n *\n * Defines cache configurations for different entity types\n */\n\nexport interface CacheConfig {\n ttl: number // Time-to-live in seconds\n kvEnabled: boolean // Use KV cache tier\n memoryEnabled: boolean // Use in-memory cache tier\n namespace: string // Cache namespace/prefix\n invalidateOn: string[] // Events that invalidate this cache\n version?: string // Cache version for busting\n}\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\n/**\n * Default cache configurations by entity type\n */\nexport const CACHE_CONFIGS: Record = {\n // Content (high read, low write)\n content: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'content',\n invalidateOn: ['content.update', 'content.delete', 'content.publish'],\n version: 'v1'\n },\n\n // User data (medium read, medium write)\n user: {\n ttl: 900, // 15 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'user',\n invalidateOn: ['user.update', 'user.delete', 'auth.login'],\n version: 'v1'\n },\n\n // Configuration (high read, very low write)\n config: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'config',\n invalidateOn: ['config.update', 'plugin.activate', 'plugin.deactivate'],\n version: 'v1'\n },\n\n // Media metadata (high read, low write)\n media: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'media',\n invalidateOn: ['media.upload', 'media.delete', 'media.update'],\n version: 'v1'\n },\n\n // API responses (very high read, low write)\n api: {\n ttl: 300, // 5 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'api',\n invalidateOn: ['content.update', 'content.publish'],\n version: 'v1'\n },\n\n // Session data (very high read, medium write)\n session: {\n ttl: 1800, // 30 minutes\n kvEnabled: false, // Only in-memory for sessions\n memoryEnabled: true,\n namespace: 'session',\n invalidateOn: ['auth.logout'],\n version: 'v1'\n },\n\n // Plugin data\n plugin: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'plugin',\n invalidateOn: ['plugin.activate', 'plugin.deactivate', 'plugin.update'],\n version: 'v1'\n },\n\n // Collections/schema\n collection: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'collection',\n invalidateOn: ['collection.update', 'collection.delete'],\n version: 'v1'\n }\n}\n\n/**\n * Get cache configuration for a specific namespace\n */\nexport function getCacheConfig(namespace: string): CacheConfig {\n return CACHE_CONFIGS[namespace] || {\n ttl: 3600,\n kvEnabled: true,\n memoryEnabled: true,\n namespace,\n invalidateOn: [],\n version: 'v1'\n }\n}\n\n/**\n * Generate a cache key with consistent format\n * Format: {namespace}:{type}:{identifier}:{version}\n */\nexport function generateCacheKey(\n namespace: string,\n type: string,\n identifier: string,\n version?: string\n): string {\n const v = version || getCacheConfig(namespace).version || 'v1'\n return `${namespace}:${type}:${identifier}:${v}`\n}\n\n/**\n * Parse a cache key back into its components\n */\nexport function parseCacheKey(key: string): {\n namespace: string\n type: string\n identifier: string\n version: string\n} | null {\n const parts = key.split(':')\n if (parts.length !== 4) {\n return null\n }\n\n return {\n namespace: parts[0] || '',\n type: parts[1] || '',\n identifier: parts[2] || '',\n version: parts[3] || ''\n }\n}\n\n/**\n * Generate a hash for complex query parameters\n */\nexport function hashQueryParams(params: Record): string {\n // Sort keys for consistent hashing\n const sortedKeys = Object.keys(params).sort()\n const normalized = sortedKeys.map(key => `${key}=${params[key]}`).join('&')\n\n // Simple hash function (for better performance, consider using crypto)\n let hash = 0\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Create a pattern for cache invalidation\n */\nexport function createCachePattern(\n namespace: string,\n type?: string,\n identifier?: string\n): string {\n let pattern = namespace\n if (type) pattern += `:${type}`\n if (identifier) pattern += `:${identifier}`\n return pattern + ':*'\n}\n","/**\n * Cache Service\n *\n * Three-tiered caching implementation:\n * 1. In-Memory Cache (fastest, region-specific)\n * 2. Cloudflare KV Cache (fast, global)\n * 3. Database (fallback, source of truth)\n */\n\nimport { CacheConfig, CacheStats, generateCacheKey } from './cache-config.js'\n\n/**\n * Cache entry with metadata\n */\ninterface CacheEntry {\n data: T\n timestamp: number\n expiresAt: number\n version: string\n}\n\n/**\n * In-memory cache store\n */\nclass MemoryCache {\n private cache: Map> = new Map()\n private maxSize: number = 50 * 1024 * 1024 // 50MB\n private currentSize: number = 0\n\n /**\n * Get item from memory cache\n */\n get(key: string): T | null {\n const entry = this.cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n this.delete(key)\n return null\n }\n\n return entry.data as T\n }\n\n /**\n * Set item in memory cache\n */\n set(key: string, value: T, ttl: number, version: string = 'v1'): void {\n const now = Date.now()\n const entry: CacheEntry = {\n data: value,\n timestamp: now,\n expiresAt: now + (ttl * 1000),\n version\n }\n\n // Estimate size (rough approximation)\n const entrySize = JSON.stringify(entry).length * 2 // UTF-16\n\n // Check if we need to evict\n if (this.currentSize + entrySize > this.maxSize) {\n this.evictLRU(entrySize)\n }\n\n // Delete old entry if exists\n if (this.cache.has(key)) {\n this.delete(key)\n }\n\n this.cache.set(key, entry)\n this.currentSize += entrySize\n }\n\n /**\n * Delete item from memory cache\n */\n delete(key: string): boolean {\n const entry = this.cache.get(key)\n if (entry) {\n const entrySize = JSON.stringify(entry).length * 2\n this.currentSize -= entrySize\n return this.cache.delete(key)\n }\n return false\n }\n\n /**\n * Clear all items from memory cache\n */\n clear(): void {\n this.cache.clear()\n this.currentSize = 0\n }\n\n /**\n * Get cache statistics\n */\n getStats(): { size: number; count: number } {\n return {\n size: this.currentSize,\n count: this.cache.size\n }\n }\n\n /**\n * Evict least recently used items to make space\n */\n private evictLRU(neededSpace: number): void {\n // Sort by timestamp (oldest first)\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp\n )\n\n let freedSpace = 0\n for (const [key, entry] of entries) {\n if (freedSpace >= neededSpace) break\n\n const entrySize = JSON.stringify(entry).length * 2\n this.delete(key)\n freedSpace += entrySize\n }\n }\n\n /**\n * Delete items matching a pattern\n */\n invalidatePattern(pattern: string): number {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n let count = 0\n for (const key of this.cache.keys()) {\n if (regex.test(key)) {\n this.delete(key)\n count++\n }\n }\n\n return count\n }\n}\n\n/**\n * Cache result with source information\n */\nexport interface CacheResult {\n data: T | null\n source: 'memory' | 'kv' | 'miss'\n hit: boolean\n timestamp?: number\n ttl?: number\n}\n\n/**\n * Main cache service with multi-tier support\n */\nexport class CacheService {\n private memoryCache: MemoryCache\n private config: CacheConfig\n private stats: CacheStats\n private kvNamespace?: KVNamespace\n\n constructor(config: CacheConfig, kvNamespace?: KVNamespace) {\n this.memoryCache = new MemoryCache()\n this.config = config\n this.kvNamespace = kvNamespace\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Get value from cache (tries memory first, then KV)\n */\n async get(key: string): Promise {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n return memoryValue\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return kvValue as T\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return null\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise> {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n\n const entry = await this.getEntry(key)\n return {\n data: memoryValue,\n source: 'memory',\n hit: true,\n timestamp: entry?.timestamp,\n ttl: entry?.ttl\n }\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return {\n data: kvValue as T,\n source: 'kv',\n hit: true\n }\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return {\n data: null,\n source: 'miss',\n hit: false\n }\n }\n\n /**\n * Set value in cache (stores in both memory and KV)\n */\n async set(\n key: string,\n value: T,\n customConfig?: Partial\n ): Promise {\n const config = { ...this.config, ...customConfig }\n\n // Store in memory cache (Tier 1)\n if (config.memoryEnabled) {\n this.memoryCache.set(key, value, config.ttl, config.version)\n }\n\n // Store in KV cache (Tier 2)\n if (config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.put(key, JSON.stringify(value), {\n expirationTtl: config.ttl\n })\n } catch (error) {\n console.error('KV cache write error:', error)\n }\n }\n }\n\n /**\n * Delete value from cache (removes from both memory and KV)\n */\n async delete(key: string): Promise {\n // Delete from memory (Tier 1)\n if (this.config.memoryEnabled) {\n this.memoryCache.delete(key)\n }\n\n // Delete from KV (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.delete(key)\n } catch (error) {\n console.error('KV cache delete error:', error)\n }\n }\n }\n\n /**\n * Clear all cache entries for this namespace\n */\n async clear(): Promise {\n if (this.config.memoryEnabled) {\n this.memoryCache.clear()\n }\n\n // Reset stats\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Invalidate cache entries matching a pattern\n */\n async invalidate(pattern: string): Promise {\n let count = 0\n\n // Invalidate from memory (Tier 1)\n if (this.config.memoryEnabled) {\n count += this.memoryCache.invalidatePattern(pattern)\n }\n\n // Invalidate from KV (Tier 2)\n // Note: KV doesn't support pattern matching, so we need to list all keys\n // This is expensive and should be used sparingly\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n // List all keys with the namespace prefix\n const prefix = this.config.namespace + ':'\n const list = await this.kvNamespace.list({ prefix })\n\n for (const key of list.keys) {\n if (regex.test(key.name)) {\n await this.kvNamespace.delete(key.name)\n count++\n }\n }\n } catch (error) {\n console.error('KV cache invalidation error:', error)\n }\n }\n\n return count\n }\n\n /**\n * Invalidate cache entries matching a pattern (alias for invalidate)\n */\n async invalidatePattern(pattern: string): Promise {\n return this.invalidate(pattern)\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const memStats = this.memoryCache.getStats()\n\n return {\n ...this.stats,\n memorySize: memStats.size,\n entryCount: memStats.count\n }\n }\n\n /**\n * Update hit rate calculation\n */\n private updateHitRate(): void {\n const totalHits = this.stats.memoryHits + this.stats.kvHits + this.stats.dbHits\n this.stats.hitRate = this.stats.totalRequests > 0\n ? (totalHits / this.stats.totalRequests) * 100\n : 0\n }\n\n /**\n * Generate a cache key using the configured namespace\n */\n generateKey(type: string, identifier: string): string {\n return generateCacheKey(\n this.config.namespace,\n type,\n identifier,\n this.config.version\n )\n }\n\n /**\n * Warm cache with multiple entries\n */\n async warmCache(entries: Array<{ key: string; value: T }>): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value)\n }\n }\n\n /**\n * Check if a key exists in cache\n */\n async has(key: string): Promise {\n const value = await this.get(key)\n return value !== null\n }\n\n /**\n * Get multiple values at once\n */\n async getMany(keys: string[]): Promise> {\n const results = new Map()\n\n for (const key of keys) {\n const value = await this.get(key)\n if (value !== null) {\n results.set(key, value)\n }\n }\n\n return results\n }\n\n /**\n * Set multiple values at once\n */\n async setMany(\n entries: Array<{ key: string; value: T }>,\n customConfig?: Partial\n ): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value, customConfig)\n }\n }\n\n /**\n * Delete multiple keys at once\n */\n async deleteMany(keys: string[]): Promise {\n for (const key of keys) {\n await this.delete(key)\n }\n }\n\n /**\n * Get or set pattern - fetch from cache or compute if not found\n */\n async getOrSet(\n key: string,\n fetcher: () => Promise,\n customConfig?: Partial\n ): Promise {\n // Try to get from cache\n const cached = await this.get(key)\n if (cached !== null) {\n return cached\n }\n\n // Fetch from source\n const value = await fetcher()\n\n // Store in cache\n await this.set(key, value, customConfig)\n\n return value\n }\n\n /**\n * List all cache keys with metadata\n */\n async listKeys(): Promise> {\n const keys: Array<{ key: string; size: number; expiresAt: number; age: number }> = []\n\n // Get keys from memory cache\n if (this.config.memoryEnabled) {\n const cache = (this.memoryCache as any).cache as Map>\n for (const [key, entry] of cache.entries()) {\n const size = JSON.stringify(entry).length * 2\n const age = Date.now() - entry.timestamp\n keys.push({\n key,\n size,\n expiresAt: entry.expiresAt,\n age\n })\n }\n }\n\n // Sort by age (newest first)\n return keys.sort((a, b) => a.age - b.age)\n }\n\n /**\n * Get cache entry with full metadata\n */\n async getEntry(key: string): Promise<{\n data: T\n timestamp: number\n expiresAt: number\n ttl: number\n size: number\n } | null> {\n if (!this.config.memoryEnabled) {\n return null\n }\n\n const cache = (this.memoryCache as any).cache as Map>\n const entry = cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n await this.delete(key)\n return null\n }\n\n const size = JSON.stringify(entry).length * 2\n const ttl = Math.max(0, entry.expiresAt - Date.now()) / 1000\n\n return {\n data: entry.data as T,\n timestamp: entry.timestamp,\n expiresAt: entry.expiresAt,\n ttl,\n size\n }\n }\n}\n\n/**\n * Create a cache service instance with configuration\n */\nexport function createCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n return new CacheService(config, kvNamespace)\n}\n\n/**\n * Global cache instances by namespace (singleton pattern)\n */\nconst cacheInstances = new Map()\nlet globalKVNamespace: KVNamespace | undefined\n\n/**\n * Set global KV namespace for all cache instances\n */\nexport function setGlobalKVNamespace(kvNamespace: KVNamespace): void {\n globalKVNamespace = kvNamespace\n}\n\n/**\n * Get or create a cache service for a namespace\n */\nexport function getCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n const key = config.namespace\n\n if (!cacheInstances.has(key)) {\n // Use provided KV namespace or global one\n const kv = kvNamespace || globalKVNamespace\n cacheInstances.set(key, new CacheService(config, kv))\n }\n\n return cacheInstances.get(key)!\n}\n\n/**\n * Clear all cache instances\n */\nexport async function clearAllCaches(): Promise {\n for (const cache of cacheInstances.values()) {\n await cache.clear()\n }\n}\n\n/**\n * Get stats from all cache instances\n */\nexport function getAllCacheStats(): Record {\n const stats: Record = {}\n\n for (const [namespace, cache] of cacheInstances.entries()) {\n stats[namespace] = cache.getStats()\n }\n\n return stats\n}\n","/**\n * Event Bus for Cache Invalidation\n *\n * Provides a centralized event system for triggering cache invalidation\n * based on application events.\n */\n\nexport type EventHandler = (data?: any) => Promise | void\n\n// interface EventSubscription {\n// event: string\n// handler: EventHandler\n// }\n\nclass EventBus {\n private subscriptions: Map = new Map()\n private eventLog: Array<{ event: string; timestamp: number; data?: any }> = []\n private maxLogSize: number = 100\n\n /**\n * Subscribe to an event\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.subscriptions.has(event)) {\n this.subscriptions.set(event, [])\n }\n\n this.subscriptions.get(event)!.push(handler)\n\n // Return unsubscribe function\n return () => {\n const handlers = this.subscriptions.get(event)\n if (handlers) {\n const index = handlers.indexOf(handler)\n if (index > -1) {\n handlers.splice(index, 1)\n }\n }\n }\n }\n\n /**\n * Emit an event to all subscribers\n */\n async emit(event: string, data?: any): Promise {\n // Log the event\n this.logEvent(event, data)\n\n const handlers = this.subscriptions.get(event) || []\n\n // Execute all handlers\n await Promise.all(\n handlers.map(async (handler) => {\n try {\n await handler(data)\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error)\n }\n })\n )\n\n // Also emit to wildcard subscribers\n const wildcardHandlers = this.subscriptions.get('*') || []\n await Promise.all(\n wildcardHandlers.map(async (handler) => {\n try {\n await handler({ event, data })\n } catch (error) {\n console.error(`Error in wildcard event handler for ${event}:`, error)\n }\n })\n )\n }\n\n /**\n * Remove all subscribers for an event\n */\n off(event: string): void {\n this.subscriptions.delete(event)\n }\n\n /**\n * Get all registered events\n */\n getEvents(): string[] {\n return Array.from(this.subscriptions.keys())\n }\n\n /**\n * Get subscriber count for an event\n */\n getSubscriberCount(event: string): number {\n return this.subscriptions.get(event)?.length || 0\n }\n\n /**\n * Log an event for debugging\n */\n private logEvent(event: string, data?: any): void {\n this.eventLog.push({\n event,\n timestamp: Date.now(),\n data\n })\n\n // Keep log size manageable\n if (this.eventLog.length > this.maxLogSize) {\n this.eventLog.shift()\n }\n }\n\n /**\n * Get recent event log\n */\n getEventLog(limit: number = 50): Array<{ event: string; timestamp: number; data?: any }> {\n return this.eventLog.slice(-limit)\n }\n\n /**\n * Clear event log\n */\n clearEventLog(): void {\n this.eventLog = []\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n totalEvents: number\n totalSubscriptions: number\n eventCounts: Record\n } {\n const eventCounts: Record = {}\n\n for (const log of this.eventLog) {\n eventCounts[log.event] = (eventCounts[log.event] || 0) + 1\n }\n\n return {\n totalEvents: this.eventLog.length,\n totalSubscriptions: this.subscriptions.size,\n eventCounts\n }\n }\n}\n\n// Global event bus instance\nlet globalEventBus: EventBus | null = null\n\n/**\n * Get or create the global event bus\n */\nexport function getEventBus(): EventBus {\n if (!globalEventBus) {\n globalEventBus = new EventBus()\n }\n return globalEventBus\n}\n\n/**\n * Convenience function to emit an event\n */\nexport async function emitEvent(event: string, data?: any): Promise {\n const bus = getEventBus()\n await bus.emit(event, data)\n}\n\n/**\n * Convenience function to subscribe to an event\n */\nexport function onEvent(event: string, handler: EventHandler): () => void {\n const bus = getEventBus()\n return bus.on(event, handler)\n}\n","/**\n * Cache Invalidation Service\n *\n * Automatically invalidates cache entries based on application events\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\nimport { getEventBus, onEvent } from './event-bus.js'\n\n/**\n * Setup automatic cache invalidation based on events\n */\nexport function setupCacheInvalidation(): void {\n const _eventBus = getEventBus()\n\n // Content cache invalidation\n setupContentInvalidation()\n\n // User cache invalidation\n setupUserInvalidation()\n\n // Config cache invalidation\n setupConfigInvalidation()\n\n // Media cache invalidation\n setupMediaInvalidation()\n\n // API cache invalidation\n setupAPIInvalidation()\n\n // Collection cache invalidation\n setupCollectionInvalidation()\n\n console.log('Cache invalidation listeners registered')\n}\n\n/**\n * Content cache invalidation\n */\nfunction setupContentInvalidation(): void {\n const config = CACHE_CONFIGS.content\n if (!config) return\n const contentCache = getCacheService(config)\n\n // Invalidate on content updates\n onEvent('content.create', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.create')\n })\n\n onEvent('content.update', async (data) => {\n if (data?.id) {\n // Invalidate specific content item\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n // Invalidate all content lists\n await contentCache.invalidate('content:list:*')\n console.log('Cache invalidated: content.update', data?.id)\n })\n\n onEvent('content.delete', async (data) => {\n if (data?.id) {\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.delete', data?.id)\n })\n\n onEvent('content.publish', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.publish')\n })\n}\n\n/**\n * User cache invalidation\n */\nfunction setupUserInvalidation(): void {\n const config = CACHE_CONFIGS.user\n if (!config) return\n const userCache = getCacheService(config)\n\n onEvent('user.update', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.update', data?.id)\n })\n\n onEvent('user.delete', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.delete', data?.id)\n })\n\n onEvent('auth.login', async (data) => {\n if (data?.userId) {\n await userCache.delete(userCache.generateKey('id', data.userId))\n }\n console.log('Cache invalidated: auth.login', data?.userId)\n })\n\n onEvent('auth.logout', async (data) => {\n // Clear session cache\n const sessionConfig = CACHE_CONFIGS.session\n if (sessionConfig) {\n const sessionCache = getCacheService(sessionConfig)\n if (data?.sessionId) {\n await sessionCache.delete(sessionCache.generateKey('session', data.sessionId))\n }\n }\n console.log('Cache invalidated: auth.logout')\n })\n}\n\n/**\n * Config cache invalidation\n */\nfunction setupConfigInvalidation(): void {\n const configConfig = CACHE_CONFIGS.config\n if (!configConfig) return\n const configCache = getCacheService(configConfig)\n\n onEvent('config.update', async (_data) => {\n await configCache.invalidate('config:*')\n console.log('Cache invalidated: config.update')\n })\n\n onEvent('plugin.activate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.activate', data?.pluginId)\n })\n\n onEvent('plugin.deactivate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.deactivate', data?.pluginId)\n })\n\n onEvent('plugin.update', async (data) => {\n const pluginConfig = CACHE_CONFIGS.plugin\n if (!pluginConfig) return\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n console.log('Cache invalidated: plugin.update', data?.pluginId)\n })\n}\n\n/**\n * Media cache invalidation\n */\nfunction setupMediaInvalidation(): void {\n const config = CACHE_CONFIGS.media\n if (!config) return\n const mediaCache = getCacheService(config)\n\n onEvent('media.upload', async (_data) => {\n await mediaCache.invalidate('media:*')\n console.log('Cache invalidated: media.upload')\n })\n\n onEvent('media.delete', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.delete', data?.id)\n })\n\n onEvent('media.update', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.update', data?.id)\n })\n}\n\n/**\n * API cache invalidation (depends on content changes)\n */\nfunction setupAPIInvalidation(): void {\n const config = CACHE_CONFIGS.api\n if (!config) return\n const apiCache = getCacheService(config)\n\n onEvent('content.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.update)')\n })\n\n onEvent('content.publish', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.publish)')\n })\n\n onEvent('content.create', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.create)')\n })\n\n onEvent('content.delete', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.delete)')\n })\n\n onEvent('collection.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (collection.update)')\n })\n}\n\n/**\n * Collection cache invalidation\n */\nfunction setupCollectionInvalidation(): void {\n const config = CACHE_CONFIGS.collection\n if (!config) return\n const collectionCache = getCacheService(config)\n\n onEvent('collection.create', async (_data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.create')\n })\n\n onEvent('collection.update', async (data) => {\n if (data?.id) {\n await collectionCache.delete(collectionCache.generateKey('item', data.id))\n }\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.update', data?.id)\n })\n\n onEvent('collection.delete', async (data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.delete', data?.id)\n })\n}\n\n/**\n * Get invalidation statistics\n */\nexport function getCacheInvalidationStats() {\n const eventBus = getEventBus()\n return eventBus.getStats()\n}\n\n/**\n * Get recent invalidation events\n */\nexport function getRecentInvalidations(limit: number = 50) {\n const eventBus = getEventBus()\n return eventBus.getEventLog(limit)\n}\n","/**\n * Cache Warming Utilities\n *\n * Utilities for preloading and warming cache entries\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\n\n/**\n * Warm cache with common queries\n */\nexport async function warmCommonCaches(db: D1Database): Promise<{\n warmed: number\n errors: number\n details: Array<{ namespace: string; count: number }>\n}> {\n let totalWarmed = 0\n let totalErrors = 0\n const details: Array<{ namespace: string; count: number }> = []\n\n try {\n // Warm collection cache\n const collectionCount = await warmCollections(db)\n totalWarmed += collectionCount\n details.push({ namespace: 'collection', count: collectionCount })\n\n // Warm content cache (most recent items)\n const contentCount = await warmRecentContent(db)\n totalWarmed += contentCount\n details.push({ namespace: 'content', count: contentCount })\n\n // Warm media cache (most recent items)\n const mediaCount = await warmRecentMedia(db)\n totalWarmed += mediaCount\n details.push({ namespace: 'media', count: mediaCount })\n\n } catch (error) {\n console.error('Error warming caches:', error)\n totalErrors++\n }\n\n return {\n warmed: totalWarmed,\n errors: totalErrors,\n details\n }\n}\n\n/**\n * Warm collections cache\n */\nasync function warmCollections(db: D1Database): Promise {\n const config = CACHE_CONFIGS.collection\n if (!config) return 0\n const collectionCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare('SELECT * FROM collections WHERE is_active = 1')\n const { results } = await stmt.all()\n\n for (const collection of results as any[]) {\n const key = collectionCache.generateKey('item', collection.id)\n await collectionCache.set(key, collection)\n count++\n }\n\n // Also cache the full list\n const listKey = collectionCache.generateKey('list', 'all')\n await collectionCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming collections cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent content cache\n */\nasync function warmRecentContent(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.content\n if (!config) return 0\n const contentCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM content ORDER BY created_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const content of results as any[]) {\n const key = contentCache.generateKey('item', content.id)\n await contentCache.set(key, content)\n count++\n }\n\n // Cache the list\n const listKey = contentCache.generateKey('list', 'recent')\n await contentCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming content cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent media cache\n */\nasync function warmRecentMedia(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.media\n if (!config) return 0\n const mediaCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const media of results as any[]) {\n const key = mediaCache.generateKey('item', media.id)\n await mediaCache.set(key, media)\n count++\n }\n\n // Cache the list\n const listKey = mediaCache.generateKey('list', 'recent')\n await mediaCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming media cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm specific namespace with custom data\n */\nexport async function warmNamespace(\n namespace: string,\n entries: Array<{ key: string; value: any }>\n): Promise {\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n throw new Error(`Unknown namespace: ${namespace}`)\n }\n\n const cache = getCacheService(config)\n await cache.setMany(entries)\n\n return entries.length\n}\n\n/**\n * Preload cache on application startup\n */\nexport async function preloadCache(db: D1Database): Promise {\n console.log('🔥 Preloading cache...')\n\n const result = await warmCommonCaches(db)\n\n console.log(`✅ Cache preloaded: ${result.warmed} entries across ${result.details.length} namespaces`)\n result.details.forEach(detail => {\n console.log(` - ${detail.namespace}: ${detail.count} entries`)\n })\n\n if (result.errors > 0) {\n console.warn(`⚠️ ${result.errors} errors during cache preloading`)\n }\n}\n\n/**\n * Schedule periodic cache warming\n */\nexport function schedulePeriodicWarming(\n db: D1Database,\n intervalMs: number = 300000 // 5 minutes default\n): NodeJS.Timeout {\n console.log(`⏰ Scheduling periodic cache warming every ${intervalMs / 1000}s`)\n\n return setInterval(async () => {\n try {\n console.log('🔄 Running periodic cache warming...')\n await warmCommonCaches(db)\n } catch (error) {\n console.error('Error during periodic cache warming:', error)\n }\n }, intervalMs)\n}\n","/**\n * Admin Cache Dashboard Template\n *\n * Moved from @sonicjs-cms/templates to avoid circular dependency\n * during build (templates imports from core, core can't import from templates)\n */\n\nimport { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\nexport interface CacheDashboardData {\n stats: Record\n totals: {\n hits: number\n misses: number\n requests: number\n hitRate: string\n memorySize: number\n entryCount: number\n }\n namespaces: string[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCacheDashboard(data: CacheDashboardData): string {\n const pageContent = `\n
\n \n
\n
\n

Cache System

\n

\n Monitor and manage cache performance across all namespaces\n

\n
\n
\n \n \n \n \n Refresh\n \n \n \n \n \n Clear All\n \n
\n
\n\n \n
\n ${renderStatCard('Total Requests', data.totals.requests.toLocaleString(), 'lime', `\n \n \n \n `)}\n\n ${renderStatCard('Hit Rate', data.totals.hitRate + '%', 'blue', `\n \n \n \n `, parseFloat(data.totals.hitRate) > 70 ? 'lime' : parseFloat(data.totals.hitRate) > 40 ? 'amber' : 'red')}\n\n ${renderStatCard('Memory Usage', formatBytes(data.totals.memorySize), 'purple', `\n \n \n \n `)}\n\n ${renderStatCard('Cached Entries', data.totals.entryCount.toLocaleString(), 'sky', `\n \n \n \n `)}\n
\n\n \n
\n
\n

Cache Namespaces

\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ${data.namespaces.map(namespace => {\n const stat = data.stats[namespace]\n if (!stat) return ''\n return renderNamespaceRow(namespace, stat)\n }).join('')}\n \n
\n Namespace\n \n Requests\n \n Hit Rate\n \n Memory Hits\n \n KV Hits\n \n Entries\n \n Size\n \n Actions\n
\n
\n
\n\n \n
\n
\n

Performance Overview

\n
\n
\n
\n ${renderPerformanceMetric('Memory Cache', data.totals.hits, data.totals.misses)}\n ${renderHealthStatus(parseFloat(data.totals.hitRate))}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'clear-all-cache-confirm',\n title: 'Clear All Cache',\n message: 'Are you sure you want to clear all cache entries? This cannot be undone.',\n confirmText: 'Clear All',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearAllCaches()'\n })}\n\n ${renderConfirmationDialog({\n id: 'clear-namespace-cache-confirm',\n title: 'Clear Namespace Cache',\n message: 'Clear cache for this namespace?',\n confirmText: 'Clear',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearNamespaceCache()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Cache System',\n pageTitle: 'Cache System',\n currentPath: '/admin/cache',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderStatCard(label: string, value: string, color: string, icon: string, colorOverride?: string): string {\n const finalColor = colorOverride || color\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n blue: 'bg-blue-50 dark:bg-blue-500/10 text-blue-600 dark:text-blue-400 ring-blue-600/20 dark:ring-blue-500/20',\n purple: 'bg-purple-50 dark:bg-purple-500/10 text-purple-600 dark:text-purple-400 ring-purple-600/20 dark:ring-purple-500/20',\n sky: 'bg-sky-50 dark:bg-sky-500/10 text-sky-600 dark:text-sky-400 ring-sky-600/20 dark:ring-sky-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n
\n
\n
\n
\n ${icon}\n
\n
\n

${label}

\n

${value}

\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderNamespaceRow(namespace: string, stat: CacheStats): string {\n const hitRate = stat.hitRate.toFixed(1)\n const hitRateColor = stat.hitRate > 70 ? 'text-lime-600 dark:text-lime-400' :\n stat.hitRate > 40 ? 'text-amber-600 dark:text-amber-400' :\n 'text-red-600 dark:text-red-400'\n\n return `\n \n \n \n ${namespace}\n \n \n \n ${stat.totalRequests.toLocaleString()}\n \n \n \n ${hitRate}%\n \n \n \n ${stat.memoryHits.toLocaleString()}\n \n \n ${stat.kvHits.toLocaleString()}\n \n \n ${stat.entryCount.toLocaleString()}\n \n \n ${formatBytes(stat.memorySize)}\n \n \n \n Clear\n \n \n \n `\n}\n\nfunction renderPerformanceMetric(label: string, hits: number, misses: number): string {\n const total = hits + misses\n const hitPercentage = total > 0 ? (hits / total) * 100 : 0\n\n return `\n
\n

${label}

\n
\n
\n Hits\n ${hits.toLocaleString()}\n
\n
\n Misses\n ${misses.toLocaleString()}\n
\n
\n
\n Hit Rate\n ${hitPercentage.toFixed(1)}%\n
\n
\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderHealthStatus(hitRate: number): string {\n const status = hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'critical'\n const statusConfig = {\n healthy: {\n label: 'Healthy',\n color: 'lime',\n icon: `\n \n `\n },\n warning: {\n label: 'Needs Attention',\n color: 'amber',\n icon: `\n \n `\n },\n critical: {\n label: 'Critical',\n color: 'red',\n icon: `\n \n `\n }\n }\n\n const config = statusConfig[status]\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n

System Health

\n
\n ${config.icon}\n
\n

${config.label}

\n

\n ${status === 'healthy' ? 'Cache is performing well' :\n status === 'warning' ? 'Consider increasing cache TTL or capacity' :\n 'Cache hit rate is too low'}\n

\n
\n
\n
\n `\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`\n}\n","/**\n * Cache Plugin Routes\n *\n * Admin routes for cache management\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport { getAllCacheStats, clearAllCaches, getCacheService } from './services/cache.js'\nimport { CACHE_CONFIGS, parseCacheKey } from './services/cache-config.js'\nimport { getRecentInvalidations, getCacheInvalidationStats } from './services/cache-invalidation.js'\nimport { warmCommonCaches, warmNamespace } from './services/cache-warming.js'\nimport { renderCacheDashboard, CacheDashboardData } from '../../templates/pages/admin-cache.template'\n\nconst app = new Hono()\n\n/**\n * GET /admin/cache\n * Cache statistics dashboard\n */\napp.get('/', async (c: Context) => {\n const stats = getAllCacheStats()\n const user = c.get('user')\n\n // Calculate totals\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n Object.values(stats).forEach(stat => {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n })\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n const dashboardData: CacheDashboardData = {\n stats,\n totals: {\n hits: totalHits,\n misses: totalMisses,\n requests: totalRequests,\n hitRate: overallHitRate.toFixed(2),\n memorySize: totalSize,\n entryCount: totalEntries\n },\n namespaces: Object.keys(stats),\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCacheDashboard(dashboardData))\n})\n\n/**\n * GET /admin/cache/stats\n * Detailed statistics for all namespaces\n */\napp.get('/stats', async (c: Context) => {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/stats/:namespace\n * Statistics for a specific namespace\n */\napp.get('/stats/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const stats = cache.getStats()\n\n return c.json({\n success: true,\n data: {\n namespace,\n config,\n stats\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear\n * Clear all cache entries\n */\napp.post('/clear', async (c: Context) => {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear/:namespace\n * Clear cache for a specific namespace\n */\napp.post('/clear/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n await cache.clear()\n\n return c.json({\n success: true,\n message: `Cache cleared for namespace: ${namespace}`,\n namespace,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/invalidate\n * Invalidate cache entries matching a pattern\n */\napp.post('/invalidate', async (c: Context) => {\n const body = await c.req.json()\n const { pattern, namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (namespace) {\n // Invalidate from specific namespace\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: namespace || 'all',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/health\n * Cache system health check\n */\napp.get('/health', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // Calculate health metrics\n const namespaces = Object.entries(stats)\n const healthChecks = namespaces.map(([name, stat]) => {\n const hitRate = stat.hitRate\n const memoryUsage = stat.memorySize / (50 * 1024 * 1024) // Assume 50MB max\n\n return {\n namespace: name,\n status: hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'unhealthy',\n hitRate,\n memoryUsage: (memoryUsage * 100).toFixed(2) + '%',\n entryCount: stat.entryCount\n }\n })\n\n const overallStatus = healthChecks.every(h => h.status === 'healthy')\n ? 'healthy'\n : healthChecks.some(h => h.status === 'unhealthy')\n ? 'unhealthy'\n : 'warning'\n\n return c.json({\n success: true,\n data: {\n status: overallStatus,\n namespaces: healthChecks,\n timestamp: new Date().toISOString()\n }\n })\n})\n\n/**\n * GET /admin/cache/browser\n * Browse all cache entries across namespaces\n */\napp.get('/browser', async (c: Context) => {\n const namespace = c.req.query('namespace') || 'all'\n const search = c.req.query('search') || ''\n const sortBy = c.req.query('sort') || 'age' // age, size, key\n const limit = parseInt(c.req.query('limit') || '100')\n\n const entries: Array<{\n namespace: string\n key: string\n size: number\n age: number\n ttl: number\n expiresAt: number\n parsed: any\n }> = []\n\n const namespaces = namespace === 'all'\n ? Object.keys(CACHE_CONFIGS)\n : [namespace]\n\n for (const ns of namespaces) {\n const config = CACHE_CONFIGS[ns]\n if (!config) continue\n\n const cache = getCacheService(config)\n const keys = await cache.listKeys()\n\n for (const keyInfo of keys) {\n // Apply search filter\n if (search && !keyInfo.key.toLowerCase().includes(search.toLowerCase())) {\n continue\n }\n\n const parsed = parseCacheKey(keyInfo.key)\n const ttl = Math.max(0, keyInfo.expiresAt - Date.now()) / 1000\n\n entries.push({\n namespace: ns,\n key: keyInfo.key,\n size: keyInfo.size,\n age: keyInfo.age,\n ttl,\n expiresAt: keyInfo.expiresAt,\n parsed\n })\n }\n }\n\n // Sort entries\n if (sortBy === 'size') {\n entries.sort((a, b) => b.size - a.size)\n } else if (sortBy === 'age') {\n entries.sort((a, b) => a.age - b.age)\n } else if (sortBy === 'key') {\n entries.sort((a, b) => a.key.localeCompare(b.key))\n }\n\n // Limit results\n const limitedEntries = entries.slice(0, limit)\n\n return c.json({\n success: true,\n data: {\n entries: limitedEntries,\n total: entries.length,\n showing: limitedEntries.length,\n namespace,\n search,\n sortBy\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/browser/:namespace/:key\n * Get detailed information about a specific cache entry\n */\napp.get('/browser/:namespace/:key', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const key = decodeURIComponent(c.req.param('key')!)\n\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const entry = await cache.getEntry(key)\n\n if (!entry) {\n return c.json({\n success: false,\n error: 'Cache entry not found or expired'\n }, 404)\n }\n\n const parsed = parseCacheKey(key)\n\n return c.json({\n success: true,\n data: {\n key,\n namespace,\n parsed,\n ...entry,\n createdAt: new Date(entry.timestamp).toISOString(),\n expiresAt: new Date(entry.expiresAt).toISOString()\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics\n * Advanced cache analytics\n */\napp.get('/analytics', async (c: Context) => {\n const stats = getAllCacheStats()\n const invalidationStats = getCacheInvalidationStats()\n const recentInvalidations = getRecentInvalidations(20)\n\n // Calculate analytics\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n const namespacesAnalytics = []\n\n for (const [namespace, stat] of Object.entries(stats)) {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n\n const totalRequests = stat.memoryHits + stat.kvHits + stat.memoryMisses + stat.kvMisses\n const hitRate = totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / totalRequests) * 100 : 0\n const avgEntrySize = stat.entryCount > 0 ? stat.memorySize / stat.entryCount : 0\n\n namespacesAnalytics.push({\n namespace,\n hitRate: hitRate.toFixed(2),\n totalRequests,\n memoryHitRate: totalRequests > 0 ? ((stat.memoryHits / totalRequests) * 100).toFixed(2) : '0',\n kvHitRate: totalRequests > 0 ? ((stat.kvHits / totalRequests) * 100).toFixed(2) : '0',\n avgEntrySize: Math.round(avgEntrySize),\n totalSize: stat.memorySize,\n entryCount: stat.entryCount,\n efficiency: totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / (stat.memoryHits + stat.kvHits + stat.dbHits + 1)).toFixed(2) : '0'\n })\n }\n\n // Sort by hit rate\n namespacesAnalytics.sort((a, b) => parseFloat(b.hitRate) - parseFloat(a.hitRate))\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n // Calculate cost savings (assume 50ms per DB query vs 2ms for cache)\n const dbQueriesAvoided = totalHits\n const timeSaved = dbQueriesAvoided * 48 // 48ms saved per cache hit\n const estimatedCostSavings = (dbQueriesAvoided / 1000000) * 0.50 // $0.50 per million queries\n\n return c.json({\n success: true,\n data: {\n overview: {\n totalHits,\n totalMisses,\n totalRequests,\n overallHitRate: overallHitRate.toFixed(2),\n totalSize,\n totalEntries,\n avgEntrySize: totalEntries > 0 ? Math.round(totalSize / totalEntries) : 0\n },\n performance: {\n dbQueriesAvoided,\n timeSavedMs: timeSaved,\n timeSavedMinutes: (timeSaved / 1000 / 60).toFixed(2),\n estimatedCostSavings: estimatedCostSavings.toFixed(4)\n },\n namespaces: namespacesAnalytics,\n invalidation: {\n ...invalidationStats,\n recent: recentInvalidations\n }\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/trends\n * Cache trends over time (simplified - would need historical data storage)\n */\napp.get('/analytics/trends', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // For now, return current snapshot as a data point\n // In production, this would query historical data\n const dataPoint = {\n timestamp: Date.now(),\n stats: Object.entries(stats).map(([namespace, stat]) => ({\n namespace,\n hitRate: stat.hitRate,\n entryCount: stat.entryCount,\n memorySize: stat.memorySize,\n totalRequests: stat.totalRequests\n }))\n }\n\n return c.json({\n success: true,\n data: {\n trends: [dataPoint],\n note: 'Historical trends require persistent storage. This returns current snapshot only.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/top-keys\n * Most accessed cache keys (would need hit tracking)\n */\napp.get('/analytics/top-keys', async (c: Context) => {\n const _namespace = c.req.query('namespace') || 'all'\n const _limit = parseInt(c.req.query('limit') || '10')\n\n // This is a placeholder - would need per-key hit tracking\n return c.json({\n success: true,\n data: {\n topKeys: [],\n note: 'Top keys tracking requires per-key hit counting. Feature not yet implemented.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/warm\n * Warm cache with common queries\n */\napp.post('/warm', async (c: Context) => {\n try {\n const db = c.env.DB as D1Database\n const result = await warmCommonCaches(db)\n\n return c.json({\n success: true,\n message: 'Cache warming completed',\n ...result,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Cache warming error:', error)\n return c.json({\n success: false,\n error: 'Cache warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * POST /admin/cache/warm/:namespace\n * Warm specific namespace cache\n */\napp.post('/warm/:namespace', async (c: Context) => {\n try {\n const namespace = c.req.param('namespace')!\n const body = await c.req.json()\n const { entries } = body\n\n if (!entries || !Array.isArray(entries)) {\n return c.json({\n success: false,\n error: 'Entries array is required'\n }, 400)\n }\n\n const count = await warmNamespace(namespace, entries)\n\n return c.json({\n success: true,\n message: `Warmed ${count} entries in namespace: ${namespace}`,\n namespace,\n count,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Namespace warming error:', error)\n return c.json({\n success: false,\n error: 'Namespace warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Cache Plugin\n *\n * Three-tiered caching system for SonicJS\n * - Tier 1: In-Memory (fastest, region-specific)\n * - Tier 2: Cloudflare KV (fast, global)\n * - Tier 3: Database (source of truth)\n */\n\nimport type { Context } from 'hono'\nimport type { PluginContext } from '@sonicjs-cms/core'\nimport { getCacheService, clearAllCaches, getAllCacheStats } from './services/cache.js'\nimport { CACHE_CONFIGS } from './services/cache-config.js'\nimport { setupCacheInvalidation } from './services/cache-invalidation.js'\nimport cacheRoutes from './routes.js'\n\nexport class CachePlugin {\n private _context: PluginContext | null = null\n\n /**\n * Get plugin routes\n */\n getRoutes() {\n return cacheRoutes\n }\n\n /**\n * Activate the cache plugin\n */\n async activate(context: PluginContext): Promise {\n this._context = context\n\n const settings = context.config || {}\n\n console.log('✅ Cache plugin activated', {\n memoryEnabled: settings.memoryEnabled ?? true,\n kvEnabled: settings.kvEnabled ?? false,\n defaultTTL: settings.defaultTTL ?? 3600\n })\n\n // Initialize default cache services\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n\n // Setup event-based cache invalidation\n setupCacheInvalidation()\n }\n\n /**\n * Deactivate the cache plugin\n */\n async deactivate(): Promise {\n console.log('❌ Cache plugin deactivated - clearing all caches')\n await clearAllCaches()\n this._context = null\n }\n\n /**\n * Configure the cache plugin\n */\n async configure(settings: Record): Promise {\n console.log('⚙️ Cache plugin configured', settings)\n\n // Reconfigure all cache instances with new settings\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n }\n\n /**\n * Get cache statistics\n */\n async getStats(c: Context): Promise {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Clear all cache entries\n */\n async clearCache(c: Context): Promise {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Invalidate cache entries matching pattern\n */\n async invalidatePattern(c: Context): Promise {\n const body = await c.req.json()\n const { pattern, namespace: _namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (_namespace) {\n // Invalidate from specific namespace\n const cache = getCacheService(CACHE_CONFIGS[_namespace] || {\n ttl: 3600,\n kvEnabled: false,\n memoryEnabled: true,\n namespace: _namespace,\n invalidateOn: [],\n version: 'v1'\n })\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: _namespace || 'all',\n timestamp: new Date().toISOString()\n })\n }\n}\n\n// Export cache services for use by other plugins/routes when cache plugin is active\nexport {\n getCacheService,\n clearAllCaches,\n getAllCacheStats,\n setGlobalKVNamespace\n} from './services/cache'\nexport { CACHE_CONFIGS, getCacheConfig, generateCacheKey } from './services/cache-config'\nexport type { CacheConfig, CacheStats } from './services/cache-config'\nexport { emitEvent, onEvent, getEventBus } from './services/event-bus'\nexport { getCacheInvalidationStats, getRecentInvalidations } from './services/cache-invalidation'\nexport { warmCommonCaches, warmNamespace, preloadCache } from './services/cache-warming'\n\n// Create and export plugin instance\nconst plugin = new CachePlugin()\nexport default plugin\n","/**\n * SonicJS Favicon SVG\n *\n * Embedded SVG favicon for the admin interface and auth pages.\n * This ensures the favicon is always available without external dependencies.\n */\n\nexport const faviconSvg = `\n\n\n\t\n\t\t\n\t\t\n\t\n\n`;\n","/**\n * Main Application Factory\n *\n * Creates a configured SonicJS application with all core functionality\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport {\n apiRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n testCleanupRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminPluginRoutes,\n adminLogsRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n adminFormsRoutes,\n publicFormsRoutes,\n adminApiReferenceRoutes\n} from './routes'\nimport { getCoreVersion } from './utils/version'\nimport { bootstrapMiddleware } from './middleware/bootstrap'\nimport { metricsMiddleware } from './middleware/metrics'\nimport { csrfProtection } from './middleware/csrf'\nimport { securityHeadersMiddleware } from './middleware/security-headers'\nimport { createDatabaseToolsAdminRoutes } from './plugins/core-plugins/database-tools-plugin/admin-routes'\nimport { createSeedDataAdminRoutes } from './plugins/core-plugins/seed-data-plugin/admin-routes'\nimport { emailPlugin } from './plugins/core-plugins/email-plugin'\nimport { otpLoginPlugin } from './plugins/core-plugins/otp-login-plugin'\nimport { oauthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nimport { userProfilesPlugin } from './plugins/core-plugins/user-profiles'\nimport { aiSearchPlugin } from './plugins/core-plugins/ai-search-plugin'\nimport { createMagicLinkAuthPlugin } from './plugins/available/magic-link-auth'\nimport { securityAuditPlugin } from './plugins/core-plugins/security-audit-plugin'\nimport { securityAuditMiddleware } from './plugins/core-plugins/security-audit-plugin'\nimport { stripePlugin } from './plugins/core-plugins/stripe-plugin'\nimport { requireAuth, requireRole } from './middleware/auth'\nimport { pluginMenuMiddleware } from './middleware/plugin-menu'\nimport { analyticsPlugin } from './plugins/core-plugins/analytics'\nimport { eventsApiRoutes } from './plugins/core-plugins/analytics/routes/api'\nimport cachePlugin from './plugins/cache'\nimport { faviconSvg } from './assets/favicon'\nimport { setAppInstance } from './services/route-metadata'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface Bindings {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n CORS_ORIGINS?: string\n JWT_SECRET?: string\n JWT_EXPIRES_IN?: string\n JWT_REFRESH_GRACE_SECONDS?: string\n BUCKET_NAME?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\nexport interface Variables {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n csrfToken?: string\n pluginMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport interface SonicJSConfig {\n // Collections configuration\n collections?: {\n directory?: string\n autoSync?: boolean\n }\n\n // Plugins configuration\n plugins?: {\n directory?: string\n autoLoad?: boolean\n disableAll?: boolean // Disable all plugins including core plugins\n }\n\n // Custom routes\n routes?: Array<{\n path: string\n handler: Hono\n }>\n\n // Custom middleware\n middleware?: {\n beforeAuth?: Array<(c: Context, next: () => Promise) => Promise>\n afterAuth?: Array<(c: Context, next: () => Promise) => Promise>\n }\n\n // Admin access control\n // Roles allowed to access the /admin panel. Defaults to ['admin'].\n adminAccessRoles?: string[]\n\n // App metadata\n version?: string\n name?: string\n}\n\nexport type SonicJSApp = Hono<{ Bindings: Bindings; Variables: Variables }>\n\n// ============================================================================\n// Application Factory\n// ============================================================================\n\n/**\n * Create a SonicJS application with core functionality\n *\n * @param config - Application configuration\n * @returns Configured Hono application\n *\n * @example\n * ```typescript\n * import { createSonicJSApp } from '@sonicjs-cms/core'\n *\n * const app = createSonicJSApp({\n * collections: {\n * directory: './src/collections',\n * autoSync: true\n * },\n * plugins: {\n * directory: './src/plugins',\n * autoLoad: true\n * }\n * })\n *\n * export default app\n * ```\n */\nexport function createSonicJSApp(config: SonicJSConfig = {}): SonicJSApp {\n const app = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Set app metadata\n const appVersion = config.version || getCoreVersion()\n const appName = config.name || 'SonicJS AI'\n\n // App version middleware\n app.use('*', async (c, next) => {\n c.set('appVersion', appVersion)\n await next()\n })\n\n // Metrics middleware - track all requests for real-time analytics\n app.use('*', metricsMiddleware())\n\n // Bootstrap middleware - runs migrations, syncs collections, and initializes plugins\n app.use('*', bootstrapMiddleware(config))\n\n // Custom middleware - before auth\n if (config.middleware?.beforeAuth) {\n for (const middleware of config.middleware.beforeAuth) {\n app.use('*', middleware)\n }\n }\n\n // Logging middleware\n app.use('*', async (_c, next) => {\n // Logging logic here\n await next()\n })\n\n // Security middleware\n app.use('*', securityHeadersMiddleware())\n\n // CSRF protection middleware\n app.use('*', csrfProtection())\n\n // Custom middleware - after auth\n if (config.middleware?.afterAuth) {\n for (const middleware of config.middleware.afterAuth) {\n app.use('*', middleware)\n }\n }\n\n // Admin panel access control: require authentication and admin role by default\n const adminRoles = config.adminAccessRoles || ['admin']\n app.use('/admin/*', requireAuth())\n app.use('/admin/*', requireRole(adminRoles))\n\n // Plugin dynamic menu items for admin sidebar\n app.use('/admin/*', pluginMenuMiddleware())\n\n // Core routes\n // Routes are being imported incrementally from routes/*\n // Each route is tested and migrated one-by-one\n app.route('/api', apiRoutes)\n app.route('/api/media', apiMediaRoutes)\n app.route('/api/system', apiSystemRoutes)\n app.route('/admin/api', adminApiRoutes)\n app.route('/admin/dashboard', adminDashboardRoutes)\n app.route('/admin/collections', adminCollectionsRoutes)\n app.route('/admin/forms', adminFormsRoutes)\n app.route('/admin/settings', adminSettingsRoutes)\n app.route('/forms', publicFormsRoutes)\n app.route('/api/forms', publicFormsRoutes) // API endpoint for form submissions\n app.route('/admin/api-reference', adminApiReferenceRoutes)\n app.route('/admin/database-tools', createDatabaseToolsAdminRoutes())\n app.route('/admin/seed-data', createSeedDataAdminRoutes())\n app.route('/admin/content', adminContentRoutes)\n app.route('/admin/media', adminMediaRoutes)\n // Security audit middleware - logs auth events (login, register, logout)\n app.use('/auth/*', securityAuditMiddleware())\n\n // Plugin routes - Security Audit (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (securityAuditPlugin.routes && securityAuditPlugin.routes.length > 0) {\n for (const route of securityAuditPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - AI Search (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register AI Search routes first so they take precedence over the generic /:id handler\n if (aiSearchPlugin.routes && aiSearchPlugin.routes.length > 0) {\n for (const route of aiSearchPlugin.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Plugin routes - Cache (dashboard and management API)\n // Fixes GitHub Issue #461: Cache routes were not registered\n app.route('/admin/cache', cachePlugin.getRoutes())\n\n // Plugin routes - OAuth Providers (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (oauthProvidersPlugin.routes && oauthProvidersPlugin.routes.length > 0) {\n for (const route of oauthProvidersPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - User Profiles\n if (userProfilesPlugin.routes && userProfilesPlugin.routes.length > 0) {\n for (const route of userProfilesPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - OTP Login (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register OTP Login routes first so they take precedence over the generic /:id handler\n if (otpLoginPlugin.routes && otpLoginPlugin.routes.length > 0) {\n for (const route of otpLoginPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Analytics (must be before /admin/plugins catch-all)\n if (analyticsPlugin.routes && analyticsPlugin.routes.length > 0) {\n for (const route of analyticsPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Public event tracking API — POST /api/events (open), GET /api/events (admin)\n app.route('/api/events', eventsApiRoutes)\n\n // Plugin routes - Stripe (must be before /admin/plugins catch-all)\n if (stripePlugin.routes && stripePlugin.routes.length > 0) {\n for (const route of stripePlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n app.route('/admin/plugins', adminPluginRoutes)\n app.route('/admin/logs', adminLogsRoutes)\n app.route('/admin', adminUsersRoutes)\n app.route('/auth', authRoutes)\n\n // Test cleanup routes (only for development/test environments)\n app.route('/', testCleanupRoutes)\n\n // Plugin routes - Email\n if (emailPlugin.routes && emailPlugin.routes.length > 0) {\n for (const route of emailPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Magic Link Auth (passwordless authentication via email links)\n const magicLinkPlugin = createMagicLinkAuthPlugin()\n if (magicLinkPlugin.routes && magicLinkPlugin.routes.length > 0) {\n for (const route of magicLinkPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Serve favicon\n app.get('/favicon.svg', (c) => {\n return new Response(faviconSvg, {\n headers: {\n 'Content-Type': 'image/svg+xml',\n 'Cache-Control': 'public, max-age=31536000'\n }\n })\n })\n\n // Serve files from R2 storage (public file access)\n app.get('/files/*', async (c) => {\n try {\n // Extract the path from the URL pathname (everything after /files/)\n const url = new URL(c.req.url)\n const pathname = url.pathname\n\n // Remove the /files/ prefix to get the R2 object key\n const objectKey = pathname.replace(/^\\/files\\//, '')\n\n if (!objectKey) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(objectKey)\n\n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n headers.set('Access-Control-Allow-Origin', '*') // Allow CORS for media files\n headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n headers.set('Access-Control-Allow-Headers', 'Content-Type')\n\n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n })\n\n // Custom routes - User-defined routes\n if (config.routes) {\n for (const route of config.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Root redirect to login\n app.get('/', (c) => {\n return c.redirect('/auth/login')\n })\n\n // Health check\n app.get('/health', (c) => {\n return c.json({\n name: appName,\n version: appVersion,\n status: 'running',\n timestamp: new Date().toISOString()\n })\n })\n\n // Store app instance for route introspection (API reference auto-discovery)\n setAppInstance(app)\n\n // 404 handler\n app.notFound((c) => {\n return c.json({ error: 'Not Found', status: 404 }, 404)\n })\n\n // Error handler\n app.onError((err, c) => {\n console.error(err)\n return c.json({ error: 'Internal Server Error', status: 500 }, 500)\n })\n\n return app\n}\n\n/**\n * Setup core middleware (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreMiddleware(_app: SonicJSApp): void {\n console.warn('setupCoreMiddleware is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n\n/**\n * Setup core routes (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreRoutes(_app: SonicJSApp): void {\n console.warn('setupCoreRoutes is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n","import { drizzle } from 'drizzle-orm/d1';\nimport * as schema from './schema';\n\nexport function createDb(d1: D1Database) {\n return drizzle(d1, { schema });\n}\n\nexport * from './schema';","/**\n * @sonicjs/core - Main Entry Point\n *\n * Core framework for SonicJS headless CMS\n * Built for Cloudflare's edge platform with TypeScript\n *\n * Phase 2 Migration Status:\n * - Week 1: Types, Utils, Database (COMPLETED ✓)\n * - Week 2: Services, Middleware, Plugins (COMPLETED ✓)\n * - Week 3: Routes, Templates (COMPLETED ✓)\n * - Week 4: Integration & Testing (COMPLETED ✓)\n *\n * Test Coverage:\n * - Utilities: 48 tests (sanitize, query-filter, metrics)\n * - Middleware: 51 tests (auth, logging, security, performance)\n * - Total: 99 tests passing\n */\n\n// ============================================================================\n// Main Application API (Phase 2 Week 1)\n// ============================================================================\n\nexport { createSonicJSApp, setupCoreMiddleware, setupCoreRoutes } from './app'\nexport type { SonicJSConfig, SonicJSApp, Bindings, Variables } from './app'\n\n// ============================================================================\n// Placeholders - To be populated in Phase 2\n// ============================================================================\n\n// Services - Week 2 (COMPLETED)\nexport {\n // Collection Management\n loadCollectionConfigs,\n loadCollectionConfig,\n getAvailableCollectionNames,\n validateCollectionConfig,\n registerCollections,\n syncCollections,\n syncCollection,\n isCollectionManaged,\n getManagedCollections,\n cleanupRemovedCollections,\n fullCollectionSync,\n // Form-Collection Sync\n syncAllFormCollections,\n syncFormCollection,\n createContentFromSubmission,\n deriveCollectionSchemaFromFormio,\n deriveSubmissionTitle,\n mapFormStatusToContentStatus,\n backfillFormSubmissions,\n // Database Migrations\n MigrationService,\n // Logging\n Logger,\n getLogger,\n initLogger,\n // Plugin Services - Class implementations\n PluginService as PluginServiceClass,\n PluginBootstrapService,\n} from './services'\n\nexport type { Migration, MigrationStatus, LogLevel, LogCategory, LogEntry, LogFilter, CorePlugin } from './services'\n\n// Middleware - Week 2 (COMPLETED)\nexport {\n // Authentication\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n // Logging\n loggingMiddleware,\n detailedLoggingMiddleware,\n securityLoggingMiddleware,\n performanceLoggingMiddleware,\n // Performance\n cacheHeaders,\n compressionMiddleware,\n securityHeaders,\n // Permissions\n PermissionManager,\n requirePermission,\n requireAnyPermission,\n logActivity,\n // Plugin middleware\n requireActivePlugin,\n requireActivePlugins,\n getActivePlugins,\n isPluginActive,\n // Bootstrap\n bootstrapMiddleware,\n} from './middleware'\n\nexport type { Permission, UserPermissions } from './middleware'\n\n// Plugins - Week 2 (COMPLETED)\nexport {\n // Hook System - Class implementations\n HookSystemImpl,\n ScopedHookSystem as ScopedHookSystemClass,\n HookUtils,\n // Plugin Registry\n PluginRegistryImpl,\n // Plugin Manager - Class implementation\n PluginManager as PluginManagerClass,\n // Plugin Validator - Class implementation\n PluginValidator as PluginValidatorClass,\n} from './plugins'\n\n// Routes - Week 3 (COMPLETED)\nexport {\n ROUTES_INFO,\n apiRoutes,\n apiContentCrudRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminLogsRoutes,\n adminPluginRoutes,\n adminDesignRoutes,\n adminCheckboxRoutes,\n adminTestimonialsRoutes,\n adminCodeExamplesRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n} from './routes'\n\n// Templates - Week 3 (COMPLETED)\nexport {\n // Form templates\n renderForm,\n renderFormField,\n // Table templates\n renderTable,\n // Pagination templates\n renderPagination,\n // Alert templates\n renderAlert,\n // Confirmation dialog templates\n renderConfirmationDialog,\n getConfirmationDialogScript,\n // Filter bar templates\n renderFilterBar,\n} from './templates'\n\nexport type {\n FormField,\n FormData,\n TableColumn,\n TableData,\n PaginationData,\n AlertData,\n ConfirmationDialogOptions,\n FilterBarData,\n Filter,\n FilterOption,\n} from './templates'\n\n// Types - Week 1 (COMPLETED)\nexport type {\n // Collection types\n FieldType,\n FieldConfig,\n CollectionSchema,\n CollectionConfig,\n CollectionConfigModule,\n CollectionSyncResult,\n // Plugin types\n Plugin,\n PluginContext,\n PluginConfig,\n PluginRoutes,\n PluginMiddleware,\n PluginModel,\n PluginService,\n PluginAdminPage,\n PluginComponent,\n PluginMenuItem,\n PluginHook,\n HookHandler,\n HookContext,\n HookSystem,\n ScopedHookSystem,\n PluginRegistry,\n PluginManager,\n PluginStatus,\n AuthService,\n ContentService,\n MediaService,\n PluginLogger,\n PluginBuilderOptions,\n PluginValidator,\n PluginValidationResult,\n HookName,\n // Plugin manifest\n PluginManifest,\n} from './types'\n\nexport { HOOKS } from './types'\n\n// Utils - Week 1 (COMPLETED)\nexport {\n // Sanitization\n escapeHtml,\n sanitizeInput,\n sanitizeObject,\n // Template rendering\n TemplateRenderer,\n templateRenderer,\n renderTemplate,\n // Query filtering\n QueryFilterBuilder,\n buildQuery,\n // Metrics\n metricsTracker,\n // Version\n SONICJS_VERSION,\n getCoreVersion,\n} from './utils'\n\nexport type {\n FilterOperator,\n FilterCondition,\n FilterGroup,\n QueryFilter,\n QueryResult,\n} from './utils'\n\n// Database - Week 1 (COMPLETED)\nexport {\n createDb,\n // Schema exports\n users,\n collections,\n content,\n contentVersions,\n media,\n apiTokens,\n workflowHistory,\n plugins,\n pluginHooks,\n pluginRoutes,\n pluginAssets,\n pluginActivityLog,\n systemLogs,\n logConfig,\n // Zod validation schemas\n insertUserSchema,\n selectUserSchema,\n insertCollectionSchema,\n selectCollectionSchema,\n insertContentSchema,\n selectContentSchema,\n insertMediaSchema,\n selectMediaSchema,\n insertWorkflowHistorySchema,\n selectWorkflowHistorySchema,\n insertPluginSchema,\n selectPluginSchema,\n insertPluginHookSchema,\n selectPluginHookSchema,\n insertPluginRouteSchema,\n selectPluginRouteSchema,\n insertPluginAssetSchema,\n selectPluginAssetSchema,\n insertPluginActivityLogSchema,\n selectPluginActivityLogSchema,\n insertSystemLogSchema,\n selectSystemLogSchema,\n insertLogConfigSchema,\n selectLogConfigSchema,\n} from './db'\n\nexport type {\n User,\n NewUser,\n Collection,\n NewCollection,\n Content,\n NewContent,\n Media,\n NewMedia,\n WorkflowHistory,\n NewWorkflowHistory,\n Plugin as DbPlugin,\n NewPlugin,\n PluginHook as DbPluginHook,\n NewPluginHook,\n PluginRoute,\n NewPluginRoute,\n PluginAsset,\n NewPluginAsset,\n PluginActivityLog,\n NewPluginActivityLog,\n SystemLog,\n NewSystemLog,\n LogConfig,\n NewLogConfig,\n} from './db'\n\n// Plugin SDK (Beta)\nexport { PluginBuilder, PluginHelpers } from './plugins/sdk'\n\n// OAuth Providers Plugin\nexport { oauthProvidersPlugin, createOAuthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nexport { OAuthService, BUILT_IN_PROVIDERS } from './plugins/core-plugins/oauth-providers/oauth-service'\n\n// User Profiles Plugin\nexport { userProfilesPlugin, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig } from './plugins/core-plugins/user-profiles'\nexport type { ProfileFieldDefinition, UserProfileConfig } from './plugins/core-plugins/user-profiles'\n\n// ============================================================================\n// Version\n// ============================================================================\n\n// Import version from package.json\nimport packageJson from '../package.json'\nexport const VERSION = packageJson.version\n\n// ============================================================================\n// Phase 2 Migration Notes\n// ============================================================================\n\n/**\n * This is a work-in-progress package being extracted from the main SonicJS codebase.\n *\n * Current Phase: 2 (Core Module Migration)\n * Current Week: 1 (Types, Utils, Database)\n *\n * Expected completion: 4 weeks from 2025-01-17\n *\n * DO NOT USE IN PRODUCTION - Alpha release for development only\n */\n"]} \ No newline at end of file diff --git a/packages/core/dist/middleware.cjs b/packages/core/dist/middleware.cjs index bac9ff235..8983654ec 100644 --- a/packages/core/dist/middleware.cjs +++ b/packages/core/dist/middleware.cjs @@ -1,8 +1,8 @@ 'use strict'; -var chunkV4V54BY3_cjs = require('./chunk-V4V54BY3.cjs'); -require('./chunk-QOZZJZ76.cjs'); -require('./chunk-7KR6GOY3.cjs'); +var chunkTAOOLOUH_cjs = require('./chunk-TAOOLOUH.cjs'); +require('./chunk-656GGECX.cjs'); +require('./chunk-ICMNCCX2.cjs'); require('./chunk-RCQ2HIQD.cjs'); require('./chunk-IGJUBJBW.cjs'); @@ -10,119 +10,119 @@ require('./chunk-IGJUBJBW.cjs'); Object.defineProperty(exports, "AuthManager", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.AuthManager; } + get: function () { return chunkTAOOLOUH_cjs.AuthManager; } }); Object.defineProperty(exports, "PermissionManager", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.PermissionManager; } + get: function () { return chunkTAOOLOUH_cjs.PermissionManager; } }); Object.defineProperty(exports, "bootstrapMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.bootstrapMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.bootstrapMiddleware; } }); Object.defineProperty(exports, "cacheHeaders", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.cacheHeaders; } + get: function () { return chunkTAOOLOUH_cjs.cacheHeaders; } }); Object.defineProperty(exports, "compressionMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.compressionMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.compressionMiddleware; } }); Object.defineProperty(exports, "csrfProtection", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.csrfProtection; } + get: function () { return chunkTAOOLOUH_cjs.csrfProtection; } }); Object.defineProperty(exports, "detailedLoggingMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.detailedLoggingMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.detailedLoggingMiddleware; } }); Object.defineProperty(exports, "generateCsrfToken", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.generateCsrfToken; } + get: function () { return chunkTAOOLOUH_cjs.generateCsrfToken; } }); Object.defineProperty(exports, "getActivePlugins", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.getActivePlugins; } + get: function () { return chunkTAOOLOUH_cjs.getActivePlugins; } }); Object.defineProperty(exports, "getJwtExpirySeconds", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.getJwtExpirySeconds; } + get: function () { return chunkTAOOLOUH_cjs.getJwtExpirySeconds; } }); Object.defineProperty(exports, "getJwtExpirySecondsFromDb", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb; } + get: function () { return chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb; } }); Object.defineProperty(exports, "getJwtRefreshGraceSecondsFromDb", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.getJwtRefreshGraceSecondsFromDb; } + get: function () { return chunkTAOOLOUH_cjs.getJwtRefreshGraceSecondsFromDb; } }); Object.defineProperty(exports, "isPluginActive", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.isPluginActive; } + get: function () { return chunkTAOOLOUH_cjs.isPluginActive; } }); Object.defineProperty(exports, "logActivity", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.logActivity; } + get: function () { return chunkTAOOLOUH_cjs.logActivity; } }); Object.defineProperty(exports, "loggingMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.loggingMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.loggingMiddleware; } }); Object.defineProperty(exports, "metricsMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.metricsMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.metricsMiddleware; } }); Object.defineProperty(exports, "optionalAuth", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.optionalAuth; } + get: function () { return chunkTAOOLOUH_cjs.optionalAuth; } }); Object.defineProperty(exports, "performanceLoggingMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.performanceLoggingMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.performanceLoggingMiddleware; } }); Object.defineProperty(exports, "rateLimit", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.rateLimit; } + get: function () { return chunkTAOOLOUH_cjs.rateLimit; } }); Object.defineProperty(exports, "requireActivePlugin", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requireActivePlugin; } + get: function () { return chunkTAOOLOUH_cjs.requireActivePlugin; } }); Object.defineProperty(exports, "requireActivePlugins", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requireActivePlugins; } + get: function () { return chunkTAOOLOUH_cjs.requireActivePlugins; } }); Object.defineProperty(exports, "requireAnyPermission", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requireAnyPermission; } + get: function () { return chunkTAOOLOUH_cjs.requireAnyPermission; } }); Object.defineProperty(exports, "requireAuth", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requireAuth; } + get: function () { return chunkTAOOLOUH_cjs.requireAuth; } }); Object.defineProperty(exports, "requirePermission", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requirePermission; } + get: function () { return chunkTAOOLOUH_cjs.requirePermission; } }); Object.defineProperty(exports, "requireRole", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.requireRole; } + get: function () { return chunkTAOOLOUH_cjs.requireRole; } }); Object.defineProperty(exports, "securityHeaders", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.securityHeadersMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.securityHeadersMiddleware; } }); Object.defineProperty(exports, "securityLoggingMiddleware", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.securityLoggingMiddleware; } + get: function () { return chunkTAOOLOUH_cjs.securityLoggingMiddleware; } }); Object.defineProperty(exports, "validateCsrfToken", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.validateCsrfToken; } + get: function () { return chunkTAOOLOUH_cjs.validateCsrfToken; } }); Object.defineProperty(exports, "verifySecurityConfig", { enumerable: true, - get: function () { return chunkV4V54BY3_cjs.verifySecurityConfig; } + get: function () { return chunkTAOOLOUH_cjs.verifySecurityConfig; } }); //# sourceMappingURL=middleware.cjs.map //# sourceMappingURL=middleware.cjs.map \ No newline at end of file diff --git a/packages/core/dist/middleware.d.cts b/packages/core/dist/middleware.d.cts index fda548d4b..2bafa4b2b 100644 --- a/packages/core/dist/middleware.d.cts +++ b/packages/core/dist/middleware.d.cts @@ -62,12 +62,31 @@ declare class AuthManager { /** * Verify a token's signature and expiration. * + * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the + * `secret` argument. If omitted, this falls back to a development-only + * placeholder secret — tokens signed with the real `JWT_SECRET` will then + * silently fail verification. From inside a Hono handler prefer + * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction + * and pulls the secret from `c.env` for you. + * * If `graceSeconds` > 0, tokens whose `exp` is within the grace window * (i.e. expired by no more than `graceSeconds`) are still returned. This * supports a sliding-session refresh endpoint that accepts recently-expired * tokens. Signature failures always return null. */ static verifyToken(token: string, secret?: string, graceSeconds?: number): Promise; + /** + * Verify the JWT on an incoming Hono request using the `JWT_SECRET` + * binding from `c.env`. Reads the token from the `Authorization: Bearer …` + * header first, then falls back to the `auth_token` cookie. Returns the + * decoded payload, or null when the token is missing, malformed, expired, + * or signed with a different secret. + * + * Use this from custom Hono routes mounted alongside SonicJS — it + * resolves the secret the same way `requireAuth()` does, without forcing + * the caller to plumb it through manually. + */ + static verifyAuthRequest(c: Context): Promise; static hashPassword(password: string): Promise; static hashPasswordLegacy(password: string): Promise; static verifyPassword(password: string, storedHash: string): Promise; diff --git a/packages/core/dist/middleware.d.ts b/packages/core/dist/middleware.d.ts index 3b79b476c..6342b3f49 100644 --- a/packages/core/dist/middleware.d.ts +++ b/packages/core/dist/middleware.d.ts @@ -62,12 +62,31 @@ declare class AuthManager { /** * Verify a token's signature and expiration. * + * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the + * `secret` argument. If omitted, this falls back to a development-only + * placeholder secret — tokens signed with the real `JWT_SECRET` will then + * silently fail verification. From inside a Hono handler prefer + * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction + * and pulls the secret from `c.env` for you. + * * If `graceSeconds` > 0, tokens whose `exp` is within the grace window * (i.e. expired by no more than `graceSeconds`) are still returned. This * supports a sliding-session refresh endpoint that accepts recently-expired * tokens. Signature failures always return null. */ static verifyToken(token: string, secret?: string, graceSeconds?: number): Promise; + /** + * Verify the JWT on an incoming Hono request using the `JWT_SECRET` + * binding from `c.env`. Reads the token from the `Authorization: Bearer …` + * header first, then falls back to the `auth_token` cookie. Returns the + * decoded payload, or null when the token is missing, malformed, expired, + * or signed with a different secret. + * + * Use this from custom Hono routes mounted alongside SonicJS — it + * resolves the secret the same way `requireAuth()` does, without forcing + * the caller to plumb it through manually. + */ + static verifyAuthRequest(c: Context): Promise; static hashPassword(password: string): Promise; static hashPasswordLegacy(password: string): Promise; static verifyPassword(password: string, storedHash: string): Promise; diff --git a/packages/core/dist/middleware.js b/packages/core/dist/middleware.js index e55f1cbe2..7676914c9 100644 --- a/packages/core/dist/middleware.js +++ b/packages/core/dist/middleware.js @@ -1,6 +1,6 @@ -export { AuthManager, PermissionManager, bootstrapMiddleware, cacheHeaders, compressionMiddleware, csrfProtection, detailedLoggingMiddleware, generateCsrfToken, getActivePlugins, getJwtExpirySeconds, getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb, isPluginActive, logActivity, loggingMiddleware, metricsMiddleware, optionalAuth, performanceLoggingMiddleware, rateLimit, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware as securityHeaders, securityLoggingMiddleware, validateCsrfToken, verifySecurityConfig } from './chunk-5QK3FXKX.js'; -import './chunk-CJOLOONT.js'; -import './chunk-CSQWOYGZ.js'; +export { AuthManager, PermissionManager, bootstrapMiddleware, cacheHeaders, compressionMiddleware, csrfProtection, detailedLoggingMiddleware, generateCsrfToken, getActivePlugins, getJwtExpirySeconds, getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb, isPluginActive, logActivity, loggingMiddleware, metricsMiddleware, optionalAuth, performanceLoggingMiddleware, rateLimit, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware as securityHeaders, securityLoggingMiddleware, validateCsrfToken, verifySecurityConfig } from './chunk-DMPXZ6JJ.js'; +import './chunk-NJVY2U43.js'; +import './chunk-46DCL763.js'; import './chunk-FICTAGD4.js'; import './chunk-V4OQ3NZ2.js'; //# sourceMappingURL=middleware.js.map diff --git a/packages/core/dist/migrations-2MVNZKQI.cjs b/packages/core/dist/migrations-2MVNZKQI.cjs new file mode 100644 index 000000000..701a125a9 --- /dev/null +++ b/packages/core/dist/migrations-2MVNZKQI.cjs @@ -0,0 +1,13 @@ +'use strict'; + +var chunkICMNCCX2_cjs = require('./chunk-ICMNCCX2.cjs'); +require('./chunk-IGJUBJBW.cjs'); + + + +Object.defineProperty(exports, "MigrationService", { + enumerable: true, + get: function () { return chunkICMNCCX2_cjs.MigrationService; } +}); +//# sourceMappingURL=migrations-2MVNZKQI.cjs.map +//# sourceMappingURL=migrations-2MVNZKQI.cjs.map \ No newline at end of file diff --git a/packages/core/dist/migrations-3CPSXQ26.cjs.map b/packages/core/dist/migrations-2MVNZKQI.cjs.map similarity index 76% rename from packages/core/dist/migrations-3CPSXQ26.cjs.map rename to packages/core/dist/migrations-2MVNZKQI.cjs.map index 66e6af341..4e606a073 100644 --- a/packages/core/dist/migrations-3CPSXQ26.cjs.map +++ b/packages/core/dist/migrations-2MVNZKQI.cjs.map @@ -1 +1 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"migrations-3CPSXQ26.cjs"} \ No newline at end of file +{"version":3,"sources":[],"names":[],"mappings":"","file":"migrations-2MVNZKQI.cjs"} \ No newline at end of file diff --git a/packages/core/dist/migrations-3CPSXQ26.cjs b/packages/core/dist/migrations-3CPSXQ26.cjs deleted file mode 100644 index f09936c4c..000000000 --- a/packages/core/dist/migrations-3CPSXQ26.cjs +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -var chunk7KR6GOY3_cjs = require('./chunk-7KR6GOY3.cjs'); -require('./chunk-IGJUBJBW.cjs'); - - - -Object.defineProperty(exports, "MigrationService", { - enumerable: true, - get: function () { return chunk7KR6GOY3_cjs.MigrationService; } -}); -//# sourceMappingURL=migrations-3CPSXQ26.cjs.map -//# sourceMappingURL=migrations-3CPSXQ26.cjs.map \ No newline at end of file diff --git a/packages/core/dist/migrations-SMFIJBW2.js b/packages/core/dist/migrations-SMFIJBW2.js deleted file mode 100644 index 280170158..000000000 --- a/packages/core/dist/migrations-SMFIJBW2.js +++ /dev/null @@ -1,4 +0,0 @@ -export { MigrationService } from './chunk-CSQWOYGZ.js'; -import './chunk-V4OQ3NZ2.js'; -//# sourceMappingURL=migrations-SMFIJBW2.js.map -//# sourceMappingURL=migrations-SMFIJBW2.js.map \ No newline at end of file diff --git a/packages/core/dist/migrations-W7P2NBXW.js b/packages/core/dist/migrations-W7P2NBXW.js new file mode 100644 index 000000000..3f1522c19 --- /dev/null +++ b/packages/core/dist/migrations-W7P2NBXW.js @@ -0,0 +1,4 @@ +export { MigrationService } from './chunk-46DCL763.js'; +import './chunk-V4OQ3NZ2.js'; +//# sourceMappingURL=migrations-W7P2NBXW.js.map +//# sourceMappingURL=migrations-W7P2NBXW.js.map \ No newline at end of file diff --git a/packages/core/dist/migrations-SMFIJBW2.js.map b/packages/core/dist/migrations-W7P2NBXW.js.map similarity index 77% rename from packages/core/dist/migrations-SMFIJBW2.js.map rename to packages/core/dist/migrations-W7P2NBXW.js.map index 585eabd7d..1f1384222 100644 --- a/packages/core/dist/migrations-SMFIJBW2.js.map +++ b/packages/core/dist/migrations-W7P2NBXW.js.map @@ -1 +1 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"migrations-SMFIJBW2.js"} \ No newline at end of file +{"version":3,"sources":[],"names":[],"mappings":"","file":"migrations-W7P2NBXW.js"} \ No newline at end of file diff --git a/packages/core/dist/plugins.cjs b/packages/core/dist/plugins.cjs index 7920e976c..b1421a7e4 100644 --- a/packages/core/dist/plugins.cjs +++ b/packages/core/dist/plugins.cjs @@ -1,6 +1,6 @@ 'use strict'; -var chunkZUXOAZWZ_cjs = require('./chunk-ZUXOAZWZ.cjs'); +var chunkABB34XUS_cjs = require('./chunk-ABB34XUS.cjs'); var chunk635JAMSE_cjs = require('./chunk-635JAMSE.cjs'); require('./chunk-QTFKZBLC.cjs'); require('./chunk-IGJUBJBW.cjs'); @@ -9,35 +9,35 @@ require('./chunk-IGJUBJBW.cjs'); Object.defineProperty(exports, "HookSystemImpl", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.HookSystemImpl; } + get: function () { return chunkABB34XUS_cjs.HookSystemImpl; } }); Object.defineProperty(exports, "HookUtils", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.HookUtils; } + get: function () { return chunkABB34XUS_cjs.HookUtils; } }); Object.defineProperty(exports, "PluginManager", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.PluginManager; } + get: function () { return chunkABB34XUS_cjs.PluginManager; } }); Object.defineProperty(exports, "PluginRegistryImpl", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.PluginRegistryImpl; } + get: function () { return chunkABB34XUS_cjs.PluginRegistryImpl; } }); Object.defineProperty(exports, "PluginValidator", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.PluginValidator; } + get: function () { return chunkABB34XUS_cjs.PluginValidator; } }); Object.defineProperty(exports, "ScopedHookSystem", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.ScopedHookSystem; } + get: function () { return chunkABB34XUS_cjs.ScopedHookSystem; } }); Object.defineProperty(exports, "createTurnstileMiddleware", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.createTurnstileMiddleware; } + get: function () { return chunkABB34XUS_cjs.createTurnstileMiddleware; } }); Object.defineProperty(exports, "verifyTurnstile", { enumerable: true, - get: function () { return chunkZUXOAZWZ_cjs.verifyTurnstile; } + get: function () { return chunkABB34XUS_cjs.verifyTurnstile; } }); Object.defineProperty(exports, "TurnstileService", { enumerable: true, diff --git a/packages/core/dist/plugins.js b/packages/core/dist/plugins.js index 1cc817703..9bc52b13e 100644 --- a/packages/core/dist/plugins.js +++ b/packages/core/dist/plugins.js @@ -1,4 +1,4 @@ -export { HookSystemImpl, HookUtils, PluginManager, PluginRegistryImpl, PluginValidator, ScopedHookSystem, createTurnstileMiddleware, verifyTurnstile } from './chunk-NGTBJJXZ.js'; +export { HookSystemImpl, HookUtils, PluginManager, PluginRegistryImpl, PluginValidator, ScopedHookSystem, createTurnstileMiddleware, verifyTurnstile } from './chunk-TFNTM3OA.js'; export { TurnstileService } from './chunk-EXNEW5US.js'; import './chunk-QXOZI5Q2.js'; import './chunk-V4OQ3NZ2.js'; diff --git a/packages/core/dist/routes.cjs b/packages/core/dist/routes.cjs index 41d4ec363..796d064e4 100644 --- a/packages/core/dist/routes.cjs +++ b/packages/core/dist/routes.cjs @@ -1,14 +1,14 @@ 'use strict'; -var chunkBX75LZES_cjs = require('./chunk-BX75LZES.cjs'); -require('./chunk-XWQVFWPW.cjs'); -require('./chunk-V4V54BY3.cjs'); -require('./chunk-QOZZJZ76.cjs'); -require('./chunk-7KR6GOY3.cjs'); +var chunkLPYFMGAK_cjs = require('./chunk-LPYFMGAK.cjs'); +require('./chunk-WAEQXGCX.cjs'); +require('./chunk-TAOOLOUH.cjs'); +require('./chunk-656GGECX.cjs'); +require('./chunk-ICMNCCX2.cjs'); require('./chunk-OHYBNCVL.cjs'); require('./chunk-UYJ6TJHX.cjs'); require('./chunk-635JAMSE.cjs'); -require('./chunk-74BFRAQS.cjs'); +require('./chunk-GLRZAPX6.cjs'); require('./chunk-P3XDZL6Q.cjs'); require('./chunk-RCQ2HIQD.cjs'); require('./chunk-MNWKYY5E.cjs'); @@ -18,95 +18,95 @@ require('./chunk-IGJUBJBW.cjs'); Object.defineProperty(exports, "ROUTES_INFO", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.ROUTES_INFO; } + get: function () { return chunkLPYFMGAK_cjs.ROUTES_INFO; } }); Object.defineProperty(exports, "adminApiReferenceRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.router2; } + get: function () { return chunkLPYFMGAK_cjs.router2; } }); Object.defineProperty(exports, "adminApiRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.admin_api_default; } + get: function () { return chunkLPYFMGAK_cjs.admin_api_default; } }); Object.defineProperty(exports, "adminCheckboxRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminCheckboxRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminCheckboxRoutes; } }); Object.defineProperty(exports, "adminCodeExamplesRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.admin_code_examples_default; } + get: function () { return chunkLPYFMGAK_cjs.admin_code_examples_default; } }); Object.defineProperty(exports, "adminCollectionsRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminCollectionsRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminCollectionsRoutes; } }); Object.defineProperty(exports, "adminContentRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.admin_content_default; } + get: function () { return chunkLPYFMGAK_cjs.admin_content_default; } }); Object.defineProperty(exports, "adminDashboardRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.router; } + get: function () { return chunkLPYFMGAK_cjs.router; } }); Object.defineProperty(exports, "adminDesignRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminDesignRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminDesignRoutes; } }); Object.defineProperty(exports, "adminFormsRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminFormsRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminFormsRoutes; } }); Object.defineProperty(exports, "adminLogsRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminLogsRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminLogsRoutes; } }); Object.defineProperty(exports, "adminMediaRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminMediaRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminMediaRoutes; } }); Object.defineProperty(exports, "adminPluginRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminPluginRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminPluginRoutes; } }); Object.defineProperty(exports, "adminSettingsRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.adminSettingsRoutes; } + get: function () { return chunkLPYFMGAK_cjs.adminSettingsRoutes; } }); Object.defineProperty(exports, "adminTestimonialsRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.admin_testimonials_default; } + get: function () { return chunkLPYFMGAK_cjs.admin_testimonials_default; } }); Object.defineProperty(exports, "adminUsersRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.userRoutes; } + get: function () { return chunkLPYFMGAK_cjs.userRoutes; } }); Object.defineProperty(exports, "apiContentCrudRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.api_content_crud_default; } + get: function () { return chunkLPYFMGAK_cjs.api_content_crud_default; } }); Object.defineProperty(exports, "apiMediaRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.api_media_default; } + get: function () { return chunkLPYFMGAK_cjs.api_media_default; } }); Object.defineProperty(exports, "apiRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.api_default; } + get: function () { return chunkLPYFMGAK_cjs.api_default; } }); Object.defineProperty(exports, "apiSystemRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.api_system_default; } + get: function () { return chunkLPYFMGAK_cjs.api_system_default; } }); Object.defineProperty(exports, "authRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.auth_default; } + get: function () { return chunkLPYFMGAK_cjs.auth_default; } }); Object.defineProperty(exports, "publicFormsRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.public_forms_default; } + get: function () { return chunkLPYFMGAK_cjs.public_forms_default; } }); Object.defineProperty(exports, "testCleanupRoutes", { enumerable: true, - get: function () { return chunkBX75LZES_cjs.test_cleanup_default; } + get: function () { return chunkLPYFMGAK_cjs.test_cleanup_default; } }); //# sourceMappingURL=routes.cjs.map //# sourceMappingURL=routes.cjs.map \ No newline at end of file diff --git a/packages/core/dist/routes.js b/packages/core/dist/routes.js index 905916380..b5168a89f 100644 --- a/packages/core/dist/routes.js +++ b/packages/core/dist/routes.js @@ -1,12 +1,12 @@ -export { ROUTES_INFO, router2 as adminApiReferenceRoutes, admin_api_default as adminApiRoutes, adminCheckboxRoutes, admin_code_examples_default as adminCodeExamplesRoutes, adminCollectionsRoutes, admin_content_default as adminContentRoutes, router as adminDashboardRoutes, adminDesignRoutes, adminFormsRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, admin_testimonials_default as adminTestimonialsRoutes, userRoutes as adminUsersRoutes, api_content_crud_default as apiContentCrudRoutes, api_media_default as apiMediaRoutes, api_default as apiRoutes, api_system_default as apiSystemRoutes, auth_default as authRoutes, public_forms_default as publicFormsRoutes, test_cleanup_default as testCleanupRoutes } from './chunk-M2PKQJ6J.js'; -import './chunk-GQEIPW3L.js'; -import './chunk-5QK3FXKX.js'; -import './chunk-CJOLOONT.js'; -import './chunk-CSQWOYGZ.js'; +export { ROUTES_INFO, router2 as adminApiReferenceRoutes, admin_api_default as adminApiRoutes, adminCheckboxRoutes, admin_code_examples_default as adminCodeExamplesRoutes, adminCollectionsRoutes, admin_content_default as adminContentRoutes, router as adminDashboardRoutes, adminDesignRoutes, adminFormsRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, admin_testimonials_default as adminTestimonialsRoutes, userRoutes as adminUsersRoutes, api_content_crud_default as apiContentCrudRoutes, api_media_default as apiMediaRoutes, api_default as apiRoutes, api_system_default as apiSystemRoutes, auth_default as authRoutes, public_forms_default as publicFormsRoutes, test_cleanup_default as testCleanupRoutes } from './chunk-OO7BOO6H.js'; +import './chunk-QFWHAFEO.js'; +import './chunk-DMPXZ6JJ.js'; +import './chunk-NJVY2U43.js'; +import './chunk-46DCL763.js'; import './chunk-XWIA3HVX.js'; import './chunk-55RDMDOP.js'; import './chunk-EXNEW5US.js'; -import './chunk-NDS4S4AG.js'; +import './chunk-FE77VWGD.js'; import './chunk-X7ZAEI5S.js'; import './chunk-FICTAGD4.js'; import './chunk-TQABQWOP.js'; diff --git a/packages/core/dist/services.cjs b/packages/core/dist/services.cjs index 26934b2a0..8aa6507f0 100644 --- a/packages/core/dist/services.cjs +++ b/packages/core/dist/services.cjs @@ -1,8 +1,8 @@ 'use strict'; -var chunkXWQVFWPW_cjs = require('./chunk-XWQVFWPW.cjs'); -var chunkQOZZJZ76_cjs = require('./chunk-QOZZJZ76.cjs'); -var chunk7KR6GOY3_cjs = require('./chunk-7KR6GOY3.cjs'); +var chunkWAEQXGCX_cjs = require('./chunk-WAEQXGCX.cjs'); +var chunk656GGECX_cjs = require('./chunk-656GGECX.cjs'); +var chunkICMNCCX2_cjs = require('./chunk-ICMNCCX2.cjs'); require('./chunk-P3XDZL6Q.cjs'); require('./chunk-IGJUBJBW.cjs'); @@ -10,147 +10,147 @@ require('./chunk-IGJUBJBW.cjs'); Object.defineProperty(exports, "CACHE_CONFIGS", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.CACHE_CONFIGS; } + get: function () { return chunkWAEQXGCX_cjs.CACHE_CONFIGS; } }); Object.defineProperty(exports, "CATEGORY_INFO", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.CATEGORY_INFO; } + get: function () { return chunkWAEQXGCX_cjs.CATEGORY_INFO; } }); Object.defineProperty(exports, "CacheService", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.CacheService; } + get: function () { return chunkWAEQXGCX_cjs.CacheService; } }); Object.defineProperty(exports, "Logger", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.Logger; } + get: function () { return chunkWAEQXGCX_cjs.Logger; } }); Object.defineProperty(exports, "SettingsService", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.SettingsService; } + get: function () { return chunkWAEQXGCX_cjs.SettingsService; } }); Object.defineProperty(exports, "TelemetryService", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.TelemetryService; } + get: function () { return chunkWAEQXGCX_cjs.TelemetryService; } }); Object.defineProperty(exports, "buildRouteList", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.buildRouteList; } + get: function () { return chunkWAEQXGCX_cjs.buildRouteList; } }); Object.defineProperty(exports, "createInstallationIdentity", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.createInstallationIdentity; } + get: function () { return chunkWAEQXGCX_cjs.createInstallationIdentity; } }); Object.defineProperty(exports, "getAppInstance", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.getAppInstance; } + get: function () { return chunkWAEQXGCX_cjs.getAppInstance; } }); Object.defineProperty(exports, "getCacheService", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.getCacheService; } + get: function () { return chunkWAEQXGCX_cjs.getCacheService; } }); Object.defineProperty(exports, "getLogger", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.getLogger; } + get: function () { return chunkWAEQXGCX_cjs.getLogger; } }); Object.defineProperty(exports, "getTelemetryService", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.getTelemetryService; } + get: function () { return chunkWAEQXGCX_cjs.getTelemetryService; } }); Object.defineProperty(exports, "initLogger", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.initLogger; } + get: function () { return chunkWAEQXGCX_cjs.initLogger; } }); Object.defineProperty(exports, "initTelemetry", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.initTelemetry; } + get: function () { return chunkWAEQXGCX_cjs.initTelemetry; } }); Object.defineProperty(exports, "setAppInstance", { enumerable: true, - get: function () { return chunkXWQVFWPW_cjs.setAppInstance; } + get: function () { return chunkWAEQXGCX_cjs.setAppInstance; } }); Object.defineProperty(exports, "PluginBootstrapService", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.PluginBootstrapService; } + get: function () { return chunk656GGECX_cjs.PluginBootstrapService; } }); Object.defineProperty(exports, "PluginService", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.PluginService; } + get: function () { return chunk656GGECX_cjs.PluginService; } }); Object.defineProperty(exports, "backfillFormSubmissions", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.backfillFormSubmissions; } + get: function () { return chunk656GGECX_cjs.backfillFormSubmissions; } }); Object.defineProperty(exports, "cleanupRemovedCollections", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.cleanupRemovedCollections; } + get: function () { return chunk656GGECX_cjs.cleanupRemovedCollections; } }); Object.defineProperty(exports, "createContentFromSubmission", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.createContentFromSubmission; } + get: function () { return chunk656GGECX_cjs.createContentFromSubmission; } }); Object.defineProperty(exports, "deriveCollectionSchemaFromFormio", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.deriveCollectionSchemaFromFormio; } + get: function () { return chunk656GGECX_cjs.deriveCollectionSchemaFromFormio; } }); Object.defineProperty(exports, "deriveSubmissionTitle", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.deriveSubmissionTitle; } + get: function () { return chunk656GGECX_cjs.deriveSubmissionTitle; } }); Object.defineProperty(exports, "fullCollectionSync", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.fullCollectionSync; } + get: function () { return chunk656GGECX_cjs.fullCollectionSync; } }); Object.defineProperty(exports, "getAvailableCollectionNames", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.getAvailableCollectionNames; } + get: function () { return chunk656GGECX_cjs.getAvailableCollectionNames; } }); Object.defineProperty(exports, "getManagedCollections", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.getManagedCollections; } + get: function () { return chunk656GGECX_cjs.getManagedCollections; } }); Object.defineProperty(exports, "isCollectionManaged", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.isCollectionManaged; } + get: function () { return chunk656GGECX_cjs.isCollectionManaged; } }); Object.defineProperty(exports, "loadCollectionConfig", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.loadCollectionConfig; } + get: function () { return chunk656GGECX_cjs.loadCollectionConfig; } }); Object.defineProperty(exports, "loadCollectionConfigs", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.loadCollectionConfigs; } + get: function () { return chunk656GGECX_cjs.loadCollectionConfigs; } }); Object.defineProperty(exports, "mapFormStatusToContentStatus", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.mapFormStatusToContentStatus; } + get: function () { return chunk656GGECX_cjs.mapFormStatusToContentStatus; } }); Object.defineProperty(exports, "registerCollections", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.registerCollections; } + get: function () { return chunk656GGECX_cjs.registerCollections; } }); Object.defineProperty(exports, "syncAllFormCollections", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.syncAllFormCollections; } + get: function () { return chunk656GGECX_cjs.syncAllFormCollections; } }); Object.defineProperty(exports, "syncCollection", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.syncCollection; } + get: function () { return chunk656GGECX_cjs.syncCollection; } }); Object.defineProperty(exports, "syncCollections", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.syncCollections; } + get: function () { return chunk656GGECX_cjs.syncCollections; } }); Object.defineProperty(exports, "syncFormCollection", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.syncFormCollection; } + get: function () { return chunk656GGECX_cjs.syncFormCollection; } }); Object.defineProperty(exports, "validateCollectionConfig", { enumerable: true, - get: function () { return chunkQOZZJZ76_cjs.validateCollectionConfig; } + get: function () { return chunk656GGECX_cjs.validateCollectionConfig; } }); Object.defineProperty(exports, "MigrationService", { enumerable: true, - get: function () { return chunk7KR6GOY3_cjs.MigrationService; } + get: function () { return chunkICMNCCX2_cjs.MigrationService; } }); //# sourceMappingURL=services.cjs.map //# sourceMappingURL=services.cjs.map \ No newline at end of file diff --git a/packages/core/dist/services.js b/packages/core/dist/services.js index 2c7427577..a56e6249f 100644 --- a/packages/core/dist/services.js +++ b/packages/core/dist/services.js @@ -1,6 +1,6 @@ -export { CACHE_CONFIGS, CATEGORY_INFO, CacheService, Logger, SettingsService, TelemetryService, buildRouteList, createInstallationIdentity, getAppInstance, getCacheService, getLogger, getTelemetryService, initLogger, initTelemetry, setAppInstance } from './chunk-GQEIPW3L.js'; -export { PluginBootstrapService, PluginService, backfillFormSubmissions, cleanupRemovedCollections, createContentFromSubmission, deriveCollectionSchemaFromFormio, deriveSubmissionTitle, fullCollectionSync, getAvailableCollectionNames, getManagedCollections, isCollectionManaged, loadCollectionConfig, loadCollectionConfigs, mapFormStatusToContentStatus, registerCollections, syncAllFormCollections, syncCollection, syncCollections, syncFormCollection, validateCollectionConfig } from './chunk-CJOLOONT.js'; -export { MigrationService } from './chunk-CSQWOYGZ.js'; +export { CACHE_CONFIGS, CATEGORY_INFO, CacheService, Logger, SettingsService, TelemetryService, buildRouteList, createInstallationIdentity, getAppInstance, getCacheService, getLogger, getTelemetryService, initLogger, initTelemetry, setAppInstance } from './chunk-QFWHAFEO.js'; +export { PluginBootstrapService, PluginService, backfillFormSubmissions, cleanupRemovedCollections, createContentFromSubmission, deriveCollectionSchemaFromFormio, deriveSubmissionTitle, fullCollectionSync, getAvailableCollectionNames, getManagedCollections, isCollectionManaged, loadCollectionConfig, loadCollectionConfigs, mapFormStatusToContentStatus, registerCollections, syncAllFormCollections, syncCollection, syncCollections, syncFormCollection, validateCollectionConfig } from './chunk-NJVY2U43.js'; +export { MigrationService } from './chunk-46DCL763.js'; import './chunk-X7ZAEI5S.js'; import './chunk-V4OQ3NZ2.js'; //# sourceMappingURL=services.js.map diff --git a/packages/core/dist/utils.cjs b/packages/core/dist/utils.cjs index dc18fb78c..a4f0272df 100644 --- a/packages/core/dist/utils.cjs +++ b/packages/core/dist/utils.cjs @@ -1,6 +1,6 @@ 'use strict'; -var chunk74BFRAQS_cjs = require('./chunk-74BFRAQS.cjs'); +var chunkGLRZAPX6_cjs = require('./chunk-GLRZAPX6.cjs'); var chunkP3XDZL6Q_cjs = require('./chunk-P3XDZL6Q.cjs'); var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs'); var chunkMNWKYY5E_cjs = require('./chunk-MNWKYY5E.cjs'); @@ -10,43 +10,43 @@ require('./chunk-IGJUBJBW.cjs'); Object.defineProperty(exports, "QueryFilterBuilder", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.QueryFilterBuilder; } + get: function () { return chunkGLRZAPX6_cjs.QueryFilterBuilder; } }); Object.defineProperty(exports, "SONICJS_VERSION", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.SONICJS_VERSION; } + get: function () { return chunkGLRZAPX6_cjs.SONICJS_VERSION; } }); Object.defineProperty(exports, "TemplateRenderer", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.TemplateRenderer; } + get: function () { return chunkGLRZAPX6_cjs.TemplateRenderer; } }); Object.defineProperty(exports, "buildQuery", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.buildQuery; } + get: function () { return chunkGLRZAPX6_cjs.buildQuery; } }); Object.defineProperty(exports, "generateSlug", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.generateSlug; } + get: function () { return chunkGLRZAPX6_cjs.generateSlug; } }); Object.defineProperty(exports, "getBlocksFieldConfig", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.getBlocksFieldConfig; } + get: function () { return chunkGLRZAPX6_cjs.getBlocksFieldConfig; } }); Object.defineProperty(exports, "getCoreVersion", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.getCoreVersion; } + get: function () { return chunkGLRZAPX6_cjs.getCoreVersion; } }); Object.defineProperty(exports, "parseBlocksValue", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.parseBlocksValue; } + get: function () { return chunkGLRZAPX6_cjs.parseBlocksValue; } }); Object.defineProperty(exports, "renderTemplate", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.renderTemplate; } + get: function () { return chunkGLRZAPX6_cjs.renderTemplate; } }); Object.defineProperty(exports, "templateRenderer", { enumerable: true, - get: function () { return chunk74BFRAQS_cjs.templateRenderer; } + get: function () { return chunkGLRZAPX6_cjs.templateRenderer; } }); Object.defineProperty(exports, "generateInstallationId", { enumerable: true, diff --git a/packages/core/dist/utils.js b/packages/core/dist/utils.js index c5db97a75..c15fac090 100644 --- a/packages/core/dist/utils.js +++ b/packages/core/dist/utils.js @@ -1,4 +1,4 @@ -export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, generateSlug, getBlocksFieldConfig, getCoreVersion, parseBlocksValue, renderTemplate, templateRenderer } from './chunk-NDS4S4AG.js'; +export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, generateSlug, getBlocksFieldConfig, getCoreVersion, parseBlocksValue, renderTemplate, templateRenderer } from './chunk-FE77VWGD.js'; export { generateInstallationId, generateProjectId, getDefaultTelemetryConfig, getTelemetryConfig, isTelemetryEnabled, sanitizeErrorMessage, sanitizeRoute, shouldSkipEvent } from './chunk-X7ZAEI5S.js'; export { metricsTracker } from './chunk-FICTAGD4.js'; export { escapeHtml, sanitizeInput, sanitizeObject } from './chunk-TQABQWOP.js'; diff --git a/packages/core/src/db/migrations-bundle.ts b/packages/core/src/db/migrations-bundle.ts index b134aff29..7bfcbeaa1 100644 --- a/packages/core/src/db/migrations-bundle.ts +++ b/packages/core/src/db/migrations-bundle.ts @@ -1,7 +1,7 @@ /** * AUTO-GENERATED FILE - DO NOT EDIT * Generated by: scripts/generate-migrations.ts - * Generated at: 2026-05-01T00:32:37.853Z + * Generated at: 2026-05-16T15:00:21.459Z * * This file contains all migration SQL bundled for use in Cloudflare Workers * where filesystem access is not available at runtime. diff --git a/packages/core/src/plugins/manifest-registry.ts b/packages/core/src/plugins/manifest-registry.ts index 2fdd44526..8a78b7a2c 100644 --- a/packages/core/src/plugins/manifest-registry.ts +++ b/packages/core/src/plugins/manifest-registry.ts @@ -2,7 +2,7 @@ * Plugin Registry - AUTO-GENERATED * * Generated by: packages/scripts/generate-plugin-registry.mjs - * Generated at: 2026-05-01T00:32:37.025Z + * Generated at: 2026-05-16T15:00:20.475Z * Source: All manifest.json files in src/plugins/ * * DO NOT EDIT MANUALLY - run the generator script instead. From 59dce5081219744cd85a462f5dd29a2f1599b6c0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 16 May 2026 15:01:38 +0000 Subject: [PATCH 2/4] Revert "chore: plan bootstrap single-flight mitigation" This reverts commit c03442ecf09de085fe8a9393248f05d0605b57be. --- package-lock.json | 45 +- .../{chunk-DMPXZ6JJ.js => chunk-5QK3FXKX.js} | 39 +- packages/core/dist/chunk-5QK3FXKX.js.map | 1 + ...{chunk-GLRZAPX6.cjs => chunk-74BFRAQS.cjs} | 8 +- ...LRZAPX6.cjs.map => chunk-74BFRAQS.cjs.map} | 2 +- ...{chunk-ICMNCCX2.cjs => chunk-7KR6GOY3.cjs} | 4 +- ...CMNCCX2.cjs.map => chunk-7KR6GOY3.cjs.map} | 2 +- packages/core/dist/chunk-ABB34XUS.cjs.map | 1 - ...{chunk-LPYFMGAK.cjs => chunk-BX75LZES.cjs} | 500 ++++++------------ packages/core/dist/chunk-BX75LZES.cjs.map | 1 + .../{chunk-NJVY2U43.js => chunk-CJOLOONT.js} | 4 +- ...-NJVY2U43.js.map => chunk-CJOLOONT.js.map} | 2 +- .../{chunk-46DCL763.js => chunk-CSQWOYGZ.js} | 4 +- ...-46DCL763.js.map => chunk-CSQWOYGZ.js.map} | 2 +- packages/core/dist/chunk-DMPXZ6JJ.js.map | 1 - .../{chunk-QFWHAFEO.js => chunk-GQEIPW3L.js} | 4 +- packages/core/dist/chunk-GQEIPW3L.js.map | 1 + packages/core/dist/chunk-LPYFMGAK.cjs.map | 1 - .../{chunk-OO7BOO6H.js => chunk-M2PKQJ6J.js} | 212 +------- packages/core/dist/chunk-M2PKQJ6J.js.map | 1 + .../{chunk-FE77VWGD.js => chunk-NDS4S4AG.js} | 8 +- ...-FE77VWGD.js.map => chunk-NDS4S4AG.js.map} | 2 +- .../{chunk-TFNTM3OA.js => chunk-NGTBJJXZ.js} | 184 +++---- packages/core/dist/chunk-NGTBJJXZ.js.map | 1 + packages/core/dist/chunk-OO7BOO6H.js.map | 1 - ...{chunk-656GGECX.cjs => chunk-QOZZJZ76.cjs} | 4 +- ...56GGECX.cjs.map => chunk-QOZZJZ76.cjs.map} | 2 +- packages/core/dist/chunk-TAOOLOUH.cjs.map | 1 - packages/core/dist/chunk-TFNTM3OA.js.map | 1 - ...{chunk-TAOOLOUH.cjs => chunk-V4V54BY3.cjs} | 45 +- packages/core/dist/chunk-V4V54BY3.cjs.map | 1 + packages/core/dist/chunk-WAEQXGCX.cjs.map | 1 - ...{chunk-WAEQXGCX.cjs => chunk-XWQVFWPW.cjs} | 4 +- ...QFWHAFEO.js.map => chunk-XWQVFWPW.cjs.map} | 2 +- ...{chunk-ABB34XUS.cjs => chunk-ZUXOAZWZ.cjs} | 184 +++---- packages/core/dist/chunk-ZUXOAZWZ.cjs.map | 1 + packages/core/dist/index.cjs | 388 +++++++------- packages/core/dist/index.cjs.map | 2 +- packages/core/dist/index.js | 26 +- packages/core/dist/index.js.map | 2 +- packages/core/dist/middleware.cjs | 64 +-- packages/core/dist/middleware.d.cts | 19 - packages/core/dist/middleware.d.ts | 19 - packages/core/dist/middleware.js | 6 +- packages/core/dist/migrations-2MVNZKQI.cjs | 13 - packages/core/dist/migrations-3CPSXQ26.cjs | 13 + ...QI.cjs.map => migrations-3CPSXQ26.cjs.map} | 2 +- packages/core/dist/migrations-SMFIJBW2.js | 4 + ...NBXW.js.map => migrations-SMFIJBW2.js.map} | 2 +- packages/core/dist/migrations-W7P2NBXW.js | 4 - packages/core/dist/plugins.cjs | 18 +- packages/core/dist/plugins.js | 2 +- packages/core/dist/routes.cjs | 58 +- packages/core/dist/routes.js | 12 +- packages/core/dist/services.cjs | 78 +-- packages/core/dist/services.js | 6 +- packages/core/dist/utils.cjs | 22 +- packages/core/dist/utils.js | 2 +- packages/core/src/db/migrations-bundle.ts | 2 +- .../core/src/plugins/manifest-registry.ts | 2 +- 60 files changed, 798 insertions(+), 1245 deletions(-) rename packages/core/dist/{chunk-DMPXZ6JJ.js => chunk-5QK3FXKX.js} (94%) create mode 100644 packages/core/dist/chunk-5QK3FXKX.js.map rename packages/core/dist/{chunk-GLRZAPX6.cjs => chunk-74BFRAQS.cjs} (99%) rename packages/core/dist/{chunk-GLRZAPX6.cjs.map => chunk-74BFRAQS.cjs.map} (99%) rename packages/core/dist/{chunk-ICMNCCX2.cjs => chunk-7KR6GOY3.cjs} (99%) rename packages/core/dist/{chunk-ICMNCCX2.cjs.map => chunk-7KR6GOY3.cjs.map} (99%) delete mode 100644 packages/core/dist/chunk-ABB34XUS.cjs.map rename packages/core/dist/{chunk-LPYFMGAK.cjs => chunk-BX75LZES.cjs} (98%) create mode 100644 packages/core/dist/chunk-BX75LZES.cjs.map rename packages/core/dist/{chunk-NJVY2U43.js => chunk-CJOLOONT.js} (99%) rename packages/core/dist/{chunk-NJVY2U43.js.map => chunk-CJOLOONT.js.map} (99%) rename packages/core/dist/{chunk-46DCL763.js => chunk-CSQWOYGZ.js} (99%) rename packages/core/dist/{chunk-46DCL763.js.map => chunk-CSQWOYGZ.js.map} (99%) delete mode 100644 packages/core/dist/chunk-DMPXZ6JJ.js.map rename packages/core/dist/{chunk-QFWHAFEO.js => chunk-GQEIPW3L.js} (99%) create mode 100644 packages/core/dist/chunk-GQEIPW3L.js.map delete mode 100644 packages/core/dist/chunk-LPYFMGAK.cjs.map rename packages/core/dist/{chunk-OO7BOO6H.js => chunk-M2PKQJ6J.js} (99%) create mode 100644 packages/core/dist/chunk-M2PKQJ6J.js.map rename packages/core/dist/{chunk-FE77VWGD.js => chunk-NDS4S4AG.js} (99%) rename packages/core/dist/{chunk-FE77VWGD.js.map => chunk-NDS4S4AG.js.map} (99%) rename packages/core/dist/{chunk-TFNTM3OA.js => chunk-NGTBJJXZ.js} (94%) create mode 100644 packages/core/dist/chunk-NGTBJJXZ.js.map delete mode 100644 packages/core/dist/chunk-OO7BOO6H.js.map rename packages/core/dist/{chunk-656GGECX.cjs => chunk-QOZZJZ76.cjs} (99%) rename packages/core/dist/{chunk-656GGECX.cjs.map => chunk-QOZZJZ76.cjs.map} (99%) delete mode 100644 packages/core/dist/chunk-TAOOLOUH.cjs.map delete mode 100644 packages/core/dist/chunk-TFNTM3OA.js.map rename packages/core/dist/{chunk-TAOOLOUH.cjs => chunk-V4V54BY3.cjs} (93%) create mode 100644 packages/core/dist/chunk-V4V54BY3.cjs.map delete mode 100644 packages/core/dist/chunk-WAEQXGCX.cjs.map rename packages/core/dist/{chunk-WAEQXGCX.cjs => chunk-XWQVFWPW.cjs} (99%) rename packages/core/dist/{chunk-QFWHAFEO.js.map => chunk-XWQVFWPW.cjs.map} (53%) rename packages/core/dist/{chunk-ABB34XUS.cjs => chunk-ZUXOAZWZ.cjs} (94%) create mode 100644 packages/core/dist/chunk-ZUXOAZWZ.cjs.map delete mode 100644 packages/core/dist/migrations-2MVNZKQI.cjs create mode 100644 packages/core/dist/migrations-3CPSXQ26.cjs rename packages/core/dist/{migrations-2MVNZKQI.cjs.map => migrations-3CPSXQ26.cjs.map} (76%) create mode 100644 packages/core/dist/migrations-SMFIJBW2.js rename packages/core/dist/{migrations-W7P2NBXW.js.map => migrations-SMFIJBW2.js.map} (77%) delete mode 100644 packages/core/dist/migrations-W7P2NBXW.js diff --git a/package-lock.json b/package-lock.json index 92c3a6a72..5e28dde35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,6 +70,7 @@ "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -172,7 +173,6 @@ "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.8.0.tgz", "integrity": "sha512-Hb4BkGNnvgCj3F9XzqjiFTpA5IGkjOXwGAOV13qtc27l2qNF8X9rzSp1H5hu8XewlC0DzYtQtZZIOYzRZDyuXg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -220,7 +220,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.42.0.tgz", "integrity": "sha512-JLyyG7bb7XOda+w/sp8ch7rEVy6LnWs3qtxr6VJJ2XIINqGsY6U+0L3aJ6QFliBRNUeEAr2QBDxSm8u9Sal5uA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -236,7 +235,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.42.0.tgz", "integrity": "sha512-SkCrvtZpdSWjNq9NGu/TtOg4TbzRuUToXlQqV6lLePa2s/WQlEyFw7QYjrz4itprWG9ASuH+StDlq7n49F2sBA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -252,7 +250,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.42.0.tgz", "integrity": "sha512-6iiFbm2tRn6B2OqFv9XDTcw5LdWPudiJWIbRk+fsTX+hkPrPm4e1/SbU+lEYBciPoaTShLkDbRge4UePEyCPMQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 14.0.0" } @@ -262,7 +259,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.42.0.tgz", "integrity": "sha512-iEokmw2k6FBa8g/TT7ClyEriaP/FUEmz3iczRoCklEHWSgoABMkaeYrxRXrA2yx76AN+gyZoC8FX0iCJ55dsOg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -278,7 +274,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.42.0.tgz", "integrity": "sha512-ivVniRqX2ARd+jGvRHTxpWeOtO9VT+rK+OmiuRgkSunoTyxk0vjeDO7QkU7+lzBOXiYgakNjkZrBtIpW9c+muw==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -294,7 +289,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.42.0.tgz", "integrity": "sha512-9+BIw6rerUfA+eLMIS2lF4mgoeBGTCIHiqb35PLn3699Rm3CaJXz03hChdwAWcA6SwGw0haYXYJa7LF0xI6EpA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -326,7 +320,6 @@ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.42.0.tgz", "integrity": "sha512-MBkjRymf4BT6VOvMpJlg6kq8K+PkH9q+N+K4YMNdzTXlL40YwOa1wIWQ5LxP/Jhlz64kW5g9/oaMWY06Sy9dcw==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -342,7 +335,6 @@ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.42.0.tgz", "integrity": "sha512-kmLs7YfjT4cpr4FnhhRmnoSX4psh9KYZ9NAiWt/YcUV33m0B/Os5L4QId30zVXkOqAPAEpV5VbDPWep+/aoJdQ==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -358,7 +350,6 @@ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.42.0.tgz", "integrity": "sha512-U5yZ8+Jj+A4ZC0IMfElpPcddQ9NCoawD1dKyWmjHP49nzN2Z4284IFVMAJWR6fq/0ddGf4OMjjYO9cnF8L+5tw==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -374,7 +365,6 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.42.0.tgz", "integrity": "sha512-EbuxgteaYBlKgc2Fs3JzoPIKAIaevAIwmv1F+fakaEXeibG4pkmVNsyTUjpOZIgJ1kXeqNvDrcjRb6g3vYBJ9A==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0" }, @@ -387,7 +377,6 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.42.0.tgz", "integrity": "sha512-4vnFvY5Q8QZL9eDNkywFLsk/eQCRBXCBpE8HWs8iUsFNHYoamiOxAeYMin0W/nszQj6abc+jNxMChHmejO+ftQ==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0" }, @@ -400,7 +389,6 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.42.0.tgz", "integrity": "sha512-gkLNpU+b1pCIwk1hKTJz2NWQPT8gsfGhQasnZ5QVv4jd79fKRL/1ikd86P0AzuIQs9tbbhlMwxsSTyJmlq502w==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.42.0" }, @@ -1780,6 +1768,7 @@ "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", @@ -3980,6 +3969,7 @@ "resolved": "https://registry.npmjs.org/@libsql/client/-/client-0.15.15.tgz", "integrity": "sha512-twC0hQxPNHPKfeOv3sNT6u2pturQjLcI+CnpTM0SjRpocEGgfiZ7DWKXLNnsothjyJmDqEsBQJ5ztq9Wlu470w==", "license": "MIT", + "peer": true, "dependencies": { "@libsql/core": "^0.15.14", "@libsql/hrana-client": "^0.7.0", @@ -4150,6 +4140,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-3.1.1.tgz", "integrity": "sha512-0TTacJyZ9mDmY+VefuthVshaNIyCGZHJG2fMnGaDttCt8HmjUF7SizlHJpaCDoGnN635nK1wpzfpx/Xx5S4WnQ==", "license": "MIT", + "peer": true, "dependencies": { "@mdx-js/mdx": "^3.0.0", "source-map": "^0.7.0" @@ -4209,6 +4200,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -4439,6 +4431,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -5139,6 +5132,7 @@ "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "playwright": "1.56.1" }, @@ -6918,6 +6912,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -7008,6 +7003,7 @@ "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", @@ -7706,6 +7702,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -8234,6 +8231,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -9729,6 +9727,7 @@ "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.2.tgz", "integrity": "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==", "license": "Apache-2.0", + "peer": true, "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", @@ -10247,6 +10246,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -10325,6 +10325,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -10510,6 +10511,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -12070,6 +12072,7 @@ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.18.tgz", "integrity": "sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -15282,6 +15285,7 @@ "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", "license": "MIT", + "peer": true, "dependencies": { "@next/env": "16.2.6", "@swc/helpers": "0.5.15", @@ -16152,6 +16156,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -16167,6 +16172,7 @@ "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.3.0.tgz", "integrity": "sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw==", "license": "MIT", + "peer": true, "peerDependencies": { "prettier": ">=2.0", "typescript": ">=2.9", @@ -17981,7 +17987,8 @@ "version": "4.1.16", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", "integrity": "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/tapable": { "version": "2.3.0", @@ -18806,6 +18813,7 @@ "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -19387,6 +19395,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19472,6 +19481,7 @@ "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", "license": "MIT", + "peer": true, "dependencies": { "pathe": "^2.0.3" } @@ -19725,6 +19735,7 @@ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "license": "MIT", + "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } @@ -19801,6 +19812,7 @@ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -20314,6 +20326,7 @@ "integrity": "sha512-xQroKAadK503CrmbzCISvQUjeuvEZzv6U0wlnlVFOi5i3gnzfH4onyQ29f3lzpe0FresAiTAd3aqK0Bi/jLI8w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.7", "@vitest/mocker": "4.0.7", @@ -20997,6 +21010,7 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -21240,6 +21254,7 @@ "integrity": "sha512-ZuEq1OdrJBS+NV+L5HMYPCzVn49a2O60slQiiLpG44jqtlOo+S167fWC76kEXteXLLLydeuRrluRel7WdOUa4g==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "bin": { "workerd": "bin/workerd" }, @@ -21259,6 +21274,7 @@ "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.78.0.tgz", "integrity": "sha512-He/vUhk4ih0D0eFmtNnlbT6Od8j+BEokaSR+oYjbVsH0SWIrIch+eHqfLRSBjBQaOoh6HCNxcafcIkBm2u0Hag==", "license": "MIT OR Apache-2.0", + "peer": true, "dependencies": { "@cloudflare/kv-asset-handler": "0.4.2", "@cloudflare/unenv-preset": "2.16.0", @@ -22065,6 +22081,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/packages/core/dist/chunk-DMPXZ6JJ.js b/packages/core/dist/chunk-5QK3FXKX.js similarity index 94% rename from packages/core/dist/chunk-DMPXZ6JJ.js rename to packages/core/dist/chunk-5QK3FXKX.js index 612f76dc1..259441d8d 100644 --- a/packages/core/dist/chunk-DMPXZ6JJ.js +++ b/packages/core/dist/chunk-5QK3FXKX.js @@ -1,8 +1,8 @@ -import { syncCollections, syncAllFormCollections, PluginBootstrapService } from './chunk-NJVY2U43.js'; -import { MigrationService } from './chunk-46DCL763.js'; +import { syncCollections, syncAllFormCollections, PluginBootstrapService } from './chunk-CJOLOONT.js'; +import { MigrationService } from './chunk-CSQWOYGZ.js'; import { metricsTracker } from './chunk-FICTAGD4.js'; import { sign, verify } from 'hono/jwt'; -import { getCookie, setCookie } from 'hono/cookie'; +import { setCookie, getCookie } from 'hono/cookie'; // src/middleware/bootstrap.ts var bootstrapComplete = false; @@ -198,7 +198,7 @@ async function verifyHs256Signature(token, secret) { return false; } } -var AuthManager = class _AuthManager { +var AuthManager = class { static async generateToken(userId, email, role, secret, expiresInSeconds) { const ttl = expiresInSeconds && expiresInSeconds > 0 ? Math.floor(expiresInSeconds) : DEFAULT_JWT_EXPIRES_IN_SECONDS; const now = Math.floor(Date.now() / 1e3); @@ -214,13 +214,6 @@ var AuthManager = class _AuthManager { /** * Verify a token's signature and expiration. * - * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the - * `secret` argument. If omitted, this falls back to a development-only - * placeholder secret — tokens signed with the real `JWT_SECRET` will then - * silently fail verification. From inside a Hono handler prefer - * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction - * and pulls the secret from `c.env` for you. - * * If `graceSeconds` > 0, tokens whose `exp` is within the grace window * (i.e. expired by no more than `graceSeconds`) are still returned. This * supports a sliding-session refresh endpoint that accepts recently-expired @@ -256,26 +249,6 @@ var AuthManager = class _AuthManager { return null; } } - /** - * Verify the JWT on an incoming Hono request using the `JWT_SECRET` - * binding from `c.env`. Reads the token from the `Authorization: Bearer …` - * header first, then falls back to the `auth_token` cookie. Returns the - * decoded payload, or null when the token is missing, malformed, expired, - * or signed with a different secret. - * - * Use this from custom Hono routes mounted alongside SonicJS — it - * resolves the secret the same way `requireAuth()` does, without forcing - * the caller to plumb it through manually. - */ - static async verifyAuthRequest(c) { - let token = c.req.header("Authorization")?.replace("Bearer ", ""); - if (!token) { - token = getCookie(c, "auth_token"); - } - if (!token) return null; - const secret = c.env?.JWT_SECRET; - return await _AuthManager.verifyToken(token, secret); - } static async hashPassword(password) { const iterations = 1e5; const salt = new Uint8Array(16); @@ -715,5 +688,5 @@ var getActivePlugins = () => []; var isPluginActive = () => false; export { AuthManager, PermissionManager, bootstrapMiddleware, cacheHeaders, compressionMiddleware, csrfProtection, detailedLoggingMiddleware, generateCsrfToken, getActivePlugins, getJwtExpirySeconds, getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb, isPluginActive, logActivity, loggingMiddleware, metricsMiddleware, optionalAuth, performanceLoggingMiddleware, rateLimit, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware, securityLoggingMiddleware, validateCsrfToken, verifySecurityConfig }; -//# sourceMappingURL=chunk-DMPXZ6JJ.js.map -//# sourceMappingURL=chunk-DMPXZ6JJ.js.map \ No newline at end of file +//# sourceMappingURL=chunk-5QK3FXKX.js.map +//# sourceMappingURL=chunk-5QK3FXKX.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-5QK3FXKX.js.map b/packages/core/dist/chunk-5QK3FXKX.js.map new file mode 100644 index 000000000..a83ba3fef --- /dev/null +++ b/packages/core/dist/chunk-5QK3FXKX.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/middleware/bootstrap.ts","../src/middleware/auth.ts","../src/middleware/metrics.ts","../src/middleware/csrf.ts","../src/middleware/rate-limit.ts","../src/middleware/security-headers.ts","../src/middleware/index.ts"],"names":["result","JWT_SECRET_FALLBACK","getCookie","setCookie"],"mappings":"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","file":"chunk-5QK3FXKX.js","sourcesContent":["import { Context, Next } from \"hono\";\nimport { syncCollections } from \"../services/collection-sync\";\nimport { syncAllFormCollections } from \"../services/form-collection-sync\";\nimport { MigrationService } from \"../services/migrations\";\nimport { PluginBootstrapService } from \"../services/plugin-bootstrap\";\nimport type { SonicJSConfig } from \"../app\";\n\ntype Bindings = {\n DB: D1Database;\n KV: KVNamespace;\n JWT_SECRET?: string;\n CORS_ORIGINS?: string;\n ENVIRONMENT?: string;\n};\n\n// Track if bootstrap has been run in this worker instance\nlet bootstrapComplete = false;\n\n/**\n * Verify security-critical environment configuration at startup.\n * Logs warnings in development, throws in production to prevent\n * insecure deployments from silently running.\n */\nexport function verifySecurityConfig(env: Bindings): void {\n const warnings: string[] = [];\n\n // Check JWT secret\n if (!env.JWT_SECRET) {\n warnings.push(\n \"JWT_SECRET is not set — using hardcoded fallback. Set via `wrangler secret put JWT_SECRET`\"\n );\n } else if (env.JWT_SECRET.includes(\"change-in-production\")) {\n warnings.push(\n \"JWT_SECRET contains the default value — tokens are forgeable. Generate a strong random secret\"\n );\n }\n\n // Check CORS origins\n if (!env.CORS_ORIGINS) {\n warnings.push(\n \"CORS_ORIGINS is not set — all cross-origin API requests will be rejected\"\n );\n }\n\n // Check environment designation\n if (!env.ENVIRONMENT) {\n warnings.push(\n \"ENVIRONMENT is not set — HSTS header will not be applied. Set to \\\"production\\\" or \\\"development\\\"\"\n );\n }\n\n if (warnings.length === 0) {\n return;\n }\n\n const isProduction = env.ENVIRONMENT === \"production\";\n\n for (const warning of warnings) {\n console.warn(`[SonicJS Security] ${warning}`);\n }\n\n if (isProduction) {\n // In production, a missing or default JWT_SECRET is a hard failure —\n // every token issued would be forgeable by anyone reading the source code.\n const hasCritical =\n !env.JWT_SECRET || env.JWT_SECRET.includes(\"change-in-production\");\n if (hasCritical) {\n throw new Error(\n \"[SonicJS Security] CRITICAL: Production deployment is missing a secure JWT_SECRET. \" +\n \"Set it via `wrangler secret put JWT_SECRET` before deploying.\"\n );\n }\n }\n}\n\n/**\n * Bootstrap middleware that ensures system initialization\n * Runs once per worker instance\n */\nexport function bootstrapMiddleware(config: SonicJSConfig = {}) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n // Skip if already bootstrapped in this worker instance\n if (bootstrapComplete) {\n return next();\n }\n\n // Skip bootstrap for static assets and health checks\n const path = c.req.path;\n if (\n path.startsWith(\"/images/\") ||\n path.startsWith(\"/assets/\") ||\n path === \"/health\" ||\n path.endsWith(\".js\") ||\n path.endsWith(\".css\") ||\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".ico\")\n ) {\n return next();\n }\n\n try {\n console.log(\"[Bootstrap] Starting system initialization...\");\n\n // 1. Run database migrations first\n console.log(\"[Bootstrap] Running database migrations...\");\n const migrationService = new MigrationService(c.env.DB);\n await migrationService.runPendingMigrations();\n\n // 2. Sync collection configurations\n console.log(\"[Bootstrap] Syncing collection configurations...\");\n try {\n await syncCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing collections:\", error);\n // Continue bootstrap even if collection sync fails\n }\n\n // 2b. Sync form-derived shadow collections\n console.log(\"[Bootstrap] Syncing form collections...\");\n try {\n await syncAllFormCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing form collections:\", error);\n }\n\n // 3. Bootstrap core plugins (unless disableAll is set)\n if (!config.plugins?.disableAll) {\n console.log(\"[Bootstrap] Bootstrapping core plugins...\");\n const bootstrapService = new PluginBootstrapService(c.env.DB);\n\n // Check if bootstrap is needed\n const needsBootstrap = await bootstrapService.isBootstrapNeeded();\n if (needsBootstrap) {\n await bootstrapService.bootstrapCorePlugins();\n }\n } else {\n console.log(\"[Bootstrap] Plugin bootstrap skipped (disableAll is true)\");\n }\n\n // Mark bootstrap as complete for this worker instance\n bootstrapComplete = true;\n console.log(\"[Bootstrap] System initialization completed\");\n } catch (error) {\n console.error(\"[Bootstrap] Error during system initialization:\", error);\n // Don't prevent the app from starting, but log the error\n }\n\n // 4. Verify security configuration (outside try/catch so critical\n // errors in production propagate and prevent insecure deployments)\n verifySecurityConfig(c.env as Bindings);\n\n return next();\n };\n}\n\n/**\n * Reset bootstrap flag (useful for testing)\n */\nexport function resetBootstrap() {\n bootstrapComplete = false;\n}\n","import { sign, verify } from 'hono/jwt'\nimport { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\ntype JWTPayload = {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n}\n\n// Fallback JWT secret for local development only (no wrangler secret set)\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// Default JWT TTL: 30 days. Can be overridden via JWT_EXPIRES_IN env var.\nconst DEFAULT_JWT_EXPIRES_IN_SECONDS = 60 * 60 * 24 * 30\n\n/**\n * Parse a TTL string like \"30d\", \"12h\", \"3600s\", or a bare number-of-seconds\n * into a seconds value. Returns null if the input is missing/unparseable.\n */\nfunction parseDuration(input: string | number | undefined | null): number | null {\n if (input === undefined || input === null || input === '') return null\n if (typeof input === 'number' && Number.isFinite(input) && input > 0) {\n return Math.floor(input)\n }\n const raw = String(input).trim()\n if (/^\\d+$/.test(raw)) {\n const n = parseInt(raw, 10)\n return n > 0 ? n : null\n }\n const match = raw.match(/^(\\d+)\\s*(s|sec|secs|seconds|m|min|mins|minutes|h|hr|hrs|hours|d|day|days)$/i)\n if (!match) return null\n const value = parseInt(match[1]!, 10)\n const unit = match[2]!.toLowerCase()\n if (unit.startsWith('s')) return value\n if (unit.startsWith('m')) return value * 60\n if (unit.startsWith('h')) return value * 60 * 60\n if (unit.startsWith('d')) return value * 60 * 60 * 24\n return null\n}\n\n/**\n * Resolve the JWT expiry in seconds from the environment.\n * Honors `JWT_EXPIRES_IN` (seconds or \"30d\"/\"12h\"/\"3600s\") with a 30-day default.\n */\nexport function getJwtExpirySeconds(env?: Record | null): number {\n const configured = parseDuration(env?.JWT_EXPIRES_IN)\n return configured ?? DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the JWT expiry in seconds. Precedence: `JWT_EXPIRES_IN` env var\n * (authoritative ceiling) → `settings.security.jwtExpiresIn` DB value\n * (admin-configurable) → 30-day default.\n *\n * The env var wins so operators can cap runtime overrides — admins can adjust\n * the TTL from /admin/settings/security, but an env var, if set, always wins.\n * DB failures fall back to env/default so auth never breaks if the settings\n * table is unreachable.\n */\nexport async function getJwtExpirySecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const envParsed = parseDuration(env?.JWT_EXPIRES_IN)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtExpiresIn'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* value may already be a bare string */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtExpiresIn from settings, falling back to default:', err)\n }\n }\n return DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the refresh grace window (seconds) for `/auth/refresh`. Precedence:\n * `JWT_REFRESH_GRACE_SECONDS` env var → `settings.security.jwtRefreshGraceSeconds`\n * DB value → 7-day default.\n */\nexport async function getJwtRefreshGraceSecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const DEFAULT_GRACE = 60 * 60 * 24 * 7\n const envParsed = parseDuration(env?.JWT_REFRESH_GRACE_SECONDS)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtRefreshGraceSeconds'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* may be bare */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtRefreshGraceSeconds from settings:', err)\n }\n }\n return DEFAULT_GRACE\n}\n\n/**\n * Decode a JWT payload without verifying the signature. Returns null on any\n * parsing failure. Callers MUST independently verify the signature before\n * trusting this value — used from the grace-window refresh path where the\n * signature is verified explicitly via `verifyHs256Signature`.\n */\nfunction decodeJwtPayload(token: string): JWTPayload | null {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return null\n const b64 = parts[1]!.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const json = atob(padded)\n const obj = JSON.parse(json)\n if (!obj || typeof obj.exp !== 'number') return null\n return obj as JWTPayload\n } catch {\n return null\n }\n}\n\nfunction base64UrlToBytes(b64url: string): Uint8Array {\n const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const bin = atob(padded)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return bytes\n}\n\n/**\n * Verify a JWT's HS256 signature using Web Crypto, independent of hono/jwt.\n * Returns true iff the signature matches the header.payload portion.\n */\nasync function verifyHs256Signature(token: string, secret: string): Promise {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return false\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n )\n const signature = base64UrlToBytes(parts[2]!)\n const message = encoder.encode(`${parts[0]}.${parts[1]}`)\n return await crypto.subtle.verify('HMAC', key, signature, message)\n } catch {\n return false\n }\n}\n\nexport class AuthManager {\n static async generateToken(\n userId: string,\n email: string,\n role: string,\n secret?: string,\n expiresInSeconds?: number\n ): Promise {\n const ttl = expiresInSeconds && expiresInSeconds > 0\n ? Math.floor(expiresInSeconds)\n : DEFAULT_JWT_EXPIRES_IN_SECONDS\n const now = Math.floor(Date.now() / 1000)\n const payload: JWTPayload = {\n userId,\n email,\n role,\n exp: now + ttl,\n iat: now\n }\n\n return await sign(payload, secret || JWT_SECRET_FALLBACK, 'HS256')\n }\n\n /**\n * Verify a token's signature and expiration.\n *\n * If `graceSeconds` > 0, tokens whose `exp` is within the grace window\n * (i.e. expired by no more than `graceSeconds`) are still returned. This\n * supports a sliding-session refresh endpoint that accepts recently-expired\n * tokens. Signature failures always return null.\n */\n static async verifyToken(\n token: string,\n secret?: string,\n graceSeconds: number = 0\n ): Promise {\n const effectiveSecret = secret || JWT_SECRET_FALLBACK\n try {\n let payload: JWTPayload | null = null\n try {\n payload = await verify(token, effectiveSecret, 'HS256') as JWTPayload\n } catch (verifyError: any) {\n // hono/jwt checks `exp` before signature, so a bad-signature token\n // that happens to be expired will throw JwtTokenExpired here. For\n // the grace window, we still require a valid HS256 signature before\n // accepting the payload.\n const name = verifyError?.name || ''\n const message = String(verifyError?.message || '')\n const isExpired = name === 'JwtTokenExpired' || message.includes('expired')\n if (!isExpired || graceSeconds <= 0) {\n throw verifyError\n }\n const signatureValid = await verifyHs256Signature(token, effectiveSecret)\n if (!signatureValid) return null\n const decoded = decodeJwtPayload(token)\n if (!decoded) return null\n payload = decoded\n }\n\n if (!payload) return null\n\n const now = Math.floor(Date.now() / 1000)\n if (payload.exp < now - Math.max(0, Math.floor(graceSeconds))) {\n return null\n }\n\n return payload\n } catch (error) {\n console.error('Token verification failed:', error)\n return null\n }\n }\n\n static async hashPassword(password: string): Promise {\n const iterations = 100000\n const salt = new Uint8Array(16)\n crypto.getRandomValues(salt)\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const saltHex = Array.from(salt).map(b => b.toString(16).padStart(2, '0')).join('')\n const hashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n return `pbkdf2:${iterations}:${saltHex}:${hashHex}`\n }\n\n static async hashPasswordLegacy(password: string): Promise {\n const encoder = new TextEncoder()\n const data = encoder.encode(password + 'salt-change-in-production')\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n static async verifyPassword(password: string, storedHash: string): Promise {\n if (storedHash.startsWith('pbkdf2:')) {\n // PBKDF2 format: pbkdf2:::\n const parts = storedHash.split(':')\n if (parts.length !== 4) return false\n\n const iterationsStr = parts[1]!\n const saltHex = parts[2]!\n const expectedHashHex = parts[3]!\n const iterations = parseInt(iterationsStr, 10)\n\n const saltBytes = saltHex.match(/.{2}/g)\n if (!saltBytes) return false\n const salt = new Uint8Array(saltBytes.map(byte => parseInt(byte, 16)))\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const actualHashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n // Constant-time comparison\n if (actualHashHex.length !== expectedHashHex.length) return false\n let result = 0\n for (let i = 0; i < actualHashHex.length; i++) {\n result |= actualHashHex.charCodeAt(i) ^ expectedHashHex.charCodeAt(i)\n }\n return result === 0\n }\n\n // Legacy SHA-256 format (no colons in hash)\n const legacyHash = await this.hashPasswordLegacy(password)\n // Constant-time comparison for legacy too\n if (legacyHash.length !== storedHash.length) return false\n let result = 0\n for (let i = 0; i < legacyHash.length; i++) {\n result |= legacyHash.charCodeAt(i) ^ storedHash.charCodeAt(i)\n }\n return result === 0\n }\n\n static isLegacyHash(storedHash: string): boolean {\n return !storedHash.startsWith('pbkdf2:')\n }\n\n /**\n * Set authentication cookie - useful for plugins implementing alternative auth methods\n * @param c - Hono context\n * @param token - JWT token to set in cookie\n * @param options - Optional cookie configuration\n */\n static setAuthCookie(c: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void {\n setCookie(c, 'auth_token', token, {\n httpOnly: options?.httpOnly ?? true,\n secure: options?.secure ?? true,\n sameSite: options?.sameSite ?? 'Strict',\n maxAge: options?.maxAge ?? getJwtExpirySeconds((c as any)?.env)\n })\n }\n}\n\n// Middleware to require authentication\nexport const requireAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n // Try to get token from Authorization header\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n\n // If no header token, try cookie\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n\n if (!token) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n // Try to get cached token verification from KV\n const kv = c.env?.KV\n let payload: JWTPayload | null = null\n\n if (kv) {\n const cacheKey = `auth:${token.substring(0, 20)}` // Use token prefix as key\n const cached = await kv.get(cacheKey, 'json')\n if (cached) {\n payload = cached as JWTPayload\n }\n }\n\n // If not cached, verify token\n if (!payload) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n payload = await AuthManager.verifyToken(token, jwtSecret)\n\n // Cache the verified payload for 5 minutes\n if (payload && kv) {\n const cacheKey = `auth:${token.substring(0, 20)}`\n await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 })\n }\n }\n\n if (!payload) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Your session has expired, please login again')\n }\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Add user info to context\n c.set('user', payload)\n\n return await next()\n } catch (error) {\n console.error('Auth middleware error:', error)\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Authentication failed, please login again')\n }\n return c.json({ error: 'Authentication failed' }, 401)\n }\n }\n}\n\n// Middleware to require specific role\nexport const requireRole = (requiredRole: string | string[]) => {\n return async (c: Context, next: Next) => {\n const user = c.get('user') as JWTPayload\n \n if (!user) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n \n const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]\n \n if (!roles.includes(user.role)) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=You do not have permission to access this area')\n }\n return c.json({ error: 'Insufficient permissions' }, 403)\n }\n \n return await next()\n }\n}\n\n// Optional auth middleware (doesn't block if no token)\nexport const optionalAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n \n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n \n if (token) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n const payload = await AuthManager.verifyToken(token, jwtSecret)\n if (payload) {\n c.set('user', payload)\n }\n }\n \n return await next()\n } catch (error) {\n // Don't block on auth errors in optional auth\n console.error('Optional auth error:', error)\n return await next()\n }\n }\n}\n","import { MiddlewareHandler } from 'hono'\nimport { metricsTracker } from '../utils/metrics'\n\n/**\n * Middleware to track all HTTP requests for real-time analytics\n * Excludes the metrics endpoint itself to avoid inflating the count\n */\nexport const metricsMiddleware = (): MiddlewareHandler => {\n return async (c, next) => {\n const path = new URL(c.req.url).pathname\n\n // Don't track the metrics endpoint itself to avoid self-inflating counts\n if (path !== '/admin/dashboard/api/metrics') {\n metricsTracker.recordRequest()\n }\n\n // Continue with the request\n await next()\n }\n}\n","/**\n * CSRF Protection Middleware — Signed Double-Submit Cookie\n *\n * Stateless CSRF protection for Cloudflare Workers (no session store needed).\n * Token format: `.` where HMAC-SHA256 is keyed with JWT_SECRET.\n *\n * Flow:\n * GET — ensureCsrfCookie(): reuse existing valid cookie or set a new one\n * POST/PUT/DELETE/PATCH — validate X-CSRF-Token header === csrf_token cookie, HMAC valid\n *\n * Exempt:\n * - Safe methods (GET, HEAD, OPTIONS)\n * - Auth routes that create sessions (/auth/login*, /auth/register*, etc.)\n * - Public form submissions (/forms/*, /api/forms/*) — NOT /admin/forms/*\n * - Requests with no auth_token cookie (Bearer-only or API-key-only)\n */\n\nimport type { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\n// Fallback secret — mirrors auth.ts behavior for local dev without wrangler secret\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Convert ArrayBuffer to URL-safe base64 (no padding). */\nexport function arrayBufferToBase64Url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!)\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Import a string key for HMAC-SHA256. */\nasync function getHmacKey(secret: string): Promise {\n const encoder = new TextEncoder()\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify']\n )\n}\n\n// ============================================================================\n// Token Generation & Validation\n// ============================================================================\n\n/**\n * Generate a signed CSRF token: `.`\n * - nonce = 32 random bytes, base64url-encoded\n * - signature = HMAC-SHA256(nonce, secret), base64url-encoded\n */\nexport async function generateCsrfToken(secret: string): Promise {\n const nonceBytes = new Uint8Array(32)\n crypto.getRandomValues(nonceBytes)\n const nonce = arrayBufferToBase64Url(nonceBytes.buffer)\n\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(nonce))\n const signature = arrayBufferToBase64Url(signatureBuffer)\n\n return `${nonce}.${signature}`\n}\n\n/**\n * Validate a signed CSRF token.\n *\n * Checks that the token has the correct `.` format and that\n * the HMAC signature is valid for the given secret. Uses crypto.subtle.verify\n * which provides constant-time comparison.\n *\n * NOTE: No expiry check here — by design. The security property of signed\n * double-submit comes from the unpredictability of the nonce + the\n * secret-bound HMAC, not from time-bounding. The cookie's maxAge (86400s)\n * handles expiry at the browser level.\n */\nexport async function validateCsrfToken(token: string, secret: string): Promise {\n if (!token || typeof token !== 'string') return false\n\n const dotIndex = token.indexOf('.')\n if (dotIndex === -1) return false\n\n const nonce = token.substring(0, dotIndex)\n const signature = token.substring(dotIndex + 1)\n\n if (!nonce || !signature) return false\n\n try {\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n\n // Decode the signature from base64url\n const sigPadded = signature.replace(/-/g, '+').replace(/_/g, '/')\n const sigBinary = atob(sigPadded)\n const sigBytes = new Uint8Array(sigBinary.length)\n for (let i = 0; i < sigBinary.length; i++) {\n sigBytes[i] = sigBinary.charCodeAt(i)\n }\n\n // crypto.subtle.verify is constant-time\n return await crypto.subtle.verify('HMAC', key, sigBytes.buffer, encoder.encode(nonce))\n } catch {\n return false\n }\n}\n\n// ============================================================================\n// Default Exempt Paths\n// ============================================================================\n\nconst DEFAULT_EXEMPT_PATHS = [\n '/auth/login',\n '/auth/register',\n '/auth/seed-admin',\n '/auth/accept-invitation',\n '/auth/reset-password',\n '/auth/request-password-reset',\n '/auth/otp',\n '/auth/magic-link',\n '/auth/verify',\n '/api/stripe/webhook',\n '/api/events',\n]\n\n/**\n * Check whether a request path is exempt from CSRF validation.\n * - Exact match or startsWith for auth routes (e.g. /auth/login/form)\n * - /forms/* and /api/forms/* are exempt (public submissions)\n * - /api/search* is exempt (read-only POST for complex query params)\n * - /admin/forms/* is NOT exempt\n */\nfunction isExemptPath(path: string, extraExemptPaths: string[] = []): boolean {\n // Public form routes — NOT /admin/forms/*\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/') || path === '/forms' || path === '/api/forms') {\n return true\n }\n\n // Search API — read-only POST (includes /api/search/click, /api/search/facet-click)\n if (path.startsWith('/api/search')) {\n return true\n }\n\n const allExempt = [...DEFAULT_EXEMPT_PATHS, ...extraExemptPaths]\n for (const exempt of allExempt) {\n if (path === exempt || path.startsWith(exempt + '/')) {\n return true\n }\n }\n\n return false\n}\n\n// ============================================================================\n// Middleware\n// ============================================================================\n\nexport interface CsrfOptions {\n /** Additional paths to exempt from CSRF validation. */\n exemptPaths?: string[]\n}\n\n/**\n * CSRF protection middleware (Signed Double-Submit Cookie).\n *\n * - GET/HEAD/OPTIONS: ensure a valid csrf_token cookie exists\n * - POST/PUT/DELETE/PATCH: validate X-CSRF-Token header matches cookie, HMAC valid\n * - Exempt: auth routes, public /forms/*, Bearer-only, API-key-only\n */\nexport function csrfProtection(options: CsrfOptions = {}) {\n return async (c: Context, next: Next): Promise => {\n const method = c.req.method.toUpperCase()\n const path = new URL(c.req.url).pathname\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n\n // Warn if using fallback secret in production\n if (c.env?.ENVIRONMENT === 'production' && !c.env?.JWT_SECRET) {\n console.warn(\n '[CSRF] WARNING: JWT_SECRET is not set in production. ' +\n 'CSRF tokens are signed with the fallback key, which is insecure.'\n )\n }\n\n // Safe methods — just ensure cookie, then pass through\n if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS') {\n await ensureCsrfCookie(c, secret)\n await next()\n return\n }\n\n // Exempt paths — pass through without validation\n if (isExemptPath(path, options.exemptPaths)) {\n await next()\n return\n }\n\n // Bearer-only or API-key-only requests (no auth_token cookie) — exempt\n const authCookie = getCookie(c, 'auth_token')\n if (!authCookie) {\n await next()\n return\n }\n\n // Requests with an Authorization header use token-based auth — the cookie\n // is incidental and CSRF protection is unnecessary (the attacker cannot\n // forge the Authorization header from a cross-origin page).\n const authHeader = c.req.header('Authorization')\n if (authHeader) {\n await next()\n return\n }\n\n // State-changing request with cookie auth — validate CSRF\n const cookieToken = getCookie(c, 'csrf_token')\n let headerToken = c.req.header('X-CSRF-Token')\n\n // Fallback: check _csrf field in form-encoded body (regular HTML form submissions)\n if (!headerToken) {\n const contentType = c.req.header('Content-Type') || ''\n if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n try {\n const body = await c.req.parseBody()\n headerToken = body['_csrf'] as string | undefined\n } catch {\n // Body not parseable — leave headerToken undefined\n }\n }\n }\n\n if (!cookieToken || !headerToken) {\n return csrfError(c, 'CSRF token missing')\n }\n\n if (cookieToken !== headerToken) {\n return csrfError(c, 'CSRF token mismatch')\n }\n\n const isValid = await validateCsrfToken(cookieToken, secret)\n if (!isValid) {\n return csrfError(c, 'CSRF token invalid')\n }\n\n await next()\n }\n}\n\n/**\n * Ensure a valid CSRF cookie exists. Check-then-reuse: if the existing cookie\n * has a valid HMAC signature, reuse it (no new Set-Cookie header). Only\n * generate a fresh token when the cookie is missing or has an invalid signature.\n */\nasync function ensureCsrfCookie(c: Context, secret: string): Promise {\n const existing = getCookie(c, 'csrf_token')\n\n if (existing) {\n const isValid = await validateCsrfToken(existing, secret)\n if (isValid) {\n // Reuse existing valid token — no Set-Cookie needed\n c.set('csrfToken', existing)\n return\n }\n }\n\n // Generate fresh token\n const token = await generateCsrfToken(secret)\n c.set('csrfToken', token)\n\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n setCookie(c, 'csrf_token', token, {\n httpOnly: false, // JS must read this cookie\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: 86400, // 24 hours — browser-side expiry\n })\n}\n\n/** Return a 403 CSRF error — HTML for browser requests, JSON for API. */\nfunction csrfError(c: Context, message: string): Response {\n const accept = c.req.header('Accept') || ''\n if (accept.includes('text/html')) {\n return c.html(\n `403 Forbidden` +\n `

403 Forbidden

${message}

`,\n 403\n )\n }\n return c.json({ error: message, status: 403 }, 403)\n}\n","import { Context, Next } from 'hono'\n\ninterface RateLimitOptions {\n max: number\n windowMs: number\n keyPrefix: string\n}\n\ninterface RateLimitEntry {\n count: number\n resetAt: number\n}\n\n/**\n * KV-based sliding window rate limiter middleware.\n * Gracefully skips if CACHE_KV binding is not available.\n */\nexport function rateLimit(options: RateLimitOptions) {\n const { max, windowMs, keyPrefix } = options\n\n return async (c: Context, next: Next) => {\n const kv = (c.env as any)?.CACHE_KV\n if (!kv) {\n // No KV binding available — skip rate limiting\n return await next()\n }\n\n const ip = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const key = `ratelimit:${keyPrefix}:${ip}`\n\n try {\n const now = Date.now()\n const stored = await kv.get(key, 'json') as RateLimitEntry | null\n\n let entry: RateLimitEntry\n if (stored && stored.resetAt > now) {\n entry = stored\n } else {\n entry = { count: 0, resetAt: now + windowMs }\n }\n\n entry.count++\n\n // Calculate TTL in seconds (KV expiration)\n const ttlSeconds = Math.ceil((entry.resetAt - now) / 1000)\n\n if (entry.count > max) {\n // Store the updated count even when rejecting\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n const retryAfter = Math.ceil((entry.resetAt - now) / 1000)\n c.header('Retry-After', String(retryAfter))\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', '0')\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n return c.json({ error: 'Too many requests. Please try again later.' }, 429)\n }\n\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', String(max - entry.count))\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n\n return await next()\n } catch (error) {\n // Rate limiting should never break the app\n console.error('Rate limiter error (non-fatal):', error)\n return await next()\n }\n }\n}\n","import { Context, Next } from 'hono'\n\n/**\n * Security headers middleware.\n * Sets standard security headers on every response.\n * Skips HSTS in development to avoid local dev issues.\n */\nexport const securityHeadersMiddleware = () => {\n return async (c: Context, next: Next) => {\n await next()\n\n c.header('X-Content-Type-Options', 'nosniff')\n c.header('X-Frame-Options', 'SAMEORIGIN')\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin')\n c.header('Permissions-Policy', 'camera=(), microphone=(), geolocation=()')\n\n // Only set HSTS in non-development environments\n const environment = (c.env as any)?.ENVIRONMENT\n if (environment !== 'development') {\n c.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains')\n }\n }\n}\n","/**\n * Middleware Module Exports\n *\n * Request processing middleware for SonicJS\n *\n * Note: Most middleware is currently in the monolith and will be migrated later.\n * For now, we only export the bootstrap middleware which is used for system initialization.\n */\n\n// Bootstrap middleware\nexport { bootstrapMiddleware, verifySecurityConfig } from './bootstrap'\n\n// Auth middleware\nexport {\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n getJwtExpirySeconds,\n getJwtExpirySecondsFromDb,\n getJwtRefreshGraceSecondsFromDb,\n} from './auth'\n\n// Metrics middleware\nexport { metricsMiddleware } from './metrics'\n\n// CSRF protection middleware\nexport { csrfProtection, generateCsrfToken, validateCsrfToken } from './csrf'\n\n// Rate limiting middleware\nexport { rateLimit } from './rate-limit'\n\n// Re-export types and functions that are referenced but implemented in monolith\n// These are placeholder exports to maintain API compatibility\nexport type Permission = string\nexport type UserPermissions = {\n userId: string\n permissions: Permission[]\n}\n\n// Middleware stubs - these return pass-through middleware that call next()\nexport const loggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const detailedLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const securityLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const performanceLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const cacheHeaders: any = () => async (_c: any, next: any) => await next()\nexport const compressionMiddleware: any = async (_c: any, next: any) => await next()\nexport { securityHeadersMiddleware as securityHeaders } from './security-headers'\n\n// Other stubs\nexport const PermissionManager: any = {}\nexport const requirePermission: any = () => async (_c: any, next: any) => await next()\nexport const requireAnyPermission: any = () => async (_c: any, next: any) => await next()\nexport const logActivity: any = () => {}\nexport const requireActivePlugin: any = () => async (_c: any, next: any) => await next()\nexport const requireActivePlugins: any = () => async (_c: any, next: any) => await next()\nexport const getActivePlugins: any = () => []\nexport const isPluginActive: any = () => false\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-GLRZAPX6.cjs b/packages/core/dist/chunk-74BFRAQS.cjs similarity index 99% rename from packages/core/dist/chunk-GLRZAPX6.cjs rename to packages/core/dist/chunk-74BFRAQS.cjs index 2cb167f66..c538b8249 100644 --- a/packages/core/dist/chunk-GLRZAPX6.cjs +++ b/packages/core/dist/chunk-74BFRAQS.cjs @@ -468,7 +468,7 @@ function buildQuery(table, filter) { // package.json var package_default = { name: "@sonicjs-cms/core", - version: "2.18.1", + version: "2.18.0", description: "Core framework for SonicJS headless CMS - Edge-first, TypeScript-native CMS built for Cloudflare Workers", type: "module", main: "./dist/index.cjs", @@ -590,7 +590,7 @@ var package_default = { "drizzle-orm": "^0.45.2", eslint: "^9.39.2", glob: "^10.5.0", - hono: "^4.12.18", + hono: "^4.12.12", tsup: "^8.5.0", typescript: "^5.9.3", vitest: "^4.0.5", @@ -667,5 +667,5 @@ exports.package_default = package_default; exports.parseBlocksValue = parseBlocksValue; exports.renderTemplate = renderTemplate; exports.templateRenderer = templateRenderer; -//# sourceMappingURL=chunk-GLRZAPX6.cjs.map -//# sourceMappingURL=chunk-GLRZAPX6.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-74BFRAQS.cjs.map +//# sourceMappingURL=chunk-74BFRAQS.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-GLRZAPX6.cjs.map b/packages/core/dist/chunk-74BFRAQS.cjs.map similarity index 99% rename from packages/core/dist/chunk-GLRZAPX6.cjs.map rename to packages/core/dist/chunk-74BFRAQS.cjs.map index c47feaa0a..647404673 100644 --- a/packages/core/dist/chunk-GLRZAPX6.cjs.map +++ b/packages/core/dist/chunk-74BFRAQS.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/utils/slug-utils.ts","../src/utils/template-renderer.ts","../src/utils/query-filter.ts","../package.json","../src/utils/version.ts","../src/utils/blocks.ts"],"names":[],"mappings":"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","file":"chunk-GLRZAPX6.cjs","sourcesContent":["/**\n * Slug generation utilities for creating URL-friendly slugs\n */\n\n/**\n * Generate URL-friendly slug from text\n * \n * Features:\n * - Converts to lowercase\n * - Handles accented characters (NFD normalization)\n * - Removes diacritics\n * - Keeps only alphanumeric, spaces, underscores, and hyphens\n * - Replaces spaces with hyphens\n * - Collapses multiple hyphens/underscores\n * - Trims leading/trailing hyphens/underscores\n * - Limits length to 100 characters\n * \n * @param text - Text to slugify\n * @returns URL-safe slug\n * \n * @example\n * generateSlug('Hello World!') // 'hello-world'\n * generateSlug('Café París 2024') // 'cafe-paris-2024'\n * generateSlug('Multiple Spaces') // 'multiple-spaces'\n */\nexport function generateSlug(text: string): string {\n if (!text) return '';\n \n return text\n .toLowerCase()\n .normalize('NFD') // Decompose combined characters (e.g., é -> e + ́)\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9\\s_-]/g, '') // Keep only alphanumeric, spaces, underscores, hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/[-_]+/g, '-') // Collapse multiple hyphens/underscores\n .replace(/^[-_]+|[-_]+$/g, '') // Trim leading/trailing hyphens/underscores\n .substring(0, 100); // Limit length for URL safety\n}\n","// Template renderer compatible with Cloudflare Workers\n// No filesystem access available\n\ninterface TemplateData {\n [key: string]: any\n}\n\nexport class TemplateRenderer {\n private templateCache = new Map()\n\n constructor() {\n // Cloudflare Workers compatible - no filesystem access\n }\n\n /**\n * Simple Handlebars-like template engine\n */\n private renderTemplate(template: string, data: TemplateData): string {\n let rendered = template\n\n // Handle each loops - process outermost loops first for proper nesting\n rendered = rendered.replace(/\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g, (_match, arrayName, content) => {\n const array = this.getNestedValue(data, arrayName.trim())\n if (!Array.isArray(array)) return ''\n \n return array.map((item, index) => {\n // Create context with array item and special variables\n const itemContext = {\n ...data,\n // Handle primitive items (for {{.}} syntax)\n '.': item,\n // Spread item properties if it's an object\n ...(typeof item === 'object' && item !== null ? item : {}),\n '@index': index,\n '@first': index === 0,\n '@last': index === array.length - 1\n }\n return this.renderTemplate(content, itemContext)\n }).join('')\n })\n\n // Second pass: Handle conditionals\n let ifCount = 0\n while (rendered.includes('{{#if ') && ifCount < 100) {\n const previousRendered = rendered\n rendered = rendered.replace(/\\{\\{#if\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (_match, condition, content) => {\n const value = this.getNestedValue(data, condition.trim())\n // Handle boolean values properly - @first/@last are explicitly boolean\n const isTruthy = value === true || (value && value !== 0 && value !== '' && value !== null && value !== undefined)\n return isTruthy ? this.renderTemplate(content, data) : ''\n })\n if (previousRendered === rendered) break\n ifCount++\n }\n\n // Third pass: Handle triple braces for raw HTML {{{variable}}}\n rendered = rendered.replace(/\\{\\{\\{([^}]+)\\}\\}\\}/g, (_match, variable) => {\n const value = this.getNestedValue(data, variable.trim())\n return value !== undefined && value !== null ? String(value) : ''\n })\n\n // Fourth pass: Handle helper functions like {{titleCase field}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\s+([^}]+)\\}\\}/g, (match, helper, variable) => {\n const helperName = helper.trim()\n const varName = variable.trim()\n \n if (helperName === 'titleCase') {\n const value = this.getNestedValue(data, varName)\n if (value !== undefined && value !== null) {\n return this.titleCase(String(value))\n }\n }\n \n return match // Return original if helper not found\n })\n\n // Final pass: Handle simple variables {{variable}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\}\\}/g, (match, variable) => {\n const trimmed = variable.trim()\n \n // Skip if it's a helper function (has spaces)\n if (trimmed.includes(' ')) {\n return match\n }\n \n const value = this.getNestedValue(data, trimmed)\n if (value === null) return ''\n if (value === undefined) return ''\n return String(value)\n })\n\n return rendered\n }\n\n /**\n * Get nested value from object using dot notation\n */\n private getNestedValue(obj: any, path: string): any {\n if (!obj || path === '') return undefined\n \n return path.split('.').reduce((current, key) => {\n if (current === null || current === undefined) return undefined\n return current[key]\n }, obj)\n }\n\n /**\n * Title case helper function\n */\n private titleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, l => l.toUpperCase())\n }\n\n /**\n * Render a template string with data\n */\n render(template: string, data: TemplateData = {}): string {\n return this.renderTemplate(template, data)\n }\n\n /**\n * Clear template cache (useful for development)\n */\n clearCache(): void {\n this.templateCache.clear()\n }\n}\n\n// Export singleton instance\nexport const templateRenderer = new TemplateRenderer()\n\n// Utility function to render template strings directly\nexport function renderTemplate(template: string, data: TemplateData = {}): string {\n return templateRenderer.render(template, data)\n}","/**\n * Query Filter Builder for SonicJS AI\n * Supports comprehensive filtering with AND/OR logic\n * Compatible with D1 Database (SQLite)\n */\n\nexport type FilterOperator =\n | 'equals'\n | 'not_equals'\n | 'greater_than'\n | 'greater_than_equal'\n | 'less_than'\n | 'less_than_equal'\n | 'like'\n | 'contains'\n | 'starts_with'\n | 'ends_with'\n | 'in'\n | 'not_in'\n | 'all'\n | 'exists'\n | 'near'\n | 'within'\n | 'intersects'\n\nconst VALID_FILTER_OPERATORS: ReadonlySet = new Set([\n 'equals',\n 'not_equals',\n 'greater_than',\n 'greater_than_equal',\n 'less_than',\n 'less_than_equal',\n 'like',\n 'contains',\n 'starts_with',\n 'ends_with',\n 'in',\n 'not_in',\n 'all',\n 'exists',\n 'near',\n 'within',\n 'intersects'\n])\n\nexport interface FilterCondition {\n field: string\n operator: FilterOperator\n value: any\n}\n\nexport interface FilterGroup {\n and?: FilterCondition[]\n or?: FilterCondition[]\n}\n\nexport interface QueryFilter {\n where?: FilterGroup\n limit?: number\n offset?: number\n sort?: {\n field: string\n order: 'asc' | 'desc'\n }[]\n}\n\nexport interface QueryResult {\n sql: string\n params: any[]\n errors: string[]\n}\n\n/**\n * Validate sort order value - only 'asc' or 'desc' are allowed.\n * Returns the validated lowercase value, defaulting to 'asc' for invalid input.\n */\nexport function validateSortOrder(order: any): 'asc' | 'desc' {\n if (typeof order === 'string') {\n const normalized = order.toLowerCase().trim()\n if (normalized === 'asc' || normalized === 'desc') {\n return normalized\n }\n }\n return 'asc'\n}\n\n/**\n * Query Filter Builder\n * Converts filter objects into SQL WHERE clauses with parameterized queries\n */\nexport class QueryFilterBuilder {\n private params: any[] = []\n private errors: string[] = []\n\n /**\n * Build a complete SQL query from filter object\n */\n build(baseTable: string, filter: QueryFilter): QueryResult {\n this.params = []\n this.errors = []\n\n let sql = `SELECT * FROM ${baseTable}`\n\n // Build WHERE clause\n if (filter.where) {\n const whereClause = this.buildWhereClause(filter.where)\n if (whereClause) {\n sql += ` WHERE ${whereClause}`\n }\n }\n\n // Build ORDER BY clause\n if (filter.sort && filter.sort.length > 0) {\n const orderClauses = filter.sort\n .map(s => `${this.sanitizeFieldName(s.field)} ${this.sanitizeSortOrder(s.order)}`)\n .join(', ')\n sql += ` ORDER BY ${orderClauses}`\n }\n\n // Build LIMIT clause\n if (filter.limit) {\n sql += ` LIMIT ?`\n this.params.push(filter.limit)\n }\n\n // Build OFFSET clause\n if (filter.offset) {\n sql += ` OFFSET ?`\n this.params.push(filter.offset)\n }\n\n return {\n sql,\n params: this.params,\n errors: this.errors\n }\n }\n\n /**\n * Build WHERE clause from filter group\n */\n private buildWhereClause(group: FilterGroup): string {\n const clauses: string[] = []\n\n // Handle AND conditions\n if (group.and && group.and.length > 0) {\n const andClauses = group.and\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (andClauses.length > 0) {\n clauses.push(`(${andClauses.join(' AND ')})`)\n }\n }\n\n // Handle OR conditions\n if (group.or && group.or.length > 0) {\n const orClauses = group.or\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (orClauses.length > 0) {\n clauses.push(`(${orClauses.join(' OR ')})`)\n }\n }\n\n return clauses.join(' AND ')\n }\n\n /**\n * Build a single condition\n */\n private buildCondition(condition: FilterCondition): string | null {\n const field = this.sanitizeFieldName(condition.field)\n\n switch (condition.operator) {\n case 'equals':\n return this.buildEquals(field, condition.value)\n\n case 'not_equals':\n return this.buildNotEquals(field, condition.value)\n\n case 'greater_than':\n return this.buildComparison(field, '>', condition.value)\n\n case 'greater_than_equal':\n return this.buildComparison(field, '>=', condition.value)\n\n case 'less_than':\n return this.buildComparison(field, '<', condition.value)\n\n case 'less_than_equal':\n return this.buildComparison(field, '<=', condition.value)\n\n case 'like':\n return this.buildLike(field, condition.value)\n\n case 'contains':\n return this.buildContains(field, condition.value)\n\n case 'starts_with':\n return this.buildStartsWith(field, condition.value)\n\n case 'ends_with':\n return this.buildEndsWith(field, condition.value)\n\n case 'in':\n return this.buildIn(field, condition.value)\n\n case 'not_in':\n return this.buildNotIn(field, condition.value)\n\n case 'all':\n return this.buildAll(field, condition.value)\n\n case 'exists':\n return this.buildExists(field, condition.value)\n\n case 'near':\n this.errors.push(`'near' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'within':\n this.errors.push(`'within' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'intersects':\n this.errors.push(`'intersects' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n default:\n this.errors.push(`Unknown operator: ${condition.operator}`)\n return null\n }\n }\n\n /**\n * Build equals condition\n */\n private buildEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NULL`\n }\n this.params.push(value)\n return `${field} = ?`\n }\n\n /**\n * Build not equals condition\n */\n private buildNotEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NOT NULL`\n }\n this.params.push(value)\n return `${field} != ?`\n }\n\n /**\n * Build comparison condition (>, >=, <, <=)\n */\n private buildComparison(field: string, operator: string, value: any): string {\n this.params.push(value)\n return `${field} ${operator} ?`\n }\n\n /**\n * Build LIKE condition (case-insensitive, all words must be present)\n */\n private buildLike(field: string, value: string): string {\n const words = value.split(/\\s+/).filter(w => w.length > 0)\n\n if (words.length === 0) {\n return `1=1` // No-op condition\n }\n\n const conditions = words.map(word => {\n this.params.push(`%${word}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build CONTAINS condition (case-insensitive substring)\n */\n private buildContains(field: string, value: string): string {\n this.params.push(`%${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build STARTS_WITH condition (case-insensitive prefix match)\n */\n private buildStartsWith(field: string, value: string): string {\n this.params.push(`${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build ENDS_WITH condition (case-insensitive suffix match)\n */\n private buildEndsWith(field: string, value: string): string {\n this.params.push(`%${value}`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build IN condition\n */\n private buildIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=0` // No values means no matches\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} IN (${placeholders})`\n }\n\n /**\n * Build NOT IN condition\n */\n private buildNotIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1` // No values means all match\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} NOT IN (${placeholders})`\n }\n\n /**\n * Build ALL condition (value must contain all items in list)\n * For SQLite, we'll check if a JSON array contains all values\n */\n private buildAll(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1`\n }\n\n // For SQLite, check if field contains all values using JSON functions\n // This assumes the field is a JSON array or comma-separated string\n const conditions = values.map(val => {\n this.params.push(`%${val}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build EXISTS condition\n */\n private buildExists(field: string, value: boolean): string {\n if (value) {\n return `${field} IS NOT NULL AND ${field} != ''`\n } else {\n return `(${field} IS NULL OR ${field} = '')`\n }\n }\n\n /**\n * Sanitize field names to prevent SQL injection\n */\n private sanitizeFieldName(field: string): string {\n // Allow alphanumeric, underscores, dots (for JSON fields)\n const sanitized = field.replace(/[^a-zA-Z0-9_$.]/g, '')\n\n // Handle JSON field access (e.g., data.title -> json_extract(data, '$.title'))\n if (sanitized.includes('.')) {\n const [table, ...path] = sanitized.split('.')\n return `json_extract(${table}, '$.${path.join('.')}')`\n }\n\n return sanitized\n }\n\n /**\n * Sanitize sort order to prevent SQL injection\n * Only allows 'ASC' or 'DESC', defaults to 'ASC' for any other value\n */\n private sanitizeSortOrder(order: string): string {\n const normalized = String(order).toUpperCase().trim()\n if (normalized === 'ASC' || normalized === 'DESC') {\n return normalized\n }\n return 'ASC'\n }\n\n /**\n * Parse filter from query string\n */\n static parseFromQuery(query: Record): QueryFilter {\n const filter: QueryFilter = {}\n\n // Parse where clause from 'where' parameter (JSON string)\n if (query.where) {\n try {\n filter.where = typeof query.where === 'string'\n ? JSON.parse(query.where)\n : query.where\n } catch (e) {\n console.error('Failed to parse where clause:', e)\n }\n }\n\n // Initialize where clause if not present\n if (!filter.where) {\n filter.where = { and: [] }\n }\n if (!filter.where.and) {\n filter.where.and = []\n }\n\n // Parse simple field filters (status, collection_id, etc.)\n // These are convenience parameters that get converted to WHERE conditions\n const simpleFieldMappings: Record = {\n 'status': 'status',\n 'collection_id': 'collection_id'\n }\n\n for (const [queryParam, dbField] of Object.entries(simpleFieldMappings)) {\n if (query[queryParam]) {\n filter.where.and.push({\n field: dbField,\n operator: 'equals',\n value: query[queryParam]\n })\n }\n }\n\n // Parse bracket-syntax filters: filter[field][operator]=value or filter[field]=value\n const bracketFilterRegex = /^filter\\[([^\\]]+)\\](?:\\[([^\\]]+)\\])?$/\n for (const [key, rawValue] of Object.entries(query)) {\n const match = key.match(bracketFilterRegex)\n if (!match) continue\n\n const field = match[1]\n const operator = (match[2] || 'equals') as FilterOperator\n\n if (!field || !VALID_FILTER_OPERATORS.has(operator)) continue\n if (rawValue === undefined || rawValue === null) continue\n\n let value: any = rawValue\n if (operator === 'exists') {\n value = value === 'true' || value === true || value === '1' || value === 1\n }\n\n filter.where.and.push({ field, operator, value })\n }\n\n // Parse limit\n if (query.limit) {\n filter.limit = Math.min(parseInt(query.limit), 1000) // Max 1000\n }\n\n // Parse offset\n if (query.offset) {\n filter.offset = parseInt(query.offset)\n }\n\n // Parse sort\n if (query.sort) {\n try {\n const parsed = typeof query.sort === 'string'\n ? JSON.parse(query.sort)\n : query.sort\n // Validate and sanitize sort entries\n if (Array.isArray(parsed)) {\n filter.sort = parsed\n .filter((s: any) => s && typeof s.field === 'string')\n .map((s: any) => ({\n field: s.field,\n order: validateSortOrder(s.order)\n }))\n }\n } catch (e) {\n console.error('Failed to parse sort clause:', e)\n }\n }\n\n return filter\n }\n}\n\n/**\n * Helper function to build query from filter\n */\nexport function buildQuery(table: string, filter: QueryFilter): QueryResult {\n const builder = new QueryFilterBuilder()\n return builder.build(table, filter)\n}\n","{\n \"name\": \"@sonicjs-cms/core\",\n \"version\": \"2.18.1\",\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 },\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 \"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/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.0.5\",\n \"drizzle-orm\": \"^0.45.2\",\n \"eslint\": \"^9.39.2\",\n \"glob\": \"^10.5.0\",\n \"hono\": \"^4.12.18\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.5\",\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","import type { BlockDefinitions } from '../types/collection-config'\n\nexport type BlocksFieldConfig = {\n blocks: BlockDefinitions\n discriminator: string\n}\n\nexport function getBlocksFieldConfig(fieldOptions: any): BlocksFieldConfig | null {\n if (!fieldOptions || typeof fieldOptions !== 'object') return null\n\n const itemsConfig = fieldOptions.items && typeof fieldOptions.items === 'object'\n ? fieldOptions.items\n : null\n\n if (!itemsConfig || !itemsConfig.blocks || typeof itemsConfig.blocks !== 'object') {\n return null\n }\n\n const discriminator = typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n\n return {\n blocks: itemsConfig.blocks as BlockDefinitions,\n discriminator\n }\n}\n\nexport function parseBlocksValue(value: unknown, config: BlocksFieldConfig) {\n const errors: string[] = []\n let rawValue = value\n\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return { value: [] as any[], errors }\n }\n\n if (typeof rawValue === 'string') {\n try {\n rawValue = JSON.parse(rawValue)\n } catch {\n return { value: [] as any[], errors: ['Blocks value must be valid JSON'] }\n }\n }\n\n if (!Array.isArray(rawValue)) {\n return { value: [] as any[], errors: ['Blocks value must be an array'] }\n }\n\n const normalized = rawValue.map((item, index) => {\n if (!item || typeof item !== 'object') {\n errors.push(`Block #${index + 1} must be an object`)\n return null\n }\n\n if ((item as any).blockType && (item as any).data && typeof (item as any).data === 'object') {\n return { [config.discriminator]: (item as any).blockType, ...(item as any).data }\n }\n\n if (!(config.discriminator in (item as any))) {\n errors.push(`Block #${index + 1} is missing \"${config.discriminator}\"`)\n }\n\n return item as any\n }).filter((item) => item !== null)\n\n return { value: normalized, errors }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/utils/slug-utils.ts","../src/utils/template-renderer.ts","../src/utils/query-filter.ts","../package.json","../src/utils/version.ts","../src/utils/blocks.ts"],"names":[],"mappings":"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","file":"chunk-74BFRAQS.cjs","sourcesContent":["/**\n * Slug generation utilities for creating URL-friendly slugs\n */\n\n/**\n * Generate URL-friendly slug from text\n * \n * Features:\n * - Converts to lowercase\n * - Handles accented characters (NFD normalization)\n * - Removes diacritics\n * - Keeps only alphanumeric, spaces, underscores, and hyphens\n * - Replaces spaces with hyphens\n * - Collapses multiple hyphens/underscores\n * - Trims leading/trailing hyphens/underscores\n * - Limits length to 100 characters\n * \n * @param text - Text to slugify\n * @returns URL-safe slug\n * \n * @example\n * generateSlug('Hello World!') // 'hello-world'\n * generateSlug('Café París 2024') // 'cafe-paris-2024'\n * generateSlug('Multiple Spaces') // 'multiple-spaces'\n */\nexport function generateSlug(text: string): string {\n if (!text) return '';\n \n return text\n .toLowerCase()\n .normalize('NFD') // Decompose combined characters (e.g., é -> e + ́)\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9\\s_-]/g, '') // Keep only alphanumeric, spaces, underscores, hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/[-_]+/g, '-') // Collapse multiple hyphens/underscores\n .replace(/^[-_]+|[-_]+$/g, '') // Trim leading/trailing hyphens/underscores\n .substring(0, 100); // Limit length for URL safety\n}\n","// Template renderer compatible with Cloudflare Workers\n// No filesystem access available\n\ninterface TemplateData {\n [key: string]: any\n}\n\nexport class TemplateRenderer {\n private templateCache = new Map()\n\n constructor() {\n // Cloudflare Workers compatible - no filesystem access\n }\n\n /**\n * Simple Handlebars-like template engine\n */\n private renderTemplate(template: string, data: TemplateData): string {\n let rendered = template\n\n // Handle each loops - process outermost loops first for proper nesting\n rendered = rendered.replace(/\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g, (_match, arrayName, content) => {\n const array = this.getNestedValue(data, arrayName.trim())\n if (!Array.isArray(array)) return ''\n \n return array.map((item, index) => {\n // Create context with array item and special variables\n const itemContext = {\n ...data,\n // Handle primitive items (for {{.}} syntax)\n '.': item,\n // Spread item properties if it's an object\n ...(typeof item === 'object' && item !== null ? item : {}),\n '@index': index,\n '@first': index === 0,\n '@last': index === array.length - 1\n }\n return this.renderTemplate(content, itemContext)\n }).join('')\n })\n\n // Second pass: Handle conditionals\n let ifCount = 0\n while (rendered.includes('{{#if ') && ifCount < 100) {\n const previousRendered = rendered\n rendered = rendered.replace(/\\{\\{#if\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (_match, condition, content) => {\n const value = this.getNestedValue(data, condition.trim())\n // Handle boolean values properly - @first/@last are explicitly boolean\n const isTruthy = value === true || (value && value !== 0 && value !== '' && value !== null && value !== undefined)\n return isTruthy ? this.renderTemplate(content, data) : ''\n })\n if (previousRendered === rendered) break\n ifCount++\n }\n\n // Third pass: Handle triple braces for raw HTML {{{variable}}}\n rendered = rendered.replace(/\\{\\{\\{([^}]+)\\}\\}\\}/g, (_match, variable) => {\n const value = this.getNestedValue(data, variable.trim())\n return value !== undefined && value !== null ? String(value) : ''\n })\n\n // Fourth pass: Handle helper functions like {{titleCase field}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\s+([^}]+)\\}\\}/g, (match, helper, variable) => {\n const helperName = helper.trim()\n const varName = variable.trim()\n \n if (helperName === 'titleCase') {\n const value = this.getNestedValue(data, varName)\n if (value !== undefined && value !== null) {\n return this.titleCase(String(value))\n }\n }\n \n return match // Return original if helper not found\n })\n\n // Final pass: Handle simple variables {{variable}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\}\\}/g, (match, variable) => {\n const trimmed = variable.trim()\n \n // Skip if it's a helper function (has spaces)\n if (trimmed.includes(' ')) {\n return match\n }\n \n const value = this.getNestedValue(data, trimmed)\n if (value === null) return ''\n if (value === undefined) return ''\n return String(value)\n })\n\n return rendered\n }\n\n /**\n * Get nested value from object using dot notation\n */\n private getNestedValue(obj: any, path: string): any {\n if (!obj || path === '') return undefined\n \n return path.split('.').reduce((current, key) => {\n if (current === null || current === undefined) return undefined\n return current[key]\n }, obj)\n }\n\n /**\n * Title case helper function\n */\n private titleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, l => l.toUpperCase())\n }\n\n /**\n * Render a template string with data\n */\n render(template: string, data: TemplateData = {}): string {\n return this.renderTemplate(template, data)\n }\n\n /**\n * Clear template cache (useful for development)\n */\n clearCache(): void {\n this.templateCache.clear()\n }\n}\n\n// Export singleton instance\nexport const templateRenderer = new TemplateRenderer()\n\n// Utility function to render template strings directly\nexport function renderTemplate(template: string, data: TemplateData = {}): string {\n return templateRenderer.render(template, data)\n}","/**\n * Query Filter Builder for SonicJS AI\n * Supports comprehensive filtering with AND/OR logic\n * Compatible with D1 Database (SQLite)\n */\n\nexport type FilterOperator =\n | 'equals'\n | 'not_equals'\n | 'greater_than'\n | 'greater_than_equal'\n | 'less_than'\n | 'less_than_equal'\n | 'like'\n | 'contains'\n | 'starts_with'\n | 'ends_with'\n | 'in'\n | 'not_in'\n | 'all'\n | 'exists'\n | 'near'\n | 'within'\n | 'intersects'\n\nconst VALID_FILTER_OPERATORS: ReadonlySet = new Set([\n 'equals',\n 'not_equals',\n 'greater_than',\n 'greater_than_equal',\n 'less_than',\n 'less_than_equal',\n 'like',\n 'contains',\n 'starts_with',\n 'ends_with',\n 'in',\n 'not_in',\n 'all',\n 'exists',\n 'near',\n 'within',\n 'intersects'\n])\n\nexport interface FilterCondition {\n field: string\n operator: FilterOperator\n value: any\n}\n\nexport interface FilterGroup {\n and?: FilterCondition[]\n or?: FilterCondition[]\n}\n\nexport interface QueryFilter {\n where?: FilterGroup\n limit?: number\n offset?: number\n sort?: {\n field: string\n order: 'asc' | 'desc'\n }[]\n}\n\nexport interface QueryResult {\n sql: string\n params: any[]\n errors: string[]\n}\n\n/**\n * Validate sort order value - only 'asc' or 'desc' are allowed.\n * Returns the validated lowercase value, defaulting to 'asc' for invalid input.\n */\nexport function validateSortOrder(order: any): 'asc' | 'desc' {\n if (typeof order === 'string') {\n const normalized = order.toLowerCase().trim()\n if (normalized === 'asc' || normalized === 'desc') {\n return normalized\n }\n }\n return 'asc'\n}\n\n/**\n * Query Filter Builder\n * Converts filter objects into SQL WHERE clauses with parameterized queries\n */\nexport class QueryFilterBuilder {\n private params: any[] = []\n private errors: string[] = []\n\n /**\n * Build a complete SQL query from filter object\n */\n build(baseTable: string, filter: QueryFilter): QueryResult {\n this.params = []\n this.errors = []\n\n let sql = `SELECT * FROM ${baseTable}`\n\n // Build WHERE clause\n if (filter.where) {\n const whereClause = this.buildWhereClause(filter.where)\n if (whereClause) {\n sql += ` WHERE ${whereClause}`\n }\n }\n\n // Build ORDER BY clause\n if (filter.sort && filter.sort.length > 0) {\n const orderClauses = filter.sort\n .map(s => `${this.sanitizeFieldName(s.field)} ${this.sanitizeSortOrder(s.order)}`)\n .join(', ')\n sql += ` ORDER BY ${orderClauses}`\n }\n\n // Build LIMIT clause\n if (filter.limit) {\n sql += ` LIMIT ?`\n this.params.push(filter.limit)\n }\n\n // Build OFFSET clause\n if (filter.offset) {\n sql += ` OFFSET ?`\n this.params.push(filter.offset)\n }\n\n return {\n sql,\n params: this.params,\n errors: this.errors\n }\n }\n\n /**\n * Build WHERE clause from filter group\n */\n private buildWhereClause(group: FilterGroup): string {\n const clauses: string[] = []\n\n // Handle AND conditions\n if (group.and && group.and.length > 0) {\n const andClauses = group.and\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (andClauses.length > 0) {\n clauses.push(`(${andClauses.join(' AND ')})`)\n }\n }\n\n // Handle OR conditions\n if (group.or && group.or.length > 0) {\n const orClauses = group.or\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (orClauses.length > 0) {\n clauses.push(`(${orClauses.join(' OR ')})`)\n }\n }\n\n return clauses.join(' AND ')\n }\n\n /**\n * Build a single condition\n */\n private buildCondition(condition: FilterCondition): string | null {\n const field = this.sanitizeFieldName(condition.field)\n\n switch (condition.operator) {\n case 'equals':\n return this.buildEquals(field, condition.value)\n\n case 'not_equals':\n return this.buildNotEquals(field, condition.value)\n\n case 'greater_than':\n return this.buildComparison(field, '>', condition.value)\n\n case 'greater_than_equal':\n return this.buildComparison(field, '>=', condition.value)\n\n case 'less_than':\n return this.buildComparison(field, '<', condition.value)\n\n case 'less_than_equal':\n return this.buildComparison(field, '<=', condition.value)\n\n case 'like':\n return this.buildLike(field, condition.value)\n\n case 'contains':\n return this.buildContains(field, condition.value)\n\n case 'starts_with':\n return this.buildStartsWith(field, condition.value)\n\n case 'ends_with':\n return this.buildEndsWith(field, condition.value)\n\n case 'in':\n return this.buildIn(field, condition.value)\n\n case 'not_in':\n return this.buildNotIn(field, condition.value)\n\n case 'all':\n return this.buildAll(field, condition.value)\n\n case 'exists':\n return this.buildExists(field, condition.value)\n\n case 'near':\n this.errors.push(`'near' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'within':\n this.errors.push(`'within' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'intersects':\n this.errors.push(`'intersects' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n default:\n this.errors.push(`Unknown operator: ${condition.operator}`)\n return null\n }\n }\n\n /**\n * Build equals condition\n */\n private buildEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NULL`\n }\n this.params.push(value)\n return `${field} = ?`\n }\n\n /**\n * Build not equals condition\n */\n private buildNotEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NOT NULL`\n }\n this.params.push(value)\n return `${field} != ?`\n }\n\n /**\n * Build comparison condition (>, >=, <, <=)\n */\n private buildComparison(field: string, operator: string, value: any): string {\n this.params.push(value)\n return `${field} ${operator} ?`\n }\n\n /**\n * Build LIKE condition (case-insensitive, all words must be present)\n */\n private buildLike(field: string, value: string): string {\n const words = value.split(/\\s+/).filter(w => w.length > 0)\n\n if (words.length === 0) {\n return `1=1` // No-op condition\n }\n\n const conditions = words.map(word => {\n this.params.push(`%${word}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build CONTAINS condition (case-insensitive substring)\n */\n private buildContains(field: string, value: string): string {\n this.params.push(`%${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build STARTS_WITH condition (case-insensitive prefix match)\n */\n private buildStartsWith(field: string, value: string): string {\n this.params.push(`${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build ENDS_WITH condition (case-insensitive suffix match)\n */\n private buildEndsWith(field: string, value: string): string {\n this.params.push(`%${value}`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build IN condition\n */\n private buildIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=0` // No values means no matches\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} IN (${placeholders})`\n }\n\n /**\n * Build NOT IN condition\n */\n private buildNotIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1` // No values means all match\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} NOT IN (${placeholders})`\n }\n\n /**\n * Build ALL condition (value must contain all items in list)\n * For SQLite, we'll check if a JSON array contains all values\n */\n private buildAll(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1`\n }\n\n // For SQLite, check if field contains all values using JSON functions\n // This assumes the field is a JSON array or comma-separated string\n const conditions = values.map(val => {\n this.params.push(`%${val}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build EXISTS condition\n */\n private buildExists(field: string, value: boolean): string {\n if (value) {\n return `${field} IS NOT NULL AND ${field} != ''`\n } else {\n return `(${field} IS NULL OR ${field} = '')`\n }\n }\n\n /**\n * Sanitize field names to prevent SQL injection\n */\n private sanitizeFieldName(field: string): string {\n // Allow alphanumeric, underscores, dots (for JSON fields)\n const sanitized = field.replace(/[^a-zA-Z0-9_$.]/g, '')\n\n // Handle JSON field access (e.g., data.title -> json_extract(data, '$.title'))\n if (sanitized.includes('.')) {\n const [table, ...path] = sanitized.split('.')\n return `json_extract(${table}, '$.${path.join('.')}')`\n }\n\n return sanitized\n }\n\n /**\n * Sanitize sort order to prevent SQL injection\n * Only allows 'ASC' or 'DESC', defaults to 'ASC' for any other value\n */\n private sanitizeSortOrder(order: string): string {\n const normalized = String(order).toUpperCase().trim()\n if (normalized === 'ASC' || normalized === 'DESC') {\n return normalized\n }\n return 'ASC'\n }\n\n /**\n * Parse filter from query string\n */\n static parseFromQuery(query: Record): QueryFilter {\n const filter: QueryFilter = {}\n\n // Parse where clause from 'where' parameter (JSON string)\n if (query.where) {\n try {\n filter.where = typeof query.where === 'string'\n ? JSON.parse(query.where)\n : query.where\n } catch (e) {\n console.error('Failed to parse where clause:', e)\n }\n }\n\n // Initialize where clause if not present\n if (!filter.where) {\n filter.where = { and: [] }\n }\n if (!filter.where.and) {\n filter.where.and = []\n }\n\n // Parse simple field filters (status, collection_id, etc.)\n // These are convenience parameters that get converted to WHERE conditions\n const simpleFieldMappings: Record = {\n 'status': 'status',\n 'collection_id': 'collection_id'\n }\n\n for (const [queryParam, dbField] of Object.entries(simpleFieldMappings)) {\n if (query[queryParam]) {\n filter.where.and.push({\n field: dbField,\n operator: 'equals',\n value: query[queryParam]\n })\n }\n }\n\n // Parse bracket-syntax filters: filter[field][operator]=value or filter[field]=value\n const bracketFilterRegex = /^filter\\[([^\\]]+)\\](?:\\[([^\\]]+)\\])?$/\n for (const [key, rawValue] of Object.entries(query)) {\n const match = key.match(bracketFilterRegex)\n if (!match) continue\n\n const field = match[1]\n const operator = (match[2] || 'equals') as FilterOperator\n\n if (!field || !VALID_FILTER_OPERATORS.has(operator)) continue\n if (rawValue === undefined || rawValue === null) continue\n\n let value: any = rawValue\n if (operator === 'exists') {\n value = value === 'true' || value === true || value === '1' || value === 1\n }\n\n filter.where.and.push({ field, operator, value })\n }\n\n // Parse limit\n if (query.limit) {\n filter.limit = Math.min(parseInt(query.limit), 1000) // Max 1000\n }\n\n // Parse offset\n if (query.offset) {\n filter.offset = parseInt(query.offset)\n }\n\n // Parse sort\n if (query.sort) {\n try {\n const parsed = typeof query.sort === 'string'\n ? JSON.parse(query.sort)\n : query.sort\n // Validate and sanitize sort entries\n if (Array.isArray(parsed)) {\n filter.sort = parsed\n .filter((s: any) => s && typeof s.field === 'string')\n .map((s: any) => ({\n field: s.field,\n order: validateSortOrder(s.order)\n }))\n }\n } catch (e) {\n console.error('Failed to parse sort clause:', e)\n }\n }\n\n return filter\n }\n}\n\n/**\n * Helper function to build query from filter\n */\nexport function buildQuery(table: string, filter: QueryFilter): QueryResult {\n const builder = new QueryFilterBuilder()\n return builder.build(table, filter)\n}\n","{\n \"name\": \"@sonicjs-cms/core\",\n \"version\": \"2.18.0\",\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 },\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 \"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/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.0.5\",\n \"drizzle-orm\": \"^0.45.2\",\n \"eslint\": \"^9.39.2\",\n \"glob\": \"^10.5.0\",\n \"hono\": \"^4.12.12\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.5\",\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","import type { BlockDefinitions } from '../types/collection-config'\n\nexport type BlocksFieldConfig = {\n blocks: BlockDefinitions\n discriminator: string\n}\n\nexport function getBlocksFieldConfig(fieldOptions: any): BlocksFieldConfig | null {\n if (!fieldOptions || typeof fieldOptions !== 'object') return null\n\n const itemsConfig = fieldOptions.items && typeof fieldOptions.items === 'object'\n ? fieldOptions.items\n : null\n\n if (!itemsConfig || !itemsConfig.blocks || typeof itemsConfig.blocks !== 'object') {\n return null\n }\n\n const discriminator = typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n\n return {\n blocks: itemsConfig.blocks as BlockDefinitions,\n discriminator\n }\n}\n\nexport function parseBlocksValue(value: unknown, config: BlocksFieldConfig) {\n const errors: string[] = []\n let rawValue = value\n\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return { value: [] as any[], errors }\n }\n\n if (typeof rawValue === 'string') {\n try {\n rawValue = JSON.parse(rawValue)\n } catch {\n return { value: [] as any[], errors: ['Blocks value must be valid JSON'] }\n }\n }\n\n if (!Array.isArray(rawValue)) {\n return { value: [] as any[], errors: ['Blocks value must be an array'] }\n }\n\n const normalized = rawValue.map((item, index) => {\n if (!item || typeof item !== 'object') {\n errors.push(`Block #${index + 1} must be an object`)\n return null\n }\n\n if ((item as any).blockType && (item as any).data && typeof (item as any).data === 'object') {\n return { [config.discriminator]: (item as any).blockType, ...(item as any).data }\n }\n\n if (!(config.discriminator in (item as any))) {\n errors.push(`Block #${index + 1} is missing \"${config.discriminator}\"`)\n }\n\n return item as any\n }).filter((item) => item !== null)\n\n return { value: normalized, errors }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-ICMNCCX2.cjs b/packages/core/dist/chunk-7KR6GOY3.cjs similarity index 99% rename from packages/core/dist/chunk-ICMNCCX2.cjs rename to packages/core/dist/chunk-7KR6GOY3.cjs index 283169f9d..a8bffd41a 100644 --- a/packages/core/dist/chunk-ICMNCCX2.cjs +++ b/packages/core/dist/chunk-7KR6GOY3.cjs @@ -2215,5 +2215,5 @@ var MigrationService = class { }; exports.MigrationService = MigrationService; -//# sourceMappingURL=chunk-ICMNCCX2.cjs.map -//# sourceMappingURL=chunk-ICMNCCX2.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-7KR6GOY3.cjs.map +//# sourceMappingURL=chunk-7KR6GOY3.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-ICMNCCX2.cjs.map b/packages/core/dist/chunk-7KR6GOY3.cjs.map similarity index 99% rename from packages/core/dist/chunk-ICMNCCX2.cjs.map rename to packages/core/dist/chunk-7KR6GOY3.cjs.map index d806d878e..31e41d43f 100644 --- a/packages/core/dist/chunk-ICMNCCX2.cjs.map +++ b/packages/core/dist/chunk-7KR6GOY3.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/db/migrations-bundle.ts","../src/services/migrations.ts"],"names":["hasUserProfilesTable"],"mappings":";;;AAiBO,IAAM,iBAAA,GAAwC;AAAA,EACnD;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,QAAA,EAAU,wBAAA;AAAA,IACV,WAAA,EAAa,+BAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,6FAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU,oBAAA;AAAA,IACV,WAAA,EAAa,2BAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6NAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,wBAAA;AAAA,IACN,QAAA,EAAU,gCAAA;AAAA,IACV,WAAA,EAAa,uCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,4BAAA;AAAA,IACN,QAAA,EAAU,oCAAA;AAAA,IACV,WAAA,EAAa,2CAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,eAAA;AAAA,IACN,QAAA,EAAU,uBAAA;AAAA,IACV,WAAA,EAAa,8BAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,4EAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,mBAAA;AAAA,IACN,QAAA,EAAU,2BAAA;AAAA,IACV,WAAA,EAAa,kCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,uDAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,QAAA,EAAU,wBAAA;AAAA,IACV,WAAA,EAAa,+BAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,4BAAA;AAAA,IACN,QAAA,EAAU,oCAAA;AAAA,IACV,WAAA,EAAa,2CAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,sBAAA;AAAA,IACN,QAAA,EAAU,8BAAA;AAAA,IACV,WAAA,EAAa,qCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,uBAAA;AAAA,IACN,QAAA,EAAU,+BAAA;AAAA,IACV,WAAA,EAAa,sCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,+BAAA;AAAA,IACN,QAAA,EAAU,uCAAA;AAAA,IACV,WAAA,EAAa,8CAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,0BAAA;AAAA,IACN,QAAA,EAAU,kCAAA;AAAA,IACV,WAAA,EAAa,yCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,QAAA,EAAU,wBAAA;AAAA,IACV,WAAA,EAAa,+BAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,8BAAA;AAAA,IACN,QAAA,EAAU,sCAAA;AAAA,IACV,WAAA,EAAa,6CAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,QAAA,EAAU,0BAAA;AAAA,IACV,WAAA,EAAa,iCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,4BAAA;AAAA,IACN,QAAA,EAAU,oCAAA;AAAA,IACV,WAAA,EAAa,2CAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,oBAAA;AAAA,IACN,QAAA,EAAU,4BAAA;AAAA,IACV,WAAA,EAAa,mCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,yBAAA;AAAA,IACN,QAAA,EAAU,iCAAA;AAAA,IACV,WAAA,EAAa,wCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,oBAAA;AAAA,IACN,QAAA,EAAU,4BAAA;AAAA,IACV,WAAA,EAAa,mCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,eAAA;AAAA,IACN,QAAA,EAAU,uBAAA;AAAA,IACV,WAAA,EAAa,8BAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,6BAAA;AAAA,IACV,WAAA,EAAa,oCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,gCAAA;AAAA,IACN,QAAA,EAAU,wCAAA;AAAA,IACV,WAAA,EAAa,+CAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,QAAA,EAAU,0BAAA;AAAA,IACV,WAAA,EAAa,iCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,wBAAA;AAAA,IACN,QAAA,EAAU,gCAAA;AAAA,IACV,WAAA,EAAa,uCAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,QAAA,EAAU,0BAAA;AAAA,IACV,WAAA,EAAa,iCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,eAAA;AAAA,IACN,QAAA,EAAU,uBAAA;AAAA,IACV,WAAA,EAAa,8BAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,0BAAA;AAAA,IACN,QAAA,EAAU,kCAAA;AAAA,IACV,WAAA,EAAa,yCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,uBAAA;AAAA,IACN,QAAA,EAAU,+BAAA;AAAA,IACV,WAAA,EAAa,sCAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,2BAAA;AAAA,IACN,QAAA,EAAU,mCAAA;AAAA,IACV,WAAA,EAAa,0CAAA;AAAA,IACb,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACP;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,QAAA,EAAU,0BAAA;AAAA,IACV,WAAA,EAAa,iCAAA;AAAA,IACb,GAAA,EAAK;AAAA;AAET,CAAA;AAGO,IAAM,oBAAoB,IAAI,GAAA;AAAA,EACnC,kBAAkB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC;AACtC,CAAA;AAGO,SAAS,oBAAoB,EAAA,EAA2B;AAC7D,EAAA,OAAO,iBAAA,CAAkB,GAAA,CAAI,EAAE,CAAA,EAAG,GAAA,IAAO,IAAA;AAC3C;;;AC5PO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,MAAM,yBAAA,GAA2C;AAC/C,IAAA,MAAM,gBAAA,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAUzB,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,gBAAgB,EAAE,GAAA,EAAI;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,GAA+C;AACnD,IAAA,MAAM,aAA0B,EAAC;AAGjC,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAClC;AAAA,MACA,GAAA,EAAI;AAEN,IAAA,MAAM,oBAAoB,IAAI,GAAA;AAAA,MAC5B,aAAA,CAAc,OAAA,EAAS,GAAA,CAAI,CAAC,GAAA,KAAa,CAAC,GAAA,CAAI,EAAA,EAAI,GAAG,CAAC,CAAA,IAAK;AAAC,KAC9D;AAGA,IAAA,MAAM,IAAA,CAAK,4BAA4B,iBAAiB,CAAA;AAGxD,IAAA,KAAA,MAAW,WAAW,iBAAA,EAAmB;AACvC,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AAChD,MAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AAEpD,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,OAAA;AAAA,QACA,SAAA,EAAW,OAAA,GAAU,WAAA,EAAa,UAAA,GAAa,MAAA;AAAA,QAC/C,IAAA,EAAM,QAAQ,GAAA,CAAI;AAAA,OACnB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,4BAA4B,iBAAA,EAAoD;AAE5F,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,OAAA,EAAS,SAAA,EAAW,aAAA,EAAe,OAAO,CAAC,CAAA;AAC/F,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,gBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,gBAAA,EAAkB,wBAAwB,CAAA;AAAA,MACnF;AAAA,IACF;AAIA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,eAAe,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,MAAM,CAAC,CAAA;AACzD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,YAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,YAAA,EAAc,oBAAoB,CAAA;AAAA,MAC3E;AAAA,IACF;AAIA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,gBAAA,EAAkB,uBAAA,EAAyB,oBAAoB,CAAC,CAAA;AACrH,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,sBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,sBAAA,EAAwB,6BAA6B,CAAA;AAAA,MAC9F;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,wBAAwB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,cAAc,CAAC,CAAA;AAC1E,MAAA,IAAI,qBAAA,EAAuB;AACzB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,qBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,qBAAA,EAAuB,6BAA6B,CAAA;AAAA,MAC7F;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,wBAAwB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,eAAe,CAAC,CAAA;AAC3E,MAAA,IAAI,qBAAA,EAAuB;AACzB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,sBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,sBAAA,EAAwB,8BAA8B,CAAA;AAAA,MAC/F;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,iBAAiB,CAAC,YAAA,EAAc,kBAAkB,CAAC,CAAA;AACpF,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,iBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,iBAAA,EAAmB,gCAAgC,CAAA;AAAA,MAC5F;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,kBAAkB,MAAM,IAAA,CAAK,iBAAiB,CAAC,SAAA,EAAW,cAAc,CAAC,CAAA;AAC/E,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,eAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,eAAA,EAAiB,uBAAuB,CAAA;AAAA,MACjF;AAAA,IACF;AAMA,IAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,iBAAA,CAAkB,eAAe,SAAS,CAAA;AAC9E,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,KAAK,gBAAA,EAAkB;AACrD,MAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,QAC3B,EAAA,EAAI,KAAA;AAAA,QACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QACnC,IAAA,EAAM,4BAAA;AAAA,QACN,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,4BAAA,EAA8B,oCAAoC,CAAA;AAAA,IAC3G,WAAW,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,IAAK,CAAC,gBAAA,EAAkB;AAE5D,MAAA,OAAA,CAAQ,IAAI,sFAAsF,CAAA;AAClG,MAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,MAAA,MAAM,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,mBAAmB,MAAM,IAAA,CAAK,iBAAiB,CAAC,aAAA,EAAe,YAAY,CAAC,CAAA;AAClF,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,gBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,gBAAA,EAAkB,wBAAwB,CAAA;AAAA,MACnF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,mBAAmB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,UAAU,CAAC,CAAA;AACjE,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,gBAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,gBAAA,EAAkB,wBAAwB,CAAA;AAAA,MACnF;AAAA,IACF;AAMA,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,OAAA,EAAS,kBAAA,EAAoB,YAAY,CAAC,CAAA;AAC9F,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,KAAK,cAAA,EAAgB;AACnD,MAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,QAC3B,EAAA,EAAI,KAAA;AAAA,QACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QACnC,IAAA,EAAM,kBAAA;AAAA,QACN,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,kBAAA,EAAoB,0BAA0B,CAAA;AAAA,IACvF,WAAW,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,IAAK,CAAC,cAAA,EAAgB;AAG1D,MAAA,OAAA,CAAQ,IAAI,oFAAoF,CAAA;AAChG,MAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,MAAA,MAAM,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAAA,IACzC;AAIA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAMA,wBAAuB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,eAAe,CAAC,CAAA;AAC1E,MAAA,IAAIA,qBAAAA,EAAsB;AACxB,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,eAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,eAAA,EAAiB,uBAAuB,CAAA;AAAA,MACjF;AAAA,IACF;AAMA,IAAA,MAAM,uBAAuB,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,eAAe,CAAC,CAAA;AAC1E,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,iBAAA,CAAkB,iBAAiB,MAAM,CAAA;AAC1E,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,CAAA,2DAAA,CAA6D,EAAE,GAAA,EAAI;AACzF,UAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AAAA,QACtE,SAAS,KAAA,EAAO;AAEd,UAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACjE,UAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,uBAAuB,CAAA,EAAG;AAC1C,YAAA,OAAA,CAAQ,KAAA,CAAM,2DAA2D,GAAG,CAAA;AAAA,UAC9E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,aAAa,oBAAA,IAAwB,MAAM,IAAA,CAAK,iBAAA,CAAkB,iBAAiB,MAAM,CAAA;AAC/F,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO;AAAA,UAC3B,EAAA,EAAI,KAAA;AAAA,UACJ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACnC,IAAA,EAAM,2BAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,2BAAA,EAA6B,mCAAmC,CAAA;AAAA,MACzG;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,UAAA,EAAwC;AACrE,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,UAC3B,CAAA,4DAAA;AAAA,SACF,CAAE,IAAA,CAAK,SAAS,CAAA,CAAE,KAAA,EAAM;AAExB,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,CAAkB,SAAA,EAAmB,UAAA,EAAsC;AACvF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,QAC3B,CAAA,iDAAA;AAAA,OACF,CAAE,IAAA,CAAK,SAAA,EAAW,UAAU,EAAE,KAAA,EAAM;AAEpC,MAAA,OAAO,CAAC,CAAC,MAAA;AAAA,IACX,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAA+C;AACnD,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,sBAAA,EAAuB;AACrD,IAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAC1D,IAAA,MAAM,oBAAoB,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,OAAO,CAAA;AAE3D,IAAA,MAAM,WAAA,GAAc,kBAAkB,MAAA,GAAS,CAAA,GAC3C,kBAAkB,iBAAA,CAAkB,MAAA,GAAS,CAAC,CAAA,EAAG,SAAA,GACjD,MAAA;AAEJ,IAAA,OAAO;AAAA,MACL,iBAAiB,UAAA,CAAW,MAAA;AAAA,MAC5B,mBAAmB,iBAAA,CAAkB,MAAA;AAAA,MACrC,mBAAmB,iBAAA,CAAkB,MAAA;AAAA,MACrC,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CAAqB,WAAA,EAAqB,IAAA,EAAc,QAAA,EAAiC;AAC7F,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,KAAK,EAAA,CAAG,OAAA;AAAA,MACZ;AAAA,MACA,IAAA,CAAK,WAAA,EAAa,IAAA,EAAM,QAAQ,EAAE,GAAA,EAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,WAAA,EAAoC;AAC/D,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,KAAK,EAAA,CAAG,OAAA;AAAA,MACZ;AAAA,KACF,CAAE,IAAA,CAAK,WAAW,CAAA,CAAE,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,WAAA,EAAuC;AAC9D,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,KACF,CAAE,IAAA,CAAK,WAAW,CAAA,CAAE,KAAA,EAAM;AAE1B,IAAA,OAAQ,QAAQ,KAAA,GAAmB,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAA,GAAqD;AACzD,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MAC3B;AAAA,MACA,KAAA,EAAM;AAER,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,OAAO;AAAA,MACL,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAA,EAAS,IAAA;AAAA,MACT,WAAW,MAAA,CAAO;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAA4G;AAChH,IAAA,MAAM,KAAK,yBAAA,EAA0B;AAErC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAC7C,IAAA,MAAM,oBAAoB,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA,CAAA,KAAK,CAAC,EAAE,OAAO,CAAA;AAElE,IAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,+BAAA;AAAA,QACT,SAAS,EAAC;AAAA,QACV,QAAQ;AAAC,OACX;AAAA,IACF;AAGA,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,KAAA,MAAW,aAAa,iBAAA,EAAmB;AACzC,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,IAAI,CAAA,qBAAA,EAAwB,SAAA,CAAU,EAAE,CAAA,EAAA,EAAK,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AACrE,QAAA,MAAM,IAAA,CAAK,eAAe,SAAS,CAAA;AACnC,QAAA,MAAM,KAAK,oBAAA,CAAqB,SAAA,CAAU,IAAI,SAAA,CAAU,IAAA,EAAM,UAAU,QAAQ,CAAA;AAChF,QAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,EAAE,CAAA;AACzB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iCAAA,EAAoC,SAAA,CAAU,EAAE,CAAA,CAAE,CAAA;AAAA,MAChE,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,SAAA,CAAU,EAAE,KAAK,YAAY,CAAA;AACpF,QAAA,MAAA,CAAO,KAAK,CAAA,EAAG,SAAA,CAAU,EAAE,CAAA,EAAA,EAAK,YAAY,CAAA,CAAE,CAAA;AAAA,MAGhD;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC7C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,CAAA,4BAAA,EAA+B,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QACzD,OAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GACtB,CAAA,QAAA,EAAW,QAAQ,MAAM,CAAA,aAAA,EAAgB,MAAA,CAAO,MAAA,GAAS,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,QAAA,CAAA,GAAa,EAAE,CAAA,CAAA,GAC9F,uBAAA;AAAA,MACJ,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAe,SAAA,EAAqC;AAEhE,IAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,SAAA,CAAU,EAAE,CAAA;AAErD,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,SAAA,CAAU,EAAE,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,YAAA,CAAa,IAAA,EAAK,KAAM,EAAA,EAAI;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,SAAA,CAAU,EAAE,CAAA,CAAE,CAAA;AAClE,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,YAAY,CAAA;AAEvD,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAI,SAAA,CAAU,MAAK,EAAG;AACpB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,SAAS,EAAE,GAAA,EAAI;AAAA,QACvC,SAAS,KAAA,EAAO;AAEd,UAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,UAAA,IAAI,YAAA,CAAa,QAAA,CAAS,gBAAgB,CAAA,IACtC,YAAA,CAAa,QAAA,CAAS,uBAAuB,CAAA,IAC7C,YAAA,CAAa,QAAA,CAAS,0BAA0B,CAAA,EAAG;AACrD,YAAA,OAAA,CAAQ,IAAI,CAAA,uCAAA,EAA0C,SAAA,CAAU,UAAU,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAK,CAAA;AACrF,YAAA;AAAA,UACF;AACA,UAAA,OAAA,CAAQ,MAAM,CAAA,uCAAA,EAA0C,SAAA,CAAU,UAAU,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAK,CAAA;AACxF,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,GAAA,EAAuB;AAChD,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAE5B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAG1B,MAAA,IAAI,QAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACpD,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACpD,QAAA,SAAA,GAAY,IAAA;AAAA,MACd;AAEA,MAAA,OAAA,IAAW,IAAA,GAAO,IAAA;AAGlB,MAAA,IAAI,SAAA,IAAa,OAAA,CAAQ,WAAA,EAAY,KAAM,MAAA,EAAQ;AACjD,QAAA,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAC9B,QAAA,OAAA,GAAU,EAAA;AACV,QAAA,SAAA,GAAY,KAAA;AAAA,MACd,WAES,CAAC,SAAA,IAAa,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5C,QAAA,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAC9B,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,MAAK,EAAG;AAClB,MAAA,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAAgE;AACpE,IAAA,MAAM,SAAmB,EAAC;AAG1B,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,OAAA;AAAA,MAAS,SAAA;AAAA,MAAW,aAAA;AAAA,MAAe;AAAA,KACrC;AAEA,IAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,EAAA,CAAG,OAAA,CAAQ,wBAAwB,KAAK,CAAA,QAAA,CAAU,EAAE,KAAA,EAAM;AAAA,MACvE,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE,CAAA;AAAA,MACvC;AAAA,IACF;AAGA,IAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,iBAAA,CAAkB,eAAe,SAAS,CAAA;AAC9E,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAA,CAAO,KAAK,qCAAqC,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AACF","file":"chunk-ICMNCCX2.cjs","sourcesContent":["/**\n * AUTO-GENERATED FILE - DO NOT EDIT\n * Generated by: scripts/generate-migrations.ts\n * Generated at: 2026-05-16T15:00:21.459Z\n *\n * This file contains all migration SQL bundled for use in Cloudflare Workers\n * where filesystem access is not available at runtime.\n */\n\nexport interface BundledMigration {\n id: string\n name: string\n filename: string\n description: string\n sql: string\n}\n\nexport const bundledMigrations: BundledMigration[] = [\n {\n id: '001',\n name: 'Initial Schema',\n filename: '001_initial_schema.sql',\n description: 'Migration 001: Initial Schema',\n sql: \"-- Initial schema for SonicJS AI\\n-- Create users table for authentication\\nCREATE TABLE IF NOT EXISTS users (\\n id TEXT PRIMARY KEY,\\n email TEXT NOT NULL UNIQUE,\\n username TEXT NOT NULL UNIQUE,\\n first_name TEXT NOT NULL,\\n last_name TEXT NOT NULL,\\n password_hash TEXT,\\n role TEXT NOT NULL DEFAULT 'viewer',\\n avatar TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n last_login_at INTEGER,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create collections table for content schema definitions\\nCREATE TABLE IF NOT EXISTS collections (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n schema TEXT NOT NULL, -- JSON schema definition\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content table for actual content data\\nCREATE TABLE IF NOT EXISTS content (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n slug TEXT NOT NULL,\\n title TEXT NOT NULL,\\n data TEXT NOT NULL, -- JSON content data\\n status TEXT NOT NULL DEFAULT 'draft',\\n published_at INTEGER,\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content_versions table for versioning\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n version INTEGER NOT NULL,\\n data TEXT NOT NULL, -- JSON data\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create media/files table with comprehensive R2 integration\\nCREATE TABLE IF NOT EXISTS media (\\n id TEXT PRIMARY KEY,\\n filename TEXT NOT NULL,\\n original_name TEXT NOT NULL,\\n mime_type TEXT NOT NULL,\\n size INTEGER NOT NULL,\\n width INTEGER,\\n height INTEGER,\\n folder TEXT NOT NULL DEFAULT 'uploads',\\n r2_key TEXT NOT NULL, -- R2 storage key\\n public_url TEXT NOT NULL, -- CDN URL\\n thumbnail_url TEXT, -- Cloudflare Images URL\\n alt TEXT,\\n caption TEXT,\\n tags TEXT, -- JSON array of tags\\n uploaded_by TEXT NOT NULL REFERENCES users(id),\\n uploaded_at INTEGER NOT NULL,\\n updated_at INTEGER,\\n published_at INTEGER,\\n scheduled_at INTEGER,\\n archived_at INTEGER,\\n deleted_at INTEGER\\n);\\n\\n-- Create API tokens table for programmatic access\\nCREATE TABLE IF NOT EXISTS api_tokens (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n permissions TEXT NOT NULL, -- JSON array of permissions\\n expires_at INTEGER,\\n last_used_at INTEGER,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create workflow history table for content workflow tracking\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n action TEXT NOT NULL,\\n from_status TEXT NOT NULL,\\n to_status TEXT NOT NULL,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n comment TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\\nCREATE INDEX IF NOT EXISTS idx_users_username ON users(username);\\nCREATE INDEX IF NOT EXISTS idx_users_role ON users(role);\\n\\nCREATE INDEX IF NOT EXISTS idx_collections_name ON collections(name);\\nCREATE INDEX IF NOT EXISTS idx_collections_active ON collections(is_active);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_collection ON content(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_author ON content(author_id);\\nCREATE INDEX IF NOT EXISTS idx_content_status ON content(status);\\nCREATE INDEX IF NOT EXISTS idx_content_published ON content(published_at);\\nCREATE INDEX IF NOT EXISTS idx_content_slug ON content(slug);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_version ON content_versions(version);\\n\\nCREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);\\nCREATE INDEX IF NOT EXISTS idx_media_type ON media(mime_type);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_by ON media(uploaded_by);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_at ON media(uploaded_at);\\nCREATE INDEX IF NOT EXISTS idx_media_deleted ON media(deleted_at);\\n\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_user ON api_tokens(user_id);\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_token ON api_tokens(token);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_user ON workflow_history(user_id);\\n\\n-- Note: Admin user is created via the seed script with user-provided credentials\\n-- Run 'npm run seed' after migrations to create the admin user\\n\\n-- Insert sample collections\\nINSERT OR IGNORE INTO collections (\\n id, name, display_name, description, schema, \\n is_active, created_at, updated_at\\n) VALUES (\\n 'blog-posts-collection',\\n 'blog_posts',\\n 'Blog Posts',\\n 'Blog post content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"excerpt\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Excerpt\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"},\\\"tags\\\":{\\\"type\\\":\\\"array\\\",\\\"title\\\":\\\"Tags\\\",\\\"items\\\":{\\\"type\\\":\\\"string\\\"}},\\\"status\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Status\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"],\\\"default\\\":\\\"draft\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'pages-collection',\\n 'pages',\\n 'Pages',\\n 'Static page content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"slug\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Slug\\\"},\\\"meta_description\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Meta Description\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'news-collection',\\n 'news',\\n 'News',\\n 'News article content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"publish_date\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Publish Date\\\",\\\"format\\\":\\\"date\\\"},\\\"author\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Author\\\"},\\\"category\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Category\\\",\\\"enum\\\":[\\\"technology\\\",\\\"business\\\",\\\"general\\\"]}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Note: Sample content can be created via the admin interface after the admin user is seeded\"\n },\n {\n id: '002',\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql',\n description: 'Migration 002: Faq Plugin',\n sql: \"-- FAQ Plugin Migration (DEPRECATED - Now managed by third-party plugin)\\n-- Creates FAQ table for the FAQ plugin\\n-- NOTE: This migration is kept for historical purposes. \\n-- The FAQ functionality is now provided by the faq-plugin third-party plugin.\\n\\nCREATE TABLE IF NOT EXISTS faqs (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n question TEXT NOT NULL,\\n answer TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_faqs_category ON faqs(category);\\nCREATE INDEX IF NOT EXISTS idx_faqs_published ON faqs(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_faqs_sort_order ON faqs(sortOrder);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS faqs_updated_at\\n AFTER UPDATE ON faqs\\nBEGIN\\n UPDATE faqs SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert sample FAQ data\\nINSERT OR IGNORE INTO faqs (question, answer, category, tags, isPublished, sortOrder) VALUES \\n('What is SonicJS AI?', \\n'SonicJS AI is a modern, TypeScript-first headless CMS built for Cloudflare''s edge platform. It provides a complete content management system with admin interface, API endpoints, and plugin architecture.',\\n'general',\\n'sonicjs, cms, cloudflare',\\n1,\\n1),\\n\\n('How do I get started with SonicJS AI?',\\n'To get started: 1) Clone the repository, 2) Install dependencies with npm install, 3) Set up your Cloudflare account and services, 4) Run the development server with npm run dev, 5) Access the admin interface at /admin.',\\n'general',\\n'getting-started, setup',\\n1,\\n2),\\n\\n('What technologies does SonicJS AI use?',\\n'SonicJS AI is built with: TypeScript for type safety, Hono.js as the web framework, Cloudflare D1 for the database, Cloudflare R2 for media storage, Cloudflare Workers for serverless execution, and Tailwind CSS for styling.',\\n'technical',\\n'technology-stack, typescript, cloudflare',\\n1,\\n3),\\n\\n('How do I create content in SonicJS AI?',\\n'Content creation is done through the admin interface. Navigate to /admin, log in with your credentials, go to Content section, select a collection, and click \\\"New Content\\\" to create articles, pages, or other content types.',\\n'general',\\n'content-creation, admin',\\n1,\\n4),\\n\\n('Is SonicJS AI free to use?',\\n'SonicJS AI is open source and free to use. You only pay for the Cloudflare services you consume (D1 database, R2 storage, Workers execution time). Cloudflare offers generous free tiers for development and small projects.',\\n'billing',\\n'pricing, open-source, cloudflare',\\n1,\\n5),\\n\\n('How do I add custom functionality?',\\n'SonicJS AI features a plugin system that allows you to extend functionality. You can create plugins using the PluginBuilder API, add custom routes, models, admin pages, and integrate with external services.',\\n'technical',\\n'plugins, customization, development',\\n1,\\n6),\\n\\n('Can I customize the admin interface?',\\n'Yes! The admin interface is built with TypeScript templates and can be customized. You can modify existing templates, create new components, add custom pages, and integrate your own styling while maintaining the dark theme.',\\n'technical',\\n'admin-interface, customization, templates',\\n1,\\n7),\\n\\n('How does authentication work?',\\n'SonicJS AI includes a built-in authentication system with JWT tokens, role-based access control (admin, editor, viewer), secure password hashing, and session management. Users can be managed through the admin interface.',\\n'technical',\\n'authentication, security, users',\\n1,\\n8);\"\n },\n {\n id: '003',\n name: 'Stage5 Enhancements',\n filename: '003_stage5_enhancements.sql',\n description: 'Migration 003: Stage5 Enhancements',\n sql: \"-- Stage 5: Advanced Content Management enhancements\\n-- Add scheduling and workflow features to content table\\n\\n-- Add content scheduling columns\\nALTER TABLE content ADD COLUMN scheduled_publish_at INTEGER;\\nALTER TABLE content ADD COLUMN scheduled_unpublish_at INTEGER;\\n\\n-- Add workflow and review columns\\nALTER TABLE content ADD COLUMN review_status TEXT DEFAULT 'none'; -- none, pending, approved, rejected\\nALTER TABLE content ADD COLUMN reviewer_id TEXT REFERENCES users(id);\\nALTER TABLE content ADD COLUMN reviewed_at INTEGER;\\nALTER TABLE content ADD COLUMN review_notes TEXT;\\n\\n-- Add content metadata\\nALTER TABLE content ADD COLUMN meta_title TEXT;\\nALTER TABLE content ADD COLUMN meta_description TEXT;\\nALTER TABLE content ADD COLUMN featured_image_id TEXT REFERENCES media(id);\\nALTER TABLE content ADD COLUMN content_type TEXT DEFAULT 'standard'; -- standard, template, component\\n\\n-- Create content_fields table for dynamic field definitions\\nCREATE TABLE IF NOT EXISTS content_fields (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n field_name TEXT NOT NULL,\\n field_type TEXT NOT NULL, -- text, richtext, number, boolean, date, select, media, relationship\\n field_label TEXT NOT NULL,\\n field_options TEXT, -- JSON for select options, validation rules, etc.\\n field_order INTEGER NOT NULL DEFAULT 0,\\n is_required INTEGER NOT NULL DEFAULT 0,\\n is_searchable INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(collection_id, field_name)\\n);\\n\\n-- Create content_relationships table for content relationships\\nCREATE TABLE IF NOT EXISTS content_relationships (\\n id TEXT PRIMARY KEY,\\n source_content_id TEXT NOT NULL REFERENCES content(id),\\n target_content_id TEXT NOT NULL REFERENCES content(id),\\n relationship_type TEXT NOT NULL, -- references, tags, categories\\n created_at INTEGER NOT NULL,\\n UNIQUE(source_content_id, target_content_id, relationship_type)\\n);\\n\\n-- Create workflow_templates table for reusable workflows\\nCREATE TABLE IF NOT EXISTS workflow_templates (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT REFERENCES collections(id), -- null means applies to all collections\\n workflow_steps TEXT NOT NULL, -- JSON array of workflow steps\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Add indexes for new columns\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_unpublish ON content(scheduled_unpublish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_review_status ON content(review_status);\\nCREATE INDEX IF NOT EXISTS idx_content_reviewer ON content(reviewer_id);\\nCREATE INDEX IF NOT EXISTS idx_content_content_type ON content(content_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_fields_collection ON content_fields(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_name ON content_fields(field_name);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_type ON content_fields(field_type);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_order ON content_fields(field_order);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_source ON content_relationships(source_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_target ON content_relationships(target_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_type ON content_relationships(relationship_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_collection ON workflow_templates(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_active ON workflow_templates(is_active);\\n\\n-- Insert default workflow template\\nINSERT OR IGNORE INTO workflow_templates (\\n id, name, description, workflow_steps, is_active, created_at, updated_at\\n) VALUES (\\n 'default-content-workflow',\\n 'Default Content Workflow',\\n 'Standard content workflow: Draft → Review → Published',\\n '[\\n {\\\"step\\\": \\\"draft\\\", \\\"name\\\": \\\"Draft\\\", \\\"description\\\": \\\"Content is being created\\\", \\\"permissions\\\": [\\\"author\\\", \\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"review\\\", \\\"name\\\": \\\"Under Review\\\", \\\"description\\\": \\\"Content is pending review\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"published\\\", \\\"name\\\": \\\"Published\\\", \\\"description\\\": \\\"Content is live\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"archived\\\", \\\"name\\\": \\\"Archived\\\", \\\"description\\\": \\\"Content is archived\\\", \\\"permissions\\\": [\\\"admin\\\"]}\\n ]',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Insert enhanced field definitions for existing collections\\nINSERT OR IGNORE INTO content_fields (\\n id, collection_id, field_name, field_type, field_label, field_options, field_order, is_required, is_searchable, created_at, updated_at\\n) VALUES \\n-- Blog Posts fields\\n('blog-title-field', 'blog-posts-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter blog post title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-content-field', 'blog-posts-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-excerpt-field', 'blog-posts-collection', 'excerpt', 'text', 'Excerpt', '{\\\"maxLength\\\": 500, \\\"rows\\\": 3, \\\"placeholder\\\": \\\"Brief description of the post\\\"}', 3, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-tags-field', 'blog-posts-collection', 'tags', 'select', 'Tags', '{\\\"multiple\\\": true, \\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"tutorial\\\", \\\"news\\\", \\\"update\\\"], \\\"allowCustom\\\": true}', 4, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-image-field', 'blog-posts-collection', 'featured_image', 'media', 'Featured Image', '{\\\"accept\\\": \\\"image/*\\\", \\\"maxSize\\\": \\\"5MB\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-publish-date-field', 'blog-posts-collection', 'publish_date', 'date', 'Publish Date', '{\\\"format\\\": \\\"YYYY-MM-DD\\\", \\\"defaultToday\\\": true}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-field', 'blog-posts-collection', 'is_featured', 'boolean', 'Featured Post', '{\\\"default\\\": false}', 7, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- Pages fields\\n('pages-title-field', 'pages-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter page title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-content-field', 'pages-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 500}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-slug-field', 'pages-collection', 'slug', 'text', 'URL Slug', '{\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\"}', 3, 1, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-meta-desc-field', 'pages-collection', 'meta_description', 'text', 'Meta Description', '{\\\"maxLength\\\": 160, \\\"rows\\\": 2, \\\"placeholder\\\": \\\"SEO description for search engines\\\"}', 4, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-template-field', 'pages-collection', 'template', 'select', 'Page Template', '{\\\"options\\\": [\\\"default\\\", \\\"landing\\\", \\\"contact\\\", \\\"about\\\"], \\\"default\\\": \\\"default\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- News fields\\n('news-title-field', 'news-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter news title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-content-field', 'news-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"news\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-category-field', 'news-collection', 'category', 'select', 'Category', '{\\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"politics\\\", \\\"sports\\\", \\\"entertainment\\\", \\\"health\\\"], \\\"required\\\": true}', 3, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-author-field', 'news-collection', 'author', 'text', 'Author', '{\\\"placeholder\\\": \\\"Author name\\\"}', 4, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-source-field', 'news-collection', 'source', 'text', 'Source', '{\\\"placeholder\\\": \\\"News source\\\"}', 5, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-priority-field', 'news-collection', 'priority', 'select', 'Priority', '{\\\"options\\\": [\\\"low\\\", \\\"normal\\\", \\\"high\\\", \\\"breaking\\\"], \\\"default\\\": \\\"normal\\\"}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000);\"\n },\n {\n id: '004',\n name: 'Stage6 User Management',\n filename: '004_stage6_user_management.sql',\n description: 'Migration 004: Stage6 User Management',\n sql: \"-- Stage 6: User Management & Permissions enhancements\\n-- Enhanced user system with profiles, teams, permissions, and activity logging\\n\\n-- Add user profile and preferences columns\\nALTER TABLE users ADD COLUMN phone TEXT;\\nALTER TABLE users ADD COLUMN bio TEXT;\\nALTER TABLE users ADD COLUMN avatar_url TEXT;\\nALTER TABLE users ADD COLUMN timezone TEXT DEFAULT 'UTC';\\nALTER TABLE users ADD COLUMN language TEXT DEFAULT 'en';\\nALTER TABLE users ADD COLUMN email_notifications INTEGER DEFAULT 1;\\nALTER TABLE users ADD COLUMN theme TEXT DEFAULT 'dark';\\nALTER TABLE users ADD COLUMN two_factor_enabled INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN two_factor_secret TEXT;\\nALTER TABLE users ADD COLUMN password_reset_token TEXT;\\nALTER TABLE users ADD COLUMN password_reset_expires INTEGER;\\nALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN email_verification_token TEXT;\\nALTER TABLE users ADD COLUMN invitation_token TEXT;\\nALTER TABLE users ADD COLUMN invited_by TEXT REFERENCES users(id);\\nALTER TABLE users ADD COLUMN invited_at INTEGER;\\nALTER TABLE users ADD COLUMN accepted_invitation_at INTEGER;\\n\\n-- Create teams table for team-based collaboration\\nCREATE TABLE IF NOT EXISTS teams (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n slug TEXT NOT NULL UNIQUE,\\n owner_id TEXT NOT NULL REFERENCES users(id),\\n settings TEXT, -- JSON for team settings\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create team memberships table\\nCREATE TABLE IF NOT EXISTS team_memberships (\\n id TEXT PRIMARY KEY,\\n team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n role TEXT NOT NULL DEFAULT 'member', -- owner, admin, editor, member, viewer\\n permissions TEXT, -- JSON for specific permissions\\n joined_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(team_id, user_id)\\n);\\n\\n-- Create permissions table for granular access control\\nCREATE TABLE IF NOT EXISTS permissions (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n description TEXT,\\n category TEXT NOT NULL, -- content, users, collections, media, settings\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create role permissions mapping\\nCREATE TABLE IF NOT EXISTS role_permissions (\\n id TEXT PRIMARY KEY,\\n role TEXT NOT NULL,\\n permission_id TEXT NOT NULL REFERENCES permissions(id),\\n created_at INTEGER NOT NULL,\\n UNIQUE(role, permission_id)\\n);\\n\\n-- Create user sessions table for better session management\\nCREATE TABLE IF NOT EXISTS user_sessions (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n token_hash TEXT NOT NULL,\\n ip_address TEXT,\\n user_agent TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n expires_at INTEGER NOT NULL,\\n created_at INTEGER NOT NULL,\\n last_used_at INTEGER\\n);\\n\\n-- Create activity log table for audit trails\\nCREATE TABLE IF NOT EXISTS activity_logs (\\n id TEXT PRIMARY KEY,\\n user_id TEXT REFERENCES users(id),\\n action TEXT NOT NULL,\\n resource_type TEXT, -- users, content, collections, media, etc.\\n resource_id TEXT,\\n details TEXT, -- JSON with additional details\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create password history table for security\\nCREATE TABLE IF NOT EXISTS password_history (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n password_hash TEXT NOT NULL,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Insert default permissions\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at) VALUES\\n ('perm_content_create', 'content.create', 'Create new content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_read', 'content.read', 'View content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_update', 'content.update', 'Edit existing content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_delete', 'content.delete', 'Delete content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_publish', 'content.publish', 'Publish/unpublish content', 'content', strftime('%s', 'now') * 1000),\\n \\n ('perm_collections_create', 'collections.create', 'Create new collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_read', 'collections.read', 'View collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_update', 'collections.update', 'Edit collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_delete', 'collections.delete', 'Delete collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_fields', 'collections.fields', 'Manage collection fields', 'collections', strftime('%s', 'now') * 1000),\\n \\n ('perm_media_upload', 'media.upload', 'Upload media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_read', 'media.read', 'View media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_update', 'media.update', 'Edit media metadata', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_delete', 'media.delete', 'Delete media files', 'media', strftime('%s', 'now') * 1000),\\n \\n ('perm_users_create', 'users.create', 'Invite new users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_read', 'users.read', 'View user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_update', 'users.update', 'Edit user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_delete', 'users.delete', 'Deactivate users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_roles', 'users.roles', 'Manage user roles', 'users', strftime('%s', 'now') * 1000),\\n \\n ('perm_settings_read', 'settings.read', 'View system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_settings_update', 'settings.update', 'Modify system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_activity_read', 'activity.read', 'View activity logs', 'settings', strftime('%s', 'now') * 1000);\\n\\n-- Assign permissions to default roles\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at) VALUES\\n -- Admin has all permissions\\n ('rp_admin_content_create', 'admin', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_read', 'admin', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_update', 'admin', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_delete', 'admin', 'perm_content_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_publish', 'admin', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_create', 'admin', 'perm_collections_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_read', 'admin', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_update', 'admin', 'perm_collections_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_delete', 'admin', 'perm_collections_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_fields', 'admin', 'perm_collections_fields', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_upload', 'admin', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_read', 'admin', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_update', 'admin', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_delete', 'admin', 'perm_media_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_create', 'admin', 'perm_users_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_read', 'admin', 'perm_users_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_update', 'admin', 'perm_users_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_delete', 'admin', 'perm_users_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_roles', 'admin', 'perm_users_roles', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_read', 'admin', 'perm_settings_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_update', 'admin', 'perm_settings_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_activity_read', 'admin', 'perm_activity_read', strftime('%s', 'now') * 1000),\\n \\n -- Editor permissions\\n ('rp_editor_content_create', 'editor', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_read', 'editor', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_update', 'editor', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_publish', 'editor', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_editor_collections_read', 'editor', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_upload', 'editor', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_read', 'editor', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_update', 'editor', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_users_read', 'editor', 'perm_users_read', strftime('%s', 'now') * 1000),\\n \\n -- Viewer permissions\\n ('rp_viewer_content_read', 'viewer', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_collections_read', 'viewer', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_media_read', 'viewer', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_users_read', 'viewer', 'perm_users_read', strftime('%s', 'now') * 1000);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_team_id ON team_memberships(team_id);\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_user_id ON team_memberships(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_user_id ON user_sessions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_token_hash ON user_sessions(token_hash);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_user_id ON activity_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_created_at ON activity_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_resource ON activity_logs(resource_type, resource_id);\\nCREATE INDEX IF NOT EXISTS idx_password_history_user_id ON password_history(user_id);\\nCREATE INDEX IF NOT EXISTS idx_users_email_verification_token ON users(email_verification_token);\\nCREATE INDEX IF NOT EXISTS idx_users_password_reset_token ON users(password_reset_token);\\nCREATE INDEX IF NOT EXISTS idx_users_invitation_token ON users(invitation_token);\"\n },\n {\n id: '005',\n name: 'Stage7 Workflow Automation',\n filename: '005_stage7_workflow_automation.sql',\n description: 'Migration 005: Stage7 Workflow Automation',\n sql: \"-- Stage 7: Workflow & Automation Migration\\n-- This migration adds workflow and automation capabilities to SonicJS\\n\\n-- Workflow States Table\\nCREATE TABLE IF NOT EXISTS workflow_states (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n color TEXT DEFAULT '#6B7280',\\n is_initial INTEGER DEFAULT 0,\\n is_final INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Insert default workflow states\\nINSERT OR IGNORE INTO workflow_states (id, name, description, color, is_initial, is_final) VALUES\\n('draft', 'Draft', 'Content is being worked on', '#F59E0B', 1, 0),\\n('pending-review', 'Pending Review', 'Content is waiting for review', '#3B82F6', 0, 0),\\n('approved', 'Approved', 'Content has been approved', '#10B981', 0, 0),\\n('published', 'Published', 'Content is live', '#059669', 0, 1),\\n('rejected', 'Rejected', 'Content was rejected', '#EF4444', 0, 1),\\n('archived', 'Archived', 'Content has been archived', '#6B7280', 0, 1);\\n\\n-- Workflows Table\\nCREATE TABLE IF NOT EXISTS workflows (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT,\\n is_active INTEGER DEFAULT 1,\\n auto_publish INTEGER DEFAULT 0,\\n require_approval INTEGER DEFAULT 1,\\n approval_levels INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\\n);\\n\\n-- Workflow Transitions Table\\nCREATE TABLE IF NOT EXISTS workflow_transitions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT NOT NULL,\\n to_state_id TEXT NOT NULL,\\n required_permission TEXT,\\n auto_transition INTEGER DEFAULT 0,\\n transition_conditions TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE,\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id)\\n);\\n\\n-- Content Workflow Status Table\\nCREATE TABLE IF NOT EXISTS content_workflow_status (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n current_state_id TEXT NOT NULL,\\n assigned_to TEXT,\\n due_date DATETIME,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (current_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (assigned_to) REFERENCES users(id),\\n UNIQUE(content_id, workflow_id)\\n);\\n\\n-- Workflow History Table\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT,\\n to_state_id TEXT NOT NULL,\\n user_id TEXT NOT NULL,\\n comment TEXT,\\n metadata TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Scheduled Content Table\\nCREATE TABLE IF NOT EXISTS scheduled_content (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n action TEXT NOT NULL, -- 'publish', 'unpublish', 'archive'\\n scheduled_at DATETIME NOT NULL,\\n timezone TEXT DEFAULT 'UTC',\\n user_id TEXT NOT NULL,\\n status TEXT DEFAULT 'pending', -- 'pending', 'completed', 'failed', 'cancelled'\\n executed_at DATETIME,\\n error_message TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Notifications Table\\nCREATE TABLE IF NOT EXISTS notifications (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n type TEXT NOT NULL, -- 'workflow', 'schedule', 'system'\\n title TEXT NOT NULL,\\n message TEXT NOT NULL,\\n data TEXT, -- JSON\\n is_read INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\\n);\\n\\n-- Notification Preferences Table\\nCREATE TABLE IF NOT EXISTS notification_preferences (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n notification_type TEXT NOT NULL,\\n email_enabled INTEGER DEFAULT 1,\\n in_app_enabled INTEGER DEFAULT 1,\\n digest_frequency TEXT DEFAULT 'daily', -- 'immediate', 'hourly', 'daily', 'weekly'\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\\n UNIQUE(user_id, notification_type)\\n);\\n\\n-- Webhooks Table\\nCREATE TABLE IF NOT EXISTS webhooks (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n url TEXT NOT NULL,\\n secret TEXT,\\n events TEXT NOT NULL, -- JSON array of event types\\n is_active INTEGER DEFAULT 1,\\n retry_count INTEGER DEFAULT 3,\\n timeout_seconds INTEGER DEFAULT 30,\\n last_success_at DATETIME,\\n last_failure_at DATETIME,\\n failure_count INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Webhook Deliveries Table\\nCREATE TABLE IF NOT EXISTS webhook_deliveries (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n webhook_id TEXT NOT NULL,\\n event_type TEXT NOT NULL,\\n payload TEXT NOT NULL, -- JSON\\n response_status INTEGER,\\n response_body TEXT,\\n attempt_count INTEGER DEFAULT 1,\\n delivered_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE\\n);\\n\\n-- Content Versions Table (for rollback functionality)\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n version_number INTEGER NOT NULL,\\n title TEXT NOT NULL,\\n content TEXT NOT NULL,\\n fields TEXT, -- JSON\\n user_id TEXT NOT NULL,\\n change_summary TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, version_number)\\n);\\n\\n-- Automation Rules Table\\nCREATE TABLE IF NOT EXISTS automation_rules (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n trigger_type TEXT NOT NULL, -- 'content_created', 'content_updated', 'workflow_transition', 'schedule'\\n trigger_conditions TEXT, -- JSON\\n action_type TEXT NOT NULL, -- 'workflow_transition', 'send_notification', 'webhook_call', 'auto_save'\\n action_config TEXT, -- JSON\\n is_active INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Auto-save Drafts Table\\nCREATE TABLE IF NOT EXISTS auto_save_drafts (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT,\\n user_id TEXT NOT NULL,\\n title TEXT,\\n content TEXT,\\n fields TEXT, -- JSON\\n last_saved_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, user_id)\\n);\\n\\n-- Add workflow-related columns to existing content table (skip existing columns)\\nALTER TABLE content ADD COLUMN workflow_state_id TEXT DEFAULT 'draft';\\nALTER TABLE content ADD COLUMN embargo_until DATETIME;\\nALTER TABLE content ADD COLUMN expires_at DATETIME;\\nALTER TABLE content ADD COLUMN version_number INTEGER DEFAULT 1;\\nALTER TABLE content ADD COLUMN is_auto_saved INTEGER DEFAULT 0;\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_content_id ON content_workflow_status(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_workflow_id ON content_workflow_status(workflow_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content_id ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_scheduled_at ON scheduled_content(scheduled_at);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_status ON scheduled_content(status);\\nCREATE INDEX IF NOT EXISTS idx_notifications_user_id ON notifications(user_id);\\nCREATE INDEX IF NOT EXISTS idx_notifications_is_read ON notifications(is_read);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content_id ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_auto_save_drafts_user_id ON auto_save_drafts(user_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_state ON content(workflow_state_id);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\n\\n-- Insert default workflow for collections\\nINSERT OR IGNORE INTO workflows (id, name, description, collection_id, is_active, require_approval, approval_levels) \\nSELECT \\n 'default-' || id,\\n 'Default Workflow for ' || name,\\n 'Standard content approval workflow',\\n id,\\n 1,\\n 1,\\n 1\\nFROM collections;\\n\\n-- Insert default workflow transitions\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'draft',\\n 'pending-review',\\n 'content:submit'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'approved',\\n 'content:approve'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'approved',\\n 'published',\\n 'content:publish'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'rejected',\\n 'content:approve'\\nFROM workflows w;\\n\\n-- Insert default notification preferences for all users\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_assigned',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_status_change',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'content_scheduled',\\n 1,\\n 1\\nFROM users;\"\n },\n {\n id: '006',\n name: 'Plugin System',\n filename: '006_plugin_system.sql',\n description: 'Migration 006: Plugin System',\n sql: \"-- Plugin System Tables\\n-- Migration: 006_plugin_system\\n-- Description: Add plugin management system tables\\n\\n-- Plugins table\\nCREATE TABLE IF NOT EXISTS plugins (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n version TEXT NOT NULL,\\n author TEXT NOT NULL,\\n category TEXT NOT NULL,\\n icon TEXT,\\n status TEXT DEFAULT 'inactive' CHECK (status IN ('active', 'inactive', 'error')),\\n is_core BOOLEAN DEFAULT FALSE,\\n settings JSON,\\n permissions JSON,\\n dependencies JSON,\\n download_count INTEGER DEFAULT 0,\\n rating REAL DEFAULT 0,\\n installed_at INTEGER NOT NULL,\\n activated_at INTEGER,\\n last_updated INTEGER NOT NULL,\\n error_message TEXT,\\n created_at INTEGER DEFAULT (unixepoch()),\\n updated_at INTEGER DEFAULT (unixepoch())\\n);\\n\\n-- Plugin hooks table (registered hooks by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_hooks (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n hook_name TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n priority INTEGER DEFAULT 10,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, hook_name, handler_name)\\n);\\n\\n-- Plugin routes table\\nCREATE TABLE IF NOT EXISTS plugin_routes (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n path TEXT NOT NULL,\\n method TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n middleware JSON,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, path, method)\\n);\\n\\n-- Plugin assets table (CSS, JS files provided by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_assets (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n asset_type TEXT NOT NULL CHECK (asset_type IN ('css', 'js', 'image', 'font')),\\n asset_path TEXT NOT NULL,\\n load_order INTEGER DEFAULT 100,\\n load_location TEXT DEFAULT 'footer' CHECK (load_location IN ('header', 'footer')),\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Plugin activity log\\nCREATE TABLE IF NOT EXISTS plugin_activity_log (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n action TEXT NOT NULL,\\n user_id TEXT,\\n details JSON,\\n timestamp INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Create indexes\\nCREATE INDEX IF NOT EXISTS idx_plugins_status ON plugins(status);\\nCREATE INDEX IF NOT EXISTS idx_plugins_category ON plugins(category);\\nCREATE INDEX IF NOT EXISTS idx_plugin_hooks_plugin ON plugin_hooks(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_routes_plugin ON plugin_routes(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_assets_plugin ON plugin_assets(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_plugin ON plugin_activity_log(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_timestamp ON plugin_activity_log(timestamp);\\n\\n-- Insert core plugins\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES \\n(\\n 'core-auth',\\n 'core-auth',\\n 'Authentication System',\\n 'Core authentication and user management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔐',\\n 'active',\\n TRUE,\\n '[\\\"manage:users\\\", \\\"manage:roles\\\", \\\"manage:permissions\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-media',\\n 'core-media', \\n 'Media Manager',\\n 'Core media upload and management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'media',\\n '📸',\\n 'active',\\n TRUE,\\n '[\\\"manage:media\\\", \\\"upload:files\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-workflow',\\n 'core-workflow',\\n 'Workflow Engine',\\n 'Content workflow and approval system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin will be added as a third-party plugin through the admin interface\\n\\n-- Add plugin management permission\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at)\\nVALUES (\\n 'manage:plugins',\\n 'Manage Plugins',\\n 'Install, uninstall, activate, and configure plugins',\\n 'system',\\n unixepoch()\\n);\\n\\n-- Grant plugin management permission to admin role\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at)\\nVALUES ('role-perm-manage-plugins', 'admin', 'manage:plugins', unixepoch());\"\n },\n {\n id: '007',\n name: 'Demo Login Plugin',\n filename: '007_demo_login_plugin.sql',\n description: 'Migration 007: Demo Login Plugin',\n sql: \"-- Demo Login Plugin Migration\\n-- Migration: 007_demo_login_plugin\\n-- Description: Add demo login prefill plugin to the plugin registry\\n\\n-- Insert demo login plugin\\nINSERT INTO plugins (\\n id, name, display_name, description, version, author, category, icon, \\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'demo-login-prefill',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials (admin@sonicjs.com/sonicjs!) for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'inactive',\\n TRUE,\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\"\n },\n {\n id: '008',\n name: 'Fix Slug Validation',\n filename: '008_fix_slug_validation.sql',\n description: 'Migration 008: Fix Slug Validation',\n sql: \"-- Migration: Fix overly restrictive slug validation patterns\\n-- This migration relaxes the slug field validation to be more user-friendly\\n\\n-- Update the pages collection slug field to allow underscores and be less restrictive\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\\n-- Update any other slug fields with the restrictive pattern\\nUPDATE content_fields \\nSET field_options = REPLACE(field_options, '\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"', '\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\"')\\nWHERE field_options LIKE '%\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"%';\"\n },\n {\n id: '009',\n name: 'System Logging',\n filename: '009_system_logging.sql',\n description: 'Migration 009: System Logging',\n sql: \"-- System Logging Tables\\n-- Migration: 009_system_logging\\n-- Description: Add system logging and configuration tables\\n\\n-- System logs table for tracking application events\\nCREATE TABLE IF NOT EXISTS system_logs (\\n id TEXT PRIMARY KEY,\\n level TEXT NOT NULL CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n category TEXT NOT NULL CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n message TEXT NOT NULL,\\n data TEXT, -- JSON data\\n user_id TEXT,\\n session_id TEXT,\\n request_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n method TEXT,\\n url TEXT,\\n status_code INTEGER,\\n duration INTEGER, -- milliseconds\\n stack_trace TEXT,\\n tags TEXT, -- JSON array\\n source TEXT, -- source of the log entry\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Log configuration table for managing log settings per category\\nCREATE TABLE IF NOT EXISTS log_config (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL UNIQUE CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n enabled BOOLEAN NOT NULL DEFAULT TRUE,\\n level TEXT NOT NULL DEFAULT 'info' CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n retention_days INTEGER NOT NULL DEFAULT 30,\\n max_size_mb INTEGER NOT NULL DEFAULT 100,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_system_logs_level ON system_logs(level);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_category ON system_logs(category);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_created_at ON system_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_user_id ON system_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_status_code ON system_logs(status_code);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_source ON system_logs(source);\\n\\n-- Insert default log configurations\\nINSERT OR IGNORE INTO log_config (id, category, enabled, level, retention_days, max_size_mb) VALUES\\n('log-config-auth', 'auth', TRUE, 'info', 90, 50),\\n('log-config-api', 'api', TRUE, 'info', 30, 100),\\n('log-config-workflow', 'workflow', TRUE, 'info', 60, 50),\\n('log-config-plugin', 'plugin', TRUE, 'warn', 30, 25),\\n('log-config-media', 'media', TRUE, 'info', 30, 50),\\n('log-config-system', 'system', TRUE, 'info', 90, 100),\\n('log-config-security', 'security', TRUE, 'warn', 180, 100),\\n('log-config-error', 'error', TRUE, 'error', 90, 200);\"\n },\n {\n id: '011',\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql',\n description: 'Migration 011: Config Managed Collections',\n sql: \"-- Migration: Add Config-Managed Collections Support\\n-- Description: Add 'managed' column to collections table to support config-based collection definitions\\n-- Created: 2025-10-03\\n\\n-- Add 'managed' column to collections table\\n-- This column indicates whether a collection is managed by configuration files (true) or user-created (false)\\n-- Managed collections cannot be edited through the admin UI\\n-- Use a safe approach to add the column only if it doesn't exist\\nALTER TABLE collections ADD COLUMN managed INTEGER DEFAULT 0 NOT NULL;\\n\\n-- Create an index on the managed column for faster queries\\nCREATE INDEX IF NOT EXISTS idx_collections_managed ON collections(managed);\\n\\n-- Create an index on managed + is_active for efficient filtering\\nCREATE INDEX IF NOT EXISTS idx_collections_managed_active ON collections(managed, is_active);\\n\"\n },\n {\n id: '012',\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql',\n description: 'Migration 012: Testimonials Plugin',\n sql: \"-- Testimonials Plugin Migration\\n-- Creates testimonials table for the testimonials plugin\\n-- This demonstrates a code-based collection defined in src/plugins/core-plugins/testimonials-plugin.ts\\n\\nCREATE TABLE IF NOT EXISTS testimonials (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n author_name TEXT NOT NULL,\\n author_title TEXT,\\n author_company TEXT,\\n testimonial_text TEXT NOT NULL,\\n rating INTEGER CHECK(rating >= 1 AND rating <= 5),\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_testimonials_published ON testimonials(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_sort_order ON testimonials(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_rating ON testimonials(rating);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS testimonials_updated_at\\n AFTER UPDATE ON testimonials\\nBEGIN\\n UPDATE testimonials SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('testimonials',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support. This is a code-based collection example.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}');\\n\\n-- Insert sample testimonial data\\nINSERT OR IGNORE INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder) VALUES\\n('Jane Smith',\\n 'CTO',\\n 'TechStartup Inc',\\n 'SonicJS AI has transformed how we manage our content. The plugin architecture is brilliant and the edge deployment is blazing fast.',\\n 5,\\n 1,\\n 1),\\n\\n('Michael Chen',\\n 'Lead Developer',\\n 'Digital Agency Co',\\n 'We migrated from WordPress to SonicJS AI and couldn''t be happier. The TypeScript-first approach and modern tooling make development a joy.',\\n 5,\\n 1,\\n 2),\\n\\n('Sarah Johnson',\\n 'Product Manager',\\n 'E-commerce Solutions',\\n 'The headless CMS approach combined with Cloudflare Workers gives us unmatched performance. Our content is served globally with minimal latency.',\\n 4,\\n 1,\\n 3),\\n\\n('David Rodriguez',\\n 'Full Stack Developer',\\n 'Creative Studio',\\n 'Great CMS for modern web applications. The admin interface is clean and the API is well-designed. Plugin system is very flexible.',\\n 5,\\n 1,\\n 4),\\n\\n('Emily Watson',\\n 'Technical Director',\\n 'Media Company',\\n 'SonicJS AI solved our content distribution challenges. The R2 integration for media storage works flawlessly and scales effortlessly.',\\n 4,\\n 1,\\n 5);\\n\"\n },\n {\n id: '013',\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql',\n description: 'Migration 013: Code Examples Plugin',\n sql: \"-- Code Examples Plugin Migration\\n-- Creates code_examples table for the code examples plugin\\n-- This demonstrates a code-based collection for storing and managing code snippets\\n\\nCREATE TABLE IF NOT EXISTS code_examples (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n title TEXT NOT NULL,\\n description TEXT,\\n code TEXT NOT NULL,\\n language TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_code_examples_published ON code_examples(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_sort_order ON code_examples(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_language ON code_examples(language);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_category ON code_examples(category);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS code_examples_updated_at\\n AFTER UPDATE ON code_examples\\nBEGIN\\n UPDATE code_examples SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('code-examples',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support. Perfect for documentation and tutorials.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}');\\n\\n-- Insert sample code examples\\nINSERT OR IGNORE INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder) VALUES\\n('React useState Hook',\\n 'Basic example of using the useState hook in React for managing component state.',\\n 'import { useState } from ''react'';\\n\\nfunction Counter() {\\n const [count, setCount] = useState(0);\\n\\n return (\\n
\\n

Count: {count}

\\n \\n
\\n );\\n}\\n\\nexport default Counter;',\\n 'javascript',\\n 'frontend',\\n 'react,hooks,state',\\n 1,\\n 1),\\n\\n('TypeScript Interface Example',\\n 'Defining a TypeScript interface for type-safe objects.',\\n 'interface User {\\n id: string;\\n email: string;\\n name: string;\\n role: ''admin'' | ''editor'' | ''viewer'';\\n createdAt: Date;\\n}\\n\\nfunction greetUser(user: User): string {\\n return `Hello, ${user.name}!`;\\n}\\n\\nconst user: User = {\\n id: ''123'',\\n email: ''user@example.com'',\\n name: ''John Doe'',\\n role: ''admin'',\\n createdAt: new Date()\\n};\\n\\nconsole.log(greetUser(user));',\\n 'typescript',\\n 'backend',\\n 'typescript,types,interface',\\n 1,\\n 2),\\n\\n('Python List Comprehension',\\n 'Elegant way to create lists in Python using list comprehensions.',\\n '# Basic list comprehension\\nsquares = [x**2 for x in range(10)]\\nprint(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\\n\\n# With condition\\neven_squares = [x**2 for x in range(10) if x % 2 == 0]\\nprint(even_squares) # [0, 4, 16, 36, 64]\\n\\n# Nested list comprehension\\nmatrix = [[i+j for j in range(3)] for i in range(3)]\\nprint(matrix) # [[0, 1, 2], [1, 2, 3], [2, 3, 4]]',\\n 'python',\\n 'general',\\n 'python,lists,comprehension',\\n 1,\\n 3),\\n\\n('SQL Join Example',\\n 'Common SQL JOIN patterns for combining data from multiple tables.',\\n '-- INNER JOIN: Returns only matching rows\\nSELECT users.name, orders.total\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id;\\n\\n-- LEFT JOIN: Returns all users, even without orders\\nSELECT users.name, orders.total\\nFROM users\\nLEFT JOIN orders ON users.id = orders.user_id;\\n\\n-- Multiple JOINs\\nSELECT\\n users.name,\\n orders.order_date,\\n products.name AS product_name\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id\\nINNER JOIN order_items ON orders.id = order_items.order_id\\nINNER JOIN products ON order_items.product_id = products.id;',\\n 'sql',\\n 'database',\\n 'sql,joins,queries',\\n 1,\\n 4),\\n\\n('Go Error Handling',\\n 'Idiomatic error handling pattern in Go.',\\n 'package main\\n\\nimport (\\n\\t\\\"errors\\\"\\n\\t\\\"fmt\\\"\\n)\\n\\nfunc divide(a, b float64) (float64, error) {\\n\\tif b == 0 {\\n\\t\\treturn 0, errors.New(\\\"division by zero\\\")\\n\\t}\\n\\treturn a / b, nil\\n}\\n\\nfunc main() {\\n\\tresult, err := divide(10, 2)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t\\treturn\\n\\t}\\n\\tfmt.Printf(\\\"Result: %.2f\\\\n\\\", result)\\n\\n\\t// This will error\\n\\t_, err = divide(10, 0)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t}\\n}',\\n 'go',\\n 'backend',\\n 'go,error-handling,functions',\\n 1,\\n 5);\\n\"\n },\n {\n id: '014',\n name: 'Fix Plugin Registry',\n filename: '014_fix_plugin_registry.sql',\n description: 'Migration 014: Fix Plugin Registry',\n sql: \"-- Fix Plugin Registry\\n-- Migration: 014_fix_plugin_registry\\n-- Description: Add missing plugins and fix plugin name mismatches\\n\\n-- Note: Cannot easily update plugin names as they may be referenced elsewhere\\n-- Instead we'll add the missing plugins with correct names\\n\\n-- Insert missing plugins\\n\\n-- Core Analytics Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'core-analytics',\\n 'core-analytics',\\n 'Analytics & Tracking',\\n 'Core analytics tracking and reporting plugin with page views and event tracking',\\n '1.0.0',\\n 'SonicJS Team',\\n 'seo',\\n '📊',\\n 'active',\\n TRUE,\\n '[\\\"view:analytics\\\", \\\"manage:tracking\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'faq-plugin',\\n 'faq-plugin',\\n 'FAQ Management',\\n 'Frequently Asked Questions management plugin with categories, search, and custom styling',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '❓',\\n 'active',\\n FALSE,\\n '[\\\"manage:faqs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Seed Data Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'seed-data',\\n 'seed-data',\\n 'Seed Data Generator',\\n 'Generate realistic example users and content for testing and development',\\n '1.0.0',\\n 'SonicJS Team',\\n 'development',\\n '🌱',\\n 'inactive',\\n FALSE,\\n '[\\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Database Tools Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'database-tools',\\n 'database-tools',\\n 'Database Tools',\\n 'Database management tools including truncate, backup, and validation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'system',\\n '🗄️',\\n 'active',\\n FALSE,\\n '[\\\"manage:database\\\", \\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '015',\n name: 'Add Remaining Plugins',\n filename: '015_add_remaining_plugins.sql',\n description: 'Migration 015: Add Remaining Plugins',\n sql: \"-- Add Remaining Plugins\\n-- Migration: 015_add_remaining_plugins\\n-- Description: Add all remaining core plugins that were missing from the registry\\n\\n-- Testimonials Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'testimonials-plugin',\\n 'testimonials-plugin',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '⭐',\\n 'active',\\n FALSE,\\n '[\\\"manage:testimonials\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Code Examples Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'code-examples-plugin',\\n 'code-examples-plugin',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '💻',\\n 'active',\\n FALSE,\\n '[\\\"manage:code-examples\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Workflow Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'workflow-plugin',\\n 'workflow-plugin',\\n 'Workflow Engine',\\n 'Content workflow management with approval chains, scheduling, and automation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Demo Login Plugin (already exists with correct name from migration 007, but let's ensure it's there)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'demo-login-plugin',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '016',\n name: 'Remove Duplicate Cache Plugin',\n filename: '016_remove_duplicate_cache_plugin.sql',\n description: 'Migration 016: Remove Duplicate Cache Plugin',\n sql: \"-- Migration: Remove duplicate cache plugin entry\\n-- Description: Removes the old 'cache' plugin (id: 'cache') that is a duplicate of 'core-cache'\\n-- This fixes the issue where Cache System appears twice in the plugins list\\n-- Created: 2025-10-14\\n\\n-- Remove the old 'cache' plugin entry if it exists\\n-- The correct plugin is 'core-cache' which is managed by plugin-bootstrap.ts\\nDELETE FROM plugins WHERE id = 'cache' AND name = 'cache';\\n\\n-- Clean up any related entries in plugin activity log\\nDELETE FROM plugin_activity_log WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin hooks\\nDELETE FROM plugin_hooks WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin routes\\nDELETE FROM plugin_routes WHERE plugin_id = 'cache';\\n\"\n },\n {\n id: '017',\n name: 'Auth Configurable Fields',\n filename: '017_auth_configurable_fields.sql',\n description: 'Migration 017: Auth Configurable Fields',\n sql: \"-- Migration: Make authentication fields configurable\\n-- This migration updates the core-auth plugin to support configurable required fields\\n\\n-- The settings will be stored in the plugins table as JSON\\n-- Default settings for core-auth plugin include:\\n-- {\\n-- \\\"requiredFields\\\": {\\n-- \\\"email\\\": { \\\"required\\\": true, \\\"minLength\\\": 5 },\\n-- \\\"password\\\": { \\\"required\\\": true, \\\"minLength\\\": 8 },\\n-- \\\"username\\\": { \\\"required\\\": true, \\\"minLength\\\": 3 },\\n-- \\\"firstName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 },\\n-- \\\"lastName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 }\\n-- },\\n-- \\\"validation\\\": {\\n-- \\\"emailFormat\\\": true,\\n-- \\\"allowDuplicateUsernames\\\": false\\n-- }\\n-- }\\n\\n-- Update core-auth plugin settings with configurable field requirements\\nUPDATE plugins\\nSET settings = json_object(\\n 'requiredFields', json_object(\\n 'email', json_object('required', 1, 'minLength', 5, 'label', 'Email', 'type', 'email'),\\n 'password', json_object('required', 1, 'minLength', 8, 'label', 'Password', 'type', 'password'),\\n 'username', json_object('required', 1, 'minLength', 3, 'label', 'Username', 'type', 'text'),\\n 'firstName', json_object('required', 1, 'minLength', 1, 'label', 'First Name', 'type', 'text'),\\n 'lastName', json_object('required', 1, 'minLength', 1, 'label', 'Last Name', 'type', 'text')\\n ),\\n 'validation', json_object(\\n 'emailFormat', 1,\\n 'allowDuplicateUsernames', 0,\\n 'passwordRequirements', json_object(\\n 'requireUppercase', 0,\\n 'requireLowercase', 0,\\n 'requireNumbers', 0,\\n 'requireSpecialChars', 0\\n )\\n ),\\n 'registration', json_object(\\n 'enabled', 1,\\n 'requireEmailVerification', 0,\\n 'defaultRole', 'viewer'\\n )\\n)\\nWHERE id = 'core-auth';\\n\\n-- If core-auth plugin doesn't exist, this migration will be handled by bootstrap\\n-- No need to insert here as plugin bootstrap handles initial plugin creation\\n\"\n },\n {\n id: '018',\n name: 'Settings Table',\n filename: '018_settings_table.sql',\n description: 'Migration 018: Settings Table',\n sql: \"-- Create settings table for storing application settings\\nCREATE TABLE IF NOT EXISTS settings (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL, -- 'general', 'appearance', 'security', etc.\\n key TEXT NOT NULL,\\n value TEXT NOT NULL, -- JSON value\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(category, key)\\n);\\n\\n-- Insert default general settings\\nINSERT OR IGNORE INTO settings (id, category, key, value, created_at, updated_at)\\nVALUES\\n (lower(hex(randomblob(16))), 'general', 'siteName', '\\\"SonicJS AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'siteDescription', '\\\"A modern headless CMS powered by AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'timezone', '\\\"UTC\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'language', '\\\"en\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'maintenanceMode', 'false', unixepoch() * 1000, unixepoch() * 1000);\\n\\n-- Create index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);\\nCREATE INDEX IF NOT EXISTS idx_settings_category_key ON settings(category, key);\\n\"\n },\n {\n id: '019',\n name: 'Remove Blog Posts Collection',\n filename: '019_remove_blog_posts_collection.sql',\n description: 'Migration 019: Remove Blog Posts Collection',\n sql: \"-- Migration: Remove blog_posts from database-managed collections\\n-- Description: Remove blog-posts-collection from the database so it can be managed by code-based collection\\n-- Created: 2025-11-04\\n\\n-- Delete content associated with blog-posts-collection\\nDELETE FROM content WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete content fields for blog-posts-collection\\nDELETE FROM content_fields WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete the blog-posts collection itself\\nDELETE FROM collections WHERE id = 'blog-posts-collection';\\n\\n-- The blog-posts collection will now be managed by the code-based collection\\n-- in src/collections/blog-posts.collection.ts\\n\"\n },\n {\n id: '020',\n name: 'Add Email Plugin',\n filename: '020_add_email_plugin.sql',\n description: 'Migration 020: Add Email Plugin',\n sql: \"-- Add Email Plugin\\n-- Migration: 020_add_email_plugin\\n-- Description: Add email plugin for transactional emails via Resend\\n\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'email',\\n 'email',\\n 'Email',\\n 'Send transactional emails using Resend',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'utilities',\\n '📧',\\n 'inactive',\\n TRUE,\\n '[\\\"email:manage\\\", \\\"email:send\\\", \\\"email:view-logs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '021',\n name: 'Add Magic Link Auth Plugin',\n filename: '021_add_magic_link_auth_plugin.sql',\n description: 'Migration 021: Add Magic Link Auth Plugin',\n sql: \"-- Add Magic Link Authentication Plugin\\n-- Migration: 021_add_magic_link_auth_plugin\\n-- Description: Add magic link authentication plugin for passwordless login\\n\\n-- Create magic_links table\\nCREATE TABLE IF NOT EXISTS magic_links (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_magic_links_token ON magic_links(token);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_email ON magic_links(user_email);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_expires ON magic_links(expires_at);\\n\\n-- Register the plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'magic-link-auth',\\n 'magic-link-auth',\\n 'Magic Link Authentication',\\n 'Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔗',\\n 'inactive',\\n FALSE,\\n '[\\\"auth:manage\\\", \\\"auth:magic-link\\\"]',\\n '[\\\"email\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '022',\n name: 'Add Tinymce Plugin',\n filename: '022_add_tinymce_plugin.sql',\n description: 'Migration 022: Add Tinymce Plugin',\n sql: \"-- Add TinyMCE Rich Text Editor Plugin\\n-- Migration: 022_add_tinymce_plugin\\n-- Description: Add TinyMCE plugin for WYSIWYG rich text editing\\n\\n-- Register the plugin (active by default since it replaces hardcoded TinyMCE)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'tinymce-plugin',\\n 'tinymce-plugin',\\n 'TinyMCE Rich Text Editor',\\n 'Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✏️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"apiKey\\\":\\\"no-api-key\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"skin\\\":\\\"oxide-dark\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '023',\n name: 'Add Easy Mdx Plugin',\n filename: '023_add_easy_mdx_plugin.sql',\n description: 'Migration 023: Add Easy Mdx Plugin',\n sql: \"-- Add EasyMDE Markdown Editor Plugin\\n-- Migration: 023_add_easy_mdx_plugin\\n-- Description: Add EasyMDE plugin for lightweight markdown editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easy-mdx',\\n 'easy-mdx',\\n 'EasyMDE Markdown Editor',\\n 'Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '📝',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"defaultHeight\\\":400,\\\"theme\\\":\\\"dark\\\",\\\"toolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '024',\n name: 'Add Quill Editor Plugin',\n filename: '024_add_quill_editor_plugin.sql',\n description: 'Migration 024: Add Quill Editor Plugin',\n sql: \"-- Add Quill Rich Text Editor Plugin\\n-- Migration: 024_add_quill_editor_plugin\\n-- Description: Add Quill plugin for modern rich text editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'quill-editor',\\n 'quill-editor',\\n 'Quill Rich Text Editor',\\n 'Modern rich text editor for content creation. Provides a clean, intuitive WYSIWYG editor with customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"snow\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '025',\n name: 'Add Easymde Plugin',\n filename: '025_add_easymde_plugin.sql',\n description: 'Migration 025: Add Easymde Plugin',\n sql: \"-- Add EasyMDE Rich Text Editor Plugin\\n-- Migration: 025_add_easymde_plugin\\n-- Description: Add EasyMDE plugin for markdown-based rich text editing\\n\\n-- Register the plugin (inactive by default, replacing MDXEditor)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easymde-editor',\\n 'easymde-editor',\\n 'EasyMDE Editor',\\n 'Lightweight markdown editor for content creation. Simple, elegant WYSIWYG markdown editor with live preview, toolbar, and dark mode support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'inactive',\\n TRUE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"dark\\\",\\\"defaultHeight\\\":300,\\\"toolbar\\\":\\\"full\\\",\\\"spellChecker\\\":false,\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '026',\n name: 'Add Otp Login',\n filename: '026_add_otp_login.sql',\n description: 'Migration 026: Add Otp Login',\n sql: \"-- Add OTP Login Plugin\\n-- Migration: 021_add_otp_login\\n-- Description: Add OTP login plugin for passwordless authentication via email codes\\n\\n-- Create table for OTP codes\\nCREATE TABLE IF NOT EXISTS otp_codes (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n code TEXT NOT NULL,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n attempts INTEGER DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_otp_email_code ON otp_codes(user_email, code);\\nCREATE INDEX IF NOT EXISTS idx_otp_expires ON otp_codes(expires_at);\\nCREATE INDEX IF NOT EXISTS idx_otp_used ON otp_codes(used);\\n\\n-- Add plugin record\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'otp-login',\\n 'otp-login',\\n 'OTP Login',\\n 'Passwordless authentication via email one-time codes',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'security',\\n '🔢',\\n 'inactive',\\n TRUE,\\n '[\\\"otp:manage\\\", \\\"otp:request\\\", \\\"otp:verify\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '027',\n name: 'Fix Slug Field Type',\n filename: '027_fix_slug_field_type.sql',\n description: 'Migration 027: Fix Slug Field Type',\n sql: \"-- Migration: Fix slug field type\\n-- Description: Update slug fields to use 'slug' field type instead of 'text' for proper auto-generation\\n-- Created: 2026-01-10\\n\\n-- Update pages collection slug field to use 'slug' field type\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\"\n },\n {\n id: '028',\n name: 'Fix Slug Field Type In Schemas',\n filename: '028_fix_slug_field_type_in_schemas.sql',\n description: 'Migration 028: Fix Slug Field Type In Schemas',\n sql: \"-- Migration: Fix slug field type in collection schemas\\n-- Description: Update slug fields in collection schemas to use 'slug' type instead of 'string'\\n-- Created: 2026-01-10\\n\\n-- Update pages-collection schema\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'pages-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update blog-posts-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'blog-posts-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update news-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'news-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\"\n },\n {\n id: '029',\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql',\n description: 'Migration 029: Add Forms System',\n sql: \"-- Migration: 029_add_forms_system.sql\\n-- Description: Add Form.io integration for advanced form building\\n-- Date: January 23, 2026\\n-- Phase: 1 - Database Schema\\n\\n-- =====================================================\\n-- Table: forms\\n-- Description: Stores form definitions and configuration\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS forms (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE, -- Machine name (e.g., \\\"contact-form\\\")\\n display_name TEXT NOT NULL, -- Human name (e.g., \\\"Contact Form\\\")\\n description TEXT, -- Optional description\\n category TEXT DEFAULT 'general', -- Form category (contact, survey, registration, etc.)\\n \\n -- Form.io schema (JSON)\\n formio_schema TEXT NOT NULL, -- Complete Form.io JSON schema\\n \\n -- Settings\\n settings TEXT, -- JSON: {\\n -- emailNotifications: true,\\n -- notifyEmail: \\\"admin@example.com\\\",\\n -- successMessage: \\\"Thank you!\\\",\\n -- redirectUrl: \\\"/thank-you\\\",\\n -- allowAnonymous: true,\\n -- requireAuth: false,\\n -- maxSubmissions: null,\\n -- submitButtonText: \\\"Submit\\\",\\n -- saveProgress: true,\\n -- webhookUrl: null\\n -- }\\n \\n -- Status & Management\\n is_active INTEGER DEFAULT 1, -- Active/inactive flag\\n is_public INTEGER DEFAULT 1, -- Public (anyone) vs private (auth required)\\n managed INTEGER DEFAULT 0, -- Code-managed (like collections)\\n \\n -- Metadata\\n icon TEXT, -- Optional icon for admin UI\\n color TEXT, -- Optional color (hex) for admin UI\\n tags TEXT, -- JSON array of tags\\n \\n -- Stats\\n submission_count INTEGER DEFAULT 0, -- Total submissions received\\n view_count INTEGER DEFAULT 0, -- Form views (optional tracking)\\n \\n -- Ownership\\n created_by TEXT REFERENCES users(id), -- User who created the form\\n updated_by TEXT REFERENCES users(id), -- User who last updated\\n \\n -- Timestamps\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for forms\\nCREATE INDEX IF NOT EXISTS idx_forms_name ON forms(name);\\nCREATE INDEX IF NOT EXISTS idx_forms_category ON forms(category);\\nCREATE INDEX IF NOT EXISTS idx_forms_active ON forms(is_active);\\nCREATE INDEX IF NOT EXISTS idx_forms_public ON forms(is_public);\\nCREATE INDEX IF NOT EXISTS idx_forms_created_by ON forms(created_by);\\n\\n-- =====================================================\\n-- Table: form_submissions\\n-- Description: Stores submitted form data\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_submissions (\\n id TEXT PRIMARY KEY,\\n form_id TEXT NOT NULL REFERENCES forms(id) ON DELETE CASCADE,\\n \\n -- Submission data\\n submission_data TEXT NOT NULL, -- JSON: The actual form data submitted\\n \\n -- Submission metadata\\n status TEXT DEFAULT 'pending', -- pending, reviewed, approved, rejected, spam\\n submission_number INTEGER, -- Sequential number per form\\n \\n -- User information (if authenticated)\\n user_id TEXT REFERENCES users(id), -- Submitter user ID (if logged in)\\n user_email TEXT, -- Email from form (or user account)\\n \\n -- Tracking information\\n ip_address TEXT, -- IP address of submitter\\n user_agent TEXT, -- Browser user agent\\n referrer TEXT, -- Page that referred to form\\n utm_source TEXT, -- UTM tracking params\\n utm_medium TEXT,\\n utm_campaign TEXT,\\n \\n -- Review/Processing\\n reviewed_by TEXT REFERENCES users(id), -- Admin who reviewed\\n reviewed_at INTEGER, -- Review timestamp\\n review_notes TEXT, -- Admin notes\\n \\n -- Flags\\n is_spam INTEGER DEFAULT 0, -- Spam flag\\n is_archived INTEGER DEFAULT 0, -- Archived flag\\n \\n -- Timestamps\\n submitted_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for submissions\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_form_id ON form_submissions(form_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_status ON form_submissions(status);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_user_id ON form_submissions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_email ON form_submissions(user_email);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_submitted_at ON form_submissions(submitted_at);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_spam ON form_submissions(is_spam);\\n\\n-- Trigger to auto-increment submission_number per form\\nCREATE TRIGGER IF NOT EXISTS set_submission_number\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE form_submissions \\n SET submission_number = (\\n SELECT COUNT(*) \\n FROM form_submissions \\n WHERE form_id = NEW.form_id \\n AND id <= NEW.id\\n )\\n WHERE id = NEW.id;\\nEND;\\n\\n-- Trigger to update form submission_count\\nCREATE TRIGGER IF NOT EXISTS increment_form_submission_count\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE forms \\n SET submission_count = submission_count + 1,\\n updated_at = unixepoch() * 1000\\n WHERE id = NEW.form_id;\\nEND;\\n\\n-- =====================================================\\n-- Table: form_files (Optional)\\n-- Description: Link form submissions to uploaded files\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_files (\\n id TEXT PRIMARY KEY,\\n submission_id TEXT NOT NULL REFERENCES form_submissions(id) ON DELETE CASCADE,\\n media_id TEXT NOT NULL REFERENCES media(id) ON DELETE CASCADE,\\n field_name TEXT NOT NULL, -- Form field that uploaded this file\\n uploaded_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for form files\\nCREATE INDEX IF NOT EXISTS idx_form_files_submission ON form_files(submission_id);\\nCREATE INDEX IF NOT EXISTS idx_form_files_media ON form_files(media_id);\\n\\n-- =====================================================\\n-- Sample Data: Create a default contact form\\n-- =====================================================\\n\\nINSERT OR IGNORE INTO forms (\\n id,\\n name,\\n display_name,\\n description,\\n category,\\n formio_schema,\\n settings,\\n is_active,\\n is_public,\\n created_at,\\n updated_at\\n) VALUES (\\n 'default-contact-form',\\n 'contact',\\n 'Contact Form',\\n 'A simple contact form for getting in touch',\\n 'contact',\\n '{\\\"components\\\":[]}',\\n '{\\\"emailNotifications\\\":false,\\\"successMessage\\\":\\\"Thank you for your submission!\\\",\\\"submitButtonText\\\":\\\"Submit\\\",\\\"requireAuth\\\":false}',\\n 1,\\n 1,\\n unixepoch() * 1000,\\n unixepoch() * 1000\\n);\\n\"\n },\n {\n id: '030',\n name: 'Add Turnstile To Forms',\n filename: '030_add_turnstile_to_forms.sql',\n description: 'Migration 030: Add Turnstile To Forms',\n sql: \"-- Add Turnstile configuration to forms table\\n-- This allows per-form Turnstile settings with global fallback\\n\\n-- Add columns (D1 may not support CHECK constraints in ALTER TABLE)\\nALTER TABLE forms ADD COLUMN turnstile_enabled INTEGER DEFAULT 0;\\nALTER TABLE forms ADD COLUMN turnstile_settings TEXT;\\n\\n-- Set default to inherit global settings for existing forms\\nUPDATE forms \\nSET turnstile_settings = '{\\\"inherit\\\":true}' \\nWHERE turnstile_settings IS NULL;\\n\\n-- Add index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_forms_turnstile ON forms(turnstile_enabled);\\n\"\n },\n {\n id: '031',\n name: 'Ai Search Plugin',\n filename: '031_ai_search_plugin.sql',\n description: 'Migration 031: Ai Search Plugin',\n sql: \"-- AI Search plugin settings\\nCREATE TABLE IF NOT EXISTS ai_search_settings (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n enabled BOOLEAN DEFAULT 0,\\n ai_mode_enabled BOOLEAN DEFAULT 1,\\n selected_collections TEXT, -- JSON array of collection IDs to index\\n dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index\\n autocomplete_enabled BOOLEAN DEFAULT 1,\\n cache_duration INTEGER DEFAULT 1, -- hours\\n results_limit INTEGER DEFAULT 20,\\n index_media BOOLEAN DEFAULT 0,\\n index_status TEXT, -- JSON object with status per collection\\n last_indexed_at INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Search history/analytics\\nCREATE TABLE IF NOT EXISTS ai_search_history (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n query TEXT NOT NULL,\\n mode TEXT, -- 'ai' or 'keyword'\\n results_count INTEGER,\\n user_id INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index metadata tracking (per collection)\\nCREATE TABLE IF NOT EXISTS ai_search_index_meta (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n collection_id INTEGER NOT NULL,\\n collection_name TEXT NOT NULL, -- Cache collection name for display\\n total_items INTEGER DEFAULT 0,\\n indexed_items INTEGER DEFAULT 0,\\n last_sync_at INTEGER,\\n status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'\\n error_message TEXT,\\n UNIQUE(collection_id)\\n);\\n\\n-- Indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);\\n\"\n },\n {\n id: '032',\n name: 'User Profiles',\n filename: '032_user_profiles.sql',\n description: 'Migration 032: User Profiles',\n sql: \"-- User Profiles Table (Core Migration)\\n-- Stores extended user profile data separate from auth concerns\\n-- Required by admin-users.ts for user edit page profile management\\n--\\n-- Originally introduced as app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\\n-- in upstream PR #508. Core routes (admin-users.ts) were updated to query this table in PR #512,\\n-- but no corresponding core migration was added. This migration corrects that gap.\\n--\\n-- IF NOT EXISTS guards ensure idempotency for databases that already have the table\\n-- from the app-level migration.\\n\\nCREATE TABLE IF NOT EXISTS user_profiles (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,\\n\\n display_name TEXT,\\n bio TEXT,\\n company TEXT,\\n job_title TEXT,\\n website TEXT,\\n location TEXT,\\n date_of_birth INTEGER,\\n data TEXT DEFAULT '{}',\\n\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index for fast user lookups\\nCREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);\\n\\n-- Trigger to auto-update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS user_profiles_updated_at\\n AFTER UPDATE ON user_profiles\\nBEGIN\\n UPDATE user_profiles SET updated_at = strftime('%s', 'now') * 1000 WHERE id = NEW.id;\\nEND;\\n\"\n },\n {\n id: '033',\n name: 'Form Content Integration',\n filename: '033_form_content_integration.sql',\n description: 'Migration 033: Form Content Integration',\n sql: \"-- Migration 033: Form-Content Integration\\n-- Adds bridge columns to link forms to collections and submissions to content items\\n\\n-- Add source_type and source_id to collections for form-derived collections\\nALTER TABLE collections ADD COLUMN source_type TEXT DEFAULT 'user';\\nALTER TABLE collections ADD COLUMN source_id TEXT;\\n\\n-- Index for efficient lookup of form-derived collections\\nCREATE INDEX IF NOT EXISTS idx_collections_source ON collections(source_type, source_id);\\n\\n-- Add content_id to form_submissions for linking to content items\\nALTER TABLE form_submissions ADD COLUMN content_id TEXT REFERENCES content(id);\\n\\n-- Index for efficient lookup by content_id\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_content_id ON form_submissions(content_id);\\n\\n-- Create system user for anonymous form submissions\\nINSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\\nVALUES ('system-form-submission', 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', NULL, 'viewer', 0, strftime('%s','now') * 1000, strftime('%s','now') * 1000);\\n\"\n },\n {\n id: '034',\n name: 'Security Audit Plugin',\n filename: '034_security_audit_plugin.sql',\n description: 'Migration 034: Security Audit Plugin',\n sql: \"-- Security Audit Plugin\\n-- Tracks login attempts, registrations, and security events for monitoring and brute-force detection\\n\\nCREATE TABLE IF NOT EXISTS security_events (\\n id TEXT PRIMARY KEY,\\n event_type TEXT NOT NULL,\\n severity TEXT NOT NULL DEFAULT 'info',\\n user_id TEXT,\\n email TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n country_code TEXT,\\n request_path TEXT,\\n request_method TEXT,\\n details TEXT,\\n fingerprint TEXT,\\n blocked INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type);\\nCREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_security_events_email ON security_events(email);\\nCREATE INDEX IF NOT EXISTS idx_security_events_ip ON security_events(ip_address);\\nCREATE INDEX IF NOT EXISTS idx_security_events_severity ON security_events(severity);\\nCREATE INDEX IF NOT EXISTS idx_security_events_created ON security_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_security_events_fingerprint ON security_events(fingerprint);\\n\"\n },\n {\n id: '035',\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql',\n description: 'Migration 035: User Profiles Data Column',\n sql: \"-- Migration 035: Add data column to user_profiles (no-op)\\n--\\n-- This migration originally added a missing 'data' column to user_profiles.\\n-- Migration 032 has since been updated to include the column in the CREATE TABLE,\\n-- so on fresh installs the column already exists by the time this runs.\\n--\\n-- The ALTER TABLE has been removed to prevent \\\"duplicate column name: data\\\" errors\\n-- during fresh installs (GitHub issue #771). Wrangler's migration runner does not\\n-- gracefully handle duplicate column errors like the runtime MigrationService does.\\n--\\n-- Existing databases that ran the old 032 (without the data column) get the column\\n-- added at runtime by the core MigrationService, which skips duplicate-column errors.\\n--\\n-- This file is kept as a no-op so that wrangler's migration tracking remains\\n-- consistent (it tracks migrations by filename).\\nSELECT 1;\\n\"\n },\n {\n id: '036',\n name: 'Analytics Events',\n filename: '036_analytics_events.sql',\n description: 'Migration 036: Analytics Events',\n sql: \"-- Migration 036: Analytics Events Table\\n-- Provides storage for user behavior event tracking (page views, custom events)\\n\\nCREATE TABLE IF NOT EXISTS analytics_events (\\n id TEXT PRIMARY KEY,\\n event TEXT NOT NULL,\\n category TEXT NOT NULL DEFAULT 'user-activity',\\n properties TEXT,\\n user_id TEXT,\\n session_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n path TEXT,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_event ON analytics_events(event);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_category ON analytics_events(category);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_user_id ON analytics_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_session_id ON analytics_events(session_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_created_at ON analytics_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_path ON analytics_events(path);\\n\"\n }\n]\n\n// Map for quick lookup by ID\nexport const migrationsByIdMap = new Map(\n bundledMigrations.map(m => [m.id, m])\n)\n\n// Get migration SQL by ID\nexport function getMigrationSQLById(id: string): string | null {\n return migrationsByIdMap.get(id)?.sql ?? null\n}\n\n// Get all migration info (without SQL for lighter payloads)\nexport function getMigrationList(): Array> {\n return bundledMigrations.map(({ sql, ...rest }) => rest)\n}\n","import { D1Database } from '@cloudflare/workers-types'\nimport { bundledMigrations, getMigrationSQLById, type BundledMigration } from '../db/migrations-bundle'\n\nexport interface Migration {\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n}\n\nexport interface MigrationStatus {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Migration[]\n}\n\nexport class MigrationService {\n constructor(private db: D1Database) {}\n\n /**\n * Initialize the migrations tracking table\n */\n async initializeMigrationsTable(): Promise {\n const createTableQuery = `\n CREATE TABLE IF NOT EXISTS migrations (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n filename TEXT NOT NULL,\n applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n checksum TEXT\n )\n `\n\n await this.db.prepare(createTableQuery).run()\n }\n\n /**\n * Get all available migrations from the bundled migrations\n */\n async getAvailableMigrations(): Promise {\n const migrations: Migration[] = []\n\n // Get applied migrations from database\n const appliedResult = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at ASC'\n ).all()\n\n const appliedMigrations = new Map(\n appliedResult.results?.map((row: any) => [row.id, row]) || []\n )\n\n // Auto-detect applied migrations by checking if their tables exist\n await this.autoDetectAppliedMigrations(appliedMigrations)\n\n // Use bundled migrations as the source of truth\n for (const bundled of bundledMigrations) {\n const applied = appliedMigrations.has(bundled.id)\n const appliedData = appliedMigrations.get(bundled.id)\n\n migrations.push({\n id: bundled.id,\n name: bundled.name,\n filename: bundled.filename,\n description: bundled.description,\n applied,\n appliedAt: applied ? appliedData?.applied_at : undefined,\n size: bundled.sql.length\n })\n }\n\n return migrations\n }\n\n /**\n * Auto-detect applied migrations by checking if their tables exist\n */\n private async autoDetectAppliedMigrations(appliedMigrations: Map): Promise {\n // Check if basic schema tables exist (migration 001)\n if (!appliedMigrations.has('001')) {\n const hasBasicTables = await this.checkTablesExist(['users', 'content', 'collections', 'media'])\n if (hasBasicTables) {\n appliedMigrations.set('001', {\n id: '001',\n applied_at: new Date().toISOString(),\n name: 'Initial Schema',\n filename: '001_initial_schema.sql'\n })\n await this.markMigrationApplied('001', 'Initial Schema', '001_initial_schema.sql')\n }\n }\n\n // Check if FAQ tables exist (migration 002)\n // Migration 002 creates only the 'faqs' table\n if (!appliedMigrations.has('002')) {\n const hasFaqTables = await this.checkTablesExist(['faqs'])\n if (hasFaqTables) {\n appliedMigrations.set('002', {\n id: '002',\n applied_at: new Date().toISOString(),\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql'\n })\n await this.markMigrationApplied('002', 'Faq Plugin', '002_faq_plugin.sql')\n }\n }\n\n // Check if stage 5 enhancement tables exist (migration 003)\n // Migration 003 creates content_fields, content_relationships, workflow_templates tables\n if (!appliedMigrations.has('003')) {\n const hasStage5Tables = await this.checkTablesExist(['content_fields', 'content_relationships', 'workflow_templates'])\n if (hasStage5Tables) {\n appliedMigrations.set('003', {\n id: '003',\n applied_at: new Date().toISOString(),\n name: 'Stage 5 Enhancements',\n filename: '003_stage5_enhancements.sql'\n })\n await this.markMigrationApplied('003', 'Stage 5 Enhancements', '003_stage5_enhancements.sql')\n }\n }\n\n // Check if testimonials table exists (migration 012)\n if (!appliedMigrations.has('012')) {\n const hasTestimonialsTables = await this.checkTablesExist(['testimonials'])\n if (hasTestimonialsTables) {\n appliedMigrations.set('012', {\n id: '012',\n applied_at: new Date().toISOString(),\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql'\n })\n await this.markMigrationApplied('012', 'Testimonials Plugin', '012_testimonials_plugin.sql')\n }\n }\n\n // Check if code_examples table exists (migration 013)\n if (!appliedMigrations.has('013')) {\n const hasCodeExamplesTables = await this.checkTablesExist(['code_examples'])\n if (hasCodeExamplesTables) {\n appliedMigrations.set('013', {\n id: '013',\n applied_at: new Date().toISOString(),\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql'\n })\n await this.markMigrationApplied('013', 'Code Examples Plugin', '013_code_examples_plugin.sql')\n }\n }\n\n // Check if user management tables exist (migration 004)\n if (!appliedMigrations.has('004')) {\n const hasUserTables = await this.checkTablesExist(['api_tokens', 'workflow_history'])\n if (hasUserTables) {\n appliedMigrations.set('004', {\n id: '004',\n applied_at: new Date().toISOString(),\n name: 'User Management',\n filename: '004_stage6_user_management.sql'\n })\n await this.markMigrationApplied('004', 'User Management', '004_stage6_user_management.sql')\n }\n }\n\n // Check if plugin system tables exist (migration 006)\n if (!appliedMigrations.has('006')) {\n const hasPluginTables = await this.checkTablesExist(['plugins', 'plugin_hooks'])\n if (hasPluginTables) {\n appliedMigrations.set('006', {\n id: '006',\n applied_at: new Date().toISOString(),\n name: 'Plugin System',\n filename: '006_plugin_system.sql'\n })\n await this.markMigrationApplied('006', 'Plugin System', '006_plugin_system.sql')\n }\n }\n\n // Check if managed column exists (migration 011)\n // This handles both cases:\n // 1. Migration not marked as applied but column exists -> mark as applied\n // 2. Migration marked as applied but column doesn't exist -> remove from applied (will re-run)\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!appliedMigrations.has('011') && hasManagedColumn) {\n appliedMigrations.set('011', {\n id: '011',\n applied_at: new Date().toISOString(),\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql'\n })\n await this.markMigrationApplied('011', 'Config Managed Collections', '011_config_managed_collections.sql')\n } else if (appliedMigrations.has('011') && !hasManagedColumn) {\n // Migration was marked as applied but column doesn't exist - remove it so it will re-run\n console.log('[Migration] Migration 011 marked as applied but managed column missing - will re-run')\n appliedMigrations.delete('011')\n await this.removeMigrationApplied('011')\n }\n\n // Check if system_logs table exists (migration 009)\n if (!appliedMigrations.has('009')) {\n const hasLoggingTables = await this.checkTablesExist(['system_logs', 'log_config'])\n if (hasLoggingTables) {\n appliedMigrations.set('009', {\n id: '009',\n applied_at: new Date().toISOString(),\n name: 'System Logging',\n filename: '009_system_logging.sql'\n })\n await this.markMigrationApplied('009', 'System Logging', '009_system_logging.sql')\n }\n }\n\n // Check if settings table exists (migration 018)\n if (!appliedMigrations.has('018')) {\n const hasSettingsTable = await this.checkTablesExist(['settings'])\n if (hasSettingsTable) {\n appliedMigrations.set('018', {\n id: '018',\n applied_at: new Date().toISOString(),\n name: 'Settings Table',\n filename: '018_settings_table.sql'\n })\n await this.markMigrationApplied('018', 'Settings Table', '018_settings_table.sql')\n }\n }\n\n // Check if forms tables exist (migration 029)\n // Migration 029 was reassigned between releases: older versions used it for \"Ai Search Plugin\",\n // newer versions use it for \"Add Forms System\". This handles the case where 029 is marked as\n // applied (from the old AI Search migration) but the forms tables don't actually exist.\n const hasFormsTables = await this.checkTablesExist(['forms', 'form_submissions', 'form_files'])\n if (!appliedMigrations.has('029') && hasFormsTables) {\n appliedMigrations.set('029', {\n id: '029',\n applied_at: new Date().toISOString(),\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql'\n })\n await this.markMigrationApplied('029', 'Add Forms System', '029_add_forms_system.sql')\n } else if (appliedMigrations.has('029') && !hasFormsTables) {\n // Migration was marked as applied (possibly from old \"Ai Search Plugin\" migration)\n // but forms tables don't exist - remove it so the forms migration will re-run\n console.log('[Migration] Migration 029 marked as applied but forms tables missing - will re-run')\n appliedMigrations.delete('029')\n await this.removeMigrationApplied('029')\n }\n\n // Check if user_profiles table exists (migration 032)\n // Table may already exist from app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\n if (!appliedMigrations.has('032')) {\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n appliedMigrations.set('032', {\n id: '032',\n applied_at: new Date().toISOString(),\n name: 'User Profiles',\n filename: '032_user_profiles.sql'\n })\n await this.markMigrationApplied('032', 'User Profiles', '032_user_profiles.sql')\n }\n }\n\n // Ensure user_profiles.data column exists (migration 035 is now a no-op).\n // Databases that ran the old 032 (without data column) need the column added.\n // Migration 035 was converted to a no-op to fix #771 (duplicate column error\n // on fresh installs), so we add the column here if it's missing.\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n const hasDataColumn = await this.checkColumnExists('user_profiles', 'data')\n if (!hasDataColumn) {\n try {\n await this.db.prepare(`ALTER TABLE user_profiles ADD COLUMN data TEXT DEFAULT '{}'`).run()\n console.log('[Migration] Added missing data column to user_profiles')\n } catch (error) {\n // Column may have been added concurrently; ignore duplicate column errors\n const msg = error instanceof Error ? error.message : String(error)\n if (!msg.includes('duplicate column name')) {\n console.error('[Migration] Failed to add data column to user_profiles:', msg)\n }\n }\n }\n }\n\n // Mark migration 035 as applied since it's now a no-op (column handled above)\n if (!appliedMigrations.has('035')) {\n const hasDataCol = hasUserProfilesTable && await this.checkColumnExists('user_profiles', 'data')\n if (hasDataCol) {\n appliedMigrations.set('035', {\n id: '035',\n applied_at: new Date().toISOString(),\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql'\n })\n await this.markMigrationApplied('035', 'User Profiles Data Column', '035_user_profiles_data_column.sql')\n }\n }\n }\n\n /**\n * Check if specific tables exist in the database\n */\n private async checkTablesExist(tableNames: string[]): Promise {\n try {\n for (const tableName of tableNames) {\n const result = await this.db.prepare(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`\n ).bind(tableName).first()\n\n if (!result) {\n return false\n }\n }\n return true\n } catch (error) {\n return false\n }\n }\n\n /**\n * Check if a specific column exists in a table\n */\n private async checkColumnExists(tableName: string, columnName: string): Promise {\n try {\n const result = await this.db.prepare(\n `SELECT * FROM pragma_table_info(?) WHERE name = ?`\n ).bind(tableName, columnName).first()\n\n return !!result\n } catch (error) {\n return false\n }\n }\n\n /**\n * Get migration status summary\n */\n async getMigrationStatus(): Promise {\n await this.initializeMigrationsTable()\n\n const migrations = await this.getAvailableMigrations()\n const appliedMigrations = migrations.filter(m => m.applied)\n const pendingMigrations = migrations.filter(m => !m.applied)\n\n const lastApplied = appliedMigrations.length > 0\n ? appliedMigrations[appliedMigrations.length - 1]?.appliedAt\n : undefined\n\n return {\n totalMigrations: migrations.length,\n appliedMigrations: appliedMigrations.length,\n pendingMigrations: pendingMigrations.length,\n lastApplied,\n migrations\n }\n }\n\n /**\n * Mark a migration as applied\n */\n async markMigrationApplied(migrationId: string, name: string, filename: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'INSERT OR REPLACE INTO migrations (id, name, filename, applied_at) VALUES (?, ?, ?, CURRENT_TIMESTAMP)'\n ).bind(migrationId, name, filename).run()\n }\n\n /**\n * Remove a migration from the applied list (so it can be re-run)\n */\n async removeMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'DELETE FROM migrations WHERE id = ?'\n ).bind(migrationId).run()\n }\n\n /**\n * Check if a specific migration has been applied\n */\n async isMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM migrations WHERE id = ?'\n ).bind(migrationId).first()\n\n return (result?.count as number) > 0\n }\n\n /**\n * Get the last applied migration\n */\n async getLastAppliedMigration(): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at DESC LIMIT 1'\n ).first()\n\n if (!result) return null\n\n return {\n id: result.id as string,\n name: result.name as string,\n filename: result.filename as string,\n applied: true,\n appliedAt: result.applied_at as string\n }\n }\n\n /**\n * Run pending migrations\n */\n async runPendingMigrations(): Promise<{ success: boolean; message: string; applied: string[]; errors: string[] }> {\n await this.initializeMigrationsTable()\n\n const status = await this.getMigrationStatus()\n const pendingMigrations = status.migrations.filter(m => !m.applied)\n\n if (pendingMigrations.length === 0) {\n return {\n success: true,\n message: 'All migrations are up to date',\n applied: [],\n errors: []\n }\n }\n\n // Actually execute the migration files\n const applied: string[] = []\n const errors: string[] = []\n\n for (const migration of pendingMigrations) {\n try {\n console.log(`[Migration] Applying ${migration.id}: ${migration.name}`)\n await this.applyMigration(migration)\n await this.markMigrationApplied(migration.id, migration.name, migration.filename)\n applied.push(migration.id)\n console.log(`[Migration] Successfully applied ${migration.id}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`[Migration] Failed to apply migration ${migration.id}:`, errorMessage)\n errors.push(`${migration.id}: ${errorMessage}`)\n // Continue with other migrations instead of stopping on first failure\n // This allows independent migrations to still be applied\n }\n }\n\n if (errors.length > 0 && applied.length === 0) {\n return {\n success: false,\n message: `Failed to apply migrations: ${errors.join('; ')}`,\n applied,\n errors\n }\n }\n\n return {\n success: true,\n message: applied.length > 0\n ? `Applied ${applied.length} migration(s)${errors.length > 0 ? ` (${errors.length} failed)` : ''}`\n : 'No migrations applied',\n applied,\n errors\n }\n }\n\n /**\n * Apply a specific migration\n */\n private async applyMigration(migration: Migration): Promise {\n // Get the actual migration SQL from the bundle\n const migrationSQL = getMigrationSQLById(migration.id)\n\n if (migrationSQL === null) {\n throw new Error(`Migration SQL not found for ${migration.id}`)\n }\n\n if (migrationSQL.trim() === '') {\n console.log(`[Migration] Skipping empty migration ${migration.id}`)\n return\n }\n\n // Split SQL into individual statements, handling triggers properly\n const statements = this.splitSQLStatements(migrationSQL)\n\n for (const statement of statements) {\n if (statement.trim()) {\n try {\n await this.db.prepare(statement).run()\n } catch (error) {\n // Check if it's a \"already exists\" type error and skip it\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('already exists') ||\n errorMessage.includes('duplicate column name') ||\n errorMessage.includes('UNIQUE constraint failed')) {\n console.log(`[Migration] Skipping (already exists): ${statement.substring(0, 50)}...`)\n continue\n }\n console.error(`[Migration] Error executing statement: ${statement.substring(0, 100)}...`)\n throw error\n }\n }\n }\n }\n\n /**\n * Split SQL into statements, handling CREATE TRIGGER properly\n */\n private splitSQLStatements(sql: string): string[] {\n const statements: string[] = []\n let current = ''\n let inTrigger = false\n\n const lines = sql.split('\\n')\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n // Skip comments and empty lines\n if (trimmed.startsWith('--') || trimmed.length === 0) {\n continue\n }\n\n // Check if we're entering a trigger\n if (trimmed.toUpperCase().includes('CREATE TRIGGER')) {\n inTrigger = true\n }\n\n current += line + '\\n'\n\n // Check if we're exiting a trigger\n if (inTrigger && trimmed.toUpperCase() === 'END;') {\n statements.push(current.trim())\n current = ''\n inTrigger = false\n }\n // Check for regular statement end (not in trigger)\n else if (!inTrigger && trimmed.endsWith(';')) {\n statements.push(current.trim())\n current = ''\n }\n }\n\n // Add any remaining statement\n if (current.trim()) {\n statements.push(current.trim())\n }\n\n return statements.filter(s => s.length > 0)\n }\n\n /**\n * Validate database schema\n */\n async validateSchema(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n // Basic table existence checks\n const requiredTables = [\n 'users', 'content', 'collections', 'media'\n ]\n\n for (const table of requiredTables) {\n try {\n await this.db.prepare(`SELECT COUNT(*) FROM ${table} LIMIT 1`).first()\n } catch (error) {\n issues.push(`Missing table: ${table}`)\n }\n }\n\n // Check for managed column in collections\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!hasManagedColumn) {\n issues.push('Missing column: collections.managed')\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/db/migrations-bundle.ts","../src/services/migrations.ts"],"names":["hasUserProfilesTable"],"mappings":"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","file":"chunk-7KR6GOY3.cjs","sourcesContent":["/**\n * AUTO-GENERATED FILE - DO NOT EDIT\n * Generated by: scripts/generate-migrations.ts\n * Generated at: 2026-05-01T00:32:37.853Z\n *\n * This file contains all migration SQL bundled for use in Cloudflare Workers\n * where filesystem access is not available at runtime.\n */\n\nexport interface BundledMigration {\n id: string\n name: string\n filename: string\n description: string\n sql: string\n}\n\nexport const bundledMigrations: BundledMigration[] = [\n {\n id: '001',\n name: 'Initial Schema',\n filename: '001_initial_schema.sql',\n description: 'Migration 001: Initial Schema',\n sql: \"-- Initial schema for SonicJS AI\\n-- Create users table for authentication\\nCREATE TABLE IF NOT EXISTS users (\\n id TEXT PRIMARY KEY,\\n email TEXT NOT NULL UNIQUE,\\n username TEXT NOT NULL UNIQUE,\\n first_name TEXT NOT NULL,\\n last_name TEXT NOT NULL,\\n password_hash TEXT,\\n role TEXT NOT NULL DEFAULT 'viewer',\\n avatar TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n last_login_at INTEGER,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create collections table for content schema definitions\\nCREATE TABLE IF NOT EXISTS collections (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n schema TEXT NOT NULL, -- JSON schema definition\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content table for actual content data\\nCREATE TABLE IF NOT EXISTS content (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n slug TEXT NOT NULL,\\n title TEXT NOT NULL,\\n data TEXT NOT NULL, -- JSON content data\\n status TEXT NOT NULL DEFAULT 'draft',\\n published_at INTEGER,\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content_versions table for versioning\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n version INTEGER NOT NULL,\\n data TEXT NOT NULL, -- JSON data\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create media/files table with comprehensive R2 integration\\nCREATE TABLE IF NOT EXISTS media (\\n id TEXT PRIMARY KEY,\\n filename TEXT NOT NULL,\\n original_name TEXT NOT NULL,\\n mime_type TEXT NOT NULL,\\n size INTEGER NOT NULL,\\n width INTEGER,\\n height INTEGER,\\n folder TEXT NOT NULL DEFAULT 'uploads',\\n r2_key TEXT NOT NULL, -- R2 storage key\\n public_url TEXT NOT NULL, -- CDN URL\\n thumbnail_url TEXT, -- Cloudflare Images URL\\n alt TEXT,\\n caption TEXT,\\n tags TEXT, -- JSON array of tags\\n uploaded_by TEXT NOT NULL REFERENCES users(id),\\n uploaded_at INTEGER NOT NULL,\\n updated_at INTEGER,\\n published_at INTEGER,\\n scheduled_at INTEGER,\\n archived_at INTEGER,\\n deleted_at INTEGER\\n);\\n\\n-- Create API tokens table for programmatic access\\nCREATE TABLE IF NOT EXISTS api_tokens (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n permissions TEXT NOT NULL, -- JSON array of permissions\\n expires_at INTEGER,\\n last_used_at INTEGER,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create workflow history table for content workflow tracking\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n action TEXT NOT NULL,\\n from_status TEXT NOT NULL,\\n to_status TEXT NOT NULL,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n comment TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\\nCREATE INDEX IF NOT EXISTS idx_users_username ON users(username);\\nCREATE INDEX IF NOT EXISTS idx_users_role ON users(role);\\n\\nCREATE INDEX IF NOT EXISTS idx_collections_name ON collections(name);\\nCREATE INDEX IF NOT EXISTS idx_collections_active ON collections(is_active);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_collection ON content(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_author ON content(author_id);\\nCREATE INDEX IF NOT EXISTS idx_content_status ON content(status);\\nCREATE INDEX IF NOT EXISTS idx_content_published ON content(published_at);\\nCREATE INDEX IF NOT EXISTS idx_content_slug ON content(slug);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_version ON content_versions(version);\\n\\nCREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);\\nCREATE INDEX IF NOT EXISTS idx_media_type ON media(mime_type);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_by ON media(uploaded_by);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_at ON media(uploaded_at);\\nCREATE INDEX IF NOT EXISTS idx_media_deleted ON media(deleted_at);\\n\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_user ON api_tokens(user_id);\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_token ON api_tokens(token);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_user ON workflow_history(user_id);\\n\\n-- Note: Admin user is created via the seed script with user-provided credentials\\n-- Run 'npm run seed' after migrations to create the admin user\\n\\n-- Insert sample collections\\nINSERT OR IGNORE INTO collections (\\n id, name, display_name, description, schema, \\n is_active, created_at, updated_at\\n) VALUES (\\n 'blog-posts-collection',\\n 'blog_posts',\\n 'Blog Posts',\\n 'Blog post content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"excerpt\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Excerpt\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"},\\\"tags\\\":{\\\"type\\\":\\\"array\\\",\\\"title\\\":\\\"Tags\\\",\\\"items\\\":{\\\"type\\\":\\\"string\\\"}},\\\"status\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Status\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"],\\\"default\\\":\\\"draft\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'pages-collection',\\n 'pages',\\n 'Pages',\\n 'Static page content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"slug\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Slug\\\"},\\\"meta_description\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Meta Description\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'news-collection',\\n 'news',\\n 'News',\\n 'News article content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"publish_date\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Publish Date\\\",\\\"format\\\":\\\"date\\\"},\\\"author\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Author\\\"},\\\"category\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Category\\\",\\\"enum\\\":[\\\"technology\\\",\\\"business\\\",\\\"general\\\"]}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Note: Sample content can be created via the admin interface after the admin user is seeded\"\n },\n {\n id: '002',\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql',\n description: 'Migration 002: Faq Plugin',\n sql: \"-- FAQ Plugin Migration (DEPRECATED - Now managed by third-party plugin)\\n-- Creates FAQ table for the FAQ plugin\\n-- NOTE: This migration is kept for historical purposes. \\n-- The FAQ functionality is now provided by the faq-plugin third-party plugin.\\n\\nCREATE TABLE IF NOT EXISTS faqs (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n question TEXT NOT NULL,\\n answer TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_faqs_category ON faqs(category);\\nCREATE INDEX IF NOT EXISTS idx_faqs_published ON faqs(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_faqs_sort_order ON faqs(sortOrder);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS faqs_updated_at\\n AFTER UPDATE ON faqs\\nBEGIN\\n UPDATE faqs SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert sample FAQ data\\nINSERT OR IGNORE INTO faqs (question, answer, category, tags, isPublished, sortOrder) VALUES \\n('What is SonicJS AI?', \\n'SonicJS AI is a modern, TypeScript-first headless CMS built for Cloudflare''s edge platform. It provides a complete content management system with admin interface, API endpoints, and plugin architecture.',\\n'general',\\n'sonicjs, cms, cloudflare',\\n1,\\n1),\\n\\n('How do I get started with SonicJS AI?',\\n'To get started: 1) Clone the repository, 2) Install dependencies with npm install, 3) Set up your Cloudflare account and services, 4) Run the development server with npm run dev, 5) Access the admin interface at /admin.',\\n'general',\\n'getting-started, setup',\\n1,\\n2),\\n\\n('What technologies does SonicJS AI use?',\\n'SonicJS AI is built with: TypeScript for type safety, Hono.js as the web framework, Cloudflare D1 for the database, Cloudflare R2 for media storage, Cloudflare Workers for serverless execution, and Tailwind CSS for styling.',\\n'technical',\\n'technology-stack, typescript, cloudflare',\\n1,\\n3),\\n\\n('How do I create content in SonicJS AI?',\\n'Content creation is done through the admin interface. Navigate to /admin, log in with your credentials, go to Content section, select a collection, and click \\\"New Content\\\" to create articles, pages, or other content types.',\\n'general',\\n'content-creation, admin',\\n1,\\n4),\\n\\n('Is SonicJS AI free to use?',\\n'SonicJS AI is open source and free to use. You only pay for the Cloudflare services you consume (D1 database, R2 storage, Workers execution time). Cloudflare offers generous free tiers for development and small projects.',\\n'billing',\\n'pricing, open-source, cloudflare',\\n1,\\n5),\\n\\n('How do I add custom functionality?',\\n'SonicJS AI features a plugin system that allows you to extend functionality. You can create plugins using the PluginBuilder API, add custom routes, models, admin pages, and integrate with external services.',\\n'technical',\\n'plugins, customization, development',\\n1,\\n6),\\n\\n('Can I customize the admin interface?',\\n'Yes! The admin interface is built with TypeScript templates and can be customized. You can modify existing templates, create new components, add custom pages, and integrate your own styling while maintaining the dark theme.',\\n'technical',\\n'admin-interface, customization, templates',\\n1,\\n7),\\n\\n('How does authentication work?',\\n'SonicJS AI includes a built-in authentication system with JWT tokens, role-based access control (admin, editor, viewer), secure password hashing, and session management. Users can be managed through the admin interface.',\\n'technical',\\n'authentication, security, users',\\n1,\\n8);\"\n },\n {\n id: '003',\n name: 'Stage5 Enhancements',\n filename: '003_stage5_enhancements.sql',\n description: 'Migration 003: Stage5 Enhancements',\n sql: \"-- Stage 5: Advanced Content Management enhancements\\n-- Add scheduling and workflow features to content table\\n\\n-- Add content scheduling columns\\nALTER TABLE content ADD COLUMN scheduled_publish_at INTEGER;\\nALTER TABLE content ADD COLUMN scheduled_unpublish_at INTEGER;\\n\\n-- Add workflow and review columns\\nALTER TABLE content ADD COLUMN review_status TEXT DEFAULT 'none'; -- none, pending, approved, rejected\\nALTER TABLE content ADD COLUMN reviewer_id TEXT REFERENCES users(id);\\nALTER TABLE content ADD COLUMN reviewed_at INTEGER;\\nALTER TABLE content ADD COLUMN review_notes TEXT;\\n\\n-- Add content metadata\\nALTER TABLE content ADD COLUMN meta_title TEXT;\\nALTER TABLE content ADD COLUMN meta_description TEXT;\\nALTER TABLE content ADD COLUMN featured_image_id TEXT REFERENCES media(id);\\nALTER TABLE content ADD COLUMN content_type TEXT DEFAULT 'standard'; -- standard, template, component\\n\\n-- Create content_fields table for dynamic field definitions\\nCREATE TABLE IF NOT EXISTS content_fields (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n field_name TEXT NOT NULL,\\n field_type TEXT NOT NULL, -- text, richtext, number, boolean, date, select, media, relationship\\n field_label TEXT NOT NULL,\\n field_options TEXT, -- JSON for select options, validation rules, etc.\\n field_order INTEGER NOT NULL DEFAULT 0,\\n is_required INTEGER NOT NULL DEFAULT 0,\\n is_searchable INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(collection_id, field_name)\\n);\\n\\n-- Create content_relationships table for content relationships\\nCREATE TABLE IF NOT EXISTS content_relationships (\\n id TEXT PRIMARY KEY,\\n source_content_id TEXT NOT NULL REFERENCES content(id),\\n target_content_id TEXT NOT NULL REFERENCES content(id),\\n relationship_type TEXT NOT NULL, -- references, tags, categories\\n created_at INTEGER NOT NULL,\\n UNIQUE(source_content_id, target_content_id, relationship_type)\\n);\\n\\n-- Create workflow_templates table for reusable workflows\\nCREATE TABLE IF NOT EXISTS workflow_templates (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT REFERENCES collections(id), -- null means applies to all collections\\n workflow_steps TEXT NOT NULL, -- JSON array of workflow steps\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Add indexes for new columns\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_unpublish ON content(scheduled_unpublish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_review_status ON content(review_status);\\nCREATE INDEX IF NOT EXISTS idx_content_reviewer ON content(reviewer_id);\\nCREATE INDEX IF NOT EXISTS idx_content_content_type ON content(content_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_fields_collection ON content_fields(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_name ON content_fields(field_name);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_type ON content_fields(field_type);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_order ON content_fields(field_order);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_source ON content_relationships(source_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_target ON content_relationships(target_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_type ON content_relationships(relationship_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_collection ON workflow_templates(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_active ON workflow_templates(is_active);\\n\\n-- Insert default workflow template\\nINSERT OR IGNORE INTO workflow_templates (\\n id, name, description, workflow_steps, is_active, created_at, updated_at\\n) VALUES (\\n 'default-content-workflow',\\n 'Default Content Workflow',\\n 'Standard content workflow: Draft → Review → Published',\\n '[\\n {\\\"step\\\": \\\"draft\\\", \\\"name\\\": \\\"Draft\\\", \\\"description\\\": \\\"Content is being created\\\", \\\"permissions\\\": [\\\"author\\\", \\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"review\\\", \\\"name\\\": \\\"Under Review\\\", \\\"description\\\": \\\"Content is pending review\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"published\\\", \\\"name\\\": \\\"Published\\\", \\\"description\\\": \\\"Content is live\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"archived\\\", \\\"name\\\": \\\"Archived\\\", \\\"description\\\": \\\"Content is archived\\\", \\\"permissions\\\": [\\\"admin\\\"]}\\n ]',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Insert enhanced field definitions for existing collections\\nINSERT OR IGNORE INTO content_fields (\\n id, collection_id, field_name, field_type, field_label, field_options, field_order, is_required, is_searchable, created_at, updated_at\\n) VALUES \\n-- Blog Posts fields\\n('blog-title-field', 'blog-posts-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter blog post title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-content-field', 'blog-posts-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-excerpt-field', 'blog-posts-collection', 'excerpt', 'text', 'Excerpt', '{\\\"maxLength\\\": 500, \\\"rows\\\": 3, \\\"placeholder\\\": \\\"Brief description of the post\\\"}', 3, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-tags-field', 'blog-posts-collection', 'tags', 'select', 'Tags', '{\\\"multiple\\\": true, \\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"tutorial\\\", \\\"news\\\", \\\"update\\\"], \\\"allowCustom\\\": true}', 4, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-image-field', 'blog-posts-collection', 'featured_image', 'media', 'Featured Image', '{\\\"accept\\\": \\\"image/*\\\", \\\"maxSize\\\": \\\"5MB\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-publish-date-field', 'blog-posts-collection', 'publish_date', 'date', 'Publish Date', '{\\\"format\\\": \\\"YYYY-MM-DD\\\", \\\"defaultToday\\\": true}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-field', 'blog-posts-collection', 'is_featured', 'boolean', 'Featured Post', '{\\\"default\\\": false}', 7, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- Pages fields\\n('pages-title-field', 'pages-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter page title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-content-field', 'pages-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 500}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-slug-field', 'pages-collection', 'slug', 'text', 'URL Slug', '{\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\"}', 3, 1, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-meta-desc-field', 'pages-collection', 'meta_description', 'text', 'Meta Description', '{\\\"maxLength\\\": 160, \\\"rows\\\": 2, \\\"placeholder\\\": \\\"SEO description for search engines\\\"}', 4, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-template-field', 'pages-collection', 'template', 'select', 'Page Template', '{\\\"options\\\": [\\\"default\\\", \\\"landing\\\", \\\"contact\\\", \\\"about\\\"], \\\"default\\\": \\\"default\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- News fields\\n('news-title-field', 'news-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter news title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-content-field', 'news-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"news\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-category-field', 'news-collection', 'category', 'select', 'Category', '{\\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"politics\\\", \\\"sports\\\", \\\"entertainment\\\", \\\"health\\\"], \\\"required\\\": true}', 3, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-author-field', 'news-collection', 'author', 'text', 'Author', '{\\\"placeholder\\\": \\\"Author name\\\"}', 4, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-source-field', 'news-collection', 'source', 'text', 'Source', '{\\\"placeholder\\\": \\\"News source\\\"}', 5, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-priority-field', 'news-collection', 'priority', 'select', 'Priority', '{\\\"options\\\": [\\\"low\\\", \\\"normal\\\", \\\"high\\\", \\\"breaking\\\"], \\\"default\\\": \\\"normal\\\"}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000);\"\n },\n {\n id: '004',\n name: 'Stage6 User Management',\n filename: '004_stage6_user_management.sql',\n description: 'Migration 004: Stage6 User Management',\n sql: \"-- Stage 6: User Management & Permissions enhancements\\n-- Enhanced user system with profiles, teams, permissions, and activity logging\\n\\n-- Add user profile and preferences columns\\nALTER TABLE users ADD COLUMN phone TEXT;\\nALTER TABLE users ADD COLUMN bio TEXT;\\nALTER TABLE users ADD COLUMN avatar_url TEXT;\\nALTER TABLE users ADD COLUMN timezone TEXT DEFAULT 'UTC';\\nALTER TABLE users ADD COLUMN language TEXT DEFAULT 'en';\\nALTER TABLE users ADD COLUMN email_notifications INTEGER DEFAULT 1;\\nALTER TABLE users ADD COLUMN theme TEXT DEFAULT 'dark';\\nALTER TABLE users ADD COLUMN two_factor_enabled INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN two_factor_secret TEXT;\\nALTER TABLE users ADD COLUMN password_reset_token TEXT;\\nALTER TABLE users ADD COLUMN password_reset_expires INTEGER;\\nALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN email_verification_token TEXT;\\nALTER TABLE users ADD COLUMN invitation_token TEXT;\\nALTER TABLE users ADD COLUMN invited_by TEXT REFERENCES users(id);\\nALTER TABLE users ADD COLUMN invited_at INTEGER;\\nALTER TABLE users ADD COLUMN accepted_invitation_at INTEGER;\\n\\n-- Create teams table for team-based collaboration\\nCREATE TABLE IF NOT EXISTS teams (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n slug TEXT NOT NULL UNIQUE,\\n owner_id TEXT NOT NULL REFERENCES users(id),\\n settings TEXT, -- JSON for team settings\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create team memberships table\\nCREATE TABLE IF NOT EXISTS team_memberships (\\n id TEXT PRIMARY KEY,\\n team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n role TEXT NOT NULL DEFAULT 'member', -- owner, admin, editor, member, viewer\\n permissions TEXT, -- JSON for specific permissions\\n joined_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(team_id, user_id)\\n);\\n\\n-- Create permissions table for granular access control\\nCREATE TABLE IF NOT EXISTS permissions (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n description TEXT,\\n category TEXT NOT NULL, -- content, users, collections, media, settings\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create role permissions mapping\\nCREATE TABLE IF NOT EXISTS role_permissions (\\n id TEXT PRIMARY KEY,\\n role TEXT NOT NULL,\\n permission_id TEXT NOT NULL REFERENCES permissions(id),\\n created_at INTEGER NOT NULL,\\n UNIQUE(role, permission_id)\\n);\\n\\n-- Create user sessions table for better session management\\nCREATE TABLE IF NOT EXISTS user_sessions (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n token_hash TEXT NOT NULL,\\n ip_address TEXT,\\n user_agent TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n expires_at INTEGER NOT NULL,\\n created_at INTEGER NOT NULL,\\n last_used_at INTEGER\\n);\\n\\n-- Create activity log table for audit trails\\nCREATE TABLE IF NOT EXISTS activity_logs (\\n id TEXT PRIMARY KEY,\\n user_id TEXT REFERENCES users(id),\\n action TEXT NOT NULL,\\n resource_type TEXT, -- users, content, collections, media, etc.\\n resource_id TEXT,\\n details TEXT, -- JSON with additional details\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create password history table for security\\nCREATE TABLE IF NOT EXISTS password_history (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n password_hash TEXT NOT NULL,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Insert default permissions\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at) VALUES\\n ('perm_content_create', 'content.create', 'Create new content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_read', 'content.read', 'View content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_update', 'content.update', 'Edit existing content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_delete', 'content.delete', 'Delete content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_publish', 'content.publish', 'Publish/unpublish content', 'content', strftime('%s', 'now') * 1000),\\n \\n ('perm_collections_create', 'collections.create', 'Create new collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_read', 'collections.read', 'View collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_update', 'collections.update', 'Edit collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_delete', 'collections.delete', 'Delete collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_fields', 'collections.fields', 'Manage collection fields', 'collections', strftime('%s', 'now') * 1000),\\n \\n ('perm_media_upload', 'media.upload', 'Upload media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_read', 'media.read', 'View media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_update', 'media.update', 'Edit media metadata', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_delete', 'media.delete', 'Delete media files', 'media', strftime('%s', 'now') * 1000),\\n \\n ('perm_users_create', 'users.create', 'Invite new users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_read', 'users.read', 'View user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_update', 'users.update', 'Edit user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_delete', 'users.delete', 'Deactivate users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_roles', 'users.roles', 'Manage user roles', 'users', strftime('%s', 'now') * 1000),\\n \\n ('perm_settings_read', 'settings.read', 'View system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_settings_update', 'settings.update', 'Modify system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_activity_read', 'activity.read', 'View activity logs', 'settings', strftime('%s', 'now') * 1000);\\n\\n-- Assign permissions to default roles\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at) VALUES\\n -- Admin has all permissions\\n ('rp_admin_content_create', 'admin', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_read', 'admin', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_update', 'admin', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_delete', 'admin', 'perm_content_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_publish', 'admin', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_create', 'admin', 'perm_collections_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_read', 'admin', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_update', 'admin', 'perm_collections_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_delete', 'admin', 'perm_collections_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_fields', 'admin', 'perm_collections_fields', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_upload', 'admin', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_read', 'admin', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_update', 'admin', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_delete', 'admin', 'perm_media_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_create', 'admin', 'perm_users_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_read', 'admin', 'perm_users_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_update', 'admin', 'perm_users_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_delete', 'admin', 'perm_users_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_roles', 'admin', 'perm_users_roles', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_read', 'admin', 'perm_settings_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_update', 'admin', 'perm_settings_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_activity_read', 'admin', 'perm_activity_read', strftime('%s', 'now') * 1000),\\n \\n -- Editor permissions\\n ('rp_editor_content_create', 'editor', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_read', 'editor', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_update', 'editor', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_publish', 'editor', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_editor_collections_read', 'editor', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_upload', 'editor', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_read', 'editor', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_update', 'editor', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_users_read', 'editor', 'perm_users_read', strftime('%s', 'now') * 1000),\\n \\n -- Viewer permissions\\n ('rp_viewer_content_read', 'viewer', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_collections_read', 'viewer', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_media_read', 'viewer', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_users_read', 'viewer', 'perm_users_read', strftime('%s', 'now') * 1000);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_team_id ON team_memberships(team_id);\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_user_id ON team_memberships(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_user_id ON user_sessions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_token_hash ON user_sessions(token_hash);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_user_id ON activity_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_created_at ON activity_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_resource ON activity_logs(resource_type, resource_id);\\nCREATE INDEX IF NOT EXISTS idx_password_history_user_id ON password_history(user_id);\\nCREATE INDEX IF NOT EXISTS idx_users_email_verification_token ON users(email_verification_token);\\nCREATE INDEX IF NOT EXISTS idx_users_password_reset_token ON users(password_reset_token);\\nCREATE INDEX IF NOT EXISTS idx_users_invitation_token ON users(invitation_token);\"\n },\n {\n id: '005',\n name: 'Stage7 Workflow Automation',\n filename: '005_stage7_workflow_automation.sql',\n description: 'Migration 005: Stage7 Workflow Automation',\n sql: \"-- Stage 7: Workflow & Automation Migration\\n-- This migration adds workflow and automation capabilities to SonicJS\\n\\n-- Workflow States Table\\nCREATE TABLE IF NOT EXISTS workflow_states (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n color TEXT DEFAULT '#6B7280',\\n is_initial INTEGER DEFAULT 0,\\n is_final INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Insert default workflow states\\nINSERT OR IGNORE INTO workflow_states (id, name, description, color, is_initial, is_final) VALUES\\n('draft', 'Draft', 'Content is being worked on', '#F59E0B', 1, 0),\\n('pending-review', 'Pending Review', 'Content is waiting for review', '#3B82F6', 0, 0),\\n('approved', 'Approved', 'Content has been approved', '#10B981', 0, 0),\\n('published', 'Published', 'Content is live', '#059669', 0, 1),\\n('rejected', 'Rejected', 'Content was rejected', '#EF4444', 0, 1),\\n('archived', 'Archived', 'Content has been archived', '#6B7280', 0, 1);\\n\\n-- Workflows Table\\nCREATE TABLE IF NOT EXISTS workflows (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT,\\n is_active INTEGER DEFAULT 1,\\n auto_publish INTEGER DEFAULT 0,\\n require_approval INTEGER DEFAULT 1,\\n approval_levels INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\\n);\\n\\n-- Workflow Transitions Table\\nCREATE TABLE IF NOT EXISTS workflow_transitions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT NOT NULL,\\n to_state_id TEXT NOT NULL,\\n required_permission TEXT,\\n auto_transition INTEGER DEFAULT 0,\\n transition_conditions TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE,\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id)\\n);\\n\\n-- Content Workflow Status Table\\nCREATE TABLE IF NOT EXISTS content_workflow_status (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n current_state_id TEXT NOT NULL,\\n assigned_to TEXT,\\n due_date DATETIME,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (current_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (assigned_to) REFERENCES users(id),\\n UNIQUE(content_id, workflow_id)\\n);\\n\\n-- Workflow History Table\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT,\\n to_state_id TEXT NOT NULL,\\n user_id TEXT NOT NULL,\\n comment TEXT,\\n metadata TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Scheduled Content Table\\nCREATE TABLE IF NOT EXISTS scheduled_content (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n action TEXT NOT NULL, -- 'publish', 'unpublish', 'archive'\\n scheduled_at DATETIME NOT NULL,\\n timezone TEXT DEFAULT 'UTC',\\n user_id TEXT NOT NULL,\\n status TEXT DEFAULT 'pending', -- 'pending', 'completed', 'failed', 'cancelled'\\n executed_at DATETIME,\\n error_message TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Notifications Table\\nCREATE TABLE IF NOT EXISTS notifications (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n type TEXT NOT NULL, -- 'workflow', 'schedule', 'system'\\n title TEXT NOT NULL,\\n message TEXT NOT NULL,\\n data TEXT, -- JSON\\n is_read INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\\n);\\n\\n-- Notification Preferences Table\\nCREATE TABLE IF NOT EXISTS notification_preferences (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n notification_type TEXT NOT NULL,\\n email_enabled INTEGER DEFAULT 1,\\n in_app_enabled INTEGER DEFAULT 1,\\n digest_frequency TEXT DEFAULT 'daily', -- 'immediate', 'hourly', 'daily', 'weekly'\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\\n UNIQUE(user_id, notification_type)\\n);\\n\\n-- Webhooks Table\\nCREATE TABLE IF NOT EXISTS webhooks (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n url TEXT NOT NULL,\\n secret TEXT,\\n events TEXT NOT NULL, -- JSON array of event types\\n is_active INTEGER DEFAULT 1,\\n retry_count INTEGER DEFAULT 3,\\n timeout_seconds INTEGER DEFAULT 30,\\n last_success_at DATETIME,\\n last_failure_at DATETIME,\\n failure_count INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Webhook Deliveries Table\\nCREATE TABLE IF NOT EXISTS webhook_deliveries (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n webhook_id TEXT NOT NULL,\\n event_type TEXT NOT NULL,\\n payload TEXT NOT NULL, -- JSON\\n response_status INTEGER,\\n response_body TEXT,\\n attempt_count INTEGER DEFAULT 1,\\n delivered_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE\\n);\\n\\n-- Content Versions Table (for rollback functionality)\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n version_number INTEGER NOT NULL,\\n title TEXT NOT NULL,\\n content TEXT NOT NULL,\\n fields TEXT, -- JSON\\n user_id TEXT NOT NULL,\\n change_summary TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, version_number)\\n);\\n\\n-- Automation Rules Table\\nCREATE TABLE IF NOT EXISTS automation_rules (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n trigger_type TEXT NOT NULL, -- 'content_created', 'content_updated', 'workflow_transition', 'schedule'\\n trigger_conditions TEXT, -- JSON\\n action_type TEXT NOT NULL, -- 'workflow_transition', 'send_notification', 'webhook_call', 'auto_save'\\n action_config TEXT, -- JSON\\n is_active INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Auto-save Drafts Table\\nCREATE TABLE IF NOT EXISTS auto_save_drafts (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT,\\n user_id TEXT NOT NULL,\\n title TEXT,\\n content TEXT,\\n fields TEXT, -- JSON\\n last_saved_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, user_id)\\n);\\n\\n-- Add workflow-related columns to existing content table (skip existing columns)\\nALTER TABLE content ADD COLUMN workflow_state_id TEXT DEFAULT 'draft';\\nALTER TABLE content ADD COLUMN embargo_until DATETIME;\\nALTER TABLE content ADD COLUMN expires_at DATETIME;\\nALTER TABLE content ADD COLUMN version_number INTEGER DEFAULT 1;\\nALTER TABLE content ADD COLUMN is_auto_saved INTEGER DEFAULT 0;\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_content_id ON content_workflow_status(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_workflow_id ON content_workflow_status(workflow_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content_id ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_scheduled_at ON scheduled_content(scheduled_at);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_status ON scheduled_content(status);\\nCREATE INDEX IF NOT EXISTS idx_notifications_user_id ON notifications(user_id);\\nCREATE INDEX IF NOT EXISTS idx_notifications_is_read ON notifications(is_read);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content_id ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_auto_save_drafts_user_id ON auto_save_drafts(user_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_state ON content(workflow_state_id);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\n\\n-- Insert default workflow for collections\\nINSERT OR IGNORE INTO workflows (id, name, description, collection_id, is_active, require_approval, approval_levels) \\nSELECT \\n 'default-' || id,\\n 'Default Workflow for ' || name,\\n 'Standard content approval workflow',\\n id,\\n 1,\\n 1,\\n 1\\nFROM collections;\\n\\n-- Insert default workflow transitions\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'draft',\\n 'pending-review',\\n 'content:submit'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'approved',\\n 'content:approve'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'approved',\\n 'published',\\n 'content:publish'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'rejected',\\n 'content:approve'\\nFROM workflows w;\\n\\n-- Insert default notification preferences for all users\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_assigned',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_status_change',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'content_scheduled',\\n 1,\\n 1\\nFROM users;\"\n },\n {\n id: '006',\n name: 'Plugin System',\n filename: '006_plugin_system.sql',\n description: 'Migration 006: Plugin System',\n sql: \"-- Plugin System Tables\\n-- Migration: 006_plugin_system\\n-- Description: Add plugin management system tables\\n\\n-- Plugins table\\nCREATE TABLE IF NOT EXISTS plugins (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n version TEXT NOT NULL,\\n author TEXT NOT NULL,\\n category TEXT NOT NULL,\\n icon TEXT,\\n status TEXT DEFAULT 'inactive' CHECK (status IN ('active', 'inactive', 'error')),\\n is_core BOOLEAN DEFAULT FALSE,\\n settings JSON,\\n permissions JSON,\\n dependencies JSON,\\n download_count INTEGER DEFAULT 0,\\n rating REAL DEFAULT 0,\\n installed_at INTEGER NOT NULL,\\n activated_at INTEGER,\\n last_updated INTEGER NOT NULL,\\n error_message TEXT,\\n created_at INTEGER DEFAULT (unixepoch()),\\n updated_at INTEGER DEFAULT (unixepoch())\\n);\\n\\n-- Plugin hooks table (registered hooks by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_hooks (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n hook_name TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n priority INTEGER DEFAULT 10,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, hook_name, handler_name)\\n);\\n\\n-- Plugin routes table\\nCREATE TABLE IF NOT EXISTS plugin_routes (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n path TEXT NOT NULL,\\n method TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n middleware JSON,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, path, method)\\n);\\n\\n-- Plugin assets table (CSS, JS files provided by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_assets (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n asset_type TEXT NOT NULL CHECK (asset_type IN ('css', 'js', 'image', 'font')),\\n asset_path TEXT NOT NULL,\\n load_order INTEGER DEFAULT 100,\\n load_location TEXT DEFAULT 'footer' CHECK (load_location IN ('header', 'footer')),\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Plugin activity log\\nCREATE TABLE IF NOT EXISTS plugin_activity_log (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n action TEXT NOT NULL,\\n user_id TEXT,\\n details JSON,\\n timestamp INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Create indexes\\nCREATE INDEX IF NOT EXISTS idx_plugins_status ON plugins(status);\\nCREATE INDEX IF NOT EXISTS idx_plugins_category ON plugins(category);\\nCREATE INDEX IF NOT EXISTS idx_plugin_hooks_plugin ON plugin_hooks(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_routes_plugin ON plugin_routes(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_assets_plugin ON plugin_assets(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_plugin ON plugin_activity_log(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_timestamp ON plugin_activity_log(timestamp);\\n\\n-- Insert core plugins\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES \\n(\\n 'core-auth',\\n 'core-auth',\\n 'Authentication System',\\n 'Core authentication and user management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔐',\\n 'active',\\n TRUE,\\n '[\\\"manage:users\\\", \\\"manage:roles\\\", \\\"manage:permissions\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-media',\\n 'core-media', \\n 'Media Manager',\\n 'Core media upload and management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'media',\\n '📸',\\n 'active',\\n TRUE,\\n '[\\\"manage:media\\\", \\\"upload:files\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-workflow',\\n 'core-workflow',\\n 'Workflow Engine',\\n 'Content workflow and approval system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin will be added as a third-party plugin through the admin interface\\n\\n-- Add plugin management permission\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at)\\nVALUES (\\n 'manage:plugins',\\n 'Manage Plugins',\\n 'Install, uninstall, activate, and configure plugins',\\n 'system',\\n unixepoch()\\n);\\n\\n-- Grant plugin management permission to admin role\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at)\\nVALUES ('role-perm-manage-plugins', 'admin', 'manage:plugins', unixepoch());\"\n },\n {\n id: '007',\n name: 'Demo Login Plugin',\n filename: '007_demo_login_plugin.sql',\n description: 'Migration 007: Demo Login Plugin',\n sql: \"-- Demo Login Plugin Migration\\n-- Migration: 007_demo_login_plugin\\n-- Description: Add demo login prefill plugin to the plugin registry\\n\\n-- Insert demo login plugin\\nINSERT INTO plugins (\\n id, name, display_name, description, version, author, category, icon, \\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'demo-login-prefill',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials (admin@sonicjs.com/sonicjs!) for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'inactive',\\n TRUE,\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\"\n },\n {\n id: '008',\n name: 'Fix Slug Validation',\n filename: '008_fix_slug_validation.sql',\n description: 'Migration 008: Fix Slug Validation',\n sql: \"-- Migration: Fix overly restrictive slug validation patterns\\n-- This migration relaxes the slug field validation to be more user-friendly\\n\\n-- Update the pages collection slug field to allow underscores and be less restrictive\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\\n-- Update any other slug fields with the restrictive pattern\\nUPDATE content_fields \\nSET field_options = REPLACE(field_options, '\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"', '\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\"')\\nWHERE field_options LIKE '%\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"%';\"\n },\n {\n id: '009',\n name: 'System Logging',\n filename: '009_system_logging.sql',\n description: 'Migration 009: System Logging',\n sql: \"-- System Logging Tables\\n-- Migration: 009_system_logging\\n-- Description: Add system logging and configuration tables\\n\\n-- System logs table for tracking application events\\nCREATE TABLE IF NOT EXISTS system_logs (\\n id TEXT PRIMARY KEY,\\n level TEXT NOT NULL CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n category TEXT NOT NULL CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n message TEXT NOT NULL,\\n data TEXT, -- JSON data\\n user_id TEXT,\\n session_id TEXT,\\n request_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n method TEXT,\\n url TEXT,\\n status_code INTEGER,\\n duration INTEGER, -- milliseconds\\n stack_trace TEXT,\\n tags TEXT, -- JSON array\\n source TEXT, -- source of the log entry\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Log configuration table for managing log settings per category\\nCREATE TABLE IF NOT EXISTS log_config (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL UNIQUE CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n enabled BOOLEAN NOT NULL DEFAULT TRUE,\\n level TEXT NOT NULL DEFAULT 'info' CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n retention_days INTEGER NOT NULL DEFAULT 30,\\n max_size_mb INTEGER NOT NULL DEFAULT 100,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_system_logs_level ON system_logs(level);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_category ON system_logs(category);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_created_at ON system_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_user_id ON system_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_status_code ON system_logs(status_code);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_source ON system_logs(source);\\n\\n-- Insert default log configurations\\nINSERT OR IGNORE INTO log_config (id, category, enabled, level, retention_days, max_size_mb) VALUES\\n('log-config-auth', 'auth', TRUE, 'info', 90, 50),\\n('log-config-api', 'api', TRUE, 'info', 30, 100),\\n('log-config-workflow', 'workflow', TRUE, 'info', 60, 50),\\n('log-config-plugin', 'plugin', TRUE, 'warn', 30, 25),\\n('log-config-media', 'media', TRUE, 'info', 30, 50),\\n('log-config-system', 'system', TRUE, 'info', 90, 100),\\n('log-config-security', 'security', TRUE, 'warn', 180, 100),\\n('log-config-error', 'error', TRUE, 'error', 90, 200);\"\n },\n {\n id: '011',\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql',\n description: 'Migration 011: Config Managed Collections',\n sql: \"-- Migration: Add Config-Managed Collections Support\\n-- Description: Add 'managed' column to collections table to support config-based collection definitions\\n-- Created: 2025-10-03\\n\\n-- Add 'managed' column to collections table\\n-- This column indicates whether a collection is managed by configuration files (true) or user-created (false)\\n-- Managed collections cannot be edited through the admin UI\\n-- Use a safe approach to add the column only if it doesn't exist\\nALTER TABLE collections ADD COLUMN managed INTEGER DEFAULT 0 NOT NULL;\\n\\n-- Create an index on the managed column for faster queries\\nCREATE INDEX IF NOT EXISTS idx_collections_managed ON collections(managed);\\n\\n-- Create an index on managed + is_active for efficient filtering\\nCREATE INDEX IF NOT EXISTS idx_collections_managed_active ON collections(managed, is_active);\\n\"\n },\n {\n id: '012',\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql',\n description: 'Migration 012: Testimonials Plugin',\n sql: \"-- Testimonials Plugin Migration\\n-- Creates testimonials table for the testimonials plugin\\n-- This demonstrates a code-based collection defined in src/plugins/core-plugins/testimonials-plugin.ts\\n\\nCREATE TABLE IF NOT EXISTS testimonials (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n author_name TEXT NOT NULL,\\n author_title TEXT,\\n author_company TEXT,\\n testimonial_text TEXT NOT NULL,\\n rating INTEGER CHECK(rating >= 1 AND rating <= 5),\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_testimonials_published ON testimonials(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_sort_order ON testimonials(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_rating ON testimonials(rating);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS testimonials_updated_at\\n AFTER UPDATE ON testimonials\\nBEGIN\\n UPDATE testimonials SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('testimonials',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support. This is a code-based collection example.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}');\\n\\n-- Insert sample testimonial data\\nINSERT OR IGNORE INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder) VALUES\\n('Jane Smith',\\n 'CTO',\\n 'TechStartup Inc',\\n 'SonicJS AI has transformed how we manage our content. The plugin architecture is brilliant and the edge deployment is blazing fast.',\\n 5,\\n 1,\\n 1),\\n\\n('Michael Chen',\\n 'Lead Developer',\\n 'Digital Agency Co',\\n 'We migrated from WordPress to SonicJS AI and couldn''t be happier. The TypeScript-first approach and modern tooling make development a joy.',\\n 5,\\n 1,\\n 2),\\n\\n('Sarah Johnson',\\n 'Product Manager',\\n 'E-commerce Solutions',\\n 'The headless CMS approach combined with Cloudflare Workers gives us unmatched performance. Our content is served globally with minimal latency.',\\n 4,\\n 1,\\n 3),\\n\\n('David Rodriguez',\\n 'Full Stack Developer',\\n 'Creative Studio',\\n 'Great CMS for modern web applications. The admin interface is clean and the API is well-designed. Plugin system is very flexible.',\\n 5,\\n 1,\\n 4),\\n\\n('Emily Watson',\\n 'Technical Director',\\n 'Media Company',\\n 'SonicJS AI solved our content distribution challenges. The R2 integration for media storage works flawlessly and scales effortlessly.',\\n 4,\\n 1,\\n 5);\\n\"\n },\n {\n id: '013',\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql',\n description: 'Migration 013: Code Examples Plugin',\n sql: \"-- Code Examples Plugin Migration\\n-- Creates code_examples table for the code examples plugin\\n-- This demonstrates a code-based collection for storing and managing code snippets\\n\\nCREATE TABLE IF NOT EXISTS code_examples (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n title TEXT NOT NULL,\\n description TEXT,\\n code TEXT NOT NULL,\\n language TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_code_examples_published ON code_examples(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_sort_order ON code_examples(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_language ON code_examples(language);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_category ON code_examples(category);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS code_examples_updated_at\\n AFTER UPDATE ON code_examples\\nBEGIN\\n UPDATE code_examples SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('code-examples',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support. Perfect for documentation and tutorials.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}');\\n\\n-- Insert sample code examples\\nINSERT OR IGNORE INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder) VALUES\\n('React useState Hook',\\n 'Basic example of using the useState hook in React for managing component state.',\\n 'import { useState } from ''react'';\\n\\nfunction Counter() {\\n const [count, setCount] = useState(0);\\n\\n return (\\n
\\n

Count: {count}

\\n \\n
\\n );\\n}\\n\\nexport default Counter;',\\n 'javascript',\\n 'frontend',\\n 'react,hooks,state',\\n 1,\\n 1),\\n\\n('TypeScript Interface Example',\\n 'Defining a TypeScript interface for type-safe objects.',\\n 'interface User {\\n id: string;\\n email: string;\\n name: string;\\n role: ''admin'' | ''editor'' | ''viewer'';\\n createdAt: Date;\\n}\\n\\nfunction greetUser(user: User): string {\\n return `Hello, ${user.name}!`;\\n}\\n\\nconst user: User = {\\n id: ''123'',\\n email: ''user@example.com'',\\n name: ''John Doe'',\\n role: ''admin'',\\n createdAt: new Date()\\n};\\n\\nconsole.log(greetUser(user));',\\n 'typescript',\\n 'backend',\\n 'typescript,types,interface',\\n 1,\\n 2),\\n\\n('Python List Comprehension',\\n 'Elegant way to create lists in Python using list comprehensions.',\\n '# Basic list comprehension\\nsquares = [x**2 for x in range(10)]\\nprint(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\\n\\n# With condition\\neven_squares = [x**2 for x in range(10) if x % 2 == 0]\\nprint(even_squares) # [0, 4, 16, 36, 64]\\n\\n# Nested list comprehension\\nmatrix = [[i+j for j in range(3)] for i in range(3)]\\nprint(matrix) # [[0, 1, 2], [1, 2, 3], [2, 3, 4]]',\\n 'python',\\n 'general',\\n 'python,lists,comprehension',\\n 1,\\n 3),\\n\\n('SQL Join Example',\\n 'Common SQL JOIN patterns for combining data from multiple tables.',\\n '-- INNER JOIN: Returns only matching rows\\nSELECT users.name, orders.total\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id;\\n\\n-- LEFT JOIN: Returns all users, even without orders\\nSELECT users.name, orders.total\\nFROM users\\nLEFT JOIN orders ON users.id = orders.user_id;\\n\\n-- Multiple JOINs\\nSELECT\\n users.name,\\n orders.order_date,\\n products.name AS product_name\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id\\nINNER JOIN order_items ON orders.id = order_items.order_id\\nINNER JOIN products ON order_items.product_id = products.id;',\\n 'sql',\\n 'database',\\n 'sql,joins,queries',\\n 1,\\n 4),\\n\\n('Go Error Handling',\\n 'Idiomatic error handling pattern in Go.',\\n 'package main\\n\\nimport (\\n\\t\\\"errors\\\"\\n\\t\\\"fmt\\\"\\n)\\n\\nfunc divide(a, b float64) (float64, error) {\\n\\tif b == 0 {\\n\\t\\treturn 0, errors.New(\\\"division by zero\\\")\\n\\t}\\n\\treturn a / b, nil\\n}\\n\\nfunc main() {\\n\\tresult, err := divide(10, 2)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t\\treturn\\n\\t}\\n\\tfmt.Printf(\\\"Result: %.2f\\\\n\\\", result)\\n\\n\\t// This will error\\n\\t_, err = divide(10, 0)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t}\\n}',\\n 'go',\\n 'backend',\\n 'go,error-handling,functions',\\n 1,\\n 5);\\n\"\n },\n {\n id: '014',\n name: 'Fix Plugin Registry',\n filename: '014_fix_plugin_registry.sql',\n description: 'Migration 014: Fix Plugin Registry',\n sql: \"-- Fix Plugin Registry\\n-- Migration: 014_fix_plugin_registry\\n-- Description: Add missing plugins and fix plugin name mismatches\\n\\n-- Note: Cannot easily update plugin names as they may be referenced elsewhere\\n-- Instead we'll add the missing plugins with correct names\\n\\n-- Insert missing plugins\\n\\n-- Core Analytics Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'core-analytics',\\n 'core-analytics',\\n 'Analytics & Tracking',\\n 'Core analytics tracking and reporting plugin with page views and event tracking',\\n '1.0.0',\\n 'SonicJS Team',\\n 'seo',\\n '📊',\\n 'active',\\n TRUE,\\n '[\\\"view:analytics\\\", \\\"manage:tracking\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'faq-plugin',\\n 'faq-plugin',\\n 'FAQ Management',\\n 'Frequently Asked Questions management plugin with categories, search, and custom styling',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '❓',\\n 'active',\\n FALSE,\\n '[\\\"manage:faqs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Seed Data Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'seed-data',\\n 'seed-data',\\n 'Seed Data Generator',\\n 'Generate realistic example users and content for testing and development',\\n '1.0.0',\\n 'SonicJS Team',\\n 'development',\\n '🌱',\\n 'inactive',\\n FALSE,\\n '[\\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Database Tools Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'database-tools',\\n 'database-tools',\\n 'Database Tools',\\n 'Database management tools including truncate, backup, and validation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'system',\\n '🗄️',\\n 'active',\\n FALSE,\\n '[\\\"manage:database\\\", \\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '015',\n name: 'Add Remaining Plugins',\n filename: '015_add_remaining_plugins.sql',\n description: 'Migration 015: Add Remaining Plugins',\n sql: \"-- Add Remaining Plugins\\n-- Migration: 015_add_remaining_plugins\\n-- Description: Add all remaining core plugins that were missing from the registry\\n\\n-- Testimonials Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'testimonials-plugin',\\n 'testimonials-plugin',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '⭐',\\n 'active',\\n FALSE,\\n '[\\\"manage:testimonials\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Code Examples Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'code-examples-plugin',\\n 'code-examples-plugin',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '💻',\\n 'active',\\n FALSE,\\n '[\\\"manage:code-examples\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Workflow Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'workflow-plugin',\\n 'workflow-plugin',\\n 'Workflow Engine',\\n 'Content workflow management with approval chains, scheduling, and automation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Demo Login Plugin (already exists with correct name from migration 007, but let's ensure it's there)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'demo-login-plugin',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '016',\n name: 'Remove Duplicate Cache Plugin',\n filename: '016_remove_duplicate_cache_plugin.sql',\n description: 'Migration 016: Remove Duplicate Cache Plugin',\n sql: \"-- Migration: Remove duplicate cache plugin entry\\n-- Description: Removes the old 'cache' plugin (id: 'cache') that is a duplicate of 'core-cache'\\n-- This fixes the issue where Cache System appears twice in the plugins list\\n-- Created: 2025-10-14\\n\\n-- Remove the old 'cache' plugin entry if it exists\\n-- The correct plugin is 'core-cache' which is managed by plugin-bootstrap.ts\\nDELETE FROM plugins WHERE id = 'cache' AND name = 'cache';\\n\\n-- Clean up any related entries in plugin activity log\\nDELETE FROM plugin_activity_log WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin hooks\\nDELETE FROM plugin_hooks WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin routes\\nDELETE FROM plugin_routes WHERE plugin_id = 'cache';\\n\"\n },\n {\n id: '017',\n name: 'Auth Configurable Fields',\n filename: '017_auth_configurable_fields.sql',\n description: 'Migration 017: Auth Configurable Fields',\n sql: \"-- Migration: Make authentication fields configurable\\n-- This migration updates the core-auth plugin to support configurable required fields\\n\\n-- The settings will be stored in the plugins table as JSON\\n-- Default settings for core-auth plugin include:\\n-- {\\n-- \\\"requiredFields\\\": {\\n-- \\\"email\\\": { \\\"required\\\": true, \\\"minLength\\\": 5 },\\n-- \\\"password\\\": { \\\"required\\\": true, \\\"minLength\\\": 8 },\\n-- \\\"username\\\": { \\\"required\\\": true, \\\"minLength\\\": 3 },\\n-- \\\"firstName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 },\\n-- \\\"lastName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 }\\n-- },\\n-- \\\"validation\\\": {\\n-- \\\"emailFormat\\\": true,\\n-- \\\"allowDuplicateUsernames\\\": false\\n-- }\\n-- }\\n\\n-- Update core-auth plugin settings with configurable field requirements\\nUPDATE plugins\\nSET settings = json_object(\\n 'requiredFields', json_object(\\n 'email', json_object('required', 1, 'minLength', 5, 'label', 'Email', 'type', 'email'),\\n 'password', json_object('required', 1, 'minLength', 8, 'label', 'Password', 'type', 'password'),\\n 'username', json_object('required', 1, 'minLength', 3, 'label', 'Username', 'type', 'text'),\\n 'firstName', json_object('required', 1, 'minLength', 1, 'label', 'First Name', 'type', 'text'),\\n 'lastName', json_object('required', 1, 'minLength', 1, 'label', 'Last Name', 'type', 'text')\\n ),\\n 'validation', json_object(\\n 'emailFormat', 1,\\n 'allowDuplicateUsernames', 0,\\n 'passwordRequirements', json_object(\\n 'requireUppercase', 0,\\n 'requireLowercase', 0,\\n 'requireNumbers', 0,\\n 'requireSpecialChars', 0\\n )\\n ),\\n 'registration', json_object(\\n 'enabled', 1,\\n 'requireEmailVerification', 0,\\n 'defaultRole', 'viewer'\\n )\\n)\\nWHERE id = 'core-auth';\\n\\n-- If core-auth plugin doesn't exist, this migration will be handled by bootstrap\\n-- No need to insert here as plugin bootstrap handles initial plugin creation\\n\"\n },\n {\n id: '018',\n name: 'Settings Table',\n filename: '018_settings_table.sql',\n description: 'Migration 018: Settings Table',\n sql: \"-- Create settings table for storing application settings\\nCREATE TABLE IF NOT EXISTS settings (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL, -- 'general', 'appearance', 'security', etc.\\n key TEXT NOT NULL,\\n value TEXT NOT NULL, -- JSON value\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(category, key)\\n);\\n\\n-- Insert default general settings\\nINSERT OR IGNORE INTO settings (id, category, key, value, created_at, updated_at)\\nVALUES\\n (lower(hex(randomblob(16))), 'general', 'siteName', '\\\"SonicJS AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'siteDescription', '\\\"A modern headless CMS powered by AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'timezone', '\\\"UTC\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'language', '\\\"en\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'maintenanceMode', 'false', unixepoch() * 1000, unixepoch() * 1000);\\n\\n-- Create index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);\\nCREATE INDEX IF NOT EXISTS idx_settings_category_key ON settings(category, key);\\n\"\n },\n {\n id: '019',\n name: 'Remove Blog Posts Collection',\n filename: '019_remove_blog_posts_collection.sql',\n description: 'Migration 019: Remove Blog Posts Collection',\n sql: \"-- Migration: Remove blog_posts from database-managed collections\\n-- Description: Remove blog-posts-collection from the database so it can be managed by code-based collection\\n-- Created: 2025-11-04\\n\\n-- Delete content associated with blog-posts-collection\\nDELETE FROM content WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete content fields for blog-posts-collection\\nDELETE FROM content_fields WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete the blog-posts collection itself\\nDELETE FROM collections WHERE id = 'blog-posts-collection';\\n\\n-- The blog-posts collection will now be managed by the code-based collection\\n-- in src/collections/blog-posts.collection.ts\\n\"\n },\n {\n id: '020',\n name: 'Add Email Plugin',\n filename: '020_add_email_plugin.sql',\n description: 'Migration 020: Add Email Plugin',\n sql: \"-- Add Email Plugin\\n-- Migration: 020_add_email_plugin\\n-- Description: Add email plugin for transactional emails via Resend\\n\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'email',\\n 'email',\\n 'Email',\\n 'Send transactional emails using Resend',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'utilities',\\n '📧',\\n 'inactive',\\n TRUE,\\n '[\\\"email:manage\\\", \\\"email:send\\\", \\\"email:view-logs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '021',\n name: 'Add Magic Link Auth Plugin',\n filename: '021_add_magic_link_auth_plugin.sql',\n description: 'Migration 021: Add Magic Link Auth Plugin',\n sql: \"-- Add Magic Link Authentication Plugin\\n-- Migration: 021_add_magic_link_auth_plugin\\n-- Description: Add magic link authentication plugin for passwordless login\\n\\n-- Create magic_links table\\nCREATE TABLE IF NOT EXISTS magic_links (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_magic_links_token ON magic_links(token);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_email ON magic_links(user_email);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_expires ON magic_links(expires_at);\\n\\n-- Register the plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'magic-link-auth',\\n 'magic-link-auth',\\n 'Magic Link Authentication',\\n 'Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔗',\\n 'inactive',\\n FALSE,\\n '[\\\"auth:manage\\\", \\\"auth:magic-link\\\"]',\\n '[\\\"email\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '022',\n name: 'Add Tinymce Plugin',\n filename: '022_add_tinymce_plugin.sql',\n description: 'Migration 022: Add Tinymce Plugin',\n sql: \"-- Add TinyMCE Rich Text Editor Plugin\\n-- Migration: 022_add_tinymce_plugin\\n-- Description: Add TinyMCE plugin for WYSIWYG rich text editing\\n\\n-- Register the plugin (active by default since it replaces hardcoded TinyMCE)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'tinymce-plugin',\\n 'tinymce-plugin',\\n 'TinyMCE Rich Text Editor',\\n 'Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✏️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"apiKey\\\":\\\"no-api-key\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"skin\\\":\\\"oxide-dark\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '023',\n name: 'Add Easy Mdx Plugin',\n filename: '023_add_easy_mdx_plugin.sql',\n description: 'Migration 023: Add Easy Mdx Plugin',\n sql: \"-- Add EasyMDE Markdown Editor Plugin\\n-- Migration: 023_add_easy_mdx_plugin\\n-- Description: Add EasyMDE plugin for lightweight markdown editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easy-mdx',\\n 'easy-mdx',\\n 'EasyMDE Markdown Editor',\\n 'Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '📝',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"defaultHeight\\\":400,\\\"theme\\\":\\\"dark\\\",\\\"toolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '024',\n name: 'Add Quill Editor Plugin',\n filename: '024_add_quill_editor_plugin.sql',\n description: 'Migration 024: Add Quill Editor Plugin',\n sql: \"-- Add Quill Rich Text Editor Plugin\\n-- Migration: 024_add_quill_editor_plugin\\n-- Description: Add Quill plugin for modern rich text editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'quill-editor',\\n 'quill-editor',\\n 'Quill Rich Text Editor',\\n 'Modern rich text editor for content creation. Provides a clean, intuitive WYSIWYG editor with customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"snow\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '025',\n name: 'Add Easymde Plugin',\n filename: '025_add_easymde_plugin.sql',\n description: 'Migration 025: Add Easymde Plugin',\n sql: \"-- Add EasyMDE Rich Text Editor Plugin\\n-- Migration: 025_add_easymde_plugin\\n-- Description: Add EasyMDE plugin for markdown-based rich text editing\\n\\n-- Register the plugin (inactive by default, replacing MDXEditor)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easymde-editor',\\n 'easymde-editor',\\n 'EasyMDE Editor',\\n 'Lightweight markdown editor for content creation. Simple, elegant WYSIWYG markdown editor with live preview, toolbar, and dark mode support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'inactive',\\n TRUE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"dark\\\",\\\"defaultHeight\\\":300,\\\"toolbar\\\":\\\"full\\\",\\\"spellChecker\\\":false,\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '026',\n name: 'Add Otp Login',\n filename: '026_add_otp_login.sql',\n description: 'Migration 026: Add Otp Login',\n sql: \"-- Add OTP Login Plugin\\n-- Migration: 021_add_otp_login\\n-- Description: Add OTP login plugin for passwordless authentication via email codes\\n\\n-- Create table for OTP codes\\nCREATE TABLE IF NOT EXISTS otp_codes (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n code TEXT NOT NULL,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n attempts INTEGER DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_otp_email_code ON otp_codes(user_email, code);\\nCREATE INDEX IF NOT EXISTS idx_otp_expires ON otp_codes(expires_at);\\nCREATE INDEX IF NOT EXISTS idx_otp_used ON otp_codes(used);\\n\\n-- Add plugin record\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'otp-login',\\n 'otp-login',\\n 'OTP Login',\\n 'Passwordless authentication via email one-time codes',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'security',\\n '🔢',\\n 'inactive',\\n TRUE,\\n '[\\\"otp:manage\\\", \\\"otp:request\\\", \\\"otp:verify\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '027',\n name: 'Fix Slug Field Type',\n filename: '027_fix_slug_field_type.sql',\n description: 'Migration 027: Fix Slug Field Type',\n sql: \"-- Migration: Fix slug field type\\n-- Description: Update slug fields to use 'slug' field type instead of 'text' for proper auto-generation\\n-- Created: 2026-01-10\\n\\n-- Update pages collection slug field to use 'slug' field type\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\"\n },\n {\n id: '028',\n name: 'Fix Slug Field Type In Schemas',\n filename: '028_fix_slug_field_type_in_schemas.sql',\n description: 'Migration 028: Fix Slug Field Type In Schemas',\n sql: \"-- Migration: Fix slug field type in collection schemas\\n-- Description: Update slug fields in collection schemas to use 'slug' type instead of 'string'\\n-- Created: 2026-01-10\\n\\n-- Update pages-collection schema\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'pages-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update blog-posts-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'blog-posts-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update news-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'news-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\"\n },\n {\n id: '029',\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql',\n description: 'Migration 029: Add Forms System',\n sql: \"-- Migration: 029_add_forms_system.sql\\n-- Description: Add Form.io integration for advanced form building\\n-- Date: January 23, 2026\\n-- Phase: 1 - Database Schema\\n\\n-- =====================================================\\n-- Table: forms\\n-- Description: Stores form definitions and configuration\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS forms (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE, -- Machine name (e.g., \\\"contact-form\\\")\\n display_name TEXT NOT NULL, -- Human name (e.g., \\\"Contact Form\\\")\\n description TEXT, -- Optional description\\n category TEXT DEFAULT 'general', -- Form category (contact, survey, registration, etc.)\\n \\n -- Form.io schema (JSON)\\n formio_schema TEXT NOT NULL, -- Complete Form.io JSON schema\\n \\n -- Settings\\n settings TEXT, -- JSON: {\\n -- emailNotifications: true,\\n -- notifyEmail: \\\"admin@example.com\\\",\\n -- successMessage: \\\"Thank you!\\\",\\n -- redirectUrl: \\\"/thank-you\\\",\\n -- allowAnonymous: true,\\n -- requireAuth: false,\\n -- maxSubmissions: null,\\n -- submitButtonText: \\\"Submit\\\",\\n -- saveProgress: true,\\n -- webhookUrl: null\\n -- }\\n \\n -- Status & Management\\n is_active INTEGER DEFAULT 1, -- Active/inactive flag\\n is_public INTEGER DEFAULT 1, -- Public (anyone) vs private (auth required)\\n managed INTEGER DEFAULT 0, -- Code-managed (like collections)\\n \\n -- Metadata\\n icon TEXT, -- Optional icon for admin UI\\n color TEXT, -- Optional color (hex) for admin UI\\n tags TEXT, -- JSON array of tags\\n \\n -- Stats\\n submission_count INTEGER DEFAULT 0, -- Total submissions received\\n view_count INTEGER DEFAULT 0, -- Form views (optional tracking)\\n \\n -- Ownership\\n created_by TEXT REFERENCES users(id), -- User who created the form\\n updated_by TEXT REFERENCES users(id), -- User who last updated\\n \\n -- Timestamps\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for forms\\nCREATE INDEX IF NOT EXISTS idx_forms_name ON forms(name);\\nCREATE INDEX IF NOT EXISTS idx_forms_category ON forms(category);\\nCREATE INDEX IF NOT EXISTS idx_forms_active ON forms(is_active);\\nCREATE INDEX IF NOT EXISTS idx_forms_public ON forms(is_public);\\nCREATE INDEX IF NOT EXISTS idx_forms_created_by ON forms(created_by);\\n\\n-- =====================================================\\n-- Table: form_submissions\\n-- Description: Stores submitted form data\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_submissions (\\n id TEXT PRIMARY KEY,\\n form_id TEXT NOT NULL REFERENCES forms(id) ON DELETE CASCADE,\\n \\n -- Submission data\\n submission_data TEXT NOT NULL, -- JSON: The actual form data submitted\\n \\n -- Submission metadata\\n status TEXT DEFAULT 'pending', -- pending, reviewed, approved, rejected, spam\\n submission_number INTEGER, -- Sequential number per form\\n \\n -- User information (if authenticated)\\n user_id TEXT REFERENCES users(id), -- Submitter user ID (if logged in)\\n user_email TEXT, -- Email from form (or user account)\\n \\n -- Tracking information\\n ip_address TEXT, -- IP address of submitter\\n user_agent TEXT, -- Browser user agent\\n referrer TEXT, -- Page that referred to form\\n utm_source TEXT, -- UTM tracking params\\n utm_medium TEXT,\\n utm_campaign TEXT,\\n \\n -- Review/Processing\\n reviewed_by TEXT REFERENCES users(id), -- Admin who reviewed\\n reviewed_at INTEGER, -- Review timestamp\\n review_notes TEXT, -- Admin notes\\n \\n -- Flags\\n is_spam INTEGER DEFAULT 0, -- Spam flag\\n is_archived INTEGER DEFAULT 0, -- Archived flag\\n \\n -- Timestamps\\n submitted_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for submissions\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_form_id ON form_submissions(form_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_status ON form_submissions(status);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_user_id ON form_submissions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_email ON form_submissions(user_email);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_submitted_at ON form_submissions(submitted_at);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_spam ON form_submissions(is_spam);\\n\\n-- Trigger to auto-increment submission_number per form\\nCREATE TRIGGER IF NOT EXISTS set_submission_number\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE form_submissions \\n SET submission_number = (\\n SELECT COUNT(*) \\n FROM form_submissions \\n WHERE form_id = NEW.form_id \\n AND id <= NEW.id\\n )\\n WHERE id = NEW.id;\\nEND;\\n\\n-- Trigger to update form submission_count\\nCREATE TRIGGER IF NOT EXISTS increment_form_submission_count\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE forms \\n SET submission_count = submission_count + 1,\\n updated_at = unixepoch() * 1000\\n WHERE id = NEW.form_id;\\nEND;\\n\\n-- =====================================================\\n-- Table: form_files (Optional)\\n-- Description: Link form submissions to uploaded files\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_files (\\n id TEXT PRIMARY KEY,\\n submission_id TEXT NOT NULL REFERENCES form_submissions(id) ON DELETE CASCADE,\\n media_id TEXT NOT NULL REFERENCES media(id) ON DELETE CASCADE,\\n field_name TEXT NOT NULL, -- Form field that uploaded this file\\n uploaded_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for form files\\nCREATE INDEX IF NOT EXISTS idx_form_files_submission ON form_files(submission_id);\\nCREATE INDEX IF NOT EXISTS idx_form_files_media ON form_files(media_id);\\n\\n-- =====================================================\\n-- Sample Data: Create a default contact form\\n-- =====================================================\\n\\nINSERT OR IGNORE INTO forms (\\n id,\\n name,\\n display_name,\\n description,\\n category,\\n formio_schema,\\n settings,\\n is_active,\\n is_public,\\n created_at,\\n updated_at\\n) VALUES (\\n 'default-contact-form',\\n 'contact',\\n 'Contact Form',\\n 'A simple contact form for getting in touch',\\n 'contact',\\n '{\\\"components\\\":[]}',\\n '{\\\"emailNotifications\\\":false,\\\"successMessage\\\":\\\"Thank you for your submission!\\\",\\\"submitButtonText\\\":\\\"Submit\\\",\\\"requireAuth\\\":false}',\\n 1,\\n 1,\\n unixepoch() * 1000,\\n unixepoch() * 1000\\n);\\n\"\n },\n {\n id: '030',\n name: 'Add Turnstile To Forms',\n filename: '030_add_turnstile_to_forms.sql',\n description: 'Migration 030: Add Turnstile To Forms',\n sql: \"-- Add Turnstile configuration to forms table\\n-- This allows per-form Turnstile settings with global fallback\\n\\n-- Add columns (D1 may not support CHECK constraints in ALTER TABLE)\\nALTER TABLE forms ADD COLUMN turnstile_enabled INTEGER DEFAULT 0;\\nALTER TABLE forms ADD COLUMN turnstile_settings TEXT;\\n\\n-- Set default to inherit global settings for existing forms\\nUPDATE forms \\nSET turnstile_settings = '{\\\"inherit\\\":true}' \\nWHERE turnstile_settings IS NULL;\\n\\n-- Add index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_forms_turnstile ON forms(turnstile_enabled);\\n\"\n },\n {\n id: '031',\n name: 'Ai Search Plugin',\n filename: '031_ai_search_plugin.sql',\n description: 'Migration 031: Ai Search Plugin',\n sql: \"-- AI Search plugin settings\\nCREATE TABLE IF NOT EXISTS ai_search_settings (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n enabled BOOLEAN DEFAULT 0,\\n ai_mode_enabled BOOLEAN DEFAULT 1,\\n selected_collections TEXT, -- JSON array of collection IDs to index\\n dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index\\n autocomplete_enabled BOOLEAN DEFAULT 1,\\n cache_duration INTEGER DEFAULT 1, -- hours\\n results_limit INTEGER DEFAULT 20,\\n index_media BOOLEAN DEFAULT 0,\\n index_status TEXT, -- JSON object with status per collection\\n last_indexed_at INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Search history/analytics\\nCREATE TABLE IF NOT EXISTS ai_search_history (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n query TEXT NOT NULL,\\n mode TEXT, -- 'ai' or 'keyword'\\n results_count INTEGER,\\n user_id INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index metadata tracking (per collection)\\nCREATE TABLE IF NOT EXISTS ai_search_index_meta (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n collection_id INTEGER NOT NULL,\\n collection_name TEXT NOT NULL, -- Cache collection name for display\\n total_items INTEGER DEFAULT 0,\\n indexed_items INTEGER DEFAULT 0,\\n last_sync_at INTEGER,\\n status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'\\n error_message TEXT,\\n UNIQUE(collection_id)\\n);\\n\\n-- Indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);\\n\"\n },\n {\n id: '032',\n name: 'User Profiles',\n filename: '032_user_profiles.sql',\n description: 'Migration 032: User Profiles',\n sql: \"-- User Profiles Table (Core Migration)\\n-- Stores extended user profile data separate from auth concerns\\n-- Required by admin-users.ts for user edit page profile management\\n--\\n-- Originally introduced as app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\\n-- in upstream PR #508. Core routes (admin-users.ts) were updated to query this table in PR #512,\\n-- but no corresponding core migration was added. This migration corrects that gap.\\n--\\n-- IF NOT EXISTS guards ensure idempotency for databases that already have the table\\n-- from the app-level migration.\\n\\nCREATE TABLE IF NOT EXISTS user_profiles (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,\\n\\n display_name TEXT,\\n bio TEXT,\\n company TEXT,\\n job_title TEXT,\\n website TEXT,\\n location TEXT,\\n date_of_birth INTEGER,\\n data TEXT DEFAULT '{}',\\n\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index for fast user lookups\\nCREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);\\n\\n-- Trigger to auto-update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS user_profiles_updated_at\\n AFTER UPDATE ON user_profiles\\nBEGIN\\n UPDATE user_profiles SET updated_at = strftime('%s', 'now') * 1000 WHERE id = NEW.id;\\nEND;\\n\"\n },\n {\n id: '033',\n name: 'Form Content Integration',\n filename: '033_form_content_integration.sql',\n description: 'Migration 033: Form Content Integration',\n sql: \"-- Migration 033: Form-Content Integration\\n-- Adds bridge columns to link forms to collections and submissions to content items\\n\\n-- Add source_type and source_id to collections for form-derived collections\\nALTER TABLE collections ADD COLUMN source_type TEXT DEFAULT 'user';\\nALTER TABLE collections ADD COLUMN source_id TEXT;\\n\\n-- Index for efficient lookup of form-derived collections\\nCREATE INDEX IF NOT EXISTS idx_collections_source ON collections(source_type, source_id);\\n\\n-- Add content_id to form_submissions for linking to content items\\nALTER TABLE form_submissions ADD COLUMN content_id TEXT REFERENCES content(id);\\n\\n-- Index for efficient lookup by content_id\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_content_id ON form_submissions(content_id);\\n\\n-- Create system user for anonymous form submissions\\nINSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\\nVALUES ('system-form-submission', 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', NULL, 'viewer', 0, strftime('%s','now') * 1000, strftime('%s','now') * 1000);\\n\"\n },\n {\n id: '034',\n name: 'Security Audit Plugin',\n filename: '034_security_audit_plugin.sql',\n description: 'Migration 034: Security Audit Plugin',\n sql: \"-- Security Audit Plugin\\n-- Tracks login attempts, registrations, and security events for monitoring and brute-force detection\\n\\nCREATE TABLE IF NOT EXISTS security_events (\\n id TEXT PRIMARY KEY,\\n event_type TEXT NOT NULL,\\n severity TEXT NOT NULL DEFAULT 'info',\\n user_id TEXT,\\n email TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n country_code TEXT,\\n request_path TEXT,\\n request_method TEXT,\\n details TEXT,\\n fingerprint TEXT,\\n blocked INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type);\\nCREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_security_events_email ON security_events(email);\\nCREATE INDEX IF NOT EXISTS idx_security_events_ip ON security_events(ip_address);\\nCREATE INDEX IF NOT EXISTS idx_security_events_severity ON security_events(severity);\\nCREATE INDEX IF NOT EXISTS idx_security_events_created ON security_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_security_events_fingerprint ON security_events(fingerprint);\\n\"\n },\n {\n id: '035',\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql',\n description: 'Migration 035: User Profiles Data Column',\n sql: \"-- Migration 035: Add data column to user_profiles (no-op)\\n--\\n-- This migration originally added a missing 'data' column to user_profiles.\\n-- Migration 032 has since been updated to include the column in the CREATE TABLE,\\n-- so on fresh installs the column already exists by the time this runs.\\n--\\n-- The ALTER TABLE has been removed to prevent \\\"duplicate column name: data\\\" errors\\n-- during fresh installs (GitHub issue #771). Wrangler's migration runner does not\\n-- gracefully handle duplicate column errors like the runtime MigrationService does.\\n--\\n-- Existing databases that ran the old 032 (without the data column) get the column\\n-- added at runtime by the core MigrationService, which skips duplicate-column errors.\\n--\\n-- This file is kept as a no-op so that wrangler's migration tracking remains\\n-- consistent (it tracks migrations by filename).\\nSELECT 1;\\n\"\n },\n {\n id: '036',\n name: 'Analytics Events',\n filename: '036_analytics_events.sql',\n description: 'Migration 036: Analytics Events',\n sql: \"-- Migration 036: Analytics Events Table\\n-- Provides storage for user behavior event tracking (page views, custom events)\\n\\nCREATE TABLE IF NOT EXISTS analytics_events (\\n id TEXT PRIMARY KEY,\\n event TEXT NOT NULL,\\n category TEXT NOT NULL DEFAULT 'user-activity',\\n properties TEXT,\\n user_id TEXT,\\n session_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n path TEXT,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_event ON analytics_events(event);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_category ON analytics_events(category);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_user_id ON analytics_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_session_id ON analytics_events(session_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_created_at ON analytics_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_path ON analytics_events(path);\\n\"\n }\n]\n\n// Map for quick lookup by ID\nexport const migrationsByIdMap = new Map(\n bundledMigrations.map(m => [m.id, m])\n)\n\n// Get migration SQL by ID\nexport function getMigrationSQLById(id: string): string | null {\n return migrationsByIdMap.get(id)?.sql ?? null\n}\n\n// Get all migration info (without SQL for lighter payloads)\nexport function getMigrationList(): Array> {\n return bundledMigrations.map(({ sql, ...rest }) => rest)\n}\n","import { D1Database } from '@cloudflare/workers-types'\nimport { bundledMigrations, getMigrationSQLById, type BundledMigration } from '../db/migrations-bundle'\n\nexport interface Migration {\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n}\n\nexport interface MigrationStatus {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Migration[]\n}\n\nexport class MigrationService {\n constructor(private db: D1Database) {}\n\n /**\n * Initialize the migrations tracking table\n */\n async initializeMigrationsTable(): Promise {\n const createTableQuery = `\n CREATE TABLE IF NOT EXISTS migrations (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n filename TEXT NOT NULL,\n applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n checksum TEXT\n )\n `\n\n await this.db.prepare(createTableQuery).run()\n }\n\n /**\n * Get all available migrations from the bundled migrations\n */\n async getAvailableMigrations(): Promise {\n const migrations: Migration[] = []\n\n // Get applied migrations from database\n const appliedResult = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at ASC'\n ).all()\n\n const appliedMigrations = new Map(\n appliedResult.results?.map((row: any) => [row.id, row]) || []\n )\n\n // Auto-detect applied migrations by checking if their tables exist\n await this.autoDetectAppliedMigrations(appliedMigrations)\n\n // Use bundled migrations as the source of truth\n for (const bundled of bundledMigrations) {\n const applied = appliedMigrations.has(bundled.id)\n const appliedData = appliedMigrations.get(bundled.id)\n\n migrations.push({\n id: bundled.id,\n name: bundled.name,\n filename: bundled.filename,\n description: bundled.description,\n applied,\n appliedAt: applied ? appliedData?.applied_at : undefined,\n size: bundled.sql.length\n })\n }\n\n return migrations\n }\n\n /**\n * Auto-detect applied migrations by checking if their tables exist\n */\n private async autoDetectAppliedMigrations(appliedMigrations: Map): Promise {\n // Check if basic schema tables exist (migration 001)\n if (!appliedMigrations.has('001')) {\n const hasBasicTables = await this.checkTablesExist(['users', 'content', 'collections', 'media'])\n if (hasBasicTables) {\n appliedMigrations.set('001', {\n id: '001',\n applied_at: new Date().toISOString(),\n name: 'Initial Schema',\n filename: '001_initial_schema.sql'\n })\n await this.markMigrationApplied('001', 'Initial Schema', '001_initial_schema.sql')\n }\n }\n\n // Check if FAQ tables exist (migration 002)\n // Migration 002 creates only the 'faqs' table\n if (!appliedMigrations.has('002')) {\n const hasFaqTables = await this.checkTablesExist(['faqs'])\n if (hasFaqTables) {\n appliedMigrations.set('002', {\n id: '002',\n applied_at: new Date().toISOString(),\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql'\n })\n await this.markMigrationApplied('002', 'Faq Plugin', '002_faq_plugin.sql')\n }\n }\n\n // Check if stage 5 enhancement tables exist (migration 003)\n // Migration 003 creates content_fields, content_relationships, workflow_templates tables\n if (!appliedMigrations.has('003')) {\n const hasStage5Tables = await this.checkTablesExist(['content_fields', 'content_relationships', 'workflow_templates'])\n if (hasStage5Tables) {\n appliedMigrations.set('003', {\n id: '003',\n applied_at: new Date().toISOString(),\n name: 'Stage 5 Enhancements',\n filename: '003_stage5_enhancements.sql'\n })\n await this.markMigrationApplied('003', 'Stage 5 Enhancements', '003_stage5_enhancements.sql')\n }\n }\n\n // Check if testimonials table exists (migration 012)\n if (!appliedMigrations.has('012')) {\n const hasTestimonialsTables = await this.checkTablesExist(['testimonials'])\n if (hasTestimonialsTables) {\n appliedMigrations.set('012', {\n id: '012',\n applied_at: new Date().toISOString(),\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql'\n })\n await this.markMigrationApplied('012', 'Testimonials Plugin', '012_testimonials_plugin.sql')\n }\n }\n\n // Check if code_examples table exists (migration 013)\n if (!appliedMigrations.has('013')) {\n const hasCodeExamplesTables = await this.checkTablesExist(['code_examples'])\n if (hasCodeExamplesTables) {\n appliedMigrations.set('013', {\n id: '013',\n applied_at: new Date().toISOString(),\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql'\n })\n await this.markMigrationApplied('013', 'Code Examples Plugin', '013_code_examples_plugin.sql')\n }\n }\n\n // Check if user management tables exist (migration 004)\n if (!appliedMigrations.has('004')) {\n const hasUserTables = await this.checkTablesExist(['api_tokens', 'workflow_history'])\n if (hasUserTables) {\n appliedMigrations.set('004', {\n id: '004',\n applied_at: new Date().toISOString(),\n name: 'User Management',\n filename: '004_stage6_user_management.sql'\n })\n await this.markMigrationApplied('004', 'User Management', '004_stage6_user_management.sql')\n }\n }\n\n // Check if plugin system tables exist (migration 006)\n if (!appliedMigrations.has('006')) {\n const hasPluginTables = await this.checkTablesExist(['plugins', 'plugin_hooks'])\n if (hasPluginTables) {\n appliedMigrations.set('006', {\n id: '006',\n applied_at: new Date().toISOString(),\n name: 'Plugin System',\n filename: '006_plugin_system.sql'\n })\n await this.markMigrationApplied('006', 'Plugin System', '006_plugin_system.sql')\n }\n }\n\n // Check if managed column exists (migration 011)\n // This handles both cases:\n // 1. Migration not marked as applied but column exists -> mark as applied\n // 2. Migration marked as applied but column doesn't exist -> remove from applied (will re-run)\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!appliedMigrations.has('011') && hasManagedColumn) {\n appliedMigrations.set('011', {\n id: '011',\n applied_at: new Date().toISOString(),\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql'\n })\n await this.markMigrationApplied('011', 'Config Managed Collections', '011_config_managed_collections.sql')\n } else if (appliedMigrations.has('011') && !hasManagedColumn) {\n // Migration was marked as applied but column doesn't exist - remove it so it will re-run\n console.log('[Migration] Migration 011 marked as applied but managed column missing - will re-run')\n appliedMigrations.delete('011')\n await this.removeMigrationApplied('011')\n }\n\n // Check if system_logs table exists (migration 009)\n if (!appliedMigrations.has('009')) {\n const hasLoggingTables = await this.checkTablesExist(['system_logs', 'log_config'])\n if (hasLoggingTables) {\n appliedMigrations.set('009', {\n id: '009',\n applied_at: new Date().toISOString(),\n name: 'System Logging',\n filename: '009_system_logging.sql'\n })\n await this.markMigrationApplied('009', 'System Logging', '009_system_logging.sql')\n }\n }\n\n // Check if settings table exists (migration 018)\n if (!appliedMigrations.has('018')) {\n const hasSettingsTable = await this.checkTablesExist(['settings'])\n if (hasSettingsTable) {\n appliedMigrations.set('018', {\n id: '018',\n applied_at: new Date().toISOString(),\n name: 'Settings Table',\n filename: '018_settings_table.sql'\n })\n await this.markMigrationApplied('018', 'Settings Table', '018_settings_table.sql')\n }\n }\n\n // Check if forms tables exist (migration 029)\n // Migration 029 was reassigned between releases: older versions used it for \"Ai Search Plugin\",\n // newer versions use it for \"Add Forms System\". This handles the case where 029 is marked as\n // applied (from the old AI Search migration) but the forms tables don't actually exist.\n const hasFormsTables = await this.checkTablesExist(['forms', 'form_submissions', 'form_files'])\n if (!appliedMigrations.has('029') && hasFormsTables) {\n appliedMigrations.set('029', {\n id: '029',\n applied_at: new Date().toISOString(),\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql'\n })\n await this.markMigrationApplied('029', 'Add Forms System', '029_add_forms_system.sql')\n } else if (appliedMigrations.has('029') && !hasFormsTables) {\n // Migration was marked as applied (possibly from old \"Ai Search Plugin\" migration)\n // but forms tables don't exist - remove it so the forms migration will re-run\n console.log('[Migration] Migration 029 marked as applied but forms tables missing - will re-run')\n appliedMigrations.delete('029')\n await this.removeMigrationApplied('029')\n }\n\n // Check if user_profiles table exists (migration 032)\n // Table may already exist from app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\n if (!appliedMigrations.has('032')) {\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n appliedMigrations.set('032', {\n id: '032',\n applied_at: new Date().toISOString(),\n name: 'User Profiles',\n filename: '032_user_profiles.sql'\n })\n await this.markMigrationApplied('032', 'User Profiles', '032_user_profiles.sql')\n }\n }\n\n // Ensure user_profiles.data column exists (migration 035 is now a no-op).\n // Databases that ran the old 032 (without data column) need the column added.\n // Migration 035 was converted to a no-op to fix #771 (duplicate column error\n // on fresh installs), so we add the column here if it's missing.\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n const hasDataColumn = await this.checkColumnExists('user_profiles', 'data')\n if (!hasDataColumn) {\n try {\n await this.db.prepare(`ALTER TABLE user_profiles ADD COLUMN data TEXT DEFAULT '{}'`).run()\n console.log('[Migration] Added missing data column to user_profiles')\n } catch (error) {\n // Column may have been added concurrently; ignore duplicate column errors\n const msg = error instanceof Error ? error.message : String(error)\n if (!msg.includes('duplicate column name')) {\n console.error('[Migration] Failed to add data column to user_profiles:', msg)\n }\n }\n }\n }\n\n // Mark migration 035 as applied since it's now a no-op (column handled above)\n if (!appliedMigrations.has('035')) {\n const hasDataCol = hasUserProfilesTable && await this.checkColumnExists('user_profiles', 'data')\n if (hasDataCol) {\n appliedMigrations.set('035', {\n id: '035',\n applied_at: new Date().toISOString(),\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql'\n })\n await this.markMigrationApplied('035', 'User Profiles Data Column', '035_user_profiles_data_column.sql')\n }\n }\n }\n\n /**\n * Check if specific tables exist in the database\n */\n private async checkTablesExist(tableNames: string[]): Promise {\n try {\n for (const tableName of tableNames) {\n const result = await this.db.prepare(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`\n ).bind(tableName).first()\n\n if (!result) {\n return false\n }\n }\n return true\n } catch (error) {\n return false\n }\n }\n\n /**\n * Check if a specific column exists in a table\n */\n private async checkColumnExists(tableName: string, columnName: string): Promise {\n try {\n const result = await this.db.prepare(\n `SELECT * FROM pragma_table_info(?) WHERE name = ?`\n ).bind(tableName, columnName).first()\n\n return !!result\n } catch (error) {\n return false\n }\n }\n\n /**\n * Get migration status summary\n */\n async getMigrationStatus(): Promise {\n await this.initializeMigrationsTable()\n\n const migrations = await this.getAvailableMigrations()\n const appliedMigrations = migrations.filter(m => m.applied)\n const pendingMigrations = migrations.filter(m => !m.applied)\n\n const lastApplied = appliedMigrations.length > 0\n ? appliedMigrations[appliedMigrations.length - 1]?.appliedAt\n : undefined\n\n return {\n totalMigrations: migrations.length,\n appliedMigrations: appliedMigrations.length,\n pendingMigrations: pendingMigrations.length,\n lastApplied,\n migrations\n }\n }\n\n /**\n * Mark a migration as applied\n */\n async markMigrationApplied(migrationId: string, name: string, filename: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'INSERT OR REPLACE INTO migrations (id, name, filename, applied_at) VALUES (?, ?, ?, CURRENT_TIMESTAMP)'\n ).bind(migrationId, name, filename).run()\n }\n\n /**\n * Remove a migration from the applied list (so it can be re-run)\n */\n async removeMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'DELETE FROM migrations WHERE id = ?'\n ).bind(migrationId).run()\n }\n\n /**\n * Check if a specific migration has been applied\n */\n async isMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM migrations WHERE id = ?'\n ).bind(migrationId).first()\n\n return (result?.count as number) > 0\n }\n\n /**\n * Get the last applied migration\n */\n async getLastAppliedMigration(): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at DESC LIMIT 1'\n ).first()\n\n if (!result) return null\n\n return {\n id: result.id as string,\n name: result.name as string,\n filename: result.filename as string,\n applied: true,\n appliedAt: result.applied_at as string\n }\n }\n\n /**\n * Run pending migrations\n */\n async runPendingMigrations(): Promise<{ success: boolean; message: string; applied: string[]; errors: string[] }> {\n await this.initializeMigrationsTable()\n\n const status = await this.getMigrationStatus()\n const pendingMigrations = status.migrations.filter(m => !m.applied)\n\n if (pendingMigrations.length === 0) {\n return {\n success: true,\n message: 'All migrations are up to date',\n applied: [],\n errors: []\n }\n }\n\n // Actually execute the migration files\n const applied: string[] = []\n const errors: string[] = []\n\n for (const migration of pendingMigrations) {\n try {\n console.log(`[Migration] Applying ${migration.id}: ${migration.name}`)\n await this.applyMigration(migration)\n await this.markMigrationApplied(migration.id, migration.name, migration.filename)\n applied.push(migration.id)\n console.log(`[Migration] Successfully applied ${migration.id}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`[Migration] Failed to apply migration ${migration.id}:`, errorMessage)\n errors.push(`${migration.id}: ${errorMessage}`)\n // Continue with other migrations instead of stopping on first failure\n // This allows independent migrations to still be applied\n }\n }\n\n if (errors.length > 0 && applied.length === 0) {\n return {\n success: false,\n message: `Failed to apply migrations: ${errors.join('; ')}`,\n applied,\n errors\n }\n }\n\n return {\n success: true,\n message: applied.length > 0\n ? `Applied ${applied.length} migration(s)${errors.length > 0 ? ` (${errors.length} failed)` : ''}`\n : 'No migrations applied',\n applied,\n errors\n }\n }\n\n /**\n * Apply a specific migration\n */\n private async applyMigration(migration: Migration): Promise {\n // Get the actual migration SQL from the bundle\n const migrationSQL = getMigrationSQLById(migration.id)\n\n if (migrationSQL === null) {\n throw new Error(`Migration SQL not found for ${migration.id}`)\n }\n\n if (migrationSQL.trim() === '') {\n console.log(`[Migration] Skipping empty migration ${migration.id}`)\n return\n }\n\n // Split SQL into individual statements, handling triggers properly\n const statements = this.splitSQLStatements(migrationSQL)\n\n for (const statement of statements) {\n if (statement.trim()) {\n try {\n await this.db.prepare(statement).run()\n } catch (error) {\n // Check if it's a \"already exists\" type error and skip it\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('already exists') ||\n errorMessage.includes('duplicate column name') ||\n errorMessage.includes('UNIQUE constraint failed')) {\n console.log(`[Migration] Skipping (already exists): ${statement.substring(0, 50)}...`)\n continue\n }\n console.error(`[Migration] Error executing statement: ${statement.substring(0, 100)}...`)\n throw error\n }\n }\n }\n }\n\n /**\n * Split SQL into statements, handling CREATE TRIGGER properly\n */\n private splitSQLStatements(sql: string): string[] {\n const statements: string[] = []\n let current = ''\n let inTrigger = false\n\n const lines = sql.split('\\n')\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n // Skip comments and empty lines\n if (trimmed.startsWith('--') || trimmed.length === 0) {\n continue\n }\n\n // Check if we're entering a trigger\n if (trimmed.toUpperCase().includes('CREATE TRIGGER')) {\n inTrigger = true\n }\n\n current += line + '\\n'\n\n // Check if we're exiting a trigger\n if (inTrigger && trimmed.toUpperCase() === 'END;') {\n statements.push(current.trim())\n current = ''\n inTrigger = false\n }\n // Check for regular statement end (not in trigger)\n else if (!inTrigger && trimmed.endsWith(';')) {\n statements.push(current.trim())\n current = ''\n }\n }\n\n // Add any remaining statement\n if (current.trim()) {\n statements.push(current.trim())\n }\n\n return statements.filter(s => s.length > 0)\n }\n\n /**\n * Validate database schema\n */\n async validateSchema(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n // Basic table existence checks\n const requiredTables = [\n 'users', 'content', 'collections', 'media'\n ]\n\n for (const table of requiredTables) {\n try {\n await this.db.prepare(`SELECT COUNT(*) FROM ${table} LIMIT 1`).first()\n } catch (error) {\n issues.push(`Missing table: ${table}`)\n }\n }\n\n // Check for managed column in collections\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!hasManagedColumn) {\n issues.push('Missing column: collections.managed')\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-ABB34XUS.cjs.map b/packages/core/dist/chunk-ABB34XUS.cjs.map deleted file mode 100644 index 265930b92..000000000 --- a/packages/core/dist/chunk-ABB34XUS.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../../node_modules/semver/internal/constants.js","../../../node_modules/semver/internal/debug.js","../../../node_modules/semver/internal/re.js","../../../node_modules/semver/internal/parse-options.js","../../../node_modules/semver/internal/identifiers.js","../../../node_modules/semver/classes/semver.js","../../../node_modules/semver/functions/parse.js","../../../node_modules/semver/functions/valid.js","../../../node_modules/semver/functions/clean.js","../../../node_modules/semver/functions/inc.js","../../../node_modules/semver/functions/diff.js","../../../node_modules/semver/functions/major.js","../../../node_modules/semver/functions/minor.js","../../../node_modules/semver/functions/patch.js","../../../node_modules/semver/functions/prerelease.js","../../../node_modules/semver/functions/compare.js","../../../node_modules/semver/functions/rcompare.js","../../../node_modules/semver/functions/compare-loose.js","../../../node_modules/semver/functions/compare-build.js","../../../node_modules/semver/functions/sort.js","../../../node_modules/semver/functions/rsort.js","../../../node_modules/semver/functions/gt.js","../../../node_modules/semver/functions/lt.js","../../../node_modules/semver/functions/eq.js","../../../node_modules/semver/functions/neq.js","../../../node_modules/semver/functions/gte.js","../../../node_modules/semver/functions/lte.js","../../../node_modules/semver/functions/cmp.js","../../../node_modules/semver/functions/coerce.js","../../../node_modules/semver/internal/lrucache.js","../../../node_modules/semver/classes/range.js","../../../node_modules/semver/classes/comparator.js","../../../node_modules/semver/functions/satisfies.js","../../../node_modules/semver/ranges/to-comparators.js","../../../node_modules/semver/ranges/max-satisfying.js","../../../node_modules/semver/ranges/min-satisfying.js","../../../node_modules/semver/ranges/min-version.js","../../../node_modules/semver/ranges/valid.js","../../../node_modules/semver/ranges/outside.js","../../../node_modules/semver/ranges/gtr.js","../../../node_modules/semver/ranges/ltr.js","../../../node_modules/semver/ranges/intersects.js","../../../node_modules/semver/ranges/simplify.js","../../../node_modules/semver/ranges/subset.js","../../../node_modules/semver/index.js","../src/plugins/hook-system.ts","../src/plugins/plugin-validator.ts","../src/plugins/plugin-registry.ts","../src/plugins/plugin-manager.ts","../src/plugins/core-plugins/turnstile-plugin/middleware/verify.ts","../src/plugins/core-plugins/turnstile-plugin/index.ts"],"names":["__commonJS","exports","z","require_valid","require_semver","__toESM","semver","HOOKS","Hono","TurnstileService","PluginBuilder","manifest_default"],"mappings":"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","file":"chunk-ABB34XUS.cjs","sourcesContent":["'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a === b ? 0 : a < b ? -1 : 1\n }\n\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n if (this.major < other.major) {\n return -1\n }\n if (this.major > other.major) {\n return 1\n }\n if (this.minor < other.minor) {\n return -1\n }\n if (this.minor > other.minor) {\n return 1\n }\n if (this.patch < other.patch) {\n return -1\n }\n if (this.patch > other.patch) {\n return 1\n }\n return 0\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n comp = comp.replace(re[t.BUILD], '')\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","/**\n * Hook System Implementation\n * \n * Provides event-driven extensibility for plugins\n */\n\nimport { HookSystem, HookHandler, PluginHook, HookContext } from '../types'\n\nexport class HookSystemImpl implements HookSystem {\n private hooks: Map = new Map()\n private executing: Set = new Set()\n\n /**\n * Register a hook handler\n */\n register(hookName: string, handler: HookHandler, priority: number = 10): void {\n if (!this.hooks.has(hookName)) {\n this.hooks.set(hookName, [])\n }\n\n const hooks = this.hooks.get(hookName)!\n const hook: PluginHook = {\n name: hookName,\n handler,\n priority,\n }\n\n // Insert hook in priority order (lower priority = earlier execution)\n const insertIndex = hooks.findIndex(h => h.priority! > priority)\n if (insertIndex === -1) {\n hooks.push(hook)\n } else {\n hooks.splice(insertIndex, 0, hook)\n }\n\n console.debug(`Hook registered: ${hookName} (priority: ${priority})`)\n }\n\n /**\n * Execute all handlers for a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n const hooks = this.hooks.get(hookName)\n if (!hooks || hooks.length === 0) {\n return data\n }\n\n // Prevent infinite recursion\n if (this.executing.has(hookName)) {\n console.warn(`Hook recursion detected for: ${hookName}`)\n return data\n }\n\n this.executing.add(hookName)\n\n try {\n let result = data\n let cancelled = false\n\n const hookContext: HookContext = {\n plugin: '', // Will be set by the plugin manager\n context: context || {},\n cancel: () => { cancelled = true }\n }\n\n for (const hook of hooks) {\n if (cancelled) {\n console.debug(`Hook execution cancelled: ${hookName}`)\n break\n }\n\n try {\n console.debug(`Executing hook: ${hookName} (priority: ${hook.priority})`)\n result = await hook.handler(result, hookContext)\n } catch (error) {\n console.error(`Hook execution failed: ${hookName}`, error)\n // Continue executing other hooks unless it's a critical error\n if (error instanceof Error && error.message.includes('CRITICAL')) {\n throw error\n }\n }\n }\n\n return result\n } finally {\n this.executing.delete(hookName)\n }\n }\n\n /**\n * Remove a hook handler\n */\n unregister(hookName: string, handler: HookHandler): void {\n const hooks = this.hooks.get(hookName)\n if (!hooks) return\n\n const index = hooks.findIndex(h => h.handler === handler)\n if (index !== -1) {\n hooks.splice(index, 1)\n console.debug(`Hook unregistered: ${hookName}`)\n }\n\n // Clean up empty hook arrays\n if (hooks.length === 0) {\n this.hooks.delete(hookName)\n }\n }\n\n /**\n * Get all registered hooks for a name\n */\n getHooks(hookName: string): PluginHook[] {\n return this.hooks.get(hookName) || []\n }\n\n /**\n * Get all registered hook names\n */\n getHookNames(): string[] {\n return Array.from(this.hooks.keys())\n }\n\n /**\n * Get hook statistics\n */\n getStats(): { hookName: string; handlerCount: number }[] {\n return Array.from(this.hooks.entries()).map(([hookName, handlers]) => ({\n hookName,\n handlerCount: handlers.length\n }))\n }\n\n /**\n * Clear all hooks (useful for testing)\n */\n clear(): void {\n this.hooks.clear()\n this.executing.clear()\n }\n\n /**\n * Create a scoped hook system for a plugin\n */\n createScope(_pluginName: string): ScopedHookSystem {\n return new ScopedHookSystem(this)\n }\n}\n\n/**\n * Scoped hook system for individual plugins\n */\nexport class ScopedHookSystem {\n private registeredHooks: { hookName: string; handler: HookHandler }[] = []\n\n constructor(\n private parent: HookSystemImpl\n ) {}\n\n /**\n * Register a hook (scoped to this plugin)\n */\n register(hookName: string, handler: HookHandler, priority?: number): void {\n this.parent.register(hookName, handler, priority)\n this.registeredHooks.push({ hookName, handler })\n }\n\n /**\n * Execute a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n return this.parent.execute(hookName, data, context)\n }\n\n /**\n * Unregister a specific hook\n */\n unregister(hookName: string, handler: HookHandler): void {\n this.parent.unregister(hookName, handler)\n const index = this.registeredHooks.findIndex(\n h => h.hookName === hookName && h.handler === handler\n )\n if (index !== -1) {\n this.registeredHooks.splice(index, 1)\n }\n }\n\n /**\n * Unregister all hooks for this plugin\n */\n unregisterAll(): void {\n for (const { hookName, handler } of this.registeredHooks) {\n this.parent.unregister(hookName, handler)\n }\n this.registeredHooks.length = 0\n }\n\n /**\n * Get hooks registered by this plugin\n */\n getRegisteredHooks(): { hookName: string; handler: HookHandler }[] {\n return [...this.registeredHooks]\n }\n}\n\n/**\n * Hook utilities\n */\nexport class HookUtils {\n /**\n * Create a hook name with namespace\n */\n static createHookName(namespace: string, event: string): string {\n return `${namespace}:${event}`\n }\n\n /**\n * Parse a hook name to extract namespace and event\n */\n static parseHookName(hookName: string): { namespace: string; event: string } {\n const parts = hookName.split(':')\n return {\n namespace: parts[0] || '',\n event: parts.slice(1).join(':') || ''\n }\n }\n\n /**\n * Create a middleware that executes hooks\n */\n static createHookMiddleware(\n hookSystem: HookSystem,\n beforeHook?: string,\n afterHook?: string\n ) {\n return async (c: any, next: any) => {\n if (beforeHook) {\n const beforeData = { request: c.req, context: c }\n await hookSystem.execute(beforeHook, beforeData)\n }\n\n await next()\n\n if (afterHook) {\n const afterData = { request: c.req, response: c.res, context: c }\n await hookSystem.execute(afterHook, afterData)\n }\n }\n }\n\n /**\n * Create a debounced hook handler\n */\n static debounce(handler: HookHandler, delay: number): HookHandler {\n let timeoutId: any\n \n return async (data: any, context: HookContext) => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n return new Promise((resolve, reject) => {\n timeoutId = setTimeout(async () => {\n try {\n const result = await handler(data, context)\n resolve(result)\n } catch (error) {\n reject(error)\n }\n }, delay)\n })\n }\n }\n\n /**\n * Create a throttled hook handler\n */\n static throttle(handler: HookHandler, limit: number): HookHandler {\n let lastExecution = 0\n\n return async (data: any, context: HookContext) => {\n const now = Date.now()\n if (now - lastExecution >= limit) {\n lastExecution = now\n return handler(data, context)\n }\n return data\n }\n }\n}","/**\n * Plugin Validator\n * \n * Validates plugin definitions, dependencies, and compatibility\n */\n\nimport { z } from 'zod'\nimport { Plugin, PluginValidator as IPluginValidator, PluginValidationResult, PluginRegistry } from '../types'\nimport semver from 'semver'\n\n// Zod schemas for plugin validation\nconst PluginAuthorSchema = z.object({\n name: z.string().min(1),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n})\n\nconst PluginRoutesSchema = z.object({\n path: z.string().min(1),\n handler: z.any(), // Hono instance\n description: z.string().optional(),\n requiresAuth: z.boolean().optional(),\n roles: z.array(z.string()).optional(),\n priority: z.number().optional(),\n})\n\nconst PluginMiddlewareSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n description: z.string().optional(),\n priority: z.number().optional(),\n routes: z.array(z.string()).optional(),\n global: z.boolean().optional(),\n})\n\nconst PluginModelSchema = z.object({\n name: z.string().min(1),\n tableName: z.string().min(1),\n schema: z.any(), // Zod schema\n migrations: z.array(z.string()),\n relationships: z.array(z.object({\n type: z.enum(['oneToOne', 'oneToMany', 'manyToMany']),\n target: z.string(),\n foreignKey: z.string().optional(),\n joinTable: z.string().optional(),\n })).optional(),\n extendsContent: z.boolean().optional(),\n})\n\nconst PluginServiceSchema = z.object({\n name: z.string().min(1),\n implementation: z.any(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n singleton: z.boolean().optional(),\n})\n\nconst PluginAdminPageSchema = z.object({\n path: z.string().min(1),\n title: z.string().min(1),\n component: z.string().min(1),\n description: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n menuItem: z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n }).optional(),\n icon: z.string().optional(),\n})\n\nconst PluginComponentSchema = z.object({\n name: z.string().min(1),\n template: z.function(),\n description: z.string().optional(),\n propsSchema: z.any().optional(), // Zod schema\n})\n\nconst PluginHookSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n priority: z.number().optional(),\n description: z.string().optional(),\n})\n\nconst PluginSchema = z.object({\n name: z.string().min(1).regex(/^[a-z0-9-]+$/, 'Plugin name must be lowercase with hyphens'),\n version: z.string().refine(v => semver.valid(v), 'Version must be valid semver'),\n description: z.string().optional(),\n author: PluginAuthorSchema.optional(),\n dependencies: z.array(z.string()).optional(),\n compatibility: z.string().optional(),\n license: z.string().optional(),\n \n // Extension points\n routes: z.array(PluginRoutesSchema).optional(),\n middleware: z.array(PluginMiddlewareSchema).optional(),\n models: z.array(PluginModelSchema).optional(),\n services: z.array(PluginServiceSchema).optional(),\n adminPages: z.array(PluginAdminPageSchema).optional(),\n adminComponents: z.array(PluginComponentSchema).optional(),\n menuItems: z.array(z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n })).optional(),\n hooks: z.array(PluginHookSchema).optional(),\n \n // Lifecycle hooks\n install: z.function().optional(),\n uninstall: z.function().optional(),\n activate: z.function().optional(),\n deactivate: z.function().optional(),\n configure: z.function().optional(),\n})\n\nexport class PluginValidator implements IPluginValidator {\n private static readonly RESERVED_NAMES = [\n 'core', 'system', 'admin', 'api', 'auth', 'content', 'media', 'users', 'collections'\n ]\n\n private static readonly RESERVED_PATHS = [\n '/admin', '/api', '/auth', '/docs', '/media', '/_assets'\n ]\n\n /**\n * Validate plugin definition\n */\n validate(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n try {\n // Schema validation\n const result = PluginSchema.safeParse(plugin)\n if (!result.success) {\n result.error.issues.forEach((err: any) => {\n errors.push(`${err.path.join('.')}: ${err.message}`)\n })\n }\n\n // Reserved name validation\n if (PluginValidator.RESERVED_NAMES.includes(plugin.name)) {\n errors.push(`Plugin name \"${plugin.name}\" is reserved`)\n }\n\n // Route path validation\n if (plugin.routes) {\n for (const route of plugin.routes) {\n if (PluginValidator.RESERVED_PATHS.some(path => route.path.startsWith(path))) {\n errors.push(`Route path \"${route.path}\" conflicts with reserved system path`)\n }\n \n if (!route.path.startsWith('/')) {\n errors.push(`Route path \"${route.path}\" must start with /`)\n }\n }\n }\n\n // Model validation\n if (plugin.models) {\n const modelNames = new Set()\n const tableNames = new Set()\n \n for (const model of plugin.models) {\n // Check for duplicate model names\n if (modelNames.has(model.name)) {\n errors.push(`Duplicate model name: ${model.name}`)\n }\n modelNames.add(model.name)\n \n // Check for duplicate table names\n if (tableNames.has(model.tableName)) {\n errors.push(`Duplicate table name: ${model.tableName}`)\n }\n tableNames.add(model.tableName)\n \n // Validate table name format\n if (!/^[a-z][a-z0-9_]*$/.test(model.tableName)) {\n errors.push(`Invalid table name format: ${model.tableName}`)\n }\n \n // Check for system table conflicts\n const systemTables = ['users', 'collections', 'content', 'content_versions', 'media', 'api_tokens']\n if (systemTables.includes(model.tableName)) {\n errors.push(`Table name \"${model.tableName}\" conflicts with system table`)\n }\n }\n }\n\n // Service validation\n if (plugin.services) {\n const serviceNames = new Set()\n \n for (const service of plugin.services) {\n if (serviceNames.has(service.name)) {\n errors.push(`Duplicate service name: ${service.name}`)\n }\n serviceNames.add(service.name)\n \n // Check for system service conflicts\n const systemServices = ['auth', 'content', 'media', 'cdn']\n if (systemServices.includes(service.name)) {\n warnings.push(`Service name \"${service.name}\" conflicts with system service`)\n }\n }\n }\n\n // Admin page validation\n if (plugin.adminPages) {\n const pagePaths = new Set()\n \n for (const page of plugin.adminPages) {\n if (pagePaths.has(page.path)) {\n errors.push(`Duplicate admin page path: ${page.path}`)\n }\n pagePaths.add(page.path)\n \n if (!page.path.startsWith('/')) {\n errors.push(`Admin page path \"${page.path}\" must start with /`)\n }\n \n // Check for system admin page conflicts\n const systemPaths = ['/', '/collections', '/content', '/media', '/users', '/settings']\n if (systemPaths.includes(page.path)) {\n errors.push(`Admin page path \"${page.path}\" conflicts with system page`)\n }\n }\n }\n\n // Component validation\n if (plugin.adminComponents) {\n const componentNames = new Set()\n \n for (const component of plugin.adminComponents) {\n if (componentNames.has(component.name)) {\n errors.push(`Duplicate component name: ${component.name}`)\n }\n componentNames.add(component.name)\n \n // Check for system component conflicts\n const systemComponents = ['table', 'form', 'alert', 'media-grid', 'pagination']\n if (systemComponents.includes(component.name)) {\n warnings.push(`Component name \"${component.name}\" conflicts with system component`)\n }\n }\n }\n\n // Hook validation\n if (plugin.hooks) {\n for (const hook of plugin.hooks) {\n if (!hook.name.includes(':')) {\n warnings.push(`Hook name \"${hook.name}\" should include namespace (e.g., \"plugin:event\")`)\n }\n }\n }\n\n // Dependency cycle detection (basic)\n if (plugin.dependencies?.includes(plugin.name)) {\n errors.push(`Plugin cannot depend on itself`)\n }\n\n // License validation\n if (plugin.license) {\n const validLicenses = ['MIT', 'Apache-2.0', 'GPL-3.0', 'BSD-3-Clause', 'ISC']\n if (!validLicenses.includes(plugin.license)) {\n warnings.push(`License \"${plugin.license}\" is not a common SPDX identifier`)\n }\n }\n\n // Performance warnings\n if (plugin.middleware && plugin.middleware.length > 5) {\n warnings.push(`Plugin defines ${plugin.middleware.length} middleware functions, consider consolidating`)\n }\n\n if (plugin.hooks && plugin.hooks.length > 10) {\n warnings.push(`Plugin defines ${plugin.hooks.length} hooks, ensure they are necessary`)\n }\n\n } catch (error) {\n errors.push(`Validation error: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin dependencies\n */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.dependencies || plugin.dependencies.length === 0) {\n return { valid: true, errors, warnings }\n }\n\n // Check if all dependencies are registered\n for (const depName of plugin.dependencies) {\n if (!registry.has(depName)) {\n errors.push(`Dependency \"${depName}\" is not registered`)\n continue\n }\n\n const dependency = registry.get(depName)!\n \n // Check dependency version compatibility\n if (dependency.compatibility && plugin.compatibility) {\n if (!this.isCompatible(dependency.compatibility, plugin.compatibility)) {\n warnings.push(`Potential compatibility issue with dependency \"${depName}\"`)\n }\n }\n }\n\n // Check for circular dependencies\n const visited = new Set()\n const visiting = new Set()\n \n const checkCircular = (name: string): boolean => {\n if (visiting.has(name)) return true\n if (visited.has(name)) return false\n \n visiting.add(name)\n \n const current = registry.get(name)\n if (current?.dependencies) {\n for (const depName of current.dependencies) {\n if (checkCircular(depName)) {\n errors.push(`Circular dependency detected: ${name} -> ${depName}`)\n return true\n }\n }\n }\n \n visiting.delete(name)\n visited.add(name)\n return false\n }\n\n checkCircular(plugin.name)\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin compatibility with SonicJS version\n */\n validateCompatibility(plugin: Plugin, sonicVersion: string): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.compatibility) {\n warnings.push('Plugin does not specify compatibility version')\n return { valid: true, errors, warnings }\n }\n\n try {\n if (!semver.satisfies(sonicVersion, plugin.compatibility)) {\n errors.push(`Plugin requires SonicJS ${plugin.compatibility}, but current version is ${sonicVersion}`)\n }\n } catch (error) {\n errors.push(`Invalid compatibility version format: ${plugin.compatibility}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Check if two version ranges are compatible\n */\n private isCompatible(version1: string, version2: string): boolean {\n try {\n // Simple compatibility check - can be enhanced\n return semver.intersects(version1, version2)\n } catch {\n return false\n }\n }\n\n /**\n * Validate plugin security constraints\n */\n validateSecurity(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n // Check for potentially dangerous patterns\n const pluginCode = JSON.stringify(plugin)\n \n // Check for eval or Function constructor usage\n if (pluginCode.includes('eval(') || pluginCode.includes('Function(')) {\n errors.push('Plugin contains potentially dangerous code execution patterns')\n }\n\n // Check for file system access attempts\n if (pluginCode.includes('fs.') || pluginCode.includes('require(')) {\n warnings.push('Plugin may attempt file system access (not available in Cloudflare Workers)')\n }\n\n // Check for network access patterns\n if (pluginCode.includes('fetch(') || pluginCode.includes('XMLHttpRequest')) {\n warnings.push('Plugin contains network access code - ensure it follows security guidelines')\n }\n\n // Check for sensitive data patterns\n const sensitivePatterns = ['password', 'secret', 'key', 'token', 'credential']\n for (const pattern of sensitivePatterns) {\n if (pluginCode.toLowerCase().includes(pattern)) {\n warnings.push(`Plugin code contains \"${pattern}\" - ensure sensitive data is properly handled`)\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n}","/**\n * Plugin Registry Implementation\n * \n * Manages plugin registration, activation, and lifecycle\n */\n\nimport { Plugin, PluginRegistry, PluginConfig, PluginStatus } from '../types'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginRegistryImpl implements PluginRegistry {\n private plugins: Map = new Map()\n private configs: Map = new Map()\n private statuses: Map = new Map()\n private validator: PluginValidator\n\n constructor(validator?: PluginValidator) {\n this.validator = validator || new PluginValidator()\n }\n\n /**\n * Get plugin by name\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name)\n }\n\n /**\n * Get all registered plugins\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values())\n }\n\n /**\n * Get active plugins\n */\n getActive(): Plugin[] {\n return this.getAll().filter(plugin => {\n const status = this.statuses.get(plugin.name)\n return status?.active === true\n })\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise {\n console.info(`Registering plugin: ${plugin.name} v${plugin.version}`)\n\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed for ${plugin.name}: ${validation.errors.join(', ')}`)\n }\n\n // Check for conflicts\n if (this.plugins.has(plugin.name)) {\n const existingPlugin = this.plugins.get(plugin.name)!\n if (existingPlugin.version !== plugin.version) {\n console.warn(`Plugin ${plugin.name} is already registered with version ${existingPlugin.version}, replacing with ${plugin.version}`)\n }\n }\n\n // Validate dependencies\n const depValidation = this.validator.validateDependencies(plugin, this)\n if (!depValidation.valid) {\n throw new Error(`Plugin dependency validation failed for ${plugin.name}: ${depValidation.errors.join(', ')}`)\n }\n\n // Register plugin\n this.plugins.set(plugin.name, plugin)\n \n // Initialize status\n this.statuses.set(plugin.name, {\n name: plugin.name,\n version: plugin.version,\n active: false,\n installed: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin registered successfully: ${plugin.name}`)\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise {\n console.info(`Unregistering plugin: ${name}`)\n\n if (!this.plugins.has(name)) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n // Check if other plugins depend on this one\n const dependents = this.getDependents(name)\n if (dependents.length > 0) {\n throw new Error(`Cannot unregister ${name}: plugins ${dependents.join(', ')} depend on it`)\n }\n\n // Remove plugin\n this.plugins.delete(name)\n this.configs.delete(name)\n this.statuses.delete(name)\n\n console.info(`Plugin unregistered: ${name}`)\n }\n\n /**\n * Check if plugin is registered\n */\n has(name: string): boolean {\n return this.plugins.has(name)\n }\n\n /**\n * Activate a plugin\n */\n async activate(name: string): Promise {\n console.info(`Activating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (status?.active) {\n console.warn(`Plugin ${name} is already active`)\n return\n }\n\n try {\n // Activate dependencies first\n if (plugin.dependencies) {\n for (const depName of plugin.dependencies) {\n const depStatus = this.statuses.get(depName)\n if (!depStatus?.active) {\n await this.activate(depName)\n }\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin activated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n active: false,\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to activate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Deactivate a plugin\n */\n async deactivate(name: string): Promise {\n console.info(`Deactivating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (!status?.active) {\n console.warn(`Plugin ${name} is not active`)\n return\n }\n\n try {\n // Deactivate dependents first\n const dependents = this.getDependents(name)\n for (const depName of dependents) {\n const depStatus = this.statuses.get(depName)\n if (depStatus?.active) {\n await this.deactivate(depName)\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: false,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin deactivated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to deactivate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Get plugin configuration\n */\n getConfig(name: string): PluginConfig | undefined {\n return this.configs.get(name)\n }\n\n /**\n * Set plugin configuration\n */\n setConfig(name: string, config: PluginConfig): void {\n this.configs.set(name, {\n ...config,\n updatedAt: Date.now()\n })\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus | undefined {\n return this.statuses.get(name)\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): Map {\n return new Map(this.statuses)\n }\n\n /**\n * Update plugin status\n */\n private updateStatus(name: string, updates: Partial): void {\n const current = this.statuses.get(name)\n if (current) {\n this.statuses.set(name, { ...current, ...updates })\n }\n }\n\n /**\n * Get plugins that depend on the specified plugin\n */\n private getDependents(name: string): string[] {\n const dependents: string[] = []\n \n for (const [pluginName, plugin] of this.plugins) {\n if (plugin.dependencies?.includes(name)) {\n dependents.push(pluginName)\n }\n }\n \n return dependents\n }\n\n /**\n * Get dependency graph\n */\n getDependencyGraph(): Map {\n const graph = new Map()\n \n for (const [name, plugin] of this.plugins) {\n graph.set(name, plugin.dependencies || [])\n }\n \n return graph\n }\n\n /**\n * Resolve plugin load order based on dependencies\n */\n resolveLoadOrder(): string[] {\n const graph = this.getDependencyGraph()\n const visited = new Set()\n const visiting = new Set()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected involving plugin: ${name}`)\n }\n\n visiting.add(name)\n \n const dependencies = graph.get(name) || []\n for (const dep of dependencies) {\n if (!graph.has(dep)) {\n throw new Error(`Plugin ${name} depends on ${dep}, but ${dep} is not registered`)\n }\n visit(dep)\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n for (const name of graph.keys()) {\n visit(name)\n }\n\n return result\n }\n\n /**\n * Export plugin configuration\n */\n exportConfig(): { plugins: PluginConfig[] } {\n const plugins: PluginConfig[] = []\n \n for (const [name, config] of this.configs) {\n plugins.push({\n ...config,\n name\n } as PluginConfig & { name: string })\n }\n \n return { plugins }\n }\n\n /**\n * Import plugin configuration\n */\n importConfig(config: { plugins: PluginConfig[] }): void {\n for (const pluginConfig of config.plugins) {\n if ('name' in pluginConfig) {\n const { name, ...rest } = pluginConfig as PluginConfig & { name: string }\n this.setConfig(name, rest)\n }\n }\n }\n\n /**\n * Clear all plugins (useful for testing)\n */\n clear(): void {\n this.plugins.clear()\n this.configs.clear()\n this.statuses.clear()\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n total: number\n active: number\n inactive: number\n withErrors: number\n } {\n const statuses = Array.from(this.statuses.values())\n \n return {\n total: statuses.length,\n active: statuses.filter(s => s.active).length,\n inactive: statuses.filter(s => !s.active).length,\n withErrors: statuses.filter(s => s.hasErrors).length\n }\n }\n}","/**\n * Plugin Manager\n * \n * Central orchestrator for the plugin system\n */\n\nimport { Hono } from 'hono'\nimport { Plugin, PluginManager as IPluginManager, PluginRegistry, PluginConfig, PluginContext, PluginStatus, HookSystem, PluginLogger, HOOKS } from '../types'\nimport { PluginRegistryImpl } from './plugin-registry'\nimport { HookSystemImpl, ScopedHookSystem } from './hook-system'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginManager implements IPluginManager {\n public readonly registry: PluginRegistry\n public readonly hooks: HookSystem\n private validator: PluginValidator\n private context?: PluginContext\n private scopedHooks: Map = new Map()\n private pluginRoutes: Map = new Map()\n\n constructor() {\n this.validator = new PluginValidator()\n this.registry = new PluginRegistryImpl(this.validator)\n this.hooks = new HookSystemImpl()\n }\n\n /**\n * Initialize plugin system\n */\n async initialize(context: PluginContext): Promise {\n console.info('Initializing plugin system...')\n \n this.context = context\n \n // Execute app init hook\n await this.hooks.execute(HOOKS.APP_INIT, {\n pluginManager: this,\n context\n })\n\n console.info('Plugin system initialized')\n }\n\n /**\n * Load plugins from configuration\n */\n async loadPlugins(configs: PluginConfig[]): Promise {\n console.info(`Loading ${configs.length} plugins...`)\n\n // Filter enabled plugins\n const enabledConfigs = configs.filter(config => config.enabled)\n \n if (enabledConfigs.length === 0) {\n console.info('No enabled plugins to load')\n return\n }\n\n // Load and register plugins (implementation would depend on how plugins are distributed)\n for (const config of enabledConfigs) {\n try {\n // In a real implementation, this would load the plugin from a registry or file system\n // For now, we'll assume plugins are already imported\n console.info(`Loading plugin configuration: ${JSON.stringify(config)}`)\n \n // Store configuration\n if ('name' in config) {\n this.registry.setConfig(config.name as string, config)\n }\n } catch (error) {\n console.error(`Failed to load plugin configuration:`, error)\n }\n }\n\n // Resolve load order based on dependencies\n try {\n const loadOrder = this.registry.resolveLoadOrder()\n console.info(`Plugin load order: ${loadOrder.join(' -> ')}`)\n\n // Activate plugins in dependency order\n for (const pluginName of loadOrder) {\n const config = this.registry.getConfig(pluginName)\n if (config?.enabled) {\n await this.registry.activate(pluginName)\n }\n }\n } catch (error) {\n console.error('Failed to resolve plugin load order:', error)\n }\n\n console.info('Plugin loading completed')\n }\n\n /**\n * Install a plugin\n */\n async install(plugin: Plugin, config?: PluginConfig): Promise {\n console.info(`Installing plugin: ${plugin.name}`)\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed: ${validation.errors.join(', ')}`)\n }\n\n // Register plugin\n await this.registry.register(plugin)\n\n // Set configuration\n const pluginConfig: PluginConfig = {\n enabled: true,\n installedAt: Date.now(),\n ...config\n }\n this.registry.setConfig(plugin.name, pluginConfig)\n\n // Create scoped hook system for plugin\n const scopedHooks = this.hooks.createScope ? \n (this.hooks as HookSystemImpl).createScope(plugin.name) : \n this.hooks\n\n this.scopedHooks.set(plugin.name, scopedHooks as ScopedHookSystem)\n\n // Create plugin context\n const pluginContext: PluginContext = {\n ...this.context,\n config: pluginConfig,\n hooks: scopedHooks,\n logger: this.createLogger(plugin.name)\n }\n\n // Register plugin extensions\n await this.registerPluginExtensions(plugin, pluginContext)\n\n // Run plugin install hook\n if (plugin.install) {\n await plugin.install(pluginContext)\n }\n\n // Execute plugin install hook\n await this.hooks.execute(HOOKS.PLUGIN_INSTALL, {\n plugin: plugin.name,\n version: plugin.version,\n context: pluginContext\n })\n\n console.info(`Plugin installed successfully: ${plugin.name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to install plugin ${plugin.name}:`, errorMessage)\n \n // Update status with error\n const status = this.registry.getStatus(plugin.name)\n if (status) {\n this.updatePluginStatus(plugin.name, {\n hasErrors: true,\n errors: [...(status.errors || []), errorMessage],\n lastError: errorMessage\n })\n }\n \n throw error\n }\n }\n\n /**\n * Uninstall a plugin\n */\n async uninstall(name: string): Promise {\n console.info(`Uninstalling plugin: ${name}`)\n\n const plugin = this.registry.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Deactivate plugin first\n const status = this.registry.getStatus(name)\n if (status?.active) {\n await this.registry.deactivate(name)\n }\n\n // Create plugin context\n const config = this.registry.getConfig(name) || { enabled: false }\n const pluginContext: PluginContext = {\n ...this.context,\n config,\n hooks: this.scopedHooks.get(name) || this.hooks,\n logger: this.createLogger(name)\n }\n\n // Run plugin uninstall hook\n if (plugin.uninstall) {\n await plugin.uninstall(pluginContext)\n }\n\n // Unregister plugin extensions\n await this.unregisterPluginExtensions(plugin)\n\n // Clean up scoped hooks\n const scopedHooks = this.scopedHooks.get(name)\n if (scopedHooks && 'unregisterAll' in scopedHooks) {\n scopedHooks.unregisterAll()\n }\n this.scopedHooks.delete(name)\n\n // Remove plugin routes\n this.pluginRoutes.delete(name)\n\n // Execute plugin uninstall hook\n await this.hooks.execute(HOOKS.PLUGIN_UNINSTALL, {\n plugin: name,\n context: pluginContext\n })\n\n // Unregister plugin\n await this.registry.unregister(name)\n\n console.info(`Plugin uninstalled successfully: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to uninstall plugin ${name}:`, errorMessage)\n throw error\n }\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus {\n const status = this.registry.getStatus(name)\n if (!status) {\n return {\n name,\n version: 'unknown',\n active: false,\n installed: false,\n hasErrors: false\n }\n }\n return status\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): PluginStatus[] {\n return Array.from(this.registry.getAllStatuses().values())\n }\n\n /**\n * Register plugin extensions (routes, middleware, etc.)\n */\n private async registerPluginExtensions(plugin: Plugin, _context: PluginContext): Promise {\n // Register routes\n if (plugin.routes) {\n const pluginApp = new Hono()\n \n for (const route of plugin.routes) {\n console.debug(`Registering plugin route: ${route.path}`)\n pluginApp.route(route.path, route.handler)\n }\n \n this.pluginRoutes.set(plugin.name, pluginApp)\n }\n\n // Register middleware\n if (plugin.middleware) {\n for (const middleware of plugin.middleware) {\n console.debug(`Registering plugin middleware: ${middleware.name}`)\n // Middleware registration would be handled by the main app\n }\n }\n\n // Register hooks\n if (plugin.hooks) {\n const scopedHooks = this.scopedHooks.get(plugin.name)\n for (const hook of plugin.hooks) {\n console.debug(`Registering plugin hook: ${hook.name}`)\n if (scopedHooks) {\n scopedHooks.register(hook.name, hook.handler, hook.priority)\n } else {\n this.hooks.register(hook.name, hook.handler, hook.priority)\n }\n }\n }\n\n // Register services\n if (plugin.services) {\n for (const service of plugin.services) {\n console.debug(`Registering plugin service: ${service.name}`)\n // Service registration would be handled by a service container\n }\n }\n\n // Register database models\n if (plugin.models) {\n for (const model of plugin.models) {\n console.debug(`Registering plugin model: ${model.name}`)\n // Model registration would involve database migrations\n }\n }\n }\n\n /**\n * Unregister plugin extensions\n */\n private async unregisterPluginExtensions(plugin: Plugin): Promise {\n // Clean up is mostly handled by the scoped systems\n console.debug(`Unregistering extensions for plugin: ${plugin.name}`)\n }\n\n /**\n * Update plugin status\n */\n private updatePluginStatus(name: string, updates: Partial): void {\n const current = this.registry.getStatus(name)\n if (current && 'updateStatus' in this.registry) {\n // This would require extending the registry interface\n console.debug(`Updating status for plugin: ${name}`, updates)\n }\n }\n\n /**\n * Create a logger for a plugin\n */\n private createLogger(pluginName: string): PluginLogger {\n return {\n debug: (message: string, data?: any) => {\n console.debug(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n info: (message: string, data?: any) => {\n console.info(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n warn: (message: string, data?: any) => {\n console.warn(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n error: (message: string, error?: Error, data?: any) => {\n console.error(`[Plugin:${pluginName}] ${message}`, error || '', data || '')\n }\n }\n }\n\n /**\n * Get plugin routes for mounting in main app\n */\n getPluginRoutes(): Map {\n return new Map(this.pluginRoutes)\n }\n\n /**\n * Get plugin middleware for main app\n */\n getPluginMiddleware(): Array<{ name: string; handler: any; priority: number; global: boolean }> {\n const middleware: Array<{ name: string; handler: any; priority: number; global: boolean }> = []\n \n for (const plugin of this.registry.getActive()) {\n if (plugin.middleware) {\n for (const mw of plugin.middleware) {\n middleware.push({\n name: `${plugin.name}:${mw.name}`,\n handler: mw.handler,\n priority: mw.priority || 10,\n global: mw.global || false\n })\n }\n }\n }\n \n // Sort by priority\n return middleware.sort((a, b) => a.priority - b.priority)\n }\n\n /**\n * Execute shutdown procedures\n */\n async shutdown(): Promise {\n console.info('Shutting down plugin system...')\n \n // Execute app shutdown hook\n await this.hooks.execute(HOOKS.APP_SHUTDOWN, {\n pluginManager: this\n })\n\n // Deactivate all active plugins\n const activePlugins = this.registry.getActive()\n for (const plugin of activePlugins.reverse()) { // Reverse order\n try {\n await this.registry.deactivate(plugin.name)\n } catch (error) {\n console.error(`Error deactivating plugin ${plugin.name}:`, error)\n }\n }\n\n console.info('Plugin system shutdown completed')\n }\n\n /**\n * Get plugin system statistics\n */\n getStats(): {\n registry: ReturnType\n hooks: Array<{ hookName: string; handlerCount: number }>\n routes: number\n middleware: number\n } {\n return {\n registry: (this.registry as PluginRegistryImpl).getStats(),\n hooks: (this.hooks as HookSystemImpl).getStats(),\n routes: this.pluginRoutes.size,\n middleware: this.getPluginMiddleware().length\n }\n }\n}","import type { Context, Next } from 'hono'\nimport { TurnstileService } from '../services/turnstile'\n\n/**\n * Middleware to verify Turnstile token on form submissions\n * \n * Usage:\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Token already verified, process form...\n * })\n * ```\n */\nexport async function verifyTurnstile(c: Context, next: Next) {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n console.error('Turnstile middleware: Database not available')\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n\n // Check if Turnstile is enabled\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n // Turnstile not enabled, allow through\n return next()\n }\n\n // Get token from request\n let token: string | undefined\n let body: any\n\n if (c.req.method === 'POST') {\n const contentType = c.req.header('content-type') || ''\n \n if (contentType.includes('application/json')) {\n body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n }\n\n if (!token) {\n return c.json({ \n error: 'Turnstile token missing',\n message: 'Please complete the verification challenge'\n }, 400)\n }\n\n // Verify token\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return c.json({ \n error: 'Turnstile verification failed',\n message: result.error || 'Verification failed. Please try again.'\n }, 403)\n }\n\n // Verification successful, continue\n return next()\n}\n\n/**\n * Middleware factory that allows custom error handling\n */\nexport function createTurnstileMiddleware(options?: {\n onError?: (c: Context, error: string) => Response\n onMissing?: (c: Context) => Response\n}) {\n return async (c: Context, next: Next) => {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n return options?.onError?.(c, 'Database not available') || \n c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n return next()\n }\n\n let token: string | undefined\n const contentType = c.req.header('content-type') || ''\n\n if (contentType.includes('application/json')) {\n const body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n\n if (!token) {\n return options?.onMissing?.(c) ||\n c.json({ error: 'Turnstile token missing' }, 400)\n }\n\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return options?.onError?.(c, result.error || 'Verification failed') ||\n c.json({ error: 'Turnstile verification failed', message: result.error }, 403)\n }\n\n return next()\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { TurnstileService } from './services/turnstile'\nimport { verifyTurnstile } from './middleware/verify'\nimport manifest from './manifest.json'\n\n/**\n * Cloudflare Turnstile Plugin\n * \n * Provides CAPTCHA-free bot protection using Cloudflare Turnstile.\n * Can be used with any form by adding the verifyTurnstile middleware.\n * \n * Settings are managed through the generic admin plugin interface.\n * No custom routes needed - the admin system automatically handles settings.\n * \n * @example\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Process form after Turnstile verification\n * })\n * ```\n */\n\n// Build the plugin - no custom routes, generic admin handles settings\nexport const turnstilePlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('turnstile', TurnstileService)\n .addSingleMiddleware('verifyTurnstile', verifyTurnstile, {\n description: 'Verify Cloudflare Turnstile token',\n global: false,\n })\n .build()\n\n// Export service and middleware for easy import\nexport { TurnstileService } from './services/turnstile'\nexport { verifyTurnstile, createTurnstileMiddleware } from './middleware/verify'\nexport { renderTurnstileWidget, renderInlineTurnstile, getTurnstileScript, renderExplicitTurnstile } from './components/widget'\nexport type { TurnstileSettings, TurnstileVerificationResponse } from './services/turnstile'\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-LPYFMGAK.cjs b/packages/core/dist/chunk-BX75LZES.cjs similarity index 98% rename from packages/core/dist/chunk-LPYFMGAK.cjs rename to packages/core/dist/chunk-BX75LZES.cjs index e75334656..37d76b384 100644 --- a/packages/core/dist/chunk-LPYFMGAK.cjs +++ b/packages/core/dist/chunk-BX75LZES.cjs @@ -1,13 +1,13 @@ 'use strict'; -var chunkWAEQXGCX_cjs = require('./chunk-WAEQXGCX.cjs'); -var chunkTAOOLOUH_cjs = require('./chunk-TAOOLOUH.cjs'); -var chunk656GGECX_cjs = require('./chunk-656GGECX.cjs'); -var chunkICMNCCX2_cjs = require('./chunk-ICMNCCX2.cjs'); +var chunkXWQVFWPW_cjs = require('./chunk-XWQVFWPW.cjs'); +var chunkV4V54BY3_cjs = require('./chunk-V4V54BY3.cjs'); +var chunkQOZZJZ76_cjs = require('./chunk-QOZZJZ76.cjs'); +var chunk7KR6GOY3_cjs = require('./chunk-7KR6GOY3.cjs'); var chunkOHYBNCVL_cjs = require('./chunk-OHYBNCVL.cjs'); var chunkUYJ6TJHX_cjs = require('./chunk-UYJ6TJHX.cjs'); var chunk635JAMSE_cjs = require('./chunk-635JAMSE.cjs'); -var chunkGLRZAPX6_cjs = require('./chunk-GLRZAPX6.cjs'); +var chunk74BFRAQS_cjs = require('./chunk-74BFRAQS.cjs'); var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs'); var chunkMNWKYY5E_cjs = require('./chunk-MNWKYY5E.cjs'); var hono = require('hono'); @@ -189,7 +189,7 @@ apiContentCrudRoutes.get("/:id", async (c) => { }, 500); } }); -apiContentCrudRoutes.post("/", chunkTAOOLOUH_cjs.requireAuth(), chunkTAOOLOUH_cjs.requireRole(["admin", "editor", "author"]), async (c) => { +apiContentCrudRoutes.post("/", chunkV4V54BY3_cjs.requireAuth(), chunkV4V54BY3_cjs.requireRole(["admin", "editor", "author"]), async (c) => { try { const db = c.env.DB; const user = c.get("user"); @@ -230,7 +230,7 @@ apiContentCrudRoutes.post("/", chunkTAOOLOUH_cjs.requireAuth(), chunkTAOOLOUH_cj now, now ).run(); - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); await cache.invalidate(`content:list:${collectionId}:*`); await cache.invalidate("content-filtered:*"); const getStmt = db.prepare("SELECT * FROM content WHERE id = ?"); @@ -255,7 +255,7 @@ apiContentCrudRoutes.post("/", chunkTAOOLOUH_cjs.requireAuth(), chunkTAOOLOUH_cj }, 500); } }); -apiContentCrudRoutes.put("/:id", chunkTAOOLOUH_cjs.requireAuth(), chunkTAOOLOUH_cjs.requireRole(["admin", "editor", "author"]), async (c) => { +apiContentCrudRoutes.put("/:id", chunkV4V54BY3_cjs.requireAuth(), chunkV4V54BY3_cjs.requireRole(["admin", "editor", "author"]), async (c) => { try { const id = c.req.param("id"); const db = c.env.DB; @@ -293,7 +293,7 @@ apiContentCrudRoutes.put("/:id", chunkTAOOLOUH_cjs.requireAuth(), chunkTAOOLOUH_ WHERE id = ? `); await updateStmt.bind(...params).run(); - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); await cache.delete(cache.generateKey("content", id)); await cache.invalidate(`content:list:${existing.collection_id}:*`); await cache.invalidate("content-filtered:*"); @@ -319,7 +319,7 @@ apiContentCrudRoutes.put("/:id", chunkTAOOLOUH_cjs.requireAuth(), chunkTAOOLOUH_ }, 500); } }); -apiContentCrudRoutes.delete("/:id", chunkTAOOLOUH_cjs.requireAuth(), chunkTAOOLOUH_cjs.requireRole(["admin", "editor", "author"]), async (c) => { +apiContentCrudRoutes.delete("/:id", chunkV4V54BY3_cjs.requireAuth(), chunkV4V54BY3_cjs.requireRole(["admin", "editor", "author"]), async (c) => { try { const id = c.req.param("id"); const db = c.env.DB; @@ -330,7 +330,7 @@ apiContentCrudRoutes.delete("/:id", chunkTAOOLOUH_cjs.requireAuth(), chunkTAOOLO } const deleteStmt = db.prepare("DELETE FROM content WHERE id = ?"); await deleteStmt.bind(id).run(); - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); await cache.delete(cache.generateKey("content", id)); await cache.invalidate(`content:list:${existing.collection_id}:*`); await cache.invalidate("content-filtered:*"); @@ -355,7 +355,7 @@ apiRoutes.use("*", async (c, next) => { c.header("X-Response-Time", `${totalTime}ms`); }); apiRoutes.use("*", async (c, next) => { - const cacheEnabled = await chunkTAOOLOUH_cjs.isPluginActive(c.env.DB, "core-cache"); + const cacheEnabled = await chunkV4V54BY3_cjs.isPluginActive(c.env.DB, "core-cache"); c.set("cacheEnabled", cacheEnabled); await next(); }); @@ -792,7 +792,7 @@ apiRoutes.get("/collections", async (c) => { try { const db = c.env.DB; const cacheEnabled = c.get("cacheEnabled"); - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); const cacheKey = cache.generateKey("collections", "all"); if (cacheEnabled) { const cacheResult = await cache.getWithSource(cacheKey); @@ -846,7 +846,7 @@ apiRoutes.get("/collections", async (c) => { return c.json({ error: "Failed to fetch collections" }, 500); } }); -apiRoutes.get("/content", chunkTAOOLOUH_cjs.optionalAuth(), async (c) => { +apiRoutes.get("/content", chunkV4V54BY3_cjs.optionalAuth(), async (c) => { const executionStart = Date.now(); try { const db = c.env.DB; @@ -869,13 +869,13 @@ apiRoutes.get("/content", chunkTAOOLOUH_cjs.optionalAuth(), async (c) => { }); } } - const filter = chunkGLRZAPX6_cjs.QueryFilterBuilder.parseFromQuery(queryParams); + const filter = chunk74BFRAQS_cjs.QueryFilterBuilder.parseFromQuery(queryParams); const normalizedFilter = normalizePublicContentFilter(filter, c.get("user")?.role); if (!normalizedFilter.limit) { normalizedFilter.limit = 50; } normalizedFilter.limit = Math.min(normalizedFilter.limit, 1e3); - const builder3 = new chunkGLRZAPX6_cjs.QueryFilterBuilder(); + const builder3 = new chunk74BFRAQS_cjs.QueryFilterBuilder(); const queryResult = builder3.build("content", normalizedFilter); if (queryResult.errors.length > 0) { return c.json({ @@ -884,7 +884,7 @@ apiRoutes.get("/content", chunkTAOOLOUH_cjs.optionalAuth(), async (c) => { }, 400); } const cacheEnabled = c.get("cacheEnabled"); - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); const cacheKey = cache.generateKey("content-filtered", JSON.stringify({ filter: normalizedFilter, query: queryResult.sql })); if (cacheEnabled) { const cacheResult = await cache.getWithSource(cacheKey); @@ -947,7 +947,7 @@ apiRoutes.get("/content", chunkTAOOLOUH_cjs.optionalAuth(), async (c) => { }, 500); } }); -apiRoutes.get("/collections/:collection/content", chunkTAOOLOUH_cjs.optionalAuth(), async (c) => { +apiRoutes.get("/collections/:collection/content", chunkV4V54BY3_cjs.optionalAuth(), async (c) => { const executionStart = Date.now(); try { const collection = c.req.param("collection"); @@ -958,7 +958,7 @@ apiRoutes.get("/collections/:collection/content", chunkTAOOLOUH_cjs.optionalAuth if (!collectionResult) { return c.json({ error: "Collection not found" }, 404); } - const filter = chunkGLRZAPX6_cjs.QueryFilterBuilder.parseFromQuery(queryParams); + const filter = chunk74BFRAQS_cjs.QueryFilterBuilder.parseFromQuery(queryParams); const normalizedFilter = normalizePublicContentFilter(filter, c.get("user")?.role); if (!normalizedFilter.where) { normalizedFilter.where = { and: [] }; @@ -975,7 +975,7 @@ apiRoutes.get("/collections/:collection/content", chunkTAOOLOUH_cjs.optionalAuth normalizedFilter.limit = 50; } normalizedFilter.limit = Math.min(normalizedFilter.limit, 1e3); - const builder3 = new chunkGLRZAPX6_cjs.QueryFilterBuilder(); + const builder3 = new chunk74BFRAQS_cjs.QueryFilterBuilder(); const queryResult = builder3.build("content", normalizedFilter); if (queryResult.errors.length > 0) { return c.json({ @@ -984,7 +984,7 @@ apiRoutes.get("/collections/:collection/content", chunkTAOOLOUH_cjs.optionalAuth }, 400); } const cacheEnabled = c.get("cacheEnabled"); - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.api); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.api); const cacheKey = cache.generateKey("collection-content-filtered", `${collection}:${JSON.stringify({ filter: normalizedFilter, query: queryResult.sql })}`); if (cacheEnabled) { const cacheResult = await cache.getWithSource(cacheKey); @@ -1096,7 +1096,7 @@ var fileValidationSchema = zod.z.object({ // 50MB max }); var apiMediaRoutes = new hono.Hono(); -apiMediaRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); +apiMediaRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); apiMediaRoutes.post("/upload", async (c) => { try { const user = c.get("user"); @@ -1840,8 +1840,8 @@ apiSystemRoutes.get("/env", (c) => { }); var api_system_default = apiSystemRoutes; var adminApiRoutes = new hono.Hono(); -adminApiRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); -adminApiRoutes.use("*", chunkTAOOLOUH_cjs.requireRole(["admin", "editor"])); +adminApiRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); +adminApiRoutes.use("*", chunkV4V54BY3_cjs.requireRole(["admin", "editor"])); adminApiRoutes.get("/stats", async (c) => { try { const db = c.env.DB; @@ -2353,7 +2353,7 @@ adminApiRoutes.delete("/collections/:id", async (c) => { }); adminApiRoutes.get("/migrations/status", async (c) => { try { - const { MigrationService: MigrationService2 } = await import('./migrations-2MVNZKQI.cjs'); + const { MigrationService: MigrationService2 } = await import('./migrations-3CPSXQ26.cjs'); const db = c.env.DB; const migrationService = new MigrationService2(db); const status = await migrationService.getMigrationStatus(); @@ -2378,7 +2378,7 @@ adminApiRoutes.post("/migrations/run", async (c) => { error: "Unauthorized. Admin access required." }, 403); } - const { MigrationService: MigrationService2 } = await import('./migrations-2MVNZKQI.cjs'); + const { MigrationService: MigrationService2 } = await import('./migrations-3CPSXQ26.cjs'); const db = c.env.DB; const migrationService = new MigrationService2(db); const result = await migrationService.runPendingMigrations(); @@ -2400,7 +2400,7 @@ adminApiRoutes.post("/migrations/run", async (c) => { }); adminApiRoutes.get("/migrations/validate", async (c) => { try { - const { MigrationService: MigrationService2 } = await import('./migrations-2MVNZKQI.cjs'); + const { MigrationService: MigrationService2 } = await import('./migrations-3CPSXQ26.cjs'); const db = c.env.DB; const migrationService = new MigrationService2(db); const validation = await migrationService.validateSchema(); @@ -5153,8 +5153,8 @@ var JWT_SECRET_FALLBACK = "your-super-secret-jwt-key-change-in-production"; async function setCsrfCookie(c, maxAge) { const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK; const isDev = c.env?.ENVIRONMENT === "development" || !c.env?.ENVIRONMENT; - const csrfToken = await chunkTAOOLOUH_cjs.generateCsrfToken(secret); - const cookieMaxAge = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env?.DB, c.env); + const csrfToken = await chunkV4V54BY3_cjs.generateCsrfToken(secret); + const cookieMaxAge = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env?.DB, c.env); cookie.setCookie(c, "csrf_token", csrfToken, { httpOnly: false, secure: !isDev, @@ -5211,7 +5211,7 @@ var loginSchema = zod.z.object({ }); authRoutes.post( "/register", - chunkTAOOLOUH_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }), + chunkV4V54BY3_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }), async (c) => { try { const db = c.env.DB; @@ -5248,7 +5248,7 @@ authRoutes.post( if (existingUser) { return c.json({ error: "User with this email or username already exists" }, 400); } - const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); + const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); const userId = crypto.randomUUID(); const now = /* @__PURE__ */ new Date(); await db.prepare(` @@ -5282,8 +5282,8 @@ authRoutes.post( await saveCustomData(db, userId, sanitized); } } - const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const token = await chunkTAOOLOUH_cjs.AuthManager.generateToken(userId, normalizedEmail, "viewer", c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const token = await chunkV4V54BY3_cjs.AuthManager.generateToken(userId, normalizedEmail, "viewer", c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", token, { httpOnly: true, secure: true, @@ -5316,7 +5316,7 @@ authRoutes.post( ); authRoutes.post( "/login", - chunkTAOOLOUH_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }), + chunkV4V54BY3_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }), async (c) => { try { const body = await c.req.json(); @@ -5327,7 +5327,7 @@ authRoutes.post( const { email, password } = validation.data; const db = c.env.DB; const normalizedEmail = email.toLowerCase(); - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.user); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.user); let user = await cache.get(cache.generateKey("user", `email:${normalizedEmail}`)); if (!user) { user = await db.prepare("SELECT * FROM users WHERE email = ? AND is_active = 1").bind(normalizedEmail).first(); @@ -5339,20 +5339,20 @@ authRoutes.post( if (!user) { return c.json({ error: "Invalid email or password" }, 401); } - const isValidPassword = await chunkTAOOLOUH_cjs.AuthManager.verifyPassword(password, user.password_hash); + const isValidPassword = await chunkV4V54BY3_cjs.AuthManager.verifyPassword(password, user.password_hash); if (!isValidPassword) { return c.json({ error: "Invalid email or password" }, 401); } - if (chunkTAOOLOUH_cjs.AuthManager.isLegacyHash(user.password_hash)) { + if (chunkV4V54BY3_cjs.AuthManager.isLegacyHash(user.password_hash)) { try { - const newHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); + const newHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); await db.prepare("UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?").bind(newHash, Date.now(), user.id).run(); } catch (rehashError) { console.error("Password rehash failed (non-fatal):", rehashError); } } - const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const token = await chunkTAOOLOUH_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const token = await chunkV4V54BY3_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", token, { httpOnly: true, secure: true, @@ -5404,7 +5404,7 @@ authRoutes.get("/logout", (c) => { clearCsrfCookie(c); return c.redirect("/auth/login?message=You have been logged out successfully"); }); -authRoutes.get("/me", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { +authRoutes.get("/me", chunkV4V54BY3_cjs.requireAuth(), async (c) => { try { const user = c.get("user"); if (!user) { @@ -5424,7 +5424,7 @@ authRoutes.get("/me", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { }); authRoutes.post( "/refresh", - chunkTAOOLOUH_cjs.rateLimit({ max: 60, windowMs: 60 * 1e3, keyPrefix: "refresh" }), + chunkV4V54BY3_cjs.rateLimit({ max: 60, windowMs: 60 * 1e3, keyPrefix: "refresh" }), async (c) => { try { let token = c.req.header("Authorization")?.replace("Bearer ", ""); @@ -5433,8 +5433,8 @@ authRoutes.post( return c.json({ error: "Authentication required" }, 401); } const db = c.env.DB; - const grace = await chunkTAOOLOUH_cjs.getJwtRefreshGraceSecondsFromDb(db, c.env); - const payload = await chunkTAOOLOUH_cjs.AuthManager.verifyToken(token, c.env.JWT_SECRET, grace); + const grace = await chunkV4V54BY3_cjs.getJwtRefreshGraceSecondsFromDb(db, c.env); + const payload = await chunkV4V54BY3_cjs.AuthManager.verifyToken(token, c.env.JWT_SECRET, grace); if (!payload) { return c.json({ error: "Invalid or expired token" }, 401); } @@ -5442,8 +5442,8 @@ authRoutes.post( if (!row || !row.is_active) { return c.json({ error: "User is not active" }, 401); } - const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(db, c.env); - const newToken = await chunkTAOOLOUH_cjs.AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(db, c.env); + const newToken = await chunkV4V54BY3_cjs.AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", newToken, { httpOnly: true, secure: true, @@ -5463,7 +5463,7 @@ authRoutes.post( ); authRoutes.post( "/register/form", - chunkTAOOLOUH_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }), + chunkV4V54BY3_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }), async (c) => { try { const db = c.env.DB; @@ -5510,7 +5510,7 @@ authRoutes.post( `); } - const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); + const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); const role = isFirstUser ? "admin" : "viewer"; const userId = crypto.randomUUID(); const now = /* @__PURE__ */ new Date(); @@ -5545,8 +5545,8 @@ authRoutes.post( await saveCustomData(db, userId, sanitized); } } - const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const token = await chunkTAOOLOUH_cjs.AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const token = await chunkV4V54BY3_cjs.AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", token, { httpOnly: true, secure: false, @@ -5578,7 +5578,7 @@ authRoutes.post( ); authRoutes.post( "/login/form", - chunkTAOOLOUH_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }), + chunkV4V54BY3_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }), async (c) => { try { const formData = await c.req.formData(); @@ -5602,7 +5602,7 @@ authRoutes.post( `); } - const isValidPassword = await chunkTAOOLOUH_cjs.AuthManager.verifyPassword(password, user.password_hash); + const isValidPassword = await chunkV4V54BY3_cjs.AuthManager.verifyPassword(password, user.password_hash); if (!isValidPassword) { return c.html(html.html`
@@ -5610,16 +5610,16 @@ authRoutes.post(
`); } - if (chunkTAOOLOUH_cjs.AuthManager.isLegacyHash(user.password_hash)) { + if (chunkV4V54BY3_cjs.AuthManager.isLegacyHash(user.password_hash)) { try { - const newHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); + const newHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); await db.prepare("UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?").bind(newHash, Date.now(), user.id).run(); } catch (rehashError) { console.error("Password rehash failed (non-fatal):", rehashError); } } - const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const token = await chunkTAOOLOUH_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const token = await chunkV4V54BY3_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", token, { httpOnly: true, secure: false, @@ -5660,7 +5660,7 @@ authRoutes.post( ); authRoutes.post( "/seed-admin", - chunkTAOOLOUH_cjs.rateLimit({ max: 10, windowMs: 60 * 1e3, keyPrefix: "seed-admin" }), + chunkV4V54BY3_cjs.rateLimit({ max: 10, windowMs: 60 * 1e3, keyPrefix: "seed-admin" }), async (c) => { try { const db = c.env.DB; @@ -5682,7 +5682,7 @@ authRoutes.post( `).run(); const existingAdmin = await db.prepare("SELECT id FROM users WHERE email = ? OR username = ?").bind("admin@sonicjs.com", "admin").first(); if (existingAdmin) { - const passwordHash2 = await chunkTAOOLOUH_cjs.AuthManager.hashPassword("sonicjs!"); + const passwordHash2 = await chunkV4V54BY3_cjs.AuthManager.hashPassword("sonicjs!"); await db.prepare("UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?").bind(passwordHash2, Date.now(), existingAdmin.id).run(); return c.json({ message: "Admin user already exists (password updated)", @@ -5694,7 +5694,7 @@ authRoutes.post( } }); } - const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword("sonicjs!"); + const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword("sonicjs!"); const userId = "admin-user-id"; const now = Date.now(); const adminEmail = "admin@sonicjs.com".toLowerCase(); @@ -5915,7 +5915,7 @@ authRoutes.post("/accept-invitation", async (c) => { if (existingUsername) { return c.json({ error: "Username is already taken" }, 400); } - const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); + const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); const updateStmt = db.prepare(` UPDATE users SET username = ?, @@ -5934,8 +5934,8 @@ authRoutes.post("/accept-invitation", async (c) => { Date.now(), invitedUser.id ).run(); - const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const authToken = await chunkTAOOLOUH_cjs.AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const authToken = await chunkV4V54BY3_cjs.AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", authToken, { httpOnly: true, secure: true, @@ -5951,7 +5951,7 @@ authRoutes.post("/accept-invitation", async (c) => { }); authRoutes.post( "/request-password-reset", - chunkTAOOLOUH_cjs.rateLimit({ max: 3, windowMs: 15 * 60 * 1e3, keyPrefix: "password-reset" }), + chunkV4V54BY3_cjs.rateLimit({ max: 3, windowMs: 15 * 60 * 1e3, keyPrefix: "password-reset" }), async (c) => { try { const formData = await c.req.formData(); @@ -6169,7 +6169,7 @@ authRoutes.post("/reset-password", async (c) => { if (Date.now() > user.password_reset_expires) { return c.json({ error: "Reset token has expired" }, 400); } - const newPasswordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); + const newPasswordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); try { const historyStmt = db.prepare(` INSERT INTO password_history (id, user_id, password_hash, created_at) @@ -9545,9 +9545,9 @@ function parseFieldValue(field, formData, options = {}) { const { skipValidation = false } = options; const value = formData.get(field.field_name); const errors = []; - const blocksConfig = chunkGLRZAPX6_cjs.getBlocksFieldConfig(field.field_options); + const blocksConfig = chunk74BFRAQS_cjs.getBlocksFieldConfig(field.field_options); if (blocksConfig) { - const parsed = chunkGLRZAPX6_cjs.parseBlocksValue(value, blocksConfig); + const parsed = chunk74BFRAQS_cjs.parseBlocksValue(value, blocksConfig); if (!skipValidation && field.is_required && parsed.value.length === 0) { parsed.errors.push(`${field.field_label} is required`); } @@ -9657,9 +9657,9 @@ function extractFieldData(fields, formData, options = {}) { } return { data, errors }; } -adminContentRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); +adminContentRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); async function getCollectionFields(db, collectionId) { - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.collection); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.collection); return cache.getOrSet( cache.generateKey("fields", collectionId), async () => { @@ -9708,7 +9708,7 @@ async function getCollectionFields(db, collectionId) { ); } async function getCollection(db, collectionId) { - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.collection); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.collection); return cache.getOrSet( cache.generateKey("collection", collectionId), async () => { @@ -9934,21 +9934,21 @@ adminContentRoutes.get("/new", async (c) => { const tinymceEnabled = await isPluginActive2(db, "tinymce-plugin"); let tinymceSettings; if (tinymceEnabled) { - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const tinymcePlugin2 = await pluginService.getPlugin("tinymce-plugin"); tinymceSettings = tinymcePlugin2?.settings; } const quillEnabled = await isPluginActive2(db, "quill-editor"); let quillSettings; if (quillEnabled) { - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const quillPlugin = await pluginService.getPlugin("quill-editor"); quillSettings = quillPlugin?.settings; } const mdxeditorEnabled = await isPluginActive2(db, "easy-mdx"); let mdxeditorSettings; if (mdxeditorEnabled) { - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const mdxeditorPlugin = await pluginService.getPlugin("easy-mdx"); mdxeditorSettings = mdxeditorPlugin?.settings; } @@ -9998,7 +9998,7 @@ adminContentRoutes.get("/:id/edit", async (c) => { const db = c.env.DB; const url = new URL(c.req.url); const referrerParams = url.searchParams.get("ref") || ""; - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.content); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.content); const content = await cache.getOrSet( cache.generateKey("content", id), async () => { @@ -10039,21 +10039,21 @@ adminContentRoutes.get("/:id/edit", async (c) => { const tinymceEnabled = await isPluginActive2(db, "tinymce-plugin"); let tinymceSettings; if (tinymceEnabled) { - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const tinymcePlugin2 = await pluginService.getPlugin("tinymce-plugin"); tinymceSettings = tinymcePlugin2?.settings; } const quillEnabled = await isPluginActive2(db, "quill-editor"); let quillSettings; if (quillEnabled) { - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const quillPlugin = await pluginService.getPlugin("quill-editor"); quillSettings = quillPlugin?.settings; } const mdxeditorEnabled = await isPluginActive2(db, "easy-mdx"); let mdxeditorSettings; if (mdxeditorEnabled) { - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const mdxeditorPlugin = await pluginService.getPlugin("easy-mdx"); mdxeditorSettings = mdxeditorPlugin?.settings; } @@ -10174,7 +10174,7 @@ adminContentRoutes.post("/", async (c) => { now, now ).run(); - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.content); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.content); await cache.invalidate(`content:list:${collectionId}:*`); const versionStmt = db.prepare(` INSERT INTO content_versions (id, content_id, version, data, author_id, created_at) @@ -10293,7 +10293,7 @@ adminContentRoutes.put("/:id", async (c) => { now, id ).run(); - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.content); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.content); await cache.delete(cache.generateKey("content", id)); await cache.invalidate(`content:list:${existingContent.collection_id}:*`); const existingData = JSON.parse(existingContent.data || "{}"); @@ -10348,7 +10348,7 @@ adminContentRoutes.put("/:id", async (c) => { `); } }); -adminContentRoutes.post("/preview", chunkTAOOLOUH_cjs.requireRole(["admin", "editor", "author"]), async (c) => { +adminContentRoutes.post("/preview", chunkV4V54BY3_cjs.requireRole(["admin", "editor", "author"]), async (c) => { try { const formData = await c.req.formData(); const collectionId = formData.get("collection_id"); @@ -10570,7 +10570,7 @@ adminContentRoutes.post("/bulk-action", async (c) => { } else { return c.json({ success: false, error: "Invalid action" }); } - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.content); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.content); for (const contentId of ids) { await cache.delete(cache.generateKey("content", contentId)); } @@ -10598,7 +10598,7 @@ adminContentRoutes.delete("/:id", async (c) => { WHERE id = ? `); await deleteStmt.bind(now, id).run(); - const cache = chunkWAEQXGCX_cjs.getCacheService(chunkWAEQXGCX_cjs.CACHE_CONFIGS.content); + const cache = chunkXWQVFWPW_cjs.getCacheService(chunkXWQVFWPW_cjs.CACHE_CONFIGS.content); await cache.delete(cache.generateKey("content", id)); await cache.invalidate("content:list:*"); return c.html(` @@ -10726,7 +10726,7 @@ adminContentRoutes.post("/:id/restore/:version", async (c) => { return c.json({ success: false, error: "Failed to restore version" }); } }); -adminContentRoutes.get("/:id/version/:version/preview", chunkTAOOLOUH_cjs.requireRole(["admin", "editor", "author"]), async (c) => { +adminContentRoutes.get("/:id/version/:version/preview", chunkV4V54BY3_cjs.requireRole(["admin", "editor", "author"]), async (c) => { try { const id = c.req.param("id"); const version = parseInt(c.req.param("version") || "0"); @@ -12725,14 +12725,14 @@ function renderUsersListPage(data) { // src/routes/admin-users.ts var userRoutes = new hono.Hono(); -userRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); -userRoutes.use("/users/*", chunkTAOOLOUH_cjs.requireRole(["admin"])); -userRoutes.use("/users", chunkTAOOLOUH_cjs.requireRole(["admin"])); -userRoutes.use("/invite-user", chunkTAOOLOUH_cjs.requireRole(["admin"])); -userRoutes.use("/resend-invitation/*", chunkTAOOLOUH_cjs.requireRole(["admin"])); -userRoutes.use("/cancel-invitation/*", chunkTAOOLOUH_cjs.requireRole(["admin"])); -userRoutes.use("/activity-logs", chunkTAOOLOUH_cjs.requireRole(["admin"])); -userRoutes.use("/activity-logs/*", chunkTAOOLOUH_cjs.requireRole(["admin"])); +userRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); +userRoutes.use("/users/*", chunkV4V54BY3_cjs.requireRole(["admin"])); +userRoutes.use("/users", chunkV4V54BY3_cjs.requireRole(["admin"])); +userRoutes.use("/invite-user", chunkV4V54BY3_cjs.requireRole(["admin"])); +userRoutes.use("/resend-invitation/*", chunkV4V54BY3_cjs.requireRole(["admin"])); +userRoutes.use("/cancel-invitation/*", chunkV4V54BY3_cjs.requireRole(["admin"])); +userRoutes.use("/activity-logs", chunkV4V54BY3_cjs.requireRole(["admin"])); +userRoutes.use("/activity-logs/*", chunkV4V54BY3_cjs.requireRole(["admin"])); userRoutes.get("/", (c) => { return c.redirect("/admin/dashboard"); }); @@ -12902,7 +12902,7 @@ userRoutes.put("/profile", async (c) => { } await saveCustomData(db, user.userId, sanitized); } - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "profile.update", @@ -12965,7 +12965,7 @@ userRoutes.post("/profile/avatar", async (c) => { SELECT first_name, last_name FROM users WHERE id = ? `); const userData = await userStmt.bind(user.userId).first(); - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "profile.avatar_update", @@ -13036,7 +13036,7 @@ userRoutes.post("/profile/password", async (c) => { dismissible: true })); } - const validPassword = await chunkTAOOLOUH_cjs.AuthManager.verifyPassword(currentPassword, userData.password_hash); + const validPassword = await chunkV4V54BY3_cjs.AuthManager.verifyPassword(currentPassword, userData.password_hash); if (!validPassword) { return c.html(renderAlert2({ type: "error", @@ -13044,7 +13044,7 @@ userRoutes.post("/profile/password", async (c) => { dismissible: true })); } - const newPasswordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(newPassword); + const newPasswordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(newPassword); const historyStmt = db.prepare(` INSERT INTO password_history (id, user_id, password_hash, created_at) VALUES (?, ?, ?, ?) @@ -13060,7 +13060,7 @@ userRoutes.post("/profile/password", async (c) => { WHERE id = ? `); await updateStmt.bind(newPasswordHash, Date.now(), user.userId).run(); - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "profile.password_change", @@ -13127,7 +13127,7 @@ userRoutes.get("/users", async (c) => { `); const countResult = await countStmt.bind(...params).first(); const totalUsers = countResult?.total || 0; - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "users.list_view", @@ -13285,7 +13285,7 @@ userRoutes.post("/users/new", async (c) => { dismissible: true })); } - const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(password); + const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(password); const userId = crypto.randomUUID(); const createStmt = db.prepare(` INSERT INTO users ( @@ -13308,7 +13308,7 @@ userRoutes.post("/users/new", async (c) => { Date.now(), Date.now() ).run(); - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "user!.create", @@ -13347,7 +13347,7 @@ userRoutes.get("/users/:id", async (c) => { if (!userRecord) { return c.json({ error: "User not found" }, 404); } - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "user!.view", @@ -13573,7 +13573,7 @@ userRoutes.put("/users/:id", async (c) => { userId ).run(); if (newPassword) { - const passwordHash = await chunkTAOOLOUH_cjs.AuthManager.hashPassword(newPassword); + const passwordHash = await chunkV4V54BY3_cjs.AuthManager.hashPassword(newPassword); const updatePasswordStmt = db.prepare(` UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ? `); @@ -13627,7 +13627,7 @@ userRoutes.put("/users/:id", async (c) => { ).run(); } } - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "user.update", @@ -13672,7 +13672,7 @@ userRoutes.post("/users/:id/toggle", async (c) => { UPDATE users SET is_active = ?, updated_at = ? WHERE id = ? `); await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run(); - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, active ? "user.activate" : "user.deactivate", @@ -13713,7 +13713,7 @@ userRoutes.delete("/users/:id", async (c) => { DELETE FROM users WHERE id = ? `); await deleteStmt.bind(userId).run(); - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "user!.hard_delete", @@ -13732,7 +13732,7 @@ userRoutes.delete("/users/:id", async (c) => { UPDATE users SET is_active = 0, updated_at = ? WHERE id = ? `); await deleteStmt.bind(Date.now(), userId).run(); - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "user!.soft_delete", @@ -13798,7 +13798,7 @@ userRoutes.post("/invite-user", async (c) => { Date.now(), Date.now() ).run(); - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "user!.invite_sent", @@ -13855,7 +13855,7 @@ userRoutes.post("/resend-invitation/:id", async (c) => { Date.now(), userId ).run(); - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "user!.invitation_resent", @@ -13891,7 +13891,7 @@ userRoutes.delete("/cancel-invitation/:id", async (c) => { } const deleteStmt = db.prepare(`DELETE FROM users WHERE id = ?`); await deleteStmt.bind(userId).run(); - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "user!.invitation_cancelled", @@ -13974,7 +13974,7 @@ userRoutes.get("/activity-logs", async (c) => { ...log, details: log.details ? JSON.parse(log.details) : null })); - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "activity.logs_viewed", @@ -14081,7 +14081,7 @@ userRoutes.get("/activity-logs/export", async (c) => { csvRows.push(row.join(",")); } const csvContent = csvRows.join("\n"); - await chunkTAOOLOUH_cjs.logActivity( + await chunkV4V54BY3_cjs.logActivity( db, user.userId, "activity.logs_exported", @@ -15420,7 +15420,7 @@ var fileValidationSchema2 = zod.z.object({ // 50MB max }); var adminMediaRoutes = new hono.Hono(); -adminMediaRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); +adminMediaRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); adminMediaRoutes.get("/", async (c) => { try { const user = c.get("user"); @@ -15812,8 +15812,8 @@ adminMediaRoutes.post("/upload", async (c) => { }); continue; } - let width = null; - let height = null; + let width; + let height; if (file.type.startsWith("image/") && !file.type.includes("svg")) { try { const dimensions = await getImageDimensions2(arrayBuffer); @@ -15824,7 +15824,7 @@ adminMediaRoutes.post("/upload", async (c) => { } } const publicUrl = `/files/${r2Key}`; - const thumbnailUrl = file.type.startsWith("image/") ? publicUrl : null; + const thumbnailUrl = file.type.startsWith("image/") ? publicUrl : void 0; const stmt = c.env.DB.prepare(` INSERT INTO media ( id, filename, original_name, mime_type, size, width, height, @@ -16006,7 +16006,7 @@ adminMediaRoutes.put("/:id", async (c) => { `); } }); -adminMediaRoutes.delete("/cleanup", chunkTAOOLOUH_cjs.requireRole("admin"), async (c) => { +adminMediaRoutes.delete("/cleanup", chunkV4V54BY3_cjs.requireRole("admin"), async (c) => { try { const db = c.env.DB; const allMediaStmt = db.prepare("SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL"); @@ -18349,8 +18349,8 @@ function renderEmailSettingsContent(plugin, settings) { // src/routes/admin-plugins.ts var adminPluginRoutes = new hono.Hono(); -adminPluginRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); -var AVAILABLE_PLUGINS = Object.values(chunk656GGECX_cjs.PLUGIN_REGISTRY).map((p) => ({ +adminPluginRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); +var AVAILABLE_PLUGINS = Object.values(chunkQOZZJZ76_cjs.PLUGIN_REGISTRY).map((p) => ({ id: p.id, name: p.codeName, display_name: p.displayName, @@ -18370,7 +18370,7 @@ adminPluginRoutes.get("/", async (c) => { if (user?.role !== "admin") { return c.text("Access denied", 403); } - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); let installedPlugins = []; let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 }; try { @@ -18442,7 +18442,7 @@ adminPluginRoutes.get("/:id", async (c) => { if (user?.role !== "admin") { return c.redirect("/admin/plugins"); } - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const plugin = await pluginService.getPlugin(pluginId); if (!plugin) { return c.text("Plugin not found", 404); @@ -18450,7 +18450,7 @@ adminPluginRoutes.get("/:id", async (c) => { const activity = await pluginService.getPluginActivity(pluginId, 20); let enrichedSettings = plugin.settings || {}; if (pluginId === "otp-login") { - const settingsService = new chunkWAEQXGCX_cjs.SettingsService(db); + const settingsService = new chunkXWQVFWPW_cjs.SettingsService(db); const generalSettings = await settingsService.getGeneralSettings(); const siteName = generalSettings.siteName || "SonicJS"; const emailPlugin = await db.prepare(` @@ -18518,7 +18518,7 @@ adminPluginRoutes.post("/:id/activate", async (c) => { if (user?.role !== "admin") { return c.json({ error: "Access denied" }, 403); } - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); await pluginService.activatePlugin(pluginId); return c.json({ success: true }); } catch (error) { @@ -18535,7 +18535,7 @@ adminPluginRoutes.post("/:id/deactivate", async (c) => { if (user?.role !== "admin") { return c.json({ error: "Access denied" }, 403); } - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); await pluginService.deactivatePlugin(pluginId); return c.json({ success: true }); } catch (error) { @@ -18552,8 +18552,8 @@ adminPluginRoutes.post("/install", async (c) => { return c.json({ error: "Access denied" }, 403); } const body = await c.req.json(); - const pluginService = new chunk656GGECX_cjs.PluginService(db); - const registryEntry = chunk656GGECX_cjs.findPluginByCodeName(body.name) || chunk656GGECX_cjs.PLUGIN_REGISTRY[body.name] || chunk656GGECX_cjs.PLUGIN_REGISTRY[body.id]; + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); + const registryEntry = chunkQOZZJZ76_cjs.findPluginByCodeName(body.name) || chunkQOZZJZ76_cjs.PLUGIN_REGISTRY[body.name] || chunkQOZZJZ76_cjs.PLUGIN_REGISTRY[body.id]; if (!registryEntry) { return c.json({ error: "Plugin not found in registry" }, 404); } @@ -18586,7 +18586,7 @@ adminPluginRoutes.post("/:id/uninstall", async (c) => { if (user?.role !== "admin") { return c.json({ error: "Access denied" }, 403); } - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); await pluginService.uninstallPlugin(pluginId); return c.json({ success: true }); } catch (error) { @@ -18604,7 +18604,7 @@ adminPluginRoutes.post("/:id/settings", async (c) => { return c.json({ error: "Access denied" }, 403); } const settings = await c.req.json(); - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); await pluginService.updatePluginSettings(pluginId, settings); if (pluginId === "core-auth") { try { @@ -19412,11 +19412,11 @@ function renderLogConfigPage(data) { // src/routes/admin-logs.ts var adminLogsRoutes = new hono.Hono(); -adminLogsRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); +adminLogsRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); adminLogsRoutes.get("/", async (c) => { try { const user = c.get("user"); - const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); + const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); const query = c.req.query(); const page = parseInt(query.page || "1"); const limit = parseInt(query.limit || "50"); @@ -19496,7 +19496,7 @@ adminLogsRoutes.get("/:id", async (c) => { try { const id = c.req.param("id"); const user = c.get("user"); - const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); + const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); const { logs } = await logger.getLogs({ limit: 1, offset: 0, @@ -19533,7 +19533,7 @@ adminLogsRoutes.get("/:id", async (c) => { adminLogsRoutes.get("/config", async (c) => { try { const user = c.get("user"); - const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); + const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); const configs = await logger.getAllConfigs(); const pageData = { configs, @@ -19557,7 +19557,7 @@ adminLogsRoutes.post("/config/:category", async (c) => { const level = formData.get("level"); const retention = parseInt(formData.get("retention")); const maxSize = parseInt(formData.get("max_size")); - const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); + const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); await logger.updateConfig(category, { enabled, level, @@ -19586,7 +19586,7 @@ adminLogsRoutes.get("/export", async (c) => { const category = query.category; const startDate = query.start_date; const endDate = query.end_date; - const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); + const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); const filter = { limit: 1e4, // Export up to 10k logs @@ -19667,7 +19667,7 @@ adminLogsRoutes.post("/cleanup", async (c) => { error: "Unauthorized. Admin access required." }, 403); } - const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); + const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); await logger.cleanupByRetention(); return c.html(html.html`
@@ -19689,7 +19689,7 @@ adminLogsRoutes.post("/search", async (c) => { const search = formData.get("search"); const level = formData.get("level"); const category = formData.get("category"); - const logger = chunkWAEQXGCX_cjs.getLogger(c.env.DB); + const logger = chunkXWQVFWPW_cjs.getLogger(c.env.DB); const filter = { limit: 20, offset: 0, @@ -21740,9 +21740,9 @@ function renderStorageUsage(databaseSizeBytes, mediaSizeBytes) { } // src/routes/admin-dashboard.ts -var VERSION = chunkGLRZAPX6_cjs.getCoreVersion(); +var VERSION = chunk74BFRAQS_cjs.getCoreVersion(); var router = new hono.Hono(); -router.use("*", chunkTAOOLOUH_cjs.requireAuth()); +router.use("*", chunkV4V54BY3_cjs.requireAuth()); router.get("/", async (c) => { const user = c.get("user"); try { @@ -22610,22 +22610,6 @@ function renderCollectionFormPage(data) {

Collection Details

Configure your collection settings below

- - ${isEdit && data.name ? ` - -
- -
- ` : ""} @@ -23085,176 +23069,6 @@ function renderCollectionFormPage(data) { - ${isEdit && data.name ? ` - - - - - ` : ""} \n \n \n \n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n

Welcome Back

\n

Sign in to your account to continue

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n ${data.message ? `
${renderAlert({ type: 'success', message: data.message })}
` : ''}\n\n \n
\n\n \n \n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Sign In\n \n \n\n \n
\n

\n Don't have an account?\n Create one here\n

\n
\n
\n\n \n
\n \n v${data.version || '0.1.0'}\n \n
\n
\n
\n\n ${demoLoginActive ? `\n \n ` : ''}\n \n \n `\n}","import { renderAlert } from '../alert.template'\n\nexport interface RegisterPageData {\n error?: string\n}\n\nexport function renderRegisterPage(data: RegisterPageData): string {\n return `\n \n \n \n \n \n Register - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n
\n

SonicJS AI

\n

Create your account and get started

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n\n \n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Create Account\n \n \n\n \n
\n

\n Already have an account?\n Sign in here\n

\n
\n\n
\n
\n
\n
\n \n \n `\n}","/**\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 {\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\n if (plugin?.settings) {\n // Parse settings and check registration.enabled\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 return true // Default to enabled if no settings\n } catch {\n return true // Default to enabled on error\n }\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 {\n try {\n const result = await db.prepare('SELECT COUNT(*) as count FROM users').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 {\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 users 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 username: z.string().min(3, 'Username must be at least 3 characters').optional(),\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\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 {\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 'username':\n // Generate username from email (part before @)\n return data.email ? data.email.split('@')[0] : `user${Date.now()}`\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","/**\n * User Profile Config Registry\n *\n * Global singleton storing developer-defined custom profile field definitions.\n * Set once at app boot via defineUserProfile(), queried by routes and templates.\n */\n\nimport type { FieldType } from '../../../types/collection-config'\n\nexport interface ProfileFieldDefinition {\n name: string\n label: string\n type: FieldType\n options?: string[]\n default?: any\n required?: boolean\n placeholder?: string\n helpText?: string\n hidden?: boolean\n fields?: ProfileFieldDefinition[]\n validation?: {\n min?: number\n max?: number\n pattern?: string\n }\n}\n\nexport interface UserProfileConfig {\n fields: ProfileFieldDefinition[]\n registrationFields?: string[]\n}\n\nlet _profileConfig: UserProfileConfig | null = null\n\nexport function defineUserProfile(config: UserProfileConfig): void {\n if (_profileConfig) {\n console.warn('[SonicJS] defineUserProfile called multiple times — overwriting previous config')\n }\n _profileConfig = config\n}\n\nexport function getUserProfileConfig(): UserProfileConfig | null {\n return _profileConfig\n}\n\nexport function getProfileFieldDefaults(): Record {\n if (!_profileConfig) return {}\n const defaults: Record = {}\n for (const field of _profileConfig.fields) {\n if (field.default !== undefined) {\n defaults[field.name] = field.default\n }\n }\n return defaults\n}\n\nexport function getRegistrationFields(): ProfileFieldDefinition[] {\n if (!_profileConfig) return []\n const regFieldNames = _profileConfig.registrationFields || []\n return _profileConfig.fields.filter(f => regFieldNames.includes(f.name))\n}\n\n/** Reset state — for tests only */\nexport function _resetProfileConfig(): void {\n _profileConfig = null\n}\n","/**\n * User Profile Service\n *\n * Handles reading, writing, validation, and sanitization of custom profile data.\n */\n\nimport { sanitizeInput } from '../../../utils/sanitize'\nimport {\n getUserProfileConfig,\n getProfileFieldDefaults,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport function validateCustomData(\n data: Record,\n config: UserProfileConfig\n): { valid: boolean; errors: Record } {\n const errors: Record = {}\n\n for (const field of config.fields) {\n const value = data[field.name]\n\n if (field.required && (value === undefined || value === null || value === '')) {\n errors[field.name] = `${field.label} is required`\n continue\n }\n\n if (value === undefined || value === null || value === '') continue\n\n if (field.type === 'number' && typeof value !== 'number') {\n errors[field.name] = `${field.label} must be a number`\n }\n if (field.type === 'select' && field.options && !field.options.includes(value)) {\n errors[field.name] = `${field.label} must be one of: ${field.options.join(', ')}`\n }\n if (field.type === 'boolean' && typeof value !== 'boolean') {\n errors[field.name] = `${field.label} must be true or false`\n }\n if (field.validation?.min !== undefined && typeof value === 'number' && value < field.validation.min) {\n errors[field.name] = `${field.label} must be at least ${field.validation.min}`\n }\n if (field.validation?.max !== undefined && typeof value === 'number' && value > field.validation.max) {\n errors[field.name] = `${field.label} must be at most ${field.validation.max}`\n }\n if (field.validation?.pattern && typeof value === 'string' && !new RegExp(field.validation.pattern).test(value)) {\n errors[field.name] = `${field.label} format is invalid`\n }\n }\n\n return { valid: Object.keys(errors).length === 0, errors }\n}\n\nexport function sanitizeCustomData(\n data: Record,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n const knownNames = new Set(config.fields.map(f => f.name))\n\n for (const [key, value] of Object.entries(data)) {\n if (!knownNames.has(key)) continue\n if (typeof value === 'string') {\n result[key] = sanitizeInput(value)\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\nexport function coerceFieldValue(raw: string | null | undefined, field: ProfileFieldDefinition): any {\n if (raw === null || raw === undefined || raw === '') {\n return field.default ?? null\n }\n\n switch (field.type) {\n case 'number':\n const num = Number(raw)\n return isNaN(num) ? null : num\n case 'boolean':\n case 'checkbox':\n return raw === '1' || raw === 'true' || raw === 'on'\n case 'date':\n case 'datetime':\n const ts = new Date(raw).getTime()\n return isNaN(ts) ? null : ts\n default:\n return raw\n }\n}\n\nexport function extractCustomFieldsFromForm(\n formData: FormData,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n for (const field of config.fields) {\n const raw = formData.get(`custom_${field.name}`)?.toString()\n // For boolean/checkbox, absence means false\n if (raw === null || raw === undefined) {\n if (field.type === 'boolean' || field.type === 'checkbox') {\n result[field.name] = false\n }\n continue\n }\n result[field.name] = coerceFieldValue(raw, field)\n }\n return result\n}\n\nexport async function getCustomData(db: any, userId: string): Promise> {\n const row = await db\n .prepare('SELECT data FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (!row?.data) return {}\n try {\n return JSON.parse(row.data)\n } catch {\n return {}\n }\n}\n\nexport async function saveCustomData(\n db: any,\n userId: string,\n newData: Record\n): Promise {\n const existing = await getCustomData(db, userId)\n const merged = { ...existing, ...newData }\n const json = JSON.stringify(merged)\n\n // Check if profile row exists\n const row = await db\n .prepare('SELECT id FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (row) {\n await db\n .prepare('UPDATE user_profiles SET data = ?, updated_at = ? WHERE user_id = ?')\n .bind(json, Date.now(), userId)\n .run()\n } else {\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const now = Date.now()\n await db\n .prepare(\n 'INSERT INTO user_profiles (id, user_id, data, created_at, updated_at) VALUES (?, ?, ?, ?, ?)'\n )\n .bind(profileId, userId, json, now, now)\n .run()\n }\n}\n","export interface DragSortableOptions {\n itemSelector?: string\n handleSelector?: string\n onUpdate?: () => void\n}\n\nexport function getDragSortableScript(): string {\n return `\n \n `;\n}\n","import { getDragSortableScript } from './drag-sortable.template'\n\n/**\n * Returns shared readFieldValue function used by both blocks and structured fields.\n * Uses a window flag to ensure it's only initialized once.\n */\nfunction getReadFieldValueScript(): string {\n return `\n \n `\n}\n\nconst STRUCTURED_INDEX_TOKEN = '__INDEX__'\nconst BLOCK_INDEX_TOKEN = '__BLOCK_INDEX__'\n\nfunction sanitizeStructuredGroupId(fieldName: string): string {\n return `object-${fieldName}`\n .split(BLOCK_INDEX_TOKEN)\n .map((blockSegment) =>\n blockSegment\n .split(STRUCTURED_INDEX_TOKEN)\n .map((segment) =>\n segment\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, ''),\n )\n .join(STRUCTURED_INDEX_TOKEN),\n )\n .join(BLOCK_INDEX_TOKEN)\n}\n\nexport interface FieldDefinition {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any // JSON options\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface FieldRenderOptions {\n value?: any\n errors?: string[]\n disabled?: boolean\n className?: string\n pluginStatuses?: {\n quillEnabled?: boolean\n mdxeditorEnabled?: boolean\n tinymceEnabled?: boolean\n }\n collectionId?: string\n contentId?: string\n}\n\nfunction isMarkdownEditorFieldType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nfunction getEditorMetadata(fieldType: string): { family: string; provider: string } | null {\n if (fieldType === 'richtext' || fieldType === 'tinymce') {\n return {\n family: 'richtext',\n provider: 'tinymce',\n }\n }\n\n if (isMarkdownEditorFieldType(fieldType)) {\n return {\n family: 'markdown',\n provider: 'easymde',\n }\n }\n\n return null\n}\n\nexport function renderDynamicField(field: FieldDefinition, options: FieldRenderOptions = {}): string {\n const { value = '', errors = [], disabled = false, className = '', pluginStatuses = {}, collectionId = '', contentId = '' } = options\n const opts = field.field_options || {}\n const required = field.is_required ? 'required' : ''\n const baseClasses = `w-full rounded-lg px-3 py-2 text-sm text-zinc-950 dark:text-white bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 placeholder:text-zinc-400 dark:placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-zinc-950 dark:focus:ring-white transition-shadow ${className}`\n const errorClasses =\n errors.length > 0\n ? 'ring-pink-600 dark:ring-pink-500 focus:ring-pink-600 dark:focus:ring-pink-500'\n : ''\n\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n\n // Check if this is a plugin-based field type and if the plugin is inactive\n // If so, fall back to textarea with a warning\n let fallbackToTextarea = false\n let fallbackWarning = ''\n\n if (field.field_type === 'quill' && !pluginStatuses.quillEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Quill Editor plugin is inactive. Using textarea fallback.'\n } else if (isMarkdownEditorFieldType(field.field_type) && !pluginStatuses.mdxeditorEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Markdown editor plugin is inactive. Using textarea fallback.'\n } else if ((field.field_type === 'richtext' || field.field_type === 'tinymce') && !pluginStatuses.tinymceEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ TinyMCE plugin is inactive. Using textarea fallback.'\n }\n\n // If falling back to textarea, render it with a warning\n if (fallbackToTextarea) {\n return `\n
\n ${fallbackWarning ? `
${fallbackWarning}
` : ''}\n ${escapeHtml(value)}\n
\n `\n }\n\n let fieldHTML = ''\n\n switch (field.field_type) {\n case 'text':\n let patternHelp = ''\n let autoSlugScript = ''\n\n if (opts.pattern) {\n if (opts.pattern === '^[a-z0-9-]+$' || opts.pattern === '^[a-zA-Z0-9_-]+$') {\n patternHelp =\n '

Use letters, numbers, underscores, and hyphens only

'\n\n // Add auto-slug generation for slug fields\n if (fieldName === 'slug') {\n patternHelp +=\n ''\n autoSlugScript = `\n \n `\n }\n } else {\n patternHelp =\n '

Must match required format

'\n }\n }\n\n fieldHTML = `\n \n ${patternHelp}\n ${autoSlugScript}\n ${\n opts.pattern\n ? `\n \n `\n : ''\n }\n `\n break\n\n case 'textarea':\n fieldHTML = `\n ${escapeHtml(value)}\n `\n break\n\n case 'richtext':\n case 'tinymce':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'quill':\n // Quill WYSIWYG Editor\n fieldHTML = `\n
\n \n ${value}
\n\n \n \n \n `\n break\n\n case 'markdown':\n case 'mdxeditor':\n case 'easymde':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n // Markdown editor fields use the EasyMDE-backed richtext container.\n // The EasyMDE plugin initialization script handles activation.\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'number':\n fieldHTML = `\n \n `\n break\n\n case 'boolean':\n const checked = value === true || value === 'true' || value === '1' ? 'checked' : ''\n fieldHTML = `\n
\n \n \n
\n \n `\n break\n\n case 'date':\n fieldHTML = `\n \n `\n break\n\n case 'datetime':\n fieldHTML = `\n \n `\n break\n\n case 'slug':\n // Slug fields with auto-generation and duplicate detection\n const slugPattern = opts.pattern || '^[a-z0-9-]+$'\n const collectionIdValue = collectionId || opts.collectionId || ''\n const contentIdValue = contentId || opts.contentId || ''\n const isEditMode = !!value\n\n fieldHTML = `\n
\n \n
\n \n

Use lowercase letters, numbers, and hyphens only

\n
\n \n \n `\n break\n\n case 'select':\n const selectOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const multiple = opts.multiple ? 'multiple' : ''\n const selectedValues = Array.isArray(value) ? value : [value]\n\n fieldHTML = `\n \n ${!required && !opts.multiple ? '' : ''}\n ${selectOptions\n .map((option: any) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const selected = selectedValues.includes(optionValue) ? 'selected' : ''\n return ``\n })\n .join('')}\n \n ${\n opts.allowCustom\n ? `\n
\n \n
\n `\n : ''\n }\n `\n break\n\n case 'radio':\n const radioOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const selectedRadioValue =\n value !== undefined && value !== null\n ? String(value)\n : opts.default\n ? String(opts.default)\n : ''\n\n const isInline = opts.inline === true\n fieldHTML = `\n
\n ${radioOptions\n .map((option: any, index: number) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const inputId = `${fieldId}-option-${index}`\n const checked = selectedRadioValue === String(optionValue) ? 'checked' : ''\n return `\n \n `\n })\n .join('')}\n
\n `\n break\n\n case 'reference':\n let referenceCollections: string[] = []\n if (Array.isArray(opts.collection)) {\n referenceCollections = opts.collection.filter(Boolean)\n } else if (typeof opts.collection === 'string' && opts.collection) {\n referenceCollections = [opts.collection]\n }\n const referenceCollectionsAttr = referenceCollections.join(',')\n const hasReferenceCollection = referenceCollections.length > 0\n const hasReferenceValue = Boolean(value)\n fieldHTML = `\n
\n \n
\n \n ${hasReferenceCollection ? (hasReferenceValue ? 'Loading selection...' : 'No reference selected.') : 'Reference collection not configured.'}\n
\n
\n \n Select reference\n \n \n Remove\n \n
\n
\n \n `\n break\n\n case 'media':\n // Check if multiple selection is enabled\n const isMultiple = opts.multiple === true\n const mediaValues =\n isMultiple && value\n ? Array.isArray(value)\n ? value\n : String(value).split(',').filter(Boolean)\n : []\n const singleValue = !isMultiple ? value : ''\n\n // Helper to detect if URL is a video\n const isVideoUrl = (url: string) => {\n const videoExtensions = ['.mp4', '.webm', '.ogg', '.mov', '.avi']\n return videoExtensions.some((ext) => url.toLowerCase().endsWith(ext))\n }\n\n // Helper to render media element\n const renderMediaPreview = (url: string, alt: string, classes: string) => {\n if (isVideoUrl(url)) {\n return ``\n }\n return `\"${alt}\"`\n }\n\n fieldHTML = `\n
\n \n\n ${\n isMultiple\n ? `\n
\n ${mediaValues\n .map(\n (url: string, idx: number) => `\n
\n ${renderMediaPreview(url, `Media ${idx + 1}`, 'w-full h-24 object-cover rounded-lg border border-white/20')}\n \n \n \n \n \n
\n `,\n )\n .join('')}\n
\n `\n : `\n
\n ${singleValue ? renderMediaPreview(singleValue, 'Selected media', 'w-32 h-32 object-cover rounded-lg border border-white/20') : ''}\n
\n `\n }\n\n
\n \n \n \n \n ${isMultiple ? 'Select Media (Multiple)' : 'Select Media'}\n \n ${\n (isMultiple ? mediaValues.length > 0 : singleValue)\n ? `\n \n ${isMultiple ? 'Clear All' : 'Remove'}\n \n `\n : ''\n }\n
\n
\n `\n break\n\n case 'object':\n // Structured object field (like SEO with nested properties)\n return renderStructuredObjectField(field, options, baseClasses, errorClasses)\n\n case 'array':\n // Check if this is a blocks field (has discriminator/blocks config) or a regular array\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n if (itemsConfig.blocks && typeof itemsConfig.blocks === 'object') {\n // Blocks field with discriminated union\n return renderBlocksField(field, options, baseClasses, errorClasses)\n }\n // Regular structured array field\n return renderStructuredArrayField(field, options, baseClasses, errorClasses)\n\n default:\n fieldHTML = `\n \n `\n }\n\n const showLabel = field.field_type !== 'boolean'\n\n return `\n
0 ? 'true' : 'false'}\">\n ${\n showLabel\n ? `\n \n `\n : ''\n }\n ${fieldHTML}\n ${\n errors.length > 0\n ? `\n
\n ${errors.map((error) => `
${escapeHtml(error)}
`).join('')}\n
\n `\n : ''\n }\n ${\n opts.helpText\n ? `\n
\n ${escapeHtml(opts.helpText)}\n
\n `\n : ''\n }\n
\n `\n}\n\nexport function renderFieldGroup(\n title: string,\n fields: string[],\n collapsible: boolean = false,\n): string {\n const groupId = title.toLowerCase().replace(/\\s+/g, '-')\n\n return `\n
\n
\n

\n ${escapeHtml(title)}\n ${\n collapsible\n ? `\n \n \n \n `\n : ''\n }\n

\n
\n
\n ${fields.join('')}\n
\n
\n `\n}\n\nfunction renderBlocksField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const blocks = normalizeBlockDefinitions(itemsConfig.blocks)\n const discriminator =\n typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n const blockValues = normalizeBlocksValue(value, discriminator)\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const emptyState =\n blockValues.length === 0\n ? `\n
\n No blocks yet. Add your first block to get started.\n
\n `\n : ''\n\n const blockOptions = blocks\n .map((block) => ``)\n .join('')\n\n const blockItems = blockValues\n .map((blockValue, index) =>\n renderBlockItem(field, blockValue, blocks, discriminator, index, pluginStatuses),\n )\n .join('')\n\n const templates = blocks\n .map((block) => renderBlockTemplate(field, block, discriminator, pluginStatuses))\n .join('')\n\n return `\n \n \n\n
\n

\n ${escapeHtml(field.field_label || 'Content Blocks')}\n

\n
\n\n
\n
\n \n \n ${blockOptions}\n \n
\n \n Add Block\n \n
\n\n
\n ${blockItems || emptyState}\n
\n\n ${templates}\n \n ${getDragSortableScript()}\n ${getBlocksFieldScript()}\n `\n}\n\nfunction renderStructuredObjectField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = {}, pluginStatuses = {}, errors = [] } = options\n const opts = field.field_options || {}\n const properties = opts.properties && typeof opts.properties === 'object' ? opts.properties : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const objectValue = normalizeStructuredObjectValue(value)\n const objectLayout = opts.objectLayout || 'nested'\n const useNestedLayout = objectLayout !== 'flat'\n\n const subfields = Object.entries(properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n objectValue,\n pluginStatuses,\n field.field_name,\n ),\n )\n .join('')\n\n const groupTitle = field.field_label || field.field_name\n\n if (!useNestedLayout) {\n return `\n
\n \n
\n

\n ${escapeHtml(groupTitle)}\n

\n
\n
\n ${subfields}\n
\n
\n ${getStructuredFieldScript()}\n `\n }\n\n const groupId = sanitizeStructuredGroupId(field.field_name)\n const isCollapsed = errors.length > 0 ? false : opts.collapsed !== false\n\n return `\n
\n
\n

\n ${escapeHtml(groupTitle)}\n \n \n \n

\n
\n
\n \n
\n ${subfields}\n
\n
\n
\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const arrayValue = normalizeStructuredArrayValue(value)\n const arrayTitle = opts.itemLabel || field.field_label || 'Items'\n const hasItemTitle = typeof opts.itemTitle === 'string' && opts.itemTitle.trim() !== ''\n const arrayItemTitle = hasItemTitle ? opts.itemTitle.trim() : 'Item'\n const addItemLabel = hasItemTitle ? `Add ${arrayItemTitle}` : 'Add item'\n\n const items = arrayValue\n .map((itemValue, index) =>\n renderStructuredArrayItem(\n field,\n itemsConfig,\n String(index),\n itemValue,\n pluginStatuses,\n arrayItemTitle,\n ),\n )\n .join('')\n\n const emptyState =\n arrayValue.length === 0\n ? `\n
\n No items yet. Add the first item to get started.\n
\n `\n : ''\n\n return `\n
\n \n\n
\n
\n ${escapeHtml(arrayTitle)}\n
\n \n ${escapeHtml(addItemLabel)}\n \n
\n\n
\n ${items || emptyState}\n
\n\n \n
\n ${getDragSortableScript()}\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayItem(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n arrayItemTitle: string,\n): string {\n const itemFields = renderStructuredItemFields(field, itemConfig, index, itemValue, pluginStatuses)\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n ${escapeHtml(arrayItemTitle)} \n
\n
\n
\n \n \n \n \n
\n
\n
\n ${itemFields}\n
\n
\n `\n}\n\nfunction renderStructuredItemFields(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const itemType = itemConfig?.type || 'string'\n if (\n itemType === 'object' &&\n itemConfig?.properties &&\n typeof itemConfig.properties === 'object'\n ) {\n const fieldPrefix = `array-${field.field_name}-${index}`\n return Object.entries(itemConfig.properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n itemValue || {},\n pluginStatuses,\n fieldPrefix,\n ),\n )\n .join('')\n }\n\n const normalizedField = normalizeBlockField(itemConfig, 'Item')\n const fieldValue = itemValue ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `array-${field.field_name}-${index}-value`,\n field_name: `array-${field.field_name}-${index}-value`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction renderStructuredSubfield(\n field: FieldDefinition,\n propertyName: string,\n propertyConfig: any,\n objectValue: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n fieldPrefix: string,\n): string {\n const normalizedField = normalizeBlockField(propertyConfig, propertyName)\n const fieldValue = objectValue?.[propertyName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `${fieldPrefix}-${propertyName}`,\n field_name: `${fieldPrefix}__${propertyName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction normalizeStructuredObjectValue(value: any): Record {\n if (!value) return {}\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {}\n } catch {\n return {}\n }\n }\n if (typeof value === 'object' && !Array.isArray(value)) return value\n return {}\n}\n\nfunction normalizeStructuredArrayValue(value: any): any[] {\n if (!value) return []\n if (Array.isArray(value)) return value\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction normalizeBlockDefinitions(\n rawBlocks: any,\n): Array<{ name: string; label: string; description?: string; properties: Record }> {\n if (!rawBlocks || typeof rawBlocks !== 'object') return []\n\n return Object.entries(rawBlocks)\n .filter(([name, block]) => typeof name === 'string' && block && typeof block === 'object')\n .map(([name, block]: [string, any]) => ({\n name,\n label: block.label || name,\n description: block.description,\n properties: block.properties && typeof block.properties === 'object' ? block.properties : {},\n }))\n}\n\nfunction normalizeBlocksValue(value: any, discriminator: string): any[] {\n const normalizeItem = (item: any) => {\n if (!item || typeof item !== 'object') return null\n if (item[discriminator]) return item\n if (item.blockType && item.data && typeof item.data === 'object') {\n return { [discriminator]: item.blockType, ...item.data }\n }\n return item\n }\n\n const fromArray = (items: any[]) =>\n items.map(normalizeItem).filter((item) => item && typeof item === 'object')\n\n if (Array.isArray(value)) return fromArray(value)\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? fromArray(parsed) : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction renderBlockTemplate(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n return `\n \n `\n}\n\nfunction renderBlockItem(\n field: FieldDefinition,\n blockValue: any,\n blocks: Array<{\n name: string\n label: string\n description?: string\n properties: Record\n }>,\n discriminator: string,\n index: number,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockType = blockValue?.[discriminator] || blockValue?.blockType\n const blockDefinition = blocks.find((block) => block.name === blockType)\n\n if (!blockDefinition) {\n return `\n
\n Unknown block type: ${escapeHtml(String(blockType || 'unknown'))}. This block will be preserved as-is.\n
\n `\n }\n\n const data =\n blockValue && typeof blockValue === 'object'\n ? Object.fromEntries(Object.entries(blockValue).filter(([key]) => key !== discriminator))\n : {}\n\n return renderBlockCard(field, blockDefinition, discriminator, String(index), data, pluginStatuses)\n}\n\nfunction renderBlockCard(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n index: string,\n data: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockFields = Object.entries(block.properties)\n .map(([fieldName, fieldConfig]) => {\n if (fieldConfig?.type === 'array' && fieldConfig?.items?.blocks) {\n return `\n
\n Nested blocks are not supported yet for \"${escapeHtml(fieldName)}\".\n
\n `\n }\n\n const normalizedField = normalizeBlockField(fieldConfig, fieldName)\n const fieldValue = data?.[fieldName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `block-${field.field_name}-${index}-${fieldName}`,\n field_name: `block-${field.field_name}-${index}-${fieldName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n })\n .join('')\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${escapeHtml(block.label)}\n \n
\n ${block.description ? `

${escapeHtml(block.description)}

` : ''}\n
\n
\n
\n \n \n \n \n
\n
\n
\n ${blockFields}\n
\n
\n `\n}\n\nfunction normalizeBlockField(fieldConfig: any, fieldName: string) {\n const type = fieldConfig?.type || 'text'\n const label = fieldConfig?.title || fieldName\n const required = fieldConfig?.required === true\n const options = { ...fieldConfig }\n\n if (type === 'select' && Array.isArray(fieldConfig?.enum)) {\n options.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return {\n type,\n label,\n required,\n defaultValue: fieldConfig?.default,\n options,\n }\n}\n\nfunction getStructuredFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction getBlocksFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}\n","/**\n * User Profile Custom Fields Renderer\n *\n * Generates the HTML section for custom profile fields by adapting\n * ProfileFieldDefinition into FieldDefinition and calling renderDynamicField.\n */\n\nimport { renderDynamicField, type FieldDefinition } from '../../../templates/components/dynamic-field.template'\nimport type { UserProfileConfig, ProfileFieldDefinition } from './user-profile-registry'\n\nexport function toFieldDefinition(field: ProfileFieldDefinition, index: number): FieldDefinition {\n return {\n id: `custom_${field.name}`,\n field_name: `custom_${field.name}`,\n field_type: field.type,\n field_label: field.label,\n field_options: {\n placeholder: field.placeholder || '',\n helpText: field.helpText || '',\n enum: field.options || [],\n enumLabels: field.options || [],\n },\n field_order: index,\n is_required: field.required || false,\n is_searchable: false,\n }\n}\n\nexport function renderCustomProfileSection(\n config: UserProfileConfig | null,\n customData: Record\n): string {\n if (!config || config.fields.length === 0) return ''\n\n const visibleFields = config.fields.filter(f => !f.hidden)\n if (visibleFields.length === 0) return ''\n\n const fieldsHtml = visibleFields\n .map((field, index) => {\n const fieldDef = toFieldDefinition(field, index)\n const value = customData[field.name] ?? field.default ?? ''\n return renderDynamicField(fieldDef, { value })\n })\n .join('\\n')\n\n return `\n \n
\n

Custom Profile Fields

\n
\n ${fieldsHtml}\n
\n
`\n}\n","/**\n * User Profiles Plugin\n *\n * Configurable custom profile fields for users.\n * Developers call defineUserProfile() at app boot to declare custom fields\n * that are stored as JSON in user_profiles.data and rendered in the admin UI.\n *\n * API Routes:\n * GET /api/user-profiles/schema → Public field definitions\n * GET /api/user-profiles/:userId → Get custom data for a user (auth required)\n * PUT /api/user-profiles/:userId → Update custom data for a user (auth required)\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { getUserProfileConfig } from './user-profile-registry'\nimport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\nimport { renderCustomProfileSection } from './user-profile-renderer'\n\nexport function createUserProfilesPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'user-profiles',\n version: '1.0.0-beta.1',\n description: 'Configurable custom profile fields for users',\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com',\n },\n license: 'MIT',\n compatibility: '^2.0.0',\n })\n\n // ==================== API Routes ====================\n\n const api = new Hono()\n\n // GET /api/user-profiles/schema — public schema endpoint\n api.get('/schema', (c) => {\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ fields: [], registrationFields: [] })\n }\n return c.json({\n fields: config.fields\n .filter(f => !f.hidden)\n .map(f => ({\n name: f.name,\n label: f.label,\n type: f.type,\n options: f.options,\n required: f.required || false,\n placeholder: f.placeholder,\n helpText: f.helpText,\n default: f.default,\n validation: f.validation,\n })),\n registrationFields: config.registrationFields || [],\n })\n })\n\n // GET /api/user-profiles/:userId — get custom data\n api.get('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const userId = c.req.param('userId')\n const data = await getCustomData(db, userId)\n return c.json({ userId, customData: data })\n })\n\n // PUT /api/user-profiles/:userId — update custom data\n api.put('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ error: 'No profile schema configured' }, 400)\n }\n\n const userId = c.req.param('userId')\n const body = await c.req.json()\n const customData = body.customData || body\n\n const sanitized = sanitizeCustomData(customData, config)\n const validation = validateCustomData(sanitized, config)\n if (!validation.valid) {\n return c.json({ error: 'Validation failed', errors: validation.errors }, 400)\n }\n\n await saveCustomData(db, userId, sanitized)\n return c.json({ success: true })\n })\n\n builder.addRoute('/api/user-profiles', api, {\n description: 'Custom user profile fields API',\n requiresAuth: false,\n priority: 100,\n })\n\n builder.lifecycle({\n activate: async () => {\n console.info('[SonicJS] User Profiles plugin activated')\n },\n deactivate: async () => {\n console.info('[SonicJS] User Profiles plugin deactivated')\n },\n })\n\n return builder.build() as Plugin\n}\n\nexport const userProfilesPlugin = createUserProfilesPlugin()\n\n// Re-export public API\nexport {\n defineUserProfile,\n getUserProfileConfig,\n getProfileFieldDefaults,\n getRegistrationFields,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\n\nexport { renderCustomProfileSection } from './user-profile-renderer'\n","import { Hono } from 'hono'\n// import { zValidator } from '@hono/zod-validator'\nimport { z } from 'zod'\nimport { getCookie, setCookie } from 'hono/cookie'\nimport { html } from 'hono/html'\nimport { AuthManager, requireAuth, generateCsrfToken, rateLimit } from '../middleware'\nimport { getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb } from '../middleware/auth'\nimport { renderLoginPage, LoginPageData } from '../templates/pages/auth-login.template'\nimport { renderRegisterPage, RegisterPageData } from '../templates/pages/auth-register.template'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { authValidationService, isRegistrationEnabled, isFirstUserRegistration } from '../services/auth-validation'\nimport type { RegistrationData } from '../services/auth-validation'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, getRegistrationFields, getProfileFieldDefaults, sanitizeCustomData, saveCustomData, getCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n/** Set a signed CSRF cookie alongside the auth cookie on login/register. */\nasync function setCsrfCookie(c: any, maxAge?: number): Promise {\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n const csrfToken = await generateCsrfToken(secret)\n const cookieMaxAge = maxAge ?? (await getJwtExpirySecondsFromDb(c.env?.DB, c.env))\n setCookie(c, 'csrf_token', csrfToken, {\n httpOnly: false,\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: cookieMaxAge,\n })\n}\n\n/** Clear the CSRF cookie on logout. */\nfunction clearCsrfCookie(c: any): void {\n setCookie(c, 'csrf_token', '', {\n httpOnly: false,\n secure: false,\n sameSite: 'Strict',\n path: '/',\n maxAge: 0,\n })\n}\n\nconst authRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Login page (HTML form)\nauthRoutes.get('/login', async (c) => {\n const error = c.req.query('error')\n const message = c.req.query('message')\n \n const pageData: LoginPageData = {\n error: error || undefined,\n message: message || undefined,\n version: c.get('appVersion')\n }\n \n // Check if demo login plugin is active\n const db = c.env.DB\n let demoLoginActive = false\n try {\n const plugin = await db.prepare('SELECT * FROM plugins WHERE id = ? AND status = ?')\n .bind('demo-login-prefill', 'active')\n .first()\n demoLoginActive = !!plugin\n } catch (error) {\n // Ignore database errors - plugin system might not be initialized\n }\n \n return c.html(renderLoginPage(pageData, demoLoginActive))\n})\n\n// Registration page (HTML form)\nauthRoutes.get('/register', async (c) => {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.redirect('/auth/login?error=Registration is currently disabled')\n }\n }\n\n const error = c.req.query('error')\n\n const pageData: RegisterPageData = {\n error: error || undefined\n }\n\n return c.html(renderRegisterPage(pageData))\n})\n\n// Login schema\nconst loginSchema = z.object({\n email: z.string().email('Valid email is required'),\n password: z.string().min(1, 'Password is required')\n})\n\n// Register new user\nauthRoutes.post('/register',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.json({ error: 'Registration is currently disabled' }, 403)\n }\n }\n\n // Parse JSON with error handling\n let requestData\n try {\n requestData = await c.req.json()\n } catch (parseError) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n\n let validatedData: RegistrationData\n try {\n validatedData = await validationSchema.parseAsync(requestData)\n } catch (validationError: any) {\n return c.json({\n error: 'Validation failed',\n details: validationError.issues?.map((e: any) => e.message) || [validationError.message || 'Invalid request data']\n }, 400)\n }\n\n // Extract fields with defaults for optional ones\n const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.json({ error: 'User with this email or username already exists' }, 400)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n \n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n 'viewer', // Default role\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n \n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n if (requestData[field.name] !== undefined) {\n customData[field.name] = requestData[field.name]\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, 'viewer', c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n user: {\n id: userId,\n email: normalizedEmail,\n username,\n firstName,\n lastName,\n role: 'viewer'\n },\n token\n }, 201)\n } catch (error) {\n console.error('Registration error:', error)\n // Return validation errors as 400, other errors as 500\n if (error instanceof Error && error.message.includes('validation')) {\n return c.json({ error: error.message }, 400)\n }\n return c.json({\n error: 'Registration failed',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n }\n)\n\n// Login user\nauthRoutes.post('/login',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const body = await c.req.json()\n const validation = loginSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const { email, password } = validation.data\n const db = c.env.DB\n \n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Find user with caching\n const cache = getCacheService(CACHE_CONFIGS.user!)\n let user = await cache.get(cache.generateKey('user', `email:${normalizedEmail}`))\n\n if (!user) {\n user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n\n if (user) {\n // Cache the user for faster subsequent lookups\n await cache.set(cache.generateKey('user', `email:${normalizedEmail}`), user)\n await cache.set(cache.generateKey('user', user.id), user)\n }\n }\n\n if (!user) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n // Invalidate user cache on login\n await cache.delete(cache.generateKey('user', user.id))\n await cache.delete(cache.generateKey('user', `email:${normalizedEmail}`))\n\n return c.json({\n user: {\n id: user.id,\n email: user.email,\n username: user.username,\n firstName: user.first_name,\n lastName: user.last_name,\n role: user.role\n },\n token\n })\n } catch (error) {\n console.error('Login error:', error)\n return c.json({ error: 'Login failed' }, 500)\n }\n})\n\n// Logout user (both GET and POST for convenience)\nauthRoutes.post('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.json({ message: 'Logged out successfully' })\n})\n\nauthRoutes.get('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.redirect('/auth/login?message=You have been logged out successfully')\n})\n\n// Get current user\nauthRoutes.get('/me', requireAuth(), async (c) => {\n try {\n // This would need the auth middleware applied\n const user = c.get('user')\n \n if (!user) {\n return c.json({ error: 'Not authenticated' }, 401)\n }\n \n const db = c.env.DB\n const userData = await db.prepare('SELECT id, email, username, first_name, last_name, role, created_at FROM users WHERE id = ?')\n .bind(user.userId)\n .first() as Record | null\n\n if (!userData) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n const customData = await getCustomData(db, user.userId)\n return c.json({ user: { ...userData, ...customData } })\n } catch (error) {\n console.error('Get user error:', error)\n return c.json({ error: 'Failed to get user' }, 500)\n }\n})\n\n// Refresh token (sliding session)\n//\n// Accepts a valid JWT — or one that has expired within the grace window\n// (`JWT_REFRESH_GRACE_SECONDS`, default 7 days) — and issues a fresh JWT\n// with a new `exp`. This lets a long-lived session cookie keep a user\n// logged in across JWT expirations without forcing a full re-login.\n//\n// Security: the caller must still present a valid-signature token that\n// recently belonged to an active user. Fully forged or long-expired tokens\n// are rejected.\nauthRoutes.post('/refresh',\n rateLimit({ max: 60, windowMs: 60 * 1000, keyPrefix: 'refresh' }),\n async (c) => {\n try {\n // Accept token from Authorization header or cookie\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) token = getCookie(c, 'auth_token')\n\n if (!token) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const grace = await getJwtRefreshGraceSecondsFromDb(db, c.env)\n\n const payload = await AuthManager.verifyToken(token, c.env.JWT_SECRET, grace)\n if (!payload) {\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Re-validate the user is still active, and pick up any role changes.\n const row = await db.prepare('SELECT id, email, role, is_active FROM users WHERE id = ?')\n .bind(payload.userId)\n .first() as any\n\n if (!row || !row.is_active) {\n return c.json({ error: 'User is not active' }, 401)\n }\n\n // Generate new token with a fresh exp\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env)\n const newToken = await AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set new cookie\n setCookie(c, 'auth_token', newToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n token: newToken,\n expiresIn: tokenTtl\n })\n } catch (error) {\n console.error('Token refresh error:', error)\n return c.json({ error: 'Token refresh failed' }, 500)\n }\n})\n\n// Form-based registration handler (for HTML forms)\nauthRoutes.post('/register/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.html(html`\n
\n Registration is currently disabled. Please contact an administrator.\n
\n `)\n }\n }\n\n const formData = await c.req.formData()\n\n // Extract form data\n const requestData = {\n email: formData.get('email') as string,\n password: formData.get('password') as string,\n username: formData.get('username') as string,\n firstName: formData.get('firstName') as string,\n lastName: formData.get('lastName') as string,\n }\n\n // Normalize email to lowercase\n const normalizedEmail = requestData.email?.toLowerCase()\n requestData.email = normalizedEmail\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n const validation = await validationSchema.safeParseAsync(requestData)\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const validatedData: RegistrationData = validation.data\n\n // Extract fields with defaults for optional ones\n // const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.html(html`\n
\n User with this email or username already exists\n
\n `)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Determine role: first user gets admin, others get viewer\n const role = isFirstUser ? 'admin' : 'viewer'\n\n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n\n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n role,\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n\n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n const raw = formData.get(field.name)?.toString()\n if (raw !== undefined && raw !== null) {\n customData[field.name] = raw\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Redirect based on role\n const redirectUrl = role === 'admin' ? '/admin/dashboard' : '/admin/dashboard'\n\n return c.html(html`\n
\n Account created successfully! Redirecting...\n \n
\n `)\n } catch (error) {\n console.error('Registration error:', error)\n return c.html(html`\n
\n Registration failed. Please try again.\n
\n `)\n }\n})\n\n// Form-based login handler (for HTML forms)\nauthRoutes.post('/login/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email') as string\n const password = formData.get('password') as string\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n\n // Validate the data\n const validation = loginSchema.safeParse({ email: normalizedEmail, password })\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const db = c.env.DB\n \n // Find user\n const user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n \n if (!user) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n return c.html(html`\n
\n
\n
\n \n \n \n
\n

Login successful! Redirecting to admin dashboard...

\n
\n
\n \n
\n
\n `)\n } catch (error) {\n console.error('Login error:', error)\n return c.html(html`\n
\n Login failed. Please try again.\n
\n `)\n }\n})\n\n// Test seeding endpoint (only for development/testing)\nauthRoutes.post('/seed-admin',\n rateLimit({ max: 10, windowMs: 60 * 1000, keyPrefix: 'seed-admin' }),\n async (c) => {\n try {\n const db = c.env.DB\n \n // First ensure the users table exists\n await db.prepare(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL UNIQUE,\n username TEXT NOT NULL UNIQUE,\n first_name TEXT NOT NULL,\n last_name TEXT NOT NULL,\n password_hash TEXT,\n role TEXT NOT NULL DEFAULT 'viewer',\n avatar TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n last_login_at INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `).run()\n \n // Check if admin user already exists\n const existingAdmin = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind('admin@sonicjs.com', 'admin')\n .first()\n\n if (existingAdmin) {\n // Update the password to ensure it's correct for testing\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(passwordHash, Date.now(), existingAdmin.id)\n .run()\n\n return c.json({\n message: 'Admin user already exists (password updated)',\n user: {\n id: existingAdmin.id,\n email: 'admin@sonicjs.com',\n username: 'admin',\n role: 'admin'\n }\n })\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n \n // Create admin user\n const userId = 'admin-user-id'\n const now = Date.now()\n const adminEmail = 'admin@sonicjs.com'.toLowerCase()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n adminEmail,\n 'admin',\n 'Admin',\n 'User',\n passwordHash,\n 'admin',\n 1, // is_active\n now,\n now\n ).run()\n \n return c.json({ \n message: 'Admin user created successfully',\n user: {\n id: userId,\n email: adminEmail,\n username: 'admin',\n role: 'admin'\n },\n passwordHash: passwordHash // For debugging\n })\n } catch (error) {\n console.error('Seed admin error:', error)\n return c.json({ error: 'Failed to create admin user', details: error instanceof Error ? error.message : String(error) }, 500)\n }\n})\n\n\n// Accept invitation page\nauthRoutes.get('/accept-invitation', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.html(`\n \n Invitation Expired\n \n

Invitation Expired

\n

This invitation has expired. Please contact your administrator for a new invitation.

\n Go to Login\n \n \n `)\n }\n\n // Show invitation acceptance form\n return c.html(`\n \n \n \n \n \n Accept Invitation - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Accept Invitation

\n

Complete your account setup

\n

\n You've been invited as ${invitedUser.first_name} ${invitedUser.last_name}
\n ${invitedUser.email}
\n ${invitedUser.role}\n

\n
\n\n
\n \n \n
\n \n \n
\n\n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Accept invitation page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your invitation.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process invitation acceptance\nauthRoutes.post('/accept-invitation', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const username = formData.get('username')?.toString()?.trim()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !username || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'Invalid or expired invitation' }, 400)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.json({ error: 'Invitation has expired' }, 400)\n }\n\n // Check if username is available\n const existingUsernameStmt = db.prepare(`\n SELECT id FROM users WHERE username = ? AND id != ?\n `)\n const existingUsername = await existingUsernameStmt.bind(username, invitedUser.id).first()\n\n if (existingUsername) {\n return c.json({ error: 'Username is already taken' }, 400)\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Activate user account\n const updateStmt = db.prepare(`\n UPDATE users SET \n username = ?,\n password_hash = ?,\n is_active = 1,\n email_verified = 1,\n invitation_token = NULL,\n accepted_invitation_at = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n username,\n passwordHash,\n Date.now(),\n Date.now(),\n invitedUser.id\n ).run()\n\n // Generate JWT token for auto-login\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const authToken = await AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', authToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?welcome=true')\n\n } catch (error) {\n console.error('Accept invitation error:', error)\n return c.json({ error: 'Failed to accept invitation' }, 500)\n }\n})\n\n// Request password reset\nauthRoutes.post('/request-password-reset',\n rateLimit({ max: 3, windowMs: 15 * 60 * 1000, keyPrefix: 'password-reset' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email')?.toString()?.trim()?.toLowerCase()\n\n if (!email) {\n return c.json({ error: 'Email is required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if user exists and is active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name FROM users \n WHERE email = ? AND is_active = 1\n `)\n const user = await userStmt.bind(email).first() as any\n\n // Always return success to prevent email enumeration\n if (!user) {\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.'\n })\n }\n\n // Generate password reset token (expires in 1 hour)\n const resetToken = crypto.randomUUID()\n const resetExpires = Date.now() + (60 * 60 * 1000) // 1 hour\n\n // Update user with reset token\n const updateStmt = db.prepare(`\n UPDATE users SET \n password_reset_token = ?,\n password_reset_expires = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n resetToken,\n resetExpires,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // In a real implementation, you would send an email here\n // For now, we'll return the reset link for development\n const resetLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/reset-password?token=${resetToken}`\n\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.',\n reset_link: resetLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('Password reset request error:', error)\n return c.json({ error: 'Failed to process password reset request' }, 500)\n }\n})\n\n// Show password reset form\nauthRoutes.get('/reset-password', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, password_reset_expires\n FROM users \n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has already been used.

\n Go to Login\n \n \n `)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.html(`\n \n Reset Link Expired\n \n

Reset Link Expired

\n

The password reset link has expired. Please request a new one.

\n Go to Login\n \n \n `)\n }\n\n // Show password reset form\n return c.html(`\n \n \n \n \n \n Reset Password - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Reset Password

\n

Choose a new password for your account

\n

\n Reset password for ${user.first_name} ${user.last_name}
\n ${user.email}\n

\n
\n\n
\n \n \n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n\n \n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Password reset page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your password reset.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process password reset\nauthRoutes.post('/reset-password', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, password_hash, password_reset_expires\n FROM users\n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.json({ error: 'Invalid or expired reset token' }, 400)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.json({ error: 'Reset token has expired' }, 400)\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(password)\n\n // Store old password in history (skip if table doesn't exist)\n try {\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user.id,\n user.password_hash,\n Date.now()\n ).run()\n } catch (historyError) {\n // Password history table may not exist yet\n console.warn('Could not store password history:', historyError)\n }\n\n // Update user password and clear reset token\n const updateStmt = db.prepare(`\n UPDATE users SET\n password_hash = ?,\n password_reset_token = NULL,\n password_reset_expires = NULL,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newPasswordHash,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to login with success message\n return c.redirect('/auth/login?message=Password reset successfully. Please log in with your new password.')\n\n } catch (error) {\n console.error('Password reset error:', error)\n return c.json({ error: 'Failed to reset password' }, 500)\n }\n})\n\nexport default authRoutes\n","/**\n * Test Cleanup Routes\n *\n * Provides endpoints to clean up test data after e2e tests\n * WARNING: These endpoints should only be available in development/test environments\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database } from '@cloudflare/workers-types'\n\nconst app = new Hono()\n\n/**\n * Clean up all test data (collections, content, users except admin)\n * POST /test-cleanup\n */\napp.post('/test-cleanup', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Use pattern-based deletes to avoid SQL variable limits\n // This approach uses subqueries instead of building large IN lists\n\n // Step 1: Delete child data for test content (by pattern)\n await db.prepare(`\n DELETE FROM content_versions\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM workflow_history\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n // Note: content_data table may not exist in all schemas\n try {\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n } catch (e) {\n // Table doesn't exist, skip\n }\n\n // Step 2: Delete test content by pattern\n const contentResult = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n `).run()\n deletedCount += contentResult.meta?.changes || 0\n\n // Step 3: Delete child data for test users\n await db.prepare(`\n DELETE FROM api_tokens\n WHERE user_id IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM media\n WHERE uploaded_by IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n // Step 4: Delete test users\n const usersResult = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n `).run()\n deletedCount += usersResult.meta?.changes || 0\n\n // Step 5: Delete child data for test collections\n try {\n await db.prepare(`\n DELETE FROM collection_fields\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Delete remaining content from test collections\n await db.prepare(`\n DELETE FROM content\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n\n // Step 6: Delete test collections\n const collectionsResult = await db.prepare(`\n DELETE FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).run()\n deletedCount += collectionsResult.meta?.changes || 0\n\n // Step 7: Clean up orphaned data (skip if tables don't exist)\n try {\n await db.prepare(`\n DELETE FROM content_data WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM collection_fields WHERE collection_id NOT IN (SELECT id FROM collections)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM content_versions WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM workflow_history WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Step 8: Delete old activity logs (keep only last 100)\n await db.prepare(`\n DELETE FROM activity_logs\n WHERE id NOT IN (\n SELECT id FROM activity_logs\n ORDER BY created_at DESC\n LIMIT 100\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test data cleaned up successfully'\n })\n } catch (error) {\n console.error('Test cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test users only\n * POST /test-cleanup/users\n */\napp.post('/test-cleanup/users', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test users (preserve admin)\n const result = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com'\n AND (\n email LIKE '%test%'\n OR email LIKE '%example.com%'\n OR first_name = 'Test'\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test users cleaned up successfully'\n })\n } catch (error) {\n console.error('User cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test collections only\n * POST /test-cleanup/collections\n */\napp.post('/test-cleanup/collections', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Get test collection IDs first\n const collections = await db.prepare(`\n SELECT id FROM collections\n WHERE name LIKE 'test_%'\n OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).all()\n\n if (collections.results && collections.results.length > 0) {\n const collectionIds = collections.results.map((c: any) => c.id)\n\n // Delete associated fields\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM collection_fields WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete associated content\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM content WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete the collections\n const result = await db.prepare(`\n DELETE FROM collections\n WHERE id IN (${collectionIds.map(() => '?').join(',')})\n `).bind(...collectionIds).run()\n\n deletedCount = result.meta?.changes || 0\n }\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test collections cleaned up successfully'\n })\n } catch (error) {\n console.error('Collection cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test content only\n * POST /test-cleanup/content\n */\napp.post('/test-cleanup/content', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test content\n const result = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %'\n OR title LIKE '%E2E%'\n OR title LIKE '%Playwright%'\n OR title LIKE '%Sample%'\n `).run()\n\n // Clean up orphaned content_data\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test content cleaned up successfully'\n })\n } catch (error) {\n console.error('Content cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Plugin Middleware\n *\n * Provides middleware functions for checking plugin status and enforcing plugin requirements\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n/**\n * Check if a plugin is active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @returns Promise - True if the plugin is active, false otherwise\n */\nexport async function isPluginActive(db: D1Database, pluginId: string): Promise {\n try {\n const result = await db\n .prepare('SELECT status FROM plugins WHERE id = ?')\n .bind(pluginId)\n .first()\n\n return result?.status === 'active'\n } catch (error) {\n console.error(`[isPluginActive] Error checking plugin status for ${pluginId}:`, error)\n return false\n }\n}\n\n/**\n * Middleware to require a plugin to be active\n * Throws an error if the plugin is not active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @throws Error if plugin is not active\n */\nexport async function requireActivePlugin(db: D1Database, pluginId: string): Promise {\n const isActive = await isPluginActive(db, pluginId)\n if (!isActive) {\n throw new Error(`Plugin '${pluginId}' is required but is not active`)\n }\n}\n\n/**\n * Middleware to require multiple plugins to be active\n * Throws an error if any plugin is not active\n * @param db - The D1 database instance\n * @param pluginIds - Array of plugin IDs to check\n * @throws Error if any plugin is not active\n */\nexport async function requireActivePlugins(db: D1Database, pluginIds: string[]): Promise {\n for (const pluginId of pluginIds) {\n await requireActivePlugin(db, pluginId)\n }\n}\n\n/**\n * Get all active plugins\n * @param db - The D1 database instance\n * @returns Promise - Array of active plugin records\n */\nexport async function getActivePlugins(db: D1Database): Promise {\n try {\n const { results } = await db\n .prepare('SELECT * FROM plugins WHERE status = ?')\n .bind('active')\n .all()\n\n return results || []\n } catch (error) {\n console.error('[getActivePlugins] Error fetching active plugins:', error)\n return []\n }\n}\n","export interface ContentVersion {\n id: string\n version: number\n data: any\n author_id: string\n author_name?: string\n created_at: number\n is_current?: boolean\n}\n\nexport interface VersionHistoryData {\n contentId: string\n versions: ContentVersion[]\n currentVersion: number\n}\n\nexport function renderVersionHistory(data: VersionHistoryData): string {\n return `\n
\n
\n \n
\n
\n
\n

Version History

\n \n
\n
\n \n \n
\n
\n ${data.versions.map((version, index) => `\n
\n
\n
\n \n Version ${version.version}${version.is_current ? ' (Current)' : ''}\n \n \n ${new Date(version.created_at).toLocaleString()}\n \n
\n
\n ${!version.is_current ? `\n \n ` : ''}\n \n
\n
\n \n \n
\n
\n
\n Title:\n ${escapeHtml(version.data?.title || 'Untitled')}\n
\n
\n Author:\n ${escapeHtml(version.author_name || 'Unknown')}\n
\n ${version.data?.excerpt ? `\n
\n Excerpt:\n

${escapeHtml(version.data.excerpt.substring(0, 200))}${version.data.excerpt.length > 200 ? '...' : ''}

\n
\n ` : ''}\n
\n
\n \n \n ${!version.is_current && index < data.versions.length - 1 ? `\n
\n \n
\n Change detection coming soon...\n
\n
\n ` : ''}\n
\n `).join('')}\n
\n
\n \n \n
\n
\n \n ${data.versions.length} version${data.versions.length !== 1 ? 's' : ''} total\n \n \n
\n
\n
\n
\n \n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * EasyMDE Markdown Editor Plugin\n *\n * Provides markdown editing capabilities for richtext fields.\n * When active, this plugin injects the EasyMDE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'easy-mdx',\n version: '1.0.0',\n description: 'Lightweight markdown editor with live preview'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ EasyMDE editor plugin activated')\n },\n deactivate: async () => {\n console.info('❌ EasyMDE editor plugin deactivated')\n }\n})\n\nconst easyMdxPlugin = builder.build() as Plugin\n\nexport default easyMdxPlugin\n\n/**\n * Get EasyMDE CDN script tags\n * @returns HTML script and style tags for EasyMDE\n */\nexport function getMDXEditorScripts(): string {\n return `\n \n \n \n \n `\n}\n\n/**\n * Get EasyMDE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getMDXEditorInitScript(config?: {\n defaultHeight?: number\n toolbar?: string\n placeholder?: string\n}): string {\n const defaultHeight = config?.defaultHeight || 400\n const toolbar = config?.toolbar || 'full'\n const placeholder = config?.placeholder || 'Start writing your content...'\n\n return `\n // Initialize EasyMDE (Markdown Editor) only for markdown-marked fields\n function initializeMDXEditor() {\n if (typeof EasyMDE === 'undefined') {\n console.warn('EasyMDE not loaded yet, retrying...');\n setTimeout(initializeMDXEditor, 100);\n return;\n }\n\n // Find all textareas that need EasyMDE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"easymde\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (textarea.dataset.mdxeditorInitialized === 'true') {\n return;\n }\n\n // Mark as initialized\n textarea.dataset.mdxeditorInitialized = 'true';\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const editorToolbar = container?.dataset.toolbar || '${toolbar}';\n\n // Initialize EasyMDE\n try {\n const toolbarButtons = editorToolbar === 'minimal'\n ? ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'preview']\n : ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', 'table', '|', 'preview', 'side-by-side', 'fullscreen', '|', 'guide'];\n\n const easyMDE = new EasyMDE({\n element: textarea,\n placeholder: '${placeholder}',\n spellChecker: false,\n minHeight: height + 'px',\n toolbar: toolbarButtons,\n status: ['lines', 'words', 'cursor'],\n renderingConfig: {\n singleLineBreaks: false,\n codeSyntaxHighlighting: true\n }\n });\n\n // Store reference to editor instance\n textarea.easyMDEInstance = easyMDE;\n\n // Sync changes back to textarea\n easyMDE.codemirror.on(\"change\", () => {\n textarea.value = easyMDE.value();\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n textarea.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n\n console.log('EasyMDE initialized for field:', textarea.id || textarea.name);\n } catch (error) {\n console.error('Error initializing EasyMDE:', error);\n // Show textarea as fallback\n textarea.style.display = 'block';\n }\n });\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeMDXEditor);\n } else {\n // DOM already loaded, initialize immediately\n initializeMDXEditor();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeMDXEditor, 100);\n });\n `\n}\n\n/**\n * Check if EasyMDE editor plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isEasyMdxActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('easy-mdx')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking EasyMDE editor plugin status:', error)\n return false\n }\n}\n","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * TinyMCE Rich Text Editor Plugin\n *\n * Provides WYSIWYG editing capabilities for richtext fields.\n * When active, this plugin injects the TinyMCE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'tinymce-plugin',\n version: '1.0.0',\n description: 'Powerful WYSIWYG rich text editor for content creation'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ TinyMCE plugin activated')\n },\n deactivate: async () => {\n console.info('❌ TinyMCE plugin deactivated')\n }\n})\n\nconst tinymcePlugin = builder.build() as Plugin\n\nexport default tinymcePlugin\n\n/**\n * Get TinyMCE CDN script tag\n * @param apiKey - Optional TinyMCE API key (defaults to 'no-api-key')\n * @returns HTML script tag for TinyMCE CDN\n */\nexport function getTinyMCEScript(apiKey: string = 'no-api-key'): string {\n return ``\n}\n\n/**\n * Get TinyMCE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getTinyMCEInitScript(config?: {\n skin?: string\n defaultHeight?: number\n defaultToolbar?: string\n}): string {\n const skin = config?.skin || 'oxide-dark'\n const contentCss = skin.includes('dark') ? 'dark' : 'default'\n const defaultHeight = config?.defaultHeight || 300\n\n return `\n // Initialize TinyMCE only for TinyMCE-backed richtext fields\n function initializeTinyMCE() {\n if (typeof tinymce !== 'undefined') {\n // Find all textareas that need TinyMCE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"tinymce\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (tinymce.get(textarea.id)) {\n return;\n }\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const toolbar = container?.dataset.toolbar || 'full';\n\n tinymce.init({\n selector: '#' + textarea.id,\n skin: '${skin}',\n content_css: '${contentCss}',\n height: parseInt(height),\n menubar: false,\n plugins: [\n 'advlist', 'autolink', 'lists', 'link', 'image', 'charmap', 'preview',\n 'anchor', 'searchreplace', 'visualblocks', 'code', 'fullscreen',\n 'insertdatetime', 'media', 'table', 'help', 'wordcount'\n ],\n toolbar: toolbar === 'simple'\n ? 'bold italic underline | bullist numlist | link'\n : toolbar === 'minimal'\n ? 'bold italic | link'\n : 'undo redo | blocks | bold italic forecolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | help',\n content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; font-size: 14px }'\n });\n });\n }\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeTinyMCE);\n } else {\n // DOM already loaded, initialize immediately\n initializeTinyMCE();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeTinyMCE, 100);\n });\n `\n}\n\n/**\n * Check if TinyMCE plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isTinyMCEActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('tinymce-plugin')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking TinyMCE plugin status:', error)\n return false\n }\n}\n","/**\n * Quill Rich Text Editor Plugin\n *\n * Provides Quill editor integration for rich text editing in SonicJS\n * https://quilljs.com/\n */\n\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\n/**\n * Quill Editor Configuration Options\n */\nexport interface QuillOptions {\n theme?: 'snow' | 'bubble'\n placeholder?: string\n height?: number\n toolbar?: 'full' | 'simple' | 'minimal' | string[][]\n modules?: Record\n formats?: string[]\n}\n\n/**\n * Default Quill toolbar configurations\n */\nconst QUILL_TOOLBARS = {\n full: [\n [{ 'header': [1, 2, 3, 4, 5, 6, false] }],\n ['bold', 'italic', 'underline', 'strike'],\n [{ 'color': [] }, { 'background': [] }],\n [{ 'align': [] }],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n [{ 'indent': '-1'}, { 'indent': '+1' }],\n ['blockquote', 'code-block'],\n ['link', 'image', 'video'],\n ['clean']\n ],\n simple: [\n ['bold', 'italic', 'underline'],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n ['link']\n ],\n minimal: [\n ['bold', 'italic'],\n ['link']\n ]\n}\n\n/**\n * Render a Quill editor field\n * @param fieldId - The field ID\n * @param fieldName - The field name\n * @param value - The current value\n * @param options - Quill configuration options\n * @returns HTML string for the Quill editor field\n */\nexport function renderQuillField(\n fieldId: string,\n fieldName: string,\n value: string = '',\n options: QuillOptions = {}\n): string {\n const {\n theme = 'snow',\n placeholder = 'Enter content...',\n height = 300,\n toolbar = 'full'\n } = options\n\n // Escape HTML for hidden input\n const escapeHtml = (str: string) => {\n return str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n }\n\n return `\n
\n \n ${value}
\n\n \n \n \n `\n}\n\n/**\n * Generate Quill initialization script\n * @returns HTML script tag with Quill initialization code\n */\nexport function getQuillInitScript(): string {\n return `\n \n `\n}\n\n/**\n * Generate Quill CDN links\n * @param version - Quill version (default: 2.0.2)\n * @returns HTML script and link tags for Quill CDN\n */\nexport function getQuillCDN(version: string = '2.0.2'): string {\n return `\n \n \n \n\n \n \n\n \n \n `\n}\n\n/**\n * Create the Quill Editor Plugin\n */\nexport function createQuillEditorPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'quill-editor',\n version: '1.0.0',\n description: 'Quill rich text editor integration for SonicJS'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Quill Editor plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Quill Editor plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const quillEditorPlugin = createQuillEditorPlugin()\n","import { getMDXEditorInitScript, getMDXEditorScripts } from '../../plugins/available/easy-mdx'\nimport { getTinyMCEInitScript, getTinyMCEScript } from '../../plugins/available/tinymce-plugin'\nimport { getQuillCDN, getQuillInitScript } from '../../plugins/core-plugins/quill-editor'\nimport { renderAlert } from '../alert.template'\nimport { FieldDefinition, renderDynamicField, renderFieldGroup } from '../components/dynamic-field.template'\nimport { getConfirmationDialogScript, renderConfirmationDialog } from '../confirmation-dialog.template'\nimport { AdminLayoutCatalystData, renderAdminLayoutCatalyst } from '../layouts/admin-layout-catalyst.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n schema: any\n}\n\nexport interface ContentFormData {\n id?: string\n title?: string\n slug?: string\n created_at?: number\n updated_at?: number\n published_at?: number\n data?: any\n status?: string\n scheduled_publish_at?: number\n scheduled_unpublish_at?: number\n review_status?: string\n meta_title?: string\n meta_description?: string\n collection: Collection\n fields: FieldDefinition[]\n isEdit?: boolean\n error?: string\n success?: string\n validationErrors?: Record\n workflowEnabled?: boolean // New flag to indicate if workflow plugin is active\n tinymceEnabled?: boolean // Flag to indicate if TinyMCE plugin is active\n tinymceSettings?: {\n apiKey?: string\n defaultHeight?: number\n defaultToolbar?: string\n skin?: string\n }\n quillEnabled?: boolean // Flag to indicate if Quill plugin is active\n quillSettings?: {\n version?: string\n defaultHeight?: number\n defaultToolbar?: string\n theme?: string\n }\n mdxeditorEnabled?: boolean // Flag to indicate if MDXEditor plugin is active\n mdxeditorSettings?: {\n defaultHeight?: number\n theme?: string\n toolbar?: string\n placeholder?: string\n }\n referrerParams?: string // URL parameters to preserve filters when returning to list\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentFormPage(data: ContentFormData): string {\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? `Edit: ${data.title || 'Content'}` : `New ${data.collection.display_name}`\n const hasValidationErrors = Boolean(data.validationErrors && Object.keys(data.validationErrors).length > 0)\n\n // Construct back URL with preserved filters\n const backUrl = data.referrerParams\n ? `/admin/content?${data.referrerParams}`\n : `/admin/content?collection=${data.collection.id}`\n\n // Group fields by category\n const coreFields = data.fields.filter(f => ['title', 'slug', 'content'].includes(f.field_name))\n const contentFields = data.fields.filter(f => !['title', 'slug', 'content'].includes(f.field_name) && !f.field_name.startsWith('meta_'))\n const metaFields = data.fields.filter(f => f.field_name.startsWith('meta_'))\n\n // Helper function to get field value - title and slug are stored as columns, others in data JSON\n const getFieldValue = (fieldName: string) => {\n if (fieldName === 'title') return data.title || data.data?.[fieldName] || ''\n if (fieldName === 'slug') return data.slug || data.data?.[fieldName] || ''\n return data.data?.[fieldName] || ''\n }\n\n // Prepare plugin statuses for field rendering\n const pluginStatuses = {\n quillEnabled: data.quillEnabled || false,\n mdxeditorEnabled: data.mdxeditorEnabled || false,\n tinymceEnabled: data.tinymceEnabled || false\n }\n\n // Render field groups\n const coreFieldsHTML = coreFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id // Pass content ID when editing\n }))\n\n const contentFieldsHTML = contentFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const metaFieldsHTML = metaFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const pageContent = `\n
\n \n
\n
\n

${isEdit ? 'Edit Content' : 'New Content'}

\n

\n ${data.collection.description || `Manage ${data.collection.display_name.toLowerCase()} content`}\n

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

${data.collection.display_name}

\n

${isEdit ? 'Update your content' : 'Create new content'}

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n
\n \n
\n \n \n ${isEdit ? `` : ''}\n ${data.referrerParams ? `` : ''}\n \n \n ${renderFieldGroup('Basic Information', coreFieldsHTML)}\n \n \n ${contentFields.length > 0 ? renderFieldGroup('Content Details', contentFieldsHTML) : ''}\n \n \n ${metaFields.length > 0 ? renderFieldGroup('SEO & Metadata', metaFieldsHTML, true) : ''}\n \n
\n \n
\n\n \n
\n \n
\n

Publishing

\n\n ${data.workflowEnabled ? `\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n \n

Leave empty to publish immediately

\n
\n\n \n
\n \n \n

Automatically unpublish at this time

\n
\n ` : `\n \n
\n \n
\n \n \n \n \n \n \n \n
\n

Enable Workflow plugin for advanced status management

\n
\n `}\n
\n\n \n ${isEdit ? `\n
\n

Content Info

\n\n
\n
\n
Created
\n
${data.created_at ? new Date(data.created_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Last Modified
\n
${data.updated_at ? new Date(data.updated_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Author
\n
${data.data?.author || 'Unknown'}
\n
\n ${data.published_at ? `\n
\n
Published
\n
${new Date(data.published_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n\n
\n \n \n \n \n View Version History\n \n
\n
\n ` : ''}\n\n \n
\n

Quick Actions

\n\n
\n \n \n \n \n \n Preview Content\n \n\n \n \n \n \n Duplicate Content\n \n\n ${isEdit ? `\n \n \n \n \n Delete Content\n \n ` : ''}\n
\n
\n
\n\n \n
\n \n \n \n \n Cancel\n \n\n
\n \n \n \n \n ${isEdit ? 'Update' : 'Save'}\n \n\n ${data.user?.role !== 'viewer' ? `\n \n \n \n \n ${isEdit ? 'Update' : 'Save'} & Publish\n \n ` : ''}\n
\n
\n
\n
\n
\n\n \n ${renderConfirmationDialog({\n id: 'duplicate-content-confirm',\n title: 'Duplicate Content',\n message: 'Create a copy of this content?',\n confirmText: 'Duplicate',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performDuplicateContent()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-content-confirm',\n title: 'Delete Content',\n message: 'Are you sure you want to delete this content? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: `performDeleteContent('${data.id}')`\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-repeater-item-confirm',\n title: 'Delete Item',\n message: 'Are you sure you want to delete this item? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-block-confirm',\n title: 'Delete Block',\n message: 'Are you sure you want to delete this block? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${getConfirmationDialogScript()}\n\n ${data.tinymceEnabled ? getTinyMCEScript(data.tinymceSettings?.apiKey) : ''}\n\n ${data.quillEnabled ? getQuillCDN(data.quillSettings?.version) : ''}\n\n ${data.quillEnabled ? getQuillInitScript() : ''}\n\n ${data.mdxeditorEnabled ? getMDXEditorScripts() : ''}\n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n content: pageContent,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderTable, TableData, TableColumn } from '../table.template'\nimport type { FilterBarData } from '../filter-bar.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../confirmation-dialog.template'\n\nexport interface ContentItem {\n id: string\n title: string\n slug: string\n modelName: string\n statusBadge: string\n authorName: string\n formattedDate: string\n availableActions: string[]\n}\n\nexport interface ContentListPageData {\n modelName: string\n status: string\n page: number\n search?: string\n models: Array<{\n name: string\n displayName: string\n }>\n contentItems: ContentItem[]\n totalItems: number\n itemsPerPage: number\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentListPage(data: ContentListPageData): string {\n // Build current URL parameters to pass to edit page\n const urlParams = new URLSearchParams()\n if (data.modelName && data.modelName !== 'all') urlParams.set('model', data.modelName)\n if (data.status && data.status !== 'all') urlParams.set('status', data.status)\n if (data.search) urlParams.set('search', data.search)\n if (data.page && data.page !== 1) urlParams.set('page', data.page.toString())\n const currentParams = urlParams.toString()\n\n // Check if filters are active (not in default state)\n const hasActiveFilters = data.modelName !== 'all' || data.status !== 'all' || !!data.search\n\n // Prepare filter bar data\n const filterBarData: FilterBarData = {\n filters: [\n {\n name: 'model',\n label: 'Model',\n options: [\n { value: 'all', label: 'All Models', selected: data.modelName === 'all' },\n ...data.models.map(model => ({\n value: model.name,\n label: model.displayName,\n selected: data.modelName === model.name\n }))\n ]\n },\n {\n name: 'status',\n label: 'Status',\n options: [\n { value: 'all', label: 'All Status', selected: data.status === 'all' },\n { value: 'draft', label: 'Draft', selected: data.status === 'draft' },\n { value: 'review', label: 'Under Review', selected: data.status === 'review' },\n { value: 'scheduled', label: 'Scheduled', selected: data.status === 'scheduled' },\n { value: 'published', label: 'Published', selected: data.status === 'published' },\n { value: 'archived', label: 'Archived', selected: data.status === 'archived' },\n { value: 'deleted', label: 'Deleted', selected: data.status === 'deleted' }\n ]\n }\n ],\n actions: [\n {\n label: 'Advanced Search',\n className: 'btn-primary',\n onclick: 'openAdvancedSearch()'\n },\n {\n label: 'Refresh',\n className: 'btn-secondary',\n onclick: 'location.reload()'\n }\n ],\n bulkActions: [\n { label: 'Publish', value: 'publish', icon: 'check-circle' },\n { label: 'Unpublish', value: 'unpublish', icon: 'x-circle' },\n { label: 'Delete', value: 'delete', icon: 'trash', className: 'text-pink-600' }\n ]\n }\n\n // Prepare table data\n const tableColumns: TableColumn[] = [\n {\n key: 'title',\n label: 'Title',\n sortable: true,\n sortType: 'string',\n render: (value, row) => `\n
\n
\n \n
${row.slug}
\n
\n
\n `\n },\n {\n key: 'modelName',\n label: 'Model',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'statusBadge',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (value) => value\n },\n {\n key: 'authorName',\n label: 'Author',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'formattedDate',\n label: 'Updated',\n sortable: true,\n sortType: 'date',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n className: 'text-sm font-medium',\n render: (value, row) => `\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'content-table',\n columns: tableColumns,\n rows: data.contentItems,\n selectable: true,\n rowClickable: true,\n rowClickUrl: (row: ContentItem) => `/admin/content/${row.id}/edit${currentParams ? `?ref=${encodeURIComponent(currentParams)}` : ''}`,\n emptyMessage: 'No content found. Create your first content item to get started.'\n }\n\n // Prepare pagination data\n const totalPages = Math.ceil(data.totalItems / data.itemsPerPage)\n const startItem = (data.page - 1) * data.itemsPerPage + 1\n const endItem = Math.min(data.page * data.itemsPerPage, data.totalItems)\n\n const paginationData: PaginationData = {\n currentPage: data.page,\n totalPages,\n totalItems: data.totalItems,\n itemsPerPage: data.itemsPerPage,\n startItem,\n endItem,\n baseUrl: '/admin/content',\n queryParams: {\n model: data.modelName,\n status: data.status,\n ...(data.search ? { search: data.search } : {})\n },\n showPageSizeSelector: true,\n pageSizeOptions: [10, 20, 50, 100]\n }\n\n // Generate page content\n const pageContent = `\n
\n \n
\n
\n

Content Management

\n

Manage and organize your content items

\n
\n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n \n
\n \n
\n \n \n ${data.models.map(model => `\n \n `).join('')}\n \n \n \n \n
\n
\n\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n
\n ${data.totalItems} ${data.totalItems === 1 ? 'item' : 'items'}\n ${filterBarData.actions?.map(action => `\n \n ${action.label === 'Refresh' ? `\n \n \n \n ` : ''}\n ${action.label}\n \n `).join('') || ''}\n ${filterBarData.bulkActions && filterBarData.bulkActions.length > 0 ? `\n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n \n Move to Draft\n \n
\n
\n \n \n \n \n Delete Selected\n \n
\n
\n
\n ` : ''}\n
\n
\n
\n
\n
\n \n \n
\n ${renderTable(tableData)}\n ${renderPagination(paginationData)}\n
\n \n
\n \n \n
\n
\n \n \n\n \n ${renderConfirmationDialog({\n id: 'bulk-action-confirm',\n title: 'Confirm Bulk Action',\n message: 'Are you sure you want to perform this action? This operation will affect multiple items.',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n iconColor: 'blue',\n onConfirm: 'executeBulkAction()'\n })}\n\n \n ${getConfirmationDialogScript()}\n\n \n
\n
\n \n
\n\n \n
\n
\n \n
\n

\n 🔍 Advanced Search\n

\n \n
\n\n \n
\n \n
\n \n
\n \n
\n
\n
\n\n \n
\n \n
\n \n \n
\n
\n\n \n
\n

Filters

\n \n
\n \n
\n \n \n \n ${data.models.map(\n (model) => `\n \n `\n ).join('')}\n \n

Hold Ctrl/Cmd to select multiple

\n
\n\n \n
\n \n \n \n \n \n \n \n \n
\n
\n
\n\n \n
\n \n Cancel\n \n \n Search\n \n
\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n // Prepare layout data\n const layoutData: AdminLayoutCatalystData = {\n title: 'Content Management',\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export function resolveSchemaFieldType(fieldConfig: Record): string {\n if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n return 'slug'\n }\n\n if (fieldConfig.type && fieldConfig.type !== 'string') {\n return fieldConfig.type\n }\n\n if (fieldConfig.format === 'richtext') {\n return 'richtext'\n }\n\n if (fieldConfig.format === 'media') {\n return 'media'\n }\n\n if (fieldConfig.format === 'date-time') {\n return 'date'\n }\n\n if (Array.isArray(fieldConfig.enum)) {\n return 'select'\n }\n\n return fieldConfig.type || 'string'\n}\n\nexport function buildSchemaFieldOptions(fieldConfig: Record): Record {\n const fieldOptions = { ...fieldConfig }\n const resolvedFieldType = resolveSchemaFieldType(fieldConfig)\n\n if (resolvedFieldType === 'select' && Array.isArray(fieldConfig.enum)) {\n fieldOptions.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return fieldOptions\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { Bindings, Variables } from '../app'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { CACHE_CONFIGS, getCacheService } from '../services/cache'\nimport { PluginService } from '../services/plugin-service'\nimport { ContentVersion, renderVersionHistory, VersionHistoryData } from '../templates/components/version-history.template'\nimport { ContentFormData, renderContentFormPage } from '../templates/pages/admin-content-form.template'\nimport { ContentListPageData, renderContentListPage } from '../templates/pages/admin-content-list.template'\nimport { getBlocksFieldConfig, parseBlocksValue } from '../utils/blocks'\nimport { escapeHtml, sanitizeRichText } from '../utils/sanitize'\nimport { buildSchemaFieldOptions, resolveSchemaFieldType } from './admin-content-field-types'\n\nconst adminContentRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Field definition type for form processing\ninterface FieldDefinition {\n field_name: string\n field_label: string\n field_type: string\n field_options?: any\n is_required?: boolean\n}\n\n// Result of parsing a single field value\ninterface ParsedFieldResult {\n value: any\n errors: string[]\n}\n\n/**\n * Parse a single field value from form data with validation\n * Centralizes field parsing logic used in POST, PUT, and preview handlers\n */\nfunction parseFieldValue(\n field: FieldDefinition,\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): ParsedFieldResult {\n const { skipValidation = false } = options\n const value = formData.get(field.field_name)\n const errors: string[] = []\n\n // Handle blocks fields (array with blocks config)\n const blocksConfig = getBlocksFieldConfig(field.field_options)\n if (blocksConfig) {\n const parsed = parseBlocksValue(value, blocksConfig)\n if (!skipValidation && field.is_required && parsed.value.length === 0) {\n parsed.errors.push(`${field.field_label} is required`)\n }\n return { value: parsed.value, errors: parsed.errors }\n }\n\n // Required field validation\n if (!skipValidation && field.is_required && (!value || value.toString().trim() === '')) {\n return { value: null, errors: [`${field.field_label} is required`] }\n }\n\n // Type-specific parsing\n switch (field.field_type) {\n case 'number':\n if (value && isNaN(Number(value))) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a valid number`)\n }\n return { value: null, errors }\n }\n return { value: value ? Number(value) : null, errors: [] }\n\n case 'boolean':\n // Check for the hidden _submitted field to determine if checkbox was rendered\n const submitted = formData.get(`${field.field_name}_submitted`)\n return { value: submitted ? value === 'true' : false, errors: [] }\n\n case 'select':\n if (field.field_options?.multiple) {\n return { value: formData.getAll(`${field.field_name}[]`), errors: [] }\n }\n return { value: value, errors: [] }\n\n case 'array': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: [], errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON array`)\n }\n return { value: [], errors }\n }\n if (!skipValidation && field.is_required && parsed.length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: [], errors }\n }\n }\n\n case 'object': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: {}, errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON object`)\n }\n return { value: {}, errors }\n }\n if (!skipValidation && field.is_required && Object.keys(parsed).length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: {}, errors }\n }\n }\n\n case 'json': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: null, errors }\n }\n try {\n return { value: JSON.parse(value.toString()), errors: [] }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: null, errors }\n }\n }\n\n default:\n return { value: value, errors: [] }\n }\n}\n\n/**\n * Extract all field values from form data\n */\nfunction extractFieldData(\n fields: FieldDefinition[],\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): { data: Record; errors: Record } {\n const data: Record = {}\n const errors: Record = {}\n\n for (const field of fields) {\n const result = parseFieldValue(field, formData, options)\n data[field.field_name] = result.value\n if (result.errors.length > 0) {\n errors[field.field_name] = result.errors\n }\n }\n\n return { data, errors }\n}\n\n// Apply authentication middleware\nadminContentRoutes.use('*', requireAuth())\n\n// Get collection fields\nasync function getCollectionFields(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('fields', collectionId),\n async () => {\n // First, check if collection has a schema (code-based collection)\n const collectionStmt = db.prepare('SELECT schema FROM collections WHERE id = ?')\n const collectionRow = await collectionStmt.bind(collectionId).first() as any\n\n if (collectionRow && collectionRow.schema) {\n try {\n const schema = typeof collectionRow.schema === 'string' ? JSON.parse(collectionRow.schema) : collectionRow.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n return Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n const fieldOptions = buildSchemaFieldOptions(fieldConfig)\n\n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: resolveSchemaFieldType(fieldConfig),\n field_label: fieldConfig.title || fieldName,\n field_options: fieldOptions,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table for legacy collections\n const stmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results } = await stmt.bind(collectionId).all()\n\n return (results || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }))\n }\n )\n}\n\n// Get collection by ID\nasync function getCollection(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('collection', collectionId),\n async () => {\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ? AND is_active = 1')\n const collection = await stmt.bind(collectionId).first() as any\n\n if (!collection) return null\n\n return {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n schema: collection.schema ? JSON.parse(collection.schema) : {}\n }\n }\n )\n}\n\n// Content list (main page)\nadminContentRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const db = c.env.DB\n\n // Get query parameters\n const page = parseInt(url.searchParams.get('page') || '1')\n const limit = parseInt(url.searchParams.get('limit') || '20')\n const modelName = url.searchParams.get('model') || 'all'\n const status = url.searchParams.get('status') || 'all'\n const search = url.searchParams.get('search') || ''\n const offset = (page - 1) * limit\n\n // Get all collections for filter dropdown (exclude form-sourced)\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results: collectionsResults } = await collectionsStmt.all()\n const models = (collectionsResults || []).map((row: any) => ({\n name: row.name,\n displayName: row.display_name\n }))\n\n // Build where conditions\n const conditions: string[] = []\n const params: any[] = []\n\n // Hide content from form-sourced collections in the regular content list\n conditions.push(\"(col.source_type IS NULL OR col.source_type = 'user')\")\n\n // Always filter out deleted content unless specifically requested\n if (status !== 'deleted') {\n conditions.push(\"c.status != 'deleted'\")\n }\n\n if (search) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n params.push(`%${search}%`, `%${search}%`, `%${search}%`)\n }\n\n if (modelName !== 'all') {\n conditions.push('col.name = ?')\n params.push(modelName)\n }\n\n if (status !== 'all' && status !== 'deleted') {\n conditions.push('c.status = ?')\n params.push(status)\n } else if (status === 'deleted') {\n conditions.push(\"c.status = 'deleted'\")\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n JOIN collections col ON c.collection_id = col.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalItems = countResult?.count || 0\n\n // Get content items\n const contentStmt = db.prepare(`\n SELECT c.id, c.title, c.slug, c.status, c.created_at, c.updated_at,\n col.name as collection_name, col.display_name as collection_display_name,\n u.first_name, u.last_name, u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n const { results } = await contentStmt.bind(...params, limit, offset).all()\n\n // Process content items\n const contentItems = (results || []).map((row: any) => {\n const statusConfig: Record = {\n draft: {\n class: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-1 ring-inset ring-zinc-600/20 dark:ring-zinc-500/20',\n text: 'Draft'\n },\n review: {\n class: 'bg-amber-50 dark:bg-amber-500/10 text-amber-700 dark:text-amber-400 ring-1 ring-inset ring-amber-600/20 dark:ring-amber-500/20',\n text: 'Under Review'\n },\n scheduled: {\n class: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-600/20 dark:ring-blue-500/20',\n text: 'Scheduled'\n },\n published: {\n class: 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-400 ring-1 ring-inset ring-green-600/20 dark:ring-green-500/20',\n text: 'Published'\n },\n archived: {\n class: 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-400 ring-1 ring-inset ring-purple-600/20 dark:ring-purple-500/20',\n text: 'Archived'\n },\n deleted: {\n class: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-600/20 dark:ring-red-500/20',\n text: 'Deleted'\n }\n }\n\n const config = statusConfig[row.status as keyof typeof statusConfig] || statusConfig.draft\n const statusBadge = `\n \n ${config?.text || row.status}\n \n `\n\n const authorName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.author_email || 'Unknown'\n\n const formattedDate = new Date(row.updated_at).toLocaleDateString()\n\n // Determine available workflow actions based on status\n const availableActions: string[] = []\n switch (row.status) {\n case 'draft':\n availableActions.push('submit_for_review', 'publish')\n break\n case 'review':\n availableActions.push('approve', 'request_changes')\n break\n case 'published':\n availableActions.push('unpublish', 'archive')\n break\n case 'scheduled':\n availableActions.push('unschedule')\n break\n }\n\n return {\n id: row.id,\n title: row.title,\n slug: row.slug,\n modelName: row.collection_display_name,\n statusBadge,\n authorName,\n formattedDate,\n availableActions\n }\n })\n\n const pageData: ContentListPageData = {\n modelName,\n status,\n page,\n search,\n models,\n contentItems,\n totalItems,\n itemsPerPage: limit,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentListPage(pageData))\n } catch (error) {\n console.error('Error fetching content list:', error)\n return c.html(`

Error loading content: ${error}

`)\n }\n})\n\n// New content form\nadminContentRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const collectionId = url.searchParams.get('collection')\n\n if (!collectionId) {\n // Show collection selection page\n const db = c.env.DB\n // Exclude form-sourced collections — users shouldn't manually create content in form collections\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name, description FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results } = await collectionsStmt.all()\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description\n }))\n\n // Render collection selection page\n const selectionHTML = `\n \n \n \n Select Collection - SonicJS AI Admin\n \n \n \n
\n
\n

Create New Content

\n

Select a collection to create content in:

\n \n
\n ${collections.map(collection => `\n \n

${collection.display_name}

\n

${collection.description || 'No description'}

\n
\n `).join('')}\n
\n \n \n
\n
\n \n \n `\n\n return c.html(selectionHTML)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n console.log('[Content Form /new] Editor plugins status:', {\n tinymce: tinymceEnabled,\n quill: quillEnabled,\n mdxeditor: mdxeditorEnabled,\n mdxeditorSettings\n })\n\n const formData: ContentFormData = {\n collection,\n fields,\n isEdit: false,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading new content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content form.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Edit content form\nadminContentRoutes.get('/:id/edit', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n\n // Capture referrer parameters to preserve filters when returning to list\n const referrerParams = url.searchParams.get('ref') || ''\n\n // Get content with caching\n const cache = getCacheService(CACHE_CONFIGS.content!)\n const content = await cache.getOrSet(\n cache.generateKey('content', id),\n async () => {\n const contentStmt = db.prepare(`\n SELECT c.*, col.id as collection_id, col.name as collection_name,\n col.display_name as collection_display_name, col.description as collection_description,\n col.schema as collection_schema\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n return await contentStmt.bind(id).first() as any\n }\n )\n\n if (!content) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Content not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const collection = {\n id: content.collection_id,\n name: content.collection_name,\n display_name: content.collection_display_name,\n description: content.collection_description,\n schema: content.collection_schema ? JSON.parse(content.collection_schema) : {}\n }\n\n const fields = await getCollectionFields(db, content.collection_id)\n const contentData = content.data ? JSON.parse(content.data) : {}\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n const formData: ContentFormData = {\n id: content.id,\n title: content.title,\n slug: content.slug,\n created_at: content.created_at,\n updated_at: content.updated_at,\n published_at: content.published_at,\n data: contentData,\n status: content.status,\n scheduled_publish_at: content.scheduled_publish_at,\n scheduled_unpublish_at: content.scheduled_unpublish_at,\n review_status: content.review_status,\n meta_title: content.meta_title,\n meta_description: content.meta_description,\n collection,\n fields,\n isEdit: true,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n referrerParams,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading edit content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content for editing.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Create content\nadminContentRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n const action = formData.get('action') as string\n\n if (!collectionId) {\n return c.html(html`\n
\n Collection ID is required.\n
\n `)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n // Check for validation errors\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Generate slug if not provided\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || 'draft'\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Create content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n // Invalidate collection content list cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n\n // Create initial version\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n contentId,\n 1,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n contentId,\n 'created',\n 'none',\n status,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${contentId}/edit?success=Content saved successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content created successfully!`\n : `/admin/content?collection=${collectionId}&success=Content created successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error creating content:', error)\n return c.html(html`\n
\n Failed to create content. Please try again.\n
\n `)\n }\n})\n\n// Update content\nadminContentRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const formData = await c.req.formData()\n const action = formData.get('action') as string\n\n const db = c.env.DB\n\n // Get existing content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existingContent = await contentStmt.bind(id).first() as any\n\n if (!existingContent) {\n return c.html(html`\n
\n Content not found.\n
\n `)\n }\n\n const collection = await getCollection(db, existingContent.collection_id)\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, existingContent.collection_id)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n id,\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Update slug if title changed\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || existingContent.status\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Update content\n const now = Date.now()\n\n const updateStmt = db.prepare(`\n UPDATE content SET\n slug = ?, title = ?, data = ?, status = ?,\n scheduled_publish_at = ?, scheduled_unpublish_at = ?,\n meta_title = ?, meta_description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n scheduledPublishAt ? new Date(scheduledPublishAt).getTime() : null,\n scheduledUnpublishAt ? new Date(scheduledUnpublishAt).getTime() : null,\n data.meta_title || null,\n data.meta_description || null,\n now,\n id\n ).run()\n\n // Invalidate content cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existingContent.collection_id}:*`)\n\n // Create new version if content changed\n const existingData = JSON.parse(existingContent.data || '{}')\n if (JSON.stringify(existingData) !== JSON.stringify(data)) {\n // Get next version number\n const versionCountStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const versionResult = await versionCountStmt.bind(id).first() as any\n const nextVersion = (versionResult?.max_version || 0) + 1\n\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Log workflow action if status changed\n if (status !== existingContent.status) {\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'status_changed',\n existingContent.status,\n status,\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${id}/edit?success=Content updated successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content updated successfully!`\n : `/admin/content?collection=${existingContent.collection_id}&success=Content updated successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error updating content:', error)\n return c.html(html`\n
\n Failed to update content. Please try again.\n
\n `)\n }\n})\n\n// Content preview\nadminContentRoutes.post('/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html('

Collection not found

')\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract field data for preview (skip validation)\n const { data } = extractFieldData(fields, formData, { skipValidation: true })\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeStatus = escapeHtml(String(formData.get('status') || 'draft'))\n const safeMetaDesc = data.meta_description ? escapeHtml(data.meta_description) : ''\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Preview: ${safeTitle}\n \n \n \n

${safeTitle}

\n
\n Collection: ${escapeHtml(collection.display_name)}
\n Status: ${safeStatus}
\n ${safeMetaDesc ? `Description: ${safeMetaDesc}
` : ''}\n
\n
\n ${safeContent}\n
\n\n

All Fields:

\n \n \n ${fields.map(field => `\n \n \n \n \n `).join('')}\n
FieldValue
${escapeHtml(field.field_label)}${data[field.field_name] ? escapeHtml(String(data[field.field_name])) : 'empty'}
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating preview:', error)\n return c.html('

Error generating preview

')\n }\n})\n\n// Duplicate content\nadminContentRoutes.post('/duplicate', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const originalId = formData.get('id') as string\n\n if (!originalId) {\n return c.json({ success: false, error: 'Content ID required' })\n }\n\n const db = c.env.DB\n\n // Get original content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const original = await contentStmt.bind(originalId).first() as any\n\n if (!original) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n // Create duplicate\n const newId = crypto.randomUUID()\n const now = Date.now()\n const originalData = JSON.parse(original.data || '{}')\n\n // Modify title to indicate it's a copy\n originalData.title = `${originalData.title || 'Untitled'} (Copy)`\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n newId,\n original.collection_id,\n `${original.slug}-copy-${Date.now()}`,\n originalData.title,\n JSON.stringify(originalData),\n 'draft', // Always start as draft\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n return c.json({ success: true, id: newId })\n } catch (error) {\n console.error('Error duplicating content:', error)\n return c.json({ success: false, error: 'Failed to duplicate content' })\n }\n})\n\n// Get bulk actions modal\nadminContentRoutes.get('/bulk-actions', async (c) => {\n const bulkActionsModal = `\n
\n
\n
\n

Bulk Actions

\n \n
\n

\n Select items from the table below to perform bulk actions.\n

\n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n Move to Draft\n \n \n \n \n \n Delete Selected\n \n
\n
\n
\n \n `\n\n return c.html(bulkActionsModal)\n})\n\n// Perform bulk action\nadminContentRoutes.post('/bulk-action', async (c) => {\n try {\n const user = c.get('user')\n const body = await c.req.json()\n const { action, ids } = body\n\n if (!action || !ids || ids.length === 0) {\n return c.json({ success: false, error: 'Action and IDs required' })\n }\n\n const db = c.env.DB\n const now = Date.now()\n\n if (action === 'delete') {\n // Soft delete by setting status to 'deleted'\n const placeholders = ids.map(() => '?').join(',')\n const stmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(now, ...ids).run()\n } else if (action === 'publish' || action === 'draft') {\n // Update status\n const placeholders = ids.map(() => '?').join(',')\n const publishedAt = action === 'publish' ? now : null\n const stmt = db.prepare(`\n UPDATE content\n SET status = ?, published_at = ?, updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(action, publishedAt, now, ...ids).run()\n } else {\n return c.json({ success: false, error: 'Invalid action' })\n }\n\n // Invalidate cache for all affected content items\n const cache = getCacheService(CACHE_CONFIGS.content!)\n for (const contentId of ids) {\n await cache.delete(cache.generateKey('content', contentId))\n }\n // Also invalidate list caches (they contain content from potentially multiple collections)\n await cache.invalidate('content:list:*')\n\n return c.json({ success: true, count: ids.length })\n } catch (error) {\n console.error('Bulk action error:', error)\n return c.json({ success: false, error: 'Failed to perform bulk action' })\n }\n})\n\n// Delete content\nadminContentRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const user = c.get('user')\n\n // Check if content exists\n const contentStmt = db.prepare('SELECT id, title FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.json({ success: false, error: 'Content not found' }, 404)\n }\n\n // Soft delete by setting status to 'deleted'\n const now = Date.now()\n const deleteStmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id = ?\n `)\n await deleteStmt.bind(now, id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate('content:list:*')\n\n // Return success - let HTMX reload the page\n return c.html(`\n
\n
\n
\n \n \n \n

Content deleted successfully. Refreshing...

\n
\n
\n
\n `)\n } catch (error) {\n console.error('Delete content error:', error)\n return c.json({ success: false, error: 'Failed to delete content' }, 500)\n }\n})\n\n// Get version history\nadminContentRoutes.get('/:id/versions', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.html('

Content not found

')\n }\n\n // Get all versions with author info\n const versionsStmt = db.prepare(`\n SELECT cv.*, u.first_name, u.last_name, u.email\n FROM content_versions cv\n LEFT JOIN users u ON cv.author_id = u.id\n WHERE cv.content_id = ?\n ORDER BY cv.version DESC\n `)\n const { results } = await versionsStmt.bind(id).all()\n\n const versions: ContentVersion[] = (results || []).map((row: any) => ({\n id: row.id,\n version: row.version,\n data: JSON.parse(row.data || '{}'),\n author_id: row.author_id,\n author_name: row.first_name && row.last_name ? `${row.first_name} ${row.last_name}` : row.email,\n created_at: row.created_at,\n is_current: false // Will be set below\n }))\n\n // Mark the latest version as current\n if (versions.length > 0) {\n versions[0]!.is_current = true\n }\n\n const data: VersionHistoryData = {\n contentId: id,\n versions,\n currentVersion: versions.length > 0 ? versions[0]!.version : 1\n }\n\n return c.html(renderVersionHistory(data))\n } catch (error) {\n console.error('Error loading version history:', error)\n return c.html('

Error loading version history

')\n }\n})\n\n// Restore version\nadminContentRoutes.post('/:id/restore/:version', async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const user = c.get('user')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT * FROM content_versions \n WHERE content_id = ? AND version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.json({ success: false, error: 'Version not found' })\n }\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const currentContent = await contentStmt.bind(id).first() as any\n\n if (!currentContent) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n const restoredData = JSON.parse(versionData.data)\n const now = Date.now()\n\n // Update content with restored data\n const updateStmt = db.prepare(`\n UPDATE content SET\n title = ?, data = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n restoredData.title || 'Untitled',\n versionData.data,\n now,\n id\n ).run()\n\n // Create new version for the restoration\n const nextVersionStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const nextVersionResult = await nextVersionStmt.bind(id).first() as any\n const nextVersion = (nextVersionResult?.max_version || 0) + 1\n\n const newVersionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await newVersionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n versionData.data,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, comment, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'version_restored',\n currentContent.status,\n currentContent.status,\n user?.userId || 'unknown',\n `Restored to version ${version}`,\n now\n ).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error restoring version:', error)\n return c.json({ success: false, error: 'Failed to restore version' })\n }\n})\n\n// Preview specific version\nadminContentRoutes.get('/:id/version/:version/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT cv.*, c.collection_id, col.display_name as collection_name\n FROM content_versions cv\n JOIN content c ON cv.content_id = c.id\n JOIN collections col ON c.collection_id = col.id\n WHERE cv.content_id = ? AND cv.version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.html('

Version not found

')\n }\n\n const data = JSON.parse(versionData.data || '{}')\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n const safeExcerpt = data.excerpt ? escapeHtml(data.excerpt) : ''\n const safeCollectionName = escapeHtml(versionData.collection_name || '')\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Version ${version} Preview: ${safeTitle}\n \n \n \n
\n Version ${version}\n Collection: ${safeCollectionName}
\n Created: ${new Date(versionData.created_at).toLocaleString()}
\n This is a historical version preview\n
\n\n

${safeTitle}

\n\n
\n ${safeContent}\n
\n\n ${safeExcerpt ? `

Excerpt:

${safeExcerpt}

` : ''}\n\n

All Field Data:

\n
\n${escapeHtml(JSON.stringify(data, null, 2))}\n        
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating version preview:', error)\n return c.html('

Error generating preview

')\n }\n})\nexport default adminContentRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserProfile {\n id: string\n email: string\n username: string\n first_name: string\n last_name: string\n phone?: string\n bio?: string\n avatar_url?: string\n timezone: string\n language: string\n theme: string\n email_notifications: boolean\n two_factor_enabled: boolean\n role: string\n created_at: number\n last_login_at?: number\n}\n\nexport interface ProfilePageData {\n profile: UserProfile\n timezones: Array<{ value: string; label: string }>\n languages: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderAvatarImage(avatarUrl: string | undefined, firstName: string, lastName: string): string {\n return `
\n ${avatarUrl\n ? `\"Profile`\n : `${firstName.charAt(0)}${lastName.charAt(0)}`\n }\n
`\n}\n\nexport function renderProfilePage(data: ProfilePageData): string {\n const pageContent = `\n
\n \n
\n
\n

User Profile

\n

\n Manage your account settings and preferences\n

\n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n \n
\n
\n \n
\n
\n
\n \n \n \n
\n
\n

Profile Information

\n

Update your account details

\n
\n
\n
\n\n \n
\n
\n\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n ${data.profile.bio || ''}\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Preferences

\n\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Notifications

\n\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n \n

Receive email updates about new features and product announcements.

\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Update Profile\n \n
\n
\n
\n
\n\n \n
\n \n
\n

Profile Picture

\n\n
\n ${renderAvatarImage(data.profile.avatar_url, data.profile.first_name, data.profile.last_name)}\n\n
\n \n \n \n \n \n \n Change Picture\n \n \n\n
\n
\n
\n\n \n
\n

Account Information

\n\n
\n
\n
Role
\n
\n \n ${data.profile.role}\n \n
\n
\n
\n
Member Since
\n
${new Date(data.profile.created_at).toLocaleDateString()}
\n
\n ${data.profile.last_login_at ? `\n
\n
Last Login
\n
${new Date(data.profile.last_login_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Two-Factor Auth
\n
\n ${data.profile.two_factor_enabled\n ? 'Enabled'\n : 'Disabled'\n }\n
\n
\n
\n
\n\n \n
\n

Security

\n\n
\n \n \n \n \n Change Password\n \n\n \n \n \n \n ${data.profile.two_factor_enabled ? 'Disable' : 'Enable'} 2FA\n \n
\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Change Password

\n \n
\n
\n\n
\n
\n\n
\n \n \n
\n\n
\n \n \n

Must be at least 8 characters

\n
\n\n
\n \n \n
\n\n
\n \n Cancel\n \n \n \n \n \n Update Password\n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'User Profile',\n pageTitle: 'Profile',\n currentPath: '/admin/profile',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { escapeHtml } from '../../utils/sanitize'\n\nexport type AlertType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface AlertData {\n type: AlertType\n title?: string\n message: string\n dismissible?: boolean\n className?: string\n icon?: boolean\n}\n\nexport function renderAlert(data: AlertData): string {\n const typeClasses = {\n success: 'bg-green-50 dark:bg-green-500/10 border border-green-600/20 dark:border-green-500/20',\n error: 'bg-error/10 border border-red-600/20 dark:border-red-500/20',\n warning: 'bg-amber-50 dark:bg-amber-500/10 border border-amber-600/20 dark:border-amber-500/20',\n info: 'bg-blue-50 dark:bg-blue-500/10 border border-blue-600/20 dark:border-blue-500/20'\n }\n\n const iconClasses = {\n success: 'text-green-600 dark:text-green-400',\n error: 'text-red-600 dark:text-red-400',\n warning: 'text-amber-600 dark:text-amber-400',\n info: 'text-blue-600 dark:text-blue-400'\n }\n\n const textClasses = {\n success: 'text-green-900 dark:text-green-300',\n error: 'text-red-900 dark:text-red-300',\n warning: 'text-amber-900 dark:text-amber-300',\n info: 'text-blue-900 dark:text-blue-300'\n }\n\n const messageTextClasses = {\n success: 'text-green-700 dark:text-green-400',\n error: 'text-red-700 dark:text-red-400',\n warning: 'text-amber-700 dark:text-amber-400',\n info: 'text-blue-700 dark:text-blue-400'\n }\n\n const icons = {\n success: ``,\n error: ``,\n warning: ``,\n info: ``\n }\n\n return `\n
\n
\n ${data.icon !== false ? `\n
\n \n ${icons[data.type]}\n \n
\n ` : ''}\n
\n ${data.title ? `\n

\n ${escapeHtml(data.title)}\n

\n ` : ''}\n
\n

${escapeHtml(data.message)}

\n
\n
\n ${data.dismissible ? `\n
\n
\n \n Dismiss\n \n \n \n \n
\n
\n ` : ''}\n
\n
\n `\n}\n\nexport function renderSuccessAlert(message: string, title?: string): string {\n return renderAlert({ type: 'success', message, title })\n}\n\nexport function renderErrorAlert(message: string, title?: string): string {\n return renderAlert({ type: 'error', message, title })\n}\n\nexport function renderWarningAlert(message: string, title?: string): string {\n return renderAlert({ type: 'warning', message, title })\n}\n\nexport function renderInfoAlert(message: string, title?: string): string {\n return renderAlert({ type: 'info', message, title })\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\n\nexport interface ActivityLog {\n id: string\n user_id: string\n action: string\n resource_type?: string\n resource_id?: string\n details?: any\n ip_address?: string\n user_agent?: string\n created_at: number\n user_email?: string\n user_name?: string\n}\n\nexport interface ActivityLogsPageData {\n logs: ActivityLog[]\n pagination: {\n page: number\n limit: number\n total: number\n pages: number\n }\n filters: {\n user_id?: string\n action?: string\n resource_type?: string\n date_from?: string\n date_to?: string\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderActivityLogsPage(data: ActivityLogsPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Activity Logs

\n

Monitor user actions and system activity

\n
\n
\n\n \n \n\n \n
\n

Filters

\n \n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n Clear Filters\n \n
\n
\n
\n\n \n
\n
\n
\n
\n

Recent Activity

\n
\n Showing ${data.logs.length} of ${data.pagination.total} logs\n
\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${data.logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimestampUserActionResourceIP AddressDetails
\n ${new Date(log.created_at).toLocaleString()}\n \n
${log.user_name || 'Unknown'}
\n
${log.user_email || 'N/A'}
\n
\n \n ${formatAction(log.action)}\n \n \n ${log.resource_type ? `\n
${log.resource_type}
\n ${log.resource_id ? `
${log.resource_id}
` : ''}\n ` : 'N/A'}\n
\n ${log.ip_address || 'N/A'}\n \n ${log.details ? `\n
\n View Details\n
${JSON.stringify(log.details, null, 2)}
\n
\n ` : 'N/A'}\n
\n
\n\n ${data.logs.length === 0 ? `\n
\n \n \n \n

No activity logs found

\n

Try adjusting your filters or check back later.

\n
\n ` : ''}\n\n \n ${data.pagination.pages > 1 ? `\n
\n
\n Page ${data.pagination.page} of ${data.pagination.pages} (${data.pagination.total} total logs)\n
\n \n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutData = {\n title: 'Activity Logs',\n pageTitle: 'Activity Logs',\n currentPath: '/admin/activity-logs',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction getActionBadgeClass(action: string): string {\n if (action.includes('login') || action.includes('logout')) {\n return 'bg-blue-500/20 text-blue-300'\n } else if (action.includes('create') || action.includes('invite')) {\n return 'bg-green-500/20 text-green-300'\n } else if (action.includes('update') || action.includes('change')) {\n return 'bg-yellow-500/20 text-yellow-300'\n } else if (action.includes('delete') || action.includes('cancel')) {\n return 'bg-red-500/20 text-red-300'\n } else {\n return 'bg-gray-500/20 text-gray-300'\n }\n}\n\nfunction formatAction(action: string): string {\n // Convert action from dot notation to readable format\n return action\n .split('.')\n .map(part => part.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()))\n .join(' - ')\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface UserProfileData {\n displayName?: string\n bio?: string\n company?: string\n jobTitle?: string\n website?: string\n location?: string\n dateOfBirth?: number\n}\n\nexport interface UserEditData {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n phone?: string\n avatarUrl?: string\n role: string\n isActive: boolean\n emailVerified: boolean\n twoFactorEnabled: boolean\n createdAt: number\n lastLoginAt?: number\n profile?: UserProfileData\n}\n\nexport interface UserEditPageData {\n userToEdit: UserEditData\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserEditPage(data: UserEditPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Edit User

\n
\n

Update user account and permissions

\n
\n
\n \n \n \n \n Save Changes\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Profile Information

\n

Extended profile data for this user

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n
\n\n
\n \n ${escapeHtml(data.userToEdit.profile?.bio || '')}\n
\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Set Password

\n

Leave blank to keep the current password

\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User has verified their email address

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

User Details

\n
\n
\n
User ID
\n
${data.userToEdit.id}
\n
\n
\n
Created
\n
${new Date(data.userToEdit.createdAt).toLocaleDateString()}
\n
\n ${data.userToEdit.lastLoginAt ? `\n
\n
Last Login
\n
${new Date(data.userToEdit.lastLoginAt).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Status
\n
\n ${data.userToEdit.isActive\n ? 'Active'\n : 'Inactive'\n }\n
\n
\n ${data.userToEdit.twoFactorEnabled ? `\n
\n
Security
\n
\n 2FA Enabled\n
\n
\n ` : ''}\n
\n
\n\n \n
\n

Danger Zone

\n

Irreversible and destructive actions

\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Permanently remove from database. Unchecked performs soft delete (deactivate only).

\n
\n
\n\n \n \n \n \n Delete User\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-user-confirm',\n title: 'Delete User',\n message: 'Are you sure you want to delete this user? Check the \"Hard Delete\" option to permanently remove all data from the database. This action cannot be undone!',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteUser()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Edit User',\n pageTitle: `Edit User - ${data.userToEdit.firstName} ${data.userToEdit.lastName}`,\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export interface ConfirmationDialogOptions {\n id: string\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmClass?: string\n iconColor?: 'red' | 'yellow' | 'blue'\n onConfirm?: string // JavaScript code to execute on confirm\n}\n\nexport function renderConfirmationDialog(options: ConfirmationDialogOptions): string {\n const {\n id,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmClass = 'bg-red-500 hover:bg-red-400',\n iconColor = 'red',\n onConfirm = ''\n } = options\n\n const iconColorClasses = {\n red: 'bg-red-500/10 text-red-400',\n yellow: 'bg-yellow-500/10 text-yellow-400',\n blue: 'bg-blue-500/10 text-blue-400'\n }\n\n return `\n \n \n \n\n
\n \n
\n
\n \n \n \n
\n
\n

${title}

\n
\n

${message}

\n
\n
\n
\n
\n \n ${confirmText}\n \n \n ${cancelText}\n \n
\n
\n
\n \n
\n `\n}\n\n/**\n * Helper function to show a confirmation dialog programmatically\n * Usage in templates: Add this script and call showConfirmDialog()\n */\nexport function getConfirmationDialogScript(): string {\n return `\n \n \n `\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserNewPageData {\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserNewPage(data: UserNewPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Create New User

\n
\n

Add a new user account to the system

\n
\n
\n \n \n \n \n Create User\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n\n
\n \n \n
\n
\n\n \n
\n

Password

\n
\n
\n \n \n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Mark email as verified

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

Creating a User

\n
\n

Fill in the required fields marked with * to create a new user account.

\n

The password must be at least 8 characters long.

\n

By default, new users are created as active and can sign in immediately.

\n

You can edit user details and permissions after creation.

\n
\n
\n\n \n
\n

Role Descriptions

\n
\n
\n
Administrator
\n
Full system access and permissions
\n
\n
\n
Editor
\n
Can create and edit content
\n
\n
\n
Author
\n
Can create own content
\n
\n
\n
Viewer
\n
Read-only access
\n
\n
\n
\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create User',\n pageTitle: 'Create New User',\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderAlert } from '../alert.template'\nimport { renderTable, TableColumn, TableData } from '../table.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface User {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n role: string\n avatar?: string\n isActive: boolean\n lastLoginAt?: number\n createdAt: number\n updatedAt: number\n formattedLastLogin?: string\n formattedCreatedAt?: string\n}\n\nexport interface UsersListPageData {\n users: User[]\n pagination?: PaginationData\n currentPage: number\n totalPages: number\n totalUsers: number\n statusFilter?: string\n roleFilter?: string\n searchFilter?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderUsersListPage(data: UsersListPageData): string {\n const columns: TableColumn[] = [\n {\n key: 'avatar',\n label: '',\n className: 'w-12',\n sortable: false,\n render: (value: string | null, row: User) => {\n const initials = `${row.firstName.charAt(0)}${row.lastName.charAt(0)}`.toUpperCase()\n if (value) {\n return `\"${row.firstName}`\n }\n return `\n
\n ${initials}\n
\n `\n }\n },\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, row: User) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n \n const truncatedFirstName = row.firstName.length > 25 ? row.firstName.substring(0, 25) + '...' : row.firstName\n const truncatedLastName = row.lastName.length > 25 ? row.lastName.substring(0, 25) + '...' : row.lastName\n const fullName = escapeHtml(`${truncatedFirstName} ${truncatedLastName}`)\n const truncatedUsername = row.username.length > 100 ? row.username.substring(0, 100) + '...' : row.username\n const username = escapeHtml(truncatedUsername)\n const statusBadge = row.isActive ?\n 'Active' :\n 'Inactive'\n return `\n
\n
${fullName}${statusBadge}
\n
@${username}
\n
\n `\n }\n },\n {\n key: 'email',\n label: 'Email',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n const escapedEmail = escapeHtml(value)\n return `${escapedEmail}`\n }\n },\n {\n key: 'role',\n label: 'Role',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const roleColors = {\n admin: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-700/10 dark:ring-red-500/20',\n editor: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-700/10 dark:ring-blue-500/20',\n author: 'bg-cyan-50 dark:bg-cyan-500/10 text-cyan-700 dark:text-cyan-400 ring-1 ring-inset ring-cyan-700/10 dark:ring-cyan-500/20',\n viewer: 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n }\n const colorClass = roleColors[value as keyof typeof roleColors] || 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n return `${value.charAt(0).toUpperCase() + value.slice(1)}`\n }\n },\n {\n key: 'lastLoginAt',\n label: 'Last Login',\n sortable: true,\n sortType: 'date',\n render: (value: number | null) => {\n if (!value) return 'Never'\n return `${new Date(value).toLocaleDateString()}`\n }\n },\n {\n key: 'createdAt',\n label: 'Created',\n sortable: true,\n sortType: 'date',\n render: (value: number) => `${new Date(value).toLocaleDateString()}`\n },\n {\n key: 'actions',\n label: 'Actions',\n className: 'text-right',\n sortable: false,\n render: (_value: any, row: User) => `\n
\n ${row.isActive ?\n `` :\n ``\n }\n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'users-table',\n columns,\n rows: data.users,\n selectable: false,\n rowClickable: true,\n rowClickUrl: (row: User) => `/admin/users/${row.id}/edit`,\n emptyMessage: 'No users found'\n }\n\n const pageContent = `\n
\n \n
\n
\n

User Management

\n

Manage user accounts and permissions

\n
\n
\n \n \n \n \n Add User\n \n \n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n

User Statistics

\n
\n
\n
Total Users
\n
\n
\n ${data.totalUsers}\n
\n
\n \n \n \n Increased by\n 5.2%\n
\n
\n
\n
\n
Active Users
\n
\n
\n ${data.users.filter(u => u.isActive).length}\n
\n
\n \n \n \n Increased by\n 3.1%\n
\n
\n
\n
\n
Administrators
\n
\n
\n ${data.users.filter(u => u.role === 'admin').length}\n
\n
\n \n \n \n Increased by\n 1.8%\n
\n
\n
\n
\n
Active This Week
\n
\n
\n ${data.users.filter(u => u.lastLoginAt && u.lastLoginAt > Date.now() - 7 * 24 * 60 * 60 * 1000).length}\n
\n
\n \n \n \n Decreased by\n 2.3%\n
\n
\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n
\n
\n \n
\n \n
\n {\n input.focus();\n input.setSelectionRange(len, len);\n }, 10);\n }\n \"\n >\n \n
\n \n \n \n
\n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n Clear Filters\n \n
\n
\n
\n
\n
\n
\n\n \n ${renderTable(tableData)}\n\n \n ${data.pagination ? renderPagination(data.pagination) : ''}\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'toggle-user-status-confirm',\n title: 'Toggle User Status',\n message: 'Are you sure you want to activate/deactivate this user?',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performToggleUserStatus()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Users',\n pageTitle: 'User Management',\n currentPath: '/admin/users',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n} ","import { Hono } from 'hono'\nimport { requireAuth, requireRole, logActivity, AuthManager } from '../middleware'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { renderProfilePage, renderAvatarImage, type UserProfile, type ProfilePageData } from '../templates/pages/admin-profile.template'\nimport { renderAlert } from '../templates/components/alert.template'\nimport { renderActivityLogsPage, type ActivityLogsPageData, type ActivityLog } from '../templates/pages/admin-activity-logs.template'\nimport { renderUserEditPage, type UserEditPageData, type UserEditData, type UserProfileData } from '../templates/pages/admin-user-edit.template'\nimport { renderUserNewPage, type UserNewPageData } from '../templates/pages/admin-user-new.template'\nimport { renderUsersListPage, type UsersListPageData, type User } from '../templates/pages/admin-users-list.template'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, renderCustomProfileSection, getCustomData, saveCustomData, extractCustomFieldsFromForm, sanitizeCustomData, validateCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst userRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware to all routes\nuserRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on user management routes\nuserRoutes.use('/users/*', requireRole(['admin']))\nuserRoutes.use('/users', requireRole(['admin']))\nuserRoutes.use('/invite-user', requireRole(['admin']))\nuserRoutes.use('/resend-invitation/*', requireRole(['admin']))\nuserRoutes.use('/cancel-invitation/*', requireRole(['admin']))\nuserRoutes.use('/activity-logs', requireRole(['admin']))\nuserRoutes.use('/activity-logs/*', requireRole(['admin']))\n\n// Redirect /admin to /admin/dashboard\nuserRoutes.get('/', (c) => {\n return c.redirect('/admin/dashboard')\n})\n\n// Timezone options for profile form\nconst TIMEZONES = [\n { value: 'UTC', label: 'UTC' },\n { value: 'America/New_York', label: 'Eastern Time' },\n { value: 'America/Chicago', label: 'Central Time' },\n { value: 'America/Denver', label: 'Mountain Time' },\n { value: 'America/Los_Angeles', label: 'Pacific Time' },\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Australia/Sydney', label: 'Sydney' }\n]\n\n// Language options for profile form\nconst LANGUAGES = [\n { value: 'en', label: 'English' },\n { value: 'es', label: 'Spanish' },\n { value: 'fr', label: 'French' },\n { value: 'de', label: 'German' },\n { value: 'it', label: 'Italian' },\n { value: 'pt', label: 'Portuguese' },\n { value: 'ja', label: 'Japanese' },\n { value: 'ko', label: 'Korean' },\n { value: 'zh', label: 'Chinese' }\n]\n\n// Role options for user form\nconst ROLES = [\n { value: 'admin', label: 'Administrator' },\n { value: 'editor', label: 'Editor' },\n { value: 'author', label: 'Author' },\n { value: 'viewer', label: 'Viewer' }\n]\n\n/**\n * GET /admin/profile - Show user profile page\n */\nuserRoutes.get('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n // Get user profile data\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n timezone, language, theme, email_notifications, two_factor_enabled,\n role, created_at, last_login_at\n FROM users \n WHERE id = ? AND is_active = 1\n `)\n \n const userProfile = await userStmt.bind(user!.userId).first() as any\n\n if (!userProfile) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Convert to UserProfile interface\n const profile: UserProfile = {\n id: userProfile.id,\n email: userProfile.email,\n username: userProfile.username || '',\n first_name: userProfile.first_name || '',\n last_name: userProfile.last_name || '',\n phone: userProfile.phone,\n bio: userProfile.bio,\n avatar_url: userProfile.avatar_url,\n timezone: userProfile.timezone || 'UTC',\n language: userProfile.language || 'en',\n theme: userProfile.theme || 'dark',\n email_notifications: Boolean(userProfile.email_notifications),\n two_factor_enabled: Boolean(userProfile.two_factor_enabled),\n role: userProfile.role,\n created_at: userProfile.created_at,\n last_login_at: userProfile.last_login_at\n }\n\n // Get custom profile data\n const customData = await getCustomData(db, user!.userId)\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n const pageData: ProfilePageData = {\n profile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n customProfileFieldsHtml,\n user: {\n name: `${profile.first_name} ${profile.last_name}`.trim() || profile.username || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n } catch (error) {\n console.error('Profile page error:', error)\n \n const pageData: ProfilePageData = {\n profile: {} as UserProfile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n error: 'Failed to load profile. Please try again.',\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n }\n})\n\n/**\n * PUT /admin/profile - Update user profile\n */\nuserRoutes.put('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const timezone = formData.get('timezone')?.toString() || 'UTC'\n const language = formData.get('language')?.toString() || 'en'\n const emailNotifications = formData.get('email_notifications') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please enter a valid email address.',\n dismissible: true \n }))\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users \n WHERE (username = ? OR email = ?) AND id != ? AND is_active = 1\n `)\n const existingUser = await checkStmt.bind(username, email, user!.userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Username or email is already taken by another user!.',\n dismissible: true \n }))\n }\n\n // Update user profile\n const updateStmt = db.prepare(`\n UPDATE users SET \n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, bio = ?, timezone = ?, language = ?,\n email_notifications = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, bio, timezone, language,\n emailNotifications ? 1 : 0, Date.now(),\n user!.userId\n ).run()\n\n // Save custom profile fields\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n await saveCustomData(db, user!.userId, sanitized)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.update', 'users', user!.userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'bio', 'timezone', 'language', 'email_notifications'] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success', \n message: 'Profile updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Profile update error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update profile. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/avatar - Upload user avatar\n */\nuserRoutes.post('/profile/avatar', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n const avatarFile = formData.get('avatar') as File | null\n\n if (!avatarFile || typeof avatarFile === 'string' || !avatarFile.name) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please select an image file.',\n dismissible: true\n }))\n }\n\n // Validate file type\n const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']\n if (!allowedTypes.includes(avatarFile.type)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please upload a valid image file (JPEG, PNG, GIF, or WebP).',\n dismissible: true \n }))\n }\n\n // Validate file size (5MB max)\n const maxSize = 5 * 1024 * 1024\n if (avatarFile.size > maxSize) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Image file must be smaller than 5MB.',\n dismissible: true \n }))\n }\n\n // For now, we'll simulate storing the avatar\n // In a real implementation, you'd upload to cloud storage (R2, S3, etc.)\n const avatarUrl = `/uploads/avatars/${user!.userId}-${Date.now()}.${avatarFile.type.split('/')[1]}`\n\n // Update user avatar URL in database\n const updateStmt = db.prepare(`\n UPDATE users SET avatar_url = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(avatarUrl, Date.now(), user!.userId).run()\n\n // Get updated user data to render the avatar\n const userStmt = db.prepare(`\n SELECT first_name, last_name FROM users WHERE id = ?\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.avatar_update', 'users', user!.userId,\n { avatar_url: avatarUrl },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return both the alert message and the updated avatar image using HTMX out-of-band swap\n const alertHtml = renderAlert({\n type: 'success',\n message: 'Profile picture updated successfully!',\n dismissible: true\n })\n\n // Add timestamp to avatar URL to bust cache\n const avatarUrlWithCache = `${avatarUrl}?t=${Date.now()}`\n const avatarImageHtml = renderAvatarImage(avatarUrlWithCache, userData.first_name, userData.last_name)\n\n // Use hx-swap-oob to update the avatar image container\n const avatarImageWithOob = avatarImageHtml.replace(\n 'id=\"avatar-image-container\"',\n 'id=\"avatar-image-container\" hx-swap-oob=\"true\"'\n )\n\n return c.html(alertHtml + avatarImageWithOob)\n\n } catch (error) {\n console.error('Avatar upload error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to upload profile picture. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/password - Change user password\n */\nuserRoutes.post('/profile/password', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n \n const currentPassword = formData.get('current_password')?.toString() || ''\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Validate input\n if (!currentPassword || !newPassword || !confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'All password fields are required.',\n dismissible: true \n }))\n }\n\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New passwords do not match.',\n dismissible: true \n }))\n }\n\n if (newPassword.length < 8) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New password must be at least 8 characters long.',\n dismissible: true \n }))\n }\n\n // Get current user data\n const userStmt = db.prepare(`\n SELECT password_hash FROM users WHERE id = ? AND is_active = 1\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n if (!userData) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'User not found.',\n dismissible: true \n }))\n }\n\n // Verify current password\n const validPassword = await AuthManager.verifyPassword(currentPassword, userData.password_hash)\n if (!validPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Current password is incorrect.',\n dismissible: true \n }))\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(newPassword)\n\n // Store old password in history\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user!.userId,\n userData.password_hash,\n Date.now()\n ).run()\n\n // Update user password\n const updateStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(newPasswordHash, Date.now(), user!.userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.password_change', 'users', user!.userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({ \n type: 'success', \n message: 'Password updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Password change error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update password. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * GET /admin/users - List all users\n * Returns HTML for browser requests and JSON for API requests\n * Note: Already protected by requireAuth() and requireRole(['admin', 'editor'])\n */\nuserRoutes.get('/users', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '20')\n const search = c.req.query('search') || ''\n const roleFilter = c.req.query('role') || ''\n const statusFilter = c.req.query('status') || 'active'\n const offset = (page - 1) * limit\n\n // Build search query\n let whereClause = ''\n let params: any[] = []\n\n // Handle status filter\n if (statusFilter === 'active') {\n whereClause = 'WHERE u.is_active = 1'\n } else if (statusFilter === 'inactive') {\n whereClause = 'WHERE u.is_active = 0'\n } else {\n // 'all' - no filter\n whereClause = 'WHERE 1=1'\n }\n\n if (search) {\n whereClause += ' AND (u.first_name LIKE ? OR u.last_name LIKE ? OR u.email LIKE ? OR u.username LIKE ?)'\n const searchParam = `%${search}%`\n params.push(searchParam, searchParam, searchParam, searchParam)\n }\n\n if (roleFilter) {\n whereClause += ' AND u.role = ?'\n params.push(roleFilter)\n }\n\n // Get users\n const usersStmt = db.prepare(`\n SELECT u.id, u.email, u.username, u.first_name, u.last_name,\n u.role, u.avatar_url, u.created_at, u.last_login_at, u.updated_at,\n u.email_verified, u.two_factor_enabled, u.is_active\n FROM users u\n ${whereClause}\n ORDER BY u.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: usersData } = await usersStmt.bind(...params, limit, offset).all()\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total FROM users u ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalUsers = countResult?.total || 0\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'users.list_view', 'users', undefined,\n { search, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Check if this is an API request (accept header contains 'application/json')\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n // Return JSON for API requests\n return c.json({\n users: usersData || [],\n pagination: {\n page,\n limit,\n total: totalUsers,\n pages: Math.ceil(totalUsers / limit)\n }\n })\n }\n\n // Return HTML for browser requests\n const users: User[] = (usersData || []).map((u: any) => ({\n id: u.id,\n email: u.email,\n username: u.username || '',\n firstName: u.first_name || '',\n lastName: u.last_name || '',\n role: u.role,\n avatar: u.avatar_url,\n isActive: Boolean(u.is_active),\n lastLoginAt: u.last_login_at,\n createdAt: u.created_at,\n updatedAt: u.updated_at,\n formattedLastLogin: u.last_login_at ? new Date(u.last_login_at).toLocaleDateString() : undefined,\n formattedCreatedAt: new Date(u.created_at).toLocaleDateString()\n }))\n\n const successMessage = c.req.query('success') || undefined\n\n const pageData: UsersListPageData = {\n users,\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalUsers,\n searchFilter: search,\n roleFilter,\n statusFilter,\n success: successMessage,\n pagination: {\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalItems: totalUsers,\n itemsPerPage: limit,\n startItem: offset + 1,\n endItem: Math.min(offset + limit, totalUsers),\n baseUrl: '/admin/users'\n },\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUsersListPage(pageData))\n\n } catch (error) {\n console.error('Users list error:', error)\n\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n return c.json({ error: 'Failed to load users' }, 500)\n }\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load users. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * GET /admin/users/new - Show new user creation page\n */\nuserRoutes.get('/users/new', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: UserNewPageData = {\n roles: ROLES,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserNewPage(pageData))\n } catch (error) {\n console.error('User new page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user creation page. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * POST /admin/users/new - Create new user\n */\nuserRoutes.post('/users/new', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const password = formData.get('password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email || !password) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, email, and password are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password\n if (password.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n\n if (password !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n\n // Check if username/email are already taken\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE username = ? OR email = ?\n `)\n const existingUser = await checkStmt.bind(username, email).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken.',\n dismissible: true\n }))\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Create user\n const userId = crypto.randomUUID()\n const createStmt = db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name, phone, bio,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createStmt.bind(\n userId, email, username, firstName, lastName, phone, bio,\n passwordHash, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.create', 'users', userId,\n { email, username, role },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Redirect to user list (use HX-Redirect for HTMX requests)\n c.header('HX-Redirect', '/admin/users?success=User created successfully')\n return c.body(null, 200)\n\n } catch (error) {\n console.error('User creation error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to create user!. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * GET /admin/users/:id - Get user by ID\n * Note: This endpoint returns users regardless of is_active status for admin purposes\n */\nuserRoutes.get('/users/:id', async (c) => {\n // Check if this is actually the edit route\n if (c.req.path.endsWith('/edit')) {\n return c.notFound()\n }\n\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (including inactive users for admin access)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userRecord = await userStmt.bind(userId).first() as any\n\n if (!userRecord) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.view', 'users', userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n user: {\n id: userRecord.id,\n email: userRecord.email,\n username: userRecord.username,\n first_name: userRecord.first_name,\n last_name: userRecord.last_name,\n phone: userRecord.phone,\n bio: userRecord.bio,\n avatar_url: userRecord.avatar_url,\n role: userRecord.role,\n is_active: userRecord.is_active,\n email_verified: userRecord.email_verified,\n two_factor_enabled: userRecord.two_factor_enabled,\n created_at: userRecord.created_at,\n last_login_at: userRecord.last_login_at\n }\n })\n\n } catch (error) {\n console.error('User fetch error:', error)\n return c.json({ error: 'Failed to fetch user' }, 500)\n }\n})\n\n/**\n * GET /admin/users/:id/edit - Show user edit page\n */\nuserRoutes.get('/users/:id/edit', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (removed bio - now in profile)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userToEdit = await userStmt.bind(userId).first() as any\n\n if (!userToEdit) {\n return c.html(renderAlert({\n type: 'error',\n message: 'User not found',\n dismissible: true\n }), 404)\n }\n\n // Get user profile data\n const profileStmt = db.prepare(`\n SELECT display_name, bio, company, job_title, website, location, date_of_birth, data\n FROM user_profiles\n WHERE user_id = ?\n `)\n const profileData = await profileStmt.bind(userId).first() as any\n\n // Convert profile to UserProfileData interface\n const profile: UserProfileData | undefined = profileData ? {\n displayName: profileData.display_name,\n bio: profileData.bio,\n company: profileData.company,\n jobTitle: profileData.job_title,\n website: profileData.website,\n location: profileData.location,\n dateOfBirth: profileData.date_of_birth\n } : undefined\n\n // Parse custom profile data\n let customData: Record = {}\n if (profileData?.data) {\n try { customData = JSON.parse(profileData.data) } catch {}\n }\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n // Convert to UserEditData interface\n const editData: UserEditData = {\n id: userToEdit.id,\n email: userToEdit.email,\n username: userToEdit.username || '',\n firstName: userToEdit.first_name || '',\n lastName: userToEdit.last_name || '',\n phone: userToEdit.phone,\n avatarUrl: userToEdit.avatar_url,\n role: userToEdit.role,\n isActive: Boolean(userToEdit.is_active),\n emailVerified: Boolean(userToEdit.email_verified),\n twoFactorEnabled: Boolean(userToEdit.two_factor_enabled),\n createdAt: userToEdit.created_at,\n lastLoginAt: userToEdit.last_login_at,\n profile\n }\n\n const pageData: UserEditPageData = {\n userToEdit: editData,\n roles: ROLES,\n customProfileFieldsHtml,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserEditPage(pageData))\n } catch (error) {\n console.error('User edit page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * PUT /admin/users/:id - Update user\n */\nuserRoutes.put('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Optional password change\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Extract profile fields\n const profileDisplayName = sanitizeInput(formData.get('profile_display_name')?.toString()) || null\n const profileBio = sanitizeInput(formData.get('profile_bio')?.toString()) || null\n const profileCompany = sanitizeInput(formData.get('profile_company')?.toString()) || null\n const profileJobTitle = sanitizeInput(formData.get('profile_job_title')?.toString()) || null\n const profileWebsite = formData.get('profile_website')?.toString()?.trim() || null\n const profileLocation = sanitizeInput(formData.get('profile_location')?.toString()) || null\n const profileDateOfBirthStr = formData.get('profile_date_of_birth')?.toString()?.trim() || null\n const profileDateOfBirth = profileDateOfBirthStr ? new Date(profileDateOfBirthStr).getTime() : null\n\n // Extract custom profile fields\n const profileConfig = getUserProfileConfig()\n let customDataJson: string | null = null\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n // Merge with existing custom data\n const existingCustom = await getCustomData(db, userId)\n const merged = { ...existingCustom, ...sanitized }\n customDataJson = JSON.stringify(merged)\n }\n\n // Validate required fields\n if (!username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password if provided\n if (newPassword) {\n if (newPassword.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n }\n\n // Validate website URL if provided\n if (profileWebsite) {\n try {\n new URL(profileWebsite)\n } catch {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid website URL.',\n dismissible: true\n }))\n }\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE (username = ? OR email = ?) AND id != ?\n `)\n const existingUser = await checkStmt.bind(username, email, userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken by another user.',\n dismissible: true\n }))\n }\n\n // Update user (removed bio - now in profile)\n const updateStmt = db.prepare(`\n UPDATE users SET\n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, role = ?, is_active = ?, email_verified = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), userId\n ).run()\n\n // Update password if provided\n if (newPassword) {\n const passwordHash = await AuthManager.hashPassword(newPassword)\n const updatePasswordStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?\n `)\n await updatePasswordStmt.bind(passwordHash, Date.now(), userId).run()\n }\n\n // Check if any profile field has data\n const hasProfileData = profileDisplayName || profileBio || profileCompany ||\n profileJobTitle || profileWebsite || profileLocation || profileDateOfBirth\n\n if (hasProfileData || customDataJson !== null) {\n const now = Date.now()\n\n // Check if profile exists\n const profileCheckStmt = db.prepare(`SELECT id FROM user_profiles WHERE user_id = ?`)\n const existingProfile = await profileCheckStmt.bind(userId).first() as any\n\n if (existingProfile) {\n // Update existing profile\n const updateProfileStmt = db.prepare(`\n UPDATE user_profiles SET\n display_name = ?, bio = ?, company = ?, job_title = ?,\n website = ?, location = ?, date_of_birth = ?, updated_at = ?\n ${customDataJson !== null ? ', data = ?' : ''}\n WHERE user_id = ?\n `)\n const updateBindings = [\n profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, now,\n ...(customDataJson !== null ? [customDataJson] : []),\n userId\n ]\n await updateProfileStmt.bind(...updateBindings).run()\n } else {\n // Create new profile\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const insertProfileStmt = db.prepare(`\n INSERT INTO user_profiles (id, user_id, display_name, bio, company, job_title, website, location, date_of_birth, data, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n await insertProfileStmt.bind(\n profileId, userId, profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, customDataJson || '{}', now, now\n ).run()\n }\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user.update', 'users', userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'role', 'is_active', 'email_verified', 'profile', ...(newPassword ? ['password'] : [])] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success',\n message: 'User updated successfully!',\n dismissible: true\n }))\n\n } catch (error) {\n console.error('User update error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to update user. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * POST /admin/users/:id/toggle - Toggle user active status\n */\nuserRoutes.post('/users/:id/toggle', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const body = await c.req.json().catch(() => ({ active: true }))\n const active = body.active === true\n\n // Prevent self-deactivation\n if (userId === user!.userId && !active) {\n return c.json({ error: 'You cannot deactivate your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToToggle = await userStmt.bind(userId).first() as any\n\n if (!userToToggle) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Toggle user status\n const toggleStmt = db.prepare(`\n UPDATE users SET is_active = ?, updated_at = ? WHERE id = ?\n `)\n await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, active ? 'user.activate' : 'user.deactivate', 'users', userId,\n { email: userToToggle.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: active ? 'User activated successfully' : 'User deactivated successfully'\n })\n\n } catch (error) {\n console.error('User toggle error:', error)\n return c.json({ error: 'Failed to toggle user status' }, 500)\n }\n})\n\n/**\n * DELETE /admin/users/:id - Delete user\n */\nuserRoutes.delete('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get request body to check for hard delete option\n const body = await c.req.json().catch(() => ({ hardDelete: false }))\n const hardDelete = body.hardDelete === true\n\n // Prevent self-deletion\n if (userId === user!.userId) {\n return c.json({ error: 'You cannot delete your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToDelete = await userStmt.bind(userId).first() as any\n\n if (!userToDelete) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n if (hardDelete) {\n // Hard delete - permanently remove from database\n const deleteStmt = db.prepare(`\n DELETE FROM users WHERE id = ?\n `)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.hard_delete', 'users', userId,\n { email: userToDelete.email, permanent: true },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User permanently deleted'\n })\n } else {\n // Soft delete - deactivate by setting is_active = 0\n const deleteStmt = db.prepare(`\n UPDATE users SET is_active = 0, updated_at = ? WHERE id = ?\n `)\n await deleteStmt.bind(Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.soft_delete', 'users', userId,\n { email: userToDelete.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User deactivated successfully'\n })\n }\n\n } catch (error) {\n console.error('User deletion error:', error)\n return c.json({ error: 'Failed to delete user' }, 500)\n }\n})\n\n/**\n * POST /admin/invite-user - Invite a new user\n */\nuserRoutes.post('/invite-user', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const role = formData.get('role')?.toString()?.trim() || 'viewer'\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n\n // Validate input\n if (!email || !firstName || !lastName) {\n return c.json({ error: 'Email, first name, and last name are required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n // Check if user already exists\n const existingUserStmt = db.prepare(`\n SELECT id FROM users WHERE email = ?\n `)\n const existingUser = await existingUserStmt.bind(email).first()\n\n if (existingUser) {\n return c.json({ error: 'A user with this email already exists' }, 400)\n }\n\n // Generate invitation token\n const invitationToken = crypto.randomUUID()\n // const invitationExpires = Date.now() + (7 * 24 * 60 * 60 * 1000) // 7 days\n\n // Create user record with invitation\n const userId = crypto.randomUUID()\n const createUserStmt = db.prepare(`\n INSERT INTO users (\n id, email, first_name, last_name, role, \n invitation_token, invited_by, invited_at,\n is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createUserStmt.bind(\n userId, email, firstName, lastName, role,\n invitationToken, user!.userId, Date.now(),\n 0, 0, Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invite_sent', 'users', userId,\n { email, role, invited_user_id: userId },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // In a real implementation, you would send an email here\n // For now, we'll return the invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${invitationToken}`\n\n return c.json({\n success: true,\n message: 'User invitation sent successfully',\n user: {\n id: userId,\n email,\n first_name: firstName,\n last_name: lastName,\n role\n },\n invitation_link: invitationLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('User invitation error:', error)\n return c.json({ error: 'Failed to send user invitation' }, 500)\n }\n})\n\n/**\n * POST /admin/resend-invitation/:id - Resend invitation\n */\nuserRoutes.post('/resend-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invitation_token\n FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Generate new invitation token\n const newInvitationToken = crypto.randomUUID()\n\n // Update invitation token and date\n const updateStmt = db.prepare(`\n UPDATE users SET \n invitation_token = ?, \n invited_at = ?, \n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newInvitationToken,\n Date.now(),\n Date.now(),\n userId\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_resent', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Generate new invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${newInvitationToken}`\n\n return c.json({\n success: true,\n message: 'Invitation resent successfully',\n invitation_link: invitationLink\n })\n\n } catch (error) {\n console.error('Resend invitation error:', error)\n return c.json({ error: 'Failed to resend invitation' }, 500)\n }\n})\n\n/**\n * DELETE /admin/cancel-invitation/:id - Cancel invitation\n */\nuserRoutes.delete('/cancel-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Delete the user record (since they haven't activated yet)\n const deleteStmt = db.prepare(`DELETE FROM users WHERE id = ?`)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_cancelled', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'Invitation cancelled successfully'\n })\n\n } catch (error) {\n console.error('Cancel invitation error:', error)\n return c.json({ error: 'Failed to cancel invitation' }, 500)\n }\n})\n\n/**\n * GET /admin/activity-logs - View activity logs\n */\nuserRoutes.get('/activity-logs', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination and filter parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '50')\n const offset = (page - 1) * limit\n\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get activity logs with user information\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: logs } = await logsStmt.bind(...params, limit, offset).all()\n\n // Get total count for pagination\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total \n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalLogs = countResult?.total || 0\n\n // Parse details JSON for each log\n const formattedLogs: ActivityLog[] = (logs || []).map((log: any) => ({\n ...log,\n details: log.details ? JSON.parse(log.details) : null\n }))\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'activity.logs_viewed', undefined, undefined,\n { filters, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n const pageData: ActivityLogsPageData = {\n logs: formattedLogs,\n pagination: {\n page,\n limit,\n total: totalLogs,\n pages: Math.ceil(totalLogs / limit)\n },\n filters,\n user: {\n name: user!.email.split('@')[0] || user!.email, // Use email username as fallback\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n\n } catch (error) {\n console.error('Activity logs error:', error)\n \n const pageData: ActivityLogsPageData = {\n logs: [],\n pagination: { page: 1, limit: 50, total: 0, pages: 0 },\n filters: {},\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n }\n})\n\n/**\n * GET /admin/activity-logs/export - Export activity logs to CSV\n */\nuserRoutes.get('/activity-logs/export', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get filter parameters (same as list view)\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get all matching activity logs (limit to 10,000 for performance)\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT 10000\n `)\n\n const { results: logs } = await logsStmt.bind(...params).all()\n\n // Generate CSV content\n const csvHeaders = ['Timestamp', 'User', 'Email', 'Action', 'Resource Type', 'Resource ID', 'IP Address', 'Details']\n const csvRows = [csvHeaders.join(',')]\n\n for (const log of (logs || [])) {\n const row = [\n `\"${new Date((log as any).created_at).toISOString()}\"`,\n `\"${(log as any).user_name || 'Unknown'}\"`,\n `\"${(log as any).user_email || 'N/A'}\"`,\n `\"${(log as any).action}\"`,\n `\"${(log as any).resource_type || 'N/A'}\"`,\n `\"${(log as any).resource_id || 'N/A'}\"`,\n `\"${(log as any).ip_address || 'N/A'}\"`,\n `\"${(log as any).details ? JSON.stringify(JSON.parse((log as any).details)) : 'N/A'}\"`\n ]\n csvRows.push(row.join(','))\n }\n\n const csvContent = csvRows.join('\\n')\n\n // Log the export activity\n await logActivity(\n db, user!.userId, 'activity.logs_exported', undefined, undefined,\n { filters, count: logs?.length || 0 },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return CSV file\n const filename = `activity-logs-${new Date().toISOString().split('T')[0]}.csv`\n \n return new Response(csvContent, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"${filename}\"`\n }\n })\n\n } catch (error) {\n console.error('Activity logs export error:', error)\n return c.json({ error: 'Failed to export activity logs' }, 500)\n }\n})\n\nexport { userRoutes }","export interface MediaFile {\n id: string;\n filename: string;\n original_name: string;\n mime_type: string;\n size: number;\n public_url: string;\n thumbnail_url?: string;\n alt?: string;\n caption?: string;\n tags: string[];\n uploaded_at: string;\n fileSize: string;\n uploadedAt: string;\n isImage: boolean;\n isVideo: boolean;\n isDocument: boolean;\n}\n\nexport interface MediaGridData {\n files: MediaFile[];\n viewMode?: \"grid\" | \"list\";\n selectable?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function renderMediaGrid(data: MediaGridData): string {\n if (data.files.length === 0) {\n return `\n
\n \n \n \n

No media files

\n

${\n data.emptyMessage || \"Get started by uploading your first file.\"\n }

\n
\n `;\n }\n\n const gridClass = data.viewMode === \"list\" ? \"space-y-4\" : \"media-grid\";\n\n return `\n
\n ${data.files\n .map((file) =>\n renderMediaFileCard(file, data.viewMode, data.selectable)\n )\n .join(\"\")}\n
\n `;\n}\n\nexport function renderMediaFileCard(\n file: MediaFile,\n viewMode: \"grid\" | \"list\" = \"grid\",\n selectable: boolean = false\n): string {\n if (viewMode === \"list\") {\n return `\n
\n
\n ${\n selectable\n ? `\n
\n
\n \n \n \n \n \n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n
\n\n
\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n \n \n \n \n \n
\n
\n
\n ${file.uploadedAt}\n ${\n file.tags.length > 0\n ? `\n \n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n
\n
\n `;\n }\n\n // Grid view\n return `\n
\n ${\n selectable\n ? `\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n ${\n file.uploadedAt\n }\n
\n ${\n file.tags.length > 0\n ? `\n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n `;\n}\n\nfunction getFileIcon(mimeType: string): string {\n if (mimeType.startsWith(\"image/\")) {\n return `\n \n \n \n `;\n } else if (mimeType.startsWith(\"video/\")) {\n return `\n \n \n \n `;\n } else if (mimeType === \"application/pdf\") {\n return `\n \n \n \n `;\n } else {\n return `\n \n \n \n `;\n }\n}\n","import {\n getConfirmationDialogScript,\n renderConfirmationDialog,\n} from \"../components/confirmation-dialog.template\";\nimport { MediaFile, renderMediaGrid } from \"../components/media-grid.template\";\nimport {\n AdminLayoutCatalystData,\n renderAdminLayoutCatalyst,\n} from \"../layouts/admin-layout-catalyst.template\";\n\nexport interface FolderStats {\n folder: string;\n count: number;\n totalSize: number;\n}\n\nexport interface TypeStats {\n type: string;\n count: number;\n}\n\nexport interface MediaLibraryPageData {\n files: MediaFile[];\n folders: FolderStats[];\n types: TypeStats[];\n currentFolder: string;\n currentType: string;\n currentView: \"grid\" | \"list\";\n currentPage: number;\n totalFiles: number;\n hasNextPage: boolean;\n user?: {\n name: string;\n email: string;\n role: string;\n };\n version?: string;\n}\n\nexport function renderMediaLibraryPage(data: MediaLibraryPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Media Library

\n

Manage your media files and assets

\n
\n
\n \n \n \n \n Upload Media\n \n
\n
\n \n
\n \n
\n
\n \n
\n \n Upload Files\n \n
\n\n \n
\n

Folders

\n \n
\n\n \n
\n

File Types

\n \n
\n\n \n
\n

Quick Actions

\n
\n \n Create Folder\n \n \n Cleanup Unused\n \n
\n
\n
\n
\n \n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n ${\n data.files.length\n } files\n \n Select All\n \n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Move to Folder\n \n
\n
\n \n \n \n \n Delete Selected Files\n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n ${renderMediaGrid({\n files: data.files,\n viewMode: data.currentView,\n selectable: true,\n emptyMessage:\n \"No media files found. Upload your first file to get started.\",\n })}\n
\n \n \n ${\n data.hasNextPage\n ? `\n
\n
\n ${\n data.currentPage > 1\n ? `\n \n Previous\n \n `\n : \"\"\n }\n Page ${\n data.currentPage\n }\n \n Next\n \n
\n
\n `\n : \"\"\n }\n
\n
\n \n \n \n
\n
\n
\n

Upload Files

\n \n
\n \n \n { window.location.href = '/admin/media?t=' + Date.now(); }, 1500); }\"\n class=\"space-y-4\"\n >\n \n \n \n \n \n
\n

Drop files here or click to upload

\n

PNG, JPG, GIF, PDF up to 10MB

\n
\n
\n \n \n \n \n
\n \n \n
\n\n \n
\n

Selected Files:

\n
\n
\n\n \n
\n \n Cancel\n \n \n Upload Files\n \n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n
\n
\n\n \n
\n
\n
\n

Move to Folder

\n \n
\n\n

\n Select a folder to move 0 selected file(s) to:\n

\n\n
\n ${\n data.folders.length > 0\n ? data.folders\n .map(\n (folder) => `\n \n
\n ${folder.folder}\n ${folder.count} files\n
\n \n `\n )\n .join(\"\")\n : '

No folders available

'\n }\n
\n\n
\n \n Cancel\n \n
\n
\n
\n\n \n
\n
\n
\n

Create New Folder

\n \n
\n\n
\n
\n \n \n

\n Use lowercase letters, numbers, hyphens, and underscores only\n

\n
\n\n
\n \n Cancel\n \n \n Create Folder\n \n
\n
\n
\n
\n\n \n \n \n\n \n ${renderConfirmationDialog({\n id: \"media-bulk-delete-confirm\",\n title: \"Delete Selected Files\",\n message: `Are you sure you want to delete ${\n data.files.length > 0 ? \"the selected files\" : \"these files\"\n }? This action cannot be undone and the files will be permanently removed.`,\n confirmText: \"Delete Files\",\n cancelText: \"Cancel\",\n confirmClass: \"bg-red-500 hover:bg-red-400\",\n iconColor: \"red\",\n onConfirm: \"performBulkDelete()\",\n })}\n\n \n ${getConfirmationDialogScript()}\n `;\n\n function buildPageUrl(page: number, folder: string, type: string): string {\n const params = new URLSearchParams();\n params.set(\"page\", page.toString());\n if (folder !== \"all\") params.set(\"folder\", folder);\n if (type !== \"all\") params.set(\"type\", type);\n return `/admin/media?${params.toString()}`;\n }\n\n const layoutData: AdminLayoutCatalystData = {\n title: \"Media Library\",\n pageTitle: \"Media Library\",\n currentPath: \"/admin/media\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayoutCatalyst(layoutData);\n}\n","import { MediaFile } from './media-grid.template'\n\nexport interface MediaFileDetailsData {\n file: MediaFile & {\n width?: number\n height?: number\n folder: string\n uploadedAt: string\n }\n}\n\nexport function renderMediaFileDetails(data: MediaFileDetailsData): string {\n const { file } = data\n \n return `\n
\n

File Details

\n \n
\n \n
\n \n
\n
\n ${file.isImage ? `\n \"${file.alt\n ` : file.isVideo ? `\n \n ` : `\n
\n \n \n \n
\n `}\n
\n\n
\n \n Copy URL\n \n \n Open Original\n \n
\n
\n \n \n
\n
\n \n

${file.original_name}

\n
\n\n
\n
\n \n

${file.fileSize}

\n
\n
\n \n

${file.mime_type}

\n
\n
\n\n ${file.width && file.height ? `\n
\n
\n \n

${file.width}px

\n
\n
\n \n

${file.height}px

\n
\n
\n ` : ''}\n\n
\n \n

${file.folder}

\n
\n\n
\n \n

${file.uploadedAt}

\n
\n\n \n
\n
\n \n \n
\n\n
\n \n ${file.caption || ''}\n
\n\n
\n \n \n
\n\n
\n \n Save Changes\n \n \n Delete File\n \n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\nimport { html, raw } from 'hono/html'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth, requireRole } from '../middleware'\nimport { renderMediaLibraryPage, MediaLibraryPageData, FolderStats, TypeStats } from '../templates/pages/admin-media-library.template'\nimport { renderMediaFileDetails, MediaFileDetailsData } from '../templates/components/media-file-details.template'\nimport { MediaFile, renderMediaFileCard } from '../templates/components/media-grid.template'\nimport type { Bindings, Variables } from '../app'\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nconst adminMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminMediaRoutes.use('*', requireAuth())\n\n// Media library main page\nadminMediaRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { searchParams } = new URL(c.req.url)\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const view = searchParams.get('view') || 'grid'\n const page = parseInt(searchParams.get('page') || '1')\n const _cacheBust = searchParams.get('t') // Cache-busting parameter\n const limit = 24\n const offset = (page - 1) * limit\n\n const db = c.env.DB\n\n // TODO: Cache implementation removed during migration - will be added back when cache plugin is migrated\n\n // Build query for media files\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = ['deleted_at IS NULL']\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT ${limit} OFFSET ${offset}`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n // Get folder statistics\n const foldersStmt = db.prepare(`\n SELECT folder, COUNT(*) as count, SUM(size) as totalSize\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY folder\n ORDER BY folder\n `)\n const { results: folders } = await foldersStmt.all()\n \n // Get type statistics\n const typesStmt = db.prepare(`\n SELECT\n CASE\n WHEN mime_type LIKE 'image/%' THEN 'images'\n WHEN mime_type LIKE 'video/%' THEN 'videos'\n WHEN mime_type IN ('application/pdf', 'text/plain') THEN 'documents'\n ELSE 'other'\n END as type,\n COUNT(*) as count\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY type\n `)\n const { results: types } = await typesStmt.all()\n \n // Process media files with local serving URLs\n const mediaFiles: MediaFile[] = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n caption: row.caption,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const pageData: MediaLibraryPageData = {\n files: mediaFiles,\n folders: folders.map((f: any) => ({\n folder: f.folder,\n count: f.count,\n totalSize: f.totalSize\n })) as FolderStats[],\n types: types.map((t: any) => ({\n type: t.type,\n count: t.count\n })) as TypeStats[],\n currentFolder: folder,\n currentType: type,\n currentView: view as 'grid' | 'list',\n currentPage: page,\n totalFiles: results.length,\n hasNextPage: results.length === limit,\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: c.get('appVersion')\n }\n\n // TODO: Cache implementation removed during migration\n\n return c.html(renderMediaLibraryPage(pageData))\n } catch (error) {\n console.error('Error loading media library:', error)\n return c.html(html`

Error loading media library

`)\n }\n})\n\n// Media selector endpoint (HTMX endpoint for content form media selection)\nadminMediaRoutes.get('/selector', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const db = c.env.DB\n\n // Build search query\n let query = 'SELECT * FROM media WHERE deleted_at IS NULL'\n const params: any[] = []\n\n if (search.trim()) {\n query += ' AND (filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n query += ' ORDER BY uploaded_at DESC LIMIT 24'\n\n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n // Render media selector grid\n return c.html(html`\n
\n \n
\n\n
\n ${raw(mediaFiles.map(file => `\n \n
\n ${file.isImage ? `\n \n ` : file.isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n\n
\n \n Select\n \n
\n
\n\n
\n

\n ${file.original_name}\n

\n

\n ${file.fileSize}\n

\n
\n
\n `).join(''))}\n \n\n ${mediaFiles.length === 0 ? html`\n
\n \n \n \n

No media files found

\n
\n ` : ''}\n `)\n } catch (error) {\n console.error('Error loading media selector:', error)\n return c.html(html`
Error loading media files
`)\n }\n})\n\n// Search media files (HTMX endpoint)\nadminMediaRoutes.get('/search', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const db = c.env.DB\n \n // Build search query\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = []\n \n if (search.trim()) {\n conditions.push('(filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)')\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT 24`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n const mediaFiles = results.map((row: any) => ({\n ...row,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n fileSize: formatFileSize(row.size),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const gridHTML = mediaFiles.map(file => generateMediaItemHTML(file)).join('')\n \n return c.html(raw(gridHTML))\n } catch (error) {\n console.error('Error searching media:', error)\n return c.html('
Error searching files
')\n }\n})\n\n// Get file details modal (HTMX endpoint)\nadminMediaRoutes.get('/:id/details', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n \n const stmt = db.prepare('SELECT * FROM media WHERE id = ?')\n const result = await stmt.bind(id).first() as any\n \n if (!result) {\n return c.html('
File not found
')\n }\n \n const file: MediaFile & { width?: number; height?: number; folder: string; uploadedAt: string } = {\n id: result.id,\n filename: result.filename,\n original_name: result.original_name,\n mime_type: result.mime_type,\n size: result.size,\n public_url: `/files/${result.r2_key}`,\n thumbnail_url: result.mime_type.startsWith('image/') ? `/files/${result.r2_key}` : undefined,\n alt: result.alt,\n caption: result.caption,\n tags: result.tags ? JSON.parse(result.tags) : [],\n uploaded_at: result.uploaded_at,\n fileSize: formatFileSize(result.size),\n uploadedAt: new Date(result.uploaded_at).toLocaleString(),\n isImage: result.mime_type.startsWith('image/'),\n isVideo: result.mime_type.startsWith('video/'),\n isDocument: !result.mime_type.startsWith('image/') && !result.mime_type.startsWith('video/'),\n width: result.width,\n height: result.height,\n folder: result.folder\n }\n \n const detailsData: MediaFileDetailsData = { file }\n \n return c.html(renderMediaFileDetails(detailsData))\n } catch (error) {\n console.error('Error fetching file details:', error)\n return c.html('
Error loading file details
')\n }\n})\n\n// Upload files endpoint (HTMX compatible)\nadminMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const fileEntries = formData.getAll('files') as unknown[]\n const files: File[] = []\n\n for (const entry of fileEntries) {\n if (entry instanceof File) {\n files.push(entry)\n }\n }\n \n if (!files || files.length === 0) {\n return c.html(html`\n
\n No files provided\n
\n `)\n }\n\n const uploadResults = []\n const errors = []\n\n // Check if MEDIA_BUCKET is available\n console.log('[MEDIA UPLOAD] c.env keys:', Object.keys(c.env))\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET defined?', !!c.env.MEDIA_BUCKET)\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET type:', typeof c.env.MEDIA_BUCKET)\n\n if (!c.env.MEDIA_BUCKET) {\n console.error('[MEDIA UPLOAD] MEDIA_BUCKET is not available! Available env keys:', Object.keys(c.env))\n return c.html(html`\n
\n Media storage (R2) is not configured. Please check your wrangler.toml configuration.\n
Debug: Available bindings: ${Object.keys(c.env).join(', ')}\n
\n `)\n }\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: validation.error.issues[0]?.message || 'Validation failed'\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = crypto.randomUUID()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user!.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Extract image dimensions if it's an image\n let width: number | undefined\n let height: number | undefined\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate URLs - use public serving route\n const publicUrl = `/files/${r2Key}`\n const thumbnailUrl = file.type.startsWith('image/') ? publicUrl : undefined\n\n // Save to database\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n fileId,\n filename,\n file.name,\n file.type,\n file.size,\n width,\n height,\n folder,\n r2Key,\n publicUrl,\n thumbnailUrl,\n user!.userId,\n Math.floor(Date.now() / 1000)\n ).run()\n\n uploadResults.push({\n id: fileId,\n filename: filename,\n originalName: file.name,\n mimeType: file.type,\n size: file.size,\n publicUrl: publicUrl\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed: ' + (error instanceof Error ? error.message : 'Unknown error')\n })\n }\n }\n\n // TODO: Cache invalidation removed during migration\n\n // Fetch updated media list to include in response\n let mediaGridHTML = ''\n if (uploadResults.length > 0) {\n try {\n const folderEntry = formData.get('folder')\n const folder = typeof folderEntry === 'string' ? folderEntry : 'uploads'\n const query = 'SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT 24'\n const stmt = c.env.DB.prepare(query)\n const { results } = await stmt.all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n mediaGridHTML = mediaFiles.map(file => renderMediaFileCard(file, 'grid', true)).join('')\n } catch (error) {\n console.error('Error fetching updated media list:', error)\n }\n }\n\n // Return HTMX response with results\n return c.html(html`\n ${uploadResults.length > 0 ? html`\n
\n Successfully uploaded ${uploadResults.length} file${uploadResults.length > 1 ? 's' : ''}\n
\n ` : ''}\n\n ${errors.length > 0 ? html`\n
\n

Upload errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n ${uploadResults.length > 0 ? html`\n \n ` : ''}\n `)\n } catch (error) {\n console.error('Upload error:', error)\n return c.html(html`\n
\n Upload failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Serve files from R2 storage\nadminMediaRoutes.get('/file/*', async (c) => {\n try {\n const r2Key = c.req.path.replace('/admin/media/file/', '')\n \n if (!r2Key) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(r2Key)\n \n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n \n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n})\n\n// Update media file metadata (HTMX compatible)\nadminMediaRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n const formData = await c.req.formData()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Extract form data\n const alt = formData.get('alt') as string || null\n const caption = formData.get('caption') as string || null\n const tagsString = formData.get('tags') as string || ''\n const tags = tagsString ? tagsString.split(',').map(tag => tag.trim()).filter(tag => tag) : []\n\n // Update database\n const updateStmt = c.env.DB.prepare(`\n UPDATE media \n SET alt = ?, caption = ?, tags = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n alt,\n caption,\n JSON.stringify(tags),\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n // TODO: Cache invalidation removed during migration\n\n return c.html(html`\n
\n File updated successfully\n
\n \n `)\n } catch (error) {\n console.error('Update error:', error)\n return c.html(html`\n
\n Update failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Cleanup unused media files (HTMX compatible)\nadminMediaRoutes.delete('/cleanup', requireRole('admin'), async (c) => {\n try {\n const db = c.env.DB\n\n // Find all media files\n const allMediaStmt = db.prepare('SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL')\n const { results: allMedia } = await allMediaStmt.all<{ id: string; r2_key: string; filename: string }>()\n\n // Find media files referenced in content\n // Content can reference media in various JSON fields like data, hero_image, etc.\n const contentStmt = db.prepare('SELECT data FROM content')\n const { results: contentRecords } = await contentStmt.all<{ data: unknown }>()\n\n // Extract all media URLs from content\n const referencedUrls = new Set()\n for (const record of contentRecords || []) {\n if (record.data) {\n const dataStr = typeof record.data === 'string' ? record.data : JSON.stringify(record.data)\n // Find all /files/ URLs in the content\n const urlMatches = dataStr.matchAll(/\\/files\\/([^\\s\"',]+)/g)\n for (const match of urlMatches) {\n referencedUrls.add(match[1]!)\n }\n }\n }\n\n // Find unreferenced media files\n const mediaRows = allMedia || []\n const unusedFiles = mediaRows.filter((file) => !referencedUrls.has(file.r2_key))\n\n if (unusedFiles.length === 0) {\n return c.html(html`\n
\n No unused media files found. All files are referenced in content.\n
\n \n `)\n }\n\n // Delete unused files from R2 and database\n let deletedCount = 0\n const errors = []\n\n for (const file of unusedFiles) {\n try {\n // Delete from R2\n await c.env.MEDIA_BUCKET.delete(file.r2_key)\n\n // Soft delete in database\n const deleteStmt = db.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), file.id).run()\n\n deletedCount++\n } catch (error) {\n console.error(`Failed to delete ${file.filename}:`, error)\n errors.push({\n filename: file.filename,\n error: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Return success response\n return c.html(html`\n
\n Successfully cleaned up ${deletedCount} unused media file${deletedCount !== 1 ? 's' : ''}.\n ${errors.length > 0 ? html`\n
Failed to delete ${errors.length} file${errors.length !== 1 ? 's' : ''}.\n ` : ''}\n
\n\n ${errors.length > 0 ? html`\n
\n

Cleanup errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n \n `)\n } catch (error) {\n console.error('Cleanup error:', error)\n return c.html(html`\n
\n Cleanup failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Delete media file (HTMX compatible)\nadminMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // TODO: Cache invalidation removed during migration\n\n // Return HTMX response that redirects to media library\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Delete error:', error)\n return c.html(html`\n
\n Delete failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length - 8) {\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n const segmentLength = (uint8Array[i + 2]! << 8) | uint8Array[i + 3]!\n i += 2 + segmentLength\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\n// Helper function to generate media item HTML\nfunction generateMediaItemHTML(file: any): string {\n const isImage = file.isImage\n const isVideo = file.isVideo\n \n return `\n
\n
\n ${isImage ? `\n \"${file.alt\n ` : isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n \n
\n
\n \n \n
\n
\n
\n \n
\n

\n ${file.original_name}\n

\n
\n ${file.fileSize}\n ${file.uploadedAt}\n
\n ${file.tags.length > 0 ? `\n
\n ${file.tags.slice(0, 2).map((tag: string) => `\n \n ${tag}\n \n `).join('')}\n ${file.tags.length > 2 ? `+${file.tags.length - 2}` : ''}\n
\n ` : ''}\n
\n
\n `\n}\n\n// Helper function to format file size\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n\nexport { adminMediaRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface Plugin {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error' | 'uninstalled'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n}\n\nexport interface PluginsListPageData {\n plugins: Plugin[]\n stats?: {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderPluginsListPage(data: PluginsListPageData): string {\n const categories = [\n { value: 'content', label: 'Content Management' },\n { value: 'media', label: 'Media' },\n { value: 'editor', label: 'Editors' },\n { value: 'seo', label: 'SEO & Analytics' },\n { value: 'security', label: 'Security' },\n { value: 'utilities', label: 'Utilities' },\n { value: 'system', label: 'System' },\n { value: 'development', label: 'Development' },\n { value: 'demo', label: 'Demo' }\n ];\n\n const statuses = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'uninstalled', label: 'Available to Install' },\n { value: 'error', label: 'Error' }\n ];\n\n // Calculate counts\n const categoryCounts: Record = {};\n categories.forEach(cat => {\n categoryCounts[cat.value] = data.plugins.filter(p => p.category === cat.value).length;\n });\n\n // Sort categories by count (descending)\n categories.sort((a, b) => (categoryCounts[b.value] || 0) - (categoryCounts[a.value] || 0));\n\n const statusCounts: Record = {};\n statuses.forEach(status => {\n statusCounts[status.value] = data.plugins.filter(p => p.status === status.value).length;\n });\n\n // Sort statuses by count (descending)\n statuses.sort((a, b) => (statusCounts[b.value] || 0) - (statusCounts[a.value] || 0));\n\n const pageContent = `\n
\n \n
\n
\n

Plugins

\n

Manage and extend functionality with plugins

\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n
\n

\n Experimental Feature\n

\n
\n

\n Plugin management is currently under active development. While functional, some features may change or have limitations.\n Please report any issues you encounter on our Discord community.\n

\n
\n
\n
\n
\n\n
\n \n \n\n \n
\n \n
\n
\n
Total
\n
${data.stats?.total || 0}
\n
\n
\n
Active
\n
${data.stats?.active || 0}
\n
\n
\n
Available
\n
${data.stats?.uninstalled || 0}
\n
\n
\n
Errors
\n
${data.stats?.errors || 0}
\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n \n
\n\n
\n \n\n \n \n \n \n \n
\n
\n\n \n
\n ${data.plugins.map(plugin => renderPluginCard(plugin)).join('')}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'uninstall-plugin-confirm',\n title: 'Uninstall Plugin',\n message: 'Are you sure you want to uninstall this plugin? This action cannot be undone.',\n confirmText: 'Uninstall',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performUninstallPlugin()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Plugins',\n pageTitle: 'Plugin Management',\n currentPath: '/admin/plugins',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderPluginCard(plugin: Plugin): string {\n const statusColors = {\n active: 'bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-400 ring-emerald-600/20',\n inactive: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-zinc-600/20',\n error: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-red-600/20',\n uninstalled: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-600 dark:text-zinc-500 ring-zinc-600/20'\n }\n\n const statusIcons = {\n active: '
',\n inactive: '
',\n error: '
',\n uninstalled: '
'\n }\n\n // Core system plugins that cannot be deactivated\n const criticalCorePlugins = ['core-auth', 'core-media']\n const canToggle = !criticalCorePlugins.includes(plugin.id)\n\n let actionButton = ''\n if (plugin.status === 'uninstalled') {\n actionButton = ``\n } else {\n const isActive = plugin.status === 'active';\n const action = isActive ? 'deactivate' : 'activate';\n // Use bg-emerald-600 for active, bg-zinc-200 (light) / bg-zinc-700 (dark) for inactive\n const bgClass = isActive ? 'bg-emerald-600' : 'bg-zinc-200 dark:bg-zinc-700';\n const translateClass = isActive ? 'translate-x-5' : 'translate-x-0';\n \n if (canToggle) {\n actionButton = `\n \n `\n } else {\n // Critical core plugins cannot be toggled\n actionButton = `\n
\n \n
\n `\n }\n }\n\n return `\n
\n
\n
\n
\n ${plugin.icon || getDefaultPluginIcon(plugin.category)}\n
\n
\n
\n

${plugin.displayName}

\n \n ${statusIcons[plugin.status]}${plugin.status.charAt(0).toUpperCase() + plugin.status.slice(1)}\n \n
\n

v${plugin.version} • ${plugin.author}

\n
\n
\n \n
\n ${!plugin.isCore && plugin.status !== 'uninstalled' ? `\n \n ` : ''}\n
\n
\n\n

${plugin.description}

\n\n
\n \n ${plugin.category}\n \n ${plugin.isCore ? 'Core' : ''}\n \n ${plugin.dependencies && plugin.dependencies.map(dep => `\n \n ${dep}\n \n `).join('') || ''}\n
\n\n
\n
\n ${actionButton}\n
\n
\n
\n `\n}\n\nfunction getDefaultPluginIcon(category: string): string {\n const iconColor = 'text-zinc-600 dark:text-zinc-400'\n\n const icons: Record = {\n 'content': `\n \n \n \n `,\n 'media': `\n \n \n \n `,\n 'seo': `\n \n \n \n `,\n 'analytics': `\n \n \n \n `,\n 'ecommerce': `\n \n \n \n `,\n 'email': `\n \n \n \n `,\n 'workflow': `\n \n \n \n `,\n 'security': `\n \n \n \n `,\n 'social': `\n \n \n \n `,\n 'utility': `\n \n \n \n \n `,\n }\n\n const iconKey = category.toLowerCase() as keyof typeof icons\n return icons[iconKey] || icons['utility'] || ''\n}\n\n// Mock data generator\nexport function generateMockPlugins(): Plugin[] {\n return [\n {\n id: '1',\n name: 'seo-optimizer',\n displayName: 'SEO Optimizer',\n description: 'Advanced SEO optimization tools including meta tag management, sitemap generation, and analytics integration. Boost your search engine rankings with automated optimizations.',\n version: '2.1.4',\n author: 'SonicJS Team',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 15420,\n rating: 4.8,\n lastUpdated: '2 days ago',\n dependencies: ['analytics-plugin'],\n permissions: ['read:content', 'write:meta'],\n isCore: true\n },\n {\n id: '2',\n name: 'image-optimizer',\n displayName: 'Image Optimizer',\n description: 'Automatically compress and optimize images on upload. Supports WebP conversion, lazy loading, and responsive image generation for better performance.',\n version: '1.5.2',\n author: 'MediaPro',\n status: 'active',\n category: 'media',\n icon: ``,\n downloadCount: 8930,\n rating: 4.6,\n lastUpdated: '1 week ago',\n dependencies: [],\n permissions: ['write:media', 'read:settings']\n },\n {\n id: '3',\n name: 'backup-manager',\n displayName: 'Backup Manager',\n description: 'Automated backup solution for content and media files. Schedule regular backups to cloud storage with encryption and restore capabilities.',\n version: '3.0.1',\n author: 'BackupCorp',\n status: 'inactive',\n category: 'utilities',\n icon: ``,\n downloadCount: 12450,\n rating: 4.9,\n lastUpdated: '3 days ago',\n dependencies: ['cloud-storage'],\n permissions: ['read:all', 'write:backups']\n },\n {\n id: '4',\n name: 'security-scanner',\n displayName: 'Security Scanner',\n description: 'Real-time security monitoring and vulnerability scanning. Detects malware, suspicious activities, and provides security recommendations.',\n version: '1.2.8',\n author: 'SecureWeb',\n status: 'error',\n category: 'security',\n icon: ``,\n downloadCount: 5680,\n rating: 4.3,\n lastUpdated: '5 days ago',\n dependencies: ['security-core'],\n permissions: ['read:logs', 'read:files', 'write:security']\n },\n {\n id: '5',\n name: 'social-share',\n displayName: 'Social Share',\n description: 'Easy social media sharing buttons and Open Graph meta tag generation. Supports all major social platforms with customizable styling.',\n version: '2.3.0',\n author: 'SocialPlus',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 22100,\n rating: 4.7,\n lastUpdated: '4 days ago',\n dependencies: [],\n permissions: ['read:content', 'write:meta']\n },\n {\n id: '6',\n name: 'analytics-pro',\n displayName: 'Analytics Pro',\n description: 'Advanced analytics dashboard with custom tracking events, conversion funnels, and detailed visitor insights. GDPR compliant with privacy controls.',\n version: '4.1.2',\n author: 'AnalyticsPro Inc',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 18750,\n rating: 4.9,\n lastUpdated: '1 day ago',\n dependencies: ['gdpr-compliance'],\n permissions: ['read:analytics', 'write:tracking', 'read:users']\n },\n {\n id: '7',\n name: 'form-builder',\n displayName: 'Advanced Form Builder',\n description: 'Drag-and-drop form builder with conditional logic, file uploads, payment integration, and email notifications. Perfect for contact forms and surveys.',\n version: '1.8.5',\n author: 'FormWorks',\n status: 'inactive',\n category: 'content',\n icon: ``,\n downloadCount: 9870,\n rating: 4.4,\n lastUpdated: '1 week ago',\n dependencies: ['email-service'],\n permissions: ['write:forms', 'read:submissions', 'send:emails']\n },\n {\n id: '8',\n name: 'cache-optimizer',\n displayName: 'Cache Optimizer',\n description: 'Intelligent caching system with Redis support, CDN integration, and automatic cache invalidation. Dramatically improves site performance.',\n version: '2.7.3',\n author: 'SpeedBoost',\n status: 'active',\n category: 'utilities',\n icon: ``,\n downloadCount: 13240,\n rating: 4.8,\n lastUpdated: '6 days ago',\n dependencies: ['redis-connector'],\n permissions: ['read:cache', 'write:cache', 'manage:cdn'],\n isCore: true\n },\n {\n id: '9',\n name: 'multilingual',\n displayName: 'Multilingual Support',\n description: 'Complete internationalization solution with automatic translation, language detection, and localized content management for global websites.',\n version: '3.2.1',\n author: 'GlobalWeb',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 7650,\n rating: 4.5,\n lastUpdated: '2 weeks ago',\n dependencies: ['translation-api'],\n permissions: ['read:content', 'write:translations', 'manage:languages']\n }\n ]\n}\n","import type { AuthSettings } from '../../services/auth-validation'\n\nexport function renderAuthSettingsForm(settings: AuthSettings): string {\n const fields = settings.requiredFields\n const validation = settings.validation\n const registration = settings.registration\n\n return `\n
\n \n
\n

Registration Fields

\n

Configure which fields are required during user registration and their minimum lengths.

\n\n
\n ${Object.entries(fields).map(([fieldName, config]: [string, any]) => `\n
\n
\n
\n

${config.label}

\n

Field type: ${config.type}

\n
\n \n
\n\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n `).join('')}\n
\n
\n\n \n
\n

Password Requirements

\n

Additional password complexity requirements.

\n\n
\n
\n
\n \n

Password must contain at least one uppercase letter (A-Z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one lowercase letter (a-z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one number (0-9)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one special character (!@#$%^&*)

\n
\n \n
\n
\n
\n\n \n
\n

Registration Settings

\n

General registration behavior.

\n\n
\n
\n
\n \n

Enable or disable public user registration

\n
\n \n
\n\n
\n
\n \n

Users must verify their email before accessing the system

\n
\n \n
\n\n
\n \n \n \n \n \n \n

Role assigned to new users upon registration

\n
\n
\n
\n\n \n
\n

Validation Settings

\n

Additional validation rules.

\n\n
\n
\n
\n \n

Validate that email addresses are in correct format

\n
\n \n
\n\n
\n
\n \n

Ensure usernames are unique across all users

\n
\n \n
\n
\n
\n
\n `\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAuthSettingsForm } from '../components/auth-settings-form.template'\nimport type { AuthSettings } from '../../services/auth-validation'\n\n/**\n * Escape HTML attribute values to prevent XSS\n */\nfunction escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport interface PluginSettings {\n [key: string]: any\n}\n\nexport interface PluginActivity {\n id: string\n action: string\n message: string\n timestamp: number\n user?: string\n}\n\nexport interface PluginSettingsPageData {\n plugin: {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n settings?: PluginSettings\n }\n activity?: PluginActivity[]\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderPluginSettingsPage(data: PluginSettingsPageData): string {\n const { plugin, activity = [], user } = data\n \n const pageContent = `\n
\n \n
\n
\n

Plugin Settings

\n

\n ${plugin.description}\n

\n
\n \n
\n\n \n
\n
\n
\n
\n ${plugin.icon || plugin.displayName.charAt(0).toUpperCase()}\n
\n
\n

${plugin.displayName}

\n
\n v${plugin.version}\n by ${plugin.author}\n ${plugin.category}\n ${plugin.downloadCount ? `${plugin.downloadCount.toLocaleString()} downloads` : ''}\n ${plugin.rating ? `★ ${plugin.rating}` : ''}\n
\n
\n
\n\n
\n ${renderStatusBadge(plugin.status)}\n ${renderToggleButton(plugin)}\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n \n
\n ${renderSettingsTab(plugin)}\n
\n\n \n
\n ${renderActivityTab(activity)}\n
\n\n \n
\n ${renderInformationTab(plugin)}\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${plugin.displayName} Settings`,\n pageTitle: `${plugin.displayName} Settings`,\n currentPath: `/admin/plugins/${plugin.id}`,\n user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction renderStatusBadge(status: string): string {\n const statusColors: Record = {\n active: 'bg-green-900/50 text-green-300 border-green-600/30',\n inactive: 'bg-gray-800/50 text-gray-400 border-gray-600/30',\n error: 'bg-red-900/50 text-red-300 border-red-600/30'\n }\n\n const statusIcons: Record = {\n active: '
',\n inactive: '
',\n error: '
'\n }\n\n return `\n \n ${statusIcons[status] || statusIcons.inactive}${status.charAt(0).toUpperCase() + status.slice(1)}\n \n `\n}\n\nfunction renderToggleButton(plugin: any): string {\n if (plugin.isCore) {\n return 'Core Plugin'\n }\n\n return plugin.status === 'active' \n ? ``\n : ``\n}\n\nfunction renderSettingsTab(plugin: any): string {\n const settings = plugin.settings || {}\n const pluginId = plugin.id || plugin.name\n\n // Check for custom settings component first\n const customRenderer = pluginSettingsComponents[pluginId]\n if (customRenderer) {\n return `\n
\n ${customRenderer(plugin, settings)}\n\n
\n \n Save Settings\n \n
\n
\n `\n }\n\n const isSeedDataPlugin = plugin.id === 'seed-data' || plugin.name === 'seed-data'\n const isAuthPlugin = plugin.id === 'core-auth' || plugin.name === 'core-auth'\n const isTurnstilePlugin = plugin.id === 'turnstile' || plugin.name === 'turnstile'\n\n return `\n ${isSeedDataPlugin ? `\n
\n
\n
\n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n
\n \n \n \n \n Open Seed Data Tool\n \n
\n
\n ` : ''}\n\n
\n ${isAuthPlugin ? `\n

Authentication Settings

\n

Configure user registration fields and validation rules.

\n ` : isTurnstilePlugin ? `\n

Cloudflare Turnstile Settings

\n

Configure CAPTCHA-free bot protection for your forms.

\n ` : `\n

Plugin Settings

\n `}\n\n
\n ${isAuthPlugin && Object.keys(settings).length > 0\n ? renderAuthSettingsForm(settings as AuthSettings)\n : isTurnstilePlugin && Object.keys(settings).length > 0\n ? renderTurnstileSettingsForm(settings)\n : Object.keys(settings).length > 0\n ? renderSettingsFields(settings)\n : renderNoSettings(plugin)\n }\n\n ${Object.keys(settings).length > 0 ? `\n
\n \n Save Settings\n \n
\n ` : ''}\n
\n
\n `\n}\n\nfunction renderSettingsFields(settings: PluginSettings): string {\n return Object.entries(settings).map(([key, value]) => {\n const fieldId = `setting_${key}`\n const displayName = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase())\n \n if (typeof value === 'boolean') {\n return `\n
\n
\n \n

Enable or disable this feature

\n
\n \n
\n `\n } else if (typeof value === 'number') {\n return `\n
\n \n \n
\n `\n } else {\n return `\n
\n \n \n
\n `\n }\n }).join('')\n}\n\nfunction renderTurnstileSettingsForm(settings: any): string {\n const inputClass = \"backdrop-blur-sm bg-white/10 border border-white/20 rounded-lg px-3 py-2 text-white placeholder-gray-300 focus:border-blue-400 focus:outline-none transition-colors w-full\"\n const selectClass = \"backdrop-blur-sm bg-zinc-800 border border-white/20 rounded-lg px-3 py-2 text-white focus:border-blue-400 focus:outline-none transition-colors w-full [&>option]:bg-zinc-800 [&>option]:text-white\"\n \n return `\n \n
\n
\n \n

Enable or disable Turnstile verification globally

\n
\n \n
\n\n \n
\n \n \n

Your Cloudflare Turnstile site key (public)

\n
\n\n \n
\n \n \n

Your Cloudflare Turnstile secret key (private)

\n
\n\n \n
\n \n \n

Visual appearance of the Turnstile widget

\n
\n\n \n
\n \n \n

Size of the Turnstile challenge widget

\n
\n\n \n
\n \n \n

Managed: Shows challenge only when needed. Non-Interactive: Always shows but doesn't require interaction. Invisible: Runs in background without UI.

\n
\n\n \n
\n \n \n

Controls when Turnstile verification occurs. Always: Verifies immediately (pre-clearance). Execute: Verifies on form submit. Interaction Only: Only after user interaction.

\n
\n `\n}\n\nfunction renderNoSettings(plugin: any): string {\n // Special handling for seed-data plugin\n if (plugin.id === 'seed-data' || plugin.name === 'seed-data') {\n return `\n
\n \n \n \n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n \n \n \n \n Generate Seed Data\n \n
\n `\n }\n\n return `\n
\n \n \n \n \n

No Settings Available

\n

This plugin doesn't have any configurable settings.

\n
\n `\n}\n\nfunction renderActivityTab(activity: PluginActivity[]): string {\n return `\n
\n

Activity Log

\n \n ${activity.length > 0 ? `\n
\n ${activity.map(item => `\n
\n
\n
\n
\n ${item.action}\n ${formatTimestamp(item.timestamp)}\n
\n

${item.message}

\n ${item.user ? `

by ${item.user}

` : ''}\n
\n
\n `).join('')}\n
\n ` : `\n
\n \n \n \n

No Activity

\n

No recent activity for this plugin.

\n
\n `}\n
\n `\n}\n\nfunction renderInformationTab(plugin: any): string {\n return `\n
\n \n
\n

Plugin Details

\n
\n
\n Name:\n ${plugin.displayName}\n
\n
\n Version:\n ${plugin.version}\n
\n
\n Author:\n ${plugin.author}\n
\n
\n Category:\n ${plugin.category}\n
\n
\n Status:\n ${plugin.status}\n
\n
\n Last Updated:\n ${plugin.lastUpdated}\n
\n
\n
\n\n \n
\n

Dependencies & Permissions

\n \n ${plugin.dependencies && plugin.dependencies.length > 0 ? `\n
\n

Dependencies:

\n
\n ${plugin.dependencies.map((dep: string) => `\n
${dep}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${plugin.permissions && plugin.permissions.length > 0 ? `\n
\n

Permissions:

\n
\n ${plugin.permissions.map((perm: string) => `\n
${perm}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${(!plugin.dependencies || plugin.dependencies.length === 0) && (!plugin.permissions || plugin.permissions.length === 0) ? `\n

No dependencies or special permissions required.

\n ` : ''}\n
\n
\n `\n}\n\nfunction formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp * 1000)\n return date.toLocaleString()\n}\n\n// ==================== Plugin Settings Components ====================\n// These render just the settings content, embedded within the shared layout\n\n/**\n * Registry of custom plugin settings components\n * Plugins with custom settings UI register their render functions here\n */\ntype PluginSettingsRenderer = (plugin: any, settings: PluginSettings) => string\n\nconst pluginSettingsComponents: Record = {\n 'otp-login': renderOTPLoginSettingsContent,\n 'email': renderEmailSettingsContent,\n}\n\n/**\n * OTP Login plugin settings content\n */\nfunction renderOTPLoginSettingsContent(plugin: any, settings: PluginSettings): string {\n const siteName = settings.siteName || 'SonicJS'\n const emailConfigured = settings._emailConfigured || false\n const codeLength = settings.codeLength || 6\n const codeExpiryMinutes = settings.codeExpiryMinutes || 10\n const maxAttempts = settings.maxAttempts || 3\n const rateLimitPerHour = settings.rateLimitPerHour || 5\n const allowNewUserRegistration = settings.allowNewUserRegistration || false\n const logoUrl = settings.logoUrl || ''\n const logoWidth = Number(settings.logoWidth) || 150\n const logoBorderWidth = Number(settings.logoBorderWidth) || 0\n const logoBorderColor = settings.logoBorderColor || '#ffffff'\n const loginUrl = settings.loginUrl || ''\n const loginButtonText = settings.loginButtonText || ''\n const previewButtonText = loginButtonText.trim() || `Sign in to ${siteName}`\n const previewLogoBorder = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${escapeHtmlAttr(logoBorderColor)}; border-radius: 8px;`\n : ''\n\n return `\n
\n \n
\n

\n 📧 Test OTP Email\n

\n\n ${!emailConfigured ? `\n
\n

\n ⚠️ Email not configured.\n Configure the Email plugin\n to send real emails. Dev mode will show codes in the response.\n

\n
\n ` : `\n
\n

\n ✅ Email configured. Test emails will be sent via Resend.\n

\n
\n `}\n\n
\n
\n \n \n
\n\n \n Send Test Code\n \n \n \n \n \n \n \n \n\n
\n\n \n
\n

Verify Code

\n
\n
\n \n \n
\n \n Verify Code\n \n \n
\n
\n
\n\n \n
\n

Code Settings

\n\n
\n
\n \n \n

Optional. Displayed at the top of the OTP email.

\n
\n\n
\n
\n \n \n

Max width of the logo (20-600).

\n
\n\n
\n \n \n

0 disables the border.

\n
\n\n
\n \n
\n \n \n
\n

Hex, rgb(), or named color.

\n
\n
\n\n
\n \n \n

Optional. If set, a \"Sign in\" button is added to the email.

\n
\n\n
\n \n \n

Optional. Defaults to \"Sign in to ${siteName}\".

\n
\n\n
\n
\n \n \n

Number of digits (4-8)

\n
\n\n
\n \n \n

How long codes remain valid

\n
\n\n
\n \n \n

Max verification attempts

\n
\n\n
\n \n \n

Max requests per email per hour

\n
\n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

\n 👁️ Email Preview\n

\n

\n This is how the OTP email will appear to users. The site name \"${siteName}\" is configured in\n General Settings.\n

\n\n
\n
\n ${logoUrl ? `\"Logo\"` : ''}\n

Your Login Code

\n

Enter this code to sign in to ${siteName}

\n
\n\n
\n
\n
\n 123456\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${codeExpiryMinutes} minutes\n

\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${siteName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n
\n
\n\n \n
\n

🔢 Features

\n
    \n
  • ✓ Passwordless authentication
  • \n
  • ✓ Secure random code generation
  • \n
  • ✓ Rate limiting protection
  • \n
  • ✓ Brute force prevention
  • \n
  • ✓ Mobile-friendly UX
  • \n
\n
\n\n \n \n
\n\n \n `\n}\n\n/**\n * Email plugin settings content\n */\nfunction renderEmailSettingsContent(plugin: any, settings: PluginSettings): string {\n const apiKey = settings.apiKey || ''\n const fromEmail = settings.fromEmail || ''\n const fromName = settings.fromName || ''\n const replyTo = settings.replyTo || ''\n const logoUrl = settings.logoUrl || ''\n\n return `\n
\n \n
\n

Resend Configuration

\n\n
\n \n
\n \n \n

\n Get your API key from resend.com/api-keys\n

\n
\n\n \n
\n \n \n

Must be a verified domain in Resend

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n

Logo to display in email templates

\n
\n
\n
\n\n \n
\n

Send Test Email

\n
\n \n \n Send Test\n \n
\n
\n
\n\n \n
\n

📧 Email Templates Included

\n
    \n
  • ✓ Registration confirmation
  • \n
  • ✓ Email verification
  • \n
  • ✓ Password reset
  • \n
  • ✓ One-time code (2FA)
  • \n
\n

\n Templates are code-based and can be customized by editing the plugin files.\n

\n
\n
\n\n \n `\n}\n\n/**\n * Check if a plugin has a custom settings component\n */\nexport function hasCustomSettingsComponent(pluginId: string): boolean {\n return pluginId in pluginSettingsComponents\n}\n\n/**\n * Get the custom settings component for a plugin\n */\nexport function getCustomSettingsComponent(pluginId: string): PluginSettingsRenderer | undefined {\n return pluginSettingsComponents[pluginId]\n}","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderPluginsListPage, PluginsListPageData, Plugin } from '../templates/pages/admin-plugins-list.template'\nimport { renderPluginSettingsPage, PluginSettingsPageData } from '../templates/pages/admin-plugin-settings.template'\nimport { SettingsService } from '../services/settings'\nimport { PluginService } from '../services'\nimport { PLUGIN_REGISTRY, findPluginByCodeName } from '../plugins/manifest-registry'\nimport type { Bindings, Variables } from '../app'\n\nconst adminPluginRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminPluginRoutes.use('*', requireAuth())\n\n// Build available plugins list from the auto-generated registry.\n// To add a new plugin to this list, create a manifest.json in the plugin directory\n// and run: node packages/scripts/generate-plugin-registry.mjs\nconst AVAILABLE_PLUGINS = Object.values(PLUGIN_REGISTRY).map(p => ({\n id: p.id,\n name: p.codeName,\n display_name: p.displayName,\n description: p.description,\n version: p.version,\n author: p.author,\n category: p.category,\n icon: p.iconEmoji,\n permissions: p.permissions,\n dependencies: p.dependencies,\n is_core: p.is_core\n}))\n\n// Plugin list page\nadminPluginRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n // TODO: Fix permission system\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n\n const pluginService = new PluginService(db)\n\n // Get all installed plugins with error handling\n let installedPlugins: any[] = []\n let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 }\n\n try {\n installedPlugins = await pluginService.getAllPlugins()\n stats = await pluginService.getPluginStats()\n } catch (error) {\n console.error('Error loading plugins:', error)\n // Continue with empty data\n }\n\n // Get list of installed plugin IDs\n const installedPluginIds = new Set(installedPlugins.map(p => p.id))\n\n // Find uninstalled plugins\n const uninstalledPlugins = AVAILABLE_PLUGINS.filter(p => !installedPluginIds.has(p.id))\n\n // Map installed plugins to template format\n const templatePlugins: Plugin[] = installedPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: p.status,\n category: p.category,\n icon: p.icon,\n downloadCount: p.download_count,\n rating: p.rating,\n lastUpdated: formatLastUpdated(p.last_updated),\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Add uninstalled plugins to the list\n const uninstalledTemplatePlugins: Plugin[] = uninstalledPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: 'uninstalled' as const,\n category: p.category,\n icon: p.icon,\n downloadCount: 0,\n rating: 0,\n lastUpdated: 'Not installed',\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Combine installed and uninstalled plugins\n const allPlugins = [...templatePlugins, ...uninstalledTemplatePlugins]\n\n // Update stats with uninstalled count\n stats.uninstalled = uninstalledPlugins.length\n stats.total = installedPlugins.length + uninstalledPlugins.length\n\n const pageData: PluginsListPageData = {\n plugins: allPlugins,\n stats,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n },\n version: c.get('appVersion')\n }\n\n return c.html(renderPluginsListPage(pageData))\n } catch (error) {\n console.error('Error loading plugins page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Get plugin settings page\nadminPluginRoutes.get('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Check authorization first\n if (user?.role !== 'admin') {\n return c.redirect('/admin/plugins')\n }\n\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin(pluginId)\n\n if (!plugin) {\n return c.text('Plugin not found', 404)\n }\n\n // Get activity log\n const activity = await pluginService.getPluginActivity(pluginId, 20)\n\n // Load additional context for plugins with custom settings components\n let enrichedSettings = plugin.settings || {}\n\n // For OTP Login plugin, add site name and email config status\n if (pluginId === 'otp-login') {\n // Get site name from general settings via SettingsService\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName || 'SonicJS'\n\n // Check if email plugin is configured\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n let emailConfigured = false\n if (emailPlugin?.settings) {\n try {\n const emailSettings = JSON.parse(emailPlugin.settings)\n emailConfigured = !!(emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName)\n } catch (e) { /* ignore */ }\n }\n\n enrichedSettings = {\n ...enrichedSettings,\n siteName,\n _emailConfigured: emailConfigured\n }\n }\n\n // Map plugin data to template format\n const templatePlugin = {\n id: plugin.id,\n name: plugin.name,\n displayName: plugin.display_name,\n description: plugin.description,\n version: plugin.version,\n author: plugin.author,\n status: plugin.status,\n category: plugin.category,\n icon: plugin.icon,\n downloadCount: plugin.download_count,\n rating: plugin.rating,\n lastUpdated: formatLastUpdated(plugin.last_updated),\n dependencies: plugin.dependencies,\n permissions: plugin.permissions,\n isCore: plugin.is_core,\n settings: enrichedSettings\n }\n\n // Map activity data\n const templateActivity = (activity || []).map(item => ({\n id: item.id,\n action: item.action,\n message: item.message,\n timestamp: item.timestamp,\n user: item.user_email\n }))\n\n const pageData: PluginSettingsPageData = {\n plugin: templatePlugin,\n activity: templateActivity,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n }\n }\n\n return c.html(renderPluginSettingsPage(pageData))\n } catch (error) {\n console.error('Error getting plugin settings page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Activate plugin\nadminPluginRoutes.post('/:id/activate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.activatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error activating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to activate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Deactivate plugin\nadminPluginRoutes.post('/:id/deactivate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.deactivatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deactivating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to deactivate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Generic install handler - uses the auto-generated plugin registry.\n// No per-plugin switch/case needed. Adding a manifest.json is enough.\nadminPluginRoutes.post('/install', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const body = await c.req.json()\n const pluginService = new PluginService(db)\n\n // Look up plugin in registry by codeName (what the frontend sends as body.name)\n // or by id\n const registryEntry = findPluginByCodeName(body.name)\n || PLUGIN_REGISTRY[body.name]\n || PLUGIN_REGISTRY[body.id]\n\n if (!registryEntry) {\n return c.json({ error: 'Plugin not found in registry' }, 404)\n }\n\n const plugin = await pluginService.installPlugin({\n id: registryEntry.id,\n name: registryEntry.codeName,\n display_name: registryEntry.displayName,\n description: registryEntry.description,\n version: registryEntry.version,\n author: registryEntry.author,\n category: registryEntry.category,\n icon: registryEntry.iconEmoji,\n permissions: registryEntry.permissions,\n dependencies: registryEntry.dependencies,\n is_core: registryEntry.is_core,\n settings: registryEntry.defaultSettings,\n })\n\n return c.json({ success: true, plugin })\n } catch (error) {\n console.error('Error installing plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to install plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Uninstall plugin\nadminPluginRoutes.post('/:id/uninstall', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.uninstallPlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error uninstalling plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to uninstall plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Update plugin settings\nadminPluginRoutes.post('/:id/settings', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const settings = await c.req.json()\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings(pluginId, settings)\n\n // Clear auth validation cache if updating core-auth plugin\n if (pluginId === 'core-auth') {\n try {\n const cacheKv = c.env.CACHE_KV\n if (cacheKv) {\n await cacheKv.delete('auth:settings')\n await cacheKv.delete('auth:registration-enabled')\n console.log('[AuthSettings] Cache cleared after updating authentication settings')\n }\n } catch (cacheError) {\n console.error('[AuthSettings] Failed to clear cache:', cacheError)\n }\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating plugin settings:', error)\n const message = error instanceof Error ? error.message : 'Failed to update settings'\n return c.json({ error: message }, 400)\n }\n})\n\n// Helper function to format last updated time\nfunction formatLastUpdated(timestamp: number): string {\n const now = Date.now() / 1000\n const diff = now - timestamp\n\n if (diff < 60) return 'just now'\n if (diff < 3600) return `${Math.floor(diff / 60)} minutes ago`\n if (diff < 86400) return `${Math.floor(diff / 3600)} hours ago`\n if (diff < 604800) return `${Math.floor(diff / 86400)} days ago`\n if (diff < 2592000) return `${Math.floor(diff / 604800)} weeks ago`\n return `${Math.floor(diff / 2592000)} months ago`\n}\n\nexport { adminPluginRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogEntry {\n id: string\n level: string\n category: string\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags: string[]\n source?: string\n createdAt: Date\n formattedDate: string\n formattedDuration?: string\n levelClass: string\n categoryClass: string\n}\n\nexport interface LogsListPageData {\n logs: LogEntry[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n baseUrl: string\n }\n filters: {\n level: string\n category: string\n search: string\n startDate: string\n endDate: string\n source: string\n }\n user?: BaseUser\n}\n\nexport function renderLogsListPage(data: LogsListPageData) {\n const { logs, pagination, filters, user } = data\n\n const content = `\n
\n
\n
\n

System Logs

\n

\n Monitor and analyze system activity, errors, and performance metrics.\n

\n
\n
\n \n Configure\n \n \n Export\n \n
\n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n Apply Filters\n \n \n Clear\n \n
\n
\n\n
\n ${pagination.totalItems} ${pagination.totalItems === 1 ? 'entry' : 'entries'}\n
\n
\n
\n
\n
\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
\n Level\n \n Category\n \n Message\n \n Source\n \n Time\n \n Actions\n
\n \n ${log.level}\n \n \n \n ${log.category}\n \n \n
\n
${log.message}
\n ${log.url ? `
${log.method} ${log.url}
` : ''}\n ${log.duration ? `
${log.formattedDuration}
` : ''}\n
\n
\n ${log.source || '-'}\n \n ${log.formattedDate}\n \n \n View Details\n \n
\n
\n\n ${logs.length === 0 ? `\n
\n \n \n \n

No log entries

\n

No log entries found matching your criteria.

\n
\n ` : ''}\n
\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : `\n \n Previous\n \n `}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : `\n \n Next\n \n `}\n
\n
\n
\n

\n Showing ${pagination.startItem} to ${pagination.endItem} of{' '}\n ${pagination.totalItems} results\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'System Logs',\n pageTitle: 'System Logs',\n currentPath: '/admin/logs',\n user,\n content\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport { LogEntry } from './admin-logs-list.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogDetailsPageData {\n log: LogEntry\n user?: BaseUser\n}\n\nexport function renderLogDetailsPage(data: LogDetailsPageData) {\n const { log, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Details

\n

\n Detailed information for log entry ${log.id}\n

\n
\n
\n\n
\n
\n
\n

Log Entry Information

\n
\n \n ${log.level}\n \n \n ${log.category}\n \n
\n
\n
\n \n
\n
\n
\n
ID
\n
${log.id}
\n
\n \n
\n
Timestamp
\n
${log.formattedDate}
\n
\n \n
\n
Level
\n
\n \n ${log.level}\n \n
\n
\n \n
\n
Category
\n
\n \n ${log.category}\n \n
\n
\n \n ${log.source ? html`\n
\n
Source
\n
${log.source}
\n
\n ` : ''}\n \n ${log.userId ? html`\n
\n
User ID
\n
${log.userId}
\n
\n ` : ''}\n \n ${log.sessionId ? html`\n
\n
Session ID
\n
${log.sessionId}
\n
\n ` : ''}\n \n ${log.requestId ? html`\n
\n
Request ID
\n
${log.requestId}
\n
\n ` : ''}\n \n ${log.ipAddress ? html`\n
\n
IP Address
\n
${log.ipAddress}
\n
\n ` : ''}\n \n ${log.method && log.url ? html`\n
\n
HTTP Request
\n
\n ${log.method} ${log.url}\n ${log.statusCode ? html`(${log.statusCode})` : ''}\n
\n
\n ` : ''}\n \n ${log.duration ? html`\n
\n
Duration
\n
${log.formattedDuration}
\n
\n ` : ''}\n \n ${log.userAgent ? html`\n
\n
User Agent
\n
${log.userAgent}
\n
\n ` : ''}\n
\n
\n
\n\n \n
\n
\n

Message

\n
\n
\n
\n ${log.message}\n
\n
\n
\n\n \n ${log.tags && log.tags.length > 0 ? html`\n
\n
\n

Tags

\n
\n
\n
\n ${log.tags.map(tag => html`\n \n ${tag}\n \n `).join('')}\n
\n
\n
\n ` : ''}\n\n \n ${log.data ? html`\n
\n
\n

Additional Data

\n
\n
\n
${JSON.stringify(log.data, null, 2)}
\n
\n
\n ` : ''}\n\n \n ${log.stackTrace ? html`\n
\n
\n

Stack Trace

\n
\n
\n
${log.stackTrace}
\n
\n
\n ` : ''}\n\n \n
\n \n ← Back to Logs\n \n \n
\n ${log.level === 'error' || log.level === 'fatal' ? html`\n \n Report Issue\n \n ` : ''}\n \n alert('Log details copied to clipboard'))\"\n >\n Copy Details\n \n
\n
\n
\n `\n\n return adminLayoutV2({\n title: `Log Details - ${log.id}`,\n user,\n content: content as string\n })\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport type { LogConfig } from '../../db/schema'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogConfigPageData {\n configs: LogConfig[]\n user?: BaseUser\n}\n\nexport function renderLogConfigPage(data: LogConfigPageData) {\n const { configs, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Configuration

\n

\n Configure logging settings for different categories and manage log retention policies.\n

\n
\n
\n \n Run Cleanup\n \n
\n
\n\n
\n\n \n
\n
\n

Log Levels Reference

\n
\n
\n
\n
\n \n debug\n \n

Detailed diagnostic information

\n
\n
\n \n info\n \n

General information messages

\n
\n
\n \n warn\n \n

Warning conditions

\n
\n
\n \n error\n \n

Error conditions

\n
\n
\n \n fatal\n \n

Critical system errors

\n
\n
\n
\n
\n\n \n
\n ${configs.map(config => html`\n
\n
\n
\n

${config.category}

\n
\n ${config.enabled ? html`\n \n Enabled\n \n ` : html`\n \n Disabled\n \n `}\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n \n \n \n \n \n \n

Only logs at this level or higher will be stored

\n
\n \n
\n \n \n

Logs older than this will be deleted

\n
\n \n
\n \n \n

Maximum number of logs to keep for this category

\n
\n
\n \n
\n
\n \n Update Configuration\n \n
\n
\n \n
\n
\n
Created: ${new Date(config.createdAt).toLocaleDateString()}
\n
Updated: ${new Date(config.updatedAt).toLocaleDateString()}
\n
\n
\n
\n `).join('')}\n
\n\n \n
\n
\n

Global Log Settings

\n
\n
\n
\n
\n

Storage Information

\n
\n
\n
-
\n
Total Log Entries
\n
\n
\n
-
\n
Storage Used
\n
\n
\n
-
\n
Oldest Log
\n
\n
\n
\n \n
\n

Log Categories

\n
\n
    \n
  • auth - Authentication and authorization events
  • \n
  • api - API requests and responses
  • \n
  • workflow - Content workflow state changes
  • \n
  • plugin - Plugin-related activities
  • \n
  • media - File upload and media operations
  • \n
  • system - General system events
  • \n
  • security - Security-related events and alerts
  • \n
  • error - General error conditions
  • \n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n return adminLayoutV2({\n title: 'Log Configuration',\n user,\n content: content as string\n })\n}","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { D1Database, KVNamespace } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport { getLogger, type LogLevel, type LogCategory, type LogFilter } from '../services'\nimport { renderLogsListPage, type LogsListPageData } from '../templates/pages/admin-logs-list.template'\nimport { renderLogDetailsPage, type LogDetailsPageData } from '../templates/pages/admin-log-details.template'\nimport { renderLogConfigPage, type LogConfigPageData } from '../templates/pages/admin-log-config.template'\nimport type { Bindings, Variables } from '../app'\n\nconst adminLogsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminLogsRoutes.use('*', requireAuth())\n\n// Main logs listing page\nadminLogsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Use Hono's built-in query method instead of parsing URL\n const query = c.req.query()\n \n // Parse query parameters\n const page = parseInt(query.page || '1')\n const limit = parseInt(query.limit || '50')\n const level = query.level\n const category = query.category\n const search = query.search\n const startDate = query.start_date\n const endDate = query.end_date\n const source = query.source\n \n // Build filter\n const filter: LogFilter = {\n limit,\n offset: (page - 1) * limit,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (search) {\n filter.search = search\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n if (source) {\n filter.source = source\n }\n \n // Get logs and total count\n const { logs, total } = await logger.getLogs(filter)\n \n // Format logs for display\n const formattedLogs = logs.map(log => ({\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }))\n \n const totalPages = Math.ceil(total / limit)\n \n const pageData: LogsListPageData = {\n logs: formattedLogs,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total),\n baseUrl: '/admin/logs'\n },\n filters: {\n level: level || '',\n category: category || '',\n search: search || '',\n startDate: startDate || '',\n endDate: endDate || '',\n source: source || ''\n },\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogsListPage(pageData))\n } catch (error) {\n console.error('Error fetching logs:', error)\n return c.html(html`

Error loading logs: ${error}

`)\n }\n})\n\n// Log details page\nadminLogsRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get single log by ID\n const { logs } = await logger.getLogs({ \n limit: 1, \n offset: 0,\n search: id // Using search to find by ID - this is a simplification\n })\n \n const log = logs.find(l => l.id === id)\n \n if (!log) {\n return c.html(html`

Log entry not found

`)\n }\n \n const formattedLog = {\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n \n const pageData: LogDetailsPageData = {\n log: formattedLog,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogDetailsPage(pageData))\n } catch (error) {\n console.error('Error fetching log details:', error)\n return c.html(html`

Error loading log details: ${error}

`)\n }\n})\n\n// Log configuration page\nadminLogsRoutes.get('/config', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get all log configurations\n const configs = await logger.getAllConfigs()\n \n const pageData: LogConfigPageData = {\n configs,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogConfigPage(pageData))\n } catch (error) {\n console.error('Error fetching log config:', error)\n return c.html(html`

Error loading log configuration: ${error}

`)\n }\n})\n\n// Update log configuration\nadminLogsRoutes.post('/config/:category', async (c) => {\n try {\n const category = c.req.param('category') as LogCategory\n const formData = await c.req.formData()\n \n const enabled = formData.get('enabled') === 'on'\n const level = formData.get('level') as string\n const retention = parseInt(formData.get('retention') as string)\n const maxSize = parseInt(formData.get('max_size') as string)\n \n const logger = getLogger(c.env.DB)\n await logger.updateConfig(category, {\n enabled,\n level,\n retention,\n maxSize\n })\n \n return c.html(html`\n
\n Configuration updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating log config:', error)\n return c.html(html`\n
\n Failed to update configuration. Please try again.\n
\n `)\n }\n})\n\n// Export logs\nadminLogsRoutes.get('/export', async (c) => {\n try {\n const query = c.req.query()\n const format = query.format || 'csv'\n const level = query.level\n const category = query.category\n const startDate = query.start_date\n const endDate = query.end_date\n \n const logger = getLogger(c.env.DB)\n \n // Build filter for export\n const filter: LogFilter = {\n limit: 10000, // Export up to 10k logs\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n const { logs } = await logger.getLogs(filter)\n \n if (format === 'json') {\n return c.json(logs, 200, {\n 'Content-Disposition': 'attachment; filename=\"logs-export.json\"'\n })\n } else {\n // Default to CSV\n const headers = [\n 'ID', 'Level', 'Category', 'Message', 'Source', 'User ID', \n 'IP Address', 'Method', 'URL', 'Status Code', 'Duration', \n 'Created At'\n ]\n const csvRows = [headers.join(',')]\n \n logs.forEach(log => {\n const row = [\n log.id,\n log.level,\n log.category,\n `\"${log.message.replace(/\"/g, '\"\"')}\"`, // Escape quotes\n log.source || '',\n log.userId || '',\n log.ipAddress || '',\n log.method || '',\n log.url || '',\n log.statusCode || '',\n log.duration || '',\n new Date(log.createdAt).toISOString()\n ]\n csvRows.push(row.join(','))\n })\n \n const csv = csvRows.join('\\n')\n \n return new Response(csv, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': 'attachment; filename=\"logs-export.csv\"'\n }\n })\n }\n } catch (error) {\n console.error('Error exporting logs:', error)\n return c.json({ error: 'Failed to export logs' }, 500)\n }\n})\n\n// Clean up old logs\nadminLogsRoutes.post('/cleanup', async (c) => {\n try {\n const user = c.get('user')\n \n // Only allow admin users to run cleanup\n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n \n const logger = getLogger(c.env.DB)\n await logger.cleanupByRetention()\n \n return c.html(html`\n
\n Log cleanup completed successfully!\n
\n `)\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n return c.html(html`\n
\n Failed to clean up logs. Please try again.\n
\n `)\n }\n})\n\n// Search logs (HTMX endpoint)\nadminLogsRoutes.post('/search', async (c) => {\n try {\n const formData = await c.req.formData()\n const search = formData.get('search') as string\n const level = formData.get('level') as string\n const category = formData.get('category') as string\n \n const logger = getLogger(c.env.DB)\n \n const filter: LogFilter = {\n limit: 20,\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (search) filter.search = search\n if (level) filter.level = [level] as LogLevel[]\n if (category) filter.category = [category] as LogCategory[]\n \n const { logs } = await logger.getLogs(filter)\n \n // Return just the logs table rows for HTMX\n const rows = logs.map(log => {\n const formattedLog = {\n ...log,\n formattedDate: new Date(log.createdAt).toLocaleString(),\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n\n return `\n \n \n \n ${formattedLog.level}\n \n \n \n \n ${formattedLog.category}\n \n \n \n
${formattedLog.message}
\n \n ${formattedLog.source || '-'}\n ${formattedLog.formattedDate}\n \n View\n \n \n `\n }).join('')\n\n return c.html(rows)\n } catch (error) {\n console.error('Error searching logs:', error)\n return c.html(html`Error searching logs`)\n }\n})\n\n// Helper functions\nfunction getLevelClass(level: string): string {\n switch (level) {\n case 'debug': return 'bg-gray-100 text-gray-800'\n case 'info': return 'bg-blue-100 text-blue-800'\n case 'warn': return 'bg-yellow-100 text-yellow-800'\n case 'error': return 'bg-red-100 text-red-800'\n case 'fatal': return 'bg-purple-100 text-purple-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nfunction getCategoryClass(category: string): string {\n switch (category) {\n case 'auth': return 'bg-green-100 text-green-800'\n case 'api': return 'bg-blue-100 text-blue-800'\n case 'workflow': return 'bg-purple-100 text-purple-800'\n case 'plugin': return 'bg-indigo-100 text-indigo-800'\n case 'media': return 'bg-pink-100 text-pink-800'\n case 'system': return 'bg-gray-100 text-gray-800'\n case 'security': return 'bg-red-100 text-red-800'\n case 'error': return 'bg-red-100 text-red-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nexport { adminLogsRoutes }","import { Hono } from 'hono'\nimport { renderDesignPage, DesignPageData } from '../templates/pages/admin-design.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminDesignRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminDesignRoutes.get('/', (c) => {\n const user = c.get('user')\n \n const pageData: DesignPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderDesignPage(pageData))\n})","import { Hono } from 'hono'\nimport { renderCheckboxPage, CheckboxPageData } from '../templates/pages/admin-checkboxes.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminCheckboxRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCheckboxRoutes.get('/', (c) => {\n const user = c.get('user')\n\n const pageData: CheckboxPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderCheckboxPage(pageData))\n})\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface Testimonial {\n id?: number\n authorName: string\n authorTitle?: string\n authorCompany?: string\n testimonialText: string\n rating?: number\n isPublished: boolean\n sortOrder: number\n}\n\ninterface TestimonialsFormData {\n testimonial?: Testimonial\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderTestimonialsForm(data: TestimonialsFormData): string {\n const { testimonial, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Testimonial' : 'New Testimonial'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the testimonial details below' : 'Create a new customer testimonial'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Author Information

\n\n \n
\n \n
\n \n
\n ${errors?.authorName ? `\n
\n ${errors.authorName.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.authorTitle ? `\n
\n ${errors.authorTitle.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.authorCompany ? `\n
\n ${errors.authorCompany.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Testimonial

\n\n \n
\n \n
\n \n

\n 0/1000 characters\n

\n
\n ${errors?.testimonialText ? `\n
\n ${errors.testimonialText.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.rating ? `\n
\n ${errors.rating.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/testimonials/${testimonial?.id}` : '/admin/testimonials/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderTestimonialsList } from '../templates/pages/admin-testimonials-list.template'\nimport { renderTestimonialsForm } from '../templates/pages/admin-testimonials-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst testimonialSchema = z.object({\n authorName: z.string().min(1, 'Author name is required').max(100, 'Author name must be under 100 characters'),\n authorTitle: z.string().optional(),\n authorCompany: z.string().optional(),\n testimonialText: z.string().min(1, 'Testimonial is required').max(1000, 'Testimonial must be under 1000 characters'),\n rating: z.string().transform(val => val ? parseInt(val, 10) : undefined).pipe(z.number().min(1).max(5).optional()),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminTestimonialsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminTestimonialsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, minRating, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (minRating) {\n whereClause += ' AND rating >= ?'\n params.push(parseInt(minRating, 10))\n }\n\n if (search) {\n whereClause += ' AND (author_name LIKE ? OR testimonial_text LIKE ? OR author_company LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM testimonials ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM testimonials\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: testimonials } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderTestimonialsList({\n testimonials: testimonials || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonials:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonials',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminTestimonialsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial created successfully')\n } else {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating testimonial:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM testimonials WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/testimonials?message=Testimonial not found&type=error')\n }\n\n const testimonial = results[0] as any\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id: testimonial.id,\n authorName: testimonial.author_name,\n authorTitle: testimonial.author_title,\n authorCompany: testimonial.author_company,\n testimonialText: testimonial.testimonial_text,\n rating: testimonial.rating,\n isPublished: Boolean(testimonial.isPublished),\n sortOrder: testimonial.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonial:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE testimonials\n SET author_name = ?, author_title = ?, author_company = ?, testimonial_text = ?, rating = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial updated successfully')\n } else {\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: validatedData.authorName,\n authorTitle: validatedData.authorTitle,\n authorCompany: validatedData.authorCompany,\n testimonialText: validatedData.testimonialText,\n rating: validatedData.rating,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Testimonial not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating testimonial:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM testimonials WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Testimonial not found' }, 404)\n }\n\n return c.redirect('/admin/testimonials?message=Testimonial deleted successfully')\n } catch (error) {\n console.error('Error deleting testimonial:', error)\n return c.json({ error: 'Failed to delete testimonial' }, 500)\n }\n})\n\nexport default adminTestimonialsRoutes\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface CodeExample {\n id?: number\n title: string\n description?: string\n code: string\n language: string\n category?: string\n tags?: string\n isPublished: boolean\n sortOrder: number\n}\n\ninterface CodeExamplesFormData {\n codeExample?: CodeExample\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderCodeExamplesForm(data: CodeExamplesFormData): string {\n const { codeExample, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Code Example' : 'New Code Example'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the code example details below' : 'Create a new code snippet or example'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Basic Information

\n\n \n
\n \n
\n \n
\n ${errors?.title ? `\n
\n ${errors.title.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

\n 0/500 characters\n

\n
\n ${errors?.description ? `\n
\n ${errors.description.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.language ? `\n
\n ${errors.language.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.category ? `\n
\n ${errors.category.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

Comma-separated tags

\n
\n ${errors?.tags ? `\n
\n ${errors.tags.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Code

\n\n \n
\n \n
\n \n

\n 0 characters\n

\n
\n ${errors?.code ? `\n
\n ${errors.code.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/code-examples/${codeExample?.id}` : '/admin/code-examples/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderCodeExamplesList } from '../templates/pages/admin-code-examples-list.template'\nimport { renderCodeExamplesForm } from '../templates/pages/admin-code-examples-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst codeExampleSchema = z.object({\n title: z.string().min(1, 'Title is required').max(200, 'Title must be under 200 characters'),\n description: z.string().max(500, 'Description must be under 500 characters').optional(),\n code: z.string().min(1, 'Code is required'),\n language: z.string().min(1, 'Language is required'),\n category: z.string().max(50, 'Category must be under 50 characters').optional(),\n tags: z.string().max(200, 'Tags must be under 200 characters').optional(),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminCodeExamplesRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCodeExamplesRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, language, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (language) {\n whereClause += ' AND language = ?'\n params.push(language)\n }\n\n if (search) {\n whereClause += ' AND (title LIKE ? OR description LIKE ? OR code LIKE ? OR tags LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM code_examples ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM code_examples\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: codeExamples } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderCodeExamplesList({\n codeExamples: codeExamples || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code examples:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code examples',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminCodeExamplesRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example created successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating code example:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM code_examples WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/code-examples?message=Code example not found&type=error')\n }\n\n const example = results[0] as any\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id: example.id,\n title: example.title,\n description: example.description,\n code: example.code,\n language: example.language,\n category: example.category,\n tags: example.tags,\n isPublished: Boolean(example.isPublished),\n sortOrder: example.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code example:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE code_examples\n SET title = ?, description = ?, code = ?, language = ?, category = ?, tags = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example updated successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: validatedData.title,\n description: validatedData.description,\n code: validatedData.code,\n language: validatedData.language,\n category: validatedData.category,\n tags: validatedData.tags,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Code example not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating code example:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM code_examples WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Code example not found' }, 404)\n }\n\n return c.redirect('/admin/code-examples?message=Code example deleted successfully')\n } catch (error) {\n console.error('Error deleting code example:', error)\n return c.json({ error: 'Failed to delete code example' }, 500)\n }\n})\n\nexport default adminCodeExamplesRoutes\n","import {\n AdminLayoutData,\n renderAdminLayout,\n} from \"../layouts/admin-layout-v2.template\";\n\nexport interface DashboardStats {\n collections: number;\n contentItems: number;\n mediaFiles: number;\n users: number;\n databaseSize?: number; // Size in bytes\n mediaSize?: number; // Total size of all media files in bytes\n recentActivity?: ActivityItem[];\n analytics?: AnalyticsData;\n}\n\nexport interface ActivityItem {\n id: string;\n type: \"content\" | \"media\" | \"user\" | \"collection\";\n action: string;\n description: string;\n timestamp: string;\n user: string;\n}\n\nexport interface AnalyticsData {\n pageViews: number;\n uniqueVisitors: number;\n contentPublished: number;\n mediaUploaded: number;\n weeklyGrowth: {\n pageViews: number;\n visitors: number;\n content: number;\n media: number;\n };\n}\n\nexport interface DashboardPageData {\n user?: {\n name: string;\n email: string;\n role: string;\n };\n stats?: DashboardStats;\n version?: string;\n enableExperimentalFeatures?: boolean;\n}\n\nexport function renderDashboardPage(data: DashboardPageData): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n \n \n ${renderStatsCardsSkeleton()}\n \n\n \n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n \n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderDashboardPageWithDynamicMenu(\n data: DashboardPageData,\n dynamicMenuItems: Array<{ label: string; path: string; icon: string }>\n): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n
\n ${renderStatsCards({\n collections: 0,\n contentItems: 0,\n mediaFiles: 0,\n users: 0,\n })}\n
\n\n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n enableExperimentalFeatures: data.enableExperimentalFeatures,\n content: pageContent,\n dynamicMenuItems,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderStatsCards(stats: DashboardStats): string {\n const cards = [\n {\n title: \"Total Collections\",\n value: stats.collections.toString(),\n change: \"12.5\",\n isPositive: true,\n },\n {\n title: \"Content Items\",\n value: stats.contentItems.toString(),\n change: \"8.2\",\n isPositive: true,\n },\n {\n title: \"Media Files\",\n value: stats.mediaFiles.toString(),\n change: \"15.3\",\n isPositive: true,\n },\n {\n title: \"Active Users\",\n value: stats.users.toString(),\n change: \"2.4\",\n isPositive: false,\n },\n ];\n\n const cardColors = ['text-cyan-400', 'text-lime-400', 'text-pink-400', 'text-purple-400'];\n\n return `\n
\n

Last 30 days

\n
\n ${cards.map((card, index) => `\n
\n
${card.title}
\n
\n
\n ${card.value}\n
\n
\n \n ${card.isPositive\n ? ''\n : ''\n }\n \n ${card.isPositive ? 'Increased' : 'Decreased'} by\n ${card.change}%\n
\n
\n
\n `).join('')}\n
\n
\n `;\n}\n\nfunction renderStatsCardsSkeleton(): string {\n return `\n
\n
\n
\n ${Array(4)\n .fill(0)\n .map(\n () => `\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n `;\n}\n\nfunction renderAnalyticsChart(): string {\n return `\n
\n
\n
\n
\n

Real-Time Analytics

\n

Requests per second (live)

\n
\n
\n
\n Live\n
\n
\n
\n 0\n req/s\n
\n
\n\n
\n \n
\n\n \n
\n \n\n \n `;\n}\n\nexport function renderRecentActivitySkeleton(): string {\n return `\n
\n
\n
\n
\n
\n
\n ${Array(3).fill(0).map(() => `\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n}\n\nexport function renderRecentActivity(activities?: ActivityItem[]): string {\n // Helper to get user initials\n const getInitials = (user: string): string => {\n const parts = user.split(' ').filter(p => p.length > 0)\n if (parts.length >= 2) {\n const first = parts[0]?.[0] || ''\n const second = parts[1]?.[0] || ''\n return (first + second).toUpperCase()\n }\n return user.substring(0, 2).toUpperCase()\n }\n\n // Helper to get relative time\n const getRelativeTime = (timestamp: string): string => {\n const date = new Date(timestamp)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) return 'just now'\n if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`\n return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`\n }\n\n // Helper to get color classes based on activity type\n const getColorClasses = (type: string): { bgColor: string; textColor: string } => {\n switch (type) {\n case 'content':\n return {\n bgColor: 'bg-lime-500/10 dark:bg-lime-400/10',\n textColor: 'text-lime-700 dark:text-lime-300'\n }\n case 'media':\n return {\n bgColor: 'bg-cyan-500/10 dark:bg-cyan-400/10',\n textColor: 'text-cyan-700 dark:text-cyan-300'\n }\n case 'user':\n return {\n bgColor: 'bg-pink-500/10 dark:bg-pink-400/10',\n textColor: 'text-pink-700 dark:text-pink-300'\n }\n case 'collection':\n return {\n bgColor: 'bg-purple-500/10 dark:bg-purple-400/10',\n textColor: 'text-purple-700 dark:text-purple-300'\n }\n default:\n return {\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300'\n }\n }\n }\n\n // Format activities with colors and times\n const formattedActivities = (activities || []).map(activity => {\n const colors = getColorClasses(activity.type)\n return {\n ...activity,\n initials: getInitials(activity.user),\n time: getRelativeTime(activity.timestamp),\n ...colors\n }\n })\n\n // If no activities, show empty state\n if (formattedActivities.length === 0) {\n formattedActivities.push({\n type: 'content' as const,\n description: 'No recent activity',\n user: 'System',\n time: '',\n initials: 'SY',\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300',\n id: '0',\n action: '',\n timestamp: new Date().toISOString()\n })\n }\n\n return `\n
\n
\n
\n

Recent Activity

\n \n
\n
\n\n
\n
    \n ${formattedActivities\n .map(\n (activity) => `\n
  • \n
    \n ${activity.initials}\n
    \n
    \n

    ${activity.description}

    \n

    \n ${activity.user}\n · \n ${activity.time}\n

    \n
    \n
  • \n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderQuickActions(): string {\n const actions = [\n {\n title: \"Create Content\",\n description: \"Add new blog post or page\",\n href: \"/admin/content/new\",\n icon: `\n \n `,\n },\n {\n title: \"Upload Media\",\n description: \"Add images and files\",\n href: \"/admin/media\",\n icon: `\n \n `,\n },\n {\n title: \"Manage Users\",\n description: \"Add or edit user accounts\",\n href: \"/admin/users\",\n icon: `\n \n `,\n },\n ];\n\n return `\n
\n
\n

Quick Actions

\n
\n\n
\n
\n ${actions\n .map(\n (action) => `\n \n
\n ${action.icon}\n
\n
\n

${action.title}

\n

${action.description}

\n
\n \n \n \n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderSystemStatus(): string {\n return `\n
\n
\n
\n

System Status

\n
\n
\n Live\n
\n
\n
\n\n \n \n
\n ${[\n { color: 'from-blue-500/20 to-cyan-500/20', darkColor: 'dark:from-blue-500/10 dark:to-cyan-500/10' },\n { color: 'from-purple-500/20 to-pink-500/20', darkColor: 'dark:from-purple-500/10 dark:to-pink-500/10' },\n { color: 'from-amber-500/20 to-orange-500/20', darkColor: 'dark:from-amber-500/10 dark:to-orange-500/10' },\n { color: 'from-lime-500/20 to-emerald-500/20', darkColor: 'dark:from-lime-500/10 dark:to-emerald-500/10' }\n ].map((gradient, i) => `\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n \n\n \n `;\n}\n\nexport function renderStorageUsage(databaseSizeBytes?: number, mediaSizeBytes?: number): string {\n // Helper to format bytes to human readable\n const formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`\n }\n\n const dbSizeGB = databaseSizeBytes ? databaseSizeBytes / (1024 ** 3) : 0\n const dbMaxGB = 10\n const dbPercentageRaw = (dbSizeGB / dbMaxGB) * 100\n // Ensure minimum 0.5% visibility for progress bar, max 100%\n const dbPercentage = Math.min(Math.max(dbPercentageRaw, 0.5), 100)\n const dbUsedFormatted = databaseSizeBytes ? formatBytes(databaseSizeBytes) : 'Unknown'\n\n const mediaUsedFormatted = mediaSizeBytes ? formatBytes(mediaSizeBytes) : '0 B'\n\n const storageItems = [\n {\n label: \"Database\",\n used: dbUsedFormatted,\n total: \"10 GB\",\n percentage: dbPercentage,\n color: dbPercentage > 80 ? \"bg-red-500 dark:bg-red-400\" : dbPercentage > 60 ? \"bg-amber-500 dark:bg-amber-400\" : \"bg-cyan-500 dark:bg-cyan-400\",\n },\n {\n label: \"Media Files\",\n used: mediaUsedFormatted,\n total: \"∞\",\n percentage: 0,\n color: \"bg-lime-500 dark:bg-lime-400\",\n note: \"Stored in R2\"\n },\n {\n label: \"Cache (KV)\",\n used: \"N/A\",\n total: \"∞\",\n percentage: 0,\n color: \"bg-purple-500 dark:bg-purple-400\",\n note: \"Unlimited\"\n },\n ];\n\n return `\n
\n
\n

Storage Usage

\n
\n\n
\n
\n ${storageItems\n .map(\n (item: any) => `\n
\n
\n
\n ${item.label}\n ${item.note ? `(${item.note})` : ''}\n
\n
${item.used} / ${item.total}
\n
\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}","import { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderDashboardPage,\n type DashboardPageData,\n renderStatsCards,\n renderStorageUsage,\n renderRecentActivity,\n type ActivityItem\n} from '../templates/pages/admin-dashboard.template'\nimport { getCoreVersion } from '../utils/version'\nimport { metricsTracker } from '../utils/metrics'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin - Admin Dashboard\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: DashboardPageData = {\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n } catch (error) {\n console.error('Dashboard error:', error)\n\n // Return dashboard with error state\n const pageData: DashboardPageData = {\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n }\n})\n\n/**\n * GET /admin/dashboard/stats - Dashboard stats HTML fragment (HTMX endpoint)\n */\nrouter.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n const html = renderStatsCards({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n users: usersCount,\n mediaSize: mediaSize\n })\n\n return c.html(html)\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.html('
Failed to load statistics
')\n }\n})\n\n/**\n * GET /admin/dashboard/storage - Storage usage HTML fragment (HTMX endpoint)\n */\nrouter.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n const html = renderStorageUsage(databaseSize, mediaSize)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.html('
Failed to load storage information
')\n }\n})\n\n/**\n * GET /admin/dashboard/recent-activity - Recent activity HTML fragment (HTMX endpoint)\n */\nrouter.get('/recent-activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '5')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const activities: ActivityItem[] = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n // Format description based on action and resource type\n let description = ''\n if (row.action === 'create') {\n description = `Created new ${row.resource_type}`\n } else if (row.action === 'update') {\n description = `Updated ${row.resource_type}`\n } else if (row.action === 'delete') {\n description = `Deleted ${row.resource_type}`\n } else {\n description = `${row.action} ${row.resource_type}`\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n description,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n const html = renderRecentActivity(activities)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n const html = renderRecentActivity([])\n return c.html(html)\n }\n})\n\n/**\n * GET /admin/api/metrics - Real-time metrics for analytics chart\n * Returns JSON with current requests per second from the metrics tracker\n */\nrouter.get('/api/metrics', async (c) => {\n return c.json({\n requestsPerSecond: metricsTracker.getRequestsPerSecond(),\n totalRequests: metricsTracker.getTotalRequests(),\n averageRPS: Number(metricsTracker.getAverageRPS().toFixed(2)),\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/dashboard/system-status - System status HTML fragment (HTMX endpoint)\n */\nrouter.get('/system-status', async (c) => {\n try {\n const html = `\n
\n
\n
\n
\n
\n API Status\n \n \n \n
\n

Operational

\n
\n
\n\n
\n
\n
\n
\n Database\n \n \n \n
\n

Connected

\n
\n
\n\n
\n
\n
\n
\n R2 Storage\n \n \n \n
\n

Available

\n
\n
\n\n
\n
\n
\n
\n KV Cache\n \n \n \n
\n

Ready

\n
\n
\n
\n `\n return c.html(html)\n } catch (error) {\n console.error('Error fetching system status:', error)\n return c.html('
Failed to load system status
')\n }\n})\n\nexport { router as adminDashboardRoutes }\n","export function isMarkdownEditorType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nexport function normalizeFieldType(fieldType: string): string {\n if (isMarkdownEditorType(fieldType)) {\n return 'markdown'\n }\n\n if (fieldType === 'tinymce') {\n return 'richtext'\n }\n\n return fieldType\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\nexport interface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCollectionsListPage(data: CollectionsListPageData): string {\n const tableData: any = {\n tableId: 'collections-table',\n rowClickable: true,\n rowClickUrl: (collection: Collection) => `/admin/collections/${collection.id}`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => `\n
\n \n ${collection.name}\n \n ${collection.managed ? `\n \n \n \n \n Config\n \n ` : ''}\n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'description',\n label: 'Description',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => collection.description || '-'\n },\n {\n key: 'field_count',\n label: 'Fields',\n sortable: true,\n sortType: 'number',\n render: (_value: any, collection: any) => {\n const count = collection.field_count || 0\n return `\n
\n \n ${count} ${count === 1 ? 'field' : 'fields'}\n \n
\n `\n }\n },\n {\n key: 'managed',\n label: 'Source',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => {\n if (collection.managed) {\n return `\n
\n \n \n \n Code\n
\n `\n } else {\n return `\n
\n \n \n \n \n \n Database\n
\n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Content',\n sortable: false,\n render: (_value: any, collection: any) => {\n if (!collection || !collection.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.collections,\n emptyMessage: 'No collections found.'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Collections

\n

Manage your content collections and their schemas

\n
\n \n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n ${data.collections.length} ${data.collections.length === 1 ? 'collection' : 'collections'}\n \n \n \n \n Refresh\n \n
\n
\n
\n
\n
\n\n \n
\n ${renderTable(tableData)}\n
\n\n \n ${data.collections.length === 0 ? `\n
\n \n \n \n

No collections found

\n

Get started by creating your first collection

\n \n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Collections',\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","export interface TableColumn {\n key: string\n label: string\n sortable?: boolean\n className?: string\n sortType?: 'string' | 'number' | 'date' | 'boolean'\n render?: (value: any, row: any) => string\n}\n\nexport interface TableData {\n columns: TableColumn[]\n rows: T[]\n selectable?: boolean\n className?: string\n emptyMessage?: string\n tableId?: string\n title?: string\n rowClickable?: boolean\n rowClickUrl?: (row: T) => string\n}\n\nexport function renderTable(data: TableData): string {\n const tableId = data.tableId || `table-${Math.random().toString(36).substr(2, 9)}`\n\n if (data.rows.length === 0) {\n return `\n
\n
\n \n \n \n

${data.emptyMessage || 'No data available'}

\n
\n
\n `\n }\n\n return `\n
\n ${data.title ? `\n
\n

${data.title}

\n
\n ` : ''}\n
\n \n \n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, index) => {\n const isFirst = index === 0 && !data.selectable\n const isLast = index === data.columns.length - 1\n return `\n \n `}).join('')}\n \n \n \n ${data.rows.map((row, rowIndex) => {\n if (!row) return ''\n const clickableClass = data.rowClickable ? 'cursor-pointer' : ''\n const clickHandler = data.rowClickable && data.rowClickUrl ? `onclick=\"window.location.href='${data.rowClickUrl(row)}'\"` : ''\n return `\n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, colIndex) => {\n const value = (row as any)[column.key]\n const displayValue = column.render ? column.render(value, row) : value\n const stopPropagation = column.key === 'actions' ? 'onclick=\"event.stopPropagation()\"' : ''\n const isFirst = colIndex === 0 && !data.selectable\n const isLast = colIndex === data.columns.length - 1\n return `\n \n `\n }).join('')}\n \n `\n }).join('')}\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${column.sortable ? `\n \n ${column.label}\n
\n \n \n \n \n \n \n
\n \n ` : column.label}\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${displayValue || ''}\n
\n
\n\n \n
\n `\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm, FormData, FormField } from '../form.template'\nimport { renderAlert } from '../components/alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\n// Helper function to get field type badge with color\nfunction getFieldTypeBadge(fieldType: string): string {\n const typeLabels: Record = {\n 'text': 'Text',\n 'slug': 'URL Slug',\n 'richtext': 'Rich Text (TinyMCE)',\n 'quill': 'Rich Text (Quill)',\n 'markdown': 'Markdown',\n 'mdxeditor': 'Markdown',\n 'easymde': 'Markdown',\n 'number': 'Number',\n 'boolean': 'Boolean',\n 'date': 'Date',\n 'select': 'Select',\n 'media': 'Media',\n 'reference': 'Reference'\n }\n const typeColors: Record = {\n 'text': 'bg-blue-500/10 dark:bg-blue-400/10 text-blue-700 dark:text-blue-300 ring-blue-500/20 dark:ring-blue-400/20',\n 'slug': 'bg-sky-500/10 dark:bg-sky-400/10 text-sky-700 dark:text-sky-300 ring-sky-500/20 dark:ring-sky-400/20',\n 'richtext': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'quill': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'markdown': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'mdxeditor': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'easymde': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'number': 'bg-green-500/10 dark:bg-green-400/10 text-green-700 dark:text-green-300 ring-green-500/20 dark:ring-green-400/20',\n 'boolean': 'bg-amber-500/10 dark:bg-amber-400/10 text-amber-700 dark:text-amber-300 ring-amber-500/20 dark:ring-amber-400/20',\n 'date': 'bg-cyan-500/10 dark:bg-cyan-400/10 text-cyan-700 dark:text-cyan-300 ring-cyan-500/20 dark:ring-cyan-400/20',\n 'select': 'bg-indigo-500/10 dark:bg-indigo-400/10 text-indigo-700 dark:text-indigo-300 ring-indigo-500/20 dark:ring-indigo-400/20',\n 'media': 'bg-rose-500/10 dark:bg-rose-400/10 text-rose-700 dark:text-rose-300 ring-rose-500/20 dark:ring-rose-400/20',\n 'reference': 'bg-teal-500/10 dark:bg-teal-400/10 text-teal-700 dark:text-teal-300 ring-teal-500/20 dark:ring-teal-400/20'\n }\n const label = typeLabels[fieldType] || fieldType\n const color = typeColors[fieldType] || 'bg-zinc-500/10 dark:bg-zinc-400/10 text-zinc-700 dark:text-zinc-300 ring-zinc-500/20 dark:ring-zinc-400/20'\n return `${label}`\n}\n\nexport function renderCollectionFormPage(data: CollectionFormData): string {\n console.log('[renderCollectionFormPage] editorPlugins:', data.editorPlugins)\n\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? 'Edit Collection' : 'Create New Collection'\n const subtitle = isEdit\n ? `Update collection: ${data.display_name}`\n : 'Define a new content collection with custom fields and settings.'\n\n // Pre-compute data attribute for all fields (without badge HTML to avoid escaping issues)\n const fieldsWithData = (data.fields || []).map(field => ({\n ...field,\n dataFieldJSON: JSON.stringify(JSON.stringify(field))\n }))\n\n const fields: FormField[] = [\n {\n name: 'displayName',\n label: 'Display Name',\n type: 'text',\n value: data.display_name || '',\n placeholder: 'Blog Posts',\n required: true,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'name',\n label: 'Collection Name',\n type: 'text',\n value: data.name || '',\n placeholder: 'blog_posts',\n required: true,\n readonly: isEdit,\n helpText: isEdit ? 'Collection name cannot be changed' : 'Lowercase letters, numbers, and underscores only',\n className: isEdit ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'description',\n label: 'Description',\n type: 'textarea',\n value: data.description || '',\n placeholder: 'Description of this collection...',\n rows: 3,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n }\n ]\n\n\n const formData: FormData = {\n id: 'collection-form',\n ...(isEdit\n ? { hxPut: `/admin/collections/${data.id}`, action: `/admin/collections/${data.id}`, method: 'PUT' }\n : { hxPost: '/admin/collections', action: '/admin/collections' }\n ),\n hxTarget: '#form-messages',\n fields: fields,\n submitButtons: data.managed ? [] : [\n {\n label: isEdit ? 'Update Collection' : 'Create Collection',\n type: 'submit',\n className: 'btn-primary'\n }\n ]\n }\n\n const pageContent = `\n
\n \n ${data.managed ? `\n
\n
\n \n \n \n
\n

\n Config-Managed Collection\n

\n
\n

This collection is managed by a configuration file and cannot be edited through the admin interface.

\n

\n Config file:\n \n src/collections/${data.name}.collection.ts\n \n

\n

\n To modify this collection's schema, edit the configuration file directly in your code editor.\n

\n
\n
\n
\n
\n ` : ''}\n\n \n
\n
\n

${title}

\n

${subtitle}

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

Collection Details

\n

Configure your collection settings below

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n \n \n ${renderForm(formData)}\n\n ${isEdit && data.managed ? `\n \n
\n
\n

Collection Fields

\n

Fields defined in the configuration file (read-only)

\n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n ${field.field_name}\n
\n
\n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add fields to your collection configuration file to see them here.

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${isEdit && !data.managed ? `\n \n
\n
\n
\n

Collection Fields

\n

Define the fields that content in this collection will have

\n
\n \n \n \n \n Add Field\n \n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n Field name: ${field.field_name}\n
\n
\n
\n
\n \n \n \n \n Edit\n \n \n \n \n \n Delete\n \n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add your first field to get started

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${!isEdit ? `\n
\n
\n \n \n \n
\n

\n Create Collection First\n

\n

\n After creating the collection, you'll be able to add and configure custom fields.\n

\n
\n
\n
\n ` : ''}\n \n \n
\n \n \n \n \n ${data.managed ? 'Back to Collections' : 'Cancel'}\n \n\n ${isEdit && !data.managed ? `\n \n \n \n \n Delete Collection\n \n ` : ''}\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Add Field

\n \n
\n
\n\n
\n \n\n
\n \n \n

Lowercase letters, numbers, and underscores only

\n
\n\n
\n \n
\n \n \n \n \n ${data.editorPlugins?.tinymce ? '' : ''}\n ${data.editorPlugins?.quill ? '' : ''}\n ${data.editorPlugins?.easyMdx ? '' : ''}\n \n \n \n \n \n \n \n \n \n \n \n
\n

\n
\n\n
\n \n \n
\n\n
\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n\n
\n \n \n

JSON configuration for field-specific options

\n
\n\n
\n \n Cancel\n \n \n Add Field\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-field-confirm',\n title: 'Delete Field',\n message: 'Are you sure you want to delete this field? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteField()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { normalizeFieldType } from './admin-collections-field-types'\nimport { renderCollectionsListPage } from '../templates/pages/admin-collections-list.template'\nimport { renderCollectionFormPage } from '../templates/pages/admin-collections-form.template'\n\n// Type definitions for collections\ninterface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\ninterface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\ninterface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\ninterface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminCollectionsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminCollectionsRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on collection modification routes\nadminCollectionsRoutes.post('*', requireRole(['admin']))\nadminCollectionsRoutes.put('*', requireRole(['admin']))\nadminCollectionsRoutes.delete('*', requireRole(['admin']))\n\n// Collections management - List all collections\nadminCollectionsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n const search = url.searchParams.get('search') || ''\n\n // Build query based on search\n let stmt\n let results\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, managed, schema\n FROM collections\n WHERE is_active = 1\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(\"SELECT id, name, display_name, description, created_at, managed, schema FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY created_at DESC\")\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Fetch field counts for all collections from content_fields table (legacy)\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections: Collection[] = (results || [])\n .filter((row: any) => row && row.id)\n .map((row: any) => {\n // Calculate field count: use schema if available, otherwise use content_fields table\n let fieldCount = 0\n if (row.schema) {\n try {\n const schema = typeof row.schema === 'string' ? JSON.parse(row.schema) : row.schema\n if (schema && schema.properties) {\n fieldCount = Object.keys(schema.properties).length\n }\n } catch (e) {\n // If schema parsing fails, fall back to content_fields count\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n } else {\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n\n return {\n id: String(row.id || ''),\n name: String(row.name || ''),\n display_name: String(row.display_name || ''),\n description: row.description ? String(row.description) : undefined,\n created_at: Number(row.created_at || 0),\n formattedDate: row.created_at ? new Date(Number(row.created_at)).toLocaleDateString() : 'Unknown',\n field_count: fieldCount,\n managed: row.managed === 1\n }\n })\n\n const pageData: CollectionsListPageData = {\n collections,\n search,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCollectionsListPage(pageData))\n } catch (error) {\n console.error('Error fetching collections:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.html(html`

Error loading collections: ${errorMessage}

`)\n }\n})\n\n// New collection form\nadminCollectionsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /new] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n})\n\n// Create collection\nadminCollectionsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const name = formData.get('name') as string\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n // Check if this is an HTMX request\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n // Basic validation\n if (!name || !displayName) {\n const errorMsg = 'Name and display name are required.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n // For regular form submission, redirect back with error\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Validate name format\n if (!/^[a-z0-9_]+$/.test(name)) {\n const errorMsg = 'Collection name must contain only lowercase letters, numbers, and underscores.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n const db = c.env.DB\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(name).first()\n\n if (existing) {\n const errorMsg = 'A collection with this name already exists.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Create basic schema for the collection\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n // Create collection\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n name,\n displayName,\n description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache (only if CACHE_KV is available)\n if (c.env.CACHE_KV) {\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n }\n\n if (isHtmx) {\n return c.html(html`\n
\n Collection created successfully! Redirecting to edit mode...\n \n
\n `)\n } else {\n // For regular form submission, redirect to edit page\n return c.redirect(`/admin/collections/${collectionId}`)\n }\n } catch (error) {\n console.error('Error creating collection:', error)\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n if (isHtmx) {\n return c.html(html`\n
\n Failed to create collection. Please try again.\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n})\n\n// Edit collection form\nadminCollectionsRoutes.get('/:id', async (c) => {\n const db = c.env.DB\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n\n // Get collection fields - try schema first, then content_fields table\n let fields: CollectionField[] = []\n\n // If collection has a schema, parse it\n if (collection.schema) {\n try {\n const schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n fields = Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n // Normalize schema formats to UI field types\n let fieldType = fieldConfig.type || 'string'\n if (fieldConfig.enum) {\n fieldType = 'select'\n } else if (fieldConfig.format === 'richtext') {\n fieldType = 'richtext'\n } else if (fieldConfig.format === 'media') {\n fieldType = 'media'\n } else if (fieldConfig.format === 'date-time') {\n fieldType = 'date'\n } else if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n fieldType = 'slug'\n }\n \n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: fieldType,\n field_label: fieldConfig.title || fieldName,\n field_options: fieldConfig,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: fieldConfig.searchable === true || false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table if no schema or parsing failed\n if (fields.length === 0) {\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n fields = (fieldsResults || []).map((row: any) => {\n let fieldOptions = {}\n if (row.field_options) {\n try {\n fieldOptions = typeof row.field_options === 'string' ? JSON.parse(row.field_options) : row.field_options\n } catch (e) {\n console.error('Error parsing field_options for field:', row.field_name, e)\n fieldOptions = {}\n }\n }\n return {\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: fieldOptions,\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }\n })\n }\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /:id] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n fields: fields,\n managed: collection.managed === 1,\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n } catch (error) {\n console.error('Error fetching collection:', error)\n const user = c.get('user')\n\n // Check which editor plugins are active (even in error state)\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Failed to load collection.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n})\n\n// Update collection\nadminCollectionsRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const formData = await c.req.formData()\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n if (!displayName) {\n return c.html(html`\n
\n Display name is required.\n
\n `)\n }\n\n const db = c.env.DB\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(displayName, description || null, Date.now(), id).run()\n\n return c.html(html`\n
\n Collection updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.html(html`\n
\n Failed to update collection. Please try again.\n
\n `)\n }\n})\n\n// Delete collection\nadminCollectionsRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.html(html`\n
\n Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.\n
\n `)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.html(html`\n
\n Failed to delete collection. Please try again.\n
\n `)\n }\n})\n\n// Add field to collection\nadminCollectionsRoutes.post('/:id/fields', async (c) => {\n try {\n const collectionId = c.req.param('id')\n const formData = await c.req.formData()\n const fieldName = formData.get('field_name') as string\n const fieldType = formData.get('field_type') as string\n const fieldLabel = formData.get('field_label') as string\n const isRequired = formData.get('is_required') === '1'\n const isSearchable = formData.get('is_searchable') === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n if (!fieldName || !fieldType || !fieldLabel) {\n return c.json({ success: false, error: 'Field name, type, and label are required.' })\n }\n\n // Validate field name format\n if (!/^[a-z0-9_]+$/.test(fieldName)) {\n return c.json({ success: false, error: 'Field name must contain only lowercase letters, numbers, and underscores.' })\n }\n\n const db = c.env.DB\n\n // Get current collection to check its schema\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Check if field already exists in schema\n let schema = collection.schema ? (typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema) : null\n\n if (schema && schema.properties && schema.properties[fieldName]) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Also check content_fields table for legacy support\n const existingStmt = db.prepare('SELECT id FROM content_fields WHERE collection_id = ? AND field_name = ?')\n const existing = await existingStmt.bind(collectionId, fieldName).first()\n\n if (existing) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Parse field options\n let parsedOptions = {}\n try {\n parsedOptions = fieldOptions ? JSON.parse(fieldOptions) : {}\n } catch (e) {\n console.error('Error parsing field options:', e)\n }\n\n // Add field to schema (primary storage method)\n if (schema) {\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Build field config based on type\n const fieldConfig: any = {\n type: fieldType === 'number' ? 'number' : fieldType === 'boolean' ? 'boolean' : 'string',\n title: fieldLabel,\n searchable: isSearchable,\n ...parsedOptions\n }\n\n const normalizedFieldType = normalizeFieldType(fieldType)\n\n // Handle special field types\n if (normalizedFieldType === 'richtext') {\n fieldConfig.format = 'richtext'\n } else if (normalizedFieldType === 'date') {\n fieldConfig.format = 'date-time'\n } else if (normalizedFieldType === 'select') {\n fieldConfig.enum = (parsedOptions as any).options || []\n } else if (fieldType === 'radio') {\n fieldConfig.type = 'radio'\n if (!(parsedOptions as any).enum && (parsedOptions as any).options) {\n fieldConfig.enum = (parsedOptions as any).options\n }\n } else if (fieldType === 'media') {\n fieldConfig.format = 'media'\n } else if (normalizedFieldType === 'slug') {\n fieldConfig.type = 'slug'\n fieldConfig.format = 'slug'\n } else if (normalizedFieldType === 'quill') {\n fieldConfig.type = 'quill'\n } else if (normalizedFieldType === 'markdown') {\n fieldConfig.type = 'markdown'\n } else if (normalizedFieldType === 'reference') {\n fieldConfig.type = 'reference'\n }\n\n schema.properties[fieldName] = fieldConfig\n\n // Add to required array if needed\n if (isRequired && !schema.required.includes(fieldName)) {\n schema.required.push(fieldName)\n }\n\n // Update collection schema in database\n const updateSchemaStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateSchemaStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Add Field] Added field to schema:', fieldName, fieldConfig)\n\n return c.json({ success: true, fieldId: `schema-${fieldName}` })\n }\n\n // Fallback: If no schema exists, use content_fields table\n // Get next field order\n const orderStmt = db.prepare('SELECT MAX(field_order) as max_order FROM content_fields WHERE collection_id = ?')\n const orderResult = await orderStmt.bind(collectionId).first() as any\n const nextOrder = (orderResult?.max_order || 0) + 1\n\n // Create field in content_fields table\n const fieldId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content_fields (\n id, collection_id, field_name, field_type, field_label,\n field_options, field_order, is_required, is_searchable,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n fieldId,\n collectionId,\n fieldName,\n fieldType,\n fieldLabel,\n fieldOptions,\n nextOrder,\n isRequired ? 1 : 0,\n isSearchable ? 1 : 0,\n now,\n now\n ).run()\n\n return c.json({ success: true, fieldId })\n } catch (error) {\n console.error('Error adding field:', error)\n return c.json({ success: false, error: 'Failed to add field.' })\n }\n})\n\n// Update field\nadminCollectionsRoutes.put('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const formData = await c.req.formData()\n const fieldLabel = formData.get('field_label') as string\n const fieldType = formData.get('field_type') as string\n // Use getAll() to handle hidden input + checkbox pattern (get last value)\n const isRequiredValues = formData.getAll('is_required')\n const isSearchableValues = formData.getAll('is_searchable')\n const isRequired = isRequiredValues[isRequiredValues.length - 1] === '1'\n const isSearchable = isSearchableValues[isSearchableValues.length - 1] === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n // Log all form data for debugging\n console.log('[Field Update] Field ID:', fieldId)\n console.log('[Field Update] Form data received:', {\n field_label: fieldLabel,\n field_type: fieldType,\n is_required: formData.get('is_required'),\n is_searchable: formData.get('is_searchable'),\n field_options: fieldOptions\n })\n\n if (!fieldLabel) {\n return c.json({ success: false, error: 'Field label is required.' })\n }\n\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n // Schema fields are part of the collection's JSON schema\n // We need to update the collection's schema in the database\n const fieldName = fieldId.replace('schema-', '')\n\n console.log('[Field Update] Updating schema field:', fieldName)\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first()\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema) {\n schema = { type: 'object', properties: {}, required: [] }\n }\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Update the field in the schema\n if (schema.properties[fieldName]) {\n // Parse field options from form\n let parsedFieldOptions: Record = {}\n try {\n parsedFieldOptions = JSON.parse(fieldOptions)\n } catch (e) {\n console.error('[Field Update] Error parsing field options:', e)\n }\n\n // Build the updated field config - merge in field options\n const updatedFieldConfig: any = {\n ...schema.properties[fieldName],\n ...parsedFieldOptions,\n type: fieldType,\n title: fieldLabel,\n searchable: isSearchable\n }\n\n // Also set/remove the individual required property on the field\n // This ensures consistency regardless of which format is checked in GET\n if (isRequired) {\n updatedFieldConfig.required = true\n } else {\n delete updatedFieldConfig.required\n }\n\n schema.properties[fieldName] = updatedFieldConfig\n\n // Handle required field in the schema's required array (proper JSON Schema way)\n const requiredIndex = schema.required.indexOf(fieldName)\n console.log('[Field Update] Required field handling:', {\n fieldName,\n isRequired,\n currentRequiredArray: schema.required,\n requiredIndex\n })\n\n if (isRequired && requiredIndex === -1) {\n // Add to required array if checked and not already there\n schema.required.push(fieldName)\n console.log('[Field Update] Added field to required array')\n } else if (!isRequired && requiredIndex !== -1) {\n // Remove from required array if unchecked and currently there\n schema.required.splice(requiredIndex, 1)\n console.log('[Field Update] Removed field from required array')\n }\n\n console.log('[Field Update] Final required array:', schema.required)\n console.log('[Field Update] Final field config:', schema.properties[fieldName])\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Field Update] Schema update result:', {\n success: result.success,\n changes: result.meta?.changes\n })\n\n return c.json({ success: true })\n }\n\n // For regular database fields\n const updateStmt = db.prepare(`\n UPDATE content_fields\n SET field_label = ?, field_type = ?, field_options = ?, is_required = ?, is_searchable = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateStmt.bind(fieldLabel, fieldType, fieldOptions, isRequired ? 1 : 0, isSearchable ? 1 : 0, Date.now(), fieldId).run()\n\n console.log('[Field Update] Update result:', {\n success: result.success,\n meta: result.meta,\n changes: result.meta?.changes,\n last_row_id: result.meta?.last_row_id\n })\n\n // Verify the update by reading back the field\n const verifyStmt = db.prepare('SELECT * FROM content_fields WHERE id = ?')\n const verifyResult = await verifyStmt.bind(fieldId).first()\n console.log('[Field Update] Verification - field after update:', verifyResult)\n\n console.log('[Field Update] Successfully updated field with type:', fieldType)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating field:', error)\n return c.json({ success: false, error: 'Failed to update field.' })\n }\n})\n\n// Delete field\nadminCollectionsRoutes.delete('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n const fieldName = fieldId.replace('schema-', '')\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema || !schema.properties) {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n\n // Remove field from schema\n if (schema.properties[fieldName]) {\n delete schema.properties[fieldName]\n\n // Also remove from required array if present\n if (schema.required && Array.isArray(schema.required)) {\n const requiredIndex = schema.required.indexOf(fieldName)\n if (requiredIndex !== -1) {\n schema.required.splice(requiredIndex, 1)\n }\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Delete Field] Removed field from schema:', fieldName)\n\n return c.json({ success: true })\n } else {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n }\n\n // For regular database fields\n const deleteStmt = db.prepare('DELETE FROM content_fields WHERE id = ?')\n await deleteStmt.bind(fieldId).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting field:', error)\n return c.json({ success: false, error: 'Failed to delete field.' })\n }\n})\n\n// Update field order\nadminCollectionsRoutes.post('/:collectionId/fields/reorder', async (c) => {\n try {\n const body = await c.req.json()\n const fieldIds = body.fieldIds as string[]\n\n if (!Array.isArray(fieldIds)) {\n return c.json({ success: false, error: 'Invalid field order data.' })\n }\n\n const db = c.env.DB\n\n // Update field order\n for (let i = 0; i < fieldIds.length; i++) {\n const updateStmt = db.prepare('UPDATE content_fields SET field_order = ?, updated_at = ? WHERE id = ?')\n await updateStmt.bind(i + 1, Date.now(), fieldIds[i]).run()\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error reordering fields:', error)\n return c.json({ success: false, error: 'Failed to reorder fields.' })\n }\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface SettingsPageData {\n user?: {\n name: string\n email: string\n role: string\n }\n settings?: {\n general?: GeneralSettings\n appearance?: AppearanceSettings\n security?: SecuritySettings\n notifications?: NotificationSettings\n storage?: StorageSettings\n migrations?: MigrationSettings\n databaseTools?: DatabaseToolsSettings\n }\n activeTab?: string\n version?: string\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface AppearanceSettings {\n theme: 'light' | 'dark' | 'auto'\n primaryColor: string\n logoUrl: string\n favicon: string\n customCSS: string\n}\n\nexport interface SecuritySettings {\n twoFactorEnabled: boolean\n sessionTimeout: number\n passwordRequirements: {\n minLength: number\n requireUppercase: boolean\n requireNumbers: boolean\n requireSymbols: boolean\n }\n ipWhitelist: string[]\n jwtExpiresIn?: string\n jwtRefreshGraceSeconds?: number\n}\n\nexport interface NotificationSettings {\n emailNotifications: boolean\n contentUpdates: boolean\n systemAlerts: boolean\n userRegistrations: boolean\n emailFrequency: 'immediate' | 'daily' | 'weekly'\n}\n\nexport interface StorageSettings {\n maxFileSize: number\n allowedFileTypes: string[]\n storageProvider: 'local' | 'cloudflare' | 's3'\n backupFrequency: 'daily' | 'weekly' | 'monthly'\n retentionPeriod: number\n}\n\nexport interface MigrationSettings {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Array<{\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n }>\n}\n\nexport interface DatabaseToolsSettings {\n totalTables: number\n totalRows: number\n lastBackup?: string\n databaseSize?: string\n tables: Array<{\n name: string\n rowCount: number\n }>\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const activeTab = data.activeTab || 'general'\n \n const pageContent = `\n
\n \n
\n
\n

Settings

\n

Manage your application settings and preferences

\n
\n
\n\n \n
\n
\n \n
\n
\n\n \n
\n
\n ${renderTabContent(activeTab, data.settings)}\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'run-migrations-confirm',\n title: 'Run Migrations',\n message: 'Are you sure you want to run pending migrations? This action cannot be undone.',\n confirmText: 'Run Migrations',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performRunMigrations()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Settings',\n pageTitle: 'Settings',\n currentPath: '/admin/settings',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderTabButton(tabId: string, label: string, iconPath: string, activeTab: string): string {\n const isActive = activeTab === tabId\n const baseClasses = 'flex items-center space-x-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 whitespace-nowrap no-underline'\n const activeClasses = isActive\n ? 'border-zinc-950 dark:border-white text-zinc-950 dark:text-white'\n : 'border-transparent text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-300 hover:border-zinc-300 dark:hover:border-zinc-700'\n\n return `\n \n \n \n \n ${label}\n \n `\n}\n\nfunction renderTabContent(activeTab: string, settings?: SettingsPageData['settings']): string {\n switch (activeTab) {\n case 'general':\n return renderGeneralSettings(settings?.general)\n case 'appearance':\n return renderAppearanceSettings(settings?.appearance)\n case 'security':\n return renderSecuritySettings(settings?.security)\n case 'notifications':\n return renderNotificationSettings(settings?.notifications)\n case 'storage':\n return renderStorageSettings(settings?.storage)\n case 'migrations':\n return renderMigrationSettings(settings?.migrations)\n case 'database-tools':\n return renderDatabaseToolsSettings(settings?.databaseTools)\n default:\n return renderGeneralSettings(settings?.general)\n }\n}\n\nfunction renderGeneralSettings(settings?: GeneralSettings): string {\n return `\n
\n
\n

General Settings

\n

Configure basic application settings and preferences.

\n
\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n
\n \n ${settings?.siteDescription || ''}\n
\n\n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderAppearanceSettings(settings?: AppearanceSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Appearance Settings

\n

Customize the look and feel of your application.

\n
\n \n
\n
\n
\n \n
\n \n \n \n
\n
\n \n
\n \n
\n \n \n
\n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderSecuritySettings(settings?: SecuritySettings): string {\n const jwtExpiresIn = settings?.jwtExpiresIn ?? '30d'\n const jwtRefreshGraceSeconds =\n typeof settings?.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n\n return `\n
\n \n
\n

Session / JWT

\n

\n Configure how long a signed-in session lasts and how long an expired token can still be refreshed.\n The JWT_EXPIRES_IN and JWT_REFRESH_GRACE_SECONDS\n environment variables, when set, override the values below.\n

\n\n
\n
\n \n \n

\n Accepts 30d, 12h, 3600s, or bare seconds. Default: 30 days.\n

\n
\n\n
\n \n \n

\n How long an expired token can still be exchanged at /auth/refresh. Default: 604800 (7 days).\n

\n
\n
\n\n
\n \n \n \n \n Save Session Settings\n \n
\n
\n\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n The fields below are under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Security Settings

\n

Configure security and authentication settings.

\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n

Leave empty to allow all IPs

\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderNotificationSettings(settings?: NotificationSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Notification Settings

\n

Configure how and when you receive notifications.

\n
\n \n
\n
\n
\n

Email Notifications

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Notification Preferences
\n

\n Critical system alerts will always be sent immediately regardless of your frequency setting.\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderStorageSettings(settings?: StorageSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Storage Settings

\n

Configure file storage and backup settings.

\n
\n \n
\n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Storage Status
\n

\n Current usage: 2.4 GB / 10 GB available\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderMigrationSettings(settings?: MigrationSettings): string {\n return `\n
\n
\n

Database Migrations

\n

View and manage database migrations to keep your schema up to date.

\n
\n \n \n
\n
\n
\n
\n

Total Migrations

\n

${settings?.totalMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Applied

\n

${settings?.appliedMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Pending

\n

${settings?.pendingMigrations || '0'}

\n
\n \n \n \n
\n
\n
\n\n \n
\n \n \n \n\n \n
\n\n \n
\n
\n

Migration History

\n

List of all available database migrations

\n
\n \n
\n
\n \n \n \n

Loading migration status...

\n
\n
\n
\n
\n\n \n `\n}\n\nfunction renderDatabaseToolsSettings(settings?: DatabaseToolsSettings): string {\n return `\n
\n
\n

Database Tools

\n

Manage database operations including backup, restore, and maintenance.

\n
\n\n \n
\n
\n
\n
\n

Total Tables

\n

${settings?.totalTables || '0'}

\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n
\n

Total Rows

\n

${settings?.totalRows?.toLocaleString() || '0'}

\n
\n
\n \n \n \n
\n
\n
\n
\n\n \n
\n \n
\n

Safe Operations

\n
\n \n \n \n \n Refresh Stats\n \n\n \n \n \n \n Create Backup\n \n\n \n \n \n \n Validate Database\n \n
\n
\n
\n\n \n
\n
\n

Database Tables

\n

Click on a table to view its data

\n
\n\n
\n
\n \n \n \n

Loading database statistics...

\n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

Danger Zone

\n

\n These operations are destructive and cannot be undone.\n Your admin account will be preserved, but all other data will be permanently deleted.\n

\n
\n \n \n \n \n Truncate All Data\n \n
\n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\n// import { html } from 'hono/html'\nimport { requireAuth } from '../middleware'\nimport { renderSettingsPage, SettingsPageData } from '../templates/pages/admin-settings.template'\nimport { MigrationService } from '../services/migrations'\nimport { SettingsService } from '../services/settings'\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminSettingsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminSettingsRoutes.use('*', requireAuth())\n\n// Helper function to get mock settings data\nfunction getMockSettings(user: any) {\n return {\n general: {\n siteName: 'SonicJS AI',\n siteDescription: 'A modern headless CMS powered by AI',\n adminEmail: user?.email || 'admin@example.com',\n timezone: 'UTC',\n language: 'en',\n maintenanceMode: false\n },\n appearance: {\n theme: 'dark' as const,\n primaryColor: '#465FFF',\n logoUrl: '',\n favicon: '',\n customCSS: ''\n },\n security: {\n twoFactorEnabled: false,\n sessionTimeout: 30,\n passwordRequirements: {\n minLength: 8,\n requireUppercase: true,\n requireNumbers: true,\n requireSymbols: false\n },\n ipWhitelist: []\n },\n notifications: {\n emailNotifications: true,\n contentUpdates: true,\n systemAlerts: true,\n userRegistrations: false,\n emailFrequency: 'immediate' as const\n },\n storage: {\n maxFileSize: 10,\n allowedFileTypes: ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'docx'],\n storageProvider: 'cloudflare' as const,\n backupFrequency: 'daily' as const,\n retentionPeriod: 30\n },\n migrations: {\n totalMigrations: 0,\n appliedMigrations: 0,\n pendingMigrations: 0,\n lastApplied: undefined,\n migrations: []\n },\n databaseTools: {\n totalTables: 0,\n totalRows: 0,\n lastBackup: undefined,\n databaseSize: '0 MB',\n tables: []\n }\n }\n}\n\n// Settings page (redirects to general settings)\nadminSettingsRoutes.get('/', (c) => {\n return c.redirect('/admin/settings/general')\n})\n\n// General settings\nadminSettingsRoutes.get('/general', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Get real general settings from database\n const generalSettings = await settingsService.getGeneralSettings(user?.email)\n\n const mockSettings = getMockSettings(user)\n mockSettings.general = generalSettings\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'general',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Appearance settings\nadminSettingsRoutes.get('/appearance', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'appearance',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Security settings\nadminSettingsRoutes.get('/security', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Load persisted security settings (JWT TTL + refresh grace)\n const persisted = await settingsService.getSecuritySettings()\n\n const mockSettings = getMockSettings(user)\n mockSettings.security = {\n ...mockSettings.security,\n jwtExpiresIn: persisted.jwtExpiresIn,\n jwtRefreshGraceSeconds: persisted.jwtRefreshGraceSeconds\n } as any\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'security',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Notifications settings\nadminSettingsRoutes.get('/notifications', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'notifications',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Storage settings\nadminSettingsRoutes.get('/storage', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'storage',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Migrations settings\nadminSettingsRoutes.get('/migrations', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'migrations',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Database tools settings\nadminSettingsRoutes.get('/database-tools', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'database-tools',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Get migration status\nadminSettingsRoutes.get('/api/migrations/status', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminSettingsRoutes.post('/api/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n return c.json({\n success: false,\n error: 'Failed to run migrations'\n }, 500)\n }\n})\n\n// Validate database schema\nadminSettingsRoutes.get('/api/migrations/validate', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\n// Get database tools stats\nadminSettingsRoutes.get('/api/database-tools/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get list of all tables\n const tablesQuery = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT LIKE '_cf_%'\n ORDER BY name\n `).all()\n\n const tables = tablesQuery.results || []\n let totalRows = 0\n\n // Get row count for each table\n const tableStats = await Promise.all(\n tables.map(async (table: any) => {\n try {\n const countResult = await db.prepare(`SELECT COUNT(*) as count FROM ${table.name}`).first()\n const rowCount = (countResult as any)?.count || 0\n totalRows += rowCount\n return {\n name: table.name,\n rowCount\n }\n } catch (error) {\n console.error(`Error counting rows in ${table.name}:`, error)\n return {\n name: table.name,\n rowCount: 0\n }\n }\n })\n )\n\n // D1 doesn't expose database size directly, so we'll estimate based on row counts\n // Average row size estimate: 1KB per row (rough approximation)\n const estimatedSizeBytes = totalRows * 1024\n const databaseSizeMB = (estimatedSizeBytes / (1024 * 1024)).toFixed(2)\n\n return c.json({\n success: true,\n data: {\n totalTables: tables.length,\n totalRows,\n databaseSize: `${databaseSizeMB} MB (estimated)`,\n tables: tableStats\n }\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch database statistics'\n }, 500)\n }\n})\n\n// Validate database\nadminSettingsRoutes.get('/api/database-tools/validate', async (c) => {\n try {\n const db = c.env.DB\n\n // Run PRAGMA integrity_check\n const integrityResult = await db.prepare('PRAGMA integrity_check').first()\n const isValid = (integrityResult as any)?.integrity_check === 'ok'\n\n return c.json({\n success: true,\n data: {\n valid: isValid,\n message: isValid ? 'Database integrity check passed' : 'Database integrity check failed'\n }\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n})\n\n// Backup database\nadminSettingsRoutes.post('/api/database-tools/backup', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n // TODO: Implement actual backup functionality\n // For now, return success message\n return c.json({\n success: true,\n message: 'Database backup feature coming soon. Use Cloudflare Dashboard for backups.'\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({\n success: false,\n error: 'Failed to create backup'\n }, 500)\n }\n})\n\n// Truncate tables\nadminSettingsRoutes.post('/api/database-tools/truncate', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const body = await c.req.json()\n const tablesToTruncate = body.tables || []\n\n if (!Array.isArray(tablesToTruncate) || tablesToTruncate.length === 0) {\n return c.json({\n success: false,\n error: 'No tables specified for truncation'\n }, 400)\n }\n\n const db = c.env.DB\n const results = []\n\n // Validate table names against actual database tables (prevents SQL injection)\n const tablesResult = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n `).all()\n const validTables = new Set(\n (tablesResult.results || []).map((row: any) => row.name)\n )\n\n for (const tableName of tablesToTruncate) {\n if (!validTables.has(tableName)) {\n results.push({ table: tableName, success: false, error: 'Table not found' })\n continue\n }\n try {\n await db.prepare(`DELETE FROM ${tableName}`).run()\n results.push({ table: tableName, success: true })\n } catch (error) {\n console.error(`Error truncating ${tableName}:`, error)\n results.push({ table: tableName, success: false, error: String(error) })\n }\n }\n\n return c.json({\n success: true,\n message: `Truncated ${results.filter(r => r.success).length} of ${tablesToTruncate.length} tables`,\n results\n })\n } catch (error) {\n console.error('Error truncating tables:', error)\n return c.json({\n success: false,\n error: 'Failed to truncate tables'\n }, 500)\n }\n})\n\n// Save general settings\nadminSettingsRoutes.post('/general', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Extract general settings from form data\n const settings = {\n siteName: formData.get('siteName') as string,\n siteDescription: formData.get('siteDescription') as string,\n adminEmail: formData.get('adminEmail') as string,\n timezone: formData.get('timezone') as string,\n language: formData.get('language') as string,\n maintenanceMode: formData.get('maintenanceMode') === 'true'\n }\n\n // Validate required fields\n if (!settings.siteName || !settings.siteDescription) {\n return c.json({\n success: false,\n error: 'Site name and description are required'\n }, 400)\n }\n\n // Save settings to database\n const success = await settingsService.saveGeneralSettings(settings)\n\n if (success) {\n return c.json({\n success: true,\n message: 'General settings saved successfully!'\n })\n } else {\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n }\n } catch (error) {\n console.error('Error saving general settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save security settings (JWT TTL + refresh grace)\nadminSettingsRoutes.post('/security', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n const jwtExpiresInRaw = (formData.get('jwtExpiresIn') as string | null)?.trim() || ''\n const graceRaw = (formData.get('jwtRefreshGraceSeconds') as string | null)?.trim() || ''\n\n // Validate jwtExpiresIn: bare seconds or \n if (!/^\\d+(?:s|m|h|d)?$/i.test(jwtExpiresInRaw)) {\n return c.json({\n success: false,\n error: 'JWT expiration must be a number optionally suffixed with s/m/h/d (e.g. 30d, 12h, 3600).'\n }, 400)\n }\n\n const graceSeconds = Number.parseInt(graceRaw, 10)\n if (!Number.isFinite(graceSeconds) || graceSeconds < 0 || graceSeconds > 60 * 60 * 24 * 90) {\n return c.json({\n success: false,\n error: 'Refresh grace must be an integer between 0 and 7776000 seconds (90 days).'\n }, 400)\n }\n\n const success = await settingsService.saveSecuritySettings({\n jwtExpiresIn: jwtExpiresInRaw,\n jwtRefreshGraceSeconds: graceSeconds\n })\n\n if (success) {\n return c.json({\n success: true,\n message: 'Security settings saved successfully!'\n })\n }\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n } catch (error) {\n console.error('Error saving security settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save settings (legacy endpoint - redirect to general)\nadminSettingsRoutes.post('/', async (c) => {\n return c.redirect('/admin/settings/general')\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n formattedDate: string\n}\n\nexport interface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormsListPage(data: FormsListPageData): string {\n const tableData: any = {\n tableId: 'forms-table',\n rowClickable: true,\n rowClickUrl: (form: Form) => `/admin/forms/${form.id}/builder`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => `\n
\n \n ${form.name}\n \n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'category',\n label: 'Category',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n const categoryColors: Record = {\n 'contact': 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 ring-blue-700/10 dark:ring-blue-400/20',\n 'survey': 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-300 ring-purple-700/10 dark:ring-purple-400/20',\n 'registration': 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-300 ring-green-700/10 dark:ring-green-400/20',\n 'feedback': 'bg-orange-50 dark:bg-orange-500/10 text-orange-700 dark:text-orange-300 ring-orange-700/10 dark:ring-orange-400/20',\n 'general': 'bg-gray-50 dark:bg-gray-500/10 text-gray-700 dark:text-gray-300 ring-gray-700/10 dark:ring-gray-400/20'\n }\n const colorClass = categoryColors[form.category] || categoryColors['general']\n return `\n \n ${form.category || 'general'}\n \n `\n }\n },\n {\n key: 'submission_count',\n label: 'Submissions',\n sortable: true,\n sortType: 'number',\n render: (_value: any, form: any) => {\n const count = form.submission_count || 0\n return `\n
\n \n ${count}\n \n
\n `\n }\n },\n {\n key: 'is_active',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n if (form.is_active) {\n return `\n \n Active\n \n `\n } else {\n return `\n \n Inactive\n \n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n render: (_value: any, form: any) => {\n if (!form || !form.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.forms,\n emptyMessage: 'No forms found. Create your first form to get started!'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Forms

\n

Create and manage forms with the visual form builder

\n
\n \n
\n\n \n
\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Forms
\n
${data.forms.length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Active Forms
\n
${data.forms.filter(f => f.is_active).length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Submissions
\n
${data.forms.reduce((sum, f) => sum + (f.submission_count || 0), 0)}
\n
\n
\n
\n
\n
\n\n \n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Filter\n \n ${data.search || data.category ? `\n \n Clear\n \n ` : ''}\n \n
\n\n \n
\n ${renderTable(tableData)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Forms',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface FormBuilderPageData {\n id: string\n name: string\n display_name: string\n description?: string\n category?: string\n formio_schema: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\n// Inline Turnstile component for Form.io builder\nfunction getTurnstileComponentScript(): string {\n return `\n (function() {\n 'use strict';\n\n if (!window.Formio || !window.Formio.Components) {\n console.error('Form.io library not loaded');\n return;\n }\n\n const FieldComponent = Formio.Components.components.field;\n\n class TurnstileComponent extends FieldComponent {\n static schema(...extend) {\n return FieldComponent.schema({\n type: 'turnstile',\n label: 'Turnstile Verification',\n key: 'turnstile',\n input: true,\n persistent: false,\n protected: true,\n unique: false,\n hidden: false,\n clearOnHide: true,\n tableView: false,\n validate: {\n required: false\n },\n siteKey: '',\n theme: 'auto',\n size: 'normal',\n action: '',\n appearance: 'always',\n errorMessage: 'Please complete the security verification'\n }, ...extend);\n }\n\n static get builderInfo() {\n return {\n title: 'Turnstile',\n group: 'premium',\n icon: 'fa fa-shield-alt',\n weight: 120,\n documentation: '/admin/forms/docs#turnstile',\n schema: TurnstileComponent.schema()\n };\n }\n\n constructor(component, options, data) {\n super(component, options, data);\n this.widgetId = null;\n this.scriptLoaded = false;\n }\n\n init() {\n super.init();\n // Only load script if NOT in builder/edit mode\n if (!this.options.editMode && !this.options.builder && !this.builderMode) {\n this.loadTurnstileScript();\n }\n }\n\n loadTurnstileScript() {\n // Extra safety: never load in builder\n if (this.options.editMode || this.options.builder || this.builderMode) {\n console.log('Turnstile: Skipping script load in builder mode');\n return Promise.resolve();\n }\n\n if (window.turnstile) {\n this.scriptLoaded = true;\n return Promise.resolve();\n }\n\n if (this.scriptPromise) {\n return this.scriptPromise;\n }\n\n console.log('Turnstile: Loading script for form mode');\n this.scriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js';\n script.async = true;\n script.defer = true;\n script.onload = () => {\n this.scriptLoaded = true;\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Turnstile'));\n document.head.appendChild(script);\n });\n\n return this.scriptPromise;\n }\n\n render() {\n return super.render(\\`\n
\n
\n \\${this.component.description ? \\`
\\${this.component.description}
\\` : ''}\n
\n \\`);\n }\n\n attach(element) {\n this.loadRefs(element, {\n turnstileContainer: 'single',\n turnstileWidget: 'single'\n });\n\n const superAttach = super.attach(element);\n\n // Check if we're in builder mode or form mode\n if (this.options.editMode || this.options.builder) {\n // Builder mode - show placeholder only\n this.renderPlaceholder();\n } else {\n // Form mode - render actual widget\n this.loadTurnstileScript()\n .then(() => this.renderWidget())\n .catch(err => {\n console.error('Failed to load Turnstile:', err);\n if (this.refs.turnstileWidget) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to load security verification\n
\n \\`;\n }\n });\n }\n\n return superAttach;\n }\n\n renderPlaceholder() {\n if (!this.refs.turnstileWidget) {\n return;\n }\n \n this.refs.turnstileWidget.innerHTML = \\`\n
\n
🛡️
\n
Turnstile Verification
\n
CAPTCHA-free bot protection by Cloudflare
\n
Widget will appear here on the live form
\n
\n \\`;\n }\n\n renderWidget() {\n if (!this.refs.turnstileWidget || !window.turnstile) {\n return;\n }\n\n this.refs.turnstileWidget.innerHTML = '';\n\n const siteKey = this.component.siteKey || \n (this.root && this.root.options && this.root.options.turnstileSiteKey) || \n '';\n \n if (!siteKey) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n ⚠️ Configuration Required: Turnstile site key not configured. \n Please enable the Turnstile plugin in Settings → Plugins.\n
\n \\`;\n return;\n }\n\n try {\n const self = this;\n this.widgetId = window.turnstile.render(this.refs.turnstileWidget, {\n sitekey: siteKey,\n theme: this.component.theme || 'auto',\n size: this.component.size || 'normal',\n action: this.component.action || '',\n appearance: this.component.appearance || 'always',\n callback: function(token) {\n self.updateValue(token);\n self.triggerChange();\n },\n 'error-callback': function() {\n self.updateValue(null);\n self.setCustomValidity(self.component.errorMessage || 'Security verification failed');\n },\n 'expired-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification expired. Please verify again.');\n },\n 'timeout-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification timed out. Please try again.');\n }\n });\n } catch (err) {\n console.error('Failed to render Turnstile widget:', err);\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to render security verification\n
\n \\`;\n }\n }\n\n detach() {\n if (this.widgetId !== null && window.turnstile) {\n try {\n window.turnstile.remove(this.widgetId);\n this.widgetId = null;\n } catch (err) {\n console.error('Failed to remove Turnstile widget:', err);\n }\n }\n return super.detach();\n }\n\n getValue() {\n if (this.widgetId !== null && window.turnstile) {\n return window.turnstile.getResponse(this.widgetId);\n }\n return this.dataValue;\n }\n\n setValue(value, flags) {\n const changed = super.setValue(value, flags);\n return changed;\n }\n\n getValueAsString(value) {\n return value ? '✅ Verified' : '❌ Not Verified';\n }\n\n isEmpty(value) {\n return !value;\n }\n\n updateValue(value, flags) {\n const changed = super.updateValue(value, flags);\n \n if (value) {\n this.setCustomValidity('');\n }\n \n return changed;\n }\n\n checkValidity(data, dirty, row) {\n const result = super.checkValidity(data, dirty, row);\n \n if (this.component.validate && this.component.validate.required) {\n const value = this.getValue();\n if (!value) {\n this.setCustomValidity(this.component.errorMessage || 'Please complete the security verification');\n return false;\n }\n }\n \n return result;\n }\n }\n\n Formio.Components.addComponent('turnstile', TurnstileComponent);\n console.log('✅ Turnstile component registered with Form.io');\n window.TurnstileComponent = TurnstileComponent;\n })();\n `;\n}\n\nexport function renderFormBuilderPage(data: FormBuilderPageData): string {\n const formioSchema = data.formio_schema || { components: [] }\n const settings = data.settings || {}\n const googleMapsApiKey = data.google_maps_api_key || ''\n const turnstileSiteKey = data.turnstile_site_key || ''\n\n const pageContent = `\n \n\n
\n \n
\n
\n
\n \n \n \n \n \n
\n

\n Form Builder: ${data.display_name}\n

\n

\n \n ${data.name}\n \n

\n
\n
\n\n \n
\n \n \n \n \n \n Preview\n \n\n \n \n \n \n Save Form\n \n\n \n \n \n \n View Public Form\n \n\n \n \n \n \n View Submissions\n \n
\n
\n
\n\n \n
\n \n
\n \n \n \n \n Single Page\n \n \n \n \n \n Multi-Page Wizard\n \n
\n \n 💡 Use Panel components (Layout tab) for each page\n \n
\n\n \n
\n\n \n
\n
\n \n \n \n \n

Loading Form Builder...

\n
\n
\n\n \n
\n\n \n
\n
\n
\n

Form Preview

\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n\n \n \n\n \n\n \n \n \n \n \n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Form Builder: ${data.display_name}`,\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm } from '../components/form.template'\n\nexport interface FormCreatePageData {\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormCreatePage(data: FormCreatePageData): string {\n const pageContent = `\n
\n \n
\n
\n \n \n \n \n \n
\n

Create New Form

\n

Enter basic information to create your form. You'll be able to add fields in the builder.

\n
\n
\n
\n\n \n ${data.error ? `\n
\n
\n \n \n \n

${data.error}

\n
\n
\n ` : ''}\n\n ${data.success ? `\n
\n
\n \n \n \n

${data.success}

\n
\n
\n ` : ''}\n\n \n
\n
\n \n
\n \n
\n \n \n

\n Lowercase letters, numbers, and underscores only. Used in URLs and API.\n

\n
\n\n \n
\n \n \n

\n Human-readable name shown in the admin interface.\n

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n \n \n \n \n \n \n

\n Helps organize forms in the admin panel.\n

\n
\n
\n\n \n
\n \n Cancel\n \n \n \n \n \n Create & Open Builder\n \n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

What happens next?

\n
\n

After creating your form, you'll be taken to the Form Builder where you can:

\n
    \n
  • Drag and drop fields onto your form
  • \n
  • Configure field properties and validation
  • \n
  • Add conditional logic
  • \n
  • Preview your form in real-time
  • \n
  • Publish when ready
  • \n
\n
\n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create Form',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderFormsListPage } from '../templates/pages/admin-forms-list.template'\nimport { renderFormBuilderPage, type FormBuilderPageData } from '../templates/pages/admin-forms-builder.template'\nimport { renderFormCreatePage } from '../templates/pages/admin-forms-create.template'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\n\n// Type definitions for forms\ninterface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n updated_at: number\n formattedDate: string\n}\n\ninterface FormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n category?: string\n formio_schema?: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ninterface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminFormsRoutes.use('*', requireAuth())\n\n// Forms management - List all forms\nadminFormsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const category = c.req.query('category') || ''\n\n // Build query\n let query = 'SELECT * FROM forms WHERE 1=1'\n const params: string[] = []\n\n if (search) {\n query += ' AND (name LIKE ? OR display_name LIKE ?)'\n params.push(`%${search}%`, `%${search}%`)\n }\n\n if (category) {\n query += ' AND category = ?'\n params.push(category)\n }\n\n query += ' ORDER BY created_at DESC'\n\n const result = await db.prepare(query).bind(...params).all()\n\n // Format dates\n const forms = result.results.map((form: any) => ({\n ...form,\n formattedDate: new Date(form.created_at).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n }))\n\n const pageData: FormsListPageData = {\n forms,\n search,\n category,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsListPage(pageData))\n } catch (error: any) {\n console.error('Error listing forms:', error)\n return c.html('

Error loading forms

', 500)\n }\n})\n\n// Show create form page\nadminFormsRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n\n const pageData: FormData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormCreatePage(pageData))\n } catch (error: any) {\n console.error('Error showing create form page:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Show docs page\nadminFormsRoutes.get('/docs', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsDocsPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsDocsPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms docs page:', error)\n return c.html('

Error loading documentation

', 500)\n }\n})\n\n// Show examples page\nadminFormsRoutes.get('/examples', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsExamplesPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsExamplesPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms examples page:', error)\n return c.html('

Error loading examples

', 500)\n }\n})\n\n// Create new form\nadminFormsRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const name = body.name as string\n const displayName = body.displayName as string\n const description = (body.description as string) || ''\n const category = (body.category as string) || 'general'\n\n // Validate required fields\n if (!name || !displayName) {\n return c.json({ error: 'Name and display name are required' }, 400)\n }\n\n // Validate name format (lowercase, numbers, underscores only)\n if (!/^[a-z0-9_]+$/.test(name)) {\n return c.json({ \n error: 'Form name must contain only lowercase letters, numbers, and underscores' \n }, 400)\n }\n\n // Check for duplicate name\n const existing = await db.prepare('SELECT id FROM forms WHERE name = ?')\n .bind(name)\n .first()\n\n if (existing) {\n return c.json({ error: 'A form with this name already exists' }, 400)\n }\n\n // Create form with empty schema\n const formId = crypto.randomUUID()\n const now = Date.now()\n const emptySchema = { components: [] } // Empty Form.io schema\n\n await db.prepare(`\n INSERT INTO forms (\n id, name, display_name, description, category,\n formio_schema, settings, is_active, is_public,\n created_by, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n formId,\n name,\n displayName,\n description,\n category,\n JSON.stringify(emptySchema),\n JSON.stringify({\n submitButtonText: 'Submit',\n successMessage: 'Thank you for your submission!',\n requireAuth: false,\n emailNotifications: false\n }),\n 1, // is_active\n 1, // is_public\n user?.userId || null,\n now,\n now\n ).run()\n\n // Redirect to builder\n return c.redirect(`/admin/forms/${formId}/builder`)\n } catch (error: any) {\n console.error('Error creating form:', error)\n return c.json({ error: 'Failed to create form' }, 500)\n }\n})\n\n// Show form builder\nadminFormsRoutes.get('/:id/builder', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get Turnstile configuration\n const turnstileService = new TurnstileService(db)\n const turnstileSettings = await turnstileService.getSettings()\n\n const pageData: FormData = {\n id: form.id as string,\n name: form.name as string,\n display_name: form.display_name as string,\n description: form.description as string | undefined,\n category: form.category as string,\n formio_schema: form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] },\n settings: form.settings ? JSON.parse(form.settings as string) : {},\n is_active: Boolean(form.is_active),\n is_public: Boolean(form.is_public),\n google_maps_api_key: googleMapsApiKey,\n turnstile_site_key: turnstileSettings?.siteKey || '',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormBuilderPage(pageData as FormBuilderPageData))\n } catch (error: any) {\n console.error('Error showing form builder:', error)\n return c.html('

Error loading form builder

', 500)\n }\n})\n\n// Update form (save schema)\nadminFormsRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const body = await c.req.json()\n\n // Check if form exists\n const form = await db.prepare('SELECT id FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const now = Date.now()\n\n // Update form\n await db.prepare(`\n UPDATE forms \n SET formio_schema = ?, \n updated_by = ?, \n updated_at = ?\n WHERE id = ?\n `).bind(\n JSON.stringify(body.formio_schema),\n user?.userId || null,\n now,\n formId\n ).run()\n\n return c.json({ success: true, message: 'Form saved successfully' })\n } catch (error: any) {\n console.error('Error updating form:', error)\n return c.json({ error: 'Failed to save form' }, 500)\n }\n})\n\n// Delete form\nadminFormsRoutes.delete('/:id', async (c) => {\n try {\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Check if form exists\n const form = await db.prepare('SELECT id, submission_count FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Warn if form has submissions\n const submissionCount = form.submission_count as number || 0\n if (submissionCount > 0) {\n return c.json({ \n error: `Cannot delete form with ${submissionCount} submissions. Archive it instead.` \n }, 400)\n }\n\n // Delete form (cascade will delete submissions and files)\n await db.prepare('DELETE FROM forms WHERE id = ?').bind(formId).run()\n\n return c.json({ success: true, message: 'Form deleted successfully' })\n } catch (error: any) {\n console.error('Error deleting form:', error)\n return c.json({ error: 'Failed to delete form' }, 500)\n }\n})\n\n// View form submissions\nadminFormsRoutes.get('/:id/submissions', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get submissions\n const submissions = await db.prepare(\n 'SELECT * FROM form_submissions WHERE form_id = ? ORDER BY submitted_at DESC'\n ).bind(formId).all()\n\n // Simple submissions page for now\n const html = `\n \n \n \n Submissions - ${form.display_name}\n \n \n \n ← Back to Forms\n

Submissions: ${form.display_name}

\n

Total submissions: ${submissions.results.length}

\n ${submissions.results.length > 0 ? `\n \n \n \n \n \n \n \n \n \n ${submissions.results.map((sub: any) => `\n \n \n \n \n \n `).join('')}\n \n
IDSubmittedData
${sub.id.substring(0, 8)}${new Date(sub.submitted_at).toLocaleString()}
${JSON.stringify(JSON.parse(sub.submission_data), null, 2)}
\n ` : '

No submissions yet.

'}\n \n \n `\n \n return c.html(html)\n } catch (error: any) {\n console.error('Error loading submissions:', error)\n return c.html('

Error loading submissions

', 500)\n }\n})\n\nexport default adminFormsRoutes\n","import { Hono } from 'hono'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { createContentFromSubmission } from '../services/form-collection-sync'\n\n/**\n * Recursively sanitize all string values in arbitrary JSON data.\n * HTML-encodes entities (e.g., < becomes <) to prevent stored XSS\n * when form submission data is rendered in admin templates.\n */\nfunction sanitizeDeep(value: unknown): unknown {\n if (typeof value === 'string') {\n return sanitizeInput(value)\n }\n if (Array.isArray(value)) {\n return value.map(sanitizeDeep)\n }\n if (value !== null && typeof value === 'object') {\n const result: Record = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = sanitizeDeep(v)\n }\n return result\n }\n return value // numbers, booleans, null pass through\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const publicFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Get Turnstile configuration for a form (for headless frontends)\npublicFormsRoutes.get('/:identifier/turnstile-config', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form\n const form = await db.prepare(\n 'SELECT id, turnstile_enabled, turnstile_settings FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const turnstileService = new TurnstileService(db)\n const globalSettings = await turnstileService.getSettings()\n \n const formSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string)\n : { inherit: true }\n\n // Determine effective settings\n const enabled = form.turnstile_enabled === 1 || \n (formSettings.inherit && globalSettings?.enabled)\n\n if (!enabled || !globalSettings) {\n return c.json({ enabled: false })\n }\n\n return c.json({\n enabled: true,\n siteKey: formSettings.siteKey || globalSettings.siteKey,\n theme: formSettings.theme || globalSettings.theme || 'auto',\n size: formSettings.size || globalSettings.size || 'normal',\n mode: formSettings.mode || globalSettings.mode || 'managed',\n appearance: formSettings.appearance || globalSettings.appearance || 'always'\n })\n } catch (error: any) {\n console.error('Error fetching Turnstile config:', error)\n return c.json({ error: 'Failed to fetch config' }, 500)\n }\n})\n\n// Get form schema as JSON (for headless frontends)\npublicFormsRoutes.get('/:identifier/schema', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT id, name, display_name, description, category, formio_schema, settings, is_active, is_public FROM forms WHERE (id = ? OR name = ?) AND is_active = 1 AND is_public = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n return c.json({\n id: form.id,\n name: form.name,\n displayName: form.display_name,\n description: form.description,\n category: form.category,\n schema: formioSchema,\n settings: settings,\n submitUrl: `/api/forms/${form.id}/submit`\n })\n } catch (error: any) {\n console.error('Error fetching form schema:', error)\n return c.json({ error: 'Failed to fetch form schema' }, 500)\n }\n})\n\n// Render public form by name\npublicFormsRoutes.get('/:name', async (c) => {\n try {\n const db = c.env.DB\n const formName = c.req.param('name')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form by name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE name = ? AND is_active = 1 AND is_public = 1'\n ).bind(formName).first()\n\n if (!form) {\n return c.html('

Form not found

This form does not exist or is not publicly available.

', 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n const html = `\n \n \n \n \n \n ${form.display_name}\n \n \n \n \n \n \n \n
\n

${form.display_name}

\n ${form.description ? `

${form.description}

` : ''}\n \n
\n \n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n `\n\n return c.html(html)\n } catch (error: any) {\n console.error('Error rendering form:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Handle form submission (accepts either name or ID)\npublicFormsRoutes.post('/:identifier/submit', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n const body = await c.req.json()\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Check if Turnstile is enabled for this form\n const turnstileEnabled = form.turnstile_enabled === 1\n const turnstileSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string) \n : { inherit: true }\n\n // Validate Turnstile if enabled (or inheriting global settings)\n if (turnstileEnabled || turnstileSettings.inherit) {\n const turnstileService = new TurnstileService(db)\n \n // Check if Turnstile is globally enabled\n const globalEnabled = await turnstileService.isEnabled()\n \n if (globalEnabled || turnstileEnabled) {\n // Extract Turnstile token from submission data\n const turnstileToken = body.data?.turnstile || body.turnstile\n \n if (!turnstileToken) {\n return c.json({ \n error: 'Turnstile verification required. Please complete the security check.',\n code: 'TURNSTILE_MISSING'\n }, 400)\n }\n\n // Verify the token\n const clientIp = c.req.header('cf-connecting-ip')\n const verification = await turnstileService.verifyToken(turnstileToken, clientIp)\n \n if (!verification.success) {\n return c.json({ \n error: verification.error || 'Security verification failed. Please try again.',\n code: 'TURNSTILE_INVALID'\n }, 403)\n }\n\n // Remove Turnstile token from submission data before storing\n if (body.data?.turnstile) {\n delete body.data.turnstile\n }\n }\n }\n\n // Sanitize all string values in submission data to prevent stored XSS.\n // HTML-encodes entities (e.g., < becomes <) before storage.\n const sanitizedData = sanitizeDeep(body.data) as Record\n\n // Create submission\n const submissionId = crypto.randomUUID()\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO form_submissions (\n id, form_id, submission_data, user_id, ip_address, user_agent,\n submitted_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n submissionId,\n form.id,\n JSON.stringify(sanitizedData),\n null, // user_id (for authenticated users)\n c.req.header('cf-connecting-ip') || null,\n c.req.header('user-agent') || null,\n now,\n now\n ).run()\n\n // Update submission count\n await db.prepare(`\n UPDATE forms\n SET submission_count = submission_count + 1,\n updated_at = ?\n WHERE id = ?\n `).bind(now, form.id).run()\n\n // Dual-write: create content item for this submission\n let contentId: string | null = null\n try {\n contentId = await createContentFromSubmission(\n db,\n sanitizedData as Record,\n { id: form.id as string, name: form.name as string, display_name: form.display_name as string },\n submissionId,\n {\n ipAddress: c.req.header('cf-connecting-ip') || null,\n userAgent: c.req.header('user-agent') || null,\n userEmail: (sanitizedData as any)?.email || null,\n userId: null // anonymous submission\n }\n )\n if (!contentId) {\n console.warn('[FormSubmit] Content creation returned null for submission:', submissionId)\n }\n } catch (contentError) {\n // Don't fail the submission if content creation fails\n console.error('[FormSubmit] Error creating content from submission:', contentError)\n }\n\n return c.json({\n success: true,\n submissionId,\n contentId,\n message: 'Form submitted successfully'\n })\n } catch (error: any) {\n console.error('Error submitting form:', error)\n return c.json({ error: 'Failed to submit form' }, 500)\n }\n})\n\nexport default publicFormsRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { CATEGORY_INFO } from '../../services/route-metadata'\n\nexport interface APIEndpoint {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented?: boolean\n}\n\nexport interface APIReferencePageData {\n endpoints: APIEndpoint[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nfunction renderAuthBadge(auth: boolean | 'unknown'): string {\n if (auth === true) {\n return `\n \n \n \n \n Auth\n `\n }\n if (auth === false) {\n return `\n \n \n \n \n Public\n `\n }\n // unknown\n return `\n \n \n \n \n Unknown\n `\n}\n\nexport function renderAPIReferencePage(data: APIReferencePageData): string {\n // Group endpoints by category\n const endpointsByCategory = data.endpoints.reduce((acc, endpoint) => {\n if (!acc[endpoint.category]) {\n acc[endpoint.category] = []\n }\n acc[endpoint.category]!.push(endpoint)\n return acc\n }, {} as Record)\n\n // Get unique categories from actual data\n const categories = Object.keys(endpointsByCategory)\n\n // Count stats\n const totalEndpoints = data.endpoints.length\n const publicEndpoints = data.endpoints.filter(e => e.authentication === false).length\n const protectedEndpoints = data.endpoints.filter(e => e.authentication === true).length\n const undocumentedCount = data.endpoints.filter(e => e.documented === false).length\n\n const pageContent = `\n
\n \n
\n
\n

API Reference

\n

Auto-discovered documentation of all registered API endpoints

\n
\n \n
\n\n \n
\n
\n
Total Endpoints
\n
\n ${totalEndpoints}\n
\n
\n
\n
Public Endpoints
\n
\n ${publicEndpoints}\n
\n
\n
\n
Protected Endpoints
\n
\n ${protectedEndpoints}\n
\n
\n
\n
Categories
\n
\n ${categories.length}\n
\n
\n
\n
Undocumented
\n
\n 0 ? 'text-zinc-400 dark:text-zinc-500' : 'text-lime-600 dark:text-lime-400'}\">${undocumentedCount}\n
\n
\n
\n\n \n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n \n \n ${categories.map(category => {\n const info = CATEGORY_INFO[category]\n const title = info ? info.title : category\n return ``\n }).join('\\n ')}\n \n \n \n \n
\n
\n
\n
\n
\n\n \n
\n ${Object.entries(endpointsByCategory).map(([category, endpoints]) => {\n const info = CATEGORY_INFO[category] || { title: category, description: '', icon: '📋' }\n return `\n
\n
\n \n
\n
\n ${info.icon}\n
\n

${info.title}

\n

${info.description}

\n
\n
\n \n ${endpoints.length} endpoint${endpoints.length !== 1 ? 's' : ''}\n \n
\n
\n
\n\n \n
\n ${endpoints.map(endpoint => `\n
\n
\n \n ${endpoint.method}\n \n
\n
\n ${endpoint.path}\n ${renderAuthBadge(endpoint.authentication)}\n ${endpoint.documented === false ? `\n \n Auto-discovered\n \n ` : ''}\n
\n

${endpoint.description || 'No description available'}

\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n }).join('')}\n
\n\n \n
\n \n \n \n

No endpoints found

\n

Try adjusting your search or filter criteria

\n
\n
\n\n \n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'API Reference',\n pageTitle: 'API Reference',\n currentPath: '/admin/api-reference',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","/**\n * Admin API Reference Routes\n *\n * Provides the API Reference page for the admin dashboard.\n * Uses auto-discovery via Hono's inspectRoutes() to always show\n * the complete list of registered API endpoints.\n */\n\nimport { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderAPIReferencePage,\n type APIReferencePageData\n} from '../templates/pages/admin-api-reference.template'\nimport { getCoreVersion } from '../utils/version'\nimport { buildRouteList, getAppInstance } from '../services/route-metadata'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin/api-reference - API Reference Page\n *\n * Auto-discovers all registered routes using Hono's inspectRoutes()\n * and enriches them with metadata from the route-metadata registry.\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const app = getAppInstance()\n const endpoints = buildRouteList(app)\n\n const pageData: APIReferencePageData = {\n endpoints,\n user: user ? {\n name: user.email.split('@')[0] || user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n } catch (error) {\n console.error('API Reference page error:', error)\n\n const pageData: APIReferencePageData = {\n endpoints: [],\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n }\n})\n\nexport { router as adminApiReferenceRoutes }\n","/**\n * Routes Module Exports\n *\n * Routes are being migrated incrementally from the monolith.\n * Each route is refactored to remove monolith-specific dependencies.\n */\n\n// API routes\nexport { default as apiRoutes } from './api'\nexport { default as apiContentCrudRoutes } from './api-content-crud'\nexport { default as apiMediaRoutes } from './api-media'\nexport { default as apiSystemRoutes } from './api-system'\nexport { default as adminApiRoutes } from './admin-api'\n\n// Auth routes\nexport { default as authRoutes } from './auth'\n\n// Test routes (only for development/test environments)\nexport { default as testCleanupRoutes } from './test-cleanup'\n\n// Admin UI routes\nexport { default as adminContentRoutes } from './admin-content'\nexport { userRoutes as adminUsersRoutes } from './admin-users'\nexport { adminMediaRoutes } from './admin-media'\nexport { adminPluginRoutes } from './admin-plugins'\nexport { adminLogsRoutes } from './admin-logs'\nexport { adminDesignRoutes } from './admin-design'\nexport { adminCheckboxRoutes } from './admin-checkboxes'\nexport { default as adminTestimonialsRoutes } from './admin-testimonials'\nexport { default as adminCodeExamplesRoutes } from './admin-code-examples'\nexport { adminDashboardRoutes } from './admin-dashboard'\nexport { adminCollectionsRoutes } from './admin-collections'\nexport { adminSettingsRoutes } from './admin-settings'\nexport { adminFormsRoutes } from './admin-forms'\nexport { default as publicFormsRoutes } from './public-forms'\nexport { adminApiReferenceRoutes } from './admin-api-reference'\n\nexport const ROUTES_INFO = {\n message: 'Core routes available',\n available: [\n 'apiRoutes',\n 'apiContentCrudRoutes',\n 'apiMediaRoutes',\n 'apiSystemRoutes',\n 'adminApiRoutes',\n 'authRoutes',\n 'testCleanupRoutes',\n 'adminContentRoutes',\n 'adminUsersRoutes',\n 'adminMediaRoutes',\n 'adminPluginRoutes',\n 'adminLogsRoutes',\n 'adminDesignRoutes',\n 'adminCheckboxRoutes',\n 'adminTestimonialsRoutes',\n 'adminCodeExamplesRoutes',\n 'adminDashboardRoutes',\n 'adminCollectionsRoutes',\n 'adminSettingsRoutes',\n 'adminFormsRoutes',\n 'publicFormsRoutes',\n 'adminApiReferenceRoutes'\n ],\n status: 'Core package routes ready',\n reference: 'https://github.com/sonicjs/sonicjs'\n} as const\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-NJVY2U43.js b/packages/core/dist/chunk-CJOLOONT.js similarity index 99% rename from packages/core/dist/chunk-NJVY2U43.js rename to packages/core/dist/chunk-CJOLOONT.js index ba08251a6..7d0024289 100644 --- a/packages/core/dist/chunk-NJVY2U43.js +++ b/packages/core/dist/chunk-CJOLOONT.js @@ -1779,5 +1779,5 @@ var PluginBootstrapService = class { }; export { PLUGIN_REGISTRY, PluginBootstrapService, PluginService, backfillFormSubmissions, cleanupRemovedCollections, createContentFromSubmission, deriveCollectionSchemaFromFormio, deriveSubmissionTitle, findPluginByCodeName, fullCollectionSync, getAvailableCollectionNames, getManagedCollections, isCollectionManaged, loadCollectionConfig, loadCollectionConfigs, mapFormStatusToContentStatus, registerCollections, syncAllFormCollections, syncCollection, syncCollections, syncFormCollection, validateCollectionConfig }; -//# sourceMappingURL=chunk-NJVY2U43.js.map -//# sourceMappingURL=chunk-NJVY2U43.js.map \ No newline at end of file +//# sourceMappingURL=chunk-CJOLOONT.js.map +//# sourceMappingURL=chunk-CJOLOONT.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-NJVY2U43.js.map b/packages/core/dist/chunk-CJOLOONT.js.map similarity index 99% rename from packages/core/dist/chunk-NJVY2U43.js.map rename to packages/core/dist/chunk-CJOLOONT.js.map index 3a4771fdf..0c8d4b6fb 100644 --- a/packages/core/dist/chunk-NJVY2U43.js.map +++ b/packages/core/dist/chunk-CJOLOONT.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/services/collection-loader.ts","../src/services/collection-sync.ts","../src/services/form-collection-sync.ts","../src/services/plugin-service.ts","../src/plugins/manifest-registry.ts","../src/services/plugin-bootstrap.ts"],"names":[],"mappings":"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","file":"chunk-NJVY2U43.js","sourcesContent":["/**\n * Collection Loader Service\n *\n * Loads collection configuration files from the collections directory.\n * Supports both development (reading from filesystem) and production (bundled).\n */\n\nimport { CollectionConfig, CollectionConfigModule } from '../types/collection-config'\n\n// Global registry for externally registered collections\nconst registeredCollections: CollectionConfig[] = []\n\n/**\n * Register collections from the application code\n * This should be called before creating the app\n */\nexport function registerCollections(collections: CollectionConfig[]): void {\n for (const config of collections) {\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config: missing required fields`, config)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n registeredCollections.push(normalizedConfig)\n console.log(`✓ Registered collection: ${config.name}`)\n }\n}\n\n/**\n * Load all collection configurations from the collections directory\n */\nexport async function loadCollectionConfigs(): Promise {\n const collections: CollectionConfig[] = [...registeredCollections]\n\n // Log registered collections summary\n if (registeredCollections.length > 0) {\n console.log(`📦 Found ${registeredCollections.length} registered collection(s) from application`)\n } else {\n console.log(`⚠️ No collections registered. Make sure to call registerCollections() in your app's index.ts`)\n console.log(` Example: import myCollection from './collections/my-collection.collection'`)\n console.log(` registerCollections([myCollection])`)\n }\n\n try {\n // Import all collection files dynamically from core package\n // In production, these will be bundled with the application\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts', { eager: true }) || {}\n let coreCollectionCount = 0\n\n for (const [path, module] of Object.entries(modules)) {\n try {\n const configModule = module as CollectionConfigModule\n\n if (!configModule.default) {\n console.warn(`Collection file ${path} does not export a default config`)\n continue\n }\n\n const config = configModule.default\n\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config in ${path}: missing required fields`)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n collections.push(normalizedConfig)\n coreCollectionCount++\n console.log(`✓ Loaded core collection: ${config.name}`)\n } catch (error) {\n console.error(`Error loading collection from ${path}:`, error)\n }\n }\n\n console.log(`📊 Collection summary: ${collections.length} total (${registeredCollections.length} from app, ${coreCollectionCount} from core)`)\n return collections\n } catch (error) {\n console.error('Error loading collection configurations:', error)\n return collections // Return registered collections even if core loading fails\n }\n}\n\n/**\n * Load a specific collection configuration by name\n * Note: This function requires implementation in the consuming application\n * as it depends on project-specific collection files\n */\nexport async function loadCollectionConfig(name: string): Promise {\n try {\n // Dynamic imports are not supported in library builds\n // This should be implemented in the consuming application\n console.warn('loadCollectionConfig requires implementation in consuming application')\n return null\n } catch (error) {\n console.error(`Error loading collection ${name}:`, error)\n return null\n }\n}\n\n/**\n * Get list of all available collection config file names\n */\nexport async function getAvailableCollectionNames(): Promise {\n try {\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts') || {}\n const names: string[] = []\n\n for (const path of Object.keys(modules)) {\n // Extract collection name from path\n // e.g., '../collections/blog-posts.collection.ts' -> 'blog-posts'\n const match = path.match(/\\/([^/]+)\\.collection\\.ts$/)\n if (match && match[1]) {\n names.push(match[1])\n }\n }\n\n return names\n } catch (error) {\n console.error('Error getting collection names:', error)\n return []\n }\n}\n\n/**\n * Validate a collection configuration\n */\nexport function validateCollectionConfig(config: CollectionConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push('Collection name is required')\n } else if (!/^[a-z0-9_-]+$/.test(config.name)) {\n errors.push('Collection name must contain only lowercase letters, numbers, underscores, and hyphens')\n }\n\n if (!config.displayName) {\n errors.push('Display name is required')\n }\n\n if (!config.schema) {\n errors.push('Schema is required')\n } else {\n // Validate schema structure\n if (config.schema.type !== 'object') {\n errors.push('Schema type must be \"object\"')\n }\n\n if (!config.schema.properties || typeof config.schema.properties !== 'object') {\n errors.push('Schema must have properties')\n }\n\n // Validate field types\n for (const [fieldName, fieldConfig] of Object.entries(config.schema.properties || {})) {\n if (!fieldConfig.type) {\n errors.push(`Field \"${fieldName}\" is missing type`)\n }\n\n // Validate reference fields\n if (fieldConfig.type === 'reference' && !fieldConfig.collection) {\n errors.push(`Reference field \"${fieldName}\" is missing collection property`)\n }\n\n const layoutValue = fieldConfig.objectLayout\n if (layoutValue !== undefined) {\n if (fieldConfig.type !== 'object') {\n errors.push(`Field \"${fieldName}\" uses objectLayout but is not an object field`)\n } else if (!['nested', 'flat'].includes(layoutValue)) {\n errors.push(`Object field \"${fieldName}\" has invalid objectLayout. Use \"nested\" or \"flat\"`)\n }\n }\n\n // Validate select fields\n if (['select', 'multiselect', 'radio'].includes(fieldConfig.type) && !fieldConfig.enum) {\n errors.push(`Select field \"${fieldName}\" is missing enum options`)\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n}\n","/**\n * Collection Sync Service\n *\n * Syncs collection configurations from code to the database.\n * Handles create, update, and validation of config-managed collections.\n */\n\nimport { CollectionConfig, CollectionSyncResult } from '../types/collection-config'\nimport { loadCollectionConfigs, validateCollectionConfig } from './collection-loader'\n\n/**\n * Sync all collection configurations to the database\n */\nexport async function syncCollections(db: D1Database): Promise {\n console.log('🔄 Starting collection sync...')\n\n const results: CollectionSyncResult[] = []\n const configs = await loadCollectionConfigs()\n\n if (configs.length === 0) {\n console.log('⚠️ No collection configurations found')\n return results\n }\n\n for (const config of configs) {\n const result = await syncCollection(db, config)\n results.push(result)\n }\n\n const created = results.filter(r => r.status === 'created').length\n const updated = results.filter(r => r.status === 'updated').length\n const unchanged = results.filter(r => r.status === 'unchanged').length\n const errors = results.filter(r => r.status === 'error').length\n\n console.log(`✅ Collection sync complete: ${created} created, ${updated} updated, ${unchanged} unchanged, ${errors} errors`)\n\n return results\n}\n\n/**\n * Sync a single collection configuration to the database\n */\nexport async function syncCollection(db: D1Database, config: CollectionConfig): Promise {\n try {\n // Validate config\n const validation = validateCollectionConfig(config)\n if (!validation.valid) {\n return {\n name: config.name,\n status: 'error',\n error: `Validation failed: ${validation.errors.join(', ')}`\n }\n }\n\n // Check if collection exists\n const existingStmt = db.prepare('SELECT * FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(config.name).first() as any\n\n const now = Date.now()\n const collectionId = existing?.id || `col-${config.name}-${crypto.randomUUID().slice(0, 8)}`\n\n // Prepare collection data\n const schemaJson = JSON.stringify(config.schema)\n const isActive = config.isActive !== false ? 1 : 0\n const managed = config.managed !== false ? 1 : 0\n\n if (!existing) {\n // Create new collection\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n config.name,\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n now\n ).run()\n\n console.log(` ✓ Created collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'created',\n message: `Created collection \"${config.displayName}\"`\n }\n } else {\n // Check if update is needed\n const existingSchema = existing.schema ? JSON.stringify(existing.schema) : '{}'\n const existingDisplayName = existing.display_name\n const existingDescription = existing.description\n const existingIsActive = existing.is_active\n const existingManaged = existing.managed\n\n const needsUpdate =\n schemaJson !== existingSchema ||\n config.displayName !== existingDisplayName ||\n (config.description || null) !== existingDescription ||\n isActive !== existingIsActive ||\n managed !== existingManaged\n\n if (!needsUpdate) {\n return {\n name: config.name,\n status: 'unchanged',\n message: `Collection \"${config.displayName}\" is up to date`\n }\n }\n\n // Update existing collection\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, schema = ?, is_active = ?, managed = ?, updated_at = ?\n WHERE name = ?\n `)\n\n await updateStmt.bind(\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n config.name\n ).run()\n\n console.log(` ✓ Updated collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'updated',\n message: `Updated collection \"${config.displayName}\"`\n }\n }\n } catch (error) {\n console.error(` ✗ Error syncing collection ${config.name}:`, error)\n\n return {\n name: config.name,\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n}\n\n/**\n * Check if a collection is managed by config\n */\nexport async function isCollectionManaged(db: D1Database, collectionName: string): Promise {\n try {\n const stmt = db.prepare('SELECT managed FROM collections WHERE name = ?')\n const result = await stmt.bind(collectionName).first() as any\n\n return result?.managed === 1\n } catch (error) {\n console.error(`Error checking if collection is managed:`, error)\n return false\n }\n}\n\n/**\n * Get all managed collections from database\n */\nexport async function getManagedCollections(db: D1Database): Promise {\n try {\n const stmt = db.prepare('SELECT name FROM collections WHERE managed = 1')\n const { results } = await stmt.all()\n\n return (results || []).map((row: any) => row.name)\n } catch (error) {\n console.error('Error getting managed collections:', error)\n return []\n }\n}\n\n/**\n * Remove collections that are no longer in config files\n * (Only removes managed collections that aren't in the config)\n */\nexport async function cleanupRemovedCollections(db: D1Database): Promise {\n try {\n const configs = await loadCollectionConfigs()\n const configNames = new Set(configs.map(c => c.name))\n const managedCollections = await getManagedCollections(db)\n const removed: string[] = []\n\n for (const managedName of managedCollections) {\n if (!configNames.has(managedName)) {\n // This managed collection no longer has a config file\n // Mark as inactive instead of deleting (safer)\n const updateStmt = db.prepare(`\n UPDATE collections\n SET is_active = 0, updated_at = ?\n WHERE name = ? AND managed = 1\n `)\n\n await updateStmt.bind(Date.now(), managedName).run()\n removed.push(managedName)\n console.log(` ⚠️ Deactivated removed collection: ${managedName}`)\n }\n }\n\n return removed\n } catch (error) {\n console.error('Error cleaning up removed collections:', error)\n return []\n }\n}\n\n/**\n * Full sync: sync all configs and cleanup removed\n */\nexport async function fullCollectionSync(db: D1Database): Promise<{\n results: CollectionSyncResult[]\n removed: string[]\n}> {\n const results = await syncCollections(db)\n const removed = await cleanupRemovedCollections(db)\n\n return { results, removed }\n}\n","/**\n * Form-Collection Sync Service\n *\n * Bridge logic that creates \"shadow collections\" for forms and\n * dual-writes form submissions to the content table, enabling\n * unified content management for form submissions.\n */\n\nconst SYSTEM_FORM_USER_ID = 'system-form-submission'\n\n/**\n * Convert Form.io component type to collection schema field type\n */\nfunction mapFormioTypeToSchemaType(component: any): { type: string; [key: string]: any } {\n switch (component.type) {\n case 'textfield':\n case 'textarea':\n case 'password':\n case 'phoneNumber':\n case 'url':\n return { type: 'string', title: component.label || component.key }\n case 'email':\n return { type: 'string', format: 'email', title: component.label || component.key }\n case 'number':\n case 'currency':\n return { type: 'number', title: component.label || component.key }\n case 'checkbox':\n return { type: 'boolean', title: component.label || component.key }\n case 'select':\n case 'radio': {\n const enumValues = (component.data?.values || component.values || []).map((v: any) => v.value)\n const enumLabels = (component.data?.values || component.values || []).map((v: any) => v.label)\n return {\n type: 'select',\n title: component.label || component.key,\n enum: enumValues,\n enumLabels\n }\n }\n case 'selectboxes':\n return { type: 'object', title: component.label || component.key }\n case 'datetime':\n case 'day':\n case 'time':\n return { type: 'string', format: 'date-time', title: component.label || component.key }\n case 'file':\n case 'signature':\n return { type: 'string', title: component.label || component.key }\n case 'address':\n return { type: 'object', title: component.label || component.key }\n case 'hidden':\n return { type: 'string', title: component.label || component.key }\n default:\n return { type: 'string', title: component.label || component.key }\n }\n}\n\n/**\n * Recursively extract field components from a Form.io schema,\n * skipping layout-only components (panels, columns, fieldsets, etc.)\n */\nfunction extractFieldComponents(components: any[]): any[] {\n const fields: any[] = []\n if (!components) return fields\n\n for (const comp of components) {\n // Layout components — recurse into children\n if (comp.type === 'panel' || comp.type === 'fieldset' || comp.type === 'well' || comp.type === 'tabs') {\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n continue\n }\n if (comp.type === 'columns' && comp.columns) {\n for (const col of comp.columns) {\n if (col.components) {\n fields.push(...extractFieldComponents(col.components))\n }\n }\n continue\n }\n if (comp.type === 'table' && comp.rows) {\n for (const row of comp.rows) {\n if (Array.isArray(row)) {\n for (const cell of row) {\n if (cell.components) {\n fields.push(...extractFieldComponents(cell.components))\n }\n }\n }\n }\n continue\n }\n // Skip buttons and non-input layout elements\n if (comp.type === 'button' || comp.type === 'htmlelement' || comp.type === 'content') {\n continue\n }\n // Skip turnstile (not data)\n if (comp.type === 'turnstile') {\n continue\n }\n // It's a real field\n if (comp.key) {\n fields.push(comp)\n }\n // Recurse into sub-components for containers\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n }\n return fields\n}\n\n/**\n * Convert a Form.io schema into a collection JSON schema definition\n */\nexport function deriveCollectionSchemaFromFormio(formioSchema: any): any {\n const components = formioSchema?.components || []\n const fieldComponents = extractFieldComponents(components)\n\n const properties: Record = {\n // Always include a title field for the content item\n title: { type: 'string', title: 'Title', required: true }\n }\n const required: string[] = ['title']\n\n for (const comp of fieldComponents) {\n const key = comp.key\n if (!key || key === 'submit' || key === 'title') continue\n const fieldDef = mapFormioTypeToSchemaType(comp)\n if (comp.validate?.required) {\n fieldDef.required = true\n required.push(key)\n }\n properties[key] = fieldDef\n }\n\n return { type: 'object', properties, required }\n}\n\n/**\n * Derive a human-readable title from form submission data\n */\nexport function deriveSubmissionTitle(data: Record, formDisplayName: string): string {\n // Try common fields in order of preference\n const candidates = ['name', 'fullName', 'full_name', 'firstName', 'first_name']\n for (const key of candidates) {\n if (data[key] && typeof data[key] === 'string' && data[key].trim()) {\n // Append last name if available\n if (key === 'firstName' || key === 'first_name') {\n const last = data['lastName'] || data['last_name'] || data['lastname'] || ''\n if (last) return `${data[key].trim()} ${last.trim()}`\n }\n return data[key].trim()\n }\n }\n // Try email\n if (data.email && typeof data.email === 'string' && data.email.trim()) {\n return data.email.trim()\n }\n // Try subject\n if (data.subject && typeof data.subject === 'string' && data.subject.trim()) {\n return data.subject.trim()\n }\n // Fallback\n const dateStr = new Date().toLocaleDateString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })\n return `${formDisplayName} - ${dateStr}`\n}\n\n/**\n * Map form submission status to content status.\n * Form submissions are complete data — they default to 'published'.\n * Only rejected/spam submissions get demoted.\n */\nexport function mapFormStatusToContentStatus(formStatus: string): string {\n switch (formStatus) {\n case 'pending': return 'published'\n case 'reviewed': return 'published'\n case 'approved': return 'published'\n case 'rejected': return 'archived'\n case 'spam': return 'deleted'\n default: return 'published'\n }\n}\n\n/**\n * Create or update a shadow collection for a given form\n */\nexport async function syncFormCollection(db: D1Database, form: {\n id: string\n name: string\n display_name: string\n description?: string | null\n formio_schema: any\n is_active: number | boolean\n}): Promise<{ collectionId: string; status: 'created' | 'updated' | 'unchanged' }> {\n const collectionName = `form_${form.name}`\n const displayName = `${form.display_name} (Form)`\n\n // Parse formio_schema\n const formioSchema = typeof form.formio_schema === 'string'\n ? JSON.parse(form.formio_schema)\n : form.formio_schema\n\n const schema = deriveCollectionSchemaFromFormio(formioSchema)\n const schemaJson = JSON.stringify(schema)\n const now = Date.now()\n const isActive = form.is_active ? 1 : 0\n\n // Check if shadow collection already exists\n const existing = await db.prepare(\n 'SELECT id, schema, display_name, description, is_active FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!existing) {\n // Create new shadow collection\n const collectionId = `col-form-${form.name}-${crypto.randomUUID().slice(0, 8)}`\n\n await db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, source_type, source_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, 1, 'form', ?, ?, ?)\n `).bind(\n collectionId,\n collectionName,\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n form.id,\n now,\n now\n ).run()\n\n console.log(`[FormSync] Created shadow collection: ${collectionName}`)\n return { collectionId, status: 'created' }\n }\n\n // Check if update needed\n const existingSchema = existing.schema ? JSON.stringify(typeof existing.schema === 'string' ? JSON.parse(existing.schema) : existing.schema) : '{}'\n const needsUpdate =\n schemaJson !== existingSchema ||\n displayName !== existing.display_name ||\n (form.description || null) !== existing.description ||\n isActive !== existing.is_active\n\n if (!needsUpdate) {\n return { collectionId: existing.id, status: 'unchanged' }\n }\n\n await db.prepare(`\n UPDATE collections SET display_name = ?, description = ?, schema = ?, is_active = ?, updated_at = ?\n WHERE id = ?\n `).bind(\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n now,\n existing.id\n ).run()\n\n console.log(`[FormSync] Updated shadow collection: ${collectionName}`)\n return { collectionId: existing.id, status: 'updated' }\n}\n\n/**\n * Sync all active forms to shadow collections\n */\nexport async function syncAllFormCollections(db: D1Database): Promise {\n try {\n // Check if forms table exists\n const tableCheck = await db.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='forms'\"\n ).first()\n if (!tableCheck) {\n console.log('[FormSync] Forms table does not exist, skipping form sync')\n return\n }\n\n const { results: forms } = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms'\n ).all()\n\n if (!forms || forms.length === 0) {\n console.log('[FormSync] No forms found, skipping')\n return\n }\n\n let created = 0\n let updated = 0\n\n for (const form of forms) {\n try {\n const result = await syncFormCollection(db, form as any)\n if (result.status === 'created') created++\n if (result.status === 'updated') updated++\n\n // Backfill existing submissions that don't have content_id\n await backfillFormSubmissions(db, form.id as string, result.collectionId)\n } catch (error) {\n console.error(`[FormSync] Error syncing form ${form.name}:`, error)\n }\n }\n\n console.log(`[FormSync] Sync complete: ${created} created, ${updated} updated out of ${forms.length} forms`)\n } catch (error) {\n console.error('[FormSync] Error syncing form collections:', error)\n }\n}\n\n/**\n * Create a content item from a form submission\n */\nexport async function createContentFromSubmission(\n db: D1Database,\n submissionData: Record,\n form: { id: string; name: string; display_name: string },\n submissionId: string,\n metadata: {\n ipAddress?: string | null\n userAgent?: string | null\n userEmail?: string | null\n userId?: string | null\n } = {}\n): Promise {\n try {\n // Find the shadow collection\n let collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!collection) {\n // Shadow collection missing — try to create it on the fly\n console.warn(`[FormSync] No shadow collection found for form ${form.name}, attempting to create...`)\n try {\n const fullForm = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms WHERE id = ?'\n ).bind(form.id).first() as any\n\n if (fullForm) {\n const schema = typeof fullForm.formio_schema === 'string'\n ? JSON.parse(fullForm.formio_schema)\n : fullForm.formio_schema\n const result = await syncFormCollection(db, {\n id: fullForm.id,\n name: fullForm.name,\n display_name: fullForm.display_name,\n description: fullForm.description,\n formio_schema: schema,\n is_active: fullForm.is_active ?? 1\n })\n // Re-query the collection\n collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n console.log(`[FormSync] On-the-fly sync result: ${result.status}, collectionId: ${result.collectionId}`)\n }\n } catch (syncErr) {\n console.error('[FormSync] On-the-fly shadow collection creation failed:', syncErr)\n }\n\n if (!collection) {\n console.error(`[FormSync] Still no shadow collection for form ${form.name} after recovery attempt`)\n return null\n }\n }\n\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const title = deriveSubmissionTitle(submissionData, form.display_name)\n const slug = `submission-${submissionId.slice(0, 8)}`\n\n // Build content data with embedded metadata\n const contentData: Record = {\n title,\n ...submissionData,\n _submission_metadata: {\n submissionId,\n formId: form.id,\n formName: form.name,\n email: metadata.userEmail || submissionData.email || null,\n ipAddress: metadata.ipAddress || null,\n userAgent: metadata.userAgent || null,\n submittedAt: now\n }\n }\n\n const authorId = metadata.userId || SYSTEM_FORM_USER_ID\n\n // Ensure the system user exists (D1 enforces foreign keys)\n if (authorId === SYSTEM_FORM_USER_ID) {\n const systemUser = await db.prepare('SELECT id FROM users WHERE id = ?').bind(SYSTEM_FORM_USER_ID).first()\n if (!systemUser) {\n console.log('[FormSync] System form user missing, creating...')\n const sysNow = Date.now()\n await db.prepare(`\n INSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 0, ?, ?)\n `).bind(SYSTEM_FORM_USER_ID, 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', sysNow, sysNow).run()\n }\n }\n\n console.log(`[FormSync] Inserting content: id=${contentId}, collection=${collection.id}, slug=${slug}, title=${title}, author=${authorId}`)\n\n await db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, 'published', ?, ?, ?)\n `).bind(\n contentId,\n collection.id,\n slug,\n title,\n JSON.stringify(contentData),\n authorId,\n now,\n now\n ).run()\n\n // Link submission to content\n await db.prepare(\n 'UPDATE form_submissions SET content_id = ? WHERE id = ?'\n ).bind(contentId, submissionId).run()\n\n console.log(`[FormSync] Content created successfully: ${contentId}`)\n return contentId\n } catch (error) {\n console.error('[FormSync] Error creating content from submission:', error)\n return null\n }\n}\n\n/**\n * Backfill existing form submissions that don't have a content_id\n */\nexport async function backfillFormSubmissions(\n db: D1Database,\n formId: string,\n collectionId: string\n): Promise {\n try {\n const { results: submissions } = await db.prepare(\n 'SELECT id, submission_data, user_email, ip_address, user_agent, user_id, submitted_at FROM form_submissions WHERE form_id = ? AND content_id IS NULL'\n ).bind(formId).all()\n\n if (!submissions || submissions.length === 0) {\n return 0\n }\n\n // Get form info\n const form = await db.prepare(\n 'SELECT id, name, display_name FROM forms WHERE id = ?'\n ).bind(formId).first() as any\n\n if (!form) return 0\n\n let count = 0\n for (const sub of submissions) {\n try {\n const submissionData = typeof sub.submission_data === 'string'\n ? JSON.parse(sub.submission_data as string)\n : sub.submission_data\n\n const contentId = await createContentFromSubmission(\n db,\n submissionData,\n { id: form.id, name: form.name, display_name: form.display_name },\n sub.id as string,\n {\n ipAddress: sub.ip_address as string | null,\n userAgent: sub.user_agent as string | null,\n userEmail: sub.user_email as string | null,\n userId: sub.user_id as string | null\n }\n )\n if (contentId) count++\n } catch (error) {\n console.error(`[FormSync] Error backfilling submission ${sub.id}:`, error)\n }\n }\n\n if (count > 0) {\n console.log(`[FormSync] Backfilled ${count} submissions for form ${formId}`)\n }\n return count\n } catch (error) {\n console.error('[FormSync] Error backfilling submissions:', error)\n return 0\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\n// Note: PLUGIN_REGISTRY and CORE_PLUGIN_IDS are project-specific\n// They should be passed as parameters to the service in the consuming application\n// import { PLUGIN_REGISTRY, CORE_PLUGIN_IDS } from '../plugins/plugin-registry'\n\nexport interface PluginData {\n id: string\n name: string\n display_name: string\n description: string\n version: string\n author: string\n category: string\n icon: string\n status: 'active' | 'inactive' | 'error'\n is_core: boolean\n settings?: any\n permissions?: string[]\n dependencies?: string[]\n download_count: number\n rating: number\n installed_at: number\n activated_at?: number\n last_updated: number\n error_message?: string\n}\n\nexport interface PluginStats {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n}\n\nexport class PluginService {\n constructor(private db: D1Database) {}\n\n async getAllPlugins(): Promise {\n // Ensure all plugins from registry exist in database (auto-install if missing)\n await this.ensureAllPluginsExist()\n\n const stmt = this.db.prepare(`\n SELECT * FROM plugins\n ORDER BY is_core DESC, display_name ASC\n `)\n\n const { results } = await stmt.all()\n return (results || []).map(this.mapPluginFromDb)\n }\n\n /**\n * Ensure all plugins from the registry exist in the database\n * Auto-installs any newly detected plugins with inactive status\n *\n * Note: This method should be overridden or configured with a plugin registry\n * in the consuming application\n */\n private async ensureAllPluginsExist(): Promise {\n // This functionality requires a project-specific PLUGIN_REGISTRY\n // In the consuming application, you should pass the registry to this service\n console.log('[PluginService] ensureAllPluginsExist - requires PLUGIN_REGISTRY configuration')\n }\n\n async getPlugin(pluginId: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE id = ?')\n const plugin = await stmt.bind(pluginId).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginByName(name: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE name = ?')\n const plugin = await stmt.bind(name).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginStats(): Promise {\n const stmt = this.db.prepare(`\n SELECT \n COUNT(*) as total,\n COUNT(CASE WHEN status = 'active' THEN 1 END) as active,\n COUNT(CASE WHEN status = 'inactive' THEN 1 END) as inactive,\n COUNT(CASE WHEN status = 'error' THEN 1 END) as errors\n FROM plugins\n `)\n \n const stats = await stmt.first() as any\n return {\n total: stats.total || 0,\n active: stats.active || 0,\n inactive: stats.inactive || 0,\n errors: stats.errors || 0,\n uninstalled: 0\n }\n }\n\n async installPlugin(pluginData: Partial): Promise {\n const id = pluginData.id || `plugin-${Date.now()}`\n const now = Math.floor(Date.now() / 1000)\n \n const stmt = this.db.prepare(`\n INSERT INTO plugins (\n id, name, display_name, description, version, author, category, icon,\n status, is_core, settings, permissions, dependencies, download_count, \n rating, installed_at, last_updated\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginData.name || id,\n pluginData.display_name || 'Unnamed Plugin',\n pluginData.description || '',\n pluginData.version || '1.0.0',\n pluginData.author || 'Unknown',\n pluginData.category || 'utilities',\n pluginData.icon || '🔌',\n 'inactive',\n pluginData.is_core || false,\n JSON.stringify(pluginData.settings || {}),\n JSON.stringify(pluginData.permissions || []),\n JSON.stringify(pluginData.dependencies || []),\n pluginData.download_count || 0,\n pluginData.rating || 0,\n now,\n now\n ).run()\n \n // Log the installation\n await this.logActivity(id, 'installed', null, { version: pluginData.version })\n \n const installed = await this.getPlugin(id)\n if (!installed) throw new Error('Failed to install plugin')\n \n return installed\n }\n\n async uninstallPlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n if (plugin.is_core) throw new Error('Cannot uninstall core plugins')\n \n // First deactivate if active\n if (plugin.status === 'active') {\n await this.deactivatePlugin(pluginId)\n }\n \n // Delete the plugin\n const stmt = this.db.prepare('DELETE FROM plugins WHERE id = ?')\n await stmt.bind(pluginId).run()\n \n // Log the uninstallation\n await this.logActivity(pluginId, 'uninstalled', null, { name: plugin.name })\n }\n\n async activatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check dependencies\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n await this.checkDependencies(plugin.dependencies)\n }\n \n const now = Math.floor(Date.now() / 1000)\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'active', activated_at = ?, error_message = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(now, pluginId).run()\n \n // Log the activation\n await this.logActivity(pluginId, 'activated', null)\n }\n\n async deactivatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check if other plugins depend on this one\n await this.checkDependents(plugin.name)\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'inactive', activated_at = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(pluginId).run()\n \n // Log the deactivation\n await this.logActivity(pluginId, 'deactivated', null)\n }\n\n async updatePluginSettings(pluginId: string, settings: any): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET settings = ?, updated_at = unixepoch() \n WHERE id = ?\n `)\n \n await stmt.bind(JSON.stringify(settings), pluginId).run()\n \n // Log the settings update\n await this.logActivity(pluginId, 'settings_updated', null)\n }\n\n async setPluginError(pluginId: string, error: string): Promise {\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'error', error_message = ? \n WHERE id = ?\n `)\n \n await stmt.bind(error, pluginId).run()\n \n // Log the error\n await this.logActivity(pluginId, 'error', null, { error })\n }\n\n async getPluginActivity(pluginId: string, limit: number = 10): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_activity_log \n WHERE plugin_id = ? \n ORDER BY timestamp DESC \n LIMIT ?\n `)\n \n const { results } = await stmt.bind(pluginId, limit).all()\n return (results || []).map((row: any) => ({\n id: row.id,\n action: row.action,\n userId: row.user_id,\n details: row.details ? JSON.parse(row.details) : null,\n timestamp: row.timestamp\n }))\n }\n\n async registerHook(pluginId: string, hookName: string, handlerName: string, priority: number = 10): Promise {\n const id = `hook-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_hooks (id, plugin_id, hook_name, handler_name, priority)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(id, pluginId, hookName, handlerName, priority).run()\n }\n\n async registerRoute(pluginId: string, path: string, method: string, handlerName: string, middleware?: any[]): Promise {\n const id = `route-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_routes (id, plugin_id, path, method, handler_name, middleware)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id, \n pluginId, \n path, \n method, \n handlerName, \n JSON.stringify(middleware || [])\n ).run()\n }\n\n async getPluginHooks(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_hooks \n WHERE plugin_id = ? AND is_active = TRUE\n ORDER BY priority ASC\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n async getPluginRoutes(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_routes \n WHERE plugin_id = ? AND is_active = TRUE\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n private async checkDependencies(dependencies: string[]): Promise {\n for (const dep of dependencies) {\n const plugin = await this.getPluginByName(dep)\n if (!plugin || plugin.status !== 'active') {\n throw new Error(`Required dependency '${dep}' is not active`)\n }\n }\n }\n\n private async checkDependents(pluginName: string): Promise {\n const stmt = this.db.prepare(`\n SELECT id, display_name FROM plugins \n WHERE status = 'active' \n AND dependencies LIKE ?\n `)\n \n const { results } = await stmt.bind(`%\"${pluginName}\"%`).all()\n if (results && results.length > 0) {\n const names = results.map((p: any) => p.display_name).join(', ')\n throw new Error(`Cannot deactivate. The following plugins depend on this one: ${names}`)\n }\n }\n\n private async logActivity(pluginId: string, action: string, userId: string | null, details?: any): Promise {\n const id = `activity-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_activity_log (id, plugin_id, action, user_id, details)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginId,\n action,\n userId,\n details ? JSON.stringify(details) : null\n ).run()\n }\n\n private mapPluginFromDb(row: any): PluginData {\n return {\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n version: row.version,\n author: row.author,\n category: row.category,\n icon: row.icon,\n status: row.status,\n is_core: row.is_core === 1,\n settings: row.settings ? JSON.parse(row.settings) : undefined,\n permissions: row.permissions ? JSON.parse(row.permissions) : undefined,\n dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,\n download_count: row.download_count || 0,\n rating: row.rating || 0,\n installed_at: row.installed_at,\n activated_at: row.activated_at,\n last_updated: row.last_updated,\n error_message: row.error_message\n }\n }\n}\n","/**\n * Plugin Registry - AUTO-GENERATED\n *\n * Generated by: packages/scripts/generate-plugin-registry.mjs\n * Generated at: 2026-05-16T15:00:20.475Z\n * Source: All manifest.json files in src/plugins/\n *\n * DO NOT EDIT MANUALLY - run the generator script instead.\n * To add a new plugin, create a manifest.json in the plugin directory.\n */\n\nexport interface PluginRegistryEntry {\n id: string\n codeName: string\n displayName: string\n description: string\n version: string\n author: string\n category: string\n iconEmoji: string\n is_core: boolean\n permissions: string[]\n dependencies: string[]\n defaultSettings: Record\n adminMenu: {\n label: string\n icon: string\n path: string\n order: number\n } | null\n}\n\n/**\n * All discovered plugins, keyed by plugin ID.\n */\nexport const PLUGIN_REGISTRY: Record = {\n 'ai-search': {\n \"id\": \"ai-search\",\n \"codeName\": \"ai-search-plugin\",\n \"displayName\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"path\": \"/admin/plugins/ai-search\",\n \"order\": 50\n }\n },\n\n 'code-examples-plugin': {\n \"id\": \"code-examples-plugin\",\n \"codeName\": \"code-examples-plugin\",\n \"displayName\": \"Code Examples\",\n \"description\": \"Code snippets and examples library with syntax highlighting and categorization\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💻\",\n \"is_core\": false,\n \"permissions\": [\n \"code-examples:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'core-analytics': {\n \"id\": \"core-analytics\",\n \"codeName\": \"core-analytics\",\n \"displayName\": \"Analytics & Insights\",\n \"description\": \"Core analytics system for tracking page views, user behavior, and content performance. Provides dashboards and reports with real-time metrics\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"seo\",\n \"iconEmoji\": \"📊\",\n \"is_core\": true,\n \"permissions\": [\n \"analytics:view\",\n \"analytics:export\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Analytics\",\n \"icon\": \"chart-bar\",\n \"path\": \"/admin/analytics\",\n \"order\": 50\n }\n },\n\n 'core-auth': {\n \"id\": \"core-auth\",\n \"codeName\": \"core-auth\",\n \"displayName\": \"Authentication System\",\n \"description\": \"Core authentication and user management system with role-based access control, session management, and security features\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔐\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:users\",\n \"manage:roles\",\n \"manage:permissions\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"requiredFields\": {\n \"email\": {\n \"required\": true,\n \"minLength\": 5,\n \"label\": \"Email\",\n \"type\": \"email\"\n },\n \"password\": {\n \"required\": true,\n \"minLength\": 8,\n \"label\": \"Password\",\n \"type\": \"password\"\n },\n \"username\": {\n \"required\": true,\n \"minLength\": 3,\n \"label\": \"Username\",\n \"type\": \"text\"\n },\n \"firstName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"First Name\",\n \"type\": \"text\"\n },\n \"lastName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"Last Name\",\n \"type\": \"text\"\n }\n },\n \"validation\": {\n \"emailFormat\": true,\n \"allowDuplicateUsernames\": false,\n \"passwordRequirements\": {\n \"requireUppercase\": false,\n \"requireLowercase\": false,\n \"requireNumbers\": false,\n \"requireSpecialChars\": false\n }\n },\n \"registration\": {\n \"enabled\": true,\n \"requireEmailVerification\": false,\n \"defaultRole\": \"viewer\"\n }\n },\n \"adminMenu\": null\n },\n\n 'core-cache': {\n \"id\": \"core-cache\",\n \"codeName\": \"core-cache\",\n \"displayName\": \"Cache System\",\n \"description\": \"Three-tiered caching system with in-memory and KV storage. Provides automatic caching for content, users, media, and API responses with configurable TTL and invalidation patterns.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"system\",\n \"iconEmoji\": \"⚡\",\n \"is_core\": true,\n \"permissions\": [\n \"cache.view\",\n \"cache.clear\",\n \"cache.invalidate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableMemoryCache\": true,\n \"enableKVCache\": true,\n \"enableDatabaseCache\": true,\n \"defaultTTL\": 3600\n },\n \"adminMenu\": null\n },\n\n 'core-media': {\n \"id\": \"core-media\",\n \"codeName\": \"core-media\",\n \"displayName\": \"Media Manager\",\n \"description\": \"Core media upload and management system with support for images, videos, and documents. Includes automatic optimization, thumbnail generation, and cloud storage integration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"media\",\n \"iconEmoji\": \"📸\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:media\",\n \"upload:files\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Media\",\n \"icon\": \"image\",\n \"path\": \"/admin/media\",\n \"order\": 30\n }\n },\n\n 'database-tools': {\n \"id\": \"database-tools\",\n \"codeName\": \"database-tools\",\n \"displayName\": \"Database Tools\",\n \"description\": \"Database management and administration tools including migrations, backups, and query execution\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🗄️\",\n \"is_core\": false,\n \"permissions\": [\n \"database:admin\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableTruncate\": true,\n \"enableBackup\": true,\n \"enableValidation\": true,\n \"requireConfirmation\": true\n },\n \"adminMenu\": null\n },\n\n 'demo-login-plugin': {\n \"id\": \"demo-login-plugin\",\n \"codeName\": \"demo-login-plugin\",\n \"displayName\": \"Demo Login\",\n \"description\": \"Quick demo login functionality for testing and demonstrations\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎯\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"core-auth\"\n ],\n \"defaultSettings\": {\n \"enableNotice\": true,\n \"demoEmail\": \"admin@sonicjs.com\",\n \"demoPassword\": \"sonicjs!\"\n },\n \"adminMenu\": null\n },\n\n 'design': {\n \"id\": \"design\",\n \"codeName\": \"design\",\n \"displayName\": \"Design System\",\n \"description\": \"Design system management including themes, components, and UI customization. Provides a visual interface for managing design tokens, typography, colors, and component library.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎨\",\n \"is_core\": false,\n \"permissions\": [\n \"design.view\",\n \"design.edit\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultTheme\": \"light\",\n \"customCSS\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Design\",\n \"icon\": \"palette\",\n \"path\": \"/admin/design\",\n \"order\": 80\n }\n },\n\n 'easy-mdx': {\n \"id\": \"easy-mdx\",\n \"codeName\": \"easy-mdx\",\n \"displayName\": \"EasyMDE Markdown Editor\",\n \"description\": \"Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultHeight\": 400,\n \"theme\": \"dark\",\n \"toolbar\": \"full\",\n \"placeholder\": \"Start writing your content...\"\n },\n \"adminMenu\": null\n },\n\n 'email': {\n \"id\": \"email\",\n \"codeName\": \"email\",\n \"displayName\": \"Email\",\n \"description\": \"Send transactional emails using Resend\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"📧\",\n \"is_core\": false,\n \"permissions\": [\n \"email:manage\",\n \"email:send\",\n \"email:view-logs\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"\",\n \"fromEmail\": \"\",\n \"fromName\": \"\",\n \"replyTo\": \"\",\n \"logoUrl\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Email\",\n \"icon\": \"envelope\",\n \"path\": \"/admin/plugins/email/settings\",\n \"order\": 80\n }\n },\n\n 'global-variables': {\n \"id\": \"global-variables\",\n \"codeName\": \"global-variables\",\n \"displayName\": \"Global Variables\",\n \"description\": \"Dynamic content variables with inline token support. Manage key-value variables via admin UI and use {variable_key} syntax in rich text fields for server-side resolution. Includes full CRUD admin page.\",\n \"version\": \"1.1.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔤\",\n \"is_core\": false,\n \"permissions\": [\n \"global-variables:manage\",\n \"global-variables:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableResolution\": true,\n \"cacheEnabled\": true,\n \"cacheTTL\": 300\n },\n \"adminMenu\": {\n \"label\": \"Global Variables\",\n \"icon\": \"variable\",\n \"path\": \"/admin/global-variables\",\n \"order\": 45\n }\n },\n\n 'hello-world': {\n \"id\": \"hello-world\",\n \"codeName\": \"hello-world\",\n \"displayName\": \"Hello World\",\n \"description\": \"A simple Hello World plugin demonstration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"👋\",\n \"is_core\": false,\n \"permissions\": [\n \"hello-world:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Hello World\",\n \"icon\": \"hand-raised\",\n \"path\": \"/admin/hello-world\",\n \"order\": 90\n }\n },\n\n 'magic-link-auth': {\n \"id\": \"magic-link-auth\",\n \"codeName\": \"magic-link-auth\",\n \"displayName\": \"Magic Link Authentication\",\n \"description\": \"Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔗\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"linkExpiryMinutes\": 15,\n \"rateLimitPerHour\": 5,\n \"allowNewUsers\": true\n },\n \"adminMenu\": null\n },\n\n 'oauth-providers': {\n \"id\": \"oauth-providers\",\n \"codeName\": \"oauth-providers\",\n \"displayName\": \"OAuth Providers\",\n \"description\": \"OAuth2/OIDC social login with GitHub, Google, and more\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"authentication\",\n \"iconEmoji\": \"🔑\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"providers\": {\n \"github\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n },\n \"google\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n }\n }\n },\n \"adminMenu\": null\n },\n\n 'otp-login': {\n \"id\": \"otp-login\",\n \"codeName\": \"otp-login\",\n \"displayName\": \"OTP Login\",\n \"description\": \"Passwordless authentication via email one-time codes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔢\",\n \"is_core\": false,\n \"permissions\": [\n \"otp:manage\",\n \"otp:request\",\n \"otp:verify\"\n ],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"codeLength\": 6,\n \"codeExpiryMinutes\": 10,\n \"maxAttempts\": 3,\n \"rateLimitPerHour\": 5,\n \"allowNewUserRegistration\": false,\n \"logoUrl\": \"\",\n \"logoWidth\": 150,\n \"logoBorderWidth\": 0,\n \"logoBorderColor\": \"#ffffff\",\n \"loginUrl\": \"\",\n \"loginButtonText\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"OTP Login\",\n \"icon\": \"key\",\n \"path\": \"/admin/plugins/otp-login/settings\",\n \"order\": 85\n }\n },\n\n 'quill-editor': {\n \"id\": \"quill-editor\",\n \"codeName\": \"quill-editor\",\n \"displayName\": \"Quill Rich Text Editor\",\n \"description\": \"Quill WYSIWYG editor integration for rich text editing. Lightweight, modern editor with customizable toolbars and dark mode support.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"✍️\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"version\": \"2.0.2\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"theme\": \"snow\"\n },\n \"adminMenu\": null\n },\n\n 'redirect-management': {\n \"id\": \"redirect-management\",\n \"codeName\": \"redirect-management\",\n \"displayName\": \"Redirect Management\",\n \"description\": \"URL redirect management with exact, partial, and regex matching\",\n \"version\": \"1.0.0\",\n \"author\": \"ahaas\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"↪️\",\n \"is_core\": false,\n \"permissions\": [\n \"redirect.manage\",\n \"redirect.view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"autoOffloadEnabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Redirects\",\n \"icon\": \"arrow-right\",\n \"path\": \"/admin/redirects\",\n \"order\": 85\n }\n },\n\n 'security-audit': {\n \"id\": \"security-audit\",\n \"codeName\": \"security-audit\",\n \"displayName\": \"Security Audit\",\n \"description\": \"Security event logging, brute-force detection, and analytics dashboard. Monitors login attempts, registrations, lockouts, and suspicious activity.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": false,\n \"permissions\": [\n \"security-audit:view\",\n \"security-audit:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"retention\": {\n \"daysToKeep\": 90,\n \"maxEvents\": 100000,\n \"autoPurge\": true\n },\n \"bruteForce\": {\n \"enabled\": true,\n \"maxFailedAttemptsPerIP\": 10,\n \"maxFailedAttemptsPerEmail\": 5,\n \"windowMinutes\": 15,\n \"lockoutDurationMinutes\": 30,\n \"alertThreshold\": 20\n },\n \"logging\": {\n \"logSuccessfulLogins\": true,\n \"logLogouts\": true,\n \"logRegistrations\": true,\n \"logPasswordResets\": true,\n \"logPermissionDenied\": true\n }\n },\n \"adminMenu\": {\n \"label\": \"Security Audit\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/security-audit\",\n \"order\": 85\n }\n },\n\n 'seed-data': {\n \"id\": \"seed-data\",\n \"codeName\": \"seed-data\",\n \"displayName\": \"Seed Data Generator\",\n \"description\": \"Development tool for generating sample data and testing content. Useful for demos and development environments\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🌱\",\n \"is_core\": false,\n \"permissions\": [\n \"seed-data:generate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"userCount\": 20,\n \"contentCount\": 200,\n \"defaultPassword\": \"password123\"\n },\n \"adminMenu\": null\n },\n\n 'shortcodes': {\n \"id\": \"shortcodes\",\n \"codeName\": \"shortcodes\",\n \"displayName\": \"Shortcodes\",\n \"description\": \"Registered shortcode functions for dynamic content. Use [[shortcode_name param=\\\"value\\\"]] syntax in rich text fields for server-side resolution. Includes handler registry, CRUD admin, and live preview.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"\",\n \"is_core\": false,\n \"permissions\": [\n \"shortcodes:manage\",\n \"shortcodes:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Shortcodes\",\n \"icon\": \"bolt\",\n \"path\": \"/admin/shortcodes\",\n \"order\": 46\n }\n },\n\n 'stripe': {\n \"id\": \"stripe\",\n \"codeName\": \"stripe\",\n \"displayName\": \"Stripe Subscriptions\",\n \"description\": \"Stripe subscription management with webhook handling, checkout sessions, and subscription gating\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"payments\",\n \"iconEmoji\": \"💳\",\n \"is_core\": true,\n \"permissions\": [\n \"stripe:manage\",\n \"stripe:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"stripeSecretKey\": \"\",\n \"stripeWebhookSecret\": \"\",\n \"stripePriceId\": \"\",\n \"successUrl\": \"/admin/dashboard\",\n \"cancelUrl\": \"/admin/dashboard\"\n },\n \"adminMenu\": {\n \"label\": \"Stripe\",\n \"icon\": \"credit-card\",\n \"path\": \"/admin/plugins/stripe\",\n \"order\": 90\n }\n },\n\n 'testimonials-plugin': {\n \"id\": \"testimonials-plugin\",\n \"codeName\": \"testimonials-plugin\",\n \"displayName\": \"Testimonials\",\n \"description\": \"Customer testimonials and reviews management with display widgets and ratings\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💬\",\n \"is_core\": false,\n \"permissions\": [\n \"testimonials:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'tinymce-plugin': {\n \"id\": \"tinymce-plugin\",\n \"codeName\": \"tinymce-plugin\",\n \"displayName\": \"TinyMCE Rich Text Editor\",\n \"description\": \"Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"no-api-key\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"skin\": \"oxide-dark\"\n },\n \"adminMenu\": null\n },\n\n 'turnstile': {\n \"id\": \"turnstile\",\n \"codeName\": \"turnstile-plugin\",\n \"displayName\": \"Cloudflare Turnstile\",\n \"description\": \"CAPTCHA-free bot protection using Cloudflare Turnstile. Provides reusable verification for any form.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"siteKey\": \"\",\n \"secretKey\": \"\",\n \"theme\": \"auto\",\n \"size\": \"normal\",\n \"mode\": \"managed\",\n \"appearance\": \"always\",\n \"preClearanceEnabled\": false,\n \"preClearanceLevel\": \"managed\",\n \"enabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Turnstile\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/turnstile/settings\",\n \"order\": 100\n }\n },\n\n 'user-profiles': {\n \"id\": \"user-profiles\",\n \"codeName\": \"user-profiles\",\n \"displayName\": \"User Profiles\",\n \"description\": \"Configurable custom profile fields for users\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"users\",\n \"iconEmoji\": \"👤\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'workflow-plugin': {\n \"id\": \"workflow-plugin\",\n \"codeName\": \"workflow-plugin\",\n \"displayName\": \"Workflow Engine\",\n \"description\": \"Content workflow and approval system with customizable states, transitions, and review processes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔄\",\n \"is_core\": false,\n \"permissions\": [\n \"workflow:manage\",\n \"workflow:approve\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableApprovalChains\": true,\n \"enableScheduling\": true,\n \"enableAutomation\": true,\n \"enableNotifications\": true\n },\n \"adminMenu\": null\n }\n} as const\n\n/**\n * All plugin IDs.\n */\nexport const ALL_PLUGIN_IDS = Object.keys(PLUGIN_REGISTRY)\n\n/**\n * Plugins that have their own admin page (have an adminMenu entry).\n */\nexport const PLUGINS_WITH_ADMIN_PAGES = ALL_PLUGIN_IDS.filter(\n id => PLUGIN_REGISTRY[id]?.adminMenu !== null\n)\n\n/**\n * Look up a plugin by its codeName (the `name` field stored in the DB).\n * Falls back to id lookup if no codeName match.\n */\nexport function findPluginByCodeName(codeName: string): PluginRegistryEntry | undefined {\n return Object.values(PLUGIN_REGISTRY).find(p => p.codeName === codeName)\n || PLUGIN_REGISTRY[codeName]\n}\n\n/**\n * Get a plugin by ID.\n */\nexport function getPlugin(id: string): PluginRegistryEntry | undefined {\n return PLUGIN_REGISTRY[id]\n}\n","import type { D1Database } from \"@cloudflare/workers-types\";\nimport { PluginService } from \"./plugin-service\";\nimport { PLUGIN_REGISTRY } from \"../plugins/manifest-registry\";\nimport type { PluginRegistryEntry } from \"../plugins/manifest-registry\";\n\nexport interface CorePlugin {\n id: string;\n name: string;\n display_name: string;\n description: string;\n version: string;\n author: string;\n category: string;\n icon: string;\n permissions: string[];\n dependencies: string[];\n settings?: any;\n}\n\n/**\n * Build the CORE_PLUGINS list from the auto-generated registry.\n * To add a new bootstrapped plugin, create a manifest.json and\n * run: node packages/scripts/generate-plugin-registry.mjs\n *\n * Only plugins that are in the BOOTSTRAP_PLUGIN_IDS list will be\n * auto-installed on first boot. Edit this list to control which\n * plugins are bootstrapped.\n */\nconst BOOTSTRAP_PLUGIN_IDS = [\n \"core-auth\",\n \"core-media\",\n \"database-tools\",\n \"seed-data\",\n \"core-cache\",\n \"workflow-plugin\",\n \"easy-mdx\",\n \"ai-search\",\n \"oauth-providers\",\n \"global-variables\",\n \"user-profiles\",\n \"stripe\",\n];\n\nfunction registryToCorePlugin(entry: PluginRegistryEntry): CorePlugin {\n return {\n id: entry.id,\n name: entry.codeName,\n display_name: entry.displayName,\n description: entry.description,\n version: entry.version,\n author: entry.author,\n category: entry.category,\n icon: entry.iconEmoji,\n permissions: entry.permissions,\n dependencies: entry.dependencies,\n settings: entry.defaultSettings,\n };\n}\n\nexport class PluginBootstrapService {\n private pluginService: PluginService;\n\n constructor(private db: D1Database) {\n this.pluginService = new PluginService(db);\n }\n\n /**\n * Core plugins derived from the auto-generated plugin registry.\n * Only plugins listed in BOOTSTRAP_PLUGIN_IDS are included.\n */\n private readonly CORE_PLUGINS: CorePlugin[] = BOOTSTRAP_PLUGIN_IDS\n .filter((id) => PLUGIN_REGISTRY[id] !== undefined)\n .map((id) => registryToCorePlugin(PLUGIN_REGISTRY[id]!));\n\n /**\n * Bootstrap all core plugins - install them if they don't exist\n */\n async bootstrapCorePlugins(): Promise {\n console.log(\"[PluginBootstrap] Starting core plugin bootstrap process...\");\n\n try {\n // Check each core plugin\n for (const corePlugin of this.CORE_PLUGINS) {\n await this.ensurePluginInstalled(corePlugin);\n }\n\n console.log(\n \"[PluginBootstrap] Core plugin bootstrap completed successfully\"\n );\n } catch (error) {\n console.error(\"[PluginBootstrap] Error during plugin bootstrap:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure a specific plugin is installed\n */\n private async ensurePluginInstalled(plugin: CorePlugin): Promise {\n try {\n // Check if plugin already exists\n const existingPlugin = await this.pluginService.getPlugin(plugin.id);\n\n if (existingPlugin) {\n console.log(\n `[PluginBootstrap] Plugin already installed: ${plugin.display_name} (status: ${existingPlugin.status})`\n );\n\n // Update plugin if version changed\n if (existingPlugin.version !== plugin.version) {\n console.log(\n `[PluginBootstrap] Updating plugin version: ${plugin.display_name} from ${existingPlugin.version} to ${plugin.version}`\n );\n await this.updatePlugin(plugin);\n }\n\n // ALWAYS ensure core-auth is active (critical for system functionality)\n if (plugin.id === 'core-auth' && existingPlugin.status !== 'active') {\n console.log(\n `[PluginBootstrap] Core-auth plugin is inactive, activating it now...`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n\n // Only auto-activate on first install, respect user's activation state on subsequent boots\n } else {\n // Install the plugin\n console.log(\n `[PluginBootstrap] Installing plugin: ${plugin.display_name}`\n );\n await this.pluginService.installPlugin({\n ...plugin,\n is_core: plugin.name.startsWith(\"core-\"),\n });\n\n // Activate plugins immediately after installation\n console.log(\n `[PluginBootstrap] Activating newly installed plugin: ${plugin.display_name}`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n } catch (error) {\n console.error(\n `[PluginBootstrap] Error ensuring plugin ${plugin.display_name}:`,\n error\n );\n // Don't throw - continue with other plugins\n }\n }\n\n /**\n * Update an existing plugin\n */\n private async updatePlugin(plugin: CorePlugin): Promise {\n const now = Math.floor(Date.now() / 1000);\n\n const stmt = this.db.prepare(`\n UPDATE plugins\n SET\n version = ?,\n description = ?,\n permissions = ?,\n settings = ?,\n last_updated = ?\n WHERE id = ?\n `);\n\n await stmt\n .bind(\n plugin.version,\n plugin.description,\n JSON.stringify(plugin.permissions),\n JSON.stringify(plugin.settings || {}),\n now,\n plugin.id\n )\n .run();\n }\n\n /**\n * Check if bootstrap is needed (first run detection)\n */\n async isBootstrapNeeded(): Promise {\n try {\n // Check if any core plugins are missing\n for (const corePlugin of this.CORE_PLUGINS.filter((p) =>\n p.name.startsWith(\"core-\")\n )) {\n const exists = await this.pluginService.getPlugin(corePlugin.id);\n if (!exists) {\n return true;\n }\n }\n return false;\n } catch (error) {\n // If there's an error (like table doesn't exist), we need bootstrap\n console.error(\n \"[PluginBootstrap] Error checking bootstrap status:\",\n error\n );\n return true;\n }\n }\n\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/services/collection-loader.ts","../src/services/collection-sync.ts","../src/services/form-collection-sync.ts","../src/services/plugin-service.ts","../src/plugins/manifest-registry.ts","../src/services/plugin-bootstrap.ts"],"names":[],"mappings":"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","file":"chunk-CJOLOONT.js","sourcesContent":["/**\n * Collection Loader Service\n *\n * Loads collection configuration files from the collections directory.\n * Supports both development (reading from filesystem) and production (bundled).\n */\n\nimport { CollectionConfig, CollectionConfigModule } from '../types/collection-config'\n\n// Global registry for externally registered collections\nconst registeredCollections: CollectionConfig[] = []\n\n/**\n * Register collections from the application code\n * This should be called before creating the app\n */\nexport function registerCollections(collections: CollectionConfig[]): void {\n for (const config of collections) {\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config: missing required fields`, config)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n registeredCollections.push(normalizedConfig)\n console.log(`✓ Registered collection: ${config.name}`)\n }\n}\n\n/**\n * Load all collection configurations from the collections directory\n */\nexport async function loadCollectionConfigs(): Promise {\n const collections: CollectionConfig[] = [...registeredCollections]\n\n // Log registered collections summary\n if (registeredCollections.length > 0) {\n console.log(`📦 Found ${registeredCollections.length} registered collection(s) from application`)\n } else {\n console.log(`⚠️ No collections registered. Make sure to call registerCollections() in your app's index.ts`)\n console.log(` Example: import myCollection from './collections/my-collection.collection'`)\n console.log(` registerCollections([myCollection])`)\n }\n\n try {\n // Import all collection files dynamically from core package\n // In production, these will be bundled with the application\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts', { eager: true }) || {}\n let coreCollectionCount = 0\n\n for (const [path, module] of Object.entries(modules)) {\n try {\n const configModule = module as CollectionConfigModule\n\n if (!configModule.default) {\n console.warn(`Collection file ${path} does not export a default config`)\n continue\n }\n\n const config = configModule.default\n\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config in ${path}: missing required fields`)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n collections.push(normalizedConfig)\n coreCollectionCount++\n console.log(`✓ Loaded core collection: ${config.name}`)\n } catch (error) {\n console.error(`Error loading collection from ${path}:`, error)\n }\n }\n\n console.log(`📊 Collection summary: ${collections.length} total (${registeredCollections.length} from app, ${coreCollectionCount} from core)`)\n return collections\n } catch (error) {\n console.error('Error loading collection configurations:', error)\n return collections // Return registered collections even if core loading fails\n }\n}\n\n/**\n * Load a specific collection configuration by name\n * Note: This function requires implementation in the consuming application\n * as it depends on project-specific collection files\n */\nexport async function loadCollectionConfig(name: string): Promise {\n try {\n // Dynamic imports are not supported in library builds\n // This should be implemented in the consuming application\n console.warn('loadCollectionConfig requires implementation in consuming application')\n return null\n } catch (error) {\n console.error(`Error loading collection ${name}:`, error)\n return null\n }\n}\n\n/**\n * Get list of all available collection config file names\n */\nexport async function getAvailableCollectionNames(): Promise {\n try {\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts') || {}\n const names: string[] = []\n\n for (const path of Object.keys(modules)) {\n // Extract collection name from path\n // e.g., '../collections/blog-posts.collection.ts' -> 'blog-posts'\n const match = path.match(/\\/([^/]+)\\.collection\\.ts$/)\n if (match && match[1]) {\n names.push(match[1])\n }\n }\n\n return names\n } catch (error) {\n console.error('Error getting collection names:', error)\n return []\n }\n}\n\n/**\n * Validate a collection configuration\n */\nexport function validateCollectionConfig(config: CollectionConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push('Collection name is required')\n } else if (!/^[a-z0-9_-]+$/.test(config.name)) {\n errors.push('Collection name must contain only lowercase letters, numbers, underscores, and hyphens')\n }\n\n if (!config.displayName) {\n errors.push('Display name is required')\n }\n\n if (!config.schema) {\n errors.push('Schema is required')\n } else {\n // Validate schema structure\n if (config.schema.type !== 'object') {\n errors.push('Schema type must be \"object\"')\n }\n\n if (!config.schema.properties || typeof config.schema.properties !== 'object') {\n errors.push('Schema must have properties')\n }\n\n // Validate field types\n for (const [fieldName, fieldConfig] of Object.entries(config.schema.properties || {})) {\n if (!fieldConfig.type) {\n errors.push(`Field \"${fieldName}\" is missing type`)\n }\n\n // Validate reference fields\n if (fieldConfig.type === 'reference' && !fieldConfig.collection) {\n errors.push(`Reference field \"${fieldName}\" is missing collection property`)\n }\n\n const layoutValue = fieldConfig.objectLayout\n if (layoutValue !== undefined) {\n if (fieldConfig.type !== 'object') {\n errors.push(`Field \"${fieldName}\" uses objectLayout but is not an object field`)\n } else if (!['nested', 'flat'].includes(layoutValue)) {\n errors.push(`Object field \"${fieldName}\" has invalid objectLayout. Use \"nested\" or \"flat\"`)\n }\n }\n\n // Validate select fields\n if (['select', 'multiselect', 'radio'].includes(fieldConfig.type) && !fieldConfig.enum) {\n errors.push(`Select field \"${fieldName}\" is missing enum options`)\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n}\n","/**\n * Collection Sync Service\n *\n * Syncs collection configurations from code to the database.\n * Handles create, update, and validation of config-managed collections.\n */\n\nimport { CollectionConfig, CollectionSyncResult } from '../types/collection-config'\nimport { loadCollectionConfigs, validateCollectionConfig } from './collection-loader'\n\n/**\n * Sync all collection configurations to the database\n */\nexport async function syncCollections(db: D1Database): Promise {\n console.log('🔄 Starting collection sync...')\n\n const results: CollectionSyncResult[] = []\n const configs = await loadCollectionConfigs()\n\n if (configs.length === 0) {\n console.log('⚠️ No collection configurations found')\n return results\n }\n\n for (const config of configs) {\n const result = await syncCollection(db, config)\n results.push(result)\n }\n\n const created = results.filter(r => r.status === 'created').length\n const updated = results.filter(r => r.status === 'updated').length\n const unchanged = results.filter(r => r.status === 'unchanged').length\n const errors = results.filter(r => r.status === 'error').length\n\n console.log(`✅ Collection sync complete: ${created} created, ${updated} updated, ${unchanged} unchanged, ${errors} errors`)\n\n return results\n}\n\n/**\n * Sync a single collection configuration to the database\n */\nexport async function syncCollection(db: D1Database, config: CollectionConfig): Promise {\n try {\n // Validate config\n const validation = validateCollectionConfig(config)\n if (!validation.valid) {\n return {\n name: config.name,\n status: 'error',\n error: `Validation failed: ${validation.errors.join(', ')}`\n }\n }\n\n // Check if collection exists\n const existingStmt = db.prepare('SELECT * FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(config.name).first() as any\n\n const now = Date.now()\n const collectionId = existing?.id || `col-${config.name}-${crypto.randomUUID().slice(0, 8)}`\n\n // Prepare collection data\n const schemaJson = JSON.stringify(config.schema)\n const isActive = config.isActive !== false ? 1 : 0\n const managed = config.managed !== false ? 1 : 0\n\n if (!existing) {\n // Create new collection\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n config.name,\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n now\n ).run()\n\n console.log(` ✓ Created collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'created',\n message: `Created collection \"${config.displayName}\"`\n }\n } else {\n // Check if update is needed\n const existingSchema = existing.schema ? JSON.stringify(existing.schema) : '{}'\n const existingDisplayName = existing.display_name\n const existingDescription = existing.description\n const existingIsActive = existing.is_active\n const existingManaged = existing.managed\n\n const needsUpdate =\n schemaJson !== existingSchema ||\n config.displayName !== existingDisplayName ||\n (config.description || null) !== existingDescription ||\n isActive !== existingIsActive ||\n managed !== existingManaged\n\n if (!needsUpdate) {\n return {\n name: config.name,\n status: 'unchanged',\n message: `Collection \"${config.displayName}\" is up to date`\n }\n }\n\n // Update existing collection\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, schema = ?, is_active = ?, managed = ?, updated_at = ?\n WHERE name = ?\n `)\n\n await updateStmt.bind(\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n config.name\n ).run()\n\n console.log(` ✓ Updated collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'updated',\n message: `Updated collection \"${config.displayName}\"`\n }\n }\n } catch (error) {\n console.error(` ✗ Error syncing collection ${config.name}:`, error)\n\n return {\n name: config.name,\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n}\n\n/**\n * Check if a collection is managed by config\n */\nexport async function isCollectionManaged(db: D1Database, collectionName: string): Promise {\n try {\n const stmt = db.prepare('SELECT managed FROM collections WHERE name = ?')\n const result = await stmt.bind(collectionName).first() as any\n\n return result?.managed === 1\n } catch (error) {\n console.error(`Error checking if collection is managed:`, error)\n return false\n }\n}\n\n/**\n * Get all managed collections from database\n */\nexport async function getManagedCollections(db: D1Database): Promise {\n try {\n const stmt = db.prepare('SELECT name FROM collections WHERE managed = 1')\n const { results } = await stmt.all()\n\n return (results || []).map((row: any) => row.name)\n } catch (error) {\n console.error('Error getting managed collections:', error)\n return []\n }\n}\n\n/**\n * Remove collections that are no longer in config files\n * (Only removes managed collections that aren't in the config)\n */\nexport async function cleanupRemovedCollections(db: D1Database): Promise {\n try {\n const configs = await loadCollectionConfigs()\n const configNames = new Set(configs.map(c => c.name))\n const managedCollections = await getManagedCollections(db)\n const removed: string[] = []\n\n for (const managedName of managedCollections) {\n if (!configNames.has(managedName)) {\n // This managed collection no longer has a config file\n // Mark as inactive instead of deleting (safer)\n const updateStmt = db.prepare(`\n UPDATE collections\n SET is_active = 0, updated_at = ?\n WHERE name = ? AND managed = 1\n `)\n\n await updateStmt.bind(Date.now(), managedName).run()\n removed.push(managedName)\n console.log(` ⚠️ Deactivated removed collection: ${managedName}`)\n }\n }\n\n return removed\n } catch (error) {\n console.error('Error cleaning up removed collections:', error)\n return []\n }\n}\n\n/**\n * Full sync: sync all configs and cleanup removed\n */\nexport async function fullCollectionSync(db: D1Database): Promise<{\n results: CollectionSyncResult[]\n removed: string[]\n}> {\n const results = await syncCollections(db)\n const removed = await cleanupRemovedCollections(db)\n\n return { results, removed }\n}\n","/**\n * Form-Collection Sync Service\n *\n * Bridge logic that creates \"shadow collections\" for forms and\n * dual-writes form submissions to the content table, enabling\n * unified content management for form submissions.\n */\n\nconst SYSTEM_FORM_USER_ID = 'system-form-submission'\n\n/**\n * Convert Form.io component type to collection schema field type\n */\nfunction mapFormioTypeToSchemaType(component: any): { type: string; [key: string]: any } {\n switch (component.type) {\n case 'textfield':\n case 'textarea':\n case 'password':\n case 'phoneNumber':\n case 'url':\n return { type: 'string', title: component.label || component.key }\n case 'email':\n return { type: 'string', format: 'email', title: component.label || component.key }\n case 'number':\n case 'currency':\n return { type: 'number', title: component.label || component.key }\n case 'checkbox':\n return { type: 'boolean', title: component.label || component.key }\n case 'select':\n case 'radio': {\n const enumValues = (component.data?.values || component.values || []).map((v: any) => v.value)\n const enumLabels = (component.data?.values || component.values || []).map((v: any) => v.label)\n return {\n type: 'select',\n title: component.label || component.key,\n enum: enumValues,\n enumLabels\n }\n }\n case 'selectboxes':\n return { type: 'object', title: component.label || component.key }\n case 'datetime':\n case 'day':\n case 'time':\n return { type: 'string', format: 'date-time', title: component.label || component.key }\n case 'file':\n case 'signature':\n return { type: 'string', title: component.label || component.key }\n case 'address':\n return { type: 'object', title: component.label || component.key }\n case 'hidden':\n return { type: 'string', title: component.label || component.key }\n default:\n return { type: 'string', title: component.label || component.key }\n }\n}\n\n/**\n * Recursively extract field components from a Form.io schema,\n * skipping layout-only components (panels, columns, fieldsets, etc.)\n */\nfunction extractFieldComponents(components: any[]): any[] {\n const fields: any[] = []\n if (!components) return fields\n\n for (const comp of components) {\n // Layout components — recurse into children\n if (comp.type === 'panel' || comp.type === 'fieldset' || comp.type === 'well' || comp.type === 'tabs') {\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n continue\n }\n if (comp.type === 'columns' && comp.columns) {\n for (const col of comp.columns) {\n if (col.components) {\n fields.push(...extractFieldComponents(col.components))\n }\n }\n continue\n }\n if (comp.type === 'table' && comp.rows) {\n for (const row of comp.rows) {\n if (Array.isArray(row)) {\n for (const cell of row) {\n if (cell.components) {\n fields.push(...extractFieldComponents(cell.components))\n }\n }\n }\n }\n continue\n }\n // Skip buttons and non-input layout elements\n if (comp.type === 'button' || comp.type === 'htmlelement' || comp.type === 'content') {\n continue\n }\n // Skip turnstile (not data)\n if (comp.type === 'turnstile') {\n continue\n }\n // It's a real field\n if (comp.key) {\n fields.push(comp)\n }\n // Recurse into sub-components for containers\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n }\n return fields\n}\n\n/**\n * Convert a Form.io schema into a collection JSON schema definition\n */\nexport function deriveCollectionSchemaFromFormio(formioSchema: any): any {\n const components = formioSchema?.components || []\n const fieldComponents = extractFieldComponents(components)\n\n const properties: Record = {\n // Always include a title field for the content item\n title: { type: 'string', title: 'Title', required: true }\n }\n const required: string[] = ['title']\n\n for (const comp of fieldComponents) {\n const key = comp.key\n if (!key || key === 'submit' || key === 'title') continue\n const fieldDef = mapFormioTypeToSchemaType(comp)\n if (comp.validate?.required) {\n fieldDef.required = true\n required.push(key)\n }\n properties[key] = fieldDef\n }\n\n return { type: 'object', properties, required }\n}\n\n/**\n * Derive a human-readable title from form submission data\n */\nexport function deriveSubmissionTitle(data: Record, formDisplayName: string): string {\n // Try common fields in order of preference\n const candidates = ['name', 'fullName', 'full_name', 'firstName', 'first_name']\n for (const key of candidates) {\n if (data[key] && typeof data[key] === 'string' && data[key].trim()) {\n // Append last name if available\n if (key === 'firstName' || key === 'first_name') {\n const last = data['lastName'] || data['last_name'] || data['lastname'] || ''\n if (last) return `${data[key].trim()} ${last.trim()}`\n }\n return data[key].trim()\n }\n }\n // Try email\n if (data.email && typeof data.email === 'string' && data.email.trim()) {\n return data.email.trim()\n }\n // Try subject\n if (data.subject && typeof data.subject === 'string' && data.subject.trim()) {\n return data.subject.trim()\n }\n // Fallback\n const dateStr = new Date().toLocaleDateString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })\n return `${formDisplayName} - ${dateStr}`\n}\n\n/**\n * Map form submission status to content status.\n * Form submissions are complete data — they default to 'published'.\n * Only rejected/spam submissions get demoted.\n */\nexport function mapFormStatusToContentStatus(formStatus: string): string {\n switch (formStatus) {\n case 'pending': return 'published'\n case 'reviewed': return 'published'\n case 'approved': return 'published'\n case 'rejected': return 'archived'\n case 'spam': return 'deleted'\n default: return 'published'\n }\n}\n\n/**\n * Create or update a shadow collection for a given form\n */\nexport async function syncFormCollection(db: D1Database, form: {\n id: string\n name: string\n display_name: string\n description?: string | null\n formio_schema: any\n is_active: number | boolean\n}): Promise<{ collectionId: string; status: 'created' | 'updated' | 'unchanged' }> {\n const collectionName = `form_${form.name}`\n const displayName = `${form.display_name} (Form)`\n\n // Parse formio_schema\n const formioSchema = typeof form.formio_schema === 'string'\n ? JSON.parse(form.formio_schema)\n : form.formio_schema\n\n const schema = deriveCollectionSchemaFromFormio(formioSchema)\n const schemaJson = JSON.stringify(schema)\n const now = Date.now()\n const isActive = form.is_active ? 1 : 0\n\n // Check if shadow collection already exists\n const existing = await db.prepare(\n 'SELECT id, schema, display_name, description, is_active FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!existing) {\n // Create new shadow collection\n const collectionId = `col-form-${form.name}-${crypto.randomUUID().slice(0, 8)}`\n\n await db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, source_type, source_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, 1, 'form', ?, ?, ?)\n `).bind(\n collectionId,\n collectionName,\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n form.id,\n now,\n now\n ).run()\n\n console.log(`[FormSync] Created shadow collection: ${collectionName}`)\n return { collectionId, status: 'created' }\n }\n\n // Check if update needed\n const existingSchema = existing.schema ? JSON.stringify(typeof existing.schema === 'string' ? JSON.parse(existing.schema) : existing.schema) : '{}'\n const needsUpdate =\n schemaJson !== existingSchema ||\n displayName !== existing.display_name ||\n (form.description || null) !== existing.description ||\n isActive !== existing.is_active\n\n if (!needsUpdate) {\n return { collectionId: existing.id, status: 'unchanged' }\n }\n\n await db.prepare(`\n UPDATE collections SET display_name = ?, description = ?, schema = ?, is_active = ?, updated_at = ?\n WHERE id = ?\n `).bind(\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n now,\n existing.id\n ).run()\n\n console.log(`[FormSync] Updated shadow collection: ${collectionName}`)\n return { collectionId: existing.id, status: 'updated' }\n}\n\n/**\n * Sync all active forms to shadow collections\n */\nexport async function syncAllFormCollections(db: D1Database): Promise {\n try {\n // Check if forms table exists\n const tableCheck = await db.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='forms'\"\n ).first()\n if (!tableCheck) {\n console.log('[FormSync] Forms table does not exist, skipping form sync')\n return\n }\n\n const { results: forms } = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms'\n ).all()\n\n if (!forms || forms.length === 0) {\n console.log('[FormSync] No forms found, skipping')\n return\n }\n\n let created = 0\n let updated = 0\n\n for (const form of forms) {\n try {\n const result = await syncFormCollection(db, form as any)\n if (result.status === 'created') created++\n if (result.status === 'updated') updated++\n\n // Backfill existing submissions that don't have content_id\n await backfillFormSubmissions(db, form.id as string, result.collectionId)\n } catch (error) {\n console.error(`[FormSync] Error syncing form ${form.name}:`, error)\n }\n }\n\n console.log(`[FormSync] Sync complete: ${created} created, ${updated} updated out of ${forms.length} forms`)\n } catch (error) {\n console.error('[FormSync] Error syncing form collections:', error)\n }\n}\n\n/**\n * Create a content item from a form submission\n */\nexport async function createContentFromSubmission(\n db: D1Database,\n submissionData: Record,\n form: { id: string; name: string; display_name: string },\n submissionId: string,\n metadata: {\n ipAddress?: string | null\n userAgent?: string | null\n userEmail?: string | null\n userId?: string | null\n } = {}\n): Promise {\n try {\n // Find the shadow collection\n let collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!collection) {\n // Shadow collection missing — try to create it on the fly\n console.warn(`[FormSync] No shadow collection found for form ${form.name}, attempting to create...`)\n try {\n const fullForm = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms WHERE id = ?'\n ).bind(form.id).first() as any\n\n if (fullForm) {\n const schema = typeof fullForm.formio_schema === 'string'\n ? JSON.parse(fullForm.formio_schema)\n : fullForm.formio_schema\n const result = await syncFormCollection(db, {\n id: fullForm.id,\n name: fullForm.name,\n display_name: fullForm.display_name,\n description: fullForm.description,\n formio_schema: schema,\n is_active: fullForm.is_active ?? 1\n })\n // Re-query the collection\n collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n console.log(`[FormSync] On-the-fly sync result: ${result.status}, collectionId: ${result.collectionId}`)\n }\n } catch (syncErr) {\n console.error('[FormSync] On-the-fly shadow collection creation failed:', syncErr)\n }\n\n if (!collection) {\n console.error(`[FormSync] Still no shadow collection for form ${form.name} after recovery attempt`)\n return null\n }\n }\n\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const title = deriveSubmissionTitle(submissionData, form.display_name)\n const slug = `submission-${submissionId.slice(0, 8)}`\n\n // Build content data with embedded metadata\n const contentData: Record = {\n title,\n ...submissionData,\n _submission_metadata: {\n submissionId,\n formId: form.id,\n formName: form.name,\n email: metadata.userEmail || submissionData.email || null,\n ipAddress: metadata.ipAddress || null,\n userAgent: metadata.userAgent || null,\n submittedAt: now\n }\n }\n\n const authorId = metadata.userId || SYSTEM_FORM_USER_ID\n\n // Ensure the system user exists (D1 enforces foreign keys)\n if (authorId === SYSTEM_FORM_USER_ID) {\n const systemUser = await db.prepare('SELECT id FROM users WHERE id = ?').bind(SYSTEM_FORM_USER_ID).first()\n if (!systemUser) {\n console.log('[FormSync] System form user missing, creating...')\n const sysNow = Date.now()\n await db.prepare(`\n INSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 0, ?, ?)\n `).bind(SYSTEM_FORM_USER_ID, 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', sysNow, sysNow).run()\n }\n }\n\n console.log(`[FormSync] Inserting content: id=${contentId}, collection=${collection.id}, slug=${slug}, title=${title}, author=${authorId}`)\n\n await db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, 'published', ?, ?, ?)\n `).bind(\n contentId,\n collection.id,\n slug,\n title,\n JSON.stringify(contentData),\n authorId,\n now,\n now\n ).run()\n\n // Link submission to content\n await db.prepare(\n 'UPDATE form_submissions SET content_id = ? WHERE id = ?'\n ).bind(contentId, submissionId).run()\n\n console.log(`[FormSync] Content created successfully: ${contentId}`)\n return contentId\n } catch (error) {\n console.error('[FormSync] Error creating content from submission:', error)\n return null\n }\n}\n\n/**\n * Backfill existing form submissions that don't have a content_id\n */\nexport async function backfillFormSubmissions(\n db: D1Database,\n formId: string,\n collectionId: string\n): Promise {\n try {\n const { results: submissions } = await db.prepare(\n 'SELECT id, submission_data, user_email, ip_address, user_agent, user_id, submitted_at FROM form_submissions WHERE form_id = ? AND content_id IS NULL'\n ).bind(formId).all()\n\n if (!submissions || submissions.length === 0) {\n return 0\n }\n\n // Get form info\n const form = await db.prepare(\n 'SELECT id, name, display_name FROM forms WHERE id = ?'\n ).bind(formId).first() as any\n\n if (!form) return 0\n\n let count = 0\n for (const sub of submissions) {\n try {\n const submissionData = typeof sub.submission_data === 'string'\n ? JSON.parse(sub.submission_data as string)\n : sub.submission_data\n\n const contentId = await createContentFromSubmission(\n db,\n submissionData,\n { id: form.id, name: form.name, display_name: form.display_name },\n sub.id as string,\n {\n ipAddress: sub.ip_address as string | null,\n userAgent: sub.user_agent as string | null,\n userEmail: sub.user_email as string | null,\n userId: sub.user_id as string | null\n }\n )\n if (contentId) count++\n } catch (error) {\n console.error(`[FormSync] Error backfilling submission ${sub.id}:`, error)\n }\n }\n\n if (count > 0) {\n console.log(`[FormSync] Backfilled ${count} submissions for form ${formId}`)\n }\n return count\n } catch (error) {\n console.error('[FormSync] Error backfilling submissions:', error)\n return 0\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\n// Note: PLUGIN_REGISTRY and CORE_PLUGIN_IDS are project-specific\n// They should be passed as parameters to the service in the consuming application\n// import { PLUGIN_REGISTRY, CORE_PLUGIN_IDS } from '../plugins/plugin-registry'\n\nexport interface PluginData {\n id: string\n name: string\n display_name: string\n description: string\n version: string\n author: string\n category: string\n icon: string\n status: 'active' | 'inactive' | 'error'\n is_core: boolean\n settings?: any\n permissions?: string[]\n dependencies?: string[]\n download_count: number\n rating: number\n installed_at: number\n activated_at?: number\n last_updated: number\n error_message?: string\n}\n\nexport interface PluginStats {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n}\n\nexport class PluginService {\n constructor(private db: D1Database) {}\n\n async getAllPlugins(): Promise {\n // Ensure all plugins from registry exist in database (auto-install if missing)\n await this.ensureAllPluginsExist()\n\n const stmt = this.db.prepare(`\n SELECT * FROM plugins\n ORDER BY is_core DESC, display_name ASC\n `)\n\n const { results } = await stmt.all()\n return (results || []).map(this.mapPluginFromDb)\n }\n\n /**\n * Ensure all plugins from the registry exist in the database\n * Auto-installs any newly detected plugins with inactive status\n *\n * Note: This method should be overridden or configured with a plugin registry\n * in the consuming application\n */\n private async ensureAllPluginsExist(): Promise {\n // This functionality requires a project-specific PLUGIN_REGISTRY\n // In the consuming application, you should pass the registry to this service\n console.log('[PluginService] ensureAllPluginsExist - requires PLUGIN_REGISTRY configuration')\n }\n\n async getPlugin(pluginId: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE id = ?')\n const plugin = await stmt.bind(pluginId).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginByName(name: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE name = ?')\n const plugin = await stmt.bind(name).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginStats(): Promise {\n const stmt = this.db.prepare(`\n SELECT \n COUNT(*) as total,\n COUNT(CASE WHEN status = 'active' THEN 1 END) as active,\n COUNT(CASE WHEN status = 'inactive' THEN 1 END) as inactive,\n COUNT(CASE WHEN status = 'error' THEN 1 END) as errors\n FROM plugins\n `)\n \n const stats = await stmt.first() as any\n return {\n total: stats.total || 0,\n active: stats.active || 0,\n inactive: stats.inactive || 0,\n errors: stats.errors || 0,\n uninstalled: 0\n }\n }\n\n async installPlugin(pluginData: Partial): Promise {\n const id = pluginData.id || `plugin-${Date.now()}`\n const now = Math.floor(Date.now() / 1000)\n \n const stmt = this.db.prepare(`\n INSERT INTO plugins (\n id, name, display_name, description, version, author, category, icon,\n status, is_core, settings, permissions, dependencies, download_count, \n rating, installed_at, last_updated\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginData.name || id,\n pluginData.display_name || 'Unnamed Plugin',\n pluginData.description || '',\n pluginData.version || '1.0.0',\n pluginData.author || 'Unknown',\n pluginData.category || 'utilities',\n pluginData.icon || '🔌',\n 'inactive',\n pluginData.is_core || false,\n JSON.stringify(pluginData.settings || {}),\n JSON.stringify(pluginData.permissions || []),\n JSON.stringify(pluginData.dependencies || []),\n pluginData.download_count || 0,\n pluginData.rating || 0,\n now,\n now\n ).run()\n \n // Log the installation\n await this.logActivity(id, 'installed', null, { version: pluginData.version })\n \n const installed = await this.getPlugin(id)\n if (!installed) throw new Error('Failed to install plugin')\n \n return installed\n }\n\n async uninstallPlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n if (plugin.is_core) throw new Error('Cannot uninstall core plugins')\n \n // First deactivate if active\n if (plugin.status === 'active') {\n await this.deactivatePlugin(pluginId)\n }\n \n // Delete the plugin\n const stmt = this.db.prepare('DELETE FROM plugins WHERE id = ?')\n await stmt.bind(pluginId).run()\n \n // Log the uninstallation\n await this.logActivity(pluginId, 'uninstalled', null, { name: plugin.name })\n }\n\n async activatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check dependencies\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n await this.checkDependencies(plugin.dependencies)\n }\n \n const now = Math.floor(Date.now() / 1000)\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'active', activated_at = ?, error_message = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(now, pluginId).run()\n \n // Log the activation\n await this.logActivity(pluginId, 'activated', null)\n }\n\n async deactivatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check if other plugins depend on this one\n await this.checkDependents(plugin.name)\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'inactive', activated_at = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(pluginId).run()\n \n // Log the deactivation\n await this.logActivity(pluginId, 'deactivated', null)\n }\n\n async updatePluginSettings(pluginId: string, settings: any): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET settings = ?, updated_at = unixepoch() \n WHERE id = ?\n `)\n \n await stmt.bind(JSON.stringify(settings), pluginId).run()\n \n // Log the settings update\n await this.logActivity(pluginId, 'settings_updated', null)\n }\n\n async setPluginError(pluginId: string, error: string): Promise {\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'error', error_message = ? \n WHERE id = ?\n `)\n \n await stmt.bind(error, pluginId).run()\n \n // Log the error\n await this.logActivity(pluginId, 'error', null, { error })\n }\n\n async getPluginActivity(pluginId: string, limit: number = 10): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_activity_log \n WHERE plugin_id = ? \n ORDER BY timestamp DESC \n LIMIT ?\n `)\n \n const { results } = await stmt.bind(pluginId, limit).all()\n return (results || []).map((row: any) => ({\n id: row.id,\n action: row.action,\n userId: row.user_id,\n details: row.details ? JSON.parse(row.details) : null,\n timestamp: row.timestamp\n }))\n }\n\n async registerHook(pluginId: string, hookName: string, handlerName: string, priority: number = 10): Promise {\n const id = `hook-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_hooks (id, plugin_id, hook_name, handler_name, priority)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(id, pluginId, hookName, handlerName, priority).run()\n }\n\n async registerRoute(pluginId: string, path: string, method: string, handlerName: string, middleware?: any[]): Promise {\n const id = `route-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_routes (id, plugin_id, path, method, handler_name, middleware)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id, \n pluginId, \n path, \n method, \n handlerName, \n JSON.stringify(middleware || [])\n ).run()\n }\n\n async getPluginHooks(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_hooks \n WHERE plugin_id = ? AND is_active = TRUE\n ORDER BY priority ASC\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n async getPluginRoutes(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_routes \n WHERE plugin_id = ? AND is_active = TRUE\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n private async checkDependencies(dependencies: string[]): Promise {\n for (const dep of dependencies) {\n const plugin = await this.getPluginByName(dep)\n if (!plugin || plugin.status !== 'active') {\n throw new Error(`Required dependency '${dep}' is not active`)\n }\n }\n }\n\n private async checkDependents(pluginName: string): Promise {\n const stmt = this.db.prepare(`\n SELECT id, display_name FROM plugins \n WHERE status = 'active' \n AND dependencies LIKE ?\n `)\n \n const { results } = await stmt.bind(`%\"${pluginName}\"%`).all()\n if (results && results.length > 0) {\n const names = results.map((p: any) => p.display_name).join(', ')\n throw new Error(`Cannot deactivate. The following plugins depend on this one: ${names}`)\n }\n }\n\n private async logActivity(pluginId: string, action: string, userId: string | null, details?: any): Promise {\n const id = `activity-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_activity_log (id, plugin_id, action, user_id, details)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginId,\n action,\n userId,\n details ? JSON.stringify(details) : null\n ).run()\n }\n\n private mapPluginFromDb(row: any): PluginData {\n return {\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n version: row.version,\n author: row.author,\n category: row.category,\n icon: row.icon,\n status: row.status,\n is_core: row.is_core === 1,\n settings: row.settings ? JSON.parse(row.settings) : undefined,\n permissions: row.permissions ? JSON.parse(row.permissions) : undefined,\n dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,\n download_count: row.download_count || 0,\n rating: row.rating || 0,\n installed_at: row.installed_at,\n activated_at: row.activated_at,\n last_updated: row.last_updated,\n error_message: row.error_message\n }\n }\n}\n","/**\n * Plugin Registry - AUTO-GENERATED\n *\n * Generated by: packages/scripts/generate-plugin-registry.mjs\n * Generated at: 2026-05-01T00:32:37.025Z\n * Source: All manifest.json files in src/plugins/\n *\n * DO NOT EDIT MANUALLY - run the generator script instead.\n * To add a new plugin, create a manifest.json in the plugin directory.\n */\n\nexport interface PluginRegistryEntry {\n id: string\n codeName: string\n displayName: string\n description: string\n version: string\n author: string\n category: string\n iconEmoji: string\n is_core: boolean\n permissions: string[]\n dependencies: string[]\n defaultSettings: Record\n adminMenu: {\n label: string\n icon: string\n path: string\n order: number\n } | null\n}\n\n/**\n * All discovered plugins, keyed by plugin ID.\n */\nexport const PLUGIN_REGISTRY: Record = {\n 'ai-search': {\n \"id\": \"ai-search\",\n \"codeName\": \"ai-search-plugin\",\n \"displayName\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"path\": \"/admin/plugins/ai-search\",\n \"order\": 50\n }\n },\n\n 'code-examples-plugin': {\n \"id\": \"code-examples-plugin\",\n \"codeName\": \"code-examples-plugin\",\n \"displayName\": \"Code Examples\",\n \"description\": \"Code snippets and examples library with syntax highlighting and categorization\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💻\",\n \"is_core\": false,\n \"permissions\": [\n \"code-examples:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'core-analytics': {\n \"id\": \"core-analytics\",\n \"codeName\": \"core-analytics\",\n \"displayName\": \"Analytics & Insights\",\n \"description\": \"Core analytics system for tracking page views, user behavior, and content performance. Provides dashboards and reports with real-time metrics\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"seo\",\n \"iconEmoji\": \"📊\",\n \"is_core\": true,\n \"permissions\": [\n \"analytics:view\",\n \"analytics:export\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Analytics\",\n \"icon\": \"chart-bar\",\n \"path\": \"/admin/analytics\",\n \"order\": 50\n }\n },\n\n 'core-auth': {\n \"id\": \"core-auth\",\n \"codeName\": \"core-auth\",\n \"displayName\": \"Authentication System\",\n \"description\": \"Core authentication and user management system with role-based access control, session management, and security features\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔐\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:users\",\n \"manage:roles\",\n \"manage:permissions\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"requiredFields\": {\n \"email\": {\n \"required\": true,\n \"minLength\": 5,\n \"label\": \"Email\",\n \"type\": \"email\"\n },\n \"password\": {\n \"required\": true,\n \"minLength\": 8,\n \"label\": \"Password\",\n \"type\": \"password\"\n },\n \"username\": {\n \"required\": true,\n \"minLength\": 3,\n \"label\": \"Username\",\n \"type\": \"text\"\n },\n \"firstName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"First Name\",\n \"type\": \"text\"\n },\n \"lastName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"Last Name\",\n \"type\": \"text\"\n }\n },\n \"validation\": {\n \"emailFormat\": true,\n \"allowDuplicateUsernames\": false,\n \"passwordRequirements\": {\n \"requireUppercase\": false,\n \"requireLowercase\": false,\n \"requireNumbers\": false,\n \"requireSpecialChars\": false\n }\n },\n \"registration\": {\n \"enabled\": true,\n \"requireEmailVerification\": false,\n \"defaultRole\": \"viewer\"\n }\n },\n \"adminMenu\": null\n },\n\n 'core-cache': {\n \"id\": \"core-cache\",\n \"codeName\": \"core-cache\",\n \"displayName\": \"Cache System\",\n \"description\": \"Three-tiered caching system with in-memory and KV storage. Provides automatic caching for content, users, media, and API responses with configurable TTL and invalidation patterns.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"system\",\n \"iconEmoji\": \"⚡\",\n \"is_core\": true,\n \"permissions\": [\n \"cache.view\",\n \"cache.clear\",\n \"cache.invalidate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableMemoryCache\": true,\n \"enableKVCache\": true,\n \"enableDatabaseCache\": true,\n \"defaultTTL\": 3600\n },\n \"adminMenu\": null\n },\n\n 'core-media': {\n \"id\": \"core-media\",\n \"codeName\": \"core-media\",\n \"displayName\": \"Media Manager\",\n \"description\": \"Core media upload and management system with support for images, videos, and documents. Includes automatic optimization, thumbnail generation, and cloud storage integration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"media\",\n \"iconEmoji\": \"📸\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:media\",\n \"upload:files\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Media\",\n \"icon\": \"image\",\n \"path\": \"/admin/media\",\n \"order\": 30\n }\n },\n\n 'database-tools': {\n \"id\": \"database-tools\",\n \"codeName\": \"database-tools\",\n \"displayName\": \"Database Tools\",\n \"description\": \"Database management and administration tools including migrations, backups, and query execution\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🗄️\",\n \"is_core\": false,\n \"permissions\": [\n \"database:admin\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableTruncate\": true,\n \"enableBackup\": true,\n \"enableValidation\": true,\n \"requireConfirmation\": true\n },\n \"adminMenu\": null\n },\n\n 'demo-login-plugin': {\n \"id\": \"demo-login-plugin\",\n \"codeName\": \"demo-login-plugin\",\n \"displayName\": \"Demo Login\",\n \"description\": \"Quick demo login functionality for testing and demonstrations\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎯\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"core-auth\"\n ],\n \"defaultSettings\": {\n \"enableNotice\": true,\n \"demoEmail\": \"admin@sonicjs.com\",\n \"demoPassword\": \"sonicjs!\"\n },\n \"adminMenu\": null\n },\n\n 'design': {\n \"id\": \"design\",\n \"codeName\": \"design\",\n \"displayName\": \"Design System\",\n \"description\": \"Design system management including themes, components, and UI customization. Provides a visual interface for managing design tokens, typography, colors, and component library.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎨\",\n \"is_core\": false,\n \"permissions\": [\n \"design.view\",\n \"design.edit\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultTheme\": \"light\",\n \"customCSS\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Design\",\n \"icon\": \"palette\",\n \"path\": \"/admin/design\",\n \"order\": 80\n }\n },\n\n 'easy-mdx': {\n \"id\": \"easy-mdx\",\n \"codeName\": \"easy-mdx\",\n \"displayName\": \"EasyMDE Markdown Editor\",\n \"description\": \"Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultHeight\": 400,\n \"theme\": \"dark\",\n \"toolbar\": \"full\",\n \"placeholder\": \"Start writing your content...\"\n },\n \"adminMenu\": null\n },\n\n 'email': {\n \"id\": \"email\",\n \"codeName\": \"email\",\n \"displayName\": \"Email\",\n \"description\": \"Send transactional emails using Resend\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"📧\",\n \"is_core\": false,\n \"permissions\": [\n \"email:manage\",\n \"email:send\",\n \"email:view-logs\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"\",\n \"fromEmail\": \"\",\n \"fromName\": \"\",\n \"replyTo\": \"\",\n \"logoUrl\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Email\",\n \"icon\": \"envelope\",\n \"path\": \"/admin/plugins/email/settings\",\n \"order\": 80\n }\n },\n\n 'global-variables': {\n \"id\": \"global-variables\",\n \"codeName\": \"global-variables\",\n \"displayName\": \"Global Variables\",\n \"description\": \"Dynamic content variables with inline token support. Manage key-value variables via admin UI and use {variable_key} syntax in rich text fields for server-side resolution. Includes full CRUD admin page.\",\n \"version\": \"1.1.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔤\",\n \"is_core\": false,\n \"permissions\": [\n \"global-variables:manage\",\n \"global-variables:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableResolution\": true,\n \"cacheEnabled\": true,\n \"cacheTTL\": 300\n },\n \"adminMenu\": {\n \"label\": \"Global Variables\",\n \"icon\": \"variable\",\n \"path\": \"/admin/global-variables\",\n \"order\": 45\n }\n },\n\n 'hello-world': {\n \"id\": \"hello-world\",\n \"codeName\": \"hello-world\",\n \"displayName\": \"Hello World\",\n \"description\": \"A simple Hello World plugin demonstration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"👋\",\n \"is_core\": false,\n \"permissions\": [\n \"hello-world:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Hello World\",\n \"icon\": \"hand-raised\",\n \"path\": \"/admin/hello-world\",\n \"order\": 90\n }\n },\n\n 'magic-link-auth': {\n \"id\": \"magic-link-auth\",\n \"codeName\": \"magic-link-auth\",\n \"displayName\": \"Magic Link Authentication\",\n \"description\": \"Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔗\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"linkExpiryMinutes\": 15,\n \"rateLimitPerHour\": 5,\n \"allowNewUsers\": true\n },\n \"adminMenu\": null\n },\n\n 'oauth-providers': {\n \"id\": \"oauth-providers\",\n \"codeName\": \"oauth-providers\",\n \"displayName\": \"OAuth Providers\",\n \"description\": \"OAuth2/OIDC social login with GitHub, Google, and more\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"authentication\",\n \"iconEmoji\": \"🔑\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"providers\": {\n \"github\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n },\n \"google\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n }\n }\n },\n \"adminMenu\": null\n },\n\n 'otp-login': {\n \"id\": \"otp-login\",\n \"codeName\": \"otp-login\",\n \"displayName\": \"OTP Login\",\n \"description\": \"Passwordless authentication via email one-time codes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔢\",\n \"is_core\": false,\n \"permissions\": [\n \"otp:manage\",\n \"otp:request\",\n \"otp:verify\"\n ],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"codeLength\": 6,\n \"codeExpiryMinutes\": 10,\n \"maxAttempts\": 3,\n \"rateLimitPerHour\": 5,\n \"allowNewUserRegistration\": false,\n \"logoUrl\": \"\",\n \"logoWidth\": 150,\n \"logoBorderWidth\": 0,\n \"logoBorderColor\": \"#ffffff\",\n \"loginUrl\": \"\",\n \"loginButtonText\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"OTP Login\",\n \"icon\": \"key\",\n \"path\": \"/admin/plugins/otp-login/settings\",\n \"order\": 85\n }\n },\n\n 'quill-editor': {\n \"id\": \"quill-editor\",\n \"codeName\": \"quill-editor\",\n \"displayName\": \"Quill Rich Text Editor\",\n \"description\": \"Quill WYSIWYG editor integration for rich text editing. Lightweight, modern editor with customizable toolbars and dark mode support.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"✍️\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"version\": \"2.0.2\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"theme\": \"snow\"\n },\n \"adminMenu\": null\n },\n\n 'redirect-management': {\n \"id\": \"redirect-management\",\n \"codeName\": \"redirect-management\",\n \"displayName\": \"Redirect Management\",\n \"description\": \"URL redirect management with exact, partial, and regex matching\",\n \"version\": \"1.0.0\",\n \"author\": \"ahaas\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"↪️\",\n \"is_core\": false,\n \"permissions\": [\n \"redirect.manage\",\n \"redirect.view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"autoOffloadEnabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Redirects\",\n \"icon\": \"arrow-right\",\n \"path\": \"/admin/redirects\",\n \"order\": 85\n }\n },\n\n 'security-audit': {\n \"id\": \"security-audit\",\n \"codeName\": \"security-audit\",\n \"displayName\": \"Security Audit\",\n \"description\": \"Security event logging, brute-force detection, and analytics dashboard. Monitors login attempts, registrations, lockouts, and suspicious activity.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": false,\n \"permissions\": [\n \"security-audit:view\",\n \"security-audit:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"retention\": {\n \"daysToKeep\": 90,\n \"maxEvents\": 100000,\n \"autoPurge\": true\n },\n \"bruteForce\": {\n \"enabled\": true,\n \"maxFailedAttemptsPerIP\": 10,\n \"maxFailedAttemptsPerEmail\": 5,\n \"windowMinutes\": 15,\n \"lockoutDurationMinutes\": 30,\n \"alertThreshold\": 20\n },\n \"logging\": {\n \"logSuccessfulLogins\": true,\n \"logLogouts\": true,\n \"logRegistrations\": true,\n \"logPasswordResets\": true,\n \"logPermissionDenied\": true\n }\n },\n \"adminMenu\": {\n \"label\": \"Security Audit\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/security-audit\",\n \"order\": 85\n }\n },\n\n 'seed-data': {\n \"id\": \"seed-data\",\n \"codeName\": \"seed-data\",\n \"displayName\": \"Seed Data Generator\",\n \"description\": \"Development tool for generating sample data and testing content. Useful for demos and development environments\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🌱\",\n \"is_core\": false,\n \"permissions\": [\n \"seed-data:generate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"userCount\": 20,\n \"contentCount\": 200,\n \"defaultPassword\": \"password123\"\n },\n \"adminMenu\": null\n },\n\n 'shortcodes': {\n \"id\": \"shortcodes\",\n \"codeName\": \"shortcodes\",\n \"displayName\": \"Shortcodes\",\n \"description\": \"Registered shortcode functions for dynamic content. Use [[shortcode_name param=\\\"value\\\"]] syntax in rich text fields for server-side resolution. Includes handler registry, CRUD admin, and live preview.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"\",\n \"is_core\": false,\n \"permissions\": [\n \"shortcodes:manage\",\n \"shortcodes:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Shortcodes\",\n \"icon\": \"bolt\",\n \"path\": \"/admin/shortcodes\",\n \"order\": 46\n }\n },\n\n 'stripe': {\n \"id\": \"stripe\",\n \"codeName\": \"stripe\",\n \"displayName\": \"Stripe Subscriptions\",\n \"description\": \"Stripe subscription management with webhook handling, checkout sessions, and subscription gating\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"payments\",\n \"iconEmoji\": \"💳\",\n \"is_core\": true,\n \"permissions\": [\n \"stripe:manage\",\n \"stripe:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"stripeSecretKey\": \"\",\n \"stripeWebhookSecret\": \"\",\n \"stripePriceId\": \"\",\n \"successUrl\": \"/admin/dashboard\",\n \"cancelUrl\": \"/admin/dashboard\"\n },\n \"adminMenu\": {\n \"label\": \"Stripe\",\n \"icon\": \"credit-card\",\n \"path\": \"/admin/plugins/stripe\",\n \"order\": 90\n }\n },\n\n 'testimonials-plugin': {\n \"id\": \"testimonials-plugin\",\n \"codeName\": \"testimonials-plugin\",\n \"displayName\": \"Testimonials\",\n \"description\": \"Customer testimonials and reviews management with display widgets and ratings\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💬\",\n \"is_core\": false,\n \"permissions\": [\n \"testimonials:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'tinymce-plugin': {\n \"id\": \"tinymce-plugin\",\n \"codeName\": \"tinymce-plugin\",\n \"displayName\": \"TinyMCE Rich Text Editor\",\n \"description\": \"Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"no-api-key\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"skin\": \"oxide-dark\"\n },\n \"adminMenu\": null\n },\n\n 'turnstile': {\n \"id\": \"turnstile\",\n \"codeName\": \"turnstile-plugin\",\n \"displayName\": \"Cloudflare Turnstile\",\n \"description\": \"CAPTCHA-free bot protection using Cloudflare Turnstile. Provides reusable verification for any form.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"siteKey\": \"\",\n \"secretKey\": \"\",\n \"theme\": \"auto\",\n \"size\": \"normal\",\n \"mode\": \"managed\",\n \"appearance\": \"always\",\n \"preClearanceEnabled\": false,\n \"preClearanceLevel\": \"managed\",\n \"enabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Turnstile\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/turnstile/settings\",\n \"order\": 100\n }\n },\n\n 'user-profiles': {\n \"id\": \"user-profiles\",\n \"codeName\": \"user-profiles\",\n \"displayName\": \"User Profiles\",\n \"description\": \"Configurable custom profile fields for users\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"users\",\n \"iconEmoji\": \"👤\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'workflow-plugin': {\n \"id\": \"workflow-plugin\",\n \"codeName\": \"workflow-plugin\",\n \"displayName\": \"Workflow Engine\",\n \"description\": \"Content workflow and approval system with customizable states, transitions, and review processes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔄\",\n \"is_core\": false,\n \"permissions\": [\n \"workflow:manage\",\n \"workflow:approve\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableApprovalChains\": true,\n \"enableScheduling\": true,\n \"enableAutomation\": true,\n \"enableNotifications\": true\n },\n \"adminMenu\": null\n }\n} as const\n\n/**\n * All plugin IDs.\n */\nexport const ALL_PLUGIN_IDS = Object.keys(PLUGIN_REGISTRY)\n\n/**\n * Plugins that have their own admin page (have an adminMenu entry).\n */\nexport const PLUGINS_WITH_ADMIN_PAGES = ALL_PLUGIN_IDS.filter(\n id => PLUGIN_REGISTRY[id]?.adminMenu !== null\n)\n\n/**\n * Look up a plugin by its codeName (the `name` field stored in the DB).\n * Falls back to id lookup if no codeName match.\n */\nexport function findPluginByCodeName(codeName: string): PluginRegistryEntry | undefined {\n return Object.values(PLUGIN_REGISTRY).find(p => p.codeName === codeName)\n || PLUGIN_REGISTRY[codeName]\n}\n\n/**\n * Get a plugin by ID.\n */\nexport function getPlugin(id: string): PluginRegistryEntry | undefined {\n return PLUGIN_REGISTRY[id]\n}\n","import type { D1Database } from \"@cloudflare/workers-types\";\nimport { PluginService } from \"./plugin-service\";\nimport { PLUGIN_REGISTRY } from \"../plugins/manifest-registry\";\nimport type { PluginRegistryEntry } from \"../plugins/manifest-registry\";\n\nexport interface CorePlugin {\n id: string;\n name: string;\n display_name: string;\n description: string;\n version: string;\n author: string;\n category: string;\n icon: string;\n permissions: string[];\n dependencies: string[];\n settings?: any;\n}\n\n/**\n * Build the CORE_PLUGINS list from the auto-generated registry.\n * To add a new bootstrapped plugin, create a manifest.json and\n * run: node packages/scripts/generate-plugin-registry.mjs\n *\n * Only plugins that are in the BOOTSTRAP_PLUGIN_IDS list will be\n * auto-installed on first boot. Edit this list to control which\n * plugins are bootstrapped.\n */\nconst BOOTSTRAP_PLUGIN_IDS = [\n \"core-auth\",\n \"core-media\",\n \"database-tools\",\n \"seed-data\",\n \"core-cache\",\n \"workflow-plugin\",\n \"easy-mdx\",\n \"ai-search\",\n \"oauth-providers\",\n \"global-variables\",\n \"user-profiles\",\n \"stripe\",\n];\n\nfunction registryToCorePlugin(entry: PluginRegistryEntry): CorePlugin {\n return {\n id: entry.id,\n name: entry.codeName,\n display_name: entry.displayName,\n description: entry.description,\n version: entry.version,\n author: entry.author,\n category: entry.category,\n icon: entry.iconEmoji,\n permissions: entry.permissions,\n dependencies: entry.dependencies,\n settings: entry.defaultSettings,\n };\n}\n\nexport class PluginBootstrapService {\n private pluginService: PluginService;\n\n constructor(private db: D1Database) {\n this.pluginService = new PluginService(db);\n }\n\n /**\n * Core plugins derived from the auto-generated plugin registry.\n * Only plugins listed in BOOTSTRAP_PLUGIN_IDS are included.\n */\n private readonly CORE_PLUGINS: CorePlugin[] = BOOTSTRAP_PLUGIN_IDS\n .filter((id) => PLUGIN_REGISTRY[id] !== undefined)\n .map((id) => registryToCorePlugin(PLUGIN_REGISTRY[id]!));\n\n /**\n * Bootstrap all core plugins - install them if they don't exist\n */\n async bootstrapCorePlugins(): Promise {\n console.log(\"[PluginBootstrap] Starting core plugin bootstrap process...\");\n\n try {\n // Check each core plugin\n for (const corePlugin of this.CORE_PLUGINS) {\n await this.ensurePluginInstalled(corePlugin);\n }\n\n console.log(\n \"[PluginBootstrap] Core plugin bootstrap completed successfully\"\n );\n } catch (error) {\n console.error(\"[PluginBootstrap] Error during plugin bootstrap:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure a specific plugin is installed\n */\n private async ensurePluginInstalled(plugin: CorePlugin): Promise {\n try {\n // Check if plugin already exists\n const existingPlugin = await this.pluginService.getPlugin(plugin.id);\n\n if (existingPlugin) {\n console.log(\n `[PluginBootstrap] Plugin already installed: ${plugin.display_name} (status: ${existingPlugin.status})`\n );\n\n // Update plugin if version changed\n if (existingPlugin.version !== plugin.version) {\n console.log(\n `[PluginBootstrap] Updating plugin version: ${plugin.display_name} from ${existingPlugin.version} to ${plugin.version}`\n );\n await this.updatePlugin(plugin);\n }\n\n // ALWAYS ensure core-auth is active (critical for system functionality)\n if (plugin.id === 'core-auth' && existingPlugin.status !== 'active') {\n console.log(\n `[PluginBootstrap] Core-auth plugin is inactive, activating it now...`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n\n // Only auto-activate on first install, respect user's activation state on subsequent boots\n } else {\n // Install the plugin\n console.log(\n `[PluginBootstrap] Installing plugin: ${plugin.display_name}`\n );\n await this.pluginService.installPlugin({\n ...plugin,\n is_core: plugin.name.startsWith(\"core-\"),\n });\n\n // Activate plugins immediately after installation\n console.log(\n `[PluginBootstrap] Activating newly installed plugin: ${plugin.display_name}`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n } catch (error) {\n console.error(\n `[PluginBootstrap] Error ensuring plugin ${plugin.display_name}:`,\n error\n );\n // Don't throw - continue with other plugins\n }\n }\n\n /**\n * Update an existing plugin\n */\n private async updatePlugin(plugin: CorePlugin): Promise {\n const now = Math.floor(Date.now() / 1000);\n\n const stmt = this.db.prepare(`\n UPDATE plugins\n SET\n version = ?,\n description = ?,\n permissions = ?,\n settings = ?,\n last_updated = ?\n WHERE id = ?\n `);\n\n await stmt\n .bind(\n plugin.version,\n plugin.description,\n JSON.stringify(plugin.permissions),\n JSON.stringify(plugin.settings || {}),\n now,\n plugin.id\n )\n .run();\n }\n\n /**\n * Check if bootstrap is needed (first run detection)\n */\n async isBootstrapNeeded(): Promise {\n try {\n // Check if any core plugins are missing\n for (const corePlugin of this.CORE_PLUGINS.filter((p) =>\n p.name.startsWith(\"core-\")\n )) {\n const exists = await this.pluginService.getPlugin(corePlugin.id);\n if (!exists) {\n return true;\n }\n }\n return false;\n } catch (error) {\n // If there's an error (like table doesn't exist), we need bootstrap\n console.error(\n \"[PluginBootstrap] Error checking bootstrap status:\",\n error\n );\n return true;\n }\n }\n\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-46DCL763.js b/packages/core/dist/chunk-CSQWOYGZ.js similarity index 99% rename from packages/core/dist/chunk-46DCL763.js rename to packages/core/dist/chunk-CSQWOYGZ.js index a5655f5a5..c23915a20 100644 --- a/packages/core/dist/chunk-46DCL763.js +++ b/packages/core/dist/chunk-CSQWOYGZ.js @@ -2213,5 +2213,5 @@ var MigrationService = class { }; export { MigrationService }; -//# sourceMappingURL=chunk-46DCL763.js.map -//# sourceMappingURL=chunk-46DCL763.js.map \ No newline at end of file +//# sourceMappingURL=chunk-CSQWOYGZ.js.map +//# sourceMappingURL=chunk-CSQWOYGZ.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-46DCL763.js.map b/packages/core/dist/chunk-CSQWOYGZ.js.map similarity index 99% rename from packages/core/dist/chunk-46DCL763.js.map rename to packages/core/dist/chunk-CSQWOYGZ.js.map index 0dce1846b..2fa5fb3ee 100644 --- a/packages/core/dist/chunk-46DCL763.js.map +++ b/packages/core/dist/chunk-CSQWOYGZ.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/db/migrations-bundle.ts","../src/services/migrations.ts"],"names":["hasUserProfilesTable"],"mappings":"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","file":"chunk-46DCL763.js","sourcesContent":["/**\n * AUTO-GENERATED FILE - DO NOT EDIT\n * Generated by: scripts/generate-migrations.ts\n * Generated at: 2026-05-16T15:00:21.459Z\n *\n * This file contains all migration SQL bundled for use in Cloudflare Workers\n * where filesystem access is not available at runtime.\n */\n\nexport interface BundledMigration {\n id: string\n name: string\n filename: string\n description: string\n sql: string\n}\n\nexport const bundledMigrations: BundledMigration[] = [\n {\n id: '001',\n name: 'Initial Schema',\n filename: '001_initial_schema.sql',\n description: 'Migration 001: Initial Schema',\n sql: \"-- Initial schema for SonicJS AI\\n-- Create users table for authentication\\nCREATE TABLE IF NOT EXISTS users (\\n id TEXT PRIMARY KEY,\\n email TEXT NOT NULL UNIQUE,\\n username TEXT NOT NULL UNIQUE,\\n first_name TEXT NOT NULL,\\n last_name TEXT NOT NULL,\\n password_hash TEXT,\\n role TEXT NOT NULL DEFAULT 'viewer',\\n avatar TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n last_login_at INTEGER,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create collections table for content schema definitions\\nCREATE TABLE IF NOT EXISTS collections (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n schema TEXT NOT NULL, -- JSON schema definition\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content table for actual content data\\nCREATE TABLE IF NOT EXISTS content (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n slug TEXT NOT NULL,\\n title TEXT NOT NULL,\\n data TEXT NOT NULL, -- JSON content data\\n status TEXT NOT NULL DEFAULT 'draft',\\n published_at INTEGER,\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content_versions table for versioning\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n version INTEGER NOT NULL,\\n data TEXT NOT NULL, -- JSON data\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create media/files table with comprehensive R2 integration\\nCREATE TABLE IF NOT EXISTS media (\\n id TEXT PRIMARY KEY,\\n filename TEXT NOT NULL,\\n original_name TEXT NOT NULL,\\n mime_type TEXT NOT NULL,\\n size INTEGER NOT NULL,\\n width INTEGER,\\n height INTEGER,\\n folder TEXT NOT NULL DEFAULT 'uploads',\\n r2_key TEXT NOT NULL, -- R2 storage key\\n public_url TEXT NOT NULL, -- CDN URL\\n thumbnail_url TEXT, -- Cloudflare Images URL\\n alt TEXT,\\n caption TEXT,\\n tags TEXT, -- JSON array of tags\\n uploaded_by TEXT NOT NULL REFERENCES users(id),\\n uploaded_at INTEGER NOT NULL,\\n updated_at INTEGER,\\n published_at INTEGER,\\n scheduled_at INTEGER,\\n archived_at INTEGER,\\n deleted_at INTEGER\\n);\\n\\n-- Create API tokens table for programmatic access\\nCREATE TABLE IF NOT EXISTS api_tokens (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n permissions TEXT NOT NULL, -- JSON array of permissions\\n expires_at INTEGER,\\n last_used_at INTEGER,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create workflow history table for content workflow tracking\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n action TEXT NOT NULL,\\n from_status TEXT NOT NULL,\\n to_status TEXT NOT NULL,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n comment TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\\nCREATE INDEX IF NOT EXISTS idx_users_username ON users(username);\\nCREATE INDEX IF NOT EXISTS idx_users_role ON users(role);\\n\\nCREATE INDEX IF NOT EXISTS idx_collections_name ON collections(name);\\nCREATE INDEX IF NOT EXISTS idx_collections_active ON collections(is_active);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_collection ON content(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_author ON content(author_id);\\nCREATE INDEX IF NOT EXISTS idx_content_status ON content(status);\\nCREATE INDEX IF NOT EXISTS idx_content_published ON content(published_at);\\nCREATE INDEX IF NOT EXISTS idx_content_slug ON content(slug);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_version ON content_versions(version);\\n\\nCREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);\\nCREATE INDEX IF NOT EXISTS idx_media_type ON media(mime_type);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_by ON media(uploaded_by);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_at ON media(uploaded_at);\\nCREATE INDEX IF NOT EXISTS idx_media_deleted ON media(deleted_at);\\n\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_user ON api_tokens(user_id);\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_token ON api_tokens(token);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_user ON workflow_history(user_id);\\n\\n-- Note: Admin user is created via the seed script with user-provided credentials\\n-- Run 'npm run seed' after migrations to create the admin user\\n\\n-- Insert sample collections\\nINSERT OR IGNORE INTO collections (\\n id, name, display_name, description, schema, \\n is_active, created_at, updated_at\\n) VALUES (\\n 'blog-posts-collection',\\n 'blog_posts',\\n 'Blog Posts',\\n 'Blog post content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"excerpt\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Excerpt\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"},\\\"tags\\\":{\\\"type\\\":\\\"array\\\",\\\"title\\\":\\\"Tags\\\",\\\"items\\\":{\\\"type\\\":\\\"string\\\"}},\\\"status\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Status\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"],\\\"default\\\":\\\"draft\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'pages-collection',\\n 'pages',\\n 'Pages',\\n 'Static page content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"slug\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Slug\\\"},\\\"meta_description\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Meta Description\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'news-collection',\\n 'news',\\n 'News',\\n 'News article content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"publish_date\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Publish Date\\\",\\\"format\\\":\\\"date\\\"},\\\"author\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Author\\\"},\\\"category\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Category\\\",\\\"enum\\\":[\\\"technology\\\",\\\"business\\\",\\\"general\\\"]}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Note: Sample content can be created via the admin interface after the admin user is seeded\"\n },\n {\n id: '002',\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql',\n description: 'Migration 002: Faq Plugin',\n sql: \"-- FAQ Plugin Migration (DEPRECATED - Now managed by third-party plugin)\\n-- Creates FAQ table for the FAQ plugin\\n-- NOTE: This migration is kept for historical purposes. \\n-- The FAQ functionality is now provided by the faq-plugin third-party plugin.\\n\\nCREATE TABLE IF NOT EXISTS faqs (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n question TEXT NOT NULL,\\n answer TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_faqs_category ON faqs(category);\\nCREATE INDEX IF NOT EXISTS idx_faqs_published ON faqs(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_faqs_sort_order ON faqs(sortOrder);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS faqs_updated_at\\n AFTER UPDATE ON faqs\\nBEGIN\\n UPDATE faqs SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert sample FAQ data\\nINSERT OR IGNORE INTO faqs (question, answer, category, tags, isPublished, sortOrder) VALUES \\n('What is SonicJS AI?', \\n'SonicJS AI is a modern, TypeScript-first headless CMS built for Cloudflare''s edge platform. It provides a complete content management system with admin interface, API endpoints, and plugin architecture.',\\n'general',\\n'sonicjs, cms, cloudflare',\\n1,\\n1),\\n\\n('How do I get started with SonicJS AI?',\\n'To get started: 1) Clone the repository, 2) Install dependencies with npm install, 3) Set up your Cloudflare account and services, 4) Run the development server with npm run dev, 5) Access the admin interface at /admin.',\\n'general',\\n'getting-started, setup',\\n1,\\n2),\\n\\n('What technologies does SonicJS AI use?',\\n'SonicJS AI is built with: TypeScript for type safety, Hono.js as the web framework, Cloudflare D1 for the database, Cloudflare R2 for media storage, Cloudflare Workers for serverless execution, and Tailwind CSS for styling.',\\n'technical',\\n'technology-stack, typescript, cloudflare',\\n1,\\n3),\\n\\n('How do I create content in SonicJS AI?',\\n'Content creation is done through the admin interface. Navigate to /admin, log in with your credentials, go to Content section, select a collection, and click \\\"New Content\\\" to create articles, pages, or other content types.',\\n'general',\\n'content-creation, admin',\\n1,\\n4),\\n\\n('Is SonicJS AI free to use?',\\n'SonicJS AI is open source and free to use. You only pay for the Cloudflare services you consume (D1 database, R2 storage, Workers execution time). Cloudflare offers generous free tiers for development and small projects.',\\n'billing',\\n'pricing, open-source, cloudflare',\\n1,\\n5),\\n\\n('How do I add custom functionality?',\\n'SonicJS AI features a plugin system that allows you to extend functionality. You can create plugins using the PluginBuilder API, add custom routes, models, admin pages, and integrate with external services.',\\n'technical',\\n'plugins, customization, development',\\n1,\\n6),\\n\\n('Can I customize the admin interface?',\\n'Yes! The admin interface is built with TypeScript templates and can be customized. You can modify existing templates, create new components, add custom pages, and integrate your own styling while maintaining the dark theme.',\\n'technical',\\n'admin-interface, customization, templates',\\n1,\\n7),\\n\\n('How does authentication work?',\\n'SonicJS AI includes a built-in authentication system with JWT tokens, role-based access control (admin, editor, viewer), secure password hashing, and session management. Users can be managed through the admin interface.',\\n'technical',\\n'authentication, security, users',\\n1,\\n8);\"\n },\n {\n id: '003',\n name: 'Stage5 Enhancements',\n filename: '003_stage5_enhancements.sql',\n description: 'Migration 003: Stage5 Enhancements',\n sql: \"-- Stage 5: Advanced Content Management enhancements\\n-- Add scheduling and workflow features to content table\\n\\n-- Add content scheduling columns\\nALTER TABLE content ADD COLUMN scheduled_publish_at INTEGER;\\nALTER TABLE content ADD COLUMN scheduled_unpublish_at INTEGER;\\n\\n-- Add workflow and review columns\\nALTER TABLE content ADD COLUMN review_status TEXT DEFAULT 'none'; -- none, pending, approved, rejected\\nALTER TABLE content ADD COLUMN reviewer_id TEXT REFERENCES users(id);\\nALTER TABLE content ADD COLUMN reviewed_at INTEGER;\\nALTER TABLE content ADD COLUMN review_notes TEXT;\\n\\n-- Add content metadata\\nALTER TABLE content ADD COLUMN meta_title TEXT;\\nALTER TABLE content ADD COLUMN meta_description TEXT;\\nALTER TABLE content ADD COLUMN featured_image_id TEXT REFERENCES media(id);\\nALTER TABLE content ADD COLUMN content_type TEXT DEFAULT 'standard'; -- standard, template, component\\n\\n-- Create content_fields table for dynamic field definitions\\nCREATE TABLE IF NOT EXISTS content_fields (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n field_name TEXT NOT NULL,\\n field_type TEXT NOT NULL, -- text, richtext, number, boolean, date, select, media, relationship\\n field_label TEXT NOT NULL,\\n field_options TEXT, -- JSON for select options, validation rules, etc.\\n field_order INTEGER NOT NULL DEFAULT 0,\\n is_required INTEGER NOT NULL DEFAULT 0,\\n is_searchable INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(collection_id, field_name)\\n);\\n\\n-- Create content_relationships table for content relationships\\nCREATE TABLE IF NOT EXISTS content_relationships (\\n id TEXT PRIMARY KEY,\\n source_content_id TEXT NOT NULL REFERENCES content(id),\\n target_content_id TEXT NOT NULL REFERENCES content(id),\\n relationship_type TEXT NOT NULL, -- references, tags, categories\\n created_at INTEGER NOT NULL,\\n UNIQUE(source_content_id, target_content_id, relationship_type)\\n);\\n\\n-- Create workflow_templates table for reusable workflows\\nCREATE TABLE IF NOT EXISTS workflow_templates (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT REFERENCES collections(id), -- null means applies to all collections\\n workflow_steps TEXT NOT NULL, -- JSON array of workflow steps\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Add indexes for new columns\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_unpublish ON content(scheduled_unpublish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_review_status ON content(review_status);\\nCREATE INDEX IF NOT EXISTS idx_content_reviewer ON content(reviewer_id);\\nCREATE INDEX IF NOT EXISTS idx_content_content_type ON content(content_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_fields_collection ON content_fields(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_name ON content_fields(field_name);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_type ON content_fields(field_type);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_order ON content_fields(field_order);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_source ON content_relationships(source_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_target ON content_relationships(target_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_type ON content_relationships(relationship_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_collection ON workflow_templates(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_active ON workflow_templates(is_active);\\n\\n-- Insert default workflow template\\nINSERT OR IGNORE INTO workflow_templates (\\n id, name, description, workflow_steps, is_active, created_at, updated_at\\n) VALUES (\\n 'default-content-workflow',\\n 'Default Content Workflow',\\n 'Standard content workflow: Draft → Review → Published',\\n '[\\n {\\\"step\\\": \\\"draft\\\", \\\"name\\\": \\\"Draft\\\", \\\"description\\\": \\\"Content is being created\\\", \\\"permissions\\\": [\\\"author\\\", \\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"review\\\", \\\"name\\\": \\\"Under Review\\\", \\\"description\\\": \\\"Content is pending review\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"published\\\", \\\"name\\\": \\\"Published\\\", \\\"description\\\": \\\"Content is live\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"archived\\\", \\\"name\\\": \\\"Archived\\\", \\\"description\\\": \\\"Content is archived\\\", \\\"permissions\\\": [\\\"admin\\\"]}\\n ]',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Insert enhanced field definitions for existing collections\\nINSERT OR IGNORE INTO content_fields (\\n id, collection_id, field_name, field_type, field_label, field_options, field_order, is_required, is_searchable, created_at, updated_at\\n) VALUES \\n-- Blog Posts fields\\n('blog-title-field', 'blog-posts-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter blog post title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-content-field', 'blog-posts-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-excerpt-field', 'blog-posts-collection', 'excerpt', 'text', 'Excerpt', '{\\\"maxLength\\\": 500, \\\"rows\\\": 3, \\\"placeholder\\\": \\\"Brief description of the post\\\"}', 3, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-tags-field', 'blog-posts-collection', 'tags', 'select', 'Tags', '{\\\"multiple\\\": true, \\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"tutorial\\\", \\\"news\\\", \\\"update\\\"], \\\"allowCustom\\\": true}', 4, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-image-field', 'blog-posts-collection', 'featured_image', 'media', 'Featured Image', '{\\\"accept\\\": \\\"image/*\\\", \\\"maxSize\\\": \\\"5MB\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-publish-date-field', 'blog-posts-collection', 'publish_date', 'date', 'Publish Date', '{\\\"format\\\": \\\"YYYY-MM-DD\\\", \\\"defaultToday\\\": true}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-field', 'blog-posts-collection', 'is_featured', 'boolean', 'Featured Post', '{\\\"default\\\": false}', 7, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- Pages fields\\n('pages-title-field', 'pages-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter page title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-content-field', 'pages-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 500}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-slug-field', 'pages-collection', 'slug', 'text', 'URL Slug', '{\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\"}', 3, 1, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-meta-desc-field', 'pages-collection', 'meta_description', 'text', 'Meta Description', '{\\\"maxLength\\\": 160, \\\"rows\\\": 2, \\\"placeholder\\\": \\\"SEO description for search engines\\\"}', 4, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-template-field', 'pages-collection', 'template', 'select', 'Page Template', '{\\\"options\\\": [\\\"default\\\", \\\"landing\\\", \\\"contact\\\", \\\"about\\\"], \\\"default\\\": \\\"default\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- News fields\\n('news-title-field', 'news-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter news title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-content-field', 'news-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"news\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-category-field', 'news-collection', 'category', 'select', 'Category', '{\\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"politics\\\", \\\"sports\\\", \\\"entertainment\\\", \\\"health\\\"], \\\"required\\\": true}', 3, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-author-field', 'news-collection', 'author', 'text', 'Author', '{\\\"placeholder\\\": \\\"Author name\\\"}', 4, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-source-field', 'news-collection', 'source', 'text', 'Source', '{\\\"placeholder\\\": \\\"News source\\\"}', 5, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-priority-field', 'news-collection', 'priority', 'select', 'Priority', '{\\\"options\\\": [\\\"low\\\", \\\"normal\\\", \\\"high\\\", \\\"breaking\\\"], \\\"default\\\": \\\"normal\\\"}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000);\"\n },\n {\n id: '004',\n name: 'Stage6 User Management',\n filename: '004_stage6_user_management.sql',\n description: 'Migration 004: Stage6 User Management',\n sql: \"-- Stage 6: User Management & Permissions enhancements\\n-- Enhanced user system with profiles, teams, permissions, and activity logging\\n\\n-- Add user profile and preferences columns\\nALTER TABLE users ADD COLUMN phone TEXT;\\nALTER TABLE users ADD COLUMN bio TEXT;\\nALTER TABLE users ADD COLUMN avatar_url TEXT;\\nALTER TABLE users ADD COLUMN timezone TEXT DEFAULT 'UTC';\\nALTER TABLE users ADD COLUMN language TEXT DEFAULT 'en';\\nALTER TABLE users ADD COLUMN email_notifications INTEGER DEFAULT 1;\\nALTER TABLE users ADD COLUMN theme TEXT DEFAULT 'dark';\\nALTER TABLE users ADD COLUMN two_factor_enabled INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN two_factor_secret TEXT;\\nALTER TABLE users ADD COLUMN password_reset_token TEXT;\\nALTER TABLE users ADD COLUMN password_reset_expires INTEGER;\\nALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN email_verification_token TEXT;\\nALTER TABLE users ADD COLUMN invitation_token TEXT;\\nALTER TABLE users ADD COLUMN invited_by TEXT REFERENCES users(id);\\nALTER TABLE users ADD COLUMN invited_at INTEGER;\\nALTER TABLE users ADD COLUMN accepted_invitation_at INTEGER;\\n\\n-- Create teams table for team-based collaboration\\nCREATE TABLE IF NOT EXISTS teams (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n slug TEXT NOT NULL UNIQUE,\\n owner_id TEXT NOT NULL REFERENCES users(id),\\n settings TEXT, -- JSON for team settings\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create team memberships table\\nCREATE TABLE IF NOT EXISTS team_memberships (\\n id TEXT PRIMARY KEY,\\n team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n role TEXT NOT NULL DEFAULT 'member', -- owner, admin, editor, member, viewer\\n permissions TEXT, -- JSON for specific permissions\\n joined_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(team_id, user_id)\\n);\\n\\n-- Create permissions table for granular access control\\nCREATE TABLE IF NOT EXISTS permissions (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n description TEXT,\\n category TEXT NOT NULL, -- content, users, collections, media, settings\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create role permissions mapping\\nCREATE TABLE IF NOT EXISTS role_permissions (\\n id TEXT PRIMARY KEY,\\n role TEXT NOT NULL,\\n permission_id TEXT NOT NULL REFERENCES permissions(id),\\n created_at INTEGER NOT NULL,\\n UNIQUE(role, permission_id)\\n);\\n\\n-- Create user sessions table for better session management\\nCREATE TABLE IF NOT EXISTS user_sessions (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n token_hash TEXT NOT NULL,\\n ip_address TEXT,\\n user_agent TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n expires_at INTEGER NOT NULL,\\n created_at INTEGER NOT NULL,\\n last_used_at INTEGER\\n);\\n\\n-- Create activity log table for audit trails\\nCREATE TABLE IF NOT EXISTS activity_logs (\\n id TEXT PRIMARY KEY,\\n user_id TEXT REFERENCES users(id),\\n action TEXT NOT NULL,\\n resource_type TEXT, -- users, content, collections, media, etc.\\n resource_id TEXT,\\n details TEXT, -- JSON with additional details\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create password history table for security\\nCREATE TABLE IF NOT EXISTS password_history (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n password_hash TEXT NOT NULL,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Insert default permissions\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at) VALUES\\n ('perm_content_create', 'content.create', 'Create new content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_read', 'content.read', 'View content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_update', 'content.update', 'Edit existing content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_delete', 'content.delete', 'Delete content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_publish', 'content.publish', 'Publish/unpublish content', 'content', strftime('%s', 'now') * 1000),\\n \\n ('perm_collections_create', 'collections.create', 'Create new collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_read', 'collections.read', 'View collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_update', 'collections.update', 'Edit collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_delete', 'collections.delete', 'Delete collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_fields', 'collections.fields', 'Manage collection fields', 'collections', strftime('%s', 'now') * 1000),\\n \\n ('perm_media_upload', 'media.upload', 'Upload media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_read', 'media.read', 'View media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_update', 'media.update', 'Edit media metadata', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_delete', 'media.delete', 'Delete media files', 'media', strftime('%s', 'now') * 1000),\\n \\n ('perm_users_create', 'users.create', 'Invite new users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_read', 'users.read', 'View user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_update', 'users.update', 'Edit user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_delete', 'users.delete', 'Deactivate users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_roles', 'users.roles', 'Manage user roles', 'users', strftime('%s', 'now') * 1000),\\n \\n ('perm_settings_read', 'settings.read', 'View system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_settings_update', 'settings.update', 'Modify system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_activity_read', 'activity.read', 'View activity logs', 'settings', strftime('%s', 'now') * 1000);\\n\\n-- Assign permissions to default roles\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at) VALUES\\n -- Admin has all permissions\\n ('rp_admin_content_create', 'admin', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_read', 'admin', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_update', 'admin', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_delete', 'admin', 'perm_content_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_publish', 'admin', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_create', 'admin', 'perm_collections_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_read', 'admin', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_update', 'admin', 'perm_collections_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_delete', 'admin', 'perm_collections_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_fields', 'admin', 'perm_collections_fields', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_upload', 'admin', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_read', 'admin', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_update', 'admin', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_delete', 'admin', 'perm_media_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_create', 'admin', 'perm_users_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_read', 'admin', 'perm_users_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_update', 'admin', 'perm_users_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_delete', 'admin', 'perm_users_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_roles', 'admin', 'perm_users_roles', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_read', 'admin', 'perm_settings_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_update', 'admin', 'perm_settings_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_activity_read', 'admin', 'perm_activity_read', strftime('%s', 'now') * 1000),\\n \\n -- Editor permissions\\n ('rp_editor_content_create', 'editor', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_read', 'editor', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_update', 'editor', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_publish', 'editor', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_editor_collections_read', 'editor', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_upload', 'editor', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_read', 'editor', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_update', 'editor', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_users_read', 'editor', 'perm_users_read', strftime('%s', 'now') * 1000),\\n \\n -- Viewer permissions\\n ('rp_viewer_content_read', 'viewer', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_collections_read', 'viewer', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_media_read', 'viewer', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_users_read', 'viewer', 'perm_users_read', strftime('%s', 'now') * 1000);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_team_id ON team_memberships(team_id);\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_user_id ON team_memberships(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_user_id ON user_sessions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_token_hash ON user_sessions(token_hash);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_user_id ON activity_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_created_at ON activity_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_resource ON activity_logs(resource_type, resource_id);\\nCREATE INDEX IF NOT EXISTS idx_password_history_user_id ON password_history(user_id);\\nCREATE INDEX IF NOT EXISTS idx_users_email_verification_token ON users(email_verification_token);\\nCREATE INDEX IF NOT EXISTS idx_users_password_reset_token ON users(password_reset_token);\\nCREATE INDEX IF NOT EXISTS idx_users_invitation_token ON users(invitation_token);\"\n },\n {\n id: '005',\n name: 'Stage7 Workflow Automation',\n filename: '005_stage7_workflow_automation.sql',\n description: 'Migration 005: Stage7 Workflow Automation',\n sql: \"-- Stage 7: Workflow & Automation Migration\\n-- This migration adds workflow and automation capabilities to SonicJS\\n\\n-- Workflow States Table\\nCREATE TABLE IF NOT EXISTS workflow_states (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n color TEXT DEFAULT '#6B7280',\\n is_initial INTEGER DEFAULT 0,\\n is_final INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Insert default workflow states\\nINSERT OR IGNORE INTO workflow_states (id, name, description, color, is_initial, is_final) VALUES\\n('draft', 'Draft', 'Content is being worked on', '#F59E0B', 1, 0),\\n('pending-review', 'Pending Review', 'Content is waiting for review', '#3B82F6', 0, 0),\\n('approved', 'Approved', 'Content has been approved', '#10B981', 0, 0),\\n('published', 'Published', 'Content is live', '#059669', 0, 1),\\n('rejected', 'Rejected', 'Content was rejected', '#EF4444', 0, 1),\\n('archived', 'Archived', 'Content has been archived', '#6B7280', 0, 1);\\n\\n-- Workflows Table\\nCREATE TABLE IF NOT EXISTS workflows (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT,\\n is_active INTEGER DEFAULT 1,\\n auto_publish INTEGER DEFAULT 0,\\n require_approval INTEGER DEFAULT 1,\\n approval_levels INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\\n);\\n\\n-- Workflow Transitions Table\\nCREATE TABLE IF NOT EXISTS workflow_transitions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT NOT NULL,\\n to_state_id TEXT NOT NULL,\\n required_permission TEXT,\\n auto_transition INTEGER DEFAULT 0,\\n transition_conditions TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE,\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id)\\n);\\n\\n-- Content Workflow Status Table\\nCREATE TABLE IF NOT EXISTS content_workflow_status (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n current_state_id TEXT NOT NULL,\\n assigned_to TEXT,\\n due_date DATETIME,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (current_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (assigned_to) REFERENCES users(id),\\n UNIQUE(content_id, workflow_id)\\n);\\n\\n-- Workflow History Table\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT,\\n to_state_id TEXT NOT NULL,\\n user_id TEXT NOT NULL,\\n comment TEXT,\\n metadata TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Scheduled Content Table\\nCREATE TABLE IF NOT EXISTS scheduled_content (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n action TEXT NOT NULL, -- 'publish', 'unpublish', 'archive'\\n scheduled_at DATETIME NOT NULL,\\n timezone TEXT DEFAULT 'UTC',\\n user_id TEXT NOT NULL,\\n status TEXT DEFAULT 'pending', -- 'pending', 'completed', 'failed', 'cancelled'\\n executed_at DATETIME,\\n error_message TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Notifications Table\\nCREATE TABLE IF NOT EXISTS notifications (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n type TEXT NOT NULL, -- 'workflow', 'schedule', 'system'\\n title TEXT NOT NULL,\\n message TEXT NOT NULL,\\n data TEXT, -- JSON\\n is_read INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\\n);\\n\\n-- Notification Preferences Table\\nCREATE TABLE IF NOT EXISTS notification_preferences (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n notification_type TEXT NOT NULL,\\n email_enabled INTEGER DEFAULT 1,\\n in_app_enabled INTEGER DEFAULT 1,\\n digest_frequency TEXT DEFAULT 'daily', -- 'immediate', 'hourly', 'daily', 'weekly'\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\\n UNIQUE(user_id, notification_type)\\n);\\n\\n-- Webhooks Table\\nCREATE TABLE IF NOT EXISTS webhooks (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n url TEXT NOT NULL,\\n secret TEXT,\\n events TEXT NOT NULL, -- JSON array of event types\\n is_active INTEGER DEFAULT 1,\\n retry_count INTEGER DEFAULT 3,\\n timeout_seconds INTEGER DEFAULT 30,\\n last_success_at DATETIME,\\n last_failure_at DATETIME,\\n failure_count INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Webhook Deliveries Table\\nCREATE TABLE IF NOT EXISTS webhook_deliveries (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n webhook_id TEXT NOT NULL,\\n event_type TEXT NOT NULL,\\n payload TEXT NOT NULL, -- JSON\\n response_status INTEGER,\\n response_body TEXT,\\n attempt_count INTEGER DEFAULT 1,\\n delivered_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE\\n);\\n\\n-- Content Versions Table (for rollback functionality)\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n version_number INTEGER NOT NULL,\\n title TEXT NOT NULL,\\n content TEXT NOT NULL,\\n fields TEXT, -- JSON\\n user_id TEXT NOT NULL,\\n change_summary TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, version_number)\\n);\\n\\n-- Automation Rules Table\\nCREATE TABLE IF NOT EXISTS automation_rules (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n trigger_type TEXT NOT NULL, -- 'content_created', 'content_updated', 'workflow_transition', 'schedule'\\n trigger_conditions TEXT, -- JSON\\n action_type TEXT NOT NULL, -- 'workflow_transition', 'send_notification', 'webhook_call', 'auto_save'\\n action_config TEXT, -- JSON\\n is_active INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Auto-save Drafts Table\\nCREATE TABLE IF NOT EXISTS auto_save_drafts (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT,\\n user_id TEXT NOT NULL,\\n title TEXT,\\n content TEXT,\\n fields TEXT, -- JSON\\n last_saved_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, user_id)\\n);\\n\\n-- Add workflow-related columns to existing content table (skip existing columns)\\nALTER TABLE content ADD COLUMN workflow_state_id TEXT DEFAULT 'draft';\\nALTER TABLE content ADD COLUMN embargo_until DATETIME;\\nALTER TABLE content ADD COLUMN expires_at DATETIME;\\nALTER TABLE content ADD COLUMN version_number INTEGER DEFAULT 1;\\nALTER TABLE content ADD COLUMN is_auto_saved INTEGER DEFAULT 0;\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_content_id ON content_workflow_status(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_workflow_id ON content_workflow_status(workflow_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content_id ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_scheduled_at ON scheduled_content(scheduled_at);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_status ON scheduled_content(status);\\nCREATE INDEX IF NOT EXISTS idx_notifications_user_id ON notifications(user_id);\\nCREATE INDEX IF NOT EXISTS idx_notifications_is_read ON notifications(is_read);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content_id ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_auto_save_drafts_user_id ON auto_save_drafts(user_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_state ON content(workflow_state_id);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\n\\n-- Insert default workflow for collections\\nINSERT OR IGNORE INTO workflows (id, name, description, collection_id, is_active, require_approval, approval_levels) \\nSELECT \\n 'default-' || id,\\n 'Default Workflow for ' || name,\\n 'Standard content approval workflow',\\n id,\\n 1,\\n 1,\\n 1\\nFROM collections;\\n\\n-- Insert default workflow transitions\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'draft',\\n 'pending-review',\\n 'content:submit'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'approved',\\n 'content:approve'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'approved',\\n 'published',\\n 'content:publish'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'rejected',\\n 'content:approve'\\nFROM workflows w;\\n\\n-- Insert default notification preferences for all users\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_assigned',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_status_change',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'content_scheduled',\\n 1,\\n 1\\nFROM users;\"\n },\n {\n id: '006',\n name: 'Plugin System',\n filename: '006_plugin_system.sql',\n description: 'Migration 006: Plugin System',\n sql: \"-- Plugin System Tables\\n-- Migration: 006_plugin_system\\n-- Description: Add plugin management system tables\\n\\n-- Plugins table\\nCREATE TABLE IF NOT EXISTS plugins (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n version TEXT NOT NULL,\\n author TEXT NOT NULL,\\n category TEXT NOT NULL,\\n icon TEXT,\\n status TEXT DEFAULT 'inactive' CHECK (status IN ('active', 'inactive', 'error')),\\n is_core BOOLEAN DEFAULT FALSE,\\n settings JSON,\\n permissions JSON,\\n dependencies JSON,\\n download_count INTEGER DEFAULT 0,\\n rating REAL DEFAULT 0,\\n installed_at INTEGER NOT NULL,\\n activated_at INTEGER,\\n last_updated INTEGER NOT NULL,\\n error_message TEXT,\\n created_at INTEGER DEFAULT (unixepoch()),\\n updated_at INTEGER DEFAULT (unixepoch())\\n);\\n\\n-- Plugin hooks table (registered hooks by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_hooks (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n hook_name TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n priority INTEGER DEFAULT 10,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, hook_name, handler_name)\\n);\\n\\n-- Plugin routes table\\nCREATE TABLE IF NOT EXISTS plugin_routes (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n path TEXT NOT NULL,\\n method TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n middleware JSON,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, path, method)\\n);\\n\\n-- Plugin assets table (CSS, JS files provided by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_assets (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n asset_type TEXT NOT NULL CHECK (asset_type IN ('css', 'js', 'image', 'font')),\\n asset_path TEXT NOT NULL,\\n load_order INTEGER DEFAULT 100,\\n load_location TEXT DEFAULT 'footer' CHECK (load_location IN ('header', 'footer')),\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Plugin activity log\\nCREATE TABLE IF NOT EXISTS plugin_activity_log (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n action TEXT NOT NULL,\\n user_id TEXT,\\n details JSON,\\n timestamp INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Create indexes\\nCREATE INDEX IF NOT EXISTS idx_plugins_status ON plugins(status);\\nCREATE INDEX IF NOT EXISTS idx_plugins_category ON plugins(category);\\nCREATE INDEX IF NOT EXISTS idx_plugin_hooks_plugin ON plugin_hooks(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_routes_plugin ON plugin_routes(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_assets_plugin ON plugin_assets(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_plugin ON plugin_activity_log(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_timestamp ON plugin_activity_log(timestamp);\\n\\n-- Insert core plugins\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES \\n(\\n 'core-auth',\\n 'core-auth',\\n 'Authentication System',\\n 'Core authentication and user management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔐',\\n 'active',\\n TRUE,\\n '[\\\"manage:users\\\", \\\"manage:roles\\\", \\\"manage:permissions\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-media',\\n 'core-media', \\n 'Media Manager',\\n 'Core media upload and management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'media',\\n '📸',\\n 'active',\\n TRUE,\\n '[\\\"manage:media\\\", \\\"upload:files\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-workflow',\\n 'core-workflow',\\n 'Workflow Engine',\\n 'Content workflow and approval system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin will be added as a third-party plugin through the admin interface\\n\\n-- Add plugin management permission\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at)\\nVALUES (\\n 'manage:plugins',\\n 'Manage Plugins',\\n 'Install, uninstall, activate, and configure plugins',\\n 'system',\\n unixepoch()\\n);\\n\\n-- Grant plugin management permission to admin role\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at)\\nVALUES ('role-perm-manage-plugins', 'admin', 'manage:plugins', unixepoch());\"\n },\n {\n id: '007',\n name: 'Demo Login Plugin',\n filename: '007_demo_login_plugin.sql',\n description: 'Migration 007: Demo Login Plugin',\n sql: \"-- Demo Login Plugin Migration\\n-- Migration: 007_demo_login_plugin\\n-- Description: Add demo login prefill plugin to the plugin registry\\n\\n-- Insert demo login plugin\\nINSERT INTO plugins (\\n id, name, display_name, description, version, author, category, icon, \\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'demo-login-prefill',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials (admin@sonicjs.com/sonicjs!) for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'inactive',\\n TRUE,\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\"\n },\n {\n id: '008',\n name: 'Fix Slug Validation',\n filename: '008_fix_slug_validation.sql',\n description: 'Migration 008: Fix Slug Validation',\n sql: \"-- Migration: Fix overly restrictive slug validation patterns\\n-- This migration relaxes the slug field validation to be more user-friendly\\n\\n-- Update the pages collection slug field to allow underscores and be less restrictive\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\\n-- Update any other slug fields with the restrictive pattern\\nUPDATE content_fields \\nSET field_options = REPLACE(field_options, '\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"', '\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\"')\\nWHERE field_options LIKE '%\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"%';\"\n },\n {\n id: '009',\n name: 'System Logging',\n filename: '009_system_logging.sql',\n description: 'Migration 009: System Logging',\n sql: \"-- System Logging Tables\\n-- Migration: 009_system_logging\\n-- Description: Add system logging and configuration tables\\n\\n-- System logs table for tracking application events\\nCREATE TABLE IF NOT EXISTS system_logs (\\n id TEXT PRIMARY KEY,\\n level TEXT NOT NULL CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n category TEXT NOT NULL CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n message TEXT NOT NULL,\\n data TEXT, -- JSON data\\n user_id TEXT,\\n session_id TEXT,\\n request_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n method TEXT,\\n url TEXT,\\n status_code INTEGER,\\n duration INTEGER, -- milliseconds\\n stack_trace TEXT,\\n tags TEXT, -- JSON array\\n source TEXT, -- source of the log entry\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Log configuration table for managing log settings per category\\nCREATE TABLE IF NOT EXISTS log_config (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL UNIQUE CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n enabled BOOLEAN NOT NULL DEFAULT TRUE,\\n level TEXT NOT NULL DEFAULT 'info' CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n retention_days INTEGER NOT NULL DEFAULT 30,\\n max_size_mb INTEGER NOT NULL DEFAULT 100,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_system_logs_level ON system_logs(level);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_category ON system_logs(category);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_created_at ON system_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_user_id ON system_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_status_code ON system_logs(status_code);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_source ON system_logs(source);\\n\\n-- Insert default log configurations\\nINSERT OR IGNORE INTO log_config (id, category, enabled, level, retention_days, max_size_mb) VALUES\\n('log-config-auth', 'auth', TRUE, 'info', 90, 50),\\n('log-config-api', 'api', TRUE, 'info', 30, 100),\\n('log-config-workflow', 'workflow', TRUE, 'info', 60, 50),\\n('log-config-plugin', 'plugin', TRUE, 'warn', 30, 25),\\n('log-config-media', 'media', TRUE, 'info', 30, 50),\\n('log-config-system', 'system', TRUE, 'info', 90, 100),\\n('log-config-security', 'security', TRUE, 'warn', 180, 100),\\n('log-config-error', 'error', TRUE, 'error', 90, 200);\"\n },\n {\n id: '011',\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql',\n description: 'Migration 011: Config Managed Collections',\n sql: \"-- Migration: Add Config-Managed Collections Support\\n-- Description: Add 'managed' column to collections table to support config-based collection definitions\\n-- Created: 2025-10-03\\n\\n-- Add 'managed' column to collections table\\n-- This column indicates whether a collection is managed by configuration files (true) or user-created (false)\\n-- Managed collections cannot be edited through the admin UI\\n-- Use a safe approach to add the column only if it doesn't exist\\nALTER TABLE collections ADD COLUMN managed INTEGER DEFAULT 0 NOT NULL;\\n\\n-- Create an index on the managed column for faster queries\\nCREATE INDEX IF NOT EXISTS idx_collections_managed ON collections(managed);\\n\\n-- Create an index on managed + is_active for efficient filtering\\nCREATE INDEX IF NOT EXISTS idx_collections_managed_active ON collections(managed, is_active);\\n\"\n },\n {\n id: '012',\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql',\n description: 'Migration 012: Testimonials Plugin',\n sql: \"-- Testimonials Plugin Migration\\n-- Creates testimonials table for the testimonials plugin\\n-- This demonstrates a code-based collection defined in src/plugins/core-plugins/testimonials-plugin.ts\\n\\nCREATE TABLE IF NOT EXISTS testimonials (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n author_name TEXT NOT NULL,\\n author_title TEXT,\\n author_company TEXT,\\n testimonial_text TEXT NOT NULL,\\n rating INTEGER CHECK(rating >= 1 AND rating <= 5),\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_testimonials_published ON testimonials(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_sort_order ON testimonials(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_rating ON testimonials(rating);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS testimonials_updated_at\\n AFTER UPDATE ON testimonials\\nBEGIN\\n UPDATE testimonials SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('testimonials',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support. This is a code-based collection example.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}');\\n\\n-- Insert sample testimonial data\\nINSERT OR IGNORE INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder) VALUES\\n('Jane Smith',\\n 'CTO',\\n 'TechStartup Inc',\\n 'SonicJS AI has transformed how we manage our content. The plugin architecture is brilliant and the edge deployment is blazing fast.',\\n 5,\\n 1,\\n 1),\\n\\n('Michael Chen',\\n 'Lead Developer',\\n 'Digital Agency Co',\\n 'We migrated from WordPress to SonicJS AI and couldn''t be happier. The TypeScript-first approach and modern tooling make development a joy.',\\n 5,\\n 1,\\n 2),\\n\\n('Sarah Johnson',\\n 'Product Manager',\\n 'E-commerce Solutions',\\n 'The headless CMS approach combined with Cloudflare Workers gives us unmatched performance. Our content is served globally with minimal latency.',\\n 4,\\n 1,\\n 3),\\n\\n('David Rodriguez',\\n 'Full Stack Developer',\\n 'Creative Studio',\\n 'Great CMS for modern web applications. The admin interface is clean and the API is well-designed. Plugin system is very flexible.',\\n 5,\\n 1,\\n 4),\\n\\n('Emily Watson',\\n 'Technical Director',\\n 'Media Company',\\n 'SonicJS AI solved our content distribution challenges. The R2 integration for media storage works flawlessly and scales effortlessly.',\\n 4,\\n 1,\\n 5);\\n\"\n },\n {\n id: '013',\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql',\n description: 'Migration 013: Code Examples Plugin',\n sql: \"-- Code Examples Plugin Migration\\n-- Creates code_examples table for the code examples plugin\\n-- This demonstrates a code-based collection for storing and managing code snippets\\n\\nCREATE TABLE IF NOT EXISTS code_examples (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n title TEXT NOT NULL,\\n description TEXT,\\n code TEXT NOT NULL,\\n language TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_code_examples_published ON code_examples(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_sort_order ON code_examples(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_language ON code_examples(language);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_category ON code_examples(category);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS code_examples_updated_at\\n AFTER UPDATE ON code_examples\\nBEGIN\\n UPDATE code_examples SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('code-examples',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support. Perfect for documentation and tutorials.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}');\\n\\n-- Insert sample code examples\\nINSERT OR IGNORE INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder) VALUES\\n('React useState Hook',\\n 'Basic example of using the useState hook in React for managing component state.',\\n 'import { useState } from ''react'';\\n\\nfunction Counter() {\\n const [count, setCount] = useState(0);\\n\\n return (\\n
\\n

Count: {count}

\\n \\n
\\n );\\n}\\n\\nexport default Counter;',\\n 'javascript',\\n 'frontend',\\n 'react,hooks,state',\\n 1,\\n 1),\\n\\n('TypeScript Interface Example',\\n 'Defining a TypeScript interface for type-safe objects.',\\n 'interface User {\\n id: string;\\n email: string;\\n name: string;\\n role: ''admin'' | ''editor'' | ''viewer'';\\n createdAt: Date;\\n}\\n\\nfunction greetUser(user: User): string {\\n return `Hello, ${user.name}!`;\\n}\\n\\nconst user: User = {\\n id: ''123'',\\n email: ''user@example.com'',\\n name: ''John Doe'',\\n role: ''admin'',\\n createdAt: new Date()\\n};\\n\\nconsole.log(greetUser(user));',\\n 'typescript',\\n 'backend',\\n 'typescript,types,interface',\\n 1,\\n 2),\\n\\n('Python List Comprehension',\\n 'Elegant way to create lists in Python using list comprehensions.',\\n '# Basic list comprehension\\nsquares = [x**2 for x in range(10)]\\nprint(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\\n\\n# With condition\\neven_squares = [x**2 for x in range(10) if x % 2 == 0]\\nprint(even_squares) # [0, 4, 16, 36, 64]\\n\\n# Nested list comprehension\\nmatrix = [[i+j for j in range(3)] for i in range(3)]\\nprint(matrix) # [[0, 1, 2], [1, 2, 3], [2, 3, 4]]',\\n 'python',\\n 'general',\\n 'python,lists,comprehension',\\n 1,\\n 3),\\n\\n('SQL Join Example',\\n 'Common SQL JOIN patterns for combining data from multiple tables.',\\n '-- INNER JOIN: Returns only matching rows\\nSELECT users.name, orders.total\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id;\\n\\n-- LEFT JOIN: Returns all users, even without orders\\nSELECT users.name, orders.total\\nFROM users\\nLEFT JOIN orders ON users.id = orders.user_id;\\n\\n-- Multiple JOINs\\nSELECT\\n users.name,\\n orders.order_date,\\n products.name AS product_name\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id\\nINNER JOIN order_items ON orders.id = order_items.order_id\\nINNER JOIN products ON order_items.product_id = products.id;',\\n 'sql',\\n 'database',\\n 'sql,joins,queries',\\n 1,\\n 4),\\n\\n('Go Error Handling',\\n 'Idiomatic error handling pattern in Go.',\\n 'package main\\n\\nimport (\\n\\t\\\"errors\\\"\\n\\t\\\"fmt\\\"\\n)\\n\\nfunc divide(a, b float64) (float64, error) {\\n\\tif b == 0 {\\n\\t\\treturn 0, errors.New(\\\"division by zero\\\")\\n\\t}\\n\\treturn a / b, nil\\n}\\n\\nfunc main() {\\n\\tresult, err := divide(10, 2)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t\\treturn\\n\\t}\\n\\tfmt.Printf(\\\"Result: %.2f\\\\n\\\", result)\\n\\n\\t// This will error\\n\\t_, err = divide(10, 0)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t}\\n}',\\n 'go',\\n 'backend',\\n 'go,error-handling,functions',\\n 1,\\n 5);\\n\"\n },\n {\n id: '014',\n name: 'Fix Plugin Registry',\n filename: '014_fix_plugin_registry.sql',\n description: 'Migration 014: Fix Plugin Registry',\n sql: \"-- Fix Plugin Registry\\n-- Migration: 014_fix_plugin_registry\\n-- Description: Add missing plugins and fix plugin name mismatches\\n\\n-- Note: Cannot easily update plugin names as they may be referenced elsewhere\\n-- Instead we'll add the missing plugins with correct names\\n\\n-- Insert missing plugins\\n\\n-- Core Analytics Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'core-analytics',\\n 'core-analytics',\\n 'Analytics & Tracking',\\n 'Core analytics tracking and reporting plugin with page views and event tracking',\\n '1.0.0',\\n 'SonicJS Team',\\n 'seo',\\n '📊',\\n 'active',\\n TRUE,\\n '[\\\"view:analytics\\\", \\\"manage:tracking\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'faq-plugin',\\n 'faq-plugin',\\n 'FAQ Management',\\n 'Frequently Asked Questions management plugin with categories, search, and custom styling',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '❓',\\n 'active',\\n FALSE,\\n '[\\\"manage:faqs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Seed Data Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'seed-data',\\n 'seed-data',\\n 'Seed Data Generator',\\n 'Generate realistic example users and content for testing and development',\\n '1.0.0',\\n 'SonicJS Team',\\n 'development',\\n '🌱',\\n 'inactive',\\n FALSE,\\n '[\\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Database Tools Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'database-tools',\\n 'database-tools',\\n 'Database Tools',\\n 'Database management tools including truncate, backup, and validation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'system',\\n '🗄️',\\n 'active',\\n FALSE,\\n '[\\\"manage:database\\\", \\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '015',\n name: 'Add Remaining Plugins',\n filename: '015_add_remaining_plugins.sql',\n description: 'Migration 015: Add Remaining Plugins',\n sql: \"-- Add Remaining Plugins\\n-- Migration: 015_add_remaining_plugins\\n-- Description: Add all remaining core plugins that were missing from the registry\\n\\n-- Testimonials Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'testimonials-plugin',\\n 'testimonials-plugin',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '⭐',\\n 'active',\\n FALSE,\\n '[\\\"manage:testimonials\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Code Examples Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'code-examples-plugin',\\n 'code-examples-plugin',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '💻',\\n 'active',\\n FALSE,\\n '[\\\"manage:code-examples\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Workflow Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'workflow-plugin',\\n 'workflow-plugin',\\n 'Workflow Engine',\\n 'Content workflow management with approval chains, scheduling, and automation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Demo Login Plugin (already exists with correct name from migration 007, but let's ensure it's there)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'demo-login-plugin',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '016',\n name: 'Remove Duplicate Cache Plugin',\n filename: '016_remove_duplicate_cache_plugin.sql',\n description: 'Migration 016: Remove Duplicate Cache Plugin',\n sql: \"-- Migration: Remove duplicate cache plugin entry\\n-- Description: Removes the old 'cache' plugin (id: 'cache') that is a duplicate of 'core-cache'\\n-- This fixes the issue where Cache System appears twice in the plugins list\\n-- Created: 2025-10-14\\n\\n-- Remove the old 'cache' plugin entry if it exists\\n-- The correct plugin is 'core-cache' which is managed by plugin-bootstrap.ts\\nDELETE FROM plugins WHERE id = 'cache' AND name = 'cache';\\n\\n-- Clean up any related entries in plugin activity log\\nDELETE FROM plugin_activity_log WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin hooks\\nDELETE FROM plugin_hooks WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin routes\\nDELETE FROM plugin_routes WHERE plugin_id = 'cache';\\n\"\n },\n {\n id: '017',\n name: 'Auth Configurable Fields',\n filename: '017_auth_configurable_fields.sql',\n description: 'Migration 017: Auth Configurable Fields',\n sql: \"-- Migration: Make authentication fields configurable\\n-- This migration updates the core-auth plugin to support configurable required fields\\n\\n-- The settings will be stored in the plugins table as JSON\\n-- Default settings for core-auth plugin include:\\n-- {\\n-- \\\"requiredFields\\\": {\\n-- \\\"email\\\": { \\\"required\\\": true, \\\"minLength\\\": 5 },\\n-- \\\"password\\\": { \\\"required\\\": true, \\\"minLength\\\": 8 },\\n-- \\\"username\\\": { \\\"required\\\": true, \\\"minLength\\\": 3 },\\n-- \\\"firstName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 },\\n-- \\\"lastName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 }\\n-- },\\n-- \\\"validation\\\": {\\n-- \\\"emailFormat\\\": true,\\n-- \\\"allowDuplicateUsernames\\\": false\\n-- }\\n-- }\\n\\n-- Update core-auth plugin settings with configurable field requirements\\nUPDATE plugins\\nSET settings = json_object(\\n 'requiredFields', json_object(\\n 'email', json_object('required', 1, 'minLength', 5, 'label', 'Email', 'type', 'email'),\\n 'password', json_object('required', 1, 'minLength', 8, 'label', 'Password', 'type', 'password'),\\n 'username', json_object('required', 1, 'minLength', 3, 'label', 'Username', 'type', 'text'),\\n 'firstName', json_object('required', 1, 'minLength', 1, 'label', 'First Name', 'type', 'text'),\\n 'lastName', json_object('required', 1, 'minLength', 1, 'label', 'Last Name', 'type', 'text')\\n ),\\n 'validation', json_object(\\n 'emailFormat', 1,\\n 'allowDuplicateUsernames', 0,\\n 'passwordRequirements', json_object(\\n 'requireUppercase', 0,\\n 'requireLowercase', 0,\\n 'requireNumbers', 0,\\n 'requireSpecialChars', 0\\n )\\n ),\\n 'registration', json_object(\\n 'enabled', 1,\\n 'requireEmailVerification', 0,\\n 'defaultRole', 'viewer'\\n )\\n)\\nWHERE id = 'core-auth';\\n\\n-- If core-auth plugin doesn't exist, this migration will be handled by bootstrap\\n-- No need to insert here as plugin bootstrap handles initial plugin creation\\n\"\n },\n {\n id: '018',\n name: 'Settings Table',\n filename: '018_settings_table.sql',\n description: 'Migration 018: Settings Table',\n sql: \"-- Create settings table for storing application settings\\nCREATE TABLE IF NOT EXISTS settings (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL, -- 'general', 'appearance', 'security', etc.\\n key TEXT NOT NULL,\\n value TEXT NOT NULL, -- JSON value\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(category, key)\\n);\\n\\n-- Insert default general settings\\nINSERT OR IGNORE INTO settings (id, category, key, value, created_at, updated_at)\\nVALUES\\n (lower(hex(randomblob(16))), 'general', 'siteName', '\\\"SonicJS AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'siteDescription', '\\\"A modern headless CMS powered by AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'timezone', '\\\"UTC\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'language', '\\\"en\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'maintenanceMode', 'false', unixepoch() * 1000, unixepoch() * 1000);\\n\\n-- Create index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);\\nCREATE INDEX IF NOT EXISTS idx_settings_category_key ON settings(category, key);\\n\"\n },\n {\n id: '019',\n name: 'Remove Blog Posts Collection',\n filename: '019_remove_blog_posts_collection.sql',\n description: 'Migration 019: Remove Blog Posts Collection',\n sql: \"-- Migration: Remove blog_posts from database-managed collections\\n-- Description: Remove blog-posts-collection from the database so it can be managed by code-based collection\\n-- Created: 2025-11-04\\n\\n-- Delete content associated with blog-posts-collection\\nDELETE FROM content WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete content fields for blog-posts-collection\\nDELETE FROM content_fields WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete the blog-posts collection itself\\nDELETE FROM collections WHERE id = 'blog-posts-collection';\\n\\n-- The blog-posts collection will now be managed by the code-based collection\\n-- in src/collections/blog-posts.collection.ts\\n\"\n },\n {\n id: '020',\n name: 'Add Email Plugin',\n filename: '020_add_email_plugin.sql',\n description: 'Migration 020: Add Email Plugin',\n sql: \"-- Add Email Plugin\\n-- Migration: 020_add_email_plugin\\n-- Description: Add email plugin for transactional emails via Resend\\n\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'email',\\n 'email',\\n 'Email',\\n 'Send transactional emails using Resend',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'utilities',\\n '📧',\\n 'inactive',\\n TRUE,\\n '[\\\"email:manage\\\", \\\"email:send\\\", \\\"email:view-logs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '021',\n name: 'Add Magic Link Auth Plugin',\n filename: '021_add_magic_link_auth_plugin.sql',\n description: 'Migration 021: Add Magic Link Auth Plugin',\n sql: \"-- Add Magic Link Authentication Plugin\\n-- Migration: 021_add_magic_link_auth_plugin\\n-- Description: Add magic link authentication plugin for passwordless login\\n\\n-- Create magic_links table\\nCREATE TABLE IF NOT EXISTS magic_links (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_magic_links_token ON magic_links(token);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_email ON magic_links(user_email);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_expires ON magic_links(expires_at);\\n\\n-- Register the plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'magic-link-auth',\\n 'magic-link-auth',\\n 'Magic Link Authentication',\\n 'Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔗',\\n 'inactive',\\n FALSE,\\n '[\\\"auth:manage\\\", \\\"auth:magic-link\\\"]',\\n '[\\\"email\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '022',\n name: 'Add Tinymce Plugin',\n filename: '022_add_tinymce_plugin.sql',\n description: 'Migration 022: Add Tinymce Plugin',\n sql: \"-- Add TinyMCE Rich Text Editor Plugin\\n-- Migration: 022_add_tinymce_plugin\\n-- Description: Add TinyMCE plugin for WYSIWYG rich text editing\\n\\n-- Register the plugin (active by default since it replaces hardcoded TinyMCE)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'tinymce-plugin',\\n 'tinymce-plugin',\\n 'TinyMCE Rich Text Editor',\\n 'Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✏️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"apiKey\\\":\\\"no-api-key\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"skin\\\":\\\"oxide-dark\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '023',\n name: 'Add Easy Mdx Plugin',\n filename: '023_add_easy_mdx_plugin.sql',\n description: 'Migration 023: Add Easy Mdx Plugin',\n sql: \"-- Add EasyMDE Markdown Editor Plugin\\n-- Migration: 023_add_easy_mdx_plugin\\n-- Description: Add EasyMDE plugin for lightweight markdown editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easy-mdx',\\n 'easy-mdx',\\n 'EasyMDE Markdown Editor',\\n 'Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '📝',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"defaultHeight\\\":400,\\\"theme\\\":\\\"dark\\\",\\\"toolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '024',\n name: 'Add Quill Editor Plugin',\n filename: '024_add_quill_editor_plugin.sql',\n description: 'Migration 024: Add Quill Editor Plugin',\n sql: \"-- Add Quill Rich Text Editor Plugin\\n-- Migration: 024_add_quill_editor_plugin\\n-- Description: Add Quill plugin for modern rich text editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'quill-editor',\\n 'quill-editor',\\n 'Quill Rich Text Editor',\\n 'Modern rich text editor for content creation. Provides a clean, intuitive WYSIWYG editor with customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"snow\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '025',\n name: 'Add Easymde Plugin',\n filename: '025_add_easymde_plugin.sql',\n description: 'Migration 025: Add Easymde Plugin',\n sql: \"-- Add EasyMDE Rich Text Editor Plugin\\n-- Migration: 025_add_easymde_plugin\\n-- Description: Add EasyMDE plugin for markdown-based rich text editing\\n\\n-- Register the plugin (inactive by default, replacing MDXEditor)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easymde-editor',\\n 'easymde-editor',\\n 'EasyMDE Editor',\\n 'Lightweight markdown editor for content creation. Simple, elegant WYSIWYG markdown editor with live preview, toolbar, and dark mode support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'inactive',\\n TRUE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"dark\\\",\\\"defaultHeight\\\":300,\\\"toolbar\\\":\\\"full\\\",\\\"spellChecker\\\":false,\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '026',\n name: 'Add Otp Login',\n filename: '026_add_otp_login.sql',\n description: 'Migration 026: Add Otp Login',\n sql: \"-- Add OTP Login Plugin\\n-- Migration: 021_add_otp_login\\n-- Description: Add OTP login plugin for passwordless authentication via email codes\\n\\n-- Create table for OTP codes\\nCREATE TABLE IF NOT EXISTS otp_codes (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n code TEXT NOT NULL,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n attempts INTEGER DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_otp_email_code ON otp_codes(user_email, code);\\nCREATE INDEX IF NOT EXISTS idx_otp_expires ON otp_codes(expires_at);\\nCREATE INDEX IF NOT EXISTS idx_otp_used ON otp_codes(used);\\n\\n-- Add plugin record\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'otp-login',\\n 'otp-login',\\n 'OTP Login',\\n 'Passwordless authentication via email one-time codes',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'security',\\n '🔢',\\n 'inactive',\\n TRUE,\\n '[\\\"otp:manage\\\", \\\"otp:request\\\", \\\"otp:verify\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '027',\n name: 'Fix Slug Field Type',\n filename: '027_fix_slug_field_type.sql',\n description: 'Migration 027: Fix Slug Field Type',\n sql: \"-- Migration: Fix slug field type\\n-- Description: Update slug fields to use 'slug' field type instead of 'text' for proper auto-generation\\n-- Created: 2026-01-10\\n\\n-- Update pages collection slug field to use 'slug' field type\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\"\n },\n {\n id: '028',\n name: 'Fix Slug Field Type In Schemas',\n filename: '028_fix_slug_field_type_in_schemas.sql',\n description: 'Migration 028: Fix Slug Field Type In Schemas',\n sql: \"-- Migration: Fix slug field type in collection schemas\\n-- Description: Update slug fields in collection schemas to use 'slug' type instead of 'string'\\n-- Created: 2026-01-10\\n\\n-- Update pages-collection schema\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'pages-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update blog-posts-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'blog-posts-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update news-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'news-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\"\n },\n {\n id: '029',\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql',\n description: 'Migration 029: Add Forms System',\n sql: \"-- Migration: 029_add_forms_system.sql\\n-- Description: Add Form.io integration for advanced form building\\n-- Date: January 23, 2026\\n-- Phase: 1 - Database Schema\\n\\n-- =====================================================\\n-- Table: forms\\n-- Description: Stores form definitions and configuration\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS forms (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE, -- Machine name (e.g., \\\"contact-form\\\")\\n display_name TEXT NOT NULL, -- Human name (e.g., \\\"Contact Form\\\")\\n description TEXT, -- Optional description\\n category TEXT DEFAULT 'general', -- Form category (contact, survey, registration, etc.)\\n \\n -- Form.io schema (JSON)\\n formio_schema TEXT NOT NULL, -- Complete Form.io JSON schema\\n \\n -- Settings\\n settings TEXT, -- JSON: {\\n -- emailNotifications: true,\\n -- notifyEmail: \\\"admin@example.com\\\",\\n -- successMessage: \\\"Thank you!\\\",\\n -- redirectUrl: \\\"/thank-you\\\",\\n -- allowAnonymous: true,\\n -- requireAuth: false,\\n -- maxSubmissions: null,\\n -- submitButtonText: \\\"Submit\\\",\\n -- saveProgress: true,\\n -- webhookUrl: null\\n -- }\\n \\n -- Status & Management\\n is_active INTEGER DEFAULT 1, -- Active/inactive flag\\n is_public INTEGER DEFAULT 1, -- Public (anyone) vs private (auth required)\\n managed INTEGER DEFAULT 0, -- Code-managed (like collections)\\n \\n -- Metadata\\n icon TEXT, -- Optional icon for admin UI\\n color TEXT, -- Optional color (hex) for admin UI\\n tags TEXT, -- JSON array of tags\\n \\n -- Stats\\n submission_count INTEGER DEFAULT 0, -- Total submissions received\\n view_count INTEGER DEFAULT 0, -- Form views (optional tracking)\\n \\n -- Ownership\\n created_by TEXT REFERENCES users(id), -- User who created the form\\n updated_by TEXT REFERENCES users(id), -- User who last updated\\n \\n -- Timestamps\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for forms\\nCREATE INDEX IF NOT EXISTS idx_forms_name ON forms(name);\\nCREATE INDEX IF NOT EXISTS idx_forms_category ON forms(category);\\nCREATE INDEX IF NOT EXISTS idx_forms_active ON forms(is_active);\\nCREATE INDEX IF NOT EXISTS idx_forms_public ON forms(is_public);\\nCREATE INDEX IF NOT EXISTS idx_forms_created_by ON forms(created_by);\\n\\n-- =====================================================\\n-- Table: form_submissions\\n-- Description: Stores submitted form data\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_submissions (\\n id TEXT PRIMARY KEY,\\n form_id TEXT NOT NULL REFERENCES forms(id) ON DELETE CASCADE,\\n \\n -- Submission data\\n submission_data TEXT NOT NULL, -- JSON: The actual form data submitted\\n \\n -- Submission metadata\\n status TEXT DEFAULT 'pending', -- pending, reviewed, approved, rejected, spam\\n submission_number INTEGER, -- Sequential number per form\\n \\n -- User information (if authenticated)\\n user_id TEXT REFERENCES users(id), -- Submitter user ID (if logged in)\\n user_email TEXT, -- Email from form (or user account)\\n \\n -- Tracking information\\n ip_address TEXT, -- IP address of submitter\\n user_agent TEXT, -- Browser user agent\\n referrer TEXT, -- Page that referred to form\\n utm_source TEXT, -- UTM tracking params\\n utm_medium TEXT,\\n utm_campaign TEXT,\\n \\n -- Review/Processing\\n reviewed_by TEXT REFERENCES users(id), -- Admin who reviewed\\n reviewed_at INTEGER, -- Review timestamp\\n review_notes TEXT, -- Admin notes\\n \\n -- Flags\\n is_spam INTEGER DEFAULT 0, -- Spam flag\\n is_archived INTEGER DEFAULT 0, -- Archived flag\\n \\n -- Timestamps\\n submitted_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for submissions\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_form_id ON form_submissions(form_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_status ON form_submissions(status);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_user_id ON form_submissions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_email ON form_submissions(user_email);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_submitted_at ON form_submissions(submitted_at);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_spam ON form_submissions(is_spam);\\n\\n-- Trigger to auto-increment submission_number per form\\nCREATE TRIGGER IF NOT EXISTS set_submission_number\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE form_submissions \\n SET submission_number = (\\n SELECT COUNT(*) \\n FROM form_submissions \\n WHERE form_id = NEW.form_id \\n AND id <= NEW.id\\n )\\n WHERE id = NEW.id;\\nEND;\\n\\n-- Trigger to update form submission_count\\nCREATE TRIGGER IF NOT EXISTS increment_form_submission_count\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE forms \\n SET submission_count = submission_count + 1,\\n updated_at = unixepoch() * 1000\\n WHERE id = NEW.form_id;\\nEND;\\n\\n-- =====================================================\\n-- Table: form_files (Optional)\\n-- Description: Link form submissions to uploaded files\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_files (\\n id TEXT PRIMARY KEY,\\n submission_id TEXT NOT NULL REFERENCES form_submissions(id) ON DELETE CASCADE,\\n media_id TEXT NOT NULL REFERENCES media(id) ON DELETE CASCADE,\\n field_name TEXT NOT NULL, -- Form field that uploaded this file\\n uploaded_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for form files\\nCREATE INDEX IF NOT EXISTS idx_form_files_submission ON form_files(submission_id);\\nCREATE INDEX IF NOT EXISTS idx_form_files_media ON form_files(media_id);\\n\\n-- =====================================================\\n-- Sample Data: Create a default contact form\\n-- =====================================================\\n\\nINSERT OR IGNORE INTO forms (\\n id,\\n name,\\n display_name,\\n description,\\n category,\\n formio_schema,\\n settings,\\n is_active,\\n is_public,\\n created_at,\\n updated_at\\n) VALUES (\\n 'default-contact-form',\\n 'contact',\\n 'Contact Form',\\n 'A simple contact form for getting in touch',\\n 'contact',\\n '{\\\"components\\\":[]}',\\n '{\\\"emailNotifications\\\":false,\\\"successMessage\\\":\\\"Thank you for your submission!\\\",\\\"submitButtonText\\\":\\\"Submit\\\",\\\"requireAuth\\\":false}',\\n 1,\\n 1,\\n unixepoch() * 1000,\\n unixepoch() * 1000\\n);\\n\"\n },\n {\n id: '030',\n name: 'Add Turnstile To Forms',\n filename: '030_add_turnstile_to_forms.sql',\n description: 'Migration 030: Add Turnstile To Forms',\n sql: \"-- Add Turnstile configuration to forms table\\n-- This allows per-form Turnstile settings with global fallback\\n\\n-- Add columns (D1 may not support CHECK constraints in ALTER TABLE)\\nALTER TABLE forms ADD COLUMN turnstile_enabled INTEGER DEFAULT 0;\\nALTER TABLE forms ADD COLUMN turnstile_settings TEXT;\\n\\n-- Set default to inherit global settings for existing forms\\nUPDATE forms \\nSET turnstile_settings = '{\\\"inherit\\\":true}' \\nWHERE turnstile_settings IS NULL;\\n\\n-- Add index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_forms_turnstile ON forms(turnstile_enabled);\\n\"\n },\n {\n id: '031',\n name: 'Ai Search Plugin',\n filename: '031_ai_search_plugin.sql',\n description: 'Migration 031: Ai Search Plugin',\n sql: \"-- AI Search plugin settings\\nCREATE TABLE IF NOT EXISTS ai_search_settings (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n enabled BOOLEAN DEFAULT 0,\\n ai_mode_enabled BOOLEAN DEFAULT 1,\\n selected_collections TEXT, -- JSON array of collection IDs to index\\n dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index\\n autocomplete_enabled BOOLEAN DEFAULT 1,\\n cache_duration INTEGER DEFAULT 1, -- hours\\n results_limit INTEGER DEFAULT 20,\\n index_media BOOLEAN DEFAULT 0,\\n index_status TEXT, -- JSON object with status per collection\\n last_indexed_at INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Search history/analytics\\nCREATE TABLE IF NOT EXISTS ai_search_history (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n query TEXT NOT NULL,\\n mode TEXT, -- 'ai' or 'keyword'\\n results_count INTEGER,\\n user_id INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index metadata tracking (per collection)\\nCREATE TABLE IF NOT EXISTS ai_search_index_meta (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n collection_id INTEGER NOT NULL,\\n collection_name TEXT NOT NULL, -- Cache collection name for display\\n total_items INTEGER DEFAULT 0,\\n indexed_items INTEGER DEFAULT 0,\\n last_sync_at INTEGER,\\n status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'\\n error_message TEXT,\\n UNIQUE(collection_id)\\n);\\n\\n-- Indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);\\n\"\n },\n {\n id: '032',\n name: 'User Profiles',\n filename: '032_user_profiles.sql',\n description: 'Migration 032: User Profiles',\n sql: \"-- User Profiles Table (Core Migration)\\n-- Stores extended user profile data separate from auth concerns\\n-- Required by admin-users.ts for user edit page profile management\\n--\\n-- Originally introduced as app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\\n-- in upstream PR #508. Core routes (admin-users.ts) were updated to query this table in PR #512,\\n-- but no corresponding core migration was added. This migration corrects that gap.\\n--\\n-- IF NOT EXISTS guards ensure idempotency for databases that already have the table\\n-- from the app-level migration.\\n\\nCREATE TABLE IF NOT EXISTS user_profiles (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,\\n\\n display_name TEXT,\\n bio TEXT,\\n company TEXT,\\n job_title TEXT,\\n website TEXT,\\n location TEXT,\\n date_of_birth INTEGER,\\n data TEXT DEFAULT '{}',\\n\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index for fast user lookups\\nCREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);\\n\\n-- Trigger to auto-update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS user_profiles_updated_at\\n AFTER UPDATE ON user_profiles\\nBEGIN\\n UPDATE user_profiles SET updated_at = strftime('%s', 'now') * 1000 WHERE id = NEW.id;\\nEND;\\n\"\n },\n {\n id: '033',\n name: 'Form Content Integration',\n filename: '033_form_content_integration.sql',\n description: 'Migration 033: Form Content Integration',\n sql: \"-- Migration 033: Form-Content Integration\\n-- Adds bridge columns to link forms to collections and submissions to content items\\n\\n-- Add source_type and source_id to collections for form-derived collections\\nALTER TABLE collections ADD COLUMN source_type TEXT DEFAULT 'user';\\nALTER TABLE collections ADD COLUMN source_id TEXT;\\n\\n-- Index for efficient lookup of form-derived collections\\nCREATE INDEX IF NOT EXISTS idx_collections_source ON collections(source_type, source_id);\\n\\n-- Add content_id to form_submissions for linking to content items\\nALTER TABLE form_submissions ADD COLUMN content_id TEXT REFERENCES content(id);\\n\\n-- Index for efficient lookup by content_id\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_content_id ON form_submissions(content_id);\\n\\n-- Create system user for anonymous form submissions\\nINSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\\nVALUES ('system-form-submission', 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', NULL, 'viewer', 0, strftime('%s','now') * 1000, strftime('%s','now') * 1000);\\n\"\n },\n {\n id: '034',\n name: 'Security Audit Plugin',\n filename: '034_security_audit_plugin.sql',\n description: 'Migration 034: Security Audit Plugin',\n sql: \"-- Security Audit Plugin\\n-- Tracks login attempts, registrations, and security events for monitoring and brute-force detection\\n\\nCREATE TABLE IF NOT EXISTS security_events (\\n id TEXT PRIMARY KEY,\\n event_type TEXT NOT NULL,\\n severity TEXT NOT NULL DEFAULT 'info',\\n user_id TEXT,\\n email TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n country_code TEXT,\\n request_path TEXT,\\n request_method TEXT,\\n details TEXT,\\n fingerprint TEXT,\\n blocked INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type);\\nCREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_security_events_email ON security_events(email);\\nCREATE INDEX IF NOT EXISTS idx_security_events_ip ON security_events(ip_address);\\nCREATE INDEX IF NOT EXISTS idx_security_events_severity ON security_events(severity);\\nCREATE INDEX IF NOT EXISTS idx_security_events_created ON security_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_security_events_fingerprint ON security_events(fingerprint);\\n\"\n },\n {\n id: '035',\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql',\n description: 'Migration 035: User Profiles Data Column',\n sql: \"-- Migration 035: Add data column to user_profiles (no-op)\\n--\\n-- This migration originally added a missing 'data' column to user_profiles.\\n-- Migration 032 has since been updated to include the column in the CREATE TABLE,\\n-- so on fresh installs the column already exists by the time this runs.\\n--\\n-- The ALTER TABLE has been removed to prevent \\\"duplicate column name: data\\\" errors\\n-- during fresh installs (GitHub issue #771). Wrangler's migration runner does not\\n-- gracefully handle duplicate column errors like the runtime MigrationService does.\\n--\\n-- Existing databases that ran the old 032 (without the data column) get the column\\n-- added at runtime by the core MigrationService, which skips duplicate-column errors.\\n--\\n-- This file is kept as a no-op so that wrangler's migration tracking remains\\n-- consistent (it tracks migrations by filename).\\nSELECT 1;\\n\"\n },\n {\n id: '036',\n name: 'Analytics Events',\n filename: '036_analytics_events.sql',\n description: 'Migration 036: Analytics Events',\n sql: \"-- Migration 036: Analytics Events Table\\n-- Provides storage for user behavior event tracking (page views, custom events)\\n\\nCREATE TABLE IF NOT EXISTS analytics_events (\\n id TEXT PRIMARY KEY,\\n event TEXT NOT NULL,\\n category TEXT NOT NULL DEFAULT 'user-activity',\\n properties TEXT,\\n user_id TEXT,\\n session_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n path TEXT,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_event ON analytics_events(event);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_category ON analytics_events(category);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_user_id ON analytics_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_session_id ON analytics_events(session_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_created_at ON analytics_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_path ON analytics_events(path);\\n\"\n }\n]\n\n// Map for quick lookup by ID\nexport const migrationsByIdMap = new Map(\n bundledMigrations.map(m => [m.id, m])\n)\n\n// Get migration SQL by ID\nexport function getMigrationSQLById(id: string): string | null {\n return migrationsByIdMap.get(id)?.sql ?? null\n}\n\n// Get all migration info (without SQL for lighter payloads)\nexport function getMigrationList(): Array> {\n return bundledMigrations.map(({ sql, ...rest }) => rest)\n}\n","import { D1Database } from '@cloudflare/workers-types'\nimport { bundledMigrations, getMigrationSQLById, type BundledMigration } from '../db/migrations-bundle'\n\nexport interface Migration {\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n}\n\nexport interface MigrationStatus {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Migration[]\n}\n\nexport class MigrationService {\n constructor(private db: D1Database) {}\n\n /**\n * Initialize the migrations tracking table\n */\n async initializeMigrationsTable(): Promise {\n const createTableQuery = `\n CREATE TABLE IF NOT EXISTS migrations (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n filename TEXT NOT NULL,\n applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n checksum TEXT\n )\n `\n\n await this.db.prepare(createTableQuery).run()\n }\n\n /**\n * Get all available migrations from the bundled migrations\n */\n async getAvailableMigrations(): Promise {\n const migrations: Migration[] = []\n\n // Get applied migrations from database\n const appliedResult = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at ASC'\n ).all()\n\n const appliedMigrations = new Map(\n appliedResult.results?.map((row: any) => [row.id, row]) || []\n )\n\n // Auto-detect applied migrations by checking if their tables exist\n await this.autoDetectAppliedMigrations(appliedMigrations)\n\n // Use bundled migrations as the source of truth\n for (const bundled of bundledMigrations) {\n const applied = appliedMigrations.has(bundled.id)\n const appliedData = appliedMigrations.get(bundled.id)\n\n migrations.push({\n id: bundled.id,\n name: bundled.name,\n filename: bundled.filename,\n description: bundled.description,\n applied,\n appliedAt: applied ? appliedData?.applied_at : undefined,\n size: bundled.sql.length\n })\n }\n\n return migrations\n }\n\n /**\n * Auto-detect applied migrations by checking if their tables exist\n */\n private async autoDetectAppliedMigrations(appliedMigrations: Map): Promise {\n // Check if basic schema tables exist (migration 001)\n if (!appliedMigrations.has('001')) {\n const hasBasicTables = await this.checkTablesExist(['users', 'content', 'collections', 'media'])\n if (hasBasicTables) {\n appliedMigrations.set('001', {\n id: '001',\n applied_at: new Date().toISOString(),\n name: 'Initial Schema',\n filename: '001_initial_schema.sql'\n })\n await this.markMigrationApplied('001', 'Initial Schema', '001_initial_schema.sql')\n }\n }\n\n // Check if FAQ tables exist (migration 002)\n // Migration 002 creates only the 'faqs' table\n if (!appliedMigrations.has('002')) {\n const hasFaqTables = await this.checkTablesExist(['faqs'])\n if (hasFaqTables) {\n appliedMigrations.set('002', {\n id: '002',\n applied_at: new Date().toISOString(),\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql'\n })\n await this.markMigrationApplied('002', 'Faq Plugin', '002_faq_plugin.sql')\n }\n }\n\n // Check if stage 5 enhancement tables exist (migration 003)\n // Migration 003 creates content_fields, content_relationships, workflow_templates tables\n if (!appliedMigrations.has('003')) {\n const hasStage5Tables = await this.checkTablesExist(['content_fields', 'content_relationships', 'workflow_templates'])\n if (hasStage5Tables) {\n appliedMigrations.set('003', {\n id: '003',\n applied_at: new Date().toISOString(),\n name: 'Stage 5 Enhancements',\n filename: '003_stage5_enhancements.sql'\n })\n await this.markMigrationApplied('003', 'Stage 5 Enhancements', '003_stage5_enhancements.sql')\n }\n }\n\n // Check if testimonials table exists (migration 012)\n if (!appliedMigrations.has('012')) {\n const hasTestimonialsTables = await this.checkTablesExist(['testimonials'])\n if (hasTestimonialsTables) {\n appliedMigrations.set('012', {\n id: '012',\n applied_at: new Date().toISOString(),\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql'\n })\n await this.markMigrationApplied('012', 'Testimonials Plugin', '012_testimonials_plugin.sql')\n }\n }\n\n // Check if code_examples table exists (migration 013)\n if (!appliedMigrations.has('013')) {\n const hasCodeExamplesTables = await this.checkTablesExist(['code_examples'])\n if (hasCodeExamplesTables) {\n appliedMigrations.set('013', {\n id: '013',\n applied_at: new Date().toISOString(),\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql'\n })\n await this.markMigrationApplied('013', 'Code Examples Plugin', '013_code_examples_plugin.sql')\n }\n }\n\n // Check if user management tables exist (migration 004)\n if (!appliedMigrations.has('004')) {\n const hasUserTables = await this.checkTablesExist(['api_tokens', 'workflow_history'])\n if (hasUserTables) {\n appliedMigrations.set('004', {\n id: '004',\n applied_at: new Date().toISOString(),\n name: 'User Management',\n filename: '004_stage6_user_management.sql'\n })\n await this.markMigrationApplied('004', 'User Management', '004_stage6_user_management.sql')\n }\n }\n\n // Check if plugin system tables exist (migration 006)\n if (!appliedMigrations.has('006')) {\n const hasPluginTables = await this.checkTablesExist(['plugins', 'plugin_hooks'])\n if (hasPluginTables) {\n appliedMigrations.set('006', {\n id: '006',\n applied_at: new Date().toISOString(),\n name: 'Plugin System',\n filename: '006_plugin_system.sql'\n })\n await this.markMigrationApplied('006', 'Plugin System', '006_plugin_system.sql')\n }\n }\n\n // Check if managed column exists (migration 011)\n // This handles both cases:\n // 1. Migration not marked as applied but column exists -> mark as applied\n // 2. Migration marked as applied but column doesn't exist -> remove from applied (will re-run)\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!appliedMigrations.has('011') && hasManagedColumn) {\n appliedMigrations.set('011', {\n id: '011',\n applied_at: new Date().toISOString(),\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql'\n })\n await this.markMigrationApplied('011', 'Config Managed Collections', '011_config_managed_collections.sql')\n } else if (appliedMigrations.has('011') && !hasManagedColumn) {\n // Migration was marked as applied but column doesn't exist - remove it so it will re-run\n console.log('[Migration] Migration 011 marked as applied but managed column missing - will re-run')\n appliedMigrations.delete('011')\n await this.removeMigrationApplied('011')\n }\n\n // Check if system_logs table exists (migration 009)\n if (!appliedMigrations.has('009')) {\n const hasLoggingTables = await this.checkTablesExist(['system_logs', 'log_config'])\n if (hasLoggingTables) {\n appliedMigrations.set('009', {\n id: '009',\n applied_at: new Date().toISOString(),\n name: 'System Logging',\n filename: '009_system_logging.sql'\n })\n await this.markMigrationApplied('009', 'System Logging', '009_system_logging.sql')\n }\n }\n\n // Check if settings table exists (migration 018)\n if (!appliedMigrations.has('018')) {\n const hasSettingsTable = await this.checkTablesExist(['settings'])\n if (hasSettingsTable) {\n appliedMigrations.set('018', {\n id: '018',\n applied_at: new Date().toISOString(),\n name: 'Settings Table',\n filename: '018_settings_table.sql'\n })\n await this.markMigrationApplied('018', 'Settings Table', '018_settings_table.sql')\n }\n }\n\n // Check if forms tables exist (migration 029)\n // Migration 029 was reassigned between releases: older versions used it for \"Ai Search Plugin\",\n // newer versions use it for \"Add Forms System\". This handles the case where 029 is marked as\n // applied (from the old AI Search migration) but the forms tables don't actually exist.\n const hasFormsTables = await this.checkTablesExist(['forms', 'form_submissions', 'form_files'])\n if (!appliedMigrations.has('029') && hasFormsTables) {\n appliedMigrations.set('029', {\n id: '029',\n applied_at: new Date().toISOString(),\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql'\n })\n await this.markMigrationApplied('029', 'Add Forms System', '029_add_forms_system.sql')\n } else if (appliedMigrations.has('029') && !hasFormsTables) {\n // Migration was marked as applied (possibly from old \"Ai Search Plugin\" migration)\n // but forms tables don't exist - remove it so the forms migration will re-run\n console.log('[Migration] Migration 029 marked as applied but forms tables missing - will re-run')\n appliedMigrations.delete('029')\n await this.removeMigrationApplied('029')\n }\n\n // Check if user_profiles table exists (migration 032)\n // Table may already exist from app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\n if (!appliedMigrations.has('032')) {\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n appliedMigrations.set('032', {\n id: '032',\n applied_at: new Date().toISOString(),\n name: 'User Profiles',\n filename: '032_user_profiles.sql'\n })\n await this.markMigrationApplied('032', 'User Profiles', '032_user_profiles.sql')\n }\n }\n\n // Ensure user_profiles.data column exists (migration 035 is now a no-op).\n // Databases that ran the old 032 (without data column) need the column added.\n // Migration 035 was converted to a no-op to fix #771 (duplicate column error\n // on fresh installs), so we add the column here if it's missing.\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n const hasDataColumn = await this.checkColumnExists('user_profiles', 'data')\n if (!hasDataColumn) {\n try {\n await this.db.prepare(`ALTER TABLE user_profiles ADD COLUMN data TEXT DEFAULT '{}'`).run()\n console.log('[Migration] Added missing data column to user_profiles')\n } catch (error) {\n // Column may have been added concurrently; ignore duplicate column errors\n const msg = error instanceof Error ? error.message : String(error)\n if (!msg.includes('duplicate column name')) {\n console.error('[Migration] Failed to add data column to user_profiles:', msg)\n }\n }\n }\n }\n\n // Mark migration 035 as applied since it's now a no-op (column handled above)\n if (!appliedMigrations.has('035')) {\n const hasDataCol = hasUserProfilesTable && await this.checkColumnExists('user_profiles', 'data')\n if (hasDataCol) {\n appliedMigrations.set('035', {\n id: '035',\n applied_at: new Date().toISOString(),\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql'\n })\n await this.markMigrationApplied('035', 'User Profiles Data Column', '035_user_profiles_data_column.sql')\n }\n }\n }\n\n /**\n * Check if specific tables exist in the database\n */\n private async checkTablesExist(tableNames: string[]): Promise {\n try {\n for (const tableName of tableNames) {\n const result = await this.db.prepare(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`\n ).bind(tableName).first()\n\n if (!result) {\n return false\n }\n }\n return true\n } catch (error) {\n return false\n }\n }\n\n /**\n * Check if a specific column exists in a table\n */\n private async checkColumnExists(tableName: string, columnName: string): Promise {\n try {\n const result = await this.db.prepare(\n `SELECT * FROM pragma_table_info(?) WHERE name = ?`\n ).bind(tableName, columnName).first()\n\n return !!result\n } catch (error) {\n return false\n }\n }\n\n /**\n * Get migration status summary\n */\n async getMigrationStatus(): Promise {\n await this.initializeMigrationsTable()\n\n const migrations = await this.getAvailableMigrations()\n const appliedMigrations = migrations.filter(m => m.applied)\n const pendingMigrations = migrations.filter(m => !m.applied)\n\n const lastApplied = appliedMigrations.length > 0\n ? appliedMigrations[appliedMigrations.length - 1]?.appliedAt\n : undefined\n\n return {\n totalMigrations: migrations.length,\n appliedMigrations: appliedMigrations.length,\n pendingMigrations: pendingMigrations.length,\n lastApplied,\n migrations\n }\n }\n\n /**\n * Mark a migration as applied\n */\n async markMigrationApplied(migrationId: string, name: string, filename: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'INSERT OR REPLACE INTO migrations (id, name, filename, applied_at) VALUES (?, ?, ?, CURRENT_TIMESTAMP)'\n ).bind(migrationId, name, filename).run()\n }\n\n /**\n * Remove a migration from the applied list (so it can be re-run)\n */\n async removeMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'DELETE FROM migrations WHERE id = ?'\n ).bind(migrationId).run()\n }\n\n /**\n * Check if a specific migration has been applied\n */\n async isMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM migrations WHERE id = ?'\n ).bind(migrationId).first()\n\n return (result?.count as number) > 0\n }\n\n /**\n * Get the last applied migration\n */\n async getLastAppliedMigration(): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at DESC LIMIT 1'\n ).first()\n\n if (!result) return null\n\n return {\n id: result.id as string,\n name: result.name as string,\n filename: result.filename as string,\n applied: true,\n appliedAt: result.applied_at as string\n }\n }\n\n /**\n * Run pending migrations\n */\n async runPendingMigrations(): Promise<{ success: boolean; message: string; applied: string[]; errors: string[] }> {\n await this.initializeMigrationsTable()\n\n const status = await this.getMigrationStatus()\n const pendingMigrations = status.migrations.filter(m => !m.applied)\n\n if (pendingMigrations.length === 0) {\n return {\n success: true,\n message: 'All migrations are up to date',\n applied: [],\n errors: []\n }\n }\n\n // Actually execute the migration files\n const applied: string[] = []\n const errors: string[] = []\n\n for (const migration of pendingMigrations) {\n try {\n console.log(`[Migration] Applying ${migration.id}: ${migration.name}`)\n await this.applyMigration(migration)\n await this.markMigrationApplied(migration.id, migration.name, migration.filename)\n applied.push(migration.id)\n console.log(`[Migration] Successfully applied ${migration.id}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`[Migration] Failed to apply migration ${migration.id}:`, errorMessage)\n errors.push(`${migration.id}: ${errorMessage}`)\n // Continue with other migrations instead of stopping on first failure\n // This allows independent migrations to still be applied\n }\n }\n\n if (errors.length > 0 && applied.length === 0) {\n return {\n success: false,\n message: `Failed to apply migrations: ${errors.join('; ')}`,\n applied,\n errors\n }\n }\n\n return {\n success: true,\n message: applied.length > 0\n ? `Applied ${applied.length} migration(s)${errors.length > 0 ? ` (${errors.length} failed)` : ''}`\n : 'No migrations applied',\n applied,\n errors\n }\n }\n\n /**\n * Apply a specific migration\n */\n private async applyMigration(migration: Migration): Promise {\n // Get the actual migration SQL from the bundle\n const migrationSQL = getMigrationSQLById(migration.id)\n\n if (migrationSQL === null) {\n throw new Error(`Migration SQL not found for ${migration.id}`)\n }\n\n if (migrationSQL.trim() === '') {\n console.log(`[Migration] Skipping empty migration ${migration.id}`)\n return\n }\n\n // Split SQL into individual statements, handling triggers properly\n const statements = this.splitSQLStatements(migrationSQL)\n\n for (const statement of statements) {\n if (statement.trim()) {\n try {\n await this.db.prepare(statement).run()\n } catch (error) {\n // Check if it's a \"already exists\" type error and skip it\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('already exists') ||\n errorMessage.includes('duplicate column name') ||\n errorMessage.includes('UNIQUE constraint failed')) {\n console.log(`[Migration] Skipping (already exists): ${statement.substring(0, 50)}...`)\n continue\n }\n console.error(`[Migration] Error executing statement: ${statement.substring(0, 100)}...`)\n throw error\n }\n }\n }\n }\n\n /**\n * Split SQL into statements, handling CREATE TRIGGER properly\n */\n private splitSQLStatements(sql: string): string[] {\n const statements: string[] = []\n let current = ''\n let inTrigger = false\n\n const lines = sql.split('\\n')\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n // Skip comments and empty lines\n if (trimmed.startsWith('--') || trimmed.length === 0) {\n continue\n }\n\n // Check if we're entering a trigger\n if (trimmed.toUpperCase().includes('CREATE TRIGGER')) {\n inTrigger = true\n }\n\n current += line + '\\n'\n\n // Check if we're exiting a trigger\n if (inTrigger && trimmed.toUpperCase() === 'END;') {\n statements.push(current.trim())\n current = ''\n inTrigger = false\n }\n // Check for regular statement end (not in trigger)\n else if (!inTrigger && trimmed.endsWith(';')) {\n statements.push(current.trim())\n current = ''\n }\n }\n\n // Add any remaining statement\n if (current.trim()) {\n statements.push(current.trim())\n }\n\n return statements.filter(s => s.length > 0)\n }\n\n /**\n * Validate database schema\n */\n async validateSchema(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n // Basic table existence checks\n const requiredTables = [\n 'users', 'content', 'collections', 'media'\n ]\n\n for (const table of requiredTables) {\n try {\n await this.db.prepare(`SELECT COUNT(*) FROM ${table} LIMIT 1`).first()\n } catch (error) {\n issues.push(`Missing table: ${table}`)\n }\n }\n\n // Check for managed column in collections\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!hasManagedColumn) {\n issues.push('Missing column: collections.managed')\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/db/migrations-bundle.ts","../src/services/migrations.ts"],"names":["hasUserProfilesTable"],"mappings":"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","file":"chunk-CSQWOYGZ.js","sourcesContent":["/**\n * AUTO-GENERATED FILE - DO NOT EDIT\n * Generated by: scripts/generate-migrations.ts\n * Generated at: 2026-05-01T00:32:37.853Z\n *\n * This file contains all migration SQL bundled for use in Cloudflare Workers\n * where filesystem access is not available at runtime.\n */\n\nexport interface BundledMigration {\n id: string\n name: string\n filename: string\n description: string\n sql: string\n}\n\nexport const bundledMigrations: BundledMigration[] = [\n {\n id: '001',\n name: 'Initial Schema',\n filename: '001_initial_schema.sql',\n description: 'Migration 001: Initial Schema',\n sql: \"-- Initial schema for SonicJS AI\\n-- Create users table for authentication\\nCREATE TABLE IF NOT EXISTS users (\\n id TEXT PRIMARY KEY,\\n email TEXT NOT NULL UNIQUE,\\n username TEXT NOT NULL UNIQUE,\\n first_name TEXT NOT NULL,\\n last_name TEXT NOT NULL,\\n password_hash TEXT,\\n role TEXT NOT NULL DEFAULT 'viewer',\\n avatar TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n last_login_at INTEGER,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create collections table for content schema definitions\\nCREATE TABLE IF NOT EXISTS collections (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n schema TEXT NOT NULL, -- JSON schema definition\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content table for actual content data\\nCREATE TABLE IF NOT EXISTS content (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n slug TEXT NOT NULL,\\n title TEXT NOT NULL,\\n data TEXT NOT NULL, -- JSON content data\\n status TEXT NOT NULL DEFAULT 'draft',\\n published_at INTEGER,\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create content_versions table for versioning\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n version INTEGER NOT NULL,\\n data TEXT NOT NULL, -- JSON data\\n author_id TEXT NOT NULL REFERENCES users(id),\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create media/files table with comprehensive R2 integration\\nCREATE TABLE IF NOT EXISTS media (\\n id TEXT PRIMARY KEY,\\n filename TEXT NOT NULL,\\n original_name TEXT NOT NULL,\\n mime_type TEXT NOT NULL,\\n size INTEGER NOT NULL,\\n width INTEGER,\\n height INTEGER,\\n folder TEXT NOT NULL DEFAULT 'uploads',\\n r2_key TEXT NOT NULL, -- R2 storage key\\n public_url TEXT NOT NULL, -- CDN URL\\n thumbnail_url TEXT, -- Cloudflare Images URL\\n alt TEXT,\\n caption TEXT,\\n tags TEXT, -- JSON array of tags\\n uploaded_by TEXT NOT NULL REFERENCES users(id),\\n uploaded_at INTEGER NOT NULL,\\n updated_at INTEGER,\\n published_at INTEGER,\\n scheduled_at INTEGER,\\n archived_at INTEGER,\\n deleted_at INTEGER\\n);\\n\\n-- Create API tokens table for programmatic access\\nCREATE TABLE IF NOT EXISTS api_tokens (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n permissions TEXT NOT NULL, -- JSON array of permissions\\n expires_at INTEGER,\\n last_used_at INTEGER,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create workflow history table for content workflow tracking\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY,\\n content_id TEXT NOT NULL REFERENCES content(id),\\n action TEXT NOT NULL,\\n from_status TEXT NOT NULL,\\n to_status TEXT NOT NULL,\\n user_id TEXT NOT NULL REFERENCES users(id),\\n comment TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\\nCREATE INDEX IF NOT EXISTS idx_users_username ON users(username);\\nCREATE INDEX IF NOT EXISTS idx_users_role ON users(role);\\n\\nCREATE INDEX IF NOT EXISTS idx_collections_name ON collections(name);\\nCREATE INDEX IF NOT EXISTS idx_collections_active ON collections(is_active);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_collection ON content(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_author ON content(author_id);\\nCREATE INDEX IF NOT EXISTS idx_content_status ON content(status);\\nCREATE INDEX IF NOT EXISTS idx_content_published ON content(published_at);\\nCREATE INDEX IF NOT EXISTS idx_content_slug ON content(slug);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_version ON content_versions(version);\\n\\nCREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);\\nCREATE INDEX IF NOT EXISTS idx_media_type ON media(mime_type);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_by ON media(uploaded_by);\\nCREATE INDEX IF NOT EXISTS idx_media_uploaded_at ON media(uploaded_at);\\nCREATE INDEX IF NOT EXISTS idx_media_deleted ON media(deleted_at);\\n\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_user ON api_tokens(user_id);\\nCREATE INDEX IF NOT EXISTS idx_api_tokens_token ON api_tokens(token);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_user ON workflow_history(user_id);\\n\\n-- Note: Admin user is created via the seed script with user-provided credentials\\n-- Run 'npm run seed' after migrations to create the admin user\\n\\n-- Insert sample collections\\nINSERT OR IGNORE INTO collections (\\n id, name, display_name, description, schema, \\n is_active, created_at, updated_at\\n) VALUES (\\n 'blog-posts-collection',\\n 'blog_posts',\\n 'Blog Posts',\\n 'Blog post content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"excerpt\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Excerpt\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"},\\\"tags\\\":{\\\"type\\\":\\\"array\\\",\\\"title\\\":\\\"Tags\\\",\\\"items\\\":{\\\"type\\\":\\\"string\\\"}},\\\"status\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Status\\\",\\\"enum\\\":[\\\"draft\\\",\\\"published\\\",\\\"archived\\\"],\\\"default\\\":\\\"draft\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'pages-collection',\\n 'pages',\\n 'Pages',\\n 'Static page content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"slug\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Slug\\\"},\\\"meta_description\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Meta Description\\\"},\\\"featured_image\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Featured Image\\\",\\\"format\\\":\\\"media\\\"}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n),\\n(\\n 'news-collection',\\n 'news',\\n 'News',\\n 'News article content collection',\\n '{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"title\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Title\\\",\\\"required\\\":true},\\\"content\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Content\\\",\\\"format\\\":\\\"richtext\\\"},\\\"publish_date\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Publish Date\\\",\\\"format\\\":\\\"date\\\"},\\\"author\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Author\\\"},\\\"category\\\":{\\\"type\\\":\\\"string\\\",\\\"title\\\":\\\"Category\\\",\\\"enum\\\":[\\\"technology\\\",\\\"business\\\",\\\"general\\\"]}},\\\"required\\\":[\\\"title\\\"]}',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Note: Sample content can be created via the admin interface after the admin user is seeded\"\n },\n {\n id: '002',\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql',\n description: 'Migration 002: Faq Plugin',\n sql: \"-- FAQ Plugin Migration (DEPRECATED - Now managed by third-party plugin)\\n-- Creates FAQ table for the FAQ plugin\\n-- NOTE: This migration is kept for historical purposes. \\n-- The FAQ functionality is now provided by the faq-plugin third-party plugin.\\n\\nCREATE TABLE IF NOT EXISTS faqs (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n question TEXT NOT NULL,\\n answer TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_faqs_category ON faqs(category);\\nCREATE INDEX IF NOT EXISTS idx_faqs_published ON faqs(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_faqs_sort_order ON faqs(sortOrder);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS faqs_updated_at\\n AFTER UPDATE ON faqs\\nBEGIN\\n UPDATE faqs SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert sample FAQ data\\nINSERT OR IGNORE INTO faqs (question, answer, category, tags, isPublished, sortOrder) VALUES \\n('What is SonicJS AI?', \\n'SonicJS AI is a modern, TypeScript-first headless CMS built for Cloudflare''s edge platform. It provides a complete content management system with admin interface, API endpoints, and plugin architecture.',\\n'general',\\n'sonicjs, cms, cloudflare',\\n1,\\n1),\\n\\n('How do I get started with SonicJS AI?',\\n'To get started: 1) Clone the repository, 2) Install dependencies with npm install, 3) Set up your Cloudflare account and services, 4) Run the development server with npm run dev, 5) Access the admin interface at /admin.',\\n'general',\\n'getting-started, setup',\\n1,\\n2),\\n\\n('What technologies does SonicJS AI use?',\\n'SonicJS AI is built with: TypeScript for type safety, Hono.js as the web framework, Cloudflare D1 for the database, Cloudflare R2 for media storage, Cloudflare Workers for serverless execution, and Tailwind CSS for styling.',\\n'technical',\\n'technology-stack, typescript, cloudflare',\\n1,\\n3),\\n\\n('How do I create content in SonicJS AI?',\\n'Content creation is done through the admin interface. Navigate to /admin, log in with your credentials, go to Content section, select a collection, and click \\\"New Content\\\" to create articles, pages, or other content types.',\\n'general',\\n'content-creation, admin',\\n1,\\n4),\\n\\n('Is SonicJS AI free to use?',\\n'SonicJS AI is open source and free to use. You only pay for the Cloudflare services you consume (D1 database, R2 storage, Workers execution time). Cloudflare offers generous free tiers for development and small projects.',\\n'billing',\\n'pricing, open-source, cloudflare',\\n1,\\n5),\\n\\n('How do I add custom functionality?',\\n'SonicJS AI features a plugin system that allows you to extend functionality. You can create plugins using the PluginBuilder API, add custom routes, models, admin pages, and integrate with external services.',\\n'technical',\\n'plugins, customization, development',\\n1,\\n6),\\n\\n('Can I customize the admin interface?',\\n'Yes! The admin interface is built with TypeScript templates and can be customized. You can modify existing templates, create new components, add custom pages, and integrate your own styling while maintaining the dark theme.',\\n'technical',\\n'admin-interface, customization, templates',\\n1,\\n7),\\n\\n('How does authentication work?',\\n'SonicJS AI includes a built-in authentication system with JWT tokens, role-based access control (admin, editor, viewer), secure password hashing, and session management. Users can be managed through the admin interface.',\\n'technical',\\n'authentication, security, users',\\n1,\\n8);\"\n },\n {\n id: '003',\n name: 'Stage5 Enhancements',\n filename: '003_stage5_enhancements.sql',\n description: 'Migration 003: Stage5 Enhancements',\n sql: \"-- Stage 5: Advanced Content Management enhancements\\n-- Add scheduling and workflow features to content table\\n\\n-- Add content scheduling columns\\nALTER TABLE content ADD COLUMN scheduled_publish_at INTEGER;\\nALTER TABLE content ADD COLUMN scheduled_unpublish_at INTEGER;\\n\\n-- Add workflow and review columns\\nALTER TABLE content ADD COLUMN review_status TEXT DEFAULT 'none'; -- none, pending, approved, rejected\\nALTER TABLE content ADD COLUMN reviewer_id TEXT REFERENCES users(id);\\nALTER TABLE content ADD COLUMN reviewed_at INTEGER;\\nALTER TABLE content ADD COLUMN review_notes TEXT;\\n\\n-- Add content metadata\\nALTER TABLE content ADD COLUMN meta_title TEXT;\\nALTER TABLE content ADD COLUMN meta_description TEXT;\\nALTER TABLE content ADD COLUMN featured_image_id TEXT REFERENCES media(id);\\nALTER TABLE content ADD COLUMN content_type TEXT DEFAULT 'standard'; -- standard, template, component\\n\\n-- Create content_fields table for dynamic field definitions\\nCREATE TABLE IF NOT EXISTS content_fields (\\n id TEXT PRIMARY KEY,\\n collection_id TEXT NOT NULL REFERENCES collections(id),\\n field_name TEXT NOT NULL,\\n field_type TEXT NOT NULL, -- text, richtext, number, boolean, date, select, media, relationship\\n field_label TEXT NOT NULL,\\n field_options TEXT, -- JSON for select options, validation rules, etc.\\n field_order INTEGER NOT NULL DEFAULT 0,\\n is_required INTEGER NOT NULL DEFAULT 0,\\n is_searchable INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(collection_id, field_name)\\n);\\n\\n-- Create content_relationships table for content relationships\\nCREATE TABLE IF NOT EXISTS content_relationships (\\n id TEXT PRIMARY KEY,\\n source_content_id TEXT NOT NULL REFERENCES content(id),\\n target_content_id TEXT NOT NULL REFERENCES content(id),\\n relationship_type TEXT NOT NULL, -- references, tags, categories\\n created_at INTEGER NOT NULL,\\n UNIQUE(source_content_id, target_content_id, relationship_type)\\n);\\n\\n-- Create workflow_templates table for reusable workflows\\nCREATE TABLE IF NOT EXISTS workflow_templates (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT REFERENCES collections(id), -- null means applies to all collections\\n workflow_steps TEXT NOT NULL, -- JSON array of workflow steps\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Add indexes for new columns\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_unpublish ON content(scheduled_unpublish_at);\\nCREATE INDEX IF NOT EXISTS idx_content_review_status ON content(review_status);\\nCREATE INDEX IF NOT EXISTS idx_content_reviewer ON content(reviewer_id);\\nCREATE INDEX IF NOT EXISTS idx_content_content_type ON content(content_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_fields_collection ON content_fields(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_name ON content_fields(field_name);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_type ON content_fields(field_type);\\nCREATE INDEX IF NOT EXISTS idx_content_fields_order ON content_fields(field_order);\\n\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_source ON content_relationships(source_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_target ON content_relationships(target_content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_relationships_type ON content_relationships(relationship_type);\\n\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_collection ON workflow_templates(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_templates_active ON workflow_templates(is_active);\\n\\n-- Insert default workflow template\\nINSERT OR IGNORE INTO workflow_templates (\\n id, name, description, workflow_steps, is_active, created_at, updated_at\\n) VALUES (\\n 'default-content-workflow',\\n 'Default Content Workflow',\\n 'Standard content workflow: Draft → Review → Published',\\n '[\\n {\\\"step\\\": \\\"draft\\\", \\\"name\\\": \\\"Draft\\\", \\\"description\\\": \\\"Content is being created\\\", \\\"permissions\\\": [\\\"author\\\", \\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"review\\\", \\\"name\\\": \\\"Under Review\\\", \\\"description\\\": \\\"Content is pending review\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"published\\\", \\\"name\\\": \\\"Published\\\", \\\"description\\\": \\\"Content is live\\\", \\\"permissions\\\": [\\\"editor\\\", \\\"admin\\\"]},\\n {\\\"step\\\": \\\"archived\\\", \\\"name\\\": \\\"Archived\\\", \\\"description\\\": \\\"Content is archived\\\", \\\"permissions\\\": [\\\"admin\\\"]}\\n ]',\\n 1,\\n strftime('%s', 'now') * 1000,\\n strftime('%s', 'now') * 1000\\n);\\n\\n-- Insert enhanced field definitions for existing collections\\nINSERT OR IGNORE INTO content_fields (\\n id, collection_id, field_name, field_type, field_label, field_options, field_order, is_required, is_searchable, created_at, updated_at\\n) VALUES \\n-- Blog Posts fields\\n('blog-title-field', 'blog-posts-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter blog post title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-content-field', 'blog-posts-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-excerpt-field', 'blog-posts-collection', 'excerpt', 'text', 'Excerpt', '{\\\"maxLength\\\": 500, \\\"rows\\\": 3, \\\"placeholder\\\": \\\"Brief description of the post\\\"}', 3, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-tags-field', 'blog-posts-collection', 'tags', 'select', 'Tags', '{\\\"multiple\\\": true, \\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"tutorial\\\", \\\"news\\\", \\\"update\\\"], \\\"allowCustom\\\": true}', 4, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-image-field', 'blog-posts-collection', 'featured_image', 'media', 'Featured Image', '{\\\"accept\\\": \\\"image/*\\\", \\\"maxSize\\\": \\\"5MB\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-publish-date-field', 'blog-posts-collection', 'publish_date', 'date', 'Publish Date', '{\\\"format\\\": \\\"YYYY-MM-DD\\\", \\\"defaultToday\\\": true}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('blog-featured-field', 'blog-posts-collection', 'is_featured', 'boolean', 'Featured Post', '{\\\"default\\\": false}', 7, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- Pages fields\\n('pages-title-field', 'pages-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter page title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-content-field', 'pages-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"full\\\", \\\"height\\\": 500}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-slug-field', 'pages-collection', 'slug', 'text', 'URL Slug', '{\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\"}', 3, 1, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-meta-desc-field', 'pages-collection', 'meta_description', 'text', 'Meta Description', '{\\\"maxLength\\\": 160, \\\"rows\\\": 2, \\\"placeholder\\\": \\\"SEO description for search engines\\\"}', 4, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('pages-template-field', 'pages-collection', 'template', 'select', 'Page Template', '{\\\"options\\\": [\\\"default\\\", \\\"landing\\\", \\\"contact\\\", \\\"about\\\"], \\\"default\\\": \\\"default\\\"}', 5, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n\\n-- News fields\\n('news-title-field', 'news-collection', 'title', 'text', 'Title', '{\\\"maxLength\\\": 200, \\\"placeholder\\\": \\\"Enter news title\\\"}', 1, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-content-field', 'news-collection', 'content', 'richtext', 'Content', '{\\\"toolbar\\\": \\\"news\\\", \\\"height\\\": 400}', 2, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-category-field', 'news-collection', 'category', 'select', 'Category', '{\\\"options\\\": [\\\"technology\\\", \\\"business\\\", \\\"politics\\\", \\\"sports\\\", \\\"entertainment\\\", \\\"health\\\"], \\\"required\\\": true}', 3, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-author-field', 'news-collection', 'author', 'text', 'Author', '{\\\"placeholder\\\": \\\"Author name\\\"}', 4, 1, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-source-field', 'news-collection', 'source', 'text', 'Source', '{\\\"placeholder\\\": \\\"News source\\\"}', 5, 0, 1, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000),\\n('news-priority-field', 'news-collection', 'priority', 'select', 'Priority', '{\\\"options\\\": [\\\"low\\\", \\\"normal\\\", \\\"high\\\", \\\"breaking\\\"], \\\"default\\\": \\\"normal\\\"}', 6, 0, 0, strftime('%s', 'now') * 1000, strftime('%s', 'now') * 1000);\"\n },\n {\n id: '004',\n name: 'Stage6 User Management',\n filename: '004_stage6_user_management.sql',\n description: 'Migration 004: Stage6 User Management',\n sql: \"-- Stage 6: User Management & Permissions enhancements\\n-- Enhanced user system with profiles, teams, permissions, and activity logging\\n\\n-- Add user profile and preferences columns\\nALTER TABLE users ADD COLUMN phone TEXT;\\nALTER TABLE users ADD COLUMN bio TEXT;\\nALTER TABLE users ADD COLUMN avatar_url TEXT;\\nALTER TABLE users ADD COLUMN timezone TEXT DEFAULT 'UTC';\\nALTER TABLE users ADD COLUMN language TEXT DEFAULT 'en';\\nALTER TABLE users ADD COLUMN email_notifications INTEGER DEFAULT 1;\\nALTER TABLE users ADD COLUMN theme TEXT DEFAULT 'dark';\\nALTER TABLE users ADD COLUMN two_factor_enabled INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN two_factor_secret TEXT;\\nALTER TABLE users ADD COLUMN password_reset_token TEXT;\\nALTER TABLE users ADD COLUMN password_reset_expires INTEGER;\\nALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0;\\nALTER TABLE users ADD COLUMN email_verification_token TEXT;\\nALTER TABLE users ADD COLUMN invitation_token TEXT;\\nALTER TABLE users ADD COLUMN invited_by TEXT REFERENCES users(id);\\nALTER TABLE users ADD COLUMN invited_at INTEGER;\\nALTER TABLE users ADD COLUMN accepted_invitation_at INTEGER;\\n\\n-- Create teams table for team-based collaboration\\nCREATE TABLE IF NOT EXISTS teams (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL,\\n description TEXT,\\n slug TEXT NOT NULL UNIQUE,\\n owner_id TEXT NOT NULL REFERENCES users(id),\\n settings TEXT, -- JSON for team settings\\n is_active INTEGER NOT NULL DEFAULT 1,\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Create team memberships table\\nCREATE TABLE IF NOT EXISTS team_memberships (\\n id TEXT PRIMARY KEY,\\n team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n role TEXT NOT NULL DEFAULT 'member', -- owner, admin, editor, member, viewer\\n permissions TEXT, -- JSON for specific permissions\\n joined_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(team_id, user_id)\\n);\\n\\n-- Create permissions table for granular access control\\nCREATE TABLE IF NOT EXISTS permissions (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n description TEXT,\\n category TEXT NOT NULL, -- content, users, collections, media, settings\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create role permissions mapping\\nCREATE TABLE IF NOT EXISTS role_permissions (\\n id TEXT PRIMARY KEY,\\n role TEXT NOT NULL,\\n permission_id TEXT NOT NULL REFERENCES permissions(id),\\n created_at INTEGER NOT NULL,\\n UNIQUE(role, permission_id)\\n);\\n\\n-- Create user sessions table for better session management\\nCREATE TABLE IF NOT EXISTS user_sessions (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n token_hash TEXT NOT NULL,\\n ip_address TEXT,\\n user_agent TEXT,\\n is_active INTEGER NOT NULL DEFAULT 1,\\n expires_at INTEGER NOT NULL,\\n created_at INTEGER NOT NULL,\\n last_used_at INTEGER\\n);\\n\\n-- Create activity log table for audit trails\\nCREATE TABLE IF NOT EXISTS activity_logs (\\n id TEXT PRIMARY KEY,\\n user_id TEXT REFERENCES users(id),\\n action TEXT NOT NULL,\\n resource_type TEXT, -- users, content, collections, media, etc.\\n resource_id TEXT,\\n details TEXT, -- JSON with additional details\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create password history table for security\\nCREATE TABLE IF NOT EXISTS password_history (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\\n password_hash TEXT NOT NULL,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Insert default permissions\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at) VALUES\\n ('perm_content_create', 'content.create', 'Create new content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_read', 'content.read', 'View content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_update', 'content.update', 'Edit existing content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_delete', 'content.delete', 'Delete content', 'content', strftime('%s', 'now') * 1000),\\n ('perm_content_publish', 'content.publish', 'Publish/unpublish content', 'content', strftime('%s', 'now') * 1000),\\n \\n ('perm_collections_create', 'collections.create', 'Create new collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_read', 'collections.read', 'View collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_update', 'collections.update', 'Edit collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_delete', 'collections.delete', 'Delete collections', 'collections', strftime('%s', 'now') * 1000),\\n ('perm_collections_fields', 'collections.fields', 'Manage collection fields', 'collections', strftime('%s', 'now') * 1000),\\n \\n ('perm_media_upload', 'media.upload', 'Upload media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_read', 'media.read', 'View media files', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_update', 'media.update', 'Edit media metadata', 'media', strftime('%s', 'now') * 1000),\\n ('perm_media_delete', 'media.delete', 'Delete media files', 'media', strftime('%s', 'now') * 1000),\\n \\n ('perm_users_create', 'users.create', 'Invite new users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_read', 'users.read', 'View user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_update', 'users.update', 'Edit user profiles', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_delete', 'users.delete', 'Deactivate users', 'users', strftime('%s', 'now') * 1000),\\n ('perm_users_roles', 'users.roles', 'Manage user roles', 'users', strftime('%s', 'now') * 1000),\\n \\n ('perm_settings_read', 'settings.read', 'View system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_settings_update', 'settings.update', 'Modify system settings', 'settings', strftime('%s', 'now') * 1000),\\n ('perm_activity_read', 'activity.read', 'View activity logs', 'settings', strftime('%s', 'now') * 1000);\\n\\n-- Assign permissions to default roles\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at) VALUES\\n -- Admin has all permissions\\n ('rp_admin_content_create', 'admin', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_read', 'admin', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_update', 'admin', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_delete', 'admin', 'perm_content_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_content_publish', 'admin', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_create', 'admin', 'perm_collections_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_read', 'admin', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_update', 'admin', 'perm_collections_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_delete', 'admin', 'perm_collections_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_collections_fields', 'admin', 'perm_collections_fields', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_upload', 'admin', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_read', 'admin', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_update', 'admin', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_media_delete', 'admin', 'perm_media_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_create', 'admin', 'perm_users_create', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_read', 'admin', 'perm_users_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_update', 'admin', 'perm_users_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_delete', 'admin', 'perm_users_delete', strftime('%s', 'now') * 1000),\\n ('rp_admin_users_roles', 'admin', 'perm_users_roles', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_read', 'admin', 'perm_settings_read', strftime('%s', 'now') * 1000),\\n ('rp_admin_settings_update', 'admin', 'perm_settings_update', strftime('%s', 'now') * 1000),\\n ('rp_admin_activity_read', 'admin', 'perm_activity_read', strftime('%s', 'now') * 1000),\\n \\n -- Editor permissions\\n ('rp_editor_content_create', 'editor', 'perm_content_create', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_read', 'editor', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_update', 'editor', 'perm_content_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_content_publish', 'editor', 'perm_content_publish', strftime('%s', 'now') * 1000),\\n ('rp_editor_collections_read', 'editor', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_upload', 'editor', 'perm_media_upload', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_read', 'editor', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_editor_media_update', 'editor', 'perm_media_update', strftime('%s', 'now') * 1000),\\n ('rp_editor_users_read', 'editor', 'perm_users_read', strftime('%s', 'now') * 1000),\\n \\n -- Viewer permissions\\n ('rp_viewer_content_read', 'viewer', 'perm_content_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_collections_read', 'viewer', 'perm_collections_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_media_read', 'viewer', 'perm_media_read', strftime('%s', 'now') * 1000),\\n ('rp_viewer_users_read', 'viewer', 'perm_users_read', strftime('%s', 'now') * 1000);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_team_id ON team_memberships(team_id);\\nCREATE INDEX IF NOT EXISTS idx_team_memberships_user_id ON team_memberships(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_user_id ON user_sessions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_user_sessions_token_hash ON user_sessions(token_hash);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_user_id ON activity_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_created_at ON activity_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_activity_logs_resource ON activity_logs(resource_type, resource_id);\\nCREATE INDEX IF NOT EXISTS idx_password_history_user_id ON password_history(user_id);\\nCREATE INDEX IF NOT EXISTS idx_users_email_verification_token ON users(email_verification_token);\\nCREATE INDEX IF NOT EXISTS idx_users_password_reset_token ON users(password_reset_token);\\nCREATE INDEX IF NOT EXISTS idx_users_invitation_token ON users(invitation_token);\"\n },\n {\n id: '005',\n name: 'Stage7 Workflow Automation',\n filename: '005_stage7_workflow_automation.sql',\n description: 'Migration 005: Stage7 Workflow Automation',\n sql: \"-- Stage 7: Workflow & Automation Migration\\n-- This migration adds workflow and automation capabilities to SonicJS\\n\\n-- Workflow States Table\\nCREATE TABLE IF NOT EXISTS workflow_states (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n color TEXT DEFAULT '#6B7280',\\n is_initial INTEGER DEFAULT 0,\\n is_final INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Insert default workflow states\\nINSERT OR IGNORE INTO workflow_states (id, name, description, color, is_initial, is_final) VALUES\\n('draft', 'Draft', 'Content is being worked on', '#F59E0B', 1, 0),\\n('pending-review', 'Pending Review', 'Content is waiting for review', '#3B82F6', 0, 0),\\n('approved', 'Approved', 'Content has been approved', '#10B981', 0, 0),\\n('published', 'Published', 'Content is live', '#059669', 0, 1),\\n('rejected', 'Rejected', 'Content was rejected', '#EF4444', 0, 1),\\n('archived', 'Archived', 'Content has been archived', '#6B7280', 0, 1);\\n\\n-- Workflows Table\\nCREATE TABLE IF NOT EXISTS workflows (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n collection_id TEXT,\\n is_active INTEGER DEFAULT 1,\\n auto_publish INTEGER DEFAULT 0,\\n require_approval INTEGER DEFAULT 1,\\n approval_levels INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\\n);\\n\\n-- Workflow Transitions Table\\nCREATE TABLE IF NOT EXISTS workflow_transitions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT NOT NULL,\\n to_state_id TEXT NOT NULL,\\n required_permission TEXT,\\n auto_transition INTEGER DEFAULT 0,\\n transition_conditions TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE,\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id)\\n);\\n\\n-- Content Workflow Status Table\\nCREATE TABLE IF NOT EXISTS content_workflow_status (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n current_state_id TEXT NOT NULL,\\n assigned_to TEXT,\\n due_date DATETIME,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (current_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (assigned_to) REFERENCES users(id),\\n UNIQUE(content_id, workflow_id)\\n);\\n\\n-- Workflow History Table\\nCREATE TABLE IF NOT EXISTS workflow_history (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n workflow_id TEXT NOT NULL,\\n from_state_id TEXT,\\n to_state_id TEXT NOT NULL,\\n user_id TEXT NOT NULL,\\n comment TEXT,\\n metadata TEXT, -- JSON\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (workflow_id) REFERENCES workflows(id),\\n FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (to_state_id) REFERENCES workflow_states(id),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Scheduled Content Table\\nCREATE TABLE IF NOT EXISTS scheduled_content (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n action TEXT NOT NULL, -- 'publish', 'unpublish', 'archive'\\n scheduled_at DATETIME NOT NULL,\\n timezone TEXT DEFAULT 'UTC',\\n user_id TEXT NOT NULL,\\n status TEXT DEFAULT 'pending', -- 'pending', 'completed', 'failed', 'cancelled'\\n executed_at DATETIME,\\n error_message TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Notifications Table\\nCREATE TABLE IF NOT EXISTS notifications (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n type TEXT NOT NULL, -- 'workflow', 'schedule', 'system'\\n title TEXT NOT NULL,\\n message TEXT NOT NULL,\\n data TEXT, -- JSON\\n is_read INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\\n);\\n\\n-- Notification Preferences Table\\nCREATE TABLE IF NOT EXISTS notification_preferences (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n user_id TEXT NOT NULL,\\n notification_type TEXT NOT NULL,\\n email_enabled INTEGER DEFAULT 1,\\n in_app_enabled INTEGER DEFAULT 1,\\n digest_frequency TEXT DEFAULT 'daily', -- 'immediate', 'hourly', 'daily', 'weekly'\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,\\n UNIQUE(user_id, notification_type)\\n);\\n\\n-- Webhooks Table\\nCREATE TABLE IF NOT EXISTS webhooks (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n url TEXT NOT NULL,\\n secret TEXT,\\n events TEXT NOT NULL, -- JSON array of event types\\n is_active INTEGER DEFAULT 1,\\n retry_count INTEGER DEFAULT 3,\\n timeout_seconds INTEGER DEFAULT 30,\\n last_success_at DATETIME,\\n last_failure_at DATETIME,\\n failure_count INTEGER DEFAULT 0,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Webhook Deliveries Table\\nCREATE TABLE IF NOT EXISTS webhook_deliveries (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n webhook_id TEXT NOT NULL,\\n event_type TEXT NOT NULL,\\n payload TEXT NOT NULL, -- JSON\\n response_status INTEGER,\\n response_body TEXT,\\n attempt_count INTEGER DEFAULT 1,\\n delivered_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE\\n);\\n\\n-- Content Versions Table (for rollback functionality)\\nCREATE TABLE IF NOT EXISTS content_versions (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT NOT NULL,\\n version_number INTEGER NOT NULL,\\n title TEXT NOT NULL,\\n content TEXT NOT NULL,\\n fields TEXT, -- JSON\\n user_id TEXT NOT NULL,\\n change_summary TEXT,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, version_number)\\n);\\n\\n-- Automation Rules Table\\nCREATE TABLE IF NOT EXISTS automation_rules (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n name TEXT NOT NULL,\\n description TEXT,\\n trigger_type TEXT NOT NULL, -- 'content_created', 'content_updated', 'workflow_transition', 'schedule'\\n trigger_conditions TEXT, -- JSON\\n action_type TEXT NOT NULL, -- 'workflow_transition', 'send_notification', 'webhook_call', 'auto_save'\\n action_config TEXT, -- JSON\\n is_active INTEGER DEFAULT 1,\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\\n);\\n\\n-- Auto-save Drafts Table\\nCREATE TABLE IF NOT EXISTS auto_save_drafts (\\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\\n content_id TEXT,\\n user_id TEXT NOT NULL,\\n title TEXT,\\n content TEXT,\\n fields TEXT, -- JSON\\n last_saved_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n FOREIGN KEY (content_id) REFERENCES content(id) ON DELETE CASCADE,\\n FOREIGN KEY (user_id) REFERENCES users(id),\\n UNIQUE(content_id, user_id)\\n);\\n\\n-- Add workflow-related columns to existing content table (skip existing columns)\\nALTER TABLE content ADD COLUMN workflow_state_id TEXT DEFAULT 'draft';\\nALTER TABLE content ADD COLUMN embargo_until DATETIME;\\nALTER TABLE content ADD COLUMN expires_at DATETIME;\\nALTER TABLE content ADD COLUMN version_number INTEGER DEFAULT 1;\\nALTER TABLE content ADD COLUMN is_auto_saved INTEGER DEFAULT 0;\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_content_id ON content_workflow_status(content_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_status_workflow_id ON content_workflow_status(workflow_id);\\nCREATE INDEX IF NOT EXISTS idx_workflow_history_content_id ON workflow_history(content_id);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_scheduled_at ON scheduled_content(scheduled_at);\\nCREATE INDEX IF NOT EXISTS idx_scheduled_content_status ON scheduled_content(status);\\nCREATE INDEX IF NOT EXISTS idx_notifications_user_id ON notifications(user_id);\\nCREATE INDEX IF NOT EXISTS idx_notifications_is_read ON notifications(is_read);\\nCREATE INDEX IF NOT EXISTS idx_content_versions_content_id ON content_versions(content_id);\\nCREATE INDEX IF NOT EXISTS idx_auto_save_drafts_user_id ON auto_save_drafts(user_id);\\nCREATE INDEX IF NOT EXISTS idx_content_workflow_state ON content(workflow_state_id);\\nCREATE INDEX IF NOT EXISTS idx_content_scheduled_publish ON content(scheduled_publish_at);\\n\\n-- Insert default workflow for collections\\nINSERT OR IGNORE INTO workflows (id, name, description, collection_id, is_active, require_approval, approval_levels) \\nSELECT \\n 'default-' || id,\\n 'Default Workflow for ' || name,\\n 'Standard content approval workflow',\\n id,\\n 1,\\n 1,\\n 1\\nFROM collections;\\n\\n-- Insert default workflow transitions\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'draft',\\n 'pending-review',\\n 'content:submit'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'approved',\\n 'content:approve'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'approved',\\n 'published',\\n 'content:publish'\\nFROM workflows w;\\n\\nINSERT OR IGNORE INTO workflow_transitions (workflow_id, from_state_id, to_state_id, required_permission) \\nSELECT \\n w.id,\\n 'pending-review',\\n 'rejected',\\n 'content:approve'\\nFROM workflows w;\\n\\n-- Insert default notification preferences for all users\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_assigned',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'workflow_status_change',\\n 1,\\n 1\\nFROM users;\\n\\nINSERT OR IGNORE INTO notification_preferences (user_id, notification_type, email_enabled, in_app_enabled)\\nSELECT \\n id,\\n 'content_scheduled',\\n 1,\\n 1\\nFROM users;\"\n },\n {\n id: '006',\n name: 'Plugin System',\n filename: '006_plugin_system.sql',\n description: 'Migration 006: Plugin System',\n sql: \"-- Plugin System Tables\\n-- Migration: 006_plugin_system\\n-- Description: Add plugin management system tables\\n\\n-- Plugins table\\nCREATE TABLE IF NOT EXISTS plugins (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE,\\n display_name TEXT NOT NULL,\\n description TEXT,\\n version TEXT NOT NULL,\\n author TEXT NOT NULL,\\n category TEXT NOT NULL,\\n icon TEXT,\\n status TEXT DEFAULT 'inactive' CHECK (status IN ('active', 'inactive', 'error')),\\n is_core BOOLEAN DEFAULT FALSE,\\n settings JSON,\\n permissions JSON,\\n dependencies JSON,\\n download_count INTEGER DEFAULT 0,\\n rating REAL DEFAULT 0,\\n installed_at INTEGER NOT NULL,\\n activated_at INTEGER,\\n last_updated INTEGER NOT NULL,\\n error_message TEXT,\\n created_at INTEGER DEFAULT (unixepoch()),\\n updated_at INTEGER DEFAULT (unixepoch())\\n);\\n\\n-- Plugin hooks table (registered hooks by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_hooks (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n hook_name TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n priority INTEGER DEFAULT 10,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, hook_name, handler_name)\\n);\\n\\n-- Plugin routes table\\nCREATE TABLE IF NOT EXISTS plugin_routes (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n path TEXT NOT NULL,\\n method TEXT NOT NULL,\\n handler_name TEXT NOT NULL,\\n middleware JSON,\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,\\n UNIQUE(plugin_id, path, method)\\n);\\n\\n-- Plugin assets table (CSS, JS files provided by plugins)\\nCREATE TABLE IF NOT EXISTS plugin_assets (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n asset_type TEXT NOT NULL CHECK (asset_type IN ('css', 'js', 'image', 'font')),\\n asset_path TEXT NOT NULL,\\n load_order INTEGER DEFAULT 100,\\n load_location TEXT DEFAULT 'footer' CHECK (load_location IN ('header', 'footer')),\\n is_active BOOLEAN DEFAULT TRUE,\\n created_at INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Plugin activity log\\nCREATE TABLE IF NOT EXISTS plugin_activity_log (\\n id TEXT PRIMARY KEY,\\n plugin_id TEXT NOT NULL,\\n action TEXT NOT NULL,\\n user_id TEXT,\\n details JSON,\\n timestamp INTEGER DEFAULT (unixepoch()),\\n FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE\\n);\\n\\n-- Create indexes\\nCREATE INDEX IF NOT EXISTS idx_plugins_status ON plugins(status);\\nCREATE INDEX IF NOT EXISTS idx_plugins_category ON plugins(category);\\nCREATE INDEX IF NOT EXISTS idx_plugin_hooks_plugin ON plugin_hooks(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_routes_plugin ON plugin_routes(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_assets_plugin ON plugin_assets(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_plugin ON plugin_activity_log(plugin_id);\\nCREATE INDEX IF NOT EXISTS idx_plugin_activity_timestamp ON plugin_activity_log(timestamp);\\n\\n-- Insert core plugins\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES \\n(\\n 'core-auth',\\n 'core-auth',\\n 'Authentication System',\\n 'Core authentication and user management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔐',\\n 'active',\\n TRUE,\\n '[\\\"manage:users\\\", \\\"manage:roles\\\", \\\"manage:permissions\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-media',\\n 'core-media', \\n 'Media Manager',\\n 'Core media upload and management system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'media',\\n '📸',\\n 'active',\\n TRUE,\\n '[\\\"manage:media\\\", \\\"upload:files\\\"]',\\n unixepoch(),\\n unixepoch()\\n),\\n(\\n 'core-workflow',\\n 'core-workflow',\\n 'Workflow Engine',\\n 'Content workflow and approval system',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin will be added as a third-party plugin through the admin interface\\n\\n-- Add plugin management permission\\nINSERT OR IGNORE INTO permissions (id, name, description, category, created_at)\\nVALUES (\\n 'manage:plugins',\\n 'Manage Plugins',\\n 'Install, uninstall, activate, and configure plugins',\\n 'system',\\n unixepoch()\\n);\\n\\n-- Grant plugin management permission to admin role\\nINSERT OR IGNORE INTO role_permissions (id, role, permission_id, created_at)\\nVALUES ('role-perm-manage-plugins', 'admin', 'manage:plugins', unixepoch());\"\n },\n {\n id: '007',\n name: 'Demo Login Plugin',\n filename: '007_demo_login_plugin.sql',\n description: 'Migration 007: Demo Login Plugin',\n sql: \"-- Demo Login Plugin Migration\\n-- Migration: 007_demo_login_plugin\\n-- Description: Add demo login prefill plugin to the plugin registry\\n\\n-- Insert demo login plugin\\nINSERT INTO plugins (\\n id, name, display_name, description, version, author, category, icon, \\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'demo-login-prefill',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials (admin@sonicjs.com/sonicjs!) for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'inactive',\\n TRUE,\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\"\n },\n {\n id: '008',\n name: 'Fix Slug Validation',\n filename: '008_fix_slug_validation.sql',\n description: 'Migration 008: Fix Slug Validation',\n sql: \"-- Migration: Fix overly restrictive slug validation patterns\\n-- This migration relaxes the slug field validation to be more user-friendly\\n\\n-- Update the pages collection slug field to allow underscores and be less restrictive\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_options = '{\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\", \\\"placeholder\\\": \\\"url-friendly-slug\\\", \\\"help\\\": \\\"Use letters, numbers, underscores, and hyphens only\\\"}'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\\n-- Update any other slug fields with the restrictive pattern\\nUPDATE content_fields \\nSET field_options = REPLACE(field_options, '\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"', '\\\"pattern\\\": \\\"^[a-zA-Z0-9_-]+$\\\"')\\nWHERE field_options LIKE '%\\\"pattern\\\": \\\"^[a-z0-9-]+$\\\"%';\"\n },\n {\n id: '009',\n name: 'System Logging',\n filename: '009_system_logging.sql',\n description: 'Migration 009: System Logging',\n sql: \"-- System Logging Tables\\n-- Migration: 009_system_logging\\n-- Description: Add system logging and configuration tables\\n\\n-- System logs table for tracking application events\\nCREATE TABLE IF NOT EXISTS system_logs (\\n id TEXT PRIMARY KEY,\\n level TEXT NOT NULL CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n category TEXT NOT NULL CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n message TEXT NOT NULL,\\n data TEXT, -- JSON data\\n user_id TEXT,\\n session_id TEXT,\\n request_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n method TEXT,\\n url TEXT,\\n status_code INTEGER,\\n duration INTEGER, -- milliseconds\\n stack_trace TEXT,\\n tags TEXT, -- JSON array\\n source TEXT, -- source of the log entry\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n FOREIGN KEY (user_id) REFERENCES users(id)\\n);\\n\\n-- Log configuration table for managing log settings per category\\nCREATE TABLE IF NOT EXISTS log_config (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL UNIQUE CHECK (category IN ('auth', 'api', 'workflow', 'plugin', 'media', 'system', 'security', 'error')),\\n enabled BOOLEAN NOT NULL DEFAULT TRUE,\\n level TEXT NOT NULL DEFAULT 'info' CHECK (level IN ('debug', 'info', 'warn', 'error', 'fatal')),\\n retention_days INTEGER NOT NULL DEFAULT 30,\\n max_size_mb INTEGER NOT NULL DEFAULT 100,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_system_logs_level ON system_logs(level);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_category ON system_logs(category);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_created_at ON system_logs(created_at);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_user_id ON system_logs(user_id);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_status_code ON system_logs(status_code);\\nCREATE INDEX IF NOT EXISTS idx_system_logs_source ON system_logs(source);\\n\\n-- Insert default log configurations\\nINSERT OR IGNORE INTO log_config (id, category, enabled, level, retention_days, max_size_mb) VALUES\\n('log-config-auth', 'auth', TRUE, 'info', 90, 50),\\n('log-config-api', 'api', TRUE, 'info', 30, 100),\\n('log-config-workflow', 'workflow', TRUE, 'info', 60, 50),\\n('log-config-plugin', 'plugin', TRUE, 'warn', 30, 25),\\n('log-config-media', 'media', TRUE, 'info', 30, 50),\\n('log-config-system', 'system', TRUE, 'info', 90, 100),\\n('log-config-security', 'security', TRUE, 'warn', 180, 100),\\n('log-config-error', 'error', TRUE, 'error', 90, 200);\"\n },\n {\n id: '011',\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql',\n description: 'Migration 011: Config Managed Collections',\n sql: \"-- Migration: Add Config-Managed Collections Support\\n-- Description: Add 'managed' column to collections table to support config-based collection definitions\\n-- Created: 2025-10-03\\n\\n-- Add 'managed' column to collections table\\n-- This column indicates whether a collection is managed by configuration files (true) or user-created (false)\\n-- Managed collections cannot be edited through the admin UI\\n-- Use a safe approach to add the column only if it doesn't exist\\nALTER TABLE collections ADD COLUMN managed INTEGER DEFAULT 0 NOT NULL;\\n\\n-- Create an index on the managed column for faster queries\\nCREATE INDEX IF NOT EXISTS idx_collections_managed ON collections(managed);\\n\\n-- Create an index on managed + is_active for efficient filtering\\nCREATE INDEX IF NOT EXISTS idx_collections_managed_active ON collections(managed, is_active);\\n\"\n },\n {\n id: '012',\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql',\n description: 'Migration 012: Testimonials Plugin',\n sql: \"-- Testimonials Plugin Migration\\n-- Creates testimonials table for the testimonials plugin\\n-- This demonstrates a code-based collection defined in src/plugins/core-plugins/testimonials-plugin.ts\\n\\nCREATE TABLE IF NOT EXISTS testimonials (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n author_name TEXT NOT NULL,\\n author_title TEXT,\\n author_company TEXT,\\n testimonial_text TEXT NOT NULL,\\n rating INTEGER CHECK(rating >= 1 AND rating <= 5),\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_testimonials_published ON testimonials(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_sort_order ON testimonials(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_testimonials_rating ON testimonials(rating);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS testimonials_updated_at\\n AFTER UPDATE ON testimonials\\nBEGIN\\n UPDATE testimonials SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('testimonials',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support. This is a code-based collection example.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}');\\n\\n-- Insert sample testimonial data\\nINSERT OR IGNORE INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder) VALUES\\n('Jane Smith',\\n 'CTO',\\n 'TechStartup Inc',\\n 'SonicJS AI has transformed how we manage our content. The plugin architecture is brilliant and the edge deployment is blazing fast.',\\n 5,\\n 1,\\n 1),\\n\\n('Michael Chen',\\n 'Lead Developer',\\n 'Digital Agency Co',\\n 'We migrated from WordPress to SonicJS AI and couldn''t be happier. The TypeScript-first approach and modern tooling make development a joy.',\\n 5,\\n 1,\\n 2),\\n\\n('Sarah Johnson',\\n 'Product Manager',\\n 'E-commerce Solutions',\\n 'The headless CMS approach combined with Cloudflare Workers gives us unmatched performance. Our content is served globally with minimal latency.',\\n 4,\\n 1,\\n 3),\\n\\n('David Rodriguez',\\n 'Full Stack Developer',\\n 'Creative Studio',\\n 'Great CMS for modern web applications. The admin interface is clean and the API is well-designed. Plugin system is very flexible.',\\n 5,\\n 1,\\n 4),\\n\\n('Emily Watson',\\n 'Technical Director',\\n 'Media Company',\\n 'SonicJS AI solved our content distribution challenges. The R2 integration for media storage works flawlessly and scales effortlessly.',\\n 4,\\n 1,\\n 5);\\n\"\n },\n {\n id: '013',\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql',\n description: 'Migration 013: Code Examples Plugin',\n sql: \"-- Code Examples Plugin Migration\\n-- Creates code_examples table for the code examples plugin\\n-- This demonstrates a code-based collection for storing and managing code snippets\\n\\nCREATE TABLE IF NOT EXISTS code_examples (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n title TEXT NOT NULL,\\n description TEXT,\\n code TEXT NOT NULL,\\n language TEXT NOT NULL,\\n category TEXT,\\n tags TEXT,\\n isPublished INTEGER NOT NULL DEFAULT 1,\\n sortOrder INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\\n);\\n\\n-- Create indexes for better performance\\nCREATE INDEX IF NOT EXISTS idx_code_examples_published ON code_examples(isPublished);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_sort_order ON code_examples(sortOrder);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_language ON code_examples(language);\\nCREATE INDEX IF NOT EXISTS idx_code_examples_category ON code_examples(category);\\n\\n-- Create trigger to update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS code_examples_updated_at\\n AFTER UPDATE ON code_examples\\nBEGIN\\n UPDATE code_examples SET updated_at = strftime('%s', 'now') WHERE id = NEW.id;\\nEND;\\n\\n-- Insert plugin record\\nINSERT OR IGNORE INTO plugins (name, display_name, description, version, status, category, settings) VALUES\\n('code-examples',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support. Perfect for documentation and tutorials.',\\n '1.0.0',\\n 'active',\\n 'content',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}');\\n\\n-- Insert sample code examples\\nINSERT OR IGNORE INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder) VALUES\\n('React useState Hook',\\n 'Basic example of using the useState hook in React for managing component state.',\\n 'import { useState } from ''react'';\\n\\nfunction Counter() {\\n const [count, setCount] = useState(0);\\n\\n return (\\n
\\n

Count: {count}

\\n \\n
\\n );\\n}\\n\\nexport default Counter;',\\n 'javascript',\\n 'frontend',\\n 'react,hooks,state',\\n 1,\\n 1),\\n\\n('TypeScript Interface Example',\\n 'Defining a TypeScript interface for type-safe objects.',\\n 'interface User {\\n id: string;\\n email: string;\\n name: string;\\n role: ''admin'' | ''editor'' | ''viewer'';\\n createdAt: Date;\\n}\\n\\nfunction greetUser(user: User): string {\\n return `Hello, ${user.name}!`;\\n}\\n\\nconst user: User = {\\n id: ''123'',\\n email: ''user@example.com'',\\n name: ''John Doe'',\\n role: ''admin'',\\n createdAt: new Date()\\n};\\n\\nconsole.log(greetUser(user));',\\n 'typescript',\\n 'backend',\\n 'typescript,types,interface',\\n 1,\\n 2),\\n\\n('Python List Comprehension',\\n 'Elegant way to create lists in Python using list comprehensions.',\\n '# Basic list comprehension\\nsquares = [x**2 for x in range(10)]\\nprint(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\\n\\n# With condition\\neven_squares = [x**2 for x in range(10) if x % 2 == 0]\\nprint(even_squares) # [0, 4, 16, 36, 64]\\n\\n# Nested list comprehension\\nmatrix = [[i+j for j in range(3)] for i in range(3)]\\nprint(matrix) # [[0, 1, 2], [1, 2, 3], [2, 3, 4]]',\\n 'python',\\n 'general',\\n 'python,lists,comprehension',\\n 1,\\n 3),\\n\\n('SQL Join Example',\\n 'Common SQL JOIN patterns for combining data from multiple tables.',\\n '-- INNER JOIN: Returns only matching rows\\nSELECT users.name, orders.total\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id;\\n\\n-- LEFT JOIN: Returns all users, even without orders\\nSELECT users.name, orders.total\\nFROM users\\nLEFT JOIN orders ON users.id = orders.user_id;\\n\\n-- Multiple JOINs\\nSELECT\\n users.name,\\n orders.order_date,\\n products.name AS product_name\\nFROM users\\nINNER JOIN orders ON users.id = orders.user_id\\nINNER JOIN order_items ON orders.id = order_items.order_id\\nINNER JOIN products ON order_items.product_id = products.id;',\\n 'sql',\\n 'database',\\n 'sql,joins,queries',\\n 1,\\n 4),\\n\\n('Go Error Handling',\\n 'Idiomatic error handling pattern in Go.',\\n 'package main\\n\\nimport (\\n\\t\\\"errors\\\"\\n\\t\\\"fmt\\\"\\n)\\n\\nfunc divide(a, b float64) (float64, error) {\\n\\tif b == 0 {\\n\\t\\treturn 0, errors.New(\\\"division by zero\\\")\\n\\t}\\n\\treturn a / b, nil\\n}\\n\\nfunc main() {\\n\\tresult, err := divide(10, 2)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t\\treturn\\n\\t}\\n\\tfmt.Printf(\\\"Result: %.2f\\\\n\\\", result)\\n\\n\\t// This will error\\n\\t_, err = divide(10, 0)\\n\\tif err != nil {\\n\\t\\tfmt.Println(\\\"Error:\\\", err)\\n\\t}\\n}',\\n 'go',\\n 'backend',\\n 'go,error-handling,functions',\\n 1,\\n 5);\\n\"\n },\n {\n id: '014',\n name: 'Fix Plugin Registry',\n filename: '014_fix_plugin_registry.sql',\n description: 'Migration 014: Fix Plugin Registry',\n sql: \"-- Fix Plugin Registry\\n-- Migration: 014_fix_plugin_registry\\n-- Description: Add missing plugins and fix plugin name mismatches\\n\\n-- Note: Cannot easily update plugin names as they may be referenced elsewhere\\n-- Instead we'll add the missing plugins with correct names\\n\\n-- Insert missing plugins\\n\\n-- Core Analytics Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'core-analytics',\\n 'core-analytics',\\n 'Analytics & Tracking',\\n 'Core analytics tracking and reporting plugin with page views and event tracking',\\n '1.0.0',\\n 'SonicJS Team',\\n 'seo',\\n '📊',\\n 'active',\\n TRUE,\\n '[\\\"view:analytics\\\", \\\"manage:tracking\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- FAQ Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'faq-plugin',\\n 'faq-plugin',\\n 'FAQ Management',\\n 'Frequently Asked Questions management plugin with categories, search, and custom styling',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '❓',\\n 'active',\\n FALSE,\\n '[\\\"manage:faqs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Seed Data Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'seed-data',\\n 'seed-data',\\n 'Seed Data Generator',\\n 'Generate realistic example users and content for testing and development',\\n '1.0.0',\\n 'SonicJS Team',\\n 'development',\\n '🌱',\\n 'inactive',\\n FALSE,\\n '[\\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Database Tools Plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'database-tools',\\n 'database-tools',\\n 'Database Tools',\\n 'Database management tools including truncate, backup, and validation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'system',\\n '🗄️',\\n 'active',\\n FALSE,\\n '[\\\"manage:database\\\", \\\"admin\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '015',\n name: 'Add Remaining Plugins',\n filename: '015_add_remaining_plugins.sql',\n description: 'Migration 015: Add Remaining Plugins',\n sql: \"-- Add Remaining Plugins\\n-- Migration: 015_add_remaining_plugins\\n-- Description: Add all remaining core plugins that were missing from the registry\\n\\n-- Testimonials Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'testimonials-plugin',\\n 'testimonials-plugin',\\n 'Customer Testimonials',\\n 'Manage customer testimonials and reviews with rating support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '⭐',\\n 'active',\\n FALSE,\\n '[\\\"manage:testimonials\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"requireRating\\\": false}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Code Examples Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'code-examples-plugin',\\n 'code-examples-plugin',\\n 'Code Examples',\\n 'Manage code snippets and examples with syntax highlighting support',\\n '1.0.0',\\n 'SonicJS',\\n 'content',\\n '💻',\\n 'active',\\n FALSE,\\n '[\\\"manage:code-examples\\\"]',\\n '[]',\\n '{\\\"defaultPublished\\\": true, \\\"supportedLanguages\\\": [\\\"javascript\\\", \\\"typescript\\\", \\\"python\\\", \\\"go\\\", \\\"rust\\\", \\\"java\\\", \\\"php\\\", \\\"ruby\\\", \\\"sql\\\"]}',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Workflow Plugin (with correct name)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'workflow-plugin',\\n 'workflow-plugin',\\n 'Workflow Engine',\\n 'Content workflow management with approval chains, scheduling, and automation',\\n '1.0.0',\\n 'SonicJS Team',\\n 'content',\\n '🔄',\\n 'active',\\n TRUE,\\n '[\\\"manage:workflows\\\", \\\"approve:content\\\"]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\\n-- Demo Login Plugin (already exists with correct name from migration 007, but let's ensure it's there)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'demo-login-plugin',\\n 'demo-login-plugin',\\n 'Demo Login Prefill',\\n 'Prefills login form with demo credentials for easy site demonstration',\\n '1.0.0',\\n 'SonicJS',\\n 'demo',\\n '🎯',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '016',\n name: 'Remove Duplicate Cache Plugin',\n filename: '016_remove_duplicate_cache_plugin.sql',\n description: 'Migration 016: Remove Duplicate Cache Plugin',\n sql: \"-- Migration: Remove duplicate cache plugin entry\\n-- Description: Removes the old 'cache' plugin (id: 'cache') that is a duplicate of 'core-cache'\\n-- This fixes the issue where Cache System appears twice in the plugins list\\n-- Created: 2025-10-14\\n\\n-- Remove the old 'cache' plugin entry if it exists\\n-- The correct plugin is 'core-cache' which is managed by plugin-bootstrap.ts\\nDELETE FROM plugins WHERE id = 'cache' AND name = 'cache';\\n\\n-- Clean up any related entries in plugin activity log\\nDELETE FROM plugin_activity_log WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin hooks\\nDELETE FROM plugin_hooks WHERE plugin_id = 'cache';\\n\\n-- Clean up any related entries in plugin routes\\nDELETE FROM plugin_routes WHERE plugin_id = 'cache';\\n\"\n },\n {\n id: '017',\n name: 'Auth Configurable Fields',\n filename: '017_auth_configurable_fields.sql',\n description: 'Migration 017: Auth Configurable Fields',\n sql: \"-- Migration: Make authentication fields configurable\\n-- This migration updates the core-auth plugin to support configurable required fields\\n\\n-- The settings will be stored in the plugins table as JSON\\n-- Default settings for core-auth plugin include:\\n-- {\\n-- \\\"requiredFields\\\": {\\n-- \\\"email\\\": { \\\"required\\\": true, \\\"minLength\\\": 5 },\\n-- \\\"password\\\": { \\\"required\\\": true, \\\"minLength\\\": 8 },\\n-- \\\"username\\\": { \\\"required\\\": true, \\\"minLength\\\": 3 },\\n-- \\\"firstName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 },\\n-- \\\"lastName\\\": { \\\"required\\\": true, \\\"minLength\\\": 1 }\\n-- },\\n-- \\\"validation\\\": {\\n-- \\\"emailFormat\\\": true,\\n-- \\\"allowDuplicateUsernames\\\": false\\n-- }\\n-- }\\n\\n-- Update core-auth plugin settings with configurable field requirements\\nUPDATE plugins\\nSET settings = json_object(\\n 'requiredFields', json_object(\\n 'email', json_object('required', 1, 'minLength', 5, 'label', 'Email', 'type', 'email'),\\n 'password', json_object('required', 1, 'minLength', 8, 'label', 'Password', 'type', 'password'),\\n 'username', json_object('required', 1, 'minLength', 3, 'label', 'Username', 'type', 'text'),\\n 'firstName', json_object('required', 1, 'minLength', 1, 'label', 'First Name', 'type', 'text'),\\n 'lastName', json_object('required', 1, 'minLength', 1, 'label', 'Last Name', 'type', 'text')\\n ),\\n 'validation', json_object(\\n 'emailFormat', 1,\\n 'allowDuplicateUsernames', 0,\\n 'passwordRequirements', json_object(\\n 'requireUppercase', 0,\\n 'requireLowercase', 0,\\n 'requireNumbers', 0,\\n 'requireSpecialChars', 0\\n )\\n ),\\n 'registration', json_object(\\n 'enabled', 1,\\n 'requireEmailVerification', 0,\\n 'defaultRole', 'viewer'\\n )\\n)\\nWHERE id = 'core-auth';\\n\\n-- If core-auth plugin doesn't exist, this migration will be handled by bootstrap\\n-- No need to insert here as plugin bootstrap handles initial plugin creation\\n\"\n },\n {\n id: '018',\n name: 'Settings Table',\n filename: '018_settings_table.sql',\n description: 'Migration 018: Settings Table',\n sql: \"-- Create settings table for storing application settings\\nCREATE TABLE IF NOT EXISTS settings (\\n id TEXT PRIMARY KEY,\\n category TEXT NOT NULL, -- 'general', 'appearance', 'security', etc.\\n key TEXT NOT NULL,\\n value TEXT NOT NULL, -- JSON value\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL,\\n UNIQUE(category, key)\\n);\\n\\n-- Insert default general settings\\nINSERT OR IGNORE INTO settings (id, category, key, value, created_at, updated_at)\\nVALUES\\n (lower(hex(randomblob(16))), 'general', 'siteName', '\\\"SonicJS AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'siteDescription', '\\\"A modern headless CMS powered by AI\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'timezone', '\\\"UTC\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'language', '\\\"en\\\"', unixepoch() * 1000, unixepoch() * 1000),\\n (lower(hex(randomblob(16))), 'general', 'maintenanceMode', 'false', unixepoch() * 1000, unixepoch() * 1000);\\n\\n-- Create index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);\\nCREATE INDEX IF NOT EXISTS idx_settings_category_key ON settings(category, key);\\n\"\n },\n {\n id: '019',\n name: 'Remove Blog Posts Collection',\n filename: '019_remove_blog_posts_collection.sql',\n description: 'Migration 019: Remove Blog Posts Collection',\n sql: \"-- Migration: Remove blog_posts from database-managed collections\\n-- Description: Remove blog-posts-collection from the database so it can be managed by code-based collection\\n-- Created: 2025-11-04\\n\\n-- Delete content associated with blog-posts-collection\\nDELETE FROM content WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete content fields for blog-posts-collection\\nDELETE FROM content_fields WHERE collection_id = 'blog-posts-collection';\\n\\n-- Delete the blog-posts collection itself\\nDELETE FROM collections WHERE id = 'blog-posts-collection';\\n\\n-- The blog-posts collection will now be managed by the code-based collection\\n-- in src/collections/blog-posts.collection.ts\\n\"\n },\n {\n id: '020',\n name: 'Add Email Plugin',\n filename: '020_add_email_plugin.sql',\n description: 'Migration 020: Add Email Plugin',\n sql: \"-- Add Email Plugin\\n-- Migration: 020_add_email_plugin\\n-- Description: Add email plugin for transactional emails via Resend\\n\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'email',\\n 'email',\\n 'Email',\\n 'Send transactional emails using Resend',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'utilities',\\n '📧',\\n 'inactive',\\n TRUE,\\n '[\\\"email:manage\\\", \\\"email:send\\\", \\\"email:view-logs\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '021',\n name: 'Add Magic Link Auth Plugin',\n filename: '021_add_magic_link_auth_plugin.sql',\n description: 'Migration 021: Add Magic Link Auth Plugin',\n sql: \"-- Add Magic Link Authentication Plugin\\n-- Migration: 021_add_magic_link_auth_plugin\\n-- Description: Add magic link authentication plugin for passwordless login\\n\\n-- Create magic_links table\\nCREATE TABLE IF NOT EXISTS magic_links (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n token TEXT NOT NULL UNIQUE,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_magic_links_token ON magic_links(token);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_email ON magic_links(user_email);\\nCREATE INDEX IF NOT EXISTS idx_magic_links_expires ON magic_links(expires_at);\\n\\n-- Register the plugin\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, installed_at, last_updated\\n) VALUES (\\n 'magic-link-auth',\\n 'magic-link-auth',\\n 'Magic Link Authentication',\\n 'Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'security',\\n '🔗',\\n 'inactive',\\n FALSE,\\n '[\\\"auth:manage\\\", \\\"auth:magic-link\\\"]',\\n '[\\\"email\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '022',\n name: 'Add Tinymce Plugin',\n filename: '022_add_tinymce_plugin.sql',\n description: 'Migration 022: Add Tinymce Plugin',\n sql: \"-- Add TinyMCE Rich Text Editor Plugin\\n-- Migration: 022_add_tinymce_plugin\\n-- Description: Add TinyMCE plugin for WYSIWYG rich text editing\\n\\n-- Register the plugin (active by default since it replaces hardcoded TinyMCE)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'tinymce-plugin',\\n 'tinymce-plugin',\\n 'TinyMCE Rich Text Editor',\\n 'Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✏️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"apiKey\\\":\\\"no-api-key\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"skin\\\":\\\"oxide-dark\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '023',\n name: 'Add Easy Mdx Plugin',\n filename: '023_add_easy_mdx_plugin.sql',\n description: 'Migration 023: Add Easy Mdx Plugin',\n sql: \"-- Add EasyMDE Markdown Editor Plugin\\n-- Migration: 023_add_easy_mdx_plugin\\n-- Description: Add EasyMDE plugin for lightweight markdown editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easy-mdx',\\n 'easy-mdx',\\n 'EasyMDE Markdown Editor',\\n 'Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '📝',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"defaultHeight\\\":400,\\\"theme\\\":\\\"dark\\\",\\\"toolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '024',\n name: 'Add Quill Editor Plugin',\n filename: '024_add_quill_editor_plugin.sql',\n description: 'Migration 024: Add Quill Editor Plugin',\n sql: \"-- Add Quill Rich Text Editor Plugin\\n-- Migration: 024_add_quill_editor_plugin\\n-- Description: Add Quill plugin for modern rich text editing\\n\\n-- Register the plugin (active by default)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'quill-editor',\\n 'quill-editor',\\n 'Quill Rich Text Editor',\\n 'Modern rich text editor for content creation. Provides a clean, intuitive WYSIWYG editor with customizable toolbars for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'active',\\n FALSE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"snow\\\",\\\"defaultHeight\\\":300,\\\"defaultToolbar\\\":\\\"full\\\",\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '025',\n name: 'Add Easymde Plugin',\n filename: '025_add_easymde_plugin.sql',\n description: 'Migration 025: Add Easymde Plugin',\n sql: \"-- Add EasyMDE Rich Text Editor Plugin\\n-- Migration: 025_add_easymde_plugin\\n-- Description: Add EasyMDE plugin for markdown-based rich text editing\\n\\n-- Register the plugin (inactive by default, replacing MDXEditor)\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, dependencies, settings, installed_at, last_updated\\n) VALUES (\\n 'easymde-editor',\\n 'easymde-editor',\\n 'EasyMDE Editor',\\n 'Lightweight markdown editor for content creation. Simple, elegant WYSIWYG markdown editor with live preview, toolbar, and dark mode support for richtext fields.',\\n '1.0.0',\\n 'SonicJS Team',\\n 'editor',\\n '✍️',\\n 'inactive',\\n TRUE,\\n '[]',\\n '[]',\\n '{\\\"theme\\\":\\\"dark\\\",\\\"defaultHeight\\\":300,\\\"toolbar\\\":\\\"full\\\",\\\"spellChecker\\\":false,\\\"placeholder\\\":\\\"Start writing your content...\\\"}',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '026',\n name: 'Add Otp Login',\n filename: '026_add_otp_login.sql',\n description: 'Migration 026: Add Otp Login',\n sql: \"-- Add OTP Login Plugin\\n-- Migration: 021_add_otp_login\\n-- Description: Add OTP login plugin for passwordless authentication via email codes\\n\\n-- Create table for OTP codes\\nCREATE TABLE IF NOT EXISTS otp_codes (\\n id TEXT PRIMARY KEY,\\n user_email TEXT NOT NULL,\\n code TEXT NOT NULL,\\n expires_at INTEGER NOT NULL,\\n used INTEGER DEFAULT 0,\\n used_at INTEGER,\\n ip_address TEXT,\\n user_agent TEXT,\\n attempts INTEGER DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\n-- Create indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_otp_email_code ON otp_codes(user_email, code);\\nCREATE INDEX IF NOT EXISTS idx_otp_expires ON otp_codes(expires_at);\\nCREATE INDEX IF NOT EXISTS idx_otp_used ON otp_codes(used);\\n\\n-- Add plugin record\\nINSERT OR IGNORE INTO plugins (\\n id, name, display_name, description, version, author, category, icon,\\n status, is_core, permissions, installed_at, last_updated\\n) VALUES (\\n 'otp-login',\\n 'otp-login',\\n 'OTP Login',\\n 'Passwordless authentication via email one-time codes',\\n '1.0.0-beta.1',\\n 'SonicJS Team',\\n 'security',\\n '🔢',\\n 'inactive',\\n TRUE,\\n '[\\\"otp:manage\\\", \\\"otp:request\\\", \\\"otp:verify\\\"]',\\n unixepoch(),\\n unixepoch()\\n);\\n\"\n },\n {\n id: '027',\n name: 'Fix Slug Field Type',\n filename: '027_fix_slug_field_type.sql',\n description: 'Migration 027: Fix Slug Field Type',\n sql: \"-- Migration: Fix slug field type\\n-- Description: Update slug fields to use 'slug' field type instead of 'text' for proper auto-generation\\n-- Created: 2026-01-10\\n\\n-- Update pages collection slug field to use 'slug' field type\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'pages-collection';\\n\\n-- Update blog posts slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';\\n\\n-- Update news slug field if it exists\\nUPDATE content_fields \\nSET field_type = 'slug'\\nWHERE field_name = 'slug' AND collection_id = 'news-collection';\\n\"\n },\n {\n id: '028',\n name: 'Fix Slug Field Type In Schemas',\n filename: '028_fix_slug_field_type_in_schemas.sql',\n description: 'Migration 028: Fix Slug Field Type In Schemas',\n sql: \"-- Migration: Fix slug field type in collection schemas\\n-- Description: Update slug fields in collection schemas to use 'slug' type instead of 'string'\\n-- Created: 2026-01-10\\n\\n-- Update pages-collection schema\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'pages-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update blog-posts-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'blog-posts-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\\n-- Update news-collection schema if it exists\\nUPDATE collections \\nSET schema = REPLACE(\\n schema,\\n '\\\"slug\\\":{\\\"type\\\":\\\"string\\\"',\\n '\\\"slug\\\":{\\\"type\\\":\\\"slug\\\"'\\n)\\nWHERE id = 'news-collection' AND schema LIKE '%\\\"slug\\\":{\\\"type\\\":\\\"string\\\"%';\\n\"\n },\n {\n id: '029',\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql',\n description: 'Migration 029: Add Forms System',\n sql: \"-- Migration: 029_add_forms_system.sql\\n-- Description: Add Form.io integration for advanced form building\\n-- Date: January 23, 2026\\n-- Phase: 1 - Database Schema\\n\\n-- =====================================================\\n-- Table: forms\\n-- Description: Stores form definitions and configuration\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS forms (\\n id TEXT PRIMARY KEY,\\n name TEXT NOT NULL UNIQUE, -- Machine name (e.g., \\\"contact-form\\\")\\n display_name TEXT NOT NULL, -- Human name (e.g., \\\"Contact Form\\\")\\n description TEXT, -- Optional description\\n category TEXT DEFAULT 'general', -- Form category (contact, survey, registration, etc.)\\n \\n -- Form.io schema (JSON)\\n formio_schema TEXT NOT NULL, -- Complete Form.io JSON schema\\n \\n -- Settings\\n settings TEXT, -- JSON: {\\n -- emailNotifications: true,\\n -- notifyEmail: \\\"admin@example.com\\\",\\n -- successMessage: \\\"Thank you!\\\",\\n -- redirectUrl: \\\"/thank-you\\\",\\n -- allowAnonymous: true,\\n -- requireAuth: false,\\n -- maxSubmissions: null,\\n -- submitButtonText: \\\"Submit\\\",\\n -- saveProgress: true,\\n -- webhookUrl: null\\n -- }\\n \\n -- Status & Management\\n is_active INTEGER DEFAULT 1, -- Active/inactive flag\\n is_public INTEGER DEFAULT 1, -- Public (anyone) vs private (auth required)\\n managed INTEGER DEFAULT 0, -- Code-managed (like collections)\\n \\n -- Metadata\\n icon TEXT, -- Optional icon for admin UI\\n color TEXT, -- Optional color (hex) for admin UI\\n tags TEXT, -- JSON array of tags\\n \\n -- Stats\\n submission_count INTEGER DEFAULT 0, -- Total submissions received\\n view_count INTEGER DEFAULT 0, -- Form views (optional tracking)\\n \\n -- Ownership\\n created_by TEXT REFERENCES users(id), -- User who created the form\\n updated_by TEXT REFERENCES users(id), -- User who last updated\\n \\n -- Timestamps\\n created_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for forms\\nCREATE INDEX IF NOT EXISTS idx_forms_name ON forms(name);\\nCREATE INDEX IF NOT EXISTS idx_forms_category ON forms(category);\\nCREATE INDEX IF NOT EXISTS idx_forms_active ON forms(is_active);\\nCREATE INDEX IF NOT EXISTS idx_forms_public ON forms(is_public);\\nCREATE INDEX IF NOT EXISTS idx_forms_created_by ON forms(created_by);\\n\\n-- =====================================================\\n-- Table: form_submissions\\n-- Description: Stores submitted form data\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_submissions (\\n id TEXT PRIMARY KEY,\\n form_id TEXT NOT NULL REFERENCES forms(id) ON DELETE CASCADE,\\n \\n -- Submission data\\n submission_data TEXT NOT NULL, -- JSON: The actual form data submitted\\n \\n -- Submission metadata\\n status TEXT DEFAULT 'pending', -- pending, reviewed, approved, rejected, spam\\n submission_number INTEGER, -- Sequential number per form\\n \\n -- User information (if authenticated)\\n user_id TEXT REFERENCES users(id), -- Submitter user ID (if logged in)\\n user_email TEXT, -- Email from form (or user account)\\n \\n -- Tracking information\\n ip_address TEXT, -- IP address of submitter\\n user_agent TEXT, -- Browser user agent\\n referrer TEXT, -- Page that referred to form\\n utm_source TEXT, -- UTM tracking params\\n utm_medium TEXT,\\n utm_campaign TEXT,\\n \\n -- Review/Processing\\n reviewed_by TEXT REFERENCES users(id), -- Admin who reviewed\\n reviewed_at INTEGER, -- Review timestamp\\n review_notes TEXT, -- Admin notes\\n \\n -- Flags\\n is_spam INTEGER DEFAULT 0, -- Spam flag\\n is_archived INTEGER DEFAULT 0, -- Archived flag\\n \\n -- Timestamps\\n submitted_at INTEGER NOT NULL,\\n updated_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for submissions\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_form_id ON form_submissions(form_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_status ON form_submissions(status);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_user_id ON form_submissions(user_id);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_email ON form_submissions(user_email);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_submitted_at ON form_submissions(submitted_at);\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_spam ON form_submissions(is_spam);\\n\\n-- Trigger to auto-increment submission_number per form\\nCREATE TRIGGER IF NOT EXISTS set_submission_number\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE form_submissions \\n SET submission_number = (\\n SELECT COUNT(*) \\n FROM form_submissions \\n WHERE form_id = NEW.form_id \\n AND id <= NEW.id\\n )\\n WHERE id = NEW.id;\\nEND;\\n\\n-- Trigger to update form submission_count\\nCREATE TRIGGER IF NOT EXISTS increment_form_submission_count\\nAFTER INSERT ON form_submissions\\nBEGIN\\n UPDATE forms \\n SET submission_count = submission_count + 1,\\n updated_at = unixepoch() * 1000\\n WHERE id = NEW.form_id;\\nEND;\\n\\n-- =====================================================\\n-- Table: form_files (Optional)\\n-- Description: Link form submissions to uploaded files\\n-- =====================================================\\n\\nCREATE TABLE IF NOT EXISTS form_files (\\n id TEXT PRIMARY KEY,\\n submission_id TEXT NOT NULL REFERENCES form_submissions(id) ON DELETE CASCADE,\\n media_id TEXT NOT NULL REFERENCES media(id) ON DELETE CASCADE,\\n field_name TEXT NOT NULL, -- Form field that uploaded this file\\n uploaded_at INTEGER NOT NULL\\n);\\n\\n-- Indexes for form files\\nCREATE INDEX IF NOT EXISTS idx_form_files_submission ON form_files(submission_id);\\nCREATE INDEX IF NOT EXISTS idx_form_files_media ON form_files(media_id);\\n\\n-- =====================================================\\n-- Sample Data: Create a default contact form\\n-- =====================================================\\n\\nINSERT OR IGNORE INTO forms (\\n id,\\n name,\\n display_name,\\n description,\\n category,\\n formio_schema,\\n settings,\\n is_active,\\n is_public,\\n created_at,\\n updated_at\\n) VALUES (\\n 'default-contact-form',\\n 'contact',\\n 'Contact Form',\\n 'A simple contact form for getting in touch',\\n 'contact',\\n '{\\\"components\\\":[]}',\\n '{\\\"emailNotifications\\\":false,\\\"successMessage\\\":\\\"Thank you for your submission!\\\",\\\"submitButtonText\\\":\\\"Submit\\\",\\\"requireAuth\\\":false}',\\n 1,\\n 1,\\n unixepoch() * 1000,\\n unixepoch() * 1000\\n);\\n\"\n },\n {\n id: '030',\n name: 'Add Turnstile To Forms',\n filename: '030_add_turnstile_to_forms.sql',\n description: 'Migration 030: Add Turnstile To Forms',\n sql: \"-- Add Turnstile configuration to forms table\\n-- This allows per-form Turnstile settings with global fallback\\n\\n-- Add columns (D1 may not support CHECK constraints in ALTER TABLE)\\nALTER TABLE forms ADD COLUMN turnstile_enabled INTEGER DEFAULT 0;\\nALTER TABLE forms ADD COLUMN turnstile_settings TEXT;\\n\\n-- Set default to inherit global settings for existing forms\\nUPDATE forms \\nSET turnstile_settings = '{\\\"inherit\\\":true}' \\nWHERE turnstile_settings IS NULL;\\n\\n-- Add index for faster lookups\\nCREATE INDEX IF NOT EXISTS idx_forms_turnstile ON forms(turnstile_enabled);\\n\"\n },\n {\n id: '031',\n name: 'Ai Search Plugin',\n filename: '031_ai_search_plugin.sql',\n description: 'Migration 031: Ai Search Plugin',\n sql: \"-- AI Search plugin settings\\nCREATE TABLE IF NOT EXISTS ai_search_settings (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n enabled BOOLEAN DEFAULT 0,\\n ai_mode_enabled BOOLEAN DEFAULT 1,\\n selected_collections TEXT, -- JSON array of collection IDs to index\\n dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index\\n autocomplete_enabled BOOLEAN DEFAULT 1,\\n cache_duration INTEGER DEFAULT 1, -- hours\\n results_limit INTEGER DEFAULT 20,\\n index_media BOOLEAN DEFAULT 0,\\n index_status TEXT, -- JSON object with status per collection\\n last_indexed_at INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Search history/analytics\\nCREATE TABLE IF NOT EXISTS ai_search_history (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n query TEXT NOT NULL,\\n mode TEXT, -- 'ai' or 'keyword'\\n results_count INTEGER,\\n user_id INTEGER,\\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index metadata tracking (per collection)\\nCREATE TABLE IF NOT EXISTS ai_search_index_meta (\\n id INTEGER PRIMARY KEY AUTOINCREMENT,\\n collection_id INTEGER NOT NULL,\\n collection_name TEXT NOT NULL, -- Cache collection name for display\\n total_items INTEGER DEFAULT 0,\\n indexed_items INTEGER DEFAULT 0,\\n last_sync_at INTEGER,\\n status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'\\n error_message TEXT,\\n UNIQUE(collection_id)\\n);\\n\\n-- Indexes for performance\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);\\nCREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);\\n\"\n },\n {\n id: '032',\n name: 'User Profiles',\n filename: '032_user_profiles.sql',\n description: 'Migration 032: User Profiles',\n sql: \"-- User Profiles Table (Core Migration)\\n-- Stores extended user profile data separate from auth concerns\\n-- Required by admin-users.ts for user edit page profile management\\n--\\n-- Originally introduced as app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\\n-- in upstream PR #508. Core routes (admin-users.ts) were updated to query this table in PR #512,\\n-- but no corresponding core migration was added. This migration corrects that gap.\\n--\\n-- IF NOT EXISTS guards ensure idempotency for databases that already have the table\\n-- from the app-level migration.\\n\\nCREATE TABLE IF NOT EXISTS user_profiles (\\n id TEXT PRIMARY KEY,\\n user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,\\n\\n display_name TEXT,\\n bio TEXT,\\n company TEXT,\\n job_title TEXT,\\n website TEXT,\\n location TEXT,\\n date_of_birth INTEGER,\\n data TEXT DEFAULT '{}',\\n\\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\\n);\\n\\n-- Index for fast user lookups\\nCREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);\\n\\n-- Trigger to auto-update updated_at timestamp\\nCREATE TRIGGER IF NOT EXISTS user_profiles_updated_at\\n AFTER UPDATE ON user_profiles\\nBEGIN\\n UPDATE user_profiles SET updated_at = strftime('%s', 'now') * 1000 WHERE id = NEW.id;\\nEND;\\n\"\n },\n {\n id: '033',\n name: 'Form Content Integration',\n filename: '033_form_content_integration.sql',\n description: 'Migration 033: Form Content Integration',\n sql: \"-- Migration 033: Form-Content Integration\\n-- Adds bridge columns to link forms to collections and submissions to content items\\n\\n-- Add source_type and source_id to collections for form-derived collections\\nALTER TABLE collections ADD COLUMN source_type TEXT DEFAULT 'user';\\nALTER TABLE collections ADD COLUMN source_id TEXT;\\n\\n-- Index for efficient lookup of form-derived collections\\nCREATE INDEX IF NOT EXISTS idx_collections_source ON collections(source_type, source_id);\\n\\n-- Add content_id to form_submissions for linking to content items\\nALTER TABLE form_submissions ADD COLUMN content_id TEXT REFERENCES content(id);\\n\\n-- Index for efficient lookup by content_id\\nCREATE INDEX IF NOT EXISTS idx_form_submissions_content_id ON form_submissions(content_id);\\n\\n-- Create system user for anonymous form submissions\\nINSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\\nVALUES ('system-form-submission', 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', NULL, 'viewer', 0, strftime('%s','now') * 1000, strftime('%s','now') * 1000);\\n\"\n },\n {\n id: '034',\n name: 'Security Audit Plugin',\n filename: '034_security_audit_plugin.sql',\n description: 'Migration 034: Security Audit Plugin',\n sql: \"-- Security Audit Plugin\\n-- Tracks login attempts, registrations, and security events for monitoring and brute-force detection\\n\\nCREATE TABLE IF NOT EXISTS security_events (\\n id TEXT PRIMARY KEY,\\n event_type TEXT NOT NULL,\\n severity TEXT NOT NULL DEFAULT 'info',\\n user_id TEXT,\\n email TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n country_code TEXT,\\n request_path TEXT,\\n request_method TEXT,\\n details TEXT,\\n fingerprint TEXT,\\n blocked INTEGER NOT NULL DEFAULT 0,\\n created_at INTEGER NOT NULL\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type);\\nCREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_security_events_email ON security_events(email);\\nCREATE INDEX IF NOT EXISTS idx_security_events_ip ON security_events(ip_address);\\nCREATE INDEX IF NOT EXISTS idx_security_events_severity ON security_events(severity);\\nCREATE INDEX IF NOT EXISTS idx_security_events_created ON security_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_security_events_fingerprint ON security_events(fingerprint);\\n\"\n },\n {\n id: '035',\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql',\n description: 'Migration 035: User Profiles Data Column',\n sql: \"-- Migration 035: Add data column to user_profiles (no-op)\\n--\\n-- This migration originally added a missing 'data' column to user_profiles.\\n-- Migration 032 has since been updated to include the column in the CREATE TABLE,\\n-- so on fresh installs the column already exists by the time this runs.\\n--\\n-- The ALTER TABLE has been removed to prevent \\\"duplicate column name: data\\\" errors\\n-- during fresh installs (GitHub issue #771). Wrangler's migration runner does not\\n-- gracefully handle duplicate column errors like the runtime MigrationService does.\\n--\\n-- Existing databases that ran the old 032 (without the data column) get the column\\n-- added at runtime by the core MigrationService, which skips duplicate-column errors.\\n--\\n-- This file is kept as a no-op so that wrangler's migration tracking remains\\n-- consistent (it tracks migrations by filename).\\nSELECT 1;\\n\"\n },\n {\n id: '036',\n name: 'Analytics Events',\n filename: '036_analytics_events.sql',\n description: 'Migration 036: Analytics Events',\n sql: \"-- Migration 036: Analytics Events Table\\n-- Provides storage for user behavior event tracking (page views, custom events)\\n\\nCREATE TABLE IF NOT EXISTS analytics_events (\\n id TEXT PRIMARY KEY,\\n event TEXT NOT NULL,\\n category TEXT NOT NULL DEFAULT 'user-activity',\\n properties TEXT,\\n user_id TEXT,\\n session_id TEXT,\\n ip_address TEXT,\\n user_agent TEXT,\\n path TEXT,\\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\\n);\\n\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_event ON analytics_events(event);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_category ON analytics_events(category);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_user_id ON analytics_events(user_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_session_id ON analytics_events(session_id);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_created_at ON analytics_events(created_at);\\nCREATE INDEX IF NOT EXISTS idx_analytics_events_path ON analytics_events(path);\\n\"\n }\n]\n\n// Map for quick lookup by ID\nexport const migrationsByIdMap = new Map(\n bundledMigrations.map(m => [m.id, m])\n)\n\n// Get migration SQL by ID\nexport function getMigrationSQLById(id: string): string | null {\n return migrationsByIdMap.get(id)?.sql ?? null\n}\n\n// Get all migration info (without SQL for lighter payloads)\nexport function getMigrationList(): Array> {\n return bundledMigrations.map(({ sql, ...rest }) => rest)\n}\n","import { D1Database } from '@cloudflare/workers-types'\nimport { bundledMigrations, getMigrationSQLById, type BundledMigration } from '../db/migrations-bundle'\n\nexport interface Migration {\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n}\n\nexport interface MigrationStatus {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Migration[]\n}\n\nexport class MigrationService {\n constructor(private db: D1Database) {}\n\n /**\n * Initialize the migrations tracking table\n */\n async initializeMigrationsTable(): Promise {\n const createTableQuery = `\n CREATE TABLE IF NOT EXISTS migrations (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n filename TEXT NOT NULL,\n applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n checksum TEXT\n )\n `\n\n await this.db.prepare(createTableQuery).run()\n }\n\n /**\n * Get all available migrations from the bundled migrations\n */\n async getAvailableMigrations(): Promise {\n const migrations: Migration[] = []\n\n // Get applied migrations from database\n const appliedResult = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at ASC'\n ).all()\n\n const appliedMigrations = new Map(\n appliedResult.results?.map((row: any) => [row.id, row]) || []\n )\n\n // Auto-detect applied migrations by checking if their tables exist\n await this.autoDetectAppliedMigrations(appliedMigrations)\n\n // Use bundled migrations as the source of truth\n for (const bundled of bundledMigrations) {\n const applied = appliedMigrations.has(bundled.id)\n const appliedData = appliedMigrations.get(bundled.id)\n\n migrations.push({\n id: bundled.id,\n name: bundled.name,\n filename: bundled.filename,\n description: bundled.description,\n applied,\n appliedAt: applied ? appliedData?.applied_at : undefined,\n size: bundled.sql.length\n })\n }\n\n return migrations\n }\n\n /**\n * Auto-detect applied migrations by checking if their tables exist\n */\n private async autoDetectAppliedMigrations(appliedMigrations: Map): Promise {\n // Check if basic schema tables exist (migration 001)\n if (!appliedMigrations.has('001')) {\n const hasBasicTables = await this.checkTablesExist(['users', 'content', 'collections', 'media'])\n if (hasBasicTables) {\n appliedMigrations.set('001', {\n id: '001',\n applied_at: new Date().toISOString(),\n name: 'Initial Schema',\n filename: '001_initial_schema.sql'\n })\n await this.markMigrationApplied('001', 'Initial Schema', '001_initial_schema.sql')\n }\n }\n\n // Check if FAQ tables exist (migration 002)\n // Migration 002 creates only the 'faqs' table\n if (!appliedMigrations.has('002')) {\n const hasFaqTables = await this.checkTablesExist(['faqs'])\n if (hasFaqTables) {\n appliedMigrations.set('002', {\n id: '002',\n applied_at: new Date().toISOString(),\n name: 'Faq Plugin',\n filename: '002_faq_plugin.sql'\n })\n await this.markMigrationApplied('002', 'Faq Plugin', '002_faq_plugin.sql')\n }\n }\n\n // Check if stage 5 enhancement tables exist (migration 003)\n // Migration 003 creates content_fields, content_relationships, workflow_templates tables\n if (!appliedMigrations.has('003')) {\n const hasStage5Tables = await this.checkTablesExist(['content_fields', 'content_relationships', 'workflow_templates'])\n if (hasStage5Tables) {\n appliedMigrations.set('003', {\n id: '003',\n applied_at: new Date().toISOString(),\n name: 'Stage 5 Enhancements',\n filename: '003_stage5_enhancements.sql'\n })\n await this.markMigrationApplied('003', 'Stage 5 Enhancements', '003_stage5_enhancements.sql')\n }\n }\n\n // Check if testimonials table exists (migration 012)\n if (!appliedMigrations.has('012')) {\n const hasTestimonialsTables = await this.checkTablesExist(['testimonials'])\n if (hasTestimonialsTables) {\n appliedMigrations.set('012', {\n id: '012',\n applied_at: new Date().toISOString(),\n name: 'Testimonials Plugin',\n filename: '012_testimonials_plugin.sql'\n })\n await this.markMigrationApplied('012', 'Testimonials Plugin', '012_testimonials_plugin.sql')\n }\n }\n\n // Check if code_examples table exists (migration 013)\n if (!appliedMigrations.has('013')) {\n const hasCodeExamplesTables = await this.checkTablesExist(['code_examples'])\n if (hasCodeExamplesTables) {\n appliedMigrations.set('013', {\n id: '013',\n applied_at: new Date().toISOString(),\n name: 'Code Examples Plugin',\n filename: '013_code_examples_plugin.sql'\n })\n await this.markMigrationApplied('013', 'Code Examples Plugin', '013_code_examples_plugin.sql')\n }\n }\n\n // Check if user management tables exist (migration 004)\n if (!appliedMigrations.has('004')) {\n const hasUserTables = await this.checkTablesExist(['api_tokens', 'workflow_history'])\n if (hasUserTables) {\n appliedMigrations.set('004', {\n id: '004',\n applied_at: new Date().toISOString(),\n name: 'User Management',\n filename: '004_stage6_user_management.sql'\n })\n await this.markMigrationApplied('004', 'User Management', '004_stage6_user_management.sql')\n }\n }\n\n // Check if plugin system tables exist (migration 006)\n if (!appliedMigrations.has('006')) {\n const hasPluginTables = await this.checkTablesExist(['plugins', 'plugin_hooks'])\n if (hasPluginTables) {\n appliedMigrations.set('006', {\n id: '006',\n applied_at: new Date().toISOString(),\n name: 'Plugin System',\n filename: '006_plugin_system.sql'\n })\n await this.markMigrationApplied('006', 'Plugin System', '006_plugin_system.sql')\n }\n }\n\n // Check if managed column exists (migration 011)\n // This handles both cases:\n // 1. Migration not marked as applied but column exists -> mark as applied\n // 2. Migration marked as applied but column doesn't exist -> remove from applied (will re-run)\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!appliedMigrations.has('011') && hasManagedColumn) {\n appliedMigrations.set('011', {\n id: '011',\n applied_at: new Date().toISOString(),\n name: 'Config Managed Collections',\n filename: '011_config_managed_collections.sql'\n })\n await this.markMigrationApplied('011', 'Config Managed Collections', '011_config_managed_collections.sql')\n } else if (appliedMigrations.has('011') && !hasManagedColumn) {\n // Migration was marked as applied but column doesn't exist - remove it so it will re-run\n console.log('[Migration] Migration 011 marked as applied but managed column missing - will re-run')\n appliedMigrations.delete('011')\n await this.removeMigrationApplied('011')\n }\n\n // Check if system_logs table exists (migration 009)\n if (!appliedMigrations.has('009')) {\n const hasLoggingTables = await this.checkTablesExist(['system_logs', 'log_config'])\n if (hasLoggingTables) {\n appliedMigrations.set('009', {\n id: '009',\n applied_at: new Date().toISOString(),\n name: 'System Logging',\n filename: '009_system_logging.sql'\n })\n await this.markMigrationApplied('009', 'System Logging', '009_system_logging.sql')\n }\n }\n\n // Check if settings table exists (migration 018)\n if (!appliedMigrations.has('018')) {\n const hasSettingsTable = await this.checkTablesExist(['settings'])\n if (hasSettingsTable) {\n appliedMigrations.set('018', {\n id: '018',\n applied_at: new Date().toISOString(),\n name: 'Settings Table',\n filename: '018_settings_table.sql'\n })\n await this.markMigrationApplied('018', 'Settings Table', '018_settings_table.sql')\n }\n }\n\n // Check if forms tables exist (migration 029)\n // Migration 029 was reassigned between releases: older versions used it for \"Ai Search Plugin\",\n // newer versions use it for \"Add Forms System\". This handles the case where 029 is marked as\n // applied (from the old AI Search migration) but the forms tables don't actually exist.\n const hasFormsTables = await this.checkTablesExist(['forms', 'form_submissions', 'form_files'])\n if (!appliedMigrations.has('029') && hasFormsTables) {\n appliedMigrations.set('029', {\n id: '029',\n applied_at: new Date().toISOString(),\n name: 'Add Forms System',\n filename: '029_add_forms_system.sql'\n })\n await this.markMigrationApplied('029', 'Add Forms System', '029_add_forms_system.sql')\n } else if (appliedMigrations.has('029') && !hasFormsTables) {\n // Migration was marked as applied (possibly from old \"Ai Search Plugin\" migration)\n // but forms tables don't exist - remove it so the forms migration will re-run\n console.log('[Migration] Migration 029 marked as applied but forms tables missing - will re-run')\n appliedMigrations.delete('029')\n await this.removeMigrationApplied('029')\n }\n\n // Check if user_profiles table exists (migration 032)\n // Table may already exist from app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)\n if (!appliedMigrations.has('032')) {\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n appliedMigrations.set('032', {\n id: '032',\n applied_at: new Date().toISOString(),\n name: 'User Profiles',\n filename: '032_user_profiles.sql'\n })\n await this.markMigrationApplied('032', 'User Profiles', '032_user_profiles.sql')\n }\n }\n\n // Ensure user_profiles.data column exists (migration 035 is now a no-op).\n // Databases that ran the old 032 (without data column) need the column added.\n // Migration 035 was converted to a no-op to fix #771 (duplicate column error\n // on fresh installs), so we add the column here if it's missing.\n const hasUserProfilesTable = await this.checkTablesExist(['user_profiles'])\n if (hasUserProfilesTable) {\n const hasDataColumn = await this.checkColumnExists('user_profiles', 'data')\n if (!hasDataColumn) {\n try {\n await this.db.prepare(`ALTER TABLE user_profiles ADD COLUMN data TEXT DEFAULT '{}'`).run()\n console.log('[Migration] Added missing data column to user_profiles')\n } catch (error) {\n // Column may have been added concurrently; ignore duplicate column errors\n const msg = error instanceof Error ? error.message : String(error)\n if (!msg.includes('duplicate column name')) {\n console.error('[Migration] Failed to add data column to user_profiles:', msg)\n }\n }\n }\n }\n\n // Mark migration 035 as applied since it's now a no-op (column handled above)\n if (!appliedMigrations.has('035')) {\n const hasDataCol = hasUserProfilesTable && await this.checkColumnExists('user_profiles', 'data')\n if (hasDataCol) {\n appliedMigrations.set('035', {\n id: '035',\n applied_at: new Date().toISOString(),\n name: 'User Profiles Data Column',\n filename: '035_user_profiles_data_column.sql'\n })\n await this.markMigrationApplied('035', 'User Profiles Data Column', '035_user_profiles_data_column.sql')\n }\n }\n }\n\n /**\n * Check if specific tables exist in the database\n */\n private async checkTablesExist(tableNames: string[]): Promise {\n try {\n for (const tableName of tableNames) {\n const result = await this.db.prepare(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`\n ).bind(tableName).first()\n\n if (!result) {\n return false\n }\n }\n return true\n } catch (error) {\n return false\n }\n }\n\n /**\n * Check if a specific column exists in a table\n */\n private async checkColumnExists(tableName: string, columnName: string): Promise {\n try {\n const result = await this.db.prepare(\n `SELECT * FROM pragma_table_info(?) WHERE name = ?`\n ).bind(tableName, columnName).first()\n\n return !!result\n } catch (error) {\n return false\n }\n }\n\n /**\n * Get migration status summary\n */\n async getMigrationStatus(): Promise {\n await this.initializeMigrationsTable()\n\n const migrations = await this.getAvailableMigrations()\n const appliedMigrations = migrations.filter(m => m.applied)\n const pendingMigrations = migrations.filter(m => !m.applied)\n\n const lastApplied = appliedMigrations.length > 0\n ? appliedMigrations[appliedMigrations.length - 1]?.appliedAt\n : undefined\n\n return {\n totalMigrations: migrations.length,\n appliedMigrations: appliedMigrations.length,\n pendingMigrations: pendingMigrations.length,\n lastApplied,\n migrations\n }\n }\n\n /**\n * Mark a migration as applied\n */\n async markMigrationApplied(migrationId: string, name: string, filename: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'INSERT OR REPLACE INTO migrations (id, name, filename, applied_at) VALUES (?, ?, ?, CURRENT_TIMESTAMP)'\n ).bind(migrationId, name, filename).run()\n }\n\n /**\n * Remove a migration from the applied list (so it can be re-run)\n */\n async removeMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n await this.db.prepare(\n 'DELETE FROM migrations WHERE id = ?'\n ).bind(migrationId).run()\n }\n\n /**\n * Check if a specific migration has been applied\n */\n async isMigrationApplied(migrationId: string): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM migrations WHERE id = ?'\n ).bind(migrationId).first()\n\n return (result?.count as number) > 0\n }\n\n /**\n * Get the last applied migration\n */\n async getLastAppliedMigration(): Promise {\n await this.initializeMigrationsTable()\n\n const result = await this.db.prepare(\n 'SELECT id, name, filename, applied_at FROM migrations ORDER BY applied_at DESC LIMIT 1'\n ).first()\n\n if (!result) return null\n\n return {\n id: result.id as string,\n name: result.name as string,\n filename: result.filename as string,\n applied: true,\n appliedAt: result.applied_at as string\n }\n }\n\n /**\n * Run pending migrations\n */\n async runPendingMigrations(): Promise<{ success: boolean; message: string; applied: string[]; errors: string[] }> {\n await this.initializeMigrationsTable()\n\n const status = await this.getMigrationStatus()\n const pendingMigrations = status.migrations.filter(m => !m.applied)\n\n if (pendingMigrations.length === 0) {\n return {\n success: true,\n message: 'All migrations are up to date',\n applied: [],\n errors: []\n }\n }\n\n // Actually execute the migration files\n const applied: string[] = []\n const errors: string[] = []\n\n for (const migration of pendingMigrations) {\n try {\n console.log(`[Migration] Applying ${migration.id}: ${migration.name}`)\n await this.applyMigration(migration)\n await this.markMigrationApplied(migration.id, migration.name, migration.filename)\n applied.push(migration.id)\n console.log(`[Migration] Successfully applied ${migration.id}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`[Migration] Failed to apply migration ${migration.id}:`, errorMessage)\n errors.push(`${migration.id}: ${errorMessage}`)\n // Continue with other migrations instead of stopping on first failure\n // This allows independent migrations to still be applied\n }\n }\n\n if (errors.length > 0 && applied.length === 0) {\n return {\n success: false,\n message: `Failed to apply migrations: ${errors.join('; ')}`,\n applied,\n errors\n }\n }\n\n return {\n success: true,\n message: applied.length > 0\n ? `Applied ${applied.length} migration(s)${errors.length > 0 ? ` (${errors.length} failed)` : ''}`\n : 'No migrations applied',\n applied,\n errors\n }\n }\n\n /**\n * Apply a specific migration\n */\n private async applyMigration(migration: Migration): Promise {\n // Get the actual migration SQL from the bundle\n const migrationSQL = getMigrationSQLById(migration.id)\n\n if (migrationSQL === null) {\n throw new Error(`Migration SQL not found for ${migration.id}`)\n }\n\n if (migrationSQL.trim() === '') {\n console.log(`[Migration] Skipping empty migration ${migration.id}`)\n return\n }\n\n // Split SQL into individual statements, handling triggers properly\n const statements = this.splitSQLStatements(migrationSQL)\n\n for (const statement of statements) {\n if (statement.trim()) {\n try {\n await this.db.prepare(statement).run()\n } catch (error) {\n // Check if it's a \"already exists\" type error and skip it\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('already exists') ||\n errorMessage.includes('duplicate column name') ||\n errorMessage.includes('UNIQUE constraint failed')) {\n console.log(`[Migration] Skipping (already exists): ${statement.substring(0, 50)}...`)\n continue\n }\n console.error(`[Migration] Error executing statement: ${statement.substring(0, 100)}...`)\n throw error\n }\n }\n }\n }\n\n /**\n * Split SQL into statements, handling CREATE TRIGGER properly\n */\n private splitSQLStatements(sql: string): string[] {\n const statements: string[] = []\n let current = ''\n let inTrigger = false\n\n const lines = sql.split('\\n')\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n // Skip comments and empty lines\n if (trimmed.startsWith('--') || trimmed.length === 0) {\n continue\n }\n\n // Check if we're entering a trigger\n if (trimmed.toUpperCase().includes('CREATE TRIGGER')) {\n inTrigger = true\n }\n\n current += line + '\\n'\n\n // Check if we're exiting a trigger\n if (inTrigger && trimmed.toUpperCase() === 'END;') {\n statements.push(current.trim())\n current = ''\n inTrigger = false\n }\n // Check for regular statement end (not in trigger)\n else if (!inTrigger && trimmed.endsWith(';')) {\n statements.push(current.trim())\n current = ''\n }\n }\n\n // Add any remaining statement\n if (current.trim()) {\n statements.push(current.trim())\n }\n\n return statements.filter(s => s.length > 0)\n }\n\n /**\n * Validate database schema\n */\n async validateSchema(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n // Basic table existence checks\n const requiredTables = [\n 'users', 'content', 'collections', 'media'\n ]\n\n for (const table of requiredTables) {\n try {\n await this.db.prepare(`SELECT COUNT(*) FROM ${table} LIMIT 1`).first()\n } catch (error) {\n issues.push(`Missing table: ${table}`)\n }\n }\n\n // Check for managed column in collections\n const hasManagedColumn = await this.checkColumnExists('collections', 'managed')\n if (!hasManagedColumn) {\n issues.push('Missing column: collections.managed')\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-DMPXZ6JJ.js.map b/packages/core/dist/chunk-DMPXZ6JJ.js.map deleted file mode 100644 index a7ac17d1b..000000000 --- a/packages/core/dist/chunk-DMPXZ6JJ.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/middleware/bootstrap.ts","../src/middleware/auth.ts","../src/middleware/metrics.ts","../src/middleware/csrf.ts","../src/middleware/rate-limit.ts","../src/middleware/security-headers.ts","../src/middleware/index.ts"],"names":["result","JWT_SECRET_FALLBACK","getCookie","setCookie"],"mappings":"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","file":"chunk-DMPXZ6JJ.js","sourcesContent":["import { Context, Next } from \"hono\";\nimport { syncCollections } from \"../services/collection-sync\";\nimport { syncAllFormCollections } from \"../services/form-collection-sync\";\nimport { MigrationService } from \"../services/migrations\";\nimport { PluginBootstrapService } from \"../services/plugin-bootstrap\";\nimport type { SonicJSConfig } from \"../app\";\n\ntype Bindings = {\n DB: D1Database;\n KV: KVNamespace;\n JWT_SECRET?: string;\n CORS_ORIGINS?: string;\n ENVIRONMENT?: string;\n};\n\n// Track if bootstrap has been run in this worker instance\nlet bootstrapComplete = false;\n\n/**\n * Verify security-critical environment configuration at startup.\n * Logs warnings in development, throws in production to prevent\n * insecure deployments from silently running.\n */\nexport function verifySecurityConfig(env: Bindings): void {\n const warnings: string[] = [];\n\n // Check JWT secret\n if (!env.JWT_SECRET) {\n warnings.push(\n \"JWT_SECRET is not set — using hardcoded fallback. Set via `wrangler secret put JWT_SECRET`\"\n );\n } else if (env.JWT_SECRET.includes(\"change-in-production\")) {\n warnings.push(\n \"JWT_SECRET contains the default value — tokens are forgeable. Generate a strong random secret\"\n );\n }\n\n // Check CORS origins\n if (!env.CORS_ORIGINS) {\n warnings.push(\n \"CORS_ORIGINS is not set — all cross-origin API requests will be rejected\"\n );\n }\n\n // Check environment designation\n if (!env.ENVIRONMENT) {\n warnings.push(\n \"ENVIRONMENT is not set — HSTS header will not be applied. Set to \\\"production\\\" or \\\"development\\\"\"\n );\n }\n\n if (warnings.length === 0) {\n return;\n }\n\n const isProduction = env.ENVIRONMENT === \"production\";\n\n for (const warning of warnings) {\n console.warn(`[SonicJS Security] ${warning}`);\n }\n\n if (isProduction) {\n // In production, a missing or default JWT_SECRET is a hard failure —\n // every token issued would be forgeable by anyone reading the source code.\n const hasCritical =\n !env.JWT_SECRET || env.JWT_SECRET.includes(\"change-in-production\");\n if (hasCritical) {\n throw new Error(\n \"[SonicJS Security] CRITICAL: Production deployment is missing a secure JWT_SECRET. \" +\n \"Set it via `wrangler secret put JWT_SECRET` before deploying.\"\n );\n }\n }\n}\n\n/**\n * Bootstrap middleware that ensures system initialization\n * Runs once per worker instance\n */\nexport function bootstrapMiddleware(config: SonicJSConfig = {}) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n // Skip if already bootstrapped in this worker instance\n if (bootstrapComplete) {\n return next();\n }\n\n // Skip bootstrap for static assets and health checks\n const path = c.req.path;\n if (\n path.startsWith(\"/images/\") ||\n path.startsWith(\"/assets/\") ||\n path === \"/health\" ||\n path.endsWith(\".js\") ||\n path.endsWith(\".css\") ||\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".ico\")\n ) {\n return next();\n }\n\n try {\n console.log(\"[Bootstrap] Starting system initialization...\");\n\n // 1. Run database migrations first\n console.log(\"[Bootstrap] Running database migrations...\");\n const migrationService = new MigrationService(c.env.DB);\n await migrationService.runPendingMigrations();\n\n // 2. Sync collection configurations\n console.log(\"[Bootstrap] Syncing collection configurations...\");\n try {\n await syncCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing collections:\", error);\n // Continue bootstrap even if collection sync fails\n }\n\n // 2b. Sync form-derived shadow collections\n console.log(\"[Bootstrap] Syncing form collections...\");\n try {\n await syncAllFormCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing form collections:\", error);\n }\n\n // 3. Bootstrap core plugins (unless disableAll is set)\n if (!config.plugins?.disableAll) {\n console.log(\"[Bootstrap] Bootstrapping core plugins...\");\n const bootstrapService = new PluginBootstrapService(c.env.DB);\n\n // Check if bootstrap is needed\n const needsBootstrap = await bootstrapService.isBootstrapNeeded();\n if (needsBootstrap) {\n await bootstrapService.bootstrapCorePlugins();\n }\n } else {\n console.log(\"[Bootstrap] Plugin bootstrap skipped (disableAll is true)\");\n }\n\n // Mark bootstrap as complete for this worker instance\n bootstrapComplete = true;\n console.log(\"[Bootstrap] System initialization completed\");\n } catch (error) {\n console.error(\"[Bootstrap] Error during system initialization:\", error);\n // Don't prevent the app from starting, but log the error\n }\n\n // 4. Verify security configuration (outside try/catch so critical\n // errors in production propagate and prevent insecure deployments)\n verifySecurityConfig(c.env as Bindings);\n\n return next();\n };\n}\n\n/**\n * Reset bootstrap flag (useful for testing)\n */\nexport function resetBootstrap() {\n bootstrapComplete = false;\n}\n","import { sign, verify } from 'hono/jwt'\nimport { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\ntype JWTPayload = {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n}\n\n// Fallback JWT secret for local development only (no wrangler secret set)\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// Default JWT TTL: 30 days. Can be overridden via JWT_EXPIRES_IN env var.\nconst DEFAULT_JWT_EXPIRES_IN_SECONDS = 60 * 60 * 24 * 30\n\n/**\n * Parse a TTL string like \"30d\", \"12h\", \"3600s\", or a bare number-of-seconds\n * into a seconds value. Returns null if the input is missing/unparseable.\n */\nfunction parseDuration(input: string | number | undefined | null): number | null {\n if (input === undefined || input === null || input === '') return null\n if (typeof input === 'number' && Number.isFinite(input) && input > 0) {\n return Math.floor(input)\n }\n const raw = String(input).trim()\n if (/^\\d+$/.test(raw)) {\n const n = parseInt(raw, 10)\n return n > 0 ? n : null\n }\n const match = raw.match(/^(\\d+)\\s*(s|sec|secs|seconds|m|min|mins|minutes|h|hr|hrs|hours|d|day|days)$/i)\n if (!match) return null\n const value = parseInt(match[1]!, 10)\n const unit = match[2]!.toLowerCase()\n if (unit.startsWith('s')) return value\n if (unit.startsWith('m')) return value * 60\n if (unit.startsWith('h')) return value * 60 * 60\n if (unit.startsWith('d')) return value * 60 * 60 * 24\n return null\n}\n\n/**\n * Resolve the JWT expiry in seconds from the environment.\n * Honors `JWT_EXPIRES_IN` (seconds or \"30d\"/\"12h\"/\"3600s\") with a 30-day default.\n */\nexport function getJwtExpirySeconds(env?: Record | null): number {\n const configured = parseDuration(env?.JWT_EXPIRES_IN)\n return configured ?? DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the JWT expiry in seconds. Precedence: `JWT_EXPIRES_IN` env var\n * (authoritative ceiling) → `settings.security.jwtExpiresIn` DB value\n * (admin-configurable) → 30-day default.\n *\n * The env var wins so operators can cap runtime overrides — admins can adjust\n * the TTL from /admin/settings/security, but an env var, if set, always wins.\n * DB failures fall back to env/default so auth never breaks if the settings\n * table is unreachable.\n */\nexport async function getJwtExpirySecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const envParsed = parseDuration(env?.JWT_EXPIRES_IN)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtExpiresIn'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* value may already be a bare string */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtExpiresIn from settings, falling back to default:', err)\n }\n }\n return DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the refresh grace window (seconds) for `/auth/refresh`. Precedence:\n * `JWT_REFRESH_GRACE_SECONDS` env var → `settings.security.jwtRefreshGraceSeconds`\n * DB value → 7-day default.\n */\nexport async function getJwtRefreshGraceSecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const DEFAULT_GRACE = 60 * 60 * 24 * 7\n const envParsed = parseDuration(env?.JWT_REFRESH_GRACE_SECONDS)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtRefreshGraceSeconds'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* may be bare */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtRefreshGraceSeconds from settings:', err)\n }\n }\n return DEFAULT_GRACE\n}\n\n/**\n * Decode a JWT payload without verifying the signature. Returns null on any\n * parsing failure. Callers MUST independently verify the signature before\n * trusting this value — used from the grace-window refresh path where the\n * signature is verified explicitly via `verifyHs256Signature`.\n */\nfunction decodeJwtPayload(token: string): JWTPayload | null {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return null\n const b64 = parts[1]!.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const json = atob(padded)\n const obj = JSON.parse(json)\n if (!obj || typeof obj.exp !== 'number') return null\n return obj as JWTPayload\n } catch {\n return null\n }\n}\n\nfunction base64UrlToBytes(b64url: string): Uint8Array {\n const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const bin = atob(padded)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return bytes\n}\n\n/**\n * Verify a JWT's HS256 signature using Web Crypto, independent of hono/jwt.\n * Returns true iff the signature matches the header.payload portion.\n */\nasync function verifyHs256Signature(token: string, secret: string): Promise {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return false\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n )\n const signature = base64UrlToBytes(parts[2]!)\n const message = encoder.encode(`${parts[0]}.${parts[1]}`)\n return await crypto.subtle.verify('HMAC', key, signature, message)\n } catch {\n return false\n }\n}\n\nexport class AuthManager {\n static async generateToken(\n userId: string,\n email: string,\n role: string,\n secret?: string,\n expiresInSeconds?: number\n ): Promise {\n const ttl = expiresInSeconds && expiresInSeconds > 0\n ? Math.floor(expiresInSeconds)\n : DEFAULT_JWT_EXPIRES_IN_SECONDS\n const now = Math.floor(Date.now() / 1000)\n const payload: JWTPayload = {\n userId,\n email,\n role,\n exp: now + ttl,\n iat: now\n }\n\n return await sign(payload, secret || JWT_SECRET_FALLBACK, 'HS256')\n }\n\n /**\n * Verify a token's signature and expiration.\n *\n * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the\n * `secret` argument. If omitted, this falls back to a development-only\n * placeholder secret — tokens signed with the real `JWT_SECRET` will then\n * silently fail verification. From inside a Hono handler prefer\n * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction\n * and pulls the secret from `c.env` for you.\n *\n * If `graceSeconds` > 0, tokens whose `exp` is within the grace window\n * (i.e. expired by no more than `graceSeconds`) are still returned. This\n * supports a sliding-session refresh endpoint that accepts recently-expired\n * tokens. Signature failures always return null.\n */\n static async verifyToken(\n token: string,\n secret?: string,\n graceSeconds: number = 0\n ): Promise {\n const effectiveSecret = secret || JWT_SECRET_FALLBACK\n try {\n let payload: JWTPayload | null = null\n try {\n payload = await verify(token, effectiveSecret, 'HS256') as JWTPayload\n } catch (verifyError: any) {\n // hono/jwt checks `exp` before signature, so a bad-signature token\n // that happens to be expired will throw JwtTokenExpired here. For\n // the grace window, we still require a valid HS256 signature before\n // accepting the payload.\n const name = verifyError?.name || ''\n const message = String(verifyError?.message || '')\n const isExpired = name === 'JwtTokenExpired' || message.includes('expired')\n if (!isExpired || graceSeconds <= 0) {\n throw verifyError\n }\n const signatureValid = await verifyHs256Signature(token, effectiveSecret)\n if (!signatureValid) return null\n const decoded = decodeJwtPayload(token)\n if (!decoded) return null\n payload = decoded\n }\n\n if (!payload) return null\n\n const now = Math.floor(Date.now() / 1000)\n if (payload.exp < now - Math.max(0, Math.floor(graceSeconds))) {\n return null\n }\n\n return payload\n } catch (error) {\n console.error('Token verification failed:', error)\n return null\n }\n }\n\n /**\n * Verify the JWT on an incoming Hono request using the `JWT_SECRET`\n * binding from `c.env`. Reads the token from the `Authorization: Bearer …`\n * header first, then falls back to the `auth_token` cookie. Returns the\n * decoded payload, or null when the token is missing, malformed, expired,\n * or signed with a different secret.\n *\n * Use this from custom Hono routes mounted alongside SonicJS — it\n * resolves the secret the same way `requireAuth()` does, without forcing\n * the caller to plumb it through manually.\n */\n static async verifyAuthRequest(c: Context): Promise {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n if (!token) return null\n const secret = (c.env as any)?.JWT_SECRET\n return await AuthManager.verifyToken(token, secret)\n }\n\n static async hashPassword(password: string): Promise {\n const iterations = 100000\n const salt = new Uint8Array(16)\n crypto.getRandomValues(salt)\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const saltHex = Array.from(salt).map(b => b.toString(16).padStart(2, '0')).join('')\n const hashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n return `pbkdf2:${iterations}:${saltHex}:${hashHex}`\n }\n\n static async hashPasswordLegacy(password: string): Promise {\n const encoder = new TextEncoder()\n const data = encoder.encode(password + 'salt-change-in-production')\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n static async verifyPassword(password: string, storedHash: string): Promise {\n if (storedHash.startsWith('pbkdf2:')) {\n // PBKDF2 format: pbkdf2:::\n const parts = storedHash.split(':')\n if (parts.length !== 4) return false\n\n const iterationsStr = parts[1]!\n const saltHex = parts[2]!\n const expectedHashHex = parts[3]!\n const iterations = parseInt(iterationsStr, 10)\n\n const saltBytes = saltHex.match(/.{2}/g)\n if (!saltBytes) return false\n const salt = new Uint8Array(saltBytes.map(byte => parseInt(byte, 16)))\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const actualHashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n // Constant-time comparison\n if (actualHashHex.length !== expectedHashHex.length) return false\n let result = 0\n for (let i = 0; i < actualHashHex.length; i++) {\n result |= actualHashHex.charCodeAt(i) ^ expectedHashHex.charCodeAt(i)\n }\n return result === 0\n }\n\n // Legacy SHA-256 format (no colons in hash)\n const legacyHash = await this.hashPasswordLegacy(password)\n // Constant-time comparison for legacy too\n if (legacyHash.length !== storedHash.length) return false\n let result = 0\n for (let i = 0; i < legacyHash.length; i++) {\n result |= legacyHash.charCodeAt(i) ^ storedHash.charCodeAt(i)\n }\n return result === 0\n }\n\n static isLegacyHash(storedHash: string): boolean {\n return !storedHash.startsWith('pbkdf2:')\n }\n\n /**\n * Set authentication cookie - useful for plugins implementing alternative auth methods\n * @param c - Hono context\n * @param token - JWT token to set in cookie\n * @param options - Optional cookie configuration\n */\n static setAuthCookie(c: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void {\n setCookie(c, 'auth_token', token, {\n httpOnly: options?.httpOnly ?? true,\n secure: options?.secure ?? true,\n sameSite: options?.sameSite ?? 'Strict',\n maxAge: options?.maxAge ?? getJwtExpirySeconds((c as any)?.env)\n })\n }\n}\n\n// Middleware to require authentication\nexport const requireAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n // Try to get token from Authorization header\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n\n // If no header token, try cookie\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n\n if (!token) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n // Try to get cached token verification from KV\n const kv = c.env?.KV\n let payload: JWTPayload | null = null\n\n if (kv) {\n const cacheKey = `auth:${token.substring(0, 20)}` // Use token prefix as key\n const cached = await kv.get(cacheKey, 'json')\n if (cached) {\n payload = cached as JWTPayload\n }\n }\n\n // If not cached, verify token\n if (!payload) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n payload = await AuthManager.verifyToken(token, jwtSecret)\n\n // Cache the verified payload for 5 minutes\n if (payload && kv) {\n const cacheKey = `auth:${token.substring(0, 20)}`\n await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 })\n }\n }\n\n if (!payload) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Your session has expired, please login again')\n }\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Add user info to context\n c.set('user', payload)\n\n return await next()\n } catch (error) {\n console.error('Auth middleware error:', error)\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Authentication failed, please login again')\n }\n return c.json({ error: 'Authentication failed' }, 401)\n }\n }\n}\n\n// Middleware to require specific role\nexport const requireRole = (requiredRole: string | string[]) => {\n return async (c: Context, next: Next) => {\n const user = c.get('user') as JWTPayload\n \n if (!user) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n \n const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]\n \n if (!roles.includes(user.role)) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=You do not have permission to access this area')\n }\n return c.json({ error: 'Insufficient permissions' }, 403)\n }\n \n return await next()\n }\n}\n\n// Optional auth middleware (doesn't block if no token)\nexport const optionalAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n \n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n \n if (token) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n const payload = await AuthManager.verifyToken(token, jwtSecret)\n if (payload) {\n c.set('user', payload)\n }\n }\n \n return await next()\n } catch (error) {\n // Don't block on auth errors in optional auth\n console.error('Optional auth error:', error)\n return await next()\n }\n }\n}\n","import { MiddlewareHandler } from 'hono'\nimport { metricsTracker } from '../utils/metrics'\n\n/**\n * Middleware to track all HTTP requests for real-time analytics\n * Excludes the metrics endpoint itself to avoid inflating the count\n */\nexport const metricsMiddleware = (): MiddlewareHandler => {\n return async (c, next) => {\n const path = new URL(c.req.url).pathname\n\n // Don't track the metrics endpoint itself to avoid self-inflating counts\n if (path !== '/admin/dashboard/api/metrics') {\n metricsTracker.recordRequest()\n }\n\n // Continue with the request\n await next()\n }\n}\n","/**\n * CSRF Protection Middleware — Signed Double-Submit Cookie\n *\n * Stateless CSRF protection for Cloudflare Workers (no session store needed).\n * Token format: `.` where HMAC-SHA256 is keyed with JWT_SECRET.\n *\n * Flow:\n * GET — ensureCsrfCookie(): reuse existing valid cookie or set a new one\n * POST/PUT/DELETE/PATCH — validate X-CSRF-Token header === csrf_token cookie, HMAC valid\n *\n * Exempt:\n * - Safe methods (GET, HEAD, OPTIONS)\n * - Auth routes that create sessions (/auth/login*, /auth/register*, etc.)\n * - Public form submissions (/forms/*, /api/forms/*) — NOT /admin/forms/*\n * - Requests with no auth_token cookie (Bearer-only or API-key-only)\n */\n\nimport type { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\n// Fallback secret — mirrors auth.ts behavior for local dev without wrangler secret\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Convert ArrayBuffer to URL-safe base64 (no padding). */\nexport function arrayBufferToBase64Url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!)\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Import a string key for HMAC-SHA256. */\nasync function getHmacKey(secret: string): Promise {\n const encoder = new TextEncoder()\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify']\n )\n}\n\n// ============================================================================\n// Token Generation & Validation\n// ============================================================================\n\n/**\n * Generate a signed CSRF token: `.`\n * - nonce = 32 random bytes, base64url-encoded\n * - signature = HMAC-SHA256(nonce, secret), base64url-encoded\n */\nexport async function generateCsrfToken(secret: string): Promise {\n const nonceBytes = new Uint8Array(32)\n crypto.getRandomValues(nonceBytes)\n const nonce = arrayBufferToBase64Url(nonceBytes.buffer)\n\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(nonce))\n const signature = arrayBufferToBase64Url(signatureBuffer)\n\n return `${nonce}.${signature}`\n}\n\n/**\n * Validate a signed CSRF token.\n *\n * Checks that the token has the correct `.` format and that\n * the HMAC signature is valid for the given secret. Uses crypto.subtle.verify\n * which provides constant-time comparison.\n *\n * NOTE: No expiry check here — by design. The security property of signed\n * double-submit comes from the unpredictability of the nonce + the\n * secret-bound HMAC, not from time-bounding. The cookie's maxAge (86400s)\n * handles expiry at the browser level.\n */\nexport async function validateCsrfToken(token: string, secret: string): Promise {\n if (!token || typeof token !== 'string') return false\n\n const dotIndex = token.indexOf('.')\n if (dotIndex === -1) return false\n\n const nonce = token.substring(0, dotIndex)\n const signature = token.substring(dotIndex + 1)\n\n if (!nonce || !signature) return false\n\n try {\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n\n // Decode the signature from base64url\n const sigPadded = signature.replace(/-/g, '+').replace(/_/g, '/')\n const sigBinary = atob(sigPadded)\n const sigBytes = new Uint8Array(sigBinary.length)\n for (let i = 0; i < sigBinary.length; i++) {\n sigBytes[i] = sigBinary.charCodeAt(i)\n }\n\n // crypto.subtle.verify is constant-time\n return await crypto.subtle.verify('HMAC', key, sigBytes.buffer, encoder.encode(nonce))\n } catch {\n return false\n }\n}\n\n// ============================================================================\n// Default Exempt Paths\n// ============================================================================\n\nconst DEFAULT_EXEMPT_PATHS = [\n '/auth/login',\n '/auth/register',\n '/auth/seed-admin',\n '/auth/accept-invitation',\n '/auth/reset-password',\n '/auth/request-password-reset',\n '/auth/otp',\n '/auth/magic-link',\n '/auth/verify',\n '/api/stripe/webhook',\n '/api/events',\n]\n\n/**\n * Check whether a request path is exempt from CSRF validation.\n * - Exact match or startsWith for auth routes (e.g. /auth/login/form)\n * - /forms/* and /api/forms/* are exempt (public submissions)\n * - /api/search* is exempt (read-only POST for complex query params)\n * - /admin/forms/* is NOT exempt\n */\nfunction isExemptPath(path: string, extraExemptPaths: string[] = []): boolean {\n // Public form routes — NOT /admin/forms/*\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/') || path === '/forms' || path === '/api/forms') {\n return true\n }\n\n // Search API — read-only POST (includes /api/search/click, /api/search/facet-click)\n if (path.startsWith('/api/search')) {\n return true\n }\n\n const allExempt = [...DEFAULT_EXEMPT_PATHS, ...extraExemptPaths]\n for (const exempt of allExempt) {\n if (path === exempt || path.startsWith(exempt + '/')) {\n return true\n }\n }\n\n return false\n}\n\n// ============================================================================\n// Middleware\n// ============================================================================\n\nexport interface CsrfOptions {\n /** Additional paths to exempt from CSRF validation. */\n exemptPaths?: string[]\n}\n\n/**\n * CSRF protection middleware (Signed Double-Submit Cookie).\n *\n * - GET/HEAD/OPTIONS: ensure a valid csrf_token cookie exists\n * - POST/PUT/DELETE/PATCH: validate X-CSRF-Token header matches cookie, HMAC valid\n * - Exempt: auth routes, public /forms/*, Bearer-only, API-key-only\n */\nexport function csrfProtection(options: CsrfOptions = {}) {\n return async (c: Context, next: Next): Promise => {\n const method = c.req.method.toUpperCase()\n const path = new URL(c.req.url).pathname\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n\n // Warn if using fallback secret in production\n if (c.env?.ENVIRONMENT === 'production' && !c.env?.JWT_SECRET) {\n console.warn(\n '[CSRF] WARNING: JWT_SECRET is not set in production. ' +\n 'CSRF tokens are signed with the fallback key, which is insecure.'\n )\n }\n\n // Safe methods — just ensure cookie, then pass through\n if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS') {\n await ensureCsrfCookie(c, secret)\n await next()\n return\n }\n\n // Exempt paths — pass through without validation\n if (isExemptPath(path, options.exemptPaths)) {\n await next()\n return\n }\n\n // Bearer-only or API-key-only requests (no auth_token cookie) — exempt\n const authCookie = getCookie(c, 'auth_token')\n if (!authCookie) {\n await next()\n return\n }\n\n // Requests with an Authorization header use token-based auth — the cookie\n // is incidental and CSRF protection is unnecessary (the attacker cannot\n // forge the Authorization header from a cross-origin page).\n const authHeader = c.req.header('Authorization')\n if (authHeader) {\n await next()\n return\n }\n\n // State-changing request with cookie auth — validate CSRF\n const cookieToken = getCookie(c, 'csrf_token')\n let headerToken = c.req.header('X-CSRF-Token')\n\n // Fallback: check _csrf field in form-encoded body (regular HTML form submissions)\n if (!headerToken) {\n const contentType = c.req.header('Content-Type') || ''\n if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n try {\n const body = await c.req.parseBody()\n headerToken = body['_csrf'] as string | undefined\n } catch {\n // Body not parseable — leave headerToken undefined\n }\n }\n }\n\n if (!cookieToken || !headerToken) {\n return csrfError(c, 'CSRF token missing')\n }\n\n if (cookieToken !== headerToken) {\n return csrfError(c, 'CSRF token mismatch')\n }\n\n const isValid = await validateCsrfToken(cookieToken, secret)\n if (!isValid) {\n return csrfError(c, 'CSRF token invalid')\n }\n\n await next()\n }\n}\n\n/**\n * Ensure a valid CSRF cookie exists. Check-then-reuse: if the existing cookie\n * has a valid HMAC signature, reuse it (no new Set-Cookie header). Only\n * generate a fresh token when the cookie is missing or has an invalid signature.\n */\nasync function ensureCsrfCookie(c: Context, secret: string): Promise {\n const existing = getCookie(c, 'csrf_token')\n\n if (existing) {\n const isValid = await validateCsrfToken(existing, secret)\n if (isValid) {\n // Reuse existing valid token — no Set-Cookie needed\n c.set('csrfToken', existing)\n return\n }\n }\n\n // Generate fresh token\n const token = await generateCsrfToken(secret)\n c.set('csrfToken', token)\n\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n setCookie(c, 'csrf_token', token, {\n httpOnly: false, // JS must read this cookie\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: 86400, // 24 hours — browser-side expiry\n })\n}\n\n/** Return a 403 CSRF error — HTML for browser requests, JSON for API. */\nfunction csrfError(c: Context, message: string): Response {\n const accept = c.req.header('Accept') || ''\n if (accept.includes('text/html')) {\n return c.html(\n `403 Forbidden` +\n `

403 Forbidden

${message}

`,\n 403\n )\n }\n return c.json({ error: message, status: 403 }, 403)\n}\n","import { Context, Next } from 'hono'\n\ninterface RateLimitOptions {\n max: number\n windowMs: number\n keyPrefix: string\n}\n\ninterface RateLimitEntry {\n count: number\n resetAt: number\n}\n\n/**\n * KV-based sliding window rate limiter middleware.\n * Gracefully skips if CACHE_KV binding is not available.\n */\nexport function rateLimit(options: RateLimitOptions) {\n const { max, windowMs, keyPrefix } = options\n\n return async (c: Context, next: Next) => {\n const kv = (c.env as any)?.CACHE_KV\n if (!kv) {\n // No KV binding available — skip rate limiting\n return await next()\n }\n\n const ip = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const key = `ratelimit:${keyPrefix}:${ip}`\n\n try {\n const now = Date.now()\n const stored = await kv.get(key, 'json') as RateLimitEntry | null\n\n let entry: RateLimitEntry\n if (stored && stored.resetAt > now) {\n entry = stored\n } else {\n entry = { count: 0, resetAt: now + windowMs }\n }\n\n entry.count++\n\n // Calculate TTL in seconds (KV expiration)\n const ttlSeconds = Math.ceil((entry.resetAt - now) / 1000)\n\n if (entry.count > max) {\n // Store the updated count even when rejecting\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n const retryAfter = Math.ceil((entry.resetAt - now) / 1000)\n c.header('Retry-After', String(retryAfter))\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', '0')\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n return c.json({ error: 'Too many requests. Please try again later.' }, 429)\n }\n\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', String(max - entry.count))\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n\n return await next()\n } catch (error) {\n // Rate limiting should never break the app\n console.error('Rate limiter error (non-fatal):', error)\n return await next()\n }\n }\n}\n","import { Context, Next } from 'hono'\n\n/**\n * Security headers middleware.\n * Sets standard security headers on every response.\n * Skips HSTS in development to avoid local dev issues.\n */\nexport const securityHeadersMiddleware = () => {\n return async (c: Context, next: Next) => {\n await next()\n\n c.header('X-Content-Type-Options', 'nosniff')\n c.header('X-Frame-Options', 'SAMEORIGIN')\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin')\n c.header('Permissions-Policy', 'camera=(), microphone=(), geolocation=()')\n\n // Only set HSTS in non-development environments\n const environment = (c.env as any)?.ENVIRONMENT\n if (environment !== 'development') {\n c.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains')\n }\n }\n}\n","/**\n * Middleware Module Exports\n *\n * Request processing middleware for SonicJS\n *\n * Note: Most middleware is currently in the monolith and will be migrated later.\n * For now, we only export the bootstrap middleware which is used for system initialization.\n */\n\n// Bootstrap middleware\nexport { bootstrapMiddleware, verifySecurityConfig } from './bootstrap'\n\n// Auth middleware\nexport {\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n getJwtExpirySeconds,\n getJwtExpirySecondsFromDb,\n getJwtRefreshGraceSecondsFromDb,\n} from './auth'\n\n// Metrics middleware\nexport { metricsMiddleware } from './metrics'\n\n// CSRF protection middleware\nexport { csrfProtection, generateCsrfToken, validateCsrfToken } from './csrf'\n\n// Rate limiting middleware\nexport { rateLimit } from './rate-limit'\n\n// Re-export types and functions that are referenced but implemented in monolith\n// These are placeholder exports to maintain API compatibility\nexport type Permission = string\nexport type UserPermissions = {\n userId: string\n permissions: Permission[]\n}\n\n// Middleware stubs - these return pass-through middleware that call next()\nexport const loggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const detailedLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const securityLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const performanceLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const cacheHeaders: any = () => async (_c: any, next: any) => await next()\nexport const compressionMiddleware: any = async (_c: any, next: any) => await next()\nexport { securityHeadersMiddleware as securityHeaders } from './security-headers'\n\n// Other stubs\nexport const PermissionManager: any = {}\nexport const requirePermission: any = () => async (_c: any, next: any) => await next()\nexport const requireAnyPermission: any = () => async (_c: any, next: any) => await next()\nexport const logActivity: any = () => {}\nexport const requireActivePlugin: any = () => async (_c: any, next: any) => await next()\nexport const requireActivePlugins: any = () => async (_c: any, next: any) => await next()\nexport const getActivePlugins: any = () => []\nexport const isPluginActive: any = () => false\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-QFWHAFEO.js b/packages/core/dist/chunk-GQEIPW3L.js similarity index 99% rename from packages/core/dist/chunk-QFWHAFEO.js rename to packages/core/dist/chunk-GQEIPW3L.js index 7fc19e6e9..a60859459 100644 --- a/packages/core/dist/chunk-QFWHAFEO.js +++ b/packages/core/dist/chunk-GQEIPW3L.js @@ -1839,5 +1839,5 @@ function buildRouteList(app) { } export { CACHE_CONFIGS, CATEGORY_INFO, CacheService, Logger, SettingsService, TelemetryService, apiTokens, buildRouteList, collections, content, contentVersions, createInstallationIdentity, getAppInstance, getCacheService, getLogger, getTelemetryService, initLogger, initTelemetry, insertCollectionSchema, insertContentSchema, insertLogConfigSchema, insertMediaSchema, insertPluginActivityLogSchema, insertPluginAssetSchema, insertPluginHookSchema, insertPluginRouteSchema, insertPluginSchema, insertSystemLogSchema, insertUserSchema, insertWorkflowHistorySchema, logConfig, media, pluginActivityLog, pluginAssets, pluginHooks, pluginRoutes, plugins, schema_exports, selectCollectionSchema, selectContentSchema, selectLogConfigSchema, selectMediaSchema, selectPluginActivityLogSchema, selectPluginAssetSchema, selectPluginHookSchema, selectPluginRouteSchema, selectPluginSchema, selectSystemLogSchema, selectUserSchema, selectWorkflowHistorySchema, setAppInstance, systemLogs, users, workflowHistory }; -//# sourceMappingURL=chunk-QFWHAFEO.js.map -//# sourceMappingURL=chunk-QFWHAFEO.js.map \ No newline at end of file +//# sourceMappingURL=chunk-GQEIPW3L.js.map +//# sourceMappingURL=chunk-GQEIPW3L.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-GQEIPW3L.js.map b/packages/core/dist/chunk-GQEIPW3L.js.map new file mode 100644 index 000000000..e36280fc8 --- /dev/null +++ b/packages/core/dist/chunk-GQEIPW3L.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/db/schema.ts","../../../../../node_modules/src/constants.ts","../../../../../node_modules/src/utils.ts","../../../../../node_modules/src/column.ts","../../../../../node_modules/src/schema.ts","../src/services/logger.ts","../src/services/cache.ts","../src/services/settings.ts","../src/services/telemetry-service.ts","../src/services/route-metadata.ts"],"names":["zod","z","integer","columns"],"mappings":"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","file":"chunk-GQEIPW3L.js","sourcesContent":["import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod';\n\n// Users table for authentication and user management\nexport const users = sqliteTable('users', {\n id: text('id').primaryKey(),\n email: text('email').notNull().unique(),\n username: text('username').notNull().unique(),\n firstName: text('first_name').notNull(),\n lastName: text('last_name').notNull(),\n passwordHash: text('password_hash'), // Hashed password, nullable for OAuth users\n role: text('role').notNull().default('viewer'), // 'admin', 'editor', 'author', 'viewer'\n avatar: text('avatar'),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n lastLoginAt: integer('last_login_at'),\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Content collections - dynamic schema definitions\nexport const collections = sqliteTable('collections', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n schema: text('schema', { mode: 'json' }).notNull(), // JSON schema definition\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false), // Config-managed collections cannot be edited in UI\n sourceType: text('source_type').default('user'), // 'user' (normal), 'form' (form-derived)\n sourceId: text('source_id'), // stores the form ID for form-derived collections\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content items - actual content data\nexport const content = sqliteTable('content', {\n id: text('id').primaryKey(),\n collectionId: text('collection_id').notNull().references(() => collections.id),\n slug: text('slug').notNull(),\n title: text('title').notNull(),\n data: text('data', { mode: 'json' }).notNull(), // JSON content data\n status: text('status').notNull().default('draft'), // 'draft', 'published', 'archived'\n publishedAt: integer('published_at', { mode: 'timestamp' }),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content versions for versioning system\nexport const contentVersions = sqliteTable('content_versions', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n version: integer('version').notNull(),\n data: text('data', { mode: 'json' }).notNull(),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Media/Files table\nexport const media = sqliteTable('media', {\n id: text('id').primaryKey(),\n filename: text('filename').notNull(),\n originalName: text('original_name').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n width: integer('width'),\n height: integer('height'),\n folder: text('folder').notNull().default('uploads'),\n r2Key: text('r2_key').notNull(), // R2 storage key\n publicUrl: text('public_url').notNull(), // CDN URL\n thumbnailUrl: text('thumbnail_url'),\n alt: text('alt'),\n caption: text('caption'),\n tags: text('tags', { mode: 'json' }), // JSON array of tags\n uploadedBy: text('uploaded_by').notNull().references(() => users.id),\n uploadedAt: integer('uploaded_at').notNull(),\n updatedAt: integer('updated_at'),\n publishedAt: integer('published_at'),\n scheduledAt: integer('scheduled_at'),\n archivedAt: integer('archived_at'),\n deletedAt: integer('deleted_at'),\n});\n\n// API tokens for programmatic access\nexport const apiTokens = sqliteTable('api_tokens', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n token: text('token').notNull().unique(),\n userId: text('user_id').notNull().references(() => users.id),\n permissions: text('permissions', { mode: 'json' }).notNull(), // Array of permissions\n expiresAt: integer('expires_at', { mode: 'timestamp' }),\n lastUsedAt: integer('last_used_at', { mode: 'timestamp' }),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n\n// Workflow history for content workflow tracking\nexport const workflowHistory = sqliteTable('workflow_history', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n action: text('action').notNull(),\n fromStatus: text('from_status').notNull(),\n toStatus: text('to_status').notNull(),\n userId: text('user_id').notNull().references(() => users.id),\n comment: text('comment'),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Plugin system tables\nexport const plugins = sqliteTable('plugins', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n version: text('version').notNull(),\n author: text('author').notNull(),\n category: text('category').notNull(),\n icon: text('icon'),\n status: text('status').notNull().default('inactive'), // 'active', 'inactive', 'error'\n isCore: integer('is_core', { mode: 'boolean' }).notNull().default(false),\n settings: text('settings', { mode: 'json' }),\n permissions: text('permissions', { mode: 'json' }),\n dependencies: text('dependencies', { mode: 'json' }),\n downloadCount: integer('download_count').notNull().default(0),\n rating: integer('rating').notNull().default(0),\n installedAt: integer('installed_at').notNull(),\n activatedAt: integer('activated_at'),\n lastUpdated: integer('last_updated').notNull(),\n errorMessage: text('error_message'),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n updatedAt: integer('updated_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginHooks = sqliteTable('plugin_hooks', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n hookName: text('hook_name').notNull(),\n handlerName: text('handler_name').notNull(),\n priority: integer('priority').notNull().default(10),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginRoutes = sqliteTable('plugin_routes', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n path: text('path').notNull(),\n method: text('method').notNull(),\n handlerName: text('handler_name').notNull(),\n middleware: text('middleware', { mode: 'json' }),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginAssets = sqliteTable('plugin_assets', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n assetType: text('asset_type').notNull(), // 'css', 'js', 'image', 'font'\n assetPath: text('asset_path').notNull(),\n loadOrder: integer('load_order').notNull().default(100),\n loadLocation: text('load_location').notNull().default('footer'), // 'header', 'footer'\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginActivityLog = sqliteTable('plugin_activity_log', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n action: text('action').notNull(),\n userId: text('user_id'),\n details: text('details', { mode: 'json' }),\n timestamp: integer('timestamp').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\n// Zod schemas for validation\nexport const insertUserSchema = createInsertSchema(users, {\n email: (schema: any) => schema.email(),\n firstName: (schema: any) => schema.min(1),\n lastName: (schema: any) => schema.min(1),\n username: (schema: any) => schema.min(3),\n});\n\nexport const selectUserSchema = createSelectSchema(users);\n\nexport const insertCollectionSchema = createInsertSchema(collections, {\n name: (schema: any) => schema.min(1).regex(/^[a-z0-9_]+$/, 'Collection name must be lowercase with underscores'),\n displayName: (schema: any) => schema.min(1),\n});\n\nexport const selectCollectionSchema = createSelectSchema(collections);\n\nexport const insertContentSchema = createInsertSchema(content, {\n slug: (schema: any) => schema.min(1).regex(/^[a-zA-Z0-9_-]+$/, 'Slug must contain only letters, numbers, underscores, and hyphens'),\n title: (schema: any) => schema.min(1),\n status: (schema: any) => schema,\n});\n\nexport const selectContentSchema = createSelectSchema(content);\n\nexport const insertMediaSchema = createInsertSchema(media, {\n filename: (schema: any) => schema.min(1),\n originalName: (schema: any) => schema.min(1),\n mimeType: (schema: any) => schema.min(1),\n size: (schema: any) => schema.positive(),\n r2Key: (schema: any) => schema.min(1),\n publicUrl: (schema: any) => schema.url(),\n folder: (schema: any) => schema.min(1),\n});\n\nexport const selectMediaSchema = createSelectSchema(media);\n\n\nexport const insertWorkflowHistorySchema = createInsertSchema(workflowHistory, {\n action: (schema: any) => schema.min(1),\n fromStatus: (schema: any) => schema.min(1),\n toStatus: (schema: any) => schema.min(1),\n});\n\nexport const selectWorkflowHistorySchema = createSelectSchema(workflowHistory);\n\nexport const insertPluginSchema = createInsertSchema(plugins, {\n name: (schema: any) => schema.min(1),\n displayName: (schema: any) => schema.min(1),\n version: (schema: any) => schema.min(1),\n author: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginSchema = createSelectSchema(plugins);\n\nexport const insertPluginHookSchema = createInsertSchema(pluginHooks, {\n hookName: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginHookSchema = createSelectSchema(pluginHooks);\n\nexport const insertPluginRouteSchema = createInsertSchema(pluginRoutes, {\n path: (schema: any) => schema.min(1),\n method: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginRouteSchema = createSelectSchema(pluginRoutes);\n\nexport const insertPluginAssetSchema = createInsertSchema(pluginAssets, {\n assetType: (schema: any) => schema.min(1),\n assetPath: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginAssetSchema = createSelectSchema(pluginAssets);\n\nexport const insertPluginActivityLogSchema = createInsertSchema(pluginActivityLog, {\n action: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginActivityLogSchema = createSelectSchema(pluginActivityLog);\n\n// System logs table for comprehensive logging\nexport const systemLogs = sqliteTable('system_logs', {\n id: text('id').primaryKey(),\n level: text('level').notNull(), // 'debug', 'info', 'warn', 'error', 'fatal'\n category: text('category').notNull(), // 'auth', 'api', 'workflow', 'plugin', 'media', 'system', etc.\n message: text('message').notNull(),\n data: text('data', { mode: 'json' }), // Additional structured data\n userId: text('user_id').references(() => users.id),\n sessionId: text('session_id'),\n requestId: text('request_id'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n method: text('method'), // HTTP method for API logs\n url: text('url'), // Request URL for API logs\n statusCode: integer('status_code'), // HTTP status code for API logs\n duration: integer('duration'), // Request duration in milliseconds\n stackTrace: text('stack_trace'), // Error stack trace for error logs\n tags: text('tags', { mode: 'json' }), // Array of tags for categorization\n source: text('source'), // Source component/module that generated the log\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Log configuration table\nexport const logConfig = sqliteTable('log_config', {\n id: text('id').primaryKey(),\n category: text('category').notNull().unique(),\n enabled: integer('enabled', { mode: 'boolean' }).notNull().default(true),\n level: text('level').notNull().default('info'), // minimum log level to store\n retention: integer('retention').notNull().default(30), // days to keep logs\n maxSize: integer('max_size').default(10000), // max number of logs per category\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Insert and select schemas for system logs\nexport const insertSystemLogSchema = createInsertSchema(systemLogs, {\n level: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n message: (schema: any) => schema.min(1),\n});\n\nexport const selectSystemLogSchema = createSelectSchema(systemLogs);\n\nexport const insertLogConfigSchema = createInsertSchema(logConfig, {\n category: (schema: any) => schema.min(1),\n level: (schema: any) => schema.min(1),\n});\n\nexport const selectLogConfigSchema = createSelectSchema(logConfig);\n\n// Type exports\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\nexport type Collection = typeof collections.$inferSelect;\nexport type NewCollection = typeof collections.$inferInsert;\nexport type Content = typeof content.$inferSelect;\nexport type NewContent = typeof content.$inferInsert;\nexport type Media = typeof media.$inferSelect;\nexport type NewMedia = typeof media.$inferInsert;\nexport type WorkflowHistory = typeof workflowHistory.$inferSelect;\nexport type NewWorkflowHistory = typeof workflowHistory.$inferInsert;\nexport type Plugin = typeof plugins.$inferSelect;\nexport type NewPlugin = typeof plugins.$inferInsert;\nexport type PluginHook = typeof pluginHooks.$inferSelect;\nexport type NewPluginHook = typeof pluginHooks.$inferInsert;\nexport type PluginRoute = typeof pluginRoutes.$inferSelect;\nexport type NewPluginRoute = typeof pluginRoutes.$inferInsert;\nexport type PluginAsset = typeof pluginAssets.$inferSelect;\nexport type NewPluginAsset = typeof pluginAssets.$inferInsert;\nexport type PluginActivityLog = typeof pluginActivityLog.$inferSelect;\nexport type NewPluginActivityLog = typeof pluginActivityLog.$inferInsert;\nexport type SystemLog = typeof systemLogs.$inferSelect;\nexport type NewSystemLog = typeof systemLogs.$inferInsert;\nexport type LogConfig = typeof logConfig.$inferSelect;\nexport type NewLogConfig = typeof logConfig.$inferInsert;\n\n// =====================================================\n// Security Audit Plugin Tables\n// =====================================================\n\nexport const securityEvents = sqliteTable('security_events', {\n id: text('id').primaryKey(),\n eventType: text('event_type').notNull(),\n severity: text('severity').notNull().default('info'),\n userId: text('user_id'),\n email: text('email'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n countryCode: text('country_code'),\n requestPath: text('request_path'),\n requestMethod: text('request_method'),\n details: text('details', { mode: 'json' }),\n fingerprint: text('fingerprint'),\n blocked: integer('blocked').notNull().default(0),\n createdAt: integer('created_at').notNull().$defaultFn(() => Date.now()),\n});\n\nexport const insertSecurityEventSchema = createInsertSchema(securityEvents, {\n eventType: (schema: any) => schema.min(1),\n severity: (schema: any) => schema.min(1),\n});\n\nexport const selectSecurityEventSchema = createSelectSchema(securityEvents);\n\nexport type SecurityEventRecord = typeof securityEvents.$inferSelect;\nexport type NewSecurityEventRecord = typeof securityEvents.$inferInsert;\n\n// =====================================================\n// Form.io Integration Tables\n// =====================================================\n\n// Forms table - stores Form.io form definitions\nexport const forms = sqliteTable('forms', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(), // Machine name (e.g., \"contact-form\")\n displayName: text('display_name').notNull(), // Human name (e.g., \"Contact Form\")\n description: text('description'),\n category: text('category').notNull().default('general'), // contact, survey, registration, etc.\n \n // Form.io schema (JSON)\n formioSchema: text('formio_schema', { mode: 'json' }).notNull(), // Complete Form.io JSON schema\n \n // Settings (JSON)\n settings: text('settings', { mode: 'json' }), // emailNotifications, successMessage, etc.\n \n // Status & Management\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n isPublic: integer('is_public', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false),\n \n // Metadata\n icon: text('icon'),\n color: text('color'),\n tags: text('tags', { mode: 'json' }), // JSON array\n \n // Stats\n submissionCount: integer('submission_count').notNull().default(0),\n viewCount: integer('view_count').notNull().default(0),\n \n // Ownership\n createdBy: text('created_by').references(() => users.id),\n updatedBy: text('updated_by').references(() => users.id),\n \n // Timestamps\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form submissions table\nexport const formSubmissions = sqliteTable('form_submissions', {\n id: text('id').primaryKey(),\n formId: text('form_id').notNull().references(() => forms.id, { onDelete: 'cascade' }),\n \n // Submission data\n submissionData: text('submission_data', { mode: 'json' }).notNull(), // The actual form data\n \n // Submission metadata\n status: text('status').notNull().default('pending'), // pending, reviewed, approved, rejected, spam\n submissionNumber: integer('submission_number'),\n \n // User information\n userId: text('user_id').references(() => users.id),\n userEmail: text('user_email'),\n \n // Tracking\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n referrer: text('referrer'),\n utmSource: text('utm_source'),\n utmMedium: text('utm_medium'),\n utmCampaign: text('utm_campaign'),\n \n // Review/Processing\n reviewedBy: text('reviewed_by').references(() => users.id),\n reviewedAt: integer('reviewed_at'),\n reviewNotes: text('review_notes'),\n \n // Flags\n isSpam: integer('is_spam', { mode: 'boolean' }).notNull().default(false),\n isArchived: integer('is_archived', { mode: 'boolean' }).notNull().default(false),\n\n // Content integration\n contentId: text('content_id').references(() => content.id), // Links submission to its content item\n\n // Timestamps\n submittedAt: integer('submitted_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form files table - links submissions to uploaded files\nexport const formFiles = sqliteTable('form_files', {\n id: text('id').primaryKey(),\n submissionId: text('submission_id').notNull().references(() => formSubmissions.id, { onDelete: 'cascade' }),\n mediaId: text('media_id').notNull().references(() => media.id, { onDelete: 'cascade' }),\n fieldName: text('field_name').notNull(), // Form field that uploaded this file\n uploadedAt: integer('uploaded_at').notNull(),\n});\n\n// Zod schemas for validation\nexport const insertFormSchema = createInsertSchema(forms);\nexport const selectFormSchema = createSelectSchema(forms);\nexport const insertFormSubmissionSchema = createInsertSchema(formSubmissions);\nexport const selectFormSubmissionSchema = createSelectSchema(formSubmissions);\nexport const insertFormFileSchema = createInsertSchema(formFiles);\nexport const selectFormFileSchema = createSelectSchema(formFiles);\n\n// TypeScript types\nexport type Form = typeof forms.$inferSelect;\nexport type NewForm = typeof forms.$inferInsert;\nexport type FormSubmission = typeof formSubmissions.$inferSelect;\nexport type NewFormSubmission = typeof formSubmissions.$inferInsert;\nexport type FormFile = typeof formFiles.$inferSelect;\nexport type NewFormFile = typeof formFiles.$inferInsert;",null,null,null,null,"import type { D1Database } from '@cloudflare/workers-types'\nimport { systemLogs, logConfig, type NewSystemLog, type LogConfig } from '../db/schema'\nimport { drizzle } from 'drizzle-orm/d1'\nimport { eq, and, gte, lte, desc, asc, count, like, inArray } from 'drizzle-orm'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal'\nexport type LogCategory = 'auth' | 'api' | 'workflow' | 'plugin' | 'media' | 'system' | 'security' | 'error'\n\nexport interface LogEntry {\n level: LogLevel\n category: LogCategory\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags?: string[]\n source?: string\n}\n\nexport interface LogFilter {\n level?: LogLevel[]\n category?: LogCategory[]\n userId?: string\n source?: string\n search?: string\n startDate?: Date\n endDate?: Date\n tags?: string[]\n limit?: number\n offset?: number\n sortBy?: 'created_at' | 'level' | 'category'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport class Logger {\n private db: ReturnType\n private enabled: boolean = true\n private configCache: Map = new Map()\n private lastConfigRefresh: number = 0\n private configRefreshInterval: number = 60000 // 1 minute\n\n constructor(database: D1Database) {\n this.db = drizzle(database)\n }\n\n /**\n * Log a debug message\n */\n async debug(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('debug', category, message, data, context)\n }\n\n /**\n * Log an info message\n */\n async info(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('info', category, message, data, context)\n }\n\n /**\n * Log a warning message\n */\n async warn(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('warn', category, message, data, context)\n }\n\n /**\n * Log an error message\n */\n async error(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('error', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log a fatal message\n */\n async fatal(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('fatal', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log an API request\n */\n async logRequest(\n method: string,\n url: string,\n statusCode: number,\n duration: number,\n context?: Partial\n ): Promise {\n const level: LogLevel = statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info'\n \n return this.log(level, 'api', `${method} ${url} - ${statusCode}`, {\n method,\n url,\n statusCode,\n duration\n }, {\n ...context,\n method,\n url,\n statusCode,\n duration\n })\n }\n\n /**\n * Log an authentication event\n */\n async logAuth(action: string, userId?: string, success: boolean = true, context?: Partial): Promise {\n const level: LogLevel = success ? 'info' : 'warn'\n \n return this.log(level, 'auth', `Authentication ${action}: ${success ? 'success' : 'failed'}`, {\n action,\n success,\n userId\n }, {\n ...context,\n userId,\n tags: ['authentication', action]\n })\n }\n\n /**\n * Log a security event\n */\n async logSecurity(event: string, severity: 'low' | 'medium' | 'high' | 'critical', context?: Partial): Promise {\n const level: LogLevel = severity === 'critical' ? 'fatal' : severity === 'high' ? 'error' : 'warn'\n \n return this.log(level, 'security', `Security event: ${event}`, {\n event,\n severity\n }, {\n ...context,\n tags: ['security', severity]\n })\n }\n\n /**\n * Core logging method\n */\n private async log(\n level: LogLevel,\n category: LogCategory,\n message: string,\n data?: any,\n context?: Partial\n ): Promise {\n if (!this.enabled) return\n\n try {\n // Check if logging is enabled for this category and level\n const config = await this.getConfig(category)\n if (!config || !config.enabled || !this.shouldLog(level, config.level)) {\n return\n }\n\n const logEntry: NewSystemLog = {\n id: crypto.randomUUID(),\n level,\n category,\n message,\n data: data ? JSON.stringify(data) : null,\n userId: context?.userId || null,\n sessionId: context?.sessionId || null,\n requestId: context?.requestId || null,\n ipAddress: context?.ipAddress || null,\n userAgent: context?.userAgent || null,\n method: context?.method || null,\n url: context?.url || null,\n statusCode: context?.statusCode || null,\n duration: context?.duration || null,\n stackTrace: context?.stackTrace || null,\n tags: context?.tags ? JSON.stringify(context.tags) : null,\n source: context?.source || null,\n createdAt: new Date()\n }\n\n await this.db.insert(systemLogs).values(logEntry)\n\n // Check if we need to clean up old logs\n if (config.maxSize) {\n await this.cleanupCategory(category, config.maxSize)\n }\n\n } catch (error) {\n // Don't log errors in the logger to avoid infinite loops\n console.error('Logger error:', error)\n }\n }\n\n /**\n * Get logs with filtering and pagination\n */\n async getLogs(filter: LogFilter = {}): Promise<{ logs: any[], total: number }> {\n try {\n const conditions = []\n \n if (filter.level && filter.level.length > 0) {\n conditions.push(inArray(systemLogs.level, filter.level))\n }\n \n if (filter.category && filter.category.length > 0) {\n conditions.push(inArray(systemLogs.category, filter.category))\n }\n \n if (filter.userId) {\n conditions.push(eq(systemLogs.userId, filter.userId))\n }\n \n if (filter.source) {\n conditions.push(eq(systemLogs.source, filter.source))\n }\n \n if (filter.search) {\n conditions.push(\n like(systemLogs.message, `%${filter.search}%`)\n )\n }\n \n if (filter.startDate) {\n conditions.push(gte(systemLogs.createdAt, filter.startDate))\n }\n \n if (filter.endDate) {\n conditions.push(lte(systemLogs.createdAt, filter.endDate))\n }\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined\n\n // Get total count\n const totalResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(whereClause)\n\n const total = totalResult[0]?.count || 0\n\n // Get logs with pagination and sorting\n const sortColumn = filter.sortBy === 'level' ? systemLogs.level :\n filter.sortBy === 'category' ? systemLogs.category :\n systemLogs.createdAt\n\n const sortFn = filter.sortOrder === 'asc' ? asc : desc\n\n const logs = await this.db\n .select()\n .from(systemLogs)\n .where(whereClause)\n .orderBy(sortFn(sortColumn))\n .limit(filter.limit || 50)\n .offset(filter.offset || 0)\n\n return { logs, total }\n } catch (error) {\n console.error('Error getting logs:', error)\n return { logs: [], total: 0 }\n }\n }\n\n /**\n * Get log configuration for a category\n */\n private async getConfig(category: LogCategory): Promise {\n try {\n // Check cache first\n const now = Date.now()\n if (this.configCache.has(category) && (now - this.lastConfigRefresh) < this.configRefreshInterval) {\n return this.configCache.get(category) || null\n }\n\n // Refresh config from database\n const configs = await this.db\n .select()\n .from(logConfig)\n .where(eq(logConfig.category, category))\n\n const config = configs[0] || null\n \n if (config) {\n this.configCache.set(category, config)\n this.lastConfigRefresh = now\n }\n\n return config\n } catch (error) {\n console.error('Error getting log config:', error)\n return null\n }\n }\n\n /**\n * Update log configuration\n */\n async updateConfig(category: LogCategory, updates: Partial): Promise {\n try {\n await this.db\n .update(logConfig)\n .set({\n ...updates,\n updatedAt: new Date()\n })\n .where(eq(logConfig.category, category))\n\n // Clear cache for this category\n this.configCache.delete(category)\n } catch (error) {\n console.error('Error updating log config:', error)\n }\n }\n\n /**\n * Get all log configurations\n */\n async getAllConfigs(): Promise {\n try {\n return await this.db.select().from(logConfig)\n } catch (error) {\n console.error('Error getting log configs:', error)\n return []\n }\n }\n\n /**\n * Clean up old logs for a category\n */\n private async cleanupCategory(category: LogCategory, maxSize: number): Promise {\n try {\n // Count current logs for this category\n const countResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n\n const currentCount = countResult[0]?.count || 0\n\n if (currentCount > maxSize) {\n // Get the cutoff date (keep newest maxSize logs)\n const cutoffLogs = await this.db\n .select({ createdAt: systemLogs.createdAt })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n .orderBy(desc(systemLogs.createdAt))\n .limit(1)\n .offset(maxSize - 1)\n\n if (cutoffLogs[0]) {\n // Delete older logs\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, category),\n lte(systemLogs.createdAt, cutoffLogs[0].createdAt)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n }\n }\n\n /**\n * Clean up logs based on retention policy\n */\n async cleanupByRetention(): Promise {\n try {\n const configs = await this.getAllConfigs()\n \n for (const config of configs) {\n if (config.retention > 0) {\n const cutoffDate = new Date()\n cutoffDate.setDate(cutoffDate.getDate() - config.retention)\n\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, config.category),\n lte(systemLogs.createdAt, cutoffDate)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs by retention:', error)\n }\n }\n\n /**\n * Check if a log level should be recorded based on configuration\n */\n private shouldLog(level: LogLevel, configLevel: string): boolean {\n const levels = ['debug', 'info', 'warn', 'error', 'fatal']\n const levelIndex = levels.indexOf(level)\n const configLevelIndex = levels.indexOf(configLevel)\n \n return levelIndex >= configLevelIndex\n }\n\n /**\n * Enable or disable logging\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton logger instance\nlet loggerInstance: Logger | null = null\n\n/**\n * Get the logger instance\n */\nexport function getLogger(database?: D1Database): Logger {\n if (!loggerInstance && database) {\n loggerInstance = new Logger(database)\n }\n \n if (!loggerInstance) {\n throw new Error('Logger not initialized. Call getLogger with a database instance first.')\n }\n \n return loggerInstance\n}\n\n/**\n * Initialize the logger with a database\n */\nexport function initLogger(database: D1Database): Logger {\n loggerInstance = new Logger(database)\n return loggerInstance\n}","/**\n * Simple Cache Service\n *\n * Provides basic caching functionality for the core package\n * Can be extended with KV or other storage backends\n */\n\nexport interface CacheConfig {\n ttl: number // Time to live in seconds\n keyPrefix: string\n}\n\nexport class CacheService {\n private config: CacheConfig\n private memoryCache: Map = new Map()\n\n constructor(config: CacheConfig) {\n this.config = config\n }\n\n /**\n * Generate cache key with prefix\n */\n generateKey(type: string, identifier?: string): string {\n const parts = [this.config.keyPrefix, type]\n if (identifier) {\n parts.push(identifier)\n }\n return parts.join(':')\n }\n\n /**\n * Get value from cache\n */\n async get(key: string): Promise {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return null\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return null\n }\n\n return cached.value as T\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise<{\n hit: boolean\n data: T | null\n source: string\n ttl?: number\n }> {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return {\n hit: false,\n data: null,\n source: 'none'\n }\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return {\n hit: false,\n data: null,\n source: 'expired'\n }\n }\n\n return {\n hit: true,\n data: cached.value as T,\n source: 'memory',\n ttl: (cached.expires - Date.now()) / 1000 // TTL in seconds\n }\n }\n\n /**\n * Set value in cache\n */\n async set(key: string, value: any, ttl?: number): Promise {\n const expires = Date.now() + ((ttl || this.config.ttl) * 1000)\n this.memoryCache.set(key, { value, expires })\n }\n\n /**\n * Delete specific key from cache\n */\n async delete(key: string): Promise {\n this.memoryCache.delete(key)\n }\n\n /**\n * Invalidate cache keys matching a pattern\n * For memory cache, we do simple string matching\n */\n async invalidate(pattern: string): Promise {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.')\n const regex = new RegExp(`^${regexPattern}$`)\n\n // Find and delete matching keys\n for (const key of this.memoryCache.keys()) {\n if (regex.test(key)) {\n this.memoryCache.delete(key)\n }\n }\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise {\n this.memoryCache.clear()\n }\n\n /**\n * Get value from cache or set it using a callback\n */\n async getOrSet(key: string, callback: () => Promise, ttl?: number): Promise {\n const cached = await this.get(key)\n\n if (cached !== null) {\n return cached\n }\n\n const value = await callback()\n await this.set(key, value, ttl)\n return value\n }\n}\n\n/**\n * Cache configurations for different data types\n */\nexport const CACHE_CONFIGS = {\n api: {\n ttl: 300, // 5 minutes\n keyPrefix: 'api'\n },\n user: {\n ttl: 600, // 10 minutes\n keyPrefix: 'user'\n },\n content: {\n ttl: 300, // 5 minutes\n keyPrefix: 'content'\n },\n collection: {\n ttl: 600, // 10 minutes\n keyPrefix: 'collection'\n }\n}\n\n/**\n * Get cache service instance for a config\n */\nexport function getCacheService(config: CacheConfig): CacheService {\n return new CacheService(config)\n}\n","export interface Setting {\n id: string\n category: string\n key: string\n value: string // JSON string\n created_at: number\n updated_at: number\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface SecuritySettings {\n jwtExpiresIn: string\n jwtRefreshGraceSeconds: number\n}\n\nexport class SettingsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get a setting value by category and key\n */\n async getSetting(category: string, key: string): Promise {\n try {\n const result = await this.db\n .prepare('SELECT value FROM settings WHERE category = ? AND key = ?')\n .bind(category, key)\n .first()\n\n if (!result) {\n return null\n }\n\n return JSON.parse((result as any).value)\n } catch (error) {\n console.error(`Error getting setting ${category}.${key}:`, error)\n return null\n }\n }\n\n /**\n * Get all settings for a category\n */\n async getCategorySettings(category: string): Promise> {\n try {\n const { results } = await this.db\n .prepare('SELECT key, value FROM settings WHERE category = ?')\n .bind(category)\n .all()\n\n const settings: Record = {}\n for (const row of results || []) {\n const r = row as any\n settings[r.key] = JSON.parse(r.value)\n }\n\n return settings\n } catch (error) {\n console.error(`Error getting category settings for ${category}:`, error)\n return {}\n }\n }\n\n /**\n * Set a setting value\n */\n async setSetting(category: string, key: string, value: any): Promise {\n try {\n const now = Date.now()\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n\n return true\n } catch (error) {\n console.error(`Error setting ${category}.${key}:`, error)\n return false\n }\n }\n\n /**\n * Set multiple settings at once\n */\n async setMultipleSettings(category: string, settings: Record): Promise {\n try {\n const now = Date.now()\n\n // Use a transaction-like approach with batch operations\n for (const [key, value] of Object.entries(settings)) {\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n }\n\n return true\n } catch (error) {\n console.error(`Error setting multiple settings for ${category}:`, error)\n return false\n }\n }\n\n /**\n * Get general settings with defaults\n */\n async getGeneralSettings(userEmail?: string): Promise {\n const settings = await this.getCategorySettings('general')\n\n return {\n siteName: settings.siteName || 'SonicJS AI',\n siteDescription: settings.siteDescription || 'A modern headless CMS powered by AI',\n adminEmail: settings.adminEmail || userEmail || 'admin@example.com',\n timezone: settings.timezone || 'UTC',\n language: settings.language || 'en',\n maintenanceMode: settings.maintenanceMode || false\n }\n }\n\n /**\n * Save general settings\n */\n async saveGeneralSettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.siteName !== undefined) settingsToSave.siteName = settings.siteName\n if (settings.siteDescription !== undefined) settingsToSave.siteDescription = settings.siteDescription\n if (settings.adminEmail !== undefined) settingsToSave.adminEmail = settings.adminEmail\n if (settings.timezone !== undefined) settingsToSave.timezone = settings.timezone\n if (settings.language !== undefined) settingsToSave.language = settings.language\n if (settings.maintenanceMode !== undefined) settingsToSave.maintenanceMode = settings.maintenanceMode\n\n return await this.setMultipleSettings('general', settingsToSave)\n }\n\n /**\n * Get security settings with defaults\n */\n async getSecuritySettings(): Promise {\n const settings = await this.getCategorySettings('security')\n\n return {\n jwtExpiresIn: settings.jwtExpiresIn || '30d',\n jwtRefreshGraceSeconds:\n typeof settings.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n }\n }\n\n /**\n * Save security settings\n */\n async saveSecuritySettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.jwtExpiresIn !== undefined) settingsToSave.jwtExpiresIn = settings.jwtExpiresIn\n if (settings.jwtRefreshGraceSeconds !== undefined)\n settingsToSave.jwtRefreshGraceSeconds = settings.jwtRefreshGraceSeconds\n\n return await this.setMultipleSettings('security', settingsToSave)\n }\n}\n","/**\n * Telemetry Service\n *\n * Privacy-first telemetry service using custom SonicJS stats endpoint\n * - No PII collection\n * - Opt-out by default\n * - Silent failures (never blocks app)\n */\n\nimport type { TelemetryEvent, TelemetryProperties, TelemetryConfig, TelemetryIdentity } from '../types/telemetry'\nimport { getTelemetryConfig } from '../utils/telemetry-config'\nimport { generateInstallationId, generateProjectId, sanitizeErrorMessage, sanitizeRoute } from '../utils/telemetry-id'\n\n/**\n * TelemetryService class\n *\n * Handles all telemetry tracking in a privacy-conscious way\n */\nexport class TelemetryService {\n private config: TelemetryConfig\n private identity: TelemetryIdentity | null = null\n private enabled: boolean = true\n private eventQueue: Array<{ event: TelemetryEvent; properties?: TelemetryProperties }> = []\n private isInitialized: boolean = false\n\n constructor(config?: Partial) {\n this.config = {\n ...getTelemetryConfig(),\n ...config\n }\n this.enabled = this.config.enabled\n }\n\n /**\n * Initialize the telemetry service\n */\n async initialize(identity: TelemetryIdentity): Promise {\n if (!this.enabled) {\n if (this.config.debug) {\n console.log('[Telemetry] Disabled via configuration')\n }\n return\n }\n\n try {\n this.identity = identity\n\n if (this.config.debug) {\n console.log('[Telemetry] Initialized with installation ID:', identity.installationId)\n }\n\n this.isInitialized = true\n\n // Flush any queued events\n await this.flushQueue()\n\n } catch (error) {\n // Silent fail - telemetry should never break the app\n if (this.config.debug) {\n console.error('[Telemetry] Initialization failed:', error)\n }\n this.enabled = false\n }\n }\n\n /**\n * Track a telemetry event\n */\n async track(event: TelemetryEvent, properties?: TelemetryProperties): Promise {\n if (!this.enabled) return\n\n try {\n // Sanitize properties\n const sanitizedProps = this.sanitizeProperties(properties)\n\n // Add standard properties\n const enrichedProps = {\n ...sanitizedProps,\n timestamp: new Date().toISOString(),\n version: this.getVersion()\n }\n\n // If not initialized, queue the event\n if (!this.isInitialized) {\n this.eventQueue.push({ event, properties: enrichedProps })\n if (this.config.debug) {\n console.log('[Telemetry] Queued event:', event, enrichedProps)\n }\n return\n }\n\n // Send to custom SonicJS stats endpoint\n if (this.identity && this.config.host) {\n const payload = {\n data: {\n installation_id: this.identity.installationId,\n event_type: event,\n properties: enrichedProps,\n timestamp: enrichedProps.timestamp\n }\n }\n\n // Fire and forget - don't block on response\n fetch(`${this.config.host}/v1/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload)\n }).catch(() => {}) // Silent fail\n\n if (this.config.debug) {\n console.log('[Telemetry] Tracked event:', event, enrichedProps)\n }\n } else if (this.config.debug) {\n console.log('[Telemetry] Event (no endpoint):', event, enrichedProps)\n }\n\n } catch (error) {\n // Silent fail\n if (this.config.debug) {\n console.error('[Telemetry] Failed to track event:', error)\n }\n }\n }\n\n /**\n * Track installation started\n */\n async trackInstallationStarted(properties?: TelemetryProperties): Promise {\n await this.track('installation_started', properties)\n }\n\n /**\n * Track installation completed\n */\n async trackInstallationCompleted(properties?: TelemetryProperties): Promise {\n await this.track('installation_completed', properties)\n }\n\n /**\n * Track installation failed\n */\n async trackInstallationFailed(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('installation_failed', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track dev server started\n */\n async trackDevServerStarted(properties?: TelemetryProperties): Promise {\n await this.track('dev_server_started', properties)\n }\n\n /**\n * Track page view in admin UI\n */\n async trackPageView(route: string, properties?: TelemetryProperties): Promise {\n await this.track('page_viewed', {\n ...properties,\n route: sanitizeRoute(route)\n })\n }\n\n /**\n * Track error (sanitized)\n */\n async trackError(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('error_occurred', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track plugin activation\n */\n async trackPluginActivated(properties?: TelemetryProperties): Promise {\n await this.track('plugin_activated', properties)\n }\n\n /**\n * Track migration run\n */\n async trackMigrationRun(properties?: TelemetryProperties): Promise {\n await this.track('migration_run', properties)\n }\n\n /**\n * Flush queued events\n */\n private async flushQueue(): Promise {\n if (this.eventQueue.length === 0) return\n\n const queue = [...this.eventQueue]\n this.eventQueue = []\n\n for (const { event, properties } of queue) {\n await this.track(event, properties)\n }\n }\n\n /**\n * Sanitize properties to ensure no PII\n */\n private sanitizeProperties(properties?: TelemetryProperties): TelemetryProperties {\n if (!properties) return {}\n\n const sanitized: TelemetryProperties = {}\n\n for (const [key, value] of Object.entries(properties)) {\n // Skip undefined values\n if (value === undefined) continue\n\n // Sanitize routes\n if (key === 'route' && typeof value === 'string') {\n sanitized[key] = sanitizeRoute(value)\n continue\n }\n\n // Sanitize error messages\n if (key.toLowerCase().includes('error') && typeof value === 'string') {\n sanitized[key] = sanitizeErrorMessage(value)\n continue\n }\n\n // Only allow specific types\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n sanitized[key] = value\n }\n }\n\n return sanitized\n }\n\n /**\n * Get SonicJS version\n */\n private getVersion(): string {\n try {\n // Safe environment access for Cloudflare Workers compatibility\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SONICJS_VERSION || '2.0.0'\n }\n return '2.0.0'\n } catch {\n return 'unknown'\n }\n }\n\n /**\n * Shutdown the telemetry service (no-op for fetch-based telemetry)\n */\n async shutdown(): Promise {\n // No-op - fetch requests are fire and forget\n }\n\n /**\n * Enable telemetry\n */\n enable(): void {\n this.enabled = true\n }\n\n /**\n * Disable telemetry\n */\n disable(): void {\n this.enabled = false\n }\n\n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton instance\nlet telemetryInstance: TelemetryService | null = null\n\n/**\n * Get the telemetry service instance\n */\nexport function getTelemetryService(config?: Partial): TelemetryService {\n if (!telemetryInstance) {\n telemetryInstance = new TelemetryService(config)\n }\n return telemetryInstance\n}\n\n/**\n * Initialize telemetry service\n */\nexport async function initTelemetry(identity: TelemetryIdentity, config?: Partial): Promise {\n const service = getTelemetryService(config)\n await service.initialize(identity)\n return service\n}\n\n/**\n * Create a new installation identity\n */\nexport function createInstallationIdentity(projectName?: string): TelemetryIdentity {\n const installationId = generateInstallationId()\n const identity: TelemetryIdentity = { installationId }\n\n if (projectName) {\n // Generate anonymous project ID\n identity.projectId = generateProjectId(projectName)\n }\n\n return identity\n}\n","/**\n * Route Metadata Service\n *\n * Auto-discovers API routes using Hono's inspectRoutes() and enriches them\n * with metadata from a static registry. Routes without metadata still appear\n * as \"auto-discovered\" — nothing is ever invisible.\n */\n\nimport { inspectRoutes } from 'hono/dev'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RouteMetadata {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented: boolean\n}\n\ninterface RouteMeta {\n description: string\n authentication: boolean\n category: string\n}\n\nexport interface CategoryInfo {\n title: string\n description: string\n icon: string\n}\n\n// ============================================================================\n// App Instance Storage\n// ============================================================================\n\nlet appInstance: any = null\n\nexport function setAppInstance(app: any): void {\n appInstance = app\n}\n\nexport function getAppInstance(): any {\n return appInstance\n}\n\n// ============================================================================\n// Category Information\n// ============================================================================\n\nexport const CATEGORY_INFO: Record = {\n 'Auth': {\n title: 'Authentication',\n description: 'User authentication and authorization endpoints',\n icon: '🔐'\n },\n 'Content': {\n title: 'Content Management',\n description: 'Content creation, retrieval, and management',\n icon: '📝'\n },\n 'Media': {\n title: 'Media Management',\n description: 'File upload, storage, and media operations',\n icon: '🖼️'\n },\n 'Admin': {\n title: 'Admin Interface',\n description: 'Administrative panel and management features',\n icon: '⚙️'\n },\n 'System': {\n title: 'System',\n description: 'Health checks and system information',\n icon: '🔧'\n },\n 'Search': {\n title: 'Search',\n description: 'AI-powered search, full-text search, and analytics',\n icon: '🔍'\n },\n 'API Keys': {\n title: 'API Keys',\n description: 'API key management and authentication',\n icon: '🔑'\n },\n 'Workflow': {\n title: 'Workflow',\n description: 'Content workflow and approval processes',\n icon: '🔄'\n },\n 'Cache': {\n title: 'Cache',\n description: 'Cache management and invalidation',\n icon: '⚡'\n },\n 'Forms': {\n title: 'Forms',\n description: 'Form submissions and management',\n icon: '📋'\n },\n 'Files': {\n title: 'Files',\n description: 'File serving from R2 storage',\n icon: '📁'\n }\n}\n\n// ============================================================================\n// Route Metadata Registry\n// ============================================================================\n\nconst ROUTE_METADATA: Record = {\n // Auth endpoints\n 'POST /auth/login': { description: 'Authenticate user with email and password (returns JWT)', category: 'Auth', authentication: false },\n 'POST /auth/login/form': { description: 'Form-based login (sets session cookie)', category: 'Auth', authentication: false },\n 'POST /auth/register': { description: 'Register a new user account', category: 'Auth', authentication: false },\n 'POST /auth/logout': { description: 'Log out the current user and invalidate session', category: 'Auth', authentication: true },\n 'GET /auth/me': { description: 'Get current authenticated user information', category: 'Auth', authentication: true },\n 'POST /auth/refresh': { description: 'Refresh authentication token', category: 'Auth', authentication: true },\n 'POST /auth/seed-admin': { description: 'Create or reset the admin user account', category: 'Auth', authentication: false },\n 'POST /auth/magic-link/request': { description: 'Request a magic link login email', category: 'Auth', authentication: false },\n 'GET /auth/magic-link/verify': { description: 'Verify magic link token and authenticate', category: 'Auth', authentication: false },\n 'POST /auth/otp/request': { description: 'Request a one-time password via email', category: 'Auth', authentication: false },\n 'POST /auth/otp/verify': { description: 'Verify OTP code and authenticate', category: 'Auth', authentication: false },\n\n // Content endpoints\n 'GET /api/collections': { description: 'List all available collections', category: 'Content', authentication: false },\n 'GET /api/collections/:collection/content': { description: 'Get all content items from a specific collection', category: 'Content', authentication: false },\n 'GET /api/content/:id': { description: 'Get a specific content item by ID', category: 'Content', authentication: false },\n 'POST /api/content': { description: 'Create a new content item', category: 'Content', authentication: true },\n 'PUT /api/content/:id': { description: 'Update an existing content item', category: 'Content', authentication: true },\n 'DELETE /api/content/:id': { description: 'Delete a content item', category: 'Content', authentication: true },\n 'GET /api/content/:id/versions': { description: 'Get version history for a content item', category: 'Content', authentication: true },\n 'POST /api/content/:id/restore/:versionId': { description: 'Restore a content item to a previous version', category: 'Content', authentication: true },\n\n // Media endpoints\n 'GET /api/media': { description: 'List all media files with pagination', category: 'Media', authentication: false },\n 'GET /api/media/:id': { description: 'Get a specific media file by ID', category: 'Media', authentication: false },\n 'POST /api/media/upload': { description: 'Upload a new media file to R2 storage', category: 'Media', authentication: true },\n 'DELETE /api/media/:id': { description: 'Delete a media file from storage', category: 'Media', authentication: true },\n\n // Admin API endpoints\n 'GET /admin/api/stats': { description: 'Get dashboard statistics (collections, content, media, users)', category: 'Admin', authentication: true },\n 'GET /admin/api/storage': { description: 'Get storage usage information', category: 'Admin', authentication: true },\n 'GET /admin/api/activity': { description: 'Get recent activity logs', category: 'Admin', authentication: true },\n 'GET /admin/api/collections': { description: 'List all collections with field counts', category: 'Admin', authentication: true },\n 'POST /admin/api/collections': { description: 'Create a new collection', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id': { description: 'Get a specific collection with its fields', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id': { description: 'Update an existing collection', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id': { description: 'Delete a collection (must be empty)', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id/fields': { description: 'Get fields for a specific collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields': { description: 'Add a field to a collection', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id/fields/:fieldId': { description: 'Update a collection field', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id/fields/:fieldId': { description: 'Remove a field from a collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields/reorder': { description: 'Reorder fields in a collection', category: 'Admin', authentication: true },\n 'GET /admin/api/migrations/status': { description: 'Get database migration status', category: 'Admin', authentication: true },\n 'POST /admin/api/migrations/run': { description: 'Run pending database migrations', category: 'Admin', authentication: true },\n 'GET /admin/api/content': { description: 'List content items with filtering and pagination', category: 'Admin', authentication: true },\n 'GET /admin/api/content/:id': { description: 'Get a content item for admin editing', category: 'Admin', authentication: true },\n 'POST /admin/api/content': { description: 'Create content via admin API', category: 'Admin', authentication: true },\n 'PUT /admin/api/content/:id': { description: 'Update content via admin API', category: 'Admin', authentication: true },\n 'DELETE /admin/api/content/:id': { description: 'Delete content via admin API', category: 'Admin', authentication: true },\n 'GET /admin/api/media': { description: 'List media files for admin management', category: 'Admin', authentication: true },\n 'POST /admin/api/media/upload': { description: 'Upload media via admin interface', category: 'Admin', authentication: true },\n 'DELETE /admin/api/media/:id': { description: 'Delete media via admin interface', category: 'Admin', authentication: true },\n 'GET /admin/api/users': { description: 'List all users', category: 'Admin', authentication: true },\n 'POST /admin/api/users': { description: 'Create a new user', category: 'Admin', authentication: true },\n 'PUT /admin/api/users/:id': { description: 'Update a user', category: 'Admin', authentication: true },\n 'DELETE /admin/api/users/:id': { description: 'Delete a user', category: 'Admin', authentication: true },\n 'GET /admin/api/logs': { description: 'Get application logs with filtering', category: 'Admin', authentication: true },\n 'GET /admin/api/plugins': { description: 'List all registered plugins', category: 'Admin', authentication: true },\n 'POST /admin/api/plugins/:id/toggle': { description: 'Enable or disable a plugin', category: 'Admin', authentication: true },\n 'GET /admin/api/settings': { description: 'Get application settings', category: 'Admin', authentication: true },\n 'PUT /admin/api/settings': { description: 'Update application settings', category: 'Admin', authentication: true },\n 'GET /admin/api/forms': { description: 'List all forms', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id': { description: 'Get form details and submissions', category: 'Admin', authentication: true },\n 'POST /admin/api/forms': { description: 'Create a new form', category: 'Admin', authentication: true },\n 'PUT /admin/api/forms/:id': { description: 'Update a form', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id': { description: 'Delete a form', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id/submissions': { description: 'Get form submissions', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id/submissions/:submissionId': { description: 'Delete a form submission', category: 'Admin', authentication: true },\n\n // Search endpoints\n 'GET /api/search': { description: 'Search content using AI, FTS5, keyword, or hybrid mode', category: 'Search', authentication: false },\n 'POST /api/search/click': { description: 'Track a search result click for analytics', category: 'Search', authentication: false },\n 'GET /admin/plugins/ai-search/api/status': { description: 'Get search plugin status and configuration', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index': { description: 'Trigger content indexing for search', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index/reset': { description: 'Reset the search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics': { description: 'Get search analytics and metrics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/queries': { description: 'Get top search queries', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/clicks': { description: 'Get click-through analytics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/fts5/status': { description: 'Get FTS5 full-text search status', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/fts5/rebuild': { description: 'Rebuild the FTS5 search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/facets': { description: 'Get available search facets', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments': { description: 'List search A/B test experiments', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments': { description: 'Create a search A/B test experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id': { description: 'Get experiment details', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/experiments/:id': { description: 'Update an experiment', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/experiments/:id': { description: 'Delete an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/start': { description: 'Start an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/stop': { description: 'Stop a running experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id/results': { description: 'Get experiment results and statistics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality': { description: 'Get search quality agent analysis', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/run': { description: 'Run search quality analysis', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality/recommendations': { description: 'Get quality improvement recommendations', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/apply': { description: 'Apply a quality recommendation', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/dismiss': { description: 'Dismiss a quality recommendation', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/synonyms': { description: 'List search synonyms', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/synonyms': { description: 'Add a search synonym', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/synonyms/:id': { description: 'Delete a search synonym', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/query-rules': { description: 'List search query rules', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/query-rules': { description: 'Create a query rule', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/query-rules/:id': { description: 'Update a query rule', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/query-rules/:id': { description: 'Delete a query rule', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/settings': { description: 'Get search plugin settings', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/settings': { description: 'Update search plugin settings', category: 'Search', authentication: true },\n\n // API Key endpoints\n 'GET /admin/api-keys/api/keys': { description: 'List all API keys', category: 'API Keys', authentication: true },\n 'POST /admin/api-keys/api/keys': { description: 'Create a new API key', category: 'API Keys', authentication: true },\n 'DELETE /admin/api-keys/api/keys/:id': { description: 'Revoke an API key', category: 'API Keys', authentication: true },\n 'PUT /admin/api-keys/api/keys/:id': { description: 'Update an API key', category: 'API Keys', authentication: true },\n\n // Cache endpoints\n 'GET /admin/cache/api/stats': { description: 'Get cache statistics', category: 'Cache', authentication: true },\n 'POST /admin/cache/api/purge': { description: 'Purge cache entries', category: 'Cache', authentication: true },\n 'GET /admin/cache/api/entries': { description: 'List cache entries', category: 'Cache', authentication: true },\n 'DELETE /admin/cache/api/entries/:key': { description: 'Delete a specific cache entry', category: 'Cache', authentication: true },\n\n // Workflow endpoints\n 'GET /workflow/status/:id': { description: 'Get workflow status for a content item', category: 'Workflow', authentication: true },\n 'POST /workflow/submit/:id': { description: 'Submit content for review', category: 'Workflow', authentication: true },\n 'POST /workflow/approve/:id': { description: 'Approve content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/reject/:id': { description: 'Reject content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/publish/:id': { description: 'Publish approved content', category: 'Workflow', authentication: true },\n 'POST /workflow/unpublish/:id': { description: 'Unpublish content', category: 'Workflow', authentication: true },\n 'GET /workflow/history/:id': { description: 'Get workflow history for a content item', category: 'Workflow', authentication: true },\n\n // Form endpoints (public)\n 'POST /forms/:formId/submit': { description: 'Submit a form (public endpoint)', category: 'Forms', authentication: false },\n 'GET /forms/:formId': { description: 'Get form definition for rendering', category: 'Forms', authentication: false },\n 'POST /api/forms/:formId/submit': { description: 'Submit a form via API', category: 'Forms', authentication: false },\n 'GET /api/forms/:formId': { description: 'Get form definition via API', category: 'Forms', authentication: false },\n\n // System endpoints\n 'GET /health': { description: 'Health check endpoint for monitoring', category: 'System', authentication: false },\n 'GET /api/health': { description: 'API health check with schema information', category: 'System', authentication: false },\n 'GET /api': { description: 'API root - returns API information and available endpoints', category: 'System', authentication: false },\n 'GET /api/system/info': { description: 'Get system information and version', category: 'System', authentication: false },\n 'GET /api/system/schema': { description: 'Get database schema information', category: 'System', authentication: false },\n\n // File serving\n 'GET /files/*': { description: 'Serve files from R2 storage (public access)', category: 'Files', authentication: false },\n\n // Database tools\n 'POST /admin/database-tools/api/query': { description: 'Execute a database query', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables': { description: 'List database tables', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables/:name': { description: 'Get table schema and sample data', category: 'Admin', authentication: true },\n\n // Seed data\n 'POST /admin/seed-data/api/generate': { description: 'Generate seed data for development', category: 'Admin', authentication: true },\n 'GET /admin/seed-data/api/status': { description: 'Get seed data generation status', category: 'Admin', authentication: true },\n\n // Email plugin\n 'POST /admin/plugins/email/api/send': { description: 'Send an email', category: 'Admin', authentication: true },\n 'GET /admin/plugins/email/api/templates': { description: 'List email templates', category: 'Admin', authentication: true },\n 'POST /admin/plugins/email/api/test': { description: 'Send a test email', category: 'Admin', authentication: true },\n}\n\n// ============================================================================\n// Whitelist Patterns for API routes\n// ============================================================================\n\nconst INCLUDED_ROUTE_PATTERNS: RegExp[] = [\n /^\\/api\\//, // All /api/* routes\n /^\\/api$/, // API root\n /^\\/auth\\/(?!login$|register$)/, // Auth routes except GET login/register HTML pages\n /^\\/auth\\/login$/, // POST /auth/login (method filtered later)\n /^\\/auth\\/register$/, // POST /auth/register (method filtered later)\n /^\\/admin\\/api\\//, // Admin API endpoints\n /^\\/admin\\/api-keys\\/api\\//, // API key management\n /^\\/admin\\/cache\\/api\\//, // Cache management API\n /^\\/admin\\/plugins\\/.*\\/api\\//, // Plugin API endpoints\n /^\\/admin\\/database-tools\\/api\\//, // Database tools API\n /^\\/admin\\/seed-data\\/api\\//, // Seed data API\n /^\\/workflow\\//, // Workflow endpoints\n /^\\/health$/, // Health check\n /^\\/files\\//, // File serving\n /^\\/forms\\//, // Public form endpoints\n]\n\n// Routes to always exclude (even if they match an include pattern)\nconst EXCLUDED_ROUTES = new Set([\n 'GET /auth/login',\n 'GET /auth/register',\n 'GET /auth/login/form',\n])\n\n// ============================================================================\n// Route Discovery\n// ============================================================================\n\nlet cachedRouteList: RouteMetadata[] | null = null\n\nfunction isIncludedRoute(method: string, path: string): boolean {\n // Check exclusions first\n const key = `${method} ${path}`\n if (EXCLUDED_ROUTES.has(key)) {\n return false\n }\n\n // Check if the path matches any include pattern\n return INCLUDED_ROUTE_PATTERNS.some(pattern => pattern.test(path))\n}\n\nfunction inferCategory(path: string): string {\n if (path.startsWith('/auth/')) return 'Auth'\n if (path.startsWith('/api/search')) return 'Search'\n if (path.startsWith('/api/media')) return 'Media'\n if (path.startsWith('/api/system')) return 'System'\n if (path.startsWith('/api/content') || path.startsWith('/api/collections')) return 'Content'\n if (path.startsWith('/api/forms')) return 'Forms'\n if (path.startsWith('/admin/api-keys')) return 'API Keys'\n if (path.startsWith('/admin/cache')) return 'Cache'\n if (path.startsWith('/admin/plugins/ai-search')) return 'Search'\n if (path.startsWith('/admin/api')) return 'Admin'\n if (path.startsWith('/admin/database-tools')) return 'Admin'\n if (path.startsWith('/admin/seed-data')) return 'Admin'\n if (path.startsWith('/admin/plugins/email')) return 'Admin'\n if (path.startsWith('/workflow/')) return 'Workflow'\n if (path.startsWith('/forms/')) return 'Forms'\n if (path.startsWith('/files/')) return 'Files'\n if (path === '/health' || path.startsWith('/api')) return 'System'\n return 'Other'\n}\n\nfunction inferAuth(path: string): boolean | 'unknown' {\n // Known public routes\n if (path === '/health' || path === '/api' || path === '/api/health') return false\n if (path === '/api/system/info' || path === '/api/system/schema') return false\n if (path.startsWith('/files/')) return false\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/')) return false\n\n // Admin routes require auth\n if (path.startsWith('/admin/')) return true\n if (path.startsWith('/workflow/')) return true\n\n return 'unknown'\n}\n\nexport function buildRouteList(app: any): RouteMetadata[] {\n if (cachedRouteList) return cachedRouteList\n\n if (!app) return []\n\n try {\n const routes = inspectRoutes(app as any)\n\n // Deduplicate and filter\n const seen = new Set()\n const result: RouteMetadata[] = []\n\n for (const route of routes) {\n // Skip middleware entries\n if (route.isMiddleware) continue\n // Skip ALL method (middleware-like catch-all)\n if (route.method === 'ALL') continue\n\n const key = `${route.method} ${route.path}`\n\n // Skip duplicates\n if (seen.has(key)) continue\n seen.add(key)\n\n // Apply whitelist filter\n if (!isIncludedRoute(route.method, route.path)) continue\n\n // Look up metadata\n const meta = ROUTE_METADATA[key]\n\n if (meta) {\n result.push({\n method: route.method,\n path: route.path,\n description: meta.description,\n authentication: meta.authentication,\n category: meta.category,\n documented: true\n })\n } else {\n // Auto-discovered: infer category and auth\n result.push({\n method: route.method,\n path: route.path,\n description: '',\n authentication: inferAuth(route.path),\n category: inferCategory(route.path),\n documented: false\n })\n }\n }\n\n // Sort: by category, then method order, then path\n const methodOrder: Record = { GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4 }\n result.sort((a, b) => {\n const catCmp = a.category.localeCompare(b.category)\n if (catCmp !== 0) return catCmp\n const methCmp = (methodOrder[a.method] ?? 5) - (methodOrder[b.method] ?? 5)\n if (methCmp !== 0) return methCmp\n return a.path.localeCompare(b.path)\n })\n\n cachedRouteList = result\n return result\n } catch (error) {\n console.error('Failed to inspect routes:', error)\n return []\n }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-LPYFMGAK.cjs.map b/packages/core/dist/chunk-LPYFMGAK.cjs.map deleted file mode 100644 index 248db48c6..000000000 --- a/packages/core/dist/chunk-LPYFMGAK.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/schemas/index.ts","../src/routes/api-content-access-policy.ts","../src/plugins/core-plugins/global-variables-plugin/variable-resolver.ts","../src/routes/api-content-crud.ts","../src/routes/api.ts","../src/routes/api-media.ts","../src/routes/api-system.ts","../src/routes/admin-api.ts","../src/templates/pages/auth-login.template.ts","../src/templates/pages/auth-register.template.ts","../src/services/auth-validation.ts","../src/plugins/core-plugins/user-profiles/user-profile-registry.ts","../src/plugins/core-plugins/user-profiles/user-profile-service.ts","../src/templates/components/drag-sortable.template.ts","../src/templates/components/dynamic-field.template.ts","../src/plugins/core-plugins/user-profiles/user-profile-renderer.ts","../src/plugins/core-plugins/user-profiles/index.ts","../src/routes/auth.ts","../src/routes/test-cleanup.ts","../src/middleware/plugin-middleware.ts","../src/templates/components/version-history.template.ts","../src/plugins/available/easy-mdx/index.ts","../src/plugins/available/tinymce-plugin/index.ts","../src/plugins/core-plugins/quill-editor/index.ts","../src/templates/pages/admin-content-form.template.ts","../src/templates/pages/admin-content-list.template.ts","../src/routes/admin-content-field-types.ts","../src/routes/admin-content.ts","../src/templates/pages/admin-profile.template.ts","../src/templates/components/alert.template.ts","../src/templates/pages/admin-activity-logs.template.ts","../src/templates/pages/admin-user-edit.template.ts","../src/templates/components/confirmation-dialog.template.ts","../src/templates/pages/admin-user-new.template.ts","../src/templates/pages/admin-users-list.template.ts","../src/routes/admin-users.ts","../src/templates/components/media-grid.template.ts","../src/templates/pages/admin-media-library.template.ts","../src/templates/components/media-file-details.template.ts","../src/routes/admin-media.ts","../src/templates/pages/admin-plugins-list.template.ts","../src/templates/components/auth-settings-form.template.ts","../src/templates/pages/admin-plugin-settings.template.ts","../src/routes/admin-plugins.ts","../src/templates/pages/admin-logs-list.template.ts","../src/templates/pages/admin-log-details.template.ts","../src/templates/pages/admin-log-config.template.ts","../src/routes/admin-logs.ts","../src/routes/admin-design.ts","../src/routes/admin-checkboxes.ts","../src/templates/pages/admin-testimonials-form.template.ts","../src/routes/admin-testimonials.ts","../src/templates/pages/admin-code-examples-form.template.ts","../src/routes/admin-code-examples.ts","../src/templates/pages/admin-dashboard.template.ts","../src/routes/admin-dashboard.ts","../src/routes/admin-collections-field-types.ts","../src/templates/pages/admin-collections-list.template.ts","../src/templates/components/table.template.ts","../src/templates/pages/admin-collections-form.template.ts","../src/routes/admin-collections.ts","../src/templates/pages/admin-settings.template.ts","../src/routes/admin-settings.ts","../src/templates/pages/admin-forms-list.template.ts","../src/templates/pages/admin-forms-builder.template.ts","../src/templates/pages/admin-forms-create.template.ts","../src/routes/admin-forms.ts","../src/routes/public-forms.ts","../src/templates/pages/admin-api-reference.template.ts","../src/routes/admin-api-reference.ts","../src/routes/index.ts"],"names":["Hono","requireAuth","requireRole","getCacheService","CACHE_CONFIGS","isPluginActive","cors","optionalAuth","QueryFilterBuilder","builder","z","MigrationService","renderAlert","sanitizeInput","raw","escapeHtml","checked","PluginBuilder","generateCsrfToken","getJwtExpirySecondsFromDb","setCookie","error","rateLimit","AuthManager","getCookie","getJwtRefreshGraceSecondsFromDb","html","passwordHash","c","init_admin_layout_catalyst_template","renderConfirmationDialog","getConfirmationDialogScript","renderAdminLayoutCatalyst","renderTable","renderPagination","getBlocksFieldConfig","parseBlocksValue","db","collection","formData","PluginService","tinymcePlugin","sanitizeRichText","renderAdminLayout","logActivity","fileValidationSchema","getImageDimensions","getJPEGDimensions","getPNGDimensions","PLUGIN_REGISTRY","SettingsService","findPluginByCodeName","adminLayoutV2","getLogger","renderDesignPage","renderCheckboxPage","renderTestimonialsList","renderCodeExamplesList","getCoreVersion","metricsTracker","renderForm","tinymceActive","quillActive","mdxeditorActive","result","TurnstileService","createContentFromSubmission","CATEGORY_INFO","VERSION","router","app","getAppInstance","buildRouteList"],"mappings":";;;;;;;;;;;;;;;;;;;AAYO,IAAM,oBAAwC,EAAC;;;ACVtD,SAAS,wBAAwB,QAAA,EAA4B;AAC3D,EAAA,OAAO,QAAA,KAAa,WAAW,QAAA,KAAa,QAAA;AAC9C;AAEA,SAAS,kBAAkB,SAAA,EAAqC;AAC9D,EAAA,OAAO,UAAU,KAAA,KAAU,QAAA;AAC7B;AAEA,SAAS,sBAAsB,KAAA,EAA8C;AAC3E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,MAAM,GAAA,EAAK,MAAA,CAAO,eAAa,CAAC,iBAAA,CAAkB,SAAS,CAAC,CAAA;AACxE,EAAA,MAAM,EAAA,GAAK,MAAM,EAAA,EAAI,MAAA,CAAO,eAAa,CAAC,iBAAA,CAAkB,SAAS,CAAC,CAAA;AAEtE,EAAA,MAAM,kBAA+B,EAAC;AAEtC,EAAA,IAAI,GAAA,IAAO,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG;AACzB,IAAA,eAAA,CAAgB,GAAA,GAAM,GAAA;AAAA,EACxB;AAEA,EAAA,IAAI,EAAA,IAAM,EAAA,CAAG,MAAA,GAAS,CAAA,EAAG;AACvB,IAAA,eAAA,CAAgB,EAAA,GAAK,EAAA;AAAA,EACvB;AAEA,EAAA,OAAO,eAAA;AACT;AAEO,SAAS,4BAAA,CAA6B,QAAqB,QAAA,EAAgC;AAChG,EAAA,IAAI,uBAAA,CAAwB,QAAQ,CAAA,EAAG;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAA,GAAgC;AAAA,IACpC,GAAG,MAAA;AAAA,IACH,KAAA,EAAO,qBAAA,CAAsB,MAAA,CAAO,KAAK;AAAA,GAC3C;AAEA,EAAA,IAAI,CAAC,iBAAiB,KAAA,EAAO;AAC3B,IAAA,gBAAA,CAAiB,KAAA,GAAQ,EAAE,GAAA,EAAK,EAAC,EAAE;AAAA,EACrC;AAEA,EAAA,IAAI,CAAC,gBAAA,CAAiB,KAAA,CAAM,GAAA,EAAK;AAC/B,IAAA,gBAAA,CAAiB,KAAA,CAAM,MAAM,EAAC;AAAA,EAChC;AAEA,EAAA,gBAAA,CAAiB,KAAA,CAAM,IAAI,IAAA,CAAK;AAAA,IAC9B,KAAA,EAAO,QAAA;AAAA,IACP,QAAA,EAAU,QAAA;AAAA,IACV,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,OAAO,gBAAA;AACT;;;AC7CA,IAAM,aAAA,GAAgB,mBAAA;AAMf,SAAS,gBAAA,CACd,MACA,SAAA,EACQ;AACR,EAAA,IAAI,CAAC,IAAA,IAAQ,SAAA,CAAU,IAAA,KAAS,GAAG,OAAO,IAAA;AAE1C,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,CAAC,OAAO,GAAA,KAAQ;AACjD,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,OAAO,KAAA,KAAU,SAAY,KAAA,GAAQ,KAAA;AAAA,EACvC,CAAC,CAAA;AACH;AAMO,SAAS,wBAAA,CACd,KACA,SAAA,EACK;AACL,EAAA,IAAI,CAAC,GAAA,IAAO,SAAA,CAAU,IAAA,KAAS,GAAG,OAAO,GAAA;AAEzC,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,gBAAA,CAAiB,KAAK,SAAS,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,IAAI,GAAA,CAAI,CAAC,SAAS,wBAAA,CAAyB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,EACpE;AAEA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,SAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,wBAAA,CAAyB,KAAA,EAAO,SAAS,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,GAAA;AACT;AAMA,IAAI,aAAA,GAA4C,IAAA;AAChD,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAM,YAAA,GAAe,GAAA;AAEd,SAAS,kBAAA,GAAiD;AAC/D,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,IAAI,aAAA,IAAkB,GAAA,GAAM,cAAA,GAAkB,YAAA,EAAc;AAC1D,IAAA,OAAO,aAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,kBAAkB,GAAA,EAAgC;AAChE,EAAA,aAAA,GAAgB,GAAA;AAChB,EAAA,cAAA,GAAiB,KAAK,GAAA,EAAI;AAC5B;AAYA,eAAsB,uBAAA,CACpB,aACA,EAAA,EACc;AACd,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,WAAA,EAAa,OAAO,WAAA;AAEhC,EAAA,IAAI;AAEF,IAAA,IAAI,YAAY,kBAAA,EAAmB;AAEnC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,EAAA,CAAG,OAAA;AAAA,QAC3B;AAAA,QACA,GAAA,EAAI;AAEN,MAAA,SAAA,uBAAgB,GAAA,EAAoB;AACpC,MAAA,KAAA,MAAW,GAAA,IAAO,OAAA,IAAW,EAAC,EAAG;AAC/B,QAAA,SAAA,CAAU,GAAA,CAAK,GAAA,CAAY,GAAA,EAAM,GAAA,CAAY,KAAK,CAAA;AAAA,MACpD;AACA,MAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,CAAA,EAAG,OAAO,WAAA;AAEjC,IAAA,OAAO,wBAAA,CAAyB,aAAa,SAAS,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,WAAA;AAAA,EACT;AACF;;;AChHA,IAAM,oBAAA,GAAuB,IAAIA,SAAA,EAAmD;AAKpF,oBAAA,CAAqB,GAAA,CAAI,aAAA,EAAe,OAAO,CAAA,KAAM;AACnD,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,YAAA,GAAe,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,cAAc,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AAEzC,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,IAAA,EAAM;AAC1B,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oCAAA,IAAwC,GAAG,CAAA;AAAA,IACpE;AAGA,IAAA,IAAI,KAAA,GAAQ,6DAAA;AACZ,IAAA,MAAM,MAAA,GAAmB,CAAC,YAAA,EAAc,IAAI,CAAA;AAE5C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,IAAS,cAAA;AACT,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,IACvB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,OAAA,CAAQ,KAAK,EAAE,IAAA,CAAK,GAAG,MAAM,CAAA,CAAE,KAAA,EAAM;AAE/D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,SAAA,EAAW,KAAA;AAAA,QACX,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACnC,SAAS,KAAA,EAAgB;AACvB,IAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,mCAAA;AAAA,MACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,oBAAA,CAAqB,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA,KAAM;AAC5C,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAEjB,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,oCAAoC,CAAA;AAC5D,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAE1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,kBAAA,GAAqB;AAAA,MACzB,IAAK,OAAA,CAAgB,EAAA;AAAA,MACrB,OAAQ,OAAA,CAAgB,KAAA;AAAA,MACxB,MAAO,OAAA,CAAgB,IAAA;AAAA,MACvB,QAAS,OAAA,CAAgB,MAAA;AAAA,MACzB,cAAe,OAAA,CAAgB,aAAA;AAAA,MAC/B,IAAA,EAAO,QAAgB,IAAA,GAAO,IAAA,CAAK,MAAO,OAAA,CAAgB,IAAI,IAAI,EAAC;AAAA,MACnE,YAAa,OAAA,CAAgB,UAAA;AAAA,MAC7B,YAAa,OAAA,CAAgB;AAAA,KAC/B;AAGA,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,mBAAmB,CAAA,KAAM,OAAA;AACzD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,kBAAA,CAAmB,IAAA,GAAO,MAAM,uBAAA,CAAwB,kBAAA,CAAmB,MAAM,EAAE,CAAA;AAAA,IACrF;AAEA,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,IAAA,EAAM,oBAAoB,CAAA;AAAA,EAC5C,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,yBAAA;AAAA,MACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,oBAAA,CAAqB,IAAA,CAAK,GAAA,EAAKC,6BAAA,EAAY,EAAGC,6BAAA,CAAY,CAAC,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAC,CAAA,EAAG,OAAO,CAAA,KAAM;AACrG,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAE9B,IAAA,MAAM,EAAE,YAAA,EAAc,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,MAAK,GAAI,IAAA;AAGpD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,0BAAA,IAA8B,GAAG,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,IACnD;AAGA,IAAA,IAAI,YAAY,IAAA,IAAQ,KAAA;AACxB,IAAA,SAAA,GAAY,SAAA,CAAU,WAAA,EAAY,CAC/B,OAAA,CAAQ,iBAAiB,EAAE,CAAA,CAC3B,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,KAAA,EAAO,GAAG,EAClB,IAAA,EAAK;AAGR,IAAA,MAAM,iBAAiB,EAAA,CAAG,OAAA;AAAA,MACxB;AAAA,KACF;AACA,IAAA,MAAM,WAAW,MAAM,cAAA,CAAe,KAAK,YAAA,EAAc,SAAS,EAAE,KAAA,EAAM;AAE1E,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,iEAAA,IAAqE,GAAG,CAAA;AAAA,IACjG;AAGA,IAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAW;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,UAAA,GAAa,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAM7B,CAAA;AAED,IAAA,MAAM,UAAA,CAAW,IAAA;AAAA,MACf,SAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,CAAK,SAAA,CAAU,IAAA,IAAQ,EAAE,CAAA;AAAA,MACzB,MAAA,IAAU,OAAA;AAAA,MACV,MAAM,MAAA,IAAU,QAAA;AAAA,MAChB,GAAA;AAAA,MACA;AAAA,MACA,GAAA,EAAI;AAGN,IAAA,MAAM,KAAA,GAAQC,iCAAA,CAAgBC,+BAAA,CAAc,GAAI,CAAA;AAChD,IAAA,MAAM,KAAA,CAAM,UAAA,CAAW,CAAA,aAAA,EAAgB,YAAY,CAAA,EAAA,CAAI,CAAA;AACvD,IAAA,MAAM,KAAA,CAAM,WAAW,oBAAoB,CAAA;AAG3C,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,oCAAoC,CAAA;AAC/D,IAAA,MAAM,iBAAiB,MAAM,OAAA,CAAQ,IAAA,CAAK,SAAS,EAAE,KAAA,EAAM;AAE3D,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM;AAAA,QACJ,IAAI,cAAA,CAAe,EAAA;AAAA,QACnB,OAAO,cAAA,CAAe,KAAA;AAAA,QACtB,MAAM,cAAA,CAAe,IAAA;AAAA,QACrB,QAAQ,cAAA,CAAe,MAAA;AAAA,QACvB,cAAc,cAAA,CAAe,aAAA;AAAA,QAC7B,IAAA,EAAM,eAAe,IAAA,GAAO,IAAA,CAAK,MAAM,cAAA,CAAe,IAAI,IAAI,EAAC;AAAA,QAC/D,YAAY,cAAA,CAAe,UAAA;AAAA,QAC3B,YAAY,cAAA,CAAe;AAAA;AAC7B,OACC,GAAG,CAAA;AAAA,EACR,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,0BAAA;AAAA,MACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,oBAAA,CAAqB,GAAA,CAAI,MAAA,EAAQH,6BAAA,EAAY,EAAGC,6BAAA,CAAY,CAAC,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAC,CAAA,EAAG,OAAO,CAAA,KAAM;AACvG,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAG9B,IAAA,MAAM,YAAA,GAAe,EAAA,CAAG,OAAA,CAAQ,oCAAoC,CAAA;AACpE,IAAA,MAAM,WAAW,MAAM,YAAA,CAAa,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAEnD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,IAAA,CAAK,UAAU,KAAA,CAAA,EAAW;AAC5B,MAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,IACxB;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,KAAA,CAAA,EAAW;AAC3B,MAAA,IAAI,YAAY,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY,CACnC,QAAQ,eAAA,EAAiB,EAAE,CAAA,CAC3B,OAAA,CAAQ,QAAQ,GAAG,CAAA,CACnB,QAAQ,KAAA,EAAO,GAAG,EAClB,IAAA,EAAK;AACR,MAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AACvB,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,IAAA,CAAK,WAAW,KAAA,CAAA,EAAW;AAC7B,MAAA,OAAA,CAAQ,KAAK,YAAY,CAAA;AACzB,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IACzB;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,KAAA,CAAA,EAAW;AAC3B,MAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACvC;AAGA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,IAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAGf,IAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAGd,IAAA,MAAM,UAAA,GAAa,GAAG,OAAA,CAAQ;AAAA,yBAAA,EACP,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,IAAA,CAExC,CAAA;AAED,IAAA,MAAM,UAAA,CAAW,IAAA,CAAK,GAAG,MAAM,EAAE,GAAA,EAAI;AAGrC,IAAA,MAAM,KAAA,GAAQC,iCAAA,CAAgBC,+BAAA,CAAc,GAAI,CAAA;AAChD,IAAA,MAAM,MAAM,MAAA,CAAO,KAAA,CAAM,WAAA,CAAY,SAAA,EAAW,EAAE,CAAC,CAAA;AACnD,IAAA,MAAM,KAAA,CAAM,UAAA,CAAW,CAAA,aAAA,EAAgB,QAAA,CAAS,aAAa,CAAA,EAAA,CAAI,CAAA;AACjE,IAAA,MAAM,KAAA,CAAM,WAAW,oBAAoB,CAAA;AAG3C,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,oCAAoC,CAAA;AAC/D,IAAA,MAAM,iBAAiB,MAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAEpD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM;AAAA,QACJ,IAAI,cAAA,CAAe,EAAA;AAAA,QACnB,OAAO,cAAA,CAAe,KAAA;AAAA,QACtB,MAAM,cAAA,CAAe,IAAA;AAAA,QACrB,QAAQ,cAAA,CAAe,MAAA;AAAA,QACvB,cAAc,cAAA,CAAe,aAAA;AAAA,QAC7B,IAAA,EAAM,eAAe,IAAA,GAAO,IAAA,CAAK,MAAM,cAAA,CAAe,IAAI,IAAI,EAAC;AAAA,QAC/D,YAAY,cAAA,CAAe,UAAA;AAAA,QAC3B,YAAY,cAAA,CAAe;AAAA;AAC7B,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,0BAAA;AAAA,MACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,oBAAA,CAAqB,MAAA,CAAO,MAAA,EAAQH,6BAAA,EAAY,EAAGC,6BAAA,CAAY,CAAC,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAC,CAAA,EAAG,OAAO,CAAA,KAAM;AAC1G,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,MAAM,YAAA,GAAe,EAAA,CAAG,OAAA,CAAQ,gDAAgD,CAAA;AAChF,IAAA,MAAM,WAAW,MAAM,YAAA,CAAa,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAEnD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,UAAA,GAAa,EAAA,CAAG,OAAA,CAAQ,kCAAkC,CAAA;AAChE,IAAA,MAAM,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,CAAE,GAAA,EAAI;AAG9B,IAAA,MAAM,KAAA,GAAQC,iCAAA,CAAgBC,+BAAA,CAAc,GAAI,CAAA;AAChD,IAAA,MAAM,MAAM,MAAA,CAAO,KAAA,CAAM,WAAA,CAAY,SAAA,EAAW,EAAE,CAAC,CAAA;AACnD,IAAA,MAAM,KAAA,CAAM,UAAA,CAAW,CAAA,aAAA,EAAgB,QAAA,CAAS,aAAa,CAAA,EAAA,CAAI,CAAA;AACjE,IAAA,MAAM,KAAA,CAAM,WAAW,oBAAoB,CAAA;AAE3C,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EACjC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,0BAAA;AAAA,MACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAED,IAAO,wBAAA,GAAQ;;;ACjSf,IAAM,SAAA,GAAY,IAAIJ,SAAAA,EAAmD;AAGzE,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAA,KAAS;AACpC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,CAAA,CAAE,GAAA,CAAI,aAAa,SAAS,CAAA;AAC5B,EAAA,MAAM,IAAA,EAAK;AACX,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC/B,EAAA,CAAA,CAAE,MAAA,CAAO,iBAAA,EAAmB,CAAA,EAAG,SAAS,CAAA,EAAA,CAAI,CAAA;AAC9C,CAAC,CAAA;AAGD,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAA,KAAS;AACpC,EAAA,MAAM,eAAe,MAAMK,gCAAA,CAAe,CAAA,CAAE,GAAA,CAAI,IAAI,YAAY,CAAA;AAChE,EAAA,CAAA,CAAE,GAAA,CAAI,gBAAgB,YAAY,CAAA;AAClC,EAAA,MAAM,IAAA,EAAK;AACb,CAAC,CAAA;AAGD,SAAA,CAAU,GAAA,CAAI,KAAKC,SAAA,CAAK;AAAA,EACtB,MAAA,EAAQ,CAAC,MAAA,EAAQ,CAAA,KAAM;AACrB,IAAA,MAAM,OAAA,GAAW,EAAE,GAAA,EAAa,YAAA;AAChC,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,IAAA;AAAA,EAC1C,CAAA;AAAA,EACA,cAAc,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,UAAU,SAAS,CAAA;AAAA,EACxD,YAAA,EAAc,CAAC,cAAA,EAAgB,eAAA,EAAiB,WAAW;AAC7D,CAAC,CAAC,CAAA;AAGF,SAAS,aAAA,CAAc,CAAA,EAAQ,IAAA,GAAY,IAAI,kBAAA,EAA6B;AAC1E,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,EAAI,GAAI,CAAA,CAAE,IAAI,WAAW,CAAA;AAChD,EAAA,MAAM,aAAA,GAAgB,kBAAA,GAAqB,IAAA,CAAK,GAAA,KAAQ,kBAAA,GAAqB,MAAA;AAE7E,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,SAAA,EAAW,aAAA;AAAA,MACX,IAAA,EAAM;AAAA;AACR,GACF;AACF;AAGA,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA,KAAM;AACxB,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AACjC,EAAA,MAAM,YAAY,CAAA,EAAG,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK,QAAQ,IAAI,CAAA,CAAA;AAEtD,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,gBAAA;AAAA,MACP,OAAA,EAAS,OAAA;AAAA,MACT,WAAA,EAAa,mHAAA;AAAA,MACb,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,iBAAA;AAAA,QACN,GAAA,EAAK,GAAG,SAAS,CAAA,KAAA,CAAA;AAAA,QACjB,KAAA,EAAO;AAAA,OACT;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,KAAA;AAAA,QACN,GAAA,EAAK;AAAA;AACP,KACF;AAAA,IACA,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,SAAA;AAAA,QACL,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP,GAAA,EAAK;AAAA,UACH,OAAA,EAAS,iBAAA;AAAA,UACT,WAAA,EAAa,mDAAA;AAAA,UACb,WAAA,EAAa,YAAA;AAAA,UACb,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,UACf,SAAA,EAAW;AAAA,YACT,KAAA,EAAO;AAAA,cACL,WAAA,EAAa,uBAAA;AAAA,cACb,OAAA,EAAS;AAAA,gBACP,kBAAA,EAAoB;AAAA,kBAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS;AAC3B;AACF;AACF;AACF;AACF,OACF;AAAA,MACA,aAAA,EAAe;AAAA,QACb,GAAA,EAAK;AAAA,UACH,OAAA,EAAS,cAAA;AAAA,UACT,WAAA,EAAa,iDAAA;AAAA,UACb,WAAA,EAAa,WAAA;AAAA,UACb,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,UACf,SAAA,EAAW;AAAA,YACT,KAAA,EAAO;AAAA,cACL,WAAA,EAAa,eAAA;AAAA,cACb,OAAA,EAAS;AAAA,gBACP,kBAAA,EAAoB;AAAA,kBAClB,MAAA,EAAQ;AAAA,oBACN,IAAA,EAAM,QAAA;AAAA,oBACN,UAAA,EAAY;AAAA,sBACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,SAAA,EAAU;AAAA,sBAC7C,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,WAAA,EAAY;AAAA,sBACjD,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS;AAAE;AACtD;AACF;AACF;AACF;AACF;AACF;AACF,OACF;AAAA,MACA,kBAAA,EAAoB;AAAA,QAClB,GAAA,EAAK;AAAA,UACH,OAAA,EAAS,kBAAA;AAAA,UACT,WAAA,EAAa,mDAAA;AAAA,UACb,WAAA,EAAa,gBAAA;AAAA,UACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,UAChB,SAAA,EAAW;AAAA,YACT,KAAA,EAAO;AAAA,cACL,WAAA,EAAa,qBAAA;AAAA,cACb,OAAA,EAAS;AAAA,gBACP,kBAAA,EAAoB;AAAA,kBAClB,MAAA,EAAQ;AAAA,oBACN,IAAA,EAAM,QAAA;AAAA,oBACN,UAAA,EAAY;AAAA,sBACV,IAAA,EAAM;AAAA,wBACJ,IAAA,EAAM,OAAA;AAAA,wBACN,KAAA,EAAO;AAAA,0BACL,IAAA,EAAM,QAAA;AAAA,0BACN,UAAA,EAAY;AAAA,4BACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,4BACrB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,4BACvB,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,4BAC/B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,4BACzB,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA;AAAU;AAC/B;AACF,uBACF;AAAA,sBACA,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA;AAAS;AACzB;AACF;AACF;AACF;AACF;AACF;AACF,OACF;AAAA,MACA,uCAAA,EAAyC;AAAA,QACvC,GAAA,EAAK;AAAA,UACH,OAAA,EAAS,wBAAA;AAAA,UACT,WAAA,EAAa,0MAAA;AAAA,UACb,WAAA,EAAa,sBAAA;AAAA,UACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,UAChB,UAAA,EAAY;AAAA,YACV;AAAA,cACE,IAAA,EAAM,YAAA;AAAA,cACN,EAAA,EAAI,MAAA;AAAA,cACJ,QAAA,EAAU,IAAA;AAAA,cACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACzB,WAAA,EAAa;AAAA,aACf;AAAA,YACA;AAAA,cACE,IAAA,EAAM,OAAA;AAAA,cACN,EAAA,EAAI,OAAA;AAAA,cACJ,QAAQ,EAAE,IAAA,EAAM,WAAW,OAAA,EAAS,EAAA,EAAI,SAAS,GAAA,EAAK;AAAA,cACtD,WAAA,EAAa;AAAA,aACf;AAAA,YACA;AAAA,cACE,IAAA,EAAM,QAAA;AAAA,cACN,EAAA,EAAI,OAAA;AAAA,cACJ,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA,EAAE;AAAA,cACtC,WAAA,EAAa;AAAA,aACf;AAAA,YACA;AAAA,cACE,IAAA,EAAM,QAAA;AAAA,cACN,EAAA,EAAI,OAAA;AAAA,cACJ,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,OAAA,EAAS,WAAA,EAAa,UAAU,CAAA,EAAE;AAAA,cACnE,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,KAAA,EAAO;AAAA,cACL,WAAA,EAAa,uBAAA;AAAA,cACb,OAAA,EAAS;AAAA,gBACP,kBAAA,EAAoB;AAAA,kBAClB,MAAA,EAAQ;AAAA,oBACN,IAAA,EAAM,QAAA;AAAA,oBACN,UAAA,EAAY;AAAA,sBACV,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,sBACjD,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA;AAAS;AACzB;AACF;AACF;AACF,aACF;AAAA,YACA,KAAA,EAAO;AAAA,cACL,WAAA,EAAa;AAAA;AACf;AACF;AACF,OACF;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,GAAA,EAAK;AAAA,UACH,OAAA,EAAS,cAAA;AAAA,UACT,WAAA,EAAa,wLAAA;AAAA,UACb,WAAA,EAAa,YAAA;AAAA,UACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,UAChB,UAAA,EAAY;AAAA,YACV;AAAA,cACE,IAAA,EAAM,YAAA;AAAA,cACN,EAAA,EAAI,OAAA;AAAA,cACJ,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACzB,WAAA,EAAa;AAAA,aACf;AAAA,YACA;AAAA,cACE,IAAA,EAAM,OAAA;AAAA,cACN,EAAA,EAAI,OAAA;AAAA,cACJ,QAAQ,EAAE,IAAA,EAAM,WAAW,OAAA,EAAS,EAAA,EAAI,SAAS,GAAA,EAAK;AAAA,cACtD,WAAA,EAAa;AAAA,aACf;AAAA,YACA;AAAA,cACE,IAAA,EAAM,QAAA;AAAA,cACN,EAAA,EAAI,OAAA;AAAA,cACJ,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA,EAAE;AAAA,cACtC,WAAA,EAAa;AAAA,aACf;AAAA,YACA;AAAA,cACE,IAAA,EAAM,QAAA;AAAA,cACN,EAAA,EAAI,OAAA;AAAA,cACJ,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,OAAA,EAAS,WAAA,EAAa,UAAU,CAAA,EAAE;AAAA,cACnE,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,KAAA,EAAO;AAAA,cACL,WAAA,EAAa,uBAAA;AAAA,cACb,OAAA,EAAS;AAAA,gBACP,kBAAA,EAAoB;AAAA,kBAClB,MAAA,EAAQ;AAAA,oBACN,IAAA,EAAM,QAAA;AAAA,oBACN,UAAA,EAAY;AAAA,sBACV,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,sBACjD,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA;AAAS;AACzB;AACF;AACF;AACF;AACF;AACF,SACF;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,OAAA,EAAS,gBAAA;AAAA,UACT,WAAA,EAAa,4BAAA;AAAA,UACb,WAAA,EAAa,eAAA;AAAA,UACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,UAChB,UAAU,CAAC,EAAE,UAAA,EAAY,IAAI,CAAA;AAAA,UAC7B,WAAA,EAAa;AAAA,YACX,QAAA,EAAU,IAAA;AAAA,YACV,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,QAAA,EAAU,CAAC,eAAA,EAAiB,OAAO,CAAA;AAAA,kBACnC,UAAA,EAAY;AAAA,oBACV,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,oBAChC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,oBACxB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,oBACvB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,OAAA,EAAS,WAAA,EAAa,UAAU,CAAA,EAAE;AAAA,oBACnE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA;AAAS;AACzB;AACF;AACF;AACF,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,KAAA,EAAO,EAAE,WAAA,EAAa,8BAAA,EAA+B;AAAA,YACrD,KAAA,EAAO,EAAE,WAAA,EAAa,sBAAA,EAAuB;AAAA,YAC7C,KAAA,EAAO,EAAE,WAAA,EAAa,cAAA;AAAe;AACvC;AACF,OACF;AAAA,MACA,mBAAA,EAAqB;AAAA,QACnB,GAAA,EAAK;AAAA,UACH,OAAA,EAAS,mBAAA;AAAA,UACT,WAAA,EAAa,uCAAA;AAAA,UACb,WAAA,EAAa,gBAAA;AAAA,UACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,UAChB,UAAA,EAAY;AAAA,YACV;AAAA,cACE,IAAA,EAAM,IAAA;AAAA,cACN,EAAA,EAAI,MAAA;AAAA,cACJ,QAAA,EAAU,IAAA;AAAA,cACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACzB,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,KAAA,EAAO,EAAE,WAAA,EAAa,cAAA,EAAe;AAAA,YACrC,KAAA,EAAO,EAAE,WAAA,EAAa,mBAAA;AAAoB;AAC5C,SACF;AAAA,QACA,GAAA,EAAK;AAAA,UACH,OAAA,EAAS,gBAAA;AAAA,UACT,WAAA,EAAa,kCAAA;AAAA,UACb,WAAA,EAAa,eAAA;AAAA,UACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,UAChB,UAAU,CAAC,EAAE,UAAA,EAAY,IAAI,CAAA;AAAA,UAC7B,UAAA,EAAY;AAAA,YACV;AAAA,cACE,IAAA,EAAM,IAAA;AAAA,cACN,EAAA,EAAI,MAAA;AAAA,cACJ,QAAA,EAAU,IAAA;AAAA,cACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACzB,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,KAAA,EAAO,EAAE,WAAA,EAAa,8BAAA,EAA+B;AAAA,YACrD,KAAA,EAAO,EAAE,WAAA,EAAa,cAAA,EAAe;AAAA,YACrC,KAAA,EAAO,EAAE,WAAA,EAAa,mBAAA;AAAoB;AAC5C,SACF;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,OAAA,EAAS,gBAAA;AAAA,UACT,WAAA,EAAa,wBAAA;AAAA,UACb,WAAA,EAAa,eAAA;AAAA,UACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,UAChB,UAAU,CAAC,EAAE,UAAA,EAAY,IAAI,CAAA;AAAA,UAC7B,UAAA,EAAY;AAAA,YACV;AAAA,cACE,IAAA,EAAM,IAAA;AAAA,cACN,EAAA,EAAI,MAAA;AAAA,cACJ,QAAA,EAAU,IAAA;AAAA,cACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACzB,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,KAAA,EAAO,EAAE,WAAA,EAAa,8BAAA,EAA+B;AAAA,YACrD,KAAA,EAAO,EAAE,WAAA,EAAa,cAAA,EAAe;AAAA,YACrC,KAAA,EAAO,EAAE,WAAA,EAAa,mBAAA;AAAoB;AAC5C;AACF,OACF;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,GAAA,EAAK;AAAA,UACH,OAAA,EAAS,YAAA;AAAA,UACT,WAAA,EAAa,yCAAA;AAAA,UACb,WAAA,EAAa,UAAA;AAAA,UACb,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,UACd,SAAA,EAAW;AAAA,YACT,KAAA,EAAO,EAAE,WAAA,EAAa,qBAAA;AAAsB;AAC9C;AACF,OACF;AAAA,MACA,mBAAA,EAAqB;AAAA,QACnB,IAAA,EAAM;AAAA,UACJ,OAAA,EAAS,cAAA;AAAA,UACT,WAAA,EAAa,wCAAA;AAAA,UACb,WAAA,EAAa,aAAA;AAAA,UACb,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,UACd,UAAU,CAAC,EAAE,UAAA,EAAY,IAAI,CAAA;AAAA,UAC7B,WAAA,EAAa;AAAA,YACX,QAAA,EAAU,IAAA;AAAA,YACV,OAAA,EAAS;AAAA,cACP,qBAAA,EAAuB;AAAA,gBACrB,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,QAAA;AAAS;AAC3C;AACF;AACF;AACF,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,KAAA,EAAO,EAAE,WAAA,EAAa,6BAAA,EAA8B;AAAA,YACpD,KAAA,EAAO,EAAE,WAAA,EAAa,cAAA;AAAe;AACvC;AACF;AACF,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,eAAA,EAAiB;AAAA,QACf,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,MAAA;AAAA,UACN,MAAA,EAAQ,QAAA;AAAA,UACR,YAAA,EAAc;AAAA;AAChB,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,MAAA,EAAO;AAAA,YACrC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACvB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,OAAA,EAAS,WAAA,EAAa,UAAU,CAAA,EAAE;AAAA,YACnE,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,MAAA,EAAO;AAAA,YAC/C,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACvB,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,YAC9B,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA;AAAU;AAChC,SACF;AAAA,QACA,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,MAAA,EAAO;AAAA,YACrC,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACvB,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC/B,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC9B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACzB,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA;AAAU;AAC/B,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,MAAA,EAAO;AAAA,YACrC,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC3B,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC3B,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,YACxB,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA;AAAS;AACxB,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA;AAAS;AAC5B;AACF;AACF,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,6BAAA,EAA8B;AAAA,MAC7D,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,+BAAA,EAAgC;AAAA,MAChE,EAAE,IAAA,EAAM,OAAA,EAAS,WAAA,EAAa,uBAAA;AAAwB;AACxD,GACD,CAAA;AACH,CAAC,CAAA;AAGD,SAAA,CAAU,GAAA,CAAI,SAAA,EAAW,CAAC,CAAA,KAAM;AAC9B,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,OAAA,EAAS,iBAAA,CAAkB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI;AAAA,GAC3C,CAAA;AACH,CAAC,CAAA;AAGD,SAAA,CAAU,GAAA,CAAI,cAAA,EAAgB,OAAO,CAAA,KAAM;AACzC,EAAA,MAAM,cAAA,GAAiB,KAAK,GAAA,EAAI;AAEhC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,YAAA,GAAe,CAAA,CAAE,GAAA,CAAI,cAAc,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQH,iCAAA,CAAgBC,+BAAA,CAAc,GAAI,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,WAAA,CAAY,aAAA,EAAe,KAAK,CAAA;AAGvD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,aAAA,CAAmB,QAAQ,CAAA;AAC3D,MAAA,IAAI,WAAA,CAAY,GAAA,IAAO,WAAA,CAAY,IAAA,EAAM;AAEvC,QAAA,CAAA,CAAE,MAAA,CAAO,kBAAkB,KAAK,CAAA;AAChC,QAAA,CAAA,CAAE,MAAA,CAAO,gBAAA,EAAkB,WAAA,CAAY,MAAM,CAAA;AAC7C,QAAA,IAAI,YAAY,GAAA,EAAK;AACnB,UAAA,CAAA,CAAE,MAAA,CAAO,eAAe,IAAA,CAAK,KAAA,CAAM,YAAY,GAAG,CAAA,CAAE,UAAU,CAAA;AAAA,QAChE;AAGA,QAAA,MAAM,YAAA,GAAe;AAAA,UACnB,GAAG,WAAA,CAAY,IAAA;AAAA,UACf,IAAA,EAAM,cAAc,CAAA,EAAG;AAAA,YACrB,GAAG,YAAY,IAAA,CAAK,IAAA;AAAA,YACpB,KAAA,EAAO;AAAA,cACL,GAAA,EAAK,IAAA;AAAA,cACL,QAAQ,WAAA,CAAY,MAAA;AAAA,cACpB,KAAK,WAAA,CAAY,GAAA,GAAM,KAAK,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA,GAAI,KAAA;AAAA;AACvD,aACC,cAAc;AAAA,SACnB;AAEA,QAAA,OAAO,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,MAC5B;AAAA,IACF;AAGA,IAAA,CAAA,CAAE,MAAA,CAAO,kBAAkB,MAAM,CAAA;AACjC,IAAA,CAAA,CAAE,MAAA,CAAO,kBAAkB,UAAU,CAAA;AAErC,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,iGAAiG,CAAA;AACzH,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAK,GAAA,EAAI;AAGnC,IAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACpD,GAAG,GAAA;AAAA,MACH,MAAA,EAAQ,IAAI,MAAA,GAAS,IAAA,CAAK,MAAM,GAAA,CAAI,MAAM,IAAI,EAAC;AAAA,MAC/C,WAAW,GAAA,CAAI;AAAA;AAAA,KACjB,CAAE,CAAA;AAEF,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,IAAA,EAAM,kBAAA;AAAA,MACN,IAAA,EAAM,cAAc,CAAA,EAAG;AAAA,QACrB,OAAO,OAAA,CAAQ,MAAA;AAAA,QACf,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,KAAA,EAAO;AAAA,UACL,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ;AAAA;AACV,SACC,cAAc;AAAA,KACnB;AAGA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,YAAY,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,6BAAA,IAAiC,GAAG,CAAA;AAAA,EAC7D;AACF,CAAC,CAAA;AAGD,SAAA,CAAU,GAAA,CAAI,UAAA,EAAYG,8BAAA,EAAa,EAAG,OAAO,CAAA,KAAM;AACrD,EAAA,MAAM,cAAA,GAAiB,KAAK,GAAA,EAAI;AAEhC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,GAAA,CAAI,KAAA,EAAM;AAGhC,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,MAAM,iBAAiB,WAAA,CAAY,UAAA;AACnC,MAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,OAAA,CAAQ,6DAA6D,CAAA;AAC/F,MAAA,MAAM,mBAAmB,MAAM,cAAA,CAAe,IAAA,CAAK,cAAc,EAAE,KAAA,EAAM;AAEzE,MAAA,IAAI,gBAAA,EAAkB;AAEpB,QAAA,WAAA,CAAY,gBAAiB,gBAAA,CAAyB,EAAA;AACtD,QAAA,OAAO,WAAA,CAAY,UAAA;AAAA,MACrB,CAAA,MAAO;AAEL,QAAA,OAAO,EAAE,IAAA,CAAK;AAAA,UACZ,MAAM,EAAC;AAAA,UACP,IAAA,EAAM,cAAc,CAAA,EAAG;AAAA,YACrB,KAAA,EAAO,CAAA;AAAA,YACP,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,OAAA,EAAS,eAAe,cAAc,CAAA,WAAA;AAAA,aACrC,cAAc;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAsBC,oCAAA,CAAmB,cAAA,CAAe,WAAW,CAAA;AACzE,IAAA,MAAM,mBAAmB,4BAAA,CAA6B,MAAA,EAAQ,EAAE,GAAA,CAAI,MAAM,GAAG,IAAI,CAAA;AAGjF,IAAA,IAAI,CAAC,iBAAiB,KAAA,EAAO;AAC3B,MAAA,gBAAA,CAAiB,KAAA,GAAQ,EAAA;AAAA,IAC3B;AACA,IAAA,gBAAA,CAAiB,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,gBAAA,CAAiB,OAAO,GAAI,CAAA;AAG9D,IAAA,MAAMC,QAAAA,GAAU,IAAID,oCAAA,EAAmB;AACvC,IAAA,MAAM,WAAA,GAAcC,QAAAA,CAAQ,KAAA,CAAM,SAAA,EAAW,gBAAgB,CAAA;AAG7D,IAAA,IAAI,WAAA,CAAY,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO,2BAAA;AAAA,QACP,SAAS,WAAA,CAAY;AAAA,SACpB,GAAG,CAAA;AAAA,IACR;AAGA,IAAA,MAAM,YAAA,GAAe,CAAA,CAAE,GAAA,CAAI,cAAc,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQN,iCAAA,CAAgBC,+BAAA,CAAc,GAAI,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,WAAA,CAAY,kBAAA,EAAoB,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,gBAAA,EAAkB,KAAA,EAAO,WAAA,CAAY,GAAA,EAAK,CAAC,CAAA;AAE3H,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,aAAA,CAAmB,QAAQ,CAAA;AAC3D,MAAA,IAAI,WAAA,CAAY,GAAA,IAAO,WAAA,CAAY,IAAA,EAAM;AAEvC,QAAA,CAAA,CAAE,MAAA,CAAO,kBAAkB,KAAK,CAAA;AAChC,QAAA,CAAA,CAAE,MAAA,CAAO,gBAAA,EAAkB,WAAA,CAAY,MAAM,CAAA;AAC7C,QAAA,IAAI,YAAY,GAAA,EAAK;AACnB,UAAA,CAAA,CAAE,MAAA,CAAO,eAAe,IAAA,CAAK,KAAA,CAAM,YAAY,GAAG,CAAA,CAAE,UAAU,CAAA;AAAA,QAChE;AAGA,QAAA,MAAM,YAAA,GAAe;AAAA,UACnB,GAAG,WAAA,CAAY,IAAA;AAAA,UACf,IAAA,EAAM,cAAc,CAAA,EAAG;AAAA,YACrB,GAAG,YAAY,IAAA,CAAK,IAAA;AAAA,YACpB,KAAA,EAAO;AAAA,cACL,GAAA,EAAK,IAAA;AAAA,cACL,QAAQ,WAAA,CAAY,MAAA;AAAA,cACpB,KAAK,WAAA,CAAY,GAAA,GAAM,KAAK,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA,GAAI,KAAA;AAAA;AACvD,aACC,cAAc;AAAA,SACnB;AAEA,QAAA,OAAO,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,MAC5B;AAAA,IACF;AAGA,IAAA,CAAA,CAAE,MAAA,CAAO,kBAAkB,MAAM,CAAA;AACjC,IAAA,CAAA,CAAE,MAAA,CAAO,kBAAkB,UAAU,CAAA;AAGrC,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAA;AACvC,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,MAAA,CAAO,MAAA,GAAS,CAAA,GAC1C,KAAK,IAAA,CAAK,GAAG,WAAA,CAAY,MAAM,CAAA,GAC/B,IAAA;AAEJ,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,UAAU,GAAA,EAAI;AAGxC,IAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACpD,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,cAAc,GAAA,CAAI,aAAA;AAAA,MAClB,IAAA,EAAM,IAAI,IAAA,GAAO,IAAA,CAAK,MAAM,GAAA,CAAI,IAAI,IAAI,EAAC;AAAA,MACzC,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,GAAA,CAAI;AAAA,KAClB,CAAE,CAAA;AAEF,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,IAAA,EAAM,kBAAA;AAAA,MACN,IAAA,EAAM,cAAc,CAAA,EAAG;AAAA,QACrB,OAAO,OAAA,CAAQ,MAAA;AAAA,QACf,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,MAAA,EAAQ,gBAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ;AAAA;AACV,SACC,cAAc;AAAA,KACnB;AAGA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,YAAY,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,yBAAA;AAAA,MACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,SAAA,CAAU,GAAA,CAAI,kCAAA,EAAoCG,8BAAA,EAAa,EAAG,OAAO,CAAA,KAAM;AAC7E,EAAA,MAAM,cAAA,GAAiB,KAAK,GAAA,EAAI;AAEhC,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,YAAY,CAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,GAAA,CAAI,KAAA,EAAM;AAGhC,IAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,OAAA,CAAQ,4DAA4D,CAAA;AAC9F,IAAA,MAAM,mBAAmB,MAAM,cAAA,CAAe,IAAA,CAAK,UAAU,EAAE,KAAA,EAAM;AAErE,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,IACtD;AAGA,IAAA,MAAM,MAAA,GAAsBC,oCAAA,CAAmB,cAAA,CAAe,WAAW,CAAA;AACzE,IAAA,MAAM,mBAAmB,4BAAA,CAA6B,MAAA,EAAQ,EAAE,GAAA,CAAI,MAAM,GAAG,IAAI,CAAA;AAGjF,IAAA,IAAI,CAAC,iBAAiB,KAAA,EAAO;AAC3B,MAAA,gBAAA,CAAiB,KAAA,GAAQ,EAAE,GAAA,EAAK,EAAC,EAAE;AAAA,IACrC;AAEA,IAAA,IAAI,CAAC,gBAAA,CAAiB,KAAA,CAAM,GAAA,EAAK;AAC/B,MAAA,gBAAA,CAAiB,KAAA,CAAM,MAAM,EAAC;AAAA,IAChC;AAGA,IAAA,gBAAA,CAAiB,KAAA,CAAM,IAAI,IAAA,CAAK;AAAA,MAC9B,KAAA,EAAO,eAAA;AAAA,MACP,QAAA,EAAU,QAAA;AAAA,MACV,OAAQ,gBAAA,CAAyB;AAAA,KAClC,CAAA;AAGD,IAAA,IAAI,CAAC,iBAAiB,KAAA,EAAO;AAC3B,MAAA,gBAAA,CAAiB,KAAA,GAAQ,EAAA;AAAA,IAC3B;AACA,IAAA,gBAAA,CAAiB,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,gBAAA,CAAiB,OAAO,GAAI,CAAA;AAG9D,IAAA,MAAMC,QAAAA,GAAU,IAAID,oCAAA,EAAmB;AACvC,IAAA,MAAM,WAAA,GAAcC,QAAAA,CAAQ,KAAA,CAAM,SAAA,EAAW,gBAAgB,CAAA;AAG7D,IAAA,IAAI,WAAA,CAAY,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO,2BAAA;AAAA,QACP,SAAS,WAAA,CAAY;AAAA,SACpB,GAAG,CAAA;AAAA,IACR;AAGA,IAAA,MAAM,YAAA,GAAe,CAAA,CAAE,GAAA,CAAI,cAAc,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQN,iCAAA,CAAgBC,+BAAA,CAAc,GAAI,CAAA;AAChD,IAAA,MAAM,WAAW,KAAA,CAAM,WAAA,CAAY,6BAAA,EAA+B,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,EAAE,QAAQ,gBAAA,EAAkB,KAAA,EAAO,YAAY,GAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAGzJ,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,aAAA,CAAmB,QAAQ,CAAA;AAC3D,MAAA,IAAI,WAAA,CAAY,GAAA,IAAO,WAAA,CAAY,IAAA,EAAM;AAEvC,QAAA,CAAA,CAAE,MAAA,CAAO,kBAAkB,KAAK,CAAA;AAChC,QAAA,CAAA,CAAE,MAAA,CAAO,gBAAA,EAAkB,WAAA,CAAY,MAAM,CAAA;AAC7C,QAAA,IAAI,YAAY,GAAA,EAAK;AACnB,UAAA,CAAA,CAAE,MAAA,CAAO,eAAe,IAAA,CAAK,KAAA,CAAM,YAAY,GAAG,CAAA,CAAE,UAAU,CAAA;AAAA,QAChE;AAGA,QAAA,MAAM,YAAA,GAAe;AAAA,UACnB,GAAG,WAAA,CAAY,IAAA;AAAA,UACf,IAAA,EAAM,cAAc,CAAA,EAAG;AAAA,YACrB,GAAG,YAAY,IAAA,CAAK,IAAA;AAAA,YACpB,KAAA,EAAO;AAAA,cACL,GAAA,EAAK,IAAA;AAAA,cACL,QAAQ,WAAA,CAAY,MAAA;AAAA,cACpB,KAAK,WAAA,CAAY,GAAA,GAAM,KAAK,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA,GAAI,KAAA;AAAA;AACvD,aACC,cAAc;AAAA,SACnB;AAEA,QAAA,OAAO,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,MAC5B;AAAA,IACF;AAGA,IAAA,CAAA,CAAE,MAAA,CAAO,kBAAkB,MAAM,CAAA;AACjC,IAAA,CAAA,CAAE,MAAA,CAAO,kBAAkB,UAAU,CAAA;AAGrC,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAA;AACvC,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,MAAA,CAAO,MAAA,GAAS,CAAA,GAC1C,KAAK,IAAA,CAAK,GAAG,WAAA,CAAY,MAAM,CAAA,GAC/B,IAAA;AAEJ,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,UAAU,GAAA,EAAI;AAGxC,IAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACpD,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,cAAc,GAAA,CAAI,aAAA;AAAA,MAClB,IAAA,EAAM,IAAI,IAAA,GAAO,IAAA,CAAK,MAAM,GAAA,CAAI,IAAI,IAAI,EAAC;AAAA,MACzC,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,GAAA,CAAI;AAAA,KAClB,CAAE,CAAA;AAEF,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,IAAA,EAAM,kBAAA;AAAA,MACN,IAAA,EAAM,cAAc,CAAA,EAAG;AAAA,QACrB,UAAA,EAAY;AAAA,UACV,GAAI,gBAAA;AAAA,UACJ,MAAA,EAAS,iBAAyB,MAAA,GAAS,IAAA,CAAK,MAAO,gBAAA,CAAyB,MAAM,IAAI;AAAC,SAC7F;AAAA,QACA,OAAO,OAAA,CAAQ,MAAA;AAAA,QACf,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,MAAA,EAAQ,gBAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ;AAAA;AACV,SACC,cAAc;AAAA,KACnB;AAGA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,YAAY,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,yBAAA;AAAA,MACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,SAAA,CAAU,KAAA,CAAM,YAAY,wBAAoB,CAAA;AAEhD,IAAO,WAAA,GAAQ;AC1zBf,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,MAAA,CAAO,YAAW,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AAC9D;AAGA,eAAe,SAAA,CAAU,WAAmB,IAAA,EAAW;AACrD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,CAAA,EAAK,IAAI,CAAA;AAE3C;AAGA,IAAM,oBAAA,GAAuBM,MAAE,MAAA,CAAO;AAAA,EACpC,IAAA,EAAMA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EAC/B,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAA;AAAA,IACf,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,YAAA,GAAe;AAAA;AAAA,QAEnB,YAAA;AAAA,QAAc,WAAA;AAAA,QAAa,WAAA;AAAA,QAAa,WAAA;AAAA,QAAa,YAAA;AAAA,QAAc,eAAA;AAAA;AAAA,QAEnE,iBAAA;AAAA,QAAmB,YAAA;AAAA,QAAc,oBAAA;AAAA,QACjC,yEAAA;AAAA;AAAA,QAEA,WAAA;AAAA,QAAa,YAAA;AAAA,QAAc,WAAA;AAAA,QAAa,WAAA;AAAA,QAAa,WAAA;AAAA;AAAA,QAErD,WAAA;AAAA,QAAa,WAAA;AAAA,QAAa,WAAA;AAAA,QAAa;AAAA,OACzC;AACA,MAAA,OAAO,YAAA,CAAa,SAAS,IAAI,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,EAAE,SAAS,uBAAA;AAAwB,GACrC;AAAA,EACA,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA,GAAK,IAAA,GAAO,IAAI;AAAA;AAC9C,CAAC,CAAA;AAEM,IAAM,cAAA,GAAiB,IAAIV,SAAAA,EAAmD;AAGrF,cAAA,CAAe,GAAA,CAAI,GAAA,EAAKC,6BAAA,EAAa,CAAA;AAGrC,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA,KAAM;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,IAAA,MAAM,QAAA,GAAW,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,EAAS;AACtC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAEpC,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kBAAA,IAAsB,GAAG,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,IAAA,GAAO,QAAA;AAGb,IAAA,MAAM,UAAA,GAAa,qBAAqB,SAAA,CAAU;AAAA,MAChD,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA;AAED,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO,wBAAA;AAAA,QACP,OAAA,EAAS,WAAW,KAAA,CAAM;AAAA,SACzB,GAAG,CAAA;AAAA,IACR;AAGA,IAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,IAAA,MAAM,gBAAgB,IAAA,CAAK,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AACpD,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,IAAe,SAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAGnC,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,WAAA,EAAY;AAC3C,IAAA,MAAM,eAAe,MAAM,CAAA,CAAE,IAAI,YAAA,CAAa,GAAA,CAAI,OAAO,WAAA,EAAa;AAAA,MACpE,YAAA,EAAc;AAAA,QACZ,aAAa,IAAA,CAAK,IAAA;AAAA,QAClB,kBAAA,EAAoB,CAAA,kBAAA,EAAqB,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,OACpD;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,cAAc,IAAA,CAAK,IAAA;AAAA,QACnB,YAAY,IAAA,CAAK,MAAA;AAAA,QACjB,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY;AACrC,KACD,CAAA;AAED,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kCAAA,IAAsC,GAAG,CAAA;AAAA,IAClE;AAGA,IAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,WAAA,IAAe,mBAAA;AACxC,IAAA,MAAM,SAAA,GAAY,CAAA,YAAA,EAAe,UAAU,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA;AAG3D,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI,MAAA,GAAwB,IAAA;AAE5B,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,IAAK,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAChE,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,WAAW,CAAA;AACvD,QAAA,KAAA,GAAQ,UAAA,CAAW,KAAA;AACnB,QAAA,MAAA,GAAS,UAAA,CAAW,MAAA;AAAA,MACtB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,uCAAuC,KAAK,CAAA;AAAA,MAC3D;AAAA,IACF;AAGA,IAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAI,iBAAA,EAAmB;AAC7D,MAAA,YAAA,GAAe,CAAA,0BAAA,EAA6B,CAAA,CAAE,GAAA,CAAI,iBAAiB,IAAI,KAAK,CAAA,UAAA,CAAA;AAAA,IAC9E;AAGA,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,EAAA,EAAI,MAAA;AAAA,MACJ,QAAA;AAAA,MACA,eAAe,IAAA,CAAK,IAAA;AAAA,MACpB,WAAW,IAAA,CAAK,IAAA;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA,EAAQ,KAAA;AAAA,MACR,UAAA,EAAY,SAAA;AAAA,MACZ,aAAA,EAAe,YAAA;AAAA,MACf,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAAA,MACzC,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA,KAC1C;AAEA,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAK7B,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,IAAA;AAAA,MACT,WAAA,CAAY,EAAA;AAAA,MACZ,WAAA,CAAY,QAAA;AAAA,MACZ,WAAA,CAAY,aAAA;AAAA,MACZ,WAAA,CAAY,SAAA;AAAA,MACZ,WAAA,CAAY,IAAA;AAAA,MACZ,WAAA,CAAY,KAAA;AAAA,MACZ,WAAA,CAAY,MAAA;AAAA,MACZ,WAAA,CAAY,MAAA;AAAA,MACZ,WAAA,CAAY,MAAA;AAAA,MACZ,WAAA,CAAY,UAAA;AAAA,MACZ,WAAA,CAAY,aAAA;AAAA,MACZ,WAAA,CAAY,WAAA;AAAA,MACZ,WAAA,CAAY;AAAA,MACZ,GAAA,EAAI;AAGN,IAAA,MAAM,SAAA,CAAU,gBAAgB,EAAE,EAAA,EAAI,YAAY,EAAA,EAAI,QAAA,EAAU,WAAA,CAAY,QAAA,EAAU,CAAA;AAEtF,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,IAAI,WAAA,CAAY,EAAA;AAAA,QAChB,UAAU,WAAA,CAAY,QAAA;AAAA,QACtB,cAAc,WAAA,CAAY,aAAA;AAAA,QAC1B,UAAU,WAAA,CAAY,SAAA;AAAA,QACtB,MAAM,WAAA,CAAY,IAAA;AAAA,QAClB,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,QAAQ,WAAA,CAAY,MAAA;AAAA,QACpB,QAAQ,WAAA,CAAY,MAAA;AAAA,QACpB,WAAW,WAAA,CAAY,UAAA;AAAA,QACvB,cAAc,WAAA,CAAY,aAAA;AAAA,QAC1B,YAAY,IAAI,IAAA,CAAK,YAAY,WAAA,GAAc,GAAI,EAAE,WAAA;AAAY;AACnE,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,KAAK,CAAA;AACpC,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,eAAA,IAAmB,GAAG,CAAA;AAAA,EAC/C;AACF,CAAC,CAAA;AAGD,cAAA,CAAe,IAAA,CAAK,kBAAA,EAAoB,OAAO,CAAA,KAAM;AACnD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,IAAA,MAAM,QAAA,GAAW,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,EAAS;AACtC,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA;AAGzC,IAAA,MAAM,QAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,MAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,QAAA,KAAA,CAAM,KAAK,CAAS,CAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,gBAAgB,EAAC;AACvB,IAAA,MAAM,SAAS,EAAC;AAEhB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI;AAEF,QAAA,MAAM,UAAA,GAAa,qBAAqB,SAAA,CAAU;AAAA,UAChD,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,MAAM,IAAA,CAAK;AAAA,SACZ,CAAA;AAED,QAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,KAAA,EAAO,mBAAA;AAAA,YACP,OAAA,EAAS,WAAW,KAAA,CAAM;AAAA,WAC3B,CAAA;AACD,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,QAAA,MAAM,gBAAgB,IAAA,CAAK,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AACpD,QAAA,MAAM,QAAA,GAAW,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAC3C,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,IAAe,SAAA;AACnD,QAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAGnC,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,WAAA,EAAY;AAC3C,QAAA,MAAM,eAAe,MAAM,CAAA,CAAE,IAAI,YAAA,CAAa,GAAA,CAAI,OAAO,WAAA,EAAa;AAAA,UACpE,YAAA,EAAc;AAAA,YACZ,aAAa,IAAA,CAAK,IAAA;AAAA,YAClB,kBAAA,EAAoB,CAAA,kBAAA,EAAqB,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,WACpD;AAAA,UACA,cAAA,EAAgB;AAAA,YACd,cAAc,IAAA,CAAK,IAAA;AAAA,YACnB,YAAY,IAAA,CAAK,MAAA;AAAA,YACjB,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY;AACrC,SACD,CAAA;AAED,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,KAAA,EAAO;AAAA,WACR,CAAA;AACD,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,WAAA,IAAe,mBAAA;AACxC,QAAA,MAAM,SAAA,GAAY,CAAA,YAAA,EAAe,UAAU,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA;AAG3D,QAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,QAAA,IAAI,MAAA,GAAwB,IAAA;AAE5B,QAAA,IAAI,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,IAAK,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAChE,UAAA,IAAI;AACF,YAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,WAAW,CAAA;AACvD,YAAA,KAAA,GAAQ,UAAA,CAAW,KAAA;AACnB,YAAA,MAAA,GAAS,UAAA,CAAW,MAAA;AAAA,UACtB,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,IAAA,CAAK,uCAAuC,KAAK,CAAA;AAAA,UAC3D;AAAA,QACF;AAGA,QAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,QAAA,IAAI,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAI,iBAAA,EAAmB;AAC7D,UAAA,YAAA,GAAe,CAAA,0BAAA,EAA6B,CAAA,CAAE,GAAA,CAAI,iBAAiB,IAAI,KAAK,CAAA,UAAA,CAAA;AAAA,QAC9E;AAGA,QAAA,MAAM,WAAA,GAAc;AAAA,UAClB,EAAA,EAAI,MAAA;AAAA,UACJ,QAAA;AAAA,UACA,eAAe,IAAA,CAAK,IAAA;AAAA,UACpB,WAAW,IAAA,CAAK,IAAA;AAAA,UAChB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,KAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA,EAAQ,KAAA;AAAA,UACR,UAAA,EAAY,SAAA;AAAA,UACZ,aAAA,EAAe,YAAA;AAAA,UACf,aAAa,IAAA,CAAK,MAAA;AAAA,UAClB,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA,SAC3C;AAEA,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAK7B,CAAA;AAED,QAAA,MAAM,IAAA,CAAK,IAAA;AAAA,UACT,WAAA,CAAY,EAAA;AAAA,UACZ,WAAA,CAAY,QAAA;AAAA,UACZ,WAAA,CAAY,aAAA;AAAA,UACZ,WAAA,CAAY,SAAA;AAAA,UACZ,WAAA,CAAY,IAAA;AAAA,UACZ,WAAA,CAAY,KAAA;AAAA,UACZ,WAAA,CAAY,MAAA;AAAA,UACZ,WAAA,CAAY,MAAA;AAAA,UACZ,WAAA,CAAY,MAAA;AAAA,UACZ,WAAA,CAAY,UAAA;AAAA,UACZ,WAAA,CAAY,aAAA;AAAA,UACZ,WAAA,CAAY,WAAA;AAAA,UACZ,WAAA,CAAY;AAAA,UACZ,GAAA,EAAI;AAEN,QAAA,aAAA,CAAc,IAAA,CAAK;AAAA,UACjB,IAAI,WAAA,CAAY,EAAA;AAAA,UAChB,UAAU,WAAA,CAAY,QAAA;AAAA,UACtB,cAAc,WAAA,CAAY,aAAA;AAAA,UAC1B,UAAU,WAAA,CAAY,SAAA;AAAA,UACtB,MAAM,WAAA,CAAY,IAAA;AAAA,UAClB,OAAO,WAAA,CAAY,KAAA;AAAA,UACnB,QAAQ,WAAA,CAAY,MAAA;AAAA,UACpB,QAAQ,WAAA,CAAY,MAAA;AAAA,UACpB,WAAW,WAAA,CAAY,UAAA;AAAA,UACvB,cAAc,WAAA,CAAY,aAAA;AAAA,UAC1B,YAAY,IAAI,IAAA,CAAK,YAAY,WAAA,GAAc,GAAI,EAAE,WAAA;AAAY,SAClE,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,UAAU,IAAA,CAAK,IAAA;AAAA,UACf,KAAA,EAAO,eAAA;AAAA,UACP,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SACnD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,UAAU,cAAA,EAAgB,EAAE,KAAA,EAAO,aAAA,CAAc,QAAQ,CAAA;AAAA,IACjE;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,cAAc,MAAA,GAAS,CAAA;AAAA,MAChC,QAAA,EAAU,aAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAO,KAAA,CAAM,MAAA;AAAA,QACb,YAAY,aAAA,CAAc,MAAA;AAAA,QAC1B,QAAQ,MAAA,CAAO;AAAA;AACjB,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,eAAA,IAAmB,GAAG,CAAA;AAAA,EAC/C;AACF,CAAC,CAAA;AAGD,cAAA,CAAe,IAAA,CAAK,cAAA,EAAgB,OAAO,CAAA,KAAM;AAC/C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAErB,IAAA,IAAI,CAAC,WAAW,CAAC,KAAA,CAAM,QAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC/D,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,OAAA,CAAQ,SAAS,EAAA,EAAI;AACvB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,0DAAA,IAA8D,GAAG,CAAA;AAAA,IAC1F;AAEA,IAAA,MAAM,UAAU,EAAC;AACjB,IAAA,MAAM,SAAS,EAAC;AAEhB,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI;AAEF,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,EAAA,CAAG,QAAQ,kCAAkC,CAAA;AAChE,QAAA,MAAM,aAAa,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,EAAE,KAAA,EAAM;AAEjD,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,kBAAkB,CAAA;AAC/C,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,UAAA,CAAW,eAAe,IAAA,EAAM;AAClC,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,EAAQ,MAAM,CAAA,0BAAA,CAA4B,CAAA;AACtD,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,MAAA;AAAA,YACA,UAAU,UAAA,CAAW,aAAA;AAAA,YACrB,OAAA,EAAS,IAAA;AAAA,YACT,cAAA,EAAgB;AAAA,WACjB,CAAA;AACD,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,WAAW,WAAA,KAAgB,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAAS,OAAA,EAAS;AACnE,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,qBAAqB,CAAA;AAClD,UAAA;AAAA,QACF;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,CAAA,CAAE,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,WAAW,MAAM,CAAA;AAAA,QACnD,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,kCAAA,EAAqC,MAAM,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QAEpE;AAGA,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,EAAA,CAAG,QAAQ,8CAA8C,CAAA;AAClF,QAAA,MAAM,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAA,EAAG,MAAM,CAAA,CAAE,GAAA,EAAI;AAEjE,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAA;AAAA,UACA,UAAU,UAAA,CAAW,aAAA;AAAA,UACrB,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAA;AAAA,UACA,KAAA,EAAO,eAAA;AAAA,UACP,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SACnD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAM,SAAA,CAAU,gBAAgB,EAAE,KAAA,EAAO,QAAQ,MAAA,EAAQ,GAAA,EAAK,SAAS,CAAA;AAAA,IACzE;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,QAAQ,MAAA,GAAS,CAAA;AAAA,MAC1B,OAAA,EAAS,OAAA;AAAA,MACT,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAO,OAAA,CAAQ,MAAA;AAAA,QACf,YAAY,OAAA,CAAQ,MAAA;AAAA,QACpB,QAAQ,MAAA,CAAO;AAAA;AACjB,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,oBAAA,IAAwB,GAAG,CAAA;AAAA,EACpD;AACF,CAAC,CAAA;AAGD,cAAA,CAAe,IAAA,CAAK,gBAAA,EAAkB,OAAO,CAAA,KAAM;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,aAAa,IAAA,CAAK,UAAA;AAExB,IAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,MAAA,OAAO,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,OAAO,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,IACzE;AAGA,IAAA,MAAM,aAAA,GAAgB,eAAA;AACtB,IAAA,IAAI,CAAC,aAAA,CAAc,IAAA,CAAK,UAAU,CAAA,EAAG;AACnC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAGA,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,EAAA,CAAG,QAAQ,6EAA6E,CAAA;AAChH,IAAA,MAAM,iBAAiB,MAAM,SAAA,CAAU,IAAA,CAAK,UAAU,EAAE,KAAA,EAAM;AAE9D,IAAA,IAAI,cAAA,IAAkB,cAAA,CAAe,KAAA,GAAQ,CAAA,EAAG;AAC9C,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,WAAW,UAAU,CAAA,gBAAA;AAAA,SAC3B,GAAG,CAAA;AAAA,IACR;AAIA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,WAAW,UAAU,CAAA,+EAAA,CAAA;AAAA,MAC9B,MAAA,EAAQ,UAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,IAAA,OAAO,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,OAAO,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,EACzE;AACF,CAAC,CAAA;AAGD,cAAA,CAAe,IAAA,CAAK,YAAA,EAAc,OAAO,CAAA,KAAM;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,MAAM,eAAe,IAAA,CAAK,MAAA;AAE1B,IAAA,IAAI,CAAC,WAAW,CAAC,KAAA,CAAM,QAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC/D,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,CAAC,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA,EAAU;AACrD,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,2BAAA,IAA+B,GAAG,CAAA;AAAA,IAC3D;AAGA,IAAA,IAAI,OAAA,CAAQ,SAAS,EAAA,EAAI;AACvB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,0DAAA,IAA8D,GAAG,CAAA;AAAA,IAC1F;AAEA,IAAA,MAAM,UAAU,EAAC;AACjB,IAAA,MAAM,SAAS,EAAC;AAEhB,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI;AAEF,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,EAAA,CAAG,QAAQ,yDAAyD,CAAA;AACvF,QAAA,MAAM,aAAa,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,EAAE,KAAA,EAAM;AAEjD,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,kBAAkB,CAAA;AAC/C,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,WAAW,WAAA,KAAgB,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAAS,OAAA,EAAS;AACnE,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,qBAAqB,CAAA;AAClD,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,UAAA,CAAW,WAAW,YAAA,EAAc;AACtC,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,MAAA;AAAA,YACA,UAAU,UAAA,CAAW,aAAA;AAAA,YACrB,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,WAAW,UAAA,CAAW,MAAA;AAC5B,QAAA,MAAM,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,MAAS,UAAA,CAAW,QAAA;AACzD,QAAA,MAAM,QAAA,GAAW,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAG5C,QAAA,IAAI;AACF,UAAA,MAAM,SAAS,MAAM,CAAA,CAAE,GAAA,CAAI,YAAA,CAAa,IAAI,QAAQ,CAAA;AACpD,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,6BAA6B,CAAA;AAC1D,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,EAAE,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,OAAO,IAAA,EAAM;AAAA,YAClD,cAAc,MAAA,CAAO,YAAA;AAAA,YACrB,cAAA,EAAgB;AAAA,cACd,GAAG,MAAA,CAAO,cAAA;AAAA,cACV,SAAS,IAAA,CAAK,MAAA;AAAA,cACd,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY;AAClC,WACD,CAAA;AAGD,UAAA,MAAM,CAAA,CAAE,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,QAAQ,CAAA;AAAA,QAC1C,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mCAAA,EAAsC,MAAM,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACnE,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,kCAAkC,CAAA;AAC/D,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,WAAA,IAAe,mBAAA;AACxC,QAAA,MAAM,YAAA,GAAe,CAAA,YAAA,EAAe,UAAU,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA;AAEjE,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,QAAA,CAInC,CAAA;AACD,QAAA,MAAM,UAAA,CAAW,IAAA;AAAA,UACf,YAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAAA,UAC5B;AAAA,UACA,GAAA,EAAI;AAEN,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAA;AAAA,UACA,UAAU,UAAA,CAAW,aAAA;AAAA,UACrB,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAA;AAAA,UACA,KAAA,EAAO,aAAA;AAAA,UACP,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SACnD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAM,SAAA,CAAU,cAAc,EAAE,KAAA,EAAO,QAAQ,MAAA,EAAQ,YAAA,EAAc,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,IACrF;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,QAAQ,MAAA,GAAS,CAAA;AAAA,MAC1B,KAAA,EAAO,OAAA;AAAA,MACP,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAO,OAAA,CAAQ,MAAA;AAAA,QACf,YAAY,OAAA,CAAQ,MAAA;AAAA,QACpB,QAAQ,MAAA,CAAO;AAAA;AACjB,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oBAAoB,KAAK,CAAA;AACvC,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,kBAAA,IAAsB,GAAG,CAAA;AAAA,EAClD;AACF,CAAC,CAAA;AAGD,cAAA,CAAe,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAA,KAAM;AACzC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAG/B,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,EAAA,CAAG,QAAQ,yDAAyD,CAAA;AACvF,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,EAAE,KAAA,EAAM;AAEjD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,IAAoB,GAAG,CAAA;AAAA,IAChD;AAGA,IAAA,IAAI,WAAW,WAAA,KAAgB,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAAS,OAAA,EAAS;AACnE,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,IACnD;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,CAAE,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,WAAW,MAAM,CAAA;AAAA,IACnD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,6BAA6B,KAAK,CAAA;AAAA,IAEjD;AAGA,IAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,EAAA,CAAG,QAAQ,8CAA8C,CAAA;AAClF,IAAA,MAAM,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAA,EAAG,MAAM,CAAA,CAAE,GAAA,EAAI;AAGjE,IAAA,MAAM,SAAA,CAAU,cAAA,EAAgB,EAAE,EAAA,EAAI,QAAQ,CAAA;AAE9C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,6BAA6B,CAAA;AAAA,EACvE,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,KAAK,CAAA;AACpC,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,eAAA,IAAmB,GAAG,CAAA;AAAA,EAC/C;AACF,CAAC,CAAA;AAGD,cAAA,CAAe,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAA,KAAM;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAG9B,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,EAAA,CAAG,QAAQ,yDAAyD,CAAA;AACvF,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,EAAE,KAAA,EAAM;AAEjD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,IAAoB,GAAG,CAAA;AAAA,IAChD;AAGA,IAAA,IAAI,WAAW,WAAA,KAAgB,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAAS,OAAA,EAAS;AACnE,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,IAAuB,GAAG,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,EAAO,SAAA,EAAW,QAAQ,QAAQ,CAAA;AACzD,IAAA,MAAM,UAAU,EAAC;AACjB,IAAA,MAAM,SAAS,EAAC;AAEhB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,IAAI,aAAA,CAAc,QAAA,CAAS,GAAG,CAAA,EAAG;AAC/B,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,IAAA,CAAM,CAAA;AACzB,QAAA,MAAA,CAAO,KAAK,GAAA,KAAQ,MAAA,GAAS,KAAK,SAAA,CAAU,KAAK,IAAI,KAAK,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,2BAAA,IAA+B,GAAG,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,IAAA,MAAA,CAAO,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AACzC,IAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAElB,IAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,EAAA,CAAG,OAAA,CAAQ;AAAA,uBAAA,EACf,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAAA,CACtC,CAAA;AACD,IAAA,MAAM,UAAA,CAAW,IAAA,CAAK,GAAG,MAAM,EAAE,GAAA,EAAI;AAGrC,IAAA,MAAM,SAAA,CAAU,cAAA,EAAgB,EAAE,EAAA,EAAI,QAAQ,CAAA;AAE9C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,6BAA6B,CAAA;AAAA,EACvE,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,KAAK,CAAA;AACpC,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,eAAA,IAAmB,GAAG,CAAA;AAAA,EAC/C;AACF,CAAC,CAAA;AAGD,eAAe,mBAAmB,WAAA,EAAsE;AAGtG,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,WAAW,CAAA;AAG7C,EAAA,IAAI,WAAW,CAAC,CAAA,KAAM,OAAQ,UAAA,CAAW,CAAC,MAAM,GAAA,EAAM;AACpD,IAAA,OAAO,kBAAkB,UAAU,CAAA;AAAA,EACrC;AAGA,EAAA,IAAI,UAAA,CAAW,CAAC,CAAA,KAAM,GAAA,IAAQ,WAAW,CAAC,CAAA,KAAM,EAAA,IAAQ,UAAA,CAAW,CAAC,CAAA,KAAM,EAAA,IAAQ,UAAA,CAAW,CAAC,MAAM,EAAA,EAAM;AACxG,IAAA,OAAO,iBAAiB,UAAU,CAAA;AAAA,EACpC;AAGA,EAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAC/B;AAEA,SAAS,kBAAkB,UAAA,EAA2D;AACpF,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,WAAW,MAAA,EAAQ;AAC5B,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,UAAA,CAAW,MAAA,EAAQ;AAChC,IAAA,IAAI,UAAA,CAAW,CAAC,CAAA,KAAM,GAAA,IAAQ,WAAW,CAAA,GAAI,CAAC,MAAM,GAAA,EAAM;AACxD,MAAA,IAAI,CAAA,GAAI,CAAA,GAAI,UAAA,CAAW,MAAA,EAAQ;AAC7B,QAAA,OAAO;AAAA,UACL,MAAA,EAAS,WAAW,CAAA,GAAI,CAAC,KAAM,CAAA,GAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,UACpD,KAAA,EAAQ,WAAW,CAAA,GAAI,CAAC,KAAM,CAAA,GAAK,UAAA,CAAW,IAAI,CAAC;AAAA,SACrD;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAA,GAAI,CAAA,GAAI,UAAA,CAAW,MAAA,EAAQ;AAC7B,MAAA,CAAA,IAAK,CAAA,IAAM,WAAW,CAAA,GAAI,CAAC,KAAM,CAAA,GAAK,UAAA,CAAW,IAAI,CAAC,CAAA,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAC/B;AAEA,SAAS,iBAAiB,UAAA,EAA2D;AACnF,EAAA,IAAI,UAAA,CAAW,SAAS,EAAA,EAAI;AAC1B,IAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,EAC/B;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAQ,UAAA,CAAW,EAAE,CAAA,IAAM,KAAO,UAAA,CAAW,EAAE,CAAA,IAAM,EAAA,GAAO,UAAA,CAAW,EAAE,CAAA,IAAM,CAAA,GAAK,WAAW,EAAE,CAAA;AAAA,IACjG,MAAA,EAAS,UAAA,CAAW,EAAE,CAAA,IAAM,KAAO,UAAA,CAAW,EAAE,CAAA,IAAM,EAAA,GAAO,UAAA,CAAW,EAAE,CAAA,IAAM,CAAA,GAAK,WAAW,EAAE;AAAA,GACpG;AACF;AAEA,IAAO,iBAAA,GAAQ;ACrwBR,IAAM,eAAA,GAAkB,IAAID,SAAAA,EAAmD;AAMtF,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,KAAM;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,IAAA,IAAI,QAAA,GAAW,SAAA;AACf,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,MAAA,MAAM,EAAE,GAAA,CAAI,EAAA,CAAG,OAAA,CAAQ,UAAU,EAAE,KAAA,EAAM;AACzC,MAAA,SAAA,GAAY,IAAA,CAAK,KAAI,GAAI,OAAA;AACzB,MAAA,QAAA,GAAW,SAAA;AAAA,IACb,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACpD,MAAA,QAAA,GAAW,WAAA;AAAA,IACb;AAGA,IAAA,IAAI,QAAA,GAAW,gBAAA;AACf,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,IAAI,CAAA,CAAE,IAAI,QAAA,EAAU;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,QAAA,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,kBAAkB,CAAA;AAC3C,QAAA,SAAA,GAAY,IAAA,CAAK,KAAI,GAAI,OAAA;AACzB,QAAA,QAAA,GAAW,SAAA;AAAA,MACb,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,QAAA,QAAA,GAAW,WAAA;AAAA,MACb;AAAA,IACF;AAGA,IAAA,IAAI,QAAA,GAAW,gBAAA;AAEf,IAAA,IAAI,CAAA,CAAE,IAAI,YAAA,EAAc;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,CAAA,CAAE,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,kBAAkB,CAAA;AAChD,QAAA,QAAA,GAAW,SAAA;AAAA,MACb,SAAS,KAAA,EAAO;AAGd,QAAA,QAAA,GAAW,SAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAClC,IAAA,MAAM,OAAA,GAAU,QAAA,KAAa,SAAA,GAAY,SAAA,GAAY,UAAA;AAErD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,MAAA,EAAQ,OAAA;AAAA,MACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,MAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU;AAAA,UACR,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACX;AAAA,QACA,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACX;AAAA,QACA,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ;AAAA;AACV,OACF;AAAA,MACA,WAAA,EAAa,CAAA,CAAE,GAAA,CAAI,WAAA,IAAe;AAAA,KACnC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,MAAA,EAAQ,WAAA;AAAA,MACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAMD,eAAA,CAAgB,GAAA,CAAI,OAAA,EAAS,CAAC,CAAA,KAAM;AAClC,EAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA,IAAK,OAAA;AAE1C,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,IAAA,EAAM,SAAA;AAAA,IACN,OAAA,EAAS,UAAA;AAAA,IACT,WAAA,EAAa,iDAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,GAAA,EAAK,MAAA;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,oBAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,OAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,IAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MACb,OAAA,EAAS,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,QAAA;AAAA,MACjB,OAAA,EAAS,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI;AAAA,KACnB;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAMD,eAAA,CAAgB,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAM;AACzC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,MAAM,YAAA,GAAe,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIrC,EAAE,KAAA,EAAM;AAGT,IAAA,MAAM,UAAA,GAAa,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAMnC,EAAE,KAAA,EAAM;AAGT,IAAA,MAAM,SAAA,GAAY,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAGlC,EAAE,KAAA,EAAM;AAET,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,cAAc,aAAA,IAAiB;AAAA,OACxC;AAAA,MACA,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,YAAY,WAAA,IAAe,CAAA;AAAA,QACxC,gBAAA,EAAkB,YAAY,UAAA,IAAc,CAAA;AAAA,QAC5C,aAAA,EAAe,KAAK,KAAA,CAAA,CAAO,UAAA,EAAY,cAAc,CAAA,IAAK,IAAA,GAAO,IAAA,GAAO,GAAG,CAAA,GAAI;AAAA,OACjF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,WAAW,WAAA,IAAe;AAAA,OACnC;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mCAAA,IAAuC,GAAG,CAAA;AAAA,EACnE;AACF,CAAC,CAAA;AAMD,eAAA,CAAgB,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA,KAAM;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,MAAM,EAAE,GAAA,CAAI,EAAA,CAAG,OAAA,CAAQ,UAAU,EAAE,KAAA,EAAM;AACzC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAE7B,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,IAAA;AAAA,MACN,OAAA;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,gBAAgB,KAAK,CAAA;AACnC,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAMD,eAAA,CAAgB,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA,KAAM;AACjC,EAAA,OAAO,EAAE,IAAA,CAAK;AAAA,IACZ,WAAA,EAAa,CAAA,CAAE,GAAA,CAAI,WAAA,IAAe,YAAA;AAAA,IAClC,QAAA,EAAU;AAAA,MACR,QAAA,EAAU,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,EAAA;AAAA,MAClB,KAAA,EAAO,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,QAAA;AAAA,MACf,YAAA,EAAc,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,YAAA;AAAA,MACtB,WAAA,EAAa,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,WAAA;AAAA,MACrB,QAAA,EAAU,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,gBAAA;AAAA,MAClB,mBAAmB,CAAC,EAAE,EAAE,GAAA,CAAI,iBAAA,IAAqB,EAAE,GAAA,CAAI,gBAAA;AAAA,KACzD;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACH,CAAC,CAAA;AAED,IAAO,kBAAA,GAAQ;AC7MR,IAAM,cAAA,GAAiB,IAAIA,SAAAA,EAAmD;AAGrF,cAAA,CAAe,GAAA,CAAI,GAAA,EAAKC,6BAAA,EAAa,CAAA;AACrC,cAAA,CAAe,IAAI,GAAA,EAAKC,6BAAA,CAAY,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAC,CAAA;AAMxD,cAAA,CAAe,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA,KAAM;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,EAAA,CAAG,OAAA,CAAQ,iHAAiH,CAAA;AACpJ,MAAA,MAAM,iBAAA,GAAoB,MAAM,eAAA,CAAgB,KAAA,EAAM;AACtD,MAAA,gBAAA,GAAoB,mBAA2B,KAAA,IAAS,CAAA;AAAA,IAC1D,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AAAA,IAC1D;AAGA,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,EAAA,CAAG,OAAA,CAAQ,+KAA+K,CAAA;AAC9M,MAAA,MAAM,aAAA,GAAgB,MAAM,WAAA,CAAY,KAAA,EAAM;AAC9C,MAAA,YAAA,GAAgB,eAAuB,KAAA,IAAS,CAAA;AAAA,IAClD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,CAAQ,oGAAoG,CAAA;AACjI,MAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,KAAA,EAAM;AAC1C,MAAA,UAAA,GAAc,aAAqB,KAAA,IAAS,CAAA;AAC5C,MAAA,SAAA,GAAa,aAAqB,UAAA,IAAc,CAAA;AAAA,IAClD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,IACpD;AAGA,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,CAAQ,yDAAyD,CAAA;AACtF,MAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,KAAA,EAAM;AAC1C,MAAA,UAAA,GAAc,aAAqB,KAAA,IAAS,CAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,WAAA,EAAa,gBAAA;AAAA,MACb,YAAA,EAAc,YAAA;AAAA,MACd,UAAA,EAAY,UAAA;AAAA,MACZ,SAAA;AAAA,MACA,KAAA,EAAO,UAAA;AAAA,MACP,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,4BAAA,IAAgC,GAAG,CAAA;AAAA,EAC5D;AACF,CAAC,CAAA;AAMD,cAAA,CAAe,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA,KAAM;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,EAAA,CAAG,OAAA,CAAQ,UAAU,EAAE,GAAA,EAAI;AAChD,MAAA,YAAA,GAAgB,MAAA,EAAgB,MAAM,UAAA,IAAc,CAAA;AAAA,IACtD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,CAAQ,iFAAiF,CAAA;AAC9G,MAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,KAAA,EAAM;AAC1C,MAAA,SAAA,GAAa,aAAqB,UAAA,IAAc,CAAA;AAAA,IAClD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,YAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAW,YAAA,GAAe,SAAA;AAAA,MAC1B,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACpD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,+BAAA,IAAmC,GAAG,CAAA;AAAA,EAC/D;AACF,CAAC,CAAA;AAMD,cAAA,CAAe,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AAC3C,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,QAAQ,QAAA,CAAS,CAAA,CAAE,IAAI,KAAA,CAAM,OAAO,KAAK,IAAI,CAAA;AAGnD,IAAA,MAAM,YAAA,GAAe,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAgB/B,CAAA;AAED,IAAA,MAAM,EAAE,SAAQ,GAAI,MAAM,aAAa,IAAA,CAAK,KAAK,EAAE,GAAA,EAAI;AAEvD,IAAA,MAAM,kBAAkB,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,KAAa;AACvD,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,SAAA,GACnC,CAAA,EAAG,GAAA,CAAI,UAAU,CAAA,CAAA,EAAI,GAAA,CAAI,SAAS,CAAA,CAAA,GAClC,IAAI,KAAA,IAAS,QAAA;AAEjB,MAAA,IAAI,UAAe,EAAC;AACpB,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,IAAI,OAAA,GAAU,IAAA,CAAK,MAAM,GAAA,CAAI,OAAO,IAAI,EAAC;AAAA,MACrD,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,CAAC,CAAA;AAAA,MACpD;AAEA,MAAA,OAAO;AAAA,QACL,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,MAAM,GAAA,CAAI,aAAA;AAAA,QACV,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,OAAA;AAAA,QACA,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,IAAI,UAAU,CAAC,EAAE,WAAA,EAAY;AAAA,QACxD,IAAA,EAAM;AAAA,OACR;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,cAAA;AAAA,MACN,OAAO,cAAA,CAAe,MAAA;AAAA,MACtB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,iCAAA,IAAqC,GAAG,CAAA;AAAA,EACjE;AACF,CAAC,CAAA;AAKD,IAAM,sBAAA,GAAyBQ,MAAE,MAAA,CAAO;AAAA,EACtC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,KAAA,CAAM,cAAA,EAAgB,+DAA+D,CAAA;AAAA,EACtH,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EACjD,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EAClD,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC1B,CAAC,EAAE,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAA,IAAe,KAAK,YAAA,EAAc;AAAA,EACvD,OAAA,EAAS,gDAAA;AAAA,EACT,IAAA,EAAM,CAAC,aAAa;AACtB,CAAC,CAAA;AAED,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EACtC,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EAClD,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,SAAA,EAAWA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACzB,CAAC,CAAA;AAMD,cAAA,CAAe,GAAA,CAAI,cAAA,EAAgB,OAAO,CAAA,KAAM;AAC9C,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,EAAA;AACxC,IAAA,MAAM,eAAA,GAAkB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,iBAAiB,CAAA,KAAM,MAAA;AAE3D,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,GAAO,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,cAAA,EAGR,eAAA,GAAkB,QAAQ,eAAe;AAAA;AAAA;AAAA;AAAA,MAAA,CAIlD,CAAA;AACD,MAAA,MAAM,WAAA,GAAc,IAAI,MAAM,CAAA,CAAA,CAAA;AAC9B,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,IAAA,CAAK,aAAa,WAAA,EAAa,WAAW,EAAE,GAAA,EAAI;AAChF,MAAA,OAAA,GAAU,YAAA,CAAa,OAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,QAAA,EAId,eAAA,GAAkB,KAAK,mBAAmB;AAAA;AAAA,MAAA,CAE7C,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,GAAA,EAAI;AACpC,MAAA,OAAA,GAAU,YAAA,CAAa,OAAA;AAAA,IACzB;AAGA,IAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,OAAA,CAAQ,oFAAoF,CAAA;AACtH,IAAA,MAAM,EAAE,OAAA,EAAS,iBAAA,EAAkB,GAAI,MAAM,eAAe,GAAA,EAAI;AAChE,IAAA,MAAM,cAAc,IAAI,GAAA,CAAA,CAAK,qBAAqB,EAAC,EAAG,IAAI,CAAC,GAAA,KAAa,CAAC,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA,EAAG,MAAA,CAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAA;AAEvH,IAAA,MAAM,eAAe,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACrD,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,SAAA,EAAW,IAAI,SAAA,KAAc,CAAA;AAAA,MAC7B,OAAA,EAAS,IAAI,OAAA,KAAY,CAAA;AAAA,MACzB,aAAa,WAAA,CAAY,GAAA,CAAI,OAAO,GAAA,CAAI,EAAE,CAAC,CAAA,IAAK;AAAA,KAClD,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,WAAA;AAAA,MACN,OAAO,WAAA,CAAY,MAAA;AAAA,MACnB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,6BAAA,IAAiC,GAAG,CAAA;AAAA,EAC7D;AACF,CAAC,CAAA;AAMD,cAAA,CAAe,GAAA,CAAI,kBAAA,EAAoB,OAAO,CAAA,KAAM;AAClD,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAEjB,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,wCAAwC,CAAA;AAChE,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAE7C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,IACtD;AAGA,IAAA,MAAM,UAAA,GAAa,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAI7B,CAAA;AACD,IAAA,MAAM,EAAE,SAAS,aAAA,EAAc,GAAI,MAAM,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,CAAE,GAAA,EAAI;AAEjE,IAAA,MAAM,UAAU,aAAA,IAAiB,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACtD,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,aAAA,EAAe,IAAI,aAAA,GAAgB,IAAA,CAAK,MAAM,GAAA,CAAI,aAAa,IAAI,EAAC;AAAA,MACpE,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,WAAA,EAAa,IAAI,WAAA,KAAgB,CAAA;AAAA,MACjC,aAAA,EAAe,IAAI,aAAA,KAAkB,CAAA;AAAA,MACrC,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU;AAAA,KACnC,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,IAAI,UAAA,CAAW,EAAA;AAAA,MACf,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,cAAc,UAAA,CAAW,YAAA;AAAA,MACzB,aAAa,UAAA,CAAW,WAAA;AAAA,MACxB,SAAA,EAAW,WAAW,SAAA,KAAc,CAAA;AAAA,MACpC,OAAA,EAAS,WAAW,OAAA,KAAY,CAAA;AAAA,MAChC,QAAQ,UAAA,CAAW,MAAA,GAAS,KAAK,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,GAAI,IAAA;AAAA,MAC5D,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA;AAAA,MACxC,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA;AAAA,MACxC;AAAA,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,4BAAA,IAAgC,GAAG,CAAA;AAAA,EAC5D;AACF,CAAC,CAAA;AAMD,cAAA,CAAe,GAAA,CAAI,aAAA,EAAe,OAAO,CAAA,KAAM;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AAC7B,IAAA,MAAM,gBAAA,GAAmB,IAAI,YAAA,CAC1B,MAAA,CAAO,YAAY,CAAA,CACnB,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CACnC,IAAI,CAAC,KAAA,KAAU,MAAM,IAAA,EAAM,CAAA,CAC3B,MAAA,CAAO,OAAO,CAAA;AACjB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,EAAA;AACxC,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,IAAK,EAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAAK,IAAA,EAAM,EAAE,CAAA,IAAK,IAAI,GAAG,CAAA;AAEnF,IAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,wBAAA,IAA4B,GAAG,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,eAAe,gBAAA,CAAiB,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAC9D,IAAA,MAAM,cAAA,GAAiB,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,mBAAA,EAGjB,YAAY,iBAAiB,YAAY,CAAA;AAAA,IAAA,CACzD,CAAA;AACD,IAAA,MAAM,iBAAA,GAAoB,MAAM,cAAA,CAC7B,IAAA,CAAK,GAAG,gBAAA,EAAkB,GAAG,gBAAgB,CAAA,CAC7C,GAAA,EAAI;AACP,IAAA,MAAM,WAAA,GAAe,iBAAA,CAAkB,OAAA,IAAW,EAAC;AAEnD,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA;AAAA,MAC5B,WAAA,CAAY,GAAA,CAAI,CAAC,KAAA,KAAU;AAAA,QACzB,KAAA,CAAM,EAAA;AAAA,QACN;AAAA,UACE,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,cAAc,KAAA,CAAM;AAAA;AACtB,OACD;AAAA,KACH;AACA,IAAA,MAAM,gBAAgB,WAAA,CAAY,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,EAAE,CAAA;AAEzD,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,iBAAiB,aAAA,CAAc,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7D,MAAA,MAAM,QAAA,GAAW,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,2CAAA,EAGW,cAAc,CAAA;AAAA;AAAA,MAAA,CAEpD,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,CAAK,IAAI,GAAG,aAAa,EAAE,KAAA,EAAM;AAE7D,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,qBAAA,IAAyB,GAAG,CAAA;AAAA,MACrD;AAEA,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,UAAA,EAAY,cAAA,CAAe,IAAA,CAAK,aAAa;AAAA;AAC/C,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,OAAA;AAEJ,IAAA,MAAM,mBAAmB,aAAA,CAAc,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAC/D,IAAA,MAAM,kBAAA,GAAqB,CAAC,WAAW,CAAA;AACvC,IAAA,MAAM,YAAA,GAAe,mBAAmB,kBAAA,CAAmB,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAEpF,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,WAAA,GAAc,IAAI,MAAM,CAAA,CAAA,CAAA;AAC9B,MAAA,IAAA,GAAO,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,gCAAA,EAGU,gBAAgB,CAAA;AAAA;AAAA,QAAA,EAExC,YAAY;AAAA;AAAA;AAAA,MAAA,CAGf,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CACxB,IAAA,CAAK,GAAG,aAAA,EAAe,WAAA,EAAa,WAAA,EAAa,GAAG,kBAAA,EAAoB,KAAK,CAAA,CAC7E,GAAA,EAAI;AACP,MAAA,OAAA,GAAU,YAAA,CAAa,OAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,gCAAA,EAGU,gBAAgB,CAAA;AAAA,QAAA,EACxC,YAAY;AAAA;AAAA;AAAA,MAAA,CAGf,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CACxB,IAAA,CAAK,GAAG,eAAe,GAAG,kBAAA,EAAoB,KAAK,CAAA,CACnD,GAAA,EAAI;AACP,MAAA,OAAA,GAAU,YAAA,CAAa,OAAA;AAAA,IACzB;AAEA,IAAA,MAAM,SAAS,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MAC/C,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,YAAY,GAAA,CAAI,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA,GAAI,IAAA;AAAA,MACtD,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,aAAa;AAAA,KAC9C,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,KAAA;AAAA,MACN,OAAO,KAAA,CAAM;AAAA,KACd,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,4BAAA,IAAgC,GAAG,CAAA;AAAA,EAC5D;AACF,CAAC,CAAA;AAMD,cAAA,CAAe,IAAA,CAAK,cAAA,EAAgB,OAAO,CAAA,KAAM;AAC7C,EAAA,IAAI;AAEF,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,cAAc,CAAA;AAC/C,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC7D,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,uCAAA,IAA2C,GAAG,CAAA;AAAA,IACvE;AAEA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAAA,IAC1B,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,8BAAA,IAAkC,GAAG,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,SAAA,CAAU,IAAI,CAAA;AACxD,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,SAAS,UAAA,CAAW,KAAA,CAAM,MAAA,EAAO,EAAG,GAAG,CAAA;AAAA,IACrF;AACA,IAAA,MAAM,gBAAgB,UAAA,CAAW,IAAA;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAG1B,IAAA,MAAM,WAAA,GAAc,aAAA,CAAc,WAAA,IAAe,aAAA,CAAc,YAAA,IAAgB,EAAA;AAG/E,IAAA,MAAM,YAAA,GAAe,EAAA,CAAG,OAAA,CAAQ,2CAA2C,CAAA;AAC3E,IAAA,MAAM,WAAW,MAAM,YAAA,CAAa,KAAK,aAAA,CAAc,IAAI,EAAE,KAAA,EAAM;AAEnE,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,4CAAA,IAAgD,GAAG,CAAA;AAAA,IAC5E;AAGA,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,OAAA;AAAA,UACP,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,SAAA;AAAA,UACP,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,QAAA;AAAA,UACP,IAAA,EAAM,CAAC,OAAA,EAAS,WAAA,EAAa,UAAU,CAAA;AAAA,UACvC,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,QAAA,EAAU,CAAC,OAAO;AAAA,KACpB;AAEA,IAAA,MAAM,YAAA,GAAe,OAAO,UAAA,EAAW;AACvC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,UAAA,GAAa,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAG7B,CAAA;AAED,IAAA,MAAM,UAAA,CAAW,IAAA;AAAA,MACf,YAAA;AAAA,MACA,aAAA,CAAc,IAAA;AAAA,MACd,WAAA;AAAA,MACA,cAAc,WAAA,IAAe,IAAA;AAAA,MAC7B,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA,MAC1B,CAAA;AAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,MACA,GAAA,EAAI;AAGN,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,uBAAuB,CAAA;AACnD,MAAA,MAAM,EAAE,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,iBAAA,EAAoB,aAAA,CAAc,IAAI,CAAA,CAAE,CAAA;AAAA,IACtE,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAC,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,EAAA,EAAI,YAAA;AAAA,MACJ,MAAM,aAAA,CAAc,IAAA;AAAA,MACpB,WAAA;AAAA,MACA,aAAa,aAAA,CAAc,WAAA;AAAA,MAC3B,UAAA,EAAY;AAAA,OACX,GAAG,CAAA;AAAA,EACR,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,6BAAA,IAAiC,GAAG,CAAA;AAAA,EAC7D;AACJ,CAAC,CAAA;AAMD,cAAA,CAAe,KAAA,CAAM,kBAAA,EAAoB,OAAO,CAAA,KAAM;AAClD,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,SAAA,CAAU,IAAI,CAAA;AACxD,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,SAAS,UAAA,CAAW,KAAA,CAAM,MAAA,EAAO,EAAG,GAAG,CAAA;AAAA,IACrF;AACA,IAAA,MAAM,gBAAgB,UAAA,CAAW,IAAA;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,CAAQ,wCAAwC,CAAA;AACrE,IAAA,MAAM,WAAW,MAAM,SAAA,CAAU,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAEhD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,IACtD;AAGA,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,MAAM,eAAsB,EAAC;AAE7B,IAAA,IAAI,aAAA,CAAc,iBAAiB,KAAA,CAAA,EAAW;AAC5C,MAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACpC,MAAA,YAAA,CAAa,IAAA,CAAK,cAAc,YAAY,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,aAAA,CAAc,gBAAgB,KAAA,CAAA,EAAW;AAC3C,MAAA,YAAA,CAAa,KAAK,iBAAiB,CAAA;AACnC,MAAA,YAAA,CAAa,IAAA,CAAK,cAAc,WAAW,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,aAAA,CAAc,cAAc,KAAA,CAAA,EAAW;AACzC,MAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACjC,MAAA,YAAA,CAAa,IAAA,CAAK,aAAA,CAAc,SAAA,GAAY,CAAA,GAAI,CAAC,CAAA;AAAA,IACnD;AAEA,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,qBAAA,IAAyB,GAAG,CAAA;AAAA,IACrD;AAEA,IAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,IAAA,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAC5B,IAAA,YAAA,CAAa,KAAK,EAAE,CAAA;AAEpB,IAAA,MAAM,UAAA,GAAa,GAAG,OAAA,CAAQ;AAAA;AAAA,YAAA,EAEtB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,MAAA,CAE9B,CAAA;AAED,IAAA,MAAM,UAAA,CAAW,IAAA,CAAK,GAAG,YAAY,EAAE,GAAA,EAAI;AAG3C,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,uBAAuB,CAAA;AACnD,MAAA,MAAM,EAAE,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,iBAAA,EAAoB,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,IACjE,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAC,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,mCAAmC,CAAA;AAAA,EAC9D,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,6BAAA,IAAiC,GAAG,CAAA;AAAA,EAC7D;AACJ,CAAC,CAAA;AAMD,cAAA,CAAe,MAAA,CAAO,kBAAA,EAAoB,OAAO,CAAA,KAAM;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,OAAA,CAAQ,2CAA2C,CAAA;AAC7E,IAAA,MAAM,aAAa,MAAM,cAAA,CAAe,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAEvD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,IACtD;AAGA,IAAA,MAAM,WAAA,GAAc,EAAA,CAAG,OAAA,CAAQ,+DAA+D,CAAA;AAC9F,IAAA,MAAM,gBAAgB,MAAM,WAAA,CAAY,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAEvD,IAAA,IAAI,aAAA,IAAiB,aAAA,CAAc,KAAA,GAAQ,CAAA,EAAG;AAC5C,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO,CAAA,sCAAA,EAAyC,aAAA,CAAc,KAAK,CAAA,2CAAA;AAAA,SAClE,GAAG,CAAA;AAAA,IACR;AAGA,IAAA,MAAM,gBAAA,GAAmB,EAAA,CAAG,OAAA,CAAQ,oDAAoD,CAAA;AACxF,IAAA,MAAM,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAA,CAAE,GAAA,EAAI;AAGpC,IAAA,MAAM,UAAA,GAAa,EAAA,CAAG,OAAA,CAAQ,sCAAsC,CAAA;AACpE,IAAA,MAAM,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,CAAE,GAAA,EAAI;AAG9B,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,uBAAuB,CAAA;AACnD,MAAA,MAAM,EAAE,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,iBAAA,EAAoB,UAAA,CAAW,IAAI,CAAA,CAAE,CAAA;AAAA,IACnE,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAC,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,mCAAmC,CAAA;AAAA,EAC9D,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,6BAAA,IAAiC,GAAG,CAAA;AAAA,EAC7D;AACF,CAAC,CAAA;AAID,cAAA,CAAe,GAAA,CAAI,oBAAA,EAAsB,OAAO,CAAA,KAAM;AACpD,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,gBAAA,EAAAC,iBAAAA,EAAiB,GAAI,MAAM,OAAO,2BAAwB,CAAA;AAClE,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,gBAAA,GAAmB,IAAIA,iBAAAA,CAAiB,EAAE,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,kBAAA,EAAmB;AAEzD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,cAAA,CAAe,IAAA,CAAK,iBAAA,EAAmB,OAAO,CAAA,KAAM;AAClD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAGzB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,EAAE,gBAAA,EAAAA,iBAAAA,EAAiB,GAAI,MAAM,OAAO,2BAAwB,CAAA;AAClE,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,gBAAA,GAAmB,IAAIA,iBAAAA,CAAiB,EAAE,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,oBAAA,EAAqB;AAE3D,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAQ,MAAA,CAAO;AAAA,KAChB,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,IAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,6BAA6B,YAAY,CAAA,CAAA;AAAA,MAChD,MAAA,EAAQ,CAAC,YAAY;AAAA,OACpB,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,cAAA,CAAe,GAAA,CAAI,sBAAA,EAAwB,OAAO,CAAA,KAAM;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,gBAAA,EAAAA,iBAAAA,EAAiB,GAAI,MAAM,OAAO,2BAAwB,CAAA;AAClE,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,gBAAA,GAAmB,IAAIA,iBAAAA,CAAiB,EAAE,CAAA;AAChD,IAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,cAAA,EAAe;AAEzD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAED,IAAO,iBAAA,GAAQ;;;AC5uBR,SAAS,eAAA,CAAgB,IAAA,EAAqB,eAAA,GAA2B,KAAA,EAAe;AAC7F,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAuDK,IAAA,CAAK,KAAA,GAAQ,CAAA,kBAAA,EAAqBC,6BAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,CAAC,WAAW,EAAE;AAAA,YAAA,EAClG,IAAA,CAAK,OAAA,GAAU,CAAA,kBAAA,EAAqBA,6BAAA,CAAY,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAC,WAAW,EAAE;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,eAAA,EAkErG,IAAA,CAAK,WAAW,OAAO;AAAA;AAAA;AAAA;AAAA;;AAAA,MAAA,EAMhC,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,GAyChB,EAAE;AAAA;AAAA;AAAA,EAAA,CAAA;AAIZ;;;AChLO,SAAS,mBAAmB,IAAA,EAAgC;AACjE,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EA2CK,IAAA,CAAK,KAAA,GAAQ,CAAA,kBAAA,EAAqBA,6BAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,CAAC,WAAW,EAAE;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAgHhH;ACzIA,eAAsB,sBAAsB,EAAA,EAAkC;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,OAAA,CAAQ,2CAA2C,CAAA,CACxE,IAAA,CAAK,WAAW,CAAA,CAChB,KAAA,EAAM;AAET,IAAA,IAAI,QAAQ,QAAA,EAAU;AAGpB,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;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAQA,eAAsB,wBAAwB,EAAA,EAAkC;AAC9E,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAM,EAAA,CAAG,OAAA,CAAQ,qCAAqC,EAAE,KAAA,EAAM;AAC7E,IAAA,OAAO,QAAQ,KAAA,KAAU,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AA6CA,IAAM,sBAAA,GAAyBF,MAAE,MAAA,CAAO;AAAA,EACtC,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAM,yBAAyB,CAAA;AAAA,EACjD,UAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,wCAAwC,CAAA;AAAA,EACpE,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAA,EAAG,wCAAwC,EAAE,QAAA,EAAS;AAAA,EAC/E,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,UAAA;AAEH,QAAA,OAAO,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,MAClE,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,CAAA;;;AC5GA,IAAI,cAAA,GAA2C,IAAA;AAExC,SAAS,kBAAkB,MAAA,EAAiC;AACjE,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAA,CAAQ,KAAK,sFAAiF,CAAA;AAAA,EAChG;AACA,EAAA,cAAA,GAAiB,MAAA;AACnB;AAEO,SAAS,oBAAA,GAAiD;AAC/D,EAAA,OAAO,cAAA;AACT;AAEO,SAAS,uBAAA,GAA+C;AAC7D,EAAA,IAAI,CAAC,cAAA,EAAgB,OAAO,EAAC;AAC7B,EAAA,MAAM,WAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,KAAA,IAAS,eAAe,MAAA,EAAQ;AACzC,IAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW;AAC/B,MAAA,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,OAAA;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,qBAAA,GAAkD;AAChE,EAAA,IAAI,CAAC,cAAA,EAAgB,OAAO,EAAC;AAC7B,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,kBAAA,IAAsB,EAAC;AAC5D,EAAA,OAAO,cAAA,CAAe,OAAO,MAAA,CAAO,CAAA,CAAA,KAAK,cAAc,QAAA,CAAS,CAAA,CAAE,IAAI,CAAC,CAAA;AACzE;;;AC9CO,SAAS,kBAAA,CACd,MACA,MAAA,EACoD;AACpD,EAAA,MAAM,SAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE7B,IAAA,IAAI,MAAM,QAAA,KAAa,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,CAAA,EAAK;AAC7E,MAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,EAAG,MAAM,KAAK,CAAA,YAAA,CAAA;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AAE3D,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AACxD,MAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,EAAG,MAAM,KAAK,CAAA,iBAAA,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9E,MAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,iBAAA,EAAoB,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACjF;AACA,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,OAAO,UAAU,SAAA,EAAW;AAC1D,MAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,EAAG,MAAM,KAAK,CAAA,sBAAA,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,KAAA,CAAM,UAAA,EAAY,GAAA,KAAQ,MAAA,IAAa,OAAO,UAAU,QAAA,IAAY,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,GAAA,EAAK;AACpG,MAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,EAAG,MAAM,KAAK,CAAA,kBAAA,EAAqB,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,CAAA;AAAA,IAC9E;AACA,IAAA,IAAI,KAAA,CAAM,UAAA,EAAY,GAAA,KAAQ,MAAA,IAAa,OAAO,UAAU,QAAA,IAAY,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,GAAA,EAAK;AACpG,MAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,EAAG,MAAM,KAAK,CAAA,iBAAA,EAAoB,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,CAAA;AAAA,IAC7E;AACA,IAAA,IAAI,KAAA,CAAM,UAAA,EAAY,OAAA,IAAW,OAAO,UAAU,QAAA,IAAY,CAAC,IAAI,MAAA,CAAO,MAAM,UAAA,CAAW,OAAO,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,EAAG;AAC/G,MAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,EAAG,MAAM,KAAK,CAAA,kBAAA,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,GAAG,MAAA,EAAO;AAC3D;AAEO,SAAS,kBAAA,CACd,MACA,MAAA,EACqB;AACrB,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,MAAA,CAAO,OAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAEzD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AAC1B,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAA,CAAO,GAAG,CAAA,GAAIG,+BAAA,CAAc,KAAK,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,gBAAA,CAAiBC,MAAgC,KAAA,EAAoC;AACnG,EAAA,IAAIA,IAAAA,KAAQ,IAAA,IAAQA,IAAAA,KAAQ,MAAA,IAAaA,SAAQ,EAAA,EAAI;AACnD,IAAA,OAAO,MAAM,OAAA,IAAW,IAAA;AAAA,EAC1B;AAEA,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,QAAA;AACH,MAAA,MAAM,GAAA,GAAM,OAAOA,IAAG,CAAA;AACtB,MAAA,OAAO,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA,GAAO,GAAA;AAAA,IAC7B,KAAK,SAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAOA,IAAAA,KAAQ,GAAA,IAAOA,IAAAA,KAAQ,MAAA,IAAUA,IAAAA,KAAQ,IAAA;AAAA,IAClD,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAKA,IAAG,EAAE,OAAA,EAAQ;AACjC,MAAA,OAAO,KAAA,CAAM,EAAE,CAAA,GAAI,IAAA,GAAO,EAAA;AAAA,IAC5B;AACE,MAAA,OAAOA,IAAAA;AAAA;AAEb;AAEO,SAAS,2BAAA,CACd,UACA,MAAA,EACqB;AACrB,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,MAAMA,IAAAA,GAAM,SAAS,GAAA,CAAI,CAAA,OAAA,EAAU,MAAM,IAAI,CAAA,CAAE,GAAG,QAAA,EAAS;AAE3D,IAAA,IAAIA,IAAAA,KAAQ,IAAA,IAAQA,IAAAA,KAAQ,MAAA,EAAW;AACrC,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,SAAS,UAAA,EAAY;AACzD,QAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAAA,MACvB;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,gBAAA,CAAiBA,MAAK,KAAK,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,aAAA,CAAc,IAAS,MAAA,EAA8C;AACzF,EAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CACf,OAAA,CAAQ,kDAAkD,CAAA,CAC1D,IAAA,CAAK,MAAM,CAAA,CACX,KAAA,EAAM;AAET,EAAA,IAAI,CAAC,GAAA,EAAK,IAAA,EAAM,OAAO,EAAC;AACxB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,eAAsB,cAAA,CACpB,EAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,EAAA,EAAI,MAAM,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,QAAA,EAAU,GAAG,OAAA,EAAQ;AACzC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGlC,EAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CACf,OAAA,CAAQ,gDAAgD,CAAA,CACxD,IAAA,CAAK,MAAM,CAAA,CACX,KAAA,EAAM;AAET,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,EAAA,CACH,OAAA,CAAQ,qEAAqE,CAAA,CAC7E,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,GAAA,EAAI,EAAG,MAAM,CAAA,CAC7B,GAAA,EAAI;AAAA,EACT,CAAA,MAAO;AACL,IAAA,MAAM,SAAA,GAAY,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACrF,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,EAAA,CACH,OAAA;AAAA,MACC;AAAA,KACF,CACC,KAAK,SAAA,EAAW,MAAA,EAAQ,MAAM,GAAA,EAAK,GAAG,EACtC,GAAA,EAAI;AAAA,EACT;AACF;;;ACtJO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,OAAO;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AA6FT;;;AC9FA,SAAS,uBAAA,GAAkC;AACzC,EAAA,OAAO;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAwIT;AAEA,IAAM,sBAAA,GAAyB,WAAA;AAC/B,IAAM,iBAAA,GAAoB,iBAAA;AAE1B,SAAS,0BAA0B,SAAA,EAA2B;AAC5D,EAAA,OAAO,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,CACvB,KAAA,CAAM,iBAAiB,CAAA,CACvB,GAAA;AAAA,IAAI,CAAC,YAAA,KACJ,YAAA,CACG,KAAA,CAAM,sBAAsB,CAAA,CAC5B,GAAA;AAAA,MAAI,CAAC,OAAA,KACJ,OAAA,CACG,WAAA,EAAY,CACZ,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,UAAA,EAAY,EAAE;AAAA,KAC3B,CACC,KAAK,sBAAsB;AAAA,GAChC,CACC,KAAK,iBAAiB,CAAA;AAC3B;AA2BA,SAAS,0BAA0B,SAAA,EAA4B;AAC7D,EAAA,OAAO,SAAA,KAAc,UAAA,IAAc,SAAA,KAAc,WAAA,IAAe,SAAA,KAAc,SAAA;AAChF;AAEA,SAAS,kBAAkB,SAAA,EAAgE;AACzF,EAAA,IAAI,SAAA,KAAc,UAAA,IAAc,SAAA,KAAc,SAAA,EAAW;AACvD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,UAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,IAAI,yBAAA,CAA0B,SAAS,CAAA,EAAG;AACxC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,UAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,kBAAA,CAAmB,KAAA,EAAwB,OAAA,GAA8B,EAAC,EAAW;AACnG,EAAA,MAAM,EAAE,KAAA,GAAQ,EAAA,EAAI,MAAA,GAAS,IAAI,QAAA,GAAW,KAAA,EAAO,SAAA,GAAY,EAAA,EAAI,iBAAiB,EAAC,EAAG,eAAe,EAAA,EAAI,SAAA,GAAY,IAAG,GAAI,OAAA;AAC9H,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,IAAiB,EAAC;AACrC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,WAAA,GAAc,UAAA,GAAa,EAAA;AAClD,EAAA,MAAM,WAAA,GAAc,oTAAoT,SAAS,CAAA,CAAA;AACjV,EAAA,MAAM,YAAA,GACJ,MAAA,CAAO,MAAA,GAAS,CAAA,GACZ,+EAAA,GACA,EAAA;AAEN,EAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,KAAA,CAAM,UAAU,CAAA,CAAA;AACzC,EAAA,MAAM,YAAY,KAAA,CAAM,UAAA;AAIxB,EAAA,IAAI,kBAAA,GAAqB,KAAA;AACzB,EAAA,IAAI,eAAA,GAAkB,EAAA;AAEtB,EAAA,IAAI,KAAA,CAAM,UAAA,KAAe,OAAA,IAAW,CAAC,eAAe,YAAA,EAAc;AAChE,IAAA,kBAAA,GAAqB,IAAA;AACrB,IAAA,eAAA,GAAkB,wEAAA;AAAA,EACpB,WAAW,yBAAA,CAA0B,KAAA,CAAM,UAAU,CAAA,IAAK,CAAC,eAAe,gBAAA,EAAkB;AAC1F,IAAA,kBAAA,GAAqB,IAAA;AACrB,IAAA,eAAA,GAAkB,2EAAA;AAAA,EACpB,CAAA,MAAA,IAAA,CAAY,MAAM,UAAA,KAAe,UAAA,IAAc,MAAM,UAAA,KAAe,SAAA,KAAc,CAAC,cAAA,CAAe,cAAA,EAAgB;AAChH,IAAA,kBAAA,GAAqB,IAAA;AACrB,IAAA,eAAA,GAAkB,mEAAA;AAAA,EACpB;AAGA,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,OAAO;AAAA;AAAA,QAAA,EAED,eAAA,GAAkB,CAAA,iKAAA,EAAoK,eAAe,CAAA,MAAA,CAAA,GAAW,EAAE;AAAA;AAAA,cAAA,EAE5M,OAAO,CAAA;AAAA,gBAAA,EACL,SAAS,CAAA;AAAA,gBAAA,EACT,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,GAAS,EAAE,CAAA,GAAI,EAAE,CAAA;AAAA,uBAAA,EACrD,IAAA,CAAK,eAAe,EAAE,CAAA;AAAA,qBAAA,EACxB,IAAA,CAAK,aAAa,EAAE,CAAA;AAAA,iBAAA,EACxB,WAAW,IAAI,YAAY,CAAA;AAAA,UAAA,EAClC,QAAQ;AAAA,UAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA,SAAA,EAC3BC,WAAAA,CAAW,KAAK,CAAC,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAG1B;AAEA,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,QAAQ,MAAM,UAAA;AAAY,IACxB,KAAK,MAAA;AACH,MAAA,IAAI,WAAA,GAAc,EAAA;AAClB,MAAA,IAAI,cAAA,GAAiB,EAAA;AAErB,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,IAAI,IAAA,CAAK,OAAA,KAAY,cAAA,IAAkB,IAAA,CAAK,YAAY,kBAAA,EAAoB;AAC1E,UAAA,WAAA,GACE,kHAAA;AAGF,UAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,YAAA,WAAA,IACE,CAAA,oMAAA,CAAA;AACF,YAAA,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6DAAA,EAmBkC,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,+CAAA,EAIrB,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAAA,UAO9C;AAAA,QACF,CAAA,MAAO;AACL,UAAA,WAAA,GACE,yFAAA;AAAA,QACJ;AAAA,MACF;AAEA,MAAA,SAAA,GAAY;AAAA;AAAA;AAAA,cAAA,EAGF,OAAO,CAAA;AAAA,gBAAA,EACL,SAAS,CAAA;AAAA,iBAAA,EACRA,WAAAA,CAAW,KAAK,CAAC,CAAA;AAAA,uBAAA,EACX,IAAA,CAAK,eAAe,EAAE,CAAA;AAAA,qBAAA,EACxB,IAAA,CAAK,aAAa,EAAE,CAAA;AAAA,UAAA,EAC/B,KAAK,OAAA,GAAU,CAAA,cAAA,EAAiB,IAAA,CAAK,OAAO,MAAM,EAAE;AAAA,iBAAA,EAC7C,WAAW,IAAI,YAAY,CAAA;AAAA,UAAA,EAClC,QAAQ;AAAA,UAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA,QAAA,EAE5B,WAAW;AAAA,QAAA,EACX,cAAc;AAAA,QAAA,EAEd,KAAK,OAAA,GACD;AAAA;AAAA;AAAA,mDAAA,EAGuC,OAAO,CAAA;AAAA,wCAAA,EAClB,KAAK,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAI/B,IAAA,CAAK,OAAO,CAAA,6BAAA,EAAgC,IAAA,CAAK,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,GAgBjE,EACN;AAAA,MAAA,CAAA;AAEF,MAAA;AAAA,IAEF,KAAK,UAAA;AACH,MAAA,SAAA,GAAY;AAAA;AAAA,cAAA,EAEF,OAAO,CAAA;AAAA,gBAAA,EACL,SAAS,CAAA;AAAA,gBAAA,EACT,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,uBAAA,EACP,IAAA,CAAK,eAAe,EAAE,CAAA;AAAA,qBAAA,EACxB,IAAA,CAAK,aAAa,EAAE,CAAA;AAAA,iBAAA,EACxB,WAAW,IAAI,YAAY,CAAA;AAAA,UAAA,EAClC,QAAQ;AAAA,UAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA,SAAA,EAC3BA,WAAAA,CAAW,KAAK,CAAC,CAAA;AAAA,MAAA,CAAA;AAEtB,MAAA;AAAA,IAEF,KAAK,UAAA;AAAA,IACL,KAAK,SAAA,EACH;AACA,MAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,KAAA,CAAM,UAAU,CAAA;AACzD,MAAA,SAAA,GAAY;AAAA,qDAAA,EACqC,IAAA,CAAK,MAAA,IAAU,GAAG,CAAA,gBAAA,EAAmB,KAAK,OAAA,IAAW,MAAM,CAAA,sBAAA,EAAyB,cAAA,EAAgB,MAAA,IAAU,EAAE,CAAA,wBAAA,EAA2B,cAAA,EAAgB,YAAY,EAAE,CAAA;AAAA;AAAA,gBAAA,EAE9M,OAAO,CAAA;AAAA,kBAAA,EACL,SAAS,CAAA;AAAA,mBAAA,EACR,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,QAAA,EAAW,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,YAAA,EAC/D,QAAQ;AAAA,YAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA,WAAA,EAC3BA,WAAAA,CAAW,KAAK,CAAC,CAAA;AAAA;AAAA,MAAA,CAAA;AAGxB,MAAA;AAAA,IACA;AAAA,IAEF,KAAK,OAAA;AAEH,MAAA,SAAA,GAAY;AAAA,2DAAA,EAC2C,OAAO,CAAA;AAAA;AAAA;AAAA,gBAAA,EAGlD,OAAO,CAAA;AAAA;AAAA,wBAAA,EAEC,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,0BAAA,EAClB,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,8BAAA,EAClB,IAAA,CAAK,eAAe,kBAAkB,CAAA;AAAA,yBAAA,EAC3C,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,WAAA,EAChC,KAAK,CAAA;;AAAA;AAAA;AAAA;AAAA,gBAAA,EAKA,OAAO,CAAA;AAAA,kBAAA,EACL,SAAS,CAAA;AAAA,mBAAA,EACRA,WAAAA,CAAW,KAAK,CAAC,CAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAIhC,MAAA;AAAA,IAEF,KAAK,UAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL,KAAK,SAAA,EACH;AACA,MAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,KAAA,CAAM,UAAU,CAAA;AAGzD,MAAA,SAAA,GAAY;AAAA,qDAAA,EACqC,IAAA,CAAK,MAAA,IAAU,GAAG,CAAA,gBAAA,EAAmB,KAAK,OAAA,IAAW,MAAM,CAAA,sBAAA,EAAyB,cAAA,EAAgB,MAAA,IAAU,EAAE,CAAA,wBAAA,EAA2B,cAAA,EAAgB,YAAY,EAAE,CAAA;AAAA;AAAA,gBAAA,EAE9M,OAAO,CAAA;AAAA,kBAAA,EACL,SAAS,CAAA;AAAA,mBAAA,EACR,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,QAAA,EAAW,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,YAAA,EAC/D,QAAQ;AAAA,YAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA,WAAA,EAC3BA,WAAAA,CAAW,KAAK,CAAC,CAAA;AAAA;AAAA,MAAA,CAAA;AAGxB,MAAA;AAAA,IACA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,SAAA,GAAY;AAAA;AAAA;AAAA,cAAA,EAGF,OAAO,CAAA;AAAA,gBAAA,EACL,SAAS,CAAA;AAAA,iBAAA,EACR,KAAK,CAAA;AAAA,eAAA,EACP,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,eAAA,EACd,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,gBAAA,EACb,IAAA,CAAK,QAAQ,EAAE,CAAA;AAAA,uBAAA,EACR,IAAA,CAAK,eAAe,EAAE,CAAA;AAAA,iBAAA,EAC5B,WAAW,IAAI,YAAY,CAAA;AAAA,UAAA,EAClC,QAAQ;AAAA,UAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA,MAAA,CAAA;AAGhC,MAAA;AAAA,IAEF,KAAK,SAAA;AACH,MAAA,MAAM,UAAU,KAAA,KAAU,IAAA,IAAQ,UAAU,MAAA,IAAU,KAAA,KAAU,MAAM,SAAA,GAAY,EAAA;AAClF,MAAA,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA,gBAAA,EAIA,OAAO,CAAA;AAAA,kBAAA,EACL,SAAS,CAAA;AAAA;AAAA;AAAA,YAAA,EAGf,OAAO;AAAA,YAAA,EACP,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA,sBAAA,EAEhB,OAAO,CAAA;AAAA,YAAA,EACjB,IAAA,CAAK,aAAA,IAAiB,KAAA,CAAM,WAAW;AAAA;AAAA;AAAA,mCAAA,EAGhB,SAAS,CAAA;AAAA,MAAA,CAAA;AAExC,MAAA;AAAA,IAEF,KAAK,MAAA;AACH,MAAA,SAAA,GAAY;AAAA;AAAA;AAAA,cAAA,EAGF,OAAO,CAAA;AAAA,gBAAA,EACL,SAAS,CAAA;AAAA,iBAAA,EACR,KAAK,CAAA;AAAA,eAAA,EACP,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,eAAA,EACd,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,iBAAA,EACZ,WAAW,IAAI,YAAY,CAAA;AAAA,UAAA,EAClC,QAAQ;AAAA,UAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA,MAAA,CAAA;AAGhC,MAAA;AAAA,IAEF,KAAK,UAAA;AACH,MAAA,SAAA,GAAY;AAAA;AAAA;AAAA,cAAA,EAGF,OAAO,CAAA;AAAA,gBAAA,EACL,SAAS,CAAA;AAAA,iBAAA,EACR,KAAK,CAAA;AAAA,eAAA,EACP,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,eAAA,EACd,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,iBAAA,EACZ,WAAW,IAAI,YAAY,CAAA;AAAA,UAAA,EAClC,QAAQ;AAAA,UAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA,MAAA,CAAA;AAGhC,MAAA;AAAA,IAEF,KAAK,MAAA;AAEH,MAAA,MAAM,WAAA,GAAc,KAAK,OAAA,IAAW,cAAA;AACpC,MAAA,MAAM,iBAAA,GAAoB,YAAA,IAAgB,IAAA,CAAK,YAAA,IAAgB,EAAA;AAC/D,MAAA,MAAM,cAAA,GAAiB,SAAA,IAAa,IAAA,CAAK,SAAA,IAAa,EAAA;AACtD,MAAA,MAAM,UAAA,GAAa,CAAC,CAAC,KAAA;AAErB,MAAA,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA,gBAAA,EAIA,OAAO,CAAA;AAAA,kBAAA,EACL,SAAS,CAAA;AAAA,mBAAA,EACRA,WAAAA,CAAW,KAAK,CAAC,CAAA;AAAA,yBAAA,EACX,IAAA,CAAK,eAAe,mBAAmB,CAAA;AAAA,uBAAA,EACzC,IAAA,CAAK,aAAa,GAAG,CAAA;AAAA,0BAAA,EAClB,WAAW,CAAA;AAAA,gCAAA,EACL,iBAAiB,CAAA;AAAA,6BAAA,EACpB,cAAc,CAAA;AAAA,+BAAA,EACZ,UAAU,CAAA;AAAA,mBAAA,EACtB,WAAW,IAAI,YAAY,CAAA;AAAA,YAAA,EAClC,QAAQ;AAAA,YAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA,mBAAA,EAEnB,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,oDAAA,EAI0B,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uDAAA,EAYvB,OAAO,CAAA;AAAA,uDAAA,EACP,OAAO,CAAA;AAAA;AAAA,wCAAA,EAEtB,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAAA,EAiHR,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAcjE,MAAA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,MAAM,aAAA,GACJ,IAAA,CAAK,OAAA,KACJ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GACpB,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,aAAqB,KAAA,MAAmB;AAAA,QACrD,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO,IAAA,CAAK,UAAA,GAAa,KAAK,CAAA,IAAK;AAAA,OACrC,CAAE,IACF,EAAC,CAAA;AACP,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,GAAW,UAAA,GAAa,EAAA;AAC9C,MAAA,MAAM,iBAAiB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAE5D,MAAA,SAAA,GAAY;AAAA;AAAA,cAAA,EAEF,OAAO,CAAA;AAAA,gBAAA,EACL,SAAS,CAAA,EAAG,IAAA,CAAK,QAAA,GAAW,OAAO,EAAE,CAAA;AAAA,iBAAA,EACpC,WAAW,IAAI,YAAY,CAAA;AAAA,UAAA,EAClC,QAAQ;AAAA,UAAA,EACR,QAAQ;AAAA,UAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA,UAAA,EAE1B,CAAC,QAAA,IAAY,CAAC,IAAA,CAAK,QAAA,GAAW,kDAAkD,EAAE;AAAA,UAAA,EAClF,aAAA,CACC,GAAA,CAAI,CAAC,MAAA,KAAgB;AACpB,QAAA,MAAM,WAAA,GAAc,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,KAAA;AACjE,QAAA,MAAM,WAAA,GAAc,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,KAAA;AACjE,QAAA,MAAM,QAAA,GAAW,cAAA,CAAe,QAAA,CAAS,WAAW,IAAI,UAAA,GAAa,EAAA;AACrE,QAAA,OAAO,CAAA,eAAA,EAAkBA,YAAW,WAAW,CAAC,KAAK,QAAQ,CAAA,CAAA,EAAIA,WAAAA,CAAW,WAAW,CAAC,CAAA,SAAA,CAAA;AAAA,MAC1F,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA,QAAA,EAGX,KAAK,WAAA,GACD;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAKS,WAAA,CAAY,OAAA,CAAQ,iBAAA,EAAmB,gBAAgB,CAAC,CAAA;AAAA,yEAAA,EACJ,OAAO,CAAA;AAAA;AAAA;AAAA,QAAA,CAAA,GAIpE,EACN;AAAA,MAAA,CAAA;AAEF,MAAA;AAAA,IAEF,KAAK,OAAA;AACH,MAAA,MAAM,YAAA,GACJ,IAAA,CAAK,OAAA,KACJ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GACpB,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,aAAqB,KAAA,MAAmB;AAAA,QACrD,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO,IAAA,CAAK,UAAA,GAAa,KAAK,CAAA,IAAK;AAAA,OACrC,CAAE,IACF,EAAC,CAAA;AACP,MAAA,MAAM,kBAAA,GACJ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,GAC7B,MAAA,CAAO,KAAK,CAAA,GACZ,IAAA,CAAK,OAAA,GACH,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,GACnB,EAAA;AAER,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,KAAW,IAAA;AACjC,MAAA,SAAA,GAAY;AAAA,oBAAA,EACI,QAAA,GAAW,yBAAyB,WAAW,CAAA;AAAA,UAAA,EACzD,YAAA,CACC,GAAA,CAAI,CAAC,MAAA,EAAa,KAAA,KAAkB;AACnC,QAAA,MAAM,WAAA,GAAc,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,KAAA;AACjE,QAAA,MAAM,WAAA,GAAc,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,KAAA;AACjE,QAAA,MAAM,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA;AAC1C,QAAA,MAAMC,QAAAA,GAAU,kBAAA,KAAuB,MAAA,CAAO,WAAW,IAAI,SAAA,GAAY,EAAA;AACzE,QAAA,OAAO;AAAA,4BAAA,EACS,OAAO,CAAA;AAAA;AAAA;AAAA,wBAAA,EAGX,OAAO,CAAA;AAAA,0BAAA,EACL,SAAS,CAAA;AAAA,2BAAA,EACRD,WAAAA,CAAW,WAAW,CAAC,CAAA;AAAA;AAAA,oBAAA,EAE9BC,QAAO;AAAA,oBAAA,EACP,QAAQ;AAAA,oBAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA,wBAAA,EAEtBD,WAAAA,CAAW,WAAW,CAAC,CAAA;AAAA;AAAA,cAAA,CAAA;AAAA,MAGrC,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA,MAAA,CAAA;AAGf,MAAA;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,IAAI,uBAAiC,EAAC;AACtC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAClC,QAAA,oBAAA,GAAuB,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAAA,MACvD,WAAW,OAAO,IAAA,CAAK,UAAA,KAAe,QAAA,IAAY,KAAK,UAAA,EAAY;AACjE,QAAA,oBAAA,GAAuB,CAAC,KAAK,UAAU,CAAA;AAAA,MACzC;AACA,MAAA,MAAM,wBAAA,GAA2B,oBAAA,CAAqB,IAAA,CAAK,GAAG,CAAA;AAC9D,MAAA,MAAM,sBAAA,GAAyB,qBAAqB,MAAA,GAAS,CAAA;AAC7D,MAAA,MAAM,iBAAA,GAAoB,QAAQ,KAAK,CAAA;AACvC,MAAA,SAAA,GAAY;AAAA,qFAAA,EACqEA,YAAW,SAAS,CAAC,CAAA,6BAAA,EAAgCA,WAAAA,CAAW,qBAAqB,CAAC,CAAA,IAAK,EAAE,CAAC,iCAAiCA,WAAAA,CAAW,wBAAwB,CAAC,CAAA,0BAAA,EAA6B,sBAAA,GAAyB,SAAS,OAAO,CAAA;AAAA,mCAAA,EAC3R,OAAO,CAAA,QAAA,EAAW,SAAS,CAAA,SAAA,EAAYA,WAAAA,CAAW,KAAK,CAAC,CAAA;AAAA;AAAA;AAAA,gLAAA,EAGqF,sBAAA,GAAyB,oEAAoE,+BAA+B,CAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAIpR,sBAAA,GAAyB,MAAM,IAAI,CAAA;AAAA,6BAAA,EAC9B,sBAAA,GAAyB,UAAU,MAAM,CAAA;AAAA;AAAA,cAAA,EAExD,sBAAA,GAA0B,iBAAA,GAAoB,sBAAA,GAAyB,wBAAA,GAA4B,sCAAsC;AAAA;AAAA;AAAA;AAAA;AAAA,gDAAA,EAKvG,OAAO,CAAA;AAAA;AAAA,gBAAA,EAEvC,sBAAA,GAAyB,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAAA,EAMV,OAAO,CAAA;AAAA;AAAA;AAAA,gBAAA,EAGrC,iBAAA,GAAoB,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAQ/C,MAAA;AAAA,IAEF,KAAK,OAAA;AAEH,MAAA,MAAM,UAAA,GAAa,KAAK,QAAA,KAAa,IAAA;AACrC,MAAA,MAAM,cACJ,UAAA,IAAc,KAAA,GACV,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACjB,KAAA,GACA,MAAA,CAAO,KAAK,EAAE,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,OAAO,IACzC,EAAC;AACP,MAAA,MAAM,WAAA,GAAc,CAAC,UAAA,GAAa,KAAA,GAAQ,EAAA;AAG1C,MAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAgB;AAClC,QAAA,MAAM,kBAAkB,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAChE,QAAA,OAAO,eAAA,CAAgB,KAAK,CAAC,GAAA,KAAQ,IAAI,WAAA,EAAY,CAAE,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,MACtE,CAAA;AAGA,MAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,EAAa,GAAA,EAAa,OAAA,KAAoB;AACxE,QAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,UAAA,OAAO,CAAA,YAAA,EAAe,GAAG,CAAA,SAAA,EAAY,OAAO,CAAA,gBAAA,CAAA;AAAA,QAC9C;AACA,QAAA,OAAO,CAAA,UAAA,EAAa,GAAG,CAAA,OAAA,EAAU,GAAG,YAAY,OAAO,CAAA,EAAA,CAAA;AAAA,MACzD,CAAA;AAEA,MAAA,SAAA,GAAY;AAAA;AAAA,mCAAA,EAEmB,OAAO,CAAA,QAAA,EAAW,SAAS,CAAA,SAAA,EAAY,UAAA,GAAa,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA,GAAI,WAAW,CAAA,iBAAA,EAAoB,UAAU,CAAA;;AAAA,UAAA,EAG9I,UAAA,GACI;AAAA,uEAAA,EACyD,YAAY,MAAA,KAAW,CAAA,GAAI,QAAA,GAAW,EAAE,SAAS,OAAO,CAAA;AAAA,cAAA,EACjH,WAAA,CACC,GAAA;AAAA,QACC,CAAC,KAAa,GAAA,KAAgB;AAAA,mEAAA,EACqB,GAAG,CAAA;AAAA,kBAAA,EACpD,mBAAmB,GAAA,EAAK,CAAA,MAAA,EAAS,MAAM,CAAC,CAAA,CAAA,EAAI,4DAA4D,CAAC;AAAA;AAAA;AAAA,sDAAA,EAGrE,OAAO,OAAO,GAAG,CAAA;AAAA;AAAA;AAAA,oBAAA,EAGnD,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA;AAAA,OAQhC,CACC,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA,UAAA,CAAA,GAGT;AAAA,sCAAA,EACwB,WAAA,GAAc,EAAA,GAAK,QAAQ,CAAA,MAAA,EAAS,OAAO,CAAA;AAAA,cAAA,EACnE,cAAc,kBAAA,CAAmB,WAAA,EAAa,gBAAA,EAAkB,0DAA0D,IAAI,EAAE;AAAA;AAAA,UAAA,CAGtI;;AAAA;AAAA;AAAA;AAAA,0CAAA,EAKkC,OAAO,MAAM,UAAU,CAAA;AAAA;AAAA,cAAA,EAEnD,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAK1B,UAAA,GAAa,4BAA4B,cAAc;AAAA;AAAA,YAAA,EAAA,CAGxD,UAAA,GAAa,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,IACnC;AAAA;AAAA;AAAA,0CAAA,EAG0B,OAAO,CAAA;AAAA;AAAA;AAAA,gBAAA,EAGjC,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA,gBAAA,EAE1B,UAAA,GAAa,cAAc,QAAQ;AAAA;AAAA,YAAA,CAAA,GAGnC,EACN;AAAA;AAAA;AAAA,MAAA,CAAA;AAIN,MAAA;AAAA,IAEF,KAAK,QAAA;AAEH,MAAA,OAAO,2BAAA,CAA4B,KAAA,EAAO,OAAkC,CAAA;AAAA,IAE9E,KAAK,OAAA;AAEH,MAAA,MAAM,WAAA,GAAc,KAAK,KAAA,IAAS,OAAO,KAAK,KAAA,KAAU,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,EAAC;AACjF,MAAA,IAAI,WAAA,CAAY,MAAA,IAAU,OAAO,WAAA,CAAY,WAAW,QAAA,EAAU;AAEhE,QAAA,OAAO,iBAAA,CAAkB,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,YAAY,CAAA;AAAA,MACpE;AAEA,MAAA,OAAO,0BAAA,CAA2B,KAAA,EAAO,OAAkC,CAAA;AAAA,IAE7E;AACE,MAAA,SAAA,GAAY;AAAA;AAAA;AAAA,cAAA,EAGF,OAAO,CAAA;AAAA,gBAAA,EACL,SAAS,CAAA;AAAA,iBAAA,EACRA,WAAAA,CAAW,KAAK,CAAC,CAAA;AAAA,iBAAA,EACjB,WAAW,IAAI,YAAY,CAAA;AAAA,UAAA,EAClC,QAAQ;AAAA,UAAA,EACR,QAAA,GAAW,aAAa,EAAE;AAAA;AAAA,MAAA,CAAA;AAAA;AAKpC,EAAA,MAAM,SAAA,GAAY,MAAM,UAAA,KAAe,SAAA;AAEvC,EAAA,OAAO;AAAA,6CAAA,EACsC,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,OAAO,CAAA;AAAA,MAAA,EAE3E,SAAA,GACI;AAAA,kBAAA,EACQ,OAAO,CAAA;AAAA,QAAA,EACjBA,WAAAA,CAAW,KAAA,CAAM,WAAW,CAAC;AAAA,QAAA,EAC7B,KAAA,CAAM,WAAA,GAAc,8DAAA,GAAiE,EAAE;AAAA;AAAA,MAAA,CAAA,GAGrF,EACN;AAAA,MAAA,EACE,SAAS;AAAA,MAAA,EAET,MAAA,CAAO,SAAS,CAAA,GACZ;AAAA;AAAA,UAAA,EAEA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,KAAA,EAAQA,WAAAA,CAAW,KAAK,CAAC,CAAA,MAAA,CAAQ,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA,MAAA,CAAA,GAGjE,EACN;AAAA,MAAA,EAEE,KAAK,QAAA,GACD;AAAA;AAAA,UAAA,EAEAA,WAAAA,CAAW,IAAA,CAAK,QAAQ,CAAC;AAAA;AAAA,MAAA,CAAA,GAGzB,EACN;AAAA;AAAA,EAAA,CAAA;AAGN;AAEO,SAAS,gBAAA,CACd,KAAA,EACA,MAAA,EACA,WAAA,GAAuB,KAAA,EACf;AACR,EAAA,MAAM,UAAU,KAAA,CAAM,WAAA,EAAY,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAEvD,EAAA,OAAO;AAAA,0IAAA,EACmIA,WAAAA,CAAW,OAAO,CAAC,CAAA;AAAA,+FAAA,EAC9D,cAAc,gBAAA,GAAmB,EAAE,CAAA,EAAA,EAAK,WAAA,GAAc,qCAAqC,EAAE,CAAA;AAAA;AAAA,UAAA,EAElLA,WAAAA,CAAW,KAAK,CAAC;AAAA,UAAA,EAEjB,WAAA,GACI;AAAA,qBAAA,EACO,OAAO,CAAA;AAAA;AAAA;AAAA,UAAA,CAAA,GAId,EACN;AAAA;AAAA;AAAA,eAAA,EAGO,OAAO,CAAA,yDAAA,EAA4D,WAAA,GAAc,aAAA,GAAgB,EAAE,CAAA;AAAA,QAAA,EAC1G,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA,EAAA,CAAA;AAIzB;AAEA,SAAS,iBAAA,CACP,KAAA,EACA,OAAA,EACA,WAAA,EACA,YAAA,EACQ;AACR,EAAA,MAAM,EAAE,KAAA,GAAQ,IAAI,cAAA,GAAiB,IAAG,GAAI,OAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,IAAiB,EAAC;AACrC,EAAA,MAAM,WAAA,GAAc,KAAK,KAAA,IAAS,OAAO,KAAK,KAAA,KAAU,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,EAAC;AACjF,EAAA,MAAM,MAAA,GAAS,yBAAA,CAA0B,WAAA,CAAY,MAAM,CAAA;AAC3D,EAAA,MAAM,aAAA,GACJ,OAAO,WAAA,CAAY,aAAA,KAAkB,YAAY,WAAA,CAAY,aAAA,GACzD,YAAY,aAAA,GACZ,WAAA;AACN,EAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,KAAA,EAAO,aAAa,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,KAAA,CAAM,UAAU,CAAA,CAAA;AACzC,EAAA,MAAM,YAAY,KAAA,CAAM,UAAA;AACxB,EAAA,MAAM,UAAA,GACJ,WAAA,CAAY,MAAA,KAAW,CAAA,GACnB;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,GAKA,EAAA;AAEN,EAAA,MAAM,eAAe,MAAA,CAClB,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,eAAA,EAAkBA,YAAW,KAAA,CAAM,IAAI,CAAC,CAAA,EAAA,EAAKA,YAAW,KAAA,CAAM,KAAK,CAAC,CAAA,SAAA,CAAW,CAAA,CAC9F,KAAK,EAAE,CAAA;AAEV,EAAA,MAAM,aAAa,WAAA,CAChB,GAAA;AAAA,IAAI,CAAC,YAAY,KAAA,KAChB,eAAA,CAAgB,OAAO,UAAA,EAAY,MAAA,EAAQ,aAAA,EAAe,KAAA,EAAO,cAAc;AAAA,GACjF,CACC,KAAK,EAAE,CAAA;AAEV,EAAA,MAAM,SAAA,GAAY,MAAA,CACf,GAAA,CAAI,CAAC,KAAA,KAAU,mBAAA,CAAoB,KAAA,EAAO,KAAA,EAAO,aAAA,EAAe,cAAc,CAAC,CAAA,CAC/E,KAAK,EAAE,CAAA;AAEV,EAAA,OAAO;AAAA;AAAA;AAAA,mBAAA,EAGYA,WAAAA,CAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAC,CAAA;AAAA,iCAAA,EACpBA,WAAAA,CAAW,aAAa,CAAC,CAAA;AAAA,uBAAA,EACnCA,WAAAA,CAAW,SAAS,CAAC,CAAA;AAAA;AAAA,+BAAA,EAEb,OAAO,WAAW,SAAS,CAAA,SAAA,EAAYA,YAAW,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAC,CAAA;;AAAA;AAAA;AAAA,UAAA,EAInGA,WAAAA,CAAW,KAAA,CAAM,WAAA,IAAe,gBAAgB,CAAC;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,mBAAA,EAOxC,WAAW,IAAI,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAIlC,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,QAAA,EAahB,cAAc,UAAU;AAAA;;AAAA,MAAA,EAG1B,SAAS;AAAA;AAAA,IAAA,EAEX,uBAAuB;AAAA,IAAA,EACvB,sBAAsB;AAAA,EAAA,CAAA;AAE5B;AAEA,SAAS,2BAAA,CACP,KAAA,EACA,OAAA,EACA,WAAA,EACA,YAAA,EACQ;AACR,EAAA,MAAM,EAAE,KAAA,GAAQ,EAAC,EAAG,cAAA,GAAiB,EAAC,EAAG,MAAA,GAAS,EAAC,EAAE,GAAI,OAAA;AACzD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,IAAiB,EAAC;AACrC,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,OAAO,KAAK,UAAA,KAAe,QAAA,GAAW,IAAA,CAAK,UAAA,GAAa,EAAC;AAC/F,EAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,KAAA,CAAM,UAAU,CAAA,CAAA;AACzC,EAAA,MAAM,YAAY,KAAA,CAAM,UAAA;AACxB,EAAA,MAAM,WAAA,GAAc,+BAA+B,KAAK,CAAA;AACxD,EAAA,MAAM,YAAA,GAAe,KAAK,YAAA,IAAgB,QAAA;AAC1C,EAAA,MAAM,kBAAkB,YAAA,KAAiB,MAAA;AAEzC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CACxC,GAAA;AAAA,IAAI,CAAC,CAAC,YAAA,EAAc,cAAc,CAAA,KACjC,wBAAA;AAAA,MACE,KAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,KAAA,CAAM;AAAA;AACR,GACF,CACC,KAAK,EAAE,CAAA;AAEV,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,UAAA;AAE9C,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO;AAAA,qEAAA,EAC4DA,WAAAA,CAAW,SAAS,CAAC,CAAA;AAAA,iCAAA,EACzD,OAAO,WAAW,SAAS,CAAA,SAAA,EAAYA,YAAW,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAC,CAAA;AAAA;AAAA;AAAA,YAAA,EAGnGA,WAAAA,CAAW,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA,UAAA,EAIxB,SAAS;AAAA;AAAA;AAAA,MAAA,EAGb,0BAA0B;AAAA,IAAA,CAAA;AAAA,EAEhC;AAEA,EAAA,MAAM,OAAA,GAAU,yBAAA,CAA0B,KAAA,CAAM,UAAU,CAAA;AAC1D,EAAA,MAAM,cAAc,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,KAAK,SAAA,KAAc,KAAA;AAEnE,EAAA,OAAO;AAAA,sEAAA,EAC+DA,YAAW,OAAO,CAAC,CAAA,0CAAA,EAA6CA,WAAAA,CAAW,SAAS,CAAC,CAAA;AAAA;AAAA;AAAA,UAAA,EAGjJA,WAAAA,CAAW,UAAU,CAAC;AAAA,mBAAA,EACb,OAAO,CAAA,0DAAA,EAA6D,WAAA,GAAc,YAAA,GAAe,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAA,EAKvG,OAAO,CAAA,yDAAA,EAA4D,WAAA,GAAc,QAAA,GAAW,EAAE,CAAA;AAAA,iCAAA,EAC5E,OAAO,WAAW,SAAS,CAAA,SAAA,EAAYA,YAAW,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAC,CAAA;AAAA;AAAA,UAAA,EAErG,SAAS;AAAA;AAAA;AAAA;AAAA,IAAA,EAIf,0BAA0B;AAAA,EAAA,CAAA;AAEhC;AAEA,SAAS,0BAAA,CACP,KAAA,EACA,OAAA,EACA,WAAA,EACA,YAAA,EACQ;AACR,EAAA,MAAM,EAAE,KAAA,GAAQ,IAAI,cAAA,GAAiB,IAAG,GAAI,OAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,IAAiB,EAAC;AACrC,EAAA,MAAM,WAAA,GAAc,KAAK,KAAA,IAAS,OAAO,KAAK,KAAA,KAAU,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,EAAC;AACjF,EAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,KAAA,CAAM,UAAU,CAAA,CAAA;AACzC,EAAA,MAAM,YAAY,KAAA,CAAM,UAAA;AACxB,EAAA,MAAM,UAAA,GAAa,8BAA8B,KAAK,CAAA;AACtD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,IAAa,KAAA,CAAM,WAAA,IAAe,OAAA;AAC1D,EAAA,MAAM,YAAA,GAAe,OAAO,IAAA,CAAK,SAAA,KAAc,YAAY,IAAA,CAAK,SAAA,CAAU,MAAK,KAAM,EAAA;AACrF,EAAA,MAAM,cAAA,GAAiB,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,MAAK,GAAI,MAAA;AAC9D,EAAA,MAAM,YAAA,GAAe,YAAA,GAAe,CAAA,IAAA,EAAO,cAAc,CAAA,CAAA,GAAK,UAAA;AAE9D,EAAA,MAAM,QAAQ,UAAA,CACX,GAAA;AAAA,IAAI,CAAC,WAAW,KAAA,KACf,yBAAA;AAAA,MACE,KAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAO,KAAK,CAAA;AAAA,MACZ,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA;AACF,GACF,CACC,KAAK,EAAE,CAAA;AAEV,EAAA,MAAM,UAAA,GACJ,UAAA,CAAW,MAAA,KAAW,CAAA,GAClB;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,GAKA,EAAA;AAEN,EAAA,OAAO;AAAA,kEAAA,EAC2DA,WAAAA,CAAW,SAAS,CAAC,CAAA;AAAA,+BAAA,EACxD,OAAO,WAAW,SAAS,CAAA,SAAA,EAAYA,YAAW,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAC,CAAA;;AAAA;AAAA;AAAA,UAAA,EAIlGA,WAAAA,CAAW,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAOtBA,WAAAA,CAAW,YAAY,CAAC;AAAA;AAAA;;AAAA;AAAA,QAAA,EAK1B,SAAS,UAAU;AAAA;;AAAA;AAAA,QAAA,EAInB,yBAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,EAAC;AAAA,IACD,cAAA;AAAA,IACA;AAAA,GACD;AAAA;AAAA;AAAA,IAAA,EAGH,uBAAuB;AAAA,IAAA,EACvB,0BAA0B;AAAA,EAAA,CAAA;AAEhC;AAEA,SAAS,0BACP,KAAA,EACA,UAAA,EACA,KAAA,EACA,SAAA,EACA,gBACA,cAAA,EACQ;AACR,EAAA,MAAM,aAAa,0BAAA,CAA2B,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,WAAW,cAAc,CAAA;AAEjG,EAAA,OAAO;AAAA,gLAAA,EACyKA,WAAAA,CAAW,KAAK,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EASrLA,WAAAA,CAAW,cAAc,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EA4B9B,UAAU;AAAA;AAAA;AAAA,EAAA,CAAA;AAIpB;AAEA,SAAS,0BAAA,CACP,KAAA,EACA,UAAA,EACA,KAAA,EACA,WACA,cAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,YAAY,IAAA,IAAQ,QAAA;AACrC,EAAA,IACE,aAAa,QAAA,IACb,UAAA,EAAY,cACZ,OAAO,UAAA,CAAW,eAAe,QAAA,EACjC;AACA,IAAA,MAAM,WAAA,GAAc,CAAA,MAAA,EAAS,KAAA,CAAM,UAAU,IAAI,KAAK,CAAA,CAAA;AACtD,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,CACxC,GAAA;AAAA,MAAI,CAAC,CAAC,YAAA,EAAc,cAAc,CAAA,KACjC,wBAAA;AAAA,QACE,KAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAA;AAAA,QACA,aAAa,EAAC;AAAA,QACd,cAAA;AAAA,QACA;AAAA;AACF,KACF,CACC,KAAK,EAAE,CAAA;AAAA,EACZ;AAEA,EAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,UAAA,EAAY,MAAM,CAAA;AAC9D,EAAA,MAAM,UAAA,GAAa,SAAA,IAAa,eAAA,CAAgB,YAAA,IAAgB,EAAA;AAChE,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,EAAA,EAAI,CAAA,MAAA,EAAS,KAAA,CAAM,UAAU,IAAI,KAAK,CAAA,MAAA,CAAA;AAAA,IACtC,UAAA,EAAY,CAAA,MAAA,EAAS,KAAA,CAAM,UAAU,IAAI,KAAK,CAAA,MAAA,CAAA;AAAA,IAC9C,YAAY,eAAA,CAAgB,IAAA;AAAA,IAC5B,aAAa,eAAA,CAAgB,KAAA;AAAA,IAC7B,eAAe,eAAA,CAAgB,OAAA;AAAA,IAE/B,aAAa,eAAA,CAAgB,QAE/B,CAAA;AAEA,EAAA,OAAO;AAAA,sFAAA,EAC+EA,WAAAA,CAAW,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,MAAA,EAChH,mBAAmB,eAAA,EAAiB,EAAE,OAAO,UAAA,EAAY,cAAA,EAAgB,CAAC;AAAA;AAAA,EAAA,CAAA;AAGlF;AAEA,SAAS,yBACP,KAAA,EACA,YAAA,EACA,cAAA,EACA,WAAA,EACA,gBACA,WAAA,EACQ;AACR,EAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,cAAA,EAAgB,YAAY,CAAA;AACxE,EAAA,MAAM,UAAA,GAAa,WAAA,GAAc,YAAY,CAAA,IAAK,gBAAgB,YAAA,IAAgB,EAAA;AAClF,EAAA,MAAM,eAAA,GAAmC;AAAA,IAEvC,UAAA,EAAY,CAAA,EAAG,WAAW,CAAA,EAAA,EAAK,YAAY,CAAA,CAAA;AAAA,IAC3C,YAAY,eAAA,CAAgB,IAAA;AAAA,IAC5B,aAAa,eAAA,CAAgB,KAAA;AAAA,IAC7B,eAAe,eAAA,CAAgB,OAAA;AAAA,IAE/B,aAAa,eAAA,CAAgB,QAE/B,CAAA;AAEA,EAAA,OAAO;AAAA,4DAAA,EACqDA,YAAW,YAAY,CAAC,sBAAsBA,WAAAA,CAAW,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,MAAA,EACpI,mBAAmB,eAAA,EAAiB,EAAE,OAAO,UAAA,EAAY,cAAA,EAAgB,CAAC;AAAA;AAAA,EAAA,CAAA;AAGlF;AAEA,SAAS,+BAA+B,KAAA,EAAiC;AACvE,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,MAAA,OAAO,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,MAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,EAAC;AAAA,IACpF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,CAAC,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA;AAC/D,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,8BAA8B,KAAA,EAAmB;AACxD,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AACjC,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,MAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,SAAS,EAAC;AAAA,IAC3C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,0BACP,SAAA,EAC+F;AAC/F,EAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,SAAiB,EAAC;AAEzD,EAAA,OAAO,MAAA,CAAO,QAAQ,SAAS,CAAA,CAC5B,OAAO,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM,OAAO,SAAS,QAAA,IAAY,KAAA,IAAS,OAAO,KAAA,KAAU,QAAQ,CAAA,CACxF,IAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,MAAsB;AAAA,IACtC,IAAA;AAAA,IACA,KAAA,EAAO,MAAM,KAAA,IAAS,IAAA;AAAA,IACtB,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,UAAA,EAAY,MAAM,UAAA,IAAc,OAAO,MAAM,UAAA,KAAe,QAAA,GAAW,KAAA,CAAM,UAAA,GAAa;AAAC,GAC7F,CAAE,CAAA;AACN;AAEA,SAAS,oBAAA,CAAqB,OAAY,aAAA,EAA8B;AACtE,EAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,KAAc;AACnC,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AAC9C,IAAA,IAAI,IAAA,CAAK,aAAa,CAAA,EAAG,OAAO,IAAA;AAChC,IAAA,IAAI,KAAK,SAAA,IAAa,IAAA,CAAK,QAAQ,OAAO,IAAA,CAAK,SAAS,QAAA,EAAU;AAChE,MAAA,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,SAAA,EAAW,GAAG,KAAK,IAAA,EAAK;AAAA,IACzD;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KACjB,KAAA,CAAM,GAAA,CAAI,aAAa,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,IAAQ,OAAO,SAAS,QAAQ,CAAA;AAE5E,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,UAAU,KAAK,CAAA;AAChD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAK,EAAG;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,MAAA,OAAO,MAAM,OAAA,CAAQ,MAAM,IAAI,SAAA,CAAU,MAAM,IAAI,EAAC;AAAA,IACtD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,mBAAA,CACP,KAAA,EACA,KAAA,EACA,aAAA,EACA,cAAA,EACQ;AACR,EAAA,OAAO;AAAA,mCAAA,EAC4BA,WAAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,MAAA,EACnD,eAAA,CAAgB,OAAO,KAAA,EAAO,aAAA,EAAe,mBAAmB,EAAC,EAAG,cAAc,CAAC;AAAA;AAAA,EAAA,CAAA;AAG3F;AAEA,SAAS,gBACP,KAAA,EACA,UAAA,EACA,MAAA,EAMA,aAAA,EACA,OACA,cAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,UAAA,GAAa,aAAa,CAAA,IAAK,UAAA,EAAY,SAAA;AAC7D,EAAA,MAAM,kBAAkB,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,SAAS,CAAA;AAEvE,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO;AAAA,wLAAA,EAC+KA,YAAW,IAAA,CAAK,SAAA,CAAU,cAAc,EAAE,CAAC,CAAC,CAAA;AAAA,oCAAA,EAChMA,WAAAA,CAAW,MAAA,CAAO,SAAA,IAAa,SAAS,CAAC,CAAC,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAG9E;AAEA,EAAA,MAAM,IAAA,GACJ,cAAc,OAAO,UAAA,KAAe,WAChC,MAAA,CAAO,WAAA,CAAY,OAAO,OAAA,CAAQ,UAAU,EAAE,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,QAAQ,aAAa,CAAC,IACtF,EAAC;AAEP,EAAA,OAAO,eAAA,CAAgB,OAAO,eAAA,EAAiB,aAAA,EAAe,OAAO,KAAK,CAAA,EAAG,MAAM,cAAc,CAAA;AACnG;AAEA,SAAS,gBACP,KAAA,EACA,KAAA,EACA,aAAA,EACA,KAAA,EACA,MACA,cAAA,EACQ;AACR,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA,CAChD,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,WAAW,CAAA,KAAM;AACjC,IAAA,IAAI,WAAA,EAAa,IAAA,KAAS,OAAA,IAAW,WAAA,EAAa,OAAO,MAAA,EAAQ;AAC/D,MAAA,OAAO;AAAA;AAAA,mDAAA,EAEsCA,WAAAA,CAAW,SAAS,CAAC,CAAA;AAAA;AAAA,MAAA,CAAA;AAAA,IAGpE;AAEA,IAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,WAAA,EAAa,SAAS,CAAA;AAClE,IAAA,MAAM,UAAA,GAAa,IAAA,GAAO,SAAS,CAAA,IAAK,gBAAgB,YAAA,IAAgB,EAAA;AACxE,IAAA,MAAM,eAAA,GAAmC;AAAA,MACvC,IAAI,CAAA,MAAA,EAAS,KAAA,CAAM,UAAU,CAAA,CAAA,EAAI,KAAK,IAAI,SAAS,CAAA,CAAA;AAAA,MACnD,YAAY,CAAA,MAAA,EAAS,KAAA,CAAM,UAAU,CAAA,CAAA,EAAI,KAAK,IAAI,SAAS,CAAA,CAAA;AAAA,MAC3D,YAAY,eAAA,CAAgB,IAAA;AAAA,MAC5B,aAAa,eAAA,CAAgB,KAAA;AAAA,MAC7B,eAAe,eAAA,CAAgB,OAAA;AAAA,MAE/B,aAAa,eAAA,CAAgB,QAE/B,CAAA;AAEA,IAAA,OAAO;AAAA,qDAAA,EAC0CA,YAAW,SAAS,CAAC,sBAAsBA,WAAAA,CAAW,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,QAAA,EACxH,mBAAmB,eAAA,EAAiB,EAAE,OAAO,UAAA,EAAY,cAAA,EAAgB,CAAC;AAAA;AAAA,IAAA,CAAA;AAAA,EAGhF,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,EAAA,OAAO;AAAA,yJAAA,EACkJA,YAAW,KAAA,CAAM,IAAI,CAAC,CAAA,4BAAA,EAA+BA,WAAAA,CAAW,aAAa,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAUzNA,WAAAA,CAAW,KAAA,CAAM,KAAK,CAAC;AAAA;AAAA;AAAA,YAAA,EAGzB,KAAA,CAAM,cAAc,CAAA,oDAAA,EAAuDA,WAAAA,CAAW,MAAM,WAAW,CAAC,SAAS,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EA4BvH,WAAW;AAAA;AAAA;AAAA,EAAA,CAAA;AAIrB;AAEA,SAAS,mBAAA,CAAoB,aAAkB,SAAA,EAAmB;AAChE,EAAA,MAAM,IAAA,GAAO,aAAa,IAAA,IAAQ,MAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,aAAa,KAAA,IAAS,SAAA;AACpC,EAAA,MAAM,QAAA,GAAW,aAAa,QAAA,KAAa,IAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,EAAE,GAAG,WAAA,EAAY;AAEjC,EAAA,IAAI,SAAS,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA,EAAG;AACzD,IAAA,OAAA,CAAQ,UAAU,WAAA,CAAY,IAAA,CAAK,GAAA,CAAI,CAAC,OAAe,KAAA,MAAmB;AAAA,MACxE,KAAA;AAAA,MACA,KAAA,EAAO,WAAA,CAAY,UAAA,GAAa,KAAK,CAAA,IAAK;AAAA,KAC5C,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAc,WAAA,EAAa,OAAA;AAAA,IAC3B;AAAA,GACF;AACF;AAEA,SAAS,wBAAA,GAAmC;AAC1C,EAAA,OAAO;AAAA,IAAA,EACH,yBAAyB;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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AA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EA6VU,KAAK,YAAY;AAAA;AAAA;AAAA;AAAA,kBAAA,EAI7B,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,2BAAA,EAgCA,KAAK,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,iCAAA,EAYH,KAAK,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2FxC,6BAA6B;AAAA;;AAAA;AAAA;AAAA;AAAA,wBAAA,EAML,KAAK,EAAE,CAAA;AAAA,+BAAA,EACA,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,qCAAA,EACtB,gBAAgB,CAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAAA,EAsHlB,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA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","file":"chunk-LPYFMGAK.cjs","sourcesContent":["/**\n * Schema Definitions\n *\n * Placeholder for schema definitions - to be populated as needed\n */\n\nexport interface SchemaDefinition {\n name: string\n fields: any[]\n}\n\n// Empty array for now - schemas will be migrated incrementally\nexport const schemaDefinitions: SchemaDefinition[] = []\n","import type { FilterCondition, FilterGroup, QueryFilter } from '../utils/query-filter'\n\nfunction canReadNonPublicContent(userRole?: string): boolean {\n return userRole === 'admin' || userRole === 'editor'\n}\n\nfunction isStatusCondition(condition: FilterCondition): boolean {\n return condition.field === 'status'\n}\n\nfunction stripStatusConditions(group?: FilterGroup): FilterGroup | undefined {\n if (!group) {\n return undefined\n }\n\n const and = group.and?.filter(condition => !isStatusCondition(condition))\n const or = group.or?.filter(condition => !isStatusCondition(condition))\n\n const normalizedGroup: FilterGroup = {}\n\n if (and && and.length > 0) {\n normalizedGroup.and = and\n }\n\n if (or && or.length > 0) {\n normalizedGroup.or = or\n }\n\n return normalizedGroup\n}\n\nexport function normalizePublicContentFilter(filter: QueryFilter, userRole?: string): QueryFilter {\n if (canReadNonPublicContent(userRole)) {\n return filter\n }\n\n const normalizedFilter: QueryFilter = {\n ...filter,\n where: stripStatusConditions(filter.where)\n }\n\n if (!normalizedFilter.where) {\n normalizedFilter.where = { and: [] }\n }\n\n if (!normalizedFilter.where.and) {\n normalizedFilter.where.and = []\n }\n\n normalizedFilter.where.and.push({\n field: 'status',\n operator: 'equals',\n value: 'published'\n })\n\n return normalizedFilter\n}\n","/**\n * Variable Resolver\n *\n * Scans strings for {variable_key} tokens and replaces them\n * with values from the global variables map.\n *\n * Token syntax: {key} where key matches /^[a-z0-9_]+$/\n * Unresolved tokens are left as-is so editors can see what's missing.\n */\n\n// Matches {variable_key} — only lowercase alphanumeric + underscores\nconst TOKEN_PATTERN = /\\{([a-z0-9_]+)\\}/g\n\n/**\n * Replace all {variable_key} tokens in a string with their values.\n * Unresolved tokens remain unchanged.\n */\nexport function resolveVariables(\n text: string,\n variables: Map\n): string {\n if (!text || variables.size === 0) return text\n\n return text.replace(TOKEN_PATTERN, (match, key) => {\n const value = variables.get(key)\n return value !== undefined ? value : match\n })\n}\n\n/**\n * Recursively resolve variables in an object's string values.\n * Handles nested objects, arrays, and the `data` field of content items.\n */\nexport function resolveVariablesInObject(\n obj: any,\n variables: Map\n): any {\n if (!obj || variables.size === 0) return obj\n\n if (typeof obj === 'string') {\n return resolveVariables(obj, variables)\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => resolveVariablesInObject(item, variables))\n }\n\n if (typeof obj === 'object') {\n const result: Record = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key] = resolveVariablesInObject(value, variables)\n }\n return result\n }\n\n return obj\n}\n\n// ============================================================================\n// In-memory variable cache (shared with index.ts via import)\n// ============================================================================\n\nlet variableCache: Map | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL_MS = 300_000 // 5 minutes\n\nexport function getVariablesCached(): Map | null {\n const now = Date.now()\n if (variableCache && (now - cacheTimestamp) < CACHE_TTL_MS) {\n return variableCache\n }\n return null\n}\n\nexport function setVariablesCache(map: Map): void {\n variableCache = map\n cacheTimestamp = Date.now()\n}\n\nexport function invalidateVariablesCache(): void {\n variableCache = null\n cacheTimestamp = 0\n}\n\n/**\n * Resolve variables in a content object using the database.\n * Fetches variables from DB (with caching) and resolves tokens.\n * Safe to call even if the global_variables table doesn't exist yet.\n */\nexport async function resolveContentVariables(\n contentData: any,\n db: any\n): Promise {\n if (!db || !contentData) return contentData\n\n try {\n // Check cache first\n let variables = getVariablesCached()\n\n if (!variables) {\n const { results } = await db.prepare(\n 'SELECT key, value FROM global_variables WHERE is_active = 1'\n ).all()\n\n variables = new Map()\n for (const row of results || []) {\n variables.set((row as any).key, (row as any).value)\n }\n setVariablesCache(variables)\n }\n\n if (variables.size === 0) return contentData\n\n return resolveVariablesInObject(contentData, variables)\n } catch {\n // Table may not exist yet — silently return original data\n return contentData\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth, requireRole } from '../middleware'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport type { Bindings, Variables } from '../app'\nimport { resolveContentVariables } from '../plugins/core-plugins/global-variables-plugin/variable-resolver'\n\nconst apiContentCrudRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// GET /api/content/check-slug - Check if slug is available in collection\n// Query params: collectionId, slug, excludeId (optional - when editing)\n// NOTE: This MUST come before /:id route to avoid route conflict\napiContentCrudRoutes.get('/check-slug', async (c) => {\n try {\n const db = c.env.DB\n const collectionId = c.req.query('collectionId')\n const slug = c.req.query('slug')\n const excludeId = c.req.query('excludeId') // When editing, exclude current item\n \n if (!collectionId || !slug) {\n return c.json({ error: 'collectionId and slug are required' }, 400)\n }\n \n // Check for existing content with this slug in the collection\n let query = 'SELECT id FROM content WHERE collection_id = ? AND slug = ?'\n const params: string[] = [collectionId, slug]\n \n if (excludeId) {\n query += ' AND id != ?'\n params.push(excludeId)\n }\n \n const existing = await db.prepare(query).bind(...params).first()\n \n if (existing) {\n return c.json({ \n available: false, \n message: 'This URL slug is already in use in this collection' \n })\n }\n \n return c.json({ available: true })\n } catch (error: unknown) {\n console.error('Error checking slug:', error)\n return c.json({ \n error: 'Failed to check slug availability',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// GET /api/content/:id - Get single content item by ID\napiContentCrudRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n const stmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await stmt.bind(id).first()\n\n if (!content) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n const transformedContent = {\n id: (content as any).id,\n title: (content as any).title,\n slug: (content as any).slug,\n status: (content as any).status,\n collectionId: (content as any).collection_id,\n data: (content as any).data ? JSON.parse((content as any).data) : {},\n created_at: (content as any).created_at,\n updated_at: (content as any).updated_at\n }\n\n // Resolve {variable_key} tokens in content data\n const resolveVars = c.req.query('resolve_variables') !== 'false'\n if (resolveVars) {\n transformedContent.data = await resolveContentVariables(transformedContent.data, db)\n }\n\n return c.json({ data: transformedContent })\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// POST /api/content - Create new content (requires authentication)\napiContentCrudRoutes.post('/', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const db = c.env.DB\n const user = c.get('user')\n const body = await c.req.json()\n\n const { collectionId, title, slug, status, data } = body\n\n // Validate required fields\n if (!collectionId) {\n return c.json({ error: 'collectionId is required' }, 400)\n }\n\n if (!title) {\n return c.json({ error: 'title is required' }, 400)\n }\n\n // Generate slug from title if not provided\n let finalSlug = slug || title\n finalSlug = finalSlug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim()\n\n // Check for duplicate slug within the same collection\n const duplicateCheck = db.prepare(\n 'SELECT id FROM content WHERE collection_id = ? AND slug = ?'\n )\n const existing = await duplicateCheck.bind(collectionId, finalSlug).first()\n\n if (existing) {\n return c.json({ error: 'A content item with this slug already exists in this collection' }, 409)\n }\n\n // Create new content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n finalSlug,\n title,\n JSON.stringify(data || {}),\n status || 'draft',\n user?.userId || 'system',\n now,\n now\n ).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n await cache.invalidate('content-filtered:*')\n\n // Get the created content\n const getStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const createdContent = await getStmt.bind(contentId).first() as any\n\n return c.json({\n data: {\n id: createdContent.id,\n title: createdContent.title,\n slug: createdContent.slug,\n status: createdContent.status,\n collectionId: createdContent.collection_id,\n data: createdContent.data ? JSON.parse(createdContent.data) : {},\n created_at: createdContent.created_at,\n updated_at: createdContent.updated_at\n }\n }, 201)\n } catch (error) {\n console.error('Error creating content:', error)\n return c.json({\n error: 'Failed to create content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// PUT /api/content/:id - Update content (requires authentication)\napiContentCrudRoutes.put('/:id', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const body = await c.req.json()\n\n // Check if content exists\n const existingStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existing = await existingStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n // Build update fields dynamically\n const updates: string[] = []\n const params: any[] = []\n\n if (body.title !== undefined) {\n updates.push('title = ?')\n params.push(body.title)\n }\n\n if (body.slug !== undefined) {\n let finalSlug = body.slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim()\n updates.push('slug = ?')\n params.push(finalSlug)\n }\n\n if (body.status !== undefined) {\n updates.push('status = ?')\n params.push(body.status)\n }\n\n if (body.data !== undefined) {\n updates.push('data = ?')\n params.push(JSON.stringify(body.data))\n }\n\n // Always update updated_at\n const now = Date.now()\n updates.push('updated_at = ?')\n params.push(now)\n\n // Add id to params for WHERE clause\n params.push(id)\n\n // Execute update\n const updateStmt = db.prepare(`\n UPDATE content SET ${updates.join(', ')}\n WHERE id = ?\n `)\n\n await updateStmt.bind(...params).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existing.collection_id}:*`)\n await cache.invalidate('content-filtered:*')\n\n // Get updated content\n const getStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const updatedContent = await getStmt.bind(id).first() as any\n\n return c.json({\n data: {\n id: updatedContent.id,\n title: updatedContent.title,\n slug: updatedContent.slug,\n status: updatedContent.status,\n collectionId: updatedContent.collection_id,\n data: updatedContent.data ? JSON.parse(updatedContent.data) : {},\n created_at: updatedContent.created_at,\n updated_at: updatedContent.updated_at\n }\n })\n } catch (error) {\n console.error('Error updating content:', error)\n return c.json({\n error: 'Failed to update content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// DELETE /api/content/:id - Delete content (requires authentication)\napiContentCrudRoutes.delete('/:id', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if content exists\n const existingStmt = db.prepare('SELECT collection_id FROM content WHERE id = ?')\n const existing = await existingStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n // Delete the content (hard delete for API, soft delete happens in admin routes)\n const deleteStmt = db.prepare('DELETE FROM content WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existing.collection_id}:*`)\n await cache.invalidate('content-filtered:*')\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting content:', error)\n return c.json({\n error: 'Failed to delete content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\nexport default apiContentCrudRoutes\n","import { Hono } from 'hono'\nimport { cors } from 'hono/cors'\nimport { schemaDefinitions } from '../schemas'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { QueryFilterBuilder, QueryFilter } from '../utils'\nimport { isPluginActive, optionalAuth } from '../middleware'\nimport { normalizePublicContentFilter } from './api-content-access-policy'\nimport apiContentCrudRoutes from './api-content-crud'\nimport type { Bindings, Variables as AppVariables } from '../app'\n\n// Extend Variables with API-specific fields\ninterface Variables extends AppVariables {\n startTime: number\n cacheEnabled?: boolean\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Add timing middleware\napiRoutes.use('*', async (c, next) => {\n const startTime = Date.now()\n c.set('startTime', startTime)\n await next()\n const totalTime = Date.now() - startTime\n c.header('X-Response-Time', `${totalTime}ms`)\n})\n\n// Check if cache plugin is active\napiRoutes.use('*', async (c, next) => {\n const cacheEnabled = await isPluginActive(c.env.DB, 'core-cache')\n c.set('cacheEnabled', cacheEnabled)\n await next()\n})\n\n// Add CORS middleware\napiRoutes.use('*', cors({\n origin: (origin, c) => {\n const allowed = (c.env as any)?.CORS_ORIGINS as string | undefined\n if (!allowed) return null // No env var = reject cross-origin (secure default)\n const list = allowed.split(',').map((s: string) => s.trim())\n return list.includes(origin) ? origin : null\n },\n allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowHeaders: ['Content-Type', 'Authorization', 'X-API-Key']\n}))\n\n// Helper function to add timing metadata\nfunction addTimingMeta(c: any, meta: any = {}, executionStartTime?: number) {\n const totalTime = Date.now() - c.get('startTime')\n const executionTime = executionStartTime ? Date.now() - executionStartTime : undefined\n\n return {\n ...meta,\n timing: {\n total: totalTime,\n execution: executionTime,\n unit: 'ms'\n }\n }\n}\n\n// Root endpoint - OpenAPI 3.0.0 specification\napiRoutes.get('/', (c) => {\n const baseUrl = new URL(c.req.url)\n const serverUrl = `${baseUrl.protocol}//${baseUrl.host}`\n\n return c.json({\n openapi: '3.0.0',\n info: {\n title: 'SonicJS AI API',\n version: '0.1.0',\n description: 'RESTful API for SonicJS headless CMS - a modern, AI-powered content management system built on Cloudflare Workers',\n contact: {\n name: 'SonicJS Support',\n url: `${serverUrl}/docs`,\n email: 'support@sonicjs.com'\n },\n license: {\n name: 'MIT',\n url: 'https://opensource.org/licenses/MIT'\n }\n },\n servers: [\n {\n url: serverUrl,\n description: 'Current server'\n }\n ],\n paths: {\n '/api/': {\n get: {\n summary: 'API Information',\n description: 'Returns OpenAPI specification for the SonicJS API',\n operationId: 'getApiInfo',\n tags: ['System'],\n responses: {\n '200': {\n description: 'OpenAPI specification',\n content: {\n 'application/json': {\n schema: { type: 'object' }\n }\n }\n }\n }\n }\n },\n '/api/health': {\n get: {\n summary: 'Health Check',\n description: 'Returns API health status and available schemas',\n operationId: 'getHealth',\n tags: ['System'],\n responses: {\n '200': {\n description: 'Health status',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n status: { type: 'string', example: 'healthy' },\n timestamp: { type: 'string', format: 'date-time' },\n schemas: { type: 'array', items: { type: 'string' } }\n }\n }\n }\n }\n }\n }\n }\n },\n '/api/collections': {\n get: {\n summary: 'List Collections',\n description: 'Returns all active collections with their schemas',\n operationId: 'getCollections',\n tags: ['Content'],\n responses: {\n '200': {\n description: 'List of collections',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n name: { type: 'string' },\n display_name: { type: 'string' },\n schema: { type: 'object' },\n is_active: { type: 'integer' }\n }\n }\n },\n meta: { type: 'object' }\n }\n }\n }\n }\n }\n }\n }\n },\n '/api/collections/{collection}/content': {\n get: {\n summary: 'Get Collection Content',\n description: 'Returns content items from a specific collection with filtering support. Anonymous, viewer, and author requests are restricted to published content; admin and editor requests may query other statuses.',\n operationId: 'getCollectionContent',\n tags: ['Content'],\n parameters: [\n {\n name: 'collection',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Collection name'\n },\n {\n name: 'limit',\n in: 'query',\n schema: { type: 'integer', default: 50, maximum: 1000 },\n description: 'Maximum number of items to return'\n },\n {\n name: 'offset',\n in: 'query',\n schema: { type: 'integer', default: 0 },\n description: 'Number of items to skip'\n },\n {\n name: 'status',\n in: 'query',\n schema: { type: 'string', enum: ['draft', 'published', 'archived'] },\n description: 'Filter by content status. Anonymous, viewer, and author requests are limited to published content.'\n }\n ],\n responses: {\n '200': {\n description: 'List of content items',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: { type: 'array', items: { type: 'object' } },\n meta: { type: 'object' }\n }\n }\n }\n }\n },\n '404': {\n description: 'Collection not found'\n }\n }\n }\n },\n '/api/content': {\n get: {\n summary: 'List Content',\n description: 'Returns content items with advanced filtering support. Anonymous, viewer, and author requests are restricted to published content; admin and editor requests may query other statuses.',\n operationId: 'getContent',\n tags: ['Content'],\n parameters: [\n {\n name: 'collection',\n in: 'query',\n schema: { type: 'string' },\n description: 'Filter by collection name'\n },\n {\n name: 'limit',\n in: 'query',\n schema: { type: 'integer', default: 50, maximum: 1000 },\n description: 'Maximum number of items to return'\n },\n {\n name: 'offset',\n in: 'query',\n schema: { type: 'integer', default: 0 },\n description: 'Number of items to skip'\n },\n {\n name: 'status',\n in: 'query',\n schema: { type: 'string', enum: ['draft', 'published', 'archived'] },\n description: 'Filter by content status. Anonymous, viewer, and author requests are limited to published content.'\n }\n ],\n responses: {\n '200': {\n description: 'List of content items',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: { type: 'array', items: { type: 'object' } },\n meta: { type: 'object' }\n }\n }\n }\n }\n }\n }\n },\n post: {\n summary: 'Create Content',\n description: 'Creates a new content item',\n operationId: 'createContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['collection_id', 'title'],\n properties: {\n collection_id: { type: 'string' },\n title: { type: 'string' },\n slug: { type: 'string' },\n status: { type: 'string', enum: ['draft', 'published', 'archived'] },\n data: { type: 'object' }\n }\n }\n }\n }\n },\n responses: {\n '201': { description: 'Content created successfully' },\n '400': { description: 'Invalid request body' },\n '401': { description: 'Unauthorized' }\n }\n }\n },\n '/api/content/{id}': {\n get: {\n summary: 'Get Content by ID',\n description: 'Returns a specific content item by ID',\n operationId: 'getContentById',\n tags: ['Content'],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content item' },\n '404': { description: 'Content not found' }\n }\n },\n put: {\n summary: 'Update Content',\n description: 'Updates an existing content item',\n operationId: 'updateContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content updated successfully' },\n '401': { description: 'Unauthorized' },\n '404': { description: 'Content not found' }\n }\n },\n delete: {\n summary: 'Delete Content',\n description: 'Deletes a content item',\n operationId: 'deleteContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content deleted successfully' },\n '401': { description: 'Unauthorized' },\n '404': { description: 'Content not found' }\n }\n }\n },\n '/api/media': {\n get: {\n summary: 'List Media',\n description: 'Returns all media files with pagination',\n operationId: 'getMedia',\n tags: ['Media'],\n responses: {\n '200': { description: 'List of media files' }\n }\n }\n },\n '/api/media/upload': {\n post: {\n summary: 'Upload Media',\n description: 'Uploads a new media file to R2 storage',\n operationId: 'uploadMedia',\n tags: ['Media'],\n security: [{ bearerAuth: [] }],\n requestBody: {\n required: true,\n content: {\n 'multipart/form-data': {\n schema: {\n type: 'object',\n properties: {\n file: { type: 'string', format: 'binary' }\n }\n }\n }\n }\n },\n responses: {\n '201': { description: 'Media uploaded successfully' },\n '401': { description: 'Unauthorized' }\n }\n }\n }\n },\n components: {\n securitySchemes: {\n bearerAuth: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT'\n }\n },\n schemas: {\n Content: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n title: { type: 'string' },\n slug: { type: 'string' },\n status: { type: 'string', enum: ['draft', 'published', 'archived'] },\n collectionId: { type: 'string', format: 'uuid' },\n data: { type: 'object' },\n created_at: { type: 'integer' },\n updated_at: { type: 'integer' }\n }\n },\n Collection: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n name: { type: 'string' },\n display_name: { type: 'string' },\n description: { type: 'string' },\n schema: { type: 'object' },\n is_active: { type: 'integer' }\n }\n },\n Media: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n filename: { type: 'string' },\n mimetype: { type: 'string' },\n size: { type: 'integer' },\n url: { type: 'string' }\n }\n },\n Error: {\n type: 'object',\n properties: {\n error: { type: 'string' },\n details: { type: 'string' }\n }\n }\n }\n },\n tags: [\n { name: 'System', description: 'System and health endpoints' },\n { name: 'Content', description: 'Content management operations' },\n { name: 'Media', description: 'Media file operations' }\n ]\n })\n})\n\n// Health check endpoint\napiRoutes.get('/health', (c) => {\n return c.json({\n status: 'healthy',\n timestamp: new Date().toISOString(),\n schemas: schemaDefinitions.map(s => s.name)\n })\n})\n\n// Basic collections endpoint\napiRoutes.get('/collections', async (c) => {\n const executionStart = Date.now()\n\n try {\n const db = c.env.DB\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('collections', 'all')\n\n // Use cache only if cache plugin is active\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n const stmt = db.prepare(\"SELECT * FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const { results } = await stmt.all()\n\n // Parse schema and format results\n const transformedResults = results.map((row: any) => ({\n ...row,\n schema: row.schema ? JSON.parse(row.schema) : {},\n is_active: row.is_active // Keep as number (1 or 0)\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n count: results.length,\n timestamp: new Date().toISOString(),\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache plugin is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching collections:', error)\n return c.json({ error: 'Failed to fetch collections' }, 500)\n }\n})\n\n// Basic content endpoint with advanced filtering\napiRoutes.get('/content', optionalAuth(), async (c) => {\n const executionStart = Date.now()\n\n try {\n const db = c.env.DB\n const queryParams = c.req.query()\n\n // Handle collection parameter - convert collection name to collection_id\n if (queryParams.collection) {\n const collectionName = queryParams.collection\n const collectionStmt = db.prepare('SELECT id FROM collections WHERE name = ? AND is_active = 1')\n const collectionResult = await collectionStmt.bind(collectionName).first()\n\n if (collectionResult) {\n // Replace 'collection' param with 'collection_id' for the filter builder\n queryParams.collection_id = (collectionResult as any).id\n delete queryParams.collection\n } else {\n // Collection not found - return empty result\n return c.json({\n data: [],\n meta: addTimingMeta(c, {\n count: 0,\n timestamp: new Date().toISOString(),\n message: `Collection '${collectionName}' not found`\n }, executionStart)\n })\n }\n }\n\n // Parse filter from query parameters\n const filter: QueryFilter = QueryFilterBuilder.parseFromQuery(queryParams)\n const normalizedFilter = normalizePublicContentFilter(filter, c.get('user')?.role)\n\n // Set default limit if not provided\n if (!normalizedFilter.limit) {\n normalizedFilter.limit = 50\n }\n normalizedFilter.limit = Math.min(normalizedFilter.limit, 1000) // Max 1000\n\n // Build SQL query from filter\n const builder = new QueryFilterBuilder()\n const queryResult = builder.build('content', normalizedFilter)\n\n // Check for query building errors\n if (queryResult.errors.length > 0) {\n return c.json({\n error: 'Invalid filter parameters',\n details: queryResult.errors\n }, 400)\n }\n\n // Only use cache if cache plugin is active\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('content-filtered', JSON.stringify({ filter: normalizedFilter, query: queryResult.sql }))\n\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n // Execute query with parameters\n const stmt = db.prepare(queryResult.sql)\n const boundStmt = queryResult.params.length > 0\n ? stmt.bind(...queryResult.params)\n : stmt\n\n const { results } = await boundStmt.all()\n\n // Transform results to match API spec (camelCase)\n const transformedResults = results.map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n collectionId: row.collection_id,\n data: row.data ? JSON.parse(row.data) : {},\n created_at: row.created_at,\n updated_at: row.updated_at\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n count: results.length,\n timestamp: new Date().toISOString(),\n filter: normalizedFilter,\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// Collection-specific routes with advanced filtering\napiRoutes.get('/collections/:collection/content', optionalAuth(), async (c) => {\n const executionStart = Date.now()\n\n try {\n const collection = c.req.param('collection')\n const db = c.env.DB\n const queryParams = c.req.query()\n\n // First check if collection exists\n const collectionStmt = db.prepare('SELECT * FROM collections WHERE name = ? AND is_active = 1')\n const collectionResult = await collectionStmt.bind(collection).first()\n\n if (!collectionResult) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Parse filter from query parameters\n const filter: QueryFilter = QueryFilterBuilder.parseFromQuery(queryParams)\n const normalizedFilter = normalizePublicContentFilter(filter, c.get('user')?.role)\n\n // Add collection_id filter to where clause\n if (!normalizedFilter.where) {\n normalizedFilter.where = { and: [] }\n }\n\n if (!normalizedFilter.where.and) {\n normalizedFilter.where.and = []\n }\n\n // Add collection filter\n normalizedFilter.where.and.push({\n field: 'collection_id',\n operator: 'equals',\n value: (collectionResult as any).id\n })\n\n // Set default limit if not provided\n if (!normalizedFilter.limit) {\n normalizedFilter.limit = 50\n }\n normalizedFilter.limit = Math.min(normalizedFilter.limit, 1000)\n\n // Build SQL query from filter\n const builder = new QueryFilterBuilder()\n const queryResult = builder.build('content', normalizedFilter)\n\n // Check for query building errors\n if (queryResult.errors.length > 0) {\n return c.json({\n error: 'Invalid filter parameters',\n details: queryResult.errors\n }, 400)\n }\n\n // Generate cache key\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('collection-content-filtered', `${collection}:${JSON.stringify({ filter: normalizedFilter, query: queryResult.sql })}`)\n\n // Only check cache if plugin is enabled\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n // Execute query with parameters\n const stmt = db.prepare(queryResult.sql)\n const boundStmt = queryResult.params.length > 0\n ? stmt.bind(...queryResult.params)\n : stmt\n\n const { results } = await boundStmt.all()\n\n // Transform results to match API spec (camelCase)\n const transformedResults = results.map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n collectionId: row.collection_id,\n data: row.data ? JSON.parse(row.data) : {},\n created_at: row.created_at,\n updated_at: row.updated_at\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n collection: {\n ...(collectionResult as any),\n schema: (collectionResult as any).schema ? JSON.parse((collectionResult as any).schema) : {}\n },\n count: results.length,\n timestamp: new Date().toISOString(),\n filter: normalizedFilter,\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache plugin is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// Mount CRUD routes for content\napiRoutes.route('/content', apiContentCrudRoutes)\n\nexport default apiRoutes\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { requireAuth } from '../middleware'\nimport type { Bindings, Variables } from '../app'\n\n// Helper function to generate short IDs (replacement for nanoid)\nfunction generateId(): string {\n return crypto.randomUUID().replace(/-/g, '').substring(0, 21)\n}\n\n// Helper function for emitting events (simplified for core package)\nasync function emitEvent(eventName: string, data: any) {\n console.log(`[Event] ${eventName}:`, data)\n // TODO: Implement proper event system when plugin architecture is ready\n}\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nexport const apiMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply auth middleware to all routes\napiMediaRoutes.use('*', requireAuth())\n\n// Upload single file\napiMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')!\n const formData = await c.req.formData()\n const fileData = formData.get('file')\n\n if (!fileData || typeof fileData === 'string') {\n return c.json({ error: 'No file provided' }, 400)\n }\n\n const file = fileData as File\n\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n return c.json({ \n error: 'File validation failed', \n details: validation.error.issues \n }, 400)\n }\n\n // Generate unique filename and R2 key\n const fileId = generateId()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n return c.json({ error: 'Failed to upload file to storage' }, 500)\n }\n\n // Generate public URL using environment variable for bucket name\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const publicUrl = `https://pub-${bucketName}.r2.dev/${r2Key}`\n \n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate thumbnail URL for images\n let thumbnailUrl: string | null = null\n if (file.type.startsWith('image/') && c.env.IMAGES_ACCOUNT_ID) {\n thumbnailUrl = `https://imagedelivery.net/${c.env.IMAGES_ACCOUNT_ID}/${r2Key}/thumbnail`\n }\n\n // Save to database\n const mediaRecord = {\n id: fileId,\n filename: filename,\n original_name: file.name,\n mime_type: file.type,\n size: file.size,\n width,\n height,\n folder,\n r2_key: r2Key,\n public_url: publicUrl,\n thumbnail_url: thumbnailUrl,\n uploaded_by: user.userId,\n uploaded_at: Math.floor(Date.now() / 1000),\n created_at: Math.floor(Date.now() / 1000)\n }\n\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n mediaRecord.id,\n mediaRecord.filename,\n mediaRecord.original_name,\n mediaRecord.mime_type,\n mediaRecord.size,\n mediaRecord.width,\n mediaRecord.height,\n mediaRecord.folder,\n mediaRecord.r2_key,\n mediaRecord.public_url,\n mediaRecord.thumbnail_url,\n mediaRecord.uploaded_by,\n mediaRecord.uploaded_at\n ).run()\n\n // Emit media upload event\n await emitEvent('media.upload', { id: mediaRecord.id, filename: mediaRecord.filename })\n\n return c.json({\n success: true,\n file: {\n id: mediaRecord.id,\n filename: mediaRecord.filename,\n originalName: mediaRecord.original_name,\n mimeType: mediaRecord.mime_type,\n size: mediaRecord.size,\n width: mediaRecord.width,\n height: mediaRecord.height,\n r2_key: mediaRecord.r2_key,\n publicUrl: mediaRecord.public_url,\n thumbnailUrl: mediaRecord.thumbnail_url,\n uploadedAt: new Date(mediaRecord.uploaded_at * 1000).toISOString()\n }\n })\n } catch (error) {\n console.error('Upload error:', error)\n return c.json({ error: 'Upload failed' }, 500)\n }\n})\n\n// Upload multiple files\napiMediaRoutes.post('/upload-multiple', async (c) => {\n try {\n const user = c.get('user')!\n const formData = await c.req.formData()\n const filesData = formData.getAll('files')\n\n // Filter out strings and ensure we only have File objects\n const files: File[] = []\n for (const f of filesData) {\n if (typeof f !== 'string') {\n files.push(f as File)\n }\n }\n\n if (!files || files.length === 0) {\n return c.json({ error: 'No files provided' }, 400)\n }\n\n const uploadResults = []\n const errors = []\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: 'Validation failed',\n details: validation.error.issues\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = generateId()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Generate public URL using environment variable for bucket name\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const publicUrl = `https://pub-${bucketName}.r2.dev/${r2Key}`\n \n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate thumbnail URL for images\n let thumbnailUrl: string | null = null\n if (file.type.startsWith('image/') && c.env.IMAGES_ACCOUNT_ID) {\n thumbnailUrl = `https://imagedelivery.net/${c.env.IMAGES_ACCOUNT_ID}/${r2Key}/thumbnail`\n }\n\n // Save to database\n const mediaRecord = {\n id: fileId,\n filename: filename,\n original_name: file.name,\n mime_type: file.type,\n size: file.size,\n width,\n height,\n folder,\n r2_key: r2Key,\n public_url: publicUrl,\n thumbnail_url: thumbnailUrl,\n uploaded_by: user.userId,\n uploaded_at: Math.floor(Date.now() / 1000)\n }\n\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n mediaRecord.id,\n mediaRecord.filename,\n mediaRecord.original_name,\n mediaRecord.mime_type,\n mediaRecord.size,\n mediaRecord.width,\n mediaRecord.height,\n mediaRecord.folder,\n mediaRecord.r2_key,\n mediaRecord.public_url,\n mediaRecord.thumbnail_url,\n mediaRecord.uploaded_by,\n mediaRecord.uploaded_at\n ).run()\n\n uploadResults.push({\n id: mediaRecord.id,\n filename: mediaRecord.filename,\n originalName: mediaRecord.original_name,\n mimeType: mediaRecord.mime_type,\n size: mediaRecord.size,\n width: mediaRecord.width,\n height: mediaRecord.height,\n r2_key: mediaRecord.r2_key,\n publicUrl: mediaRecord.public_url,\n thumbnailUrl: mediaRecord.thumbnail_url,\n uploadedAt: new Date(mediaRecord.uploaded_at * 1000).toISOString()\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media upload event if any uploads succeeded\n if (uploadResults.length > 0) {\n await emitEvent('media.upload', { count: uploadResults.length })\n }\n\n return c.json({\n success: uploadResults.length > 0,\n uploaded: uploadResults,\n errors: errors,\n summary: {\n total: files.length,\n successful: uploadResults.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Multiple upload error:', error)\n return c.json({ error: 'Upload failed' }, 500)\n }\n})\n\n// Bulk delete files\napiMediaRoutes.post('/bulk-delete', async (c) => {\n try {\n const user = c.get('user')!\n const body = await c.req.json()\n const fileIds = body.fileIds as string[]\n \n if (!fileIds || !Array.isArray(fileIds) || fileIds.length === 0) {\n return c.json({ error: 'No file IDs provided' }, 400)\n }\n\n // Limit bulk operations to prevent abuse\n if (fileIds.length > 50) {\n return c.json({ error: 'Too many files selected. Maximum 50 files per operation.' }, 400)\n }\n\n const results = []\n const errors = []\n\n for (const fileId of fileIds) {\n try {\n // Get file record (including already deleted files to check if they exist at all)\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ?')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n errors.push({ fileId, error: 'File not found' })\n continue\n }\n\n // Skip if already deleted (treat as success)\n if (fileRecord.deleted_at !== null) {\n console.log(`File ${fileId} already deleted, skipping`)\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n alreadyDeleted: true\n })\n continue\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n errors.push({ fileId, error: 'Permission denied' })\n continue\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn(`Failed to delete from R2 for file ${fileId}:`, error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true\n })\n } catch (error) {\n errors.push({\n fileId,\n error: 'Delete failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media delete event if any deletes succeeded\n if (results.length > 0) {\n await emitEvent('media.delete', { count: results.length, ids: fileIds })\n }\n\n return c.json({\n success: results.length > 0,\n deleted: results,\n errors: errors,\n summary: {\n total: fileIds.length,\n successful: results.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Bulk delete error:', error)\n return c.json({ error: 'Bulk delete failed' }, 500)\n }\n})\n\n// Create folder\napiMediaRoutes.post('/create-folder', async (c) => {\n try {\n const body = await c.req.json()\n const folderName = body.folderName as string\n\n if (!folderName || typeof folderName !== 'string') {\n return c.json({ success: false, error: 'No folder name provided' }, 400)\n }\n\n // Validate folder name format\n const folderPattern = /^[a-z0-9-_]+$/\n if (!folderPattern.test(folderName)) {\n return c.json({\n success: false,\n error: 'Folder name can only contain lowercase letters, numbers, hyphens, and underscores'\n }, 400)\n }\n\n // Check if folder already exists in the database\n const checkStmt = c.env.DB.prepare('SELECT COUNT(*) as count FROM media WHERE folder = ? AND deleted_at IS NULL')\n const existingFolder = await checkStmt.bind(folderName).first() as any\n\n if (existingFolder && existingFolder.count > 0) {\n return c.json({\n success: false,\n error: `Folder \"${folderName}\" already exists`\n }, 400)\n }\n\n // Note: R2 folders are virtual - they only exist when files are uploaded to them\n // Return success message explaining this behavior\n return c.json({\n success: true,\n message: `Folder \"${folderName}\" is ready. Upload files to this folder to make it appear in the media library.`,\n folder: folderName,\n note: 'Folders appear automatically when you upload files to them'\n })\n } catch (error) {\n console.error('Create folder error:', error)\n return c.json({ success: false, error: 'Failed to create folder' }, 500)\n }\n})\n\n// Bulk move files to folder\napiMediaRoutes.post('/bulk-move', async (c) => {\n try {\n const user = c.get('user')!\n const body = await c.req.json()\n const fileIds = body.fileIds as string[]\n const targetFolder = body.folder as string\n\n if (!fileIds || !Array.isArray(fileIds) || fileIds.length === 0) {\n return c.json({ error: 'No file IDs provided' }, 400)\n }\n\n if (!targetFolder || typeof targetFolder !== 'string') {\n return c.json({ error: 'No target folder provided' }, 400)\n }\n\n // Limit bulk operations to prevent abuse\n if (fileIds.length > 50) {\n return c.json({ error: 'Too many files selected. Maximum 50 files per operation.' }, 400)\n }\n\n const results = []\n const errors = []\n\n for (const fileId of fileIds) {\n try {\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n errors.push({ fileId, error: 'File not found' })\n continue\n }\n\n // Check permissions (only allow move by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n errors.push({ fileId, error: 'Permission denied' })\n continue\n }\n\n // Skip if already in target folder\n if (fileRecord.folder === targetFolder) {\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n skipped: true\n })\n continue\n }\n\n // Generate new R2 key with new folder\n const oldR2Key = fileRecord.r2_key\n const filename = oldR2Key.split('/').pop() || fileRecord.filename\n const newR2Key = `${targetFolder}/${filename}`\n\n // Copy file to new location in R2\n try {\n const object = await c.env.MEDIA_BUCKET.get(oldR2Key)\n if (!object) {\n errors.push({ fileId, error: 'File not found in storage' })\n continue\n }\n\n await c.env.MEDIA_BUCKET.put(newR2Key, object.body, {\n httpMetadata: object.httpMetadata,\n customMetadata: {\n ...object.customMetadata,\n movedBy: user.userId,\n movedAt: new Date().toISOString()\n }\n })\n\n // Delete old file from R2\n await c.env.MEDIA_BUCKET.delete(oldR2Key)\n } catch (error) {\n console.warn(`Failed to move file in R2 for file ${fileId}:`, error)\n errors.push({ fileId, error: 'Failed to move file in storage' })\n continue\n }\n\n // Update database with new folder and R2 key\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const newPublicUrl = `https://pub-${bucketName}.r2.dev/${newR2Key}`\n\n const updateStmt = c.env.DB.prepare(`\n UPDATE media\n SET folder = ?, r2_key = ?, public_url = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n targetFolder,\n newR2Key,\n newPublicUrl,\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n skipped: false\n })\n } catch (error) {\n errors.push({\n fileId,\n error: 'Move failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media move event if any moves succeeded\n if (results.length > 0) {\n await emitEvent('media.move', { count: results.length, targetFolder, ids: fileIds })\n }\n\n return c.json({\n success: results.length > 0,\n moved: results,\n errors: errors,\n summary: {\n total: fileIds.length,\n successful: results.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Bulk move error:', error)\n return c.json({ error: 'Bulk move failed' }, 500)\n }\n})\n\n// Delete file\napiMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')!\n const fileId = c.req.param('id')\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.json({ error: 'File not found' }, 404)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n return c.json({ error: 'Permission denied' }, 403)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // Emit media delete event\n await emitEvent('media.delete', { id: fileId })\n\n return c.json({ success: true, message: 'File deleted successfully' })\n } catch (error) {\n console.error('Delete error:', error)\n return c.json({ error: 'Delete failed' }, 500)\n }\n})\n\n// Update file metadata\napiMediaRoutes.patch('/:id', async (c) => {\n try {\n const user = c.get('user')!\n const fileId = c.req.param('id')\n const body = await c.req.json()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.json({ error: 'File not found' }, 404)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n return c.json({ error: 'Permission denied' }, 403)\n }\n\n // Update allowed fields\n const allowedFields = ['alt', 'caption', 'tags', 'folder']\n const updates = []\n const values = []\n \n for (const [key, value] of Object.entries(body)) {\n if (allowedFields.includes(key)) {\n updates.push(`${key} = ?`)\n values.push(key === 'tags' ? JSON.stringify(value) : value)\n }\n }\n\n if (updates.length === 0) {\n return c.json({ error: 'No valid fields to update' }, 400)\n }\n\n updates.push('updated_at = ?')\n values.push(Math.floor(Date.now() / 1000))\n values.push(fileId)\n\n const updateStmt = c.env.DB.prepare(`\n UPDATE media SET ${updates.join(', ')} WHERE id = ?\n `)\n await updateStmt.bind(...values).run()\n\n // Emit media update event\n await emitEvent('media.update', { id: fileId })\n\n return c.json({ success: true, message: 'File updated successfully' })\n } catch (error) {\n console.error('Update error:', error)\n return c.json({ error: 'Update failed' }, 500)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n // This is a simplified implementation\n // In a real-world scenario, you'd use a proper image processing library\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length) {\n if (i + 8 >= uint8Array.length) break\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n if (i + 8 < uint8Array.length) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n }\n if (i + 3 < uint8Array.length) {\n i += 2 + ((uint8Array[i + 2]! << 8) | uint8Array[i + 3]!)\n } else {\n break\n }\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\nexport default apiMediaRoutes","/**\n * API System Routes\n *\n * Provides system health, status, and metadata endpoints\n * These are lightweight routes without heavy dependencies\n */\n\nimport { Hono } from 'hono'\nimport type { Bindings, Variables } from '../app'\n\nexport const apiSystemRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * System health check\n * GET /api/system/health\n */\napiSystemRoutes.get('/health', async (c) => {\n try {\n const startTime = Date.now()\n\n // Check database connectivity\n let dbStatus = 'unknown'\n let dbLatency = 0\n\n try {\n const dbStart = Date.now()\n await c.env.DB.prepare('SELECT 1').first()\n dbLatency = Date.now() - dbStart\n dbStatus = 'healthy'\n } catch (error) {\n console.error('Database health check failed:', error)\n dbStatus = 'unhealthy'\n }\n\n // Check KV connectivity (if available)\n let kvStatus = 'not_configured'\n let kvLatency = 0\n\n if (c.env.CACHE_KV) {\n try {\n const kvStart = Date.now()\n await c.env.CACHE_KV.get('__health_check__')\n kvLatency = Date.now() - kvStart\n kvStatus = 'healthy'\n } catch (error) {\n console.error('KV health check failed:', error)\n kvStatus = 'unhealthy'\n }\n }\n\n // Check R2 connectivity (if available)\n let r2Status = 'not_configured'\n\n if (c.env.MEDIA_BUCKET) {\n try {\n await c.env.MEDIA_BUCKET.head('__health_check__')\n r2Status = 'healthy'\n } catch (error) {\n // R2 head on non-existent key returns null, not an error\n // This is expected, so we consider it healthy\n r2Status = 'healthy'\n }\n }\n\n const totalLatency = Date.now() - startTime\n const overall = dbStatus === 'healthy' ? 'healthy' : 'degraded'\n\n return c.json({\n status: overall,\n timestamp: new Date().toISOString(),\n uptime: totalLatency,\n checks: {\n database: {\n status: dbStatus,\n latency: dbLatency\n },\n cache: {\n status: kvStatus,\n latency: kvLatency\n },\n storage: {\n status: r2Status\n }\n },\n environment: c.env.ENVIRONMENT || 'production'\n })\n } catch (error) {\n console.error('Health check failed:', error)\n return c.json({\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n error: 'Health check failed'\n }, 503)\n }\n})\n\n/**\n * System information\n * GET /api/system/info\n */\napiSystemRoutes.get('/info', (c) => {\n const appVersion = c.get('appVersion') || '1.0.0'\n\n return c.json({\n name: 'SonicJS',\n version: appVersion,\n description: 'Modern headless CMS built on Cloudflare Workers',\n endpoints: {\n api: '/api',\n auth: '/auth',\n health: '/api/system/health',\n docs: '/docs'\n },\n features: {\n content: true,\n media: true,\n auth: true,\n collections: true,\n caching: !!c.env.CACHE_KV,\n storage: !!c.env.MEDIA_BUCKET\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * System stats\n * GET /api/system/stats\n */\napiSystemRoutes.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get content statistics\n const contentStats = await db.prepare(`\n SELECT COUNT(*) as total_content\n FROM content\n WHERE deleted_at IS NULL\n `).first() as any\n\n // Get media statistics\n const mediaStats = await db.prepare(`\n SELECT\n COUNT(*) as total_files,\n SUM(size) as total_size\n FROM media\n WHERE deleted_at IS NULL\n `).first() as any\n\n // Get user statistics\n const userStats = await db.prepare(`\n SELECT COUNT(*) as total_users\n FROM users\n `).first() as any\n\n return c.json({\n content: {\n total: contentStats?.total_content || 0\n },\n media: {\n total_files: mediaStats?.total_files || 0,\n total_size_bytes: mediaStats?.total_size || 0,\n total_size_mb: Math.round((mediaStats?.total_size || 0) / 1024 / 1024 * 100) / 100\n },\n users: {\n total: userStats?.total_users || 0\n },\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Stats query failed:', error)\n return c.json({ error: 'Failed to fetch system statistics' }, 500)\n }\n})\n\n/**\n * Database ping\n * GET /api/system/ping\n */\napiSystemRoutes.get('/ping', async (c) => {\n try {\n const start = Date.now()\n await c.env.DB.prepare('SELECT 1').first()\n const latency = Date.now() - start\n\n return c.json({\n pong: true,\n latency,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Ping failed:', error)\n return c.json({\n pong: false,\n error: 'Database connection failed'\n }, 503)\n }\n})\n\n/**\n * Environment check\n * GET /api/system/env\n */\napiSystemRoutes.get('/env', (c) => {\n return c.json({\n environment: c.env.ENVIRONMENT || 'production',\n features: {\n database: !!c.env.DB,\n cache: !!c.env.CACHE_KV,\n media_bucket: !!c.env.MEDIA_BUCKET,\n email_queue: !!c.env.EMAIL_QUEUE,\n sendgrid: !!c.env.SENDGRID_API_KEY,\n cloudflare_images: !!(c.env.IMAGES_ACCOUNT_ID && c.env.IMAGES_API_TOKEN)\n },\n timestamp: new Date().toISOString()\n })\n})\n\nexport default apiSystemRoutes\n","/**\n * Admin API Routes\n *\n * Provides JSON API endpoints for admin operations\n * These routes complement the admin UI and can be used programmatically\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\n// import { zValidator } from '@hono/zod-validator'\nimport { requireAuth, requireRole } from '../middleware'\nimport type { Bindings, Variables } from '../app'\n\nexport const adminApiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply auth middleware to all admin routes\nadminApiRoutes.use('*', requireAuth())\nadminApiRoutes.use('*', requireRole(['admin', 'editor']))\n\n/**\n * Get dashboard statistics\n * GET /admin/api/stats\n */\nadminApiRoutes.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE c.deleted_at IS NULL AND (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n return c.json({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n mediaSize: mediaSize,\n users: usersCount,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.json({ error: 'Failed to fetch statistics' }, 500)\n }\n})\n\n/**\n * Get storage usage\n * GET /admin/api/storage\n */\nadminApiRoutes.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n return c.json({\n databaseSize,\n mediaSize,\n totalSize: databaseSize + mediaSize,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.json({ error: 'Failed to fetch storage usage' }, 500)\n }\n})\n\n/**\n * Get recent activity\n * GET /admin/api/activity\n */\nadminApiRoutes.get('/activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '10')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const recentActivity = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n let details: any = {}\n try {\n details = row.details ? JSON.parse(row.details) : {}\n } catch (e) {\n console.error('Error parsing activity details:', e)\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n resource_id: row.resource_id,\n details,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n return c.json({\n data: recentActivity,\n count: recentActivity.length,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n return c.json({ error: 'Failed to fetch recent activity' }, 500)\n }\n})\n\n/**\n * Collection management schema\n */\nconst createCollectionSchema = z.object({\n name: z.string().min(1).max(255).regex(/^[a-z0-9_]+$/, 'Must contain only lowercase letters, numbers, and underscores'),\n displayName: z.string().min(1).max(255).optional(),\n display_name: z.string().min(1).max(255).optional(),\n description: z.string().optional()\n}).refine(data => data.displayName || data.display_name, {\n message: 'Either displayName or display_name is required',\n path: ['displayName']\n})\n\nconst updateCollectionSchema = z.object({\n display_name: z.string().min(1).max(255).optional(),\n description: z.string().optional(),\n is_active: z.boolean().optional()\n})\n\n/**\n * Get all collections\n * GET /admin/api/collections\n */\nadminApiRoutes.get('/collections', async (c) => {\n try {\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const includeInactive = c.req.query('includeInactive') === 'true'\n\n let stmt\n let results\n\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, updated_at, is_active, managed\n FROM collections\n WHERE ${includeInactive ? '1=1' : 'is_active = 1'}\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, updated_at, is_active, managed\n FROM collections\n WHERE (source_type IS NULL OR source_type = 'user')\n ${includeInactive ? '' : 'AND is_active = 1'}\n ORDER BY created_at DESC\n `)\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Get field counts\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n is_active: row.is_active === 1,\n managed: row.managed === 1,\n field_count: fieldCounts.get(String(row.id)) || 0\n }))\n\n return c.json({\n data: collections,\n count: collections.length,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching collections:', error)\n return c.json({ error: 'Failed to fetch collections' }, 500)\n }\n})\n\n/**\n * Get single collection\n * GET /admin/api/collections/:id\n */\nadminApiRoutes.get('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Get collection fields\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n\n const fields = (fieldsResults || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at)\n }))\n\n return c.json({\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n is_active: collection.is_active === 1,\n managed: collection.managed === 1,\n schema: collection.schema ? JSON.parse(collection.schema) : null,\n created_at: Number(collection.created_at),\n updated_at: Number(collection.updated_at),\n fields\n })\n } catch (error) {\n console.error('Error fetching collection:', error)\n return c.json({ error: 'Failed to fetch collection' }, 500)\n }\n})\n\n/**\n * Get reference options for a collection\n * GET /admin/api/references?collection=&search=&limit=20&id=\n */\nadminApiRoutes.get('/references', async (c) => {\n try {\n const db = c.env.DB\n const url = new URL(c.req.url)\n const collectionParams = url.searchParams\n .getAll('collection')\n .flatMap((value) => value.split(','))\n .map((value) => value.trim())\n .filter(Boolean)\n const search = c.req.query('search') || ''\n const id = c.req.query('id') || ''\n const limit = Math.min(Number.parseInt(c.req.query('limit') || '20', 10) || 20, 100)\n\n if (collectionParams.length === 0) {\n return c.json({ error: 'Collection is required' }, 400)\n }\n\n const placeholders = collectionParams.map(() => '?').join(', ')\n const collectionStmt = db.prepare(`\n SELECT id, name, display_name\n FROM collections\n WHERE id IN (${placeholders}) OR name IN (${placeholders})\n `)\n const collectionResults = await collectionStmt\n .bind(...collectionParams, ...collectionParams)\n .all()\n const collections = (collectionResults.results || []) as any[]\n\n if (collections.length === 0) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n const collectionById = Object.fromEntries(\n collections.map((entry) => [\n entry.id,\n {\n id: entry.id,\n name: entry.name,\n display_name: entry.display_name\n }\n ])\n )\n const collectionIds = collections.map((entry) => entry.id)\n\n if (id) {\n const idPlaceholders = collectionIds.map(() => '?').join(', ')\n const itemStmt = db.prepare(`\n SELECT id, title, slug, collection_id\n FROM content\n WHERE id = ? AND collection_id IN (${idPlaceholders})\n LIMIT 1\n `)\n const item = await itemStmt.bind(id, ...collectionIds).first() as any\n\n if (!item) {\n return c.json({ error: 'Reference not found' }, 404)\n }\n\n return c.json({\n data: {\n id: item.id,\n title: item.title,\n slug: item.slug,\n collection: collectionById[item.collection_id]\n }\n })\n }\n\n let stmt\n let results\n\n const listPlaceholders = collectionIds.map(() => '?').join(', ')\n const statusFilterValues = ['published']\n const statusClause = ` AND status IN (${statusFilterValues.map(() => '?').join(', ')})`\n\n if (search) {\n const searchParam = `%${search}%`\n stmt = db.prepare(`\n SELECT id, title, slug, status, updated_at, collection_id\n FROM content\n WHERE collection_id IN (${listPlaceholders})\n AND (title LIKE ? OR slug LIKE ?)\n ${statusClause}\n ORDER BY updated_at DESC\n LIMIT ?\n `)\n const queryResults = await stmt\n .bind(...collectionIds, searchParam, searchParam, ...statusFilterValues, limit)\n .all()\n results = queryResults.results\n } else {\n stmt = db.prepare(`\n SELECT id, title, slug, status, updated_at, collection_id\n FROM content\n WHERE collection_id IN (${listPlaceholders})\n ${statusClause}\n ORDER BY updated_at DESC\n LIMIT ?\n `)\n const queryResults = await stmt\n .bind(...collectionIds, ...statusFilterValues, limit)\n .all()\n results = queryResults.results\n }\n\n const items = (results || []).map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n updated_at: row.updated_at ? Number(row.updated_at) : null,\n collection: collectionById[row.collection_id]\n }))\n\n return c.json({\n data: items,\n count: items.length\n })\n } catch (error) {\n console.error('Error fetching reference options:', error)\n return c.json({ error: 'Failed to fetch references' }, 500)\n }\n})\n\n/**\n * Create collection\n * POST /admin/api/collections\n */\nadminApiRoutes.post('/collections', async (c) => {\n try {\n // Validate content type\n const contentType = c.req.header('Content-Type')\n if (!contentType || !contentType.includes('application/json')) {\n return c.json({ error: 'Content-Type must be application/json' }, 400)\n }\n\n let body\n try {\n body = await c.req.json()\n } catch (e) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n const validation = createCollectionSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const validatedData = validation.data\n const db = c.env.DB\n const _user = c.get('user')\n\n // Handle both camelCase and snake_case for display_name\n const displayName = validatedData.displayName || validatedData.display_name || ''\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(validatedData.name).first()\n\n if (existing) {\n return c.json({ error: 'A collection with this name already exists' }, 400)\n }\n\n // Create basic schema\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n validatedData.name,\n displayName,\n validatedData.description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${validatedData.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({\n id: collectionId,\n name: validatedData.name,\n displayName: displayName,\n description: validatedData.description,\n created_at: now\n }, 201)\n } catch (error) {\n console.error('Error creating collection:', error)\n return c.json({ error: 'Failed to create collection' }, 500)\n }\n})\n\n/**\n * Update collection\n * PATCH /admin/api/collections/:id\n */\nadminApiRoutes.patch('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const body = await c.req.json()\n const validation = updateCollectionSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const validatedData = validation.data\n const db = c.env.DB\n\n // Check if collection exists\n const checkStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const existing = await checkStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Build update query\n const updateFields: string[] = []\n const updateParams: any[] = []\n\n if (validatedData.display_name !== undefined) {\n updateFields.push('display_name = ?')\n updateParams.push(validatedData.display_name)\n }\n\n if (validatedData.description !== undefined) {\n updateFields.push('description = ?')\n updateParams.push(validatedData.description)\n }\n\n if (validatedData.is_active !== undefined) {\n updateFields.push('is_active = ?')\n updateParams.push(validatedData.is_active ? 1 : 0)\n }\n\n if (updateFields.length === 0) {\n return c.json({ error: 'No fields to update' }, 400)\n }\n\n updateFields.push('updated_at = ?')\n updateParams.push(Date.now())\n updateParams.push(id)\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET ${updateFields.join(', ')}\n WHERE id = ?\n `)\n\n await updateStmt.bind(...updateParams).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${existing.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({ message: 'Collection updated successfully' })\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.json({ error: 'Failed to update collection' }, 500)\n }\n})\n\n/**\n * Delete collection\n * DELETE /admin/api/collections/:id\n */\nadminApiRoutes.delete('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection exists\n const collectionStmt = db.prepare('SELECT name FROM collections WHERE id = ?')\n const collection = await collectionStmt.bind(id).first() as any\n\n if (!collection) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.json({\n error: `Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.`\n }, 400)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${collection.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({ message: 'Collection deleted successfully' })\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.json({ error: 'Failed to delete collection' }, 500)\n }\n})\n\n// Migrations API endpoints\n// Get migration status\nadminApiRoutes.get('/migrations/status', async (c) => {\n try {\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminApiRoutes.post('/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied,\n errors: result.errors\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.json({\n success: false,\n error: `Failed to run migrations: ${errorMessage}`,\n errors: [errorMessage]\n }, 500)\n }\n})\n\n// Validate database schema\nadminApiRoutes.get('/migrations/validate', async (c) => {\n try {\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\nexport default adminApiRoutes\n","import { renderAlert } from '../alert.template'\n\nexport interface LoginPageData {\n error?: string\n message?: string\n version?: string\n}\n\nexport function renderLoginPage(data: LoginPageData, demoLoginActive: boolean = false): string {\n return `\n \n \n \n \n \n Login - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n

Welcome Back

\n

Sign in to your account to continue

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n ${data.message ? `
${renderAlert({ type: 'success', message: data.message })}
` : ''}\n\n \n
\n\n \n \n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Sign In\n \n \n\n \n
\n

\n Don't have an account?\n Create one here\n

\n
\n
\n\n \n
\n \n v${data.version || '0.1.0'}\n \n
\n
\n
\n\n ${demoLoginActive ? `\n \n ` : ''}\n \n \n `\n}","import { renderAlert } from '../alert.template'\n\nexport interface RegisterPageData {\n error?: string\n}\n\nexport function renderRegisterPage(data: RegisterPageData): string {\n return `\n \n \n \n \n \n Register - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n
\n

SonicJS AI

\n

Create your account and get started

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n\n \n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Create Account\n \n \n\n \n
\n

\n Already have an account?\n Sign in here\n

\n
\n\n
\n
\n
\n
\n \n \n `\n}","/**\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 {\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\n if (plugin?.settings) {\n // Parse settings and check registration.enabled\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 return true // Default to enabled if no settings\n } catch {\n return true // Default to enabled on error\n }\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 {\n try {\n const result = await db.prepare('SELECT COUNT(*) as count FROM users').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 {\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 users 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 username: z.string().min(3, 'Username must be at least 3 characters').optional(),\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\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 {\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 'username':\n // Generate username from email (part before @)\n return data.email ? data.email.split('@')[0] : `user${Date.now()}`\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","/**\n * User Profile Config Registry\n *\n * Global singleton storing developer-defined custom profile field definitions.\n * Set once at app boot via defineUserProfile(), queried by routes and templates.\n */\n\nimport type { FieldType } from '../../../types/collection-config'\n\nexport interface ProfileFieldDefinition {\n name: string\n label: string\n type: FieldType\n options?: string[]\n default?: any\n required?: boolean\n placeholder?: string\n helpText?: string\n hidden?: boolean\n fields?: ProfileFieldDefinition[]\n validation?: {\n min?: number\n max?: number\n pattern?: string\n }\n}\n\nexport interface UserProfileConfig {\n fields: ProfileFieldDefinition[]\n registrationFields?: string[]\n}\n\nlet _profileConfig: UserProfileConfig | null = null\n\nexport function defineUserProfile(config: UserProfileConfig): void {\n if (_profileConfig) {\n console.warn('[SonicJS] defineUserProfile called multiple times — overwriting previous config')\n }\n _profileConfig = config\n}\n\nexport function getUserProfileConfig(): UserProfileConfig | null {\n return _profileConfig\n}\n\nexport function getProfileFieldDefaults(): Record {\n if (!_profileConfig) return {}\n const defaults: Record = {}\n for (const field of _profileConfig.fields) {\n if (field.default !== undefined) {\n defaults[field.name] = field.default\n }\n }\n return defaults\n}\n\nexport function getRegistrationFields(): ProfileFieldDefinition[] {\n if (!_profileConfig) return []\n const regFieldNames = _profileConfig.registrationFields || []\n return _profileConfig.fields.filter(f => regFieldNames.includes(f.name))\n}\n\n/** Reset state — for tests only */\nexport function _resetProfileConfig(): void {\n _profileConfig = null\n}\n","/**\n * User Profile Service\n *\n * Handles reading, writing, validation, and sanitization of custom profile data.\n */\n\nimport { sanitizeInput } from '../../../utils/sanitize'\nimport {\n getUserProfileConfig,\n getProfileFieldDefaults,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport function validateCustomData(\n data: Record,\n config: UserProfileConfig\n): { valid: boolean; errors: Record } {\n const errors: Record = {}\n\n for (const field of config.fields) {\n const value = data[field.name]\n\n if (field.required && (value === undefined || value === null || value === '')) {\n errors[field.name] = `${field.label} is required`\n continue\n }\n\n if (value === undefined || value === null || value === '') continue\n\n if (field.type === 'number' && typeof value !== 'number') {\n errors[field.name] = `${field.label} must be a number`\n }\n if (field.type === 'select' && field.options && !field.options.includes(value)) {\n errors[field.name] = `${field.label} must be one of: ${field.options.join(', ')}`\n }\n if (field.type === 'boolean' && typeof value !== 'boolean') {\n errors[field.name] = `${field.label} must be true or false`\n }\n if (field.validation?.min !== undefined && typeof value === 'number' && value < field.validation.min) {\n errors[field.name] = `${field.label} must be at least ${field.validation.min}`\n }\n if (field.validation?.max !== undefined && typeof value === 'number' && value > field.validation.max) {\n errors[field.name] = `${field.label} must be at most ${field.validation.max}`\n }\n if (field.validation?.pattern && typeof value === 'string' && !new RegExp(field.validation.pattern).test(value)) {\n errors[field.name] = `${field.label} format is invalid`\n }\n }\n\n return { valid: Object.keys(errors).length === 0, errors }\n}\n\nexport function sanitizeCustomData(\n data: Record,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n const knownNames = new Set(config.fields.map(f => f.name))\n\n for (const [key, value] of Object.entries(data)) {\n if (!knownNames.has(key)) continue\n if (typeof value === 'string') {\n result[key] = sanitizeInput(value)\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\nexport function coerceFieldValue(raw: string | null | undefined, field: ProfileFieldDefinition): any {\n if (raw === null || raw === undefined || raw === '') {\n return field.default ?? null\n }\n\n switch (field.type) {\n case 'number':\n const num = Number(raw)\n return isNaN(num) ? null : num\n case 'boolean':\n case 'checkbox':\n return raw === '1' || raw === 'true' || raw === 'on'\n case 'date':\n case 'datetime':\n const ts = new Date(raw).getTime()\n return isNaN(ts) ? null : ts\n default:\n return raw\n }\n}\n\nexport function extractCustomFieldsFromForm(\n formData: FormData,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n for (const field of config.fields) {\n const raw = formData.get(`custom_${field.name}`)?.toString()\n // For boolean/checkbox, absence means false\n if (raw === null || raw === undefined) {\n if (field.type === 'boolean' || field.type === 'checkbox') {\n result[field.name] = false\n }\n continue\n }\n result[field.name] = coerceFieldValue(raw, field)\n }\n return result\n}\n\nexport async function getCustomData(db: any, userId: string): Promise> {\n const row = await db\n .prepare('SELECT data FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (!row?.data) return {}\n try {\n return JSON.parse(row.data)\n } catch {\n return {}\n }\n}\n\nexport async function saveCustomData(\n db: any,\n userId: string,\n newData: Record\n): Promise {\n const existing = await getCustomData(db, userId)\n const merged = { ...existing, ...newData }\n const json = JSON.stringify(merged)\n\n // Check if profile row exists\n const row = await db\n .prepare('SELECT id FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (row) {\n await db\n .prepare('UPDATE user_profiles SET data = ?, updated_at = ? WHERE user_id = ?')\n .bind(json, Date.now(), userId)\n .run()\n } else {\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const now = Date.now()\n await db\n .prepare(\n 'INSERT INTO user_profiles (id, user_id, data, created_at, updated_at) VALUES (?, ?, ?, ?, ?)'\n )\n .bind(profileId, userId, json, now, now)\n .run()\n }\n}\n","export interface DragSortableOptions {\n itemSelector?: string\n handleSelector?: string\n onUpdate?: () => void\n}\n\nexport function getDragSortableScript(): string {\n return `\n \n `;\n}\n","import { getDragSortableScript } from './drag-sortable.template'\n\n/**\n * Returns shared readFieldValue function used by both blocks and structured fields.\n * Uses a window flag to ensure it's only initialized once.\n */\nfunction getReadFieldValueScript(): string {\n return `\n \n `\n}\n\nconst STRUCTURED_INDEX_TOKEN = '__INDEX__'\nconst BLOCK_INDEX_TOKEN = '__BLOCK_INDEX__'\n\nfunction sanitizeStructuredGroupId(fieldName: string): string {\n return `object-${fieldName}`\n .split(BLOCK_INDEX_TOKEN)\n .map((blockSegment) =>\n blockSegment\n .split(STRUCTURED_INDEX_TOKEN)\n .map((segment) =>\n segment\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, ''),\n )\n .join(STRUCTURED_INDEX_TOKEN),\n )\n .join(BLOCK_INDEX_TOKEN)\n}\n\nexport interface FieldDefinition {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any // JSON options\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface FieldRenderOptions {\n value?: any\n errors?: string[]\n disabled?: boolean\n className?: string\n pluginStatuses?: {\n quillEnabled?: boolean\n mdxeditorEnabled?: boolean\n tinymceEnabled?: boolean\n }\n collectionId?: string\n contentId?: string\n}\n\nfunction isMarkdownEditorFieldType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nfunction getEditorMetadata(fieldType: string): { family: string; provider: string } | null {\n if (fieldType === 'richtext' || fieldType === 'tinymce') {\n return {\n family: 'richtext',\n provider: 'tinymce',\n }\n }\n\n if (isMarkdownEditorFieldType(fieldType)) {\n return {\n family: 'markdown',\n provider: 'easymde',\n }\n }\n\n return null\n}\n\nexport function renderDynamicField(field: FieldDefinition, options: FieldRenderOptions = {}): string {\n const { value = '', errors = [], disabled = false, className = '', pluginStatuses = {}, collectionId = '', contentId = '' } = options\n const opts = field.field_options || {}\n const required = field.is_required ? 'required' : ''\n const baseClasses = `w-full rounded-lg px-3 py-2 text-sm text-zinc-950 dark:text-white bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 placeholder:text-zinc-400 dark:placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-zinc-950 dark:focus:ring-white transition-shadow ${className}`\n const errorClasses =\n errors.length > 0\n ? 'ring-pink-600 dark:ring-pink-500 focus:ring-pink-600 dark:focus:ring-pink-500'\n : ''\n\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n\n // Check if this is a plugin-based field type and if the plugin is inactive\n // If so, fall back to textarea with a warning\n let fallbackToTextarea = false\n let fallbackWarning = ''\n\n if (field.field_type === 'quill' && !pluginStatuses.quillEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Quill Editor plugin is inactive. Using textarea fallback.'\n } else if (isMarkdownEditorFieldType(field.field_type) && !pluginStatuses.mdxeditorEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Markdown editor plugin is inactive. Using textarea fallback.'\n } else if ((field.field_type === 'richtext' || field.field_type === 'tinymce') && !pluginStatuses.tinymceEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ TinyMCE plugin is inactive. Using textarea fallback.'\n }\n\n // If falling back to textarea, render it with a warning\n if (fallbackToTextarea) {\n return `\n
\n ${fallbackWarning ? `
${fallbackWarning}
` : ''}\n ${escapeHtml(value)}\n
\n `\n }\n\n let fieldHTML = ''\n\n switch (field.field_type) {\n case 'text':\n let patternHelp = ''\n let autoSlugScript = ''\n\n if (opts.pattern) {\n if (opts.pattern === '^[a-z0-9-]+$' || opts.pattern === '^[a-zA-Z0-9_-]+$') {\n patternHelp =\n '

Use letters, numbers, underscores, and hyphens only

'\n\n // Add auto-slug generation for slug fields\n if (fieldName === 'slug') {\n patternHelp +=\n ''\n autoSlugScript = `\n \n `\n }\n } else {\n patternHelp =\n '

Must match required format

'\n }\n }\n\n fieldHTML = `\n \n ${patternHelp}\n ${autoSlugScript}\n ${\n opts.pattern\n ? `\n \n `\n : ''\n }\n `\n break\n\n case 'textarea':\n fieldHTML = `\n ${escapeHtml(value)}\n `\n break\n\n case 'richtext':\n case 'tinymce':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'quill':\n // Quill WYSIWYG Editor\n fieldHTML = `\n
\n \n ${value}
\n\n \n \n \n `\n break\n\n case 'markdown':\n case 'mdxeditor':\n case 'easymde':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n // Markdown editor fields use the EasyMDE-backed richtext container.\n // The EasyMDE plugin initialization script handles activation.\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'number':\n fieldHTML = `\n \n `\n break\n\n case 'boolean':\n const checked = value === true || value === 'true' || value === '1' ? 'checked' : ''\n fieldHTML = `\n
\n \n \n
\n \n `\n break\n\n case 'date':\n fieldHTML = `\n \n `\n break\n\n case 'datetime':\n fieldHTML = `\n \n `\n break\n\n case 'slug':\n // Slug fields with auto-generation and duplicate detection\n const slugPattern = opts.pattern || '^[a-z0-9-]+$'\n const collectionIdValue = collectionId || opts.collectionId || ''\n const contentIdValue = contentId || opts.contentId || ''\n const isEditMode = !!value\n\n fieldHTML = `\n
\n \n
\n \n

Use lowercase letters, numbers, and hyphens only

\n
\n \n \n `\n break\n\n case 'select':\n const selectOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const multiple = opts.multiple ? 'multiple' : ''\n const selectedValues = Array.isArray(value) ? value : [value]\n\n fieldHTML = `\n \n ${!required && !opts.multiple ? '' : ''}\n ${selectOptions\n .map((option: any) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const selected = selectedValues.includes(optionValue) ? 'selected' : ''\n return ``\n })\n .join('')}\n \n ${\n opts.allowCustom\n ? `\n
\n \n
\n `\n : ''\n }\n `\n break\n\n case 'radio':\n const radioOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const selectedRadioValue =\n value !== undefined && value !== null\n ? String(value)\n : opts.default\n ? String(opts.default)\n : ''\n\n const isInline = opts.inline === true\n fieldHTML = `\n
\n ${radioOptions\n .map((option: any, index: number) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const inputId = `${fieldId}-option-${index}`\n const checked = selectedRadioValue === String(optionValue) ? 'checked' : ''\n return `\n \n `\n })\n .join('')}\n
\n `\n break\n\n case 'reference':\n let referenceCollections: string[] = []\n if (Array.isArray(opts.collection)) {\n referenceCollections = opts.collection.filter(Boolean)\n } else if (typeof opts.collection === 'string' && opts.collection) {\n referenceCollections = [opts.collection]\n }\n const referenceCollectionsAttr = referenceCollections.join(',')\n const hasReferenceCollection = referenceCollections.length > 0\n const hasReferenceValue = Boolean(value)\n fieldHTML = `\n
\n \n
\n \n ${hasReferenceCollection ? (hasReferenceValue ? 'Loading selection...' : 'No reference selected.') : 'Reference collection not configured.'}\n
\n
\n \n Select reference\n \n \n Remove\n \n
\n
\n \n `\n break\n\n case 'media':\n // Check if multiple selection is enabled\n const isMultiple = opts.multiple === true\n const mediaValues =\n isMultiple && value\n ? Array.isArray(value)\n ? value\n : String(value).split(',').filter(Boolean)\n : []\n const singleValue = !isMultiple ? value : ''\n\n // Helper to detect if URL is a video\n const isVideoUrl = (url: string) => {\n const videoExtensions = ['.mp4', '.webm', '.ogg', '.mov', '.avi']\n return videoExtensions.some((ext) => url.toLowerCase().endsWith(ext))\n }\n\n // Helper to render media element\n const renderMediaPreview = (url: string, alt: string, classes: string) => {\n if (isVideoUrl(url)) {\n return ``\n }\n return `\"${alt}\"`\n }\n\n fieldHTML = `\n
\n \n\n ${\n isMultiple\n ? `\n
\n ${mediaValues\n .map(\n (url: string, idx: number) => `\n
\n ${renderMediaPreview(url, `Media ${idx + 1}`, 'w-full h-24 object-cover rounded-lg border border-white/20')}\n \n \n \n \n \n
\n `,\n )\n .join('')}\n
\n `\n : `\n
\n ${singleValue ? renderMediaPreview(singleValue, 'Selected media', 'w-32 h-32 object-cover rounded-lg border border-white/20') : ''}\n
\n `\n }\n\n
\n \n \n \n \n ${isMultiple ? 'Select Media (Multiple)' : 'Select Media'}\n \n ${\n (isMultiple ? mediaValues.length > 0 : singleValue)\n ? `\n \n ${isMultiple ? 'Clear All' : 'Remove'}\n \n `\n : ''\n }\n
\n
\n `\n break\n\n case 'object':\n // Structured object field (like SEO with nested properties)\n return renderStructuredObjectField(field, options, baseClasses, errorClasses)\n\n case 'array':\n // Check if this is a blocks field (has discriminator/blocks config) or a regular array\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n if (itemsConfig.blocks && typeof itemsConfig.blocks === 'object') {\n // Blocks field with discriminated union\n return renderBlocksField(field, options, baseClasses, errorClasses)\n }\n // Regular structured array field\n return renderStructuredArrayField(field, options, baseClasses, errorClasses)\n\n default:\n fieldHTML = `\n \n `\n }\n\n const showLabel = field.field_type !== 'boolean'\n\n return `\n
0 ? 'true' : 'false'}\">\n ${\n showLabel\n ? `\n \n `\n : ''\n }\n ${fieldHTML}\n ${\n errors.length > 0\n ? `\n
\n ${errors.map((error) => `
${escapeHtml(error)}
`).join('')}\n
\n `\n : ''\n }\n ${\n opts.helpText\n ? `\n
\n ${escapeHtml(opts.helpText)}\n
\n `\n : ''\n }\n
\n `\n}\n\nexport function renderFieldGroup(\n title: string,\n fields: string[],\n collapsible: boolean = false,\n): string {\n const groupId = title.toLowerCase().replace(/\\s+/g, '-')\n\n return `\n
\n
\n

\n ${escapeHtml(title)}\n ${\n collapsible\n ? `\n \n \n \n `\n : ''\n }\n

\n
\n
\n ${fields.join('')}\n
\n
\n `\n}\n\nfunction renderBlocksField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const blocks = normalizeBlockDefinitions(itemsConfig.blocks)\n const discriminator =\n typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n const blockValues = normalizeBlocksValue(value, discriminator)\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const emptyState =\n blockValues.length === 0\n ? `\n
\n No blocks yet. Add your first block to get started.\n
\n `\n : ''\n\n const blockOptions = blocks\n .map((block) => ``)\n .join('')\n\n const blockItems = blockValues\n .map((blockValue, index) =>\n renderBlockItem(field, blockValue, blocks, discriminator, index, pluginStatuses),\n )\n .join('')\n\n const templates = blocks\n .map((block) => renderBlockTemplate(field, block, discriminator, pluginStatuses))\n .join('')\n\n return `\n \n \n\n
\n

\n ${escapeHtml(field.field_label || 'Content Blocks')}\n

\n
\n\n
\n
\n \n \n ${blockOptions}\n \n
\n \n Add Block\n \n
\n\n
\n ${blockItems || emptyState}\n
\n\n ${templates}\n \n ${getDragSortableScript()}\n ${getBlocksFieldScript()}\n `\n}\n\nfunction renderStructuredObjectField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = {}, pluginStatuses = {}, errors = [] } = options\n const opts = field.field_options || {}\n const properties = opts.properties && typeof opts.properties === 'object' ? opts.properties : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const objectValue = normalizeStructuredObjectValue(value)\n const objectLayout = opts.objectLayout || 'nested'\n const useNestedLayout = objectLayout !== 'flat'\n\n const subfields = Object.entries(properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n objectValue,\n pluginStatuses,\n field.field_name,\n ),\n )\n .join('')\n\n const groupTitle = field.field_label || field.field_name\n\n if (!useNestedLayout) {\n return `\n
\n \n
\n

\n ${escapeHtml(groupTitle)}\n

\n
\n
\n ${subfields}\n
\n
\n ${getStructuredFieldScript()}\n `\n }\n\n const groupId = sanitizeStructuredGroupId(field.field_name)\n const isCollapsed = errors.length > 0 ? false : opts.collapsed !== false\n\n return `\n
\n
\n

\n ${escapeHtml(groupTitle)}\n \n \n \n

\n
\n
\n \n
\n ${subfields}\n
\n
\n
\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const arrayValue = normalizeStructuredArrayValue(value)\n const arrayTitle = opts.itemLabel || field.field_label || 'Items'\n const hasItemTitle = typeof opts.itemTitle === 'string' && opts.itemTitle.trim() !== ''\n const arrayItemTitle = hasItemTitle ? opts.itemTitle.trim() : 'Item'\n const addItemLabel = hasItemTitle ? `Add ${arrayItemTitle}` : 'Add item'\n\n const items = arrayValue\n .map((itemValue, index) =>\n renderStructuredArrayItem(\n field,\n itemsConfig,\n String(index),\n itemValue,\n pluginStatuses,\n arrayItemTitle,\n ),\n )\n .join('')\n\n const emptyState =\n arrayValue.length === 0\n ? `\n
\n No items yet. Add the first item to get started.\n
\n `\n : ''\n\n return `\n
\n \n\n
\n
\n ${escapeHtml(arrayTitle)}\n
\n \n ${escapeHtml(addItemLabel)}\n \n
\n\n
\n ${items || emptyState}\n
\n\n \n
\n ${getDragSortableScript()}\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayItem(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n arrayItemTitle: string,\n): string {\n const itemFields = renderStructuredItemFields(field, itemConfig, index, itemValue, pluginStatuses)\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n ${escapeHtml(arrayItemTitle)} \n
\n
\n
\n \n \n \n \n
\n
\n
\n ${itemFields}\n
\n
\n `\n}\n\nfunction renderStructuredItemFields(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const itemType = itemConfig?.type || 'string'\n if (\n itemType === 'object' &&\n itemConfig?.properties &&\n typeof itemConfig.properties === 'object'\n ) {\n const fieldPrefix = `array-${field.field_name}-${index}`\n return Object.entries(itemConfig.properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n itemValue || {},\n pluginStatuses,\n fieldPrefix,\n ),\n )\n .join('')\n }\n\n const normalizedField = normalizeBlockField(itemConfig, 'Item')\n const fieldValue = itemValue ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `array-${field.field_name}-${index}-value`,\n field_name: `array-${field.field_name}-${index}-value`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction renderStructuredSubfield(\n field: FieldDefinition,\n propertyName: string,\n propertyConfig: any,\n objectValue: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n fieldPrefix: string,\n): string {\n const normalizedField = normalizeBlockField(propertyConfig, propertyName)\n const fieldValue = objectValue?.[propertyName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `${fieldPrefix}-${propertyName}`,\n field_name: `${fieldPrefix}__${propertyName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction normalizeStructuredObjectValue(value: any): Record {\n if (!value) return {}\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {}\n } catch {\n return {}\n }\n }\n if (typeof value === 'object' && !Array.isArray(value)) return value\n return {}\n}\n\nfunction normalizeStructuredArrayValue(value: any): any[] {\n if (!value) return []\n if (Array.isArray(value)) return value\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction normalizeBlockDefinitions(\n rawBlocks: any,\n): Array<{ name: string; label: string; description?: string; properties: Record }> {\n if (!rawBlocks || typeof rawBlocks !== 'object') return []\n\n return Object.entries(rawBlocks)\n .filter(([name, block]) => typeof name === 'string' && block && typeof block === 'object')\n .map(([name, block]: [string, any]) => ({\n name,\n label: block.label || name,\n description: block.description,\n properties: block.properties && typeof block.properties === 'object' ? block.properties : {},\n }))\n}\n\nfunction normalizeBlocksValue(value: any, discriminator: string): any[] {\n const normalizeItem = (item: any) => {\n if (!item || typeof item !== 'object') return null\n if (item[discriminator]) return item\n if (item.blockType && item.data && typeof item.data === 'object') {\n return { [discriminator]: item.blockType, ...item.data }\n }\n return item\n }\n\n const fromArray = (items: any[]) =>\n items.map(normalizeItem).filter((item) => item && typeof item === 'object')\n\n if (Array.isArray(value)) return fromArray(value)\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? fromArray(parsed) : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction renderBlockTemplate(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n return `\n \n `\n}\n\nfunction renderBlockItem(\n field: FieldDefinition,\n blockValue: any,\n blocks: Array<{\n name: string\n label: string\n description?: string\n properties: Record\n }>,\n discriminator: string,\n index: number,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockType = blockValue?.[discriminator] || blockValue?.blockType\n const blockDefinition = blocks.find((block) => block.name === blockType)\n\n if (!blockDefinition) {\n return `\n
\n Unknown block type: ${escapeHtml(String(blockType || 'unknown'))}. This block will be preserved as-is.\n
\n `\n }\n\n const data =\n blockValue && typeof blockValue === 'object'\n ? Object.fromEntries(Object.entries(blockValue).filter(([key]) => key !== discriminator))\n : {}\n\n return renderBlockCard(field, blockDefinition, discriminator, String(index), data, pluginStatuses)\n}\n\nfunction renderBlockCard(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n index: string,\n data: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockFields = Object.entries(block.properties)\n .map(([fieldName, fieldConfig]) => {\n if (fieldConfig?.type === 'array' && fieldConfig?.items?.blocks) {\n return `\n
\n Nested blocks are not supported yet for \"${escapeHtml(fieldName)}\".\n
\n `\n }\n\n const normalizedField = normalizeBlockField(fieldConfig, fieldName)\n const fieldValue = data?.[fieldName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `block-${field.field_name}-${index}-${fieldName}`,\n field_name: `block-${field.field_name}-${index}-${fieldName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n })\n .join('')\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${escapeHtml(block.label)}\n \n
\n ${block.description ? `

${escapeHtml(block.description)}

` : ''}\n
\n
\n
\n \n \n \n \n
\n
\n
\n ${blockFields}\n
\n
\n `\n}\n\nfunction normalizeBlockField(fieldConfig: any, fieldName: string) {\n const type = fieldConfig?.type || 'text'\n const label = fieldConfig?.title || fieldName\n const required = fieldConfig?.required === true\n const options = { ...fieldConfig }\n\n if (type === 'select' && Array.isArray(fieldConfig?.enum)) {\n options.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return {\n type,\n label,\n required,\n defaultValue: fieldConfig?.default,\n options,\n }\n}\n\nfunction getStructuredFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction getBlocksFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}\n","/**\n * User Profile Custom Fields Renderer\n *\n * Generates the HTML section for custom profile fields by adapting\n * ProfileFieldDefinition into FieldDefinition and calling renderDynamicField.\n */\n\nimport { renderDynamicField, type FieldDefinition } from '../../../templates/components/dynamic-field.template'\nimport type { UserProfileConfig, ProfileFieldDefinition } from './user-profile-registry'\n\nexport function toFieldDefinition(field: ProfileFieldDefinition, index: number): FieldDefinition {\n return {\n id: `custom_${field.name}`,\n field_name: `custom_${field.name}`,\n field_type: field.type,\n field_label: field.label,\n field_options: {\n placeholder: field.placeholder || '',\n helpText: field.helpText || '',\n enum: field.options || [],\n enumLabels: field.options || [],\n },\n field_order: index,\n is_required: field.required || false,\n is_searchable: false,\n }\n}\n\nexport function renderCustomProfileSection(\n config: UserProfileConfig | null,\n customData: Record\n): string {\n if (!config || config.fields.length === 0) return ''\n\n const visibleFields = config.fields.filter(f => !f.hidden)\n if (visibleFields.length === 0) return ''\n\n const fieldsHtml = visibleFields\n .map((field, index) => {\n const fieldDef = toFieldDefinition(field, index)\n const value = customData[field.name] ?? field.default ?? ''\n return renderDynamicField(fieldDef, { value })\n })\n .join('\\n')\n\n return `\n \n
\n

Custom Profile Fields

\n
\n ${fieldsHtml}\n
\n
`\n}\n","/**\n * User Profiles Plugin\n *\n * Configurable custom profile fields for users.\n * Developers call defineUserProfile() at app boot to declare custom fields\n * that are stored as JSON in user_profiles.data and rendered in the admin UI.\n *\n * API Routes:\n * GET /api/user-profiles/schema → Public field definitions\n * GET /api/user-profiles/:userId → Get custom data for a user (auth required)\n * PUT /api/user-profiles/:userId → Update custom data for a user (auth required)\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { getUserProfileConfig } from './user-profile-registry'\nimport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\nimport { renderCustomProfileSection } from './user-profile-renderer'\n\nexport function createUserProfilesPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'user-profiles',\n version: '1.0.0-beta.1',\n description: 'Configurable custom profile fields for users',\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com',\n },\n license: 'MIT',\n compatibility: '^2.0.0',\n })\n\n // ==================== API Routes ====================\n\n const api = new Hono()\n\n // GET /api/user-profiles/schema — public schema endpoint\n api.get('/schema', (c) => {\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ fields: [], registrationFields: [] })\n }\n return c.json({\n fields: config.fields\n .filter(f => !f.hidden)\n .map(f => ({\n name: f.name,\n label: f.label,\n type: f.type,\n options: f.options,\n required: f.required || false,\n placeholder: f.placeholder,\n helpText: f.helpText,\n default: f.default,\n validation: f.validation,\n })),\n registrationFields: config.registrationFields || [],\n })\n })\n\n // GET /api/user-profiles/:userId — get custom data\n api.get('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const userId = c.req.param('userId')\n const data = await getCustomData(db, userId)\n return c.json({ userId, customData: data })\n })\n\n // PUT /api/user-profiles/:userId — update custom data\n api.put('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ error: 'No profile schema configured' }, 400)\n }\n\n const userId = c.req.param('userId')\n const body = await c.req.json()\n const customData = body.customData || body\n\n const sanitized = sanitizeCustomData(customData, config)\n const validation = validateCustomData(sanitized, config)\n if (!validation.valid) {\n return c.json({ error: 'Validation failed', errors: validation.errors }, 400)\n }\n\n await saveCustomData(db, userId, sanitized)\n return c.json({ success: true })\n })\n\n builder.addRoute('/api/user-profiles', api, {\n description: 'Custom user profile fields API',\n requiresAuth: false,\n priority: 100,\n })\n\n builder.lifecycle({\n activate: async () => {\n console.info('[SonicJS] User Profiles plugin activated')\n },\n deactivate: async () => {\n console.info('[SonicJS] User Profiles plugin deactivated')\n },\n })\n\n return builder.build() as Plugin\n}\n\nexport const userProfilesPlugin = createUserProfilesPlugin()\n\n// Re-export public API\nexport {\n defineUserProfile,\n getUserProfileConfig,\n getProfileFieldDefaults,\n getRegistrationFields,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\n\nexport { renderCustomProfileSection } from './user-profile-renderer'\n","import { Hono } from 'hono'\n// import { zValidator } from '@hono/zod-validator'\nimport { z } from 'zod'\nimport { getCookie, setCookie } from 'hono/cookie'\nimport { html } from 'hono/html'\nimport { AuthManager, requireAuth, generateCsrfToken, rateLimit } from '../middleware'\nimport { getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb } from '../middleware/auth'\nimport { renderLoginPage, LoginPageData } from '../templates/pages/auth-login.template'\nimport { renderRegisterPage, RegisterPageData } from '../templates/pages/auth-register.template'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { authValidationService, isRegistrationEnabled, isFirstUserRegistration } from '../services/auth-validation'\nimport type { RegistrationData } from '../services/auth-validation'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, getRegistrationFields, getProfileFieldDefaults, sanitizeCustomData, saveCustomData, getCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n/** Set a signed CSRF cookie alongside the auth cookie on login/register. */\nasync function setCsrfCookie(c: any, maxAge?: number): Promise {\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n const csrfToken = await generateCsrfToken(secret)\n const cookieMaxAge = maxAge ?? (await getJwtExpirySecondsFromDb(c.env?.DB, c.env))\n setCookie(c, 'csrf_token', csrfToken, {\n httpOnly: false,\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: cookieMaxAge,\n })\n}\n\n/** Clear the CSRF cookie on logout. */\nfunction clearCsrfCookie(c: any): void {\n setCookie(c, 'csrf_token', '', {\n httpOnly: false,\n secure: false,\n sameSite: 'Strict',\n path: '/',\n maxAge: 0,\n })\n}\n\nconst authRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Login page (HTML form)\nauthRoutes.get('/login', async (c) => {\n const error = c.req.query('error')\n const message = c.req.query('message')\n \n const pageData: LoginPageData = {\n error: error || undefined,\n message: message || undefined,\n version: c.get('appVersion')\n }\n \n // Check if demo login plugin is active\n const db = c.env.DB\n let demoLoginActive = false\n try {\n const plugin = await db.prepare('SELECT * FROM plugins WHERE id = ? AND status = ?')\n .bind('demo-login-prefill', 'active')\n .first()\n demoLoginActive = !!plugin\n } catch (error) {\n // Ignore database errors - plugin system might not be initialized\n }\n \n return c.html(renderLoginPage(pageData, demoLoginActive))\n})\n\n// Registration page (HTML form)\nauthRoutes.get('/register', async (c) => {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.redirect('/auth/login?error=Registration is currently disabled')\n }\n }\n\n const error = c.req.query('error')\n\n const pageData: RegisterPageData = {\n error: error || undefined\n }\n\n return c.html(renderRegisterPage(pageData))\n})\n\n// Login schema\nconst loginSchema = z.object({\n email: z.string().email('Valid email is required'),\n password: z.string().min(1, 'Password is required')\n})\n\n// Register new user\nauthRoutes.post('/register',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.json({ error: 'Registration is currently disabled' }, 403)\n }\n }\n\n // Parse JSON with error handling\n let requestData\n try {\n requestData = await c.req.json()\n } catch (parseError) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n\n let validatedData: RegistrationData\n try {\n validatedData = await validationSchema.parseAsync(requestData)\n } catch (validationError: any) {\n return c.json({\n error: 'Validation failed',\n details: validationError.issues?.map((e: any) => e.message) || [validationError.message || 'Invalid request data']\n }, 400)\n }\n\n // Extract fields with defaults for optional ones\n const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.json({ error: 'User with this email or username already exists' }, 400)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n \n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n 'viewer', // Default role\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n \n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n if (requestData[field.name] !== undefined) {\n customData[field.name] = requestData[field.name]\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, 'viewer', c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n user: {\n id: userId,\n email: normalizedEmail,\n username,\n firstName,\n lastName,\n role: 'viewer'\n },\n token\n }, 201)\n } catch (error) {\n console.error('Registration error:', error)\n // Return validation errors as 400, other errors as 500\n if (error instanceof Error && error.message.includes('validation')) {\n return c.json({ error: error.message }, 400)\n }\n return c.json({\n error: 'Registration failed',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n }\n)\n\n// Login user\nauthRoutes.post('/login',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const body = await c.req.json()\n const validation = loginSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const { email, password } = validation.data\n const db = c.env.DB\n \n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Find user with caching\n const cache = getCacheService(CACHE_CONFIGS.user!)\n let user = await cache.get(cache.generateKey('user', `email:${normalizedEmail}`))\n\n if (!user) {\n user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n\n if (user) {\n // Cache the user for faster subsequent lookups\n await cache.set(cache.generateKey('user', `email:${normalizedEmail}`), user)\n await cache.set(cache.generateKey('user', user.id), user)\n }\n }\n\n if (!user) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n // Invalidate user cache on login\n await cache.delete(cache.generateKey('user', user.id))\n await cache.delete(cache.generateKey('user', `email:${normalizedEmail}`))\n\n return c.json({\n user: {\n id: user.id,\n email: user.email,\n username: user.username,\n firstName: user.first_name,\n lastName: user.last_name,\n role: user.role\n },\n token\n })\n } catch (error) {\n console.error('Login error:', error)\n return c.json({ error: 'Login failed' }, 500)\n }\n})\n\n// Logout user (both GET and POST for convenience)\nauthRoutes.post('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.json({ message: 'Logged out successfully' })\n})\n\nauthRoutes.get('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.redirect('/auth/login?message=You have been logged out successfully')\n})\n\n// Get current user\nauthRoutes.get('/me', requireAuth(), async (c) => {\n try {\n // This would need the auth middleware applied\n const user = c.get('user')\n \n if (!user) {\n return c.json({ error: 'Not authenticated' }, 401)\n }\n \n const db = c.env.DB\n const userData = await db.prepare('SELECT id, email, username, first_name, last_name, role, created_at FROM users WHERE id = ?')\n .bind(user.userId)\n .first() as Record | null\n\n if (!userData) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n const customData = await getCustomData(db, user.userId)\n return c.json({ user: { ...userData, ...customData } })\n } catch (error) {\n console.error('Get user error:', error)\n return c.json({ error: 'Failed to get user' }, 500)\n }\n})\n\n// Refresh token (sliding session)\n//\n// Accepts a valid JWT — or one that has expired within the grace window\n// (`JWT_REFRESH_GRACE_SECONDS`, default 7 days) — and issues a fresh JWT\n// with a new `exp`. This lets a long-lived session cookie keep a user\n// logged in across JWT expirations without forcing a full re-login.\n//\n// Security: the caller must still present a valid-signature token that\n// recently belonged to an active user. Fully forged or long-expired tokens\n// are rejected.\nauthRoutes.post('/refresh',\n rateLimit({ max: 60, windowMs: 60 * 1000, keyPrefix: 'refresh' }),\n async (c) => {\n try {\n // Accept token from Authorization header or cookie\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) token = getCookie(c, 'auth_token')\n\n if (!token) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const grace = await getJwtRefreshGraceSecondsFromDb(db, c.env)\n\n const payload = await AuthManager.verifyToken(token, c.env.JWT_SECRET, grace)\n if (!payload) {\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Re-validate the user is still active, and pick up any role changes.\n const row = await db.prepare('SELECT id, email, role, is_active FROM users WHERE id = ?')\n .bind(payload.userId)\n .first() as any\n\n if (!row || !row.is_active) {\n return c.json({ error: 'User is not active' }, 401)\n }\n\n // Generate new token with a fresh exp\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env)\n const newToken = await AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set new cookie\n setCookie(c, 'auth_token', newToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n token: newToken,\n expiresIn: tokenTtl\n })\n } catch (error) {\n console.error('Token refresh error:', error)\n return c.json({ error: 'Token refresh failed' }, 500)\n }\n})\n\n// Form-based registration handler (for HTML forms)\nauthRoutes.post('/register/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.html(html`\n
\n Registration is currently disabled. Please contact an administrator.\n
\n `)\n }\n }\n\n const formData = await c.req.formData()\n\n // Extract form data\n const requestData = {\n email: formData.get('email') as string,\n password: formData.get('password') as string,\n username: formData.get('username') as string,\n firstName: formData.get('firstName') as string,\n lastName: formData.get('lastName') as string,\n }\n\n // Normalize email to lowercase\n const normalizedEmail = requestData.email?.toLowerCase()\n requestData.email = normalizedEmail\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n const validation = await validationSchema.safeParseAsync(requestData)\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const validatedData: RegistrationData = validation.data\n\n // Extract fields with defaults for optional ones\n // const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.html(html`\n
\n User with this email or username already exists\n
\n `)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Determine role: first user gets admin, others get viewer\n const role = isFirstUser ? 'admin' : 'viewer'\n\n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n\n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n role,\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n\n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n const raw = formData.get(field.name)?.toString()\n if (raw !== undefined && raw !== null) {\n customData[field.name] = raw\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Redirect based on role\n const redirectUrl = role === 'admin' ? '/admin/dashboard' : '/admin/dashboard'\n\n return c.html(html`\n
\n Account created successfully! Redirecting...\n \n
\n `)\n } catch (error) {\n console.error('Registration error:', error)\n return c.html(html`\n
\n Registration failed. Please try again.\n
\n `)\n }\n})\n\n// Form-based login handler (for HTML forms)\nauthRoutes.post('/login/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email') as string\n const password = formData.get('password') as string\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n\n // Validate the data\n const validation = loginSchema.safeParse({ email: normalizedEmail, password })\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const db = c.env.DB\n \n // Find user\n const user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n \n if (!user) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n return c.html(html`\n
\n
\n
\n \n \n \n
\n

Login successful! Redirecting to admin dashboard...

\n
\n
\n \n
\n
\n `)\n } catch (error) {\n console.error('Login error:', error)\n return c.html(html`\n
\n Login failed. Please try again.\n
\n `)\n }\n})\n\n// Test seeding endpoint (only for development/testing)\nauthRoutes.post('/seed-admin',\n rateLimit({ max: 10, windowMs: 60 * 1000, keyPrefix: 'seed-admin' }),\n async (c) => {\n try {\n const db = c.env.DB\n \n // First ensure the users table exists\n await db.prepare(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL UNIQUE,\n username TEXT NOT NULL UNIQUE,\n first_name TEXT NOT NULL,\n last_name TEXT NOT NULL,\n password_hash TEXT,\n role TEXT NOT NULL DEFAULT 'viewer',\n avatar TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n last_login_at INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `).run()\n \n // Check if admin user already exists\n const existingAdmin = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind('admin@sonicjs.com', 'admin')\n .first()\n\n if (existingAdmin) {\n // Update the password to ensure it's correct for testing\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(passwordHash, Date.now(), existingAdmin.id)\n .run()\n\n return c.json({\n message: 'Admin user already exists (password updated)',\n user: {\n id: existingAdmin.id,\n email: 'admin@sonicjs.com',\n username: 'admin',\n role: 'admin'\n }\n })\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n \n // Create admin user\n const userId = 'admin-user-id'\n const now = Date.now()\n const adminEmail = 'admin@sonicjs.com'.toLowerCase()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n adminEmail,\n 'admin',\n 'Admin',\n 'User',\n passwordHash,\n 'admin',\n 1, // is_active\n now,\n now\n ).run()\n \n return c.json({ \n message: 'Admin user created successfully',\n user: {\n id: userId,\n email: adminEmail,\n username: 'admin',\n role: 'admin'\n },\n passwordHash: passwordHash // For debugging\n })\n } catch (error) {\n console.error('Seed admin error:', error)\n return c.json({ error: 'Failed to create admin user', details: error instanceof Error ? error.message : String(error) }, 500)\n }\n})\n\n\n// Accept invitation page\nauthRoutes.get('/accept-invitation', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.html(`\n \n Invitation Expired\n \n

Invitation Expired

\n

This invitation has expired. Please contact your administrator for a new invitation.

\n Go to Login\n \n \n `)\n }\n\n // Show invitation acceptance form\n return c.html(`\n \n \n \n \n \n Accept Invitation - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Accept Invitation

\n

Complete your account setup

\n

\n You've been invited as ${invitedUser.first_name} ${invitedUser.last_name}
\n ${invitedUser.email}
\n ${invitedUser.role}\n

\n
\n\n
\n \n \n
\n \n \n
\n\n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Accept invitation page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your invitation.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process invitation acceptance\nauthRoutes.post('/accept-invitation', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const username = formData.get('username')?.toString()?.trim()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !username || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'Invalid or expired invitation' }, 400)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.json({ error: 'Invitation has expired' }, 400)\n }\n\n // Check if username is available\n const existingUsernameStmt = db.prepare(`\n SELECT id FROM users WHERE username = ? AND id != ?\n `)\n const existingUsername = await existingUsernameStmt.bind(username, invitedUser.id).first()\n\n if (existingUsername) {\n return c.json({ error: 'Username is already taken' }, 400)\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Activate user account\n const updateStmt = db.prepare(`\n UPDATE users SET \n username = ?,\n password_hash = ?,\n is_active = 1,\n email_verified = 1,\n invitation_token = NULL,\n accepted_invitation_at = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n username,\n passwordHash,\n Date.now(),\n Date.now(),\n invitedUser.id\n ).run()\n\n // Generate JWT token for auto-login\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const authToken = await AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', authToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?welcome=true')\n\n } catch (error) {\n console.error('Accept invitation error:', error)\n return c.json({ error: 'Failed to accept invitation' }, 500)\n }\n})\n\n// Request password reset\nauthRoutes.post('/request-password-reset',\n rateLimit({ max: 3, windowMs: 15 * 60 * 1000, keyPrefix: 'password-reset' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email')?.toString()?.trim()?.toLowerCase()\n\n if (!email) {\n return c.json({ error: 'Email is required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if user exists and is active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name FROM users \n WHERE email = ? AND is_active = 1\n `)\n const user = await userStmt.bind(email).first() as any\n\n // Always return success to prevent email enumeration\n if (!user) {\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.'\n })\n }\n\n // Generate password reset token (expires in 1 hour)\n const resetToken = crypto.randomUUID()\n const resetExpires = Date.now() + (60 * 60 * 1000) // 1 hour\n\n // Update user with reset token\n const updateStmt = db.prepare(`\n UPDATE users SET \n password_reset_token = ?,\n password_reset_expires = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n resetToken,\n resetExpires,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // In a real implementation, you would send an email here\n // For now, we'll return the reset link for development\n const resetLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/reset-password?token=${resetToken}`\n\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.',\n reset_link: resetLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('Password reset request error:', error)\n return c.json({ error: 'Failed to process password reset request' }, 500)\n }\n})\n\n// Show password reset form\nauthRoutes.get('/reset-password', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, password_reset_expires\n FROM users \n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has already been used.

\n Go to Login\n \n \n `)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.html(`\n \n Reset Link Expired\n \n

Reset Link Expired

\n

The password reset link has expired. Please request a new one.

\n Go to Login\n \n \n `)\n }\n\n // Show password reset form\n return c.html(`\n \n \n \n \n \n Reset Password - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Reset Password

\n

Choose a new password for your account

\n

\n Reset password for ${user.first_name} ${user.last_name}
\n ${user.email}\n

\n
\n\n
\n \n \n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n\n \n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Password reset page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your password reset.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process password reset\nauthRoutes.post('/reset-password', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, password_hash, password_reset_expires\n FROM users\n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.json({ error: 'Invalid or expired reset token' }, 400)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.json({ error: 'Reset token has expired' }, 400)\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(password)\n\n // Store old password in history (skip if table doesn't exist)\n try {\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user.id,\n user.password_hash,\n Date.now()\n ).run()\n } catch (historyError) {\n // Password history table may not exist yet\n console.warn('Could not store password history:', historyError)\n }\n\n // Update user password and clear reset token\n const updateStmt = db.prepare(`\n UPDATE users SET\n password_hash = ?,\n password_reset_token = NULL,\n password_reset_expires = NULL,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newPasswordHash,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to login with success message\n return c.redirect('/auth/login?message=Password reset successfully. Please log in with your new password.')\n\n } catch (error) {\n console.error('Password reset error:', error)\n return c.json({ error: 'Failed to reset password' }, 500)\n }\n})\n\nexport default authRoutes\n","/**\n * Test Cleanup Routes\n *\n * Provides endpoints to clean up test data after e2e tests\n * WARNING: These endpoints should only be available in development/test environments\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database } from '@cloudflare/workers-types'\n\nconst app = new Hono()\n\n/**\n * Clean up all test data (collections, content, users except admin)\n * POST /test-cleanup\n */\napp.post('/test-cleanup', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Use pattern-based deletes to avoid SQL variable limits\n // This approach uses subqueries instead of building large IN lists\n\n // Step 1: Delete child data for test content (by pattern)\n await db.prepare(`\n DELETE FROM content_versions\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM workflow_history\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n // Note: content_data table may not exist in all schemas\n try {\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n } catch (e) {\n // Table doesn't exist, skip\n }\n\n // Step 2: Delete test content by pattern\n const contentResult = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n `).run()\n deletedCount += contentResult.meta?.changes || 0\n\n // Step 3: Delete child data for test users\n await db.prepare(`\n DELETE FROM api_tokens\n WHERE user_id IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM media\n WHERE uploaded_by IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n // Step 4: Delete test users\n const usersResult = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n `).run()\n deletedCount += usersResult.meta?.changes || 0\n\n // Step 5: Delete child data for test collections\n try {\n await db.prepare(`\n DELETE FROM collection_fields\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Delete remaining content from test collections\n await db.prepare(`\n DELETE FROM content\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n\n // Step 6: Delete test collections\n const collectionsResult = await db.prepare(`\n DELETE FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).run()\n deletedCount += collectionsResult.meta?.changes || 0\n\n // Step 7: Clean up orphaned data (skip if tables don't exist)\n try {\n await db.prepare(`\n DELETE FROM content_data WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM collection_fields WHERE collection_id NOT IN (SELECT id FROM collections)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM content_versions WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM workflow_history WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Step 8: Delete old activity logs (keep only last 100)\n await db.prepare(`\n DELETE FROM activity_logs\n WHERE id NOT IN (\n SELECT id FROM activity_logs\n ORDER BY created_at DESC\n LIMIT 100\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test data cleaned up successfully'\n })\n } catch (error) {\n console.error('Test cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test users only\n * POST /test-cleanup/users\n */\napp.post('/test-cleanup/users', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test users (preserve admin)\n const result = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com'\n AND (\n email LIKE '%test%'\n OR email LIKE '%example.com%'\n OR first_name = 'Test'\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test users cleaned up successfully'\n })\n } catch (error) {\n console.error('User cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test collections only\n * POST /test-cleanup/collections\n */\napp.post('/test-cleanup/collections', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Get test collection IDs first\n const collections = await db.prepare(`\n SELECT id FROM collections\n WHERE name LIKE 'test_%'\n OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).all()\n\n if (collections.results && collections.results.length > 0) {\n const collectionIds = collections.results.map((c: any) => c.id)\n\n // Delete associated fields\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM collection_fields WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete associated content\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM content WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete the collections\n const result = await db.prepare(`\n DELETE FROM collections\n WHERE id IN (${collectionIds.map(() => '?').join(',')})\n `).bind(...collectionIds).run()\n\n deletedCount = result.meta?.changes || 0\n }\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test collections cleaned up successfully'\n })\n } catch (error) {\n console.error('Collection cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test content only\n * POST /test-cleanup/content\n */\napp.post('/test-cleanup/content', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test content\n const result = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %'\n OR title LIKE '%E2E%'\n OR title LIKE '%Playwright%'\n OR title LIKE '%Sample%'\n `).run()\n\n // Clean up orphaned content_data\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test content cleaned up successfully'\n })\n } catch (error) {\n console.error('Content cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Plugin Middleware\n *\n * Provides middleware functions for checking plugin status and enforcing plugin requirements\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n/**\n * Check if a plugin is active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @returns Promise - True if the plugin is active, false otherwise\n */\nexport async function isPluginActive(db: D1Database, pluginId: string): Promise {\n try {\n const result = await db\n .prepare('SELECT status FROM plugins WHERE id = ?')\n .bind(pluginId)\n .first()\n\n return result?.status === 'active'\n } catch (error) {\n console.error(`[isPluginActive] Error checking plugin status for ${pluginId}:`, error)\n return false\n }\n}\n\n/**\n * Middleware to require a plugin to be active\n * Throws an error if the plugin is not active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @throws Error if plugin is not active\n */\nexport async function requireActivePlugin(db: D1Database, pluginId: string): Promise {\n const isActive = await isPluginActive(db, pluginId)\n if (!isActive) {\n throw new Error(`Plugin '${pluginId}' is required but is not active`)\n }\n}\n\n/**\n * Middleware to require multiple plugins to be active\n * Throws an error if any plugin is not active\n * @param db - The D1 database instance\n * @param pluginIds - Array of plugin IDs to check\n * @throws Error if any plugin is not active\n */\nexport async function requireActivePlugins(db: D1Database, pluginIds: string[]): Promise {\n for (const pluginId of pluginIds) {\n await requireActivePlugin(db, pluginId)\n }\n}\n\n/**\n * Get all active plugins\n * @param db - The D1 database instance\n * @returns Promise - Array of active plugin records\n */\nexport async function getActivePlugins(db: D1Database): Promise {\n try {\n const { results } = await db\n .prepare('SELECT * FROM plugins WHERE status = ?')\n .bind('active')\n .all()\n\n return results || []\n } catch (error) {\n console.error('[getActivePlugins] Error fetching active plugins:', error)\n return []\n }\n}\n","export interface ContentVersion {\n id: string\n version: number\n data: any\n author_id: string\n author_name?: string\n created_at: number\n is_current?: boolean\n}\n\nexport interface VersionHistoryData {\n contentId: string\n versions: ContentVersion[]\n currentVersion: number\n}\n\nexport function renderVersionHistory(data: VersionHistoryData): string {\n return `\n
\n
\n \n
\n
\n
\n

Version History

\n \n
\n
\n \n \n
\n
\n ${data.versions.map((version, index) => `\n
\n
\n
\n \n Version ${version.version}${version.is_current ? ' (Current)' : ''}\n \n \n ${new Date(version.created_at).toLocaleString()}\n \n
\n
\n ${!version.is_current ? `\n \n ` : ''}\n \n
\n
\n \n \n
\n
\n
\n Title:\n ${escapeHtml(version.data?.title || 'Untitled')}\n
\n
\n Author:\n ${escapeHtml(version.author_name || 'Unknown')}\n
\n ${version.data?.excerpt ? `\n
\n Excerpt:\n

${escapeHtml(version.data.excerpt.substring(0, 200))}${version.data.excerpt.length > 200 ? '...' : ''}

\n
\n ` : ''}\n
\n
\n \n \n ${!version.is_current && index < data.versions.length - 1 ? `\n
\n \n
\n Change detection coming soon...\n
\n
\n ` : ''}\n
\n `).join('')}\n
\n
\n \n \n
\n
\n \n ${data.versions.length} version${data.versions.length !== 1 ? 's' : ''} total\n \n \n
\n
\n
\n
\n \n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * EasyMDE Markdown Editor Plugin\n *\n * Provides markdown editing capabilities for richtext fields.\n * When active, this plugin injects the EasyMDE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'easy-mdx',\n version: '1.0.0',\n description: 'Lightweight markdown editor with live preview'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ EasyMDE editor plugin activated')\n },\n deactivate: async () => {\n console.info('❌ EasyMDE editor plugin deactivated')\n }\n})\n\nconst easyMdxPlugin = builder.build() as Plugin\n\nexport default easyMdxPlugin\n\n/**\n * Get EasyMDE CDN script tags\n * @returns HTML script and style tags for EasyMDE\n */\nexport function getMDXEditorScripts(): string {\n return `\n \n \n \n \n `\n}\n\n/**\n * Get EasyMDE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getMDXEditorInitScript(config?: {\n defaultHeight?: number\n toolbar?: string\n placeholder?: string\n}): string {\n const defaultHeight = config?.defaultHeight || 400\n const toolbar = config?.toolbar || 'full'\n const placeholder = config?.placeholder || 'Start writing your content...'\n\n return `\n // Initialize EasyMDE (Markdown Editor) only for markdown-marked fields\n function initializeMDXEditor() {\n if (typeof EasyMDE === 'undefined') {\n console.warn('EasyMDE not loaded yet, retrying...');\n setTimeout(initializeMDXEditor, 100);\n return;\n }\n\n // Find all textareas that need EasyMDE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"easymde\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (textarea.dataset.mdxeditorInitialized === 'true') {\n return;\n }\n\n // Mark as initialized\n textarea.dataset.mdxeditorInitialized = 'true';\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const editorToolbar = container?.dataset.toolbar || '${toolbar}';\n\n // Initialize EasyMDE\n try {\n const toolbarButtons = editorToolbar === 'minimal'\n ? ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'preview']\n : ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', 'table', '|', 'preview', 'side-by-side', 'fullscreen', '|', 'guide'];\n\n const easyMDE = new EasyMDE({\n element: textarea,\n placeholder: '${placeholder}',\n spellChecker: false,\n minHeight: height + 'px',\n toolbar: toolbarButtons,\n status: ['lines', 'words', 'cursor'],\n renderingConfig: {\n singleLineBreaks: false,\n codeSyntaxHighlighting: true\n }\n });\n\n // Store reference to editor instance\n textarea.easyMDEInstance = easyMDE;\n\n // Sync changes back to textarea\n easyMDE.codemirror.on(\"change\", () => {\n textarea.value = easyMDE.value();\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n textarea.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n\n console.log('EasyMDE initialized for field:', textarea.id || textarea.name);\n } catch (error) {\n console.error('Error initializing EasyMDE:', error);\n // Show textarea as fallback\n textarea.style.display = 'block';\n }\n });\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeMDXEditor);\n } else {\n // DOM already loaded, initialize immediately\n initializeMDXEditor();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeMDXEditor, 100);\n });\n `\n}\n\n/**\n * Check if EasyMDE editor plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isEasyMdxActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('easy-mdx')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking EasyMDE editor plugin status:', error)\n return false\n }\n}\n","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * TinyMCE Rich Text Editor Plugin\n *\n * Provides WYSIWYG editing capabilities for richtext fields.\n * When active, this plugin injects the TinyMCE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'tinymce-plugin',\n version: '1.0.0',\n description: 'Powerful WYSIWYG rich text editor for content creation'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ TinyMCE plugin activated')\n },\n deactivate: async () => {\n console.info('❌ TinyMCE plugin deactivated')\n }\n})\n\nconst tinymcePlugin = builder.build() as Plugin\n\nexport default tinymcePlugin\n\n/**\n * Get TinyMCE CDN script tag\n * @param apiKey - Optional TinyMCE API key (defaults to 'no-api-key')\n * @returns HTML script tag for TinyMCE CDN\n */\nexport function getTinyMCEScript(apiKey: string = 'no-api-key'): string {\n return ``\n}\n\n/**\n * Get TinyMCE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getTinyMCEInitScript(config?: {\n skin?: string\n defaultHeight?: number\n defaultToolbar?: string\n}): string {\n const skin = config?.skin || 'oxide-dark'\n const contentCss = skin.includes('dark') ? 'dark' : 'default'\n const defaultHeight = config?.defaultHeight || 300\n\n return `\n // Initialize TinyMCE only for TinyMCE-backed richtext fields\n function initializeTinyMCE() {\n if (typeof tinymce !== 'undefined') {\n // Find all textareas that need TinyMCE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"tinymce\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (tinymce.get(textarea.id)) {\n return;\n }\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const toolbar = container?.dataset.toolbar || 'full';\n\n tinymce.init({\n selector: '#' + textarea.id,\n skin: '${skin}',\n content_css: '${contentCss}',\n height: parseInt(height),\n menubar: false,\n plugins: [\n 'advlist', 'autolink', 'lists', 'link', 'image', 'charmap', 'preview',\n 'anchor', 'searchreplace', 'visualblocks', 'code', 'fullscreen',\n 'insertdatetime', 'media', 'table', 'help', 'wordcount'\n ],\n toolbar: toolbar === 'simple'\n ? 'bold italic underline | bullist numlist | link'\n : toolbar === 'minimal'\n ? 'bold italic | link'\n : 'undo redo | blocks | bold italic forecolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | help',\n content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; font-size: 14px }'\n });\n });\n }\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeTinyMCE);\n } else {\n // DOM already loaded, initialize immediately\n initializeTinyMCE();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeTinyMCE, 100);\n });\n `\n}\n\n/**\n * Check if TinyMCE plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isTinyMCEActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('tinymce-plugin')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking TinyMCE plugin status:', error)\n return false\n }\n}\n","/**\n * Quill Rich Text Editor Plugin\n *\n * Provides Quill editor integration for rich text editing in SonicJS\n * https://quilljs.com/\n */\n\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\n/**\n * Quill Editor Configuration Options\n */\nexport interface QuillOptions {\n theme?: 'snow' | 'bubble'\n placeholder?: string\n height?: number\n toolbar?: 'full' | 'simple' | 'minimal' | string[][]\n modules?: Record\n formats?: string[]\n}\n\n/**\n * Default Quill toolbar configurations\n */\nconst QUILL_TOOLBARS = {\n full: [\n [{ 'header': [1, 2, 3, 4, 5, 6, false] }],\n ['bold', 'italic', 'underline', 'strike'],\n [{ 'color': [] }, { 'background': [] }],\n [{ 'align': [] }],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n [{ 'indent': '-1'}, { 'indent': '+1' }],\n ['blockquote', 'code-block'],\n ['link', 'image', 'video'],\n ['clean']\n ],\n simple: [\n ['bold', 'italic', 'underline'],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n ['link']\n ],\n minimal: [\n ['bold', 'italic'],\n ['link']\n ]\n}\n\n/**\n * Render a Quill editor field\n * @param fieldId - The field ID\n * @param fieldName - The field name\n * @param value - The current value\n * @param options - Quill configuration options\n * @returns HTML string for the Quill editor field\n */\nexport function renderQuillField(\n fieldId: string,\n fieldName: string,\n value: string = '',\n options: QuillOptions = {}\n): string {\n const {\n theme = 'snow',\n placeholder = 'Enter content...',\n height = 300,\n toolbar = 'full'\n } = options\n\n // Escape HTML for hidden input\n const escapeHtml = (str: string) => {\n return str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n }\n\n return `\n
\n \n ${value}
\n\n \n \n \n `\n}\n\n/**\n * Generate Quill initialization script\n * @returns HTML script tag with Quill initialization code\n */\nexport function getQuillInitScript(): string {\n return `\n \n `\n}\n\n/**\n * Generate Quill CDN links\n * @param version - Quill version (default: 2.0.2)\n * @returns HTML script and link tags for Quill CDN\n */\nexport function getQuillCDN(version: string = '2.0.2'): string {\n return `\n \n \n \n\n \n \n\n \n \n `\n}\n\n/**\n * Create the Quill Editor Plugin\n */\nexport function createQuillEditorPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'quill-editor',\n version: '1.0.0',\n description: 'Quill rich text editor integration for SonicJS'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Quill Editor plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Quill Editor plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const quillEditorPlugin = createQuillEditorPlugin()\n","import { getMDXEditorInitScript, getMDXEditorScripts } from '../../plugins/available/easy-mdx'\nimport { getTinyMCEInitScript, getTinyMCEScript } from '../../plugins/available/tinymce-plugin'\nimport { getQuillCDN, getQuillInitScript } from '../../plugins/core-plugins/quill-editor'\nimport { renderAlert } from '../alert.template'\nimport { FieldDefinition, renderDynamicField, renderFieldGroup } from '../components/dynamic-field.template'\nimport { getConfirmationDialogScript, renderConfirmationDialog } from '../confirmation-dialog.template'\nimport { AdminLayoutCatalystData, renderAdminLayoutCatalyst } from '../layouts/admin-layout-catalyst.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n schema: any\n}\n\nexport interface ContentFormData {\n id?: string\n title?: string\n slug?: string\n created_at?: number\n updated_at?: number\n published_at?: number\n data?: any\n status?: string\n scheduled_publish_at?: number\n scheduled_unpublish_at?: number\n review_status?: string\n meta_title?: string\n meta_description?: string\n collection: Collection\n fields: FieldDefinition[]\n isEdit?: boolean\n error?: string\n success?: string\n validationErrors?: Record\n workflowEnabled?: boolean // New flag to indicate if workflow plugin is active\n tinymceEnabled?: boolean // Flag to indicate if TinyMCE plugin is active\n tinymceSettings?: {\n apiKey?: string\n defaultHeight?: number\n defaultToolbar?: string\n skin?: string\n }\n quillEnabled?: boolean // Flag to indicate if Quill plugin is active\n quillSettings?: {\n version?: string\n defaultHeight?: number\n defaultToolbar?: string\n theme?: string\n }\n mdxeditorEnabled?: boolean // Flag to indicate if MDXEditor plugin is active\n mdxeditorSettings?: {\n defaultHeight?: number\n theme?: string\n toolbar?: string\n placeholder?: string\n }\n referrerParams?: string // URL parameters to preserve filters when returning to list\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentFormPage(data: ContentFormData): string {\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? `Edit: ${data.title || 'Content'}` : `New ${data.collection.display_name}`\n const hasValidationErrors = Boolean(data.validationErrors && Object.keys(data.validationErrors).length > 0)\n\n // Construct back URL with preserved filters\n const backUrl = data.referrerParams\n ? `/admin/content?${data.referrerParams}`\n : `/admin/content?collection=${data.collection.id}`\n\n // Group fields by category\n const coreFields = data.fields.filter(f => ['title', 'slug', 'content'].includes(f.field_name))\n const contentFields = data.fields.filter(f => !['title', 'slug', 'content'].includes(f.field_name) && !f.field_name.startsWith('meta_'))\n const metaFields = data.fields.filter(f => f.field_name.startsWith('meta_'))\n\n // Helper function to get field value - title and slug are stored as columns, others in data JSON\n const getFieldValue = (fieldName: string) => {\n if (fieldName === 'title') return data.title || data.data?.[fieldName] || ''\n if (fieldName === 'slug') return data.slug || data.data?.[fieldName] || ''\n return data.data?.[fieldName] || ''\n }\n\n // Prepare plugin statuses for field rendering\n const pluginStatuses = {\n quillEnabled: data.quillEnabled || false,\n mdxeditorEnabled: data.mdxeditorEnabled || false,\n tinymceEnabled: data.tinymceEnabled || false\n }\n\n // Render field groups\n const coreFieldsHTML = coreFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id // Pass content ID when editing\n }))\n\n const contentFieldsHTML = contentFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const metaFieldsHTML = metaFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const pageContent = `\n
\n \n
\n
\n

${isEdit ? 'Edit Content' : 'New Content'}

\n

\n ${data.collection.description || `Manage ${data.collection.display_name.toLowerCase()} content`}\n

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

${data.collection.display_name}

\n

${isEdit ? 'Update your content' : 'Create new content'}

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n
\n \n
\n \n \n ${isEdit ? `` : ''}\n ${data.referrerParams ? `` : ''}\n \n \n ${renderFieldGroup('Basic Information', coreFieldsHTML)}\n \n \n ${contentFields.length > 0 ? renderFieldGroup('Content Details', contentFieldsHTML) : ''}\n \n \n ${metaFields.length > 0 ? renderFieldGroup('SEO & Metadata', metaFieldsHTML, true) : ''}\n \n
\n \n
\n\n \n
\n \n
\n

Publishing

\n\n ${data.workflowEnabled ? `\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n \n

Leave empty to publish immediately

\n
\n\n \n
\n \n \n

Automatically unpublish at this time

\n
\n ` : `\n \n
\n \n
\n \n \n \n \n \n \n \n
\n

Enable Workflow plugin for advanced status management

\n
\n `}\n
\n\n \n ${isEdit ? `\n
\n

Content Info

\n\n
\n
\n
Created
\n
${data.created_at ? new Date(data.created_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Last Modified
\n
${data.updated_at ? new Date(data.updated_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Author
\n
${data.data?.author || 'Unknown'}
\n
\n ${data.published_at ? `\n
\n
Published
\n
${new Date(data.published_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n\n
\n \n \n \n \n View Version History\n \n
\n
\n ` : ''}\n\n \n
\n

Quick Actions

\n\n
\n \n \n \n \n \n Preview Content\n \n\n \n \n \n \n Duplicate Content\n \n\n ${isEdit ? `\n \n \n \n \n Delete Content\n \n ` : ''}\n
\n
\n
\n\n \n
\n \n \n \n \n Cancel\n \n\n
\n \n \n \n \n ${isEdit ? 'Update' : 'Save'}\n \n\n ${data.user?.role !== 'viewer' ? `\n \n \n \n \n ${isEdit ? 'Update' : 'Save'} & Publish\n \n ` : ''}\n
\n
\n
\n
\n
\n\n \n ${renderConfirmationDialog({\n id: 'duplicate-content-confirm',\n title: 'Duplicate Content',\n message: 'Create a copy of this content?',\n confirmText: 'Duplicate',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performDuplicateContent()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-content-confirm',\n title: 'Delete Content',\n message: 'Are you sure you want to delete this content? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: `performDeleteContent('${data.id}')`\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-repeater-item-confirm',\n title: 'Delete Item',\n message: 'Are you sure you want to delete this item? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-block-confirm',\n title: 'Delete Block',\n message: 'Are you sure you want to delete this block? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${getConfirmationDialogScript()}\n\n ${data.tinymceEnabled ? getTinyMCEScript(data.tinymceSettings?.apiKey) : ''}\n\n ${data.quillEnabled ? getQuillCDN(data.quillSettings?.version) : ''}\n\n ${data.quillEnabled ? getQuillInitScript() : ''}\n\n ${data.mdxeditorEnabled ? getMDXEditorScripts() : ''}\n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n content: pageContent,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderTable, TableData, TableColumn } from '../table.template'\nimport type { FilterBarData } from '../filter-bar.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../confirmation-dialog.template'\n\nexport interface ContentItem {\n id: string\n title: string\n slug: string\n modelName: string\n statusBadge: string\n authorName: string\n formattedDate: string\n availableActions: string[]\n}\n\nexport interface ContentListPageData {\n modelName: string\n status: string\n page: number\n search?: string\n models: Array<{\n name: string\n displayName: string\n }>\n contentItems: ContentItem[]\n totalItems: number\n itemsPerPage: number\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentListPage(data: ContentListPageData): string {\n // Build current URL parameters to pass to edit page\n const urlParams = new URLSearchParams()\n if (data.modelName && data.modelName !== 'all') urlParams.set('model', data.modelName)\n if (data.status && data.status !== 'all') urlParams.set('status', data.status)\n if (data.search) urlParams.set('search', data.search)\n if (data.page && data.page !== 1) urlParams.set('page', data.page.toString())\n const currentParams = urlParams.toString()\n\n // Check if filters are active (not in default state)\n const hasActiveFilters = data.modelName !== 'all' || data.status !== 'all' || !!data.search\n\n // Prepare filter bar data\n const filterBarData: FilterBarData = {\n filters: [\n {\n name: 'model',\n label: 'Model',\n options: [\n { value: 'all', label: 'All Models', selected: data.modelName === 'all' },\n ...data.models.map(model => ({\n value: model.name,\n label: model.displayName,\n selected: data.modelName === model.name\n }))\n ]\n },\n {\n name: 'status',\n label: 'Status',\n options: [\n { value: 'all', label: 'All Status', selected: data.status === 'all' },\n { value: 'draft', label: 'Draft', selected: data.status === 'draft' },\n { value: 'review', label: 'Under Review', selected: data.status === 'review' },\n { value: 'scheduled', label: 'Scheduled', selected: data.status === 'scheduled' },\n { value: 'published', label: 'Published', selected: data.status === 'published' },\n { value: 'archived', label: 'Archived', selected: data.status === 'archived' },\n { value: 'deleted', label: 'Deleted', selected: data.status === 'deleted' }\n ]\n }\n ],\n actions: [\n {\n label: 'Advanced Search',\n className: 'btn-primary',\n onclick: 'openAdvancedSearch()'\n },\n {\n label: 'Refresh',\n className: 'btn-secondary',\n onclick: 'location.reload()'\n }\n ],\n bulkActions: [\n { label: 'Publish', value: 'publish', icon: 'check-circle' },\n { label: 'Unpublish', value: 'unpublish', icon: 'x-circle' },\n { label: 'Delete', value: 'delete', icon: 'trash', className: 'text-pink-600' }\n ]\n }\n\n // Prepare table data\n const tableColumns: TableColumn[] = [\n {\n key: 'title',\n label: 'Title',\n sortable: true,\n sortType: 'string',\n render: (value, row) => `\n
\n
\n \n
${row.slug}
\n
\n
\n `\n },\n {\n key: 'modelName',\n label: 'Model',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'statusBadge',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (value) => value\n },\n {\n key: 'authorName',\n label: 'Author',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'formattedDate',\n label: 'Updated',\n sortable: true,\n sortType: 'date',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n className: 'text-sm font-medium',\n render: (value, row) => `\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'content-table',\n columns: tableColumns,\n rows: data.contentItems,\n selectable: true,\n rowClickable: true,\n rowClickUrl: (row: ContentItem) => `/admin/content/${row.id}/edit${currentParams ? `?ref=${encodeURIComponent(currentParams)}` : ''}`,\n emptyMessage: 'No content found. Create your first content item to get started.'\n }\n\n // Prepare pagination data\n const totalPages = Math.ceil(data.totalItems / data.itemsPerPage)\n const startItem = (data.page - 1) * data.itemsPerPage + 1\n const endItem = Math.min(data.page * data.itemsPerPage, data.totalItems)\n\n const paginationData: PaginationData = {\n currentPage: data.page,\n totalPages,\n totalItems: data.totalItems,\n itemsPerPage: data.itemsPerPage,\n startItem,\n endItem,\n baseUrl: '/admin/content',\n queryParams: {\n model: data.modelName,\n status: data.status,\n ...(data.search ? { search: data.search } : {})\n },\n showPageSizeSelector: true,\n pageSizeOptions: [10, 20, 50, 100]\n }\n\n // Generate page content\n const pageContent = `\n
\n \n
\n
\n

Content Management

\n

Manage and organize your content items

\n
\n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n \n
\n \n
\n \n \n ${data.models.map(model => `\n \n `).join('')}\n \n \n \n \n
\n
\n\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n
\n ${data.totalItems} ${data.totalItems === 1 ? 'item' : 'items'}\n ${filterBarData.actions?.map(action => `\n \n ${action.label === 'Refresh' ? `\n \n \n \n ` : ''}\n ${action.label}\n \n `).join('') || ''}\n ${filterBarData.bulkActions && filterBarData.bulkActions.length > 0 ? `\n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n \n Move to Draft\n \n
\n
\n \n \n \n \n Delete Selected\n \n
\n
\n
\n ` : ''}\n
\n
\n
\n
\n
\n \n \n
\n ${renderTable(tableData)}\n ${renderPagination(paginationData)}\n
\n \n
\n \n \n
\n
\n \n \n\n \n ${renderConfirmationDialog({\n id: 'bulk-action-confirm',\n title: 'Confirm Bulk Action',\n message: 'Are you sure you want to perform this action? This operation will affect multiple items.',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n iconColor: 'blue',\n onConfirm: 'executeBulkAction()'\n })}\n\n \n ${getConfirmationDialogScript()}\n\n \n
\n
\n \n
\n\n \n
\n
\n \n
\n

\n 🔍 Advanced Search\n

\n \n
\n\n \n
\n \n
\n \n
\n \n
\n
\n
\n\n \n
\n \n
\n \n \n
\n
\n\n \n
\n

Filters

\n \n
\n \n
\n \n \n \n ${data.models.map(\n (model) => `\n \n `\n ).join('')}\n \n

Hold Ctrl/Cmd to select multiple

\n
\n\n \n
\n \n \n \n \n \n \n \n \n
\n
\n
\n\n \n
\n \n Cancel\n \n \n Search\n \n
\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n // Prepare layout data\n const layoutData: AdminLayoutCatalystData = {\n title: 'Content Management',\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export function resolveSchemaFieldType(fieldConfig: Record): string {\n if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n return 'slug'\n }\n\n if (fieldConfig.type && fieldConfig.type !== 'string') {\n return fieldConfig.type\n }\n\n if (fieldConfig.format === 'richtext') {\n return 'richtext'\n }\n\n if (fieldConfig.format === 'media') {\n return 'media'\n }\n\n if (fieldConfig.format === 'date-time') {\n return 'date'\n }\n\n if (Array.isArray(fieldConfig.enum)) {\n return 'select'\n }\n\n return fieldConfig.type || 'string'\n}\n\nexport function buildSchemaFieldOptions(fieldConfig: Record): Record {\n const fieldOptions = { ...fieldConfig }\n const resolvedFieldType = resolveSchemaFieldType(fieldConfig)\n\n if (resolvedFieldType === 'select' && Array.isArray(fieldConfig.enum)) {\n fieldOptions.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return fieldOptions\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { Bindings, Variables } from '../app'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { CACHE_CONFIGS, getCacheService } from '../services/cache'\nimport { PluginService } from '../services/plugin-service'\nimport { ContentVersion, renderVersionHistory, VersionHistoryData } from '../templates/components/version-history.template'\nimport { ContentFormData, renderContentFormPage } from '../templates/pages/admin-content-form.template'\nimport { ContentListPageData, renderContentListPage } from '../templates/pages/admin-content-list.template'\nimport { getBlocksFieldConfig, parseBlocksValue } from '../utils/blocks'\nimport { escapeHtml, sanitizeRichText } from '../utils/sanitize'\nimport { buildSchemaFieldOptions, resolveSchemaFieldType } from './admin-content-field-types'\n\nconst adminContentRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Field definition type for form processing\ninterface FieldDefinition {\n field_name: string\n field_label: string\n field_type: string\n field_options?: any\n is_required?: boolean\n}\n\n// Result of parsing a single field value\ninterface ParsedFieldResult {\n value: any\n errors: string[]\n}\n\n/**\n * Parse a single field value from form data with validation\n * Centralizes field parsing logic used in POST, PUT, and preview handlers\n */\nfunction parseFieldValue(\n field: FieldDefinition,\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): ParsedFieldResult {\n const { skipValidation = false } = options\n const value = formData.get(field.field_name)\n const errors: string[] = []\n\n // Handle blocks fields (array with blocks config)\n const blocksConfig = getBlocksFieldConfig(field.field_options)\n if (blocksConfig) {\n const parsed = parseBlocksValue(value, blocksConfig)\n if (!skipValidation && field.is_required && parsed.value.length === 0) {\n parsed.errors.push(`${field.field_label} is required`)\n }\n return { value: parsed.value, errors: parsed.errors }\n }\n\n // Required field validation\n if (!skipValidation && field.is_required && (!value || value.toString().trim() === '')) {\n return { value: null, errors: [`${field.field_label} is required`] }\n }\n\n // Type-specific parsing\n switch (field.field_type) {\n case 'number':\n if (value && isNaN(Number(value))) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a valid number`)\n }\n return { value: null, errors }\n }\n return { value: value ? Number(value) : null, errors: [] }\n\n case 'boolean':\n // Check for the hidden _submitted field to determine if checkbox was rendered\n const submitted = formData.get(`${field.field_name}_submitted`)\n return { value: submitted ? value === 'true' : false, errors: [] }\n\n case 'select':\n if (field.field_options?.multiple) {\n return { value: formData.getAll(`${field.field_name}[]`), errors: [] }\n }\n return { value: value, errors: [] }\n\n case 'array': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: [], errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON array`)\n }\n return { value: [], errors }\n }\n if (!skipValidation && field.is_required && parsed.length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: [], errors }\n }\n }\n\n case 'object': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: {}, errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON object`)\n }\n return { value: {}, errors }\n }\n if (!skipValidation && field.is_required && Object.keys(parsed).length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: {}, errors }\n }\n }\n\n case 'json': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: null, errors }\n }\n try {\n return { value: JSON.parse(value.toString()), errors: [] }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: null, errors }\n }\n }\n\n default:\n return { value: value, errors: [] }\n }\n}\n\n/**\n * Extract all field values from form data\n */\nfunction extractFieldData(\n fields: FieldDefinition[],\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): { data: Record; errors: Record } {\n const data: Record = {}\n const errors: Record = {}\n\n for (const field of fields) {\n const result = parseFieldValue(field, formData, options)\n data[field.field_name] = result.value\n if (result.errors.length > 0) {\n errors[field.field_name] = result.errors\n }\n }\n\n return { data, errors }\n}\n\n// Apply authentication middleware\nadminContentRoutes.use('*', requireAuth())\n\n// Get collection fields\nasync function getCollectionFields(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('fields', collectionId),\n async () => {\n // First, check if collection has a schema (code-based collection)\n const collectionStmt = db.prepare('SELECT schema FROM collections WHERE id = ?')\n const collectionRow = await collectionStmt.bind(collectionId).first() as any\n\n if (collectionRow && collectionRow.schema) {\n try {\n const schema = typeof collectionRow.schema === 'string' ? JSON.parse(collectionRow.schema) : collectionRow.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n return Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n const fieldOptions = buildSchemaFieldOptions(fieldConfig)\n\n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: resolveSchemaFieldType(fieldConfig),\n field_label: fieldConfig.title || fieldName,\n field_options: fieldOptions,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table for legacy collections\n const stmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results } = await stmt.bind(collectionId).all()\n\n return (results || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }))\n }\n )\n}\n\n// Get collection by ID\nasync function getCollection(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('collection', collectionId),\n async () => {\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ? AND is_active = 1')\n const collection = await stmt.bind(collectionId).first() as any\n\n if (!collection) return null\n\n return {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n schema: collection.schema ? JSON.parse(collection.schema) : {}\n }\n }\n )\n}\n\n// Content list (main page)\nadminContentRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const db = c.env.DB\n\n // Get query parameters\n const page = parseInt(url.searchParams.get('page') || '1')\n const limit = parseInt(url.searchParams.get('limit') || '20')\n const modelName = url.searchParams.get('model') || 'all'\n const status = url.searchParams.get('status') || 'all'\n const search = url.searchParams.get('search') || ''\n const offset = (page - 1) * limit\n\n // Get all collections for filter dropdown (exclude form-sourced)\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results: collectionsResults } = await collectionsStmt.all()\n const models = (collectionsResults || []).map((row: any) => ({\n name: row.name,\n displayName: row.display_name\n }))\n\n // Build where conditions\n const conditions: string[] = []\n const params: any[] = []\n\n // Hide content from form-sourced collections in the regular content list\n conditions.push(\"(col.source_type IS NULL OR col.source_type = 'user')\")\n\n // Always filter out deleted content unless specifically requested\n if (status !== 'deleted') {\n conditions.push(\"c.status != 'deleted'\")\n }\n\n if (search) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n params.push(`%${search}%`, `%${search}%`, `%${search}%`)\n }\n\n if (modelName !== 'all') {\n conditions.push('col.name = ?')\n params.push(modelName)\n }\n\n if (status !== 'all' && status !== 'deleted') {\n conditions.push('c.status = ?')\n params.push(status)\n } else if (status === 'deleted') {\n conditions.push(\"c.status = 'deleted'\")\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n JOIN collections col ON c.collection_id = col.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalItems = countResult?.count || 0\n\n // Get content items\n const contentStmt = db.prepare(`\n SELECT c.id, c.title, c.slug, c.status, c.created_at, c.updated_at,\n col.name as collection_name, col.display_name as collection_display_name,\n u.first_name, u.last_name, u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n const { results } = await contentStmt.bind(...params, limit, offset).all()\n\n // Process content items\n const contentItems = (results || []).map((row: any) => {\n const statusConfig: Record = {\n draft: {\n class: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-1 ring-inset ring-zinc-600/20 dark:ring-zinc-500/20',\n text: 'Draft'\n },\n review: {\n class: 'bg-amber-50 dark:bg-amber-500/10 text-amber-700 dark:text-amber-400 ring-1 ring-inset ring-amber-600/20 dark:ring-amber-500/20',\n text: 'Under Review'\n },\n scheduled: {\n class: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-600/20 dark:ring-blue-500/20',\n text: 'Scheduled'\n },\n published: {\n class: 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-400 ring-1 ring-inset ring-green-600/20 dark:ring-green-500/20',\n text: 'Published'\n },\n archived: {\n class: 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-400 ring-1 ring-inset ring-purple-600/20 dark:ring-purple-500/20',\n text: 'Archived'\n },\n deleted: {\n class: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-600/20 dark:ring-red-500/20',\n text: 'Deleted'\n }\n }\n\n const config = statusConfig[row.status as keyof typeof statusConfig] || statusConfig.draft\n const statusBadge = `\n \n ${config?.text || row.status}\n \n `\n\n const authorName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.author_email || 'Unknown'\n\n const formattedDate = new Date(row.updated_at).toLocaleDateString()\n\n // Determine available workflow actions based on status\n const availableActions: string[] = []\n switch (row.status) {\n case 'draft':\n availableActions.push('submit_for_review', 'publish')\n break\n case 'review':\n availableActions.push('approve', 'request_changes')\n break\n case 'published':\n availableActions.push('unpublish', 'archive')\n break\n case 'scheduled':\n availableActions.push('unschedule')\n break\n }\n\n return {\n id: row.id,\n title: row.title,\n slug: row.slug,\n modelName: row.collection_display_name,\n statusBadge,\n authorName,\n formattedDate,\n availableActions\n }\n })\n\n const pageData: ContentListPageData = {\n modelName,\n status,\n page,\n search,\n models,\n contentItems,\n totalItems,\n itemsPerPage: limit,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentListPage(pageData))\n } catch (error) {\n console.error('Error fetching content list:', error)\n return c.html(`

Error loading content: ${error}

`)\n }\n})\n\n// New content form\nadminContentRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const collectionId = url.searchParams.get('collection')\n\n if (!collectionId) {\n // Show collection selection page\n const db = c.env.DB\n // Exclude form-sourced collections — users shouldn't manually create content in form collections\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name, description FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results } = await collectionsStmt.all()\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description\n }))\n\n // Render collection selection page\n const selectionHTML = `\n \n \n \n Select Collection - SonicJS AI Admin\n \n \n \n
\n
\n

Create New Content

\n

Select a collection to create content in:

\n \n
\n ${collections.map(collection => `\n \n

${collection.display_name}

\n

${collection.description || 'No description'}

\n
\n `).join('')}\n
\n \n \n
\n
\n \n \n `\n\n return c.html(selectionHTML)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n console.log('[Content Form /new] Editor plugins status:', {\n tinymce: tinymceEnabled,\n quill: quillEnabled,\n mdxeditor: mdxeditorEnabled,\n mdxeditorSettings\n })\n\n const formData: ContentFormData = {\n collection,\n fields,\n isEdit: false,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading new content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content form.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Edit content form\nadminContentRoutes.get('/:id/edit', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n\n // Capture referrer parameters to preserve filters when returning to list\n const referrerParams = url.searchParams.get('ref') || ''\n\n // Get content with caching\n const cache = getCacheService(CACHE_CONFIGS.content!)\n const content = await cache.getOrSet(\n cache.generateKey('content', id),\n async () => {\n const contentStmt = db.prepare(`\n SELECT c.*, col.id as collection_id, col.name as collection_name,\n col.display_name as collection_display_name, col.description as collection_description,\n col.schema as collection_schema\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n return await contentStmt.bind(id).first() as any\n }\n )\n\n if (!content) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Content not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const collection = {\n id: content.collection_id,\n name: content.collection_name,\n display_name: content.collection_display_name,\n description: content.collection_description,\n schema: content.collection_schema ? JSON.parse(content.collection_schema) : {}\n }\n\n const fields = await getCollectionFields(db, content.collection_id)\n const contentData = content.data ? JSON.parse(content.data) : {}\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n const formData: ContentFormData = {\n id: content.id,\n title: content.title,\n slug: content.slug,\n created_at: content.created_at,\n updated_at: content.updated_at,\n published_at: content.published_at,\n data: contentData,\n status: content.status,\n scheduled_publish_at: content.scheduled_publish_at,\n scheduled_unpublish_at: content.scheduled_unpublish_at,\n review_status: content.review_status,\n meta_title: content.meta_title,\n meta_description: content.meta_description,\n collection,\n fields,\n isEdit: true,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n referrerParams,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading edit content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content for editing.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Create content\nadminContentRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n const action = formData.get('action') as string\n\n if (!collectionId) {\n return c.html(html`\n
\n Collection ID is required.\n
\n `)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n // Check for validation errors\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Generate slug if not provided\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || 'draft'\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Create content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n // Invalidate collection content list cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n\n // Create initial version\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n contentId,\n 1,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n contentId,\n 'created',\n 'none',\n status,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${contentId}/edit?success=Content saved successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content created successfully!`\n : `/admin/content?collection=${collectionId}&success=Content created successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error creating content:', error)\n return c.html(html`\n
\n Failed to create content. Please try again.\n
\n `)\n }\n})\n\n// Update content\nadminContentRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const formData = await c.req.formData()\n const action = formData.get('action') as string\n\n const db = c.env.DB\n\n // Get existing content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existingContent = await contentStmt.bind(id).first() as any\n\n if (!existingContent) {\n return c.html(html`\n
\n Content not found.\n
\n `)\n }\n\n const collection = await getCollection(db, existingContent.collection_id)\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, existingContent.collection_id)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n id,\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Update slug if title changed\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || existingContent.status\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Update content\n const now = Date.now()\n\n const updateStmt = db.prepare(`\n UPDATE content SET\n slug = ?, title = ?, data = ?, status = ?,\n scheduled_publish_at = ?, scheduled_unpublish_at = ?,\n meta_title = ?, meta_description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n scheduledPublishAt ? new Date(scheduledPublishAt).getTime() : null,\n scheduledUnpublishAt ? new Date(scheduledUnpublishAt).getTime() : null,\n data.meta_title || null,\n data.meta_description || null,\n now,\n id\n ).run()\n\n // Invalidate content cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existingContent.collection_id}:*`)\n\n // Create new version if content changed\n const existingData = JSON.parse(existingContent.data || '{}')\n if (JSON.stringify(existingData) !== JSON.stringify(data)) {\n // Get next version number\n const versionCountStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const versionResult = await versionCountStmt.bind(id).first() as any\n const nextVersion = (versionResult?.max_version || 0) + 1\n\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Log workflow action if status changed\n if (status !== existingContent.status) {\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'status_changed',\n existingContent.status,\n status,\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${id}/edit?success=Content updated successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content updated successfully!`\n : `/admin/content?collection=${existingContent.collection_id}&success=Content updated successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error updating content:', error)\n return c.html(html`\n
\n Failed to update content. Please try again.\n
\n `)\n }\n})\n\n// Content preview\nadminContentRoutes.post('/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html('

Collection not found

')\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract field data for preview (skip validation)\n const { data } = extractFieldData(fields, formData, { skipValidation: true })\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeStatus = escapeHtml(String(formData.get('status') || 'draft'))\n const safeMetaDesc = data.meta_description ? escapeHtml(data.meta_description) : ''\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Preview: ${safeTitle}\n \n \n \n

${safeTitle}

\n
\n Collection: ${escapeHtml(collection.display_name)}
\n Status: ${safeStatus}
\n ${safeMetaDesc ? `Description: ${safeMetaDesc}
` : ''}\n
\n
\n ${safeContent}\n
\n\n

All Fields:

\n \n \n ${fields.map(field => `\n \n \n \n \n `).join('')}\n
FieldValue
${escapeHtml(field.field_label)}${data[field.field_name] ? escapeHtml(String(data[field.field_name])) : 'empty'}
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating preview:', error)\n return c.html('

Error generating preview

')\n }\n})\n\n// Duplicate content\nadminContentRoutes.post('/duplicate', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const originalId = formData.get('id') as string\n\n if (!originalId) {\n return c.json({ success: false, error: 'Content ID required' })\n }\n\n const db = c.env.DB\n\n // Get original content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const original = await contentStmt.bind(originalId).first() as any\n\n if (!original) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n // Create duplicate\n const newId = crypto.randomUUID()\n const now = Date.now()\n const originalData = JSON.parse(original.data || '{}')\n\n // Modify title to indicate it's a copy\n originalData.title = `${originalData.title || 'Untitled'} (Copy)`\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n newId,\n original.collection_id,\n `${original.slug}-copy-${Date.now()}`,\n originalData.title,\n JSON.stringify(originalData),\n 'draft', // Always start as draft\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n return c.json({ success: true, id: newId })\n } catch (error) {\n console.error('Error duplicating content:', error)\n return c.json({ success: false, error: 'Failed to duplicate content' })\n }\n})\n\n// Get bulk actions modal\nadminContentRoutes.get('/bulk-actions', async (c) => {\n const bulkActionsModal = `\n
\n
\n
\n

Bulk Actions

\n \n
\n

\n Select items from the table below to perform bulk actions.\n

\n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n Move to Draft\n \n \n \n \n \n Delete Selected\n \n
\n
\n
\n \n `\n\n return c.html(bulkActionsModal)\n})\n\n// Perform bulk action\nadminContentRoutes.post('/bulk-action', async (c) => {\n try {\n const user = c.get('user')\n const body = await c.req.json()\n const { action, ids } = body\n\n if (!action || !ids || ids.length === 0) {\n return c.json({ success: false, error: 'Action and IDs required' })\n }\n\n const db = c.env.DB\n const now = Date.now()\n\n if (action === 'delete') {\n // Soft delete by setting status to 'deleted'\n const placeholders = ids.map(() => '?').join(',')\n const stmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(now, ...ids).run()\n } else if (action === 'publish' || action === 'draft') {\n // Update status\n const placeholders = ids.map(() => '?').join(',')\n const publishedAt = action === 'publish' ? now : null\n const stmt = db.prepare(`\n UPDATE content\n SET status = ?, published_at = ?, updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(action, publishedAt, now, ...ids).run()\n } else {\n return c.json({ success: false, error: 'Invalid action' })\n }\n\n // Invalidate cache for all affected content items\n const cache = getCacheService(CACHE_CONFIGS.content!)\n for (const contentId of ids) {\n await cache.delete(cache.generateKey('content', contentId))\n }\n // Also invalidate list caches (they contain content from potentially multiple collections)\n await cache.invalidate('content:list:*')\n\n return c.json({ success: true, count: ids.length })\n } catch (error) {\n console.error('Bulk action error:', error)\n return c.json({ success: false, error: 'Failed to perform bulk action' })\n }\n})\n\n// Delete content\nadminContentRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const user = c.get('user')\n\n // Check if content exists\n const contentStmt = db.prepare('SELECT id, title FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.json({ success: false, error: 'Content not found' }, 404)\n }\n\n // Soft delete by setting status to 'deleted'\n const now = Date.now()\n const deleteStmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id = ?\n `)\n await deleteStmt.bind(now, id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate('content:list:*')\n\n // Return success - let HTMX reload the page\n return c.html(`\n
\n
\n
\n \n \n \n

Content deleted successfully. Refreshing...

\n
\n
\n
\n `)\n } catch (error) {\n console.error('Delete content error:', error)\n return c.json({ success: false, error: 'Failed to delete content' }, 500)\n }\n})\n\n// Get version history\nadminContentRoutes.get('/:id/versions', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.html('

Content not found

')\n }\n\n // Get all versions with author info\n const versionsStmt = db.prepare(`\n SELECT cv.*, u.first_name, u.last_name, u.email\n FROM content_versions cv\n LEFT JOIN users u ON cv.author_id = u.id\n WHERE cv.content_id = ?\n ORDER BY cv.version DESC\n `)\n const { results } = await versionsStmt.bind(id).all()\n\n const versions: ContentVersion[] = (results || []).map((row: any) => ({\n id: row.id,\n version: row.version,\n data: JSON.parse(row.data || '{}'),\n author_id: row.author_id,\n author_name: row.first_name && row.last_name ? `${row.first_name} ${row.last_name}` : row.email,\n created_at: row.created_at,\n is_current: false // Will be set below\n }))\n\n // Mark the latest version as current\n if (versions.length > 0) {\n versions[0]!.is_current = true\n }\n\n const data: VersionHistoryData = {\n contentId: id,\n versions,\n currentVersion: versions.length > 0 ? versions[0]!.version : 1\n }\n\n return c.html(renderVersionHistory(data))\n } catch (error) {\n console.error('Error loading version history:', error)\n return c.html('

Error loading version history

')\n }\n})\n\n// Restore version\nadminContentRoutes.post('/:id/restore/:version', async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const user = c.get('user')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT * FROM content_versions \n WHERE content_id = ? AND version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.json({ success: false, error: 'Version not found' })\n }\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const currentContent = await contentStmt.bind(id).first() as any\n\n if (!currentContent) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n const restoredData = JSON.parse(versionData.data)\n const now = Date.now()\n\n // Update content with restored data\n const updateStmt = db.prepare(`\n UPDATE content SET\n title = ?, data = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n restoredData.title || 'Untitled',\n versionData.data,\n now,\n id\n ).run()\n\n // Create new version for the restoration\n const nextVersionStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const nextVersionResult = await nextVersionStmt.bind(id).first() as any\n const nextVersion = (nextVersionResult?.max_version || 0) + 1\n\n const newVersionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await newVersionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n versionData.data,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, comment, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'version_restored',\n currentContent.status,\n currentContent.status,\n user?.userId || 'unknown',\n `Restored to version ${version}`,\n now\n ).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error restoring version:', error)\n return c.json({ success: false, error: 'Failed to restore version' })\n }\n})\n\n// Preview specific version\nadminContentRoutes.get('/:id/version/:version/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT cv.*, c.collection_id, col.display_name as collection_name\n FROM content_versions cv\n JOIN content c ON cv.content_id = c.id\n JOIN collections col ON c.collection_id = col.id\n WHERE cv.content_id = ? AND cv.version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.html('

Version not found

')\n }\n\n const data = JSON.parse(versionData.data || '{}')\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n const safeExcerpt = data.excerpt ? escapeHtml(data.excerpt) : ''\n const safeCollectionName = escapeHtml(versionData.collection_name || '')\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Version ${version} Preview: ${safeTitle}\n \n \n \n
\n Version ${version}\n Collection: ${safeCollectionName}
\n Created: ${new Date(versionData.created_at).toLocaleString()}
\n This is a historical version preview\n
\n\n

${safeTitle}

\n\n
\n ${safeContent}\n
\n\n ${safeExcerpt ? `

Excerpt:

${safeExcerpt}

` : ''}\n\n

All Field Data:

\n
\n${escapeHtml(JSON.stringify(data, null, 2))}\n        
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating version preview:', error)\n return c.html('

Error generating preview

')\n }\n})\nexport default adminContentRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserProfile {\n id: string\n email: string\n username: string\n first_name: string\n last_name: string\n phone?: string\n bio?: string\n avatar_url?: string\n timezone: string\n language: string\n theme: string\n email_notifications: boolean\n two_factor_enabled: boolean\n role: string\n created_at: number\n last_login_at?: number\n}\n\nexport interface ProfilePageData {\n profile: UserProfile\n timezones: Array<{ value: string; label: string }>\n languages: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderAvatarImage(avatarUrl: string | undefined, firstName: string, lastName: string): string {\n return `
\n ${avatarUrl\n ? `\"Profile`\n : `${firstName.charAt(0)}${lastName.charAt(0)}`\n }\n
`\n}\n\nexport function renderProfilePage(data: ProfilePageData): string {\n const pageContent = `\n
\n \n
\n
\n

User Profile

\n

\n Manage your account settings and preferences\n

\n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n \n
\n
\n \n
\n
\n
\n \n \n \n
\n
\n

Profile Information

\n

Update your account details

\n
\n
\n
\n\n \n
\n
\n\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n ${data.profile.bio || ''}\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Preferences

\n\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Notifications

\n\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n \n

Receive email updates about new features and product announcements.

\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Update Profile\n \n
\n
\n
\n
\n\n \n
\n \n
\n

Profile Picture

\n\n
\n ${renderAvatarImage(data.profile.avatar_url, data.profile.first_name, data.profile.last_name)}\n\n
\n \n \n \n \n \n \n Change Picture\n \n \n\n
\n
\n
\n\n \n
\n

Account Information

\n\n
\n
\n
Role
\n
\n \n ${data.profile.role}\n \n
\n
\n
\n
Member Since
\n
${new Date(data.profile.created_at).toLocaleDateString()}
\n
\n ${data.profile.last_login_at ? `\n
\n
Last Login
\n
${new Date(data.profile.last_login_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Two-Factor Auth
\n
\n ${data.profile.two_factor_enabled\n ? 'Enabled'\n : 'Disabled'\n }\n
\n
\n
\n
\n\n \n
\n

Security

\n\n
\n \n \n \n \n Change Password\n \n\n \n \n \n \n ${data.profile.two_factor_enabled ? 'Disable' : 'Enable'} 2FA\n \n
\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Change Password

\n \n
\n
\n\n
\n
\n\n
\n \n \n
\n\n
\n \n \n

Must be at least 8 characters

\n
\n\n
\n \n \n
\n\n
\n \n Cancel\n \n \n \n \n \n Update Password\n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'User Profile',\n pageTitle: 'Profile',\n currentPath: '/admin/profile',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { escapeHtml } from '../../utils/sanitize'\n\nexport type AlertType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface AlertData {\n type: AlertType\n title?: string\n message: string\n dismissible?: boolean\n className?: string\n icon?: boolean\n}\n\nexport function renderAlert(data: AlertData): string {\n const typeClasses = {\n success: 'bg-green-50 dark:bg-green-500/10 border border-green-600/20 dark:border-green-500/20',\n error: 'bg-error/10 border border-red-600/20 dark:border-red-500/20',\n warning: 'bg-amber-50 dark:bg-amber-500/10 border border-amber-600/20 dark:border-amber-500/20',\n info: 'bg-blue-50 dark:bg-blue-500/10 border border-blue-600/20 dark:border-blue-500/20'\n }\n\n const iconClasses = {\n success: 'text-green-600 dark:text-green-400',\n error: 'text-red-600 dark:text-red-400',\n warning: 'text-amber-600 dark:text-amber-400',\n info: 'text-blue-600 dark:text-blue-400'\n }\n\n const textClasses = {\n success: 'text-green-900 dark:text-green-300',\n error: 'text-red-900 dark:text-red-300',\n warning: 'text-amber-900 dark:text-amber-300',\n info: 'text-blue-900 dark:text-blue-300'\n }\n\n const messageTextClasses = {\n success: 'text-green-700 dark:text-green-400',\n error: 'text-red-700 dark:text-red-400',\n warning: 'text-amber-700 dark:text-amber-400',\n info: 'text-blue-700 dark:text-blue-400'\n }\n\n const icons = {\n success: ``,\n error: ``,\n warning: ``,\n info: ``\n }\n\n return `\n
\n
\n ${data.icon !== false ? `\n
\n \n ${icons[data.type]}\n \n
\n ` : ''}\n
\n ${data.title ? `\n

\n ${escapeHtml(data.title)}\n

\n ` : ''}\n
\n

${escapeHtml(data.message)}

\n
\n
\n ${data.dismissible ? `\n
\n
\n \n Dismiss\n \n \n \n \n
\n
\n ` : ''}\n
\n
\n `\n}\n\nexport function renderSuccessAlert(message: string, title?: string): string {\n return renderAlert({ type: 'success', message, title })\n}\n\nexport function renderErrorAlert(message: string, title?: string): string {\n return renderAlert({ type: 'error', message, title })\n}\n\nexport function renderWarningAlert(message: string, title?: string): string {\n return renderAlert({ type: 'warning', message, title })\n}\n\nexport function renderInfoAlert(message: string, title?: string): string {\n return renderAlert({ type: 'info', message, title })\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\n\nexport interface ActivityLog {\n id: string\n user_id: string\n action: string\n resource_type?: string\n resource_id?: string\n details?: any\n ip_address?: string\n user_agent?: string\n created_at: number\n user_email?: string\n user_name?: string\n}\n\nexport interface ActivityLogsPageData {\n logs: ActivityLog[]\n pagination: {\n page: number\n limit: number\n total: number\n pages: number\n }\n filters: {\n user_id?: string\n action?: string\n resource_type?: string\n date_from?: string\n date_to?: string\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderActivityLogsPage(data: ActivityLogsPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Activity Logs

\n

Monitor user actions and system activity

\n
\n
\n\n \n \n\n \n
\n

Filters

\n \n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n Clear Filters\n \n
\n
\n
\n\n \n
\n
\n
\n
\n

Recent Activity

\n
\n Showing ${data.logs.length} of ${data.pagination.total} logs\n
\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${data.logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimestampUserActionResourceIP AddressDetails
\n ${new Date(log.created_at).toLocaleString()}\n \n
${log.user_name || 'Unknown'}
\n
${log.user_email || 'N/A'}
\n
\n \n ${formatAction(log.action)}\n \n \n ${log.resource_type ? `\n
${log.resource_type}
\n ${log.resource_id ? `
${log.resource_id}
` : ''}\n ` : 'N/A'}\n
\n ${log.ip_address || 'N/A'}\n \n ${log.details ? `\n
\n View Details\n
${JSON.stringify(log.details, null, 2)}
\n
\n ` : 'N/A'}\n
\n
\n\n ${data.logs.length === 0 ? `\n
\n \n \n \n

No activity logs found

\n

Try adjusting your filters or check back later.

\n
\n ` : ''}\n\n \n ${data.pagination.pages > 1 ? `\n
\n
\n Page ${data.pagination.page} of ${data.pagination.pages} (${data.pagination.total} total logs)\n
\n \n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutData = {\n title: 'Activity Logs',\n pageTitle: 'Activity Logs',\n currentPath: '/admin/activity-logs',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction getActionBadgeClass(action: string): string {\n if (action.includes('login') || action.includes('logout')) {\n return 'bg-blue-500/20 text-blue-300'\n } else if (action.includes('create') || action.includes('invite')) {\n return 'bg-green-500/20 text-green-300'\n } else if (action.includes('update') || action.includes('change')) {\n return 'bg-yellow-500/20 text-yellow-300'\n } else if (action.includes('delete') || action.includes('cancel')) {\n return 'bg-red-500/20 text-red-300'\n } else {\n return 'bg-gray-500/20 text-gray-300'\n }\n}\n\nfunction formatAction(action: string): string {\n // Convert action from dot notation to readable format\n return action\n .split('.')\n .map(part => part.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()))\n .join(' - ')\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface UserProfileData {\n displayName?: string\n bio?: string\n company?: string\n jobTitle?: string\n website?: string\n location?: string\n dateOfBirth?: number\n}\n\nexport interface UserEditData {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n phone?: string\n avatarUrl?: string\n role: string\n isActive: boolean\n emailVerified: boolean\n twoFactorEnabled: boolean\n createdAt: number\n lastLoginAt?: number\n profile?: UserProfileData\n}\n\nexport interface UserEditPageData {\n userToEdit: UserEditData\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserEditPage(data: UserEditPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Edit User

\n
\n

Update user account and permissions

\n
\n
\n \n \n \n \n Save Changes\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Profile Information

\n

Extended profile data for this user

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n
\n\n
\n \n ${escapeHtml(data.userToEdit.profile?.bio || '')}\n
\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Set Password

\n

Leave blank to keep the current password

\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User has verified their email address

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

User Details

\n
\n
\n
User ID
\n
${data.userToEdit.id}
\n
\n
\n
Created
\n
${new Date(data.userToEdit.createdAt).toLocaleDateString()}
\n
\n ${data.userToEdit.lastLoginAt ? `\n
\n
Last Login
\n
${new Date(data.userToEdit.lastLoginAt).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Status
\n
\n ${data.userToEdit.isActive\n ? 'Active'\n : 'Inactive'\n }\n
\n
\n ${data.userToEdit.twoFactorEnabled ? `\n
\n
Security
\n
\n 2FA Enabled\n
\n
\n ` : ''}\n
\n
\n\n \n
\n

Danger Zone

\n

Irreversible and destructive actions

\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Permanently remove from database. Unchecked performs soft delete (deactivate only).

\n
\n
\n\n \n \n \n \n Delete User\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-user-confirm',\n title: 'Delete User',\n message: 'Are you sure you want to delete this user? Check the \"Hard Delete\" option to permanently remove all data from the database. This action cannot be undone!',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteUser()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Edit User',\n pageTitle: `Edit User - ${data.userToEdit.firstName} ${data.userToEdit.lastName}`,\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export interface ConfirmationDialogOptions {\n id: string\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmClass?: string\n iconColor?: 'red' | 'yellow' | 'blue'\n onConfirm?: string // JavaScript code to execute on confirm\n}\n\nexport function renderConfirmationDialog(options: ConfirmationDialogOptions): string {\n const {\n id,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmClass = 'bg-red-500 hover:bg-red-400',\n iconColor = 'red',\n onConfirm = ''\n } = options\n\n const iconColorClasses = {\n red: 'bg-red-500/10 text-red-400',\n yellow: 'bg-yellow-500/10 text-yellow-400',\n blue: 'bg-blue-500/10 text-blue-400'\n }\n\n return `\n \n \n \n\n
\n \n
\n
\n \n \n \n
\n
\n

${title}

\n
\n

${message}

\n
\n
\n
\n
\n \n ${confirmText}\n \n \n ${cancelText}\n \n
\n
\n
\n \n
\n `\n}\n\n/**\n * Helper function to show a confirmation dialog programmatically\n * Usage in templates: Add this script and call showConfirmDialog()\n */\nexport function getConfirmationDialogScript(): string {\n return `\n \n \n `\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserNewPageData {\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserNewPage(data: UserNewPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Create New User

\n
\n

Add a new user account to the system

\n
\n
\n \n \n \n \n Create User\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n\n
\n \n \n
\n
\n\n \n
\n

Password

\n
\n
\n \n \n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Mark email as verified

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

Creating a User

\n
\n

Fill in the required fields marked with * to create a new user account.

\n

The password must be at least 8 characters long.

\n

By default, new users are created as active and can sign in immediately.

\n

You can edit user details and permissions after creation.

\n
\n
\n\n \n
\n

Role Descriptions

\n
\n
\n
Administrator
\n
Full system access and permissions
\n
\n
\n
Editor
\n
Can create and edit content
\n
\n
\n
Author
\n
Can create own content
\n
\n
\n
Viewer
\n
Read-only access
\n
\n
\n
\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create User',\n pageTitle: 'Create New User',\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderAlert } from '../alert.template'\nimport { renderTable, TableColumn, TableData } from '../table.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface User {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n role: string\n avatar?: string\n isActive: boolean\n lastLoginAt?: number\n createdAt: number\n updatedAt: number\n formattedLastLogin?: string\n formattedCreatedAt?: string\n}\n\nexport interface UsersListPageData {\n users: User[]\n pagination?: PaginationData\n currentPage: number\n totalPages: number\n totalUsers: number\n statusFilter?: string\n roleFilter?: string\n searchFilter?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderUsersListPage(data: UsersListPageData): string {\n const columns: TableColumn[] = [\n {\n key: 'avatar',\n label: '',\n className: 'w-12',\n sortable: false,\n render: (value: string | null, row: User) => {\n const initials = `${row.firstName.charAt(0)}${row.lastName.charAt(0)}`.toUpperCase()\n if (value) {\n return `\"${row.firstName}`\n }\n return `\n
\n ${initials}\n
\n `\n }\n },\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, row: User) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n \n const truncatedFirstName = row.firstName.length > 25 ? row.firstName.substring(0, 25) + '...' : row.firstName\n const truncatedLastName = row.lastName.length > 25 ? row.lastName.substring(0, 25) + '...' : row.lastName\n const fullName = escapeHtml(`${truncatedFirstName} ${truncatedLastName}`)\n const truncatedUsername = row.username.length > 100 ? row.username.substring(0, 100) + '...' : row.username\n const username = escapeHtml(truncatedUsername)\n const statusBadge = row.isActive ?\n 'Active' :\n 'Inactive'\n return `\n
\n
${fullName}${statusBadge}
\n
@${username}
\n
\n `\n }\n },\n {\n key: 'email',\n label: 'Email',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n const escapedEmail = escapeHtml(value)\n return `${escapedEmail}`\n }\n },\n {\n key: 'role',\n label: 'Role',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const roleColors = {\n admin: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-700/10 dark:ring-red-500/20',\n editor: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-700/10 dark:ring-blue-500/20',\n author: 'bg-cyan-50 dark:bg-cyan-500/10 text-cyan-700 dark:text-cyan-400 ring-1 ring-inset ring-cyan-700/10 dark:ring-cyan-500/20',\n viewer: 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n }\n const colorClass = roleColors[value as keyof typeof roleColors] || 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n return `${value.charAt(0).toUpperCase() + value.slice(1)}`\n }\n },\n {\n key: 'lastLoginAt',\n label: 'Last Login',\n sortable: true,\n sortType: 'date',\n render: (value: number | null) => {\n if (!value) return 'Never'\n return `${new Date(value).toLocaleDateString()}`\n }\n },\n {\n key: 'createdAt',\n label: 'Created',\n sortable: true,\n sortType: 'date',\n render: (value: number) => `${new Date(value).toLocaleDateString()}`\n },\n {\n key: 'actions',\n label: 'Actions',\n className: 'text-right',\n sortable: false,\n render: (_value: any, row: User) => `\n
\n ${row.isActive ?\n `` :\n ``\n }\n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'users-table',\n columns,\n rows: data.users,\n selectable: false,\n rowClickable: true,\n rowClickUrl: (row: User) => `/admin/users/${row.id}/edit`,\n emptyMessage: 'No users found'\n }\n\n const pageContent = `\n
\n \n
\n
\n

User Management

\n

Manage user accounts and permissions

\n
\n
\n \n \n \n \n Add User\n \n \n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n

User Statistics

\n
\n
\n
Total Users
\n
\n
\n ${data.totalUsers}\n
\n
\n \n \n \n Increased by\n 5.2%\n
\n
\n
\n
\n
Active Users
\n
\n
\n ${data.users.filter(u => u.isActive).length}\n
\n
\n \n \n \n Increased by\n 3.1%\n
\n
\n
\n
\n
Administrators
\n
\n
\n ${data.users.filter(u => u.role === 'admin').length}\n
\n
\n \n \n \n Increased by\n 1.8%\n
\n
\n
\n
\n
Active This Week
\n
\n
\n ${data.users.filter(u => u.lastLoginAt && u.lastLoginAt > Date.now() - 7 * 24 * 60 * 60 * 1000).length}\n
\n
\n \n \n \n Decreased by\n 2.3%\n
\n
\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n
\n
\n \n
\n \n
\n {\n input.focus();\n input.setSelectionRange(len, len);\n }, 10);\n }\n \"\n >\n \n
\n \n \n \n
\n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n Clear Filters\n \n
\n
\n
\n
\n
\n
\n\n \n ${renderTable(tableData)}\n\n \n ${data.pagination ? renderPagination(data.pagination) : ''}\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'toggle-user-status-confirm',\n title: 'Toggle User Status',\n message: 'Are you sure you want to activate/deactivate this user?',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performToggleUserStatus()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Users',\n pageTitle: 'User Management',\n currentPath: '/admin/users',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n} ","import { Hono } from 'hono'\nimport { requireAuth, requireRole, logActivity, AuthManager } from '../middleware'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { renderProfilePage, renderAvatarImage, type UserProfile, type ProfilePageData } from '../templates/pages/admin-profile.template'\nimport { renderAlert } from '../templates/components/alert.template'\nimport { renderActivityLogsPage, type ActivityLogsPageData, type ActivityLog } from '../templates/pages/admin-activity-logs.template'\nimport { renderUserEditPage, type UserEditPageData, type UserEditData, type UserProfileData } from '../templates/pages/admin-user-edit.template'\nimport { renderUserNewPage, type UserNewPageData } from '../templates/pages/admin-user-new.template'\nimport { renderUsersListPage, type UsersListPageData, type User } from '../templates/pages/admin-users-list.template'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, renderCustomProfileSection, getCustomData, saveCustomData, extractCustomFieldsFromForm, sanitizeCustomData, validateCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst userRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware to all routes\nuserRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on user management routes\nuserRoutes.use('/users/*', requireRole(['admin']))\nuserRoutes.use('/users', requireRole(['admin']))\nuserRoutes.use('/invite-user', requireRole(['admin']))\nuserRoutes.use('/resend-invitation/*', requireRole(['admin']))\nuserRoutes.use('/cancel-invitation/*', requireRole(['admin']))\nuserRoutes.use('/activity-logs', requireRole(['admin']))\nuserRoutes.use('/activity-logs/*', requireRole(['admin']))\n\n// Redirect /admin to /admin/dashboard\nuserRoutes.get('/', (c) => {\n return c.redirect('/admin/dashboard')\n})\n\n// Timezone options for profile form\nconst TIMEZONES = [\n { value: 'UTC', label: 'UTC' },\n { value: 'America/New_York', label: 'Eastern Time' },\n { value: 'America/Chicago', label: 'Central Time' },\n { value: 'America/Denver', label: 'Mountain Time' },\n { value: 'America/Los_Angeles', label: 'Pacific Time' },\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Australia/Sydney', label: 'Sydney' }\n]\n\n// Language options for profile form\nconst LANGUAGES = [\n { value: 'en', label: 'English' },\n { value: 'es', label: 'Spanish' },\n { value: 'fr', label: 'French' },\n { value: 'de', label: 'German' },\n { value: 'it', label: 'Italian' },\n { value: 'pt', label: 'Portuguese' },\n { value: 'ja', label: 'Japanese' },\n { value: 'ko', label: 'Korean' },\n { value: 'zh', label: 'Chinese' }\n]\n\n// Role options for user form\nconst ROLES = [\n { value: 'admin', label: 'Administrator' },\n { value: 'editor', label: 'Editor' },\n { value: 'author', label: 'Author' },\n { value: 'viewer', label: 'Viewer' }\n]\n\n/**\n * GET /admin/profile - Show user profile page\n */\nuserRoutes.get('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n // Get user profile data\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n timezone, language, theme, email_notifications, two_factor_enabled,\n role, created_at, last_login_at\n FROM users \n WHERE id = ? AND is_active = 1\n `)\n \n const userProfile = await userStmt.bind(user!.userId).first() as any\n\n if (!userProfile) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Convert to UserProfile interface\n const profile: UserProfile = {\n id: userProfile.id,\n email: userProfile.email,\n username: userProfile.username || '',\n first_name: userProfile.first_name || '',\n last_name: userProfile.last_name || '',\n phone: userProfile.phone,\n bio: userProfile.bio,\n avatar_url: userProfile.avatar_url,\n timezone: userProfile.timezone || 'UTC',\n language: userProfile.language || 'en',\n theme: userProfile.theme || 'dark',\n email_notifications: Boolean(userProfile.email_notifications),\n two_factor_enabled: Boolean(userProfile.two_factor_enabled),\n role: userProfile.role,\n created_at: userProfile.created_at,\n last_login_at: userProfile.last_login_at\n }\n\n // Get custom profile data\n const customData = await getCustomData(db, user!.userId)\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n const pageData: ProfilePageData = {\n profile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n customProfileFieldsHtml,\n user: {\n name: `${profile.first_name} ${profile.last_name}`.trim() || profile.username || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n } catch (error) {\n console.error('Profile page error:', error)\n \n const pageData: ProfilePageData = {\n profile: {} as UserProfile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n error: 'Failed to load profile. Please try again.',\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n }\n})\n\n/**\n * PUT /admin/profile - Update user profile\n */\nuserRoutes.put('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const timezone = formData.get('timezone')?.toString() || 'UTC'\n const language = formData.get('language')?.toString() || 'en'\n const emailNotifications = formData.get('email_notifications') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please enter a valid email address.',\n dismissible: true \n }))\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users \n WHERE (username = ? OR email = ?) AND id != ? AND is_active = 1\n `)\n const existingUser = await checkStmt.bind(username, email, user!.userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Username or email is already taken by another user!.',\n dismissible: true \n }))\n }\n\n // Update user profile\n const updateStmt = db.prepare(`\n UPDATE users SET \n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, bio = ?, timezone = ?, language = ?,\n email_notifications = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, bio, timezone, language,\n emailNotifications ? 1 : 0, Date.now(),\n user!.userId\n ).run()\n\n // Save custom profile fields\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n await saveCustomData(db, user!.userId, sanitized)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.update', 'users', user!.userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'bio', 'timezone', 'language', 'email_notifications'] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success', \n message: 'Profile updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Profile update error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update profile. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/avatar - Upload user avatar\n */\nuserRoutes.post('/profile/avatar', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n const avatarFile = formData.get('avatar') as File | null\n\n if (!avatarFile || typeof avatarFile === 'string' || !avatarFile.name) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please select an image file.',\n dismissible: true\n }))\n }\n\n // Validate file type\n const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']\n if (!allowedTypes.includes(avatarFile.type)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please upload a valid image file (JPEG, PNG, GIF, or WebP).',\n dismissible: true \n }))\n }\n\n // Validate file size (5MB max)\n const maxSize = 5 * 1024 * 1024\n if (avatarFile.size > maxSize) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Image file must be smaller than 5MB.',\n dismissible: true \n }))\n }\n\n // For now, we'll simulate storing the avatar\n // In a real implementation, you'd upload to cloud storage (R2, S3, etc.)\n const avatarUrl = `/uploads/avatars/${user!.userId}-${Date.now()}.${avatarFile.type.split('/')[1]}`\n\n // Update user avatar URL in database\n const updateStmt = db.prepare(`\n UPDATE users SET avatar_url = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(avatarUrl, Date.now(), user!.userId).run()\n\n // Get updated user data to render the avatar\n const userStmt = db.prepare(`\n SELECT first_name, last_name FROM users WHERE id = ?\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.avatar_update', 'users', user!.userId,\n { avatar_url: avatarUrl },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return both the alert message and the updated avatar image using HTMX out-of-band swap\n const alertHtml = renderAlert({\n type: 'success',\n message: 'Profile picture updated successfully!',\n dismissible: true\n })\n\n // Add timestamp to avatar URL to bust cache\n const avatarUrlWithCache = `${avatarUrl}?t=${Date.now()}`\n const avatarImageHtml = renderAvatarImage(avatarUrlWithCache, userData.first_name, userData.last_name)\n\n // Use hx-swap-oob to update the avatar image container\n const avatarImageWithOob = avatarImageHtml.replace(\n 'id=\"avatar-image-container\"',\n 'id=\"avatar-image-container\" hx-swap-oob=\"true\"'\n )\n\n return c.html(alertHtml + avatarImageWithOob)\n\n } catch (error) {\n console.error('Avatar upload error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to upload profile picture. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/password - Change user password\n */\nuserRoutes.post('/profile/password', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n \n const currentPassword = formData.get('current_password')?.toString() || ''\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Validate input\n if (!currentPassword || !newPassword || !confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'All password fields are required.',\n dismissible: true \n }))\n }\n\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New passwords do not match.',\n dismissible: true \n }))\n }\n\n if (newPassword.length < 8) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New password must be at least 8 characters long.',\n dismissible: true \n }))\n }\n\n // Get current user data\n const userStmt = db.prepare(`\n SELECT password_hash FROM users WHERE id = ? AND is_active = 1\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n if (!userData) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'User not found.',\n dismissible: true \n }))\n }\n\n // Verify current password\n const validPassword = await AuthManager.verifyPassword(currentPassword, userData.password_hash)\n if (!validPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Current password is incorrect.',\n dismissible: true \n }))\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(newPassword)\n\n // Store old password in history\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user!.userId,\n userData.password_hash,\n Date.now()\n ).run()\n\n // Update user password\n const updateStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(newPasswordHash, Date.now(), user!.userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.password_change', 'users', user!.userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({ \n type: 'success', \n message: 'Password updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Password change error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update password. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * GET /admin/users - List all users\n * Returns HTML for browser requests and JSON for API requests\n * Note: Already protected by requireAuth() and requireRole(['admin', 'editor'])\n */\nuserRoutes.get('/users', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '20')\n const search = c.req.query('search') || ''\n const roleFilter = c.req.query('role') || ''\n const statusFilter = c.req.query('status') || 'active'\n const offset = (page - 1) * limit\n\n // Build search query\n let whereClause = ''\n let params: any[] = []\n\n // Handle status filter\n if (statusFilter === 'active') {\n whereClause = 'WHERE u.is_active = 1'\n } else if (statusFilter === 'inactive') {\n whereClause = 'WHERE u.is_active = 0'\n } else {\n // 'all' - no filter\n whereClause = 'WHERE 1=1'\n }\n\n if (search) {\n whereClause += ' AND (u.first_name LIKE ? OR u.last_name LIKE ? OR u.email LIKE ? OR u.username LIKE ?)'\n const searchParam = `%${search}%`\n params.push(searchParam, searchParam, searchParam, searchParam)\n }\n\n if (roleFilter) {\n whereClause += ' AND u.role = ?'\n params.push(roleFilter)\n }\n\n // Get users\n const usersStmt = db.prepare(`\n SELECT u.id, u.email, u.username, u.first_name, u.last_name,\n u.role, u.avatar_url, u.created_at, u.last_login_at, u.updated_at,\n u.email_verified, u.two_factor_enabled, u.is_active\n FROM users u\n ${whereClause}\n ORDER BY u.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: usersData } = await usersStmt.bind(...params, limit, offset).all()\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total FROM users u ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalUsers = countResult?.total || 0\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'users.list_view', 'users', undefined,\n { search, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Check if this is an API request (accept header contains 'application/json')\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n // Return JSON for API requests\n return c.json({\n users: usersData || [],\n pagination: {\n page,\n limit,\n total: totalUsers,\n pages: Math.ceil(totalUsers / limit)\n }\n })\n }\n\n // Return HTML for browser requests\n const users: User[] = (usersData || []).map((u: any) => ({\n id: u.id,\n email: u.email,\n username: u.username || '',\n firstName: u.first_name || '',\n lastName: u.last_name || '',\n role: u.role,\n avatar: u.avatar_url,\n isActive: Boolean(u.is_active),\n lastLoginAt: u.last_login_at,\n createdAt: u.created_at,\n updatedAt: u.updated_at,\n formattedLastLogin: u.last_login_at ? new Date(u.last_login_at).toLocaleDateString() : undefined,\n formattedCreatedAt: new Date(u.created_at).toLocaleDateString()\n }))\n\n const successMessage = c.req.query('success') || undefined\n\n const pageData: UsersListPageData = {\n users,\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalUsers,\n searchFilter: search,\n roleFilter,\n statusFilter,\n success: successMessage,\n pagination: {\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalItems: totalUsers,\n itemsPerPage: limit,\n startItem: offset + 1,\n endItem: Math.min(offset + limit, totalUsers),\n baseUrl: '/admin/users'\n },\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUsersListPage(pageData))\n\n } catch (error) {\n console.error('Users list error:', error)\n\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n return c.json({ error: 'Failed to load users' }, 500)\n }\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load users. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * GET /admin/users/new - Show new user creation page\n */\nuserRoutes.get('/users/new', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: UserNewPageData = {\n roles: ROLES,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserNewPage(pageData))\n } catch (error) {\n console.error('User new page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user creation page. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * POST /admin/users/new - Create new user\n */\nuserRoutes.post('/users/new', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const password = formData.get('password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email || !password) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, email, and password are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password\n if (password.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n\n if (password !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n\n // Check if username/email are already taken\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE username = ? OR email = ?\n `)\n const existingUser = await checkStmt.bind(username, email).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken.',\n dismissible: true\n }))\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Create user\n const userId = crypto.randomUUID()\n const createStmt = db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name, phone, bio,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createStmt.bind(\n userId, email, username, firstName, lastName, phone, bio,\n passwordHash, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.create', 'users', userId,\n { email, username, role },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Redirect to user list (use HX-Redirect for HTMX requests)\n c.header('HX-Redirect', '/admin/users?success=User created successfully')\n return c.body(null, 200)\n\n } catch (error) {\n console.error('User creation error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to create user!. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * GET /admin/users/:id - Get user by ID\n * Note: This endpoint returns users regardless of is_active status for admin purposes\n */\nuserRoutes.get('/users/:id', async (c) => {\n // Check if this is actually the edit route\n if (c.req.path.endsWith('/edit')) {\n return c.notFound()\n }\n\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (including inactive users for admin access)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userRecord = await userStmt.bind(userId).first() as any\n\n if (!userRecord) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.view', 'users', userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n user: {\n id: userRecord.id,\n email: userRecord.email,\n username: userRecord.username,\n first_name: userRecord.first_name,\n last_name: userRecord.last_name,\n phone: userRecord.phone,\n bio: userRecord.bio,\n avatar_url: userRecord.avatar_url,\n role: userRecord.role,\n is_active: userRecord.is_active,\n email_verified: userRecord.email_verified,\n two_factor_enabled: userRecord.two_factor_enabled,\n created_at: userRecord.created_at,\n last_login_at: userRecord.last_login_at\n }\n })\n\n } catch (error) {\n console.error('User fetch error:', error)\n return c.json({ error: 'Failed to fetch user' }, 500)\n }\n})\n\n/**\n * GET /admin/users/:id/edit - Show user edit page\n */\nuserRoutes.get('/users/:id/edit', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (removed bio - now in profile)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userToEdit = await userStmt.bind(userId).first() as any\n\n if (!userToEdit) {\n return c.html(renderAlert({\n type: 'error',\n message: 'User not found',\n dismissible: true\n }), 404)\n }\n\n // Get user profile data\n const profileStmt = db.prepare(`\n SELECT display_name, bio, company, job_title, website, location, date_of_birth, data\n FROM user_profiles\n WHERE user_id = ?\n `)\n const profileData = await profileStmt.bind(userId).first() as any\n\n // Convert profile to UserProfileData interface\n const profile: UserProfileData | undefined = profileData ? {\n displayName: profileData.display_name,\n bio: profileData.bio,\n company: profileData.company,\n jobTitle: profileData.job_title,\n website: profileData.website,\n location: profileData.location,\n dateOfBirth: profileData.date_of_birth\n } : undefined\n\n // Parse custom profile data\n let customData: Record = {}\n if (profileData?.data) {\n try { customData = JSON.parse(profileData.data) } catch {}\n }\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n // Convert to UserEditData interface\n const editData: UserEditData = {\n id: userToEdit.id,\n email: userToEdit.email,\n username: userToEdit.username || '',\n firstName: userToEdit.first_name || '',\n lastName: userToEdit.last_name || '',\n phone: userToEdit.phone,\n avatarUrl: userToEdit.avatar_url,\n role: userToEdit.role,\n isActive: Boolean(userToEdit.is_active),\n emailVerified: Boolean(userToEdit.email_verified),\n twoFactorEnabled: Boolean(userToEdit.two_factor_enabled),\n createdAt: userToEdit.created_at,\n lastLoginAt: userToEdit.last_login_at,\n profile\n }\n\n const pageData: UserEditPageData = {\n userToEdit: editData,\n roles: ROLES,\n customProfileFieldsHtml,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserEditPage(pageData))\n } catch (error) {\n console.error('User edit page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * PUT /admin/users/:id - Update user\n */\nuserRoutes.put('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Optional password change\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Extract profile fields\n const profileDisplayName = sanitizeInput(formData.get('profile_display_name')?.toString()) || null\n const profileBio = sanitizeInput(formData.get('profile_bio')?.toString()) || null\n const profileCompany = sanitizeInput(formData.get('profile_company')?.toString()) || null\n const profileJobTitle = sanitizeInput(formData.get('profile_job_title')?.toString()) || null\n const profileWebsite = formData.get('profile_website')?.toString()?.trim() || null\n const profileLocation = sanitizeInput(formData.get('profile_location')?.toString()) || null\n const profileDateOfBirthStr = formData.get('profile_date_of_birth')?.toString()?.trim() || null\n const profileDateOfBirth = profileDateOfBirthStr ? new Date(profileDateOfBirthStr).getTime() : null\n\n // Extract custom profile fields\n const profileConfig = getUserProfileConfig()\n let customDataJson: string | null = null\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n // Merge with existing custom data\n const existingCustom = await getCustomData(db, userId)\n const merged = { ...existingCustom, ...sanitized }\n customDataJson = JSON.stringify(merged)\n }\n\n // Validate required fields\n if (!username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password if provided\n if (newPassword) {\n if (newPassword.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n }\n\n // Validate website URL if provided\n if (profileWebsite) {\n try {\n new URL(profileWebsite)\n } catch {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid website URL.',\n dismissible: true\n }))\n }\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE (username = ? OR email = ?) AND id != ?\n `)\n const existingUser = await checkStmt.bind(username, email, userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken by another user.',\n dismissible: true\n }))\n }\n\n // Update user (removed bio - now in profile)\n const updateStmt = db.prepare(`\n UPDATE users SET\n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, role = ?, is_active = ?, email_verified = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), userId\n ).run()\n\n // Update password if provided\n if (newPassword) {\n const passwordHash = await AuthManager.hashPassword(newPassword)\n const updatePasswordStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?\n `)\n await updatePasswordStmt.bind(passwordHash, Date.now(), userId).run()\n }\n\n // Check if any profile field has data\n const hasProfileData = profileDisplayName || profileBio || profileCompany ||\n profileJobTitle || profileWebsite || profileLocation || profileDateOfBirth\n\n if (hasProfileData || customDataJson !== null) {\n const now = Date.now()\n\n // Check if profile exists\n const profileCheckStmt = db.prepare(`SELECT id FROM user_profiles WHERE user_id = ?`)\n const existingProfile = await profileCheckStmt.bind(userId).first() as any\n\n if (existingProfile) {\n // Update existing profile\n const updateProfileStmt = db.prepare(`\n UPDATE user_profiles SET\n display_name = ?, bio = ?, company = ?, job_title = ?,\n website = ?, location = ?, date_of_birth = ?, updated_at = ?\n ${customDataJson !== null ? ', data = ?' : ''}\n WHERE user_id = ?\n `)\n const updateBindings = [\n profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, now,\n ...(customDataJson !== null ? [customDataJson] : []),\n userId\n ]\n await updateProfileStmt.bind(...updateBindings).run()\n } else {\n // Create new profile\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const insertProfileStmt = db.prepare(`\n INSERT INTO user_profiles (id, user_id, display_name, bio, company, job_title, website, location, date_of_birth, data, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n await insertProfileStmt.bind(\n profileId, userId, profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, customDataJson || '{}', now, now\n ).run()\n }\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user.update', 'users', userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'role', 'is_active', 'email_verified', 'profile', ...(newPassword ? ['password'] : [])] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success',\n message: 'User updated successfully!',\n dismissible: true\n }))\n\n } catch (error) {\n console.error('User update error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to update user. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * POST /admin/users/:id/toggle - Toggle user active status\n */\nuserRoutes.post('/users/:id/toggle', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const body = await c.req.json().catch(() => ({ active: true }))\n const active = body.active === true\n\n // Prevent self-deactivation\n if (userId === user!.userId && !active) {\n return c.json({ error: 'You cannot deactivate your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToToggle = await userStmt.bind(userId).first() as any\n\n if (!userToToggle) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Toggle user status\n const toggleStmt = db.prepare(`\n UPDATE users SET is_active = ?, updated_at = ? WHERE id = ?\n `)\n await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, active ? 'user.activate' : 'user.deactivate', 'users', userId,\n { email: userToToggle.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: active ? 'User activated successfully' : 'User deactivated successfully'\n })\n\n } catch (error) {\n console.error('User toggle error:', error)\n return c.json({ error: 'Failed to toggle user status' }, 500)\n }\n})\n\n/**\n * DELETE /admin/users/:id - Delete user\n */\nuserRoutes.delete('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get request body to check for hard delete option\n const body = await c.req.json().catch(() => ({ hardDelete: false }))\n const hardDelete = body.hardDelete === true\n\n // Prevent self-deletion\n if (userId === user!.userId) {\n return c.json({ error: 'You cannot delete your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToDelete = await userStmt.bind(userId).first() as any\n\n if (!userToDelete) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n if (hardDelete) {\n // Hard delete - permanently remove from database\n const deleteStmt = db.prepare(`\n DELETE FROM users WHERE id = ?\n `)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.hard_delete', 'users', userId,\n { email: userToDelete.email, permanent: true },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User permanently deleted'\n })\n } else {\n // Soft delete - deactivate by setting is_active = 0\n const deleteStmt = db.prepare(`\n UPDATE users SET is_active = 0, updated_at = ? WHERE id = ?\n `)\n await deleteStmt.bind(Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.soft_delete', 'users', userId,\n { email: userToDelete.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User deactivated successfully'\n })\n }\n\n } catch (error) {\n console.error('User deletion error:', error)\n return c.json({ error: 'Failed to delete user' }, 500)\n }\n})\n\n/**\n * POST /admin/invite-user - Invite a new user\n */\nuserRoutes.post('/invite-user', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const role = formData.get('role')?.toString()?.trim() || 'viewer'\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n\n // Validate input\n if (!email || !firstName || !lastName) {\n return c.json({ error: 'Email, first name, and last name are required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n // Check if user already exists\n const existingUserStmt = db.prepare(`\n SELECT id FROM users WHERE email = ?\n `)\n const existingUser = await existingUserStmt.bind(email).first()\n\n if (existingUser) {\n return c.json({ error: 'A user with this email already exists' }, 400)\n }\n\n // Generate invitation token\n const invitationToken = crypto.randomUUID()\n // const invitationExpires = Date.now() + (7 * 24 * 60 * 60 * 1000) // 7 days\n\n // Create user record with invitation\n const userId = crypto.randomUUID()\n const createUserStmt = db.prepare(`\n INSERT INTO users (\n id, email, first_name, last_name, role, \n invitation_token, invited_by, invited_at,\n is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createUserStmt.bind(\n userId, email, firstName, lastName, role,\n invitationToken, user!.userId, Date.now(),\n 0, 0, Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invite_sent', 'users', userId,\n { email, role, invited_user_id: userId },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // In a real implementation, you would send an email here\n // For now, we'll return the invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${invitationToken}`\n\n return c.json({\n success: true,\n message: 'User invitation sent successfully',\n user: {\n id: userId,\n email,\n first_name: firstName,\n last_name: lastName,\n role\n },\n invitation_link: invitationLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('User invitation error:', error)\n return c.json({ error: 'Failed to send user invitation' }, 500)\n }\n})\n\n/**\n * POST /admin/resend-invitation/:id - Resend invitation\n */\nuserRoutes.post('/resend-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invitation_token\n FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Generate new invitation token\n const newInvitationToken = crypto.randomUUID()\n\n // Update invitation token and date\n const updateStmt = db.prepare(`\n UPDATE users SET \n invitation_token = ?, \n invited_at = ?, \n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newInvitationToken,\n Date.now(),\n Date.now(),\n userId\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_resent', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Generate new invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${newInvitationToken}`\n\n return c.json({\n success: true,\n message: 'Invitation resent successfully',\n invitation_link: invitationLink\n })\n\n } catch (error) {\n console.error('Resend invitation error:', error)\n return c.json({ error: 'Failed to resend invitation' }, 500)\n }\n})\n\n/**\n * DELETE /admin/cancel-invitation/:id - Cancel invitation\n */\nuserRoutes.delete('/cancel-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Delete the user record (since they haven't activated yet)\n const deleteStmt = db.prepare(`DELETE FROM users WHERE id = ?`)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_cancelled', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'Invitation cancelled successfully'\n })\n\n } catch (error) {\n console.error('Cancel invitation error:', error)\n return c.json({ error: 'Failed to cancel invitation' }, 500)\n }\n})\n\n/**\n * GET /admin/activity-logs - View activity logs\n */\nuserRoutes.get('/activity-logs', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination and filter parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '50')\n const offset = (page - 1) * limit\n\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get activity logs with user information\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: logs } = await logsStmt.bind(...params, limit, offset).all()\n\n // Get total count for pagination\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total \n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalLogs = countResult?.total || 0\n\n // Parse details JSON for each log\n const formattedLogs: ActivityLog[] = (logs || []).map((log: any) => ({\n ...log,\n details: log.details ? JSON.parse(log.details) : null\n }))\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'activity.logs_viewed', undefined, undefined,\n { filters, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n const pageData: ActivityLogsPageData = {\n logs: formattedLogs,\n pagination: {\n page,\n limit,\n total: totalLogs,\n pages: Math.ceil(totalLogs / limit)\n },\n filters,\n user: {\n name: user!.email.split('@')[0] || user!.email, // Use email username as fallback\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n\n } catch (error) {\n console.error('Activity logs error:', error)\n \n const pageData: ActivityLogsPageData = {\n logs: [],\n pagination: { page: 1, limit: 50, total: 0, pages: 0 },\n filters: {},\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n }\n})\n\n/**\n * GET /admin/activity-logs/export - Export activity logs to CSV\n */\nuserRoutes.get('/activity-logs/export', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get filter parameters (same as list view)\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get all matching activity logs (limit to 10,000 for performance)\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT 10000\n `)\n\n const { results: logs } = await logsStmt.bind(...params).all()\n\n // Generate CSV content\n const csvHeaders = ['Timestamp', 'User', 'Email', 'Action', 'Resource Type', 'Resource ID', 'IP Address', 'Details']\n const csvRows = [csvHeaders.join(',')]\n\n for (const log of (logs || [])) {\n const row = [\n `\"${new Date((log as any).created_at).toISOString()}\"`,\n `\"${(log as any).user_name || 'Unknown'}\"`,\n `\"${(log as any).user_email || 'N/A'}\"`,\n `\"${(log as any).action}\"`,\n `\"${(log as any).resource_type || 'N/A'}\"`,\n `\"${(log as any).resource_id || 'N/A'}\"`,\n `\"${(log as any).ip_address || 'N/A'}\"`,\n `\"${(log as any).details ? JSON.stringify(JSON.parse((log as any).details)) : 'N/A'}\"`\n ]\n csvRows.push(row.join(','))\n }\n\n const csvContent = csvRows.join('\\n')\n\n // Log the export activity\n await logActivity(\n db, user!.userId, 'activity.logs_exported', undefined, undefined,\n { filters, count: logs?.length || 0 },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return CSV file\n const filename = `activity-logs-${new Date().toISOString().split('T')[0]}.csv`\n \n return new Response(csvContent, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"${filename}\"`\n }\n })\n\n } catch (error) {\n console.error('Activity logs export error:', error)\n return c.json({ error: 'Failed to export activity logs' }, 500)\n }\n})\n\nexport { userRoutes }","export interface MediaFile {\n id: string;\n filename: string;\n original_name: string;\n mime_type: string;\n size: number;\n public_url: string;\n thumbnail_url?: string;\n alt?: string;\n caption?: string;\n tags: string[];\n uploaded_at: string;\n fileSize: string;\n uploadedAt: string;\n isImage: boolean;\n isVideo: boolean;\n isDocument: boolean;\n}\n\nexport interface MediaGridData {\n files: MediaFile[];\n viewMode?: \"grid\" | \"list\";\n selectable?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function renderMediaGrid(data: MediaGridData): string {\n if (data.files.length === 0) {\n return `\n
\n \n \n \n

No media files

\n

${\n data.emptyMessage || \"Get started by uploading your first file.\"\n }

\n
\n `;\n }\n\n const gridClass = data.viewMode === \"list\" ? \"space-y-4\" : \"media-grid\";\n\n return `\n
\n ${data.files\n .map((file) =>\n renderMediaFileCard(file, data.viewMode, data.selectable)\n )\n .join(\"\")}\n
\n `;\n}\n\nexport function renderMediaFileCard(\n file: MediaFile,\n viewMode: \"grid\" | \"list\" = \"grid\",\n selectable: boolean = false\n): string {\n if (viewMode === \"list\") {\n return `\n
\n
\n ${\n selectable\n ? `\n
\n
\n \n \n \n \n \n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n
\n\n
\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n \n \n \n \n \n
\n
\n
\n ${file.uploadedAt}\n ${\n file.tags.length > 0\n ? `\n \n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n
\n
\n `;\n }\n\n // Grid view\n return `\n
\n ${\n selectable\n ? `\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n ${\n file.uploadedAt\n }\n
\n ${\n file.tags.length > 0\n ? `\n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n `;\n}\n\nfunction getFileIcon(mimeType: string): string {\n if (mimeType.startsWith(\"image/\")) {\n return `\n \n \n \n `;\n } else if (mimeType.startsWith(\"video/\")) {\n return `\n \n \n \n `;\n } else if (mimeType === \"application/pdf\") {\n return `\n \n \n \n `;\n } else {\n return `\n \n \n \n `;\n }\n}\n","import {\n getConfirmationDialogScript,\n renderConfirmationDialog,\n} from \"../components/confirmation-dialog.template\";\nimport { MediaFile, renderMediaGrid } from \"../components/media-grid.template\";\nimport {\n AdminLayoutCatalystData,\n renderAdminLayoutCatalyst,\n} from \"../layouts/admin-layout-catalyst.template\";\n\nexport interface FolderStats {\n folder: string;\n count: number;\n totalSize: number;\n}\n\nexport interface TypeStats {\n type: string;\n count: number;\n}\n\nexport interface MediaLibraryPageData {\n files: MediaFile[];\n folders: FolderStats[];\n types: TypeStats[];\n currentFolder: string;\n currentType: string;\n currentView: \"grid\" | \"list\";\n currentPage: number;\n totalFiles: number;\n hasNextPage: boolean;\n user?: {\n name: string;\n email: string;\n role: string;\n };\n version?: string;\n}\n\nexport function renderMediaLibraryPage(data: MediaLibraryPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Media Library

\n

Manage your media files and assets

\n
\n
\n \n \n \n \n Upload Media\n \n
\n
\n \n
\n \n
\n
\n \n
\n \n Upload Files\n \n
\n\n \n
\n

Folders

\n \n
\n\n \n
\n

File Types

\n \n
\n\n \n
\n

Quick Actions

\n
\n \n Create Folder\n \n \n Cleanup Unused\n \n
\n
\n
\n
\n \n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n ${\n data.files.length\n } files\n \n Select All\n \n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Move to Folder\n \n
\n
\n \n \n \n \n Delete Selected Files\n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n ${renderMediaGrid({\n files: data.files,\n viewMode: data.currentView,\n selectable: true,\n emptyMessage:\n \"No media files found. Upload your first file to get started.\",\n })}\n
\n \n \n ${\n data.hasNextPage\n ? `\n
\n
\n ${\n data.currentPage > 1\n ? `\n \n Previous\n \n `\n : \"\"\n }\n Page ${\n data.currentPage\n }\n \n Next\n \n
\n
\n `\n : \"\"\n }\n
\n
\n \n \n \n
\n
\n
\n

Upload Files

\n \n
\n \n \n { window.location.href = '/admin/media?t=' + Date.now(); }, 1500); }\"\n class=\"space-y-4\"\n >\n \n \n \n \n \n
\n

Drop files here or click to upload

\n

PNG, JPG, GIF, PDF up to 10MB

\n
\n
\n \n \n \n \n
\n \n \n
\n\n \n
\n

Selected Files:

\n
\n
\n\n \n
\n \n Cancel\n \n \n Upload Files\n \n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n
\n
\n\n \n
\n
\n
\n

Move to Folder

\n \n
\n\n

\n Select a folder to move 0 selected file(s) to:\n

\n\n
\n ${\n data.folders.length > 0\n ? data.folders\n .map(\n (folder) => `\n \n
\n ${folder.folder}\n ${folder.count} files\n
\n \n `\n )\n .join(\"\")\n : '

No folders available

'\n }\n
\n\n
\n \n Cancel\n \n
\n
\n
\n\n \n
\n
\n
\n

Create New Folder

\n \n
\n\n
\n
\n \n \n

\n Use lowercase letters, numbers, hyphens, and underscores only\n

\n
\n\n
\n \n Cancel\n \n \n Create Folder\n \n
\n
\n
\n
\n\n \n \n \n\n \n ${renderConfirmationDialog({\n id: \"media-bulk-delete-confirm\",\n title: \"Delete Selected Files\",\n message: `Are you sure you want to delete ${\n data.files.length > 0 ? \"the selected files\" : \"these files\"\n }? This action cannot be undone and the files will be permanently removed.`,\n confirmText: \"Delete Files\",\n cancelText: \"Cancel\",\n confirmClass: \"bg-red-500 hover:bg-red-400\",\n iconColor: \"red\",\n onConfirm: \"performBulkDelete()\",\n })}\n\n \n ${getConfirmationDialogScript()}\n `;\n\n function buildPageUrl(page: number, folder: string, type: string): string {\n const params = new URLSearchParams();\n params.set(\"page\", page.toString());\n if (folder !== \"all\") params.set(\"folder\", folder);\n if (type !== \"all\") params.set(\"type\", type);\n return `/admin/media?${params.toString()}`;\n }\n\n const layoutData: AdminLayoutCatalystData = {\n title: \"Media Library\",\n pageTitle: \"Media Library\",\n currentPath: \"/admin/media\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayoutCatalyst(layoutData);\n}\n","import { MediaFile } from './media-grid.template'\n\nexport interface MediaFileDetailsData {\n file: MediaFile & {\n width?: number\n height?: number\n folder: string\n uploadedAt: string\n }\n}\n\nexport function renderMediaFileDetails(data: MediaFileDetailsData): string {\n const { file } = data\n \n return `\n
\n

File Details

\n \n
\n \n
\n \n
\n
\n ${file.isImage ? `\n \"${file.alt\n ` : file.isVideo ? `\n \n ` : `\n
\n \n \n \n
\n `}\n
\n\n
\n \n Copy URL\n \n \n Open Original\n \n
\n
\n \n \n
\n
\n \n

${file.original_name}

\n
\n\n
\n
\n \n

${file.fileSize}

\n
\n
\n \n

${file.mime_type}

\n
\n
\n\n ${file.width && file.height ? `\n
\n
\n \n

${file.width}px

\n
\n
\n \n

${file.height}px

\n
\n
\n ` : ''}\n\n
\n \n

${file.folder}

\n
\n\n
\n \n

${file.uploadedAt}

\n
\n\n \n
\n
\n \n \n
\n\n
\n \n ${file.caption || ''}\n
\n\n
\n \n \n
\n\n
\n \n Save Changes\n \n \n Delete File\n \n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\nimport { html, raw } from 'hono/html'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth, requireRole } from '../middleware'\nimport { renderMediaLibraryPage, MediaLibraryPageData, FolderStats, TypeStats } from '../templates/pages/admin-media-library.template'\nimport { renderMediaFileDetails, MediaFileDetailsData } from '../templates/components/media-file-details.template'\nimport { MediaFile, renderMediaFileCard } from '../templates/components/media-grid.template'\nimport type { Bindings, Variables } from '../app'\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nconst adminMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminMediaRoutes.use('*', requireAuth())\n\n// Media library main page\nadminMediaRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { searchParams } = new URL(c.req.url)\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const view = searchParams.get('view') || 'grid'\n const page = parseInt(searchParams.get('page') || '1')\n const _cacheBust = searchParams.get('t') // Cache-busting parameter\n const limit = 24\n const offset = (page - 1) * limit\n\n const db = c.env.DB\n\n // TODO: Cache implementation removed during migration - will be added back when cache plugin is migrated\n\n // Build query for media files\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = ['deleted_at IS NULL']\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT ${limit} OFFSET ${offset}`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n // Get folder statistics\n const foldersStmt = db.prepare(`\n SELECT folder, COUNT(*) as count, SUM(size) as totalSize\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY folder\n ORDER BY folder\n `)\n const { results: folders } = await foldersStmt.all()\n \n // Get type statistics\n const typesStmt = db.prepare(`\n SELECT\n CASE\n WHEN mime_type LIKE 'image/%' THEN 'images'\n WHEN mime_type LIKE 'video/%' THEN 'videos'\n WHEN mime_type IN ('application/pdf', 'text/plain') THEN 'documents'\n ELSE 'other'\n END as type,\n COUNT(*) as count\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY type\n `)\n const { results: types } = await typesStmt.all()\n \n // Process media files with local serving URLs\n const mediaFiles: MediaFile[] = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n caption: row.caption,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const pageData: MediaLibraryPageData = {\n files: mediaFiles,\n folders: folders.map((f: any) => ({\n folder: f.folder,\n count: f.count,\n totalSize: f.totalSize\n })) as FolderStats[],\n types: types.map((t: any) => ({\n type: t.type,\n count: t.count\n })) as TypeStats[],\n currentFolder: folder,\n currentType: type,\n currentView: view as 'grid' | 'list',\n currentPage: page,\n totalFiles: results.length,\n hasNextPage: results.length === limit,\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: c.get('appVersion')\n }\n\n // TODO: Cache implementation removed during migration\n\n return c.html(renderMediaLibraryPage(pageData))\n } catch (error) {\n console.error('Error loading media library:', error)\n return c.html(html`

Error loading media library

`)\n }\n})\n\n// Media selector endpoint (HTMX endpoint for content form media selection)\nadminMediaRoutes.get('/selector', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const db = c.env.DB\n\n // Build search query\n let query = 'SELECT * FROM media WHERE deleted_at IS NULL'\n const params: any[] = []\n\n if (search.trim()) {\n query += ' AND (filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n query += ' ORDER BY uploaded_at DESC LIMIT 24'\n\n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n // Render media selector grid\n return c.html(html`\n
\n \n
\n\n
\n ${raw(mediaFiles.map(file => `\n \n
\n ${file.isImage ? `\n \n ` : file.isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n\n
\n \n Select\n \n
\n
\n\n
\n

\n ${file.original_name}\n

\n

\n ${file.fileSize}\n

\n
\n
\n `).join(''))}\n \n\n ${mediaFiles.length === 0 ? html`\n
\n \n \n \n

No media files found

\n
\n ` : ''}\n `)\n } catch (error) {\n console.error('Error loading media selector:', error)\n return c.html(html`
Error loading media files
`)\n }\n})\n\n// Search media files (HTMX endpoint)\nadminMediaRoutes.get('/search', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const db = c.env.DB\n \n // Build search query\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = []\n \n if (search.trim()) {\n conditions.push('(filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)')\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT 24`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n const mediaFiles = results.map((row: any) => ({\n ...row,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n fileSize: formatFileSize(row.size),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const gridHTML = mediaFiles.map(file => generateMediaItemHTML(file)).join('')\n \n return c.html(raw(gridHTML))\n } catch (error) {\n console.error('Error searching media:', error)\n return c.html('
Error searching files
')\n }\n})\n\n// Get file details modal (HTMX endpoint)\nadminMediaRoutes.get('/:id/details', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n \n const stmt = db.prepare('SELECT * FROM media WHERE id = ?')\n const result = await stmt.bind(id).first() as any\n \n if (!result) {\n return c.html('
File not found
')\n }\n \n const file: MediaFile & { width?: number; height?: number; folder: string; uploadedAt: string } = {\n id: result.id,\n filename: result.filename,\n original_name: result.original_name,\n mime_type: result.mime_type,\n size: result.size,\n public_url: `/files/${result.r2_key}`,\n thumbnail_url: result.mime_type.startsWith('image/') ? `/files/${result.r2_key}` : undefined,\n alt: result.alt,\n caption: result.caption,\n tags: result.tags ? JSON.parse(result.tags) : [],\n uploaded_at: result.uploaded_at,\n fileSize: formatFileSize(result.size),\n uploadedAt: new Date(result.uploaded_at).toLocaleString(),\n isImage: result.mime_type.startsWith('image/'),\n isVideo: result.mime_type.startsWith('video/'),\n isDocument: !result.mime_type.startsWith('image/') && !result.mime_type.startsWith('video/'),\n width: result.width,\n height: result.height,\n folder: result.folder\n }\n \n const detailsData: MediaFileDetailsData = { file }\n \n return c.html(renderMediaFileDetails(detailsData))\n } catch (error) {\n console.error('Error fetching file details:', error)\n return c.html('
Error loading file details
')\n }\n})\n\n// Upload files endpoint (HTMX compatible)\nadminMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const fileEntries = formData.getAll('files') as unknown[]\n const files: File[] = []\n\n for (const entry of fileEntries) {\n if (entry instanceof File) {\n files.push(entry)\n }\n }\n \n if (!files || files.length === 0) {\n return c.html(html`\n
\n No files provided\n
\n `)\n }\n\n const uploadResults = []\n const errors = []\n\n // Check if MEDIA_BUCKET is available\n console.log('[MEDIA UPLOAD] c.env keys:', Object.keys(c.env))\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET defined?', !!c.env.MEDIA_BUCKET)\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET type:', typeof c.env.MEDIA_BUCKET)\n\n if (!c.env.MEDIA_BUCKET) {\n console.error('[MEDIA UPLOAD] MEDIA_BUCKET is not available! Available env keys:', Object.keys(c.env))\n return c.html(html`\n
\n Media storage (R2) is not configured. Please check your wrangler.toml configuration.\n
Debug: Available bindings: ${Object.keys(c.env).join(', ')}\n
\n `)\n }\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: validation.error.issues[0]?.message || 'Validation failed'\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = crypto.randomUUID()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user!.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n\n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate URLs - use public serving route\n const publicUrl = `/files/${r2Key}`\n const thumbnailUrl = file.type.startsWith('image/') ? publicUrl : null\n\n // Save to database\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n fileId,\n filename,\n file.name,\n file.type,\n file.size,\n width,\n height,\n folder,\n r2Key,\n publicUrl,\n thumbnailUrl,\n user!.userId,\n Math.floor(Date.now() / 1000)\n ).run()\n\n uploadResults.push({\n id: fileId,\n filename: filename,\n originalName: file.name,\n mimeType: file.type,\n size: file.size,\n publicUrl: publicUrl\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed: ' + (error instanceof Error ? error.message : 'Unknown error')\n })\n }\n }\n\n // TODO: Cache invalidation removed during migration\n\n // Fetch updated media list to include in response\n let mediaGridHTML = ''\n if (uploadResults.length > 0) {\n try {\n const folderEntry = formData.get('folder')\n const folder = typeof folderEntry === 'string' ? folderEntry : 'uploads'\n const query = 'SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT 24'\n const stmt = c.env.DB.prepare(query)\n const { results } = await stmt.all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n mediaGridHTML = mediaFiles.map(file => renderMediaFileCard(file, 'grid', true)).join('')\n } catch (error) {\n console.error('Error fetching updated media list:', error)\n }\n }\n\n // Return HTMX response with results\n return c.html(html`\n ${uploadResults.length > 0 ? html`\n
\n Successfully uploaded ${uploadResults.length} file${uploadResults.length > 1 ? 's' : ''}\n
\n ` : ''}\n\n ${errors.length > 0 ? html`\n
\n

Upload errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n ${uploadResults.length > 0 ? html`\n \n ` : ''}\n `)\n } catch (error) {\n console.error('Upload error:', error)\n return c.html(html`\n
\n Upload failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Serve files from R2 storage\nadminMediaRoutes.get('/file/*', async (c) => {\n try {\n const r2Key = c.req.path.replace('/admin/media/file/', '')\n \n if (!r2Key) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(r2Key)\n \n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n \n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n})\n\n// Update media file metadata (HTMX compatible)\nadminMediaRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n const formData = await c.req.formData()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Extract form data\n const alt = formData.get('alt') as string || null\n const caption = formData.get('caption') as string || null\n const tagsString = formData.get('tags') as string || ''\n const tags = tagsString ? tagsString.split(',').map(tag => tag.trim()).filter(tag => tag) : []\n\n // Update database\n const updateStmt = c.env.DB.prepare(`\n UPDATE media \n SET alt = ?, caption = ?, tags = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n alt,\n caption,\n JSON.stringify(tags),\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n // TODO: Cache invalidation removed during migration\n\n return c.html(html`\n
\n File updated successfully\n
\n \n `)\n } catch (error) {\n console.error('Update error:', error)\n return c.html(html`\n
\n Update failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Cleanup unused media files (HTMX compatible)\nadminMediaRoutes.delete('/cleanup', requireRole('admin'), async (c) => {\n try {\n const db = c.env.DB\n\n // Find all media files\n const allMediaStmt = db.prepare('SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL')\n const { results: allMedia } = await allMediaStmt.all<{ id: string; r2_key: string; filename: string }>()\n\n // Find media files referenced in content\n // Content can reference media in various JSON fields like data, hero_image, etc.\n const contentStmt = db.prepare('SELECT data FROM content')\n const { results: contentRecords } = await contentStmt.all<{ data: unknown }>()\n\n // Extract all media URLs from content\n const referencedUrls = new Set()\n for (const record of contentRecords || []) {\n if (record.data) {\n const dataStr = typeof record.data === 'string' ? record.data : JSON.stringify(record.data)\n // Find all /files/ URLs in the content\n const urlMatches = dataStr.matchAll(/\\/files\\/([^\\s\"',]+)/g)\n for (const match of urlMatches) {\n referencedUrls.add(match[1]!)\n }\n }\n }\n\n // Find unreferenced media files\n const mediaRows = allMedia || []\n const unusedFiles = mediaRows.filter((file) => !referencedUrls.has(file.r2_key))\n\n if (unusedFiles.length === 0) {\n return c.html(html`\n
\n No unused media files found. All files are referenced in content.\n
\n \n `)\n }\n\n // Delete unused files from R2 and database\n let deletedCount = 0\n const errors = []\n\n for (const file of unusedFiles) {\n try {\n // Delete from R2\n await c.env.MEDIA_BUCKET.delete(file.r2_key)\n\n // Soft delete in database\n const deleteStmt = db.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), file.id).run()\n\n deletedCount++\n } catch (error) {\n console.error(`Failed to delete ${file.filename}:`, error)\n errors.push({\n filename: file.filename,\n error: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Return success response\n return c.html(html`\n
\n Successfully cleaned up ${deletedCount} unused media file${deletedCount !== 1 ? 's' : ''}.\n ${errors.length > 0 ? html`\n
Failed to delete ${errors.length} file${errors.length !== 1 ? 's' : ''}.\n ` : ''}\n
\n\n ${errors.length > 0 ? html`\n
\n

Cleanup errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n \n `)\n } catch (error) {\n console.error('Cleanup error:', error)\n return c.html(html`\n
\n Cleanup failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Delete media file (HTMX compatible)\nadminMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // TODO: Cache invalidation removed during migration\n\n // Return HTMX response that redirects to media library\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Delete error:', error)\n return c.html(html`\n
\n Delete failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length - 8) {\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n const segmentLength = (uint8Array[i + 2]! << 8) | uint8Array[i + 3]!\n i += 2 + segmentLength\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\n// Helper function to generate media item HTML\nfunction generateMediaItemHTML(file: any): string {\n const isImage = file.isImage\n const isVideo = file.isVideo\n \n return `\n
\n
\n ${isImage ? `\n \"${file.alt\n ` : isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n \n
\n
\n \n \n
\n
\n
\n \n
\n

\n ${file.original_name}\n

\n
\n ${file.fileSize}\n ${file.uploadedAt}\n
\n ${file.tags.length > 0 ? `\n
\n ${file.tags.slice(0, 2).map((tag: string) => `\n \n ${tag}\n \n `).join('')}\n ${file.tags.length > 2 ? `+${file.tags.length - 2}` : ''}\n
\n ` : ''}\n
\n
\n `\n}\n\n// Helper function to format file size\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n\nexport { adminMediaRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface Plugin {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error' | 'uninstalled'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n}\n\nexport interface PluginsListPageData {\n plugins: Plugin[]\n stats?: {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderPluginsListPage(data: PluginsListPageData): string {\n const categories = [\n { value: 'content', label: 'Content Management' },\n { value: 'media', label: 'Media' },\n { value: 'editor', label: 'Editors' },\n { value: 'seo', label: 'SEO & Analytics' },\n { value: 'security', label: 'Security' },\n { value: 'utilities', label: 'Utilities' },\n { value: 'system', label: 'System' },\n { value: 'development', label: 'Development' },\n { value: 'demo', label: 'Demo' }\n ];\n\n const statuses = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'uninstalled', label: 'Available to Install' },\n { value: 'error', label: 'Error' }\n ];\n\n // Calculate counts\n const categoryCounts: Record = {};\n categories.forEach(cat => {\n categoryCounts[cat.value] = data.plugins.filter(p => p.category === cat.value).length;\n });\n\n // Sort categories by count (descending)\n categories.sort((a, b) => (categoryCounts[b.value] || 0) - (categoryCounts[a.value] || 0));\n\n const statusCounts: Record = {};\n statuses.forEach(status => {\n statusCounts[status.value] = data.plugins.filter(p => p.status === status.value).length;\n });\n\n // Sort statuses by count (descending)\n statuses.sort((a, b) => (statusCounts[b.value] || 0) - (statusCounts[a.value] || 0));\n\n const pageContent = `\n
\n \n
\n
\n

Plugins

\n

Manage and extend functionality with plugins

\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n
\n

\n Experimental Feature\n

\n
\n

\n Plugin management is currently under active development. While functional, some features may change or have limitations.\n Please report any issues you encounter on our Discord community.\n

\n
\n
\n
\n
\n\n
\n \n \n\n \n
\n \n
\n
\n
Total
\n
${data.stats?.total || 0}
\n
\n
\n
Active
\n
${data.stats?.active || 0}
\n
\n
\n
Available
\n
${data.stats?.uninstalled || 0}
\n
\n
\n
Errors
\n
${data.stats?.errors || 0}
\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n \n
\n\n
\n \n\n \n \n \n \n \n
\n
\n\n \n
\n ${data.plugins.map(plugin => renderPluginCard(plugin)).join('')}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'uninstall-plugin-confirm',\n title: 'Uninstall Plugin',\n message: 'Are you sure you want to uninstall this plugin? This action cannot be undone.',\n confirmText: 'Uninstall',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performUninstallPlugin()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Plugins',\n pageTitle: 'Plugin Management',\n currentPath: '/admin/plugins',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderPluginCard(plugin: Plugin): string {\n const statusColors = {\n active: 'bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-400 ring-emerald-600/20',\n inactive: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-zinc-600/20',\n error: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-red-600/20',\n uninstalled: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-600 dark:text-zinc-500 ring-zinc-600/20'\n }\n\n const statusIcons = {\n active: '
',\n inactive: '
',\n error: '
',\n uninstalled: '
'\n }\n\n // Core system plugins that cannot be deactivated\n const criticalCorePlugins = ['core-auth', 'core-media']\n const canToggle = !criticalCorePlugins.includes(plugin.id)\n\n let actionButton = ''\n if (plugin.status === 'uninstalled') {\n actionButton = ``\n } else {\n const isActive = plugin.status === 'active';\n const action = isActive ? 'deactivate' : 'activate';\n // Use bg-emerald-600 for active, bg-zinc-200 (light) / bg-zinc-700 (dark) for inactive\n const bgClass = isActive ? 'bg-emerald-600' : 'bg-zinc-200 dark:bg-zinc-700';\n const translateClass = isActive ? 'translate-x-5' : 'translate-x-0';\n \n if (canToggle) {\n actionButton = `\n \n `\n } else {\n // Critical core plugins cannot be toggled\n actionButton = `\n
\n \n
\n `\n }\n }\n\n return `\n
\n
\n
\n
\n ${plugin.icon || getDefaultPluginIcon(plugin.category)}\n
\n
\n
\n

${plugin.displayName}

\n \n ${statusIcons[plugin.status]}${plugin.status.charAt(0).toUpperCase() + plugin.status.slice(1)}\n \n
\n

v${plugin.version} • ${plugin.author}

\n
\n
\n \n
\n ${!plugin.isCore && plugin.status !== 'uninstalled' ? `\n \n ` : ''}\n
\n
\n\n

${plugin.description}

\n\n
\n \n ${plugin.category}\n \n ${plugin.isCore ? 'Core' : ''}\n \n ${plugin.dependencies && plugin.dependencies.map(dep => `\n \n ${dep}\n \n `).join('') || ''}\n
\n\n
\n
\n ${actionButton}\n
\n
\n
\n `\n}\n\nfunction getDefaultPluginIcon(category: string): string {\n const iconColor = 'text-zinc-600 dark:text-zinc-400'\n\n const icons: Record = {\n 'content': `\n \n \n \n `,\n 'media': `\n \n \n \n `,\n 'seo': `\n \n \n \n `,\n 'analytics': `\n \n \n \n `,\n 'ecommerce': `\n \n \n \n `,\n 'email': `\n \n \n \n `,\n 'workflow': `\n \n \n \n `,\n 'security': `\n \n \n \n `,\n 'social': `\n \n \n \n `,\n 'utility': `\n \n \n \n \n `,\n }\n\n const iconKey = category.toLowerCase() as keyof typeof icons\n return icons[iconKey] || icons['utility'] || ''\n}\n\n// Mock data generator\nexport function generateMockPlugins(): Plugin[] {\n return [\n {\n id: '1',\n name: 'seo-optimizer',\n displayName: 'SEO Optimizer',\n description: 'Advanced SEO optimization tools including meta tag management, sitemap generation, and analytics integration. Boost your search engine rankings with automated optimizations.',\n version: '2.1.4',\n author: 'SonicJS Team',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 15420,\n rating: 4.8,\n lastUpdated: '2 days ago',\n dependencies: ['analytics-plugin'],\n permissions: ['read:content', 'write:meta'],\n isCore: true\n },\n {\n id: '2',\n name: 'image-optimizer',\n displayName: 'Image Optimizer',\n description: 'Automatically compress and optimize images on upload. Supports WebP conversion, lazy loading, and responsive image generation for better performance.',\n version: '1.5.2',\n author: 'MediaPro',\n status: 'active',\n category: 'media',\n icon: ``,\n downloadCount: 8930,\n rating: 4.6,\n lastUpdated: '1 week ago',\n dependencies: [],\n permissions: ['write:media', 'read:settings']\n },\n {\n id: '3',\n name: 'backup-manager',\n displayName: 'Backup Manager',\n description: 'Automated backup solution for content and media files. Schedule regular backups to cloud storage with encryption and restore capabilities.',\n version: '3.0.1',\n author: 'BackupCorp',\n status: 'inactive',\n category: 'utilities',\n icon: ``,\n downloadCount: 12450,\n rating: 4.9,\n lastUpdated: '3 days ago',\n dependencies: ['cloud-storage'],\n permissions: ['read:all', 'write:backups']\n },\n {\n id: '4',\n name: 'security-scanner',\n displayName: 'Security Scanner',\n description: 'Real-time security monitoring and vulnerability scanning. Detects malware, suspicious activities, and provides security recommendations.',\n version: '1.2.8',\n author: 'SecureWeb',\n status: 'error',\n category: 'security',\n icon: ``,\n downloadCount: 5680,\n rating: 4.3,\n lastUpdated: '5 days ago',\n dependencies: ['security-core'],\n permissions: ['read:logs', 'read:files', 'write:security']\n },\n {\n id: '5',\n name: 'social-share',\n displayName: 'Social Share',\n description: 'Easy social media sharing buttons and Open Graph meta tag generation. Supports all major social platforms with customizable styling.',\n version: '2.3.0',\n author: 'SocialPlus',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 22100,\n rating: 4.7,\n lastUpdated: '4 days ago',\n dependencies: [],\n permissions: ['read:content', 'write:meta']\n },\n {\n id: '6',\n name: 'analytics-pro',\n displayName: 'Analytics Pro',\n description: 'Advanced analytics dashboard with custom tracking events, conversion funnels, and detailed visitor insights. GDPR compliant with privacy controls.',\n version: '4.1.2',\n author: 'AnalyticsPro Inc',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 18750,\n rating: 4.9,\n lastUpdated: '1 day ago',\n dependencies: ['gdpr-compliance'],\n permissions: ['read:analytics', 'write:tracking', 'read:users']\n },\n {\n id: '7',\n name: 'form-builder',\n displayName: 'Advanced Form Builder',\n description: 'Drag-and-drop form builder with conditional logic, file uploads, payment integration, and email notifications. Perfect for contact forms and surveys.',\n version: '1.8.5',\n author: 'FormWorks',\n status: 'inactive',\n category: 'content',\n icon: ``,\n downloadCount: 9870,\n rating: 4.4,\n lastUpdated: '1 week ago',\n dependencies: ['email-service'],\n permissions: ['write:forms', 'read:submissions', 'send:emails']\n },\n {\n id: '8',\n name: 'cache-optimizer',\n displayName: 'Cache Optimizer',\n description: 'Intelligent caching system with Redis support, CDN integration, and automatic cache invalidation. Dramatically improves site performance.',\n version: '2.7.3',\n author: 'SpeedBoost',\n status: 'active',\n category: 'utilities',\n icon: ``,\n downloadCount: 13240,\n rating: 4.8,\n lastUpdated: '6 days ago',\n dependencies: ['redis-connector'],\n permissions: ['read:cache', 'write:cache', 'manage:cdn'],\n isCore: true\n },\n {\n id: '9',\n name: 'multilingual',\n displayName: 'Multilingual Support',\n description: 'Complete internationalization solution with automatic translation, language detection, and localized content management for global websites.',\n version: '3.2.1',\n author: 'GlobalWeb',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 7650,\n rating: 4.5,\n lastUpdated: '2 weeks ago',\n dependencies: ['translation-api'],\n permissions: ['read:content', 'write:translations', 'manage:languages']\n }\n ]\n}\n","import type { AuthSettings } from '../../services/auth-validation'\n\nexport function renderAuthSettingsForm(settings: AuthSettings): string {\n const fields = settings.requiredFields\n const validation = settings.validation\n const registration = settings.registration\n\n return `\n
\n \n
\n

Registration Fields

\n

Configure which fields are required during user registration and their minimum lengths.

\n\n
\n ${Object.entries(fields).map(([fieldName, config]: [string, any]) => `\n
\n
\n
\n

${config.label}

\n

Field type: ${config.type}

\n
\n \n
\n\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n `).join('')}\n
\n
\n\n \n
\n

Password Requirements

\n

Additional password complexity requirements.

\n\n
\n
\n
\n \n

Password must contain at least one uppercase letter (A-Z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one lowercase letter (a-z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one number (0-9)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one special character (!@#$%^&*)

\n
\n \n
\n
\n
\n\n \n
\n

Registration Settings

\n

General registration behavior.

\n\n
\n
\n
\n \n

Enable or disable public user registration

\n
\n \n
\n\n
\n
\n \n

Users must verify their email before accessing the system

\n
\n \n
\n\n
\n \n \n \n \n \n \n

Role assigned to new users upon registration

\n
\n
\n
\n\n \n
\n

Validation Settings

\n

Additional validation rules.

\n\n
\n
\n
\n \n

Validate that email addresses are in correct format

\n
\n \n
\n\n
\n
\n \n

Ensure usernames are unique across all users

\n
\n \n
\n
\n
\n
\n `\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAuthSettingsForm } from '../components/auth-settings-form.template'\nimport type { AuthSettings } from '../../services/auth-validation'\n\n/**\n * Escape HTML attribute values to prevent XSS\n */\nfunction escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport interface PluginSettings {\n [key: string]: any\n}\n\nexport interface PluginActivity {\n id: string\n action: string\n message: string\n timestamp: number\n user?: string\n}\n\nexport interface PluginSettingsPageData {\n plugin: {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n settings?: PluginSettings\n }\n activity?: PluginActivity[]\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderPluginSettingsPage(data: PluginSettingsPageData): string {\n const { plugin, activity = [], user } = data\n \n const pageContent = `\n
\n \n
\n
\n

Plugin Settings

\n

\n ${plugin.description}\n

\n
\n \n
\n\n \n
\n
\n
\n
\n ${plugin.icon || plugin.displayName.charAt(0).toUpperCase()}\n
\n
\n

${plugin.displayName}

\n
\n v${plugin.version}\n by ${plugin.author}\n ${plugin.category}\n ${plugin.downloadCount ? `${plugin.downloadCount.toLocaleString()} downloads` : ''}\n ${plugin.rating ? `★ ${plugin.rating}` : ''}\n
\n
\n
\n\n
\n ${renderStatusBadge(plugin.status)}\n ${renderToggleButton(plugin)}\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n \n
\n ${renderSettingsTab(plugin)}\n
\n\n \n
\n ${renderActivityTab(activity)}\n
\n\n \n
\n ${renderInformationTab(plugin)}\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${plugin.displayName} Settings`,\n pageTitle: `${plugin.displayName} Settings`,\n currentPath: `/admin/plugins/${plugin.id}`,\n user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction renderStatusBadge(status: string): string {\n const statusColors: Record = {\n active: 'bg-green-900/50 text-green-300 border-green-600/30',\n inactive: 'bg-gray-800/50 text-gray-400 border-gray-600/30',\n error: 'bg-red-900/50 text-red-300 border-red-600/30'\n }\n\n const statusIcons: Record = {\n active: '
',\n inactive: '
',\n error: '
'\n }\n\n return `\n \n ${statusIcons[status] || statusIcons.inactive}${status.charAt(0).toUpperCase() + status.slice(1)}\n \n `\n}\n\nfunction renderToggleButton(plugin: any): string {\n if (plugin.isCore) {\n return 'Core Plugin'\n }\n\n return plugin.status === 'active' \n ? ``\n : ``\n}\n\nfunction renderSettingsTab(plugin: any): string {\n const settings = plugin.settings || {}\n const pluginId = plugin.id || plugin.name\n\n // Check for custom settings component first\n const customRenderer = pluginSettingsComponents[pluginId]\n if (customRenderer) {\n return `\n
\n ${customRenderer(plugin, settings)}\n\n
\n \n Save Settings\n \n
\n
\n `\n }\n\n const isSeedDataPlugin = plugin.id === 'seed-data' || plugin.name === 'seed-data'\n const isAuthPlugin = plugin.id === 'core-auth' || plugin.name === 'core-auth'\n const isTurnstilePlugin = plugin.id === 'turnstile' || plugin.name === 'turnstile'\n\n return `\n ${isSeedDataPlugin ? `\n
\n
\n
\n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n
\n \n \n \n \n Open Seed Data Tool\n \n
\n
\n ` : ''}\n\n
\n ${isAuthPlugin ? `\n

Authentication Settings

\n

Configure user registration fields and validation rules.

\n ` : isTurnstilePlugin ? `\n

Cloudflare Turnstile Settings

\n

Configure CAPTCHA-free bot protection for your forms.

\n ` : `\n

Plugin Settings

\n `}\n\n
\n ${isAuthPlugin && Object.keys(settings).length > 0\n ? renderAuthSettingsForm(settings as AuthSettings)\n : isTurnstilePlugin && Object.keys(settings).length > 0\n ? renderTurnstileSettingsForm(settings)\n : Object.keys(settings).length > 0\n ? renderSettingsFields(settings)\n : renderNoSettings(plugin)\n }\n\n ${Object.keys(settings).length > 0 ? `\n
\n \n Save Settings\n \n
\n ` : ''}\n
\n
\n `\n}\n\nfunction renderSettingsFields(settings: PluginSettings): string {\n return Object.entries(settings).map(([key, value]) => {\n const fieldId = `setting_${key}`\n const displayName = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase())\n \n if (typeof value === 'boolean') {\n return `\n
\n
\n \n

Enable or disable this feature

\n
\n \n
\n `\n } else if (typeof value === 'number') {\n return `\n
\n \n \n
\n `\n } else {\n return `\n
\n \n \n
\n `\n }\n }).join('')\n}\n\nfunction renderTurnstileSettingsForm(settings: any): string {\n const inputClass = \"backdrop-blur-sm bg-white/10 border border-white/20 rounded-lg px-3 py-2 text-white placeholder-gray-300 focus:border-blue-400 focus:outline-none transition-colors w-full\"\n const selectClass = \"backdrop-blur-sm bg-zinc-800 border border-white/20 rounded-lg px-3 py-2 text-white focus:border-blue-400 focus:outline-none transition-colors w-full [&>option]:bg-zinc-800 [&>option]:text-white\"\n \n return `\n \n
\n
\n \n

Enable or disable Turnstile verification globally

\n
\n \n
\n\n \n
\n \n \n

Your Cloudflare Turnstile site key (public)

\n
\n\n \n
\n \n \n

Your Cloudflare Turnstile secret key (private)

\n
\n\n \n
\n \n \n

Visual appearance of the Turnstile widget

\n
\n\n \n
\n \n \n

Size of the Turnstile challenge widget

\n
\n\n \n
\n \n \n

Managed: Shows challenge only when needed. Non-Interactive: Always shows but doesn't require interaction. Invisible: Runs in background without UI.

\n
\n\n \n
\n \n \n

Controls when Turnstile verification occurs. Always: Verifies immediately (pre-clearance). Execute: Verifies on form submit. Interaction Only: Only after user interaction.

\n
\n `\n}\n\nfunction renderNoSettings(plugin: any): string {\n // Special handling for seed-data plugin\n if (plugin.id === 'seed-data' || plugin.name === 'seed-data') {\n return `\n
\n \n \n \n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n \n \n \n \n Generate Seed Data\n \n
\n `\n }\n\n return `\n
\n \n \n \n \n

No Settings Available

\n

This plugin doesn't have any configurable settings.

\n
\n `\n}\n\nfunction renderActivityTab(activity: PluginActivity[]): string {\n return `\n
\n

Activity Log

\n \n ${activity.length > 0 ? `\n
\n ${activity.map(item => `\n
\n
\n
\n
\n ${item.action}\n ${formatTimestamp(item.timestamp)}\n
\n

${item.message}

\n ${item.user ? `

by ${item.user}

` : ''}\n
\n
\n `).join('')}\n
\n ` : `\n
\n \n \n \n

No Activity

\n

No recent activity for this plugin.

\n
\n `}\n
\n `\n}\n\nfunction renderInformationTab(plugin: any): string {\n return `\n
\n \n
\n

Plugin Details

\n
\n
\n Name:\n ${plugin.displayName}\n
\n
\n Version:\n ${plugin.version}\n
\n
\n Author:\n ${plugin.author}\n
\n
\n Category:\n ${plugin.category}\n
\n
\n Status:\n ${plugin.status}\n
\n
\n Last Updated:\n ${plugin.lastUpdated}\n
\n
\n
\n\n \n
\n

Dependencies & Permissions

\n \n ${plugin.dependencies && plugin.dependencies.length > 0 ? `\n
\n

Dependencies:

\n
\n ${plugin.dependencies.map((dep: string) => `\n
${dep}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${plugin.permissions && plugin.permissions.length > 0 ? `\n
\n

Permissions:

\n
\n ${plugin.permissions.map((perm: string) => `\n
${perm}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${(!plugin.dependencies || plugin.dependencies.length === 0) && (!plugin.permissions || plugin.permissions.length === 0) ? `\n

No dependencies or special permissions required.

\n ` : ''}\n
\n
\n `\n}\n\nfunction formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp * 1000)\n return date.toLocaleString()\n}\n\n// ==================== Plugin Settings Components ====================\n// These render just the settings content, embedded within the shared layout\n\n/**\n * Registry of custom plugin settings components\n * Plugins with custom settings UI register their render functions here\n */\ntype PluginSettingsRenderer = (plugin: any, settings: PluginSettings) => string\n\nconst pluginSettingsComponents: Record = {\n 'otp-login': renderOTPLoginSettingsContent,\n 'email': renderEmailSettingsContent,\n}\n\n/**\n * OTP Login plugin settings content\n */\nfunction renderOTPLoginSettingsContent(plugin: any, settings: PluginSettings): string {\n const siteName = settings.siteName || 'SonicJS'\n const emailConfigured = settings._emailConfigured || false\n const codeLength = settings.codeLength || 6\n const codeExpiryMinutes = settings.codeExpiryMinutes || 10\n const maxAttempts = settings.maxAttempts || 3\n const rateLimitPerHour = settings.rateLimitPerHour || 5\n const allowNewUserRegistration = settings.allowNewUserRegistration || false\n const logoUrl = settings.logoUrl || ''\n const logoWidth = Number(settings.logoWidth) || 150\n const logoBorderWidth = Number(settings.logoBorderWidth) || 0\n const logoBorderColor = settings.logoBorderColor || '#ffffff'\n const loginUrl = settings.loginUrl || ''\n const loginButtonText = settings.loginButtonText || ''\n const previewButtonText = loginButtonText.trim() || `Sign in to ${siteName}`\n const previewLogoBorder = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${escapeHtmlAttr(logoBorderColor)}; border-radius: 8px;`\n : ''\n\n return `\n
\n \n
\n

\n 📧 Test OTP Email\n

\n\n ${!emailConfigured ? `\n
\n

\n ⚠️ Email not configured.\n Configure the Email plugin\n to send real emails. Dev mode will show codes in the response.\n

\n
\n ` : `\n
\n

\n ✅ Email configured. Test emails will be sent via Resend.\n

\n
\n `}\n\n
\n
\n \n \n
\n\n \n Send Test Code\n \n \n \n \n \n \n \n \n\n
\n\n \n
\n

Verify Code

\n
\n
\n \n \n
\n \n Verify Code\n \n \n
\n
\n
\n\n \n
\n

Code Settings

\n\n
\n
\n \n \n

Optional. Displayed at the top of the OTP email.

\n
\n\n
\n
\n \n \n

Max width of the logo (20-600).

\n
\n\n
\n \n \n

0 disables the border.

\n
\n\n
\n \n
\n \n \n
\n

Hex, rgb(), or named color.

\n
\n
\n\n
\n \n \n

Optional. If set, a \"Sign in\" button is added to the email.

\n
\n\n
\n \n \n

Optional. Defaults to \"Sign in to ${siteName}\".

\n
\n\n
\n
\n \n \n

Number of digits (4-8)

\n
\n\n
\n \n \n

How long codes remain valid

\n
\n\n
\n \n \n

Max verification attempts

\n
\n\n
\n \n \n

Max requests per email per hour

\n
\n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

\n 👁️ Email Preview\n

\n

\n This is how the OTP email will appear to users. The site name \"${siteName}\" is configured in\n General Settings.\n

\n\n
\n
\n ${logoUrl ? `\"Logo\"` : ''}\n

Your Login Code

\n

Enter this code to sign in to ${siteName}

\n
\n\n
\n
\n
\n 123456\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${codeExpiryMinutes} minutes\n

\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${siteName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n
\n
\n\n \n
\n

🔢 Features

\n
    \n
  • ✓ Passwordless authentication
  • \n
  • ✓ Secure random code generation
  • \n
  • ✓ Rate limiting protection
  • \n
  • ✓ Brute force prevention
  • \n
  • ✓ Mobile-friendly UX
  • \n
\n
\n\n \n \n
\n\n \n `\n}\n\n/**\n * Email plugin settings content\n */\nfunction renderEmailSettingsContent(plugin: any, settings: PluginSettings): string {\n const apiKey = settings.apiKey || ''\n const fromEmail = settings.fromEmail || ''\n const fromName = settings.fromName || ''\n const replyTo = settings.replyTo || ''\n const logoUrl = settings.logoUrl || ''\n\n return `\n
\n \n
\n

Resend Configuration

\n\n
\n \n
\n \n \n

\n Get your API key from resend.com/api-keys\n

\n
\n\n \n
\n \n \n

Must be a verified domain in Resend

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n

Logo to display in email templates

\n
\n
\n
\n\n \n
\n

Send Test Email

\n
\n \n \n Send Test\n \n
\n
\n
\n\n \n
\n

📧 Email Templates Included

\n
    \n
  • ✓ Registration confirmation
  • \n
  • ✓ Email verification
  • \n
  • ✓ Password reset
  • \n
  • ✓ One-time code (2FA)
  • \n
\n

\n Templates are code-based and can be customized by editing the plugin files.\n

\n
\n
\n\n \n `\n}\n\n/**\n * Check if a plugin has a custom settings component\n */\nexport function hasCustomSettingsComponent(pluginId: string): boolean {\n return pluginId in pluginSettingsComponents\n}\n\n/**\n * Get the custom settings component for a plugin\n */\nexport function getCustomSettingsComponent(pluginId: string): PluginSettingsRenderer | undefined {\n return pluginSettingsComponents[pluginId]\n}","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderPluginsListPage, PluginsListPageData, Plugin } from '../templates/pages/admin-plugins-list.template'\nimport { renderPluginSettingsPage, PluginSettingsPageData } from '../templates/pages/admin-plugin-settings.template'\nimport { SettingsService } from '../services/settings'\nimport { PluginService } from '../services'\nimport { PLUGIN_REGISTRY, findPluginByCodeName } from '../plugins/manifest-registry'\nimport type { Bindings, Variables } from '../app'\n\nconst adminPluginRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminPluginRoutes.use('*', requireAuth())\n\n// Build available plugins list from the auto-generated registry.\n// To add a new plugin to this list, create a manifest.json in the plugin directory\n// and run: node packages/scripts/generate-plugin-registry.mjs\nconst AVAILABLE_PLUGINS = Object.values(PLUGIN_REGISTRY).map(p => ({\n id: p.id,\n name: p.codeName,\n display_name: p.displayName,\n description: p.description,\n version: p.version,\n author: p.author,\n category: p.category,\n icon: p.iconEmoji,\n permissions: p.permissions,\n dependencies: p.dependencies,\n is_core: p.is_core\n}))\n\n// Plugin list page\nadminPluginRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n // TODO: Fix permission system\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n\n const pluginService = new PluginService(db)\n\n // Get all installed plugins with error handling\n let installedPlugins: any[] = []\n let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 }\n\n try {\n installedPlugins = await pluginService.getAllPlugins()\n stats = await pluginService.getPluginStats()\n } catch (error) {\n console.error('Error loading plugins:', error)\n // Continue with empty data\n }\n\n // Get list of installed plugin IDs\n const installedPluginIds = new Set(installedPlugins.map(p => p.id))\n\n // Find uninstalled plugins\n const uninstalledPlugins = AVAILABLE_PLUGINS.filter(p => !installedPluginIds.has(p.id))\n\n // Map installed plugins to template format\n const templatePlugins: Plugin[] = installedPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: p.status,\n category: p.category,\n icon: p.icon,\n downloadCount: p.download_count,\n rating: p.rating,\n lastUpdated: formatLastUpdated(p.last_updated),\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Add uninstalled plugins to the list\n const uninstalledTemplatePlugins: Plugin[] = uninstalledPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: 'uninstalled' as const,\n category: p.category,\n icon: p.icon,\n downloadCount: 0,\n rating: 0,\n lastUpdated: 'Not installed',\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Combine installed and uninstalled plugins\n const allPlugins = [...templatePlugins, ...uninstalledTemplatePlugins]\n\n // Update stats with uninstalled count\n stats.uninstalled = uninstalledPlugins.length\n stats.total = installedPlugins.length + uninstalledPlugins.length\n\n const pageData: PluginsListPageData = {\n plugins: allPlugins,\n stats,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n },\n version: c.get('appVersion')\n }\n\n return c.html(renderPluginsListPage(pageData))\n } catch (error) {\n console.error('Error loading plugins page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Get plugin settings page\nadminPluginRoutes.get('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Check authorization first\n if (user?.role !== 'admin') {\n return c.redirect('/admin/plugins')\n }\n\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin(pluginId)\n\n if (!plugin) {\n return c.text('Plugin not found', 404)\n }\n\n // Get activity log\n const activity = await pluginService.getPluginActivity(pluginId, 20)\n\n // Load additional context for plugins with custom settings components\n let enrichedSettings = plugin.settings || {}\n\n // For OTP Login plugin, add site name and email config status\n if (pluginId === 'otp-login') {\n // Get site name from general settings via SettingsService\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName || 'SonicJS'\n\n // Check if email plugin is configured\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n let emailConfigured = false\n if (emailPlugin?.settings) {\n try {\n const emailSettings = JSON.parse(emailPlugin.settings)\n emailConfigured = !!(emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName)\n } catch (e) { /* ignore */ }\n }\n\n enrichedSettings = {\n ...enrichedSettings,\n siteName,\n _emailConfigured: emailConfigured\n }\n }\n\n // Map plugin data to template format\n const templatePlugin = {\n id: plugin.id,\n name: plugin.name,\n displayName: plugin.display_name,\n description: plugin.description,\n version: plugin.version,\n author: plugin.author,\n status: plugin.status,\n category: plugin.category,\n icon: plugin.icon,\n downloadCount: plugin.download_count,\n rating: plugin.rating,\n lastUpdated: formatLastUpdated(plugin.last_updated),\n dependencies: plugin.dependencies,\n permissions: plugin.permissions,\n isCore: plugin.is_core,\n settings: enrichedSettings\n }\n\n // Map activity data\n const templateActivity = (activity || []).map(item => ({\n id: item.id,\n action: item.action,\n message: item.message,\n timestamp: item.timestamp,\n user: item.user_email\n }))\n\n const pageData: PluginSettingsPageData = {\n plugin: templatePlugin,\n activity: templateActivity,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n }\n }\n\n return c.html(renderPluginSettingsPage(pageData))\n } catch (error) {\n console.error('Error getting plugin settings page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Activate plugin\nadminPluginRoutes.post('/:id/activate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.activatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error activating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to activate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Deactivate plugin\nadminPluginRoutes.post('/:id/deactivate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.deactivatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deactivating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to deactivate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Generic install handler - uses the auto-generated plugin registry.\n// No per-plugin switch/case needed. Adding a manifest.json is enough.\nadminPluginRoutes.post('/install', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const body = await c.req.json()\n const pluginService = new PluginService(db)\n\n // Look up plugin in registry by codeName (what the frontend sends as body.name)\n // or by id\n const registryEntry = findPluginByCodeName(body.name)\n || PLUGIN_REGISTRY[body.name]\n || PLUGIN_REGISTRY[body.id]\n\n if (!registryEntry) {\n return c.json({ error: 'Plugin not found in registry' }, 404)\n }\n\n const plugin = await pluginService.installPlugin({\n id: registryEntry.id,\n name: registryEntry.codeName,\n display_name: registryEntry.displayName,\n description: registryEntry.description,\n version: registryEntry.version,\n author: registryEntry.author,\n category: registryEntry.category,\n icon: registryEntry.iconEmoji,\n permissions: registryEntry.permissions,\n dependencies: registryEntry.dependencies,\n is_core: registryEntry.is_core,\n settings: registryEntry.defaultSettings,\n })\n\n return c.json({ success: true, plugin })\n } catch (error) {\n console.error('Error installing plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to install plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Uninstall plugin\nadminPluginRoutes.post('/:id/uninstall', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.uninstallPlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error uninstalling plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to uninstall plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Update plugin settings\nadminPluginRoutes.post('/:id/settings', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const settings = await c.req.json()\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings(pluginId, settings)\n\n // Clear auth validation cache if updating core-auth plugin\n if (pluginId === 'core-auth') {\n try {\n const cacheKv = c.env.CACHE_KV\n if (cacheKv) {\n await cacheKv.delete('auth:settings')\n await cacheKv.delete('auth:registration-enabled')\n console.log('[AuthSettings] Cache cleared after updating authentication settings')\n }\n } catch (cacheError) {\n console.error('[AuthSettings] Failed to clear cache:', cacheError)\n }\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating plugin settings:', error)\n const message = error instanceof Error ? error.message : 'Failed to update settings'\n return c.json({ error: message }, 400)\n }\n})\n\n// Helper function to format last updated time\nfunction formatLastUpdated(timestamp: number): string {\n const now = Date.now() / 1000\n const diff = now - timestamp\n\n if (diff < 60) return 'just now'\n if (diff < 3600) return `${Math.floor(diff / 60)} minutes ago`\n if (diff < 86400) return `${Math.floor(diff / 3600)} hours ago`\n if (diff < 604800) return `${Math.floor(diff / 86400)} days ago`\n if (diff < 2592000) return `${Math.floor(diff / 604800)} weeks ago`\n return `${Math.floor(diff / 2592000)} months ago`\n}\n\nexport { adminPluginRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogEntry {\n id: string\n level: string\n category: string\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags: string[]\n source?: string\n createdAt: Date\n formattedDate: string\n formattedDuration?: string\n levelClass: string\n categoryClass: string\n}\n\nexport interface LogsListPageData {\n logs: LogEntry[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n baseUrl: string\n }\n filters: {\n level: string\n category: string\n search: string\n startDate: string\n endDate: string\n source: string\n }\n user?: BaseUser\n}\n\nexport function renderLogsListPage(data: LogsListPageData) {\n const { logs, pagination, filters, user } = data\n\n const content = `\n
\n
\n
\n

System Logs

\n

\n Monitor and analyze system activity, errors, and performance metrics.\n

\n
\n
\n \n Configure\n \n \n Export\n \n
\n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n Apply Filters\n \n \n Clear\n \n
\n
\n\n
\n ${pagination.totalItems} ${pagination.totalItems === 1 ? 'entry' : 'entries'}\n
\n
\n
\n
\n
\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
\n Level\n \n Category\n \n Message\n \n Source\n \n Time\n \n Actions\n
\n \n ${log.level}\n \n \n \n ${log.category}\n \n \n
\n
${log.message}
\n ${log.url ? `
${log.method} ${log.url}
` : ''}\n ${log.duration ? `
${log.formattedDuration}
` : ''}\n
\n
\n ${log.source || '-'}\n \n ${log.formattedDate}\n \n \n View Details\n \n
\n
\n\n ${logs.length === 0 ? `\n
\n \n \n \n

No log entries

\n

No log entries found matching your criteria.

\n
\n ` : ''}\n
\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : `\n \n Previous\n \n `}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : `\n \n Next\n \n `}\n
\n
\n
\n

\n Showing ${pagination.startItem} to ${pagination.endItem} of{' '}\n ${pagination.totalItems} results\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'System Logs',\n pageTitle: 'System Logs',\n currentPath: '/admin/logs',\n user,\n content\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport { LogEntry } from './admin-logs-list.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogDetailsPageData {\n log: LogEntry\n user?: BaseUser\n}\n\nexport function renderLogDetailsPage(data: LogDetailsPageData) {\n const { log, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Details

\n

\n Detailed information for log entry ${log.id}\n

\n
\n
\n\n
\n
\n
\n

Log Entry Information

\n
\n \n ${log.level}\n \n \n ${log.category}\n \n
\n
\n
\n \n
\n
\n
\n
ID
\n
${log.id}
\n
\n \n
\n
Timestamp
\n
${log.formattedDate}
\n
\n \n
\n
Level
\n
\n \n ${log.level}\n \n
\n
\n \n
\n
Category
\n
\n \n ${log.category}\n \n
\n
\n \n ${log.source ? html`\n
\n
Source
\n
${log.source}
\n
\n ` : ''}\n \n ${log.userId ? html`\n
\n
User ID
\n
${log.userId}
\n
\n ` : ''}\n \n ${log.sessionId ? html`\n
\n
Session ID
\n
${log.sessionId}
\n
\n ` : ''}\n \n ${log.requestId ? html`\n
\n
Request ID
\n
${log.requestId}
\n
\n ` : ''}\n \n ${log.ipAddress ? html`\n
\n
IP Address
\n
${log.ipAddress}
\n
\n ` : ''}\n \n ${log.method && log.url ? html`\n
\n
HTTP Request
\n
\n ${log.method} ${log.url}\n ${log.statusCode ? html`(${log.statusCode})` : ''}\n
\n
\n ` : ''}\n \n ${log.duration ? html`\n
\n
Duration
\n
${log.formattedDuration}
\n
\n ` : ''}\n \n ${log.userAgent ? html`\n
\n
User Agent
\n
${log.userAgent}
\n
\n ` : ''}\n
\n
\n
\n\n \n
\n
\n

Message

\n
\n
\n
\n ${log.message}\n
\n
\n
\n\n \n ${log.tags && log.tags.length > 0 ? html`\n
\n
\n

Tags

\n
\n
\n
\n ${log.tags.map(tag => html`\n \n ${tag}\n \n `).join('')}\n
\n
\n
\n ` : ''}\n\n \n ${log.data ? html`\n
\n
\n

Additional Data

\n
\n
\n
${JSON.stringify(log.data, null, 2)}
\n
\n
\n ` : ''}\n\n \n ${log.stackTrace ? html`\n
\n
\n

Stack Trace

\n
\n
\n
${log.stackTrace}
\n
\n
\n ` : ''}\n\n \n
\n \n ← Back to Logs\n \n \n
\n ${log.level === 'error' || log.level === 'fatal' ? html`\n \n Report Issue\n \n ` : ''}\n \n alert('Log details copied to clipboard'))\"\n >\n Copy Details\n \n
\n
\n
\n `\n\n return adminLayoutV2({\n title: `Log Details - ${log.id}`,\n user,\n content: content as string\n })\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport type { LogConfig } from '../../db/schema'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogConfigPageData {\n configs: LogConfig[]\n user?: BaseUser\n}\n\nexport function renderLogConfigPage(data: LogConfigPageData) {\n const { configs, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Configuration

\n

\n Configure logging settings for different categories and manage log retention policies.\n

\n
\n
\n \n Run Cleanup\n \n
\n
\n\n
\n\n \n
\n
\n

Log Levels Reference

\n
\n
\n
\n
\n \n debug\n \n

Detailed diagnostic information

\n
\n
\n \n info\n \n

General information messages

\n
\n
\n \n warn\n \n

Warning conditions

\n
\n
\n \n error\n \n

Error conditions

\n
\n
\n \n fatal\n \n

Critical system errors

\n
\n
\n
\n
\n\n \n
\n ${configs.map(config => html`\n
\n
\n
\n

${config.category}

\n
\n ${config.enabled ? html`\n \n Enabled\n \n ` : html`\n \n Disabled\n \n `}\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n \n \n \n \n \n \n

Only logs at this level or higher will be stored

\n
\n \n
\n \n \n

Logs older than this will be deleted

\n
\n \n
\n \n \n

Maximum number of logs to keep for this category

\n
\n
\n \n
\n
\n \n Update Configuration\n \n
\n
\n \n
\n
\n
Created: ${new Date(config.createdAt).toLocaleDateString()}
\n
Updated: ${new Date(config.updatedAt).toLocaleDateString()}
\n
\n
\n
\n `).join('')}\n
\n\n \n
\n
\n

Global Log Settings

\n
\n
\n
\n
\n

Storage Information

\n
\n
\n
-
\n
Total Log Entries
\n
\n
\n
-
\n
Storage Used
\n
\n
\n
-
\n
Oldest Log
\n
\n
\n
\n \n
\n

Log Categories

\n
\n
    \n
  • auth - Authentication and authorization events
  • \n
  • api - API requests and responses
  • \n
  • workflow - Content workflow state changes
  • \n
  • plugin - Plugin-related activities
  • \n
  • media - File upload and media operations
  • \n
  • system - General system events
  • \n
  • security - Security-related events and alerts
  • \n
  • error - General error conditions
  • \n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n return adminLayoutV2({\n title: 'Log Configuration',\n user,\n content: content as string\n })\n}","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { D1Database, KVNamespace } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport { getLogger, type LogLevel, type LogCategory, type LogFilter } from '../services'\nimport { renderLogsListPage, type LogsListPageData } from '../templates/pages/admin-logs-list.template'\nimport { renderLogDetailsPage, type LogDetailsPageData } from '../templates/pages/admin-log-details.template'\nimport { renderLogConfigPage, type LogConfigPageData } from '../templates/pages/admin-log-config.template'\nimport type { Bindings, Variables } from '../app'\n\nconst adminLogsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminLogsRoutes.use('*', requireAuth())\n\n// Main logs listing page\nadminLogsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Use Hono's built-in query method instead of parsing URL\n const query = c.req.query()\n \n // Parse query parameters\n const page = parseInt(query.page || '1')\n const limit = parseInt(query.limit || '50')\n const level = query.level\n const category = query.category\n const search = query.search\n const startDate = query.start_date\n const endDate = query.end_date\n const source = query.source\n \n // Build filter\n const filter: LogFilter = {\n limit,\n offset: (page - 1) * limit,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (search) {\n filter.search = search\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n if (source) {\n filter.source = source\n }\n \n // Get logs and total count\n const { logs, total } = await logger.getLogs(filter)\n \n // Format logs for display\n const formattedLogs = logs.map(log => ({\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }))\n \n const totalPages = Math.ceil(total / limit)\n \n const pageData: LogsListPageData = {\n logs: formattedLogs,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total),\n baseUrl: '/admin/logs'\n },\n filters: {\n level: level || '',\n category: category || '',\n search: search || '',\n startDate: startDate || '',\n endDate: endDate || '',\n source: source || ''\n },\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogsListPage(pageData))\n } catch (error) {\n console.error('Error fetching logs:', error)\n return c.html(html`

Error loading logs: ${error}

`)\n }\n})\n\n// Log details page\nadminLogsRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get single log by ID\n const { logs } = await logger.getLogs({ \n limit: 1, \n offset: 0,\n search: id // Using search to find by ID - this is a simplification\n })\n \n const log = logs.find(l => l.id === id)\n \n if (!log) {\n return c.html(html`

Log entry not found

`)\n }\n \n const formattedLog = {\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n \n const pageData: LogDetailsPageData = {\n log: formattedLog,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogDetailsPage(pageData))\n } catch (error) {\n console.error('Error fetching log details:', error)\n return c.html(html`

Error loading log details: ${error}

`)\n }\n})\n\n// Log configuration page\nadminLogsRoutes.get('/config', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get all log configurations\n const configs = await logger.getAllConfigs()\n \n const pageData: LogConfigPageData = {\n configs,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogConfigPage(pageData))\n } catch (error) {\n console.error('Error fetching log config:', error)\n return c.html(html`

Error loading log configuration: ${error}

`)\n }\n})\n\n// Update log configuration\nadminLogsRoutes.post('/config/:category', async (c) => {\n try {\n const category = c.req.param('category') as LogCategory\n const formData = await c.req.formData()\n \n const enabled = formData.get('enabled') === 'on'\n const level = formData.get('level') as string\n const retention = parseInt(formData.get('retention') as string)\n const maxSize = parseInt(formData.get('max_size') as string)\n \n const logger = getLogger(c.env.DB)\n await logger.updateConfig(category, {\n enabled,\n level,\n retention,\n maxSize\n })\n \n return c.html(html`\n
\n Configuration updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating log config:', error)\n return c.html(html`\n
\n Failed to update configuration. Please try again.\n
\n `)\n }\n})\n\n// Export logs\nadminLogsRoutes.get('/export', async (c) => {\n try {\n const query = c.req.query()\n const format = query.format || 'csv'\n const level = query.level\n const category = query.category\n const startDate = query.start_date\n const endDate = query.end_date\n \n const logger = getLogger(c.env.DB)\n \n // Build filter for export\n const filter: LogFilter = {\n limit: 10000, // Export up to 10k logs\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n const { logs } = await logger.getLogs(filter)\n \n if (format === 'json') {\n return c.json(logs, 200, {\n 'Content-Disposition': 'attachment; filename=\"logs-export.json\"'\n })\n } else {\n // Default to CSV\n const headers = [\n 'ID', 'Level', 'Category', 'Message', 'Source', 'User ID', \n 'IP Address', 'Method', 'URL', 'Status Code', 'Duration', \n 'Created At'\n ]\n const csvRows = [headers.join(',')]\n \n logs.forEach(log => {\n const row = [\n log.id,\n log.level,\n log.category,\n `\"${log.message.replace(/\"/g, '\"\"')}\"`, // Escape quotes\n log.source || '',\n log.userId || '',\n log.ipAddress || '',\n log.method || '',\n log.url || '',\n log.statusCode || '',\n log.duration || '',\n new Date(log.createdAt).toISOString()\n ]\n csvRows.push(row.join(','))\n })\n \n const csv = csvRows.join('\\n')\n \n return new Response(csv, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': 'attachment; filename=\"logs-export.csv\"'\n }\n })\n }\n } catch (error) {\n console.error('Error exporting logs:', error)\n return c.json({ error: 'Failed to export logs' }, 500)\n }\n})\n\n// Clean up old logs\nadminLogsRoutes.post('/cleanup', async (c) => {\n try {\n const user = c.get('user')\n \n // Only allow admin users to run cleanup\n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n \n const logger = getLogger(c.env.DB)\n await logger.cleanupByRetention()\n \n return c.html(html`\n
\n Log cleanup completed successfully!\n
\n `)\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n return c.html(html`\n
\n Failed to clean up logs. Please try again.\n
\n `)\n }\n})\n\n// Search logs (HTMX endpoint)\nadminLogsRoutes.post('/search', async (c) => {\n try {\n const formData = await c.req.formData()\n const search = formData.get('search') as string\n const level = formData.get('level') as string\n const category = formData.get('category') as string\n \n const logger = getLogger(c.env.DB)\n \n const filter: LogFilter = {\n limit: 20,\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (search) filter.search = search\n if (level) filter.level = [level] as LogLevel[]\n if (category) filter.category = [category] as LogCategory[]\n \n const { logs } = await logger.getLogs(filter)\n \n // Return just the logs table rows for HTMX\n const rows = logs.map(log => {\n const formattedLog = {\n ...log,\n formattedDate: new Date(log.createdAt).toLocaleString(),\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n\n return `\n \n \n \n ${formattedLog.level}\n \n \n \n \n ${formattedLog.category}\n \n \n \n
${formattedLog.message}
\n \n ${formattedLog.source || '-'}\n ${formattedLog.formattedDate}\n \n View\n \n \n `\n }).join('')\n\n return c.html(rows)\n } catch (error) {\n console.error('Error searching logs:', error)\n return c.html(html`Error searching logs`)\n }\n})\n\n// Helper functions\nfunction getLevelClass(level: string): string {\n switch (level) {\n case 'debug': return 'bg-gray-100 text-gray-800'\n case 'info': return 'bg-blue-100 text-blue-800'\n case 'warn': return 'bg-yellow-100 text-yellow-800'\n case 'error': return 'bg-red-100 text-red-800'\n case 'fatal': return 'bg-purple-100 text-purple-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nfunction getCategoryClass(category: string): string {\n switch (category) {\n case 'auth': return 'bg-green-100 text-green-800'\n case 'api': return 'bg-blue-100 text-blue-800'\n case 'workflow': return 'bg-purple-100 text-purple-800'\n case 'plugin': return 'bg-indigo-100 text-indigo-800'\n case 'media': return 'bg-pink-100 text-pink-800'\n case 'system': return 'bg-gray-100 text-gray-800'\n case 'security': return 'bg-red-100 text-red-800'\n case 'error': return 'bg-red-100 text-red-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nexport { adminLogsRoutes }","import { Hono } from 'hono'\nimport { renderDesignPage, DesignPageData } from '../templates/pages/admin-design.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminDesignRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminDesignRoutes.get('/', (c) => {\n const user = c.get('user')\n \n const pageData: DesignPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderDesignPage(pageData))\n})","import { Hono } from 'hono'\nimport { renderCheckboxPage, CheckboxPageData } from '../templates/pages/admin-checkboxes.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminCheckboxRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCheckboxRoutes.get('/', (c) => {\n const user = c.get('user')\n\n const pageData: CheckboxPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderCheckboxPage(pageData))\n})\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface Testimonial {\n id?: number\n authorName: string\n authorTitle?: string\n authorCompany?: string\n testimonialText: string\n rating?: number\n isPublished: boolean\n sortOrder: number\n}\n\ninterface TestimonialsFormData {\n testimonial?: Testimonial\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderTestimonialsForm(data: TestimonialsFormData): string {\n const { testimonial, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Testimonial' : 'New Testimonial'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the testimonial details below' : 'Create a new customer testimonial'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Author Information

\n\n \n
\n \n
\n \n
\n ${errors?.authorName ? `\n
\n ${errors.authorName.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.authorTitle ? `\n
\n ${errors.authorTitle.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.authorCompany ? `\n
\n ${errors.authorCompany.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Testimonial

\n\n \n
\n \n
\n \n

\n 0/1000 characters\n

\n
\n ${errors?.testimonialText ? `\n
\n ${errors.testimonialText.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.rating ? `\n
\n ${errors.rating.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/testimonials/${testimonial?.id}` : '/admin/testimonials/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderTestimonialsList } from '../templates/pages/admin-testimonials-list.template'\nimport { renderTestimonialsForm } from '../templates/pages/admin-testimonials-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst testimonialSchema = z.object({\n authorName: z.string().min(1, 'Author name is required').max(100, 'Author name must be under 100 characters'),\n authorTitle: z.string().optional(),\n authorCompany: z.string().optional(),\n testimonialText: z.string().min(1, 'Testimonial is required').max(1000, 'Testimonial must be under 1000 characters'),\n rating: z.string().transform(val => val ? parseInt(val, 10) : undefined).pipe(z.number().min(1).max(5).optional()),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminTestimonialsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminTestimonialsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, minRating, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (minRating) {\n whereClause += ' AND rating >= ?'\n params.push(parseInt(minRating, 10))\n }\n\n if (search) {\n whereClause += ' AND (author_name LIKE ? OR testimonial_text LIKE ? OR author_company LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM testimonials ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM testimonials\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: testimonials } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderTestimonialsList({\n testimonials: testimonials || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonials:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonials',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminTestimonialsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial created successfully')\n } else {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating testimonial:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM testimonials WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/testimonials?message=Testimonial not found&type=error')\n }\n\n const testimonial = results[0] as any\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id: testimonial.id,\n authorName: testimonial.author_name,\n authorTitle: testimonial.author_title,\n authorCompany: testimonial.author_company,\n testimonialText: testimonial.testimonial_text,\n rating: testimonial.rating,\n isPublished: Boolean(testimonial.isPublished),\n sortOrder: testimonial.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonial:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE testimonials\n SET author_name = ?, author_title = ?, author_company = ?, testimonial_text = ?, rating = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial updated successfully')\n } else {\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: validatedData.authorName,\n authorTitle: validatedData.authorTitle,\n authorCompany: validatedData.authorCompany,\n testimonialText: validatedData.testimonialText,\n rating: validatedData.rating,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Testimonial not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating testimonial:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM testimonials WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Testimonial not found' }, 404)\n }\n\n return c.redirect('/admin/testimonials?message=Testimonial deleted successfully')\n } catch (error) {\n console.error('Error deleting testimonial:', error)\n return c.json({ error: 'Failed to delete testimonial' }, 500)\n }\n})\n\nexport default adminTestimonialsRoutes\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface CodeExample {\n id?: number\n title: string\n description?: string\n code: string\n language: string\n category?: string\n tags?: string\n isPublished: boolean\n sortOrder: number\n}\n\ninterface CodeExamplesFormData {\n codeExample?: CodeExample\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderCodeExamplesForm(data: CodeExamplesFormData): string {\n const { codeExample, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Code Example' : 'New Code Example'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the code example details below' : 'Create a new code snippet or example'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Basic Information

\n\n \n
\n \n
\n \n
\n ${errors?.title ? `\n
\n ${errors.title.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

\n 0/500 characters\n

\n
\n ${errors?.description ? `\n
\n ${errors.description.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.language ? `\n
\n ${errors.language.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.category ? `\n
\n ${errors.category.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

Comma-separated tags

\n
\n ${errors?.tags ? `\n
\n ${errors.tags.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Code

\n\n \n
\n \n
\n \n

\n 0 characters\n

\n
\n ${errors?.code ? `\n
\n ${errors.code.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/code-examples/${codeExample?.id}` : '/admin/code-examples/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderCodeExamplesList } from '../templates/pages/admin-code-examples-list.template'\nimport { renderCodeExamplesForm } from '../templates/pages/admin-code-examples-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst codeExampleSchema = z.object({\n title: z.string().min(1, 'Title is required').max(200, 'Title must be under 200 characters'),\n description: z.string().max(500, 'Description must be under 500 characters').optional(),\n code: z.string().min(1, 'Code is required'),\n language: z.string().min(1, 'Language is required'),\n category: z.string().max(50, 'Category must be under 50 characters').optional(),\n tags: z.string().max(200, 'Tags must be under 200 characters').optional(),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminCodeExamplesRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCodeExamplesRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, language, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (language) {\n whereClause += ' AND language = ?'\n params.push(language)\n }\n\n if (search) {\n whereClause += ' AND (title LIKE ? OR description LIKE ? OR code LIKE ? OR tags LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM code_examples ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM code_examples\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: codeExamples } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderCodeExamplesList({\n codeExamples: codeExamples || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code examples:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code examples',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminCodeExamplesRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example created successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating code example:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM code_examples WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/code-examples?message=Code example not found&type=error')\n }\n\n const example = results[0] as any\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id: example.id,\n title: example.title,\n description: example.description,\n code: example.code,\n language: example.language,\n category: example.category,\n tags: example.tags,\n isPublished: Boolean(example.isPublished),\n sortOrder: example.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code example:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE code_examples\n SET title = ?, description = ?, code = ?, language = ?, category = ?, tags = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example updated successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: validatedData.title,\n description: validatedData.description,\n code: validatedData.code,\n language: validatedData.language,\n category: validatedData.category,\n tags: validatedData.tags,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Code example not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating code example:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM code_examples WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Code example not found' }, 404)\n }\n\n return c.redirect('/admin/code-examples?message=Code example deleted successfully')\n } catch (error) {\n console.error('Error deleting code example:', error)\n return c.json({ error: 'Failed to delete code example' }, 500)\n }\n})\n\nexport default adminCodeExamplesRoutes\n","import {\n AdminLayoutData,\n renderAdminLayout,\n} from \"../layouts/admin-layout-v2.template\";\n\nexport interface DashboardStats {\n collections: number;\n contentItems: number;\n mediaFiles: number;\n users: number;\n databaseSize?: number; // Size in bytes\n mediaSize?: number; // Total size of all media files in bytes\n recentActivity?: ActivityItem[];\n analytics?: AnalyticsData;\n}\n\nexport interface ActivityItem {\n id: string;\n type: \"content\" | \"media\" | \"user\" | \"collection\";\n action: string;\n description: string;\n timestamp: string;\n user: string;\n}\n\nexport interface AnalyticsData {\n pageViews: number;\n uniqueVisitors: number;\n contentPublished: number;\n mediaUploaded: number;\n weeklyGrowth: {\n pageViews: number;\n visitors: number;\n content: number;\n media: number;\n };\n}\n\nexport interface DashboardPageData {\n user?: {\n name: string;\n email: string;\n role: string;\n };\n stats?: DashboardStats;\n version?: string;\n enableExperimentalFeatures?: boolean;\n}\n\nexport function renderDashboardPage(data: DashboardPageData): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n \n \n ${renderStatsCardsSkeleton()}\n \n\n \n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n \n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderDashboardPageWithDynamicMenu(\n data: DashboardPageData,\n dynamicMenuItems: Array<{ label: string; path: string; icon: string }>\n): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n
\n ${renderStatsCards({\n collections: 0,\n contentItems: 0,\n mediaFiles: 0,\n users: 0,\n })}\n
\n\n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n enableExperimentalFeatures: data.enableExperimentalFeatures,\n content: pageContent,\n dynamicMenuItems,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderStatsCards(stats: DashboardStats): string {\n const cards = [\n {\n title: \"Total Collections\",\n value: stats.collections.toString(),\n change: \"12.5\",\n isPositive: true,\n },\n {\n title: \"Content Items\",\n value: stats.contentItems.toString(),\n change: \"8.2\",\n isPositive: true,\n },\n {\n title: \"Media Files\",\n value: stats.mediaFiles.toString(),\n change: \"15.3\",\n isPositive: true,\n },\n {\n title: \"Active Users\",\n value: stats.users.toString(),\n change: \"2.4\",\n isPositive: false,\n },\n ];\n\n const cardColors = ['text-cyan-400', 'text-lime-400', 'text-pink-400', 'text-purple-400'];\n\n return `\n
\n

Last 30 days

\n
\n ${cards.map((card, index) => `\n
\n
${card.title}
\n
\n
\n ${card.value}\n
\n
\n \n ${card.isPositive\n ? ''\n : ''\n }\n \n ${card.isPositive ? 'Increased' : 'Decreased'} by\n ${card.change}%\n
\n
\n
\n `).join('')}\n
\n
\n `;\n}\n\nfunction renderStatsCardsSkeleton(): string {\n return `\n
\n
\n
\n ${Array(4)\n .fill(0)\n .map(\n () => `\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n `;\n}\n\nfunction renderAnalyticsChart(): string {\n return `\n
\n
\n
\n
\n

Real-Time Analytics

\n

Requests per second (live)

\n
\n
\n
\n Live\n
\n
\n
\n 0\n req/s\n
\n
\n\n
\n \n
\n\n \n
\n \n\n \n `;\n}\n\nexport function renderRecentActivitySkeleton(): string {\n return `\n
\n
\n
\n
\n
\n
\n ${Array(3).fill(0).map(() => `\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n}\n\nexport function renderRecentActivity(activities?: ActivityItem[]): string {\n // Helper to get user initials\n const getInitials = (user: string): string => {\n const parts = user.split(' ').filter(p => p.length > 0)\n if (parts.length >= 2) {\n const first = parts[0]?.[0] || ''\n const second = parts[1]?.[0] || ''\n return (first + second).toUpperCase()\n }\n return user.substring(0, 2).toUpperCase()\n }\n\n // Helper to get relative time\n const getRelativeTime = (timestamp: string): string => {\n const date = new Date(timestamp)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) return 'just now'\n if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`\n return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`\n }\n\n // Helper to get color classes based on activity type\n const getColorClasses = (type: string): { bgColor: string; textColor: string } => {\n switch (type) {\n case 'content':\n return {\n bgColor: 'bg-lime-500/10 dark:bg-lime-400/10',\n textColor: 'text-lime-700 dark:text-lime-300'\n }\n case 'media':\n return {\n bgColor: 'bg-cyan-500/10 dark:bg-cyan-400/10',\n textColor: 'text-cyan-700 dark:text-cyan-300'\n }\n case 'user':\n return {\n bgColor: 'bg-pink-500/10 dark:bg-pink-400/10',\n textColor: 'text-pink-700 dark:text-pink-300'\n }\n case 'collection':\n return {\n bgColor: 'bg-purple-500/10 dark:bg-purple-400/10',\n textColor: 'text-purple-700 dark:text-purple-300'\n }\n default:\n return {\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300'\n }\n }\n }\n\n // Format activities with colors and times\n const formattedActivities = (activities || []).map(activity => {\n const colors = getColorClasses(activity.type)\n return {\n ...activity,\n initials: getInitials(activity.user),\n time: getRelativeTime(activity.timestamp),\n ...colors\n }\n })\n\n // If no activities, show empty state\n if (formattedActivities.length === 0) {\n formattedActivities.push({\n type: 'content' as const,\n description: 'No recent activity',\n user: 'System',\n time: '',\n initials: 'SY',\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300',\n id: '0',\n action: '',\n timestamp: new Date().toISOString()\n })\n }\n\n return `\n
\n
\n
\n

Recent Activity

\n \n
\n
\n\n
\n
    \n ${formattedActivities\n .map(\n (activity) => `\n
  • \n
    \n ${activity.initials}\n
    \n
    \n

    ${activity.description}

    \n

    \n ${activity.user}\n · \n ${activity.time}\n

    \n
    \n
  • \n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderQuickActions(): string {\n const actions = [\n {\n title: \"Create Content\",\n description: \"Add new blog post or page\",\n href: \"/admin/content/new\",\n icon: `\n \n `,\n },\n {\n title: \"Upload Media\",\n description: \"Add images and files\",\n href: \"/admin/media\",\n icon: `\n \n `,\n },\n {\n title: \"Manage Users\",\n description: \"Add or edit user accounts\",\n href: \"/admin/users\",\n icon: `\n \n `,\n },\n ];\n\n return `\n
\n
\n

Quick Actions

\n
\n\n
\n
\n ${actions\n .map(\n (action) => `\n \n
\n ${action.icon}\n
\n
\n

${action.title}

\n

${action.description}

\n
\n \n \n \n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderSystemStatus(): string {\n return `\n
\n
\n
\n

System Status

\n
\n
\n Live\n
\n
\n
\n\n \n \n
\n ${[\n { color: 'from-blue-500/20 to-cyan-500/20', darkColor: 'dark:from-blue-500/10 dark:to-cyan-500/10' },\n { color: 'from-purple-500/20 to-pink-500/20', darkColor: 'dark:from-purple-500/10 dark:to-pink-500/10' },\n { color: 'from-amber-500/20 to-orange-500/20', darkColor: 'dark:from-amber-500/10 dark:to-orange-500/10' },\n { color: 'from-lime-500/20 to-emerald-500/20', darkColor: 'dark:from-lime-500/10 dark:to-emerald-500/10' }\n ].map((gradient, i) => `\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n \n\n \n `;\n}\n\nexport function renderStorageUsage(databaseSizeBytes?: number, mediaSizeBytes?: number): string {\n // Helper to format bytes to human readable\n const formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`\n }\n\n const dbSizeGB = databaseSizeBytes ? databaseSizeBytes / (1024 ** 3) : 0\n const dbMaxGB = 10\n const dbPercentageRaw = (dbSizeGB / dbMaxGB) * 100\n // Ensure minimum 0.5% visibility for progress bar, max 100%\n const dbPercentage = Math.min(Math.max(dbPercentageRaw, 0.5), 100)\n const dbUsedFormatted = databaseSizeBytes ? formatBytes(databaseSizeBytes) : 'Unknown'\n\n const mediaUsedFormatted = mediaSizeBytes ? formatBytes(mediaSizeBytes) : '0 B'\n\n const storageItems = [\n {\n label: \"Database\",\n used: dbUsedFormatted,\n total: \"10 GB\",\n percentage: dbPercentage,\n color: dbPercentage > 80 ? \"bg-red-500 dark:bg-red-400\" : dbPercentage > 60 ? \"bg-amber-500 dark:bg-amber-400\" : \"bg-cyan-500 dark:bg-cyan-400\",\n },\n {\n label: \"Media Files\",\n used: mediaUsedFormatted,\n total: \"∞\",\n percentage: 0,\n color: \"bg-lime-500 dark:bg-lime-400\",\n note: \"Stored in R2\"\n },\n {\n label: \"Cache (KV)\",\n used: \"N/A\",\n total: \"∞\",\n percentage: 0,\n color: \"bg-purple-500 dark:bg-purple-400\",\n note: \"Unlimited\"\n },\n ];\n\n return `\n
\n
\n

Storage Usage

\n
\n\n
\n
\n ${storageItems\n .map(\n (item: any) => `\n
\n
\n
\n ${item.label}\n ${item.note ? `(${item.note})` : ''}\n
\n
${item.used} / ${item.total}
\n
\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}","import { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderDashboardPage,\n type DashboardPageData,\n renderStatsCards,\n renderStorageUsage,\n renderRecentActivity,\n type ActivityItem\n} from '../templates/pages/admin-dashboard.template'\nimport { getCoreVersion } from '../utils/version'\nimport { metricsTracker } from '../utils/metrics'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin - Admin Dashboard\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: DashboardPageData = {\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n } catch (error) {\n console.error('Dashboard error:', error)\n\n // Return dashboard with error state\n const pageData: DashboardPageData = {\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n }\n})\n\n/**\n * GET /admin/dashboard/stats - Dashboard stats HTML fragment (HTMX endpoint)\n */\nrouter.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n const html = renderStatsCards({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n users: usersCount,\n mediaSize: mediaSize\n })\n\n return c.html(html)\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.html('
Failed to load statistics
')\n }\n})\n\n/**\n * GET /admin/dashboard/storage - Storage usage HTML fragment (HTMX endpoint)\n */\nrouter.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n const html = renderStorageUsage(databaseSize, mediaSize)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.html('
Failed to load storage information
')\n }\n})\n\n/**\n * GET /admin/dashboard/recent-activity - Recent activity HTML fragment (HTMX endpoint)\n */\nrouter.get('/recent-activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '5')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const activities: ActivityItem[] = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n // Format description based on action and resource type\n let description = ''\n if (row.action === 'create') {\n description = `Created new ${row.resource_type}`\n } else if (row.action === 'update') {\n description = `Updated ${row.resource_type}`\n } else if (row.action === 'delete') {\n description = `Deleted ${row.resource_type}`\n } else {\n description = `${row.action} ${row.resource_type}`\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n description,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n const html = renderRecentActivity(activities)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n const html = renderRecentActivity([])\n return c.html(html)\n }\n})\n\n/**\n * GET /admin/api/metrics - Real-time metrics for analytics chart\n * Returns JSON with current requests per second from the metrics tracker\n */\nrouter.get('/api/metrics', async (c) => {\n return c.json({\n requestsPerSecond: metricsTracker.getRequestsPerSecond(),\n totalRequests: metricsTracker.getTotalRequests(),\n averageRPS: Number(metricsTracker.getAverageRPS().toFixed(2)),\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/dashboard/system-status - System status HTML fragment (HTMX endpoint)\n */\nrouter.get('/system-status', async (c) => {\n try {\n const html = `\n
\n
\n
\n
\n
\n API Status\n \n \n \n
\n

Operational

\n
\n
\n\n
\n
\n
\n
\n Database\n \n \n \n
\n

Connected

\n
\n
\n\n
\n
\n
\n
\n R2 Storage\n \n \n \n
\n

Available

\n
\n
\n\n
\n
\n
\n
\n KV Cache\n \n \n \n
\n

Ready

\n
\n
\n
\n `\n return c.html(html)\n } catch (error) {\n console.error('Error fetching system status:', error)\n return c.html('
Failed to load system status
')\n }\n})\n\nexport { router as adminDashboardRoutes }\n","export function isMarkdownEditorType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nexport function normalizeFieldType(fieldType: string): string {\n if (isMarkdownEditorType(fieldType)) {\n return 'markdown'\n }\n\n if (fieldType === 'tinymce') {\n return 'richtext'\n }\n\n return fieldType\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\nexport interface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCollectionsListPage(data: CollectionsListPageData): string {\n const tableData: any = {\n tableId: 'collections-table',\n rowClickable: true,\n rowClickUrl: (collection: Collection) => `/admin/collections/${collection.id}`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => `\n
\n \n ${collection.name}\n \n ${collection.managed ? `\n \n \n \n \n Config\n \n ` : ''}\n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'description',\n label: 'Description',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => collection.description || '-'\n },\n {\n key: 'field_count',\n label: 'Fields',\n sortable: true,\n sortType: 'number',\n render: (_value: any, collection: any) => {\n const count = collection.field_count || 0\n return `\n
\n \n ${count} ${count === 1 ? 'field' : 'fields'}\n \n
\n `\n }\n },\n {\n key: 'managed',\n label: 'Source',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => {\n if (collection.managed) {\n return `\n
\n \n \n \n Code\n
\n `\n } else {\n return `\n
\n \n \n \n \n \n Database\n
\n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Content',\n sortable: false,\n render: (_value: any, collection: any) => {\n if (!collection || !collection.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.collections,\n emptyMessage: 'No collections found.'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Collections

\n

Manage your content collections and their schemas

\n
\n \n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n ${data.collections.length} ${data.collections.length === 1 ? 'collection' : 'collections'}\n \n \n \n \n Refresh\n \n
\n
\n
\n
\n
\n\n \n
\n ${renderTable(tableData)}\n
\n\n \n ${data.collections.length === 0 ? `\n
\n \n \n \n

No collections found

\n

Get started by creating your first collection

\n \n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Collections',\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","export interface TableColumn {\n key: string\n label: string\n sortable?: boolean\n className?: string\n sortType?: 'string' | 'number' | 'date' | 'boolean'\n render?: (value: any, row: any) => string\n}\n\nexport interface TableData {\n columns: TableColumn[]\n rows: T[]\n selectable?: boolean\n className?: string\n emptyMessage?: string\n tableId?: string\n title?: string\n rowClickable?: boolean\n rowClickUrl?: (row: T) => string\n}\n\nexport function renderTable(data: TableData): string {\n const tableId = data.tableId || `table-${Math.random().toString(36).substr(2, 9)}`\n\n if (data.rows.length === 0) {\n return `\n
\n
\n \n \n \n

${data.emptyMessage || 'No data available'}

\n
\n
\n `\n }\n\n return `\n
\n ${data.title ? `\n
\n

${data.title}

\n
\n ` : ''}\n
\n \n \n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, index) => {\n const isFirst = index === 0 && !data.selectable\n const isLast = index === data.columns.length - 1\n return `\n \n `}).join('')}\n \n \n \n ${data.rows.map((row, rowIndex) => {\n if (!row) return ''\n const clickableClass = data.rowClickable ? 'cursor-pointer' : ''\n const clickHandler = data.rowClickable && data.rowClickUrl ? `onclick=\"window.location.href='${data.rowClickUrl(row)}'\"` : ''\n return `\n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, colIndex) => {\n const value = (row as any)[column.key]\n const displayValue = column.render ? column.render(value, row) : value\n const stopPropagation = column.key === 'actions' ? 'onclick=\"event.stopPropagation()\"' : ''\n const isFirst = colIndex === 0 && !data.selectable\n const isLast = colIndex === data.columns.length - 1\n return `\n \n `\n }).join('')}\n \n `\n }).join('')}\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${column.sortable ? `\n \n ${column.label}\n
\n \n \n \n \n \n \n
\n \n ` : column.label}\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${displayValue || ''}\n
\n
\n\n \n
\n `\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm, FormData, FormField } from '../form.template'\nimport { renderAlert } from '../components/alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\n// Helper function to get field type badge with color\nfunction getFieldTypeBadge(fieldType: string): string {\n const typeLabels: Record = {\n 'text': 'Text',\n 'slug': 'URL Slug',\n 'richtext': 'Rich Text (TinyMCE)',\n 'quill': 'Rich Text (Quill)',\n 'markdown': 'Markdown',\n 'mdxeditor': 'Markdown',\n 'easymde': 'Markdown',\n 'number': 'Number',\n 'boolean': 'Boolean',\n 'date': 'Date',\n 'select': 'Select',\n 'media': 'Media',\n 'reference': 'Reference'\n }\n const typeColors: Record = {\n 'text': 'bg-blue-500/10 dark:bg-blue-400/10 text-blue-700 dark:text-blue-300 ring-blue-500/20 dark:ring-blue-400/20',\n 'slug': 'bg-sky-500/10 dark:bg-sky-400/10 text-sky-700 dark:text-sky-300 ring-sky-500/20 dark:ring-sky-400/20',\n 'richtext': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'quill': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'markdown': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'mdxeditor': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'easymde': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'number': 'bg-green-500/10 dark:bg-green-400/10 text-green-700 dark:text-green-300 ring-green-500/20 dark:ring-green-400/20',\n 'boolean': 'bg-amber-500/10 dark:bg-amber-400/10 text-amber-700 dark:text-amber-300 ring-amber-500/20 dark:ring-amber-400/20',\n 'date': 'bg-cyan-500/10 dark:bg-cyan-400/10 text-cyan-700 dark:text-cyan-300 ring-cyan-500/20 dark:ring-cyan-400/20',\n 'select': 'bg-indigo-500/10 dark:bg-indigo-400/10 text-indigo-700 dark:text-indigo-300 ring-indigo-500/20 dark:ring-indigo-400/20',\n 'media': 'bg-rose-500/10 dark:bg-rose-400/10 text-rose-700 dark:text-rose-300 ring-rose-500/20 dark:ring-rose-400/20',\n 'reference': 'bg-teal-500/10 dark:bg-teal-400/10 text-teal-700 dark:text-teal-300 ring-teal-500/20 dark:ring-teal-400/20'\n }\n const label = typeLabels[fieldType] || fieldType\n const color = typeColors[fieldType] || 'bg-zinc-500/10 dark:bg-zinc-400/10 text-zinc-700 dark:text-zinc-300 ring-zinc-500/20 dark:ring-zinc-400/20'\n return `${label}`\n}\n\nexport function renderCollectionFormPage(data: CollectionFormData): string {\n console.log('[renderCollectionFormPage] editorPlugins:', data.editorPlugins)\n\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? 'Edit Collection' : 'Create New Collection'\n const subtitle = isEdit\n ? `Update collection: ${data.display_name}`\n : 'Define a new content collection with custom fields and settings.'\n\n // Pre-compute data attribute for all fields (without badge HTML to avoid escaping issues)\n const fieldsWithData = (data.fields || []).map(field => ({\n ...field,\n dataFieldJSON: JSON.stringify(JSON.stringify(field))\n }))\n\n const fields: FormField[] = [\n {\n name: 'displayName',\n label: 'Display Name',\n type: 'text',\n value: data.display_name || '',\n placeholder: 'Blog Posts',\n required: true,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'name',\n label: 'Collection Name',\n type: 'text',\n value: data.name || '',\n placeholder: 'blog_posts',\n required: true,\n readonly: isEdit,\n helpText: isEdit ? 'Collection name cannot be changed' : 'Lowercase letters, numbers, and underscores only',\n className: isEdit ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'description',\n label: 'Description',\n type: 'textarea',\n value: data.description || '',\n placeholder: 'Description of this collection...',\n rows: 3,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n }\n ]\n\n\n const formData: FormData = {\n id: 'collection-form',\n ...(isEdit\n ? { hxPut: `/admin/collections/${data.id}`, action: `/admin/collections/${data.id}`, method: 'PUT' }\n : { hxPost: '/admin/collections', action: '/admin/collections' }\n ),\n hxTarget: '#form-messages',\n fields: fields,\n submitButtons: data.managed ? [] : [\n {\n label: isEdit ? 'Update Collection' : 'Create Collection',\n type: 'submit',\n className: 'btn-primary'\n }\n ]\n }\n\n const pageContent = `\n
\n \n ${data.managed ? `\n
\n
\n \n \n \n
\n

\n Config-Managed Collection\n

\n
\n

This collection is managed by a configuration file and cannot be edited through the admin interface.

\n

\n Config file:\n \n src/collections/${data.name}.collection.ts\n \n

\n

\n To modify this collection's schema, edit the configuration file directly in your code editor.\n

\n
\n
\n
\n
\n ` : ''}\n\n \n
\n
\n

${title}

\n

${subtitle}

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

Collection Details

\n

Configure your collection settings below

\n
\n\n ${isEdit && data.name ? `\n \n
\n \n \n \n \n \n
\n ` : ''}\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n \n \n ${renderForm(formData)}\n\n ${isEdit && data.managed ? `\n \n
\n
\n

Collection Fields

\n

Fields defined in the configuration file (read-only)

\n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n ${field.field_name}\n
\n
\n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add fields to your collection configuration file to see them here.

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${isEdit && !data.managed ? `\n \n
\n
\n
\n

Collection Fields

\n

Define the fields that content in this collection will have

\n
\n \n \n \n \n Add Field\n \n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n Field name: ${field.field_name}\n
\n
\n
\n
\n \n \n \n \n Edit\n \n \n \n \n \n Delete\n \n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add your first field to get started

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${!isEdit ? `\n
\n
\n \n \n \n
\n

\n Create Collection First\n

\n

\n After creating the collection, you'll be able to add and configure custom fields.\n

\n
\n
\n
\n ` : ''}\n \n \n
\n \n \n \n \n ${data.managed ? 'Back to Collections' : 'Cancel'}\n \n\n ${isEdit && !data.managed ? `\n \n \n \n \n Delete Collection\n \n ` : ''}\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Add Field

\n \n
\n
\n\n
\n \n\n
\n \n \n

Lowercase letters, numbers, and underscores only

\n
\n\n
\n \n
\n \n \n \n \n ${data.editorPlugins?.tinymce ? '' : ''}\n ${data.editorPlugins?.quill ? '' : ''}\n ${data.editorPlugins?.easyMdx ? '' : ''}\n \n \n \n \n \n \n \n \n \n \n \n
\n

\n
\n\n
\n \n \n
\n\n
\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n\n
\n \n \n

JSON configuration for field-specific options

\n
\n\n
\n \n Cancel\n \n \n Add Field\n \n
\n
\n
\n
\n\n ${isEdit && data.name ? `\n \n
\n
\n
\n
\n

\n Code-Based version of ${escapeHtml(data.display_name || 'this collection')}\n

\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n

\n This is a code-based representation of ${data.display_name ? `the ${escapeHtml(data.display_name)}` : 'this'} collection.\n Learn more about\n \n collections here.\n \n

\n Copied!\n
\n
\n\n
\n \n Close\n \n
\n
\n
\n
\n\n \n ` : ''}\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-field-confirm',\n title: 'Delete Field',\n message: 'Are you sure you want to delete this field? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteField()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { normalizeFieldType } from './admin-collections-field-types'\nimport { renderCollectionsListPage } from '../templates/pages/admin-collections-list.template'\nimport { renderCollectionFormPage } from '../templates/pages/admin-collections-form.template'\n\n// Type definitions for collections\ninterface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\ninterface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\ninterface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\ninterface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminCollectionsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminCollectionsRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on collection modification routes\nadminCollectionsRoutes.post('*', requireRole(['admin']))\nadminCollectionsRoutes.put('*', requireRole(['admin']))\nadminCollectionsRoutes.delete('*', requireRole(['admin']))\n\n// Collections management - List all collections\nadminCollectionsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n const search = url.searchParams.get('search') || ''\n\n // Build query based on search\n let stmt\n let results\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, managed, schema\n FROM collections\n WHERE is_active = 1\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(\"SELECT id, name, display_name, description, created_at, managed, schema FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY created_at DESC\")\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Fetch field counts for all collections from content_fields table (legacy)\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections: Collection[] = (results || [])\n .filter((row: any) => row && row.id)\n .map((row: any) => {\n // Calculate field count: use schema if available, otherwise use content_fields table\n let fieldCount = 0\n if (row.schema) {\n try {\n const schema = typeof row.schema === 'string' ? JSON.parse(row.schema) : row.schema\n if (schema && schema.properties) {\n fieldCount = Object.keys(schema.properties).length\n }\n } catch (e) {\n // If schema parsing fails, fall back to content_fields count\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n } else {\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n\n return {\n id: String(row.id || ''),\n name: String(row.name || ''),\n display_name: String(row.display_name || ''),\n description: row.description ? String(row.description) : undefined,\n created_at: Number(row.created_at || 0),\n formattedDate: row.created_at ? new Date(Number(row.created_at)).toLocaleDateString() : 'Unknown',\n field_count: fieldCount,\n managed: row.managed === 1\n }\n })\n\n const pageData: CollectionsListPageData = {\n collections,\n search,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCollectionsListPage(pageData))\n } catch (error) {\n console.error('Error fetching collections:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.html(html`

Error loading collections: ${errorMessage}

`)\n }\n})\n\n// New collection form\nadminCollectionsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /new] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n})\n\n// Create collection\nadminCollectionsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const name = formData.get('name') as string\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n // Check if this is an HTMX request\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n // Basic validation\n if (!name || !displayName) {\n const errorMsg = 'Name and display name are required.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n // For regular form submission, redirect back with error\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Validate name format\n if (!/^[a-z0-9_]+$/.test(name)) {\n const errorMsg = 'Collection name must contain only lowercase letters, numbers, and underscores.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n const db = c.env.DB\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(name).first()\n\n if (existing) {\n const errorMsg = 'A collection with this name already exists.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Create basic schema for the collection\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n // Create collection\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n name,\n displayName,\n description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache (only if CACHE_KV is available)\n if (c.env.CACHE_KV) {\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n }\n\n if (isHtmx) {\n return c.html(html`\n
\n Collection created successfully! Redirecting to edit mode...\n \n
\n `)\n } else {\n // For regular form submission, redirect to edit page\n return c.redirect(`/admin/collections/${collectionId}`)\n }\n } catch (error) {\n console.error('Error creating collection:', error)\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n if (isHtmx) {\n return c.html(html`\n
\n Failed to create collection. Please try again.\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n})\n\n// Edit collection form\nadminCollectionsRoutes.get('/:id', async (c) => {\n const db = c.env.DB\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n\n // Get collection fields - try schema first, then content_fields table\n let fields: CollectionField[] = []\n\n // If collection has a schema, parse it\n if (collection.schema) {\n try {\n const schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n fields = Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n // Normalize schema formats to UI field types\n let fieldType = fieldConfig.type || 'string'\n if (fieldConfig.enum) {\n fieldType = 'select'\n } else if (fieldConfig.format === 'richtext') {\n fieldType = 'richtext'\n } else if (fieldConfig.format === 'media') {\n fieldType = 'media'\n } else if (fieldConfig.format === 'date-time') {\n fieldType = 'date'\n } else if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n fieldType = 'slug'\n }\n \n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: fieldType,\n field_label: fieldConfig.title || fieldName,\n field_options: fieldConfig,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: fieldConfig.searchable === true || false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table if no schema or parsing failed\n if (fields.length === 0) {\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n fields = (fieldsResults || []).map((row: any) => {\n let fieldOptions = {}\n if (row.field_options) {\n try {\n fieldOptions = typeof row.field_options === 'string' ? JSON.parse(row.field_options) : row.field_options\n } catch (e) {\n console.error('Error parsing field_options for field:', row.field_name, e)\n fieldOptions = {}\n }\n }\n return {\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: fieldOptions,\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }\n })\n }\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /:id] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n fields: fields,\n managed: collection.managed === 1,\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n } catch (error) {\n console.error('Error fetching collection:', error)\n const user = c.get('user')\n\n // Check which editor plugins are active (even in error state)\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Failed to load collection.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n})\n\n// Update collection\nadminCollectionsRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const formData = await c.req.formData()\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n if (!displayName) {\n return c.html(html`\n
\n Display name is required.\n
\n `)\n }\n\n const db = c.env.DB\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(displayName, description || null, Date.now(), id).run()\n\n return c.html(html`\n
\n Collection updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.html(html`\n
\n Failed to update collection. Please try again.\n
\n `)\n }\n})\n\n// Delete collection\nadminCollectionsRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.html(html`\n
\n Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.\n
\n `)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.html(html`\n
\n Failed to delete collection. Please try again.\n
\n `)\n }\n})\n\n// Add field to collection\nadminCollectionsRoutes.post('/:id/fields', async (c) => {\n try {\n const collectionId = c.req.param('id')\n const formData = await c.req.formData()\n const fieldName = formData.get('field_name') as string\n const fieldType = formData.get('field_type') as string\n const fieldLabel = formData.get('field_label') as string\n const isRequired = formData.get('is_required') === '1'\n const isSearchable = formData.get('is_searchable') === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n if (!fieldName || !fieldType || !fieldLabel) {\n return c.json({ success: false, error: 'Field name, type, and label are required.' })\n }\n\n // Validate field name format\n if (!/^[a-z0-9_]+$/.test(fieldName)) {\n return c.json({ success: false, error: 'Field name must contain only lowercase letters, numbers, and underscores.' })\n }\n\n const db = c.env.DB\n\n // Get current collection to check its schema\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Check if field already exists in schema\n let schema = collection.schema ? (typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema) : null\n\n if (schema && schema.properties && schema.properties[fieldName]) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Also check content_fields table for legacy support\n const existingStmt = db.prepare('SELECT id FROM content_fields WHERE collection_id = ? AND field_name = ?')\n const existing = await existingStmt.bind(collectionId, fieldName).first()\n\n if (existing) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Parse field options\n let parsedOptions = {}\n try {\n parsedOptions = fieldOptions ? JSON.parse(fieldOptions) : {}\n } catch (e) {\n console.error('Error parsing field options:', e)\n }\n\n // Add field to schema (primary storage method)\n if (schema) {\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Build field config based on type\n const fieldConfig: any = {\n type: fieldType === 'number' ? 'number' : fieldType === 'boolean' ? 'boolean' : 'string',\n title: fieldLabel,\n searchable: isSearchable,\n ...parsedOptions\n }\n\n const normalizedFieldType = normalizeFieldType(fieldType)\n\n // Handle special field types\n if (normalizedFieldType === 'richtext') {\n fieldConfig.format = 'richtext'\n } else if (normalizedFieldType === 'date') {\n fieldConfig.format = 'date-time'\n } else if (normalizedFieldType === 'select') {\n fieldConfig.enum = (parsedOptions as any).options || []\n } else if (fieldType === 'radio') {\n fieldConfig.type = 'radio'\n if (!(parsedOptions as any).enum && (parsedOptions as any).options) {\n fieldConfig.enum = (parsedOptions as any).options\n }\n } else if (fieldType === 'media') {\n fieldConfig.format = 'media'\n } else if (normalizedFieldType === 'slug') {\n fieldConfig.type = 'slug'\n fieldConfig.format = 'slug'\n } else if (normalizedFieldType === 'quill') {\n fieldConfig.type = 'quill'\n } else if (normalizedFieldType === 'markdown') {\n fieldConfig.type = 'markdown'\n } else if (normalizedFieldType === 'reference') {\n fieldConfig.type = 'reference'\n }\n\n schema.properties[fieldName] = fieldConfig\n\n // Add to required array if needed\n if (isRequired && !schema.required.includes(fieldName)) {\n schema.required.push(fieldName)\n }\n\n // Update collection schema in database\n const updateSchemaStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateSchemaStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Add Field] Added field to schema:', fieldName, fieldConfig)\n\n return c.json({ success: true, fieldId: `schema-${fieldName}` })\n }\n\n // Fallback: If no schema exists, use content_fields table\n // Get next field order\n const orderStmt = db.prepare('SELECT MAX(field_order) as max_order FROM content_fields WHERE collection_id = ?')\n const orderResult = await orderStmt.bind(collectionId).first() as any\n const nextOrder = (orderResult?.max_order || 0) + 1\n\n // Create field in content_fields table\n const fieldId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content_fields (\n id, collection_id, field_name, field_type, field_label,\n field_options, field_order, is_required, is_searchable,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n fieldId,\n collectionId,\n fieldName,\n fieldType,\n fieldLabel,\n fieldOptions,\n nextOrder,\n isRequired ? 1 : 0,\n isSearchable ? 1 : 0,\n now,\n now\n ).run()\n\n return c.json({ success: true, fieldId })\n } catch (error) {\n console.error('Error adding field:', error)\n return c.json({ success: false, error: 'Failed to add field.' })\n }\n})\n\n// Update field\nadminCollectionsRoutes.put('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const formData = await c.req.formData()\n const fieldLabel = formData.get('field_label') as string\n const fieldType = formData.get('field_type') as string\n // Use getAll() to handle hidden input + checkbox pattern (get last value)\n const isRequiredValues = formData.getAll('is_required')\n const isSearchableValues = formData.getAll('is_searchable')\n const isRequired = isRequiredValues[isRequiredValues.length - 1] === '1'\n const isSearchable = isSearchableValues[isSearchableValues.length - 1] === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n // Log all form data for debugging\n console.log('[Field Update] Field ID:', fieldId)\n console.log('[Field Update] Form data received:', {\n field_label: fieldLabel,\n field_type: fieldType,\n is_required: formData.get('is_required'),\n is_searchable: formData.get('is_searchable'),\n field_options: fieldOptions\n })\n\n if (!fieldLabel) {\n return c.json({ success: false, error: 'Field label is required.' })\n }\n\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n // Schema fields are part of the collection's JSON schema\n // We need to update the collection's schema in the database\n const fieldName = fieldId.replace('schema-', '')\n\n console.log('[Field Update] Updating schema field:', fieldName)\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first()\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema) {\n schema = { type: 'object', properties: {}, required: [] }\n }\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Update the field in the schema\n if (schema.properties[fieldName]) {\n // Parse field options from form\n let parsedFieldOptions: Record = {}\n try {\n parsedFieldOptions = JSON.parse(fieldOptions)\n } catch (e) {\n console.error('[Field Update] Error parsing field options:', e)\n }\n\n // Build the updated field config - merge in field options\n const updatedFieldConfig: any = {\n ...schema.properties[fieldName],\n ...parsedFieldOptions,\n type: fieldType,\n title: fieldLabel,\n searchable: isSearchable\n }\n\n // Also set/remove the individual required property on the field\n // This ensures consistency regardless of which format is checked in GET\n if (isRequired) {\n updatedFieldConfig.required = true\n } else {\n delete updatedFieldConfig.required\n }\n\n schema.properties[fieldName] = updatedFieldConfig\n\n // Handle required field in the schema's required array (proper JSON Schema way)\n const requiredIndex = schema.required.indexOf(fieldName)\n console.log('[Field Update] Required field handling:', {\n fieldName,\n isRequired,\n currentRequiredArray: schema.required,\n requiredIndex\n })\n\n if (isRequired && requiredIndex === -1) {\n // Add to required array if checked and not already there\n schema.required.push(fieldName)\n console.log('[Field Update] Added field to required array')\n } else if (!isRequired && requiredIndex !== -1) {\n // Remove from required array if unchecked and currently there\n schema.required.splice(requiredIndex, 1)\n console.log('[Field Update] Removed field from required array')\n }\n\n console.log('[Field Update] Final required array:', schema.required)\n console.log('[Field Update] Final field config:', schema.properties[fieldName])\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Field Update] Schema update result:', {\n success: result.success,\n changes: result.meta?.changes\n })\n\n return c.json({ success: true })\n }\n\n // For regular database fields\n const updateStmt = db.prepare(`\n UPDATE content_fields\n SET field_label = ?, field_type = ?, field_options = ?, is_required = ?, is_searchable = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateStmt.bind(fieldLabel, fieldType, fieldOptions, isRequired ? 1 : 0, isSearchable ? 1 : 0, Date.now(), fieldId).run()\n\n console.log('[Field Update] Update result:', {\n success: result.success,\n meta: result.meta,\n changes: result.meta?.changes,\n last_row_id: result.meta?.last_row_id\n })\n\n // Verify the update by reading back the field\n const verifyStmt = db.prepare('SELECT * FROM content_fields WHERE id = ?')\n const verifyResult = await verifyStmt.bind(fieldId).first()\n console.log('[Field Update] Verification - field after update:', verifyResult)\n\n console.log('[Field Update] Successfully updated field with type:', fieldType)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating field:', error)\n return c.json({ success: false, error: 'Failed to update field.' })\n }\n})\n\n// Delete field\nadminCollectionsRoutes.delete('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n const fieldName = fieldId.replace('schema-', '')\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema || !schema.properties) {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n\n // Remove field from schema\n if (schema.properties[fieldName]) {\n delete schema.properties[fieldName]\n\n // Also remove from required array if present\n if (schema.required && Array.isArray(schema.required)) {\n const requiredIndex = schema.required.indexOf(fieldName)\n if (requiredIndex !== -1) {\n schema.required.splice(requiredIndex, 1)\n }\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Delete Field] Removed field from schema:', fieldName)\n\n return c.json({ success: true })\n } else {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n }\n\n // For regular database fields\n const deleteStmt = db.prepare('DELETE FROM content_fields WHERE id = ?')\n await deleteStmt.bind(fieldId).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting field:', error)\n return c.json({ success: false, error: 'Failed to delete field.' })\n }\n})\n\n// Update field order\nadminCollectionsRoutes.post('/:collectionId/fields/reorder', async (c) => {\n try {\n const body = await c.req.json()\n const fieldIds = body.fieldIds as string[]\n\n if (!Array.isArray(fieldIds)) {\n return c.json({ success: false, error: 'Invalid field order data.' })\n }\n\n const db = c.env.DB\n\n // Update field order\n for (let i = 0; i < fieldIds.length; i++) {\n const updateStmt = db.prepare('UPDATE content_fields SET field_order = ?, updated_at = ? WHERE id = ?')\n await updateStmt.bind(i + 1, Date.now(), fieldIds[i]).run()\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error reordering fields:', error)\n return c.json({ success: false, error: 'Failed to reorder fields.' })\n }\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface SettingsPageData {\n user?: {\n name: string\n email: string\n role: string\n }\n settings?: {\n general?: GeneralSettings\n appearance?: AppearanceSettings\n security?: SecuritySettings\n notifications?: NotificationSettings\n storage?: StorageSettings\n migrations?: MigrationSettings\n databaseTools?: DatabaseToolsSettings\n }\n activeTab?: string\n version?: string\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface AppearanceSettings {\n theme: 'light' | 'dark' | 'auto'\n primaryColor: string\n logoUrl: string\n favicon: string\n customCSS: string\n}\n\nexport interface SecuritySettings {\n twoFactorEnabled: boolean\n sessionTimeout: number\n passwordRequirements: {\n minLength: number\n requireUppercase: boolean\n requireNumbers: boolean\n requireSymbols: boolean\n }\n ipWhitelist: string[]\n jwtExpiresIn?: string\n jwtRefreshGraceSeconds?: number\n}\n\nexport interface NotificationSettings {\n emailNotifications: boolean\n contentUpdates: boolean\n systemAlerts: boolean\n userRegistrations: boolean\n emailFrequency: 'immediate' | 'daily' | 'weekly'\n}\n\nexport interface StorageSettings {\n maxFileSize: number\n allowedFileTypes: string[]\n storageProvider: 'local' | 'cloudflare' | 's3'\n backupFrequency: 'daily' | 'weekly' | 'monthly'\n retentionPeriod: number\n}\n\nexport interface MigrationSettings {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Array<{\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n }>\n}\n\nexport interface DatabaseToolsSettings {\n totalTables: number\n totalRows: number\n lastBackup?: string\n databaseSize?: string\n tables: Array<{\n name: string\n rowCount: number\n }>\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const activeTab = data.activeTab || 'general'\n \n const pageContent = `\n
\n \n
\n
\n

Settings

\n

Manage your application settings and preferences

\n
\n
\n\n \n
\n
\n \n
\n
\n\n \n
\n
\n ${renderTabContent(activeTab, data.settings)}\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'run-migrations-confirm',\n title: 'Run Migrations',\n message: 'Are you sure you want to run pending migrations? This action cannot be undone.',\n confirmText: 'Run Migrations',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performRunMigrations()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Settings',\n pageTitle: 'Settings',\n currentPath: '/admin/settings',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderTabButton(tabId: string, label: string, iconPath: string, activeTab: string): string {\n const isActive = activeTab === tabId\n const baseClasses = 'flex items-center space-x-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 whitespace-nowrap no-underline'\n const activeClasses = isActive\n ? 'border-zinc-950 dark:border-white text-zinc-950 dark:text-white'\n : 'border-transparent text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-300 hover:border-zinc-300 dark:hover:border-zinc-700'\n\n return `\n \n \n \n \n ${label}\n \n `\n}\n\nfunction renderTabContent(activeTab: string, settings?: SettingsPageData['settings']): string {\n switch (activeTab) {\n case 'general':\n return renderGeneralSettings(settings?.general)\n case 'appearance':\n return renderAppearanceSettings(settings?.appearance)\n case 'security':\n return renderSecuritySettings(settings?.security)\n case 'notifications':\n return renderNotificationSettings(settings?.notifications)\n case 'storage':\n return renderStorageSettings(settings?.storage)\n case 'migrations':\n return renderMigrationSettings(settings?.migrations)\n case 'database-tools':\n return renderDatabaseToolsSettings(settings?.databaseTools)\n default:\n return renderGeneralSettings(settings?.general)\n }\n}\n\nfunction renderGeneralSettings(settings?: GeneralSettings): string {\n return `\n
\n
\n

General Settings

\n

Configure basic application settings and preferences.

\n
\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n
\n \n ${settings?.siteDescription || ''}\n
\n\n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderAppearanceSettings(settings?: AppearanceSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Appearance Settings

\n

Customize the look and feel of your application.

\n
\n \n
\n
\n
\n \n
\n \n \n \n
\n
\n \n
\n \n
\n \n \n
\n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderSecuritySettings(settings?: SecuritySettings): string {\n const jwtExpiresIn = settings?.jwtExpiresIn ?? '30d'\n const jwtRefreshGraceSeconds =\n typeof settings?.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n\n return `\n
\n \n
\n

Session / JWT

\n

\n Configure how long a signed-in session lasts and how long an expired token can still be refreshed.\n The JWT_EXPIRES_IN and JWT_REFRESH_GRACE_SECONDS\n environment variables, when set, override the values below.\n

\n\n
\n
\n \n \n

\n Accepts 30d, 12h, 3600s, or bare seconds. Default: 30 days.\n

\n
\n\n
\n \n \n

\n How long an expired token can still be exchanged at /auth/refresh. Default: 604800 (7 days).\n

\n
\n
\n\n
\n \n \n \n \n Save Session Settings\n \n
\n
\n\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n The fields below are under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Security Settings

\n

Configure security and authentication settings.

\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n

Leave empty to allow all IPs

\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderNotificationSettings(settings?: NotificationSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Notification Settings

\n

Configure how and when you receive notifications.

\n
\n \n
\n
\n
\n

Email Notifications

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Notification Preferences
\n

\n Critical system alerts will always be sent immediately regardless of your frequency setting.\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderStorageSettings(settings?: StorageSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Storage Settings

\n

Configure file storage and backup settings.

\n
\n \n
\n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Storage Status
\n

\n Current usage: 2.4 GB / 10 GB available\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderMigrationSettings(settings?: MigrationSettings): string {\n return `\n
\n
\n

Database Migrations

\n

View and manage database migrations to keep your schema up to date.

\n
\n \n \n
\n
\n
\n
\n

Total Migrations

\n

${settings?.totalMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Applied

\n

${settings?.appliedMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Pending

\n

${settings?.pendingMigrations || '0'}

\n
\n \n \n \n
\n
\n
\n\n \n
\n \n \n \n\n \n
\n\n \n
\n
\n

Migration History

\n

List of all available database migrations

\n
\n \n
\n
\n \n \n \n

Loading migration status...

\n
\n
\n
\n
\n\n \n `\n}\n\nfunction renderDatabaseToolsSettings(settings?: DatabaseToolsSettings): string {\n return `\n
\n
\n

Database Tools

\n

Manage database operations including backup, restore, and maintenance.

\n
\n\n \n
\n
\n
\n
\n

Total Tables

\n

${settings?.totalTables || '0'}

\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n
\n

Total Rows

\n

${settings?.totalRows?.toLocaleString() || '0'}

\n
\n
\n \n \n \n
\n
\n
\n
\n\n \n
\n \n
\n

Safe Operations

\n
\n \n \n \n \n Refresh Stats\n \n\n \n \n \n \n Create Backup\n \n\n \n \n \n \n Validate Database\n \n
\n
\n
\n\n \n
\n
\n

Database Tables

\n

Click on a table to view its data

\n
\n\n
\n
\n \n \n \n

Loading database statistics...

\n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

Danger Zone

\n

\n These operations are destructive and cannot be undone.\n Your admin account will be preserved, but all other data will be permanently deleted.\n

\n
\n \n \n \n \n Truncate All Data\n \n
\n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\n// import { html } from 'hono/html'\nimport { requireAuth } from '../middleware'\nimport { renderSettingsPage, SettingsPageData } from '../templates/pages/admin-settings.template'\nimport { MigrationService } from '../services/migrations'\nimport { SettingsService } from '../services/settings'\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminSettingsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminSettingsRoutes.use('*', requireAuth())\n\n// Helper function to get mock settings data\nfunction getMockSettings(user: any) {\n return {\n general: {\n siteName: 'SonicJS AI',\n siteDescription: 'A modern headless CMS powered by AI',\n adminEmail: user?.email || 'admin@example.com',\n timezone: 'UTC',\n language: 'en',\n maintenanceMode: false\n },\n appearance: {\n theme: 'dark' as const,\n primaryColor: '#465FFF',\n logoUrl: '',\n favicon: '',\n customCSS: ''\n },\n security: {\n twoFactorEnabled: false,\n sessionTimeout: 30,\n passwordRequirements: {\n minLength: 8,\n requireUppercase: true,\n requireNumbers: true,\n requireSymbols: false\n },\n ipWhitelist: []\n },\n notifications: {\n emailNotifications: true,\n contentUpdates: true,\n systemAlerts: true,\n userRegistrations: false,\n emailFrequency: 'immediate' as const\n },\n storage: {\n maxFileSize: 10,\n allowedFileTypes: ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'docx'],\n storageProvider: 'cloudflare' as const,\n backupFrequency: 'daily' as const,\n retentionPeriod: 30\n },\n migrations: {\n totalMigrations: 0,\n appliedMigrations: 0,\n pendingMigrations: 0,\n lastApplied: undefined,\n migrations: []\n },\n databaseTools: {\n totalTables: 0,\n totalRows: 0,\n lastBackup: undefined,\n databaseSize: '0 MB',\n tables: []\n }\n }\n}\n\n// Settings page (redirects to general settings)\nadminSettingsRoutes.get('/', (c) => {\n return c.redirect('/admin/settings/general')\n})\n\n// General settings\nadminSettingsRoutes.get('/general', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Get real general settings from database\n const generalSettings = await settingsService.getGeneralSettings(user?.email)\n\n const mockSettings = getMockSettings(user)\n mockSettings.general = generalSettings\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'general',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Appearance settings\nadminSettingsRoutes.get('/appearance', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'appearance',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Security settings\nadminSettingsRoutes.get('/security', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Load persisted security settings (JWT TTL + refresh grace)\n const persisted = await settingsService.getSecuritySettings()\n\n const mockSettings = getMockSettings(user)\n mockSettings.security = {\n ...mockSettings.security,\n jwtExpiresIn: persisted.jwtExpiresIn,\n jwtRefreshGraceSeconds: persisted.jwtRefreshGraceSeconds\n } as any\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'security',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Notifications settings\nadminSettingsRoutes.get('/notifications', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'notifications',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Storage settings\nadminSettingsRoutes.get('/storage', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'storage',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Migrations settings\nadminSettingsRoutes.get('/migrations', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'migrations',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Database tools settings\nadminSettingsRoutes.get('/database-tools', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'database-tools',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Get migration status\nadminSettingsRoutes.get('/api/migrations/status', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminSettingsRoutes.post('/api/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n return c.json({\n success: false,\n error: 'Failed to run migrations'\n }, 500)\n }\n})\n\n// Validate database schema\nadminSettingsRoutes.get('/api/migrations/validate', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\n// Get database tools stats\nadminSettingsRoutes.get('/api/database-tools/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get list of all tables\n const tablesQuery = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT LIKE '_cf_%'\n ORDER BY name\n `).all()\n\n const tables = tablesQuery.results || []\n let totalRows = 0\n\n // Get row count for each table\n const tableStats = await Promise.all(\n tables.map(async (table: any) => {\n try {\n const countResult = await db.prepare(`SELECT COUNT(*) as count FROM ${table.name}`).first()\n const rowCount = (countResult as any)?.count || 0\n totalRows += rowCount\n return {\n name: table.name,\n rowCount\n }\n } catch (error) {\n console.error(`Error counting rows in ${table.name}:`, error)\n return {\n name: table.name,\n rowCount: 0\n }\n }\n })\n )\n\n // D1 doesn't expose database size directly, so we'll estimate based on row counts\n // Average row size estimate: 1KB per row (rough approximation)\n const estimatedSizeBytes = totalRows * 1024\n const databaseSizeMB = (estimatedSizeBytes / (1024 * 1024)).toFixed(2)\n\n return c.json({\n success: true,\n data: {\n totalTables: tables.length,\n totalRows,\n databaseSize: `${databaseSizeMB} MB (estimated)`,\n tables: tableStats\n }\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch database statistics'\n }, 500)\n }\n})\n\n// Validate database\nadminSettingsRoutes.get('/api/database-tools/validate', async (c) => {\n try {\n const db = c.env.DB\n\n // Run PRAGMA integrity_check\n const integrityResult = await db.prepare('PRAGMA integrity_check').first()\n const isValid = (integrityResult as any)?.integrity_check === 'ok'\n\n return c.json({\n success: true,\n data: {\n valid: isValid,\n message: isValid ? 'Database integrity check passed' : 'Database integrity check failed'\n }\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n})\n\n// Backup database\nadminSettingsRoutes.post('/api/database-tools/backup', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n // TODO: Implement actual backup functionality\n // For now, return success message\n return c.json({\n success: true,\n message: 'Database backup feature coming soon. Use Cloudflare Dashboard for backups.'\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({\n success: false,\n error: 'Failed to create backup'\n }, 500)\n }\n})\n\n// Truncate tables\nadminSettingsRoutes.post('/api/database-tools/truncate', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const body = await c.req.json()\n const tablesToTruncate = body.tables || []\n\n if (!Array.isArray(tablesToTruncate) || tablesToTruncate.length === 0) {\n return c.json({\n success: false,\n error: 'No tables specified for truncation'\n }, 400)\n }\n\n const db = c.env.DB\n const results = []\n\n // Validate table names against actual database tables (prevents SQL injection)\n const tablesResult = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n `).all()\n const validTables = new Set(\n (tablesResult.results || []).map((row: any) => row.name)\n )\n\n for (const tableName of tablesToTruncate) {\n if (!validTables.has(tableName)) {\n results.push({ table: tableName, success: false, error: 'Table not found' })\n continue\n }\n try {\n await db.prepare(`DELETE FROM ${tableName}`).run()\n results.push({ table: tableName, success: true })\n } catch (error) {\n console.error(`Error truncating ${tableName}:`, error)\n results.push({ table: tableName, success: false, error: String(error) })\n }\n }\n\n return c.json({\n success: true,\n message: `Truncated ${results.filter(r => r.success).length} of ${tablesToTruncate.length} tables`,\n results\n })\n } catch (error) {\n console.error('Error truncating tables:', error)\n return c.json({\n success: false,\n error: 'Failed to truncate tables'\n }, 500)\n }\n})\n\n// Save general settings\nadminSettingsRoutes.post('/general', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Extract general settings from form data\n const settings = {\n siteName: formData.get('siteName') as string,\n siteDescription: formData.get('siteDescription') as string,\n adminEmail: formData.get('adminEmail') as string,\n timezone: formData.get('timezone') as string,\n language: formData.get('language') as string,\n maintenanceMode: formData.get('maintenanceMode') === 'true'\n }\n\n // Validate required fields\n if (!settings.siteName || !settings.siteDescription) {\n return c.json({\n success: false,\n error: 'Site name and description are required'\n }, 400)\n }\n\n // Save settings to database\n const success = await settingsService.saveGeneralSettings(settings)\n\n if (success) {\n return c.json({\n success: true,\n message: 'General settings saved successfully!'\n })\n } else {\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n }\n } catch (error) {\n console.error('Error saving general settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save security settings (JWT TTL + refresh grace)\nadminSettingsRoutes.post('/security', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n const jwtExpiresInRaw = (formData.get('jwtExpiresIn') as string | null)?.trim() || ''\n const graceRaw = (formData.get('jwtRefreshGraceSeconds') as string | null)?.trim() || ''\n\n // Validate jwtExpiresIn: bare seconds or \n if (!/^\\d+(?:s|m|h|d)?$/i.test(jwtExpiresInRaw)) {\n return c.json({\n success: false,\n error: 'JWT expiration must be a number optionally suffixed with s/m/h/d (e.g. 30d, 12h, 3600).'\n }, 400)\n }\n\n const graceSeconds = Number.parseInt(graceRaw, 10)\n if (!Number.isFinite(graceSeconds) || graceSeconds < 0 || graceSeconds > 60 * 60 * 24 * 90) {\n return c.json({\n success: false,\n error: 'Refresh grace must be an integer between 0 and 7776000 seconds (90 days).'\n }, 400)\n }\n\n const success = await settingsService.saveSecuritySettings({\n jwtExpiresIn: jwtExpiresInRaw,\n jwtRefreshGraceSeconds: graceSeconds\n })\n\n if (success) {\n return c.json({\n success: true,\n message: 'Security settings saved successfully!'\n })\n }\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n } catch (error) {\n console.error('Error saving security settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save settings (legacy endpoint - redirect to general)\nadminSettingsRoutes.post('/', async (c) => {\n return c.redirect('/admin/settings/general')\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n formattedDate: string\n}\n\nexport interface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormsListPage(data: FormsListPageData): string {\n const tableData: any = {\n tableId: 'forms-table',\n rowClickable: true,\n rowClickUrl: (form: Form) => `/admin/forms/${form.id}/builder`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => `\n
\n \n ${form.name}\n \n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'category',\n label: 'Category',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n const categoryColors: Record = {\n 'contact': 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 ring-blue-700/10 dark:ring-blue-400/20',\n 'survey': 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-300 ring-purple-700/10 dark:ring-purple-400/20',\n 'registration': 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-300 ring-green-700/10 dark:ring-green-400/20',\n 'feedback': 'bg-orange-50 dark:bg-orange-500/10 text-orange-700 dark:text-orange-300 ring-orange-700/10 dark:ring-orange-400/20',\n 'general': 'bg-gray-50 dark:bg-gray-500/10 text-gray-700 dark:text-gray-300 ring-gray-700/10 dark:ring-gray-400/20'\n }\n const colorClass = categoryColors[form.category] || categoryColors['general']\n return `\n \n ${form.category || 'general'}\n \n `\n }\n },\n {\n key: 'submission_count',\n label: 'Submissions',\n sortable: true,\n sortType: 'number',\n render: (_value: any, form: any) => {\n const count = form.submission_count || 0\n return `\n
\n \n ${count}\n \n
\n `\n }\n },\n {\n key: 'is_active',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n if (form.is_active) {\n return `\n \n Active\n \n `\n } else {\n return `\n \n Inactive\n \n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n render: (_value: any, form: any) => {\n if (!form || !form.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.forms,\n emptyMessage: 'No forms found. Create your first form to get started!'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Forms

\n

Create and manage forms with the visual form builder

\n
\n \n
\n\n \n
\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Forms
\n
${data.forms.length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Active Forms
\n
${data.forms.filter(f => f.is_active).length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Submissions
\n
${data.forms.reduce((sum, f) => sum + (f.submission_count || 0), 0)}
\n
\n
\n
\n
\n
\n\n \n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Filter\n \n ${data.search || data.category ? `\n \n Clear\n \n ` : ''}\n \n
\n\n \n
\n ${renderTable(tableData)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Forms',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface FormBuilderPageData {\n id: string\n name: string\n display_name: string\n description?: string\n category?: string\n formio_schema: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\n// Inline Turnstile component for Form.io builder\nfunction getTurnstileComponentScript(): string {\n return `\n (function() {\n 'use strict';\n\n if (!window.Formio || !window.Formio.Components) {\n console.error('Form.io library not loaded');\n return;\n }\n\n const FieldComponent = Formio.Components.components.field;\n\n class TurnstileComponent extends FieldComponent {\n static schema(...extend) {\n return FieldComponent.schema({\n type: 'turnstile',\n label: 'Turnstile Verification',\n key: 'turnstile',\n input: true,\n persistent: false,\n protected: true,\n unique: false,\n hidden: false,\n clearOnHide: true,\n tableView: false,\n validate: {\n required: false\n },\n siteKey: '',\n theme: 'auto',\n size: 'normal',\n action: '',\n appearance: 'always',\n errorMessage: 'Please complete the security verification'\n }, ...extend);\n }\n\n static get builderInfo() {\n return {\n title: 'Turnstile',\n group: 'premium',\n icon: 'fa fa-shield-alt',\n weight: 120,\n documentation: '/admin/forms/docs#turnstile',\n schema: TurnstileComponent.schema()\n };\n }\n\n constructor(component, options, data) {\n super(component, options, data);\n this.widgetId = null;\n this.scriptLoaded = false;\n }\n\n init() {\n super.init();\n // Only load script if NOT in builder/edit mode\n if (!this.options.editMode && !this.options.builder && !this.builderMode) {\n this.loadTurnstileScript();\n }\n }\n\n loadTurnstileScript() {\n // Extra safety: never load in builder\n if (this.options.editMode || this.options.builder || this.builderMode) {\n console.log('Turnstile: Skipping script load in builder mode');\n return Promise.resolve();\n }\n\n if (window.turnstile) {\n this.scriptLoaded = true;\n return Promise.resolve();\n }\n\n if (this.scriptPromise) {\n return this.scriptPromise;\n }\n\n console.log('Turnstile: Loading script for form mode');\n this.scriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js';\n script.async = true;\n script.defer = true;\n script.onload = () => {\n this.scriptLoaded = true;\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Turnstile'));\n document.head.appendChild(script);\n });\n\n return this.scriptPromise;\n }\n\n render() {\n return super.render(\\`\n
\n
\n \\${this.component.description ? \\`
\\${this.component.description}
\\` : ''}\n
\n \\`);\n }\n\n attach(element) {\n this.loadRefs(element, {\n turnstileContainer: 'single',\n turnstileWidget: 'single'\n });\n\n const superAttach = super.attach(element);\n\n // Check if we're in builder mode or form mode\n if (this.options.editMode || this.options.builder) {\n // Builder mode - show placeholder only\n this.renderPlaceholder();\n } else {\n // Form mode - render actual widget\n this.loadTurnstileScript()\n .then(() => this.renderWidget())\n .catch(err => {\n console.error('Failed to load Turnstile:', err);\n if (this.refs.turnstileWidget) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to load security verification\n
\n \\`;\n }\n });\n }\n\n return superAttach;\n }\n\n renderPlaceholder() {\n if (!this.refs.turnstileWidget) {\n return;\n }\n \n this.refs.turnstileWidget.innerHTML = \\`\n
\n
🛡️
\n
Turnstile Verification
\n
CAPTCHA-free bot protection by Cloudflare
\n
Widget will appear here on the live form
\n
\n \\`;\n }\n\n renderWidget() {\n if (!this.refs.turnstileWidget || !window.turnstile) {\n return;\n }\n\n this.refs.turnstileWidget.innerHTML = '';\n\n const siteKey = this.component.siteKey || \n (this.root && this.root.options && this.root.options.turnstileSiteKey) || \n '';\n \n if (!siteKey) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n ⚠️ Configuration Required: Turnstile site key not configured. \n Please enable the Turnstile plugin in Settings → Plugins.\n
\n \\`;\n return;\n }\n\n try {\n const self = this;\n this.widgetId = window.turnstile.render(this.refs.turnstileWidget, {\n sitekey: siteKey,\n theme: this.component.theme || 'auto',\n size: this.component.size || 'normal',\n action: this.component.action || '',\n appearance: this.component.appearance || 'always',\n callback: function(token) {\n self.updateValue(token);\n self.triggerChange();\n },\n 'error-callback': function() {\n self.updateValue(null);\n self.setCustomValidity(self.component.errorMessage || 'Security verification failed');\n },\n 'expired-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification expired. Please verify again.');\n },\n 'timeout-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification timed out. Please try again.');\n }\n });\n } catch (err) {\n console.error('Failed to render Turnstile widget:', err);\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to render security verification\n
\n \\`;\n }\n }\n\n detach() {\n if (this.widgetId !== null && window.turnstile) {\n try {\n window.turnstile.remove(this.widgetId);\n this.widgetId = null;\n } catch (err) {\n console.error('Failed to remove Turnstile widget:', err);\n }\n }\n return super.detach();\n }\n\n getValue() {\n if (this.widgetId !== null && window.turnstile) {\n return window.turnstile.getResponse(this.widgetId);\n }\n return this.dataValue;\n }\n\n setValue(value, flags) {\n const changed = super.setValue(value, flags);\n return changed;\n }\n\n getValueAsString(value) {\n return value ? '✅ Verified' : '❌ Not Verified';\n }\n\n isEmpty(value) {\n return !value;\n }\n\n updateValue(value, flags) {\n const changed = super.updateValue(value, flags);\n \n if (value) {\n this.setCustomValidity('');\n }\n \n return changed;\n }\n\n checkValidity(data, dirty, row) {\n const result = super.checkValidity(data, dirty, row);\n \n if (this.component.validate && this.component.validate.required) {\n const value = this.getValue();\n if (!value) {\n this.setCustomValidity(this.component.errorMessage || 'Please complete the security verification');\n return false;\n }\n }\n \n return result;\n }\n }\n\n Formio.Components.addComponent('turnstile', TurnstileComponent);\n console.log('✅ Turnstile component registered with Form.io');\n window.TurnstileComponent = TurnstileComponent;\n })();\n `;\n}\n\nexport function renderFormBuilderPage(data: FormBuilderPageData): string {\n const formioSchema = data.formio_schema || { components: [] }\n const settings = data.settings || {}\n const googleMapsApiKey = data.google_maps_api_key || ''\n const turnstileSiteKey = data.turnstile_site_key || ''\n\n const pageContent = `\n \n\n
\n \n
\n
\n
\n \n \n \n \n \n
\n

\n Form Builder: ${data.display_name}\n

\n

\n \n ${data.name}\n \n

\n
\n
\n\n \n
\n \n \n \n \n \n Preview\n \n\n \n \n \n \n Save Form\n \n\n \n \n \n \n View Public Form\n \n\n \n \n \n \n View Submissions\n \n
\n
\n
\n\n \n
\n \n
\n \n \n \n \n Single Page\n \n \n \n \n \n Multi-Page Wizard\n \n
\n \n 💡 Use Panel components (Layout tab) for each page\n \n
\n\n \n
\n\n \n
\n
\n \n \n \n \n

Loading Form Builder...

\n
\n
\n\n \n
\n\n \n
\n
\n
\n

Form Preview

\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n\n \n \n\n \n\n \n \n \n \n \n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Form Builder: ${data.display_name}`,\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm } from '../components/form.template'\n\nexport interface FormCreatePageData {\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormCreatePage(data: FormCreatePageData): string {\n const pageContent = `\n
\n \n
\n
\n \n \n \n \n \n
\n

Create New Form

\n

Enter basic information to create your form. You'll be able to add fields in the builder.

\n
\n
\n
\n\n \n ${data.error ? `\n
\n
\n \n \n \n

${data.error}

\n
\n
\n ` : ''}\n\n ${data.success ? `\n
\n
\n \n \n \n

${data.success}

\n
\n
\n ` : ''}\n\n \n
\n
\n \n
\n \n
\n \n \n

\n Lowercase letters, numbers, and underscores only. Used in URLs and API.\n

\n
\n\n \n
\n \n \n

\n Human-readable name shown in the admin interface.\n

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n \n \n \n \n \n \n

\n Helps organize forms in the admin panel.\n

\n
\n
\n\n \n
\n \n Cancel\n \n \n \n \n \n Create & Open Builder\n \n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

What happens next?

\n
\n

After creating your form, you'll be taken to the Form Builder where you can:

\n
    \n
  • Drag and drop fields onto your form
  • \n
  • Configure field properties and validation
  • \n
  • Add conditional logic
  • \n
  • Preview your form in real-time
  • \n
  • Publish when ready
  • \n
\n
\n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create Form',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderFormsListPage } from '../templates/pages/admin-forms-list.template'\nimport { renderFormBuilderPage, type FormBuilderPageData } from '../templates/pages/admin-forms-builder.template'\nimport { renderFormCreatePage } from '../templates/pages/admin-forms-create.template'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\n\n// Type definitions for forms\ninterface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n updated_at: number\n formattedDate: string\n}\n\ninterface FormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n category?: string\n formio_schema?: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ninterface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminFormsRoutes.use('*', requireAuth())\n\n// Forms management - List all forms\nadminFormsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const category = c.req.query('category') || ''\n\n // Build query\n let query = 'SELECT * FROM forms WHERE 1=1'\n const params: string[] = []\n\n if (search) {\n query += ' AND (name LIKE ? OR display_name LIKE ?)'\n params.push(`%${search}%`, `%${search}%`)\n }\n\n if (category) {\n query += ' AND category = ?'\n params.push(category)\n }\n\n query += ' ORDER BY created_at DESC'\n\n const result = await db.prepare(query).bind(...params).all()\n\n // Format dates\n const forms = result.results.map((form: any) => ({\n ...form,\n formattedDate: new Date(form.created_at).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n }))\n\n const pageData: FormsListPageData = {\n forms,\n search,\n category,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsListPage(pageData))\n } catch (error: any) {\n console.error('Error listing forms:', error)\n return c.html('

Error loading forms

', 500)\n }\n})\n\n// Show create form page\nadminFormsRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n\n const pageData: FormData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormCreatePage(pageData))\n } catch (error: any) {\n console.error('Error showing create form page:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Show docs page\nadminFormsRoutes.get('/docs', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsDocsPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsDocsPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms docs page:', error)\n return c.html('

Error loading documentation

', 500)\n }\n})\n\n// Show examples page\nadminFormsRoutes.get('/examples', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsExamplesPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsExamplesPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms examples page:', error)\n return c.html('

Error loading examples

', 500)\n }\n})\n\n// Create new form\nadminFormsRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const name = body.name as string\n const displayName = body.displayName as string\n const description = (body.description as string) || ''\n const category = (body.category as string) || 'general'\n\n // Validate required fields\n if (!name || !displayName) {\n return c.json({ error: 'Name and display name are required' }, 400)\n }\n\n // Validate name format (lowercase, numbers, underscores only)\n if (!/^[a-z0-9_]+$/.test(name)) {\n return c.json({ \n error: 'Form name must contain only lowercase letters, numbers, and underscores' \n }, 400)\n }\n\n // Check for duplicate name\n const existing = await db.prepare('SELECT id FROM forms WHERE name = ?')\n .bind(name)\n .first()\n\n if (existing) {\n return c.json({ error: 'A form with this name already exists' }, 400)\n }\n\n // Create form with empty schema\n const formId = crypto.randomUUID()\n const now = Date.now()\n const emptySchema = { components: [] } // Empty Form.io schema\n\n await db.prepare(`\n INSERT INTO forms (\n id, name, display_name, description, category,\n formio_schema, settings, is_active, is_public,\n created_by, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n formId,\n name,\n displayName,\n description,\n category,\n JSON.stringify(emptySchema),\n JSON.stringify({\n submitButtonText: 'Submit',\n successMessage: 'Thank you for your submission!',\n requireAuth: false,\n emailNotifications: false\n }),\n 1, // is_active\n 1, // is_public\n user?.userId || null,\n now,\n now\n ).run()\n\n // Redirect to builder\n return c.redirect(`/admin/forms/${formId}/builder`)\n } catch (error: any) {\n console.error('Error creating form:', error)\n return c.json({ error: 'Failed to create form' }, 500)\n }\n})\n\n// Show form builder\nadminFormsRoutes.get('/:id/builder', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get Turnstile configuration\n const turnstileService = new TurnstileService(db)\n const turnstileSettings = await turnstileService.getSettings()\n\n const pageData: FormData = {\n id: form.id as string,\n name: form.name as string,\n display_name: form.display_name as string,\n description: form.description as string | undefined,\n category: form.category as string,\n formio_schema: form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] },\n settings: form.settings ? JSON.parse(form.settings as string) : {},\n is_active: Boolean(form.is_active),\n is_public: Boolean(form.is_public),\n google_maps_api_key: googleMapsApiKey,\n turnstile_site_key: turnstileSettings?.siteKey || '',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormBuilderPage(pageData as FormBuilderPageData))\n } catch (error: any) {\n console.error('Error showing form builder:', error)\n return c.html('

Error loading form builder

', 500)\n }\n})\n\n// Update form (save schema)\nadminFormsRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const body = await c.req.json()\n\n // Check if form exists\n const form = await db.prepare('SELECT id FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const now = Date.now()\n\n // Update form\n await db.prepare(`\n UPDATE forms \n SET formio_schema = ?, \n updated_by = ?, \n updated_at = ?\n WHERE id = ?\n `).bind(\n JSON.stringify(body.formio_schema),\n user?.userId || null,\n now,\n formId\n ).run()\n\n return c.json({ success: true, message: 'Form saved successfully' })\n } catch (error: any) {\n console.error('Error updating form:', error)\n return c.json({ error: 'Failed to save form' }, 500)\n }\n})\n\n// Delete form\nadminFormsRoutes.delete('/:id', async (c) => {\n try {\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Check if form exists\n const form = await db.prepare('SELECT id, submission_count FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Warn if form has submissions\n const submissionCount = form.submission_count as number || 0\n if (submissionCount > 0) {\n return c.json({ \n error: `Cannot delete form with ${submissionCount} submissions. Archive it instead.` \n }, 400)\n }\n\n // Delete form (cascade will delete submissions and files)\n await db.prepare('DELETE FROM forms WHERE id = ?').bind(formId).run()\n\n return c.json({ success: true, message: 'Form deleted successfully' })\n } catch (error: any) {\n console.error('Error deleting form:', error)\n return c.json({ error: 'Failed to delete form' }, 500)\n }\n})\n\n// View form submissions\nadminFormsRoutes.get('/:id/submissions', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get submissions\n const submissions = await db.prepare(\n 'SELECT * FROM form_submissions WHERE form_id = ? ORDER BY submitted_at DESC'\n ).bind(formId).all()\n\n // Simple submissions page for now\n const html = `\n \n \n \n Submissions - ${form.display_name}\n \n \n \n ← Back to Forms\n

Submissions: ${form.display_name}

\n

Total submissions: ${submissions.results.length}

\n ${submissions.results.length > 0 ? `\n \n \n \n \n \n \n \n \n \n ${submissions.results.map((sub: any) => `\n \n \n \n \n \n `).join('')}\n \n
IDSubmittedData
${sub.id.substring(0, 8)}${new Date(sub.submitted_at).toLocaleString()}
${JSON.stringify(JSON.parse(sub.submission_data), null, 2)}
\n ` : '

No submissions yet.

'}\n \n \n `\n \n return c.html(html)\n } catch (error: any) {\n console.error('Error loading submissions:', error)\n return c.html('

Error loading submissions

', 500)\n }\n})\n\nexport default adminFormsRoutes\n","import { Hono } from 'hono'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { createContentFromSubmission } from '../services/form-collection-sync'\n\n/**\n * Recursively sanitize all string values in arbitrary JSON data.\n * HTML-encodes entities (e.g., < becomes <) to prevent stored XSS\n * when form submission data is rendered in admin templates.\n */\nfunction sanitizeDeep(value: unknown): unknown {\n if (typeof value === 'string') {\n return sanitizeInput(value)\n }\n if (Array.isArray(value)) {\n return value.map(sanitizeDeep)\n }\n if (value !== null && typeof value === 'object') {\n const result: Record = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = sanitizeDeep(v)\n }\n return result\n }\n return value // numbers, booleans, null pass through\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const publicFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Get Turnstile configuration for a form (for headless frontends)\npublicFormsRoutes.get('/:identifier/turnstile-config', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form\n const form = await db.prepare(\n 'SELECT id, turnstile_enabled, turnstile_settings FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const turnstileService = new TurnstileService(db)\n const globalSettings = await turnstileService.getSettings()\n \n const formSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string)\n : { inherit: true }\n\n // Determine effective settings\n const enabled = form.turnstile_enabled === 1 || \n (formSettings.inherit && globalSettings?.enabled)\n\n if (!enabled || !globalSettings) {\n return c.json({ enabled: false })\n }\n\n return c.json({\n enabled: true,\n siteKey: formSettings.siteKey || globalSettings.siteKey,\n theme: formSettings.theme || globalSettings.theme || 'auto',\n size: formSettings.size || globalSettings.size || 'normal',\n mode: formSettings.mode || globalSettings.mode || 'managed',\n appearance: formSettings.appearance || globalSettings.appearance || 'always'\n })\n } catch (error: any) {\n console.error('Error fetching Turnstile config:', error)\n return c.json({ error: 'Failed to fetch config' }, 500)\n }\n})\n\n// Get form schema as JSON (for headless frontends)\npublicFormsRoutes.get('/:identifier/schema', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT id, name, display_name, description, category, formio_schema, settings, is_active, is_public FROM forms WHERE (id = ? OR name = ?) AND is_active = 1 AND is_public = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n return c.json({\n id: form.id,\n name: form.name,\n displayName: form.display_name,\n description: form.description,\n category: form.category,\n schema: formioSchema,\n settings: settings,\n submitUrl: `/api/forms/${form.id}/submit`\n })\n } catch (error: any) {\n console.error('Error fetching form schema:', error)\n return c.json({ error: 'Failed to fetch form schema' }, 500)\n }\n})\n\n// Render public form by name\npublicFormsRoutes.get('/:name', async (c) => {\n try {\n const db = c.env.DB\n const formName = c.req.param('name')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form by name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE name = ? AND is_active = 1 AND is_public = 1'\n ).bind(formName).first()\n\n if (!form) {\n return c.html('

Form not found

This form does not exist or is not publicly available.

', 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n const html = `\n \n \n \n \n \n ${form.display_name}\n \n \n \n \n \n \n \n
\n

${form.display_name}

\n ${form.description ? `

${form.description}

` : ''}\n \n
\n \n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n `\n\n return c.html(html)\n } catch (error: any) {\n console.error('Error rendering form:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Handle form submission (accepts either name or ID)\npublicFormsRoutes.post('/:identifier/submit', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n const body = await c.req.json()\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Check if Turnstile is enabled for this form\n const turnstileEnabled = form.turnstile_enabled === 1\n const turnstileSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string) \n : { inherit: true }\n\n // Validate Turnstile if enabled (or inheriting global settings)\n if (turnstileEnabled || turnstileSettings.inherit) {\n const turnstileService = new TurnstileService(db)\n \n // Check if Turnstile is globally enabled\n const globalEnabled = await turnstileService.isEnabled()\n \n if (globalEnabled || turnstileEnabled) {\n // Extract Turnstile token from submission data\n const turnstileToken = body.data?.turnstile || body.turnstile\n \n if (!turnstileToken) {\n return c.json({ \n error: 'Turnstile verification required. Please complete the security check.',\n code: 'TURNSTILE_MISSING'\n }, 400)\n }\n\n // Verify the token\n const clientIp = c.req.header('cf-connecting-ip')\n const verification = await turnstileService.verifyToken(turnstileToken, clientIp)\n \n if (!verification.success) {\n return c.json({ \n error: verification.error || 'Security verification failed. Please try again.',\n code: 'TURNSTILE_INVALID'\n }, 403)\n }\n\n // Remove Turnstile token from submission data before storing\n if (body.data?.turnstile) {\n delete body.data.turnstile\n }\n }\n }\n\n // Sanitize all string values in submission data to prevent stored XSS.\n // HTML-encodes entities (e.g., < becomes <) before storage.\n const sanitizedData = sanitizeDeep(body.data) as Record\n\n // Create submission\n const submissionId = crypto.randomUUID()\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO form_submissions (\n id, form_id, submission_data, user_id, ip_address, user_agent,\n submitted_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n submissionId,\n form.id,\n JSON.stringify(sanitizedData),\n null, // user_id (for authenticated users)\n c.req.header('cf-connecting-ip') || null,\n c.req.header('user-agent') || null,\n now,\n now\n ).run()\n\n // Update submission count\n await db.prepare(`\n UPDATE forms\n SET submission_count = submission_count + 1,\n updated_at = ?\n WHERE id = ?\n `).bind(now, form.id).run()\n\n // Dual-write: create content item for this submission\n let contentId: string | null = null\n try {\n contentId = await createContentFromSubmission(\n db,\n sanitizedData as Record,\n { id: form.id as string, name: form.name as string, display_name: form.display_name as string },\n submissionId,\n {\n ipAddress: c.req.header('cf-connecting-ip') || null,\n userAgent: c.req.header('user-agent') || null,\n userEmail: (sanitizedData as any)?.email || null,\n userId: null // anonymous submission\n }\n )\n if (!contentId) {\n console.warn('[FormSubmit] Content creation returned null for submission:', submissionId)\n }\n } catch (contentError) {\n // Don't fail the submission if content creation fails\n console.error('[FormSubmit] Error creating content from submission:', contentError)\n }\n\n return c.json({\n success: true,\n submissionId,\n contentId,\n message: 'Form submitted successfully'\n })\n } catch (error: any) {\n console.error('Error submitting form:', error)\n return c.json({ error: 'Failed to submit form' }, 500)\n }\n})\n\nexport default publicFormsRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { CATEGORY_INFO } from '../../services/route-metadata'\n\nexport interface APIEndpoint {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented?: boolean\n}\n\nexport interface APIReferencePageData {\n endpoints: APIEndpoint[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nfunction renderAuthBadge(auth: boolean | 'unknown'): string {\n if (auth === true) {\n return `\n \n \n \n \n Auth\n `\n }\n if (auth === false) {\n return `\n \n \n \n \n Public\n `\n }\n // unknown\n return `\n \n \n \n \n Unknown\n `\n}\n\nexport function renderAPIReferencePage(data: APIReferencePageData): string {\n // Group endpoints by category\n const endpointsByCategory = data.endpoints.reduce((acc, endpoint) => {\n if (!acc[endpoint.category]) {\n acc[endpoint.category] = []\n }\n acc[endpoint.category]!.push(endpoint)\n return acc\n }, {} as Record)\n\n // Get unique categories from actual data\n const categories = Object.keys(endpointsByCategory)\n\n // Count stats\n const totalEndpoints = data.endpoints.length\n const publicEndpoints = data.endpoints.filter(e => e.authentication === false).length\n const protectedEndpoints = data.endpoints.filter(e => e.authentication === true).length\n const undocumentedCount = data.endpoints.filter(e => e.documented === false).length\n\n const pageContent = `\n
\n \n
\n
\n

API Reference

\n

Auto-discovered documentation of all registered API endpoints

\n
\n \n
\n\n \n
\n
\n
Total Endpoints
\n
\n ${totalEndpoints}\n
\n
\n
\n
Public Endpoints
\n
\n ${publicEndpoints}\n
\n
\n
\n
Protected Endpoints
\n
\n ${protectedEndpoints}\n
\n
\n
\n
Categories
\n
\n ${categories.length}\n
\n
\n
\n
Undocumented
\n
\n 0 ? 'text-zinc-400 dark:text-zinc-500' : 'text-lime-600 dark:text-lime-400'}\">${undocumentedCount}\n
\n
\n
\n\n \n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n \n \n ${categories.map(category => {\n const info = CATEGORY_INFO[category]\n const title = info ? info.title : category\n return ``\n }).join('\\n ')}\n \n \n \n \n
\n
\n
\n
\n
\n\n \n
\n ${Object.entries(endpointsByCategory).map(([category, endpoints]) => {\n const info = CATEGORY_INFO[category] || { title: category, description: '', icon: '📋' }\n return `\n
\n
\n \n
\n
\n ${info.icon}\n
\n

${info.title}

\n

${info.description}

\n
\n
\n \n ${endpoints.length} endpoint${endpoints.length !== 1 ? 's' : ''}\n \n
\n
\n
\n\n \n
\n ${endpoints.map(endpoint => `\n
\n
\n \n ${endpoint.method}\n \n
\n
\n ${endpoint.path}\n ${renderAuthBadge(endpoint.authentication)}\n ${endpoint.documented === false ? `\n \n Auto-discovered\n \n ` : ''}\n
\n

${endpoint.description || 'No description available'}

\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n }).join('')}\n
\n\n \n
\n \n \n \n

No endpoints found

\n

Try adjusting your search or filter criteria

\n
\n
\n\n \n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'API Reference',\n pageTitle: 'API Reference',\n currentPath: '/admin/api-reference',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","/**\n * Admin API Reference Routes\n *\n * Provides the API Reference page for the admin dashboard.\n * Uses auto-discovery via Hono's inspectRoutes() to always show\n * the complete list of registered API endpoints.\n */\n\nimport { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderAPIReferencePage,\n type APIReferencePageData\n} from '../templates/pages/admin-api-reference.template'\nimport { getCoreVersion } from '../utils/version'\nimport { buildRouteList, getAppInstance } from '../services/route-metadata'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin/api-reference - API Reference Page\n *\n * Auto-discovers all registered routes using Hono's inspectRoutes()\n * and enriches them with metadata from the route-metadata registry.\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const app = getAppInstance()\n const endpoints = buildRouteList(app)\n\n const pageData: APIReferencePageData = {\n endpoints,\n user: user ? {\n name: user.email.split('@')[0] || user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n } catch (error) {\n console.error('API Reference page error:', error)\n\n const pageData: APIReferencePageData = {\n endpoints: [],\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n }\n})\n\nexport { router as adminApiReferenceRoutes }\n","/**\n * Routes Module Exports\n *\n * Routes are being migrated incrementally from the monolith.\n * Each route is refactored to remove monolith-specific dependencies.\n */\n\n// API routes\nexport { default as apiRoutes } from './api'\nexport { default as apiContentCrudRoutes } from './api-content-crud'\nexport { default as apiMediaRoutes } from './api-media'\nexport { default as apiSystemRoutes } from './api-system'\nexport { default as adminApiRoutes } from './admin-api'\n\n// Auth routes\nexport { default as authRoutes } from './auth'\n\n// Test routes (only for development/test environments)\nexport { default as testCleanupRoutes } from './test-cleanup'\n\n// Admin UI routes\nexport { default as adminContentRoutes } from './admin-content'\nexport { userRoutes as adminUsersRoutes } from './admin-users'\nexport { adminMediaRoutes } from './admin-media'\nexport { adminPluginRoutes } from './admin-plugins'\nexport { adminLogsRoutes } from './admin-logs'\nexport { adminDesignRoutes } from './admin-design'\nexport { adminCheckboxRoutes } from './admin-checkboxes'\nexport { default as adminTestimonialsRoutes } from './admin-testimonials'\nexport { default as adminCodeExamplesRoutes } from './admin-code-examples'\nexport { adminDashboardRoutes } from './admin-dashboard'\nexport { adminCollectionsRoutes } from './admin-collections'\nexport { adminSettingsRoutes } from './admin-settings'\nexport { adminFormsRoutes } from './admin-forms'\nexport { default as publicFormsRoutes } from './public-forms'\nexport { adminApiReferenceRoutes } from './admin-api-reference'\n\nexport const ROUTES_INFO = {\n message: 'Core routes available',\n available: [\n 'apiRoutes',\n 'apiContentCrudRoutes',\n 'apiMediaRoutes',\n 'apiSystemRoutes',\n 'adminApiRoutes',\n 'authRoutes',\n 'testCleanupRoutes',\n 'adminContentRoutes',\n 'adminUsersRoutes',\n 'adminMediaRoutes',\n 'adminPluginRoutes',\n 'adminLogsRoutes',\n 'adminDesignRoutes',\n 'adminCheckboxRoutes',\n 'adminTestimonialsRoutes',\n 'adminCodeExamplesRoutes',\n 'adminDashboardRoutes',\n 'adminCollectionsRoutes',\n 'adminSettingsRoutes',\n 'adminFormsRoutes',\n 'publicFormsRoutes',\n 'adminApiReferenceRoutes'\n ],\n status: 'Core package routes ready',\n reference: 'https://github.com/sonicjs/sonicjs'\n} as const\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-OO7BOO6H.js b/packages/core/dist/chunk-M2PKQJ6J.js similarity index 99% rename from packages/core/dist/chunk-OO7BOO6H.js rename to packages/core/dist/chunk-M2PKQJ6J.js index b081db3e6..dfd3eb664 100644 --- a/packages/core/dist/chunk-OO7BOO6H.js +++ b/packages/core/dist/chunk-M2PKQJ6J.js @@ -1,11 +1,11 @@ -import { getCacheService, CACHE_CONFIGS, SettingsService, getLogger, getAppInstance, buildRouteList, CATEGORY_INFO } from './chunk-QFWHAFEO.js'; -import { requireAuth, requireRole, isPluginActive, optionalAuth, rateLimit, AuthManager, getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb, logActivity, generateCsrfToken } from './chunk-DMPXZ6JJ.js'; -import { PluginService, PLUGIN_REGISTRY, findPluginByCodeName, createContentFromSubmission } from './chunk-NJVY2U43.js'; -import { MigrationService } from './chunk-46DCL763.js'; +import { getCacheService, CACHE_CONFIGS, SettingsService, getLogger, getAppInstance, buildRouteList, CATEGORY_INFO } from './chunk-GQEIPW3L.js'; +import { requireAuth, requireRole, isPluginActive, optionalAuth, rateLimit, AuthManager, getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb, logActivity, generateCsrfToken } from './chunk-5QK3FXKX.js'; +import { PluginService, PLUGIN_REGISTRY, findPluginByCodeName, createContentFromSubmission } from './chunk-CJOLOONT.js'; +import { MigrationService } from './chunk-CSQWOYGZ.js'; import { renderDesignPage, renderCheckboxPage, renderTestimonialsList, renderCodeExamplesList, renderAlert, renderTable, renderPagination, renderConfirmationDialog, getConfirmationDialogScript, renderAdminLayout, adminLayoutV2, renderForm } from './chunk-XWIA3HVX.js'; import { init_admin_layout_catalyst_template, renderAdminLayoutCatalyst } from './chunk-55RDMDOP.js'; import { PluginBuilder, TurnstileService } from './chunk-EXNEW5US.js'; -import { QueryFilterBuilder, getCoreVersion, getBlocksFieldConfig, parseBlocksValue } from './chunk-FE77VWGD.js'; +import { QueryFilterBuilder, getCoreVersion, getBlocksFieldConfig, parseBlocksValue } from './chunk-NDS4S4AG.js'; import { metricsTracker } from './chunk-FICTAGD4.js'; import { escapeHtml, sanitizeRichText, sanitizeInput } from './chunk-TQABQWOP.js'; import { Hono } from 'hono'; @@ -2351,7 +2351,7 @@ adminApiRoutes.delete("/collections/:id", async (c) => { }); adminApiRoutes.get("/migrations/status", async (c) => { try { - const { MigrationService: MigrationService2 } = await import('./migrations-W7P2NBXW.js'); + const { MigrationService: MigrationService2 } = await import('./migrations-SMFIJBW2.js'); const db = c.env.DB; const migrationService = new MigrationService2(db); const status = await migrationService.getMigrationStatus(); @@ -2376,7 +2376,7 @@ adminApiRoutes.post("/migrations/run", async (c) => { error: "Unauthorized. Admin access required." }, 403); } - const { MigrationService: MigrationService2 } = await import('./migrations-W7P2NBXW.js'); + const { MigrationService: MigrationService2 } = await import('./migrations-SMFIJBW2.js'); const db = c.env.DB; const migrationService = new MigrationService2(db); const result = await migrationService.runPendingMigrations(); @@ -2398,7 +2398,7 @@ adminApiRoutes.post("/migrations/run", async (c) => { }); adminApiRoutes.get("/migrations/validate", async (c) => { try { - const { MigrationService: MigrationService2 } = await import('./migrations-W7P2NBXW.js'); + const { MigrationService: MigrationService2 } = await import('./migrations-SMFIJBW2.js'); const db = c.env.DB; const migrationService = new MigrationService2(db); const validation = await migrationService.validateSchema(); @@ -15810,8 +15810,8 @@ adminMediaRoutes.post("/upload", async (c) => { }); continue; } - let width = null; - let height = null; + let width; + let height; if (file.type.startsWith("image/") && !file.type.includes("svg")) { try { const dimensions = await getImageDimensions2(arrayBuffer); @@ -15822,7 +15822,7 @@ adminMediaRoutes.post("/upload", async (c) => { } } const publicUrl = `/files/${r2Key}`; - const thumbnailUrl = file.type.startsWith("image/") ? publicUrl : null; + const thumbnailUrl = file.type.startsWith("image/") ? publicUrl : void 0; const stmt = c.env.DB.prepare(` INSERT INTO media ( id, filename, original_name, mime_type, size, width, height, @@ -22608,22 +22608,6 @@ function renderCollectionFormPage(data) {

Collection Details

Configure your collection settings below

- - ${isEdit && data.name ? ` - -
- -
- ` : ""} @@ -23083,176 +23067,6 @@ function renderCollectionFormPage(data) { - ${isEdit && data.name ? ` - - - - - ` : ""} \n \n \n \n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n

Welcome Back

\n

Sign in to your account to continue

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n ${data.message ? `
${renderAlert({ type: 'success', message: data.message })}
` : ''}\n\n \n
\n\n \n \n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Sign In\n \n \n\n \n
\n

\n Don't have an account?\n Create one here\n

\n
\n
\n\n \n
\n \n v${data.version || '0.1.0'}\n \n
\n
\n
\n\n ${demoLoginActive ? `\n \n ` : ''}\n \n \n `\n}","import { renderAlert } from '../alert.template'\n\nexport interface RegisterPageData {\n error?: string\n}\n\nexport function renderRegisterPage(data: RegisterPageData): string {\n return `\n \n \n \n \n \n Register - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n
\n

SonicJS AI

\n

Create your account and get started

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n\n \n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Create Account\n \n \n\n \n
\n

\n Already have an account?\n Sign in here\n

\n
\n\n
\n
\n
\n
\n \n \n `\n}","/**\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 {\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\n if (plugin?.settings) {\n // Parse settings and check registration.enabled\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 return true // Default to enabled if no settings\n } catch {\n return true // Default to enabled on error\n }\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 {\n try {\n const result = await db.prepare('SELECT COUNT(*) as count FROM users').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 {\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 users 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 username: z.string().min(3, 'Username must be at least 3 characters').optional(),\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\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 {\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 'username':\n // Generate username from email (part before @)\n return data.email ? data.email.split('@')[0] : `user${Date.now()}`\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","/**\n * User Profile Config Registry\n *\n * Global singleton storing developer-defined custom profile field definitions.\n * Set once at app boot via defineUserProfile(), queried by routes and templates.\n */\n\nimport type { FieldType } from '../../../types/collection-config'\n\nexport interface ProfileFieldDefinition {\n name: string\n label: string\n type: FieldType\n options?: string[]\n default?: any\n required?: boolean\n placeholder?: string\n helpText?: string\n hidden?: boolean\n fields?: ProfileFieldDefinition[]\n validation?: {\n min?: number\n max?: number\n pattern?: string\n }\n}\n\nexport interface UserProfileConfig {\n fields: ProfileFieldDefinition[]\n registrationFields?: string[]\n}\n\nlet _profileConfig: UserProfileConfig | null = null\n\nexport function defineUserProfile(config: UserProfileConfig): void {\n if (_profileConfig) {\n console.warn('[SonicJS] defineUserProfile called multiple times — overwriting previous config')\n }\n _profileConfig = config\n}\n\nexport function getUserProfileConfig(): UserProfileConfig | null {\n return _profileConfig\n}\n\nexport function getProfileFieldDefaults(): Record {\n if (!_profileConfig) return {}\n const defaults: Record = {}\n for (const field of _profileConfig.fields) {\n if (field.default !== undefined) {\n defaults[field.name] = field.default\n }\n }\n return defaults\n}\n\nexport function getRegistrationFields(): ProfileFieldDefinition[] {\n if (!_profileConfig) return []\n const regFieldNames = _profileConfig.registrationFields || []\n return _profileConfig.fields.filter(f => regFieldNames.includes(f.name))\n}\n\n/** Reset state — for tests only */\nexport function _resetProfileConfig(): void {\n _profileConfig = null\n}\n","/**\n * User Profile Service\n *\n * Handles reading, writing, validation, and sanitization of custom profile data.\n */\n\nimport { sanitizeInput } from '../../../utils/sanitize'\nimport {\n getUserProfileConfig,\n getProfileFieldDefaults,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport function validateCustomData(\n data: Record,\n config: UserProfileConfig\n): { valid: boolean; errors: Record } {\n const errors: Record = {}\n\n for (const field of config.fields) {\n const value = data[field.name]\n\n if (field.required && (value === undefined || value === null || value === '')) {\n errors[field.name] = `${field.label} is required`\n continue\n }\n\n if (value === undefined || value === null || value === '') continue\n\n if (field.type === 'number' && typeof value !== 'number') {\n errors[field.name] = `${field.label} must be a number`\n }\n if (field.type === 'select' && field.options && !field.options.includes(value)) {\n errors[field.name] = `${field.label} must be one of: ${field.options.join(', ')}`\n }\n if (field.type === 'boolean' && typeof value !== 'boolean') {\n errors[field.name] = `${field.label} must be true or false`\n }\n if (field.validation?.min !== undefined && typeof value === 'number' && value < field.validation.min) {\n errors[field.name] = `${field.label} must be at least ${field.validation.min}`\n }\n if (field.validation?.max !== undefined && typeof value === 'number' && value > field.validation.max) {\n errors[field.name] = `${field.label} must be at most ${field.validation.max}`\n }\n if (field.validation?.pattern && typeof value === 'string' && !new RegExp(field.validation.pattern).test(value)) {\n errors[field.name] = `${field.label} format is invalid`\n }\n }\n\n return { valid: Object.keys(errors).length === 0, errors }\n}\n\nexport function sanitizeCustomData(\n data: Record,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n const knownNames = new Set(config.fields.map(f => f.name))\n\n for (const [key, value] of Object.entries(data)) {\n if (!knownNames.has(key)) continue\n if (typeof value === 'string') {\n result[key] = sanitizeInput(value)\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\nexport function coerceFieldValue(raw: string | null | undefined, field: ProfileFieldDefinition): any {\n if (raw === null || raw === undefined || raw === '') {\n return field.default ?? null\n }\n\n switch (field.type) {\n case 'number':\n const num = Number(raw)\n return isNaN(num) ? null : num\n case 'boolean':\n case 'checkbox':\n return raw === '1' || raw === 'true' || raw === 'on'\n case 'date':\n case 'datetime':\n const ts = new Date(raw).getTime()\n return isNaN(ts) ? null : ts\n default:\n return raw\n }\n}\n\nexport function extractCustomFieldsFromForm(\n formData: FormData,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n for (const field of config.fields) {\n const raw = formData.get(`custom_${field.name}`)?.toString()\n // For boolean/checkbox, absence means false\n if (raw === null || raw === undefined) {\n if (field.type === 'boolean' || field.type === 'checkbox') {\n result[field.name] = false\n }\n continue\n }\n result[field.name] = coerceFieldValue(raw, field)\n }\n return result\n}\n\nexport async function getCustomData(db: any, userId: string): Promise> {\n const row = await db\n .prepare('SELECT data FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (!row?.data) return {}\n try {\n return JSON.parse(row.data)\n } catch {\n return {}\n }\n}\n\nexport async function saveCustomData(\n db: any,\n userId: string,\n newData: Record\n): Promise {\n const existing = await getCustomData(db, userId)\n const merged = { ...existing, ...newData }\n const json = JSON.stringify(merged)\n\n // Check if profile row exists\n const row = await db\n .prepare('SELECT id FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (row) {\n await db\n .prepare('UPDATE user_profiles SET data = ?, updated_at = ? WHERE user_id = ?')\n .bind(json, Date.now(), userId)\n .run()\n } else {\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const now = Date.now()\n await db\n .prepare(\n 'INSERT INTO user_profiles (id, user_id, data, created_at, updated_at) VALUES (?, ?, ?, ?, ?)'\n )\n .bind(profileId, userId, json, now, now)\n .run()\n }\n}\n","export interface DragSortableOptions {\n itemSelector?: string\n handleSelector?: string\n onUpdate?: () => void\n}\n\nexport function getDragSortableScript(): string {\n return `\n \n `;\n}\n","import { getDragSortableScript } from './drag-sortable.template'\n\n/**\n * Returns shared readFieldValue function used by both blocks and structured fields.\n * Uses a window flag to ensure it's only initialized once.\n */\nfunction getReadFieldValueScript(): string {\n return `\n \n `\n}\n\nconst STRUCTURED_INDEX_TOKEN = '__INDEX__'\nconst BLOCK_INDEX_TOKEN = '__BLOCK_INDEX__'\n\nfunction sanitizeStructuredGroupId(fieldName: string): string {\n return `object-${fieldName}`\n .split(BLOCK_INDEX_TOKEN)\n .map((blockSegment) =>\n blockSegment\n .split(STRUCTURED_INDEX_TOKEN)\n .map((segment) =>\n segment\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, ''),\n )\n .join(STRUCTURED_INDEX_TOKEN),\n )\n .join(BLOCK_INDEX_TOKEN)\n}\n\nexport interface FieldDefinition {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any // JSON options\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface FieldRenderOptions {\n value?: any\n errors?: string[]\n disabled?: boolean\n className?: string\n pluginStatuses?: {\n quillEnabled?: boolean\n mdxeditorEnabled?: boolean\n tinymceEnabled?: boolean\n }\n collectionId?: string\n contentId?: string\n}\n\nfunction isMarkdownEditorFieldType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nfunction getEditorMetadata(fieldType: string): { family: string; provider: string } | null {\n if (fieldType === 'richtext' || fieldType === 'tinymce') {\n return {\n family: 'richtext',\n provider: 'tinymce',\n }\n }\n\n if (isMarkdownEditorFieldType(fieldType)) {\n return {\n family: 'markdown',\n provider: 'easymde',\n }\n }\n\n return null\n}\n\nexport function renderDynamicField(field: FieldDefinition, options: FieldRenderOptions = {}): string {\n const { value = '', errors = [], disabled = false, className = '', pluginStatuses = {}, collectionId = '', contentId = '' } = options\n const opts = field.field_options || {}\n const required = field.is_required ? 'required' : ''\n const baseClasses = `w-full rounded-lg px-3 py-2 text-sm text-zinc-950 dark:text-white bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 placeholder:text-zinc-400 dark:placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-zinc-950 dark:focus:ring-white transition-shadow ${className}`\n const errorClasses =\n errors.length > 0\n ? 'ring-pink-600 dark:ring-pink-500 focus:ring-pink-600 dark:focus:ring-pink-500'\n : ''\n\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n\n // Check if this is a plugin-based field type and if the plugin is inactive\n // If so, fall back to textarea with a warning\n let fallbackToTextarea = false\n let fallbackWarning = ''\n\n if (field.field_type === 'quill' && !pluginStatuses.quillEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Quill Editor plugin is inactive. Using textarea fallback.'\n } else if (isMarkdownEditorFieldType(field.field_type) && !pluginStatuses.mdxeditorEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Markdown editor plugin is inactive. Using textarea fallback.'\n } else if ((field.field_type === 'richtext' || field.field_type === 'tinymce') && !pluginStatuses.tinymceEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ TinyMCE plugin is inactive. Using textarea fallback.'\n }\n\n // If falling back to textarea, render it with a warning\n if (fallbackToTextarea) {\n return `\n
\n ${fallbackWarning ? `
${fallbackWarning}
` : ''}\n ${escapeHtml(value)}\n
\n `\n }\n\n let fieldHTML = ''\n\n switch (field.field_type) {\n case 'text':\n let patternHelp = ''\n let autoSlugScript = ''\n\n if (opts.pattern) {\n if (opts.pattern === '^[a-z0-9-]+$' || opts.pattern === '^[a-zA-Z0-9_-]+$') {\n patternHelp =\n '

Use letters, numbers, underscores, and hyphens only

'\n\n // Add auto-slug generation for slug fields\n if (fieldName === 'slug') {\n patternHelp +=\n ''\n autoSlugScript = `\n \n `\n }\n } else {\n patternHelp =\n '

Must match required format

'\n }\n }\n\n fieldHTML = `\n \n ${patternHelp}\n ${autoSlugScript}\n ${\n opts.pattern\n ? `\n \n `\n : ''\n }\n `\n break\n\n case 'textarea':\n fieldHTML = `\n ${escapeHtml(value)}\n `\n break\n\n case 'richtext':\n case 'tinymce':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'quill':\n // Quill WYSIWYG Editor\n fieldHTML = `\n
\n \n ${value}
\n\n \n \n \n `\n break\n\n case 'markdown':\n case 'mdxeditor':\n case 'easymde':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n // Markdown editor fields use the EasyMDE-backed richtext container.\n // The EasyMDE plugin initialization script handles activation.\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'number':\n fieldHTML = `\n \n `\n break\n\n case 'boolean':\n const checked = value === true || value === 'true' || value === '1' ? 'checked' : ''\n fieldHTML = `\n
\n \n \n
\n \n `\n break\n\n case 'date':\n fieldHTML = `\n \n `\n break\n\n case 'datetime':\n fieldHTML = `\n \n `\n break\n\n case 'slug':\n // Slug fields with auto-generation and duplicate detection\n const slugPattern = opts.pattern || '^[a-z0-9-]+$'\n const collectionIdValue = collectionId || opts.collectionId || ''\n const contentIdValue = contentId || opts.contentId || ''\n const isEditMode = !!value\n\n fieldHTML = `\n
\n \n
\n \n

Use lowercase letters, numbers, and hyphens only

\n
\n \n \n `\n break\n\n case 'select':\n const selectOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const multiple = opts.multiple ? 'multiple' : ''\n const selectedValues = Array.isArray(value) ? value : [value]\n\n fieldHTML = `\n \n ${!required && !opts.multiple ? '' : ''}\n ${selectOptions\n .map((option: any) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const selected = selectedValues.includes(optionValue) ? 'selected' : ''\n return ``\n })\n .join('')}\n \n ${\n opts.allowCustom\n ? `\n
\n \n
\n `\n : ''\n }\n `\n break\n\n case 'radio':\n const radioOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const selectedRadioValue =\n value !== undefined && value !== null\n ? String(value)\n : opts.default\n ? String(opts.default)\n : ''\n\n const isInline = opts.inline === true\n fieldHTML = `\n
\n ${radioOptions\n .map((option: any, index: number) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const inputId = `${fieldId}-option-${index}`\n const checked = selectedRadioValue === String(optionValue) ? 'checked' : ''\n return `\n \n `\n })\n .join('')}\n
\n `\n break\n\n case 'reference':\n let referenceCollections: string[] = []\n if (Array.isArray(opts.collection)) {\n referenceCollections = opts.collection.filter(Boolean)\n } else if (typeof opts.collection === 'string' && opts.collection) {\n referenceCollections = [opts.collection]\n }\n const referenceCollectionsAttr = referenceCollections.join(',')\n const hasReferenceCollection = referenceCollections.length > 0\n const hasReferenceValue = Boolean(value)\n fieldHTML = `\n
\n \n
\n \n ${hasReferenceCollection ? (hasReferenceValue ? 'Loading selection...' : 'No reference selected.') : 'Reference collection not configured.'}\n
\n
\n \n Select reference\n \n \n Remove\n \n
\n
\n \n `\n break\n\n case 'media':\n // Check if multiple selection is enabled\n const isMultiple = opts.multiple === true\n const mediaValues =\n isMultiple && value\n ? Array.isArray(value)\n ? value\n : String(value).split(',').filter(Boolean)\n : []\n const singleValue = !isMultiple ? value : ''\n\n // Helper to detect if URL is a video\n const isVideoUrl = (url: string) => {\n const videoExtensions = ['.mp4', '.webm', '.ogg', '.mov', '.avi']\n return videoExtensions.some((ext) => url.toLowerCase().endsWith(ext))\n }\n\n // Helper to render media element\n const renderMediaPreview = (url: string, alt: string, classes: string) => {\n if (isVideoUrl(url)) {\n return ``\n }\n return `\"${alt}\"`\n }\n\n fieldHTML = `\n
\n \n\n ${\n isMultiple\n ? `\n
\n ${mediaValues\n .map(\n (url: string, idx: number) => `\n
\n ${renderMediaPreview(url, `Media ${idx + 1}`, 'w-full h-24 object-cover rounded-lg border border-white/20')}\n \n \n \n \n \n
\n `,\n )\n .join('')}\n
\n `\n : `\n
\n ${singleValue ? renderMediaPreview(singleValue, 'Selected media', 'w-32 h-32 object-cover rounded-lg border border-white/20') : ''}\n
\n `\n }\n\n
\n \n \n \n \n ${isMultiple ? 'Select Media (Multiple)' : 'Select Media'}\n \n ${\n (isMultiple ? mediaValues.length > 0 : singleValue)\n ? `\n \n ${isMultiple ? 'Clear All' : 'Remove'}\n \n `\n : ''\n }\n
\n
\n `\n break\n\n case 'object':\n // Structured object field (like SEO with nested properties)\n return renderStructuredObjectField(field, options, baseClasses, errorClasses)\n\n case 'array':\n // Check if this is a blocks field (has discriminator/blocks config) or a regular array\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n if (itemsConfig.blocks && typeof itemsConfig.blocks === 'object') {\n // Blocks field with discriminated union\n return renderBlocksField(field, options, baseClasses, errorClasses)\n }\n // Regular structured array field\n return renderStructuredArrayField(field, options, baseClasses, errorClasses)\n\n default:\n fieldHTML = `\n \n `\n }\n\n const showLabel = field.field_type !== 'boolean'\n\n return `\n
0 ? 'true' : 'false'}\">\n ${\n showLabel\n ? `\n \n `\n : ''\n }\n ${fieldHTML}\n ${\n errors.length > 0\n ? `\n
\n ${errors.map((error) => `
${escapeHtml(error)}
`).join('')}\n
\n `\n : ''\n }\n ${\n opts.helpText\n ? `\n
\n ${escapeHtml(opts.helpText)}\n
\n `\n : ''\n }\n
\n `\n}\n\nexport function renderFieldGroup(\n title: string,\n fields: string[],\n collapsible: boolean = false,\n): string {\n const groupId = title.toLowerCase().replace(/\\s+/g, '-')\n\n return `\n
\n
\n

\n ${escapeHtml(title)}\n ${\n collapsible\n ? `\n \n \n \n `\n : ''\n }\n

\n
\n
\n ${fields.join('')}\n
\n
\n `\n}\n\nfunction renderBlocksField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const blocks = normalizeBlockDefinitions(itemsConfig.blocks)\n const discriminator =\n typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n const blockValues = normalizeBlocksValue(value, discriminator)\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const emptyState =\n blockValues.length === 0\n ? `\n
\n No blocks yet. Add your first block to get started.\n
\n `\n : ''\n\n const blockOptions = blocks\n .map((block) => ``)\n .join('')\n\n const blockItems = blockValues\n .map((blockValue, index) =>\n renderBlockItem(field, blockValue, blocks, discriminator, index, pluginStatuses),\n )\n .join('')\n\n const templates = blocks\n .map((block) => renderBlockTemplate(field, block, discriminator, pluginStatuses))\n .join('')\n\n return `\n \n \n\n
\n

\n ${escapeHtml(field.field_label || 'Content Blocks')}\n

\n
\n\n
\n
\n \n \n ${blockOptions}\n \n
\n \n Add Block\n \n
\n\n
\n ${blockItems || emptyState}\n
\n\n ${templates}\n \n ${getDragSortableScript()}\n ${getBlocksFieldScript()}\n `\n}\n\nfunction renderStructuredObjectField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = {}, pluginStatuses = {}, errors = [] } = options\n const opts = field.field_options || {}\n const properties = opts.properties && typeof opts.properties === 'object' ? opts.properties : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const objectValue = normalizeStructuredObjectValue(value)\n const objectLayout = opts.objectLayout || 'nested'\n const useNestedLayout = objectLayout !== 'flat'\n\n const subfields = Object.entries(properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n objectValue,\n pluginStatuses,\n field.field_name,\n ),\n )\n .join('')\n\n const groupTitle = field.field_label || field.field_name\n\n if (!useNestedLayout) {\n return `\n
\n \n
\n

\n ${escapeHtml(groupTitle)}\n

\n
\n
\n ${subfields}\n
\n
\n ${getStructuredFieldScript()}\n `\n }\n\n const groupId = sanitizeStructuredGroupId(field.field_name)\n const isCollapsed = errors.length > 0 ? false : opts.collapsed !== false\n\n return `\n
\n
\n

\n ${escapeHtml(groupTitle)}\n \n \n \n

\n
\n
\n \n
\n ${subfields}\n
\n
\n
\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const arrayValue = normalizeStructuredArrayValue(value)\n const arrayTitle = opts.itemLabel || field.field_label || 'Items'\n const hasItemTitle = typeof opts.itemTitle === 'string' && opts.itemTitle.trim() !== ''\n const arrayItemTitle = hasItemTitle ? opts.itemTitle.trim() : 'Item'\n const addItemLabel = hasItemTitle ? `Add ${arrayItemTitle}` : 'Add item'\n\n const items = arrayValue\n .map((itemValue, index) =>\n renderStructuredArrayItem(\n field,\n itemsConfig,\n String(index),\n itemValue,\n pluginStatuses,\n arrayItemTitle,\n ),\n )\n .join('')\n\n const emptyState =\n arrayValue.length === 0\n ? `\n
\n No items yet. Add the first item to get started.\n
\n `\n : ''\n\n return `\n
\n \n\n
\n
\n ${escapeHtml(arrayTitle)}\n
\n \n ${escapeHtml(addItemLabel)}\n \n
\n\n
\n ${items || emptyState}\n
\n\n \n
\n ${getDragSortableScript()}\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayItem(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n arrayItemTitle: string,\n): string {\n const itemFields = renderStructuredItemFields(field, itemConfig, index, itemValue, pluginStatuses)\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n ${escapeHtml(arrayItemTitle)} \n
\n
\n
\n \n \n \n \n
\n
\n
\n ${itemFields}\n
\n
\n `\n}\n\nfunction renderStructuredItemFields(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const itemType = itemConfig?.type || 'string'\n if (\n itemType === 'object' &&\n itemConfig?.properties &&\n typeof itemConfig.properties === 'object'\n ) {\n const fieldPrefix = `array-${field.field_name}-${index}`\n return Object.entries(itemConfig.properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n itemValue || {},\n pluginStatuses,\n fieldPrefix,\n ),\n )\n .join('')\n }\n\n const normalizedField = normalizeBlockField(itemConfig, 'Item')\n const fieldValue = itemValue ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `array-${field.field_name}-${index}-value`,\n field_name: `array-${field.field_name}-${index}-value`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction renderStructuredSubfield(\n field: FieldDefinition,\n propertyName: string,\n propertyConfig: any,\n objectValue: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n fieldPrefix: string,\n): string {\n const normalizedField = normalizeBlockField(propertyConfig, propertyName)\n const fieldValue = objectValue?.[propertyName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `${fieldPrefix}-${propertyName}`,\n field_name: `${fieldPrefix}__${propertyName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction normalizeStructuredObjectValue(value: any): Record {\n if (!value) return {}\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {}\n } catch {\n return {}\n }\n }\n if (typeof value === 'object' && !Array.isArray(value)) return value\n return {}\n}\n\nfunction normalizeStructuredArrayValue(value: any): any[] {\n if (!value) return []\n if (Array.isArray(value)) return value\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction normalizeBlockDefinitions(\n rawBlocks: any,\n): Array<{ name: string; label: string; description?: string; properties: Record }> {\n if (!rawBlocks || typeof rawBlocks !== 'object') return []\n\n return Object.entries(rawBlocks)\n .filter(([name, block]) => typeof name === 'string' && block && typeof block === 'object')\n .map(([name, block]: [string, any]) => ({\n name,\n label: block.label || name,\n description: block.description,\n properties: block.properties && typeof block.properties === 'object' ? block.properties : {},\n }))\n}\n\nfunction normalizeBlocksValue(value: any, discriminator: string): any[] {\n const normalizeItem = (item: any) => {\n if (!item || typeof item !== 'object') return null\n if (item[discriminator]) return item\n if (item.blockType && item.data && typeof item.data === 'object') {\n return { [discriminator]: item.blockType, ...item.data }\n }\n return item\n }\n\n const fromArray = (items: any[]) =>\n items.map(normalizeItem).filter((item) => item && typeof item === 'object')\n\n if (Array.isArray(value)) return fromArray(value)\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? fromArray(parsed) : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction renderBlockTemplate(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n return `\n \n `\n}\n\nfunction renderBlockItem(\n field: FieldDefinition,\n blockValue: any,\n blocks: Array<{\n name: string\n label: string\n description?: string\n properties: Record\n }>,\n discriminator: string,\n index: number,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockType = blockValue?.[discriminator] || blockValue?.blockType\n const blockDefinition = blocks.find((block) => block.name === blockType)\n\n if (!blockDefinition) {\n return `\n
\n Unknown block type: ${escapeHtml(String(blockType || 'unknown'))}. This block will be preserved as-is.\n
\n `\n }\n\n const data =\n blockValue && typeof blockValue === 'object'\n ? Object.fromEntries(Object.entries(blockValue).filter(([key]) => key !== discriminator))\n : {}\n\n return renderBlockCard(field, blockDefinition, discriminator, String(index), data, pluginStatuses)\n}\n\nfunction renderBlockCard(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n index: string,\n data: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockFields = Object.entries(block.properties)\n .map(([fieldName, fieldConfig]) => {\n if (fieldConfig?.type === 'array' && fieldConfig?.items?.blocks) {\n return `\n
\n Nested blocks are not supported yet for \"${escapeHtml(fieldName)}\".\n
\n `\n }\n\n const normalizedField = normalizeBlockField(fieldConfig, fieldName)\n const fieldValue = data?.[fieldName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `block-${field.field_name}-${index}-${fieldName}`,\n field_name: `block-${field.field_name}-${index}-${fieldName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n })\n .join('')\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${escapeHtml(block.label)}\n \n
\n ${block.description ? `

${escapeHtml(block.description)}

` : ''}\n
\n
\n
\n \n \n \n \n
\n
\n
\n ${blockFields}\n
\n
\n `\n}\n\nfunction normalizeBlockField(fieldConfig: any, fieldName: string) {\n const type = fieldConfig?.type || 'text'\n const label = fieldConfig?.title || fieldName\n const required = fieldConfig?.required === true\n const options = { ...fieldConfig }\n\n if (type === 'select' && Array.isArray(fieldConfig?.enum)) {\n options.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return {\n type,\n label,\n required,\n defaultValue: fieldConfig?.default,\n options,\n }\n}\n\nfunction getStructuredFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction getBlocksFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}\n","/**\n * User Profile Custom Fields Renderer\n *\n * Generates the HTML section for custom profile fields by adapting\n * ProfileFieldDefinition into FieldDefinition and calling renderDynamicField.\n */\n\nimport { renderDynamicField, type FieldDefinition } from '../../../templates/components/dynamic-field.template'\nimport type { UserProfileConfig, ProfileFieldDefinition } from './user-profile-registry'\n\nexport function toFieldDefinition(field: ProfileFieldDefinition, index: number): FieldDefinition {\n return {\n id: `custom_${field.name}`,\n field_name: `custom_${field.name}`,\n field_type: field.type,\n field_label: field.label,\n field_options: {\n placeholder: field.placeholder || '',\n helpText: field.helpText || '',\n enum: field.options || [],\n enumLabels: field.options || [],\n },\n field_order: index,\n is_required: field.required || false,\n is_searchable: false,\n }\n}\n\nexport function renderCustomProfileSection(\n config: UserProfileConfig | null,\n customData: Record\n): string {\n if (!config || config.fields.length === 0) return ''\n\n const visibleFields = config.fields.filter(f => !f.hidden)\n if (visibleFields.length === 0) return ''\n\n const fieldsHtml = visibleFields\n .map((field, index) => {\n const fieldDef = toFieldDefinition(field, index)\n const value = customData[field.name] ?? field.default ?? ''\n return renderDynamicField(fieldDef, { value })\n })\n .join('\\n')\n\n return `\n \n
\n

Custom Profile Fields

\n
\n ${fieldsHtml}\n
\n
`\n}\n","/**\n * User Profiles Plugin\n *\n * Configurable custom profile fields for users.\n * Developers call defineUserProfile() at app boot to declare custom fields\n * that are stored as JSON in user_profiles.data and rendered in the admin UI.\n *\n * API Routes:\n * GET /api/user-profiles/schema → Public field definitions\n * GET /api/user-profiles/:userId → Get custom data for a user (auth required)\n * PUT /api/user-profiles/:userId → Update custom data for a user (auth required)\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { getUserProfileConfig } from './user-profile-registry'\nimport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\nimport { renderCustomProfileSection } from './user-profile-renderer'\n\nexport function createUserProfilesPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'user-profiles',\n version: '1.0.0-beta.1',\n description: 'Configurable custom profile fields for users',\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com',\n },\n license: 'MIT',\n compatibility: '^2.0.0',\n })\n\n // ==================== API Routes ====================\n\n const api = new Hono()\n\n // GET /api/user-profiles/schema — public schema endpoint\n api.get('/schema', (c) => {\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ fields: [], registrationFields: [] })\n }\n return c.json({\n fields: config.fields\n .filter(f => !f.hidden)\n .map(f => ({\n name: f.name,\n label: f.label,\n type: f.type,\n options: f.options,\n required: f.required || false,\n placeholder: f.placeholder,\n helpText: f.helpText,\n default: f.default,\n validation: f.validation,\n })),\n registrationFields: config.registrationFields || [],\n })\n })\n\n // GET /api/user-profiles/:userId — get custom data\n api.get('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const userId = c.req.param('userId')\n const data = await getCustomData(db, userId)\n return c.json({ userId, customData: data })\n })\n\n // PUT /api/user-profiles/:userId — update custom data\n api.put('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ error: 'No profile schema configured' }, 400)\n }\n\n const userId = c.req.param('userId')\n const body = await c.req.json()\n const customData = body.customData || body\n\n const sanitized = sanitizeCustomData(customData, config)\n const validation = validateCustomData(sanitized, config)\n if (!validation.valid) {\n return c.json({ error: 'Validation failed', errors: validation.errors }, 400)\n }\n\n await saveCustomData(db, userId, sanitized)\n return c.json({ success: true })\n })\n\n builder.addRoute('/api/user-profiles', api, {\n description: 'Custom user profile fields API',\n requiresAuth: false,\n priority: 100,\n })\n\n builder.lifecycle({\n activate: async () => {\n console.info('[SonicJS] User Profiles plugin activated')\n },\n deactivate: async () => {\n console.info('[SonicJS] User Profiles plugin deactivated')\n },\n })\n\n return builder.build() as Plugin\n}\n\nexport const userProfilesPlugin = createUserProfilesPlugin()\n\n// Re-export public API\nexport {\n defineUserProfile,\n getUserProfileConfig,\n getProfileFieldDefaults,\n getRegistrationFields,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\n\nexport { renderCustomProfileSection } from './user-profile-renderer'\n","import { Hono } from 'hono'\n// import { zValidator } from '@hono/zod-validator'\nimport { z } from 'zod'\nimport { getCookie, setCookie } from 'hono/cookie'\nimport { html } from 'hono/html'\nimport { AuthManager, requireAuth, generateCsrfToken, rateLimit } from '../middleware'\nimport { getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb } from '../middleware/auth'\nimport { renderLoginPage, LoginPageData } from '../templates/pages/auth-login.template'\nimport { renderRegisterPage, RegisterPageData } from '../templates/pages/auth-register.template'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { authValidationService, isRegistrationEnabled, isFirstUserRegistration } from '../services/auth-validation'\nimport type { RegistrationData } from '../services/auth-validation'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, getRegistrationFields, getProfileFieldDefaults, sanitizeCustomData, saveCustomData, getCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n/** Set a signed CSRF cookie alongside the auth cookie on login/register. */\nasync function setCsrfCookie(c: any, maxAge?: number): Promise {\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n const csrfToken = await generateCsrfToken(secret)\n const cookieMaxAge = maxAge ?? (await getJwtExpirySecondsFromDb(c.env?.DB, c.env))\n setCookie(c, 'csrf_token', csrfToken, {\n httpOnly: false,\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: cookieMaxAge,\n })\n}\n\n/** Clear the CSRF cookie on logout. */\nfunction clearCsrfCookie(c: any): void {\n setCookie(c, 'csrf_token', '', {\n httpOnly: false,\n secure: false,\n sameSite: 'Strict',\n path: '/',\n maxAge: 0,\n })\n}\n\nconst authRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Login page (HTML form)\nauthRoutes.get('/login', async (c) => {\n const error = c.req.query('error')\n const message = c.req.query('message')\n \n const pageData: LoginPageData = {\n error: error || undefined,\n message: message || undefined,\n version: c.get('appVersion')\n }\n \n // Check if demo login plugin is active\n const db = c.env.DB\n let demoLoginActive = false\n try {\n const plugin = await db.prepare('SELECT * FROM plugins WHERE id = ? AND status = ?')\n .bind('demo-login-prefill', 'active')\n .first()\n demoLoginActive = !!plugin\n } catch (error) {\n // Ignore database errors - plugin system might not be initialized\n }\n \n return c.html(renderLoginPage(pageData, demoLoginActive))\n})\n\n// Registration page (HTML form)\nauthRoutes.get('/register', async (c) => {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.redirect('/auth/login?error=Registration is currently disabled')\n }\n }\n\n const error = c.req.query('error')\n\n const pageData: RegisterPageData = {\n error: error || undefined\n }\n\n return c.html(renderRegisterPage(pageData))\n})\n\n// Login schema\nconst loginSchema = z.object({\n email: z.string().email('Valid email is required'),\n password: z.string().min(1, 'Password is required')\n})\n\n// Register new user\nauthRoutes.post('/register',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.json({ error: 'Registration is currently disabled' }, 403)\n }\n }\n\n // Parse JSON with error handling\n let requestData\n try {\n requestData = await c.req.json()\n } catch (parseError) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n\n let validatedData: RegistrationData\n try {\n validatedData = await validationSchema.parseAsync(requestData)\n } catch (validationError: any) {\n return c.json({\n error: 'Validation failed',\n details: validationError.issues?.map((e: any) => e.message) || [validationError.message || 'Invalid request data']\n }, 400)\n }\n\n // Extract fields with defaults for optional ones\n const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.json({ error: 'User with this email or username already exists' }, 400)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n \n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n 'viewer', // Default role\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n \n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n if (requestData[field.name] !== undefined) {\n customData[field.name] = requestData[field.name]\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, 'viewer', c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n user: {\n id: userId,\n email: normalizedEmail,\n username,\n firstName,\n lastName,\n role: 'viewer'\n },\n token\n }, 201)\n } catch (error) {\n console.error('Registration error:', error)\n // Return validation errors as 400, other errors as 500\n if (error instanceof Error && error.message.includes('validation')) {\n return c.json({ error: error.message }, 400)\n }\n return c.json({\n error: 'Registration failed',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n }\n)\n\n// Login user\nauthRoutes.post('/login',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const body = await c.req.json()\n const validation = loginSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const { email, password } = validation.data\n const db = c.env.DB\n \n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Find user with caching\n const cache = getCacheService(CACHE_CONFIGS.user!)\n let user = await cache.get(cache.generateKey('user', `email:${normalizedEmail}`))\n\n if (!user) {\n user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n\n if (user) {\n // Cache the user for faster subsequent lookups\n await cache.set(cache.generateKey('user', `email:${normalizedEmail}`), user)\n await cache.set(cache.generateKey('user', user.id), user)\n }\n }\n\n if (!user) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n // Invalidate user cache on login\n await cache.delete(cache.generateKey('user', user.id))\n await cache.delete(cache.generateKey('user', `email:${normalizedEmail}`))\n\n return c.json({\n user: {\n id: user.id,\n email: user.email,\n username: user.username,\n firstName: user.first_name,\n lastName: user.last_name,\n role: user.role\n },\n token\n })\n } catch (error) {\n console.error('Login error:', error)\n return c.json({ error: 'Login failed' }, 500)\n }\n})\n\n// Logout user (both GET and POST for convenience)\nauthRoutes.post('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.json({ message: 'Logged out successfully' })\n})\n\nauthRoutes.get('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.redirect('/auth/login?message=You have been logged out successfully')\n})\n\n// Get current user\nauthRoutes.get('/me', requireAuth(), async (c) => {\n try {\n // This would need the auth middleware applied\n const user = c.get('user')\n \n if (!user) {\n return c.json({ error: 'Not authenticated' }, 401)\n }\n \n const db = c.env.DB\n const userData = await db.prepare('SELECT id, email, username, first_name, last_name, role, created_at FROM users WHERE id = ?')\n .bind(user.userId)\n .first() as Record | null\n\n if (!userData) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n const customData = await getCustomData(db, user.userId)\n return c.json({ user: { ...userData, ...customData } })\n } catch (error) {\n console.error('Get user error:', error)\n return c.json({ error: 'Failed to get user' }, 500)\n }\n})\n\n// Refresh token (sliding session)\n//\n// Accepts a valid JWT — or one that has expired within the grace window\n// (`JWT_REFRESH_GRACE_SECONDS`, default 7 days) — and issues a fresh JWT\n// with a new `exp`. This lets a long-lived session cookie keep a user\n// logged in across JWT expirations without forcing a full re-login.\n//\n// Security: the caller must still present a valid-signature token that\n// recently belonged to an active user. Fully forged or long-expired tokens\n// are rejected.\nauthRoutes.post('/refresh',\n rateLimit({ max: 60, windowMs: 60 * 1000, keyPrefix: 'refresh' }),\n async (c) => {\n try {\n // Accept token from Authorization header or cookie\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) token = getCookie(c, 'auth_token')\n\n if (!token) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const grace = await getJwtRefreshGraceSecondsFromDb(db, c.env)\n\n const payload = await AuthManager.verifyToken(token, c.env.JWT_SECRET, grace)\n if (!payload) {\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Re-validate the user is still active, and pick up any role changes.\n const row = await db.prepare('SELECT id, email, role, is_active FROM users WHERE id = ?')\n .bind(payload.userId)\n .first() as any\n\n if (!row || !row.is_active) {\n return c.json({ error: 'User is not active' }, 401)\n }\n\n // Generate new token with a fresh exp\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env)\n const newToken = await AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set new cookie\n setCookie(c, 'auth_token', newToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n token: newToken,\n expiresIn: tokenTtl\n })\n } catch (error) {\n console.error('Token refresh error:', error)\n return c.json({ error: 'Token refresh failed' }, 500)\n }\n})\n\n// Form-based registration handler (for HTML forms)\nauthRoutes.post('/register/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.html(html`\n
\n Registration is currently disabled. Please contact an administrator.\n
\n `)\n }\n }\n\n const formData = await c.req.formData()\n\n // Extract form data\n const requestData = {\n email: formData.get('email') as string,\n password: formData.get('password') as string,\n username: formData.get('username') as string,\n firstName: formData.get('firstName') as string,\n lastName: formData.get('lastName') as string,\n }\n\n // Normalize email to lowercase\n const normalizedEmail = requestData.email?.toLowerCase()\n requestData.email = normalizedEmail\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n const validation = await validationSchema.safeParseAsync(requestData)\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const validatedData: RegistrationData = validation.data\n\n // Extract fields with defaults for optional ones\n // const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.html(html`\n
\n User with this email or username already exists\n
\n `)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Determine role: first user gets admin, others get viewer\n const role = isFirstUser ? 'admin' : 'viewer'\n\n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n\n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n role,\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n\n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n const raw = formData.get(field.name)?.toString()\n if (raw !== undefined && raw !== null) {\n customData[field.name] = raw\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Redirect based on role\n const redirectUrl = role === 'admin' ? '/admin/dashboard' : '/admin/dashboard'\n\n return c.html(html`\n
\n Account created successfully! Redirecting...\n \n
\n `)\n } catch (error) {\n console.error('Registration error:', error)\n return c.html(html`\n
\n Registration failed. Please try again.\n
\n `)\n }\n})\n\n// Form-based login handler (for HTML forms)\nauthRoutes.post('/login/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email') as string\n const password = formData.get('password') as string\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n\n // Validate the data\n const validation = loginSchema.safeParse({ email: normalizedEmail, password })\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const db = c.env.DB\n \n // Find user\n const user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n \n if (!user) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n return c.html(html`\n
\n
\n
\n \n \n \n
\n

Login successful! Redirecting to admin dashboard...

\n
\n
\n \n
\n
\n `)\n } catch (error) {\n console.error('Login error:', error)\n return c.html(html`\n
\n Login failed. Please try again.\n
\n `)\n }\n})\n\n// Test seeding endpoint (only for development/testing)\nauthRoutes.post('/seed-admin',\n rateLimit({ max: 10, windowMs: 60 * 1000, keyPrefix: 'seed-admin' }),\n async (c) => {\n try {\n const db = c.env.DB\n \n // First ensure the users table exists\n await db.prepare(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL UNIQUE,\n username TEXT NOT NULL UNIQUE,\n first_name TEXT NOT NULL,\n last_name TEXT NOT NULL,\n password_hash TEXT,\n role TEXT NOT NULL DEFAULT 'viewer',\n avatar TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n last_login_at INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `).run()\n \n // Check if admin user already exists\n const existingAdmin = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind('admin@sonicjs.com', 'admin')\n .first()\n\n if (existingAdmin) {\n // Update the password to ensure it's correct for testing\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(passwordHash, Date.now(), existingAdmin.id)\n .run()\n\n return c.json({\n message: 'Admin user already exists (password updated)',\n user: {\n id: existingAdmin.id,\n email: 'admin@sonicjs.com',\n username: 'admin',\n role: 'admin'\n }\n })\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n \n // Create admin user\n const userId = 'admin-user-id'\n const now = Date.now()\n const adminEmail = 'admin@sonicjs.com'.toLowerCase()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n adminEmail,\n 'admin',\n 'Admin',\n 'User',\n passwordHash,\n 'admin',\n 1, // is_active\n now,\n now\n ).run()\n \n return c.json({ \n message: 'Admin user created successfully',\n user: {\n id: userId,\n email: adminEmail,\n username: 'admin',\n role: 'admin'\n },\n passwordHash: passwordHash // For debugging\n })\n } catch (error) {\n console.error('Seed admin error:', error)\n return c.json({ error: 'Failed to create admin user', details: error instanceof Error ? error.message : String(error) }, 500)\n }\n})\n\n\n// Accept invitation page\nauthRoutes.get('/accept-invitation', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.html(`\n \n Invitation Expired\n \n

Invitation Expired

\n

This invitation has expired. Please contact your administrator for a new invitation.

\n Go to Login\n \n \n `)\n }\n\n // Show invitation acceptance form\n return c.html(`\n \n \n \n \n \n Accept Invitation - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Accept Invitation

\n

Complete your account setup

\n

\n You've been invited as ${invitedUser.first_name} ${invitedUser.last_name}
\n ${invitedUser.email}
\n ${invitedUser.role}\n

\n
\n\n
\n \n \n
\n \n \n
\n\n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Accept invitation page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your invitation.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process invitation acceptance\nauthRoutes.post('/accept-invitation', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const username = formData.get('username')?.toString()?.trim()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !username || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'Invalid or expired invitation' }, 400)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.json({ error: 'Invitation has expired' }, 400)\n }\n\n // Check if username is available\n const existingUsernameStmt = db.prepare(`\n SELECT id FROM users WHERE username = ? AND id != ?\n `)\n const existingUsername = await existingUsernameStmt.bind(username, invitedUser.id).first()\n\n if (existingUsername) {\n return c.json({ error: 'Username is already taken' }, 400)\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Activate user account\n const updateStmt = db.prepare(`\n UPDATE users SET \n username = ?,\n password_hash = ?,\n is_active = 1,\n email_verified = 1,\n invitation_token = NULL,\n accepted_invitation_at = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n username,\n passwordHash,\n Date.now(),\n Date.now(),\n invitedUser.id\n ).run()\n\n // Generate JWT token for auto-login\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const authToken = await AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', authToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?welcome=true')\n\n } catch (error) {\n console.error('Accept invitation error:', error)\n return c.json({ error: 'Failed to accept invitation' }, 500)\n }\n})\n\n// Request password reset\nauthRoutes.post('/request-password-reset',\n rateLimit({ max: 3, windowMs: 15 * 60 * 1000, keyPrefix: 'password-reset' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email')?.toString()?.trim()?.toLowerCase()\n\n if (!email) {\n return c.json({ error: 'Email is required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if user exists and is active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name FROM users \n WHERE email = ? AND is_active = 1\n `)\n const user = await userStmt.bind(email).first() as any\n\n // Always return success to prevent email enumeration\n if (!user) {\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.'\n })\n }\n\n // Generate password reset token (expires in 1 hour)\n const resetToken = crypto.randomUUID()\n const resetExpires = Date.now() + (60 * 60 * 1000) // 1 hour\n\n // Update user with reset token\n const updateStmt = db.prepare(`\n UPDATE users SET \n password_reset_token = ?,\n password_reset_expires = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n resetToken,\n resetExpires,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // In a real implementation, you would send an email here\n // For now, we'll return the reset link for development\n const resetLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/reset-password?token=${resetToken}`\n\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.',\n reset_link: resetLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('Password reset request error:', error)\n return c.json({ error: 'Failed to process password reset request' }, 500)\n }\n})\n\n// Show password reset form\nauthRoutes.get('/reset-password', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, password_reset_expires\n FROM users \n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has already been used.

\n Go to Login\n \n \n `)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.html(`\n \n Reset Link Expired\n \n

Reset Link Expired

\n

The password reset link has expired. Please request a new one.

\n Go to Login\n \n \n `)\n }\n\n // Show password reset form\n return c.html(`\n \n \n \n \n \n Reset Password - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Reset Password

\n

Choose a new password for your account

\n

\n Reset password for ${user.first_name} ${user.last_name}
\n ${user.email}\n

\n
\n\n
\n \n \n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n\n \n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Password reset page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your password reset.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process password reset\nauthRoutes.post('/reset-password', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, password_hash, password_reset_expires\n FROM users\n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.json({ error: 'Invalid or expired reset token' }, 400)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.json({ error: 'Reset token has expired' }, 400)\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(password)\n\n // Store old password in history (skip if table doesn't exist)\n try {\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user.id,\n user.password_hash,\n Date.now()\n ).run()\n } catch (historyError) {\n // Password history table may not exist yet\n console.warn('Could not store password history:', historyError)\n }\n\n // Update user password and clear reset token\n const updateStmt = db.prepare(`\n UPDATE users SET\n password_hash = ?,\n password_reset_token = NULL,\n password_reset_expires = NULL,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newPasswordHash,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to login with success message\n return c.redirect('/auth/login?message=Password reset successfully. Please log in with your new password.')\n\n } catch (error) {\n console.error('Password reset error:', error)\n return c.json({ error: 'Failed to reset password' }, 500)\n }\n})\n\nexport default authRoutes\n","/**\n * Test Cleanup Routes\n *\n * Provides endpoints to clean up test data after e2e tests\n * WARNING: These endpoints should only be available in development/test environments\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database } from '@cloudflare/workers-types'\n\nconst app = new Hono()\n\n/**\n * Clean up all test data (collections, content, users except admin)\n * POST /test-cleanup\n */\napp.post('/test-cleanup', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Use pattern-based deletes to avoid SQL variable limits\n // This approach uses subqueries instead of building large IN lists\n\n // Step 1: Delete child data for test content (by pattern)\n await db.prepare(`\n DELETE FROM content_versions\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM workflow_history\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n // Note: content_data table may not exist in all schemas\n try {\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n } catch (e) {\n // Table doesn't exist, skip\n }\n\n // Step 2: Delete test content by pattern\n const contentResult = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n `).run()\n deletedCount += contentResult.meta?.changes || 0\n\n // Step 3: Delete child data for test users\n await db.prepare(`\n DELETE FROM api_tokens\n WHERE user_id IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM media\n WHERE uploaded_by IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n // Step 4: Delete test users\n const usersResult = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n `).run()\n deletedCount += usersResult.meta?.changes || 0\n\n // Step 5: Delete child data for test collections\n try {\n await db.prepare(`\n DELETE FROM collection_fields\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Delete remaining content from test collections\n await db.prepare(`\n DELETE FROM content\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n\n // Step 6: Delete test collections\n const collectionsResult = await db.prepare(`\n DELETE FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).run()\n deletedCount += collectionsResult.meta?.changes || 0\n\n // Step 7: Clean up orphaned data (skip if tables don't exist)\n try {\n await db.prepare(`\n DELETE FROM content_data WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM collection_fields WHERE collection_id NOT IN (SELECT id FROM collections)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM content_versions WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM workflow_history WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Step 8: Delete old activity logs (keep only last 100)\n await db.prepare(`\n DELETE FROM activity_logs\n WHERE id NOT IN (\n SELECT id FROM activity_logs\n ORDER BY created_at DESC\n LIMIT 100\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test data cleaned up successfully'\n })\n } catch (error) {\n console.error('Test cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test users only\n * POST /test-cleanup/users\n */\napp.post('/test-cleanup/users', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test users (preserve admin)\n const result = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com'\n AND (\n email LIKE '%test%'\n OR email LIKE '%example.com%'\n OR first_name = 'Test'\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test users cleaned up successfully'\n })\n } catch (error) {\n console.error('User cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test collections only\n * POST /test-cleanup/collections\n */\napp.post('/test-cleanup/collections', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Get test collection IDs first\n const collections = await db.prepare(`\n SELECT id FROM collections\n WHERE name LIKE 'test_%'\n OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).all()\n\n if (collections.results && collections.results.length > 0) {\n const collectionIds = collections.results.map((c: any) => c.id)\n\n // Delete associated fields\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM collection_fields WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete associated content\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM content WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete the collections\n const result = await db.prepare(`\n DELETE FROM collections\n WHERE id IN (${collectionIds.map(() => '?').join(',')})\n `).bind(...collectionIds).run()\n\n deletedCount = result.meta?.changes || 0\n }\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test collections cleaned up successfully'\n })\n } catch (error) {\n console.error('Collection cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test content only\n * POST /test-cleanup/content\n */\napp.post('/test-cleanup/content', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test content\n const result = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %'\n OR title LIKE '%E2E%'\n OR title LIKE '%Playwright%'\n OR title LIKE '%Sample%'\n `).run()\n\n // Clean up orphaned content_data\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test content cleaned up successfully'\n })\n } catch (error) {\n console.error('Content cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Plugin Middleware\n *\n * Provides middleware functions for checking plugin status and enforcing plugin requirements\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n/**\n * Check if a plugin is active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @returns Promise - True if the plugin is active, false otherwise\n */\nexport async function isPluginActive(db: D1Database, pluginId: string): Promise {\n try {\n const result = await db\n .prepare('SELECT status FROM plugins WHERE id = ?')\n .bind(pluginId)\n .first()\n\n return result?.status === 'active'\n } catch (error) {\n console.error(`[isPluginActive] Error checking plugin status for ${pluginId}:`, error)\n return false\n }\n}\n\n/**\n * Middleware to require a plugin to be active\n * Throws an error if the plugin is not active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @throws Error if plugin is not active\n */\nexport async function requireActivePlugin(db: D1Database, pluginId: string): Promise {\n const isActive = await isPluginActive(db, pluginId)\n if (!isActive) {\n throw new Error(`Plugin '${pluginId}' is required but is not active`)\n }\n}\n\n/**\n * Middleware to require multiple plugins to be active\n * Throws an error if any plugin is not active\n * @param db - The D1 database instance\n * @param pluginIds - Array of plugin IDs to check\n * @throws Error if any plugin is not active\n */\nexport async function requireActivePlugins(db: D1Database, pluginIds: string[]): Promise {\n for (const pluginId of pluginIds) {\n await requireActivePlugin(db, pluginId)\n }\n}\n\n/**\n * Get all active plugins\n * @param db - The D1 database instance\n * @returns Promise - Array of active plugin records\n */\nexport async function getActivePlugins(db: D1Database): Promise {\n try {\n const { results } = await db\n .prepare('SELECT * FROM plugins WHERE status = ?')\n .bind('active')\n .all()\n\n return results || []\n } catch (error) {\n console.error('[getActivePlugins] Error fetching active plugins:', error)\n return []\n }\n}\n","export interface ContentVersion {\n id: string\n version: number\n data: any\n author_id: string\n author_name?: string\n created_at: number\n is_current?: boolean\n}\n\nexport interface VersionHistoryData {\n contentId: string\n versions: ContentVersion[]\n currentVersion: number\n}\n\nexport function renderVersionHistory(data: VersionHistoryData): string {\n return `\n
\n
\n \n
\n
\n
\n

Version History

\n \n
\n
\n \n \n
\n
\n ${data.versions.map((version, index) => `\n
\n
\n
\n \n Version ${version.version}${version.is_current ? ' (Current)' : ''}\n \n \n ${new Date(version.created_at).toLocaleString()}\n \n
\n
\n ${!version.is_current ? `\n \n ` : ''}\n \n
\n
\n \n \n
\n
\n
\n Title:\n ${escapeHtml(version.data?.title || 'Untitled')}\n
\n
\n Author:\n ${escapeHtml(version.author_name || 'Unknown')}\n
\n ${version.data?.excerpt ? `\n
\n Excerpt:\n

${escapeHtml(version.data.excerpt.substring(0, 200))}${version.data.excerpt.length > 200 ? '...' : ''}

\n
\n ` : ''}\n
\n
\n \n \n ${!version.is_current && index < data.versions.length - 1 ? `\n
\n \n
\n Change detection coming soon...\n
\n
\n ` : ''}\n
\n `).join('')}\n
\n
\n \n \n
\n
\n \n ${data.versions.length} version${data.versions.length !== 1 ? 's' : ''} total\n \n \n
\n
\n
\n
\n \n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * EasyMDE Markdown Editor Plugin\n *\n * Provides markdown editing capabilities for richtext fields.\n * When active, this plugin injects the EasyMDE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'easy-mdx',\n version: '1.0.0',\n description: 'Lightweight markdown editor with live preview'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ EasyMDE editor plugin activated')\n },\n deactivate: async () => {\n console.info('❌ EasyMDE editor plugin deactivated')\n }\n})\n\nconst easyMdxPlugin = builder.build() as Plugin\n\nexport default easyMdxPlugin\n\n/**\n * Get EasyMDE CDN script tags\n * @returns HTML script and style tags for EasyMDE\n */\nexport function getMDXEditorScripts(): string {\n return `\n \n \n \n \n `\n}\n\n/**\n * Get EasyMDE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getMDXEditorInitScript(config?: {\n defaultHeight?: number\n toolbar?: string\n placeholder?: string\n}): string {\n const defaultHeight = config?.defaultHeight || 400\n const toolbar = config?.toolbar || 'full'\n const placeholder = config?.placeholder || 'Start writing your content...'\n\n return `\n // Initialize EasyMDE (Markdown Editor) only for markdown-marked fields\n function initializeMDXEditor() {\n if (typeof EasyMDE === 'undefined') {\n console.warn('EasyMDE not loaded yet, retrying...');\n setTimeout(initializeMDXEditor, 100);\n return;\n }\n\n // Find all textareas that need EasyMDE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"easymde\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (textarea.dataset.mdxeditorInitialized === 'true') {\n return;\n }\n\n // Mark as initialized\n textarea.dataset.mdxeditorInitialized = 'true';\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const editorToolbar = container?.dataset.toolbar || '${toolbar}';\n\n // Initialize EasyMDE\n try {\n const toolbarButtons = editorToolbar === 'minimal'\n ? ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'preview']\n : ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', 'table', '|', 'preview', 'side-by-side', 'fullscreen', '|', 'guide'];\n\n const easyMDE = new EasyMDE({\n element: textarea,\n placeholder: '${placeholder}',\n spellChecker: false,\n minHeight: height + 'px',\n toolbar: toolbarButtons,\n status: ['lines', 'words', 'cursor'],\n renderingConfig: {\n singleLineBreaks: false,\n codeSyntaxHighlighting: true\n }\n });\n\n // Store reference to editor instance\n textarea.easyMDEInstance = easyMDE;\n\n // Sync changes back to textarea\n easyMDE.codemirror.on(\"change\", () => {\n textarea.value = easyMDE.value();\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n textarea.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n\n console.log('EasyMDE initialized for field:', textarea.id || textarea.name);\n } catch (error) {\n console.error('Error initializing EasyMDE:', error);\n // Show textarea as fallback\n textarea.style.display = 'block';\n }\n });\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeMDXEditor);\n } else {\n // DOM already loaded, initialize immediately\n initializeMDXEditor();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeMDXEditor, 100);\n });\n `\n}\n\n/**\n * Check if EasyMDE editor plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isEasyMdxActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('easy-mdx')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking EasyMDE editor plugin status:', error)\n return false\n }\n}\n","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * TinyMCE Rich Text Editor Plugin\n *\n * Provides WYSIWYG editing capabilities for richtext fields.\n * When active, this plugin injects the TinyMCE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'tinymce-plugin',\n version: '1.0.0',\n description: 'Powerful WYSIWYG rich text editor for content creation'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ TinyMCE plugin activated')\n },\n deactivate: async () => {\n console.info('❌ TinyMCE plugin deactivated')\n }\n})\n\nconst tinymcePlugin = builder.build() as Plugin\n\nexport default tinymcePlugin\n\n/**\n * Get TinyMCE CDN script tag\n * @param apiKey - Optional TinyMCE API key (defaults to 'no-api-key')\n * @returns HTML script tag for TinyMCE CDN\n */\nexport function getTinyMCEScript(apiKey: string = 'no-api-key'): string {\n return ``\n}\n\n/**\n * Get TinyMCE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getTinyMCEInitScript(config?: {\n skin?: string\n defaultHeight?: number\n defaultToolbar?: string\n}): string {\n const skin = config?.skin || 'oxide-dark'\n const contentCss = skin.includes('dark') ? 'dark' : 'default'\n const defaultHeight = config?.defaultHeight || 300\n\n return `\n // Initialize TinyMCE only for TinyMCE-backed richtext fields\n function initializeTinyMCE() {\n if (typeof tinymce !== 'undefined') {\n // Find all textareas that need TinyMCE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"tinymce\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (tinymce.get(textarea.id)) {\n return;\n }\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const toolbar = container?.dataset.toolbar || 'full';\n\n tinymce.init({\n selector: '#' + textarea.id,\n skin: '${skin}',\n content_css: '${contentCss}',\n height: parseInt(height),\n menubar: false,\n plugins: [\n 'advlist', 'autolink', 'lists', 'link', 'image', 'charmap', 'preview',\n 'anchor', 'searchreplace', 'visualblocks', 'code', 'fullscreen',\n 'insertdatetime', 'media', 'table', 'help', 'wordcount'\n ],\n toolbar: toolbar === 'simple'\n ? 'bold italic underline | bullist numlist | link'\n : toolbar === 'minimal'\n ? 'bold italic | link'\n : 'undo redo | blocks | bold italic forecolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | help',\n content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; font-size: 14px }'\n });\n });\n }\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeTinyMCE);\n } else {\n // DOM already loaded, initialize immediately\n initializeTinyMCE();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeTinyMCE, 100);\n });\n `\n}\n\n/**\n * Check if TinyMCE plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isTinyMCEActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('tinymce-plugin')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking TinyMCE plugin status:', error)\n return false\n }\n}\n","/**\n * Quill Rich Text Editor Plugin\n *\n * Provides Quill editor integration for rich text editing in SonicJS\n * https://quilljs.com/\n */\n\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\n/**\n * Quill Editor Configuration Options\n */\nexport interface QuillOptions {\n theme?: 'snow' | 'bubble'\n placeholder?: string\n height?: number\n toolbar?: 'full' | 'simple' | 'minimal' | string[][]\n modules?: Record\n formats?: string[]\n}\n\n/**\n * Default Quill toolbar configurations\n */\nconst QUILL_TOOLBARS = {\n full: [\n [{ 'header': [1, 2, 3, 4, 5, 6, false] }],\n ['bold', 'italic', 'underline', 'strike'],\n [{ 'color': [] }, { 'background': [] }],\n [{ 'align': [] }],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n [{ 'indent': '-1'}, { 'indent': '+1' }],\n ['blockquote', 'code-block'],\n ['link', 'image', 'video'],\n ['clean']\n ],\n simple: [\n ['bold', 'italic', 'underline'],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n ['link']\n ],\n minimal: [\n ['bold', 'italic'],\n ['link']\n ]\n}\n\n/**\n * Render a Quill editor field\n * @param fieldId - The field ID\n * @param fieldName - The field name\n * @param value - The current value\n * @param options - Quill configuration options\n * @returns HTML string for the Quill editor field\n */\nexport function renderQuillField(\n fieldId: string,\n fieldName: string,\n value: string = '',\n options: QuillOptions = {}\n): string {\n const {\n theme = 'snow',\n placeholder = 'Enter content...',\n height = 300,\n toolbar = 'full'\n } = options\n\n // Escape HTML for hidden input\n const escapeHtml = (str: string) => {\n return str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n }\n\n return `\n
\n \n ${value}
\n\n \n \n \n `\n}\n\n/**\n * Generate Quill initialization script\n * @returns HTML script tag with Quill initialization code\n */\nexport function getQuillInitScript(): string {\n return `\n \n `\n}\n\n/**\n * Generate Quill CDN links\n * @param version - Quill version (default: 2.0.2)\n * @returns HTML script and link tags for Quill CDN\n */\nexport function getQuillCDN(version: string = '2.0.2'): string {\n return `\n \n \n \n\n \n \n\n \n \n `\n}\n\n/**\n * Create the Quill Editor Plugin\n */\nexport function createQuillEditorPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'quill-editor',\n version: '1.0.0',\n description: 'Quill rich text editor integration for SonicJS'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Quill Editor plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Quill Editor plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const quillEditorPlugin = createQuillEditorPlugin()\n","import { getMDXEditorInitScript, getMDXEditorScripts } from '../../plugins/available/easy-mdx'\nimport { getTinyMCEInitScript, getTinyMCEScript } from '../../plugins/available/tinymce-plugin'\nimport { getQuillCDN, getQuillInitScript } from '../../plugins/core-plugins/quill-editor'\nimport { renderAlert } from '../alert.template'\nimport { FieldDefinition, renderDynamicField, renderFieldGroup } from '../components/dynamic-field.template'\nimport { getConfirmationDialogScript, renderConfirmationDialog } from '../confirmation-dialog.template'\nimport { AdminLayoutCatalystData, renderAdminLayoutCatalyst } from '../layouts/admin-layout-catalyst.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n schema: any\n}\n\nexport interface ContentFormData {\n id?: string\n title?: string\n slug?: string\n created_at?: number\n updated_at?: number\n published_at?: number\n data?: any\n status?: string\n scheduled_publish_at?: number\n scheduled_unpublish_at?: number\n review_status?: string\n meta_title?: string\n meta_description?: string\n collection: Collection\n fields: FieldDefinition[]\n isEdit?: boolean\n error?: string\n success?: string\n validationErrors?: Record\n workflowEnabled?: boolean // New flag to indicate if workflow plugin is active\n tinymceEnabled?: boolean // Flag to indicate if TinyMCE plugin is active\n tinymceSettings?: {\n apiKey?: string\n defaultHeight?: number\n defaultToolbar?: string\n skin?: string\n }\n quillEnabled?: boolean // Flag to indicate if Quill plugin is active\n quillSettings?: {\n version?: string\n defaultHeight?: number\n defaultToolbar?: string\n theme?: string\n }\n mdxeditorEnabled?: boolean // Flag to indicate if MDXEditor plugin is active\n mdxeditorSettings?: {\n defaultHeight?: number\n theme?: string\n toolbar?: string\n placeholder?: string\n }\n referrerParams?: string // URL parameters to preserve filters when returning to list\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentFormPage(data: ContentFormData): string {\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? `Edit: ${data.title || 'Content'}` : `New ${data.collection.display_name}`\n const hasValidationErrors = Boolean(data.validationErrors && Object.keys(data.validationErrors).length > 0)\n\n // Construct back URL with preserved filters\n const backUrl = data.referrerParams\n ? `/admin/content?${data.referrerParams}`\n : `/admin/content?collection=${data.collection.id}`\n\n // Group fields by category\n const coreFields = data.fields.filter(f => ['title', 'slug', 'content'].includes(f.field_name))\n const contentFields = data.fields.filter(f => !['title', 'slug', 'content'].includes(f.field_name) && !f.field_name.startsWith('meta_'))\n const metaFields = data.fields.filter(f => f.field_name.startsWith('meta_'))\n\n // Helper function to get field value - title and slug are stored as columns, others in data JSON\n const getFieldValue = (fieldName: string) => {\n if (fieldName === 'title') return data.title || data.data?.[fieldName] || ''\n if (fieldName === 'slug') return data.slug || data.data?.[fieldName] || ''\n return data.data?.[fieldName] || ''\n }\n\n // Prepare plugin statuses for field rendering\n const pluginStatuses = {\n quillEnabled: data.quillEnabled || false,\n mdxeditorEnabled: data.mdxeditorEnabled || false,\n tinymceEnabled: data.tinymceEnabled || false\n }\n\n // Render field groups\n const coreFieldsHTML = coreFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id // Pass content ID when editing\n }))\n\n const contentFieldsHTML = contentFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const metaFieldsHTML = metaFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const pageContent = `\n
\n \n
\n
\n

${isEdit ? 'Edit Content' : 'New Content'}

\n

\n ${data.collection.description || `Manage ${data.collection.display_name.toLowerCase()} content`}\n

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

${data.collection.display_name}

\n

${isEdit ? 'Update your content' : 'Create new content'}

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n
\n \n
\n \n \n ${isEdit ? `` : ''}\n ${data.referrerParams ? `` : ''}\n \n \n ${renderFieldGroup('Basic Information', coreFieldsHTML)}\n \n \n ${contentFields.length > 0 ? renderFieldGroup('Content Details', contentFieldsHTML) : ''}\n \n \n ${metaFields.length > 0 ? renderFieldGroup('SEO & Metadata', metaFieldsHTML, true) : ''}\n \n
\n \n
\n\n \n
\n \n
\n

Publishing

\n\n ${data.workflowEnabled ? `\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n \n

Leave empty to publish immediately

\n
\n\n \n
\n \n \n

Automatically unpublish at this time

\n
\n ` : `\n \n
\n \n
\n \n \n \n \n \n \n \n
\n

Enable Workflow plugin for advanced status management

\n
\n `}\n
\n\n \n ${isEdit ? `\n
\n

Content Info

\n\n
\n
\n
Created
\n
${data.created_at ? new Date(data.created_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Last Modified
\n
${data.updated_at ? new Date(data.updated_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Author
\n
${data.data?.author || 'Unknown'}
\n
\n ${data.published_at ? `\n
\n
Published
\n
${new Date(data.published_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n\n
\n \n \n \n \n View Version History\n \n
\n
\n ` : ''}\n\n \n
\n

Quick Actions

\n\n
\n \n \n \n \n \n Preview Content\n \n\n \n \n \n \n Duplicate Content\n \n\n ${isEdit ? `\n \n \n \n \n Delete Content\n \n ` : ''}\n
\n
\n
\n\n \n
\n \n \n \n \n Cancel\n \n\n
\n \n \n \n \n ${isEdit ? 'Update' : 'Save'}\n \n\n ${data.user?.role !== 'viewer' ? `\n \n \n \n \n ${isEdit ? 'Update' : 'Save'} & Publish\n \n ` : ''}\n
\n
\n
\n
\n
\n\n \n ${renderConfirmationDialog({\n id: 'duplicate-content-confirm',\n title: 'Duplicate Content',\n message: 'Create a copy of this content?',\n confirmText: 'Duplicate',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performDuplicateContent()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-content-confirm',\n title: 'Delete Content',\n message: 'Are you sure you want to delete this content? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: `performDeleteContent('${data.id}')`\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-repeater-item-confirm',\n title: 'Delete Item',\n message: 'Are you sure you want to delete this item? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-block-confirm',\n title: 'Delete Block',\n message: 'Are you sure you want to delete this block? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${getConfirmationDialogScript()}\n\n ${data.tinymceEnabled ? getTinyMCEScript(data.tinymceSettings?.apiKey) : ''}\n\n ${data.quillEnabled ? getQuillCDN(data.quillSettings?.version) : ''}\n\n ${data.quillEnabled ? getQuillInitScript() : ''}\n\n ${data.mdxeditorEnabled ? getMDXEditorScripts() : ''}\n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n content: pageContent,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderTable, TableData, TableColumn } from '../table.template'\nimport type { FilterBarData } from '../filter-bar.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../confirmation-dialog.template'\n\nexport interface ContentItem {\n id: string\n title: string\n slug: string\n modelName: string\n statusBadge: string\n authorName: string\n formattedDate: string\n availableActions: string[]\n}\n\nexport interface ContentListPageData {\n modelName: string\n status: string\n page: number\n search?: string\n models: Array<{\n name: string\n displayName: string\n }>\n contentItems: ContentItem[]\n totalItems: number\n itemsPerPage: number\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentListPage(data: ContentListPageData): string {\n // Build current URL parameters to pass to edit page\n const urlParams = new URLSearchParams()\n if (data.modelName && data.modelName !== 'all') urlParams.set('model', data.modelName)\n if (data.status && data.status !== 'all') urlParams.set('status', data.status)\n if (data.search) urlParams.set('search', data.search)\n if (data.page && data.page !== 1) urlParams.set('page', data.page.toString())\n const currentParams = urlParams.toString()\n\n // Check if filters are active (not in default state)\n const hasActiveFilters = data.modelName !== 'all' || data.status !== 'all' || !!data.search\n\n // Prepare filter bar data\n const filterBarData: FilterBarData = {\n filters: [\n {\n name: 'model',\n label: 'Model',\n options: [\n { value: 'all', label: 'All Models', selected: data.modelName === 'all' },\n ...data.models.map(model => ({\n value: model.name,\n label: model.displayName,\n selected: data.modelName === model.name\n }))\n ]\n },\n {\n name: 'status',\n label: 'Status',\n options: [\n { value: 'all', label: 'All Status', selected: data.status === 'all' },\n { value: 'draft', label: 'Draft', selected: data.status === 'draft' },\n { value: 'review', label: 'Under Review', selected: data.status === 'review' },\n { value: 'scheduled', label: 'Scheduled', selected: data.status === 'scheduled' },\n { value: 'published', label: 'Published', selected: data.status === 'published' },\n { value: 'archived', label: 'Archived', selected: data.status === 'archived' },\n { value: 'deleted', label: 'Deleted', selected: data.status === 'deleted' }\n ]\n }\n ],\n actions: [\n {\n label: 'Advanced Search',\n className: 'btn-primary',\n onclick: 'openAdvancedSearch()'\n },\n {\n label: 'Refresh',\n className: 'btn-secondary',\n onclick: 'location.reload()'\n }\n ],\n bulkActions: [\n { label: 'Publish', value: 'publish', icon: 'check-circle' },\n { label: 'Unpublish', value: 'unpublish', icon: 'x-circle' },\n { label: 'Delete', value: 'delete', icon: 'trash', className: 'text-pink-600' }\n ]\n }\n\n // Prepare table data\n const tableColumns: TableColumn[] = [\n {\n key: 'title',\n label: 'Title',\n sortable: true,\n sortType: 'string',\n render: (value, row) => `\n
\n
\n \n
${row.slug}
\n
\n
\n `\n },\n {\n key: 'modelName',\n label: 'Model',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'statusBadge',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (value) => value\n },\n {\n key: 'authorName',\n label: 'Author',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'formattedDate',\n label: 'Updated',\n sortable: true,\n sortType: 'date',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n className: 'text-sm font-medium',\n render: (value, row) => `\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'content-table',\n columns: tableColumns,\n rows: data.contentItems,\n selectable: true,\n rowClickable: true,\n rowClickUrl: (row: ContentItem) => `/admin/content/${row.id}/edit${currentParams ? `?ref=${encodeURIComponent(currentParams)}` : ''}`,\n emptyMessage: 'No content found. Create your first content item to get started.'\n }\n\n // Prepare pagination data\n const totalPages = Math.ceil(data.totalItems / data.itemsPerPage)\n const startItem = (data.page - 1) * data.itemsPerPage + 1\n const endItem = Math.min(data.page * data.itemsPerPage, data.totalItems)\n\n const paginationData: PaginationData = {\n currentPage: data.page,\n totalPages,\n totalItems: data.totalItems,\n itemsPerPage: data.itemsPerPage,\n startItem,\n endItem,\n baseUrl: '/admin/content',\n queryParams: {\n model: data.modelName,\n status: data.status,\n ...(data.search ? { search: data.search } : {})\n },\n showPageSizeSelector: true,\n pageSizeOptions: [10, 20, 50, 100]\n }\n\n // Generate page content\n const pageContent = `\n
\n \n
\n
\n

Content Management

\n

Manage and organize your content items

\n
\n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n \n
\n \n
\n \n \n ${data.models.map(model => `\n \n `).join('')}\n \n \n \n \n
\n
\n\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n
\n ${data.totalItems} ${data.totalItems === 1 ? 'item' : 'items'}\n ${filterBarData.actions?.map(action => `\n \n ${action.label === 'Refresh' ? `\n \n \n \n ` : ''}\n ${action.label}\n \n `).join('') || ''}\n ${filterBarData.bulkActions && filterBarData.bulkActions.length > 0 ? `\n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n \n Move to Draft\n \n
\n
\n \n \n \n \n Delete Selected\n \n
\n
\n
\n ` : ''}\n
\n
\n
\n
\n
\n \n \n
\n ${renderTable(tableData)}\n ${renderPagination(paginationData)}\n
\n \n
\n \n \n
\n
\n \n \n\n \n ${renderConfirmationDialog({\n id: 'bulk-action-confirm',\n title: 'Confirm Bulk Action',\n message: 'Are you sure you want to perform this action? This operation will affect multiple items.',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n iconColor: 'blue',\n onConfirm: 'executeBulkAction()'\n })}\n\n \n ${getConfirmationDialogScript()}\n\n \n
\n
\n \n
\n\n \n
\n
\n \n
\n

\n 🔍 Advanced Search\n

\n \n
\n\n \n
\n \n
\n \n
\n \n
\n
\n
\n\n \n
\n \n
\n \n \n
\n
\n\n \n
\n

Filters

\n \n
\n \n
\n \n \n \n ${data.models.map(\n (model) => `\n \n `\n ).join('')}\n \n

Hold Ctrl/Cmd to select multiple

\n
\n\n \n
\n \n \n \n \n \n \n \n \n
\n
\n
\n\n \n
\n \n Cancel\n \n \n Search\n \n
\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n // Prepare layout data\n const layoutData: AdminLayoutCatalystData = {\n title: 'Content Management',\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export function resolveSchemaFieldType(fieldConfig: Record): string {\n if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n return 'slug'\n }\n\n if (fieldConfig.type && fieldConfig.type !== 'string') {\n return fieldConfig.type\n }\n\n if (fieldConfig.format === 'richtext') {\n return 'richtext'\n }\n\n if (fieldConfig.format === 'media') {\n return 'media'\n }\n\n if (fieldConfig.format === 'date-time') {\n return 'date'\n }\n\n if (Array.isArray(fieldConfig.enum)) {\n return 'select'\n }\n\n return fieldConfig.type || 'string'\n}\n\nexport function buildSchemaFieldOptions(fieldConfig: Record): Record {\n const fieldOptions = { ...fieldConfig }\n const resolvedFieldType = resolveSchemaFieldType(fieldConfig)\n\n if (resolvedFieldType === 'select' && Array.isArray(fieldConfig.enum)) {\n fieldOptions.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return fieldOptions\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { Bindings, Variables } from '../app'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { CACHE_CONFIGS, getCacheService } from '../services/cache'\nimport { PluginService } from '../services/plugin-service'\nimport { ContentVersion, renderVersionHistory, VersionHistoryData } from '../templates/components/version-history.template'\nimport { ContentFormData, renderContentFormPage } from '../templates/pages/admin-content-form.template'\nimport { ContentListPageData, renderContentListPage } from '../templates/pages/admin-content-list.template'\nimport { getBlocksFieldConfig, parseBlocksValue } from '../utils/blocks'\nimport { escapeHtml, sanitizeRichText } from '../utils/sanitize'\nimport { buildSchemaFieldOptions, resolveSchemaFieldType } from './admin-content-field-types'\n\nconst adminContentRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Field definition type for form processing\ninterface FieldDefinition {\n field_name: string\n field_label: string\n field_type: string\n field_options?: any\n is_required?: boolean\n}\n\n// Result of parsing a single field value\ninterface ParsedFieldResult {\n value: any\n errors: string[]\n}\n\n/**\n * Parse a single field value from form data with validation\n * Centralizes field parsing logic used in POST, PUT, and preview handlers\n */\nfunction parseFieldValue(\n field: FieldDefinition,\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): ParsedFieldResult {\n const { skipValidation = false } = options\n const value = formData.get(field.field_name)\n const errors: string[] = []\n\n // Handle blocks fields (array with blocks config)\n const blocksConfig = getBlocksFieldConfig(field.field_options)\n if (blocksConfig) {\n const parsed = parseBlocksValue(value, blocksConfig)\n if (!skipValidation && field.is_required && parsed.value.length === 0) {\n parsed.errors.push(`${field.field_label} is required`)\n }\n return { value: parsed.value, errors: parsed.errors }\n }\n\n // Required field validation\n if (!skipValidation && field.is_required && (!value || value.toString().trim() === '')) {\n return { value: null, errors: [`${field.field_label} is required`] }\n }\n\n // Type-specific parsing\n switch (field.field_type) {\n case 'number':\n if (value && isNaN(Number(value))) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a valid number`)\n }\n return { value: null, errors }\n }\n return { value: value ? Number(value) : null, errors: [] }\n\n case 'boolean':\n // Check for the hidden _submitted field to determine if checkbox was rendered\n const submitted = formData.get(`${field.field_name}_submitted`)\n return { value: submitted ? value === 'true' : false, errors: [] }\n\n case 'select':\n if (field.field_options?.multiple) {\n return { value: formData.getAll(`${field.field_name}[]`), errors: [] }\n }\n return { value: value, errors: [] }\n\n case 'array': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: [], errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON array`)\n }\n return { value: [], errors }\n }\n if (!skipValidation && field.is_required && parsed.length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: [], errors }\n }\n }\n\n case 'object': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: {}, errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON object`)\n }\n return { value: {}, errors }\n }\n if (!skipValidation && field.is_required && Object.keys(parsed).length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: {}, errors }\n }\n }\n\n case 'json': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: null, errors }\n }\n try {\n return { value: JSON.parse(value.toString()), errors: [] }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: null, errors }\n }\n }\n\n default:\n return { value: value, errors: [] }\n }\n}\n\n/**\n * Extract all field values from form data\n */\nfunction extractFieldData(\n fields: FieldDefinition[],\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): { data: Record; errors: Record } {\n const data: Record = {}\n const errors: Record = {}\n\n for (const field of fields) {\n const result = parseFieldValue(field, formData, options)\n data[field.field_name] = result.value\n if (result.errors.length > 0) {\n errors[field.field_name] = result.errors\n }\n }\n\n return { data, errors }\n}\n\n// Apply authentication middleware\nadminContentRoutes.use('*', requireAuth())\n\n// Get collection fields\nasync function getCollectionFields(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('fields', collectionId),\n async () => {\n // First, check if collection has a schema (code-based collection)\n const collectionStmt = db.prepare('SELECT schema FROM collections WHERE id = ?')\n const collectionRow = await collectionStmt.bind(collectionId).first() as any\n\n if (collectionRow && collectionRow.schema) {\n try {\n const schema = typeof collectionRow.schema === 'string' ? JSON.parse(collectionRow.schema) : collectionRow.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n return Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n const fieldOptions = buildSchemaFieldOptions(fieldConfig)\n\n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: resolveSchemaFieldType(fieldConfig),\n field_label: fieldConfig.title || fieldName,\n field_options: fieldOptions,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table for legacy collections\n const stmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results } = await stmt.bind(collectionId).all()\n\n return (results || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }))\n }\n )\n}\n\n// Get collection by ID\nasync function getCollection(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('collection', collectionId),\n async () => {\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ? AND is_active = 1')\n const collection = await stmt.bind(collectionId).first() as any\n\n if (!collection) return null\n\n return {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n schema: collection.schema ? JSON.parse(collection.schema) : {}\n }\n }\n )\n}\n\n// Content list (main page)\nadminContentRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const db = c.env.DB\n\n // Get query parameters\n const page = parseInt(url.searchParams.get('page') || '1')\n const limit = parseInt(url.searchParams.get('limit') || '20')\n const modelName = url.searchParams.get('model') || 'all'\n const status = url.searchParams.get('status') || 'all'\n const search = url.searchParams.get('search') || ''\n const offset = (page - 1) * limit\n\n // Get all collections for filter dropdown (exclude form-sourced)\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results: collectionsResults } = await collectionsStmt.all()\n const models = (collectionsResults || []).map((row: any) => ({\n name: row.name,\n displayName: row.display_name\n }))\n\n // Build where conditions\n const conditions: string[] = []\n const params: any[] = []\n\n // Hide content from form-sourced collections in the regular content list\n conditions.push(\"(col.source_type IS NULL OR col.source_type = 'user')\")\n\n // Always filter out deleted content unless specifically requested\n if (status !== 'deleted') {\n conditions.push(\"c.status != 'deleted'\")\n }\n\n if (search) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n params.push(`%${search}%`, `%${search}%`, `%${search}%`)\n }\n\n if (modelName !== 'all') {\n conditions.push('col.name = ?')\n params.push(modelName)\n }\n\n if (status !== 'all' && status !== 'deleted') {\n conditions.push('c.status = ?')\n params.push(status)\n } else if (status === 'deleted') {\n conditions.push(\"c.status = 'deleted'\")\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n JOIN collections col ON c.collection_id = col.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalItems = countResult?.count || 0\n\n // Get content items\n const contentStmt = db.prepare(`\n SELECT c.id, c.title, c.slug, c.status, c.created_at, c.updated_at,\n col.name as collection_name, col.display_name as collection_display_name,\n u.first_name, u.last_name, u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n const { results } = await contentStmt.bind(...params, limit, offset).all()\n\n // Process content items\n const contentItems = (results || []).map((row: any) => {\n const statusConfig: Record = {\n draft: {\n class: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-1 ring-inset ring-zinc-600/20 dark:ring-zinc-500/20',\n text: 'Draft'\n },\n review: {\n class: 'bg-amber-50 dark:bg-amber-500/10 text-amber-700 dark:text-amber-400 ring-1 ring-inset ring-amber-600/20 dark:ring-amber-500/20',\n text: 'Under Review'\n },\n scheduled: {\n class: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-600/20 dark:ring-blue-500/20',\n text: 'Scheduled'\n },\n published: {\n class: 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-400 ring-1 ring-inset ring-green-600/20 dark:ring-green-500/20',\n text: 'Published'\n },\n archived: {\n class: 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-400 ring-1 ring-inset ring-purple-600/20 dark:ring-purple-500/20',\n text: 'Archived'\n },\n deleted: {\n class: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-600/20 dark:ring-red-500/20',\n text: 'Deleted'\n }\n }\n\n const config = statusConfig[row.status as keyof typeof statusConfig] || statusConfig.draft\n const statusBadge = `\n \n ${config?.text || row.status}\n \n `\n\n const authorName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.author_email || 'Unknown'\n\n const formattedDate = new Date(row.updated_at).toLocaleDateString()\n\n // Determine available workflow actions based on status\n const availableActions: string[] = []\n switch (row.status) {\n case 'draft':\n availableActions.push('submit_for_review', 'publish')\n break\n case 'review':\n availableActions.push('approve', 'request_changes')\n break\n case 'published':\n availableActions.push('unpublish', 'archive')\n break\n case 'scheduled':\n availableActions.push('unschedule')\n break\n }\n\n return {\n id: row.id,\n title: row.title,\n slug: row.slug,\n modelName: row.collection_display_name,\n statusBadge,\n authorName,\n formattedDate,\n availableActions\n }\n })\n\n const pageData: ContentListPageData = {\n modelName,\n status,\n page,\n search,\n models,\n contentItems,\n totalItems,\n itemsPerPage: limit,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentListPage(pageData))\n } catch (error) {\n console.error('Error fetching content list:', error)\n return c.html(`

Error loading content: ${error}

`)\n }\n})\n\n// New content form\nadminContentRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const collectionId = url.searchParams.get('collection')\n\n if (!collectionId) {\n // Show collection selection page\n const db = c.env.DB\n // Exclude form-sourced collections — users shouldn't manually create content in form collections\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name, description FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results } = await collectionsStmt.all()\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description\n }))\n\n // Render collection selection page\n const selectionHTML = `\n \n \n \n Select Collection - SonicJS AI Admin\n \n \n \n
\n
\n

Create New Content

\n

Select a collection to create content in:

\n \n
\n ${collections.map(collection => `\n \n

${collection.display_name}

\n

${collection.description || 'No description'}

\n
\n `).join('')}\n
\n \n \n
\n
\n \n \n `\n\n return c.html(selectionHTML)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n console.log('[Content Form /new] Editor plugins status:', {\n tinymce: tinymceEnabled,\n quill: quillEnabled,\n mdxeditor: mdxeditorEnabled,\n mdxeditorSettings\n })\n\n const formData: ContentFormData = {\n collection,\n fields,\n isEdit: false,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading new content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content form.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Edit content form\nadminContentRoutes.get('/:id/edit', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n\n // Capture referrer parameters to preserve filters when returning to list\n const referrerParams = url.searchParams.get('ref') || ''\n\n // Get content with caching\n const cache = getCacheService(CACHE_CONFIGS.content!)\n const content = await cache.getOrSet(\n cache.generateKey('content', id),\n async () => {\n const contentStmt = db.prepare(`\n SELECT c.*, col.id as collection_id, col.name as collection_name,\n col.display_name as collection_display_name, col.description as collection_description,\n col.schema as collection_schema\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n return await contentStmt.bind(id).first() as any\n }\n )\n\n if (!content) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Content not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const collection = {\n id: content.collection_id,\n name: content.collection_name,\n display_name: content.collection_display_name,\n description: content.collection_description,\n schema: content.collection_schema ? JSON.parse(content.collection_schema) : {}\n }\n\n const fields = await getCollectionFields(db, content.collection_id)\n const contentData = content.data ? JSON.parse(content.data) : {}\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n const formData: ContentFormData = {\n id: content.id,\n title: content.title,\n slug: content.slug,\n created_at: content.created_at,\n updated_at: content.updated_at,\n published_at: content.published_at,\n data: contentData,\n status: content.status,\n scheduled_publish_at: content.scheduled_publish_at,\n scheduled_unpublish_at: content.scheduled_unpublish_at,\n review_status: content.review_status,\n meta_title: content.meta_title,\n meta_description: content.meta_description,\n collection,\n fields,\n isEdit: true,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n referrerParams,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading edit content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content for editing.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Create content\nadminContentRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n const action = formData.get('action') as string\n\n if (!collectionId) {\n return c.html(html`\n
\n Collection ID is required.\n
\n `)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n // Check for validation errors\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Generate slug if not provided\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || 'draft'\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Create content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n // Invalidate collection content list cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n\n // Create initial version\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n contentId,\n 1,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n contentId,\n 'created',\n 'none',\n status,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${contentId}/edit?success=Content saved successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content created successfully!`\n : `/admin/content?collection=${collectionId}&success=Content created successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error creating content:', error)\n return c.html(html`\n
\n Failed to create content. Please try again.\n
\n `)\n }\n})\n\n// Update content\nadminContentRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const formData = await c.req.formData()\n const action = formData.get('action') as string\n\n const db = c.env.DB\n\n // Get existing content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existingContent = await contentStmt.bind(id).first() as any\n\n if (!existingContent) {\n return c.html(html`\n
\n Content not found.\n
\n `)\n }\n\n const collection = await getCollection(db, existingContent.collection_id)\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, existingContent.collection_id)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n id,\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Update slug if title changed\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || existingContent.status\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Update content\n const now = Date.now()\n\n const updateStmt = db.prepare(`\n UPDATE content SET\n slug = ?, title = ?, data = ?, status = ?,\n scheduled_publish_at = ?, scheduled_unpublish_at = ?,\n meta_title = ?, meta_description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n scheduledPublishAt ? new Date(scheduledPublishAt).getTime() : null,\n scheduledUnpublishAt ? new Date(scheduledUnpublishAt).getTime() : null,\n data.meta_title || null,\n data.meta_description || null,\n now,\n id\n ).run()\n\n // Invalidate content cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existingContent.collection_id}:*`)\n\n // Create new version if content changed\n const existingData = JSON.parse(existingContent.data || '{}')\n if (JSON.stringify(existingData) !== JSON.stringify(data)) {\n // Get next version number\n const versionCountStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const versionResult = await versionCountStmt.bind(id).first() as any\n const nextVersion = (versionResult?.max_version || 0) + 1\n\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Log workflow action if status changed\n if (status !== existingContent.status) {\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'status_changed',\n existingContent.status,\n status,\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${id}/edit?success=Content updated successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content updated successfully!`\n : `/admin/content?collection=${existingContent.collection_id}&success=Content updated successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error updating content:', error)\n return c.html(html`\n
\n Failed to update content. Please try again.\n
\n `)\n }\n})\n\n// Content preview\nadminContentRoutes.post('/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html('

Collection not found

')\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract field data for preview (skip validation)\n const { data } = extractFieldData(fields, formData, { skipValidation: true })\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeStatus = escapeHtml(String(formData.get('status') || 'draft'))\n const safeMetaDesc = data.meta_description ? escapeHtml(data.meta_description) : ''\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Preview: ${safeTitle}\n \n \n \n

${safeTitle}

\n
\n Collection: ${escapeHtml(collection.display_name)}
\n Status: ${safeStatus}
\n ${safeMetaDesc ? `Description: ${safeMetaDesc}
` : ''}\n
\n
\n ${safeContent}\n
\n\n

All Fields:

\n \n \n ${fields.map(field => `\n \n \n \n \n `).join('')}\n
FieldValue
${escapeHtml(field.field_label)}${data[field.field_name] ? escapeHtml(String(data[field.field_name])) : 'empty'}
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating preview:', error)\n return c.html('

Error generating preview

')\n }\n})\n\n// Duplicate content\nadminContentRoutes.post('/duplicate', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const originalId = formData.get('id') as string\n\n if (!originalId) {\n return c.json({ success: false, error: 'Content ID required' })\n }\n\n const db = c.env.DB\n\n // Get original content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const original = await contentStmt.bind(originalId).first() as any\n\n if (!original) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n // Create duplicate\n const newId = crypto.randomUUID()\n const now = Date.now()\n const originalData = JSON.parse(original.data || '{}')\n\n // Modify title to indicate it's a copy\n originalData.title = `${originalData.title || 'Untitled'} (Copy)`\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n newId,\n original.collection_id,\n `${original.slug}-copy-${Date.now()}`,\n originalData.title,\n JSON.stringify(originalData),\n 'draft', // Always start as draft\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n return c.json({ success: true, id: newId })\n } catch (error) {\n console.error('Error duplicating content:', error)\n return c.json({ success: false, error: 'Failed to duplicate content' })\n }\n})\n\n// Get bulk actions modal\nadminContentRoutes.get('/bulk-actions', async (c) => {\n const bulkActionsModal = `\n
\n
\n
\n

Bulk Actions

\n \n
\n

\n Select items from the table below to perform bulk actions.\n

\n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n Move to Draft\n \n \n \n \n \n Delete Selected\n \n
\n
\n
\n \n `\n\n return c.html(bulkActionsModal)\n})\n\n// Perform bulk action\nadminContentRoutes.post('/bulk-action', async (c) => {\n try {\n const user = c.get('user')\n const body = await c.req.json()\n const { action, ids } = body\n\n if (!action || !ids || ids.length === 0) {\n return c.json({ success: false, error: 'Action and IDs required' })\n }\n\n const db = c.env.DB\n const now = Date.now()\n\n if (action === 'delete') {\n // Soft delete by setting status to 'deleted'\n const placeholders = ids.map(() => '?').join(',')\n const stmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(now, ...ids).run()\n } else if (action === 'publish' || action === 'draft') {\n // Update status\n const placeholders = ids.map(() => '?').join(',')\n const publishedAt = action === 'publish' ? now : null\n const stmt = db.prepare(`\n UPDATE content\n SET status = ?, published_at = ?, updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(action, publishedAt, now, ...ids).run()\n } else {\n return c.json({ success: false, error: 'Invalid action' })\n }\n\n // Invalidate cache for all affected content items\n const cache = getCacheService(CACHE_CONFIGS.content!)\n for (const contentId of ids) {\n await cache.delete(cache.generateKey('content', contentId))\n }\n // Also invalidate list caches (they contain content from potentially multiple collections)\n await cache.invalidate('content:list:*')\n\n return c.json({ success: true, count: ids.length })\n } catch (error) {\n console.error('Bulk action error:', error)\n return c.json({ success: false, error: 'Failed to perform bulk action' })\n }\n})\n\n// Delete content\nadminContentRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const user = c.get('user')\n\n // Check if content exists\n const contentStmt = db.prepare('SELECT id, title FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.json({ success: false, error: 'Content not found' }, 404)\n }\n\n // Soft delete by setting status to 'deleted'\n const now = Date.now()\n const deleteStmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id = ?\n `)\n await deleteStmt.bind(now, id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate('content:list:*')\n\n // Return success - let HTMX reload the page\n return c.html(`\n
\n
\n
\n \n \n \n

Content deleted successfully. Refreshing...

\n
\n
\n
\n `)\n } catch (error) {\n console.error('Delete content error:', error)\n return c.json({ success: false, error: 'Failed to delete content' }, 500)\n }\n})\n\n// Get version history\nadminContentRoutes.get('/:id/versions', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.html('

Content not found

')\n }\n\n // Get all versions with author info\n const versionsStmt = db.prepare(`\n SELECT cv.*, u.first_name, u.last_name, u.email\n FROM content_versions cv\n LEFT JOIN users u ON cv.author_id = u.id\n WHERE cv.content_id = ?\n ORDER BY cv.version DESC\n `)\n const { results } = await versionsStmt.bind(id).all()\n\n const versions: ContentVersion[] = (results || []).map((row: any) => ({\n id: row.id,\n version: row.version,\n data: JSON.parse(row.data || '{}'),\n author_id: row.author_id,\n author_name: row.first_name && row.last_name ? `${row.first_name} ${row.last_name}` : row.email,\n created_at: row.created_at,\n is_current: false // Will be set below\n }))\n\n // Mark the latest version as current\n if (versions.length > 0) {\n versions[0]!.is_current = true\n }\n\n const data: VersionHistoryData = {\n contentId: id,\n versions,\n currentVersion: versions.length > 0 ? versions[0]!.version : 1\n }\n\n return c.html(renderVersionHistory(data))\n } catch (error) {\n console.error('Error loading version history:', error)\n return c.html('

Error loading version history

')\n }\n})\n\n// Restore version\nadminContentRoutes.post('/:id/restore/:version', async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const user = c.get('user')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT * FROM content_versions \n WHERE content_id = ? AND version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.json({ success: false, error: 'Version not found' })\n }\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const currentContent = await contentStmt.bind(id).first() as any\n\n if (!currentContent) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n const restoredData = JSON.parse(versionData.data)\n const now = Date.now()\n\n // Update content with restored data\n const updateStmt = db.prepare(`\n UPDATE content SET\n title = ?, data = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n restoredData.title || 'Untitled',\n versionData.data,\n now,\n id\n ).run()\n\n // Create new version for the restoration\n const nextVersionStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const nextVersionResult = await nextVersionStmt.bind(id).first() as any\n const nextVersion = (nextVersionResult?.max_version || 0) + 1\n\n const newVersionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await newVersionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n versionData.data,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, comment, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'version_restored',\n currentContent.status,\n currentContent.status,\n user?.userId || 'unknown',\n `Restored to version ${version}`,\n now\n ).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error restoring version:', error)\n return c.json({ success: false, error: 'Failed to restore version' })\n }\n})\n\n// Preview specific version\nadminContentRoutes.get('/:id/version/:version/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT cv.*, c.collection_id, col.display_name as collection_name\n FROM content_versions cv\n JOIN content c ON cv.content_id = c.id\n JOIN collections col ON c.collection_id = col.id\n WHERE cv.content_id = ? AND cv.version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.html('

Version not found

')\n }\n\n const data = JSON.parse(versionData.data || '{}')\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n const safeExcerpt = data.excerpt ? escapeHtml(data.excerpt) : ''\n const safeCollectionName = escapeHtml(versionData.collection_name || '')\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Version ${version} Preview: ${safeTitle}\n \n \n \n
\n Version ${version}\n Collection: ${safeCollectionName}
\n Created: ${new Date(versionData.created_at).toLocaleString()}
\n This is a historical version preview\n
\n\n

${safeTitle}

\n\n
\n ${safeContent}\n
\n\n ${safeExcerpt ? `

Excerpt:

${safeExcerpt}

` : ''}\n\n

All Field Data:

\n
\n${escapeHtml(JSON.stringify(data, null, 2))}\n        
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating version preview:', error)\n return c.html('

Error generating preview

')\n }\n})\nexport default adminContentRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserProfile {\n id: string\n email: string\n username: string\n first_name: string\n last_name: string\n phone?: string\n bio?: string\n avatar_url?: string\n timezone: string\n language: string\n theme: string\n email_notifications: boolean\n two_factor_enabled: boolean\n role: string\n created_at: number\n last_login_at?: number\n}\n\nexport interface ProfilePageData {\n profile: UserProfile\n timezones: Array<{ value: string; label: string }>\n languages: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderAvatarImage(avatarUrl: string | undefined, firstName: string, lastName: string): string {\n return `
\n ${avatarUrl\n ? `\"Profile`\n : `${firstName.charAt(0)}${lastName.charAt(0)}`\n }\n
`\n}\n\nexport function renderProfilePage(data: ProfilePageData): string {\n const pageContent = `\n
\n \n
\n
\n

User Profile

\n

\n Manage your account settings and preferences\n

\n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n \n
\n
\n \n
\n
\n
\n \n \n \n
\n
\n

Profile Information

\n

Update your account details

\n
\n
\n
\n\n \n
\n
\n\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n ${data.profile.bio || ''}\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Preferences

\n\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Notifications

\n\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n \n

Receive email updates about new features and product announcements.

\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Update Profile\n \n
\n
\n
\n
\n\n \n
\n \n
\n

Profile Picture

\n\n
\n ${renderAvatarImage(data.profile.avatar_url, data.profile.first_name, data.profile.last_name)}\n\n
\n \n \n \n \n \n \n Change Picture\n \n \n\n
\n
\n
\n\n \n
\n

Account Information

\n\n
\n
\n
Role
\n
\n \n ${data.profile.role}\n \n
\n
\n
\n
Member Since
\n
${new Date(data.profile.created_at).toLocaleDateString()}
\n
\n ${data.profile.last_login_at ? `\n
\n
Last Login
\n
${new Date(data.profile.last_login_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Two-Factor Auth
\n
\n ${data.profile.two_factor_enabled\n ? 'Enabled'\n : 'Disabled'\n }\n
\n
\n
\n
\n\n \n
\n

Security

\n\n
\n \n \n \n \n Change Password\n \n\n \n \n \n \n ${data.profile.two_factor_enabled ? 'Disable' : 'Enable'} 2FA\n \n
\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Change Password

\n \n
\n
\n\n
\n
\n\n
\n \n \n
\n\n
\n \n \n

Must be at least 8 characters

\n
\n\n
\n \n \n
\n\n
\n \n Cancel\n \n \n \n \n \n Update Password\n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'User Profile',\n pageTitle: 'Profile',\n currentPath: '/admin/profile',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { escapeHtml } from '../../utils/sanitize'\n\nexport type AlertType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface AlertData {\n type: AlertType\n title?: string\n message: string\n dismissible?: boolean\n className?: string\n icon?: boolean\n}\n\nexport function renderAlert(data: AlertData): string {\n const typeClasses = {\n success: 'bg-green-50 dark:bg-green-500/10 border border-green-600/20 dark:border-green-500/20',\n error: 'bg-error/10 border border-red-600/20 dark:border-red-500/20',\n warning: 'bg-amber-50 dark:bg-amber-500/10 border border-amber-600/20 dark:border-amber-500/20',\n info: 'bg-blue-50 dark:bg-blue-500/10 border border-blue-600/20 dark:border-blue-500/20'\n }\n\n const iconClasses = {\n success: 'text-green-600 dark:text-green-400',\n error: 'text-red-600 dark:text-red-400',\n warning: 'text-amber-600 dark:text-amber-400',\n info: 'text-blue-600 dark:text-blue-400'\n }\n\n const textClasses = {\n success: 'text-green-900 dark:text-green-300',\n error: 'text-red-900 dark:text-red-300',\n warning: 'text-amber-900 dark:text-amber-300',\n info: 'text-blue-900 dark:text-blue-300'\n }\n\n const messageTextClasses = {\n success: 'text-green-700 dark:text-green-400',\n error: 'text-red-700 dark:text-red-400',\n warning: 'text-amber-700 dark:text-amber-400',\n info: 'text-blue-700 dark:text-blue-400'\n }\n\n const icons = {\n success: ``,\n error: ``,\n warning: ``,\n info: ``\n }\n\n return `\n
\n
\n ${data.icon !== false ? `\n
\n \n ${icons[data.type]}\n \n
\n ` : ''}\n
\n ${data.title ? `\n

\n ${escapeHtml(data.title)}\n

\n ` : ''}\n
\n

${escapeHtml(data.message)}

\n
\n
\n ${data.dismissible ? `\n
\n
\n \n Dismiss\n \n \n \n \n
\n
\n ` : ''}\n
\n
\n `\n}\n\nexport function renderSuccessAlert(message: string, title?: string): string {\n return renderAlert({ type: 'success', message, title })\n}\n\nexport function renderErrorAlert(message: string, title?: string): string {\n return renderAlert({ type: 'error', message, title })\n}\n\nexport function renderWarningAlert(message: string, title?: string): string {\n return renderAlert({ type: 'warning', message, title })\n}\n\nexport function renderInfoAlert(message: string, title?: string): string {\n return renderAlert({ type: 'info', message, title })\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\n\nexport interface ActivityLog {\n id: string\n user_id: string\n action: string\n resource_type?: string\n resource_id?: string\n details?: any\n ip_address?: string\n user_agent?: string\n created_at: number\n user_email?: string\n user_name?: string\n}\n\nexport interface ActivityLogsPageData {\n logs: ActivityLog[]\n pagination: {\n page: number\n limit: number\n total: number\n pages: number\n }\n filters: {\n user_id?: string\n action?: string\n resource_type?: string\n date_from?: string\n date_to?: string\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderActivityLogsPage(data: ActivityLogsPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Activity Logs

\n

Monitor user actions and system activity

\n
\n
\n\n \n \n\n \n
\n

Filters

\n \n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n Clear Filters\n \n
\n
\n
\n\n \n
\n
\n
\n
\n

Recent Activity

\n
\n Showing ${data.logs.length} of ${data.pagination.total} logs\n
\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${data.logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimestampUserActionResourceIP AddressDetails
\n ${new Date(log.created_at).toLocaleString()}\n \n
${log.user_name || 'Unknown'}
\n
${log.user_email || 'N/A'}
\n
\n \n ${formatAction(log.action)}\n \n \n ${log.resource_type ? `\n
${log.resource_type}
\n ${log.resource_id ? `
${log.resource_id}
` : ''}\n ` : 'N/A'}\n
\n ${log.ip_address || 'N/A'}\n \n ${log.details ? `\n
\n View Details\n
${JSON.stringify(log.details, null, 2)}
\n
\n ` : 'N/A'}\n
\n
\n\n ${data.logs.length === 0 ? `\n
\n \n \n \n

No activity logs found

\n

Try adjusting your filters or check back later.

\n
\n ` : ''}\n\n \n ${data.pagination.pages > 1 ? `\n
\n
\n Page ${data.pagination.page} of ${data.pagination.pages} (${data.pagination.total} total logs)\n
\n \n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutData = {\n title: 'Activity Logs',\n pageTitle: 'Activity Logs',\n currentPath: '/admin/activity-logs',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction getActionBadgeClass(action: string): string {\n if (action.includes('login') || action.includes('logout')) {\n return 'bg-blue-500/20 text-blue-300'\n } else if (action.includes('create') || action.includes('invite')) {\n return 'bg-green-500/20 text-green-300'\n } else if (action.includes('update') || action.includes('change')) {\n return 'bg-yellow-500/20 text-yellow-300'\n } else if (action.includes('delete') || action.includes('cancel')) {\n return 'bg-red-500/20 text-red-300'\n } else {\n return 'bg-gray-500/20 text-gray-300'\n }\n}\n\nfunction formatAction(action: string): string {\n // Convert action from dot notation to readable format\n return action\n .split('.')\n .map(part => part.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()))\n .join(' - ')\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface UserProfileData {\n displayName?: string\n bio?: string\n company?: string\n jobTitle?: string\n website?: string\n location?: string\n dateOfBirth?: number\n}\n\nexport interface UserEditData {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n phone?: string\n avatarUrl?: string\n role: string\n isActive: boolean\n emailVerified: boolean\n twoFactorEnabled: boolean\n createdAt: number\n lastLoginAt?: number\n profile?: UserProfileData\n}\n\nexport interface UserEditPageData {\n userToEdit: UserEditData\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserEditPage(data: UserEditPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Edit User

\n
\n

Update user account and permissions

\n
\n
\n \n \n \n \n Save Changes\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Profile Information

\n

Extended profile data for this user

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n
\n\n
\n \n ${escapeHtml(data.userToEdit.profile?.bio || '')}\n
\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Set Password

\n

Leave blank to keep the current password

\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User has verified their email address

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

User Details

\n
\n
\n
User ID
\n
${data.userToEdit.id}
\n
\n
\n
Created
\n
${new Date(data.userToEdit.createdAt).toLocaleDateString()}
\n
\n ${data.userToEdit.lastLoginAt ? `\n
\n
Last Login
\n
${new Date(data.userToEdit.lastLoginAt).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Status
\n
\n ${data.userToEdit.isActive\n ? 'Active'\n : 'Inactive'\n }\n
\n
\n ${data.userToEdit.twoFactorEnabled ? `\n
\n
Security
\n
\n 2FA Enabled\n
\n
\n ` : ''}\n
\n
\n\n \n
\n

Danger Zone

\n

Irreversible and destructive actions

\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Permanently remove from database. Unchecked performs soft delete (deactivate only).

\n
\n
\n\n \n \n \n \n Delete User\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-user-confirm',\n title: 'Delete User',\n message: 'Are you sure you want to delete this user? Check the \"Hard Delete\" option to permanently remove all data from the database. This action cannot be undone!',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteUser()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Edit User',\n pageTitle: `Edit User - ${data.userToEdit.firstName} ${data.userToEdit.lastName}`,\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export interface ConfirmationDialogOptions {\n id: string\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmClass?: string\n iconColor?: 'red' | 'yellow' | 'blue'\n onConfirm?: string // JavaScript code to execute on confirm\n}\n\nexport function renderConfirmationDialog(options: ConfirmationDialogOptions): string {\n const {\n id,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmClass = 'bg-red-500 hover:bg-red-400',\n iconColor = 'red',\n onConfirm = ''\n } = options\n\n const iconColorClasses = {\n red: 'bg-red-500/10 text-red-400',\n yellow: 'bg-yellow-500/10 text-yellow-400',\n blue: 'bg-blue-500/10 text-blue-400'\n }\n\n return `\n \n \n \n\n
\n \n
\n
\n \n \n \n
\n
\n

${title}

\n
\n

${message}

\n
\n
\n
\n
\n \n ${confirmText}\n \n \n ${cancelText}\n \n
\n
\n
\n \n
\n `\n}\n\n/**\n * Helper function to show a confirmation dialog programmatically\n * Usage in templates: Add this script and call showConfirmDialog()\n */\nexport function getConfirmationDialogScript(): string {\n return `\n \n \n `\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserNewPageData {\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserNewPage(data: UserNewPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Create New User

\n
\n

Add a new user account to the system

\n
\n
\n \n \n \n \n Create User\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n\n
\n \n \n
\n
\n\n \n
\n

Password

\n
\n
\n \n \n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Mark email as verified

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

Creating a User

\n
\n

Fill in the required fields marked with * to create a new user account.

\n

The password must be at least 8 characters long.

\n

By default, new users are created as active and can sign in immediately.

\n

You can edit user details and permissions after creation.

\n
\n
\n\n \n
\n

Role Descriptions

\n
\n
\n
Administrator
\n
Full system access and permissions
\n
\n
\n
Editor
\n
Can create and edit content
\n
\n
\n
Author
\n
Can create own content
\n
\n
\n
Viewer
\n
Read-only access
\n
\n
\n
\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create User',\n pageTitle: 'Create New User',\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderAlert } from '../alert.template'\nimport { renderTable, TableColumn, TableData } from '../table.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface User {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n role: string\n avatar?: string\n isActive: boolean\n lastLoginAt?: number\n createdAt: number\n updatedAt: number\n formattedLastLogin?: string\n formattedCreatedAt?: string\n}\n\nexport interface UsersListPageData {\n users: User[]\n pagination?: PaginationData\n currentPage: number\n totalPages: number\n totalUsers: number\n statusFilter?: string\n roleFilter?: string\n searchFilter?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderUsersListPage(data: UsersListPageData): string {\n const columns: TableColumn[] = [\n {\n key: 'avatar',\n label: '',\n className: 'w-12',\n sortable: false,\n render: (value: string | null, row: User) => {\n const initials = `${row.firstName.charAt(0)}${row.lastName.charAt(0)}`.toUpperCase()\n if (value) {\n return `\"${row.firstName}`\n }\n return `\n
\n ${initials}\n
\n `\n }\n },\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, row: User) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n \n const truncatedFirstName = row.firstName.length > 25 ? row.firstName.substring(0, 25) + '...' : row.firstName\n const truncatedLastName = row.lastName.length > 25 ? row.lastName.substring(0, 25) + '...' : row.lastName\n const fullName = escapeHtml(`${truncatedFirstName} ${truncatedLastName}`)\n const truncatedUsername = row.username.length > 100 ? row.username.substring(0, 100) + '...' : row.username\n const username = escapeHtml(truncatedUsername)\n const statusBadge = row.isActive ?\n 'Active' :\n 'Inactive'\n return `\n
\n
${fullName}${statusBadge}
\n
@${username}
\n
\n `\n }\n },\n {\n key: 'email',\n label: 'Email',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n const escapedEmail = escapeHtml(value)\n return `${escapedEmail}`\n }\n },\n {\n key: 'role',\n label: 'Role',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const roleColors = {\n admin: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-700/10 dark:ring-red-500/20',\n editor: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-700/10 dark:ring-blue-500/20',\n author: 'bg-cyan-50 dark:bg-cyan-500/10 text-cyan-700 dark:text-cyan-400 ring-1 ring-inset ring-cyan-700/10 dark:ring-cyan-500/20',\n viewer: 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n }\n const colorClass = roleColors[value as keyof typeof roleColors] || 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n return `${value.charAt(0).toUpperCase() + value.slice(1)}`\n }\n },\n {\n key: 'lastLoginAt',\n label: 'Last Login',\n sortable: true,\n sortType: 'date',\n render: (value: number | null) => {\n if (!value) return 'Never'\n return `${new Date(value).toLocaleDateString()}`\n }\n },\n {\n key: 'createdAt',\n label: 'Created',\n sortable: true,\n sortType: 'date',\n render: (value: number) => `${new Date(value).toLocaleDateString()}`\n },\n {\n key: 'actions',\n label: 'Actions',\n className: 'text-right',\n sortable: false,\n render: (_value: any, row: User) => `\n
\n ${row.isActive ?\n `` :\n ``\n }\n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'users-table',\n columns,\n rows: data.users,\n selectable: false,\n rowClickable: true,\n rowClickUrl: (row: User) => `/admin/users/${row.id}/edit`,\n emptyMessage: 'No users found'\n }\n\n const pageContent = `\n
\n \n
\n
\n

User Management

\n

Manage user accounts and permissions

\n
\n
\n \n \n \n \n Add User\n \n \n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n

User Statistics

\n
\n
\n
Total Users
\n
\n
\n ${data.totalUsers}\n
\n
\n \n \n \n Increased by\n 5.2%\n
\n
\n
\n
\n
Active Users
\n
\n
\n ${data.users.filter(u => u.isActive).length}\n
\n
\n \n \n \n Increased by\n 3.1%\n
\n
\n
\n
\n
Administrators
\n
\n
\n ${data.users.filter(u => u.role === 'admin').length}\n
\n
\n \n \n \n Increased by\n 1.8%\n
\n
\n
\n
\n
Active This Week
\n
\n
\n ${data.users.filter(u => u.lastLoginAt && u.lastLoginAt > Date.now() - 7 * 24 * 60 * 60 * 1000).length}\n
\n
\n \n \n \n Decreased by\n 2.3%\n
\n
\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n
\n
\n \n
\n \n
\n {\n input.focus();\n input.setSelectionRange(len, len);\n }, 10);\n }\n \"\n >\n \n
\n \n \n \n
\n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n Clear Filters\n \n
\n
\n
\n
\n
\n
\n\n \n ${renderTable(tableData)}\n\n \n ${data.pagination ? renderPagination(data.pagination) : ''}\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'toggle-user-status-confirm',\n title: 'Toggle User Status',\n message: 'Are you sure you want to activate/deactivate this user?',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performToggleUserStatus()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Users',\n pageTitle: 'User Management',\n currentPath: '/admin/users',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n} ","import { Hono } from 'hono'\nimport { requireAuth, requireRole, logActivity, AuthManager } from '../middleware'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { renderProfilePage, renderAvatarImage, type UserProfile, type ProfilePageData } from '../templates/pages/admin-profile.template'\nimport { renderAlert } from '../templates/components/alert.template'\nimport { renderActivityLogsPage, type ActivityLogsPageData, type ActivityLog } from '../templates/pages/admin-activity-logs.template'\nimport { renderUserEditPage, type UserEditPageData, type UserEditData, type UserProfileData } from '../templates/pages/admin-user-edit.template'\nimport { renderUserNewPage, type UserNewPageData } from '../templates/pages/admin-user-new.template'\nimport { renderUsersListPage, type UsersListPageData, type User } from '../templates/pages/admin-users-list.template'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, renderCustomProfileSection, getCustomData, saveCustomData, extractCustomFieldsFromForm, sanitizeCustomData, validateCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst userRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware to all routes\nuserRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on user management routes\nuserRoutes.use('/users/*', requireRole(['admin']))\nuserRoutes.use('/users', requireRole(['admin']))\nuserRoutes.use('/invite-user', requireRole(['admin']))\nuserRoutes.use('/resend-invitation/*', requireRole(['admin']))\nuserRoutes.use('/cancel-invitation/*', requireRole(['admin']))\nuserRoutes.use('/activity-logs', requireRole(['admin']))\nuserRoutes.use('/activity-logs/*', requireRole(['admin']))\n\n// Redirect /admin to /admin/dashboard\nuserRoutes.get('/', (c) => {\n return c.redirect('/admin/dashboard')\n})\n\n// Timezone options for profile form\nconst TIMEZONES = [\n { value: 'UTC', label: 'UTC' },\n { value: 'America/New_York', label: 'Eastern Time' },\n { value: 'America/Chicago', label: 'Central Time' },\n { value: 'America/Denver', label: 'Mountain Time' },\n { value: 'America/Los_Angeles', label: 'Pacific Time' },\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Australia/Sydney', label: 'Sydney' }\n]\n\n// Language options for profile form\nconst LANGUAGES = [\n { value: 'en', label: 'English' },\n { value: 'es', label: 'Spanish' },\n { value: 'fr', label: 'French' },\n { value: 'de', label: 'German' },\n { value: 'it', label: 'Italian' },\n { value: 'pt', label: 'Portuguese' },\n { value: 'ja', label: 'Japanese' },\n { value: 'ko', label: 'Korean' },\n { value: 'zh', label: 'Chinese' }\n]\n\n// Role options for user form\nconst ROLES = [\n { value: 'admin', label: 'Administrator' },\n { value: 'editor', label: 'Editor' },\n { value: 'author', label: 'Author' },\n { value: 'viewer', label: 'Viewer' }\n]\n\n/**\n * GET /admin/profile - Show user profile page\n */\nuserRoutes.get('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n // Get user profile data\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n timezone, language, theme, email_notifications, two_factor_enabled,\n role, created_at, last_login_at\n FROM users \n WHERE id = ? AND is_active = 1\n `)\n \n const userProfile = await userStmt.bind(user!.userId).first() as any\n\n if (!userProfile) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Convert to UserProfile interface\n const profile: UserProfile = {\n id: userProfile.id,\n email: userProfile.email,\n username: userProfile.username || '',\n first_name: userProfile.first_name || '',\n last_name: userProfile.last_name || '',\n phone: userProfile.phone,\n bio: userProfile.bio,\n avatar_url: userProfile.avatar_url,\n timezone: userProfile.timezone || 'UTC',\n language: userProfile.language || 'en',\n theme: userProfile.theme || 'dark',\n email_notifications: Boolean(userProfile.email_notifications),\n two_factor_enabled: Boolean(userProfile.two_factor_enabled),\n role: userProfile.role,\n created_at: userProfile.created_at,\n last_login_at: userProfile.last_login_at\n }\n\n // Get custom profile data\n const customData = await getCustomData(db, user!.userId)\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n const pageData: ProfilePageData = {\n profile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n customProfileFieldsHtml,\n user: {\n name: `${profile.first_name} ${profile.last_name}`.trim() || profile.username || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n } catch (error) {\n console.error('Profile page error:', error)\n \n const pageData: ProfilePageData = {\n profile: {} as UserProfile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n error: 'Failed to load profile. Please try again.',\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n }\n})\n\n/**\n * PUT /admin/profile - Update user profile\n */\nuserRoutes.put('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const timezone = formData.get('timezone')?.toString() || 'UTC'\n const language = formData.get('language')?.toString() || 'en'\n const emailNotifications = formData.get('email_notifications') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please enter a valid email address.',\n dismissible: true \n }))\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users \n WHERE (username = ? OR email = ?) AND id != ? AND is_active = 1\n `)\n const existingUser = await checkStmt.bind(username, email, user!.userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Username or email is already taken by another user!.',\n dismissible: true \n }))\n }\n\n // Update user profile\n const updateStmt = db.prepare(`\n UPDATE users SET \n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, bio = ?, timezone = ?, language = ?,\n email_notifications = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, bio, timezone, language,\n emailNotifications ? 1 : 0, Date.now(),\n user!.userId\n ).run()\n\n // Save custom profile fields\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n await saveCustomData(db, user!.userId, sanitized)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.update', 'users', user!.userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'bio', 'timezone', 'language', 'email_notifications'] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success', \n message: 'Profile updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Profile update error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update profile. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/avatar - Upload user avatar\n */\nuserRoutes.post('/profile/avatar', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n const avatarFile = formData.get('avatar') as File | null\n\n if (!avatarFile || typeof avatarFile === 'string' || !avatarFile.name) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please select an image file.',\n dismissible: true\n }))\n }\n\n // Validate file type\n const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']\n if (!allowedTypes.includes(avatarFile.type)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please upload a valid image file (JPEG, PNG, GIF, or WebP).',\n dismissible: true \n }))\n }\n\n // Validate file size (5MB max)\n const maxSize = 5 * 1024 * 1024\n if (avatarFile.size > maxSize) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Image file must be smaller than 5MB.',\n dismissible: true \n }))\n }\n\n // For now, we'll simulate storing the avatar\n // In a real implementation, you'd upload to cloud storage (R2, S3, etc.)\n const avatarUrl = `/uploads/avatars/${user!.userId}-${Date.now()}.${avatarFile.type.split('/')[1]}`\n\n // Update user avatar URL in database\n const updateStmt = db.prepare(`\n UPDATE users SET avatar_url = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(avatarUrl, Date.now(), user!.userId).run()\n\n // Get updated user data to render the avatar\n const userStmt = db.prepare(`\n SELECT first_name, last_name FROM users WHERE id = ?\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.avatar_update', 'users', user!.userId,\n { avatar_url: avatarUrl },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return both the alert message and the updated avatar image using HTMX out-of-band swap\n const alertHtml = renderAlert({\n type: 'success',\n message: 'Profile picture updated successfully!',\n dismissible: true\n })\n\n // Add timestamp to avatar URL to bust cache\n const avatarUrlWithCache = `${avatarUrl}?t=${Date.now()}`\n const avatarImageHtml = renderAvatarImage(avatarUrlWithCache, userData.first_name, userData.last_name)\n\n // Use hx-swap-oob to update the avatar image container\n const avatarImageWithOob = avatarImageHtml.replace(\n 'id=\"avatar-image-container\"',\n 'id=\"avatar-image-container\" hx-swap-oob=\"true\"'\n )\n\n return c.html(alertHtml + avatarImageWithOob)\n\n } catch (error) {\n console.error('Avatar upload error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to upload profile picture. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/password - Change user password\n */\nuserRoutes.post('/profile/password', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n \n const currentPassword = formData.get('current_password')?.toString() || ''\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Validate input\n if (!currentPassword || !newPassword || !confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'All password fields are required.',\n dismissible: true \n }))\n }\n\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New passwords do not match.',\n dismissible: true \n }))\n }\n\n if (newPassword.length < 8) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New password must be at least 8 characters long.',\n dismissible: true \n }))\n }\n\n // Get current user data\n const userStmt = db.prepare(`\n SELECT password_hash FROM users WHERE id = ? AND is_active = 1\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n if (!userData) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'User not found.',\n dismissible: true \n }))\n }\n\n // Verify current password\n const validPassword = await AuthManager.verifyPassword(currentPassword, userData.password_hash)\n if (!validPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Current password is incorrect.',\n dismissible: true \n }))\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(newPassword)\n\n // Store old password in history\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user!.userId,\n userData.password_hash,\n Date.now()\n ).run()\n\n // Update user password\n const updateStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(newPasswordHash, Date.now(), user!.userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.password_change', 'users', user!.userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({ \n type: 'success', \n message: 'Password updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Password change error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update password. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * GET /admin/users - List all users\n * Returns HTML for browser requests and JSON for API requests\n * Note: Already protected by requireAuth() and requireRole(['admin', 'editor'])\n */\nuserRoutes.get('/users', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '20')\n const search = c.req.query('search') || ''\n const roleFilter = c.req.query('role') || ''\n const statusFilter = c.req.query('status') || 'active'\n const offset = (page - 1) * limit\n\n // Build search query\n let whereClause = ''\n let params: any[] = []\n\n // Handle status filter\n if (statusFilter === 'active') {\n whereClause = 'WHERE u.is_active = 1'\n } else if (statusFilter === 'inactive') {\n whereClause = 'WHERE u.is_active = 0'\n } else {\n // 'all' - no filter\n whereClause = 'WHERE 1=1'\n }\n\n if (search) {\n whereClause += ' AND (u.first_name LIKE ? OR u.last_name LIKE ? OR u.email LIKE ? OR u.username LIKE ?)'\n const searchParam = `%${search}%`\n params.push(searchParam, searchParam, searchParam, searchParam)\n }\n\n if (roleFilter) {\n whereClause += ' AND u.role = ?'\n params.push(roleFilter)\n }\n\n // Get users\n const usersStmt = db.prepare(`\n SELECT u.id, u.email, u.username, u.first_name, u.last_name,\n u.role, u.avatar_url, u.created_at, u.last_login_at, u.updated_at,\n u.email_verified, u.two_factor_enabled, u.is_active\n FROM users u\n ${whereClause}\n ORDER BY u.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: usersData } = await usersStmt.bind(...params, limit, offset).all()\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total FROM users u ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalUsers = countResult?.total || 0\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'users.list_view', 'users', undefined,\n { search, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Check if this is an API request (accept header contains 'application/json')\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n // Return JSON for API requests\n return c.json({\n users: usersData || [],\n pagination: {\n page,\n limit,\n total: totalUsers,\n pages: Math.ceil(totalUsers / limit)\n }\n })\n }\n\n // Return HTML for browser requests\n const users: User[] = (usersData || []).map((u: any) => ({\n id: u.id,\n email: u.email,\n username: u.username || '',\n firstName: u.first_name || '',\n lastName: u.last_name || '',\n role: u.role,\n avatar: u.avatar_url,\n isActive: Boolean(u.is_active),\n lastLoginAt: u.last_login_at,\n createdAt: u.created_at,\n updatedAt: u.updated_at,\n formattedLastLogin: u.last_login_at ? new Date(u.last_login_at).toLocaleDateString() : undefined,\n formattedCreatedAt: new Date(u.created_at).toLocaleDateString()\n }))\n\n const successMessage = c.req.query('success') || undefined\n\n const pageData: UsersListPageData = {\n users,\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalUsers,\n searchFilter: search,\n roleFilter,\n statusFilter,\n success: successMessage,\n pagination: {\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalItems: totalUsers,\n itemsPerPage: limit,\n startItem: offset + 1,\n endItem: Math.min(offset + limit, totalUsers),\n baseUrl: '/admin/users'\n },\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUsersListPage(pageData))\n\n } catch (error) {\n console.error('Users list error:', error)\n\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n return c.json({ error: 'Failed to load users' }, 500)\n }\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load users. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * GET /admin/users/new - Show new user creation page\n */\nuserRoutes.get('/users/new', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: UserNewPageData = {\n roles: ROLES,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserNewPage(pageData))\n } catch (error) {\n console.error('User new page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user creation page. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * POST /admin/users/new - Create new user\n */\nuserRoutes.post('/users/new', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const password = formData.get('password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email || !password) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, email, and password are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password\n if (password.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n\n if (password !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n\n // Check if username/email are already taken\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE username = ? OR email = ?\n `)\n const existingUser = await checkStmt.bind(username, email).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken.',\n dismissible: true\n }))\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Create user\n const userId = crypto.randomUUID()\n const createStmt = db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name, phone, bio,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createStmt.bind(\n userId, email, username, firstName, lastName, phone, bio,\n passwordHash, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.create', 'users', userId,\n { email, username, role },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Redirect to user list (use HX-Redirect for HTMX requests)\n c.header('HX-Redirect', '/admin/users?success=User created successfully')\n return c.body(null, 200)\n\n } catch (error) {\n console.error('User creation error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to create user!. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * GET /admin/users/:id - Get user by ID\n * Note: This endpoint returns users regardless of is_active status for admin purposes\n */\nuserRoutes.get('/users/:id', async (c) => {\n // Check if this is actually the edit route\n if (c.req.path.endsWith('/edit')) {\n return c.notFound()\n }\n\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (including inactive users for admin access)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userRecord = await userStmt.bind(userId).first() as any\n\n if (!userRecord) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.view', 'users', userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n user: {\n id: userRecord.id,\n email: userRecord.email,\n username: userRecord.username,\n first_name: userRecord.first_name,\n last_name: userRecord.last_name,\n phone: userRecord.phone,\n bio: userRecord.bio,\n avatar_url: userRecord.avatar_url,\n role: userRecord.role,\n is_active: userRecord.is_active,\n email_verified: userRecord.email_verified,\n two_factor_enabled: userRecord.two_factor_enabled,\n created_at: userRecord.created_at,\n last_login_at: userRecord.last_login_at\n }\n })\n\n } catch (error) {\n console.error('User fetch error:', error)\n return c.json({ error: 'Failed to fetch user' }, 500)\n }\n})\n\n/**\n * GET /admin/users/:id/edit - Show user edit page\n */\nuserRoutes.get('/users/:id/edit', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (removed bio - now in profile)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userToEdit = await userStmt.bind(userId).first() as any\n\n if (!userToEdit) {\n return c.html(renderAlert({\n type: 'error',\n message: 'User not found',\n dismissible: true\n }), 404)\n }\n\n // Get user profile data\n const profileStmt = db.prepare(`\n SELECT display_name, bio, company, job_title, website, location, date_of_birth, data\n FROM user_profiles\n WHERE user_id = ?\n `)\n const profileData = await profileStmt.bind(userId).first() as any\n\n // Convert profile to UserProfileData interface\n const profile: UserProfileData | undefined = profileData ? {\n displayName: profileData.display_name,\n bio: profileData.bio,\n company: profileData.company,\n jobTitle: profileData.job_title,\n website: profileData.website,\n location: profileData.location,\n dateOfBirth: profileData.date_of_birth\n } : undefined\n\n // Parse custom profile data\n let customData: Record = {}\n if (profileData?.data) {\n try { customData = JSON.parse(profileData.data) } catch {}\n }\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n // Convert to UserEditData interface\n const editData: UserEditData = {\n id: userToEdit.id,\n email: userToEdit.email,\n username: userToEdit.username || '',\n firstName: userToEdit.first_name || '',\n lastName: userToEdit.last_name || '',\n phone: userToEdit.phone,\n avatarUrl: userToEdit.avatar_url,\n role: userToEdit.role,\n isActive: Boolean(userToEdit.is_active),\n emailVerified: Boolean(userToEdit.email_verified),\n twoFactorEnabled: Boolean(userToEdit.two_factor_enabled),\n createdAt: userToEdit.created_at,\n lastLoginAt: userToEdit.last_login_at,\n profile\n }\n\n const pageData: UserEditPageData = {\n userToEdit: editData,\n roles: ROLES,\n customProfileFieldsHtml,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserEditPage(pageData))\n } catch (error) {\n console.error('User edit page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * PUT /admin/users/:id - Update user\n */\nuserRoutes.put('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Optional password change\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Extract profile fields\n const profileDisplayName = sanitizeInput(formData.get('profile_display_name')?.toString()) || null\n const profileBio = sanitizeInput(formData.get('profile_bio')?.toString()) || null\n const profileCompany = sanitizeInput(formData.get('profile_company')?.toString()) || null\n const profileJobTitle = sanitizeInput(formData.get('profile_job_title')?.toString()) || null\n const profileWebsite = formData.get('profile_website')?.toString()?.trim() || null\n const profileLocation = sanitizeInput(formData.get('profile_location')?.toString()) || null\n const profileDateOfBirthStr = formData.get('profile_date_of_birth')?.toString()?.trim() || null\n const profileDateOfBirth = profileDateOfBirthStr ? new Date(profileDateOfBirthStr).getTime() : null\n\n // Extract custom profile fields\n const profileConfig = getUserProfileConfig()\n let customDataJson: string | null = null\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n // Merge with existing custom data\n const existingCustom = await getCustomData(db, userId)\n const merged = { ...existingCustom, ...sanitized }\n customDataJson = JSON.stringify(merged)\n }\n\n // Validate required fields\n if (!username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password if provided\n if (newPassword) {\n if (newPassword.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n }\n\n // Validate website URL if provided\n if (profileWebsite) {\n try {\n new URL(profileWebsite)\n } catch {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid website URL.',\n dismissible: true\n }))\n }\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE (username = ? OR email = ?) AND id != ?\n `)\n const existingUser = await checkStmt.bind(username, email, userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken by another user.',\n dismissible: true\n }))\n }\n\n // Update user (removed bio - now in profile)\n const updateStmt = db.prepare(`\n UPDATE users SET\n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, role = ?, is_active = ?, email_verified = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), userId\n ).run()\n\n // Update password if provided\n if (newPassword) {\n const passwordHash = await AuthManager.hashPassword(newPassword)\n const updatePasswordStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?\n `)\n await updatePasswordStmt.bind(passwordHash, Date.now(), userId).run()\n }\n\n // Check if any profile field has data\n const hasProfileData = profileDisplayName || profileBio || profileCompany ||\n profileJobTitle || profileWebsite || profileLocation || profileDateOfBirth\n\n if (hasProfileData || customDataJson !== null) {\n const now = Date.now()\n\n // Check if profile exists\n const profileCheckStmt = db.prepare(`SELECT id FROM user_profiles WHERE user_id = ?`)\n const existingProfile = await profileCheckStmt.bind(userId).first() as any\n\n if (existingProfile) {\n // Update existing profile\n const updateProfileStmt = db.prepare(`\n UPDATE user_profiles SET\n display_name = ?, bio = ?, company = ?, job_title = ?,\n website = ?, location = ?, date_of_birth = ?, updated_at = ?\n ${customDataJson !== null ? ', data = ?' : ''}\n WHERE user_id = ?\n `)\n const updateBindings = [\n profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, now,\n ...(customDataJson !== null ? [customDataJson] : []),\n userId\n ]\n await updateProfileStmt.bind(...updateBindings).run()\n } else {\n // Create new profile\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const insertProfileStmt = db.prepare(`\n INSERT INTO user_profiles (id, user_id, display_name, bio, company, job_title, website, location, date_of_birth, data, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n await insertProfileStmt.bind(\n profileId, userId, profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, customDataJson || '{}', now, now\n ).run()\n }\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user.update', 'users', userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'role', 'is_active', 'email_verified', 'profile', ...(newPassword ? ['password'] : [])] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success',\n message: 'User updated successfully!',\n dismissible: true\n }))\n\n } catch (error) {\n console.error('User update error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to update user. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * POST /admin/users/:id/toggle - Toggle user active status\n */\nuserRoutes.post('/users/:id/toggle', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const body = await c.req.json().catch(() => ({ active: true }))\n const active = body.active === true\n\n // Prevent self-deactivation\n if (userId === user!.userId && !active) {\n return c.json({ error: 'You cannot deactivate your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToToggle = await userStmt.bind(userId).first() as any\n\n if (!userToToggle) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Toggle user status\n const toggleStmt = db.prepare(`\n UPDATE users SET is_active = ?, updated_at = ? WHERE id = ?\n `)\n await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, active ? 'user.activate' : 'user.deactivate', 'users', userId,\n { email: userToToggle.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: active ? 'User activated successfully' : 'User deactivated successfully'\n })\n\n } catch (error) {\n console.error('User toggle error:', error)\n return c.json({ error: 'Failed to toggle user status' }, 500)\n }\n})\n\n/**\n * DELETE /admin/users/:id - Delete user\n */\nuserRoutes.delete('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get request body to check for hard delete option\n const body = await c.req.json().catch(() => ({ hardDelete: false }))\n const hardDelete = body.hardDelete === true\n\n // Prevent self-deletion\n if (userId === user!.userId) {\n return c.json({ error: 'You cannot delete your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToDelete = await userStmt.bind(userId).first() as any\n\n if (!userToDelete) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n if (hardDelete) {\n // Hard delete - permanently remove from database\n const deleteStmt = db.prepare(`\n DELETE FROM users WHERE id = ?\n `)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.hard_delete', 'users', userId,\n { email: userToDelete.email, permanent: true },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User permanently deleted'\n })\n } else {\n // Soft delete - deactivate by setting is_active = 0\n const deleteStmt = db.prepare(`\n UPDATE users SET is_active = 0, updated_at = ? WHERE id = ?\n `)\n await deleteStmt.bind(Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.soft_delete', 'users', userId,\n { email: userToDelete.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User deactivated successfully'\n })\n }\n\n } catch (error) {\n console.error('User deletion error:', error)\n return c.json({ error: 'Failed to delete user' }, 500)\n }\n})\n\n/**\n * POST /admin/invite-user - Invite a new user\n */\nuserRoutes.post('/invite-user', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const role = formData.get('role')?.toString()?.trim() || 'viewer'\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n\n // Validate input\n if (!email || !firstName || !lastName) {\n return c.json({ error: 'Email, first name, and last name are required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n // Check if user already exists\n const existingUserStmt = db.prepare(`\n SELECT id FROM users WHERE email = ?\n `)\n const existingUser = await existingUserStmt.bind(email).first()\n\n if (existingUser) {\n return c.json({ error: 'A user with this email already exists' }, 400)\n }\n\n // Generate invitation token\n const invitationToken = crypto.randomUUID()\n // const invitationExpires = Date.now() + (7 * 24 * 60 * 60 * 1000) // 7 days\n\n // Create user record with invitation\n const userId = crypto.randomUUID()\n const createUserStmt = db.prepare(`\n INSERT INTO users (\n id, email, first_name, last_name, role, \n invitation_token, invited_by, invited_at,\n is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createUserStmt.bind(\n userId, email, firstName, lastName, role,\n invitationToken, user!.userId, Date.now(),\n 0, 0, Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invite_sent', 'users', userId,\n { email, role, invited_user_id: userId },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // In a real implementation, you would send an email here\n // For now, we'll return the invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${invitationToken}`\n\n return c.json({\n success: true,\n message: 'User invitation sent successfully',\n user: {\n id: userId,\n email,\n first_name: firstName,\n last_name: lastName,\n role\n },\n invitation_link: invitationLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('User invitation error:', error)\n return c.json({ error: 'Failed to send user invitation' }, 500)\n }\n})\n\n/**\n * POST /admin/resend-invitation/:id - Resend invitation\n */\nuserRoutes.post('/resend-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invitation_token\n FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Generate new invitation token\n const newInvitationToken = crypto.randomUUID()\n\n // Update invitation token and date\n const updateStmt = db.prepare(`\n UPDATE users SET \n invitation_token = ?, \n invited_at = ?, \n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newInvitationToken,\n Date.now(),\n Date.now(),\n userId\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_resent', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Generate new invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${newInvitationToken}`\n\n return c.json({\n success: true,\n message: 'Invitation resent successfully',\n invitation_link: invitationLink\n })\n\n } catch (error) {\n console.error('Resend invitation error:', error)\n return c.json({ error: 'Failed to resend invitation' }, 500)\n }\n})\n\n/**\n * DELETE /admin/cancel-invitation/:id - Cancel invitation\n */\nuserRoutes.delete('/cancel-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Delete the user record (since they haven't activated yet)\n const deleteStmt = db.prepare(`DELETE FROM users WHERE id = ?`)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_cancelled', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'Invitation cancelled successfully'\n })\n\n } catch (error) {\n console.error('Cancel invitation error:', error)\n return c.json({ error: 'Failed to cancel invitation' }, 500)\n }\n})\n\n/**\n * GET /admin/activity-logs - View activity logs\n */\nuserRoutes.get('/activity-logs', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination and filter parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '50')\n const offset = (page - 1) * limit\n\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get activity logs with user information\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: logs } = await logsStmt.bind(...params, limit, offset).all()\n\n // Get total count for pagination\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total \n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalLogs = countResult?.total || 0\n\n // Parse details JSON for each log\n const formattedLogs: ActivityLog[] = (logs || []).map((log: any) => ({\n ...log,\n details: log.details ? JSON.parse(log.details) : null\n }))\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'activity.logs_viewed', undefined, undefined,\n { filters, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n const pageData: ActivityLogsPageData = {\n logs: formattedLogs,\n pagination: {\n page,\n limit,\n total: totalLogs,\n pages: Math.ceil(totalLogs / limit)\n },\n filters,\n user: {\n name: user!.email.split('@')[0] || user!.email, // Use email username as fallback\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n\n } catch (error) {\n console.error('Activity logs error:', error)\n \n const pageData: ActivityLogsPageData = {\n logs: [],\n pagination: { page: 1, limit: 50, total: 0, pages: 0 },\n filters: {},\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n }\n})\n\n/**\n * GET /admin/activity-logs/export - Export activity logs to CSV\n */\nuserRoutes.get('/activity-logs/export', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get filter parameters (same as list view)\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get all matching activity logs (limit to 10,000 for performance)\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT 10000\n `)\n\n const { results: logs } = await logsStmt.bind(...params).all()\n\n // Generate CSV content\n const csvHeaders = ['Timestamp', 'User', 'Email', 'Action', 'Resource Type', 'Resource ID', 'IP Address', 'Details']\n const csvRows = [csvHeaders.join(',')]\n\n for (const log of (logs || [])) {\n const row = [\n `\"${new Date((log as any).created_at).toISOString()}\"`,\n `\"${(log as any).user_name || 'Unknown'}\"`,\n `\"${(log as any).user_email || 'N/A'}\"`,\n `\"${(log as any).action}\"`,\n `\"${(log as any).resource_type || 'N/A'}\"`,\n `\"${(log as any).resource_id || 'N/A'}\"`,\n `\"${(log as any).ip_address || 'N/A'}\"`,\n `\"${(log as any).details ? JSON.stringify(JSON.parse((log as any).details)) : 'N/A'}\"`\n ]\n csvRows.push(row.join(','))\n }\n\n const csvContent = csvRows.join('\\n')\n\n // Log the export activity\n await logActivity(\n db, user!.userId, 'activity.logs_exported', undefined, undefined,\n { filters, count: logs?.length || 0 },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return CSV file\n const filename = `activity-logs-${new Date().toISOString().split('T')[0]}.csv`\n \n return new Response(csvContent, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"${filename}\"`\n }\n })\n\n } catch (error) {\n console.error('Activity logs export error:', error)\n return c.json({ error: 'Failed to export activity logs' }, 500)\n }\n})\n\nexport { userRoutes }","export interface MediaFile {\n id: string;\n filename: string;\n original_name: string;\n mime_type: string;\n size: number;\n public_url: string;\n thumbnail_url?: string;\n alt?: string;\n caption?: string;\n tags: string[];\n uploaded_at: string;\n fileSize: string;\n uploadedAt: string;\n isImage: boolean;\n isVideo: boolean;\n isDocument: boolean;\n}\n\nexport interface MediaGridData {\n files: MediaFile[];\n viewMode?: \"grid\" | \"list\";\n selectable?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function renderMediaGrid(data: MediaGridData): string {\n if (data.files.length === 0) {\n return `\n
\n \n \n \n

No media files

\n

${\n data.emptyMessage || \"Get started by uploading your first file.\"\n }

\n
\n `;\n }\n\n const gridClass = data.viewMode === \"list\" ? \"space-y-4\" : \"media-grid\";\n\n return `\n
\n ${data.files\n .map((file) =>\n renderMediaFileCard(file, data.viewMode, data.selectable)\n )\n .join(\"\")}\n
\n `;\n}\n\nexport function renderMediaFileCard(\n file: MediaFile,\n viewMode: \"grid\" | \"list\" = \"grid\",\n selectable: boolean = false\n): string {\n if (viewMode === \"list\") {\n return `\n
\n
\n ${\n selectable\n ? `\n
\n
\n \n \n \n \n \n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n
\n\n
\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n \n \n \n \n \n
\n
\n
\n ${file.uploadedAt}\n ${\n file.tags.length > 0\n ? `\n \n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n
\n
\n `;\n }\n\n // Grid view\n return `\n
\n ${\n selectable\n ? `\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n ${\n file.uploadedAt\n }\n
\n ${\n file.tags.length > 0\n ? `\n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n `;\n}\n\nfunction getFileIcon(mimeType: string): string {\n if (mimeType.startsWith(\"image/\")) {\n return `\n \n \n \n `;\n } else if (mimeType.startsWith(\"video/\")) {\n return `\n \n \n \n `;\n } else if (mimeType === \"application/pdf\") {\n return `\n \n \n \n `;\n } else {\n return `\n \n \n \n `;\n }\n}\n","import {\n getConfirmationDialogScript,\n renderConfirmationDialog,\n} from \"../components/confirmation-dialog.template\";\nimport { MediaFile, renderMediaGrid } from \"../components/media-grid.template\";\nimport {\n AdminLayoutCatalystData,\n renderAdminLayoutCatalyst,\n} from \"../layouts/admin-layout-catalyst.template\";\n\nexport interface FolderStats {\n folder: string;\n count: number;\n totalSize: number;\n}\n\nexport interface TypeStats {\n type: string;\n count: number;\n}\n\nexport interface MediaLibraryPageData {\n files: MediaFile[];\n folders: FolderStats[];\n types: TypeStats[];\n currentFolder: string;\n currentType: string;\n currentView: \"grid\" | \"list\";\n currentPage: number;\n totalFiles: number;\n hasNextPage: boolean;\n user?: {\n name: string;\n email: string;\n role: string;\n };\n version?: string;\n}\n\nexport function renderMediaLibraryPage(data: MediaLibraryPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Media Library

\n

Manage your media files and assets

\n
\n
\n \n \n \n \n Upload Media\n \n
\n
\n \n
\n \n
\n
\n \n
\n \n Upload Files\n \n
\n\n \n
\n

Folders

\n \n
\n\n \n
\n

File Types

\n \n
\n\n \n
\n

Quick Actions

\n
\n \n Create Folder\n \n \n Cleanup Unused\n \n
\n
\n
\n
\n \n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n ${\n data.files.length\n } files\n \n Select All\n \n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Move to Folder\n \n
\n
\n \n \n \n \n Delete Selected Files\n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n ${renderMediaGrid({\n files: data.files,\n viewMode: data.currentView,\n selectable: true,\n emptyMessage:\n \"No media files found. Upload your first file to get started.\",\n })}\n
\n \n \n ${\n data.hasNextPage\n ? `\n
\n
\n ${\n data.currentPage > 1\n ? `\n \n Previous\n \n `\n : \"\"\n }\n Page ${\n data.currentPage\n }\n \n Next\n \n
\n
\n `\n : \"\"\n }\n
\n
\n \n \n \n
\n
\n
\n

Upload Files

\n \n
\n \n \n { window.location.href = '/admin/media?t=' + Date.now(); }, 1500); }\"\n class=\"space-y-4\"\n >\n \n \n \n \n \n
\n

Drop files here or click to upload

\n

PNG, JPG, GIF, PDF up to 10MB

\n
\n
\n \n \n \n \n
\n \n \n
\n\n \n
\n

Selected Files:

\n
\n
\n\n \n
\n \n Cancel\n \n \n Upload Files\n \n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n
\n
\n\n \n
\n
\n
\n

Move to Folder

\n \n
\n\n

\n Select a folder to move 0 selected file(s) to:\n

\n\n
\n ${\n data.folders.length > 0\n ? data.folders\n .map(\n (folder) => `\n \n
\n ${folder.folder}\n ${folder.count} files\n
\n \n `\n )\n .join(\"\")\n : '

No folders available

'\n }\n
\n\n
\n \n Cancel\n \n
\n
\n
\n\n \n
\n
\n
\n

Create New Folder

\n \n
\n\n
\n
\n \n \n

\n Use lowercase letters, numbers, hyphens, and underscores only\n

\n
\n\n
\n \n Cancel\n \n \n Create Folder\n \n
\n
\n
\n
\n\n \n \n \n\n \n ${renderConfirmationDialog({\n id: \"media-bulk-delete-confirm\",\n title: \"Delete Selected Files\",\n message: `Are you sure you want to delete ${\n data.files.length > 0 ? \"the selected files\" : \"these files\"\n }? This action cannot be undone and the files will be permanently removed.`,\n confirmText: \"Delete Files\",\n cancelText: \"Cancel\",\n confirmClass: \"bg-red-500 hover:bg-red-400\",\n iconColor: \"red\",\n onConfirm: \"performBulkDelete()\",\n })}\n\n \n ${getConfirmationDialogScript()}\n `;\n\n function buildPageUrl(page: number, folder: string, type: string): string {\n const params = new URLSearchParams();\n params.set(\"page\", page.toString());\n if (folder !== \"all\") params.set(\"folder\", folder);\n if (type !== \"all\") params.set(\"type\", type);\n return `/admin/media?${params.toString()}`;\n }\n\n const layoutData: AdminLayoutCatalystData = {\n title: \"Media Library\",\n pageTitle: \"Media Library\",\n currentPath: \"/admin/media\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayoutCatalyst(layoutData);\n}\n","import { MediaFile } from './media-grid.template'\n\nexport interface MediaFileDetailsData {\n file: MediaFile & {\n width?: number\n height?: number\n folder: string\n uploadedAt: string\n }\n}\n\nexport function renderMediaFileDetails(data: MediaFileDetailsData): string {\n const { file } = data\n \n return `\n
\n

File Details

\n \n
\n \n
\n \n
\n
\n ${file.isImage ? `\n \"${file.alt\n ` : file.isVideo ? `\n \n ` : `\n
\n \n \n \n
\n `}\n
\n\n
\n \n Copy URL\n \n \n Open Original\n \n
\n
\n \n \n
\n
\n \n

${file.original_name}

\n
\n\n
\n
\n \n

${file.fileSize}

\n
\n
\n \n

${file.mime_type}

\n
\n
\n\n ${file.width && file.height ? `\n
\n
\n \n

${file.width}px

\n
\n
\n \n

${file.height}px

\n
\n
\n ` : ''}\n\n
\n \n

${file.folder}

\n
\n\n
\n \n

${file.uploadedAt}

\n
\n\n \n
\n
\n \n \n
\n\n
\n \n ${file.caption || ''}\n
\n\n
\n \n \n
\n\n
\n \n Save Changes\n \n \n Delete File\n \n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\nimport { html, raw } from 'hono/html'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth, requireRole } from '../middleware'\nimport { renderMediaLibraryPage, MediaLibraryPageData, FolderStats, TypeStats } from '../templates/pages/admin-media-library.template'\nimport { renderMediaFileDetails, MediaFileDetailsData } from '../templates/components/media-file-details.template'\nimport { MediaFile, renderMediaFileCard } from '../templates/components/media-grid.template'\nimport type { Bindings, Variables } from '../app'\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nconst adminMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminMediaRoutes.use('*', requireAuth())\n\n// Media library main page\nadminMediaRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { searchParams } = new URL(c.req.url)\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const view = searchParams.get('view') || 'grid'\n const page = parseInt(searchParams.get('page') || '1')\n const _cacheBust = searchParams.get('t') // Cache-busting parameter\n const limit = 24\n const offset = (page - 1) * limit\n\n const db = c.env.DB\n\n // TODO: Cache implementation removed during migration - will be added back when cache plugin is migrated\n\n // Build query for media files\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = ['deleted_at IS NULL']\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT ${limit} OFFSET ${offset}`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n // Get folder statistics\n const foldersStmt = db.prepare(`\n SELECT folder, COUNT(*) as count, SUM(size) as totalSize\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY folder\n ORDER BY folder\n `)\n const { results: folders } = await foldersStmt.all()\n \n // Get type statistics\n const typesStmt = db.prepare(`\n SELECT\n CASE\n WHEN mime_type LIKE 'image/%' THEN 'images'\n WHEN mime_type LIKE 'video/%' THEN 'videos'\n WHEN mime_type IN ('application/pdf', 'text/plain') THEN 'documents'\n ELSE 'other'\n END as type,\n COUNT(*) as count\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY type\n `)\n const { results: types } = await typesStmt.all()\n \n // Process media files with local serving URLs\n const mediaFiles: MediaFile[] = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n caption: row.caption,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const pageData: MediaLibraryPageData = {\n files: mediaFiles,\n folders: folders.map((f: any) => ({\n folder: f.folder,\n count: f.count,\n totalSize: f.totalSize\n })) as FolderStats[],\n types: types.map((t: any) => ({\n type: t.type,\n count: t.count\n })) as TypeStats[],\n currentFolder: folder,\n currentType: type,\n currentView: view as 'grid' | 'list',\n currentPage: page,\n totalFiles: results.length,\n hasNextPage: results.length === limit,\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: c.get('appVersion')\n }\n\n // TODO: Cache implementation removed during migration\n\n return c.html(renderMediaLibraryPage(pageData))\n } catch (error) {\n console.error('Error loading media library:', error)\n return c.html(html`

Error loading media library

`)\n }\n})\n\n// Media selector endpoint (HTMX endpoint for content form media selection)\nadminMediaRoutes.get('/selector', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const db = c.env.DB\n\n // Build search query\n let query = 'SELECT * FROM media WHERE deleted_at IS NULL'\n const params: any[] = []\n\n if (search.trim()) {\n query += ' AND (filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n query += ' ORDER BY uploaded_at DESC LIMIT 24'\n\n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n // Render media selector grid\n return c.html(html`\n
\n \n
\n\n
\n ${raw(mediaFiles.map(file => `\n \n
\n ${file.isImage ? `\n \n ` : file.isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n\n
\n \n Select\n \n
\n
\n\n
\n

\n ${file.original_name}\n

\n

\n ${file.fileSize}\n

\n
\n
\n `).join(''))}\n \n\n ${mediaFiles.length === 0 ? html`\n
\n \n \n \n

No media files found

\n
\n ` : ''}\n `)\n } catch (error) {\n console.error('Error loading media selector:', error)\n return c.html(html`
Error loading media files
`)\n }\n})\n\n// Search media files (HTMX endpoint)\nadminMediaRoutes.get('/search', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const db = c.env.DB\n \n // Build search query\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = []\n \n if (search.trim()) {\n conditions.push('(filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)')\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT 24`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n const mediaFiles = results.map((row: any) => ({\n ...row,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n fileSize: formatFileSize(row.size),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const gridHTML = mediaFiles.map(file => generateMediaItemHTML(file)).join('')\n \n return c.html(raw(gridHTML))\n } catch (error) {\n console.error('Error searching media:', error)\n return c.html('
Error searching files
')\n }\n})\n\n// Get file details modal (HTMX endpoint)\nadminMediaRoutes.get('/:id/details', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n \n const stmt = db.prepare('SELECT * FROM media WHERE id = ?')\n const result = await stmt.bind(id).first() as any\n \n if (!result) {\n return c.html('
File not found
')\n }\n \n const file: MediaFile & { width?: number; height?: number; folder: string; uploadedAt: string } = {\n id: result.id,\n filename: result.filename,\n original_name: result.original_name,\n mime_type: result.mime_type,\n size: result.size,\n public_url: `/files/${result.r2_key}`,\n thumbnail_url: result.mime_type.startsWith('image/') ? `/files/${result.r2_key}` : undefined,\n alt: result.alt,\n caption: result.caption,\n tags: result.tags ? JSON.parse(result.tags) : [],\n uploaded_at: result.uploaded_at,\n fileSize: formatFileSize(result.size),\n uploadedAt: new Date(result.uploaded_at).toLocaleString(),\n isImage: result.mime_type.startsWith('image/'),\n isVideo: result.mime_type.startsWith('video/'),\n isDocument: !result.mime_type.startsWith('image/') && !result.mime_type.startsWith('video/'),\n width: result.width,\n height: result.height,\n folder: result.folder\n }\n \n const detailsData: MediaFileDetailsData = { file }\n \n return c.html(renderMediaFileDetails(detailsData))\n } catch (error) {\n console.error('Error fetching file details:', error)\n return c.html('
Error loading file details
')\n }\n})\n\n// Upload files endpoint (HTMX compatible)\nadminMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const fileEntries = formData.getAll('files') as unknown[]\n const files: File[] = []\n\n for (const entry of fileEntries) {\n if (entry instanceof File) {\n files.push(entry)\n }\n }\n \n if (!files || files.length === 0) {\n return c.html(html`\n
\n No files provided\n
\n `)\n }\n\n const uploadResults = []\n const errors = []\n\n // Check if MEDIA_BUCKET is available\n console.log('[MEDIA UPLOAD] c.env keys:', Object.keys(c.env))\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET defined?', !!c.env.MEDIA_BUCKET)\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET type:', typeof c.env.MEDIA_BUCKET)\n\n if (!c.env.MEDIA_BUCKET) {\n console.error('[MEDIA UPLOAD] MEDIA_BUCKET is not available! Available env keys:', Object.keys(c.env))\n return c.html(html`\n
\n Media storage (R2) is not configured. Please check your wrangler.toml configuration.\n
Debug: Available bindings: ${Object.keys(c.env).join(', ')}\n
\n `)\n }\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: validation.error.issues[0]?.message || 'Validation failed'\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = crypto.randomUUID()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user!.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Extract image dimensions if it's an image\n let width: number | undefined\n let height: number | undefined\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate URLs - use public serving route\n const publicUrl = `/files/${r2Key}`\n const thumbnailUrl = file.type.startsWith('image/') ? publicUrl : undefined\n\n // Save to database\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n fileId,\n filename,\n file.name,\n file.type,\n file.size,\n width,\n height,\n folder,\n r2Key,\n publicUrl,\n thumbnailUrl,\n user!.userId,\n Math.floor(Date.now() / 1000)\n ).run()\n\n uploadResults.push({\n id: fileId,\n filename: filename,\n originalName: file.name,\n mimeType: file.type,\n size: file.size,\n publicUrl: publicUrl\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed: ' + (error instanceof Error ? error.message : 'Unknown error')\n })\n }\n }\n\n // TODO: Cache invalidation removed during migration\n\n // Fetch updated media list to include in response\n let mediaGridHTML = ''\n if (uploadResults.length > 0) {\n try {\n const folderEntry = formData.get('folder')\n const folder = typeof folderEntry === 'string' ? folderEntry : 'uploads'\n const query = 'SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT 24'\n const stmt = c.env.DB.prepare(query)\n const { results } = await stmt.all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n mediaGridHTML = mediaFiles.map(file => renderMediaFileCard(file, 'grid', true)).join('')\n } catch (error) {\n console.error('Error fetching updated media list:', error)\n }\n }\n\n // Return HTMX response with results\n return c.html(html`\n ${uploadResults.length > 0 ? html`\n
\n Successfully uploaded ${uploadResults.length} file${uploadResults.length > 1 ? 's' : ''}\n
\n ` : ''}\n\n ${errors.length > 0 ? html`\n
\n

Upload errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n ${uploadResults.length > 0 ? html`\n \n ` : ''}\n `)\n } catch (error) {\n console.error('Upload error:', error)\n return c.html(html`\n
\n Upload failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Serve files from R2 storage\nadminMediaRoutes.get('/file/*', async (c) => {\n try {\n const r2Key = c.req.path.replace('/admin/media/file/', '')\n \n if (!r2Key) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(r2Key)\n \n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n \n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n})\n\n// Update media file metadata (HTMX compatible)\nadminMediaRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n const formData = await c.req.formData()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Extract form data\n const alt = formData.get('alt') as string || null\n const caption = formData.get('caption') as string || null\n const tagsString = formData.get('tags') as string || ''\n const tags = tagsString ? tagsString.split(',').map(tag => tag.trim()).filter(tag => tag) : []\n\n // Update database\n const updateStmt = c.env.DB.prepare(`\n UPDATE media \n SET alt = ?, caption = ?, tags = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n alt,\n caption,\n JSON.stringify(tags),\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n // TODO: Cache invalidation removed during migration\n\n return c.html(html`\n
\n File updated successfully\n
\n \n `)\n } catch (error) {\n console.error('Update error:', error)\n return c.html(html`\n
\n Update failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Cleanup unused media files (HTMX compatible)\nadminMediaRoutes.delete('/cleanup', requireRole('admin'), async (c) => {\n try {\n const db = c.env.DB\n\n // Find all media files\n const allMediaStmt = db.prepare('SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL')\n const { results: allMedia } = await allMediaStmt.all<{ id: string; r2_key: string; filename: string }>()\n\n // Find media files referenced in content\n // Content can reference media in various JSON fields like data, hero_image, etc.\n const contentStmt = db.prepare('SELECT data FROM content')\n const { results: contentRecords } = await contentStmt.all<{ data: unknown }>()\n\n // Extract all media URLs from content\n const referencedUrls = new Set()\n for (const record of contentRecords || []) {\n if (record.data) {\n const dataStr = typeof record.data === 'string' ? record.data : JSON.stringify(record.data)\n // Find all /files/ URLs in the content\n const urlMatches = dataStr.matchAll(/\\/files\\/([^\\s\"',]+)/g)\n for (const match of urlMatches) {\n referencedUrls.add(match[1]!)\n }\n }\n }\n\n // Find unreferenced media files\n const mediaRows = allMedia || []\n const unusedFiles = mediaRows.filter((file) => !referencedUrls.has(file.r2_key))\n\n if (unusedFiles.length === 0) {\n return c.html(html`\n
\n No unused media files found. All files are referenced in content.\n
\n \n `)\n }\n\n // Delete unused files from R2 and database\n let deletedCount = 0\n const errors = []\n\n for (const file of unusedFiles) {\n try {\n // Delete from R2\n await c.env.MEDIA_BUCKET.delete(file.r2_key)\n\n // Soft delete in database\n const deleteStmt = db.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), file.id).run()\n\n deletedCount++\n } catch (error) {\n console.error(`Failed to delete ${file.filename}:`, error)\n errors.push({\n filename: file.filename,\n error: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Return success response\n return c.html(html`\n
\n Successfully cleaned up ${deletedCount} unused media file${deletedCount !== 1 ? 's' : ''}.\n ${errors.length > 0 ? html`\n
Failed to delete ${errors.length} file${errors.length !== 1 ? 's' : ''}.\n ` : ''}\n
\n\n ${errors.length > 0 ? html`\n
\n

Cleanup errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n \n `)\n } catch (error) {\n console.error('Cleanup error:', error)\n return c.html(html`\n
\n Cleanup failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Delete media file (HTMX compatible)\nadminMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // TODO: Cache invalidation removed during migration\n\n // Return HTMX response that redirects to media library\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Delete error:', error)\n return c.html(html`\n
\n Delete failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length - 8) {\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n const segmentLength = (uint8Array[i + 2]! << 8) | uint8Array[i + 3]!\n i += 2 + segmentLength\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\n// Helper function to generate media item HTML\nfunction generateMediaItemHTML(file: any): string {\n const isImage = file.isImage\n const isVideo = file.isVideo\n \n return `\n
\n
\n ${isImage ? `\n \"${file.alt\n ` : isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n \n
\n
\n \n \n
\n
\n
\n \n
\n

\n ${file.original_name}\n

\n
\n ${file.fileSize}\n ${file.uploadedAt}\n
\n ${file.tags.length > 0 ? `\n
\n ${file.tags.slice(0, 2).map((tag: string) => `\n \n ${tag}\n \n `).join('')}\n ${file.tags.length > 2 ? `+${file.tags.length - 2}` : ''}\n
\n ` : ''}\n
\n
\n `\n}\n\n// Helper function to format file size\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n\nexport { adminMediaRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface Plugin {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error' | 'uninstalled'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n}\n\nexport interface PluginsListPageData {\n plugins: Plugin[]\n stats?: {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderPluginsListPage(data: PluginsListPageData): string {\n const categories = [\n { value: 'content', label: 'Content Management' },\n { value: 'media', label: 'Media' },\n { value: 'editor', label: 'Editors' },\n { value: 'seo', label: 'SEO & Analytics' },\n { value: 'security', label: 'Security' },\n { value: 'utilities', label: 'Utilities' },\n { value: 'system', label: 'System' },\n { value: 'development', label: 'Development' },\n { value: 'demo', label: 'Demo' }\n ];\n\n const statuses = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'uninstalled', label: 'Available to Install' },\n { value: 'error', label: 'Error' }\n ];\n\n // Calculate counts\n const categoryCounts: Record = {};\n categories.forEach(cat => {\n categoryCounts[cat.value] = data.plugins.filter(p => p.category === cat.value).length;\n });\n\n // Sort categories by count (descending)\n categories.sort((a, b) => (categoryCounts[b.value] || 0) - (categoryCounts[a.value] || 0));\n\n const statusCounts: Record = {};\n statuses.forEach(status => {\n statusCounts[status.value] = data.plugins.filter(p => p.status === status.value).length;\n });\n\n // Sort statuses by count (descending)\n statuses.sort((a, b) => (statusCounts[b.value] || 0) - (statusCounts[a.value] || 0));\n\n const pageContent = `\n
\n \n
\n
\n

Plugins

\n

Manage and extend functionality with plugins

\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n
\n

\n Experimental Feature\n

\n
\n

\n Plugin management is currently under active development. While functional, some features may change or have limitations.\n Please report any issues you encounter on our Discord community.\n

\n
\n
\n
\n
\n\n
\n \n \n\n \n
\n \n
\n
\n
Total
\n
${data.stats?.total || 0}
\n
\n
\n
Active
\n
${data.stats?.active || 0}
\n
\n
\n
Available
\n
${data.stats?.uninstalled || 0}
\n
\n
\n
Errors
\n
${data.stats?.errors || 0}
\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n \n
\n\n
\n \n\n \n \n \n \n \n
\n
\n\n \n
\n ${data.plugins.map(plugin => renderPluginCard(plugin)).join('')}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'uninstall-plugin-confirm',\n title: 'Uninstall Plugin',\n message: 'Are you sure you want to uninstall this plugin? This action cannot be undone.',\n confirmText: 'Uninstall',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performUninstallPlugin()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Plugins',\n pageTitle: 'Plugin Management',\n currentPath: '/admin/plugins',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderPluginCard(plugin: Plugin): string {\n const statusColors = {\n active: 'bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-400 ring-emerald-600/20',\n inactive: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-zinc-600/20',\n error: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-red-600/20',\n uninstalled: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-600 dark:text-zinc-500 ring-zinc-600/20'\n }\n\n const statusIcons = {\n active: '
',\n inactive: '
',\n error: '
',\n uninstalled: '
'\n }\n\n // Core system plugins that cannot be deactivated\n const criticalCorePlugins = ['core-auth', 'core-media']\n const canToggle = !criticalCorePlugins.includes(plugin.id)\n\n let actionButton = ''\n if (plugin.status === 'uninstalled') {\n actionButton = ``\n } else {\n const isActive = plugin.status === 'active';\n const action = isActive ? 'deactivate' : 'activate';\n // Use bg-emerald-600 for active, bg-zinc-200 (light) / bg-zinc-700 (dark) for inactive\n const bgClass = isActive ? 'bg-emerald-600' : 'bg-zinc-200 dark:bg-zinc-700';\n const translateClass = isActive ? 'translate-x-5' : 'translate-x-0';\n \n if (canToggle) {\n actionButton = `\n \n `\n } else {\n // Critical core plugins cannot be toggled\n actionButton = `\n
\n \n
\n `\n }\n }\n\n return `\n
\n
\n
\n
\n ${plugin.icon || getDefaultPluginIcon(plugin.category)}\n
\n
\n
\n

${plugin.displayName}

\n \n ${statusIcons[plugin.status]}${plugin.status.charAt(0).toUpperCase() + plugin.status.slice(1)}\n \n
\n

v${plugin.version} • ${plugin.author}

\n
\n
\n \n
\n ${!plugin.isCore && plugin.status !== 'uninstalled' ? `\n \n ` : ''}\n
\n
\n\n

${plugin.description}

\n\n
\n \n ${plugin.category}\n \n ${plugin.isCore ? 'Core' : ''}\n \n ${plugin.dependencies && plugin.dependencies.map(dep => `\n \n ${dep}\n \n `).join('') || ''}\n
\n\n
\n
\n ${actionButton}\n
\n
\n
\n `\n}\n\nfunction getDefaultPluginIcon(category: string): string {\n const iconColor = 'text-zinc-600 dark:text-zinc-400'\n\n const icons: Record = {\n 'content': `\n \n \n \n `,\n 'media': `\n \n \n \n `,\n 'seo': `\n \n \n \n `,\n 'analytics': `\n \n \n \n `,\n 'ecommerce': `\n \n \n \n `,\n 'email': `\n \n \n \n `,\n 'workflow': `\n \n \n \n `,\n 'security': `\n \n \n \n `,\n 'social': `\n \n \n \n `,\n 'utility': `\n \n \n \n \n `,\n }\n\n const iconKey = category.toLowerCase() as keyof typeof icons\n return icons[iconKey] || icons['utility'] || ''\n}\n\n// Mock data generator\nexport function generateMockPlugins(): Plugin[] {\n return [\n {\n id: '1',\n name: 'seo-optimizer',\n displayName: 'SEO Optimizer',\n description: 'Advanced SEO optimization tools including meta tag management, sitemap generation, and analytics integration. Boost your search engine rankings with automated optimizations.',\n version: '2.1.4',\n author: 'SonicJS Team',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 15420,\n rating: 4.8,\n lastUpdated: '2 days ago',\n dependencies: ['analytics-plugin'],\n permissions: ['read:content', 'write:meta'],\n isCore: true\n },\n {\n id: '2',\n name: 'image-optimizer',\n displayName: 'Image Optimizer',\n description: 'Automatically compress and optimize images on upload. Supports WebP conversion, lazy loading, and responsive image generation for better performance.',\n version: '1.5.2',\n author: 'MediaPro',\n status: 'active',\n category: 'media',\n icon: ``,\n downloadCount: 8930,\n rating: 4.6,\n lastUpdated: '1 week ago',\n dependencies: [],\n permissions: ['write:media', 'read:settings']\n },\n {\n id: '3',\n name: 'backup-manager',\n displayName: 'Backup Manager',\n description: 'Automated backup solution for content and media files. Schedule regular backups to cloud storage with encryption and restore capabilities.',\n version: '3.0.1',\n author: 'BackupCorp',\n status: 'inactive',\n category: 'utilities',\n icon: ``,\n downloadCount: 12450,\n rating: 4.9,\n lastUpdated: '3 days ago',\n dependencies: ['cloud-storage'],\n permissions: ['read:all', 'write:backups']\n },\n {\n id: '4',\n name: 'security-scanner',\n displayName: 'Security Scanner',\n description: 'Real-time security monitoring and vulnerability scanning. Detects malware, suspicious activities, and provides security recommendations.',\n version: '1.2.8',\n author: 'SecureWeb',\n status: 'error',\n category: 'security',\n icon: ``,\n downloadCount: 5680,\n rating: 4.3,\n lastUpdated: '5 days ago',\n dependencies: ['security-core'],\n permissions: ['read:logs', 'read:files', 'write:security']\n },\n {\n id: '5',\n name: 'social-share',\n displayName: 'Social Share',\n description: 'Easy social media sharing buttons and Open Graph meta tag generation. Supports all major social platforms with customizable styling.',\n version: '2.3.0',\n author: 'SocialPlus',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 22100,\n rating: 4.7,\n lastUpdated: '4 days ago',\n dependencies: [],\n permissions: ['read:content', 'write:meta']\n },\n {\n id: '6',\n name: 'analytics-pro',\n displayName: 'Analytics Pro',\n description: 'Advanced analytics dashboard with custom tracking events, conversion funnels, and detailed visitor insights. GDPR compliant with privacy controls.',\n version: '4.1.2',\n author: 'AnalyticsPro Inc',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 18750,\n rating: 4.9,\n lastUpdated: '1 day ago',\n dependencies: ['gdpr-compliance'],\n permissions: ['read:analytics', 'write:tracking', 'read:users']\n },\n {\n id: '7',\n name: 'form-builder',\n displayName: 'Advanced Form Builder',\n description: 'Drag-and-drop form builder with conditional logic, file uploads, payment integration, and email notifications. Perfect for contact forms and surveys.',\n version: '1.8.5',\n author: 'FormWorks',\n status: 'inactive',\n category: 'content',\n icon: ``,\n downloadCount: 9870,\n rating: 4.4,\n lastUpdated: '1 week ago',\n dependencies: ['email-service'],\n permissions: ['write:forms', 'read:submissions', 'send:emails']\n },\n {\n id: '8',\n name: 'cache-optimizer',\n displayName: 'Cache Optimizer',\n description: 'Intelligent caching system with Redis support, CDN integration, and automatic cache invalidation. Dramatically improves site performance.',\n version: '2.7.3',\n author: 'SpeedBoost',\n status: 'active',\n category: 'utilities',\n icon: ``,\n downloadCount: 13240,\n rating: 4.8,\n lastUpdated: '6 days ago',\n dependencies: ['redis-connector'],\n permissions: ['read:cache', 'write:cache', 'manage:cdn'],\n isCore: true\n },\n {\n id: '9',\n name: 'multilingual',\n displayName: 'Multilingual Support',\n description: 'Complete internationalization solution with automatic translation, language detection, and localized content management for global websites.',\n version: '3.2.1',\n author: 'GlobalWeb',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 7650,\n rating: 4.5,\n lastUpdated: '2 weeks ago',\n dependencies: ['translation-api'],\n permissions: ['read:content', 'write:translations', 'manage:languages']\n }\n ]\n}\n","import type { AuthSettings } from '../../services/auth-validation'\n\nexport function renderAuthSettingsForm(settings: AuthSettings): string {\n const fields = settings.requiredFields\n const validation = settings.validation\n const registration = settings.registration\n\n return `\n
\n \n
\n

Registration Fields

\n

Configure which fields are required during user registration and their minimum lengths.

\n\n
\n ${Object.entries(fields).map(([fieldName, config]: [string, any]) => `\n
\n
\n
\n

${config.label}

\n

Field type: ${config.type}

\n
\n \n
\n\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n `).join('')}\n
\n
\n\n \n
\n

Password Requirements

\n

Additional password complexity requirements.

\n\n
\n
\n
\n \n

Password must contain at least one uppercase letter (A-Z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one lowercase letter (a-z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one number (0-9)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one special character (!@#$%^&*)

\n
\n \n
\n
\n
\n\n \n
\n

Registration Settings

\n

General registration behavior.

\n\n
\n
\n
\n \n

Enable or disable public user registration

\n
\n \n
\n\n
\n
\n \n

Users must verify their email before accessing the system

\n
\n \n
\n\n
\n \n \n \n \n \n \n

Role assigned to new users upon registration

\n
\n
\n
\n\n \n
\n

Validation Settings

\n

Additional validation rules.

\n\n
\n
\n
\n \n

Validate that email addresses are in correct format

\n
\n \n
\n\n
\n
\n \n

Ensure usernames are unique across all users

\n
\n \n
\n
\n
\n
\n `\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAuthSettingsForm } from '../components/auth-settings-form.template'\nimport type { AuthSettings } from '../../services/auth-validation'\n\n/**\n * Escape HTML attribute values to prevent XSS\n */\nfunction escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport interface PluginSettings {\n [key: string]: any\n}\n\nexport interface PluginActivity {\n id: string\n action: string\n message: string\n timestamp: number\n user?: string\n}\n\nexport interface PluginSettingsPageData {\n plugin: {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n settings?: PluginSettings\n }\n activity?: PluginActivity[]\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderPluginSettingsPage(data: PluginSettingsPageData): string {\n const { plugin, activity = [], user } = data\n \n const pageContent = `\n
\n \n
\n
\n

Plugin Settings

\n

\n ${plugin.description}\n

\n
\n \n
\n\n \n
\n
\n
\n
\n ${plugin.icon || plugin.displayName.charAt(0).toUpperCase()}\n
\n
\n

${plugin.displayName}

\n
\n v${plugin.version}\n by ${plugin.author}\n ${plugin.category}\n ${plugin.downloadCount ? `${plugin.downloadCount.toLocaleString()} downloads` : ''}\n ${plugin.rating ? `★ ${plugin.rating}` : ''}\n
\n
\n
\n\n
\n ${renderStatusBadge(plugin.status)}\n ${renderToggleButton(plugin)}\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n \n
\n ${renderSettingsTab(plugin)}\n
\n\n \n
\n ${renderActivityTab(activity)}\n
\n\n \n
\n ${renderInformationTab(plugin)}\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${plugin.displayName} Settings`,\n pageTitle: `${plugin.displayName} Settings`,\n currentPath: `/admin/plugins/${plugin.id}`,\n user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction renderStatusBadge(status: string): string {\n const statusColors: Record = {\n active: 'bg-green-900/50 text-green-300 border-green-600/30',\n inactive: 'bg-gray-800/50 text-gray-400 border-gray-600/30',\n error: 'bg-red-900/50 text-red-300 border-red-600/30'\n }\n\n const statusIcons: Record = {\n active: '
',\n inactive: '
',\n error: '
'\n }\n\n return `\n \n ${statusIcons[status] || statusIcons.inactive}${status.charAt(0).toUpperCase() + status.slice(1)}\n \n `\n}\n\nfunction renderToggleButton(plugin: any): string {\n if (plugin.isCore) {\n return 'Core Plugin'\n }\n\n return plugin.status === 'active' \n ? ``\n : ``\n}\n\nfunction renderSettingsTab(plugin: any): string {\n const settings = plugin.settings || {}\n const pluginId = plugin.id || plugin.name\n\n // Check for custom settings component first\n const customRenderer = pluginSettingsComponents[pluginId]\n if (customRenderer) {\n return `\n
\n ${customRenderer(plugin, settings)}\n\n
\n \n Save Settings\n \n
\n
\n `\n }\n\n const isSeedDataPlugin = plugin.id === 'seed-data' || plugin.name === 'seed-data'\n const isAuthPlugin = plugin.id === 'core-auth' || plugin.name === 'core-auth'\n const isTurnstilePlugin = plugin.id === 'turnstile' || plugin.name === 'turnstile'\n\n return `\n ${isSeedDataPlugin ? `\n
\n
\n
\n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n
\n \n \n \n \n Open Seed Data Tool\n \n
\n
\n ` : ''}\n\n
\n ${isAuthPlugin ? `\n

Authentication Settings

\n

Configure user registration fields and validation rules.

\n ` : isTurnstilePlugin ? `\n

Cloudflare Turnstile Settings

\n

Configure CAPTCHA-free bot protection for your forms.

\n ` : `\n

Plugin Settings

\n `}\n\n
\n ${isAuthPlugin && Object.keys(settings).length > 0\n ? renderAuthSettingsForm(settings as AuthSettings)\n : isTurnstilePlugin && Object.keys(settings).length > 0\n ? renderTurnstileSettingsForm(settings)\n : Object.keys(settings).length > 0\n ? renderSettingsFields(settings)\n : renderNoSettings(plugin)\n }\n\n ${Object.keys(settings).length > 0 ? `\n
\n \n Save Settings\n \n
\n ` : ''}\n
\n
\n `\n}\n\nfunction renderSettingsFields(settings: PluginSettings): string {\n return Object.entries(settings).map(([key, value]) => {\n const fieldId = `setting_${key}`\n const displayName = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase())\n \n if (typeof value === 'boolean') {\n return `\n
\n
\n \n

Enable or disable this feature

\n
\n \n
\n `\n } else if (typeof value === 'number') {\n return `\n
\n \n \n
\n `\n } else {\n return `\n
\n \n \n
\n `\n }\n }).join('')\n}\n\nfunction renderTurnstileSettingsForm(settings: any): string {\n const inputClass = \"backdrop-blur-sm bg-white/10 border border-white/20 rounded-lg px-3 py-2 text-white placeholder-gray-300 focus:border-blue-400 focus:outline-none transition-colors w-full\"\n const selectClass = \"backdrop-blur-sm bg-zinc-800 border border-white/20 rounded-lg px-3 py-2 text-white focus:border-blue-400 focus:outline-none transition-colors w-full [&>option]:bg-zinc-800 [&>option]:text-white\"\n \n return `\n \n
\n
\n \n

Enable or disable Turnstile verification globally

\n
\n \n
\n\n \n
\n \n \n

Your Cloudflare Turnstile site key (public)

\n
\n\n \n
\n \n \n

Your Cloudflare Turnstile secret key (private)

\n
\n\n \n
\n \n \n

Visual appearance of the Turnstile widget

\n
\n\n \n
\n \n \n

Size of the Turnstile challenge widget

\n
\n\n \n
\n \n \n

Managed: Shows challenge only when needed. Non-Interactive: Always shows but doesn't require interaction. Invisible: Runs in background without UI.

\n
\n\n \n
\n \n \n

Controls when Turnstile verification occurs. Always: Verifies immediately (pre-clearance). Execute: Verifies on form submit. Interaction Only: Only after user interaction.

\n
\n `\n}\n\nfunction renderNoSettings(plugin: any): string {\n // Special handling for seed-data plugin\n if (plugin.id === 'seed-data' || plugin.name === 'seed-data') {\n return `\n
\n \n \n \n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n \n \n \n \n Generate Seed Data\n \n
\n `\n }\n\n return `\n
\n \n \n \n \n

No Settings Available

\n

This plugin doesn't have any configurable settings.

\n
\n `\n}\n\nfunction renderActivityTab(activity: PluginActivity[]): string {\n return `\n
\n

Activity Log

\n \n ${activity.length > 0 ? `\n
\n ${activity.map(item => `\n
\n
\n
\n
\n ${item.action}\n ${formatTimestamp(item.timestamp)}\n
\n

${item.message}

\n ${item.user ? `

by ${item.user}

` : ''}\n
\n
\n `).join('')}\n
\n ` : `\n
\n \n \n \n

No Activity

\n

No recent activity for this plugin.

\n
\n `}\n
\n `\n}\n\nfunction renderInformationTab(plugin: any): string {\n return `\n
\n \n
\n

Plugin Details

\n
\n
\n Name:\n ${plugin.displayName}\n
\n
\n Version:\n ${plugin.version}\n
\n
\n Author:\n ${plugin.author}\n
\n
\n Category:\n ${plugin.category}\n
\n
\n Status:\n ${plugin.status}\n
\n
\n Last Updated:\n ${plugin.lastUpdated}\n
\n
\n
\n\n \n
\n

Dependencies & Permissions

\n \n ${plugin.dependencies && plugin.dependencies.length > 0 ? `\n
\n

Dependencies:

\n
\n ${plugin.dependencies.map((dep: string) => `\n
${dep}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${plugin.permissions && plugin.permissions.length > 0 ? `\n
\n

Permissions:

\n
\n ${plugin.permissions.map((perm: string) => `\n
${perm}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${(!plugin.dependencies || plugin.dependencies.length === 0) && (!plugin.permissions || plugin.permissions.length === 0) ? `\n

No dependencies or special permissions required.

\n ` : ''}\n
\n
\n `\n}\n\nfunction formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp * 1000)\n return date.toLocaleString()\n}\n\n// ==================== Plugin Settings Components ====================\n// These render just the settings content, embedded within the shared layout\n\n/**\n * Registry of custom plugin settings components\n * Plugins with custom settings UI register their render functions here\n */\ntype PluginSettingsRenderer = (plugin: any, settings: PluginSettings) => string\n\nconst pluginSettingsComponents: Record = {\n 'otp-login': renderOTPLoginSettingsContent,\n 'email': renderEmailSettingsContent,\n}\n\n/**\n * OTP Login plugin settings content\n */\nfunction renderOTPLoginSettingsContent(plugin: any, settings: PluginSettings): string {\n const siteName = settings.siteName || 'SonicJS'\n const emailConfigured = settings._emailConfigured || false\n const codeLength = settings.codeLength || 6\n const codeExpiryMinutes = settings.codeExpiryMinutes || 10\n const maxAttempts = settings.maxAttempts || 3\n const rateLimitPerHour = settings.rateLimitPerHour || 5\n const allowNewUserRegistration = settings.allowNewUserRegistration || false\n const logoUrl = settings.logoUrl || ''\n const logoWidth = Number(settings.logoWidth) || 150\n const logoBorderWidth = Number(settings.logoBorderWidth) || 0\n const logoBorderColor = settings.logoBorderColor || '#ffffff'\n const loginUrl = settings.loginUrl || ''\n const loginButtonText = settings.loginButtonText || ''\n const previewButtonText = loginButtonText.trim() || `Sign in to ${siteName}`\n const previewLogoBorder = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${escapeHtmlAttr(logoBorderColor)}; border-radius: 8px;`\n : ''\n\n return `\n
\n \n
\n

\n 📧 Test OTP Email\n

\n\n ${!emailConfigured ? `\n
\n

\n ⚠️ Email not configured.\n Configure the Email plugin\n to send real emails. Dev mode will show codes in the response.\n

\n
\n ` : `\n
\n

\n ✅ Email configured. Test emails will be sent via Resend.\n

\n
\n `}\n\n
\n
\n \n \n
\n\n \n Send Test Code\n \n \n \n \n \n \n \n \n\n
\n\n \n
\n

Verify Code

\n
\n
\n \n \n
\n \n Verify Code\n \n \n
\n
\n
\n\n \n
\n

Code Settings

\n\n
\n
\n \n \n

Optional. Displayed at the top of the OTP email.

\n
\n\n
\n
\n \n \n

Max width of the logo (20-600).

\n
\n\n
\n \n \n

0 disables the border.

\n
\n\n
\n \n
\n \n \n
\n

Hex, rgb(), or named color.

\n
\n
\n\n
\n \n \n

Optional. If set, a \"Sign in\" button is added to the email.

\n
\n\n
\n \n \n

Optional. Defaults to \"Sign in to ${siteName}\".

\n
\n\n
\n
\n \n \n

Number of digits (4-8)

\n
\n\n
\n \n \n

How long codes remain valid

\n
\n\n
\n \n \n

Max verification attempts

\n
\n\n
\n \n \n

Max requests per email per hour

\n
\n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

\n 👁️ Email Preview\n

\n

\n This is how the OTP email will appear to users. The site name \"${siteName}\" is configured in\n General Settings.\n

\n\n
\n
\n ${logoUrl ? `\"Logo\"` : ''}\n

Your Login Code

\n

Enter this code to sign in to ${siteName}

\n
\n\n
\n
\n
\n 123456\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${codeExpiryMinutes} minutes\n

\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${siteName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n
\n
\n\n \n
\n

🔢 Features

\n
    \n
  • ✓ Passwordless authentication
  • \n
  • ✓ Secure random code generation
  • \n
  • ✓ Rate limiting protection
  • \n
  • ✓ Brute force prevention
  • \n
  • ✓ Mobile-friendly UX
  • \n
\n
\n\n \n \n
\n\n \n `\n}\n\n/**\n * Email plugin settings content\n */\nfunction renderEmailSettingsContent(plugin: any, settings: PluginSettings): string {\n const apiKey = settings.apiKey || ''\n const fromEmail = settings.fromEmail || ''\n const fromName = settings.fromName || ''\n const replyTo = settings.replyTo || ''\n const logoUrl = settings.logoUrl || ''\n\n return `\n
\n \n
\n

Resend Configuration

\n\n
\n \n
\n \n \n

\n Get your API key from resend.com/api-keys\n

\n
\n\n \n
\n \n \n

Must be a verified domain in Resend

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n

Logo to display in email templates

\n
\n
\n
\n\n \n
\n

Send Test Email

\n
\n \n \n Send Test\n \n
\n
\n
\n\n \n
\n

📧 Email Templates Included

\n
    \n
  • ✓ Registration confirmation
  • \n
  • ✓ Email verification
  • \n
  • ✓ Password reset
  • \n
  • ✓ One-time code (2FA)
  • \n
\n

\n Templates are code-based and can be customized by editing the plugin files.\n

\n
\n
\n\n \n `\n}\n\n/**\n * Check if a plugin has a custom settings component\n */\nexport function hasCustomSettingsComponent(pluginId: string): boolean {\n return pluginId in pluginSettingsComponents\n}\n\n/**\n * Get the custom settings component for a plugin\n */\nexport function getCustomSettingsComponent(pluginId: string): PluginSettingsRenderer | undefined {\n return pluginSettingsComponents[pluginId]\n}","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderPluginsListPage, PluginsListPageData, Plugin } from '../templates/pages/admin-plugins-list.template'\nimport { renderPluginSettingsPage, PluginSettingsPageData } from '../templates/pages/admin-plugin-settings.template'\nimport { SettingsService } from '../services/settings'\nimport { PluginService } from '../services'\nimport { PLUGIN_REGISTRY, findPluginByCodeName } from '../plugins/manifest-registry'\nimport type { Bindings, Variables } from '../app'\n\nconst adminPluginRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminPluginRoutes.use('*', requireAuth())\n\n// Build available plugins list from the auto-generated registry.\n// To add a new plugin to this list, create a manifest.json in the plugin directory\n// and run: node packages/scripts/generate-plugin-registry.mjs\nconst AVAILABLE_PLUGINS = Object.values(PLUGIN_REGISTRY).map(p => ({\n id: p.id,\n name: p.codeName,\n display_name: p.displayName,\n description: p.description,\n version: p.version,\n author: p.author,\n category: p.category,\n icon: p.iconEmoji,\n permissions: p.permissions,\n dependencies: p.dependencies,\n is_core: p.is_core\n}))\n\n// Plugin list page\nadminPluginRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n // TODO: Fix permission system\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n\n const pluginService = new PluginService(db)\n\n // Get all installed plugins with error handling\n let installedPlugins: any[] = []\n let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 }\n\n try {\n installedPlugins = await pluginService.getAllPlugins()\n stats = await pluginService.getPluginStats()\n } catch (error) {\n console.error('Error loading plugins:', error)\n // Continue with empty data\n }\n\n // Get list of installed plugin IDs\n const installedPluginIds = new Set(installedPlugins.map(p => p.id))\n\n // Find uninstalled plugins\n const uninstalledPlugins = AVAILABLE_PLUGINS.filter(p => !installedPluginIds.has(p.id))\n\n // Map installed plugins to template format\n const templatePlugins: Plugin[] = installedPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: p.status,\n category: p.category,\n icon: p.icon,\n downloadCount: p.download_count,\n rating: p.rating,\n lastUpdated: formatLastUpdated(p.last_updated),\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Add uninstalled plugins to the list\n const uninstalledTemplatePlugins: Plugin[] = uninstalledPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: 'uninstalled' as const,\n category: p.category,\n icon: p.icon,\n downloadCount: 0,\n rating: 0,\n lastUpdated: 'Not installed',\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Combine installed and uninstalled plugins\n const allPlugins = [...templatePlugins, ...uninstalledTemplatePlugins]\n\n // Update stats with uninstalled count\n stats.uninstalled = uninstalledPlugins.length\n stats.total = installedPlugins.length + uninstalledPlugins.length\n\n const pageData: PluginsListPageData = {\n plugins: allPlugins,\n stats,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n },\n version: c.get('appVersion')\n }\n\n return c.html(renderPluginsListPage(pageData))\n } catch (error) {\n console.error('Error loading plugins page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Get plugin settings page\nadminPluginRoutes.get('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Check authorization first\n if (user?.role !== 'admin') {\n return c.redirect('/admin/plugins')\n }\n\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin(pluginId)\n\n if (!plugin) {\n return c.text('Plugin not found', 404)\n }\n\n // Get activity log\n const activity = await pluginService.getPluginActivity(pluginId, 20)\n\n // Load additional context for plugins with custom settings components\n let enrichedSettings = plugin.settings || {}\n\n // For OTP Login plugin, add site name and email config status\n if (pluginId === 'otp-login') {\n // Get site name from general settings via SettingsService\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName || 'SonicJS'\n\n // Check if email plugin is configured\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n let emailConfigured = false\n if (emailPlugin?.settings) {\n try {\n const emailSettings = JSON.parse(emailPlugin.settings)\n emailConfigured = !!(emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName)\n } catch (e) { /* ignore */ }\n }\n\n enrichedSettings = {\n ...enrichedSettings,\n siteName,\n _emailConfigured: emailConfigured\n }\n }\n\n // Map plugin data to template format\n const templatePlugin = {\n id: plugin.id,\n name: plugin.name,\n displayName: plugin.display_name,\n description: plugin.description,\n version: plugin.version,\n author: plugin.author,\n status: plugin.status,\n category: plugin.category,\n icon: plugin.icon,\n downloadCount: plugin.download_count,\n rating: plugin.rating,\n lastUpdated: formatLastUpdated(plugin.last_updated),\n dependencies: plugin.dependencies,\n permissions: plugin.permissions,\n isCore: plugin.is_core,\n settings: enrichedSettings\n }\n\n // Map activity data\n const templateActivity = (activity || []).map(item => ({\n id: item.id,\n action: item.action,\n message: item.message,\n timestamp: item.timestamp,\n user: item.user_email\n }))\n\n const pageData: PluginSettingsPageData = {\n plugin: templatePlugin,\n activity: templateActivity,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n }\n }\n\n return c.html(renderPluginSettingsPage(pageData))\n } catch (error) {\n console.error('Error getting plugin settings page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Activate plugin\nadminPluginRoutes.post('/:id/activate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.activatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error activating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to activate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Deactivate plugin\nadminPluginRoutes.post('/:id/deactivate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.deactivatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deactivating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to deactivate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Generic install handler - uses the auto-generated plugin registry.\n// No per-plugin switch/case needed. Adding a manifest.json is enough.\nadminPluginRoutes.post('/install', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const body = await c.req.json()\n const pluginService = new PluginService(db)\n\n // Look up plugin in registry by codeName (what the frontend sends as body.name)\n // or by id\n const registryEntry = findPluginByCodeName(body.name)\n || PLUGIN_REGISTRY[body.name]\n || PLUGIN_REGISTRY[body.id]\n\n if (!registryEntry) {\n return c.json({ error: 'Plugin not found in registry' }, 404)\n }\n\n const plugin = await pluginService.installPlugin({\n id: registryEntry.id,\n name: registryEntry.codeName,\n display_name: registryEntry.displayName,\n description: registryEntry.description,\n version: registryEntry.version,\n author: registryEntry.author,\n category: registryEntry.category,\n icon: registryEntry.iconEmoji,\n permissions: registryEntry.permissions,\n dependencies: registryEntry.dependencies,\n is_core: registryEntry.is_core,\n settings: registryEntry.defaultSettings,\n })\n\n return c.json({ success: true, plugin })\n } catch (error) {\n console.error('Error installing plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to install plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Uninstall plugin\nadminPluginRoutes.post('/:id/uninstall', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.uninstallPlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error uninstalling plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to uninstall plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Update plugin settings\nadminPluginRoutes.post('/:id/settings', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const settings = await c.req.json()\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings(pluginId, settings)\n\n // Clear auth validation cache if updating core-auth plugin\n if (pluginId === 'core-auth') {\n try {\n const cacheKv = c.env.CACHE_KV\n if (cacheKv) {\n await cacheKv.delete('auth:settings')\n await cacheKv.delete('auth:registration-enabled')\n console.log('[AuthSettings] Cache cleared after updating authentication settings')\n }\n } catch (cacheError) {\n console.error('[AuthSettings] Failed to clear cache:', cacheError)\n }\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating plugin settings:', error)\n const message = error instanceof Error ? error.message : 'Failed to update settings'\n return c.json({ error: message }, 400)\n }\n})\n\n// Helper function to format last updated time\nfunction formatLastUpdated(timestamp: number): string {\n const now = Date.now() / 1000\n const diff = now - timestamp\n\n if (diff < 60) return 'just now'\n if (diff < 3600) return `${Math.floor(diff / 60)} minutes ago`\n if (diff < 86400) return `${Math.floor(diff / 3600)} hours ago`\n if (diff < 604800) return `${Math.floor(diff / 86400)} days ago`\n if (diff < 2592000) return `${Math.floor(diff / 604800)} weeks ago`\n return `${Math.floor(diff / 2592000)} months ago`\n}\n\nexport { adminPluginRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogEntry {\n id: string\n level: string\n category: string\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags: string[]\n source?: string\n createdAt: Date\n formattedDate: string\n formattedDuration?: string\n levelClass: string\n categoryClass: string\n}\n\nexport interface LogsListPageData {\n logs: LogEntry[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n baseUrl: string\n }\n filters: {\n level: string\n category: string\n search: string\n startDate: string\n endDate: string\n source: string\n }\n user?: BaseUser\n}\n\nexport function renderLogsListPage(data: LogsListPageData) {\n const { logs, pagination, filters, user } = data\n\n const content = `\n
\n
\n
\n

System Logs

\n

\n Monitor and analyze system activity, errors, and performance metrics.\n

\n
\n
\n \n Configure\n \n \n Export\n \n
\n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n Apply Filters\n \n \n Clear\n \n
\n
\n\n
\n ${pagination.totalItems} ${pagination.totalItems === 1 ? 'entry' : 'entries'}\n
\n
\n
\n
\n
\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
\n Level\n \n Category\n \n Message\n \n Source\n \n Time\n \n Actions\n
\n \n ${log.level}\n \n \n \n ${log.category}\n \n \n
\n
${log.message}
\n ${log.url ? `
${log.method} ${log.url}
` : ''}\n ${log.duration ? `
${log.formattedDuration}
` : ''}\n
\n
\n ${log.source || '-'}\n \n ${log.formattedDate}\n \n \n View Details\n \n
\n
\n\n ${logs.length === 0 ? `\n
\n \n \n \n

No log entries

\n

No log entries found matching your criteria.

\n
\n ` : ''}\n
\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : `\n \n Previous\n \n `}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : `\n \n Next\n \n `}\n
\n
\n
\n

\n Showing ${pagination.startItem} to ${pagination.endItem} of{' '}\n ${pagination.totalItems} results\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'System Logs',\n pageTitle: 'System Logs',\n currentPath: '/admin/logs',\n user,\n content\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport { LogEntry } from './admin-logs-list.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogDetailsPageData {\n log: LogEntry\n user?: BaseUser\n}\n\nexport function renderLogDetailsPage(data: LogDetailsPageData) {\n const { log, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Details

\n

\n Detailed information for log entry ${log.id}\n

\n
\n
\n\n
\n
\n
\n

Log Entry Information

\n
\n \n ${log.level}\n \n \n ${log.category}\n \n
\n
\n
\n \n
\n
\n
\n
ID
\n
${log.id}
\n
\n \n
\n
Timestamp
\n
${log.formattedDate}
\n
\n \n
\n
Level
\n
\n \n ${log.level}\n \n
\n
\n \n
\n
Category
\n
\n \n ${log.category}\n \n
\n
\n \n ${log.source ? html`\n
\n
Source
\n
${log.source}
\n
\n ` : ''}\n \n ${log.userId ? html`\n
\n
User ID
\n
${log.userId}
\n
\n ` : ''}\n \n ${log.sessionId ? html`\n
\n
Session ID
\n
${log.sessionId}
\n
\n ` : ''}\n \n ${log.requestId ? html`\n
\n
Request ID
\n
${log.requestId}
\n
\n ` : ''}\n \n ${log.ipAddress ? html`\n
\n
IP Address
\n
${log.ipAddress}
\n
\n ` : ''}\n \n ${log.method && log.url ? html`\n
\n
HTTP Request
\n
\n ${log.method} ${log.url}\n ${log.statusCode ? html`(${log.statusCode})` : ''}\n
\n
\n ` : ''}\n \n ${log.duration ? html`\n
\n
Duration
\n
${log.formattedDuration}
\n
\n ` : ''}\n \n ${log.userAgent ? html`\n
\n
User Agent
\n
${log.userAgent}
\n
\n ` : ''}\n
\n
\n
\n\n \n
\n
\n

Message

\n
\n
\n
\n ${log.message}\n
\n
\n
\n\n \n ${log.tags && log.tags.length > 0 ? html`\n
\n
\n

Tags

\n
\n
\n
\n ${log.tags.map(tag => html`\n \n ${tag}\n \n `).join('')}\n
\n
\n
\n ` : ''}\n\n \n ${log.data ? html`\n
\n
\n

Additional Data

\n
\n
\n
${JSON.stringify(log.data, null, 2)}
\n
\n
\n ` : ''}\n\n \n ${log.stackTrace ? html`\n
\n
\n

Stack Trace

\n
\n
\n
${log.stackTrace}
\n
\n
\n ` : ''}\n\n \n
\n \n ← Back to Logs\n \n \n
\n ${log.level === 'error' || log.level === 'fatal' ? html`\n \n Report Issue\n \n ` : ''}\n \n alert('Log details copied to clipboard'))\"\n >\n Copy Details\n \n
\n
\n
\n `\n\n return adminLayoutV2({\n title: `Log Details - ${log.id}`,\n user,\n content: content as string\n })\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport type { LogConfig } from '../../db/schema'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogConfigPageData {\n configs: LogConfig[]\n user?: BaseUser\n}\n\nexport function renderLogConfigPage(data: LogConfigPageData) {\n const { configs, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Configuration

\n

\n Configure logging settings for different categories and manage log retention policies.\n

\n
\n
\n \n Run Cleanup\n \n
\n
\n\n
\n\n \n
\n
\n

Log Levels Reference

\n
\n
\n
\n
\n \n debug\n \n

Detailed diagnostic information

\n
\n
\n \n info\n \n

General information messages

\n
\n
\n \n warn\n \n

Warning conditions

\n
\n
\n \n error\n \n

Error conditions

\n
\n
\n \n fatal\n \n

Critical system errors

\n
\n
\n
\n
\n\n \n
\n ${configs.map(config => html`\n
\n
\n
\n

${config.category}

\n
\n ${config.enabled ? html`\n \n Enabled\n \n ` : html`\n \n Disabled\n \n `}\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n \n \n \n \n \n \n

Only logs at this level or higher will be stored

\n
\n \n
\n \n \n

Logs older than this will be deleted

\n
\n \n
\n \n \n

Maximum number of logs to keep for this category

\n
\n
\n \n
\n
\n \n Update Configuration\n \n
\n
\n \n
\n
\n
Created: ${new Date(config.createdAt).toLocaleDateString()}
\n
Updated: ${new Date(config.updatedAt).toLocaleDateString()}
\n
\n
\n
\n `).join('')}\n
\n\n \n
\n
\n

Global Log Settings

\n
\n
\n
\n
\n

Storage Information

\n
\n
\n
-
\n
Total Log Entries
\n
\n
\n
-
\n
Storage Used
\n
\n
\n
-
\n
Oldest Log
\n
\n
\n
\n \n
\n

Log Categories

\n
\n
    \n
  • auth - Authentication and authorization events
  • \n
  • api - API requests and responses
  • \n
  • workflow - Content workflow state changes
  • \n
  • plugin - Plugin-related activities
  • \n
  • media - File upload and media operations
  • \n
  • system - General system events
  • \n
  • security - Security-related events and alerts
  • \n
  • error - General error conditions
  • \n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n return adminLayoutV2({\n title: 'Log Configuration',\n user,\n content: content as string\n })\n}","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { D1Database, KVNamespace } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport { getLogger, type LogLevel, type LogCategory, type LogFilter } from '../services'\nimport { renderLogsListPage, type LogsListPageData } from '../templates/pages/admin-logs-list.template'\nimport { renderLogDetailsPage, type LogDetailsPageData } from '../templates/pages/admin-log-details.template'\nimport { renderLogConfigPage, type LogConfigPageData } from '../templates/pages/admin-log-config.template'\nimport type { Bindings, Variables } from '../app'\n\nconst adminLogsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminLogsRoutes.use('*', requireAuth())\n\n// Main logs listing page\nadminLogsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Use Hono's built-in query method instead of parsing URL\n const query = c.req.query()\n \n // Parse query parameters\n const page = parseInt(query.page || '1')\n const limit = parseInt(query.limit || '50')\n const level = query.level\n const category = query.category\n const search = query.search\n const startDate = query.start_date\n const endDate = query.end_date\n const source = query.source\n \n // Build filter\n const filter: LogFilter = {\n limit,\n offset: (page - 1) * limit,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (search) {\n filter.search = search\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n if (source) {\n filter.source = source\n }\n \n // Get logs and total count\n const { logs, total } = await logger.getLogs(filter)\n \n // Format logs for display\n const formattedLogs = logs.map(log => ({\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }))\n \n const totalPages = Math.ceil(total / limit)\n \n const pageData: LogsListPageData = {\n logs: formattedLogs,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total),\n baseUrl: '/admin/logs'\n },\n filters: {\n level: level || '',\n category: category || '',\n search: search || '',\n startDate: startDate || '',\n endDate: endDate || '',\n source: source || ''\n },\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogsListPage(pageData))\n } catch (error) {\n console.error('Error fetching logs:', error)\n return c.html(html`

Error loading logs: ${error}

`)\n }\n})\n\n// Log details page\nadminLogsRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get single log by ID\n const { logs } = await logger.getLogs({ \n limit: 1, \n offset: 0,\n search: id // Using search to find by ID - this is a simplification\n })\n \n const log = logs.find(l => l.id === id)\n \n if (!log) {\n return c.html(html`

Log entry not found

`)\n }\n \n const formattedLog = {\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n \n const pageData: LogDetailsPageData = {\n log: formattedLog,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogDetailsPage(pageData))\n } catch (error) {\n console.error('Error fetching log details:', error)\n return c.html(html`

Error loading log details: ${error}

`)\n }\n})\n\n// Log configuration page\nadminLogsRoutes.get('/config', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get all log configurations\n const configs = await logger.getAllConfigs()\n \n const pageData: LogConfigPageData = {\n configs,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogConfigPage(pageData))\n } catch (error) {\n console.error('Error fetching log config:', error)\n return c.html(html`

Error loading log configuration: ${error}

`)\n }\n})\n\n// Update log configuration\nadminLogsRoutes.post('/config/:category', async (c) => {\n try {\n const category = c.req.param('category') as LogCategory\n const formData = await c.req.formData()\n \n const enabled = formData.get('enabled') === 'on'\n const level = formData.get('level') as string\n const retention = parseInt(formData.get('retention') as string)\n const maxSize = parseInt(formData.get('max_size') as string)\n \n const logger = getLogger(c.env.DB)\n await logger.updateConfig(category, {\n enabled,\n level,\n retention,\n maxSize\n })\n \n return c.html(html`\n
\n Configuration updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating log config:', error)\n return c.html(html`\n
\n Failed to update configuration. Please try again.\n
\n `)\n }\n})\n\n// Export logs\nadminLogsRoutes.get('/export', async (c) => {\n try {\n const query = c.req.query()\n const format = query.format || 'csv'\n const level = query.level\n const category = query.category\n const startDate = query.start_date\n const endDate = query.end_date\n \n const logger = getLogger(c.env.DB)\n \n // Build filter for export\n const filter: LogFilter = {\n limit: 10000, // Export up to 10k logs\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n const { logs } = await logger.getLogs(filter)\n \n if (format === 'json') {\n return c.json(logs, 200, {\n 'Content-Disposition': 'attachment; filename=\"logs-export.json\"'\n })\n } else {\n // Default to CSV\n const headers = [\n 'ID', 'Level', 'Category', 'Message', 'Source', 'User ID', \n 'IP Address', 'Method', 'URL', 'Status Code', 'Duration', \n 'Created At'\n ]\n const csvRows = [headers.join(',')]\n \n logs.forEach(log => {\n const row = [\n log.id,\n log.level,\n log.category,\n `\"${log.message.replace(/\"/g, '\"\"')}\"`, // Escape quotes\n log.source || '',\n log.userId || '',\n log.ipAddress || '',\n log.method || '',\n log.url || '',\n log.statusCode || '',\n log.duration || '',\n new Date(log.createdAt).toISOString()\n ]\n csvRows.push(row.join(','))\n })\n \n const csv = csvRows.join('\\n')\n \n return new Response(csv, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': 'attachment; filename=\"logs-export.csv\"'\n }\n })\n }\n } catch (error) {\n console.error('Error exporting logs:', error)\n return c.json({ error: 'Failed to export logs' }, 500)\n }\n})\n\n// Clean up old logs\nadminLogsRoutes.post('/cleanup', async (c) => {\n try {\n const user = c.get('user')\n \n // Only allow admin users to run cleanup\n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n \n const logger = getLogger(c.env.DB)\n await logger.cleanupByRetention()\n \n return c.html(html`\n
\n Log cleanup completed successfully!\n
\n `)\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n return c.html(html`\n
\n Failed to clean up logs. Please try again.\n
\n `)\n }\n})\n\n// Search logs (HTMX endpoint)\nadminLogsRoutes.post('/search', async (c) => {\n try {\n const formData = await c.req.formData()\n const search = formData.get('search') as string\n const level = formData.get('level') as string\n const category = formData.get('category') as string\n \n const logger = getLogger(c.env.DB)\n \n const filter: LogFilter = {\n limit: 20,\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (search) filter.search = search\n if (level) filter.level = [level] as LogLevel[]\n if (category) filter.category = [category] as LogCategory[]\n \n const { logs } = await logger.getLogs(filter)\n \n // Return just the logs table rows for HTMX\n const rows = logs.map(log => {\n const formattedLog = {\n ...log,\n formattedDate: new Date(log.createdAt).toLocaleString(),\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n\n return `\n \n \n \n ${formattedLog.level}\n \n \n \n \n ${formattedLog.category}\n \n \n \n
${formattedLog.message}
\n \n ${formattedLog.source || '-'}\n ${formattedLog.formattedDate}\n \n View\n \n \n `\n }).join('')\n\n return c.html(rows)\n } catch (error) {\n console.error('Error searching logs:', error)\n return c.html(html`Error searching logs`)\n }\n})\n\n// Helper functions\nfunction getLevelClass(level: string): string {\n switch (level) {\n case 'debug': return 'bg-gray-100 text-gray-800'\n case 'info': return 'bg-blue-100 text-blue-800'\n case 'warn': return 'bg-yellow-100 text-yellow-800'\n case 'error': return 'bg-red-100 text-red-800'\n case 'fatal': return 'bg-purple-100 text-purple-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nfunction getCategoryClass(category: string): string {\n switch (category) {\n case 'auth': return 'bg-green-100 text-green-800'\n case 'api': return 'bg-blue-100 text-blue-800'\n case 'workflow': return 'bg-purple-100 text-purple-800'\n case 'plugin': return 'bg-indigo-100 text-indigo-800'\n case 'media': return 'bg-pink-100 text-pink-800'\n case 'system': return 'bg-gray-100 text-gray-800'\n case 'security': return 'bg-red-100 text-red-800'\n case 'error': return 'bg-red-100 text-red-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nexport { adminLogsRoutes }","import { Hono } from 'hono'\nimport { renderDesignPage, DesignPageData } from '../templates/pages/admin-design.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminDesignRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminDesignRoutes.get('/', (c) => {\n const user = c.get('user')\n \n const pageData: DesignPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderDesignPage(pageData))\n})","import { Hono } from 'hono'\nimport { renderCheckboxPage, CheckboxPageData } from '../templates/pages/admin-checkboxes.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminCheckboxRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCheckboxRoutes.get('/', (c) => {\n const user = c.get('user')\n\n const pageData: CheckboxPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderCheckboxPage(pageData))\n})\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface Testimonial {\n id?: number\n authorName: string\n authorTitle?: string\n authorCompany?: string\n testimonialText: string\n rating?: number\n isPublished: boolean\n sortOrder: number\n}\n\ninterface TestimonialsFormData {\n testimonial?: Testimonial\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderTestimonialsForm(data: TestimonialsFormData): string {\n const { testimonial, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Testimonial' : 'New Testimonial'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the testimonial details below' : 'Create a new customer testimonial'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Author Information

\n\n \n
\n \n
\n \n
\n ${errors?.authorName ? `\n
\n ${errors.authorName.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.authorTitle ? `\n
\n ${errors.authorTitle.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.authorCompany ? `\n
\n ${errors.authorCompany.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Testimonial

\n\n \n
\n \n
\n \n

\n 0/1000 characters\n

\n
\n ${errors?.testimonialText ? `\n
\n ${errors.testimonialText.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.rating ? `\n
\n ${errors.rating.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/testimonials/${testimonial?.id}` : '/admin/testimonials/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderTestimonialsList } from '../templates/pages/admin-testimonials-list.template'\nimport { renderTestimonialsForm } from '../templates/pages/admin-testimonials-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst testimonialSchema = z.object({\n authorName: z.string().min(1, 'Author name is required').max(100, 'Author name must be under 100 characters'),\n authorTitle: z.string().optional(),\n authorCompany: z.string().optional(),\n testimonialText: z.string().min(1, 'Testimonial is required').max(1000, 'Testimonial must be under 1000 characters'),\n rating: z.string().transform(val => val ? parseInt(val, 10) : undefined).pipe(z.number().min(1).max(5).optional()),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminTestimonialsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminTestimonialsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, minRating, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (minRating) {\n whereClause += ' AND rating >= ?'\n params.push(parseInt(minRating, 10))\n }\n\n if (search) {\n whereClause += ' AND (author_name LIKE ? OR testimonial_text LIKE ? OR author_company LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM testimonials ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM testimonials\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: testimonials } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderTestimonialsList({\n testimonials: testimonials || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonials:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonials',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminTestimonialsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial created successfully')\n } else {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating testimonial:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM testimonials WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/testimonials?message=Testimonial not found&type=error')\n }\n\n const testimonial = results[0] as any\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id: testimonial.id,\n authorName: testimonial.author_name,\n authorTitle: testimonial.author_title,\n authorCompany: testimonial.author_company,\n testimonialText: testimonial.testimonial_text,\n rating: testimonial.rating,\n isPublished: Boolean(testimonial.isPublished),\n sortOrder: testimonial.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonial:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE testimonials\n SET author_name = ?, author_title = ?, author_company = ?, testimonial_text = ?, rating = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial updated successfully')\n } else {\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: validatedData.authorName,\n authorTitle: validatedData.authorTitle,\n authorCompany: validatedData.authorCompany,\n testimonialText: validatedData.testimonialText,\n rating: validatedData.rating,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Testimonial not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating testimonial:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM testimonials WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Testimonial not found' }, 404)\n }\n\n return c.redirect('/admin/testimonials?message=Testimonial deleted successfully')\n } catch (error) {\n console.error('Error deleting testimonial:', error)\n return c.json({ error: 'Failed to delete testimonial' }, 500)\n }\n})\n\nexport default adminTestimonialsRoutes\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface CodeExample {\n id?: number\n title: string\n description?: string\n code: string\n language: string\n category?: string\n tags?: string\n isPublished: boolean\n sortOrder: number\n}\n\ninterface CodeExamplesFormData {\n codeExample?: CodeExample\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderCodeExamplesForm(data: CodeExamplesFormData): string {\n const { codeExample, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Code Example' : 'New Code Example'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the code example details below' : 'Create a new code snippet or example'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Basic Information

\n\n \n
\n \n
\n \n
\n ${errors?.title ? `\n
\n ${errors.title.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

\n 0/500 characters\n

\n
\n ${errors?.description ? `\n
\n ${errors.description.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.language ? `\n
\n ${errors.language.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.category ? `\n
\n ${errors.category.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

Comma-separated tags

\n
\n ${errors?.tags ? `\n
\n ${errors.tags.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Code

\n\n \n
\n \n
\n \n

\n 0 characters\n

\n
\n ${errors?.code ? `\n
\n ${errors.code.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/code-examples/${codeExample?.id}` : '/admin/code-examples/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderCodeExamplesList } from '../templates/pages/admin-code-examples-list.template'\nimport { renderCodeExamplesForm } from '../templates/pages/admin-code-examples-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst codeExampleSchema = z.object({\n title: z.string().min(1, 'Title is required').max(200, 'Title must be under 200 characters'),\n description: z.string().max(500, 'Description must be under 500 characters').optional(),\n code: z.string().min(1, 'Code is required'),\n language: z.string().min(1, 'Language is required'),\n category: z.string().max(50, 'Category must be under 50 characters').optional(),\n tags: z.string().max(200, 'Tags must be under 200 characters').optional(),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminCodeExamplesRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCodeExamplesRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, language, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (language) {\n whereClause += ' AND language = ?'\n params.push(language)\n }\n\n if (search) {\n whereClause += ' AND (title LIKE ? OR description LIKE ? OR code LIKE ? OR tags LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM code_examples ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM code_examples\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: codeExamples } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderCodeExamplesList({\n codeExamples: codeExamples || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code examples:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code examples',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminCodeExamplesRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example created successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating code example:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM code_examples WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/code-examples?message=Code example not found&type=error')\n }\n\n const example = results[0] as any\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id: example.id,\n title: example.title,\n description: example.description,\n code: example.code,\n language: example.language,\n category: example.category,\n tags: example.tags,\n isPublished: Boolean(example.isPublished),\n sortOrder: example.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code example:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE code_examples\n SET title = ?, description = ?, code = ?, language = ?, category = ?, tags = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example updated successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: validatedData.title,\n description: validatedData.description,\n code: validatedData.code,\n language: validatedData.language,\n category: validatedData.category,\n tags: validatedData.tags,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Code example not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating code example:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM code_examples WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Code example not found' }, 404)\n }\n\n return c.redirect('/admin/code-examples?message=Code example deleted successfully')\n } catch (error) {\n console.error('Error deleting code example:', error)\n return c.json({ error: 'Failed to delete code example' }, 500)\n }\n})\n\nexport default adminCodeExamplesRoutes\n","import {\n AdminLayoutData,\n renderAdminLayout,\n} from \"../layouts/admin-layout-v2.template\";\n\nexport interface DashboardStats {\n collections: number;\n contentItems: number;\n mediaFiles: number;\n users: number;\n databaseSize?: number; // Size in bytes\n mediaSize?: number; // Total size of all media files in bytes\n recentActivity?: ActivityItem[];\n analytics?: AnalyticsData;\n}\n\nexport interface ActivityItem {\n id: string;\n type: \"content\" | \"media\" | \"user\" | \"collection\";\n action: string;\n description: string;\n timestamp: string;\n user: string;\n}\n\nexport interface AnalyticsData {\n pageViews: number;\n uniqueVisitors: number;\n contentPublished: number;\n mediaUploaded: number;\n weeklyGrowth: {\n pageViews: number;\n visitors: number;\n content: number;\n media: number;\n };\n}\n\nexport interface DashboardPageData {\n user?: {\n name: string;\n email: string;\n role: string;\n };\n stats?: DashboardStats;\n version?: string;\n enableExperimentalFeatures?: boolean;\n}\n\nexport function renderDashboardPage(data: DashboardPageData): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n \n \n ${renderStatsCardsSkeleton()}\n \n\n \n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n \n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderDashboardPageWithDynamicMenu(\n data: DashboardPageData,\n dynamicMenuItems: Array<{ label: string; path: string; icon: string }>\n): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n
\n ${renderStatsCards({\n collections: 0,\n contentItems: 0,\n mediaFiles: 0,\n users: 0,\n })}\n
\n\n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n enableExperimentalFeatures: data.enableExperimentalFeatures,\n content: pageContent,\n dynamicMenuItems,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderStatsCards(stats: DashboardStats): string {\n const cards = [\n {\n title: \"Total Collections\",\n value: stats.collections.toString(),\n change: \"12.5\",\n isPositive: true,\n },\n {\n title: \"Content Items\",\n value: stats.contentItems.toString(),\n change: \"8.2\",\n isPositive: true,\n },\n {\n title: \"Media Files\",\n value: stats.mediaFiles.toString(),\n change: \"15.3\",\n isPositive: true,\n },\n {\n title: \"Active Users\",\n value: stats.users.toString(),\n change: \"2.4\",\n isPositive: false,\n },\n ];\n\n const cardColors = ['text-cyan-400', 'text-lime-400', 'text-pink-400', 'text-purple-400'];\n\n return `\n
\n

Last 30 days

\n
\n ${cards.map((card, index) => `\n
\n
${card.title}
\n
\n
\n ${card.value}\n
\n
\n \n ${card.isPositive\n ? ''\n : ''\n }\n \n ${card.isPositive ? 'Increased' : 'Decreased'} by\n ${card.change}%\n
\n
\n
\n `).join('')}\n
\n
\n `;\n}\n\nfunction renderStatsCardsSkeleton(): string {\n return `\n
\n
\n
\n ${Array(4)\n .fill(0)\n .map(\n () => `\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n `;\n}\n\nfunction renderAnalyticsChart(): string {\n return `\n
\n
\n
\n
\n

Real-Time Analytics

\n

Requests per second (live)

\n
\n
\n
\n Live\n
\n
\n
\n 0\n req/s\n
\n
\n\n
\n \n
\n\n \n
\n \n\n \n `;\n}\n\nexport function renderRecentActivitySkeleton(): string {\n return `\n
\n
\n
\n
\n
\n
\n ${Array(3).fill(0).map(() => `\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n}\n\nexport function renderRecentActivity(activities?: ActivityItem[]): string {\n // Helper to get user initials\n const getInitials = (user: string): string => {\n const parts = user.split(' ').filter(p => p.length > 0)\n if (parts.length >= 2) {\n const first = parts[0]?.[0] || ''\n const second = parts[1]?.[0] || ''\n return (first + second).toUpperCase()\n }\n return user.substring(0, 2).toUpperCase()\n }\n\n // Helper to get relative time\n const getRelativeTime = (timestamp: string): string => {\n const date = new Date(timestamp)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) return 'just now'\n if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`\n return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`\n }\n\n // Helper to get color classes based on activity type\n const getColorClasses = (type: string): { bgColor: string; textColor: string } => {\n switch (type) {\n case 'content':\n return {\n bgColor: 'bg-lime-500/10 dark:bg-lime-400/10',\n textColor: 'text-lime-700 dark:text-lime-300'\n }\n case 'media':\n return {\n bgColor: 'bg-cyan-500/10 dark:bg-cyan-400/10',\n textColor: 'text-cyan-700 dark:text-cyan-300'\n }\n case 'user':\n return {\n bgColor: 'bg-pink-500/10 dark:bg-pink-400/10',\n textColor: 'text-pink-700 dark:text-pink-300'\n }\n case 'collection':\n return {\n bgColor: 'bg-purple-500/10 dark:bg-purple-400/10',\n textColor: 'text-purple-700 dark:text-purple-300'\n }\n default:\n return {\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300'\n }\n }\n }\n\n // Format activities with colors and times\n const formattedActivities = (activities || []).map(activity => {\n const colors = getColorClasses(activity.type)\n return {\n ...activity,\n initials: getInitials(activity.user),\n time: getRelativeTime(activity.timestamp),\n ...colors\n }\n })\n\n // If no activities, show empty state\n if (formattedActivities.length === 0) {\n formattedActivities.push({\n type: 'content' as const,\n description: 'No recent activity',\n user: 'System',\n time: '',\n initials: 'SY',\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300',\n id: '0',\n action: '',\n timestamp: new Date().toISOString()\n })\n }\n\n return `\n
\n
\n
\n

Recent Activity

\n \n
\n
\n\n
\n
    \n ${formattedActivities\n .map(\n (activity) => `\n
  • \n
    \n ${activity.initials}\n
    \n
    \n

    ${activity.description}

    \n

    \n ${activity.user}\n · \n ${activity.time}\n

    \n
    \n
  • \n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderQuickActions(): string {\n const actions = [\n {\n title: \"Create Content\",\n description: \"Add new blog post or page\",\n href: \"/admin/content/new\",\n icon: `\n \n `,\n },\n {\n title: \"Upload Media\",\n description: \"Add images and files\",\n href: \"/admin/media\",\n icon: `\n \n `,\n },\n {\n title: \"Manage Users\",\n description: \"Add or edit user accounts\",\n href: \"/admin/users\",\n icon: `\n \n `,\n },\n ];\n\n return `\n
\n
\n

Quick Actions

\n
\n\n
\n
\n ${actions\n .map(\n (action) => `\n \n
\n ${action.icon}\n
\n
\n

${action.title}

\n

${action.description}

\n
\n \n \n \n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderSystemStatus(): string {\n return `\n
\n
\n
\n

System Status

\n
\n
\n Live\n
\n
\n
\n\n \n \n
\n ${[\n { color: 'from-blue-500/20 to-cyan-500/20', darkColor: 'dark:from-blue-500/10 dark:to-cyan-500/10' },\n { color: 'from-purple-500/20 to-pink-500/20', darkColor: 'dark:from-purple-500/10 dark:to-pink-500/10' },\n { color: 'from-amber-500/20 to-orange-500/20', darkColor: 'dark:from-amber-500/10 dark:to-orange-500/10' },\n { color: 'from-lime-500/20 to-emerald-500/20', darkColor: 'dark:from-lime-500/10 dark:to-emerald-500/10' }\n ].map((gradient, i) => `\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n \n\n \n `;\n}\n\nexport function renderStorageUsage(databaseSizeBytes?: number, mediaSizeBytes?: number): string {\n // Helper to format bytes to human readable\n const formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`\n }\n\n const dbSizeGB = databaseSizeBytes ? databaseSizeBytes / (1024 ** 3) : 0\n const dbMaxGB = 10\n const dbPercentageRaw = (dbSizeGB / dbMaxGB) * 100\n // Ensure minimum 0.5% visibility for progress bar, max 100%\n const dbPercentage = Math.min(Math.max(dbPercentageRaw, 0.5), 100)\n const dbUsedFormatted = databaseSizeBytes ? formatBytes(databaseSizeBytes) : 'Unknown'\n\n const mediaUsedFormatted = mediaSizeBytes ? formatBytes(mediaSizeBytes) : '0 B'\n\n const storageItems = [\n {\n label: \"Database\",\n used: dbUsedFormatted,\n total: \"10 GB\",\n percentage: dbPercentage,\n color: dbPercentage > 80 ? \"bg-red-500 dark:bg-red-400\" : dbPercentage > 60 ? \"bg-amber-500 dark:bg-amber-400\" : \"bg-cyan-500 dark:bg-cyan-400\",\n },\n {\n label: \"Media Files\",\n used: mediaUsedFormatted,\n total: \"∞\",\n percentage: 0,\n color: \"bg-lime-500 dark:bg-lime-400\",\n note: \"Stored in R2\"\n },\n {\n label: \"Cache (KV)\",\n used: \"N/A\",\n total: \"∞\",\n percentage: 0,\n color: \"bg-purple-500 dark:bg-purple-400\",\n note: \"Unlimited\"\n },\n ];\n\n return `\n
\n
\n

Storage Usage

\n
\n\n
\n
\n ${storageItems\n .map(\n (item: any) => `\n
\n
\n
\n ${item.label}\n ${item.note ? `(${item.note})` : ''}\n
\n
${item.used} / ${item.total}
\n
\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}","import { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderDashboardPage,\n type DashboardPageData,\n renderStatsCards,\n renderStorageUsage,\n renderRecentActivity,\n type ActivityItem\n} from '../templates/pages/admin-dashboard.template'\nimport { getCoreVersion } from '../utils/version'\nimport { metricsTracker } from '../utils/metrics'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin - Admin Dashboard\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: DashboardPageData = {\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n } catch (error) {\n console.error('Dashboard error:', error)\n\n // Return dashboard with error state\n const pageData: DashboardPageData = {\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n }\n})\n\n/**\n * GET /admin/dashboard/stats - Dashboard stats HTML fragment (HTMX endpoint)\n */\nrouter.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n const html = renderStatsCards({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n users: usersCount,\n mediaSize: mediaSize\n })\n\n return c.html(html)\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.html('
Failed to load statistics
')\n }\n})\n\n/**\n * GET /admin/dashboard/storage - Storage usage HTML fragment (HTMX endpoint)\n */\nrouter.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n const html = renderStorageUsage(databaseSize, mediaSize)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.html('
Failed to load storage information
')\n }\n})\n\n/**\n * GET /admin/dashboard/recent-activity - Recent activity HTML fragment (HTMX endpoint)\n */\nrouter.get('/recent-activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '5')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const activities: ActivityItem[] = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n // Format description based on action and resource type\n let description = ''\n if (row.action === 'create') {\n description = `Created new ${row.resource_type}`\n } else if (row.action === 'update') {\n description = `Updated ${row.resource_type}`\n } else if (row.action === 'delete') {\n description = `Deleted ${row.resource_type}`\n } else {\n description = `${row.action} ${row.resource_type}`\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n description,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n const html = renderRecentActivity(activities)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n const html = renderRecentActivity([])\n return c.html(html)\n }\n})\n\n/**\n * GET /admin/api/metrics - Real-time metrics for analytics chart\n * Returns JSON with current requests per second from the metrics tracker\n */\nrouter.get('/api/metrics', async (c) => {\n return c.json({\n requestsPerSecond: metricsTracker.getRequestsPerSecond(),\n totalRequests: metricsTracker.getTotalRequests(),\n averageRPS: Number(metricsTracker.getAverageRPS().toFixed(2)),\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/dashboard/system-status - System status HTML fragment (HTMX endpoint)\n */\nrouter.get('/system-status', async (c) => {\n try {\n const html = `\n
\n
\n
\n
\n
\n API Status\n \n \n \n
\n

Operational

\n
\n
\n\n
\n
\n
\n
\n Database\n \n \n \n
\n

Connected

\n
\n
\n\n
\n
\n
\n
\n R2 Storage\n \n \n \n
\n

Available

\n
\n
\n\n
\n
\n
\n
\n KV Cache\n \n \n \n
\n

Ready

\n
\n
\n
\n `\n return c.html(html)\n } catch (error) {\n console.error('Error fetching system status:', error)\n return c.html('
Failed to load system status
')\n }\n})\n\nexport { router as adminDashboardRoutes }\n","export function isMarkdownEditorType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nexport function normalizeFieldType(fieldType: string): string {\n if (isMarkdownEditorType(fieldType)) {\n return 'markdown'\n }\n\n if (fieldType === 'tinymce') {\n return 'richtext'\n }\n\n return fieldType\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\nexport interface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCollectionsListPage(data: CollectionsListPageData): string {\n const tableData: any = {\n tableId: 'collections-table',\n rowClickable: true,\n rowClickUrl: (collection: Collection) => `/admin/collections/${collection.id}`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => `\n
\n \n ${collection.name}\n \n ${collection.managed ? `\n \n \n \n \n Config\n \n ` : ''}\n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'description',\n label: 'Description',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => collection.description || '-'\n },\n {\n key: 'field_count',\n label: 'Fields',\n sortable: true,\n sortType: 'number',\n render: (_value: any, collection: any) => {\n const count = collection.field_count || 0\n return `\n
\n \n ${count} ${count === 1 ? 'field' : 'fields'}\n \n
\n `\n }\n },\n {\n key: 'managed',\n label: 'Source',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => {\n if (collection.managed) {\n return `\n
\n \n \n \n Code\n
\n `\n } else {\n return `\n
\n \n \n \n \n \n Database\n
\n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Content',\n sortable: false,\n render: (_value: any, collection: any) => {\n if (!collection || !collection.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.collections,\n emptyMessage: 'No collections found.'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Collections

\n

Manage your content collections and their schemas

\n
\n \n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n ${data.collections.length} ${data.collections.length === 1 ? 'collection' : 'collections'}\n \n \n \n \n Refresh\n \n
\n
\n
\n
\n
\n\n \n
\n ${renderTable(tableData)}\n
\n\n \n ${data.collections.length === 0 ? `\n
\n \n \n \n

No collections found

\n

Get started by creating your first collection

\n \n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Collections',\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","export interface TableColumn {\n key: string\n label: string\n sortable?: boolean\n className?: string\n sortType?: 'string' | 'number' | 'date' | 'boolean'\n render?: (value: any, row: any) => string\n}\n\nexport interface TableData {\n columns: TableColumn[]\n rows: T[]\n selectable?: boolean\n className?: string\n emptyMessage?: string\n tableId?: string\n title?: string\n rowClickable?: boolean\n rowClickUrl?: (row: T) => string\n}\n\nexport function renderTable(data: TableData): string {\n const tableId = data.tableId || `table-${Math.random().toString(36).substr(2, 9)}`\n\n if (data.rows.length === 0) {\n return `\n
\n
\n \n \n \n

${data.emptyMessage || 'No data available'}

\n
\n
\n `\n }\n\n return `\n
\n ${data.title ? `\n
\n

${data.title}

\n
\n ` : ''}\n
\n \n \n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, index) => {\n const isFirst = index === 0 && !data.selectable\n const isLast = index === data.columns.length - 1\n return `\n \n `}).join('')}\n \n \n \n ${data.rows.map((row, rowIndex) => {\n if (!row) return ''\n const clickableClass = data.rowClickable ? 'cursor-pointer' : ''\n const clickHandler = data.rowClickable && data.rowClickUrl ? `onclick=\"window.location.href='${data.rowClickUrl(row)}'\"` : ''\n return `\n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, colIndex) => {\n const value = (row as any)[column.key]\n const displayValue = column.render ? column.render(value, row) : value\n const stopPropagation = column.key === 'actions' ? 'onclick=\"event.stopPropagation()\"' : ''\n const isFirst = colIndex === 0 && !data.selectable\n const isLast = colIndex === data.columns.length - 1\n return `\n \n `\n }).join('')}\n \n `\n }).join('')}\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${column.sortable ? `\n \n ${column.label}\n
\n \n \n \n \n \n \n
\n \n ` : column.label}\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${displayValue || ''}\n
\n
\n\n \n
\n `\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm, FormData, FormField } from '../form.template'\nimport { renderAlert } from '../components/alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\n// Helper function to get field type badge with color\nfunction getFieldTypeBadge(fieldType: string): string {\n const typeLabels: Record = {\n 'text': 'Text',\n 'slug': 'URL Slug',\n 'richtext': 'Rich Text (TinyMCE)',\n 'quill': 'Rich Text (Quill)',\n 'markdown': 'Markdown',\n 'mdxeditor': 'Markdown',\n 'easymde': 'Markdown',\n 'number': 'Number',\n 'boolean': 'Boolean',\n 'date': 'Date',\n 'select': 'Select',\n 'media': 'Media',\n 'reference': 'Reference'\n }\n const typeColors: Record = {\n 'text': 'bg-blue-500/10 dark:bg-blue-400/10 text-blue-700 dark:text-blue-300 ring-blue-500/20 dark:ring-blue-400/20',\n 'slug': 'bg-sky-500/10 dark:bg-sky-400/10 text-sky-700 dark:text-sky-300 ring-sky-500/20 dark:ring-sky-400/20',\n 'richtext': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'quill': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'markdown': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'mdxeditor': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'easymde': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'number': 'bg-green-500/10 dark:bg-green-400/10 text-green-700 dark:text-green-300 ring-green-500/20 dark:ring-green-400/20',\n 'boolean': 'bg-amber-500/10 dark:bg-amber-400/10 text-amber-700 dark:text-amber-300 ring-amber-500/20 dark:ring-amber-400/20',\n 'date': 'bg-cyan-500/10 dark:bg-cyan-400/10 text-cyan-700 dark:text-cyan-300 ring-cyan-500/20 dark:ring-cyan-400/20',\n 'select': 'bg-indigo-500/10 dark:bg-indigo-400/10 text-indigo-700 dark:text-indigo-300 ring-indigo-500/20 dark:ring-indigo-400/20',\n 'media': 'bg-rose-500/10 dark:bg-rose-400/10 text-rose-700 dark:text-rose-300 ring-rose-500/20 dark:ring-rose-400/20',\n 'reference': 'bg-teal-500/10 dark:bg-teal-400/10 text-teal-700 dark:text-teal-300 ring-teal-500/20 dark:ring-teal-400/20'\n }\n const label = typeLabels[fieldType] || fieldType\n const color = typeColors[fieldType] || 'bg-zinc-500/10 dark:bg-zinc-400/10 text-zinc-700 dark:text-zinc-300 ring-zinc-500/20 dark:ring-zinc-400/20'\n return `${label}`\n}\n\nexport function renderCollectionFormPage(data: CollectionFormData): string {\n console.log('[renderCollectionFormPage] editorPlugins:', data.editorPlugins)\n\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? 'Edit Collection' : 'Create New Collection'\n const subtitle = isEdit\n ? `Update collection: ${data.display_name}`\n : 'Define a new content collection with custom fields and settings.'\n\n // Pre-compute data attribute for all fields (without badge HTML to avoid escaping issues)\n const fieldsWithData = (data.fields || []).map(field => ({\n ...field,\n dataFieldJSON: JSON.stringify(JSON.stringify(field))\n }))\n\n const fields: FormField[] = [\n {\n name: 'displayName',\n label: 'Display Name',\n type: 'text',\n value: data.display_name || '',\n placeholder: 'Blog Posts',\n required: true,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'name',\n label: 'Collection Name',\n type: 'text',\n value: data.name || '',\n placeholder: 'blog_posts',\n required: true,\n readonly: isEdit,\n helpText: isEdit ? 'Collection name cannot be changed' : 'Lowercase letters, numbers, and underscores only',\n className: isEdit ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'description',\n label: 'Description',\n type: 'textarea',\n value: data.description || '',\n placeholder: 'Description of this collection...',\n rows: 3,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n }\n ]\n\n\n const formData: FormData = {\n id: 'collection-form',\n ...(isEdit\n ? { hxPut: `/admin/collections/${data.id}`, action: `/admin/collections/${data.id}`, method: 'PUT' }\n : { hxPost: '/admin/collections', action: '/admin/collections' }\n ),\n hxTarget: '#form-messages',\n fields: fields,\n submitButtons: data.managed ? [] : [\n {\n label: isEdit ? 'Update Collection' : 'Create Collection',\n type: 'submit',\n className: 'btn-primary'\n }\n ]\n }\n\n const pageContent = `\n
\n \n ${data.managed ? `\n
\n
\n \n \n \n
\n

\n Config-Managed Collection\n

\n
\n

This collection is managed by a configuration file and cannot be edited through the admin interface.

\n

\n Config file:\n \n src/collections/${data.name}.collection.ts\n \n

\n

\n To modify this collection's schema, edit the configuration file directly in your code editor.\n

\n
\n
\n
\n
\n ` : ''}\n\n \n
\n
\n

${title}

\n

${subtitle}

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

Collection Details

\n

Configure your collection settings below

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n \n \n ${renderForm(formData)}\n\n ${isEdit && data.managed ? `\n \n
\n
\n

Collection Fields

\n

Fields defined in the configuration file (read-only)

\n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n ${field.field_name}\n
\n
\n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add fields to your collection configuration file to see them here.

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${isEdit && !data.managed ? `\n \n
\n
\n
\n

Collection Fields

\n

Define the fields that content in this collection will have

\n
\n \n \n \n \n Add Field\n \n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n Field name: ${field.field_name}\n
\n
\n
\n
\n \n \n \n \n Edit\n \n \n \n \n \n Delete\n \n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add your first field to get started

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${!isEdit ? `\n
\n
\n \n \n \n
\n

\n Create Collection First\n

\n

\n After creating the collection, you'll be able to add and configure custom fields.\n

\n
\n
\n
\n ` : ''}\n \n \n
\n \n \n \n \n ${data.managed ? 'Back to Collections' : 'Cancel'}\n \n\n ${isEdit && !data.managed ? `\n \n \n \n \n Delete Collection\n \n ` : ''}\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Add Field

\n \n
\n
\n\n
\n \n\n
\n \n \n

Lowercase letters, numbers, and underscores only

\n
\n\n
\n \n
\n \n \n \n \n ${data.editorPlugins?.tinymce ? '' : ''}\n ${data.editorPlugins?.quill ? '' : ''}\n ${data.editorPlugins?.easyMdx ? '' : ''}\n \n \n \n \n \n \n \n \n \n \n \n
\n

\n
\n\n
\n \n \n
\n\n
\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n\n
\n \n \n

JSON configuration for field-specific options

\n
\n\n
\n \n Cancel\n \n \n Add Field\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-field-confirm',\n title: 'Delete Field',\n message: 'Are you sure you want to delete this field? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteField()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { normalizeFieldType } from './admin-collections-field-types'\nimport { renderCollectionsListPage } from '../templates/pages/admin-collections-list.template'\nimport { renderCollectionFormPage } from '../templates/pages/admin-collections-form.template'\n\n// Type definitions for collections\ninterface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\ninterface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\ninterface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\ninterface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminCollectionsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminCollectionsRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on collection modification routes\nadminCollectionsRoutes.post('*', requireRole(['admin']))\nadminCollectionsRoutes.put('*', requireRole(['admin']))\nadminCollectionsRoutes.delete('*', requireRole(['admin']))\n\n// Collections management - List all collections\nadminCollectionsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n const search = url.searchParams.get('search') || ''\n\n // Build query based on search\n let stmt\n let results\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, managed, schema\n FROM collections\n WHERE is_active = 1\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(\"SELECT id, name, display_name, description, created_at, managed, schema FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY created_at DESC\")\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Fetch field counts for all collections from content_fields table (legacy)\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections: Collection[] = (results || [])\n .filter((row: any) => row && row.id)\n .map((row: any) => {\n // Calculate field count: use schema if available, otherwise use content_fields table\n let fieldCount = 0\n if (row.schema) {\n try {\n const schema = typeof row.schema === 'string' ? JSON.parse(row.schema) : row.schema\n if (schema && schema.properties) {\n fieldCount = Object.keys(schema.properties).length\n }\n } catch (e) {\n // If schema parsing fails, fall back to content_fields count\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n } else {\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n\n return {\n id: String(row.id || ''),\n name: String(row.name || ''),\n display_name: String(row.display_name || ''),\n description: row.description ? String(row.description) : undefined,\n created_at: Number(row.created_at || 0),\n formattedDate: row.created_at ? new Date(Number(row.created_at)).toLocaleDateString() : 'Unknown',\n field_count: fieldCount,\n managed: row.managed === 1\n }\n })\n\n const pageData: CollectionsListPageData = {\n collections,\n search,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCollectionsListPage(pageData))\n } catch (error) {\n console.error('Error fetching collections:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.html(html`

Error loading collections: ${errorMessage}

`)\n }\n})\n\n// New collection form\nadminCollectionsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /new] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n})\n\n// Create collection\nadminCollectionsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const name = formData.get('name') as string\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n // Check if this is an HTMX request\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n // Basic validation\n if (!name || !displayName) {\n const errorMsg = 'Name and display name are required.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n // For regular form submission, redirect back with error\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Validate name format\n if (!/^[a-z0-9_]+$/.test(name)) {\n const errorMsg = 'Collection name must contain only lowercase letters, numbers, and underscores.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n const db = c.env.DB\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(name).first()\n\n if (existing) {\n const errorMsg = 'A collection with this name already exists.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Create basic schema for the collection\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n // Create collection\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n name,\n displayName,\n description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache (only if CACHE_KV is available)\n if (c.env.CACHE_KV) {\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n }\n\n if (isHtmx) {\n return c.html(html`\n
\n Collection created successfully! Redirecting to edit mode...\n \n
\n `)\n } else {\n // For regular form submission, redirect to edit page\n return c.redirect(`/admin/collections/${collectionId}`)\n }\n } catch (error) {\n console.error('Error creating collection:', error)\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n if (isHtmx) {\n return c.html(html`\n
\n Failed to create collection. Please try again.\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n})\n\n// Edit collection form\nadminCollectionsRoutes.get('/:id', async (c) => {\n const db = c.env.DB\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n\n // Get collection fields - try schema first, then content_fields table\n let fields: CollectionField[] = []\n\n // If collection has a schema, parse it\n if (collection.schema) {\n try {\n const schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n fields = Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n // Normalize schema formats to UI field types\n let fieldType = fieldConfig.type || 'string'\n if (fieldConfig.enum) {\n fieldType = 'select'\n } else if (fieldConfig.format === 'richtext') {\n fieldType = 'richtext'\n } else if (fieldConfig.format === 'media') {\n fieldType = 'media'\n } else if (fieldConfig.format === 'date-time') {\n fieldType = 'date'\n } else if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n fieldType = 'slug'\n }\n \n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: fieldType,\n field_label: fieldConfig.title || fieldName,\n field_options: fieldConfig,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: fieldConfig.searchable === true || false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table if no schema or parsing failed\n if (fields.length === 0) {\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n fields = (fieldsResults || []).map((row: any) => {\n let fieldOptions = {}\n if (row.field_options) {\n try {\n fieldOptions = typeof row.field_options === 'string' ? JSON.parse(row.field_options) : row.field_options\n } catch (e) {\n console.error('Error parsing field_options for field:', row.field_name, e)\n fieldOptions = {}\n }\n }\n return {\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: fieldOptions,\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }\n })\n }\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /:id] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n fields: fields,\n managed: collection.managed === 1,\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n } catch (error) {\n console.error('Error fetching collection:', error)\n const user = c.get('user')\n\n // Check which editor plugins are active (even in error state)\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Failed to load collection.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n})\n\n// Update collection\nadminCollectionsRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const formData = await c.req.formData()\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n if (!displayName) {\n return c.html(html`\n
\n Display name is required.\n
\n `)\n }\n\n const db = c.env.DB\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(displayName, description || null, Date.now(), id).run()\n\n return c.html(html`\n
\n Collection updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.html(html`\n
\n Failed to update collection. Please try again.\n
\n `)\n }\n})\n\n// Delete collection\nadminCollectionsRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.html(html`\n
\n Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.\n
\n `)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.html(html`\n
\n Failed to delete collection. Please try again.\n
\n `)\n }\n})\n\n// Add field to collection\nadminCollectionsRoutes.post('/:id/fields', async (c) => {\n try {\n const collectionId = c.req.param('id')\n const formData = await c.req.formData()\n const fieldName = formData.get('field_name') as string\n const fieldType = formData.get('field_type') as string\n const fieldLabel = formData.get('field_label') as string\n const isRequired = formData.get('is_required') === '1'\n const isSearchable = formData.get('is_searchable') === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n if (!fieldName || !fieldType || !fieldLabel) {\n return c.json({ success: false, error: 'Field name, type, and label are required.' })\n }\n\n // Validate field name format\n if (!/^[a-z0-9_]+$/.test(fieldName)) {\n return c.json({ success: false, error: 'Field name must contain only lowercase letters, numbers, and underscores.' })\n }\n\n const db = c.env.DB\n\n // Get current collection to check its schema\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Check if field already exists in schema\n let schema = collection.schema ? (typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema) : null\n\n if (schema && schema.properties && schema.properties[fieldName]) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Also check content_fields table for legacy support\n const existingStmt = db.prepare('SELECT id FROM content_fields WHERE collection_id = ? AND field_name = ?')\n const existing = await existingStmt.bind(collectionId, fieldName).first()\n\n if (existing) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Parse field options\n let parsedOptions = {}\n try {\n parsedOptions = fieldOptions ? JSON.parse(fieldOptions) : {}\n } catch (e) {\n console.error('Error parsing field options:', e)\n }\n\n // Add field to schema (primary storage method)\n if (schema) {\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Build field config based on type\n const fieldConfig: any = {\n type: fieldType === 'number' ? 'number' : fieldType === 'boolean' ? 'boolean' : 'string',\n title: fieldLabel,\n searchable: isSearchable,\n ...parsedOptions\n }\n\n const normalizedFieldType = normalizeFieldType(fieldType)\n\n // Handle special field types\n if (normalizedFieldType === 'richtext') {\n fieldConfig.format = 'richtext'\n } else if (normalizedFieldType === 'date') {\n fieldConfig.format = 'date-time'\n } else if (normalizedFieldType === 'select') {\n fieldConfig.enum = (parsedOptions as any).options || []\n } else if (fieldType === 'radio') {\n fieldConfig.type = 'radio'\n if (!(parsedOptions as any).enum && (parsedOptions as any).options) {\n fieldConfig.enum = (parsedOptions as any).options\n }\n } else if (fieldType === 'media') {\n fieldConfig.format = 'media'\n } else if (normalizedFieldType === 'slug') {\n fieldConfig.type = 'slug'\n fieldConfig.format = 'slug'\n } else if (normalizedFieldType === 'quill') {\n fieldConfig.type = 'quill'\n } else if (normalizedFieldType === 'markdown') {\n fieldConfig.type = 'markdown'\n } else if (normalizedFieldType === 'reference') {\n fieldConfig.type = 'reference'\n }\n\n schema.properties[fieldName] = fieldConfig\n\n // Add to required array if needed\n if (isRequired && !schema.required.includes(fieldName)) {\n schema.required.push(fieldName)\n }\n\n // Update collection schema in database\n const updateSchemaStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateSchemaStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Add Field] Added field to schema:', fieldName, fieldConfig)\n\n return c.json({ success: true, fieldId: `schema-${fieldName}` })\n }\n\n // Fallback: If no schema exists, use content_fields table\n // Get next field order\n const orderStmt = db.prepare('SELECT MAX(field_order) as max_order FROM content_fields WHERE collection_id = ?')\n const orderResult = await orderStmt.bind(collectionId).first() as any\n const nextOrder = (orderResult?.max_order || 0) + 1\n\n // Create field in content_fields table\n const fieldId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content_fields (\n id, collection_id, field_name, field_type, field_label,\n field_options, field_order, is_required, is_searchable,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n fieldId,\n collectionId,\n fieldName,\n fieldType,\n fieldLabel,\n fieldOptions,\n nextOrder,\n isRequired ? 1 : 0,\n isSearchable ? 1 : 0,\n now,\n now\n ).run()\n\n return c.json({ success: true, fieldId })\n } catch (error) {\n console.error('Error adding field:', error)\n return c.json({ success: false, error: 'Failed to add field.' })\n }\n})\n\n// Update field\nadminCollectionsRoutes.put('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const formData = await c.req.formData()\n const fieldLabel = formData.get('field_label') as string\n const fieldType = formData.get('field_type') as string\n // Use getAll() to handle hidden input + checkbox pattern (get last value)\n const isRequiredValues = formData.getAll('is_required')\n const isSearchableValues = formData.getAll('is_searchable')\n const isRequired = isRequiredValues[isRequiredValues.length - 1] === '1'\n const isSearchable = isSearchableValues[isSearchableValues.length - 1] === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n // Log all form data for debugging\n console.log('[Field Update] Field ID:', fieldId)\n console.log('[Field Update] Form data received:', {\n field_label: fieldLabel,\n field_type: fieldType,\n is_required: formData.get('is_required'),\n is_searchable: formData.get('is_searchable'),\n field_options: fieldOptions\n })\n\n if (!fieldLabel) {\n return c.json({ success: false, error: 'Field label is required.' })\n }\n\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n // Schema fields are part of the collection's JSON schema\n // We need to update the collection's schema in the database\n const fieldName = fieldId.replace('schema-', '')\n\n console.log('[Field Update] Updating schema field:', fieldName)\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first()\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema) {\n schema = { type: 'object', properties: {}, required: [] }\n }\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Update the field in the schema\n if (schema.properties[fieldName]) {\n // Parse field options from form\n let parsedFieldOptions: Record = {}\n try {\n parsedFieldOptions = JSON.parse(fieldOptions)\n } catch (e) {\n console.error('[Field Update] Error parsing field options:', e)\n }\n\n // Build the updated field config - merge in field options\n const updatedFieldConfig: any = {\n ...schema.properties[fieldName],\n ...parsedFieldOptions,\n type: fieldType,\n title: fieldLabel,\n searchable: isSearchable\n }\n\n // Also set/remove the individual required property on the field\n // This ensures consistency regardless of which format is checked in GET\n if (isRequired) {\n updatedFieldConfig.required = true\n } else {\n delete updatedFieldConfig.required\n }\n\n schema.properties[fieldName] = updatedFieldConfig\n\n // Handle required field in the schema's required array (proper JSON Schema way)\n const requiredIndex = schema.required.indexOf(fieldName)\n console.log('[Field Update] Required field handling:', {\n fieldName,\n isRequired,\n currentRequiredArray: schema.required,\n requiredIndex\n })\n\n if (isRequired && requiredIndex === -1) {\n // Add to required array if checked and not already there\n schema.required.push(fieldName)\n console.log('[Field Update] Added field to required array')\n } else if (!isRequired && requiredIndex !== -1) {\n // Remove from required array if unchecked and currently there\n schema.required.splice(requiredIndex, 1)\n console.log('[Field Update] Removed field from required array')\n }\n\n console.log('[Field Update] Final required array:', schema.required)\n console.log('[Field Update] Final field config:', schema.properties[fieldName])\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Field Update] Schema update result:', {\n success: result.success,\n changes: result.meta?.changes\n })\n\n return c.json({ success: true })\n }\n\n // For regular database fields\n const updateStmt = db.prepare(`\n UPDATE content_fields\n SET field_label = ?, field_type = ?, field_options = ?, is_required = ?, is_searchable = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateStmt.bind(fieldLabel, fieldType, fieldOptions, isRequired ? 1 : 0, isSearchable ? 1 : 0, Date.now(), fieldId).run()\n\n console.log('[Field Update] Update result:', {\n success: result.success,\n meta: result.meta,\n changes: result.meta?.changes,\n last_row_id: result.meta?.last_row_id\n })\n\n // Verify the update by reading back the field\n const verifyStmt = db.prepare('SELECT * FROM content_fields WHERE id = ?')\n const verifyResult = await verifyStmt.bind(fieldId).first()\n console.log('[Field Update] Verification - field after update:', verifyResult)\n\n console.log('[Field Update] Successfully updated field with type:', fieldType)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating field:', error)\n return c.json({ success: false, error: 'Failed to update field.' })\n }\n})\n\n// Delete field\nadminCollectionsRoutes.delete('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n const fieldName = fieldId.replace('schema-', '')\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema || !schema.properties) {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n\n // Remove field from schema\n if (schema.properties[fieldName]) {\n delete schema.properties[fieldName]\n\n // Also remove from required array if present\n if (schema.required && Array.isArray(schema.required)) {\n const requiredIndex = schema.required.indexOf(fieldName)\n if (requiredIndex !== -1) {\n schema.required.splice(requiredIndex, 1)\n }\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Delete Field] Removed field from schema:', fieldName)\n\n return c.json({ success: true })\n } else {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n }\n\n // For regular database fields\n const deleteStmt = db.prepare('DELETE FROM content_fields WHERE id = ?')\n await deleteStmt.bind(fieldId).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting field:', error)\n return c.json({ success: false, error: 'Failed to delete field.' })\n }\n})\n\n// Update field order\nadminCollectionsRoutes.post('/:collectionId/fields/reorder', async (c) => {\n try {\n const body = await c.req.json()\n const fieldIds = body.fieldIds as string[]\n\n if (!Array.isArray(fieldIds)) {\n return c.json({ success: false, error: 'Invalid field order data.' })\n }\n\n const db = c.env.DB\n\n // Update field order\n for (let i = 0; i < fieldIds.length; i++) {\n const updateStmt = db.prepare('UPDATE content_fields SET field_order = ?, updated_at = ? WHERE id = ?')\n await updateStmt.bind(i + 1, Date.now(), fieldIds[i]).run()\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error reordering fields:', error)\n return c.json({ success: false, error: 'Failed to reorder fields.' })\n }\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface SettingsPageData {\n user?: {\n name: string\n email: string\n role: string\n }\n settings?: {\n general?: GeneralSettings\n appearance?: AppearanceSettings\n security?: SecuritySettings\n notifications?: NotificationSettings\n storage?: StorageSettings\n migrations?: MigrationSettings\n databaseTools?: DatabaseToolsSettings\n }\n activeTab?: string\n version?: string\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface AppearanceSettings {\n theme: 'light' | 'dark' | 'auto'\n primaryColor: string\n logoUrl: string\n favicon: string\n customCSS: string\n}\n\nexport interface SecuritySettings {\n twoFactorEnabled: boolean\n sessionTimeout: number\n passwordRequirements: {\n minLength: number\n requireUppercase: boolean\n requireNumbers: boolean\n requireSymbols: boolean\n }\n ipWhitelist: string[]\n jwtExpiresIn?: string\n jwtRefreshGraceSeconds?: number\n}\n\nexport interface NotificationSettings {\n emailNotifications: boolean\n contentUpdates: boolean\n systemAlerts: boolean\n userRegistrations: boolean\n emailFrequency: 'immediate' | 'daily' | 'weekly'\n}\n\nexport interface StorageSettings {\n maxFileSize: number\n allowedFileTypes: string[]\n storageProvider: 'local' | 'cloudflare' | 's3'\n backupFrequency: 'daily' | 'weekly' | 'monthly'\n retentionPeriod: number\n}\n\nexport interface MigrationSettings {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Array<{\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n }>\n}\n\nexport interface DatabaseToolsSettings {\n totalTables: number\n totalRows: number\n lastBackup?: string\n databaseSize?: string\n tables: Array<{\n name: string\n rowCount: number\n }>\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const activeTab = data.activeTab || 'general'\n \n const pageContent = `\n
\n \n
\n
\n

Settings

\n

Manage your application settings and preferences

\n
\n
\n\n \n
\n
\n \n
\n
\n\n \n
\n
\n ${renderTabContent(activeTab, data.settings)}\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'run-migrations-confirm',\n title: 'Run Migrations',\n message: 'Are you sure you want to run pending migrations? This action cannot be undone.',\n confirmText: 'Run Migrations',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performRunMigrations()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Settings',\n pageTitle: 'Settings',\n currentPath: '/admin/settings',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderTabButton(tabId: string, label: string, iconPath: string, activeTab: string): string {\n const isActive = activeTab === tabId\n const baseClasses = 'flex items-center space-x-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 whitespace-nowrap no-underline'\n const activeClasses = isActive\n ? 'border-zinc-950 dark:border-white text-zinc-950 dark:text-white'\n : 'border-transparent text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-300 hover:border-zinc-300 dark:hover:border-zinc-700'\n\n return `\n \n \n \n \n ${label}\n \n `\n}\n\nfunction renderTabContent(activeTab: string, settings?: SettingsPageData['settings']): string {\n switch (activeTab) {\n case 'general':\n return renderGeneralSettings(settings?.general)\n case 'appearance':\n return renderAppearanceSettings(settings?.appearance)\n case 'security':\n return renderSecuritySettings(settings?.security)\n case 'notifications':\n return renderNotificationSettings(settings?.notifications)\n case 'storage':\n return renderStorageSettings(settings?.storage)\n case 'migrations':\n return renderMigrationSettings(settings?.migrations)\n case 'database-tools':\n return renderDatabaseToolsSettings(settings?.databaseTools)\n default:\n return renderGeneralSettings(settings?.general)\n }\n}\n\nfunction renderGeneralSettings(settings?: GeneralSettings): string {\n return `\n
\n
\n

General Settings

\n

Configure basic application settings and preferences.

\n
\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n
\n \n ${settings?.siteDescription || ''}\n
\n\n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderAppearanceSettings(settings?: AppearanceSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Appearance Settings

\n

Customize the look and feel of your application.

\n
\n \n
\n
\n
\n \n
\n \n \n \n
\n
\n \n
\n \n
\n \n \n
\n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderSecuritySettings(settings?: SecuritySettings): string {\n const jwtExpiresIn = settings?.jwtExpiresIn ?? '30d'\n const jwtRefreshGraceSeconds =\n typeof settings?.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n\n return `\n
\n \n
\n

Session / JWT

\n

\n Configure how long a signed-in session lasts and how long an expired token can still be refreshed.\n The JWT_EXPIRES_IN and JWT_REFRESH_GRACE_SECONDS\n environment variables, when set, override the values below.\n

\n\n
\n
\n \n \n

\n Accepts 30d, 12h, 3600s, or bare seconds. Default: 30 days.\n

\n
\n\n
\n \n \n

\n How long an expired token can still be exchanged at /auth/refresh. Default: 604800 (7 days).\n

\n
\n
\n\n
\n \n \n \n \n Save Session Settings\n \n
\n
\n\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n The fields below are under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Security Settings

\n

Configure security and authentication settings.

\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n

Leave empty to allow all IPs

\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderNotificationSettings(settings?: NotificationSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Notification Settings

\n

Configure how and when you receive notifications.

\n
\n \n
\n
\n
\n

Email Notifications

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Notification Preferences
\n

\n Critical system alerts will always be sent immediately regardless of your frequency setting.\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderStorageSettings(settings?: StorageSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Storage Settings

\n

Configure file storage and backup settings.

\n
\n \n
\n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Storage Status
\n

\n Current usage: 2.4 GB / 10 GB available\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderMigrationSettings(settings?: MigrationSettings): string {\n return `\n
\n
\n

Database Migrations

\n

View and manage database migrations to keep your schema up to date.

\n
\n \n \n
\n
\n
\n
\n

Total Migrations

\n

${settings?.totalMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Applied

\n

${settings?.appliedMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Pending

\n

${settings?.pendingMigrations || '0'}

\n
\n \n \n \n
\n
\n
\n\n \n
\n \n \n \n\n \n
\n\n \n
\n
\n

Migration History

\n

List of all available database migrations

\n
\n \n
\n
\n \n \n \n

Loading migration status...

\n
\n
\n
\n
\n\n \n `\n}\n\nfunction renderDatabaseToolsSettings(settings?: DatabaseToolsSettings): string {\n return `\n
\n
\n

Database Tools

\n

Manage database operations including backup, restore, and maintenance.

\n
\n\n \n
\n
\n
\n
\n

Total Tables

\n

${settings?.totalTables || '0'}

\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n
\n

Total Rows

\n

${settings?.totalRows?.toLocaleString() || '0'}

\n
\n
\n \n \n \n
\n
\n
\n
\n\n \n
\n \n
\n

Safe Operations

\n
\n \n \n \n \n Refresh Stats\n \n\n \n \n \n \n Create Backup\n \n\n \n \n \n \n Validate Database\n \n
\n
\n
\n\n \n
\n
\n

Database Tables

\n

Click on a table to view its data

\n
\n\n
\n
\n \n \n \n

Loading database statistics...

\n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

Danger Zone

\n

\n These operations are destructive and cannot be undone.\n Your admin account will be preserved, but all other data will be permanently deleted.\n

\n
\n \n \n \n \n Truncate All Data\n \n
\n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\n// import { html } from 'hono/html'\nimport { requireAuth } from '../middleware'\nimport { renderSettingsPage, SettingsPageData } from '../templates/pages/admin-settings.template'\nimport { MigrationService } from '../services/migrations'\nimport { SettingsService } from '../services/settings'\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminSettingsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminSettingsRoutes.use('*', requireAuth())\n\n// Helper function to get mock settings data\nfunction getMockSettings(user: any) {\n return {\n general: {\n siteName: 'SonicJS AI',\n siteDescription: 'A modern headless CMS powered by AI',\n adminEmail: user?.email || 'admin@example.com',\n timezone: 'UTC',\n language: 'en',\n maintenanceMode: false\n },\n appearance: {\n theme: 'dark' as const,\n primaryColor: '#465FFF',\n logoUrl: '',\n favicon: '',\n customCSS: ''\n },\n security: {\n twoFactorEnabled: false,\n sessionTimeout: 30,\n passwordRequirements: {\n minLength: 8,\n requireUppercase: true,\n requireNumbers: true,\n requireSymbols: false\n },\n ipWhitelist: []\n },\n notifications: {\n emailNotifications: true,\n contentUpdates: true,\n systemAlerts: true,\n userRegistrations: false,\n emailFrequency: 'immediate' as const\n },\n storage: {\n maxFileSize: 10,\n allowedFileTypes: ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'docx'],\n storageProvider: 'cloudflare' as const,\n backupFrequency: 'daily' as const,\n retentionPeriod: 30\n },\n migrations: {\n totalMigrations: 0,\n appliedMigrations: 0,\n pendingMigrations: 0,\n lastApplied: undefined,\n migrations: []\n },\n databaseTools: {\n totalTables: 0,\n totalRows: 0,\n lastBackup: undefined,\n databaseSize: '0 MB',\n tables: []\n }\n }\n}\n\n// Settings page (redirects to general settings)\nadminSettingsRoutes.get('/', (c) => {\n return c.redirect('/admin/settings/general')\n})\n\n// General settings\nadminSettingsRoutes.get('/general', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Get real general settings from database\n const generalSettings = await settingsService.getGeneralSettings(user?.email)\n\n const mockSettings = getMockSettings(user)\n mockSettings.general = generalSettings\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'general',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Appearance settings\nadminSettingsRoutes.get('/appearance', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'appearance',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Security settings\nadminSettingsRoutes.get('/security', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Load persisted security settings (JWT TTL + refresh grace)\n const persisted = await settingsService.getSecuritySettings()\n\n const mockSettings = getMockSettings(user)\n mockSettings.security = {\n ...mockSettings.security,\n jwtExpiresIn: persisted.jwtExpiresIn,\n jwtRefreshGraceSeconds: persisted.jwtRefreshGraceSeconds\n } as any\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'security',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Notifications settings\nadminSettingsRoutes.get('/notifications', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'notifications',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Storage settings\nadminSettingsRoutes.get('/storage', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'storage',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Migrations settings\nadminSettingsRoutes.get('/migrations', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'migrations',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Database tools settings\nadminSettingsRoutes.get('/database-tools', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'database-tools',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Get migration status\nadminSettingsRoutes.get('/api/migrations/status', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminSettingsRoutes.post('/api/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n return c.json({\n success: false,\n error: 'Failed to run migrations'\n }, 500)\n }\n})\n\n// Validate database schema\nadminSettingsRoutes.get('/api/migrations/validate', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\n// Get database tools stats\nadminSettingsRoutes.get('/api/database-tools/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get list of all tables\n const tablesQuery = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT LIKE '_cf_%'\n ORDER BY name\n `).all()\n\n const tables = tablesQuery.results || []\n let totalRows = 0\n\n // Get row count for each table\n const tableStats = await Promise.all(\n tables.map(async (table: any) => {\n try {\n const countResult = await db.prepare(`SELECT COUNT(*) as count FROM ${table.name}`).first()\n const rowCount = (countResult as any)?.count || 0\n totalRows += rowCount\n return {\n name: table.name,\n rowCount\n }\n } catch (error) {\n console.error(`Error counting rows in ${table.name}:`, error)\n return {\n name: table.name,\n rowCount: 0\n }\n }\n })\n )\n\n // D1 doesn't expose database size directly, so we'll estimate based on row counts\n // Average row size estimate: 1KB per row (rough approximation)\n const estimatedSizeBytes = totalRows * 1024\n const databaseSizeMB = (estimatedSizeBytes / (1024 * 1024)).toFixed(2)\n\n return c.json({\n success: true,\n data: {\n totalTables: tables.length,\n totalRows,\n databaseSize: `${databaseSizeMB} MB (estimated)`,\n tables: tableStats\n }\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch database statistics'\n }, 500)\n }\n})\n\n// Validate database\nadminSettingsRoutes.get('/api/database-tools/validate', async (c) => {\n try {\n const db = c.env.DB\n\n // Run PRAGMA integrity_check\n const integrityResult = await db.prepare('PRAGMA integrity_check').first()\n const isValid = (integrityResult as any)?.integrity_check === 'ok'\n\n return c.json({\n success: true,\n data: {\n valid: isValid,\n message: isValid ? 'Database integrity check passed' : 'Database integrity check failed'\n }\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n})\n\n// Backup database\nadminSettingsRoutes.post('/api/database-tools/backup', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n // TODO: Implement actual backup functionality\n // For now, return success message\n return c.json({\n success: true,\n message: 'Database backup feature coming soon. Use Cloudflare Dashboard for backups.'\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({\n success: false,\n error: 'Failed to create backup'\n }, 500)\n }\n})\n\n// Truncate tables\nadminSettingsRoutes.post('/api/database-tools/truncate', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const body = await c.req.json()\n const tablesToTruncate = body.tables || []\n\n if (!Array.isArray(tablesToTruncate) || tablesToTruncate.length === 0) {\n return c.json({\n success: false,\n error: 'No tables specified for truncation'\n }, 400)\n }\n\n const db = c.env.DB\n const results = []\n\n // Validate table names against actual database tables (prevents SQL injection)\n const tablesResult = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n `).all()\n const validTables = new Set(\n (tablesResult.results || []).map((row: any) => row.name)\n )\n\n for (const tableName of tablesToTruncate) {\n if (!validTables.has(tableName)) {\n results.push({ table: tableName, success: false, error: 'Table not found' })\n continue\n }\n try {\n await db.prepare(`DELETE FROM ${tableName}`).run()\n results.push({ table: tableName, success: true })\n } catch (error) {\n console.error(`Error truncating ${tableName}:`, error)\n results.push({ table: tableName, success: false, error: String(error) })\n }\n }\n\n return c.json({\n success: true,\n message: `Truncated ${results.filter(r => r.success).length} of ${tablesToTruncate.length} tables`,\n results\n })\n } catch (error) {\n console.error('Error truncating tables:', error)\n return c.json({\n success: false,\n error: 'Failed to truncate tables'\n }, 500)\n }\n})\n\n// Save general settings\nadminSettingsRoutes.post('/general', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Extract general settings from form data\n const settings = {\n siteName: formData.get('siteName') as string,\n siteDescription: formData.get('siteDescription') as string,\n adminEmail: formData.get('adminEmail') as string,\n timezone: formData.get('timezone') as string,\n language: formData.get('language') as string,\n maintenanceMode: formData.get('maintenanceMode') === 'true'\n }\n\n // Validate required fields\n if (!settings.siteName || !settings.siteDescription) {\n return c.json({\n success: false,\n error: 'Site name and description are required'\n }, 400)\n }\n\n // Save settings to database\n const success = await settingsService.saveGeneralSettings(settings)\n\n if (success) {\n return c.json({\n success: true,\n message: 'General settings saved successfully!'\n })\n } else {\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n }\n } catch (error) {\n console.error('Error saving general settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save security settings (JWT TTL + refresh grace)\nadminSettingsRoutes.post('/security', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n const jwtExpiresInRaw = (formData.get('jwtExpiresIn') as string | null)?.trim() || ''\n const graceRaw = (formData.get('jwtRefreshGraceSeconds') as string | null)?.trim() || ''\n\n // Validate jwtExpiresIn: bare seconds or \n if (!/^\\d+(?:s|m|h|d)?$/i.test(jwtExpiresInRaw)) {\n return c.json({\n success: false,\n error: 'JWT expiration must be a number optionally suffixed with s/m/h/d (e.g. 30d, 12h, 3600).'\n }, 400)\n }\n\n const graceSeconds = Number.parseInt(graceRaw, 10)\n if (!Number.isFinite(graceSeconds) || graceSeconds < 0 || graceSeconds > 60 * 60 * 24 * 90) {\n return c.json({\n success: false,\n error: 'Refresh grace must be an integer between 0 and 7776000 seconds (90 days).'\n }, 400)\n }\n\n const success = await settingsService.saveSecuritySettings({\n jwtExpiresIn: jwtExpiresInRaw,\n jwtRefreshGraceSeconds: graceSeconds\n })\n\n if (success) {\n return c.json({\n success: true,\n message: 'Security settings saved successfully!'\n })\n }\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n } catch (error) {\n console.error('Error saving security settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save settings (legacy endpoint - redirect to general)\nadminSettingsRoutes.post('/', async (c) => {\n return c.redirect('/admin/settings/general')\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n formattedDate: string\n}\n\nexport interface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormsListPage(data: FormsListPageData): string {\n const tableData: any = {\n tableId: 'forms-table',\n rowClickable: true,\n rowClickUrl: (form: Form) => `/admin/forms/${form.id}/builder`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => `\n
\n \n ${form.name}\n \n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'category',\n label: 'Category',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n const categoryColors: Record = {\n 'contact': 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 ring-blue-700/10 dark:ring-blue-400/20',\n 'survey': 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-300 ring-purple-700/10 dark:ring-purple-400/20',\n 'registration': 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-300 ring-green-700/10 dark:ring-green-400/20',\n 'feedback': 'bg-orange-50 dark:bg-orange-500/10 text-orange-700 dark:text-orange-300 ring-orange-700/10 dark:ring-orange-400/20',\n 'general': 'bg-gray-50 dark:bg-gray-500/10 text-gray-700 dark:text-gray-300 ring-gray-700/10 dark:ring-gray-400/20'\n }\n const colorClass = categoryColors[form.category] || categoryColors['general']\n return `\n \n ${form.category || 'general'}\n \n `\n }\n },\n {\n key: 'submission_count',\n label: 'Submissions',\n sortable: true,\n sortType: 'number',\n render: (_value: any, form: any) => {\n const count = form.submission_count || 0\n return `\n
\n \n ${count}\n \n
\n `\n }\n },\n {\n key: 'is_active',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n if (form.is_active) {\n return `\n \n Active\n \n `\n } else {\n return `\n \n Inactive\n \n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n render: (_value: any, form: any) => {\n if (!form || !form.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.forms,\n emptyMessage: 'No forms found. Create your first form to get started!'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Forms

\n

Create and manage forms with the visual form builder

\n
\n \n
\n\n \n
\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Forms
\n
${data.forms.length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Active Forms
\n
${data.forms.filter(f => f.is_active).length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Submissions
\n
${data.forms.reduce((sum, f) => sum + (f.submission_count || 0), 0)}
\n
\n
\n
\n
\n
\n\n \n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Filter\n \n ${data.search || data.category ? `\n \n Clear\n \n ` : ''}\n \n
\n\n \n
\n ${renderTable(tableData)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Forms',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface FormBuilderPageData {\n id: string\n name: string\n display_name: string\n description?: string\n category?: string\n formio_schema: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\n// Inline Turnstile component for Form.io builder\nfunction getTurnstileComponentScript(): string {\n return `\n (function() {\n 'use strict';\n\n if (!window.Formio || !window.Formio.Components) {\n console.error('Form.io library not loaded');\n return;\n }\n\n const FieldComponent = Formio.Components.components.field;\n\n class TurnstileComponent extends FieldComponent {\n static schema(...extend) {\n return FieldComponent.schema({\n type: 'turnstile',\n label: 'Turnstile Verification',\n key: 'turnstile',\n input: true,\n persistent: false,\n protected: true,\n unique: false,\n hidden: false,\n clearOnHide: true,\n tableView: false,\n validate: {\n required: false\n },\n siteKey: '',\n theme: 'auto',\n size: 'normal',\n action: '',\n appearance: 'always',\n errorMessage: 'Please complete the security verification'\n }, ...extend);\n }\n\n static get builderInfo() {\n return {\n title: 'Turnstile',\n group: 'premium',\n icon: 'fa fa-shield-alt',\n weight: 120,\n documentation: '/admin/forms/docs#turnstile',\n schema: TurnstileComponent.schema()\n };\n }\n\n constructor(component, options, data) {\n super(component, options, data);\n this.widgetId = null;\n this.scriptLoaded = false;\n }\n\n init() {\n super.init();\n // Only load script if NOT in builder/edit mode\n if (!this.options.editMode && !this.options.builder && !this.builderMode) {\n this.loadTurnstileScript();\n }\n }\n\n loadTurnstileScript() {\n // Extra safety: never load in builder\n if (this.options.editMode || this.options.builder || this.builderMode) {\n console.log('Turnstile: Skipping script load in builder mode');\n return Promise.resolve();\n }\n\n if (window.turnstile) {\n this.scriptLoaded = true;\n return Promise.resolve();\n }\n\n if (this.scriptPromise) {\n return this.scriptPromise;\n }\n\n console.log('Turnstile: Loading script for form mode');\n this.scriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js';\n script.async = true;\n script.defer = true;\n script.onload = () => {\n this.scriptLoaded = true;\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Turnstile'));\n document.head.appendChild(script);\n });\n\n return this.scriptPromise;\n }\n\n render() {\n return super.render(\\`\n
\n
\n \\${this.component.description ? \\`
\\${this.component.description}
\\` : ''}\n
\n \\`);\n }\n\n attach(element) {\n this.loadRefs(element, {\n turnstileContainer: 'single',\n turnstileWidget: 'single'\n });\n\n const superAttach = super.attach(element);\n\n // Check if we're in builder mode or form mode\n if (this.options.editMode || this.options.builder) {\n // Builder mode - show placeholder only\n this.renderPlaceholder();\n } else {\n // Form mode - render actual widget\n this.loadTurnstileScript()\n .then(() => this.renderWidget())\n .catch(err => {\n console.error('Failed to load Turnstile:', err);\n if (this.refs.turnstileWidget) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to load security verification\n
\n \\`;\n }\n });\n }\n\n return superAttach;\n }\n\n renderPlaceholder() {\n if (!this.refs.turnstileWidget) {\n return;\n }\n \n this.refs.turnstileWidget.innerHTML = \\`\n
\n
🛡️
\n
Turnstile Verification
\n
CAPTCHA-free bot protection by Cloudflare
\n
Widget will appear here on the live form
\n
\n \\`;\n }\n\n renderWidget() {\n if (!this.refs.turnstileWidget || !window.turnstile) {\n return;\n }\n\n this.refs.turnstileWidget.innerHTML = '';\n\n const siteKey = this.component.siteKey || \n (this.root && this.root.options && this.root.options.turnstileSiteKey) || \n '';\n \n if (!siteKey) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n ⚠️ Configuration Required: Turnstile site key not configured. \n Please enable the Turnstile plugin in Settings → Plugins.\n
\n \\`;\n return;\n }\n\n try {\n const self = this;\n this.widgetId = window.turnstile.render(this.refs.turnstileWidget, {\n sitekey: siteKey,\n theme: this.component.theme || 'auto',\n size: this.component.size || 'normal',\n action: this.component.action || '',\n appearance: this.component.appearance || 'always',\n callback: function(token) {\n self.updateValue(token);\n self.triggerChange();\n },\n 'error-callback': function() {\n self.updateValue(null);\n self.setCustomValidity(self.component.errorMessage || 'Security verification failed');\n },\n 'expired-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification expired. Please verify again.');\n },\n 'timeout-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification timed out. Please try again.');\n }\n });\n } catch (err) {\n console.error('Failed to render Turnstile widget:', err);\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to render security verification\n
\n \\`;\n }\n }\n\n detach() {\n if (this.widgetId !== null && window.turnstile) {\n try {\n window.turnstile.remove(this.widgetId);\n this.widgetId = null;\n } catch (err) {\n console.error('Failed to remove Turnstile widget:', err);\n }\n }\n return super.detach();\n }\n\n getValue() {\n if (this.widgetId !== null && window.turnstile) {\n return window.turnstile.getResponse(this.widgetId);\n }\n return this.dataValue;\n }\n\n setValue(value, flags) {\n const changed = super.setValue(value, flags);\n return changed;\n }\n\n getValueAsString(value) {\n return value ? '✅ Verified' : '❌ Not Verified';\n }\n\n isEmpty(value) {\n return !value;\n }\n\n updateValue(value, flags) {\n const changed = super.updateValue(value, flags);\n \n if (value) {\n this.setCustomValidity('');\n }\n \n return changed;\n }\n\n checkValidity(data, dirty, row) {\n const result = super.checkValidity(data, dirty, row);\n \n if (this.component.validate && this.component.validate.required) {\n const value = this.getValue();\n if (!value) {\n this.setCustomValidity(this.component.errorMessage || 'Please complete the security verification');\n return false;\n }\n }\n \n return result;\n }\n }\n\n Formio.Components.addComponent('turnstile', TurnstileComponent);\n console.log('✅ Turnstile component registered with Form.io');\n window.TurnstileComponent = TurnstileComponent;\n })();\n `;\n}\n\nexport function renderFormBuilderPage(data: FormBuilderPageData): string {\n const formioSchema = data.formio_schema || { components: [] }\n const settings = data.settings || {}\n const googleMapsApiKey = data.google_maps_api_key || ''\n const turnstileSiteKey = data.turnstile_site_key || ''\n\n const pageContent = `\n \n\n
\n \n
\n
\n
\n \n \n \n \n \n
\n

\n Form Builder: ${data.display_name}\n

\n

\n \n ${data.name}\n \n

\n
\n
\n\n \n
\n \n \n \n \n \n Preview\n \n\n \n \n \n \n Save Form\n \n\n \n \n \n \n View Public Form\n \n\n \n \n \n \n View Submissions\n \n
\n
\n
\n\n \n
\n \n
\n \n \n \n \n Single Page\n \n \n \n \n \n Multi-Page Wizard\n \n
\n \n 💡 Use Panel components (Layout tab) for each page\n \n
\n\n \n
\n\n \n
\n
\n \n \n \n \n

Loading Form Builder...

\n
\n
\n\n \n
\n\n \n
\n
\n
\n

Form Preview

\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n\n \n \n\n \n\n \n \n \n \n \n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Form Builder: ${data.display_name}`,\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm } from '../components/form.template'\n\nexport interface FormCreatePageData {\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormCreatePage(data: FormCreatePageData): string {\n const pageContent = `\n
\n \n
\n
\n \n \n \n \n \n
\n

Create New Form

\n

Enter basic information to create your form. You'll be able to add fields in the builder.

\n
\n
\n
\n\n \n ${data.error ? `\n
\n
\n \n \n \n

${data.error}

\n
\n
\n ` : ''}\n\n ${data.success ? `\n
\n
\n \n \n \n

${data.success}

\n
\n
\n ` : ''}\n\n \n
\n
\n \n
\n \n
\n \n \n

\n Lowercase letters, numbers, and underscores only. Used in URLs and API.\n

\n
\n\n \n
\n \n \n

\n Human-readable name shown in the admin interface.\n

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n \n \n \n \n \n \n

\n Helps organize forms in the admin panel.\n

\n
\n
\n\n \n
\n \n Cancel\n \n \n \n \n \n Create & Open Builder\n \n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

What happens next?

\n
\n

After creating your form, you'll be taken to the Form Builder where you can:

\n
    \n
  • Drag and drop fields onto your form
  • \n
  • Configure field properties and validation
  • \n
  • Add conditional logic
  • \n
  • Preview your form in real-time
  • \n
  • Publish when ready
  • \n
\n
\n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create Form',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderFormsListPage } from '../templates/pages/admin-forms-list.template'\nimport { renderFormBuilderPage, type FormBuilderPageData } from '../templates/pages/admin-forms-builder.template'\nimport { renderFormCreatePage } from '../templates/pages/admin-forms-create.template'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\n\n// Type definitions for forms\ninterface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n updated_at: number\n formattedDate: string\n}\n\ninterface FormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n category?: string\n formio_schema?: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ninterface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminFormsRoutes.use('*', requireAuth())\n\n// Forms management - List all forms\nadminFormsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const category = c.req.query('category') || ''\n\n // Build query\n let query = 'SELECT * FROM forms WHERE 1=1'\n const params: string[] = []\n\n if (search) {\n query += ' AND (name LIKE ? OR display_name LIKE ?)'\n params.push(`%${search}%`, `%${search}%`)\n }\n\n if (category) {\n query += ' AND category = ?'\n params.push(category)\n }\n\n query += ' ORDER BY created_at DESC'\n\n const result = await db.prepare(query).bind(...params).all()\n\n // Format dates\n const forms = result.results.map((form: any) => ({\n ...form,\n formattedDate: new Date(form.created_at).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n }))\n\n const pageData: FormsListPageData = {\n forms,\n search,\n category,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsListPage(pageData))\n } catch (error: any) {\n console.error('Error listing forms:', error)\n return c.html('

Error loading forms

', 500)\n }\n})\n\n// Show create form page\nadminFormsRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n\n const pageData: FormData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormCreatePage(pageData))\n } catch (error: any) {\n console.error('Error showing create form page:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Show docs page\nadminFormsRoutes.get('/docs', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsDocsPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsDocsPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms docs page:', error)\n return c.html('

Error loading documentation

', 500)\n }\n})\n\n// Show examples page\nadminFormsRoutes.get('/examples', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsExamplesPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsExamplesPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms examples page:', error)\n return c.html('

Error loading examples

', 500)\n }\n})\n\n// Create new form\nadminFormsRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const name = body.name as string\n const displayName = body.displayName as string\n const description = (body.description as string) || ''\n const category = (body.category as string) || 'general'\n\n // Validate required fields\n if (!name || !displayName) {\n return c.json({ error: 'Name and display name are required' }, 400)\n }\n\n // Validate name format (lowercase, numbers, underscores only)\n if (!/^[a-z0-9_]+$/.test(name)) {\n return c.json({ \n error: 'Form name must contain only lowercase letters, numbers, and underscores' \n }, 400)\n }\n\n // Check for duplicate name\n const existing = await db.prepare('SELECT id FROM forms WHERE name = ?')\n .bind(name)\n .first()\n\n if (existing) {\n return c.json({ error: 'A form with this name already exists' }, 400)\n }\n\n // Create form with empty schema\n const formId = crypto.randomUUID()\n const now = Date.now()\n const emptySchema = { components: [] } // Empty Form.io schema\n\n await db.prepare(`\n INSERT INTO forms (\n id, name, display_name, description, category,\n formio_schema, settings, is_active, is_public,\n created_by, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n formId,\n name,\n displayName,\n description,\n category,\n JSON.stringify(emptySchema),\n JSON.stringify({\n submitButtonText: 'Submit',\n successMessage: 'Thank you for your submission!',\n requireAuth: false,\n emailNotifications: false\n }),\n 1, // is_active\n 1, // is_public\n user?.userId || null,\n now,\n now\n ).run()\n\n // Redirect to builder\n return c.redirect(`/admin/forms/${formId}/builder`)\n } catch (error: any) {\n console.error('Error creating form:', error)\n return c.json({ error: 'Failed to create form' }, 500)\n }\n})\n\n// Show form builder\nadminFormsRoutes.get('/:id/builder', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get Turnstile configuration\n const turnstileService = new TurnstileService(db)\n const turnstileSettings = await turnstileService.getSettings()\n\n const pageData: FormData = {\n id: form.id as string,\n name: form.name as string,\n display_name: form.display_name as string,\n description: form.description as string | undefined,\n category: form.category as string,\n formio_schema: form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] },\n settings: form.settings ? JSON.parse(form.settings as string) : {},\n is_active: Boolean(form.is_active),\n is_public: Boolean(form.is_public),\n google_maps_api_key: googleMapsApiKey,\n turnstile_site_key: turnstileSettings?.siteKey || '',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormBuilderPage(pageData as FormBuilderPageData))\n } catch (error: any) {\n console.error('Error showing form builder:', error)\n return c.html('

Error loading form builder

', 500)\n }\n})\n\n// Update form (save schema)\nadminFormsRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const body = await c.req.json()\n\n // Check if form exists\n const form = await db.prepare('SELECT id FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const now = Date.now()\n\n // Update form\n await db.prepare(`\n UPDATE forms \n SET formio_schema = ?, \n updated_by = ?, \n updated_at = ?\n WHERE id = ?\n `).bind(\n JSON.stringify(body.formio_schema),\n user?.userId || null,\n now,\n formId\n ).run()\n\n return c.json({ success: true, message: 'Form saved successfully' })\n } catch (error: any) {\n console.error('Error updating form:', error)\n return c.json({ error: 'Failed to save form' }, 500)\n }\n})\n\n// Delete form\nadminFormsRoutes.delete('/:id', async (c) => {\n try {\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Check if form exists\n const form = await db.prepare('SELECT id, submission_count FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Warn if form has submissions\n const submissionCount = form.submission_count as number || 0\n if (submissionCount > 0) {\n return c.json({ \n error: `Cannot delete form with ${submissionCount} submissions. Archive it instead.` \n }, 400)\n }\n\n // Delete form (cascade will delete submissions and files)\n await db.prepare('DELETE FROM forms WHERE id = ?').bind(formId).run()\n\n return c.json({ success: true, message: 'Form deleted successfully' })\n } catch (error: any) {\n console.error('Error deleting form:', error)\n return c.json({ error: 'Failed to delete form' }, 500)\n }\n})\n\n// View form submissions\nadminFormsRoutes.get('/:id/submissions', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get submissions\n const submissions = await db.prepare(\n 'SELECT * FROM form_submissions WHERE form_id = ? ORDER BY submitted_at DESC'\n ).bind(formId).all()\n\n // Simple submissions page for now\n const html = `\n \n \n \n Submissions - ${form.display_name}\n \n \n \n ← Back to Forms\n

Submissions: ${form.display_name}

\n

Total submissions: ${submissions.results.length}

\n ${submissions.results.length > 0 ? `\n \n \n \n \n \n \n \n \n \n ${submissions.results.map((sub: any) => `\n \n \n \n \n \n `).join('')}\n \n
IDSubmittedData
${sub.id.substring(0, 8)}${new Date(sub.submitted_at).toLocaleString()}
${JSON.stringify(JSON.parse(sub.submission_data), null, 2)}
\n ` : '

No submissions yet.

'}\n \n \n `\n \n return c.html(html)\n } catch (error: any) {\n console.error('Error loading submissions:', error)\n return c.html('

Error loading submissions

', 500)\n }\n})\n\nexport default adminFormsRoutes\n","import { Hono } from 'hono'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { createContentFromSubmission } from '../services/form-collection-sync'\n\n/**\n * Recursively sanitize all string values in arbitrary JSON data.\n * HTML-encodes entities (e.g., < becomes <) to prevent stored XSS\n * when form submission data is rendered in admin templates.\n */\nfunction sanitizeDeep(value: unknown): unknown {\n if (typeof value === 'string') {\n return sanitizeInput(value)\n }\n if (Array.isArray(value)) {\n return value.map(sanitizeDeep)\n }\n if (value !== null && typeof value === 'object') {\n const result: Record = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = sanitizeDeep(v)\n }\n return result\n }\n return value // numbers, booleans, null pass through\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const publicFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Get Turnstile configuration for a form (for headless frontends)\npublicFormsRoutes.get('/:identifier/turnstile-config', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form\n const form = await db.prepare(\n 'SELECT id, turnstile_enabled, turnstile_settings FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const turnstileService = new TurnstileService(db)\n const globalSettings = await turnstileService.getSettings()\n \n const formSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string)\n : { inherit: true }\n\n // Determine effective settings\n const enabled = form.turnstile_enabled === 1 || \n (formSettings.inherit && globalSettings?.enabled)\n\n if (!enabled || !globalSettings) {\n return c.json({ enabled: false })\n }\n\n return c.json({\n enabled: true,\n siteKey: formSettings.siteKey || globalSettings.siteKey,\n theme: formSettings.theme || globalSettings.theme || 'auto',\n size: formSettings.size || globalSettings.size || 'normal',\n mode: formSettings.mode || globalSettings.mode || 'managed',\n appearance: formSettings.appearance || globalSettings.appearance || 'always'\n })\n } catch (error: any) {\n console.error('Error fetching Turnstile config:', error)\n return c.json({ error: 'Failed to fetch config' }, 500)\n }\n})\n\n// Get form schema as JSON (for headless frontends)\npublicFormsRoutes.get('/:identifier/schema', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT id, name, display_name, description, category, formio_schema, settings, is_active, is_public FROM forms WHERE (id = ? OR name = ?) AND is_active = 1 AND is_public = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n return c.json({\n id: form.id,\n name: form.name,\n displayName: form.display_name,\n description: form.description,\n category: form.category,\n schema: formioSchema,\n settings: settings,\n submitUrl: `/api/forms/${form.id}/submit`\n })\n } catch (error: any) {\n console.error('Error fetching form schema:', error)\n return c.json({ error: 'Failed to fetch form schema' }, 500)\n }\n})\n\n// Render public form by name\npublicFormsRoutes.get('/:name', async (c) => {\n try {\n const db = c.env.DB\n const formName = c.req.param('name')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form by name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE name = ? AND is_active = 1 AND is_public = 1'\n ).bind(formName).first()\n\n if (!form) {\n return c.html('

Form not found

This form does not exist or is not publicly available.

', 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n const html = `\n \n \n \n \n \n ${form.display_name}\n \n \n \n \n \n \n \n
\n

${form.display_name}

\n ${form.description ? `

${form.description}

` : ''}\n \n
\n \n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n `\n\n return c.html(html)\n } catch (error: any) {\n console.error('Error rendering form:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Handle form submission (accepts either name or ID)\npublicFormsRoutes.post('/:identifier/submit', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n const body = await c.req.json()\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Check if Turnstile is enabled for this form\n const turnstileEnabled = form.turnstile_enabled === 1\n const turnstileSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string) \n : { inherit: true }\n\n // Validate Turnstile if enabled (or inheriting global settings)\n if (turnstileEnabled || turnstileSettings.inherit) {\n const turnstileService = new TurnstileService(db)\n \n // Check if Turnstile is globally enabled\n const globalEnabled = await turnstileService.isEnabled()\n \n if (globalEnabled || turnstileEnabled) {\n // Extract Turnstile token from submission data\n const turnstileToken = body.data?.turnstile || body.turnstile\n \n if (!turnstileToken) {\n return c.json({ \n error: 'Turnstile verification required. Please complete the security check.',\n code: 'TURNSTILE_MISSING'\n }, 400)\n }\n\n // Verify the token\n const clientIp = c.req.header('cf-connecting-ip')\n const verification = await turnstileService.verifyToken(turnstileToken, clientIp)\n \n if (!verification.success) {\n return c.json({ \n error: verification.error || 'Security verification failed. Please try again.',\n code: 'TURNSTILE_INVALID'\n }, 403)\n }\n\n // Remove Turnstile token from submission data before storing\n if (body.data?.turnstile) {\n delete body.data.turnstile\n }\n }\n }\n\n // Sanitize all string values in submission data to prevent stored XSS.\n // HTML-encodes entities (e.g., < becomes <) before storage.\n const sanitizedData = sanitizeDeep(body.data) as Record\n\n // Create submission\n const submissionId = crypto.randomUUID()\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO form_submissions (\n id, form_id, submission_data, user_id, ip_address, user_agent,\n submitted_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n submissionId,\n form.id,\n JSON.stringify(sanitizedData),\n null, // user_id (for authenticated users)\n c.req.header('cf-connecting-ip') || null,\n c.req.header('user-agent') || null,\n now,\n now\n ).run()\n\n // Update submission count\n await db.prepare(`\n UPDATE forms\n SET submission_count = submission_count + 1,\n updated_at = ?\n WHERE id = ?\n `).bind(now, form.id).run()\n\n // Dual-write: create content item for this submission\n let contentId: string | null = null\n try {\n contentId = await createContentFromSubmission(\n db,\n sanitizedData as Record,\n { id: form.id as string, name: form.name as string, display_name: form.display_name as string },\n submissionId,\n {\n ipAddress: c.req.header('cf-connecting-ip') || null,\n userAgent: c.req.header('user-agent') || null,\n userEmail: (sanitizedData as any)?.email || null,\n userId: null // anonymous submission\n }\n )\n if (!contentId) {\n console.warn('[FormSubmit] Content creation returned null for submission:', submissionId)\n }\n } catch (contentError) {\n // Don't fail the submission if content creation fails\n console.error('[FormSubmit] Error creating content from submission:', contentError)\n }\n\n return c.json({\n success: true,\n submissionId,\n contentId,\n message: 'Form submitted successfully'\n })\n } catch (error: any) {\n console.error('Error submitting form:', error)\n return c.json({ error: 'Failed to submit form' }, 500)\n }\n})\n\nexport default publicFormsRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { CATEGORY_INFO } from '../../services/route-metadata'\n\nexport interface APIEndpoint {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented?: boolean\n}\n\nexport interface APIReferencePageData {\n endpoints: APIEndpoint[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nfunction renderAuthBadge(auth: boolean | 'unknown'): string {\n if (auth === true) {\n return `\n \n \n \n \n Auth\n `\n }\n if (auth === false) {\n return `\n \n \n \n \n Public\n `\n }\n // unknown\n return `\n \n \n \n \n Unknown\n `\n}\n\nexport function renderAPIReferencePage(data: APIReferencePageData): string {\n // Group endpoints by category\n const endpointsByCategory = data.endpoints.reduce((acc, endpoint) => {\n if (!acc[endpoint.category]) {\n acc[endpoint.category] = []\n }\n acc[endpoint.category]!.push(endpoint)\n return acc\n }, {} as Record)\n\n // Get unique categories from actual data\n const categories = Object.keys(endpointsByCategory)\n\n // Count stats\n const totalEndpoints = data.endpoints.length\n const publicEndpoints = data.endpoints.filter(e => e.authentication === false).length\n const protectedEndpoints = data.endpoints.filter(e => e.authentication === true).length\n const undocumentedCount = data.endpoints.filter(e => e.documented === false).length\n\n const pageContent = `\n
\n \n
\n
\n

API Reference

\n

Auto-discovered documentation of all registered API endpoints

\n
\n \n
\n\n \n
\n
\n
Total Endpoints
\n
\n ${totalEndpoints}\n
\n
\n
\n
Public Endpoints
\n
\n ${publicEndpoints}\n
\n
\n
\n
Protected Endpoints
\n
\n ${protectedEndpoints}\n
\n
\n
\n
Categories
\n
\n ${categories.length}\n
\n
\n
\n
Undocumented
\n
\n 0 ? 'text-zinc-400 dark:text-zinc-500' : 'text-lime-600 dark:text-lime-400'}\">${undocumentedCount}\n
\n
\n
\n\n \n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n \n \n ${categories.map(category => {\n const info = CATEGORY_INFO[category]\n const title = info ? info.title : category\n return ``\n }).join('\\n ')}\n \n \n \n \n
\n
\n
\n
\n
\n\n \n
\n ${Object.entries(endpointsByCategory).map(([category, endpoints]) => {\n const info = CATEGORY_INFO[category] || { title: category, description: '', icon: '📋' }\n return `\n
\n
\n \n
\n
\n ${info.icon}\n
\n

${info.title}

\n

${info.description}

\n
\n
\n \n ${endpoints.length} endpoint${endpoints.length !== 1 ? 's' : ''}\n \n
\n
\n
\n\n \n
\n ${endpoints.map(endpoint => `\n
\n
\n \n ${endpoint.method}\n \n
\n
\n ${endpoint.path}\n ${renderAuthBadge(endpoint.authentication)}\n ${endpoint.documented === false ? `\n \n Auto-discovered\n \n ` : ''}\n
\n

${endpoint.description || 'No description available'}

\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n }).join('')}\n
\n\n \n
\n \n \n \n

No endpoints found

\n

Try adjusting your search or filter criteria

\n
\n
\n\n \n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'API Reference',\n pageTitle: 'API Reference',\n currentPath: '/admin/api-reference',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","/**\n * Admin API Reference Routes\n *\n * Provides the API Reference page for the admin dashboard.\n * Uses auto-discovery via Hono's inspectRoutes() to always show\n * the complete list of registered API endpoints.\n */\n\nimport { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderAPIReferencePage,\n type APIReferencePageData\n} from '../templates/pages/admin-api-reference.template'\nimport { getCoreVersion } from '../utils/version'\nimport { buildRouteList, getAppInstance } from '../services/route-metadata'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin/api-reference - API Reference Page\n *\n * Auto-discovers all registered routes using Hono's inspectRoutes()\n * and enriches them with metadata from the route-metadata registry.\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const app = getAppInstance()\n const endpoints = buildRouteList(app)\n\n const pageData: APIReferencePageData = {\n endpoints,\n user: user ? {\n name: user.email.split('@')[0] || user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n } catch (error) {\n console.error('API Reference page error:', error)\n\n const pageData: APIReferencePageData = {\n endpoints: [],\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n }\n})\n\nexport { router as adminApiReferenceRoutes }\n","/**\n * Routes Module Exports\n *\n * Routes are being migrated incrementally from the monolith.\n * Each route is refactored to remove monolith-specific dependencies.\n */\n\n// API routes\nexport { default as apiRoutes } from './api'\nexport { default as apiContentCrudRoutes } from './api-content-crud'\nexport { default as apiMediaRoutes } from './api-media'\nexport { default as apiSystemRoutes } from './api-system'\nexport { default as adminApiRoutes } from './admin-api'\n\n// Auth routes\nexport { default as authRoutes } from './auth'\n\n// Test routes (only for development/test environments)\nexport { default as testCleanupRoutes } from './test-cleanup'\n\n// Admin UI routes\nexport { default as adminContentRoutes } from './admin-content'\nexport { userRoutes as adminUsersRoutes } from './admin-users'\nexport { adminMediaRoutes } from './admin-media'\nexport { adminPluginRoutes } from './admin-plugins'\nexport { adminLogsRoutes } from './admin-logs'\nexport { adminDesignRoutes } from './admin-design'\nexport { adminCheckboxRoutes } from './admin-checkboxes'\nexport { default as adminTestimonialsRoutes } from './admin-testimonials'\nexport { default as adminCodeExamplesRoutes } from './admin-code-examples'\nexport { adminDashboardRoutes } from './admin-dashboard'\nexport { adminCollectionsRoutes } from './admin-collections'\nexport { adminSettingsRoutes } from './admin-settings'\nexport { adminFormsRoutes } from './admin-forms'\nexport { default as publicFormsRoutes } from './public-forms'\nexport { adminApiReferenceRoutes } from './admin-api-reference'\n\nexport const ROUTES_INFO = {\n message: 'Core routes available',\n available: [\n 'apiRoutes',\n 'apiContentCrudRoutes',\n 'apiMediaRoutes',\n 'apiSystemRoutes',\n 'adminApiRoutes',\n 'authRoutes',\n 'testCleanupRoutes',\n 'adminContentRoutes',\n 'adminUsersRoutes',\n 'adminMediaRoutes',\n 'adminPluginRoutes',\n 'adminLogsRoutes',\n 'adminDesignRoutes',\n 'adminCheckboxRoutes',\n 'adminTestimonialsRoutes',\n 'adminCodeExamplesRoutes',\n 'adminDashboardRoutes',\n 'adminCollectionsRoutes',\n 'adminSettingsRoutes',\n 'adminFormsRoutes',\n 'publicFormsRoutes',\n 'adminApiReferenceRoutes'\n ],\n status: 'Core package routes ready',\n reference: 'https://github.com/sonicjs/sonicjs'\n} as const\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-FE77VWGD.js b/packages/core/dist/chunk-NDS4S4AG.js similarity index 99% rename from packages/core/dist/chunk-FE77VWGD.js rename to packages/core/dist/chunk-NDS4S4AG.js index 5a739053b..cf0fb6df1 100644 --- a/packages/core/dist/chunk-FE77VWGD.js +++ b/packages/core/dist/chunk-NDS4S4AG.js @@ -466,7 +466,7 @@ function buildQuery(table, filter) { // package.json var package_default = { name: "@sonicjs-cms/core", - version: "2.18.1", + version: "2.18.0", description: "Core framework for SonicJS headless CMS - Edge-first, TypeScript-native CMS built for Cloudflare Workers", type: "module", main: "./dist/index.cjs", @@ -588,7 +588,7 @@ var package_default = { "drizzle-orm": "^0.45.2", eslint: "^9.39.2", glob: "^10.5.0", - hono: "^4.12.18", + hono: "^4.12.12", tsup: "^8.5.0", typescript: "^5.9.3", vitest: "^4.0.5", @@ -655,5 +655,5 @@ function parseBlocksValue(value, config) { } export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, generateSlug, getBlocksFieldConfig, getCoreVersion, package_default, parseBlocksValue, renderTemplate, templateRenderer }; -//# sourceMappingURL=chunk-FE77VWGD.js.map -//# sourceMappingURL=chunk-FE77VWGD.js.map \ No newline at end of file +//# sourceMappingURL=chunk-NDS4S4AG.js.map +//# sourceMappingURL=chunk-NDS4S4AG.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-FE77VWGD.js.map b/packages/core/dist/chunk-NDS4S4AG.js.map similarity index 99% rename from packages/core/dist/chunk-FE77VWGD.js.map rename to packages/core/dist/chunk-NDS4S4AG.js.map index e9ddf0377..bc302feab 100644 --- a/packages/core/dist/chunk-FE77VWGD.js.map +++ b/packages/core/dist/chunk-NDS4S4AG.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/utils/slug-utils.ts","../src/utils/template-renderer.ts","../src/utils/query-filter.ts","../package.json","../src/utils/version.ts","../src/utils/blocks.ts"],"names":[],"mappings":"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","file":"chunk-FE77VWGD.js","sourcesContent":["/**\n * Slug generation utilities for creating URL-friendly slugs\n */\n\n/**\n * Generate URL-friendly slug from text\n * \n * Features:\n * - Converts to lowercase\n * - Handles accented characters (NFD normalization)\n * - Removes diacritics\n * - Keeps only alphanumeric, spaces, underscores, and hyphens\n * - Replaces spaces with hyphens\n * - Collapses multiple hyphens/underscores\n * - Trims leading/trailing hyphens/underscores\n * - Limits length to 100 characters\n * \n * @param text - Text to slugify\n * @returns URL-safe slug\n * \n * @example\n * generateSlug('Hello World!') // 'hello-world'\n * generateSlug('Café París 2024') // 'cafe-paris-2024'\n * generateSlug('Multiple Spaces') // 'multiple-spaces'\n */\nexport function generateSlug(text: string): string {\n if (!text) return '';\n \n return text\n .toLowerCase()\n .normalize('NFD') // Decompose combined characters (e.g., é -> e + ́)\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9\\s_-]/g, '') // Keep only alphanumeric, spaces, underscores, hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/[-_]+/g, '-') // Collapse multiple hyphens/underscores\n .replace(/^[-_]+|[-_]+$/g, '') // Trim leading/trailing hyphens/underscores\n .substring(0, 100); // Limit length for URL safety\n}\n","// Template renderer compatible with Cloudflare Workers\n// No filesystem access available\n\ninterface TemplateData {\n [key: string]: any\n}\n\nexport class TemplateRenderer {\n private templateCache = new Map()\n\n constructor() {\n // Cloudflare Workers compatible - no filesystem access\n }\n\n /**\n * Simple Handlebars-like template engine\n */\n private renderTemplate(template: string, data: TemplateData): string {\n let rendered = template\n\n // Handle each loops - process outermost loops first for proper nesting\n rendered = rendered.replace(/\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g, (_match, arrayName, content) => {\n const array = this.getNestedValue(data, arrayName.trim())\n if (!Array.isArray(array)) return ''\n \n return array.map((item, index) => {\n // Create context with array item and special variables\n const itemContext = {\n ...data,\n // Handle primitive items (for {{.}} syntax)\n '.': item,\n // Spread item properties if it's an object\n ...(typeof item === 'object' && item !== null ? item : {}),\n '@index': index,\n '@first': index === 0,\n '@last': index === array.length - 1\n }\n return this.renderTemplate(content, itemContext)\n }).join('')\n })\n\n // Second pass: Handle conditionals\n let ifCount = 0\n while (rendered.includes('{{#if ') && ifCount < 100) {\n const previousRendered = rendered\n rendered = rendered.replace(/\\{\\{#if\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (_match, condition, content) => {\n const value = this.getNestedValue(data, condition.trim())\n // Handle boolean values properly - @first/@last are explicitly boolean\n const isTruthy = value === true || (value && value !== 0 && value !== '' && value !== null && value !== undefined)\n return isTruthy ? this.renderTemplate(content, data) : ''\n })\n if (previousRendered === rendered) break\n ifCount++\n }\n\n // Third pass: Handle triple braces for raw HTML {{{variable}}}\n rendered = rendered.replace(/\\{\\{\\{([^}]+)\\}\\}\\}/g, (_match, variable) => {\n const value = this.getNestedValue(data, variable.trim())\n return value !== undefined && value !== null ? String(value) : ''\n })\n\n // Fourth pass: Handle helper functions like {{titleCase field}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\s+([^}]+)\\}\\}/g, (match, helper, variable) => {\n const helperName = helper.trim()\n const varName = variable.trim()\n \n if (helperName === 'titleCase') {\n const value = this.getNestedValue(data, varName)\n if (value !== undefined && value !== null) {\n return this.titleCase(String(value))\n }\n }\n \n return match // Return original if helper not found\n })\n\n // Final pass: Handle simple variables {{variable}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\}\\}/g, (match, variable) => {\n const trimmed = variable.trim()\n \n // Skip if it's a helper function (has spaces)\n if (trimmed.includes(' ')) {\n return match\n }\n \n const value = this.getNestedValue(data, trimmed)\n if (value === null) return ''\n if (value === undefined) return ''\n return String(value)\n })\n\n return rendered\n }\n\n /**\n * Get nested value from object using dot notation\n */\n private getNestedValue(obj: any, path: string): any {\n if (!obj || path === '') return undefined\n \n return path.split('.').reduce((current, key) => {\n if (current === null || current === undefined) return undefined\n return current[key]\n }, obj)\n }\n\n /**\n * Title case helper function\n */\n private titleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, l => l.toUpperCase())\n }\n\n /**\n * Render a template string with data\n */\n render(template: string, data: TemplateData = {}): string {\n return this.renderTemplate(template, data)\n }\n\n /**\n * Clear template cache (useful for development)\n */\n clearCache(): void {\n this.templateCache.clear()\n }\n}\n\n// Export singleton instance\nexport const templateRenderer = new TemplateRenderer()\n\n// Utility function to render template strings directly\nexport function renderTemplate(template: string, data: TemplateData = {}): string {\n return templateRenderer.render(template, data)\n}","/**\n * Query Filter Builder for SonicJS AI\n * Supports comprehensive filtering with AND/OR logic\n * Compatible with D1 Database (SQLite)\n */\n\nexport type FilterOperator =\n | 'equals'\n | 'not_equals'\n | 'greater_than'\n | 'greater_than_equal'\n | 'less_than'\n | 'less_than_equal'\n | 'like'\n | 'contains'\n | 'starts_with'\n | 'ends_with'\n | 'in'\n | 'not_in'\n | 'all'\n | 'exists'\n | 'near'\n | 'within'\n | 'intersects'\n\nconst VALID_FILTER_OPERATORS: ReadonlySet = new Set([\n 'equals',\n 'not_equals',\n 'greater_than',\n 'greater_than_equal',\n 'less_than',\n 'less_than_equal',\n 'like',\n 'contains',\n 'starts_with',\n 'ends_with',\n 'in',\n 'not_in',\n 'all',\n 'exists',\n 'near',\n 'within',\n 'intersects'\n])\n\nexport interface FilterCondition {\n field: string\n operator: FilterOperator\n value: any\n}\n\nexport interface FilterGroup {\n and?: FilterCondition[]\n or?: FilterCondition[]\n}\n\nexport interface QueryFilter {\n where?: FilterGroup\n limit?: number\n offset?: number\n sort?: {\n field: string\n order: 'asc' | 'desc'\n }[]\n}\n\nexport interface QueryResult {\n sql: string\n params: any[]\n errors: string[]\n}\n\n/**\n * Validate sort order value - only 'asc' or 'desc' are allowed.\n * Returns the validated lowercase value, defaulting to 'asc' for invalid input.\n */\nexport function validateSortOrder(order: any): 'asc' | 'desc' {\n if (typeof order === 'string') {\n const normalized = order.toLowerCase().trim()\n if (normalized === 'asc' || normalized === 'desc') {\n return normalized\n }\n }\n return 'asc'\n}\n\n/**\n * Query Filter Builder\n * Converts filter objects into SQL WHERE clauses with parameterized queries\n */\nexport class QueryFilterBuilder {\n private params: any[] = []\n private errors: string[] = []\n\n /**\n * Build a complete SQL query from filter object\n */\n build(baseTable: string, filter: QueryFilter): QueryResult {\n this.params = []\n this.errors = []\n\n let sql = `SELECT * FROM ${baseTable}`\n\n // Build WHERE clause\n if (filter.where) {\n const whereClause = this.buildWhereClause(filter.where)\n if (whereClause) {\n sql += ` WHERE ${whereClause}`\n }\n }\n\n // Build ORDER BY clause\n if (filter.sort && filter.sort.length > 0) {\n const orderClauses = filter.sort\n .map(s => `${this.sanitizeFieldName(s.field)} ${this.sanitizeSortOrder(s.order)}`)\n .join(', ')\n sql += ` ORDER BY ${orderClauses}`\n }\n\n // Build LIMIT clause\n if (filter.limit) {\n sql += ` LIMIT ?`\n this.params.push(filter.limit)\n }\n\n // Build OFFSET clause\n if (filter.offset) {\n sql += ` OFFSET ?`\n this.params.push(filter.offset)\n }\n\n return {\n sql,\n params: this.params,\n errors: this.errors\n }\n }\n\n /**\n * Build WHERE clause from filter group\n */\n private buildWhereClause(group: FilterGroup): string {\n const clauses: string[] = []\n\n // Handle AND conditions\n if (group.and && group.and.length > 0) {\n const andClauses = group.and\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (andClauses.length > 0) {\n clauses.push(`(${andClauses.join(' AND ')})`)\n }\n }\n\n // Handle OR conditions\n if (group.or && group.or.length > 0) {\n const orClauses = group.or\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (orClauses.length > 0) {\n clauses.push(`(${orClauses.join(' OR ')})`)\n }\n }\n\n return clauses.join(' AND ')\n }\n\n /**\n * Build a single condition\n */\n private buildCondition(condition: FilterCondition): string | null {\n const field = this.sanitizeFieldName(condition.field)\n\n switch (condition.operator) {\n case 'equals':\n return this.buildEquals(field, condition.value)\n\n case 'not_equals':\n return this.buildNotEquals(field, condition.value)\n\n case 'greater_than':\n return this.buildComparison(field, '>', condition.value)\n\n case 'greater_than_equal':\n return this.buildComparison(field, '>=', condition.value)\n\n case 'less_than':\n return this.buildComparison(field, '<', condition.value)\n\n case 'less_than_equal':\n return this.buildComparison(field, '<=', condition.value)\n\n case 'like':\n return this.buildLike(field, condition.value)\n\n case 'contains':\n return this.buildContains(field, condition.value)\n\n case 'starts_with':\n return this.buildStartsWith(field, condition.value)\n\n case 'ends_with':\n return this.buildEndsWith(field, condition.value)\n\n case 'in':\n return this.buildIn(field, condition.value)\n\n case 'not_in':\n return this.buildNotIn(field, condition.value)\n\n case 'all':\n return this.buildAll(field, condition.value)\n\n case 'exists':\n return this.buildExists(field, condition.value)\n\n case 'near':\n this.errors.push(`'near' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'within':\n this.errors.push(`'within' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'intersects':\n this.errors.push(`'intersects' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n default:\n this.errors.push(`Unknown operator: ${condition.operator}`)\n return null\n }\n }\n\n /**\n * Build equals condition\n */\n private buildEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NULL`\n }\n this.params.push(value)\n return `${field} = ?`\n }\n\n /**\n * Build not equals condition\n */\n private buildNotEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NOT NULL`\n }\n this.params.push(value)\n return `${field} != ?`\n }\n\n /**\n * Build comparison condition (>, >=, <, <=)\n */\n private buildComparison(field: string, operator: string, value: any): string {\n this.params.push(value)\n return `${field} ${operator} ?`\n }\n\n /**\n * Build LIKE condition (case-insensitive, all words must be present)\n */\n private buildLike(field: string, value: string): string {\n const words = value.split(/\\s+/).filter(w => w.length > 0)\n\n if (words.length === 0) {\n return `1=1` // No-op condition\n }\n\n const conditions = words.map(word => {\n this.params.push(`%${word}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build CONTAINS condition (case-insensitive substring)\n */\n private buildContains(field: string, value: string): string {\n this.params.push(`%${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build STARTS_WITH condition (case-insensitive prefix match)\n */\n private buildStartsWith(field: string, value: string): string {\n this.params.push(`${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build ENDS_WITH condition (case-insensitive suffix match)\n */\n private buildEndsWith(field: string, value: string): string {\n this.params.push(`%${value}`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build IN condition\n */\n private buildIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=0` // No values means no matches\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} IN (${placeholders})`\n }\n\n /**\n * Build NOT IN condition\n */\n private buildNotIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1` // No values means all match\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} NOT IN (${placeholders})`\n }\n\n /**\n * Build ALL condition (value must contain all items in list)\n * For SQLite, we'll check if a JSON array contains all values\n */\n private buildAll(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1`\n }\n\n // For SQLite, check if field contains all values using JSON functions\n // This assumes the field is a JSON array or comma-separated string\n const conditions = values.map(val => {\n this.params.push(`%${val}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build EXISTS condition\n */\n private buildExists(field: string, value: boolean): string {\n if (value) {\n return `${field} IS NOT NULL AND ${field} != ''`\n } else {\n return `(${field} IS NULL OR ${field} = '')`\n }\n }\n\n /**\n * Sanitize field names to prevent SQL injection\n */\n private sanitizeFieldName(field: string): string {\n // Allow alphanumeric, underscores, dots (for JSON fields)\n const sanitized = field.replace(/[^a-zA-Z0-9_$.]/g, '')\n\n // Handle JSON field access (e.g., data.title -> json_extract(data, '$.title'))\n if (sanitized.includes('.')) {\n const [table, ...path] = sanitized.split('.')\n return `json_extract(${table}, '$.${path.join('.')}')`\n }\n\n return sanitized\n }\n\n /**\n * Sanitize sort order to prevent SQL injection\n * Only allows 'ASC' or 'DESC', defaults to 'ASC' for any other value\n */\n private sanitizeSortOrder(order: string): string {\n const normalized = String(order).toUpperCase().trim()\n if (normalized === 'ASC' || normalized === 'DESC') {\n return normalized\n }\n return 'ASC'\n }\n\n /**\n * Parse filter from query string\n */\n static parseFromQuery(query: Record): QueryFilter {\n const filter: QueryFilter = {}\n\n // Parse where clause from 'where' parameter (JSON string)\n if (query.where) {\n try {\n filter.where = typeof query.where === 'string'\n ? JSON.parse(query.where)\n : query.where\n } catch (e) {\n console.error('Failed to parse where clause:', e)\n }\n }\n\n // Initialize where clause if not present\n if (!filter.where) {\n filter.where = { and: [] }\n }\n if (!filter.where.and) {\n filter.where.and = []\n }\n\n // Parse simple field filters (status, collection_id, etc.)\n // These are convenience parameters that get converted to WHERE conditions\n const simpleFieldMappings: Record = {\n 'status': 'status',\n 'collection_id': 'collection_id'\n }\n\n for (const [queryParam, dbField] of Object.entries(simpleFieldMappings)) {\n if (query[queryParam]) {\n filter.where.and.push({\n field: dbField,\n operator: 'equals',\n value: query[queryParam]\n })\n }\n }\n\n // Parse bracket-syntax filters: filter[field][operator]=value or filter[field]=value\n const bracketFilterRegex = /^filter\\[([^\\]]+)\\](?:\\[([^\\]]+)\\])?$/\n for (const [key, rawValue] of Object.entries(query)) {\n const match = key.match(bracketFilterRegex)\n if (!match) continue\n\n const field = match[1]\n const operator = (match[2] || 'equals') as FilterOperator\n\n if (!field || !VALID_FILTER_OPERATORS.has(operator)) continue\n if (rawValue === undefined || rawValue === null) continue\n\n let value: any = rawValue\n if (operator === 'exists') {\n value = value === 'true' || value === true || value === '1' || value === 1\n }\n\n filter.where.and.push({ field, operator, value })\n }\n\n // Parse limit\n if (query.limit) {\n filter.limit = Math.min(parseInt(query.limit), 1000) // Max 1000\n }\n\n // Parse offset\n if (query.offset) {\n filter.offset = parseInt(query.offset)\n }\n\n // Parse sort\n if (query.sort) {\n try {\n const parsed = typeof query.sort === 'string'\n ? JSON.parse(query.sort)\n : query.sort\n // Validate and sanitize sort entries\n if (Array.isArray(parsed)) {\n filter.sort = parsed\n .filter((s: any) => s && typeof s.field === 'string')\n .map((s: any) => ({\n field: s.field,\n order: validateSortOrder(s.order)\n }))\n }\n } catch (e) {\n console.error('Failed to parse sort clause:', e)\n }\n }\n\n return filter\n }\n}\n\n/**\n * Helper function to build query from filter\n */\nexport function buildQuery(table: string, filter: QueryFilter): QueryResult {\n const builder = new QueryFilterBuilder()\n return builder.build(table, filter)\n}\n","{\n \"name\": \"@sonicjs-cms/core\",\n \"version\": \"2.18.1\",\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 },\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 \"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/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.0.5\",\n \"drizzle-orm\": \"^0.45.2\",\n \"eslint\": \"^9.39.2\",\n \"glob\": \"^10.5.0\",\n \"hono\": \"^4.12.18\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.5\",\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","import type { BlockDefinitions } from '../types/collection-config'\n\nexport type BlocksFieldConfig = {\n blocks: BlockDefinitions\n discriminator: string\n}\n\nexport function getBlocksFieldConfig(fieldOptions: any): BlocksFieldConfig | null {\n if (!fieldOptions || typeof fieldOptions !== 'object') return null\n\n const itemsConfig = fieldOptions.items && typeof fieldOptions.items === 'object'\n ? fieldOptions.items\n : null\n\n if (!itemsConfig || !itemsConfig.blocks || typeof itemsConfig.blocks !== 'object') {\n return null\n }\n\n const discriminator = typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n\n return {\n blocks: itemsConfig.blocks as BlockDefinitions,\n discriminator\n }\n}\n\nexport function parseBlocksValue(value: unknown, config: BlocksFieldConfig) {\n const errors: string[] = []\n let rawValue = value\n\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return { value: [] as any[], errors }\n }\n\n if (typeof rawValue === 'string') {\n try {\n rawValue = JSON.parse(rawValue)\n } catch {\n return { value: [] as any[], errors: ['Blocks value must be valid JSON'] }\n }\n }\n\n if (!Array.isArray(rawValue)) {\n return { value: [] as any[], errors: ['Blocks value must be an array'] }\n }\n\n const normalized = rawValue.map((item, index) => {\n if (!item || typeof item !== 'object') {\n errors.push(`Block #${index + 1} must be an object`)\n return null\n }\n\n if ((item as any).blockType && (item as any).data && typeof (item as any).data === 'object') {\n return { [config.discriminator]: (item as any).blockType, ...(item as any).data }\n }\n\n if (!(config.discriminator in (item as any))) {\n errors.push(`Block #${index + 1} is missing \"${config.discriminator}\"`)\n }\n\n return item as any\n }).filter((item) => item !== null)\n\n return { value: normalized, errors }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/utils/slug-utils.ts","../src/utils/template-renderer.ts","../src/utils/query-filter.ts","../package.json","../src/utils/version.ts","../src/utils/blocks.ts"],"names":[],"mappings":"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","file":"chunk-NDS4S4AG.js","sourcesContent":["/**\n * Slug generation utilities for creating URL-friendly slugs\n */\n\n/**\n * Generate URL-friendly slug from text\n * \n * Features:\n * - Converts to lowercase\n * - Handles accented characters (NFD normalization)\n * - Removes diacritics\n * - Keeps only alphanumeric, spaces, underscores, and hyphens\n * - Replaces spaces with hyphens\n * - Collapses multiple hyphens/underscores\n * - Trims leading/trailing hyphens/underscores\n * - Limits length to 100 characters\n * \n * @param text - Text to slugify\n * @returns URL-safe slug\n * \n * @example\n * generateSlug('Hello World!') // 'hello-world'\n * generateSlug('Café París 2024') // 'cafe-paris-2024'\n * generateSlug('Multiple Spaces') // 'multiple-spaces'\n */\nexport function generateSlug(text: string): string {\n if (!text) return '';\n \n return text\n .toLowerCase()\n .normalize('NFD') // Decompose combined characters (e.g., é -> e + ́)\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9\\s_-]/g, '') // Keep only alphanumeric, spaces, underscores, hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/[-_]+/g, '-') // Collapse multiple hyphens/underscores\n .replace(/^[-_]+|[-_]+$/g, '') // Trim leading/trailing hyphens/underscores\n .substring(0, 100); // Limit length for URL safety\n}\n","// Template renderer compatible with Cloudflare Workers\n// No filesystem access available\n\ninterface TemplateData {\n [key: string]: any\n}\n\nexport class TemplateRenderer {\n private templateCache = new Map()\n\n constructor() {\n // Cloudflare Workers compatible - no filesystem access\n }\n\n /**\n * Simple Handlebars-like template engine\n */\n private renderTemplate(template: string, data: TemplateData): string {\n let rendered = template\n\n // Handle each loops - process outermost loops first for proper nesting\n rendered = rendered.replace(/\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g, (_match, arrayName, content) => {\n const array = this.getNestedValue(data, arrayName.trim())\n if (!Array.isArray(array)) return ''\n \n return array.map((item, index) => {\n // Create context with array item and special variables\n const itemContext = {\n ...data,\n // Handle primitive items (for {{.}} syntax)\n '.': item,\n // Spread item properties if it's an object\n ...(typeof item === 'object' && item !== null ? item : {}),\n '@index': index,\n '@first': index === 0,\n '@last': index === array.length - 1\n }\n return this.renderTemplate(content, itemContext)\n }).join('')\n })\n\n // Second pass: Handle conditionals\n let ifCount = 0\n while (rendered.includes('{{#if ') && ifCount < 100) {\n const previousRendered = rendered\n rendered = rendered.replace(/\\{\\{#if\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (_match, condition, content) => {\n const value = this.getNestedValue(data, condition.trim())\n // Handle boolean values properly - @first/@last are explicitly boolean\n const isTruthy = value === true || (value && value !== 0 && value !== '' && value !== null && value !== undefined)\n return isTruthy ? this.renderTemplate(content, data) : ''\n })\n if (previousRendered === rendered) break\n ifCount++\n }\n\n // Third pass: Handle triple braces for raw HTML {{{variable}}}\n rendered = rendered.replace(/\\{\\{\\{([^}]+)\\}\\}\\}/g, (_match, variable) => {\n const value = this.getNestedValue(data, variable.trim())\n return value !== undefined && value !== null ? String(value) : ''\n })\n\n // Fourth pass: Handle helper functions like {{titleCase field}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\s+([^}]+)\\}\\}/g, (match, helper, variable) => {\n const helperName = helper.trim()\n const varName = variable.trim()\n \n if (helperName === 'titleCase') {\n const value = this.getNestedValue(data, varName)\n if (value !== undefined && value !== null) {\n return this.titleCase(String(value))\n }\n }\n \n return match // Return original if helper not found\n })\n\n // Final pass: Handle simple variables {{variable}}\n rendered = rendered.replace(/\\{\\{([^}#\\/]+)\\}\\}/g, (match, variable) => {\n const trimmed = variable.trim()\n \n // Skip if it's a helper function (has spaces)\n if (trimmed.includes(' ')) {\n return match\n }\n \n const value = this.getNestedValue(data, trimmed)\n if (value === null) return ''\n if (value === undefined) return ''\n return String(value)\n })\n\n return rendered\n }\n\n /**\n * Get nested value from object using dot notation\n */\n private getNestedValue(obj: any, path: string): any {\n if (!obj || path === '') return undefined\n \n return path.split('.').reduce((current, key) => {\n if (current === null || current === undefined) return undefined\n return current[key]\n }, obj)\n }\n\n /**\n * Title case helper function\n */\n private titleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, l => l.toUpperCase())\n }\n\n /**\n * Render a template string with data\n */\n render(template: string, data: TemplateData = {}): string {\n return this.renderTemplate(template, data)\n }\n\n /**\n * Clear template cache (useful for development)\n */\n clearCache(): void {\n this.templateCache.clear()\n }\n}\n\n// Export singleton instance\nexport const templateRenderer = new TemplateRenderer()\n\n// Utility function to render template strings directly\nexport function renderTemplate(template: string, data: TemplateData = {}): string {\n return templateRenderer.render(template, data)\n}","/**\n * Query Filter Builder for SonicJS AI\n * Supports comprehensive filtering with AND/OR logic\n * Compatible with D1 Database (SQLite)\n */\n\nexport type FilterOperator =\n | 'equals'\n | 'not_equals'\n | 'greater_than'\n | 'greater_than_equal'\n | 'less_than'\n | 'less_than_equal'\n | 'like'\n | 'contains'\n | 'starts_with'\n | 'ends_with'\n | 'in'\n | 'not_in'\n | 'all'\n | 'exists'\n | 'near'\n | 'within'\n | 'intersects'\n\nconst VALID_FILTER_OPERATORS: ReadonlySet = new Set([\n 'equals',\n 'not_equals',\n 'greater_than',\n 'greater_than_equal',\n 'less_than',\n 'less_than_equal',\n 'like',\n 'contains',\n 'starts_with',\n 'ends_with',\n 'in',\n 'not_in',\n 'all',\n 'exists',\n 'near',\n 'within',\n 'intersects'\n])\n\nexport interface FilterCondition {\n field: string\n operator: FilterOperator\n value: any\n}\n\nexport interface FilterGroup {\n and?: FilterCondition[]\n or?: FilterCondition[]\n}\n\nexport interface QueryFilter {\n where?: FilterGroup\n limit?: number\n offset?: number\n sort?: {\n field: string\n order: 'asc' | 'desc'\n }[]\n}\n\nexport interface QueryResult {\n sql: string\n params: any[]\n errors: string[]\n}\n\n/**\n * Validate sort order value - only 'asc' or 'desc' are allowed.\n * Returns the validated lowercase value, defaulting to 'asc' for invalid input.\n */\nexport function validateSortOrder(order: any): 'asc' | 'desc' {\n if (typeof order === 'string') {\n const normalized = order.toLowerCase().trim()\n if (normalized === 'asc' || normalized === 'desc') {\n return normalized\n }\n }\n return 'asc'\n}\n\n/**\n * Query Filter Builder\n * Converts filter objects into SQL WHERE clauses with parameterized queries\n */\nexport class QueryFilterBuilder {\n private params: any[] = []\n private errors: string[] = []\n\n /**\n * Build a complete SQL query from filter object\n */\n build(baseTable: string, filter: QueryFilter): QueryResult {\n this.params = []\n this.errors = []\n\n let sql = `SELECT * FROM ${baseTable}`\n\n // Build WHERE clause\n if (filter.where) {\n const whereClause = this.buildWhereClause(filter.where)\n if (whereClause) {\n sql += ` WHERE ${whereClause}`\n }\n }\n\n // Build ORDER BY clause\n if (filter.sort && filter.sort.length > 0) {\n const orderClauses = filter.sort\n .map(s => `${this.sanitizeFieldName(s.field)} ${this.sanitizeSortOrder(s.order)}`)\n .join(', ')\n sql += ` ORDER BY ${orderClauses}`\n }\n\n // Build LIMIT clause\n if (filter.limit) {\n sql += ` LIMIT ?`\n this.params.push(filter.limit)\n }\n\n // Build OFFSET clause\n if (filter.offset) {\n sql += ` OFFSET ?`\n this.params.push(filter.offset)\n }\n\n return {\n sql,\n params: this.params,\n errors: this.errors\n }\n }\n\n /**\n * Build WHERE clause from filter group\n */\n private buildWhereClause(group: FilterGroup): string {\n const clauses: string[] = []\n\n // Handle AND conditions\n if (group.and && group.and.length > 0) {\n const andClauses = group.and\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (andClauses.length > 0) {\n clauses.push(`(${andClauses.join(' AND ')})`)\n }\n }\n\n // Handle OR conditions\n if (group.or && group.or.length > 0) {\n const orClauses = group.or\n .map(condition => this.buildCondition(condition))\n .filter(clause => clause !== null)\n\n if (orClauses.length > 0) {\n clauses.push(`(${orClauses.join(' OR ')})`)\n }\n }\n\n return clauses.join(' AND ')\n }\n\n /**\n * Build a single condition\n */\n private buildCondition(condition: FilterCondition): string | null {\n const field = this.sanitizeFieldName(condition.field)\n\n switch (condition.operator) {\n case 'equals':\n return this.buildEquals(field, condition.value)\n\n case 'not_equals':\n return this.buildNotEquals(field, condition.value)\n\n case 'greater_than':\n return this.buildComparison(field, '>', condition.value)\n\n case 'greater_than_equal':\n return this.buildComparison(field, '>=', condition.value)\n\n case 'less_than':\n return this.buildComparison(field, '<', condition.value)\n\n case 'less_than_equal':\n return this.buildComparison(field, '<=', condition.value)\n\n case 'like':\n return this.buildLike(field, condition.value)\n\n case 'contains':\n return this.buildContains(field, condition.value)\n\n case 'starts_with':\n return this.buildStartsWith(field, condition.value)\n\n case 'ends_with':\n return this.buildEndsWith(field, condition.value)\n\n case 'in':\n return this.buildIn(field, condition.value)\n\n case 'not_in':\n return this.buildNotIn(field, condition.value)\n\n case 'all':\n return this.buildAll(field, condition.value)\n\n case 'exists':\n return this.buildExists(field, condition.value)\n\n case 'near':\n this.errors.push(`'near' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'within':\n this.errors.push(`'within' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n case 'intersects':\n this.errors.push(`'intersects' operator not supported in SQLite. Use spatial extension or application-level filtering.`)\n return null\n\n default:\n this.errors.push(`Unknown operator: ${condition.operator}`)\n return null\n }\n }\n\n /**\n * Build equals condition\n */\n private buildEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NULL`\n }\n this.params.push(value)\n return `${field} = ?`\n }\n\n /**\n * Build not equals condition\n */\n private buildNotEquals(field: string, value: any): string {\n if (value === null) {\n return `${field} IS NOT NULL`\n }\n this.params.push(value)\n return `${field} != ?`\n }\n\n /**\n * Build comparison condition (>, >=, <, <=)\n */\n private buildComparison(field: string, operator: string, value: any): string {\n this.params.push(value)\n return `${field} ${operator} ?`\n }\n\n /**\n * Build LIKE condition (case-insensitive, all words must be present)\n */\n private buildLike(field: string, value: string): string {\n const words = value.split(/\\s+/).filter(w => w.length > 0)\n\n if (words.length === 0) {\n return `1=1` // No-op condition\n }\n\n const conditions = words.map(word => {\n this.params.push(`%${word}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build CONTAINS condition (case-insensitive substring)\n */\n private buildContains(field: string, value: string): string {\n this.params.push(`%${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build STARTS_WITH condition (case-insensitive prefix match)\n */\n private buildStartsWith(field: string, value: string): string {\n this.params.push(`${value}%`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build ENDS_WITH condition (case-insensitive suffix match)\n */\n private buildEndsWith(field: string, value: string): string {\n this.params.push(`%${value}`)\n return `${field} LIKE ?`\n }\n\n /**\n * Build IN condition\n */\n private buildIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=0` // No values means no matches\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} IN (${placeholders})`\n }\n\n /**\n * Build NOT IN condition\n */\n private buildNotIn(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n // Parse comma-delimited string\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1` // No values means all match\n }\n\n const placeholders = values.map(v => {\n this.params.push(v)\n return '?'\n }).join(', ')\n\n return `${field} NOT IN (${placeholders})`\n }\n\n /**\n * Build ALL condition (value must contain all items in list)\n * For SQLite, we'll check if a JSON array contains all values\n */\n private buildAll(field: string, value: any): string {\n let values: any[]\n\n if (typeof value === 'string') {\n values = value.split(',').map(v => v.trim()).filter(v => v.length > 0)\n } else if (Array.isArray(value)) {\n values = value\n } else {\n values = [value]\n }\n\n if (values.length === 0) {\n return `1=1`\n }\n\n // For SQLite, check if field contains all values using JSON functions\n // This assumes the field is a JSON array or comma-separated string\n const conditions = values.map(val => {\n this.params.push(`%${val}%`)\n return `${field} LIKE ?`\n })\n\n return `(${conditions.join(' AND ')})`\n }\n\n /**\n * Build EXISTS condition\n */\n private buildExists(field: string, value: boolean): string {\n if (value) {\n return `${field} IS NOT NULL AND ${field} != ''`\n } else {\n return `(${field} IS NULL OR ${field} = '')`\n }\n }\n\n /**\n * Sanitize field names to prevent SQL injection\n */\n private sanitizeFieldName(field: string): string {\n // Allow alphanumeric, underscores, dots (for JSON fields)\n const sanitized = field.replace(/[^a-zA-Z0-9_$.]/g, '')\n\n // Handle JSON field access (e.g., data.title -> json_extract(data, '$.title'))\n if (sanitized.includes('.')) {\n const [table, ...path] = sanitized.split('.')\n return `json_extract(${table}, '$.${path.join('.')}')`\n }\n\n return sanitized\n }\n\n /**\n * Sanitize sort order to prevent SQL injection\n * Only allows 'ASC' or 'DESC', defaults to 'ASC' for any other value\n */\n private sanitizeSortOrder(order: string): string {\n const normalized = String(order).toUpperCase().trim()\n if (normalized === 'ASC' || normalized === 'DESC') {\n return normalized\n }\n return 'ASC'\n }\n\n /**\n * Parse filter from query string\n */\n static parseFromQuery(query: Record): QueryFilter {\n const filter: QueryFilter = {}\n\n // Parse where clause from 'where' parameter (JSON string)\n if (query.where) {\n try {\n filter.where = typeof query.where === 'string'\n ? JSON.parse(query.where)\n : query.where\n } catch (e) {\n console.error('Failed to parse where clause:', e)\n }\n }\n\n // Initialize where clause if not present\n if (!filter.where) {\n filter.where = { and: [] }\n }\n if (!filter.where.and) {\n filter.where.and = []\n }\n\n // Parse simple field filters (status, collection_id, etc.)\n // These are convenience parameters that get converted to WHERE conditions\n const simpleFieldMappings: Record = {\n 'status': 'status',\n 'collection_id': 'collection_id'\n }\n\n for (const [queryParam, dbField] of Object.entries(simpleFieldMappings)) {\n if (query[queryParam]) {\n filter.where.and.push({\n field: dbField,\n operator: 'equals',\n value: query[queryParam]\n })\n }\n }\n\n // Parse bracket-syntax filters: filter[field][operator]=value or filter[field]=value\n const bracketFilterRegex = /^filter\\[([^\\]]+)\\](?:\\[([^\\]]+)\\])?$/\n for (const [key, rawValue] of Object.entries(query)) {\n const match = key.match(bracketFilterRegex)\n if (!match) continue\n\n const field = match[1]\n const operator = (match[2] || 'equals') as FilterOperator\n\n if (!field || !VALID_FILTER_OPERATORS.has(operator)) continue\n if (rawValue === undefined || rawValue === null) continue\n\n let value: any = rawValue\n if (operator === 'exists') {\n value = value === 'true' || value === true || value === '1' || value === 1\n }\n\n filter.where.and.push({ field, operator, value })\n }\n\n // Parse limit\n if (query.limit) {\n filter.limit = Math.min(parseInt(query.limit), 1000) // Max 1000\n }\n\n // Parse offset\n if (query.offset) {\n filter.offset = parseInt(query.offset)\n }\n\n // Parse sort\n if (query.sort) {\n try {\n const parsed = typeof query.sort === 'string'\n ? JSON.parse(query.sort)\n : query.sort\n // Validate and sanitize sort entries\n if (Array.isArray(parsed)) {\n filter.sort = parsed\n .filter((s: any) => s && typeof s.field === 'string')\n .map((s: any) => ({\n field: s.field,\n order: validateSortOrder(s.order)\n }))\n }\n } catch (e) {\n console.error('Failed to parse sort clause:', e)\n }\n }\n\n return filter\n }\n}\n\n/**\n * Helper function to build query from filter\n */\nexport function buildQuery(table: string, filter: QueryFilter): QueryResult {\n const builder = new QueryFilterBuilder()\n return builder.build(table, filter)\n}\n","{\n \"name\": \"@sonicjs-cms/core\",\n \"version\": \"2.18.0\",\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 },\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 \"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/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.0.5\",\n \"drizzle-orm\": \"^0.45.2\",\n \"eslint\": \"^9.39.2\",\n \"glob\": \"^10.5.0\",\n \"hono\": \"^4.12.12\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.5\",\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","import type { BlockDefinitions } from '../types/collection-config'\n\nexport type BlocksFieldConfig = {\n blocks: BlockDefinitions\n discriminator: string\n}\n\nexport function getBlocksFieldConfig(fieldOptions: any): BlocksFieldConfig | null {\n if (!fieldOptions || typeof fieldOptions !== 'object') return null\n\n const itemsConfig = fieldOptions.items && typeof fieldOptions.items === 'object'\n ? fieldOptions.items\n : null\n\n if (!itemsConfig || !itemsConfig.blocks || typeof itemsConfig.blocks !== 'object') {\n return null\n }\n\n const discriminator = typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n\n return {\n blocks: itemsConfig.blocks as BlockDefinitions,\n discriminator\n }\n}\n\nexport function parseBlocksValue(value: unknown, config: BlocksFieldConfig) {\n const errors: string[] = []\n let rawValue = value\n\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return { value: [] as any[], errors }\n }\n\n if (typeof rawValue === 'string') {\n try {\n rawValue = JSON.parse(rawValue)\n } catch {\n return { value: [] as any[], errors: ['Blocks value must be valid JSON'] }\n }\n }\n\n if (!Array.isArray(rawValue)) {\n return { value: [] as any[], errors: ['Blocks value must be an array'] }\n }\n\n const normalized = rawValue.map((item, index) => {\n if (!item || typeof item !== 'object') {\n errors.push(`Block #${index + 1} must be an object`)\n return null\n }\n\n if ((item as any).blockType && (item as any).data && typeof (item as any).data === 'object') {\n return { [config.discriminator]: (item as any).blockType, ...(item as any).data }\n }\n\n if (!(config.discriminator in (item as any))) {\n errors.push(`Block #${index + 1} is missing \"${config.discriminator}\"`)\n }\n\n return item as any\n }).filter((item) => item !== null)\n\n return { value: normalized, errors }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-TFNTM3OA.js b/packages/core/dist/chunk-NGTBJJXZ.js similarity index 94% rename from packages/core/dist/chunk-TFNTM3OA.js rename to packages/core/dist/chunk-NGTBJJXZ.js index 25bf761f1..d1f3a342c 100644 --- a/packages/core/dist/chunk-TFNTM3OA.js +++ b/packages/core/dist/chunk-NGTBJJXZ.js @@ -4,9 +4,9 @@ import { __commonJS, __toESM } from './chunk-V4OQ3NZ2.js'; import { z } from 'zod'; import { Hono } from 'hono'; -// ../../node_modules/semver/internal/constants.js +// ../../../../node_modules/semver/internal/constants.js var require_constants = __commonJS({ - "../../node_modules/semver/internal/constants.js"(exports$1, module) { + "../../../../node_modules/semver/internal/constants.js"(exports$1, module) { var SEMVER_SPEC_VERSION = "2.0.0"; var MAX_LENGTH = 256; var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */ @@ -35,18 +35,18 @@ var require_constants = __commonJS({ } }); -// ../../node_modules/semver/internal/debug.js +// ../../../../node_modules/semver/internal/debug.js var require_debug = __commonJS({ - "../../node_modules/semver/internal/debug.js"(exports$1, module) { + "../../../../node_modules/semver/internal/debug.js"(exports$1, module) { var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => { }; module.exports = debug; } }); -// ../../node_modules/semver/internal/re.js +// ../../../../node_modules/semver/internal/re.js var require_re = __commonJS({ - "../../node_modules/semver/internal/re.js"(exports$1, module) { + "../../../../node_modules/semver/internal/re.js"(exports$1, module) { var { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, @@ -131,9 +131,9 @@ var require_re = __commonJS({ } }); -// ../../node_modules/semver/internal/parse-options.js +// ../../../../node_modules/semver/internal/parse-options.js var require_parse_options = __commonJS({ - "../../node_modules/semver/internal/parse-options.js"(exports$1, module) { + "../../../../node_modules/semver/internal/parse-options.js"(exports$1, module) { var looseOption = Object.freeze({ loose: true }); var emptyOpts = Object.freeze({}); var parseOptions = (options) => { @@ -149,9 +149,9 @@ var require_parse_options = __commonJS({ } }); -// ../../node_modules/semver/internal/identifiers.js +// ../../../../node_modules/semver/internal/identifiers.js var require_identifiers = __commonJS({ - "../../node_modules/semver/internal/identifiers.js"(exports$1, module) { + "../../../../node_modules/semver/internal/identifiers.js"(exports$1, module) { var numeric = /^[0-9]+$/; var compareIdentifiers = (a, b) => { if (typeof a === "number" && typeof b === "number") { @@ -173,9 +173,9 @@ var require_identifiers = __commonJS({ } }); -// ../../node_modules/semver/classes/semver.js +// ../../../../node_modules/semver/classes/semver.js var require_semver = __commonJS({ - "../../node_modules/semver/classes/semver.js"(exports$1, module) { + "../../../../node_modules/semver/classes/semver.js"(exports$1, module) { var debug = require_debug(); var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants(); var { safeRe: re, t } = require_re(); @@ -451,9 +451,9 @@ var require_semver = __commonJS({ } }); -// ../../node_modules/semver/functions/parse.js +// ../../../../node_modules/semver/functions/parse.js var require_parse = __commonJS({ - "../../node_modules/semver/functions/parse.js"(exports$1, module) { + "../../../../node_modules/semver/functions/parse.js"(exports$1, module) { var SemVer = require_semver(); var parse = (version, options, throwErrors = false) => { if (version instanceof SemVer) { @@ -472,9 +472,9 @@ var require_parse = __commonJS({ } }); -// ../../node_modules/semver/functions/valid.js +// ../../../../node_modules/semver/functions/valid.js var require_valid = __commonJS({ - "../../node_modules/semver/functions/valid.js"(exports$1, module) { + "../../../../node_modules/semver/functions/valid.js"(exports$1, module) { var parse = require_parse(); var valid = (version, options) => { const v = parse(version, options); @@ -484,9 +484,9 @@ var require_valid = __commonJS({ } }); -// ../../node_modules/semver/functions/clean.js +// ../../../../node_modules/semver/functions/clean.js var require_clean = __commonJS({ - "../../node_modules/semver/functions/clean.js"(exports$1, module) { + "../../../../node_modules/semver/functions/clean.js"(exports$1, module) { var parse = require_parse(); var clean = (version, options) => { const s = parse(version.trim().replace(/^[=v]+/, ""), options); @@ -496,9 +496,9 @@ var require_clean = __commonJS({ } }); -// ../../node_modules/semver/functions/inc.js +// ../../../../node_modules/semver/functions/inc.js var require_inc = __commonJS({ - "../../node_modules/semver/functions/inc.js"(exports$1, module) { + "../../../../node_modules/semver/functions/inc.js"(exports$1, module) { var SemVer = require_semver(); var inc = (version, release, options, identifier, identifierBase) => { if (typeof options === "string") { @@ -519,9 +519,9 @@ var require_inc = __commonJS({ } }); -// ../../node_modules/semver/functions/diff.js +// ../../../../node_modules/semver/functions/diff.js var require_diff = __commonJS({ - "../../node_modules/semver/functions/diff.js"(exports$1, module) { + "../../../../node_modules/semver/functions/diff.js"(exports$1, module) { var parse = require_parse(); var diff = (version1, version2) => { const v1 = parse(version1, null, true); @@ -562,36 +562,36 @@ var require_diff = __commonJS({ } }); -// ../../node_modules/semver/functions/major.js +// ../../../../node_modules/semver/functions/major.js var require_major = __commonJS({ - "../../node_modules/semver/functions/major.js"(exports$1, module) { + "../../../../node_modules/semver/functions/major.js"(exports$1, module) { var SemVer = require_semver(); var major = (a, loose) => new SemVer(a, loose).major; module.exports = major; } }); -// ../../node_modules/semver/functions/minor.js +// ../../../../node_modules/semver/functions/minor.js var require_minor = __commonJS({ - "../../node_modules/semver/functions/minor.js"(exports$1, module) { + "../../../../node_modules/semver/functions/minor.js"(exports$1, module) { var SemVer = require_semver(); var minor = (a, loose) => new SemVer(a, loose).minor; module.exports = minor; } }); -// ../../node_modules/semver/functions/patch.js +// ../../../../node_modules/semver/functions/patch.js var require_patch = __commonJS({ - "../../node_modules/semver/functions/patch.js"(exports$1, module) { + "../../../../node_modules/semver/functions/patch.js"(exports$1, module) { var SemVer = require_semver(); var patch = (a, loose) => new SemVer(a, loose).patch; module.exports = patch; } }); -// ../../node_modules/semver/functions/prerelease.js +// ../../../../node_modules/semver/functions/prerelease.js var require_prerelease = __commonJS({ - "../../node_modules/semver/functions/prerelease.js"(exports$1, module) { + "../../../../node_modules/semver/functions/prerelease.js"(exports$1, module) { var parse = require_parse(); var prerelease = (version, options) => { const parsed = parse(version, options); @@ -601,36 +601,36 @@ var require_prerelease = __commonJS({ } }); -// ../../node_modules/semver/functions/compare.js +// ../../../../node_modules/semver/functions/compare.js var require_compare = __commonJS({ - "../../node_modules/semver/functions/compare.js"(exports$1, module) { + "../../../../node_modules/semver/functions/compare.js"(exports$1, module) { var SemVer = require_semver(); var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose)); module.exports = compare; } }); -// ../../node_modules/semver/functions/rcompare.js +// ../../../../node_modules/semver/functions/rcompare.js var require_rcompare = __commonJS({ - "../../node_modules/semver/functions/rcompare.js"(exports$1, module) { + "../../../../node_modules/semver/functions/rcompare.js"(exports$1, module) { var compare = require_compare(); var rcompare = (a, b, loose) => compare(b, a, loose); module.exports = rcompare; } }); -// ../../node_modules/semver/functions/compare-loose.js +// ../../../../node_modules/semver/functions/compare-loose.js var require_compare_loose = __commonJS({ - "../../node_modules/semver/functions/compare-loose.js"(exports$1, module) { + "../../../../node_modules/semver/functions/compare-loose.js"(exports$1, module) { var compare = require_compare(); var compareLoose = (a, b) => compare(a, b, true); module.exports = compareLoose; } }); -// ../../node_modules/semver/functions/compare-build.js +// ../../../../node_modules/semver/functions/compare-build.js var require_compare_build = __commonJS({ - "../../node_modules/semver/functions/compare-build.js"(exports$1, module) { + "../../../../node_modules/semver/functions/compare-build.js"(exports$1, module) { var SemVer = require_semver(); var compareBuild = (a, b, loose) => { const versionA = new SemVer(a, loose); @@ -641,81 +641,81 @@ var require_compare_build = __commonJS({ } }); -// ../../node_modules/semver/functions/sort.js +// ../../../../node_modules/semver/functions/sort.js var require_sort = __commonJS({ - "../../node_modules/semver/functions/sort.js"(exports$1, module) { + "../../../../node_modules/semver/functions/sort.js"(exports$1, module) { var compareBuild = require_compare_build(); var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)); module.exports = sort; } }); -// ../../node_modules/semver/functions/rsort.js +// ../../../../node_modules/semver/functions/rsort.js var require_rsort = __commonJS({ - "../../node_modules/semver/functions/rsort.js"(exports$1, module) { + "../../../../node_modules/semver/functions/rsort.js"(exports$1, module) { var compareBuild = require_compare_build(); var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)); module.exports = rsort; } }); -// ../../node_modules/semver/functions/gt.js +// ../../../../node_modules/semver/functions/gt.js var require_gt = __commonJS({ - "../../node_modules/semver/functions/gt.js"(exports$1, module) { + "../../../../node_modules/semver/functions/gt.js"(exports$1, module) { var compare = require_compare(); var gt = (a, b, loose) => compare(a, b, loose) > 0; module.exports = gt; } }); -// ../../node_modules/semver/functions/lt.js +// ../../../../node_modules/semver/functions/lt.js var require_lt = __commonJS({ - "../../node_modules/semver/functions/lt.js"(exports$1, module) { + "../../../../node_modules/semver/functions/lt.js"(exports$1, module) { var compare = require_compare(); var lt = (a, b, loose) => compare(a, b, loose) < 0; module.exports = lt; } }); -// ../../node_modules/semver/functions/eq.js +// ../../../../node_modules/semver/functions/eq.js var require_eq = __commonJS({ - "../../node_modules/semver/functions/eq.js"(exports$1, module) { + "../../../../node_modules/semver/functions/eq.js"(exports$1, module) { var compare = require_compare(); var eq = (a, b, loose) => compare(a, b, loose) === 0; module.exports = eq; } }); -// ../../node_modules/semver/functions/neq.js +// ../../../../node_modules/semver/functions/neq.js var require_neq = __commonJS({ - "../../node_modules/semver/functions/neq.js"(exports$1, module) { + "../../../../node_modules/semver/functions/neq.js"(exports$1, module) { var compare = require_compare(); var neq = (a, b, loose) => compare(a, b, loose) !== 0; module.exports = neq; } }); -// ../../node_modules/semver/functions/gte.js +// ../../../../node_modules/semver/functions/gte.js var require_gte = __commonJS({ - "../../node_modules/semver/functions/gte.js"(exports$1, module) { + "../../../../node_modules/semver/functions/gte.js"(exports$1, module) { var compare = require_compare(); var gte = (a, b, loose) => compare(a, b, loose) >= 0; module.exports = gte; } }); -// ../../node_modules/semver/functions/lte.js +// ../../../../node_modules/semver/functions/lte.js var require_lte = __commonJS({ - "../../node_modules/semver/functions/lte.js"(exports$1, module) { + "../../../../node_modules/semver/functions/lte.js"(exports$1, module) { var compare = require_compare(); var lte = (a, b, loose) => compare(a, b, loose) <= 0; module.exports = lte; } }); -// ../../node_modules/semver/functions/cmp.js +// ../../../../node_modules/semver/functions/cmp.js var require_cmp = __commonJS({ - "../../node_modules/semver/functions/cmp.js"(exports$1, module) { + "../../../../node_modules/semver/functions/cmp.js"(exports$1, module) { var eq = require_eq(); var neq = require_neq(); var gt = require_gt(); @@ -762,9 +762,9 @@ var require_cmp = __commonJS({ } }); -// ../../node_modules/semver/functions/coerce.js +// ../../../../node_modules/semver/functions/coerce.js var require_coerce = __commonJS({ - "../../node_modules/semver/functions/coerce.js"(exports$1, module) { + "../../../../node_modules/semver/functions/coerce.js"(exports$1, module) { var SemVer = require_semver(); var parse = require_parse(); var { safeRe: re, t } = require_re(); @@ -807,9 +807,9 @@ var require_coerce = __commonJS({ } }); -// ../../node_modules/semver/internal/lrucache.js +// ../../../../node_modules/semver/internal/lrucache.js var require_lrucache = __commonJS({ - "../../node_modules/semver/internal/lrucache.js"(exports$1, module) { + "../../../../node_modules/semver/internal/lrucache.js"(exports$1, module) { var LRUCache = class { constructor() { this.max = 1e3; @@ -844,9 +844,9 @@ var require_lrucache = __commonJS({ } }); -// ../../node_modules/semver/classes/range.js +// ../../../../node_modules/semver/classes/range.js var require_range = __commonJS({ - "../../node_modules/semver/classes/range.js"(exports$1, module) { + "../../../../node_modules/semver/classes/range.js"(exports$1, module) { var SPACE_CHARACTERS = /\s+/g; var Range = class _Range { constructor(range, options) { @@ -1220,9 +1220,9 @@ var require_range = __commonJS({ } }); -// ../../node_modules/semver/classes/comparator.js +// ../../../../node_modules/semver/classes/comparator.js var require_comparator = __commonJS({ - "../../node_modules/semver/classes/comparator.js"(exports$1, module) { + "../../../../node_modules/semver/classes/comparator.js"(exports$1, module) { var ANY = Symbol("SemVer ANY"); var Comparator = class _Comparator { static get ANY() { @@ -1332,9 +1332,9 @@ var require_comparator = __commonJS({ } }); -// ../../node_modules/semver/functions/satisfies.js +// ../../../../node_modules/semver/functions/satisfies.js var require_satisfies = __commonJS({ - "../../node_modules/semver/functions/satisfies.js"(exports$1, module) { + "../../../../node_modules/semver/functions/satisfies.js"(exports$1, module) { var Range = require_range(); var satisfies = (version, range, options) => { try { @@ -1348,18 +1348,18 @@ var require_satisfies = __commonJS({ } }); -// ../../node_modules/semver/ranges/to-comparators.js +// ../../../../node_modules/semver/ranges/to-comparators.js var require_to_comparators = __commonJS({ - "../../node_modules/semver/ranges/to-comparators.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/to-comparators.js"(exports$1, module) { var Range = require_range(); var toComparators = (range, options) => new Range(range, options).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" ")); module.exports = toComparators; } }); -// ../../node_modules/semver/ranges/max-satisfying.js +// ../../../../node_modules/semver/ranges/max-satisfying.js var require_max_satisfying = __commonJS({ - "../../node_modules/semver/ranges/max-satisfying.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/max-satisfying.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var maxSatisfying = (versions, range, options) => { @@ -1385,9 +1385,9 @@ var require_max_satisfying = __commonJS({ } }); -// ../../node_modules/semver/ranges/min-satisfying.js +// ../../../../node_modules/semver/ranges/min-satisfying.js var require_min_satisfying = __commonJS({ - "../../node_modules/semver/ranges/min-satisfying.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/min-satisfying.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var minSatisfying = (versions, range, options) => { @@ -1413,9 +1413,9 @@ var require_min_satisfying = __commonJS({ } }); -// ../../node_modules/semver/ranges/min-version.js +// ../../../../node_modules/semver/ranges/min-version.js var require_min_version = __commonJS({ - "../../node_modules/semver/ranges/min-version.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/min-version.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var gt = require_gt(); @@ -1471,9 +1471,9 @@ var require_min_version = __commonJS({ } }); -// ../../node_modules/semver/ranges/valid.js +// ../../../../node_modules/semver/ranges/valid.js var require_valid2 = __commonJS({ - "../../node_modules/semver/ranges/valid.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/valid.js"(exports$1, module) { var Range = require_range(); var validRange = (range, options) => { try { @@ -1486,9 +1486,9 @@ var require_valid2 = __commonJS({ } }); -// ../../node_modules/semver/ranges/outside.js +// ../../../../node_modules/semver/ranges/outside.js var require_outside = __commonJS({ - "../../node_modules/semver/ranges/outside.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/outside.js"(exports$1, module) { var SemVer = require_semver(); var Comparator = require_comparator(); var { ANY } = Comparator; @@ -1554,27 +1554,27 @@ var require_outside = __commonJS({ } }); -// ../../node_modules/semver/ranges/gtr.js +// ../../../../node_modules/semver/ranges/gtr.js var require_gtr = __commonJS({ - "../../node_modules/semver/ranges/gtr.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/gtr.js"(exports$1, module) { var outside = require_outside(); var gtr = (version, range, options) => outside(version, range, ">", options); module.exports = gtr; } }); -// ../../node_modules/semver/ranges/ltr.js +// ../../../../node_modules/semver/ranges/ltr.js var require_ltr = __commonJS({ - "../../node_modules/semver/ranges/ltr.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/ltr.js"(exports$1, module) { var outside = require_outside(); var ltr = (version, range, options) => outside(version, range, "<", options); module.exports = ltr; } }); -// ../../node_modules/semver/ranges/intersects.js +// ../../../../node_modules/semver/ranges/intersects.js var require_intersects = __commonJS({ - "../../node_modules/semver/ranges/intersects.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/intersects.js"(exports$1, module) { var Range = require_range(); var intersects = (r1, r2, options) => { r1 = new Range(r1, options); @@ -1585,9 +1585,9 @@ var require_intersects = __commonJS({ } }); -// ../../node_modules/semver/ranges/simplify.js +// ../../../../node_modules/semver/ranges/simplify.js var require_simplify = __commonJS({ - "../../node_modules/semver/ranges/simplify.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/simplify.js"(exports$1, module) { var satisfies = require_satisfies(); var compare = require_compare(); module.exports = (versions, range, options) => { @@ -1634,9 +1634,9 @@ var require_simplify = __commonJS({ } }); -// ../../node_modules/semver/ranges/subset.js +// ../../../../node_modules/semver/ranges/subset.js var require_subset = __commonJS({ - "../../node_modules/semver/ranges/subset.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/subset.js"(exports$1, module) { var Range = require_range(); var Comparator = require_comparator(); var { ANY } = Comparator; @@ -1795,9 +1795,9 @@ var require_subset = __commonJS({ } }); -// ../../node_modules/semver/index.js +// ../../../../node_modules/semver/index.js var require_semver2 = __commonJS({ - "../../node_modules/semver/index.js"(exports$1, module) { + "../../../../node_modules/semver/index.js"(exports$1, module) { var internalRe = require_re(); var constants = require_constants(); var SemVer = require_semver(); @@ -3171,5 +3171,5 @@ new PluginBuilder({ }).build(); export { HookSystemImpl, HookUtils, PluginManager, PluginRegistryImpl, PluginValidator, ScopedHookSystem, createTurnstileMiddleware, verifyTurnstile }; -//# sourceMappingURL=chunk-TFNTM3OA.js.map -//# sourceMappingURL=chunk-TFNTM3OA.js.map \ No newline at end of file +//# sourceMappingURL=chunk-NGTBJJXZ.js.map +//# sourceMappingURL=chunk-NGTBJJXZ.js.map \ No newline at end of file diff --git a/packages/core/dist/chunk-NGTBJJXZ.js.map b/packages/core/dist/chunk-NGTBJJXZ.js.map new file mode 100644 index 000000000..412ad83b5 --- /dev/null +++ b/packages/core/dist/chunk-NGTBJJXZ.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../../../node_modules/semver/internal/constants.js","../../../../../node_modules/semver/internal/debug.js","../../../../../node_modules/semver/internal/re.js","../../../../../node_modules/semver/internal/parse-options.js","../../../../../node_modules/semver/internal/identifiers.js","../../../../../node_modules/semver/classes/semver.js","../../../../../node_modules/semver/functions/parse.js","../../../../../node_modules/semver/functions/valid.js","../../../../../node_modules/semver/functions/clean.js","../../../../../node_modules/semver/functions/inc.js","../../../../../node_modules/semver/functions/diff.js","../../../../../node_modules/semver/functions/major.js","../../../../../node_modules/semver/functions/minor.js","../../../../../node_modules/semver/functions/patch.js","../../../../../node_modules/semver/functions/prerelease.js","../../../../../node_modules/semver/functions/compare.js","../../../../../node_modules/semver/functions/rcompare.js","../../../../../node_modules/semver/functions/compare-loose.js","../../../../../node_modules/semver/functions/compare-build.js","../../../../../node_modules/semver/functions/sort.js","../../../../../node_modules/semver/functions/rsort.js","../../../../../node_modules/semver/functions/gt.js","../../../../../node_modules/semver/functions/lt.js","../../../../../node_modules/semver/functions/eq.js","../../../../../node_modules/semver/functions/neq.js","../../../../../node_modules/semver/functions/gte.js","../../../../../node_modules/semver/functions/lte.js","../../../../../node_modules/semver/functions/cmp.js","../../../../../node_modules/semver/functions/coerce.js","../../../../../node_modules/semver/internal/lrucache.js","../../../../../node_modules/semver/classes/range.js","../../../../../node_modules/semver/classes/comparator.js","../../../../../node_modules/semver/functions/satisfies.js","../../../../../node_modules/semver/ranges/to-comparators.js","../../../../../node_modules/semver/ranges/max-satisfying.js","../../../../../node_modules/semver/ranges/min-satisfying.js","../../../../../node_modules/semver/ranges/min-version.js","../../../../../node_modules/semver/ranges/valid.js","../../../../../node_modules/semver/ranges/outside.js","../../../../../node_modules/semver/ranges/gtr.js","../../../../../node_modules/semver/ranges/ltr.js","../../../../../node_modules/semver/ranges/intersects.js","../../../../../node_modules/semver/ranges/simplify.js","../../../../../node_modules/semver/ranges/subset.js","../../../../../node_modules/semver/index.js","../src/plugins/hook-system.ts","../src/plugins/plugin-validator.ts","../src/plugins/plugin-registry.ts","../src/plugins/plugin-manager.ts","../src/plugins/core-plugins/turnstile-plugin/middleware/verify.ts","../src/plugins/core-plugins/turnstile-plugin/index.ts"],"names":["exports","z","require_valid","require_semver","semver"],"mappings":"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","file":"chunk-NGTBJJXZ.js","sourcesContent":["'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a === b ? 0 : a < b ? -1 : 1\n }\n\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n if (this.major < other.major) {\n return -1\n }\n if (this.major > other.major) {\n return 1\n }\n if (this.minor < other.minor) {\n return -1\n }\n if (this.minor > other.minor) {\n return 1\n }\n if (this.patch < other.patch) {\n return -1\n }\n if (this.patch > other.patch) {\n return 1\n }\n return 0\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n comp = comp.replace(re[t.BUILD], '')\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","/**\n * Hook System Implementation\n * \n * Provides event-driven extensibility for plugins\n */\n\nimport { HookSystem, HookHandler, PluginHook, HookContext } from '../types'\n\nexport class HookSystemImpl implements HookSystem {\n private hooks: Map = new Map()\n private executing: Set = new Set()\n\n /**\n * Register a hook handler\n */\n register(hookName: string, handler: HookHandler, priority: number = 10): void {\n if (!this.hooks.has(hookName)) {\n this.hooks.set(hookName, [])\n }\n\n const hooks = this.hooks.get(hookName)!\n const hook: PluginHook = {\n name: hookName,\n handler,\n priority,\n }\n\n // Insert hook in priority order (lower priority = earlier execution)\n const insertIndex = hooks.findIndex(h => h.priority! > priority)\n if (insertIndex === -1) {\n hooks.push(hook)\n } else {\n hooks.splice(insertIndex, 0, hook)\n }\n\n console.debug(`Hook registered: ${hookName} (priority: ${priority})`)\n }\n\n /**\n * Execute all handlers for a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n const hooks = this.hooks.get(hookName)\n if (!hooks || hooks.length === 0) {\n return data\n }\n\n // Prevent infinite recursion\n if (this.executing.has(hookName)) {\n console.warn(`Hook recursion detected for: ${hookName}`)\n return data\n }\n\n this.executing.add(hookName)\n\n try {\n let result = data\n let cancelled = false\n\n const hookContext: HookContext = {\n plugin: '', // Will be set by the plugin manager\n context: context || {},\n cancel: () => { cancelled = true }\n }\n\n for (const hook of hooks) {\n if (cancelled) {\n console.debug(`Hook execution cancelled: ${hookName}`)\n break\n }\n\n try {\n console.debug(`Executing hook: ${hookName} (priority: ${hook.priority})`)\n result = await hook.handler(result, hookContext)\n } catch (error) {\n console.error(`Hook execution failed: ${hookName}`, error)\n // Continue executing other hooks unless it's a critical error\n if (error instanceof Error && error.message.includes('CRITICAL')) {\n throw error\n }\n }\n }\n\n return result\n } finally {\n this.executing.delete(hookName)\n }\n }\n\n /**\n * Remove a hook handler\n */\n unregister(hookName: string, handler: HookHandler): void {\n const hooks = this.hooks.get(hookName)\n if (!hooks) return\n\n const index = hooks.findIndex(h => h.handler === handler)\n if (index !== -1) {\n hooks.splice(index, 1)\n console.debug(`Hook unregistered: ${hookName}`)\n }\n\n // Clean up empty hook arrays\n if (hooks.length === 0) {\n this.hooks.delete(hookName)\n }\n }\n\n /**\n * Get all registered hooks for a name\n */\n getHooks(hookName: string): PluginHook[] {\n return this.hooks.get(hookName) || []\n }\n\n /**\n * Get all registered hook names\n */\n getHookNames(): string[] {\n return Array.from(this.hooks.keys())\n }\n\n /**\n * Get hook statistics\n */\n getStats(): { hookName: string; handlerCount: number }[] {\n return Array.from(this.hooks.entries()).map(([hookName, handlers]) => ({\n hookName,\n handlerCount: handlers.length\n }))\n }\n\n /**\n * Clear all hooks (useful for testing)\n */\n clear(): void {\n this.hooks.clear()\n this.executing.clear()\n }\n\n /**\n * Create a scoped hook system for a plugin\n */\n createScope(_pluginName: string): ScopedHookSystem {\n return new ScopedHookSystem(this)\n }\n}\n\n/**\n * Scoped hook system for individual plugins\n */\nexport class ScopedHookSystem {\n private registeredHooks: { hookName: string; handler: HookHandler }[] = []\n\n constructor(\n private parent: HookSystemImpl\n ) {}\n\n /**\n * Register a hook (scoped to this plugin)\n */\n register(hookName: string, handler: HookHandler, priority?: number): void {\n this.parent.register(hookName, handler, priority)\n this.registeredHooks.push({ hookName, handler })\n }\n\n /**\n * Execute a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n return this.parent.execute(hookName, data, context)\n }\n\n /**\n * Unregister a specific hook\n */\n unregister(hookName: string, handler: HookHandler): void {\n this.parent.unregister(hookName, handler)\n const index = this.registeredHooks.findIndex(\n h => h.hookName === hookName && h.handler === handler\n )\n if (index !== -1) {\n this.registeredHooks.splice(index, 1)\n }\n }\n\n /**\n * Unregister all hooks for this plugin\n */\n unregisterAll(): void {\n for (const { hookName, handler } of this.registeredHooks) {\n this.parent.unregister(hookName, handler)\n }\n this.registeredHooks.length = 0\n }\n\n /**\n * Get hooks registered by this plugin\n */\n getRegisteredHooks(): { hookName: string; handler: HookHandler }[] {\n return [...this.registeredHooks]\n }\n}\n\n/**\n * Hook utilities\n */\nexport class HookUtils {\n /**\n * Create a hook name with namespace\n */\n static createHookName(namespace: string, event: string): string {\n return `${namespace}:${event}`\n }\n\n /**\n * Parse a hook name to extract namespace and event\n */\n static parseHookName(hookName: string): { namespace: string; event: string } {\n const parts = hookName.split(':')\n return {\n namespace: parts[0] || '',\n event: parts.slice(1).join(':') || ''\n }\n }\n\n /**\n * Create a middleware that executes hooks\n */\n static createHookMiddleware(\n hookSystem: HookSystem,\n beforeHook?: string,\n afterHook?: string\n ) {\n return async (c: any, next: any) => {\n if (beforeHook) {\n const beforeData = { request: c.req, context: c }\n await hookSystem.execute(beforeHook, beforeData)\n }\n\n await next()\n\n if (afterHook) {\n const afterData = { request: c.req, response: c.res, context: c }\n await hookSystem.execute(afterHook, afterData)\n }\n }\n }\n\n /**\n * Create a debounced hook handler\n */\n static debounce(handler: HookHandler, delay: number): HookHandler {\n let timeoutId: any\n \n return async (data: any, context: HookContext) => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n return new Promise((resolve, reject) => {\n timeoutId = setTimeout(async () => {\n try {\n const result = await handler(data, context)\n resolve(result)\n } catch (error) {\n reject(error)\n }\n }, delay)\n })\n }\n }\n\n /**\n * Create a throttled hook handler\n */\n static throttle(handler: HookHandler, limit: number): HookHandler {\n let lastExecution = 0\n\n return async (data: any, context: HookContext) => {\n const now = Date.now()\n if (now - lastExecution >= limit) {\n lastExecution = now\n return handler(data, context)\n }\n return data\n }\n }\n}","/**\n * Plugin Validator\n * \n * Validates plugin definitions, dependencies, and compatibility\n */\n\nimport { z } from 'zod'\nimport { Plugin, PluginValidator as IPluginValidator, PluginValidationResult, PluginRegistry } from '../types'\nimport semver from 'semver'\n\n// Zod schemas for plugin validation\nconst PluginAuthorSchema = z.object({\n name: z.string().min(1),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n})\n\nconst PluginRoutesSchema = z.object({\n path: z.string().min(1),\n handler: z.any(), // Hono instance\n description: z.string().optional(),\n requiresAuth: z.boolean().optional(),\n roles: z.array(z.string()).optional(),\n priority: z.number().optional(),\n})\n\nconst PluginMiddlewareSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n description: z.string().optional(),\n priority: z.number().optional(),\n routes: z.array(z.string()).optional(),\n global: z.boolean().optional(),\n})\n\nconst PluginModelSchema = z.object({\n name: z.string().min(1),\n tableName: z.string().min(1),\n schema: z.any(), // Zod schema\n migrations: z.array(z.string()),\n relationships: z.array(z.object({\n type: z.enum(['oneToOne', 'oneToMany', 'manyToMany']),\n target: z.string(),\n foreignKey: z.string().optional(),\n joinTable: z.string().optional(),\n })).optional(),\n extendsContent: z.boolean().optional(),\n})\n\nconst PluginServiceSchema = z.object({\n name: z.string().min(1),\n implementation: z.any(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n singleton: z.boolean().optional(),\n})\n\nconst PluginAdminPageSchema = z.object({\n path: z.string().min(1),\n title: z.string().min(1),\n component: z.string().min(1),\n description: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n menuItem: z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n }).optional(),\n icon: z.string().optional(),\n})\n\nconst PluginComponentSchema = z.object({\n name: z.string().min(1),\n template: z.function(),\n description: z.string().optional(),\n propsSchema: z.any().optional(), // Zod schema\n})\n\nconst PluginHookSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n priority: z.number().optional(),\n description: z.string().optional(),\n})\n\nconst PluginSchema = z.object({\n name: z.string().min(1).regex(/^[a-z0-9-]+$/, 'Plugin name must be lowercase with hyphens'),\n version: z.string().refine(v => semver.valid(v), 'Version must be valid semver'),\n description: z.string().optional(),\n author: PluginAuthorSchema.optional(),\n dependencies: z.array(z.string()).optional(),\n compatibility: z.string().optional(),\n license: z.string().optional(),\n \n // Extension points\n routes: z.array(PluginRoutesSchema).optional(),\n middleware: z.array(PluginMiddlewareSchema).optional(),\n models: z.array(PluginModelSchema).optional(),\n services: z.array(PluginServiceSchema).optional(),\n adminPages: z.array(PluginAdminPageSchema).optional(),\n adminComponents: z.array(PluginComponentSchema).optional(),\n menuItems: z.array(z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n })).optional(),\n hooks: z.array(PluginHookSchema).optional(),\n \n // Lifecycle hooks\n install: z.function().optional(),\n uninstall: z.function().optional(),\n activate: z.function().optional(),\n deactivate: z.function().optional(),\n configure: z.function().optional(),\n})\n\nexport class PluginValidator implements IPluginValidator {\n private static readonly RESERVED_NAMES = [\n 'core', 'system', 'admin', 'api', 'auth', 'content', 'media', 'users', 'collections'\n ]\n\n private static readonly RESERVED_PATHS = [\n '/admin', '/api', '/auth', '/docs', '/media', '/_assets'\n ]\n\n /**\n * Validate plugin definition\n */\n validate(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n try {\n // Schema validation\n const result = PluginSchema.safeParse(plugin)\n if (!result.success) {\n result.error.issues.forEach((err: any) => {\n errors.push(`${err.path.join('.')}: ${err.message}`)\n })\n }\n\n // Reserved name validation\n if (PluginValidator.RESERVED_NAMES.includes(plugin.name)) {\n errors.push(`Plugin name \"${plugin.name}\" is reserved`)\n }\n\n // Route path validation\n if (plugin.routes) {\n for (const route of plugin.routes) {\n if (PluginValidator.RESERVED_PATHS.some(path => route.path.startsWith(path))) {\n errors.push(`Route path \"${route.path}\" conflicts with reserved system path`)\n }\n \n if (!route.path.startsWith('/')) {\n errors.push(`Route path \"${route.path}\" must start with /`)\n }\n }\n }\n\n // Model validation\n if (plugin.models) {\n const modelNames = new Set()\n const tableNames = new Set()\n \n for (const model of plugin.models) {\n // Check for duplicate model names\n if (modelNames.has(model.name)) {\n errors.push(`Duplicate model name: ${model.name}`)\n }\n modelNames.add(model.name)\n \n // Check for duplicate table names\n if (tableNames.has(model.tableName)) {\n errors.push(`Duplicate table name: ${model.tableName}`)\n }\n tableNames.add(model.tableName)\n \n // Validate table name format\n if (!/^[a-z][a-z0-9_]*$/.test(model.tableName)) {\n errors.push(`Invalid table name format: ${model.tableName}`)\n }\n \n // Check for system table conflicts\n const systemTables = ['users', 'collections', 'content', 'content_versions', 'media', 'api_tokens']\n if (systemTables.includes(model.tableName)) {\n errors.push(`Table name \"${model.tableName}\" conflicts with system table`)\n }\n }\n }\n\n // Service validation\n if (plugin.services) {\n const serviceNames = new Set()\n \n for (const service of plugin.services) {\n if (serviceNames.has(service.name)) {\n errors.push(`Duplicate service name: ${service.name}`)\n }\n serviceNames.add(service.name)\n \n // Check for system service conflicts\n const systemServices = ['auth', 'content', 'media', 'cdn']\n if (systemServices.includes(service.name)) {\n warnings.push(`Service name \"${service.name}\" conflicts with system service`)\n }\n }\n }\n\n // Admin page validation\n if (plugin.adminPages) {\n const pagePaths = new Set()\n \n for (const page of plugin.adminPages) {\n if (pagePaths.has(page.path)) {\n errors.push(`Duplicate admin page path: ${page.path}`)\n }\n pagePaths.add(page.path)\n \n if (!page.path.startsWith('/')) {\n errors.push(`Admin page path \"${page.path}\" must start with /`)\n }\n \n // Check for system admin page conflicts\n const systemPaths = ['/', '/collections', '/content', '/media', '/users', '/settings']\n if (systemPaths.includes(page.path)) {\n errors.push(`Admin page path \"${page.path}\" conflicts with system page`)\n }\n }\n }\n\n // Component validation\n if (plugin.adminComponents) {\n const componentNames = new Set()\n \n for (const component of plugin.adminComponents) {\n if (componentNames.has(component.name)) {\n errors.push(`Duplicate component name: ${component.name}`)\n }\n componentNames.add(component.name)\n \n // Check for system component conflicts\n const systemComponents = ['table', 'form', 'alert', 'media-grid', 'pagination']\n if (systemComponents.includes(component.name)) {\n warnings.push(`Component name \"${component.name}\" conflicts with system component`)\n }\n }\n }\n\n // Hook validation\n if (plugin.hooks) {\n for (const hook of plugin.hooks) {\n if (!hook.name.includes(':')) {\n warnings.push(`Hook name \"${hook.name}\" should include namespace (e.g., \"plugin:event\")`)\n }\n }\n }\n\n // Dependency cycle detection (basic)\n if (plugin.dependencies?.includes(plugin.name)) {\n errors.push(`Plugin cannot depend on itself`)\n }\n\n // License validation\n if (plugin.license) {\n const validLicenses = ['MIT', 'Apache-2.0', 'GPL-3.0', 'BSD-3-Clause', 'ISC']\n if (!validLicenses.includes(plugin.license)) {\n warnings.push(`License \"${plugin.license}\" is not a common SPDX identifier`)\n }\n }\n\n // Performance warnings\n if (plugin.middleware && plugin.middleware.length > 5) {\n warnings.push(`Plugin defines ${plugin.middleware.length} middleware functions, consider consolidating`)\n }\n\n if (plugin.hooks && plugin.hooks.length > 10) {\n warnings.push(`Plugin defines ${plugin.hooks.length} hooks, ensure they are necessary`)\n }\n\n } catch (error) {\n errors.push(`Validation error: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin dependencies\n */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.dependencies || plugin.dependencies.length === 0) {\n return { valid: true, errors, warnings }\n }\n\n // Check if all dependencies are registered\n for (const depName of plugin.dependencies) {\n if (!registry.has(depName)) {\n errors.push(`Dependency \"${depName}\" is not registered`)\n continue\n }\n\n const dependency = registry.get(depName)!\n \n // Check dependency version compatibility\n if (dependency.compatibility && plugin.compatibility) {\n if (!this.isCompatible(dependency.compatibility, plugin.compatibility)) {\n warnings.push(`Potential compatibility issue with dependency \"${depName}\"`)\n }\n }\n }\n\n // Check for circular dependencies\n const visited = new Set()\n const visiting = new Set()\n \n const checkCircular = (name: string): boolean => {\n if (visiting.has(name)) return true\n if (visited.has(name)) return false\n \n visiting.add(name)\n \n const current = registry.get(name)\n if (current?.dependencies) {\n for (const depName of current.dependencies) {\n if (checkCircular(depName)) {\n errors.push(`Circular dependency detected: ${name} -> ${depName}`)\n return true\n }\n }\n }\n \n visiting.delete(name)\n visited.add(name)\n return false\n }\n\n checkCircular(plugin.name)\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin compatibility with SonicJS version\n */\n validateCompatibility(plugin: Plugin, sonicVersion: string): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.compatibility) {\n warnings.push('Plugin does not specify compatibility version')\n return { valid: true, errors, warnings }\n }\n\n try {\n if (!semver.satisfies(sonicVersion, plugin.compatibility)) {\n errors.push(`Plugin requires SonicJS ${plugin.compatibility}, but current version is ${sonicVersion}`)\n }\n } catch (error) {\n errors.push(`Invalid compatibility version format: ${plugin.compatibility}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Check if two version ranges are compatible\n */\n private isCompatible(version1: string, version2: string): boolean {\n try {\n // Simple compatibility check - can be enhanced\n return semver.intersects(version1, version2)\n } catch {\n return false\n }\n }\n\n /**\n * Validate plugin security constraints\n */\n validateSecurity(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n // Check for potentially dangerous patterns\n const pluginCode = JSON.stringify(plugin)\n \n // Check for eval or Function constructor usage\n if (pluginCode.includes('eval(') || pluginCode.includes('Function(')) {\n errors.push('Plugin contains potentially dangerous code execution patterns')\n }\n\n // Check for file system access attempts\n if (pluginCode.includes('fs.') || pluginCode.includes('require(')) {\n warnings.push('Plugin may attempt file system access (not available in Cloudflare Workers)')\n }\n\n // Check for network access patterns\n if (pluginCode.includes('fetch(') || pluginCode.includes('XMLHttpRequest')) {\n warnings.push('Plugin contains network access code - ensure it follows security guidelines')\n }\n\n // Check for sensitive data patterns\n const sensitivePatterns = ['password', 'secret', 'key', 'token', 'credential']\n for (const pattern of sensitivePatterns) {\n if (pluginCode.toLowerCase().includes(pattern)) {\n warnings.push(`Plugin code contains \"${pattern}\" - ensure sensitive data is properly handled`)\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n}","/**\n * Plugin Registry Implementation\n * \n * Manages plugin registration, activation, and lifecycle\n */\n\nimport { Plugin, PluginRegistry, PluginConfig, PluginStatus } from '../types'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginRegistryImpl implements PluginRegistry {\n private plugins: Map = new Map()\n private configs: Map = new Map()\n private statuses: Map = new Map()\n private validator: PluginValidator\n\n constructor(validator?: PluginValidator) {\n this.validator = validator || new PluginValidator()\n }\n\n /**\n * Get plugin by name\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name)\n }\n\n /**\n * Get all registered plugins\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values())\n }\n\n /**\n * Get active plugins\n */\n getActive(): Plugin[] {\n return this.getAll().filter(plugin => {\n const status = this.statuses.get(plugin.name)\n return status?.active === true\n })\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise {\n console.info(`Registering plugin: ${plugin.name} v${plugin.version}`)\n\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed for ${plugin.name}: ${validation.errors.join(', ')}`)\n }\n\n // Check for conflicts\n if (this.plugins.has(plugin.name)) {\n const existingPlugin = this.plugins.get(plugin.name)!\n if (existingPlugin.version !== plugin.version) {\n console.warn(`Plugin ${plugin.name} is already registered with version ${existingPlugin.version}, replacing with ${plugin.version}`)\n }\n }\n\n // Validate dependencies\n const depValidation = this.validator.validateDependencies(plugin, this)\n if (!depValidation.valid) {\n throw new Error(`Plugin dependency validation failed for ${plugin.name}: ${depValidation.errors.join(', ')}`)\n }\n\n // Register plugin\n this.plugins.set(plugin.name, plugin)\n \n // Initialize status\n this.statuses.set(plugin.name, {\n name: plugin.name,\n version: plugin.version,\n active: false,\n installed: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin registered successfully: ${plugin.name}`)\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise {\n console.info(`Unregistering plugin: ${name}`)\n\n if (!this.plugins.has(name)) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n // Check if other plugins depend on this one\n const dependents = this.getDependents(name)\n if (dependents.length > 0) {\n throw new Error(`Cannot unregister ${name}: plugins ${dependents.join(', ')} depend on it`)\n }\n\n // Remove plugin\n this.plugins.delete(name)\n this.configs.delete(name)\n this.statuses.delete(name)\n\n console.info(`Plugin unregistered: ${name}`)\n }\n\n /**\n * Check if plugin is registered\n */\n has(name: string): boolean {\n return this.plugins.has(name)\n }\n\n /**\n * Activate a plugin\n */\n async activate(name: string): Promise {\n console.info(`Activating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (status?.active) {\n console.warn(`Plugin ${name} is already active`)\n return\n }\n\n try {\n // Activate dependencies first\n if (plugin.dependencies) {\n for (const depName of plugin.dependencies) {\n const depStatus = this.statuses.get(depName)\n if (!depStatus?.active) {\n await this.activate(depName)\n }\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin activated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n active: false,\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to activate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Deactivate a plugin\n */\n async deactivate(name: string): Promise {\n console.info(`Deactivating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (!status?.active) {\n console.warn(`Plugin ${name} is not active`)\n return\n }\n\n try {\n // Deactivate dependents first\n const dependents = this.getDependents(name)\n for (const depName of dependents) {\n const depStatus = this.statuses.get(depName)\n if (depStatus?.active) {\n await this.deactivate(depName)\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: false,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin deactivated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to deactivate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Get plugin configuration\n */\n getConfig(name: string): PluginConfig | undefined {\n return this.configs.get(name)\n }\n\n /**\n * Set plugin configuration\n */\n setConfig(name: string, config: PluginConfig): void {\n this.configs.set(name, {\n ...config,\n updatedAt: Date.now()\n })\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus | undefined {\n return this.statuses.get(name)\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): Map {\n return new Map(this.statuses)\n }\n\n /**\n * Update plugin status\n */\n private updateStatus(name: string, updates: Partial): void {\n const current = this.statuses.get(name)\n if (current) {\n this.statuses.set(name, { ...current, ...updates })\n }\n }\n\n /**\n * Get plugins that depend on the specified plugin\n */\n private getDependents(name: string): string[] {\n const dependents: string[] = []\n \n for (const [pluginName, plugin] of this.plugins) {\n if (plugin.dependencies?.includes(name)) {\n dependents.push(pluginName)\n }\n }\n \n return dependents\n }\n\n /**\n * Get dependency graph\n */\n getDependencyGraph(): Map {\n const graph = new Map()\n \n for (const [name, plugin] of this.plugins) {\n graph.set(name, plugin.dependencies || [])\n }\n \n return graph\n }\n\n /**\n * Resolve plugin load order based on dependencies\n */\n resolveLoadOrder(): string[] {\n const graph = this.getDependencyGraph()\n const visited = new Set()\n const visiting = new Set()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected involving plugin: ${name}`)\n }\n\n visiting.add(name)\n \n const dependencies = graph.get(name) || []\n for (const dep of dependencies) {\n if (!graph.has(dep)) {\n throw new Error(`Plugin ${name} depends on ${dep}, but ${dep} is not registered`)\n }\n visit(dep)\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n for (const name of graph.keys()) {\n visit(name)\n }\n\n return result\n }\n\n /**\n * Export plugin configuration\n */\n exportConfig(): { plugins: PluginConfig[] } {\n const plugins: PluginConfig[] = []\n \n for (const [name, config] of this.configs) {\n plugins.push({\n ...config,\n name\n } as PluginConfig & { name: string })\n }\n \n return { plugins }\n }\n\n /**\n * Import plugin configuration\n */\n importConfig(config: { plugins: PluginConfig[] }): void {\n for (const pluginConfig of config.plugins) {\n if ('name' in pluginConfig) {\n const { name, ...rest } = pluginConfig as PluginConfig & { name: string }\n this.setConfig(name, rest)\n }\n }\n }\n\n /**\n * Clear all plugins (useful for testing)\n */\n clear(): void {\n this.plugins.clear()\n this.configs.clear()\n this.statuses.clear()\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n total: number\n active: number\n inactive: number\n withErrors: number\n } {\n const statuses = Array.from(this.statuses.values())\n \n return {\n total: statuses.length,\n active: statuses.filter(s => s.active).length,\n inactive: statuses.filter(s => !s.active).length,\n withErrors: statuses.filter(s => s.hasErrors).length\n }\n }\n}","/**\n * Plugin Manager\n * \n * Central orchestrator for the plugin system\n */\n\nimport { Hono } from 'hono'\nimport { Plugin, PluginManager as IPluginManager, PluginRegistry, PluginConfig, PluginContext, PluginStatus, HookSystem, PluginLogger, HOOKS } from '../types'\nimport { PluginRegistryImpl } from './plugin-registry'\nimport { HookSystemImpl, ScopedHookSystem } from './hook-system'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginManager implements IPluginManager {\n public readonly registry: PluginRegistry\n public readonly hooks: HookSystem\n private validator: PluginValidator\n private context?: PluginContext\n private scopedHooks: Map = new Map()\n private pluginRoutes: Map = new Map()\n\n constructor() {\n this.validator = new PluginValidator()\n this.registry = new PluginRegistryImpl(this.validator)\n this.hooks = new HookSystemImpl()\n }\n\n /**\n * Initialize plugin system\n */\n async initialize(context: PluginContext): Promise {\n console.info('Initializing plugin system...')\n \n this.context = context\n \n // Execute app init hook\n await this.hooks.execute(HOOKS.APP_INIT, {\n pluginManager: this,\n context\n })\n\n console.info('Plugin system initialized')\n }\n\n /**\n * Load plugins from configuration\n */\n async loadPlugins(configs: PluginConfig[]): Promise {\n console.info(`Loading ${configs.length} plugins...`)\n\n // Filter enabled plugins\n const enabledConfigs = configs.filter(config => config.enabled)\n \n if (enabledConfigs.length === 0) {\n console.info('No enabled plugins to load')\n return\n }\n\n // Load and register plugins (implementation would depend on how plugins are distributed)\n for (const config of enabledConfigs) {\n try {\n // In a real implementation, this would load the plugin from a registry or file system\n // For now, we'll assume plugins are already imported\n console.info(`Loading plugin configuration: ${JSON.stringify(config)}`)\n \n // Store configuration\n if ('name' in config) {\n this.registry.setConfig(config.name as string, config)\n }\n } catch (error) {\n console.error(`Failed to load plugin configuration:`, error)\n }\n }\n\n // Resolve load order based on dependencies\n try {\n const loadOrder = this.registry.resolveLoadOrder()\n console.info(`Plugin load order: ${loadOrder.join(' -> ')}`)\n\n // Activate plugins in dependency order\n for (const pluginName of loadOrder) {\n const config = this.registry.getConfig(pluginName)\n if (config?.enabled) {\n await this.registry.activate(pluginName)\n }\n }\n } catch (error) {\n console.error('Failed to resolve plugin load order:', error)\n }\n\n console.info('Plugin loading completed')\n }\n\n /**\n * Install a plugin\n */\n async install(plugin: Plugin, config?: PluginConfig): Promise {\n console.info(`Installing plugin: ${plugin.name}`)\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed: ${validation.errors.join(', ')}`)\n }\n\n // Register plugin\n await this.registry.register(plugin)\n\n // Set configuration\n const pluginConfig: PluginConfig = {\n enabled: true,\n installedAt: Date.now(),\n ...config\n }\n this.registry.setConfig(plugin.name, pluginConfig)\n\n // Create scoped hook system for plugin\n const scopedHooks = this.hooks.createScope ? \n (this.hooks as HookSystemImpl).createScope(plugin.name) : \n this.hooks\n\n this.scopedHooks.set(plugin.name, scopedHooks as ScopedHookSystem)\n\n // Create plugin context\n const pluginContext: PluginContext = {\n ...this.context,\n config: pluginConfig,\n hooks: scopedHooks,\n logger: this.createLogger(plugin.name)\n }\n\n // Register plugin extensions\n await this.registerPluginExtensions(plugin, pluginContext)\n\n // Run plugin install hook\n if (plugin.install) {\n await plugin.install(pluginContext)\n }\n\n // Execute plugin install hook\n await this.hooks.execute(HOOKS.PLUGIN_INSTALL, {\n plugin: plugin.name,\n version: plugin.version,\n context: pluginContext\n })\n\n console.info(`Plugin installed successfully: ${plugin.name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to install plugin ${plugin.name}:`, errorMessage)\n \n // Update status with error\n const status = this.registry.getStatus(plugin.name)\n if (status) {\n this.updatePluginStatus(plugin.name, {\n hasErrors: true,\n errors: [...(status.errors || []), errorMessage],\n lastError: errorMessage\n })\n }\n \n throw error\n }\n }\n\n /**\n * Uninstall a plugin\n */\n async uninstall(name: string): Promise {\n console.info(`Uninstalling plugin: ${name}`)\n\n const plugin = this.registry.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Deactivate plugin first\n const status = this.registry.getStatus(name)\n if (status?.active) {\n await this.registry.deactivate(name)\n }\n\n // Create plugin context\n const config = this.registry.getConfig(name) || { enabled: false }\n const pluginContext: PluginContext = {\n ...this.context,\n config,\n hooks: this.scopedHooks.get(name) || this.hooks,\n logger: this.createLogger(name)\n }\n\n // Run plugin uninstall hook\n if (plugin.uninstall) {\n await plugin.uninstall(pluginContext)\n }\n\n // Unregister plugin extensions\n await this.unregisterPluginExtensions(plugin)\n\n // Clean up scoped hooks\n const scopedHooks = this.scopedHooks.get(name)\n if (scopedHooks && 'unregisterAll' in scopedHooks) {\n scopedHooks.unregisterAll()\n }\n this.scopedHooks.delete(name)\n\n // Remove plugin routes\n this.pluginRoutes.delete(name)\n\n // Execute plugin uninstall hook\n await this.hooks.execute(HOOKS.PLUGIN_UNINSTALL, {\n plugin: name,\n context: pluginContext\n })\n\n // Unregister plugin\n await this.registry.unregister(name)\n\n console.info(`Plugin uninstalled successfully: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to uninstall plugin ${name}:`, errorMessage)\n throw error\n }\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus {\n const status = this.registry.getStatus(name)\n if (!status) {\n return {\n name,\n version: 'unknown',\n active: false,\n installed: false,\n hasErrors: false\n }\n }\n return status\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): PluginStatus[] {\n return Array.from(this.registry.getAllStatuses().values())\n }\n\n /**\n * Register plugin extensions (routes, middleware, etc.)\n */\n private async registerPluginExtensions(plugin: Plugin, _context: PluginContext): Promise {\n // Register routes\n if (plugin.routes) {\n const pluginApp = new Hono()\n \n for (const route of plugin.routes) {\n console.debug(`Registering plugin route: ${route.path}`)\n pluginApp.route(route.path, route.handler)\n }\n \n this.pluginRoutes.set(plugin.name, pluginApp)\n }\n\n // Register middleware\n if (plugin.middleware) {\n for (const middleware of plugin.middleware) {\n console.debug(`Registering plugin middleware: ${middleware.name}`)\n // Middleware registration would be handled by the main app\n }\n }\n\n // Register hooks\n if (plugin.hooks) {\n const scopedHooks = this.scopedHooks.get(plugin.name)\n for (const hook of plugin.hooks) {\n console.debug(`Registering plugin hook: ${hook.name}`)\n if (scopedHooks) {\n scopedHooks.register(hook.name, hook.handler, hook.priority)\n } else {\n this.hooks.register(hook.name, hook.handler, hook.priority)\n }\n }\n }\n\n // Register services\n if (plugin.services) {\n for (const service of plugin.services) {\n console.debug(`Registering plugin service: ${service.name}`)\n // Service registration would be handled by a service container\n }\n }\n\n // Register database models\n if (plugin.models) {\n for (const model of plugin.models) {\n console.debug(`Registering plugin model: ${model.name}`)\n // Model registration would involve database migrations\n }\n }\n }\n\n /**\n * Unregister plugin extensions\n */\n private async unregisterPluginExtensions(plugin: Plugin): Promise {\n // Clean up is mostly handled by the scoped systems\n console.debug(`Unregistering extensions for plugin: ${plugin.name}`)\n }\n\n /**\n * Update plugin status\n */\n private updatePluginStatus(name: string, updates: Partial): void {\n const current = this.registry.getStatus(name)\n if (current && 'updateStatus' in this.registry) {\n // This would require extending the registry interface\n console.debug(`Updating status for plugin: ${name}`, updates)\n }\n }\n\n /**\n * Create a logger for a plugin\n */\n private createLogger(pluginName: string): PluginLogger {\n return {\n debug: (message: string, data?: any) => {\n console.debug(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n info: (message: string, data?: any) => {\n console.info(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n warn: (message: string, data?: any) => {\n console.warn(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n error: (message: string, error?: Error, data?: any) => {\n console.error(`[Plugin:${pluginName}] ${message}`, error || '', data || '')\n }\n }\n }\n\n /**\n * Get plugin routes for mounting in main app\n */\n getPluginRoutes(): Map {\n return new Map(this.pluginRoutes)\n }\n\n /**\n * Get plugin middleware for main app\n */\n getPluginMiddleware(): Array<{ name: string; handler: any; priority: number; global: boolean }> {\n const middleware: Array<{ name: string; handler: any; priority: number; global: boolean }> = []\n \n for (const plugin of this.registry.getActive()) {\n if (plugin.middleware) {\n for (const mw of plugin.middleware) {\n middleware.push({\n name: `${plugin.name}:${mw.name}`,\n handler: mw.handler,\n priority: mw.priority || 10,\n global: mw.global || false\n })\n }\n }\n }\n \n // Sort by priority\n return middleware.sort((a, b) => a.priority - b.priority)\n }\n\n /**\n * Execute shutdown procedures\n */\n async shutdown(): Promise {\n console.info('Shutting down plugin system...')\n \n // Execute app shutdown hook\n await this.hooks.execute(HOOKS.APP_SHUTDOWN, {\n pluginManager: this\n })\n\n // Deactivate all active plugins\n const activePlugins = this.registry.getActive()\n for (const plugin of activePlugins.reverse()) { // Reverse order\n try {\n await this.registry.deactivate(plugin.name)\n } catch (error) {\n console.error(`Error deactivating plugin ${plugin.name}:`, error)\n }\n }\n\n console.info('Plugin system shutdown completed')\n }\n\n /**\n * Get plugin system statistics\n */\n getStats(): {\n registry: ReturnType\n hooks: Array<{ hookName: string; handlerCount: number }>\n routes: number\n middleware: number\n } {\n return {\n registry: (this.registry as PluginRegistryImpl).getStats(),\n hooks: (this.hooks as HookSystemImpl).getStats(),\n routes: this.pluginRoutes.size,\n middleware: this.getPluginMiddleware().length\n }\n }\n}","import type { Context, Next } from 'hono'\nimport { TurnstileService } from '../services/turnstile'\n\n/**\n * Middleware to verify Turnstile token on form submissions\n * \n * Usage:\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Token already verified, process form...\n * })\n * ```\n */\nexport async function verifyTurnstile(c: Context, next: Next) {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n console.error('Turnstile middleware: Database not available')\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n\n // Check if Turnstile is enabled\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n // Turnstile not enabled, allow through\n return next()\n }\n\n // Get token from request\n let token: string | undefined\n let body: any\n\n if (c.req.method === 'POST') {\n const contentType = c.req.header('content-type') || ''\n \n if (contentType.includes('application/json')) {\n body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n }\n\n if (!token) {\n return c.json({ \n error: 'Turnstile token missing',\n message: 'Please complete the verification challenge'\n }, 400)\n }\n\n // Verify token\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return c.json({ \n error: 'Turnstile verification failed',\n message: result.error || 'Verification failed. Please try again.'\n }, 403)\n }\n\n // Verification successful, continue\n return next()\n}\n\n/**\n * Middleware factory that allows custom error handling\n */\nexport function createTurnstileMiddleware(options?: {\n onError?: (c: Context, error: string) => Response\n onMissing?: (c: Context) => Response\n}) {\n return async (c: Context, next: Next) => {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n return options?.onError?.(c, 'Database not available') || \n c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n return next()\n }\n\n let token: string | undefined\n const contentType = c.req.header('content-type') || ''\n\n if (contentType.includes('application/json')) {\n const body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n\n if (!token) {\n return options?.onMissing?.(c) ||\n c.json({ error: 'Turnstile token missing' }, 400)\n }\n\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return options?.onError?.(c, result.error || 'Verification failed') ||\n c.json({ error: 'Turnstile verification failed', message: result.error }, 403)\n }\n\n return next()\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { TurnstileService } from './services/turnstile'\nimport { verifyTurnstile } from './middleware/verify'\nimport manifest from './manifest.json'\n\n/**\n * Cloudflare Turnstile Plugin\n * \n * Provides CAPTCHA-free bot protection using Cloudflare Turnstile.\n * Can be used with any form by adding the verifyTurnstile middleware.\n * \n * Settings are managed through the generic admin plugin interface.\n * No custom routes needed - the admin system automatically handles settings.\n * \n * @example\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Process form after Turnstile verification\n * })\n * ```\n */\n\n// Build the plugin - no custom routes, generic admin handles settings\nexport const turnstilePlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('turnstile', TurnstileService)\n .addSingleMiddleware('verifyTurnstile', verifyTurnstile, {\n description: 'Verify Cloudflare Turnstile token',\n global: false,\n })\n .build()\n\n// Export service and middleware for easy import\nexport { TurnstileService } from './services/turnstile'\nexport { verifyTurnstile, createTurnstileMiddleware } from './middleware/verify'\nexport { renderTurnstileWidget, renderInlineTurnstile, getTurnstileScript, renderExplicitTurnstile } from './components/widget'\nexport type { TurnstileSettings, TurnstileVerificationResponse } from './services/turnstile'\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-OO7BOO6H.js.map b/packages/core/dist/chunk-OO7BOO6H.js.map deleted file mode 100644 index 983667605..000000000 --- a/packages/core/dist/chunk-OO7BOO6H.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/schemas/index.ts","../src/routes/api-content-access-policy.ts","../src/plugins/core-plugins/global-variables-plugin/variable-resolver.ts","../src/routes/api-content-crud.ts","../src/routes/api.ts","../src/routes/api-media.ts","../src/routes/api-system.ts","../src/routes/admin-api.ts","../src/templates/pages/auth-login.template.ts","../src/templates/pages/auth-register.template.ts","../src/services/auth-validation.ts","../src/plugins/core-plugins/user-profiles/user-profile-registry.ts","../src/plugins/core-plugins/user-profiles/user-profile-service.ts","../src/templates/components/drag-sortable.template.ts","../src/templates/components/dynamic-field.template.ts","../src/plugins/core-plugins/user-profiles/user-profile-renderer.ts","../src/plugins/core-plugins/user-profiles/index.ts","../src/routes/auth.ts","../src/routes/test-cleanup.ts","../src/middleware/plugin-middleware.ts","../src/templates/components/version-history.template.ts","../src/plugins/available/easy-mdx/index.ts","../src/plugins/available/tinymce-plugin/index.ts","../src/plugins/core-plugins/quill-editor/index.ts","../src/templates/pages/admin-content-form.template.ts","../src/templates/pages/admin-content-list.template.ts","../src/routes/admin-content-field-types.ts","../src/routes/admin-content.ts","../src/templates/pages/admin-profile.template.ts","../src/templates/components/alert.template.ts","../src/templates/pages/admin-activity-logs.template.ts","../src/templates/pages/admin-user-edit.template.ts","../src/templates/components/confirmation-dialog.template.ts","../src/templates/pages/admin-user-new.template.ts","../src/templates/pages/admin-users-list.template.ts","../src/routes/admin-users.ts","../src/templates/components/media-grid.template.ts","../src/templates/pages/admin-media-library.template.ts","../src/templates/components/media-file-details.template.ts","../src/routes/admin-media.ts","../src/templates/pages/admin-plugins-list.template.ts","../src/templates/components/auth-settings-form.template.ts","../src/templates/pages/admin-plugin-settings.template.ts","../src/routes/admin-plugins.ts","../src/templates/pages/admin-logs-list.template.ts","../src/templates/pages/admin-log-details.template.ts","../src/templates/pages/admin-log-config.template.ts","../src/routes/admin-logs.ts","../src/routes/admin-design.ts","../src/routes/admin-checkboxes.ts","../src/templates/pages/admin-testimonials-form.template.ts","../src/routes/admin-testimonials.ts","../src/templates/pages/admin-code-examples-form.template.ts","../src/routes/admin-code-examples.ts","../src/templates/pages/admin-dashboard.template.ts","../src/routes/admin-dashboard.ts","../src/routes/admin-collections-field-types.ts","../src/templates/pages/admin-collections-list.template.ts","../src/templates/components/table.template.ts","../src/templates/pages/admin-collections-form.template.ts","../src/routes/admin-collections.ts","../src/templates/pages/admin-settings.template.ts","../src/routes/admin-settings.ts","../src/templates/pages/admin-forms-list.template.ts","../src/templates/pages/admin-forms-builder.template.ts","../src/templates/pages/admin-forms-create.template.ts","../src/routes/admin-forms.ts","../src/routes/public-forms.ts","../src/templates/pages/admin-api-reference.template.ts","../src/routes/admin-api-reference.ts","../src/routes/index.ts"],"names":["Hono","builder","z","MigrationService","raw","escapeHtml","checked","error","passwordHash","c","isPluginActive","db","collection","formData","tinymcePlugin","html","renderAlert","renderConfirmationDialog","getConfirmationDialogScript","fileValidationSchema","getImageDimensions","getJPEGDimensions","getPNGDimensions","renderTable","tinymceActive","quillActive","mdxeditorActive","result","VERSION","router","app"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;A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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,IAAA,EAwW/BV,yBAAAA,CAAyB;AAAA,IACzB,EAAA,EAAI,wBAAA;AAAA,IACJ,KAAA,EAAO,gBAAA;AAAA,IACP,OAAA,EAAS,gFAAA;AAAA,IACT,WAAA,EAAa,gBAAA;AAAA,IACb,UAAA,EAAY,QAAA;AAAA,IACZ,SAAA,EAAW,MAAA;AAAA,IACX,YAAA,EAAc,+BAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACZ,CAAC;;AAAA,IAAA,EAEAC,8BAA6B;AAAA,EAAA,CAAA;AAGjC,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,UAAA;AAAA,IACP,SAAA,EAAW,UAAA;AAAA,IACX,WAAA,EAAa,iBAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,OAAO,0BAA0B,UAAU,CAAA;AAC7C;AAEA,SAAS,eAAA,CAAgB,KAAA,EAAe,KAAA,EAAe,QAAA,EAAkB,SAAA,EAA2B;AAClG,EAAA,MAAM,WAAW,SAAA,KAAc,KAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,uHAAA;AACpB,EAAA,MAAM,aAAA,GAAgB,WAClB,iEAAA,GACA,mJAAA;AAEJ,EAAA,OAAO;AAAA;AAAA,4BAAA,EAEqB,KAAK,CAAA;AAAA,gBAAA,EACjB,KAAK,CAAA;AAAA,aAAA,EACR,WAAW,IAAI,aAAa,CAAA;AAAA;AAAA;AAAA,iFAAA,EAGwC,QAAQ,CAAA;AAAA;AAAA,YAAA,EAE7E,KAAK,CAAA;AAAA;AAAA,EAAA,CAAA;AAGnB;AAEA,SAAS,gBAAA,CAAiB,WAAmB,QAAA,EAAiD;AAC5F,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,SAAA;AACH,MAAA,OAAO,qBAAA,CAAsB,UAAU,OAAO,CAAA;AAAA,IAChD,KAAK,YAAA;AACH,MAAA,OAAO,wBAAA,CAAyB,UAAU,UAAU,CAAA;AAAA,IACtD,KAAK,UAAA;AACH,MAAA,OAAO,sBAAA,CAAuB,UAAU,QAAQ,CAAA;AAAA,IAClD,KAAK,eAAA;AACH,MAAA,OAAO,0BAAA,CAA2B,UAAU,aAAa,CAAA;AAAA,IAC3D,KAAK,SAAA;AACH,MAAA,OAAO,qBAAA,CAAsB,UAAU,OAAO,CAAA;AAAA,IAChD,KAAK,YAAA;AACH,MAAA,OAAO,uBAAA,CAAwB,UAAU,UAAU,CAAA;AAAA,IACrD,KAAK,gBAAA;AACH,MAAA,OAAO,2BAAA,CAA4B,UAAU,aAAa,CAAA;AAAA,IAC5D;AACE,MAAA,OAAO,qBAAA,CAAsB,UAAU,OAAO,CAAA;AAAA;AAEpD;AAEA,SAAS,sBAAsB,QAAA,EAAoC;AACjE,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAcc,QAAA,EAAU,YAAY,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAWlC,QAAA,EAAU,cAAc,mBAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,EAY9B,QAAA,EAAU,QAAA,KAAa,KAAA,GAAQ,UAAA,GAAa,EAAE,CAAA;AAAA,+CAAA,EACjC,QAAA,EAAU,QAAA,KAAa,kBAAA,GAAqB,UAAA,GAAa,EAAE,CAAA;AAAA,8CAAA,EAC5D,QAAA,EAAU,QAAA,KAAa,iBAAA,GAAoB,UAAA,GAAa,EAAE,CAAA;AAAA,6CAAA,EAC3D,QAAA,EAAU,QAAA,KAAa,gBAAA,GAAmB,UAAA,GAAa,EAAE,CAAA;AAAA,kDAAA,EACpD,QAAA,EAAU,QAAA,KAAa,qBAAA,GAAwB,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAanG,QAAA,EAAU,mBAAmB,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAA,EASX,QAAA,EAAU,QAAA,KAAa,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EAC7C,QAAA,EAAU,QAAA,KAAa,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EAC7C,QAAA,EAAU,QAAA,KAAa,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EAC7C,QAAA,EAAU,QAAA,KAAa,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAW5D,QAAA,EAAU,eAAA,GAAkB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAgC9D;AAEA,SAAS,yBAAyB,QAAA,EAAuC;AACvE,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAgCW,QAAA,EAAU,KAAA,KAAU,OAAA,GAAU,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAU5C,UAAU,KAAA,KAAU,MAAA,IAAU,CAAC,QAAA,EAAU,KAAA,GAAQ,YAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAU/D,QAAA,EAAU,KAAA,KAAU,MAAA,GAAS,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EActC,QAAA,EAAU,gBAAgB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAKnC,QAAA,EAAU,gBAAgB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAYrC,QAAA,EAAU,WAAW,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAavB,QAAA,EAAU,WAAW,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAa/B,QAAA,EAAU,aAAa,EAAE,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAmBxC;AAEA,SAAS,uBAAuB,QAAA,EAAqC;AACnE,EAAA,MAAM,YAAA,GAAe,UAAU,YAAA,IAAgB,KAAA;AAC/C,EAAA,MAAM,sBAAA,GACJ,OAAO,QAAA,EAAU,sBAAA,KAA2B,WACxC,QAAA,CAAS,sBAAA,GACT,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA;AAErB,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAoBc,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAiBZ,sBAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAsDzB,QAAA,EAAU,gBAAA,GAAmB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAqBxC,QAAA,EAAU,kBAAkB,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAiB7B,QAAA,EAAU,oBAAA,EAAsB,gBAAA,GAAmB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAoBjE,QAAA,EAAU,oBAAA,EAAsB,cAAA,GAAiB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAoB/D,QAAA,EAAU,oBAAA,EAAsB,cAAA,GAAiB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAuBhE,QAAA,EAAU,oBAAA,EAAsB,SAAA,IAAa,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EActD,QAAA,EAAU,WAAA,EAAa,IAAA,CAAK,IAAI,KAAK,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAoBtD;AAEA,SAAS,2BAA2B,QAAA,EAAyC;AAC3E,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAkCe,QAAA,EAAU,kBAAA,GAAqB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAqB7C,QAAA,EAAU,cAAA,GAAiB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAqBzC,QAAA,EAAU,YAAA,GAAe,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAqBvC,QAAA,EAAU,iBAAA,GAAoB,SAAA,GAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAA,EAwB1B,QAAA,EAAU,cAAA,KAAmB,WAAA,GAAc,UAAA,GAAa,EAAE,CAAA;AAAA,oCAAA,EAC9D,QAAA,EAAU,cAAA,KAAmB,OAAA,GAAU,UAAA,GAAa,EAAE,CAAA;AAAA,qCAAA,EACrD,QAAA,EAAU,cAAA,KAAmB,QAAA,GAAW,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAkC9F;AAEA,SAAS,sBAAsB,QAAA,EAAoC;AACjE,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EA6Bc,QAAA,EAAU,eAAe,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAA,EAaZ,QAAA,EAAU,eAAA,KAAoB,OAAA,GAAU,UAAA,GAAa,EAAE,CAAA;AAAA,yCAAA,EAClD,QAAA,EAAU,eAAA,KAAoB,YAAA,GAAe,UAAA,GAAa,EAAE,CAAA;AAAA,iCAAA,EACpE,QAAA,EAAU,eAAA,KAAoB,IAAA,GAAO,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAA,EAUjD,QAAA,EAAU,eAAA,KAAoB,OAAA,GAAU,UAAA,GAAa,EAAE,CAAA;AAAA,qCAAA,EACtD,QAAA,EAAU,eAAA,KAAoB,QAAA,GAAW,UAAA,GAAa,EAAE,CAAA;AAAA,sCAAA,EACvD,QAAA,EAAU,eAAA,KAAoB,SAAA,GAAY,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAalF,QAAA,EAAU,gBAAA,EAAkB,IAAA,CAAK,IAAI,KAAK,gCAAgC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAQlE,QAAA,EAAU,mBAAmB,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAqCtD;AAEA,SAAS,wBAAwB,QAAA,EAAsC;AACrE,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6EAAA,EAasE,QAAA,EAAU,mBAAmB,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAY9B,QAAA,EAAU,qBAAqB,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+EAAA,EAYlC,QAAA,EAAU,qBAAqB,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAAA,CAyBtG,QAAA,EAAU,iBAAA,IAAqB,CAAA,MAAO,CAAA,GAAI,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAsKtE;AAEA,SAAS,4BAA4B,QAAA,EAA0C;AAC7E,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uGAAA,EAagG,QAAA,EAAU,eAAe,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,qGAAA,EAc9B,QAAA,EAAU,SAAA,EAAW,cAAA,EAAe,IAAK,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAiGnJ;;;ACxmDO,IAAM,mBAAA,GAAsB,IAAIlB,IAAAA;AAGvC,mBAAA,CAAoB,GAAA,CAAI,GAAA,EAAK,WAAA,EAAa,CAAA;AAG1C,SAAS,gBAAgB,IAAA,EAAW;AAClC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,QAAA,EAAU,YAAA;AAAA,MACV,eAAA,EAAiB,qCAAA;AAAA,MACjB,UAAA,EAAY,MAAM,KAAA,IAAS,mBAAA;AAAA,MAC3B,QAAA,EAAU,KAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,UAAA,EAAY;AAAA,MACV,KAAA,EAAO,MAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,OAAA,EAAS,EAAA;AAAA,MACT,OAAA,EAAS,EAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAAA,IACA,QAAA,EAAU;AAAA,MACR,gBAAA,EAAkB,KAAA;AAAA,MAClB,cAAA,EAAgB,EAAA;AAAA,MAChB,oBAAA,EAAsB;AAAA,QACpB,SAAA,EAAW,CAAA;AAAA,QACX,gBAAA,EAAkB,IAAA;AAAA,QAClB,cAAA,EAAgB,IAAA;AAAA,QAChB,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,aAAa;AAAC,KAChB;AAAA,IACA,aAAA,EAAe;AAAA,MACb,kBAAA,EAAoB,IAAA;AAAA,MACpB,cAAA,EAAgB,IAAA;AAAA,MAChB,YAAA,EAAc,IAAA;AAAA,MACd,iBAAA,EAAmB,KAAA;AAAA,MACnB,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,WAAA,EAAa,EAAA;AAAA,MACb,kBAAkB,CAAC,KAAA,EAAO,QAAQ,KAAA,EAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAAA,MAC7D,eAAA,EAAiB,YAAA;AAAA,MACjB,eAAA,EAAiB,OAAA;AAAA,MACjB,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,UAAA,EAAY;AAAA,MACV,eAAA,EAAiB,CAAA;AAAA,MACjB,iBAAA,EAAmB,CAAA;AAAA,MACnB,iBAAA,EAAmB,CAAA;AAAA,MACnB,WAAA,EAAa,MAAA;AAAA,MACb,YAAY;AAAC,KACf;AAAA,IACA,aAAA,EAAe;AAAA,MACb,WAAA,EAAa,CAAA;AAAA,MACb,SAAA,EAAW,CAAA;AAAA,MACX,UAAA,EAAY,MAAA;AAAA,MACZ,YAAA,EAAc,MAAA;AAAA,MACd,QAAQ;AAAC;AACX,GACF;AACF;AAGA,mBAAA,CAAoB,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA,KAAM;AAClC,EAAA,OAAO,CAAA,CAAE,SAAS,yBAAyB,CAAA;AAC7C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA,KAAM;AAC/C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,EAAE,CAAA;AAG9C,EAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,kBAAA,CAAmB,MAAM,KAAK,CAAA;AAE5E,EAAA,MAAM,YAAA,GAAe,gBAAgB,IAAI,CAAA;AACzC,EAAA,YAAA,CAAa,OAAA,GAAU,eAAA;AAEvB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,YAAA;AAAA,IACV,SAAA,EAAW,SAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,aAAA,EAAe,CAAC,CAAA,KAAM;AAC5C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,IAC9B,SAAA,EAAW,YAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA,KAAM;AAChD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,EAAE,CAAA;AAG9C,EAAA,MAAM,SAAA,GAAY,MAAM,eAAA,CAAgB,mBAAA,EAAoB;AAE5D,EAAA,MAAM,YAAA,GAAe,gBAAgB,IAAI,CAAA;AACzC,EAAA,YAAA,CAAa,QAAA,GAAW;AAAA,IACtB,GAAG,YAAA,CAAa,QAAA;AAAA,IAChB,cAAc,SAAA,CAAU,YAAA;AAAA,IACxB,wBAAwB,SAAA,CAAU;AAAA,GACpC;AAEA,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,YAAA;AAAA,IACV,SAAA,EAAW,UAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,gBAAA,EAAkB,CAAC,CAAA,KAAM;AAC/C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,IAC9B,SAAA,EAAW,eAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,UAAA,EAAY,CAAC,CAAA,KAAM;AACzC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,IAC9B,SAAA,EAAW,SAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,aAAA,EAAe,CAAC,CAAA,KAAM;AAC5C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,IAC9B,SAAA,EAAW,YAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,iBAAA,EAAmB,CAAC,CAAA,KAAM;AAChD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACb,GAAI,MAAA;AAAA,IACJ,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,IAC9B,SAAA,EAAW,gBAAA;AAAA,IACX,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,GAC7B;AACA,EAAA,OAAO,CAAA,CAAE,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,wBAAA,EAA0B,OAAO,CAAA,KAAM;AAC7D,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,EAAE,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,kBAAA,EAAmB;AAEzD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,qBAAA,EAAuB,OAAO,CAAA,KAAM;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAGzB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,EAAE,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,oBAAA,EAAqB;AAE3D,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,0BAAA,EAA4B,OAAO,CAAA,KAAM;AAC/D,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,EAAE,CAAA;AAChD,IAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,cAAA,EAAe;AAEzD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,2BAAA,EAA6B,OAAO,CAAA,KAAM;AAChE,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAMpC,EAAE,GAAA,EAAI;AAEP,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,OAAA,IAAW,EAAC;AACvC,IAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC/B,MAAA,CAAO,GAAA,CAAI,OAAO,KAAA,KAAe;AAC/B,QAAA,IAAI;AACF,UAAA,MAAM,WAAA,GAAc,MAAM,EAAA,CAAG,OAAA,CAAQ,iCAAiC,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA,CAAE,KAAA,EAAM;AAC1F,UAAA,MAAM,QAAA,GAAY,aAAqB,KAAA,IAAS,CAAA;AAChD,UAAA,SAAA,IAAa,QAAA;AACb,UAAA,OAAO;AAAA,YACL,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ;AAAA,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAA,CAAM,IAAI,KAAK,KAAK,CAAA;AAC5D,UAAA,OAAO;AAAA,YACL,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,QAAA,EAAU;AAAA,WACZ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,KACH;AAIA,IAAA,MAAM,qBAAqB,SAAA,GAAY,IAAA;AACvC,IAAA,MAAM,cAAA,GAAA,CAAkB,kBAAA,IAAsB,IAAA,GAAO,IAAA,CAAA,EAAO,QAAQ,CAAC,CAAA;AAErE,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,aAAa,MAAA,CAAO,MAAA;AAAA,QACpB,SAAA;AAAA,QACA,YAAA,EAAc,GAAG,cAAc,CAAA,eAAA,CAAA;AAAA,QAC/B,MAAA,EAAQ;AAAA;AACV,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,GAAA,CAAI,8BAAA,EAAgC,OAAO,CAAA,KAAM;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AAGjB,IAAA,MAAM,kBAAkB,MAAM,EAAA,CAAG,OAAA,CAAQ,wBAAwB,EAAE,KAAA,EAAM;AACzE,IAAA,MAAM,OAAA,GAAW,iBAAyB,eAAA,KAAoB,IAAA;AAE9D,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS,UAAU,iCAAA,GAAoC;AAAA;AACzD,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,4BAAA,EAA8B,OAAO,CAAA,KAAM;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAGzB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAIA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,8BAAA,EAAgC,OAAO,CAAA,KAAM;AACpE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAGzB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,MAAA,IAAU,EAAC;AAEzC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,gBAAgB,CAAA,IAAK,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACrE,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,UAAU,EAAC;AAGjB,IAAA,MAAM,YAAA,GAAe,MAAM,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAIrC,EAAE,GAAA,EAAI;AACP,IAAA,MAAM,cAAc,IAAI,GAAA;AAAA,MAAA,CACrB,YAAA,CAAa,WAAW,EAAC,EAAG,IAAI,CAAC,GAAA,KAAa,IAAI,IAAI;AAAA,KACzD;AAEA,IAAA,KAAA,MAAW,aAAa,gBAAA,EAAkB;AACxC,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC/B,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,KAAA,EAAO,KAAA,EAAO,mBAAmB,CAAA;AAC3E,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,MAAM,GAAG,OAAA,CAAQ,CAAA,YAAA,EAAe,SAAS,CAAA,CAAE,EAAE,GAAA,EAAI;AACjD,QAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA;AAAA,MAClD,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACrD,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,OAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAAA,MACzE;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,CAAA,UAAA,EAAa,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAM,CAAA,IAAA,EAAO,gBAAA,CAAiB,MAAM,CAAA,OAAA,CAAA;AAAA,MACzF;AAAA,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,KAAM;AAChD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,EAAS;AACtC,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,EAAE,CAAA;AAG9C,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,eAAA,EAAiB,QAAA,CAAS,GAAA,CAAI,iBAAiB,CAAA;AAAA,MAC/C,UAAA,EAAY,QAAA,CAAS,GAAA,CAAI,YAAY,CAAA;AAAA,MACrC,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,eAAA,EAAiB,QAAA,CAAS,GAAA,CAAI,iBAAiB,CAAA,KAAM;AAAA,KACvD;AAGA,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,IAAY,CAAC,SAAS,eAAA,EAAiB;AACnD,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,mBAAA,CAAoB,QAAQ,CAAA;AAElE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA,KAAM;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAEzB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAClC,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,CAAA,CAAE,GAAA,CAAI,QAAA,EAAS;AACtC,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,EAAA;AACjB,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,EAAE,CAAA;AAE9C,IAAA,MAAM,kBAAmB,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA,EAAqB,MAAK,IAAK,EAAA;AACnF,IAAA,MAAM,WAAY,QAAA,CAAS,GAAA,CAAI,wBAAwB,CAAA,EAAqB,MAAK,IAAK,EAAA;AAGtF,IAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,CAAK,eAAe,CAAA,EAAG;AAC/C,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU,EAAE,CAAA;AACjD,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA,IAAK,YAAA,GAAe,CAAA,IAAK,YAAA,GAAe,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI;AAC1F,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,SACN,GAAG,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,oBAAA,CAAqB;AAAA,MACzD,YAAA,EAAc,eAAA;AAAA,MACd,sBAAA,EAAwB;AAAA,KACzB,CAAA;AAED,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,EAAE,IAAA,CAAK;AAAA,QACZ,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAA,OAAO,EAAE,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,OACN,GAAG,CAAA;AAAA,EACR;AACF,CAAC,CAAA;AAGD,mBAAA,CAAoB,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA,KAAM;AACzC,EAAA,OAAO,CAAA,CAAE,SAAS,yBAAyB,CAAA;AAC7C,CAAC,CAAA;;;AC7lBD,mCAAA,EAAA;AA4BO,SAAS,oBAAoB,IAAA,EAAiC;AACnE,EAAA,MAAM,SAAA,GAAiB;AAAA,IACrB,OAAA,EAAS,aAAA;AAAA,IACT,YAAA,EAAc,IAAA;AAAA,IACd,WAAA,EAAa,CAAC,IAAA,KAAe,CAAA,aAAA,EAAgB,KAAK,EAAE,CAAA,QAAA,CAAA;AAAA,IACpD,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,CAAC,MAAA,EAAa,IAAA,KAAc;AAAA;AAAA;AAAA,kBAAA,EAGxB,KAAK,IAAI;AAAA;AAAA;AAAA,UAAA;AAAA,OAIvB;AAAA,MACA;AAAA,QACE,GAAA,EAAK,cAAA;AAAA,QACL,KAAA,EAAO,cAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU;AAAA,OACZ;AAAA,MACA;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,CAAC,MAAA,EAAa,IAAA,KAAc;AAClC,UAAA,MAAM,cAAA,GAAyC;AAAA,YAC7C,SAAA,EAAW,wGAAA;AAAA,YACX,QAAA,EAAU,oHAAA;AAAA,YACV,cAAA,EAAgB,8GAAA;AAAA,YAChB,UAAA,EAAY,oHAAA;AAAA,YACZ,SAAA,EAAW;AAAA,WACb;AACA,UAAA,MAAM,aAAa,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,IAAK,eAAe,SAAS,CAAA;AAC5E,UAAA,OAAO;AAAA,6GAAA,EAC8F,UAAU,CAAA;AAAA,cAAA,EACzG,IAAA,CAAK,YAAY,SAAS;AAAA;AAAA,UAAA,CAAA;AAAA,QAGlC;AAAA,OACF;AAAA,MACA;AAAA,QACE,GAAA,EAAK,kBAAA;AAAA,QACL,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,CAAC,MAAA,EAAa,IAAA,KAAc;AAClC,UAAA,MAAM,KAAA,GAAQ,KAAK,gBAAA,IAAoB,CAAA;AACvC,UAAA,OAAO;AAAA;AAAA;AAAA,gBAAA,EAGC,KAAK;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,QAIf;AAAA,OACF;AAAA,MACA;AAAA,QACE,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,CAAC,MAAA,EAAa,IAAA,KAAc;AAClC,UAAA,IAAI,KAAK,SAAA,EAAW;AAClB,YAAA,OAAO;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAAA,UAKT,CAAA,MAAO;AACL,YAAA,OAAO;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAAA,UAKT;AAAA,QACF;AAAA,OACF;AAAA,MACA;AAAA,QACE,GAAA,EAAK,eAAA;AAAA,QACL,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU;AAAA,OACZ;AAAA,MACA;AAAA,QACE,GAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,CAAC,MAAA,EAAa,IAAA,KAAc;AAClC,UAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,IAAI,OAAO,yDAAA;AAC9B,UAAA,OAAO;AAAA;AAAA,oCAAA,EAEqB,KAAK,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAKb,KAAK,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAA,EAMH,KAAK,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,QAOrC;AAAA;AACF,KACF;AAAA,IACA,MAAM,IAAA,CAAK,KAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAEA,EAAA,MAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iFAAA,EA4C6D,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iFAAA,EAgBjB,KAAK,KAAA,CAAM,MAAA,CAAO,OAAK,CAAA,CAAE,SAAS,EAAE,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iFAAA,EAgB1C,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,gBAAA,IAAoB,CAAA,CAAA,EAAI,CAAC,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAe7H,IAAA,CAAK,UAAU,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,EAUA,IAAA,CAAK,QAAA,KAAa,SAAA,GAAY,UAAA,GAAa,EAAE,CAAA;AAAA,qCAAA,EAC9C,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,UAAA,GAAa,EAAE,CAAA;AAAA,2CAAA,EACtC,IAAA,CAAK,QAAA,KAAa,cAAA,GAAiB,UAAA,GAAa,EAAE,CAAA;AAAA,uCAAA,EACtD,IAAA,CAAK,QAAA,KAAa,UAAA,GAAa,UAAA,GAAa,EAAE,CAAA;AAAA,sCAAA,EAC/C,IAAA,CAAK,QAAA,KAAa,SAAA,GAAY,UAAA,GAAa,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAYzE,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA,GAO7B,EAAE;AAAA;AAAA;;AAAA;AAAA;AAAA,QAAA,EAMNuB,YAAAA,CAAY,SAAS,CAAC;AAAA;AAAA;AAAA,EAAA,CAAA;AAK9B,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,KAAA,EAAO,OAAA;AAAA,IACP,OAAA,EAAS,WAAA;AAAA,IACT,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS,IAAA,CAAK;AAAA,GAChB;AAEA,EAAA,OAAO,0BAA0B,UAAU,CAAA;AAC7C;;;ACrSA,mCAAA,EAAA;AAuBA,SAAS,2BAAA,GAAsC;AAC7C,EAAA,OAAO;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,EAA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAA,EAsRlB,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","file":"chunk-OO7BOO6H.js","sourcesContent":["/**\n * Schema Definitions\n *\n * Placeholder for schema definitions - to be populated as needed\n */\n\nexport interface SchemaDefinition {\n name: string\n fields: any[]\n}\n\n// Empty array for now - schemas will be migrated incrementally\nexport const schemaDefinitions: SchemaDefinition[] = []\n","import type { FilterCondition, FilterGroup, QueryFilter } from '../utils/query-filter'\n\nfunction canReadNonPublicContent(userRole?: string): boolean {\n return userRole === 'admin' || userRole === 'editor'\n}\n\nfunction isStatusCondition(condition: FilterCondition): boolean {\n return condition.field === 'status'\n}\n\nfunction stripStatusConditions(group?: FilterGroup): FilterGroup | undefined {\n if (!group) {\n return undefined\n }\n\n const and = group.and?.filter(condition => !isStatusCondition(condition))\n const or = group.or?.filter(condition => !isStatusCondition(condition))\n\n const normalizedGroup: FilterGroup = {}\n\n if (and && and.length > 0) {\n normalizedGroup.and = and\n }\n\n if (or && or.length > 0) {\n normalizedGroup.or = or\n }\n\n return normalizedGroup\n}\n\nexport function normalizePublicContentFilter(filter: QueryFilter, userRole?: string): QueryFilter {\n if (canReadNonPublicContent(userRole)) {\n return filter\n }\n\n const normalizedFilter: QueryFilter = {\n ...filter,\n where: stripStatusConditions(filter.where)\n }\n\n if (!normalizedFilter.where) {\n normalizedFilter.where = { and: [] }\n }\n\n if (!normalizedFilter.where.and) {\n normalizedFilter.where.and = []\n }\n\n normalizedFilter.where.and.push({\n field: 'status',\n operator: 'equals',\n value: 'published'\n })\n\n return normalizedFilter\n}\n","/**\n * Variable Resolver\n *\n * Scans strings for {variable_key} tokens and replaces them\n * with values from the global variables map.\n *\n * Token syntax: {key} where key matches /^[a-z0-9_]+$/\n * Unresolved tokens are left as-is so editors can see what's missing.\n */\n\n// Matches {variable_key} — only lowercase alphanumeric + underscores\nconst TOKEN_PATTERN = /\\{([a-z0-9_]+)\\}/g\n\n/**\n * Replace all {variable_key} tokens in a string with their values.\n * Unresolved tokens remain unchanged.\n */\nexport function resolveVariables(\n text: string,\n variables: Map\n): string {\n if (!text || variables.size === 0) return text\n\n return text.replace(TOKEN_PATTERN, (match, key) => {\n const value = variables.get(key)\n return value !== undefined ? value : match\n })\n}\n\n/**\n * Recursively resolve variables in an object's string values.\n * Handles nested objects, arrays, and the `data` field of content items.\n */\nexport function resolveVariablesInObject(\n obj: any,\n variables: Map\n): any {\n if (!obj || variables.size === 0) return obj\n\n if (typeof obj === 'string') {\n return resolveVariables(obj, variables)\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => resolveVariablesInObject(item, variables))\n }\n\n if (typeof obj === 'object') {\n const result: Record = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key] = resolveVariablesInObject(value, variables)\n }\n return result\n }\n\n return obj\n}\n\n// ============================================================================\n// In-memory variable cache (shared with index.ts via import)\n// ============================================================================\n\nlet variableCache: Map | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL_MS = 300_000 // 5 minutes\n\nexport function getVariablesCached(): Map | null {\n const now = Date.now()\n if (variableCache && (now - cacheTimestamp) < CACHE_TTL_MS) {\n return variableCache\n }\n return null\n}\n\nexport function setVariablesCache(map: Map): void {\n variableCache = map\n cacheTimestamp = Date.now()\n}\n\nexport function invalidateVariablesCache(): void {\n variableCache = null\n cacheTimestamp = 0\n}\n\n/**\n * Resolve variables in a content object using the database.\n * Fetches variables from DB (with caching) and resolves tokens.\n * Safe to call even if the global_variables table doesn't exist yet.\n */\nexport async function resolveContentVariables(\n contentData: any,\n db: any\n): Promise {\n if (!db || !contentData) return contentData\n\n try {\n // Check cache first\n let variables = getVariablesCached()\n\n if (!variables) {\n const { results } = await db.prepare(\n 'SELECT key, value FROM global_variables WHERE is_active = 1'\n ).all()\n\n variables = new Map()\n for (const row of results || []) {\n variables.set((row as any).key, (row as any).value)\n }\n setVariablesCache(variables)\n }\n\n if (variables.size === 0) return contentData\n\n return resolveVariablesInObject(contentData, variables)\n } catch {\n // Table may not exist yet — silently return original data\n return contentData\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth, requireRole } from '../middleware'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport type { Bindings, Variables } from '../app'\nimport { resolveContentVariables } from '../plugins/core-plugins/global-variables-plugin/variable-resolver'\n\nconst apiContentCrudRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// GET /api/content/check-slug - Check if slug is available in collection\n// Query params: collectionId, slug, excludeId (optional - when editing)\n// NOTE: This MUST come before /:id route to avoid route conflict\napiContentCrudRoutes.get('/check-slug', async (c) => {\n try {\n const db = c.env.DB\n const collectionId = c.req.query('collectionId')\n const slug = c.req.query('slug')\n const excludeId = c.req.query('excludeId') // When editing, exclude current item\n \n if (!collectionId || !slug) {\n return c.json({ error: 'collectionId and slug are required' }, 400)\n }\n \n // Check for existing content with this slug in the collection\n let query = 'SELECT id FROM content WHERE collection_id = ? AND slug = ?'\n const params: string[] = [collectionId, slug]\n \n if (excludeId) {\n query += ' AND id != ?'\n params.push(excludeId)\n }\n \n const existing = await db.prepare(query).bind(...params).first()\n \n if (existing) {\n return c.json({ \n available: false, \n message: 'This URL slug is already in use in this collection' \n })\n }\n \n return c.json({ available: true })\n } catch (error: unknown) {\n console.error('Error checking slug:', error)\n return c.json({ \n error: 'Failed to check slug availability',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// GET /api/content/:id - Get single content item by ID\napiContentCrudRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n const stmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await stmt.bind(id).first()\n\n if (!content) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n const transformedContent = {\n id: (content as any).id,\n title: (content as any).title,\n slug: (content as any).slug,\n status: (content as any).status,\n collectionId: (content as any).collection_id,\n data: (content as any).data ? JSON.parse((content as any).data) : {},\n created_at: (content as any).created_at,\n updated_at: (content as any).updated_at\n }\n\n // Resolve {variable_key} tokens in content data\n const resolveVars = c.req.query('resolve_variables') !== 'false'\n if (resolveVars) {\n transformedContent.data = await resolveContentVariables(transformedContent.data, db)\n }\n\n return c.json({ data: transformedContent })\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// POST /api/content - Create new content (requires authentication)\napiContentCrudRoutes.post('/', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const db = c.env.DB\n const user = c.get('user')\n const body = await c.req.json()\n\n const { collectionId, title, slug, status, data } = body\n\n // Validate required fields\n if (!collectionId) {\n return c.json({ error: 'collectionId is required' }, 400)\n }\n\n if (!title) {\n return c.json({ error: 'title is required' }, 400)\n }\n\n // Generate slug from title if not provided\n let finalSlug = slug || title\n finalSlug = finalSlug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim()\n\n // Check for duplicate slug within the same collection\n const duplicateCheck = db.prepare(\n 'SELECT id FROM content WHERE collection_id = ? AND slug = ?'\n )\n const existing = await duplicateCheck.bind(collectionId, finalSlug).first()\n\n if (existing) {\n return c.json({ error: 'A content item with this slug already exists in this collection' }, 409)\n }\n\n // Create new content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n finalSlug,\n title,\n JSON.stringify(data || {}),\n status || 'draft',\n user?.userId || 'system',\n now,\n now\n ).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n await cache.invalidate('content-filtered:*')\n\n // Get the created content\n const getStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const createdContent = await getStmt.bind(contentId).first() as any\n\n return c.json({\n data: {\n id: createdContent.id,\n title: createdContent.title,\n slug: createdContent.slug,\n status: createdContent.status,\n collectionId: createdContent.collection_id,\n data: createdContent.data ? JSON.parse(createdContent.data) : {},\n created_at: createdContent.created_at,\n updated_at: createdContent.updated_at\n }\n }, 201)\n } catch (error) {\n console.error('Error creating content:', error)\n return c.json({\n error: 'Failed to create content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// PUT /api/content/:id - Update content (requires authentication)\napiContentCrudRoutes.put('/:id', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const body = await c.req.json()\n\n // Check if content exists\n const existingStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existing = await existingStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n // Build update fields dynamically\n const updates: string[] = []\n const params: any[] = []\n\n if (body.title !== undefined) {\n updates.push('title = ?')\n params.push(body.title)\n }\n\n if (body.slug !== undefined) {\n let finalSlug = body.slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim()\n updates.push('slug = ?')\n params.push(finalSlug)\n }\n\n if (body.status !== undefined) {\n updates.push('status = ?')\n params.push(body.status)\n }\n\n if (body.data !== undefined) {\n updates.push('data = ?')\n params.push(JSON.stringify(body.data))\n }\n\n // Always update updated_at\n const now = Date.now()\n updates.push('updated_at = ?')\n params.push(now)\n\n // Add id to params for WHERE clause\n params.push(id)\n\n // Execute update\n const updateStmt = db.prepare(`\n UPDATE content SET ${updates.join(', ')}\n WHERE id = ?\n `)\n\n await updateStmt.bind(...params).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existing.collection_id}:*`)\n await cache.invalidate('content-filtered:*')\n\n // Get updated content\n const getStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const updatedContent = await getStmt.bind(id).first() as any\n\n return c.json({\n data: {\n id: updatedContent.id,\n title: updatedContent.title,\n slug: updatedContent.slug,\n status: updatedContent.status,\n collectionId: updatedContent.collection_id,\n data: updatedContent.data ? JSON.parse(updatedContent.data) : {},\n created_at: updatedContent.created_at,\n updated_at: updatedContent.updated_at\n }\n })\n } catch (error) {\n console.error('Error updating content:', error)\n return c.json({\n error: 'Failed to update content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// DELETE /api/content/:id - Delete content (requires authentication)\napiContentCrudRoutes.delete('/:id', requireAuth(), requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if content exists\n const existingStmt = db.prepare('SELECT collection_id FROM content WHERE id = ?')\n const existing = await existingStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Content not found' }, 404)\n }\n\n // Delete the content (hard delete for API, soft delete happens in admin routes)\n const deleteStmt = db.prepare('DELETE FROM content WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.api!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existing.collection_id}:*`)\n await cache.invalidate('content-filtered:*')\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting content:', error)\n return c.json({\n error: 'Failed to delete content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\nexport default apiContentCrudRoutes\n","import { Hono } from 'hono'\nimport { cors } from 'hono/cors'\nimport { schemaDefinitions } from '../schemas'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { QueryFilterBuilder, QueryFilter } from '../utils'\nimport { isPluginActive, optionalAuth } from '../middleware'\nimport { normalizePublicContentFilter } from './api-content-access-policy'\nimport apiContentCrudRoutes from './api-content-crud'\nimport type { Bindings, Variables as AppVariables } from '../app'\n\n// Extend Variables with API-specific fields\ninterface Variables extends AppVariables {\n startTime: number\n cacheEnabled?: boolean\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Add timing middleware\napiRoutes.use('*', async (c, next) => {\n const startTime = Date.now()\n c.set('startTime', startTime)\n await next()\n const totalTime = Date.now() - startTime\n c.header('X-Response-Time', `${totalTime}ms`)\n})\n\n// Check if cache plugin is active\napiRoutes.use('*', async (c, next) => {\n const cacheEnabled = await isPluginActive(c.env.DB, 'core-cache')\n c.set('cacheEnabled', cacheEnabled)\n await next()\n})\n\n// Add CORS middleware\napiRoutes.use('*', cors({\n origin: (origin, c) => {\n const allowed = (c.env as any)?.CORS_ORIGINS as string | undefined\n if (!allowed) return null // No env var = reject cross-origin (secure default)\n const list = allowed.split(',').map((s: string) => s.trim())\n return list.includes(origin) ? origin : null\n },\n allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowHeaders: ['Content-Type', 'Authorization', 'X-API-Key']\n}))\n\n// Helper function to add timing metadata\nfunction addTimingMeta(c: any, meta: any = {}, executionStartTime?: number) {\n const totalTime = Date.now() - c.get('startTime')\n const executionTime = executionStartTime ? Date.now() - executionStartTime : undefined\n\n return {\n ...meta,\n timing: {\n total: totalTime,\n execution: executionTime,\n unit: 'ms'\n }\n }\n}\n\n// Root endpoint - OpenAPI 3.0.0 specification\napiRoutes.get('/', (c) => {\n const baseUrl = new URL(c.req.url)\n const serverUrl = `${baseUrl.protocol}//${baseUrl.host}`\n\n return c.json({\n openapi: '3.0.0',\n info: {\n title: 'SonicJS AI API',\n version: '0.1.0',\n description: 'RESTful API for SonicJS headless CMS - a modern, AI-powered content management system built on Cloudflare Workers',\n contact: {\n name: 'SonicJS Support',\n url: `${serverUrl}/docs`,\n email: 'support@sonicjs.com'\n },\n license: {\n name: 'MIT',\n url: 'https://opensource.org/licenses/MIT'\n }\n },\n servers: [\n {\n url: serverUrl,\n description: 'Current server'\n }\n ],\n paths: {\n '/api/': {\n get: {\n summary: 'API Information',\n description: 'Returns OpenAPI specification for the SonicJS API',\n operationId: 'getApiInfo',\n tags: ['System'],\n responses: {\n '200': {\n description: 'OpenAPI specification',\n content: {\n 'application/json': {\n schema: { type: 'object' }\n }\n }\n }\n }\n }\n },\n '/api/health': {\n get: {\n summary: 'Health Check',\n description: 'Returns API health status and available schemas',\n operationId: 'getHealth',\n tags: ['System'],\n responses: {\n '200': {\n description: 'Health status',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n status: { type: 'string', example: 'healthy' },\n timestamp: { type: 'string', format: 'date-time' },\n schemas: { type: 'array', items: { type: 'string' } }\n }\n }\n }\n }\n }\n }\n }\n },\n '/api/collections': {\n get: {\n summary: 'List Collections',\n description: 'Returns all active collections with their schemas',\n operationId: 'getCollections',\n tags: ['Content'],\n responses: {\n '200': {\n description: 'List of collections',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n name: { type: 'string' },\n display_name: { type: 'string' },\n schema: { type: 'object' },\n is_active: { type: 'integer' }\n }\n }\n },\n meta: { type: 'object' }\n }\n }\n }\n }\n }\n }\n }\n },\n '/api/collections/{collection}/content': {\n get: {\n summary: 'Get Collection Content',\n description: 'Returns content items from a specific collection with filtering support. Anonymous, viewer, and author requests are restricted to published content; admin and editor requests may query other statuses.',\n operationId: 'getCollectionContent',\n tags: ['Content'],\n parameters: [\n {\n name: 'collection',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Collection name'\n },\n {\n name: 'limit',\n in: 'query',\n schema: { type: 'integer', default: 50, maximum: 1000 },\n description: 'Maximum number of items to return'\n },\n {\n name: 'offset',\n in: 'query',\n schema: { type: 'integer', default: 0 },\n description: 'Number of items to skip'\n },\n {\n name: 'status',\n in: 'query',\n schema: { type: 'string', enum: ['draft', 'published', 'archived'] },\n description: 'Filter by content status. Anonymous, viewer, and author requests are limited to published content.'\n }\n ],\n responses: {\n '200': {\n description: 'List of content items',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: { type: 'array', items: { type: 'object' } },\n meta: { type: 'object' }\n }\n }\n }\n }\n },\n '404': {\n description: 'Collection not found'\n }\n }\n }\n },\n '/api/content': {\n get: {\n summary: 'List Content',\n description: 'Returns content items with advanced filtering support. Anonymous, viewer, and author requests are restricted to published content; admin and editor requests may query other statuses.',\n operationId: 'getContent',\n tags: ['Content'],\n parameters: [\n {\n name: 'collection',\n in: 'query',\n schema: { type: 'string' },\n description: 'Filter by collection name'\n },\n {\n name: 'limit',\n in: 'query',\n schema: { type: 'integer', default: 50, maximum: 1000 },\n description: 'Maximum number of items to return'\n },\n {\n name: 'offset',\n in: 'query',\n schema: { type: 'integer', default: 0 },\n description: 'Number of items to skip'\n },\n {\n name: 'status',\n in: 'query',\n schema: { type: 'string', enum: ['draft', 'published', 'archived'] },\n description: 'Filter by content status. Anonymous, viewer, and author requests are limited to published content.'\n }\n ],\n responses: {\n '200': {\n description: 'List of content items',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n data: { type: 'array', items: { type: 'object' } },\n meta: { type: 'object' }\n }\n }\n }\n }\n }\n }\n },\n post: {\n summary: 'Create Content',\n description: 'Creates a new content item',\n operationId: 'createContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['collection_id', 'title'],\n properties: {\n collection_id: { type: 'string' },\n title: { type: 'string' },\n slug: { type: 'string' },\n status: { type: 'string', enum: ['draft', 'published', 'archived'] },\n data: { type: 'object' }\n }\n }\n }\n }\n },\n responses: {\n '201': { description: 'Content created successfully' },\n '400': { description: 'Invalid request body' },\n '401': { description: 'Unauthorized' }\n }\n }\n },\n '/api/content/{id}': {\n get: {\n summary: 'Get Content by ID',\n description: 'Returns a specific content item by ID',\n operationId: 'getContentById',\n tags: ['Content'],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content item' },\n '404': { description: 'Content not found' }\n }\n },\n put: {\n summary: 'Update Content',\n description: 'Updates an existing content item',\n operationId: 'updateContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content updated successfully' },\n '401': { description: 'Unauthorized' },\n '404': { description: 'Content not found' }\n }\n },\n delete: {\n summary: 'Delete Content',\n description: 'Deletes a content item',\n operationId: 'deleteContent',\n tags: ['Content'],\n security: [{ bearerAuth: [] }],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n description: 'Content item ID'\n }\n ],\n responses: {\n '200': { description: 'Content deleted successfully' },\n '401': { description: 'Unauthorized' },\n '404': { description: 'Content not found' }\n }\n }\n },\n '/api/media': {\n get: {\n summary: 'List Media',\n description: 'Returns all media files with pagination',\n operationId: 'getMedia',\n tags: ['Media'],\n responses: {\n '200': { description: 'List of media files' }\n }\n }\n },\n '/api/media/upload': {\n post: {\n summary: 'Upload Media',\n description: 'Uploads a new media file to R2 storage',\n operationId: 'uploadMedia',\n tags: ['Media'],\n security: [{ bearerAuth: [] }],\n requestBody: {\n required: true,\n content: {\n 'multipart/form-data': {\n schema: {\n type: 'object',\n properties: {\n file: { type: 'string', format: 'binary' }\n }\n }\n }\n }\n },\n responses: {\n '201': { description: 'Media uploaded successfully' },\n '401': { description: 'Unauthorized' }\n }\n }\n }\n },\n components: {\n securitySchemes: {\n bearerAuth: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT'\n }\n },\n schemas: {\n Content: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n title: { type: 'string' },\n slug: { type: 'string' },\n status: { type: 'string', enum: ['draft', 'published', 'archived'] },\n collectionId: { type: 'string', format: 'uuid' },\n data: { type: 'object' },\n created_at: { type: 'integer' },\n updated_at: { type: 'integer' }\n }\n },\n Collection: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n name: { type: 'string' },\n display_name: { type: 'string' },\n description: { type: 'string' },\n schema: { type: 'object' },\n is_active: { type: 'integer' }\n }\n },\n Media: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid' },\n filename: { type: 'string' },\n mimetype: { type: 'string' },\n size: { type: 'integer' },\n url: { type: 'string' }\n }\n },\n Error: {\n type: 'object',\n properties: {\n error: { type: 'string' },\n details: { type: 'string' }\n }\n }\n }\n },\n tags: [\n { name: 'System', description: 'System and health endpoints' },\n { name: 'Content', description: 'Content management operations' },\n { name: 'Media', description: 'Media file operations' }\n ]\n })\n})\n\n// Health check endpoint\napiRoutes.get('/health', (c) => {\n return c.json({\n status: 'healthy',\n timestamp: new Date().toISOString(),\n schemas: schemaDefinitions.map(s => s.name)\n })\n})\n\n// Basic collections endpoint\napiRoutes.get('/collections', async (c) => {\n const executionStart = Date.now()\n\n try {\n const db = c.env.DB\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('collections', 'all')\n\n // Use cache only if cache plugin is active\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n const stmt = db.prepare(\"SELECT * FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const { results } = await stmt.all()\n\n // Parse schema and format results\n const transformedResults = results.map((row: any) => ({\n ...row,\n schema: row.schema ? JSON.parse(row.schema) : {},\n is_active: row.is_active // Keep as number (1 or 0)\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n count: results.length,\n timestamp: new Date().toISOString(),\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache plugin is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching collections:', error)\n return c.json({ error: 'Failed to fetch collections' }, 500)\n }\n})\n\n// Basic content endpoint with advanced filtering\napiRoutes.get('/content', optionalAuth(), async (c) => {\n const executionStart = Date.now()\n\n try {\n const db = c.env.DB\n const queryParams = c.req.query()\n\n // Handle collection parameter - convert collection name to collection_id\n if (queryParams.collection) {\n const collectionName = queryParams.collection\n const collectionStmt = db.prepare('SELECT id FROM collections WHERE name = ? AND is_active = 1')\n const collectionResult = await collectionStmt.bind(collectionName).first()\n\n if (collectionResult) {\n // Replace 'collection' param with 'collection_id' for the filter builder\n queryParams.collection_id = (collectionResult as any).id\n delete queryParams.collection\n } else {\n // Collection not found - return empty result\n return c.json({\n data: [],\n meta: addTimingMeta(c, {\n count: 0,\n timestamp: new Date().toISOString(),\n message: `Collection '${collectionName}' not found`\n }, executionStart)\n })\n }\n }\n\n // Parse filter from query parameters\n const filter: QueryFilter = QueryFilterBuilder.parseFromQuery(queryParams)\n const normalizedFilter = normalizePublicContentFilter(filter, c.get('user')?.role)\n\n // Set default limit if not provided\n if (!normalizedFilter.limit) {\n normalizedFilter.limit = 50\n }\n normalizedFilter.limit = Math.min(normalizedFilter.limit, 1000) // Max 1000\n\n // Build SQL query from filter\n const builder = new QueryFilterBuilder()\n const queryResult = builder.build('content', normalizedFilter)\n\n // Check for query building errors\n if (queryResult.errors.length > 0) {\n return c.json({\n error: 'Invalid filter parameters',\n details: queryResult.errors\n }, 400)\n }\n\n // Only use cache if cache plugin is active\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('content-filtered', JSON.stringify({ filter: normalizedFilter, query: queryResult.sql }))\n\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n // Execute query with parameters\n const stmt = db.prepare(queryResult.sql)\n const boundStmt = queryResult.params.length > 0\n ? stmt.bind(...queryResult.params)\n : stmt\n\n const { results } = await boundStmt.all()\n\n // Transform results to match API spec (camelCase)\n const transformedResults = results.map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n collectionId: row.collection_id,\n data: row.data ? JSON.parse(row.data) : {},\n created_at: row.created_at,\n updated_at: row.updated_at\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n count: results.length,\n timestamp: new Date().toISOString(),\n filter: normalizedFilter,\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// Collection-specific routes with advanced filtering\napiRoutes.get('/collections/:collection/content', optionalAuth(), async (c) => {\n const executionStart = Date.now()\n\n try {\n const collection = c.req.param('collection')\n const db = c.env.DB\n const queryParams = c.req.query()\n\n // First check if collection exists\n const collectionStmt = db.prepare('SELECT * FROM collections WHERE name = ? AND is_active = 1')\n const collectionResult = await collectionStmt.bind(collection).first()\n\n if (!collectionResult) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Parse filter from query parameters\n const filter: QueryFilter = QueryFilterBuilder.parseFromQuery(queryParams)\n const normalizedFilter = normalizePublicContentFilter(filter, c.get('user')?.role)\n\n // Add collection_id filter to where clause\n if (!normalizedFilter.where) {\n normalizedFilter.where = { and: [] }\n }\n\n if (!normalizedFilter.where.and) {\n normalizedFilter.where.and = []\n }\n\n // Add collection filter\n normalizedFilter.where.and.push({\n field: 'collection_id',\n operator: 'equals',\n value: (collectionResult as any).id\n })\n\n // Set default limit if not provided\n if (!normalizedFilter.limit) {\n normalizedFilter.limit = 50\n }\n normalizedFilter.limit = Math.min(normalizedFilter.limit, 1000)\n\n // Build SQL query from filter\n const builder = new QueryFilterBuilder()\n const queryResult = builder.build('content', normalizedFilter)\n\n // Check for query building errors\n if (queryResult.errors.length > 0) {\n return c.json({\n error: 'Invalid filter parameters',\n details: queryResult.errors\n }, 400)\n }\n\n // Generate cache key\n const cacheEnabled = c.get('cacheEnabled')\n const cache = getCacheService(CACHE_CONFIGS.api!)\n const cacheKey = cache.generateKey('collection-content-filtered', `${collection}:${JSON.stringify({ filter: normalizedFilter, query: queryResult.sql })}`)\n\n // Only check cache if plugin is enabled\n if (cacheEnabled) {\n const cacheResult = await cache.getWithSource(cacheKey)\n if (cacheResult.hit && cacheResult.data) {\n // Add cache headers\n c.header('X-Cache-Status', 'HIT')\n c.header('X-Cache-Source', cacheResult.source)\n if (cacheResult.ttl) {\n c.header('X-Cache-TTL', Math.floor(cacheResult.ttl).toString())\n }\n\n // Add cache info and timing to meta\n const dataWithMeta = {\n ...cacheResult.data,\n meta: addTimingMeta(c, {\n ...cacheResult.data.meta,\n cache: {\n hit: true,\n source: cacheResult.source,\n ttl: cacheResult.ttl ? Math.floor(cacheResult.ttl) : undefined\n }\n }, executionStart)\n }\n\n return c.json(dataWithMeta)\n }\n }\n\n // Cache miss - fetch from database\n c.header('X-Cache-Status', 'MISS')\n c.header('X-Cache-Source', 'database')\n\n // Execute query with parameters\n const stmt = db.prepare(queryResult.sql)\n const boundStmt = queryResult.params.length > 0\n ? stmt.bind(...queryResult.params)\n : stmt\n\n const { results } = await boundStmt.all()\n\n // Transform results to match API spec (camelCase)\n const transformedResults = results.map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n collectionId: row.collection_id,\n data: row.data ? JSON.parse(row.data) : {},\n created_at: row.created_at,\n updated_at: row.updated_at\n }))\n\n const responseData = {\n data: transformedResults,\n meta: addTimingMeta(c, {\n collection: {\n ...(collectionResult as any),\n schema: (collectionResult as any).schema ? JSON.parse((collectionResult as any).schema) : {}\n },\n count: results.length,\n timestamp: new Date().toISOString(),\n filter: normalizedFilter,\n cache: {\n hit: false,\n source: 'database'\n }\n }, executionStart)\n }\n\n // Cache the response only if cache plugin is enabled\n if (cacheEnabled) {\n await cache.set(cacheKey, responseData)\n }\n\n return c.json(responseData)\n } catch (error) {\n console.error('Error fetching content:', error)\n return c.json({\n error: 'Failed to fetch content',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n})\n\n// Mount CRUD routes for content\napiRoutes.route('/content', apiContentCrudRoutes)\n\nexport default apiRoutes\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { requireAuth } from '../middleware'\nimport type { Bindings, Variables } from '../app'\n\n// Helper function to generate short IDs (replacement for nanoid)\nfunction generateId(): string {\n return crypto.randomUUID().replace(/-/g, '').substring(0, 21)\n}\n\n// Helper function for emitting events (simplified for core package)\nasync function emitEvent(eventName: string, data: any) {\n console.log(`[Event] ${eventName}:`, data)\n // TODO: Implement proper event system when plugin architecture is ready\n}\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nexport const apiMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply auth middleware to all routes\napiMediaRoutes.use('*', requireAuth())\n\n// Upload single file\napiMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')!\n const formData = await c.req.formData()\n const fileData = formData.get('file')\n\n if (!fileData || typeof fileData === 'string') {\n return c.json({ error: 'No file provided' }, 400)\n }\n\n const file = fileData as File\n\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n return c.json({ \n error: 'File validation failed', \n details: validation.error.issues \n }, 400)\n }\n\n // Generate unique filename and R2 key\n const fileId = generateId()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n return c.json({ error: 'Failed to upload file to storage' }, 500)\n }\n\n // Generate public URL using environment variable for bucket name\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const publicUrl = `https://pub-${bucketName}.r2.dev/${r2Key}`\n \n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate thumbnail URL for images\n let thumbnailUrl: string | null = null\n if (file.type.startsWith('image/') && c.env.IMAGES_ACCOUNT_ID) {\n thumbnailUrl = `https://imagedelivery.net/${c.env.IMAGES_ACCOUNT_ID}/${r2Key}/thumbnail`\n }\n\n // Save to database\n const mediaRecord = {\n id: fileId,\n filename: filename,\n original_name: file.name,\n mime_type: file.type,\n size: file.size,\n width,\n height,\n folder,\n r2_key: r2Key,\n public_url: publicUrl,\n thumbnail_url: thumbnailUrl,\n uploaded_by: user.userId,\n uploaded_at: Math.floor(Date.now() / 1000),\n created_at: Math.floor(Date.now() / 1000)\n }\n\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n mediaRecord.id,\n mediaRecord.filename,\n mediaRecord.original_name,\n mediaRecord.mime_type,\n mediaRecord.size,\n mediaRecord.width,\n mediaRecord.height,\n mediaRecord.folder,\n mediaRecord.r2_key,\n mediaRecord.public_url,\n mediaRecord.thumbnail_url,\n mediaRecord.uploaded_by,\n mediaRecord.uploaded_at\n ).run()\n\n // Emit media upload event\n await emitEvent('media.upload', { id: mediaRecord.id, filename: mediaRecord.filename })\n\n return c.json({\n success: true,\n file: {\n id: mediaRecord.id,\n filename: mediaRecord.filename,\n originalName: mediaRecord.original_name,\n mimeType: mediaRecord.mime_type,\n size: mediaRecord.size,\n width: mediaRecord.width,\n height: mediaRecord.height,\n r2_key: mediaRecord.r2_key,\n publicUrl: mediaRecord.public_url,\n thumbnailUrl: mediaRecord.thumbnail_url,\n uploadedAt: new Date(mediaRecord.uploaded_at * 1000).toISOString()\n }\n })\n } catch (error) {\n console.error('Upload error:', error)\n return c.json({ error: 'Upload failed' }, 500)\n }\n})\n\n// Upload multiple files\napiMediaRoutes.post('/upload-multiple', async (c) => {\n try {\n const user = c.get('user')!\n const formData = await c.req.formData()\n const filesData = formData.getAll('files')\n\n // Filter out strings and ensure we only have File objects\n const files: File[] = []\n for (const f of filesData) {\n if (typeof f !== 'string') {\n files.push(f as File)\n }\n }\n\n if (!files || files.length === 0) {\n return c.json({ error: 'No files provided' }, 400)\n }\n\n const uploadResults = []\n const errors = []\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: 'Validation failed',\n details: validation.error.issues\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = generateId()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Generate public URL using environment variable for bucket name\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const publicUrl = `https://pub-${bucketName}.r2.dev/${r2Key}`\n \n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n \n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate thumbnail URL for images\n let thumbnailUrl: string | null = null\n if (file.type.startsWith('image/') && c.env.IMAGES_ACCOUNT_ID) {\n thumbnailUrl = `https://imagedelivery.net/${c.env.IMAGES_ACCOUNT_ID}/${r2Key}/thumbnail`\n }\n\n // Save to database\n const mediaRecord = {\n id: fileId,\n filename: filename,\n original_name: file.name,\n mime_type: file.type,\n size: file.size,\n width,\n height,\n folder,\n r2_key: r2Key,\n public_url: publicUrl,\n thumbnail_url: thumbnailUrl,\n uploaded_by: user.userId,\n uploaded_at: Math.floor(Date.now() / 1000)\n }\n\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n mediaRecord.id,\n mediaRecord.filename,\n mediaRecord.original_name,\n mediaRecord.mime_type,\n mediaRecord.size,\n mediaRecord.width,\n mediaRecord.height,\n mediaRecord.folder,\n mediaRecord.r2_key,\n mediaRecord.public_url,\n mediaRecord.thumbnail_url,\n mediaRecord.uploaded_by,\n mediaRecord.uploaded_at\n ).run()\n\n uploadResults.push({\n id: mediaRecord.id,\n filename: mediaRecord.filename,\n originalName: mediaRecord.original_name,\n mimeType: mediaRecord.mime_type,\n size: mediaRecord.size,\n width: mediaRecord.width,\n height: mediaRecord.height,\n r2_key: mediaRecord.r2_key,\n publicUrl: mediaRecord.public_url,\n thumbnailUrl: mediaRecord.thumbnail_url,\n uploadedAt: new Date(mediaRecord.uploaded_at * 1000).toISOString()\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media upload event if any uploads succeeded\n if (uploadResults.length > 0) {\n await emitEvent('media.upload', { count: uploadResults.length })\n }\n\n return c.json({\n success: uploadResults.length > 0,\n uploaded: uploadResults,\n errors: errors,\n summary: {\n total: files.length,\n successful: uploadResults.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Multiple upload error:', error)\n return c.json({ error: 'Upload failed' }, 500)\n }\n})\n\n// Bulk delete files\napiMediaRoutes.post('/bulk-delete', async (c) => {\n try {\n const user = c.get('user')!\n const body = await c.req.json()\n const fileIds = body.fileIds as string[]\n \n if (!fileIds || !Array.isArray(fileIds) || fileIds.length === 0) {\n return c.json({ error: 'No file IDs provided' }, 400)\n }\n\n // Limit bulk operations to prevent abuse\n if (fileIds.length > 50) {\n return c.json({ error: 'Too many files selected. Maximum 50 files per operation.' }, 400)\n }\n\n const results = []\n const errors = []\n\n for (const fileId of fileIds) {\n try {\n // Get file record (including already deleted files to check if they exist at all)\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ?')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n errors.push({ fileId, error: 'File not found' })\n continue\n }\n\n // Skip if already deleted (treat as success)\n if (fileRecord.deleted_at !== null) {\n console.log(`File ${fileId} already deleted, skipping`)\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n alreadyDeleted: true\n })\n continue\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n errors.push({ fileId, error: 'Permission denied' })\n continue\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn(`Failed to delete from R2 for file ${fileId}:`, error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true\n })\n } catch (error) {\n errors.push({\n fileId,\n error: 'Delete failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media delete event if any deletes succeeded\n if (results.length > 0) {\n await emitEvent('media.delete', { count: results.length, ids: fileIds })\n }\n\n return c.json({\n success: results.length > 0,\n deleted: results,\n errors: errors,\n summary: {\n total: fileIds.length,\n successful: results.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Bulk delete error:', error)\n return c.json({ error: 'Bulk delete failed' }, 500)\n }\n})\n\n// Create folder\napiMediaRoutes.post('/create-folder', async (c) => {\n try {\n const body = await c.req.json()\n const folderName = body.folderName as string\n\n if (!folderName || typeof folderName !== 'string') {\n return c.json({ success: false, error: 'No folder name provided' }, 400)\n }\n\n // Validate folder name format\n const folderPattern = /^[a-z0-9-_]+$/\n if (!folderPattern.test(folderName)) {\n return c.json({\n success: false,\n error: 'Folder name can only contain lowercase letters, numbers, hyphens, and underscores'\n }, 400)\n }\n\n // Check if folder already exists in the database\n const checkStmt = c.env.DB.prepare('SELECT COUNT(*) as count FROM media WHERE folder = ? AND deleted_at IS NULL')\n const existingFolder = await checkStmt.bind(folderName).first() as any\n\n if (existingFolder && existingFolder.count > 0) {\n return c.json({\n success: false,\n error: `Folder \"${folderName}\" already exists`\n }, 400)\n }\n\n // Note: R2 folders are virtual - they only exist when files are uploaded to them\n // Return success message explaining this behavior\n return c.json({\n success: true,\n message: `Folder \"${folderName}\" is ready. Upload files to this folder to make it appear in the media library.`,\n folder: folderName,\n note: 'Folders appear automatically when you upload files to them'\n })\n } catch (error) {\n console.error('Create folder error:', error)\n return c.json({ success: false, error: 'Failed to create folder' }, 500)\n }\n})\n\n// Bulk move files to folder\napiMediaRoutes.post('/bulk-move', async (c) => {\n try {\n const user = c.get('user')!\n const body = await c.req.json()\n const fileIds = body.fileIds as string[]\n const targetFolder = body.folder as string\n\n if (!fileIds || !Array.isArray(fileIds) || fileIds.length === 0) {\n return c.json({ error: 'No file IDs provided' }, 400)\n }\n\n if (!targetFolder || typeof targetFolder !== 'string') {\n return c.json({ error: 'No target folder provided' }, 400)\n }\n\n // Limit bulk operations to prevent abuse\n if (fileIds.length > 50) {\n return c.json({ error: 'Too many files selected. Maximum 50 files per operation.' }, 400)\n }\n\n const results = []\n const errors = []\n\n for (const fileId of fileIds) {\n try {\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n errors.push({ fileId, error: 'File not found' })\n continue\n }\n\n // Check permissions (only allow move by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n errors.push({ fileId, error: 'Permission denied' })\n continue\n }\n\n // Skip if already in target folder\n if (fileRecord.folder === targetFolder) {\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n skipped: true\n })\n continue\n }\n\n // Generate new R2 key with new folder\n const oldR2Key = fileRecord.r2_key\n const filename = oldR2Key.split('/').pop() || fileRecord.filename\n const newR2Key = `${targetFolder}/${filename}`\n\n // Copy file to new location in R2\n try {\n const object = await c.env.MEDIA_BUCKET.get(oldR2Key)\n if (!object) {\n errors.push({ fileId, error: 'File not found in storage' })\n continue\n }\n\n await c.env.MEDIA_BUCKET.put(newR2Key, object.body, {\n httpMetadata: object.httpMetadata,\n customMetadata: {\n ...object.customMetadata,\n movedBy: user.userId,\n movedAt: new Date().toISOString()\n }\n })\n\n // Delete old file from R2\n await c.env.MEDIA_BUCKET.delete(oldR2Key)\n } catch (error) {\n console.warn(`Failed to move file in R2 for file ${fileId}:`, error)\n errors.push({ fileId, error: 'Failed to move file in storage' })\n continue\n }\n\n // Update database with new folder and R2 key\n const bucketName = c.env.BUCKET_NAME || 'sonicjs-media-dev'\n const newPublicUrl = `https://pub-${bucketName}.r2.dev/${newR2Key}`\n\n const updateStmt = c.env.DB.prepare(`\n UPDATE media\n SET folder = ?, r2_key = ?, public_url = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n targetFolder,\n newR2Key,\n newPublicUrl,\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n results.push({\n fileId,\n filename: fileRecord.original_name,\n success: true,\n skipped: false\n })\n } catch (error) {\n errors.push({\n fileId,\n error: 'Move failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Emit media move event if any moves succeeded\n if (results.length > 0) {\n await emitEvent('media.move', { count: results.length, targetFolder, ids: fileIds })\n }\n\n return c.json({\n success: results.length > 0,\n moved: results,\n errors: errors,\n summary: {\n total: fileIds.length,\n successful: results.length,\n failed: errors.length\n }\n })\n } catch (error) {\n console.error('Bulk move error:', error)\n return c.json({ error: 'Bulk move failed' }, 500)\n }\n})\n\n// Delete file\napiMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')!\n const fileId = c.req.param('id')\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.json({ error: 'File not found' }, 404)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n return c.json({ error: 'Permission denied' }, 403)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // Emit media delete event\n await emitEvent('media.delete', { id: fileId })\n\n return c.json({ success: true, message: 'File deleted successfully' })\n } catch (error) {\n console.error('Delete error:', error)\n return c.json({ error: 'Delete failed' }, 500)\n }\n})\n\n// Update file metadata\napiMediaRoutes.patch('/:id', async (c) => {\n try {\n const user = c.get('user')!\n const fileId = c.req.param('id')\n const body = await c.req.json()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.json({ error: 'File not found' }, 404)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user.userId && user.role !== 'admin') {\n return c.json({ error: 'Permission denied' }, 403)\n }\n\n // Update allowed fields\n const allowedFields = ['alt', 'caption', 'tags', 'folder']\n const updates = []\n const values = []\n \n for (const [key, value] of Object.entries(body)) {\n if (allowedFields.includes(key)) {\n updates.push(`${key} = ?`)\n values.push(key === 'tags' ? JSON.stringify(value) : value)\n }\n }\n\n if (updates.length === 0) {\n return c.json({ error: 'No valid fields to update' }, 400)\n }\n\n updates.push('updated_at = ?')\n values.push(Math.floor(Date.now() / 1000))\n values.push(fileId)\n\n const updateStmt = c.env.DB.prepare(`\n UPDATE media SET ${updates.join(', ')} WHERE id = ?\n `)\n await updateStmt.bind(...values).run()\n\n // Emit media update event\n await emitEvent('media.update', { id: fileId })\n\n return c.json({ success: true, message: 'File updated successfully' })\n } catch (error) {\n console.error('Update error:', error)\n return c.json({ error: 'Update failed' }, 500)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n // This is a simplified implementation\n // In a real-world scenario, you'd use a proper image processing library\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length) {\n if (i + 8 >= uint8Array.length) break\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n if (i + 8 < uint8Array.length) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n }\n if (i + 3 < uint8Array.length) {\n i += 2 + ((uint8Array[i + 2]! << 8) | uint8Array[i + 3]!)\n } else {\n break\n }\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\nexport default apiMediaRoutes","/**\n * API System Routes\n *\n * Provides system health, status, and metadata endpoints\n * These are lightweight routes without heavy dependencies\n */\n\nimport { Hono } from 'hono'\nimport type { Bindings, Variables } from '../app'\n\nexport const apiSystemRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * System health check\n * GET /api/system/health\n */\napiSystemRoutes.get('/health', async (c) => {\n try {\n const startTime = Date.now()\n\n // Check database connectivity\n let dbStatus = 'unknown'\n let dbLatency = 0\n\n try {\n const dbStart = Date.now()\n await c.env.DB.prepare('SELECT 1').first()\n dbLatency = Date.now() - dbStart\n dbStatus = 'healthy'\n } catch (error) {\n console.error('Database health check failed:', error)\n dbStatus = 'unhealthy'\n }\n\n // Check KV connectivity (if available)\n let kvStatus = 'not_configured'\n let kvLatency = 0\n\n if (c.env.CACHE_KV) {\n try {\n const kvStart = Date.now()\n await c.env.CACHE_KV.get('__health_check__')\n kvLatency = Date.now() - kvStart\n kvStatus = 'healthy'\n } catch (error) {\n console.error('KV health check failed:', error)\n kvStatus = 'unhealthy'\n }\n }\n\n // Check R2 connectivity (if available)\n let r2Status = 'not_configured'\n\n if (c.env.MEDIA_BUCKET) {\n try {\n await c.env.MEDIA_BUCKET.head('__health_check__')\n r2Status = 'healthy'\n } catch (error) {\n // R2 head on non-existent key returns null, not an error\n // This is expected, so we consider it healthy\n r2Status = 'healthy'\n }\n }\n\n const totalLatency = Date.now() - startTime\n const overall = dbStatus === 'healthy' ? 'healthy' : 'degraded'\n\n return c.json({\n status: overall,\n timestamp: new Date().toISOString(),\n uptime: totalLatency,\n checks: {\n database: {\n status: dbStatus,\n latency: dbLatency\n },\n cache: {\n status: kvStatus,\n latency: kvLatency\n },\n storage: {\n status: r2Status\n }\n },\n environment: c.env.ENVIRONMENT || 'production'\n })\n } catch (error) {\n console.error('Health check failed:', error)\n return c.json({\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n error: 'Health check failed'\n }, 503)\n }\n})\n\n/**\n * System information\n * GET /api/system/info\n */\napiSystemRoutes.get('/info', (c) => {\n const appVersion = c.get('appVersion') || '1.0.0'\n\n return c.json({\n name: 'SonicJS',\n version: appVersion,\n description: 'Modern headless CMS built on Cloudflare Workers',\n endpoints: {\n api: '/api',\n auth: '/auth',\n health: '/api/system/health',\n docs: '/docs'\n },\n features: {\n content: true,\n media: true,\n auth: true,\n collections: true,\n caching: !!c.env.CACHE_KV,\n storage: !!c.env.MEDIA_BUCKET\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * System stats\n * GET /api/system/stats\n */\napiSystemRoutes.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get content statistics\n const contentStats = await db.prepare(`\n SELECT COUNT(*) as total_content\n FROM content\n WHERE deleted_at IS NULL\n `).first() as any\n\n // Get media statistics\n const mediaStats = await db.prepare(`\n SELECT\n COUNT(*) as total_files,\n SUM(size) as total_size\n FROM media\n WHERE deleted_at IS NULL\n `).first() as any\n\n // Get user statistics\n const userStats = await db.prepare(`\n SELECT COUNT(*) as total_users\n FROM users\n `).first() as any\n\n return c.json({\n content: {\n total: contentStats?.total_content || 0\n },\n media: {\n total_files: mediaStats?.total_files || 0,\n total_size_bytes: mediaStats?.total_size || 0,\n total_size_mb: Math.round((mediaStats?.total_size || 0) / 1024 / 1024 * 100) / 100\n },\n users: {\n total: userStats?.total_users || 0\n },\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Stats query failed:', error)\n return c.json({ error: 'Failed to fetch system statistics' }, 500)\n }\n})\n\n/**\n * Database ping\n * GET /api/system/ping\n */\napiSystemRoutes.get('/ping', async (c) => {\n try {\n const start = Date.now()\n await c.env.DB.prepare('SELECT 1').first()\n const latency = Date.now() - start\n\n return c.json({\n pong: true,\n latency,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Ping failed:', error)\n return c.json({\n pong: false,\n error: 'Database connection failed'\n }, 503)\n }\n})\n\n/**\n * Environment check\n * GET /api/system/env\n */\napiSystemRoutes.get('/env', (c) => {\n return c.json({\n environment: c.env.ENVIRONMENT || 'production',\n features: {\n database: !!c.env.DB,\n cache: !!c.env.CACHE_KV,\n media_bucket: !!c.env.MEDIA_BUCKET,\n email_queue: !!c.env.EMAIL_QUEUE,\n sendgrid: !!c.env.SENDGRID_API_KEY,\n cloudflare_images: !!(c.env.IMAGES_ACCOUNT_ID && c.env.IMAGES_API_TOKEN)\n },\n timestamp: new Date().toISOString()\n })\n})\n\nexport default apiSystemRoutes\n","/**\n * Admin API Routes\n *\n * Provides JSON API endpoints for admin operations\n * These routes complement the admin UI and can be used programmatically\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\n// import { zValidator } from '@hono/zod-validator'\nimport { requireAuth, requireRole } from '../middleware'\nimport type { Bindings, Variables } from '../app'\n\nexport const adminApiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply auth middleware to all admin routes\nadminApiRoutes.use('*', requireAuth())\nadminApiRoutes.use('*', requireRole(['admin', 'editor']))\n\n/**\n * Get dashboard statistics\n * GET /admin/api/stats\n */\nadminApiRoutes.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE c.deleted_at IS NULL AND (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n return c.json({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n mediaSize: mediaSize,\n users: usersCount,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.json({ error: 'Failed to fetch statistics' }, 500)\n }\n})\n\n/**\n * Get storage usage\n * GET /admin/api/storage\n */\nadminApiRoutes.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n return c.json({\n databaseSize,\n mediaSize,\n totalSize: databaseSize + mediaSize,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.json({ error: 'Failed to fetch storage usage' }, 500)\n }\n})\n\n/**\n * Get recent activity\n * GET /admin/api/activity\n */\nadminApiRoutes.get('/activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '10')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const recentActivity = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n let details: any = {}\n try {\n details = row.details ? JSON.parse(row.details) : {}\n } catch (e) {\n console.error('Error parsing activity details:', e)\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n resource_id: row.resource_id,\n details,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n return c.json({\n data: recentActivity,\n count: recentActivity.length,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n return c.json({ error: 'Failed to fetch recent activity' }, 500)\n }\n})\n\n/**\n * Collection management schema\n */\nconst createCollectionSchema = z.object({\n name: z.string().min(1).max(255).regex(/^[a-z0-9_]+$/, 'Must contain only lowercase letters, numbers, and underscores'),\n displayName: z.string().min(1).max(255).optional(),\n display_name: z.string().min(1).max(255).optional(),\n description: z.string().optional()\n}).refine(data => data.displayName || data.display_name, {\n message: 'Either displayName or display_name is required',\n path: ['displayName']\n})\n\nconst updateCollectionSchema = z.object({\n display_name: z.string().min(1).max(255).optional(),\n description: z.string().optional(),\n is_active: z.boolean().optional()\n})\n\n/**\n * Get all collections\n * GET /admin/api/collections\n */\nadminApiRoutes.get('/collections', async (c) => {\n try {\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const includeInactive = c.req.query('includeInactive') === 'true'\n\n let stmt\n let results\n\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, updated_at, is_active, managed\n FROM collections\n WHERE ${includeInactive ? '1=1' : 'is_active = 1'}\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, updated_at, is_active, managed\n FROM collections\n WHERE (source_type IS NULL OR source_type = 'user')\n ${includeInactive ? '' : 'AND is_active = 1'}\n ORDER BY created_at DESC\n `)\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Get field counts\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n is_active: row.is_active === 1,\n managed: row.managed === 1,\n field_count: fieldCounts.get(String(row.id)) || 0\n }))\n\n return c.json({\n data: collections,\n count: collections.length,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Error fetching collections:', error)\n return c.json({ error: 'Failed to fetch collections' }, 500)\n }\n})\n\n/**\n * Get single collection\n * GET /admin/api/collections/:id\n */\nadminApiRoutes.get('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Get collection fields\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n\n const fields = (fieldsResults || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at)\n }))\n\n return c.json({\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n is_active: collection.is_active === 1,\n managed: collection.managed === 1,\n schema: collection.schema ? JSON.parse(collection.schema) : null,\n created_at: Number(collection.created_at),\n updated_at: Number(collection.updated_at),\n fields\n })\n } catch (error) {\n console.error('Error fetching collection:', error)\n return c.json({ error: 'Failed to fetch collection' }, 500)\n }\n})\n\n/**\n * Get reference options for a collection\n * GET /admin/api/references?collection=&search=&limit=20&id=\n */\nadminApiRoutes.get('/references', async (c) => {\n try {\n const db = c.env.DB\n const url = new URL(c.req.url)\n const collectionParams = url.searchParams\n .getAll('collection')\n .flatMap((value) => value.split(','))\n .map((value) => value.trim())\n .filter(Boolean)\n const search = c.req.query('search') || ''\n const id = c.req.query('id') || ''\n const limit = Math.min(Number.parseInt(c.req.query('limit') || '20', 10) || 20, 100)\n\n if (collectionParams.length === 0) {\n return c.json({ error: 'Collection is required' }, 400)\n }\n\n const placeholders = collectionParams.map(() => '?').join(', ')\n const collectionStmt = db.prepare(`\n SELECT id, name, display_name\n FROM collections\n WHERE id IN (${placeholders}) OR name IN (${placeholders})\n `)\n const collectionResults = await collectionStmt\n .bind(...collectionParams, ...collectionParams)\n .all()\n const collections = (collectionResults.results || []) as any[]\n\n if (collections.length === 0) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n const collectionById = Object.fromEntries(\n collections.map((entry) => [\n entry.id,\n {\n id: entry.id,\n name: entry.name,\n display_name: entry.display_name\n }\n ])\n )\n const collectionIds = collections.map((entry) => entry.id)\n\n if (id) {\n const idPlaceholders = collectionIds.map(() => '?').join(', ')\n const itemStmt = db.prepare(`\n SELECT id, title, slug, collection_id\n FROM content\n WHERE id = ? AND collection_id IN (${idPlaceholders})\n LIMIT 1\n `)\n const item = await itemStmt.bind(id, ...collectionIds).first() as any\n\n if (!item) {\n return c.json({ error: 'Reference not found' }, 404)\n }\n\n return c.json({\n data: {\n id: item.id,\n title: item.title,\n slug: item.slug,\n collection: collectionById[item.collection_id]\n }\n })\n }\n\n let stmt\n let results\n\n const listPlaceholders = collectionIds.map(() => '?').join(', ')\n const statusFilterValues = ['published']\n const statusClause = ` AND status IN (${statusFilterValues.map(() => '?').join(', ')})`\n\n if (search) {\n const searchParam = `%${search}%`\n stmt = db.prepare(`\n SELECT id, title, slug, status, updated_at, collection_id\n FROM content\n WHERE collection_id IN (${listPlaceholders})\n AND (title LIKE ? OR slug LIKE ?)\n ${statusClause}\n ORDER BY updated_at DESC\n LIMIT ?\n `)\n const queryResults = await stmt\n .bind(...collectionIds, searchParam, searchParam, ...statusFilterValues, limit)\n .all()\n results = queryResults.results\n } else {\n stmt = db.prepare(`\n SELECT id, title, slug, status, updated_at, collection_id\n FROM content\n WHERE collection_id IN (${listPlaceholders})\n ${statusClause}\n ORDER BY updated_at DESC\n LIMIT ?\n `)\n const queryResults = await stmt\n .bind(...collectionIds, ...statusFilterValues, limit)\n .all()\n results = queryResults.results\n }\n\n const items = (results || []).map((row: any) => ({\n id: row.id,\n title: row.title,\n slug: row.slug,\n status: row.status,\n updated_at: row.updated_at ? Number(row.updated_at) : null,\n collection: collectionById[row.collection_id]\n }))\n\n return c.json({\n data: items,\n count: items.length\n })\n } catch (error) {\n console.error('Error fetching reference options:', error)\n return c.json({ error: 'Failed to fetch references' }, 500)\n }\n})\n\n/**\n * Create collection\n * POST /admin/api/collections\n */\nadminApiRoutes.post('/collections', async (c) => {\n try {\n // Validate content type\n const contentType = c.req.header('Content-Type')\n if (!contentType || !contentType.includes('application/json')) {\n return c.json({ error: 'Content-Type must be application/json' }, 400)\n }\n\n let body\n try {\n body = await c.req.json()\n } catch (e) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n const validation = createCollectionSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const validatedData = validation.data\n const db = c.env.DB\n const _user = c.get('user')\n\n // Handle both camelCase and snake_case for display_name\n const displayName = validatedData.displayName || validatedData.display_name || ''\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(validatedData.name).first()\n\n if (existing) {\n return c.json({ error: 'A collection with this name already exists' }, 400)\n }\n\n // Create basic schema\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n validatedData.name,\n displayName,\n validatedData.description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${validatedData.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({\n id: collectionId,\n name: validatedData.name,\n displayName: displayName,\n description: validatedData.description,\n created_at: now\n }, 201)\n } catch (error) {\n console.error('Error creating collection:', error)\n return c.json({ error: 'Failed to create collection' }, 500)\n }\n})\n\n/**\n * Update collection\n * PATCH /admin/api/collections/:id\n */\nadminApiRoutes.patch('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const body = await c.req.json()\n const validation = updateCollectionSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const validatedData = validation.data\n const db = c.env.DB\n\n // Check if collection exists\n const checkStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const existing = await checkStmt.bind(id).first() as any\n\n if (!existing) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Build update query\n const updateFields: string[] = []\n const updateParams: any[] = []\n\n if (validatedData.display_name !== undefined) {\n updateFields.push('display_name = ?')\n updateParams.push(validatedData.display_name)\n }\n\n if (validatedData.description !== undefined) {\n updateFields.push('description = ?')\n updateParams.push(validatedData.description)\n }\n\n if (validatedData.is_active !== undefined) {\n updateFields.push('is_active = ?')\n updateParams.push(validatedData.is_active ? 1 : 0)\n }\n\n if (updateFields.length === 0) {\n return c.json({ error: 'No fields to update' }, 400)\n }\n\n updateFields.push('updated_at = ?')\n updateParams.push(Date.now())\n updateParams.push(id)\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET ${updateFields.join(', ')}\n WHERE id = ?\n `)\n\n await updateStmt.bind(...updateParams).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${existing.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({ message: 'Collection updated successfully' })\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.json({ error: 'Failed to update collection' }, 500)\n }\n})\n\n/**\n * Delete collection\n * DELETE /admin/api/collections/:id\n */\nadminApiRoutes.delete('/collections/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection exists\n const collectionStmt = db.prepare('SELECT name FROM collections WHERE id = ?')\n const collection = await collectionStmt.bind(id).first() as any\n\n if (!collection) {\n return c.json({ error: 'Collection not found' }, 404)\n }\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.json({\n error: `Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.`\n }, 400)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n // Clear cache\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${collection.name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n\n return c.json({ message: 'Collection deleted successfully' })\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.json({ error: 'Failed to delete collection' }, 500)\n }\n})\n\n// Migrations API endpoints\n// Get migration status\nadminApiRoutes.get('/migrations/status', async (c) => {\n try {\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminApiRoutes.post('/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied,\n errors: result.errors\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.json({\n success: false,\n error: `Failed to run migrations: ${errorMessage}`,\n errors: [errorMessage]\n }, 500)\n }\n})\n\n// Validate database schema\nadminApiRoutes.get('/migrations/validate', async (c) => {\n try {\n const { MigrationService } = await import('../services/migrations')\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\nexport default adminApiRoutes\n","import { renderAlert } from '../alert.template'\n\nexport interface LoginPageData {\n error?: string\n message?: string\n version?: string\n}\n\nexport function renderLoginPage(data: LoginPageData, demoLoginActive: boolean = false): string {\n return `\n \n \n \n \n \n Login - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n

Welcome Back

\n

Sign in to your account to continue

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n ${data.message ? `
${renderAlert({ type: 'success', message: data.message })}
` : ''}\n\n \n
\n\n \n \n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Sign In\n \n \n\n \n
\n

\n Don't have an account?\n Create one here\n

\n
\n
\n\n \n
\n \n v${data.version || '0.1.0'}\n \n
\n
\n
\n\n ${demoLoginActive ? `\n \n ` : ''}\n \n \n `\n}","import { renderAlert } from '../alert.template'\n\nexport interface RegisterPageData {\n error?: string\n}\n\nexport function renderRegisterPage(data: RegisterPageData): string {\n return `\n \n \n \n \n \n Register - SonicJS AI\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n
\n

SonicJS AI

\n

Create your account and get started

\n
\n\n \n
\n
\n \n ${data.error ? `
${renderAlert({ type: 'error', message: data.error })}
` : ''}\n\n \n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n \n Create Account\n \n \n\n \n
\n

\n Already have an account?\n Sign in here\n

\n
\n\n
\n
\n
\n
\n \n \n `\n}","/**\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 {\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\n if (plugin?.settings) {\n // Parse settings and check registration.enabled\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 return true // Default to enabled if no settings\n } catch {\n return true // Default to enabled on error\n }\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 {\n try {\n const result = await db.prepare('SELECT COUNT(*) as count FROM users').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 {\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 users 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 username: z.string().min(3, 'Username must be at least 3 characters').optional(),\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\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 {\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 'username':\n // Generate username from email (part before @)\n return data.email ? data.email.split('@')[0] : `user${Date.now()}`\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","/**\n * User Profile Config Registry\n *\n * Global singleton storing developer-defined custom profile field definitions.\n * Set once at app boot via defineUserProfile(), queried by routes and templates.\n */\n\nimport type { FieldType } from '../../../types/collection-config'\n\nexport interface ProfileFieldDefinition {\n name: string\n label: string\n type: FieldType\n options?: string[]\n default?: any\n required?: boolean\n placeholder?: string\n helpText?: string\n hidden?: boolean\n fields?: ProfileFieldDefinition[]\n validation?: {\n min?: number\n max?: number\n pattern?: string\n }\n}\n\nexport interface UserProfileConfig {\n fields: ProfileFieldDefinition[]\n registrationFields?: string[]\n}\n\nlet _profileConfig: UserProfileConfig | null = null\n\nexport function defineUserProfile(config: UserProfileConfig): void {\n if (_profileConfig) {\n console.warn('[SonicJS] defineUserProfile called multiple times — overwriting previous config')\n }\n _profileConfig = config\n}\n\nexport function getUserProfileConfig(): UserProfileConfig | null {\n return _profileConfig\n}\n\nexport function getProfileFieldDefaults(): Record {\n if (!_profileConfig) return {}\n const defaults: Record = {}\n for (const field of _profileConfig.fields) {\n if (field.default !== undefined) {\n defaults[field.name] = field.default\n }\n }\n return defaults\n}\n\nexport function getRegistrationFields(): ProfileFieldDefinition[] {\n if (!_profileConfig) return []\n const regFieldNames = _profileConfig.registrationFields || []\n return _profileConfig.fields.filter(f => regFieldNames.includes(f.name))\n}\n\n/** Reset state — for tests only */\nexport function _resetProfileConfig(): void {\n _profileConfig = null\n}\n","/**\n * User Profile Service\n *\n * Handles reading, writing, validation, and sanitization of custom profile data.\n */\n\nimport { sanitizeInput } from '../../../utils/sanitize'\nimport {\n getUserProfileConfig,\n getProfileFieldDefaults,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport function validateCustomData(\n data: Record,\n config: UserProfileConfig\n): { valid: boolean; errors: Record } {\n const errors: Record = {}\n\n for (const field of config.fields) {\n const value = data[field.name]\n\n if (field.required && (value === undefined || value === null || value === '')) {\n errors[field.name] = `${field.label} is required`\n continue\n }\n\n if (value === undefined || value === null || value === '') continue\n\n if (field.type === 'number' && typeof value !== 'number') {\n errors[field.name] = `${field.label} must be a number`\n }\n if (field.type === 'select' && field.options && !field.options.includes(value)) {\n errors[field.name] = `${field.label} must be one of: ${field.options.join(', ')}`\n }\n if (field.type === 'boolean' && typeof value !== 'boolean') {\n errors[field.name] = `${field.label} must be true or false`\n }\n if (field.validation?.min !== undefined && typeof value === 'number' && value < field.validation.min) {\n errors[field.name] = `${field.label} must be at least ${field.validation.min}`\n }\n if (field.validation?.max !== undefined && typeof value === 'number' && value > field.validation.max) {\n errors[field.name] = `${field.label} must be at most ${field.validation.max}`\n }\n if (field.validation?.pattern && typeof value === 'string' && !new RegExp(field.validation.pattern).test(value)) {\n errors[field.name] = `${field.label} format is invalid`\n }\n }\n\n return { valid: Object.keys(errors).length === 0, errors }\n}\n\nexport function sanitizeCustomData(\n data: Record,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n const knownNames = new Set(config.fields.map(f => f.name))\n\n for (const [key, value] of Object.entries(data)) {\n if (!knownNames.has(key)) continue\n if (typeof value === 'string') {\n result[key] = sanitizeInput(value)\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\nexport function coerceFieldValue(raw: string | null | undefined, field: ProfileFieldDefinition): any {\n if (raw === null || raw === undefined || raw === '') {\n return field.default ?? null\n }\n\n switch (field.type) {\n case 'number':\n const num = Number(raw)\n return isNaN(num) ? null : num\n case 'boolean':\n case 'checkbox':\n return raw === '1' || raw === 'true' || raw === 'on'\n case 'date':\n case 'datetime':\n const ts = new Date(raw).getTime()\n return isNaN(ts) ? null : ts\n default:\n return raw\n }\n}\n\nexport function extractCustomFieldsFromForm(\n formData: FormData,\n config: UserProfileConfig\n): Record {\n const result: Record = {}\n for (const field of config.fields) {\n const raw = formData.get(`custom_${field.name}`)?.toString()\n // For boolean/checkbox, absence means false\n if (raw === null || raw === undefined) {\n if (field.type === 'boolean' || field.type === 'checkbox') {\n result[field.name] = false\n }\n continue\n }\n result[field.name] = coerceFieldValue(raw, field)\n }\n return result\n}\n\nexport async function getCustomData(db: any, userId: string): Promise> {\n const row = await db\n .prepare('SELECT data FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (!row?.data) return {}\n try {\n return JSON.parse(row.data)\n } catch {\n return {}\n }\n}\n\nexport async function saveCustomData(\n db: any,\n userId: string,\n newData: Record\n): Promise {\n const existing = await getCustomData(db, userId)\n const merged = { ...existing, ...newData }\n const json = JSON.stringify(merged)\n\n // Check if profile row exists\n const row = await db\n .prepare('SELECT id FROM user_profiles WHERE user_id = ?')\n .bind(userId)\n .first() as any\n\n if (row) {\n await db\n .prepare('UPDATE user_profiles SET data = ?, updated_at = ? WHERE user_id = ?')\n .bind(json, Date.now(), userId)\n .run()\n } else {\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const now = Date.now()\n await db\n .prepare(\n 'INSERT INTO user_profiles (id, user_id, data, created_at, updated_at) VALUES (?, ?, ?, ?, ?)'\n )\n .bind(profileId, userId, json, now, now)\n .run()\n }\n}\n","export interface DragSortableOptions {\n itemSelector?: string\n handleSelector?: string\n onUpdate?: () => void\n}\n\nexport function getDragSortableScript(): string {\n return `\n \n `;\n}\n","import { getDragSortableScript } from './drag-sortable.template'\n\n/**\n * Returns shared readFieldValue function used by both blocks and structured fields.\n * Uses a window flag to ensure it's only initialized once.\n */\nfunction getReadFieldValueScript(): string {\n return `\n \n `\n}\n\nconst STRUCTURED_INDEX_TOKEN = '__INDEX__'\nconst BLOCK_INDEX_TOKEN = '__BLOCK_INDEX__'\n\nfunction sanitizeStructuredGroupId(fieldName: string): string {\n return `object-${fieldName}`\n .split(BLOCK_INDEX_TOKEN)\n .map((blockSegment) =>\n blockSegment\n .split(STRUCTURED_INDEX_TOKEN)\n .map((segment) =>\n segment\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, ''),\n )\n .join(STRUCTURED_INDEX_TOKEN),\n )\n .join(BLOCK_INDEX_TOKEN)\n}\n\nexport interface FieldDefinition {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any // JSON options\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface FieldRenderOptions {\n value?: any\n errors?: string[]\n disabled?: boolean\n className?: string\n pluginStatuses?: {\n quillEnabled?: boolean\n mdxeditorEnabled?: boolean\n tinymceEnabled?: boolean\n }\n collectionId?: string\n contentId?: string\n}\n\nfunction isMarkdownEditorFieldType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nfunction getEditorMetadata(fieldType: string): { family: string; provider: string } | null {\n if (fieldType === 'richtext' || fieldType === 'tinymce') {\n return {\n family: 'richtext',\n provider: 'tinymce',\n }\n }\n\n if (isMarkdownEditorFieldType(fieldType)) {\n return {\n family: 'markdown',\n provider: 'easymde',\n }\n }\n\n return null\n}\n\nexport function renderDynamicField(field: FieldDefinition, options: FieldRenderOptions = {}): string {\n const { value = '', errors = [], disabled = false, className = '', pluginStatuses = {}, collectionId = '', contentId = '' } = options\n const opts = field.field_options || {}\n const required = field.is_required ? 'required' : ''\n const baseClasses = `w-full rounded-lg px-3 py-2 text-sm text-zinc-950 dark:text-white bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 placeholder:text-zinc-400 dark:placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-zinc-950 dark:focus:ring-white transition-shadow ${className}`\n const errorClasses =\n errors.length > 0\n ? 'ring-pink-600 dark:ring-pink-500 focus:ring-pink-600 dark:focus:ring-pink-500'\n : ''\n\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n\n // Check if this is a plugin-based field type and if the plugin is inactive\n // If so, fall back to textarea with a warning\n let fallbackToTextarea = false\n let fallbackWarning = ''\n\n if (field.field_type === 'quill' && !pluginStatuses.quillEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Quill Editor plugin is inactive. Using textarea fallback.'\n } else if (isMarkdownEditorFieldType(field.field_type) && !pluginStatuses.mdxeditorEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ Markdown editor plugin is inactive. Using textarea fallback.'\n } else if ((field.field_type === 'richtext' || field.field_type === 'tinymce') && !pluginStatuses.tinymceEnabled) {\n fallbackToTextarea = true\n fallbackWarning = '⚠️ TinyMCE plugin is inactive. Using textarea fallback.'\n }\n\n // If falling back to textarea, render it with a warning\n if (fallbackToTextarea) {\n return `\n
\n ${fallbackWarning ? `
${fallbackWarning}
` : ''}\n ${escapeHtml(value)}\n
\n `\n }\n\n let fieldHTML = ''\n\n switch (field.field_type) {\n case 'text':\n let patternHelp = ''\n let autoSlugScript = ''\n\n if (opts.pattern) {\n if (opts.pattern === '^[a-z0-9-]+$' || opts.pattern === '^[a-zA-Z0-9_-]+$') {\n patternHelp =\n '

Use letters, numbers, underscores, and hyphens only

'\n\n // Add auto-slug generation for slug fields\n if (fieldName === 'slug') {\n patternHelp +=\n ''\n autoSlugScript = `\n \n `\n }\n } else {\n patternHelp =\n '

Must match required format

'\n }\n }\n\n fieldHTML = `\n \n ${patternHelp}\n ${autoSlugScript}\n ${\n opts.pattern\n ? `\n \n `\n : ''\n }\n `\n break\n\n case 'textarea':\n fieldHTML = `\n ${escapeHtml(value)}\n `\n break\n\n case 'richtext':\n case 'tinymce':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'quill':\n // Quill WYSIWYG Editor\n fieldHTML = `\n
\n \n ${value}
\n\n \n \n \n `\n break\n\n case 'markdown':\n case 'mdxeditor':\n case 'easymde':\n {\n const editorMetadata = getEditorMetadata(field.field_type)\n // Markdown editor fields use the EasyMDE-backed richtext container.\n // The EasyMDE plugin initialization script handles activation.\n fieldHTML = `\n
\n ${escapeHtml(value)}\n
\n `\n break\n }\n\n case 'number':\n fieldHTML = `\n \n `\n break\n\n case 'boolean':\n const checked = value === true || value === 'true' || value === '1' ? 'checked' : ''\n fieldHTML = `\n
\n \n \n
\n \n `\n break\n\n case 'date':\n fieldHTML = `\n \n `\n break\n\n case 'datetime':\n fieldHTML = `\n \n `\n break\n\n case 'slug':\n // Slug fields with auto-generation and duplicate detection\n const slugPattern = opts.pattern || '^[a-z0-9-]+$'\n const collectionIdValue = collectionId || opts.collectionId || ''\n const contentIdValue = contentId || opts.contentId || ''\n const isEditMode = !!value\n\n fieldHTML = `\n
\n \n
\n \n

Use lowercase letters, numbers, and hyphens only

\n
\n \n \n `\n break\n\n case 'select':\n const selectOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const multiple = opts.multiple ? 'multiple' : ''\n const selectedValues = Array.isArray(value) ? value : [value]\n\n fieldHTML = `\n \n ${!required && !opts.multiple ? '' : ''}\n ${selectOptions\n .map((option: any) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const selected = selectedValues.includes(optionValue) ? 'selected' : ''\n return ``\n })\n .join('')}\n \n ${\n opts.allowCustom\n ? `\n
\n \n
\n `\n : ''\n }\n `\n break\n\n case 'radio':\n const radioOptions =\n opts.options ||\n (Array.isArray(opts.enum)\n ? opts.enum.map((optionValue: string, index: number) => ({\n value: optionValue,\n label: opts.enumLabels?.[index] || optionValue,\n }))\n : [])\n const selectedRadioValue =\n value !== undefined && value !== null\n ? String(value)\n : opts.default\n ? String(opts.default)\n : ''\n\n const isInline = opts.inline === true\n fieldHTML = `\n
\n ${radioOptions\n .map((option: any, index: number) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const inputId = `${fieldId}-option-${index}`\n const checked = selectedRadioValue === String(optionValue) ? 'checked' : ''\n return `\n \n `\n })\n .join('')}\n
\n `\n break\n\n case 'reference':\n let referenceCollections: string[] = []\n if (Array.isArray(opts.collection)) {\n referenceCollections = opts.collection.filter(Boolean)\n } else if (typeof opts.collection === 'string' && opts.collection) {\n referenceCollections = [opts.collection]\n }\n const referenceCollectionsAttr = referenceCollections.join(',')\n const hasReferenceCollection = referenceCollections.length > 0\n const hasReferenceValue = Boolean(value)\n fieldHTML = `\n
\n \n
\n \n ${hasReferenceCollection ? (hasReferenceValue ? 'Loading selection...' : 'No reference selected.') : 'Reference collection not configured.'}\n
\n
\n \n Select reference\n \n \n Remove\n \n
\n
\n \n `\n break\n\n case 'media':\n // Check if multiple selection is enabled\n const isMultiple = opts.multiple === true\n const mediaValues =\n isMultiple && value\n ? Array.isArray(value)\n ? value\n : String(value).split(',').filter(Boolean)\n : []\n const singleValue = !isMultiple ? value : ''\n\n // Helper to detect if URL is a video\n const isVideoUrl = (url: string) => {\n const videoExtensions = ['.mp4', '.webm', '.ogg', '.mov', '.avi']\n return videoExtensions.some((ext) => url.toLowerCase().endsWith(ext))\n }\n\n // Helper to render media element\n const renderMediaPreview = (url: string, alt: string, classes: string) => {\n if (isVideoUrl(url)) {\n return ``\n }\n return `\"${alt}\"`\n }\n\n fieldHTML = `\n
\n \n\n ${\n isMultiple\n ? `\n
\n ${mediaValues\n .map(\n (url: string, idx: number) => `\n
\n ${renderMediaPreview(url, `Media ${idx + 1}`, 'w-full h-24 object-cover rounded-lg border border-white/20')}\n \n \n \n \n \n
\n `,\n )\n .join('')}\n
\n `\n : `\n
\n ${singleValue ? renderMediaPreview(singleValue, 'Selected media', 'w-32 h-32 object-cover rounded-lg border border-white/20') : ''}\n
\n `\n }\n\n
\n \n \n \n \n ${isMultiple ? 'Select Media (Multiple)' : 'Select Media'}\n \n ${\n (isMultiple ? mediaValues.length > 0 : singleValue)\n ? `\n \n ${isMultiple ? 'Clear All' : 'Remove'}\n \n `\n : ''\n }\n
\n
\n `\n break\n\n case 'object':\n // Structured object field (like SEO with nested properties)\n return renderStructuredObjectField(field, options, baseClasses, errorClasses)\n\n case 'array':\n // Check if this is a blocks field (has discriminator/blocks config) or a regular array\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n if (itemsConfig.blocks && typeof itemsConfig.blocks === 'object') {\n // Blocks field with discriminated union\n return renderBlocksField(field, options, baseClasses, errorClasses)\n }\n // Regular structured array field\n return renderStructuredArrayField(field, options, baseClasses, errorClasses)\n\n default:\n fieldHTML = `\n \n `\n }\n\n const showLabel = field.field_type !== 'boolean'\n\n return `\n
0 ? 'true' : 'false'}\">\n ${\n showLabel\n ? `\n \n `\n : ''\n }\n ${fieldHTML}\n ${\n errors.length > 0\n ? `\n
\n ${errors.map((error) => `
${escapeHtml(error)}
`).join('')}\n
\n `\n : ''\n }\n ${\n opts.helpText\n ? `\n
\n ${escapeHtml(opts.helpText)}\n
\n `\n : ''\n }\n
\n `\n}\n\nexport function renderFieldGroup(\n title: string,\n fields: string[],\n collapsible: boolean = false,\n): string {\n const groupId = title.toLowerCase().replace(/\\s+/g, '-')\n\n return `\n
\n
\n

\n ${escapeHtml(title)}\n ${\n collapsible\n ? `\n \n \n \n `\n : ''\n }\n

\n
\n
\n ${fields.join('')}\n
\n
\n `\n}\n\nfunction renderBlocksField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const blocks = normalizeBlockDefinitions(itemsConfig.blocks)\n const discriminator =\n typeof itemsConfig.discriminator === 'string' && itemsConfig.discriminator\n ? itemsConfig.discriminator\n : 'blockType'\n const blockValues = normalizeBlocksValue(value, discriminator)\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const emptyState =\n blockValues.length === 0\n ? `\n
\n No blocks yet. Add your first block to get started.\n
\n `\n : ''\n\n const blockOptions = blocks\n .map((block) => ``)\n .join('')\n\n const blockItems = blockValues\n .map((blockValue, index) =>\n renderBlockItem(field, blockValue, blocks, discriminator, index, pluginStatuses),\n )\n .join('')\n\n const templates = blocks\n .map((block) => renderBlockTemplate(field, block, discriminator, pluginStatuses))\n .join('')\n\n return `\n \n \n\n
\n

\n ${escapeHtml(field.field_label || 'Content Blocks')}\n

\n
\n\n
\n
\n \n \n ${blockOptions}\n \n
\n \n Add Block\n \n
\n\n
\n ${blockItems || emptyState}\n
\n\n ${templates}\n \n ${getDragSortableScript()}\n ${getBlocksFieldScript()}\n `\n}\n\nfunction renderStructuredObjectField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = {}, pluginStatuses = {}, errors = [] } = options\n const opts = field.field_options || {}\n const properties = opts.properties && typeof opts.properties === 'object' ? opts.properties : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const objectValue = normalizeStructuredObjectValue(value)\n const objectLayout = opts.objectLayout || 'nested'\n const useNestedLayout = objectLayout !== 'flat'\n\n const subfields = Object.entries(properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n objectValue,\n pluginStatuses,\n field.field_name,\n ),\n )\n .join('')\n\n const groupTitle = field.field_label || field.field_name\n\n if (!useNestedLayout) {\n return `\n
\n \n
\n

\n ${escapeHtml(groupTitle)}\n

\n
\n
\n ${subfields}\n
\n
\n ${getStructuredFieldScript()}\n `\n }\n\n const groupId = sanitizeStructuredGroupId(field.field_name)\n const isCollapsed = errors.length > 0 ? false : opts.collapsed !== false\n\n return `\n
\n
\n

\n ${escapeHtml(groupTitle)}\n \n \n \n

\n
\n
\n \n
\n ${subfields}\n
\n
\n
\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayField(\n field: FieldDefinition,\n options: FieldRenderOptions,\n baseClasses: string,\n errorClasses: string,\n): string {\n const { value = [], pluginStatuses = {} } = options\n const opts = field.field_options || {}\n const itemsConfig = opts.items && typeof opts.items === 'object' ? opts.items : {}\n const fieldId = `field-${field.field_name}`\n const fieldName = field.field_name\n const arrayValue = normalizeStructuredArrayValue(value)\n const arrayTitle = opts.itemLabel || field.field_label || 'Items'\n const hasItemTitle = typeof opts.itemTitle === 'string' && opts.itemTitle.trim() !== ''\n const arrayItemTitle = hasItemTitle ? opts.itemTitle.trim() : 'Item'\n const addItemLabel = hasItemTitle ? `Add ${arrayItemTitle}` : 'Add item'\n\n const items = arrayValue\n .map((itemValue, index) =>\n renderStructuredArrayItem(\n field,\n itemsConfig,\n String(index),\n itemValue,\n pluginStatuses,\n arrayItemTitle,\n ),\n )\n .join('')\n\n const emptyState =\n arrayValue.length === 0\n ? `\n
\n No items yet. Add the first item to get started.\n
\n `\n : ''\n\n return `\n
\n \n\n
\n
\n ${escapeHtml(arrayTitle)}\n
\n \n ${escapeHtml(addItemLabel)}\n \n
\n\n
\n ${items || emptyState}\n
\n\n \n
\n ${getDragSortableScript()}\n ${getStructuredFieldScript()}\n `\n}\n\nfunction renderStructuredArrayItem(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n arrayItemTitle: string,\n): string {\n const itemFields = renderStructuredItemFields(field, itemConfig, index, itemValue, pluginStatuses)\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n ${escapeHtml(arrayItemTitle)} \n
\n
\n
\n \n \n \n \n
\n
\n
\n ${itemFields}\n
\n
\n `\n}\n\nfunction renderStructuredItemFields(\n field: FieldDefinition,\n itemConfig: Record,\n index: string,\n itemValue: any,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const itemType = itemConfig?.type || 'string'\n if (\n itemType === 'object' &&\n itemConfig?.properties &&\n typeof itemConfig.properties === 'object'\n ) {\n const fieldPrefix = `array-${field.field_name}-${index}`\n return Object.entries(itemConfig.properties)\n .map(([propertyName, propertyConfig]) =>\n renderStructuredSubfield(\n field,\n propertyName,\n propertyConfig,\n itemValue || {},\n pluginStatuses,\n fieldPrefix,\n ),\n )\n .join('')\n }\n\n const normalizedField = normalizeBlockField(itemConfig, 'Item')\n const fieldValue = itemValue ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `array-${field.field_name}-${index}-value`,\n field_name: `array-${field.field_name}-${index}-value`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction renderStructuredSubfield(\n field: FieldDefinition,\n propertyName: string,\n propertyConfig: any,\n objectValue: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n fieldPrefix: string,\n): string {\n const normalizedField = normalizeBlockField(propertyConfig, propertyName)\n const fieldValue = objectValue?.[propertyName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `${fieldPrefix}-${propertyName}`,\n field_name: `${fieldPrefix}__${propertyName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n}\n\nfunction normalizeStructuredObjectValue(value: any): Record {\n if (!value) return {}\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {}\n } catch {\n return {}\n }\n }\n if (typeof value === 'object' && !Array.isArray(value)) return value\n return {}\n}\n\nfunction normalizeStructuredArrayValue(value: any): any[] {\n if (!value) return []\n if (Array.isArray(value)) return value\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction normalizeBlockDefinitions(\n rawBlocks: any,\n): Array<{ name: string; label: string; description?: string; properties: Record }> {\n if (!rawBlocks || typeof rawBlocks !== 'object') return []\n\n return Object.entries(rawBlocks)\n .filter(([name, block]) => typeof name === 'string' && block && typeof block === 'object')\n .map(([name, block]: [string, any]) => ({\n name,\n label: block.label || name,\n description: block.description,\n properties: block.properties && typeof block.properties === 'object' ? block.properties : {},\n }))\n}\n\nfunction normalizeBlocksValue(value: any, discriminator: string): any[] {\n const normalizeItem = (item: any) => {\n if (!item || typeof item !== 'object') return null\n if (item[discriminator]) return item\n if (item.blockType && item.data && typeof item.data === 'object') {\n return { [discriminator]: item.blockType, ...item.data }\n }\n return item\n }\n\n const fromArray = (items: any[]) =>\n items.map(normalizeItem).filter((item) => item && typeof item === 'object')\n\n if (Array.isArray(value)) return fromArray(value)\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? fromArray(parsed) : []\n } catch {\n return []\n }\n }\n return []\n}\n\nfunction renderBlockTemplate(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n return `\n \n `\n}\n\nfunction renderBlockItem(\n field: FieldDefinition,\n blockValue: any,\n blocks: Array<{\n name: string\n label: string\n description?: string\n properties: Record\n }>,\n discriminator: string,\n index: number,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockType = blockValue?.[discriminator] || blockValue?.blockType\n const blockDefinition = blocks.find((block) => block.name === blockType)\n\n if (!blockDefinition) {\n return `\n
\n Unknown block type: ${escapeHtml(String(blockType || 'unknown'))}. This block will be preserved as-is.\n
\n `\n }\n\n const data =\n blockValue && typeof blockValue === 'object'\n ? Object.fromEntries(Object.entries(blockValue).filter(([key]) => key !== discriminator))\n : {}\n\n return renderBlockCard(field, blockDefinition, discriminator, String(index), data, pluginStatuses)\n}\n\nfunction renderBlockCard(\n field: FieldDefinition,\n block: { name: string; label: string; description?: string; properties: Record },\n discriminator: string,\n index: string,\n data: Record,\n pluginStatuses: FieldRenderOptions['pluginStatuses'],\n): string {\n const blockFields = Object.entries(block.properties)\n .map(([fieldName, fieldConfig]) => {\n if (fieldConfig?.type === 'array' && fieldConfig?.items?.blocks) {\n return `\n
\n Nested blocks are not supported yet for \"${escapeHtml(fieldName)}\".\n
\n `\n }\n\n const normalizedField = normalizeBlockField(fieldConfig, fieldName)\n const fieldValue = data?.[fieldName] ?? normalizedField.defaultValue ?? ''\n const fieldDefinition: FieldDefinition = {\n id: `block-${field.field_name}-${index}-${fieldName}`,\n field_name: `block-${field.field_name}-${index}-${fieldName}`,\n field_type: normalizedField.type,\n field_label: normalizedField.label,\n field_options: normalizedField.options,\n field_order: 0,\n is_required: normalizedField.required,\n is_searchable: false,\n }\n\n return `\n
\n ${renderDynamicField(fieldDefinition, { value: fieldValue, pluginStatuses })}\n
\n `\n })\n .join('')\n\n return `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${escapeHtml(block.label)}\n \n
\n ${block.description ? `

${escapeHtml(block.description)}

` : ''}\n
\n
\n
\n \n \n \n \n
\n
\n
\n ${blockFields}\n
\n
\n `\n}\n\nfunction normalizeBlockField(fieldConfig: any, fieldName: string) {\n const type = fieldConfig?.type || 'text'\n const label = fieldConfig?.title || fieldName\n const required = fieldConfig?.required === true\n const options = { ...fieldConfig }\n\n if (type === 'select' && Array.isArray(fieldConfig?.enum)) {\n options.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return {\n type,\n label,\n required,\n defaultValue: fieldConfig?.default,\n options,\n }\n}\n\nfunction getStructuredFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction getBlocksFieldScript(): string {\n return `\n ${getReadFieldValueScript()}\n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}\n","/**\n * User Profile Custom Fields Renderer\n *\n * Generates the HTML section for custom profile fields by adapting\n * ProfileFieldDefinition into FieldDefinition and calling renderDynamicField.\n */\n\nimport { renderDynamicField, type FieldDefinition } from '../../../templates/components/dynamic-field.template'\nimport type { UserProfileConfig, ProfileFieldDefinition } from './user-profile-registry'\n\nexport function toFieldDefinition(field: ProfileFieldDefinition, index: number): FieldDefinition {\n return {\n id: `custom_${field.name}`,\n field_name: `custom_${field.name}`,\n field_type: field.type,\n field_label: field.label,\n field_options: {\n placeholder: field.placeholder || '',\n helpText: field.helpText || '',\n enum: field.options || [],\n enumLabels: field.options || [],\n },\n field_order: index,\n is_required: field.required || false,\n is_searchable: false,\n }\n}\n\nexport function renderCustomProfileSection(\n config: UserProfileConfig | null,\n customData: Record\n): string {\n if (!config || config.fields.length === 0) return ''\n\n const visibleFields = config.fields.filter(f => !f.hidden)\n if (visibleFields.length === 0) return ''\n\n const fieldsHtml = visibleFields\n .map((field, index) => {\n const fieldDef = toFieldDefinition(field, index)\n const value = customData[field.name] ?? field.default ?? ''\n return renderDynamicField(fieldDef, { value })\n })\n .join('\\n')\n\n return `\n \n
\n

Custom Profile Fields

\n
\n ${fieldsHtml}\n
\n
`\n}\n","/**\n * User Profiles Plugin\n *\n * Configurable custom profile fields for users.\n * Developers call defineUserProfile() at app boot to declare custom fields\n * that are stored as JSON in user_profiles.data and rendered in the admin UI.\n *\n * API Routes:\n * GET /api/user-profiles/schema → Public field definitions\n * GET /api/user-profiles/:userId → Get custom data for a user (auth required)\n * PUT /api/user-profiles/:userId → Update custom data for a user (auth required)\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { getUserProfileConfig } from './user-profile-registry'\nimport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\nimport { renderCustomProfileSection } from './user-profile-renderer'\n\nexport function createUserProfilesPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'user-profiles',\n version: '1.0.0-beta.1',\n description: 'Configurable custom profile fields for users',\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com',\n },\n license: 'MIT',\n compatibility: '^2.0.0',\n })\n\n // ==================== API Routes ====================\n\n const api = new Hono()\n\n // GET /api/user-profiles/schema — public schema endpoint\n api.get('/schema', (c) => {\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ fields: [], registrationFields: [] })\n }\n return c.json({\n fields: config.fields\n .filter(f => !f.hidden)\n .map(f => ({\n name: f.name,\n label: f.label,\n type: f.type,\n options: f.options,\n required: f.required || false,\n placeholder: f.placeholder,\n helpText: f.helpText,\n default: f.default,\n validation: f.validation,\n })),\n registrationFields: config.registrationFields || [],\n })\n })\n\n // GET /api/user-profiles/:userId — get custom data\n api.get('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const userId = c.req.param('userId')\n const data = await getCustomData(db, userId)\n return c.json({ userId, customData: data })\n })\n\n // PUT /api/user-profiles/:userId — update custom data\n api.put('/:userId', async (c) => {\n const db = (c.env as any)?.DB || (c as any).db\n if (!db) return c.json({ error: 'Database not available' }, 500)\n\n const config = getUserProfileConfig()\n if (!config) {\n return c.json({ error: 'No profile schema configured' }, 400)\n }\n\n const userId = c.req.param('userId')\n const body = await c.req.json()\n const customData = body.customData || body\n\n const sanitized = sanitizeCustomData(customData, config)\n const validation = validateCustomData(sanitized, config)\n if (!validation.valid) {\n return c.json({ error: 'Validation failed', errors: validation.errors }, 400)\n }\n\n await saveCustomData(db, userId, sanitized)\n return c.json({ success: true })\n })\n\n builder.addRoute('/api/user-profiles', api, {\n description: 'Custom user profile fields API',\n requiresAuth: false,\n priority: 100,\n })\n\n builder.lifecycle({\n activate: async () => {\n console.info('[SonicJS] User Profiles plugin activated')\n },\n deactivate: async () => {\n console.info('[SonicJS] User Profiles plugin deactivated')\n },\n })\n\n return builder.build() as Plugin\n}\n\nexport const userProfilesPlugin = createUserProfilesPlugin()\n\n// Re-export public API\nexport {\n defineUserProfile,\n getUserProfileConfig,\n getProfileFieldDefaults,\n getRegistrationFields,\n type ProfileFieldDefinition,\n type UserProfileConfig,\n} from './user-profile-registry'\n\nexport {\n getCustomData,\n saveCustomData,\n validateCustomData,\n sanitizeCustomData,\n extractCustomFieldsFromForm,\n} from './user-profile-service'\n\nexport { renderCustomProfileSection } from './user-profile-renderer'\n","import { Hono } from 'hono'\n// import { zValidator } from '@hono/zod-validator'\nimport { z } from 'zod'\nimport { getCookie, setCookie } from 'hono/cookie'\nimport { html } from 'hono/html'\nimport { AuthManager, requireAuth, generateCsrfToken, rateLimit } from '../middleware'\nimport { getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb } from '../middleware/auth'\nimport { renderLoginPage, LoginPageData } from '../templates/pages/auth-login.template'\nimport { renderRegisterPage, RegisterPageData } from '../templates/pages/auth-register.template'\nimport { getCacheService, CACHE_CONFIGS } from '../services'\nimport { authValidationService, isRegistrationEnabled, isFirstUserRegistration } from '../services/auth-validation'\nimport type { RegistrationData } from '../services/auth-validation'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, getRegistrationFields, getProfileFieldDefaults, sanitizeCustomData, saveCustomData, getCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n/** Set a signed CSRF cookie alongside the auth cookie on login/register. */\nasync function setCsrfCookie(c: any, maxAge?: number): Promise {\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n const csrfToken = await generateCsrfToken(secret)\n const cookieMaxAge = maxAge ?? (await getJwtExpirySecondsFromDb(c.env?.DB, c.env))\n setCookie(c, 'csrf_token', csrfToken, {\n httpOnly: false,\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: cookieMaxAge,\n })\n}\n\n/** Clear the CSRF cookie on logout. */\nfunction clearCsrfCookie(c: any): void {\n setCookie(c, 'csrf_token', '', {\n httpOnly: false,\n secure: false,\n sameSite: 'Strict',\n path: '/',\n maxAge: 0,\n })\n}\n\nconst authRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Login page (HTML form)\nauthRoutes.get('/login', async (c) => {\n const error = c.req.query('error')\n const message = c.req.query('message')\n \n const pageData: LoginPageData = {\n error: error || undefined,\n message: message || undefined,\n version: c.get('appVersion')\n }\n \n // Check if demo login plugin is active\n const db = c.env.DB\n let demoLoginActive = false\n try {\n const plugin = await db.prepare('SELECT * FROM plugins WHERE id = ? AND status = ?')\n .bind('demo-login-prefill', 'active')\n .first()\n demoLoginActive = !!plugin\n } catch (error) {\n // Ignore database errors - plugin system might not be initialized\n }\n \n return c.html(renderLoginPage(pageData, demoLoginActive))\n})\n\n// Registration page (HTML form)\nauthRoutes.get('/register', async (c) => {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.redirect('/auth/login?error=Registration is currently disabled')\n }\n }\n\n const error = c.req.query('error')\n\n const pageData: RegisterPageData = {\n error: error || undefined\n }\n\n return c.html(renderRegisterPage(pageData))\n})\n\n// Login schema\nconst loginSchema = z.object({\n email: z.string().email('Valid email is required'),\n password: z.string().min(1, 'Password is required')\n})\n\n// Register new user\nauthRoutes.post('/register',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.json({ error: 'Registration is currently disabled' }, 403)\n }\n }\n\n // Parse JSON with error handling\n let requestData\n try {\n requestData = await c.req.json()\n } catch (parseError) {\n return c.json({ error: 'Invalid JSON in request body' }, 400)\n }\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n\n let validatedData: RegistrationData\n try {\n validatedData = await validationSchema.parseAsync(requestData)\n } catch (validationError: any) {\n return c.json({\n error: 'Validation failed',\n details: validationError.issues?.map((e: any) => e.message) || [validationError.message || 'Invalid request data']\n }, 400)\n }\n\n // Extract fields with defaults for optional ones\n const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.json({ error: 'User with this email or username already exists' }, 400)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n \n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n 'viewer', // Default role\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n \n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n if (requestData[field.name] !== undefined) {\n customData[field.name] = requestData[field.name]\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, 'viewer', c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n user: {\n id: userId,\n email: normalizedEmail,\n username,\n firstName,\n lastName,\n role: 'viewer'\n },\n token\n }, 201)\n } catch (error) {\n console.error('Registration error:', error)\n // Return validation errors as 400, other errors as 500\n if (error instanceof Error && error.message.includes('validation')) {\n return c.json({ error: error.message }, 400)\n }\n return c.json({\n error: 'Registration failed',\n details: error instanceof Error ? error.message : String(error)\n }, 500)\n }\n }\n)\n\n// Login user\nauthRoutes.post('/login',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const body = await c.req.json()\n const validation = loginSchema.safeParse(body)\n if (!validation.success) {\n return c.json({ error: 'Validation failed', details: validation.error.issues }, 400)\n }\n const { email, password } = validation.data\n const db = c.env.DB\n \n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n \n // Find user with caching\n const cache = getCacheService(CACHE_CONFIGS.user!)\n let user = await cache.get(cache.generateKey('user', `email:${normalizedEmail}`))\n\n if (!user) {\n user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n\n if (user) {\n // Cache the user for faster subsequent lookups\n await cache.set(cache.generateKey('user', `email:${normalizedEmail}`), user)\n await cache.set(cache.generateKey('user', user.id), user)\n }\n }\n\n if (!user) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.json({ error: 'Invalid email or password' }, 401)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n // Invalidate user cache on login\n await cache.delete(cache.generateKey('user', user.id))\n await cache.delete(cache.generateKey('user', `email:${normalizedEmail}`))\n\n return c.json({\n user: {\n id: user.id,\n email: user.email,\n username: user.username,\n firstName: user.first_name,\n lastName: user.last_name,\n role: user.role\n },\n token\n })\n } catch (error) {\n console.error('Login error:', error)\n return c.json({ error: 'Login failed' }, 500)\n }\n})\n\n// Logout user (both GET and POST for convenience)\nauthRoutes.post('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.json({ message: 'Logged out successfully' })\n})\n\nauthRoutes.get('/logout', (c) => {\n // Clear the auth cookie\n setCookie(c, 'auth_token', '', {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: 0 // Expire immediately\n })\n clearCsrfCookie(c)\n\n return c.redirect('/auth/login?message=You have been logged out successfully')\n})\n\n// Get current user\nauthRoutes.get('/me', requireAuth(), async (c) => {\n try {\n // This would need the auth middleware applied\n const user = c.get('user')\n \n if (!user) {\n return c.json({ error: 'Not authenticated' }, 401)\n }\n \n const db = c.env.DB\n const userData = await db.prepare('SELECT id, email, username, first_name, last_name, role, created_at FROM users WHERE id = ?')\n .bind(user.userId)\n .first() as Record | null\n\n if (!userData) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n const customData = await getCustomData(db, user.userId)\n return c.json({ user: { ...userData, ...customData } })\n } catch (error) {\n console.error('Get user error:', error)\n return c.json({ error: 'Failed to get user' }, 500)\n }\n})\n\n// Refresh token (sliding session)\n//\n// Accepts a valid JWT — or one that has expired within the grace window\n// (`JWT_REFRESH_GRACE_SECONDS`, default 7 days) — and issues a fresh JWT\n// with a new `exp`. This lets a long-lived session cookie keep a user\n// logged in across JWT expirations without forcing a full re-login.\n//\n// Security: the caller must still present a valid-signature token that\n// recently belonged to an active user. Fully forged or long-expired tokens\n// are rejected.\nauthRoutes.post('/refresh',\n rateLimit({ max: 60, windowMs: 60 * 1000, keyPrefix: 'refresh' }),\n async (c) => {\n try {\n // Accept token from Authorization header or cookie\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) token = getCookie(c, 'auth_token')\n\n if (!token) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const grace = await getJwtRefreshGraceSecondsFromDb(db, c.env)\n\n const payload = await AuthManager.verifyToken(token, c.env.JWT_SECRET, grace)\n if (!payload) {\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Re-validate the user is still active, and pick up any role changes.\n const row = await db.prepare('SELECT id, email, role, is_active FROM users WHERE id = ?')\n .bind(payload.userId)\n .first() as any\n\n if (!row || !row.is_active) {\n return c.json({ error: 'User is not active' }, 401)\n }\n\n // Generate new token with a fresh exp\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env)\n const newToken = await AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set new cookie\n setCookie(c, 'auth_token', newToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n return c.json({\n token: newToken,\n expiresIn: tokenTtl\n })\n } catch (error) {\n console.error('Token refresh error:', error)\n return c.json({ error: 'Token refresh failed' }, 500)\n }\n})\n\n// Form-based registration handler (for HTML forms)\nauthRoutes.post('/register/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'register' }),\n async (c) => {\n try {\n const db = c.env.DB\n\n // Check if this is the first user (bootstrap scenario) - always allow\n const isFirstUser = await isFirstUserRegistration(db)\n\n // If not first user, check if registration is enabled\n if (!isFirstUser) {\n const registrationEnabled = await isRegistrationEnabled(db)\n if (!registrationEnabled) {\n return c.html(html`\n
\n Registration is currently disabled. Please contact an administrator.\n
\n `)\n }\n }\n\n const formData = await c.req.formData()\n\n // Extract form data\n const requestData = {\n email: formData.get('email') as string,\n password: formData.get('password') as string,\n username: formData.get('username') as string,\n firstName: formData.get('firstName') as string,\n lastName: formData.get('lastName') as string,\n }\n\n // Normalize email to lowercase\n const normalizedEmail = requestData.email?.toLowerCase()\n requestData.email = normalizedEmail\n\n // Build and validate using dynamic schema\n const validationSchema = await authValidationService.buildRegistrationSchema(db)\n const validation = await validationSchema.safeParseAsync(requestData)\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const validatedData: RegistrationData = validation.data\n\n // Extract fields with defaults for optional ones\n // const email = validatedData.email\n const password = validatedData.password\n const username = validatedData.username || authValidationService.generateDefaultValue('username', validatedData)\n const firstName = validatedData.firstName || authValidationService.generateDefaultValue('firstName', validatedData)\n const lastName = validatedData.lastName || authValidationService.generateDefaultValue('lastName', validatedData)\n \n // Check if user already exists\n const existingUser = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind(normalizedEmail, username)\n .first()\n \n if (existingUser) {\n return c.html(html`\n
\n User with this email or username already exists\n
\n `)\n }\n \n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Determine role: first user gets admin, others get viewer\n const role = isFirstUser ? 'admin' : 'viewer'\n\n // Create user\n const userId = crypto.randomUUID()\n const now = new Date()\n\n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n normalizedEmail,\n username,\n firstName,\n lastName,\n passwordHash,\n role,\n 1, // is_active\n now.getTime(),\n now.getTime()\n ).run()\n\n // Save custom profile fields if configured\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const regFields = getRegistrationFields()\n if (regFields.length > 0) {\n const customData: Record = { ...getProfileFieldDefaults() }\n for (const field of regFields) {\n const raw = formData.get(field.name)?.toString()\n if (raw !== undefined && raw !== null) {\n customData[field.name] = raw\n }\n }\n const sanitized = sanitizeCustomData(customData, profileConfig)\n await saveCustomData(db, userId, sanitized)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Redirect based on role\n const redirectUrl = role === 'admin' ? '/admin/dashboard' : '/admin/dashboard'\n\n return c.html(html`\n
\n Account created successfully! Redirecting...\n \n
\n `)\n } catch (error) {\n console.error('Registration error:', error)\n return c.html(html`\n
\n Registration failed. Please try again.\n
\n `)\n }\n})\n\n// Form-based login handler (for HTML forms)\nauthRoutes.post('/login/form',\n rateLimit({ max: 30, windowMs: 60 * 1000, keyPrefix: 'login' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email') as string\n const password = formData.get('password') as string\n\n // Normalize email to lowercase\n const normalizedEmail = email.toLowerCase()\n\n // Validate the data\n const validation = loginSchema.safeParse({ email: normalizedEmail, password })\n\n if (!validation.success) {\n return c.html(html`\n
\n ${validation.error.issues.map((err: { message: string }) => err.message).join(', ')}\n
\n `)\n }\n\n const db = c.env.DB\n \n // Find user\n const user = await db.prepare('SELECT * FROM users WHERE email = ? AND is_active = 1')\n .bind(normalizedEmail)\n .first() as any\n \n if (!user) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n \n // Verify password\n const isValidPassword = await AuthManager.verifyPassword(password, user.password_hash)\n if (!isValidPassword) {\n return c.html(html`\n
\n Invalid email or password\n
\n `)\n }\n\n // Transparent password hash migration: re-hash legacy SHA-256 to PBKDF2\n if (AuthManager.isLegacyHash(user.password_hash)) {\n try {\n const newHash = await AuthManager.hashPassword(password)\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(newHash, Date.now(), user.id)\n .run()\n } catch (rehashError) {\n console.error('Password rehash failed (non-fatal):', rehashError)\n }\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: false, // Set to true in production with HTTPS\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Update last login\n await db.prepare('UPDATE users SET last_login_at = ? WHERE id = ?')\n .bind(new Date().getTime(), user.id)\n .run()\n\n return c.html(html`\n
\n
\n
\n \n \n \n
\n

Login successful! Redirecting to admin dashboard...

\n
\n
\n \n
\n
\n `)\n } catch (error) {\n console.error('Login error:', error)\n return c.html(html`\n
\n Login failed. Please try again.\n
\n `)\n }\n})\n\n// Test seeding endpoint (only for development/testing)\nauthRoutes.post('/seed-admin',\n rateLimit({ max: 10, windowMs: 60 * 1000, keyPrefix: 'seed-admin' }),\n async (c) => {\n try {\n const db = c.env.DB\n \n // First ensure the users table exists\n await db.prepare(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL UNIQUE,\n username TEXT NOT NULL UNIQUE,\n first_name TEXT NOT NULL,\n last_name TEXT NOT NULL,\n password_hash TEXT,\n role TEXT NOT NULL DEFAULT 'viewer',\n avatar TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n last_login_at INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `).run()\n \n // Check if admin user already exists\n const existingAdmin = await db.prepare('SELECT id FROM users WHERE email = ? OR username = ?')\n .bind('admin@sonicjs.com', 'admin')\n .first()\n\n if (existingAdmin) {\n // Update the password to ensure it's correct for testing\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n await db.prepare('UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?')\n .bind(passwordHash, Date.now(), existingAdmin.id)\n .run()\n\n return c.json({\n message: 'Admin user already exists (password updated)',\n user: {\n id: existingAdmin.id,\n email: 'admin@sonicjs.com',\n username: 'admin',\n role: 'admin'\n }\n })\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword('sonicjs!')\n \n // Create admin user\n const userId = 'admin-user-id'\n const now = Date.now()\n const adminEmail = 'admin@sonicjs.com'.toLowerCase()\n \n await db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n userId,\n adminEmail,\n 'admin',\n 'Admin',\n 'User',\n passwordHash,\n 'admin',\n 1, // is_active\n now,\n now\n ).run()\n \n return c.json({ \n message: 'Admin user created successfully',\n user: {\n id: userId,\n email: adminEmail,\n username: 'admin',\n role: 'admin'\n },\n passwordHash: passwordHash // For debugging\n })\n } catch (error) {\n console.error('Seed admin error:', error)\n return c.json({ error: 'Failed to create admin user', details: error instanceof Error ? error.message : String(error) }, 500)\n }\n})\n\n\n// Accept invitation page\nauthRoutes.get('/accept-invitation', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.html(`\n \n Invalid Invitation\n \n

Invalid Invitation

\n

The invitation link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.html(`\n \n Invitation Expired\n \n

Invitation Expired

\n

This invitation has expired. Please contact your administrator for a new invitation.

\n Go to Login\n \n \n `)\n }\n\n // Show invitation acceptance form\n return c.html(`\n \n \n \n \n \n Accept Invitation - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Accept Invitation

\n

Complete your account setup

\n

\n You've been invited as ${invitedUser.first_name} ${invitedUser.last_name}
\n ${invitedUser.email}
\n ${invitedUser.role}\n

\n
\n\n
\n \n \n
\n \n \n
\n\n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Accept invitation page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your invitation.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process invitation acceptance\nauthRoutes.post('/accept-invitation', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const username = formData.get('username')?.toString()?.trim()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !username || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if invitation token is valid\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invited_at\n FROM users \n WHERE invitation_token = ? AND is_active = 0\n `)\n const invitedUser = await userStmt.bind(token).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'Invalid or expired invitation' }, 400)\n }\n\n // Check if invitation is expired (7 days)\n const invitationAge = Date.now() - invitedUser.invited_at\n const maxAge = 7 * 24 * 60 * 60 * 1000 // 7 days\n \n if (invitationAge > maxAge) {\n return c.json({ error: 'Invitation has expired' }, 400)\n }\n\n // Check if username is available\n const existingUsernameStmt = db.prepare(`\n SELECT id FROM users WHERE username = ? AND id != ?\n `)\n const existingUsername = await existingUsernameStmt.bind(username, invitedUser.id).first()\n\n if (existingUsername) {\n return c.json({ error: 'Username is already taken' }, 400)\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Activate user account\n const updateStmt = db.prepare(`\n UPDATE users SET \n username = ?,\n password_hash = ?,\n is_active = 1,\n email_verified = 1,\n invitation_token = NULL,\n accepted_invitation_at = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n username,\n passwordHash,\n Date.now(),\n Date.now(),\n invitedUser.id\n ).run()\n\n // Generate JWT token for auto-login\n const tokenTtl = await getJwtExpirySecondsFromDb(c.env.DB, c.env)\n const authToken = await AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', authToken, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n // Set CSRF cookie for browser sessions\n await setCsrfCookie(c)\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?welcome=true')\n\n } catch (error) {\n console.error('Accept invitation error:', error)\n return c.json({ error: 'Failed to accept invitation' }, 500)\n }\n})\n\n// Request password reset\nauthRoutes.post('/request-password-reset',\n rateLimit({ max: 3, windowMs: 15 * 60 * 1000, keyPrefix: 'password-reset' }),\n async (c) => {\n try {\n const formData = await c.req.formData()\n const email = formData.get('email')?.toString()?.trim()?.toLowerCase()\n\n if (!email) {\n return c.json({ error: 'Email is required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if user exists and is active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name FROM users \n WHERE email = ? AND is_active = 1\n `)\n const user = await userStmt.bind(email).first() as any\n\n // Always return success to prevent email enumeration\n if (!user) {\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.'\n })\n }\n\n // Generate password reset token (expires in 1 hour)\n const resetToken = crypto.randomUUID()\n const resetExpires = Date.now() + (60 * 60 * 1000) // 1 hour\n\n // Update user with reset token\n const updateStmt = db.prepare(`\n UPDATE users SET \n password_reset_token = ?,\n password_reset_expires = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n resetToken,\n resetExpires,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // In a real implementation, you would send an email here\n // For now, we'll return the reset link for development\n const resetLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/reset-password?token=${resetToken}`\n\n return c.json({\n success: true,\n message: 'If an account with this email exists, a password reset link has been sent.',\n reset_link: resetLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('Password reset request error:', error)\n return c.json({ error: 'Failed to process password reset request' }, 500)\n }\n})\n\n// Show password reset form\nauthRoutes.get('/reset-password', async (c) => {\n try {\n const token = c.req.query('token')\n \n if (!token) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has expired.

\n Go to Login\n \n \n `)\n }\n\n const db = c.env.DB\n \n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, password_reset_expires\n FROM users \n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.html(`\n \n Invalid Reset Link\n \n

Invalid Reset Link

\n

The password reset link is invalid or has already been used.

\n Go to Login\n \n \n `)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.html(`\n \n Reset Link Expired\n \n

Reset Link Expired

\n

The password reset link has expired. Please request a new one.

\n Go to Login\n \n \n `)\n }\n\n // Show password reset form\n return c.html(`\n \n \n \n \n \n Reset Password - SonicJS AI\n \n \n \n \n
\n
\n
\n
\n \n \n \n
\n

Reset Password

\n

Choose a new password for your account

\n

\n Reset password for ${user.first_name} ${user.last_name}
\n ${user.email}\n

\n
\n\n
\n \n \n
\n \n \n

Password must be at least 8 characters long

\n
\n\n
\n \n \n
\n\n \n
\n\n \n
\n
\n \n \n `)\n\n } catch (error) {\n console.error('Password reset page error:', error)\n return c.html(`\n \n Error\n \n

Error

\n

An error occurred while processing your password reset.

\n Go to Login\n \n \n `)\n }\n})\n\n// Process password reset\nauthRoutes.post('/reset-password', async (c) => {\n try {\n const formData = await c.req.formData()\n const token = formData.get('token')?.toString()\n const password = formData.get('password')?.toString()\n const confirmPassword = formData.get('confirm_password')?.toString()\n\n if (!token || !password || !confirmPassword) {\n return c.json({ error: 'All fields are required' }, 400)\n }\n\n if (password !== confirmPassword) {\n return c.json({ error: 'Passwords do not match' }, 400)\n }\n\n if (password.length < 8) {\n return c.json({ error: 'Password must be at least 8 characters long' }, 400)\n }\n\n const db = c.env.DB\n\n // Check if reset token is valid and not expired\n const userStmt = db.prepare(`\n SELECT id, email, password_hash, password_reset_expires\n FROM users\n WHERE password_reset_token = ? AND is_active = 1\n `)\n const user = await userStmt.bind(token).first() as any\n\n if (!user) {\n return c.json({ error: 'Invalid or expired reset token' }, 400)\n }\n\n // Check if token is expired\n if (Date.now() > user.password_reset_expires) {\n return c.json({ error: 'Reset token has expired' }, 400)\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(password)\n\n // Store old password in history (skip if table doesn't exist)\n try {\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user.id,\n user.password_hash,\n Date.now()\n ).run()\n } catch (historyError) {\n // Password history table may not exist yet\n console.warn('Could not store password history:', historyError)\n }\n\n // Update user password and clear reset token\n const updateStmt = db.prepare(`\n UPDATE users SET\n password_hash = ?,\n password_reset_token = NULL,\n password_reset_expires = NULL,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newPasswordHash,\n Date.now(),\n user.id\n ).run()\n\n // Log the activity (TODO: implement activity logging)\n // Activity logging is deferred until utils/log-activity is implemented\n\n // Redirect to login with success message\n return c.redirect('/auth/login?message=Password reset successfully. Please log in with your new password.')\n\n } catch (error) {\n console.error('Password reset error:', error)\n return c.json({ error: 'Failed to reset password' }, 500)\n }\n})\n\nexport default authRoutes\n","/**\n * Test Cleanup Routes\n *\n * Provides endpoints to clean up test data after e2e tests\n * WARNING: These endpoints should only be available in development/test environments\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database } from '@cloudflare/workers-types'\n\nconst app = new Hono()\n\n/**\n * Clean up all test data (collections, content, users except admin)\n * POST /test-cleanup\n */\napp.post('/test-cleanup', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Use pattern-based deletes to avoid SQL variable limits\n // This approach uses subqueries instead of building large IN lists\n\n // Step 1: Delete child data for test content (by pattern)\n await db.prepare(`\n DELETE FROM content_versions\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM workflow_history\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n\n // Note: content_data table may not exist in all schemas\n try {\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id IN (\n SELECT id FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n )\n `).run()\n } catch (e) {\n // Table doesn't exist, skip\n }\n\n // Step 2: Delete test content by pattern\n const contentResult = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %' OR title LIKE '%E2E%' OR title LIKE '%Playwright%' OR title LIKE '%Sample%'\n `).run()\n deletedCount += contentResult.meta?.changes || 0\n\n // Step 3: Delete child data for test users\n await db.prepare(`\n DELETE FROM api_tokens\n WHERE user_id IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n await db.prepare(`\n DELETE FROM media\n WHERE uploaded_by IN (\n SELECT id FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n )\n `).run()\n\n // Step 4: Delete test users\n const usersResult = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com' AND (email LIKE '%test%' OR email LIKE '%example.com%')\n `).run()\n deletedCount += usersResult.meta?.changes || 0\n\n // Step 5: Delete child data for test collections\n try {\n await db.prepare(`\n DELETE FROM collection_fields\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Delete remaining content from test collections\n await db.prepare(`\n DELETE FROM content\n WHERE collection_id IN (\n SELECT id FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n )\n `).run()\n\n // Step 6: Delete test collections\n const collectionsResult = await db.prepare(`\n DELETE FROM collections\n WHERE name LIKE 'test_%' OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).run()\n deletedCount += collectionsResult.meta?.changes || 0\n\n // Step 7: Clean up orphaned data (skip if tables don't exist)\n try {\n await db.prepare(`\n DELETE FROM content_data WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM collection_fields WHERE collection_id NOT IN (SELECT id FROM collections)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM content_versions WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n try {\n await db.prepare(`\n DELETE FROM workflow_history WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n } catch (e) {\n // Table doesn't exist\n }\n\n // Step 8: Delete old activity logs (keep only last 100)\n await db.prepare(`\n DELETE FROM activity_logs\n WHERE id NOT IN (\n SELECT id FROM activity_logs\n ORDER BY created_at DESC\n LIMIT 100\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test data cleaned up successfully'\n })\n } catch (error) {\n console.error('Test cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test users only\n * POST /test-cleanup/users\n */\napp.post('/test-cleanup/users', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test users (preserve admin)\n const result = await db.prepare(`\n DELETE FROM users\n WHERE email != 'admin@sonicjs.com'\n AND (\n email LIKE '%test%'\n OR email LIKE '%example.com%'\n OR first_name = 'Test'\n )\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test users cleaned up successfully'\n })\n } catch (error) {\n console.error('User cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test collections only\n * POST /test-cleanup/collections\n */\napp.post('/test-cleanup/collections', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n let deletedCount = 0\n\n // Get test collection IDs first\n const collections = await db.prepare(`\n SELECT id FROM collections\n WHERE name LIKE 'test_%'\n OR name IN ('blog_posts', 'test_collection', 'products', 'articles')\n `).all()\n\n if (collections.results && collections.results.length > 0) {\n const collectionIds = collections.results.map((c: any) => c.id)\n\n // Delete associated fields\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM collection_fields WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete associated content\n for (const id of collectionIds) {\n await db.prepare('DELETE FROM content WHERE collection_id = ?').bind(id).run()\n }\n\n // Delete the collections\n const result = await db.prepare(`\n DELETE FROM collections\n WHERE id IN (${collectionIds.map(() => '?').join(',')})\n `).bind(...collectionIds).run()\n\n deletedCount = result.meta?.changes || 0\n }\n\n return c.json({\n success: true,\n deletedCount,\n message: 'Test collections cleaned up successfully'\n })\n } catch (error) {\n console.error('Collection cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * Clean up test content only\n * POST /test-cleanup/content\n */\napp.post('/test-cleanup/content', async (c: Context) => {\n const db = c.env.DB as D1Database\n\n // Only allow in development/test environments\n if (c.env.ENVIRONMENT === 'production') {\n return c.json({ error: 'Cleanup endpoint not available in production' }, 403)\n }\n\n try {\n // Delete test content\n const result = await db.prepare(`\n DELETE FROM content\n WHERE title LIKE 'Test %'\n OR title LIKE '%E2E%'\n OR title LIKE '%Playwright%'\n OR title LIKE '%Sample%'\n `).run()\n\n // Clean up orphaned content_data\n await db.prepare(`\n DELETE FROM content_data\n WHERE content_id NOT IN (SELECT id FROM content)\n `).run()\n\n return c.json({\n success: true,\n deletedCount: result.meta?.changes || 0,\n message: 'Test content cleaned up successfully'\n })\n } catch (error) {\n console.error('Content cleanup error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Plugin Middleware\n *\n * Provides middleware functions for checking plugin status and enforcing plugin requirements\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n/**\n * Check if a plugin is active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @returns Promise - True if the plugin is active, false otherwise\n */\nexport async function isPluginActive(db: D1Database, pluginId: string): Promise {\n try {\n const result = await db\n .prepare('SELECT status FROM plugins WHERE id = ?')\n .bind(pluginId)\n .first()\n\n return result?.status === 'active'\n } catch (error) {\n console.error(`[isPluginActive] Error checking plugin status for ${pluginId}:`, error)\n return false\n }\n}\n\n/**\n * Middleware to require a plugin to be active\n * Throws an error if the plugin is not active\n * @param db - The D1 database instance\n * @param pluginId - The plugin ID to check\n * @throws Error if plugin is not active\n */\nexport async function requireActivePlugin(db: D1Database, pluginId: string): Promise {\n const isActive = await isPluginActive(db, pluginId)\n if (!isActive) {\n throw new Error(`Plugin '${pluginId}' is required but is not active`)\n }\n}\n\n/**\n * Middleware to require multiple plugins to be active\n * Throws an error if any plugin is not active\n * @param db - The D1 database instance\n * @param pluginIds - Array of plugin IDs to check\n * @throws Error if any plugin is not active\n */\nexport async function requireActivePlugins(db: D1Database, pluginIds: string[]): Promise {\n for (const pluginId of pluginIds) {\n await requireActivePlugin(db, pluginId)\n }\n}\n\n/**\n * Get all active plugins\n * @param db - The D1 database instance\n * @returns Promise - Array of active plugin records\n */\nexport async function getActivePlugins(db: D1Database): Promise {\n try {\n const { results } = await db\n .prepare('SELECT * FROM plugins WHERE status = ?')\n .bind('active')\n .all()\n\n return results || []\n } catch (error) {\n console.error('[getActivePlugins] Error fetching active plugins:', error)\n return []\n }\n}\n","export interface ContentVersion {\n id: string\n version: number\n data: any\n author_id: string\n author_name?: string\n created_at: number\n is_current?: boolean\n}\n\nexport interface VersionHistoryData {\n contentId: string\n versions: ContentVersion[]\n currentVersion: number\n}\n\nexport function renderVersionHistory(data: VersionHistoryData): string {\n return `\n
\n
\n \n
\n
\n
\n

Version History

\n \n
\n
\n \n \n
\n
\n ${data.versions.map((version, index) => `\n
\n
\n
\n \n Version ${version.version}${version.is_current ? ' (Current)' : ''}\n \n \n ${new Date(version.created_at).toLocaleString()}\n \n
\n
\n ${!version.is_current ? `\n \n ` : ''}\n \n
\n
\n \n \n
\n
\n
\n Title:\n ${escapeHtml(version.data?.title || 'Untitled')}\n
\n
\n Author:\n ${escapeHtml(version.author_name || 'Unknown')}\n
\n ${version.data?.excerpt ? `\n
\n Excerpt:\n

${escapeHtml(version.data.excerpt.substring(0, 200))}${version.data.excerpt.length > 200 ? '...' : ''}

\n
\n ` : ''}\n
\n
\n \n \n ${!version.is_current && index < data.versions.length - 1 ? `\n
\n \n
\n Change detection coming soon...\n
\n
\n ` : ''}\n
\n `).join('')}\n
\n
\n \n \n
\n
\n \n ${data.versions.length} version${data.versions.length !== 1 ? 's' : ''} total\n \n \n
\n
\n
\n
\n \n \n `\n}\n\nfunction escapeHtml(text: string): string {\n if (typeof text !== 'string') return String(text || '')\n return text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n}","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * EasyMDE Markdown Editor Plugin\n *\n * Provides markdown editing capabilities for richtext fields.\n * When active, this plugin injects the EasyMDE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'easy-mdx',\n version: '1.0.0',\n description: 'Lightweight markdown editor with live preview'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ EasyMDE editor plugin activated')\n },\n deactivate: async () => {\n console.info('❌ EasyMDE editor plugin deactivated')\n }\n})\n\nconst easyMdxPlugin = builder.build() as Plugin\n\nexport default easyMdxPlugin\n\n/**\n * Get EasyMDE CDN script tags\n * @returns HTML script and style tags for EasyMDE\n */\nexport function getMDXEditorScripts(): string {\n return `\n \n \n \n \n `\n}\n\n/**\n * Get EasyMDE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getMDXEditorInitScript(config?: {\n defaultHeight?: number\n toolbar?: string\n placeholder?: string\n}): string {\n const defaultHeight = config?.defaultHeight || 400\n const toolbar = config?.toolbar || 'full'\n const placeholder = config?.placeholder || 'Start writing your content...'\n\n return `\n // Initialize EasyMDE (Markdown Editor) only for markdown-marked fields\n function initializeMDXEditor() {\n if (typeof EasyMDE === 'undefined') {\n console.warn('EasyMDE not loaded yet, retrying...');\n setTimeout(initializeMDXEditor, 100);\n return;\n }\n\n // Find all textareas that need EasyMDE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"easymde\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (textarea.dataset.mdxeditorInitialized === 'true') {\n return;\n }\n\n // Mark as initialized\n textarea.dataset.mdxeditorInitialized = 'true';\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const editorToolbar = container?.dataset.toolbar || '${toolbar}';\n\n // Initialize EasyMDE\n try {\n const toolbarButtons = editorToolbar === 'minimal'\n ? ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'preview']\n : ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', 'table', '|', 'preview', 'side-by-side', 'fullscreen', '|', 'guide'];\n\n const easyMDE = new EasyMDE({\n element: textarea,\n placeholder: '${placeholder}',\n spellChecker: false,\n minHeight: height + 'px',\n toolbar: toolbarButtons,\n status: ['lines', 'words', 'cursor'],\n renderingConfig: {\n singleLineBreaks: false,\n codeSyntaxHighlighting: true\n }\n });\n\n // Store reference to editor instance\n textarea.easyMDEInstance = easyMDE;\n\n // Sync changes back to textarea\n easyMDE.codemirror.on(\"change\", () => {\n textarea.value = easyMDE.value();\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n textarea.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n\n console.log('EasyMDE initialized for field:', textarea.id || textarea.name);\n } catch (error) {\n console.error('Error initializing EasyMDE:', error);\n // Show textarea as fallback\n textarea.style.display = 'block';\n }\n });\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeMDXEditor);\n } else {\n // DOM already loaded, initialize immediately\n initializeMDXEditor();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeMDXEditor, 100);\n });\n `\n}\n\n/**\n * Check if EasyMDE editor plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isEasyMdxActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('easy-mdx')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking EasyMDE editor plugin status:', error)\n return false\n }\n}\n","import { Plugin } from '../../../types/plugin'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\n\n/**\n * TinyMCE Rich Text Editor Plugin\n *\n * Provides WYSIWYG editing capabilities for richtext fields.\n * When active, this plugin injects the TinyMCE editor into all richtext field types.\n * When inactive, richtext fields fall back to plain textareas.\n */\n\nconst builder = PluginBuilder.create({\n name: 'tinymce-plugin',\n version: '1.0.0',\n description: 'Powerful WYSIWYG rich text editor for content creation'\n})\n\nbuilder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n})\n\nbuilder.lifecycle({\n activate: async () => {\n console.info('✅ TinyMCE plugin activated')\n },\n deactivate: async () => {\n console.info('❌ TinyMCE plugin deactivated')\n }\n})\n\nconst tinymcePlugin = builder.build() as Plugin\n\nexport default tinymcePlugin\n\n/**\n * Get TinyMCE CDN script tag\n * @param apiKey - Optional TinyMCE API key (defaults to 'no-api-key')\n * @returns HTML script tag for TinyMCE CDN\n */\nexport function getTinyMCEScript(apiKey: string = 'no-api-key'): string {\n return ``\n}\n\n/**\n * Get TinyMCE initialization script\n * @param config - Optional configuration object\n * @returns JavaScript initialization code\n */\nexport function getTinyMCEInitScript(config?: {\n skin?: string\n defaultHeight?: number\n defaultToolbar?: string\n}): string {\n const skin = config?.skin || 'oxide-dark'\n const contentCss = skin.includes('dark') ? 'dark' : 'default'\n const defaultHeight = config?.defaultHeight || 300\n\n return `\n // Initialize TinyMCE only for TinyMCE-backed richtext fields\n function initializeTinyMCE() {\n if (typeof tinymce !== 'undefined') {\n // Find all textareas that need TinyMCE\n document.querySelectorAll('.richtext-container[data-editor-provider=\"tinymce\"] textarea').forEach((textarea) => {\n // Skip if already initialized\n if (tinymce.get(textarea.id)) {\n return;\n }\n\n // Get configuration from data attributes\n const container = textarea.closest('.richtext-container');\n const height = container?.dataset.height || ${defaultHeight};\n const toolbar = container?.dataset.toolbar || 'full';\n\n tinymce.init({\n selector: '#' + textarea.id,\n skin: '${skin}',\n content_css: '${contentCss}',\n height: parseInt(height),\n menubar: false,\n plugins: [\n 'advlist', 'autolink', 'lists', 'link', 'image', 'charmap', 'preview',\n 'anchor', 'searchreplace', 'visualblocks', 'code', 'fullscreen',\n 'insertdatetime', 'media', 'table', 'help', 'wordcount'\n ],\n toolbar: toolbar === 'simple'\n ? 'bold italic underline | bullist numlist | link'\n : toolbar === 'minimal'\n ? 'bold italic | link'\n : 'undo redo | blocks | bold italic forecolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | help',\n content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; font-size: 14px }'\n });\n });\n }\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeTinyMCE);\n } else {\n // DOM already loaded, initialize immediately\n initializeTinyMCE();\n }\n\n // Also reinitialize after HTMX swaps (for dynamic content)\n document.addEventListener('htmx:afterSwap', function(event) {\n // Give the DOM a moment to settle\n setTimeout(initializeTinyMCE, 100);\n });\n `\n}\n\n/**\n * Check if TinyMCE plugin is active\n * @param pluginService - Plugin service instance\n * @returns Promise\n */\nexport async function isTinyMCEActive(pluginService: any): Promise {\n try {\n const status = await pluginService.getPluginStatus('tinymce-plugin')\n return status?.is_active === true\n } catch (error) {\n console.error('Error checking TinyMCE plugin status:', error)\n return false\n }\n}\n","/**\n * Quill Rich Text Editor Plugin\n *\n * Provides Quill editor integration for rich text editing in SonicJS\n * https://quilljs.com/\n */\n\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\n/**\n * Quill Editor Configuration Options\n */\nexport interface QuillOptions {\n theme?: 'snow' | 'bubble'\n placeholder?: string\n height?: number\n toolbar?: 'full' | 'simple' | 'minimal' | string[][]\n modules?: Record\n formats?: string[]\n}\n\n/**\n * Default Quill toolbar configurations\n */\nconst QUILL_TOOLBARS = {\n full: [\n [{ 'header': [1, 2, 3, 4, 5, 6, false] }],\n ['bold', 'italic', 'underline', 'strike'],\n [{ 'color': [] }, { 'background': [] }],\n [{ 'align': [] }],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n [{ 'indent': '-1'}, { 'indent': '+1' }],\n ['blockquote', 'code-block'],\n ['link', 'image', 'video'],\n ['clean']\n ],\n simple: [\n ['bold', 'italic', 'underline'],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }],\n ['link']\n ],\n minimal: [\n ['bold', 'italic'],\n ['link']\n ]\n}\n\n/**\n * Render a Quill editor field\n * @param fieldId - The field ID\n * @param fieldName - The field name\n * @param value - The current value\n * @param options - Quill configuration options\n * @returns HTML string for the Quill editor field\n */\nexport function renderQuillField(\n fieldId: string,\n fieldName: string,\n value: string = '',\n options: QuillOptions = {}\n): string {\n const {\n theme = 'snow',\n placeholder = 'Enter content...',\n height = 300,\n toolbar = 'full'\n } = options\n\n // Escape HTML for hidden input\n const escapeHtml = (str: string) => {\n return str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n }\n\n return `\n
\n \n ${value}
\n\n \n \n \n `\n}\n\n/**\n * Generate Quill initialization script\n * @returns HTML script tag with Quill initialization code\n */\nexport function getQuillInitScript(): string {\n return `\n \n `\n}\n\n/**\n * Generate Quill CDN links\n * @param version - Quill version (default: 2.0.2)\n * @returns HTML script and link tags for Quill CDN\n */\nexport function getQuillCDN(version: string = '2.0.2'): string {\n return `\n \n \n \n\n \n \n\n \n \n `\n}\n\n/**\n * Create the Quill Editor Plugin\n */\nexport function createQuillEditorPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'quill-editor',\n version: '1.0.0',\n description: 'Quill rich text editor integration for SonicJS'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Quill Editor plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Quill Editor plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const quillEditorPlugin = createQuillEditorPlugin()\n","import { getMDXEditorInitScript, getMDXEditorScripts } from '../../plugins/available/easy-mdx'\nimport { getTinyMCEInitScript, getTinyMCEScript } from '../../plugins/available/tinymce-plugin'\nimport { getQuillCDN, getQuillInitScript } from '../../plugins/core-plugins/quill-editor'\nimport { renderAlert } from '../alert.template'\nimport { FieldDefinition, renderDynamicField, renderFieldGroup } from '../components/dynamic-field.template'\nimport { getConfirmationDialogScript, renderConfirmationDialog } from '../confirmation-dialog.template'\nimport { AdminLayoutCatalystData, renderAdminLayoutCatalyst } from '../layouts/admin-layout-catalyst.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n schema: any\n}\n\nexport interface ContentFormData {\n id?: string\n title?: string\n slug?: string\n created_at?: number\n updated_at?: number\n published_at?: number\n data?: any\n status?: string\n scheduled_publish_at?: number\n scheduled_unpublish_at?: number\n review_status?: string\n meta_title?: string\n meta_description?: string\n collection: Collection\n fields: FieldDefinition[]\n isEdit?: boolean\n error?: string\n success?: string\n validationErrors?: Record\n workflowEnabled?: boolean // New flag to indicate if workflow plugin is active\n tinymceEnabled?: boolean // Flag to indicate if TinyMCE plugin is active\n tinymceSettings?: {\n apiKey?: string\n defaultHeight?: number\n defaultToolbar?: string\n skin?: string\n }\n quillEnabled?: boolean // Flag to indicate if Quill plugin is active\n quillSettings?: {\n version?: string\n defaultHeight?: number\n defaultToolbar?: string\n theme?: string\n }\n mdxeditorEnabled?: boolean // Flag to indicate if MDXEditor plugin is active\n mdxeditorSettings?: {\n defaultHeight?: number\n theme?: string\n toolbar?: string\n placeholder?: string\n }\n referrerParams?: string // URL parameters to preserve filters when returning to list\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentFormPage(data: ContentFormData): string {\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? `Edit: ${data.title || 'Content'}` : `New ${data.collection.display_name}`\n const hasValidationErrors = Boolean(data.validationErrors && Object.keys(data.validationErrors).length > 0)\n\n // Construct back URL with preserved filters\n const backUrl = data.referrerParams\n ? `/admin/content?${data.referrerParams}`\n : `/admin/content?collection=${data.collection.id}`\n\n // Group fields by category\n const coreFields = data.fields.filter(f => ['title', 'slug', 'content'].includes(f.field_name))\n const contentFields = data.fields.filter(f => !['title', 'slug', 'content'].includes(f.field_name) && !f.field_name.startsWith('meta_'))\n const metaFields = data.fields.filter(f => f.field_name.startsWith('meta_'))\n\n // Helper function to get field value - title and slug are stored as columns, others in data JSON\n const getFieldValue = (fieldName: string) => {\n if (fieldName === 'title') return data.title || data.data?.[fieldName] || ''\n if (fieldName === 'slug') return data.slug || data.data?.[fieldName] || ''\n return data.data?.[fieldName] || ''\n }\n\n // Prepare plugin statuses for field rendering\n const pluginStatuses = {\n quillEnabled: data.quillEnabled || false,\n mdxeditorEnabled: data.mdxeditorEnabled || false,\n tinymceEnabled: data.tinymceEnabled || false\n }\n\n // Render field groups\n const coreFieldsHTML = coreFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id // Pass content ID when editing\n }))\n\n const contentFieldsHTML = contentFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const metaFieldsHTML = metaFields\n .sort((a, b) => a.field_order - b.field_order)\n .map(field => renderDynamicField(field, {\n value: getFieldValue(field.field_name),\n errors: data.validationErrors?.[field.field_name] || [],\n pluginStatuses,\n collectionId: data.collection.id,\n contentId: data.id\n }))\n\n const pageContent = `\n
\n \n
\n
\n

${isEdit ? 'Edit Content' : 'New Content'}

\n

\n ${data.collection.description || `Manage ${data.collection.display_name.toLowerCase()} content`}\n

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

${data.collection.display_name}

\n

${isEdit ? 'Update your content' : 'Create new content'}

\n
\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n
\n \n
\n \n \n ${isEdit ? `` : ''}\n ${data.referrerParams ? `` : ''}\n \n \n ${renderFieldGroup('Basic Information', coreFieldsHTML)}\n \n \n ${contentFields.length > 0 ? renderFieldGroup('Content Details', contentFieldsHTML) : ''}\n \n \n ${metaFields.length > 0 ? renderFieldGroup('SEO & Metadata', metaFieldsHTML, true) : ''}\n \n
\n \n
\n\n \n
\n \n
\n

Publishing

\n\n ${data.workflowEnabled ? `\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n \n

Leave empty to publish immediately

\n
\n\n \n
\n \n \n

Automatically unpublish at this time

\n
\n ` : `\n \n
\n \n
\n \n \n \n \n \n \n \n
\n

Enable Workflow plugin for advanced status management

\n
\n `}\n
\n\n \n ${isEdit ? `\n
\n

Content Info

\n\n
\n
\n
Created
\n
${data.created_at ? new Date(data.created_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Last Modified
\n
${data.updated_at ? new Date(data.updated_at).toLocaleDateString() : 'Unknown'}
\n
\n
\n
Author
\n
${data.data?.author || 'Unknown'}
\n
\n ${data.published_at ? `\n
\n
Published
\n
${new Date(data.published_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n\n
\n \n \n \n \n View Version History\n \n
\n
\n ` : ''}\n\n \n
\n

Quick Actions

\n\n
\n \n \n \n \n \n Preview Content\n \n\n \n \n \n \n Duplicate Content\n \n\n ${isEdit ? `\n \n \n \n \n Delete Content\n \n ` : ''}\n
\n
\n
\n\n \n
\n \n \n \n \n Cancel\n \n\n
\n \n \n \n \n ${isEdit ? 'Update' : 'Save'}\n \n\n ${data.user?.role !== 'viewer' ? `\n \n \n \n \n ${isEdit ? 'Update' : 'Save'} & Publish\n \n ` : ''}\n
\n
\n
\n
\n
\n\n \n ${renderConfirmationDialog({\n id: 'duplicate-content-confirm',\n title: 'Duplicate Content',\n message: 'Create a copy of this content?',\n confirmText: 'Duplicate',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performDuplicateContent()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-content-confirm',\n title: 'Delete Content',\n message: 'Are you sure you want to delete this content? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: `performDeleteContent('${data.id}')`\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-repeater-item-confirm',\n title: 'Delete Item',\n message: 'Are you sure you want to delete this item? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${renderConfirmationDialog({\n id: 'delete-block-confirm',\n title: 'Delete Block',\n message: 'Are you sure you want to delete this block? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performRepeaterDelete()'\n })}\n\n ${getConfirmationDialogScript()}\n\n ${data.tinymceEnabled ? getTinyMCEScript(data.tinymceSettings?.apiKey) : ''}\n\n ${data.quillEnabled ? getQuillCDN(data.quillSettings?.version) : ''}\n\n ${data.quillEnabled ? getQuillInitScript() : ''}\n\n ${data.mdxeditorEnabled ? getMDXEditorScripts() : ''}\n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n content: pageContent,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderTable, TableData, TableColumn } from '../table.template'\nimport type { FilterBarData } from '../filter-bar.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../confirmation-dialog.template'\n\nexport interface ContentItem {\n id: string\n title: string\n slug: string\n modelName: string\n statusBadge: string\n authorName: string\n formattedDate: string\n availableActions: string[]\n}\n\nexport interface ContentListPageData {\n modelName: string\n status: string\n page: number\n search?: string\n models: Array<{\n name: string\n displayName: string\n }>\n contentItems: ContentItem[]\n totalItems: number\n itemsPerPage: number\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderContentListPage(data: ContentListPageData): string {\n // Build current URL parameters to pass to edit page\n const urlParams = new URLSearchParams()\n if (data.modelName && data.modelName !== 'all') urlParams.set('model', data.modelName)\n if (data.status && data.status !== 'all') urlParams.set('status', data.status)\n if (data.search) urlParams.set('search', data.search)\n if (data.page && data.page !== 1) urlParams.set('page', data.page.toString())\n const currentParams = urlParams.toString()\n\n // Check if filters are active (not in default state)\n const hasActiveFilters = data.modelName !== 'all' || data.status !== 'all' || !!data.search\n\n // Prepare filter bar data\n const filterBarData: FilterBarData = {\n filters: [\n {\n name: 'model',\n label: 'Model',\n options: [\n { value: 'all', label: 'All Models', selected: data.modelName === 'all' },\n ...data.models.map(model => ({\n value: model.name,\n label: model.displayName,\n selected: data.modelName === model.name\n }))\n ]\n },\n {\n name: 'status',\n label: 'Status',\n options: [\n { value: 'all', label: 'All Status', selected: data.status === 'all' },\n { value: 'draft', label: 'Draft', selected: data.status === 'draft' },\n { value: 'review', label: 'Under Review', selected: data.status === 'review' },\n { value: 'scheduled', label: 'Scheduled', selected: data.status === 'scheduled' },\n { value: 'published', label: 'Published', selected: data.status === 'published' },\n { value: 'archived', label: 'Archived', selected: data.status === 'archived' },\n { value: 'deleted', label: 'Deleted', selected: data.status === 'deleted' }\n ]\n }\n ],\n actions: [\n {\n label: 'Advanced Search',\n className: 'btn-primary',\n onclick: 'openAdvancedSearch()'\n },\n {\n label: 'Refresh',\n className: 'btn-secondary',\n onclick: 'location.reload()'\n }\n ],\n bulkActions: [\n { label: 'Publish', value: 'publish', icon: 'check-circle' },\n { label: 'Unpublish', value: 'unpublish', icon: 'x-circle' },\n { label: 'Delete', value: 'delete', icon: 'trash', className: 'text-pink-600' }\n ]\n }\n\n // Prepare table data\n const tableColumns: TableColumn[] = [\n {\n key: 'title',\n label: 'Title',\n sortable: true,\n sortType: 'string',\n render: (value, row) => `\n
\n
\n \n
${row.slug}
\n
\n
\n `\n },\n {\n key: 'modelName',\n label: 'Model',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'statusBadge',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (value) => value\n },\n {\n key: 'authorName',\n label: 'Author',\n sortable: true,\n sortType: 'string',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'formattedDate',\n label: 'Updated',\n sortable: true,\n sortType: 'date',\n className: 'text-sm text-zinc-500 dark:text-zinc-400'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n className: 'text-sm font-medium',\n render: (value, row) => `\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'content-table',\n columns: tableColumns,\n rows: data.contentItems,\n selectable: true,\n rowClickable: true,\n rowClickUrl: (row: ContentItem) => `/admin/content/${row.id}/edit${currentParams ? `?ref=${encodeURIComponent(currentParams)}` : ''}`,\n emptyMessage: 'No content found. Create your first content item to get started.'\n }\n\n // Prepare pagination data\n const totalPages = Math.ceil(data.totalItems / data.itemsPerPage)\n const startItem = (data.page - 1) * data.itemsPerPage + 1\n const endItem = Math.min(data.page * data.itemsPerPage, data.totalItems)\n\n const paginationData: PaginationData = {\n currentPage: data.page,\n totalPages,\n totalItems: data.totalItems,\n itemsPerPage: data.itemsPerPage,\n startItem,\n endItem,\n baseUrl: '/admin/content',\n queryParams: {\n model: data.modelName,\n status: data.status,\n ...(data.search ? { search: data.search } : {})\n },\n showPageSizeSelector: true,\n pageSizeOptions: [10, 20, 50, 100]\n }\n\n // Generate page content\n const pageContent = `\n
\n \n
\n
\n

Content Management

\n

Manage and organize your content items

\n
\n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n \n
\n \n
\n \n \n ${data.models.map(model => `\n \n `).join('')}\n \n \n \n \n
\n
\n\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n\n \n
\n \n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n
\n ${data.totalItems} ${data.totalItems === 1 ? 'item' : 'items'}\n ${filterBarData.actions?.map(action => `\n \n ${action.label === 'Refresh' ? `\n \n \n \n ` : ''}\n ${action.label}\n \n `).join('') || ''}\n ${filterBarData.bulkActions && filterBarData.bulkActions.length > 0 ? `\n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n \n Move to Draft\n \n
\n
\n \n \n \n \n Delete Selected\n \n
\n
\n
\n ` : ''}\n
\n
\n
\n
\n
\n \n \n
\n ${renderTable(tableData)}\n ${renderPagination(paginationData)}\n
\n \n
\n \n \n
\n
\n \n \n\n \n ${renderConfirmationDialog({\n id: 'bulk-action-confirm',\n title: 'Confirm Bulk Action',\n message: 'Are you sure you want to perform this action? This operation will affect multiple items.',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n iconColor: 'blue',\n onConfirm: 'executeBulkAction()'\n })}\n\n \n ${getConfirmationDialogScript()}\n\n \n
\n
\n \n
\n\n \n
\n
\n \n
\n

\n 🔍 Advanced Search\n

\n \n
\n\n \n
\n \n
\n \n
\n \n
\n
\n
\n\n \n
\n \n
\n \n \n
\n
\n\n \n
\n

Filters

\n \n
\n \n
\n \n \n \n ${data.models.map(\n (model) => `\n \n `\n ).join('')}\n \n

Hold Ctrl/Cmd to select multiple

\n
\n\n \n
\n \n \n \n \n \n \n \n \n
\n
\n
\n\n \n
\n \n Cancel\n \n \n Search\n \n
\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n // Prepare layout data\n const layoutData: AdminLayoutCatalystData = {\n title: 'Content Management',\n pageTitle: 'Content Management',\n currentPath: '/admin/content',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export function resolveSchemaFieldType(fieldConfig: Record): string {\n if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n return 'slug'\n }\n\n if (fieldConfig.type && fieldConfig.type !== 'string') {\n return fieldConfig.type\n }\n\n if (fieldConfig.format === 'richtext') {\n return 'richtext'\n }\n\n if (fieldConfig.format === 'media') {\n return 'media'\n }\n\n if (fieldConfig.format === 'date-time') {\n return 'date'\n }\n\n if (Array.isArray(fieldConfig.enum)) {\n return 'select'\n }\n\n return fieldConfig.type || 'string'\n}\n\nexport function buildSchemaFieldOptions(fieldConfig: Record): Record {\n const fieldOptions = { ...fieldConfig }\n const resolvedFieldType = resolveSchemaFieldType(fieldConfig)\n\n if (resolvedFieldType === 'select' && Array.isArray(fieldConfig.enum)) {\n fieldOptions.options = fieldConfig.enum.map((value: string, index: number) => ({\n value,\n label: fieldConfig.enumLabels?.[index] || value,\n }))\n }\n\n return fieldOptions\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { Bindings, Variables } from '../app'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { CACHE_CONFIGS, getCacheService } from '../services/cache'\nimport { PluginService } from '../services/plugin-service'\nimport { ContentVersion, renderVersionHistory, VersionHistoryData } from '../templates/components/version-history.template'\nimport { ContentFormData, renderContentFormPage } from '../templates/pages/admin-content-form.template'\nimport { ContentListPageData, renderContentListPage } from '../templates/pages/admin-content-list.template'\nimport { getBlocksFieldConfig, parseBlocksValue } from '../utils/blocks'\nimport { escapeHtml, sanitizeRichText } from '../utils/sanitize'\nimport { buildSchemaFieldOptions, resolveSchemaFieldType } from './admin-content-field-types'\n\nconst adminContentRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Field definition type for form processing\ninterface FieldDefinition {\n field_name: string\n field_label: string\n field_type: string\n field_options?: any\n is_required?: boolean\n}\n\n// Result of parsing a single field value\ninterface ParsedFieldResult {\n value: any\n errors: string[]\n}\n\n/**\n * Parse a single field value from form data with validation\n * Centralizes field parsing logic used in POST, PUT, and preview handlers\n */\nfunction parseFieldValue(\n field: FieldDefinition,\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): ParsedFieldResult {\n const { skipValidation = false } = options\n const value = formData.get(field.field_name)\n const errors: string[] = []\n\n // Handle blocks fields (array with blocks config)\n const blocksConfig = getBlocksFieldConfig(field.field_options)\n if (blocksConfig) {\n const parsed = parseBlocksValue(value, blocksConfig)\n if (!skipValidation && field.is_required && parsed.value.length === 0) {\n parsed.errors.push(`${field.field_label} is required`)\n }\n return { value: parsed.value, errors: parsed.errors }\n }\n\n // Required field validation\n if (!skipValidation && field.is_required && (!value || value.toString().trim() === '')) {\n return { value: null, errors: [`${field.field_label} is required`] }\n }\n\n // Type-specific parsing\n switch (field.field_type) {\n case 'number':\n if (value && isNaN(Number(value))) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a valid number`)\n }\n return { value: null, errors }\n }\n return { value: value ? Number(value) : null, errors: [] }\n\n case 'boolean':\n // Check for the hidden _submitted field to determine if checkbox was rendered\n const submitted = formData.get(`${field.field_name}_submitted`)\n return { value: submitted ? value === 'true' : false, errors: [] }\n\n case 'select':\n if (field.field_options?.multiple) {\n return { value: formData.getAll(`${field.field_name}[]`), errors: [] }\n }\n return { value: value, errors: [] }\n\n case 'array': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: [], errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON array`)\n }\n return { value: [], errors }\n }\n if (!skipValidation && field.is_required && parsed.length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: [], errors }\n }\n }\n\n case 'object': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: {}, errors }\n }\n try {\n const parsed = JSON.parse(value.toString())\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be a JSON object`)\n }\n return { value: {}, errors }\n }\n if (!skipValidation && field.is_required && Object.keys(parsed).length === 0) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: parsed, errors }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: {}, errors }\n }\n }\n\n case 'json': {\n if (!value || value.toString().trim() === '') {\n if (!skipValidation && field.is_required) {\n errors.push(`${field.field_label} is required`)\n }\n return { value: null, errors }\n }\n try {\n return { value: JSON.parse(value.toString()), errors: [] }\n } catch {\n if (!skipValidation) {\n errors.push(`${field.field_label} must be valid JSON`)\n }\n return { value: null, errors }\n }\n }\n\n default:\n return { value: value, errors: [] }\n }\n}\n\n/**\n * Extract all field values from form data\n */\nfunction extractFieldData(\n fields: FieldDefinition[],\n formData: FormData,\n options: { skipValidation?: boolean } = {}\n): { data: Record; errors: Record } {\n const data: Record = {}\n const errors: Record = {}\n\n for (const field of fields) {\n const result = parseFieldValue(field, formData, options)\n data[field.field_name] = result.value\n if (result.errors.length > 0) {\n errors[field.field_name] = result.errors\n }\n }\n\n return { data, errors }\n}\n\n// Apply authentication middleware\nadminContentRoutes.use('*', requireAuth())\n\n// Get collection fields\nasync function getCollectionFields(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('fields', collectionId),\n async () => {\n // First, check if collection has a schema (code-based collection)\n const collectionStmt = db.prepare('SELECT schema FROM collections WHERE id = ?')\n const collectionRow = await collectionStmt.bind(collectionId).first() as any\n\n if (collectionRow && collectionRow.schema) {\n try {\n const schema = typeof collectionRow.schema === 'string' ? JSON.parse(collectionRow.schema) : collectionRow.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n return Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n const fieldOptions = buildSchemaFieldOptions(fieldConfig)\n\n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: resolveSchemaFieldType(fieldConfig),\n field_label: fieldConfig.title || fieldName,\n field_options: fieldOptions,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table for legacy collections\n const stmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results } = await stmt.bind(collectionId).all()\n\n return (results || []).map((row: any) => ({\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: row.field_options ? JSON.parse(row.field_options) : {},\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }))\n }\n )\n}\n\n// Get collection by ID\nasync function getCollection(db: D1Database, collectionId: string) {\n const cache = getCacheService(CACHE_CONFIGS.collection!)\n\n return cache.getOrSet(\n cache.generateKey('collection', collectionId),\n async () => {\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ? AND is_active = 1')\n const collection = await stmt.bind(collectionId).first() as any\n\n if (!collection) return null\n\n return {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n schema: collection.schema ? JSON.parse(collection.schema) : {}\n }\n }\n )\n}\n\n// Content list (main page)\nadminContentRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const db = c.env.DB\n\n // Get query parameters\n const page = parseInt(url.searchParams.get('page') || '1')\n const limit = parseInt(url.searchParams.get('limit') || '20')\n const modelName = url.searchParams.get('model') || 'all'\n const status = url.searchParams.get('status') || 'all'\n const search = url.searchParams.get('search') || ''\n const offset = (page - 1) * limit\n\n // Get all collections for filter dropdown (exclude form-sourced)\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results: collectionsResults } = await collectionsStmt.all()\n const models = (collectionsResults || []).map((row: any) => ({\n name: row.name,\n displayName: row.display_name\n }))\n\n // Build where conditions\n const conditions: string[] = []\n const params: any[] = []\n\n // Hide content from form-sourced collections in the regular content list\n conditions.push(\"(col.source_type IS NULL OR col.source_type = 'user')\")\n\n // Always filter out deleted content unless specifically requested\n if (status !== 'deleted') {\n conditions.push(\"c.status != 'deleted'\")\n }\n\n if (search) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n params.push(`%${search}%`, `%${search}%`, `%${search}%`)\n }\n\n if (modelName !== 'all') {\n conditions.push('col.name = ?')\n params.push(modelName)\n }\n\n if (status !== 'all' && status !== 'deleted') {\n conditions.push('c.status = ?')\n params.push(status)\n } else if (status === 'deleted') {\n conditions.push(\"c.status = 'deleted'\")\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n JOIN collections col ON c.collection_id = col.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalItems = countResult?.count || 0\n\n // Get content items\n const contentStmt = db.prepare(`\n SELECT c.id, c.title, c.slug, c.status, c.created_at, c.updated_at,\n col.name as collection_name, col.display_name as collection_display_name,\n u.first_name, u.last_name, u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n const { results } = await contentStmt.bind(...params, limit, offset).all()\n\n // Process content items\n const contentItems = (results || []).map((row: any) => {\n const statusConfig: Record = {\n draft: {\n class: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-1 ring-inset ring-zinc-600/20 dark:ring-zinc-500/20',\n text: 'Draft'\n },\n review: {\n class: 'bg-amber-50 dark:bg-amber-500/10 text-amber-700 dark:text-amber-400 ring-1 ring-inset ring-amber-600/20 dark:ring-amber-500/20',\n text: 'Under Review'\n },\n scheduled: {\n class: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-600/20 dark:ring-blue-500/20',\n text: 'Scheduled'\n },\n published: {\n class: 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-400 ring-1 ring-inset ring-green-600/20 dark:ring-green-500/20',\n text: 'Published'\n },\n archived: {\n class: 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-400 ring-1 ring-inset ring-purple-600/20 dark:ring-purple-500/20',\n text: 'Archived'\n },\n deleted: {\n class: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-600/20 dark:ring-red-500/20',\n text: 'Deleted'\n }\n }\n\n const config = statusConfig[row.status as keyof typeof statusConfig] || statusConfig.draft\n const statusBadge = `\n \n ${config?.text || row.status}\n \n `\n\n const authorName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.author_email || 'Unknown'\n\n const formattedDate = new Date(row.updated_at).toLocaleDateString()\n\n // Determine available workflow actions based on status\n const availableActions: string[] = []\n switch (row.status) {\n case 'draft':\n availableActions.push('submit_for_review', 'publish')\n break\n case 'review':\n availableActions.push('approve', 'request_changes')\n break\n case 'published':\n availableActions.push('unpublish', 'archive')\n break\n case 'scheduled':\n availableActions.push('unschedule')\n break\n }\n\n return {\n id: row.id,\n title: row.title,\n slug: row.slug,\n modelName: row.collection_display_name,\n statusBadge,\n authorName,\n formattedDate,\n availableActions\n }\n })\n\n const pageData: ContentListPageData = {\n modelName,\n status,\n page,\n search,\n models,\n contentItems,\n totalItems,\n itemsPerPage: limit,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentListPage(pageData))\n } catch (error) {\n console.error('Error fetching content list:', error)\n return c.html(`

Error loading content: ${error}

`)\n }\n})\n\n// New content form\nadminContentRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n const url = new URL(c.req.url)\n const collectionId = url.searchParams.get('collection')\n\n if (!collectionId) {\n // Show collection selection page\n const db = c.env.DB\n // Exclude form-sourced collections — users shouldn't manually create content in form collections\n const collectionsStmt = db.prepare(\"SELECT id, name, display_name, description FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY display_name\")\n const { results } = await collectionsStmt.all()\n\n const collections = (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description\n }))\n\n // Render collection selection page\n const selectionHTML = `\n \n \n \n Select Collection - SonicJS AI Admin\n \n \n \n
\n
\n

Create New Content

\n

Select a collection to create content in:

\n \n
\n ${collections.map(collection => `\n \n

${collection.display_name}

\n

${collection.description || 'No description'}

\n
\n `).join('')}\n
\n \n \n
\n
\n \n \n `\n\n return c.html(selectionHTML)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n console.log('[Content Form /new] Editor plugins status:', {\n tinymce: tinymceEnabled,\n quill: quillEnabled,\n mdxeditor: mdxeditorEnabled,\n mdxeditorSettings\n })\n\n const formData: ContentFormData = {\n collection,\n fields,\n isEdit: false,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading new content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content form.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Edit content form\nadminContentRoutes.get('/:id/edit', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n\n // Capture referrer parameters to preserve filters when returning to list\n const referrerParams = url.searchParams.get('ref') || ''\n\n // Get content with caching\n const cache = getCacheService(CACHE_CONFIGS.content!)\n const content = await cache.getOrSet(\n cache.generateKey('content', id),\n async () => {\n const contentStmt = db.prepare(`\n SELECT c.*, col.id as collection_id, col.name as collection_name,\n col.display_name as collection_display_name, col.description as collection_description,\n col.schema as collection_schema\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n return await contentStmt.bind(id).first() as any\n }\n )\n\n if (!content) {\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Content not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n\n const collection = {\n id: content.collection_id,\n name: content.collection_name,\n display_name: content.collection_display_name,\n description: content.collection_description,\n schema: content.collection_schema ? JSON.parse(content.collection_schema) : {}\n }\n\n const fields = await getCollectionFields(db, content.collection_id)\n const contentData = content.data ? JSON.parse(content.data) : {}\n\n // Check if workflow plugin is active\n const workflowEnabled = await isPluginActive(db, 'workflow')\n\n // Check if TinyMCE plugin is active and get settings\n const tinymceEnabled = await isPluginActive(db, 'tinymce-plugin')\n let tinymceSettings\n if (tinymceEnabled) {\n const pluginService = new PluginService(db)\n const tinymcePlugin = await pluginService.getPlugin('tinymce-plugin')\n tinymceSettings = tinymcePlugin?.settings\n }\n\n // Check if Quill plugin is active and get settings\n const quillEnabled = await isPluginActive(db, 'quill-editor')\n let quillSettings\n if (quillEnabled) {\n const pluginService = new PluginService(db)\n const quillPlugin = await pluginService.getPlugin('quill-editor')\n quillSettings = quillPlugin?.settings\n }\n\n // Check if MDXEditor plugin is active and get settings\n const mdxeditorEnabled = await isPluginActive(db, 'easy-mdx')\n let mdxeditorSettings\n if (mdxeditorEnabled) {\n const pluginService = new PluginService(db)\n const mdxeditorPlugin = await pluginService.getPlugin('easy-mdx')\n mdxeditorSettings = mdxeditorPlugin?.settings\n }\n\n const formData: ContentFormData = {\n id: content.id,\n title: content.title,\n slug: content.slug,\n created_at: content.created_at,\n updated_at: content.updated_at,\n published_at: content.published_at,\n data: contentData,\n status: content.status,\n scheduled_publish_at: content.scheduled_publish_at,\n scheduled_unpublish_at: content.scheduled_unpublish_at,\n review_status: content.review_status,\n meta_title: content.meta_title,\n meta_description: content.meta_description,\n collection,\n fields,\n isEdit: true,\n workflowEnabled,\n tinymceEnabled,\n tinymceSettings,\n quillEnabled,\n quillSettings,\n mdxeditorEnabled,\n mdxeditorSettings,\n referrerParams,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderContentFormPage(formData))\n } catch (error) {\n console.error('Error loading edit content form:', error)\n const formData: ContentFormData = {\n collection: { id: '', name: '', display_name: 'Unknown', schema: {} },\n fields: [],\n error: 'Failed to load content for editing.',\n user: c.get('user') ? {\n name: c.get('user')!.email,\n email: c.get('user')!.email,\n role: c.get('user')!.role\n } : undefined\n }\n return c.html(renderContentFormPage(formData))\n }\n})\n\n// Create content\nadminContentRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n const action = formData.get('action') as string\n\n if (!collectionId) {\n return c.html(html`\n
\n Collection ID is required.\n
\n `)\n }\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n // Check for validation errors\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Generate slug if not provided\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || 'draft'\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Create content\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n contentId,\n collectionId,\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n // Invalidate collection content list cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.invalidate(`content:list:${collectionId}:*`)\n\n // Create initial version\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n contentId,\n 1,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n contentId,\n 'created',\n 'none',\n status,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${contentId}/edit?success=Content saved successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content created successfully!`\n : `/admin/content?collection=${collectionId}&success=Content created successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error creating content:', error)\n return c.html(html`\n
\n Failed to create content. Please try again.\n
\n `)\n }\n})\n\n// Update content\nadminContentRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const formData = await c.req.formData()\n const action = formData.get('action') as string\n\n const db = c.env.DB\n\n // Get existing content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const existingContent = await contentStmt.bind(id).first() as any\n\n if (!existingContent) {\n return c.html(html`\n
\n Content not found.\n
\n `)\n }\n\n const collection = await getCollection(db, existingContent.collection_id)\n if (!collection) {\n return c.html(html`\n
\n Collection not found.\n
\n `)\n }\n\n const fields = await getCollectionFields(db, existingContent.collection_id)\n\n // Extract and validate field data\n const { data, errors } = extractFieldData(fields, formData)\n\n if (Object.keys(errors).length > 0) {\n const formDataWithErrors: ContentFormData = {\n id,\n collection,\n fields,\n data,\n validationErrors: errors,\n error: 'Please fix the validation errors below.',\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n return c.html(renderContentFormPage(formDataWithErrors))\n }\n\n // Update slug if title changed\n let slug = data.slug || data.title\n if (slug) {\n slug = slug.toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim('-')\n }\n\n // Determine status\n let status = formData.get('status') as string || existingContent.status\n if (action === 'save_and_publish') {\n status = 'published'\n }\n\n // Handle scheduling\n const scheduledPublishAt = formData.get('scheduled_publish_at') as string\n const scheduledUnpublishAt = formData.get('scheduled_unpublish_at') as string\n\n // Update content\n const now = Date.now()\n\n const updateStmt = db.prepare(`\n UPDATE content SET\n slug = ?, title = ?, data = ?, status = ?,\n scheduled_publish_at = ?, scheduled_unpublish_at = ?,\n meta_title = ?, meta_description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n slug,\n data.title || 'Untitled',\n JSON.stringify(data),\n status,\n scheduledPublishAt ? new Date(scheduledPublishAt).getTime() : null,\n scheduledUnpublishAt ? new Date(scheduledUnpublishAt).getTime() : null,\n data.meta_title || null,\n data.meta_description || null,\n now,\n id\n ).run()\n\n // Invalidate content cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate(`content:list:${existingContent.collection_id}:*`)\n\n // Create new version if content changed\n const existingData = JSON.parse(existingContent.data || '{}')\n if (JSON.stringify(existingData) !== JSON.stringify(data)) {\n // Get next version number\n const versionCountStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const versionResult = await versionCountStmt.bind(id).first() as any\n const nextVersion = (versionResult?.max_version || 0) + 1\n\n const versionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await versionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n JSON.stringify(data),\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Log workflow action if status changed\n if (status !== existingContent.status) {\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'status_changed',\n existingContent.status,\n status,\n user?.userId || 'unknown',\n now\n ).run()\n }\n\n // Handle different actions\n const referrerParams = formData.get('referrer_params') as string\n const redirectUrl = action === 'save_and_continue'\n ? `/admin/content/${id}/edit?success=Content updated successfully!${referrerParams ? `&ref=${encodeURIComponent(referrerParams)}` : ''}`\n : referrerParams\n ? `/admin/content?${referrerParams}&success=Content updated successfully!`\n : `/admin/content?collection=${existingContent.collection_id}&success=Content updated successfully!`\n\n // Check if this is an HTMX request\n const isHTMX = c.req.header('HX-Request') === 'true'\n\n if (isHTMX) {\n // For HTMX requests, use HX-Redirect header to trigger client-side redirect\n return c.text('', 200, {\n 'HX-Redirect': redirectUrl\n })\n } else {\n // For regular requests, use server-side redirect\n return c.redirect(redirectUrl)\n }\n\n } catch (error) {\n console.error('Error updating content:', error)\n return c.html(html`\n
\n Failed to update content. Please try again.\n
\n `)\n }\n})\n\n// Content preview\nadminContentRoutes.post('/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const formData = await c.req.formData()\n const collectionId = formData.get('collection_id') as string\n\n const db = c.env.DB\n const collection = await getCollection(db, collectionId)\n\n if (!collection) {\n return c.html('

Collection not found

')\n }\n\n const fields = await getCollectionFields(db, collectionId)\n\n // Extract field data for preview (skip validation)\n const { data } = extractFieldData(fields, formData, { skipValidation: true })\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeStatus = escapeHtml(String(formData.get('status') || 'draft'))\n const safeMetaDesc = data.meta_description ? escapeHtml(data.meta_description) : ''\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Preview: ${safeTitle}\n \n \n \n

${safeTitle}

\n
\n Collection: ${escapeHtml(collection.display_name)}
\n Status: ${safeStatus}
\n ${safeMetaDesc ? `Description: ${safeMetaDesc}
` : ''}\n
\n
\n ${safeContent}\n
\n\n

All Fields:

\n \n \n ${fields.map(field => `\n \n \n \n \n `).join('')}\n
FieldValue
${escapeHtml(field.field_label)}${data[field.field_name] ? escapeHtml(String(data[field.field_name])) : 'empty'}
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating preview:', error)\n return c.html('

Error generating preview

')\n }\n})\n\n// Duplicate content\nadminContentRoutes.post('/duplicate', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const originalId = formData.get('id') as string\n\n if (!originalId) {\n return c.json({ success: false, error: 'Content ID required' })\n }\n\n const db = c.env.DB\n\n // Get original content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const original = await contentStmt.bind(originalId).first() as any\n\n if (!original) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n // Create duplicate\n const newId = crypto.randomUUID()\n const now = Date.now()\n const originalData = JSON.parse(original.data || '{}')\n\n // Modify title to indicate it's a copy\n originalData.title = `${originalData.title || 'Untitled'} (Copy)`\n\n const insertStmt = db.prepare(`\n INSERT INTO content (\n id, collection_id, slug, title, data, status,\n author_id, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n newId,\n original.collection_id,\n `${original.slug}-copy-${Date.now()}`,\n originalData.title,\n JSON.stringify(originalData),\n 'draft', // Always start as draft\n user?.userId || 'unknown',\n now,\n now\n ).run()\n\n return c.json({ success: true, id: newId })\n } catch (error) {\n console.error('Error duplicating content:', error)\n return c.json({ success: false, error: 'Failed to duplicate content' })\n }\n})\n\n// Get bulk actions modal\nadminContentRoutes.get('/bulk-actions', async (c) => {\n const bulkActionsModal = `\n
\n
\n
\n

Bulk Actions

\n \n
\n

\n Select items from the table below to perform bulk actions.\n

\n
\n \n \n \n \n Publish Selected\n \n \n \n \n \n Move to Draft\n \n \n \n \n \n Delete Selected\n \n
\n
\n
\n \n `\n\n return c.html(bulkActionsModal)\n})\n\n// Perform bulk action\nadminContentRoutes.post('/bulk-action', async (c) => {\n try {\n const user = c.get('user')\n const body = await c.req.json()\n const { action, ids } = body\n\n if (!action || !ids || ids.length === 0) {\n return c.json({ success: false, error: 'Action and IDs required' })\n }\n\n const db = c.env.DB\n const now = Date.now()\n\n if (action === 'delete') {\n // Soft delete by setting status to 'deleted'\n const placeholders = ids.map(() => '?').join(',')\n const stmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(now, ...ids).run()\n } else if (action === 'publish' || action === 'draft') {\n // Update status\n const placeholders = ids.map(() => '?').join(',')\n const publishedAt = action === 'publish' ? now : null\n const stmt = db.prepare(`\n UPDATE content\n SET status = ?, published_at = ?, updated_at = ?\n WHERE id IN (${placeholders})\n `)\n await stmt.bind(action, publishedAt, now, ...ids).run()\n } else {\n return c.json({ success: false, error: 'Invalid action' })\n }\n\n // Invalidate cache for all affected content items\n const cache = getCacheService(CACHE_CONFIGS.content!)\n for (const contentId of ids) {\n await cache.delete(cache.generateKey('content', contentId))\n }\n // Also invalidate list caches (they contain content from potentially multiple collections)\n await cache.invalidate('content:list:*')\n\n return c.json({ success: true, count: ids.length })\n } catch (error) {\n console.error('Bulk action error:', error)\n return c.json({ success: false, error: 'Failed to perform bulk action' })\n }\n})\n\n// Delete content\nadminContentRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n const user = c.get('user')\n\n // Check if content exists\n const contentStmt = db.prepare('SELECT id, title FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.json({ success: false, error: 'Content not found' }, 404)\n }\n\n // Soft delete by setting status to 'deleted'\n const now = Date.now()\n const deleteStmt = db.prepare(`\n UPDATE content\n SET status = 'deleted', updated_at = ?\n WHERE id = ?\n `)\n await deleteStmt.bind(now, id).run()\n\n // Invalidate cache\n const cache = getCacheService(CACHE_CONFIGS.content!)\n await cache.delete(cache.generateKey('content', id))\n await cache.invalidate('content:list:*')\n\n // Return success - let HTMX reload the page\n return c.html(`\n
\n
\n
\n \n \n \n

Content deleted successfully. Refreshing...

\n
\n
\n
\n `)\n } catch (error) {\n console.error('Delete content error:', error)\n return c.json({ success: false, error: 'Failed to delete content' }, 500)\n }\n})\n\n// Get version history\nadminContentRoutes.get('/:id/versions', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const content = await contentStmt.bind(id).first() as any\n\n if (!content) {\n return c.html('

Content not found

')\n }\n\n // Get all versions with author info\n const versionsStmt = db.prepare(`\n SELECT cv.*, u.first_name, u.last_name, u.email\n FROM content_versions cv\n LEFT JOIN users u ON cv.author_id = u.id\n WHERE cv.content_id = ?\n ORDER BY cv.version DESC\n `)\n const { results } = await versionsStmt.bind(id).all()\n\n const versions: ContentVersion[] = (results || []).map((row: any) => ({\n id: row.id,\n version: row.version,\n data: JSON.parse(row.data || '{}'),\n author_id: row.author_id,\n author_name: row.first_name && row.last_name ? `${row.first_name} ${row.last_name}` : row.email,\n created_at: row.created_at,\n is_current: false // Will be set below\n }))\n\n // Mark the latest version as current\n if (versions.length > 0) {\n versions[0]!.is_current = true\n }\n\n const data: VersionHistoryData = {\n contentId: id,\n versions,\n currentVersion: versions.length > 0 ? versions[0]!.version : 1\n }\n\n return c.html(renderVersionHistory(data))\n } catch (error) {\n console.error('Error loading version history:', error)\n return c.html('

Error loading version history

')\n }\n})\n\n// Restore version\nadminContentRoutes.post('/:id/restore/:version', async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const user = c.get('user')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT * FROM content_versions \n WHERE content_id = ? AND version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.json({ success: false, error: 'Version not found' })\n }\n\n // Get current content\n const contentStmt = db.prepare('SELECT * FROM content WHERE id = ?')\n const currentContent = await contentStmt.bind(id).first() as any\n\n if (!currentContent) {\n return c.json({ success: false, error: 'Content not found' })\n }\n\n const restoredData = JSON.parse(versionData.data)\n const now = Date.now()\n\n // Update content with restored data\n const updateStmt = db.prepare(`\n UPDATE content SET\n title = ?, data = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n restoredData.title || 'Untitled',\n versionData.data,\n now,\n id\n ).run()\n\n // Create new version for the restoration\n const nextVersionStmt = db.prepare('SELECT MAX(version) as max_version FROM content_versions WHERE content_id = ?')\n const nextVersionResult = await nextVersionStmt.bind(id).first() as any\n const nextVersion = (nextVersionResult?.max_version || 0) + 1\n\n const newVersionStmt = db.prepare(`\n INSERT INTO content_versions (id, content_id, version, data, author_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n\n await newVersionStmt.bind(\n crypto.randomUUID(),\n id,\n nextVersion,\n versionData.data,\n user?.userId || 'unknown',\n now\n ).run()\n\n // Log workflow action\n const workflowStmt = db.prepare(`\n INSERT INTO workflow_history (id, content_id, action, from_status, to_status, user_id, comment, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await workflowStmt.bind(\n crypto.randomUUID(),\n id,\n 'version_restored',\n currentContent.status,\n currentContent.status,\n user?.userId || 'unknown',\n `Restored to version ${version}`,\n now\n ).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error restoring version:', error)\n return c.json({ success: false, error: 'Failed to restore version' })\n }\n})\n\n// Preview specific version\nadminContentRoutes.get('/:id/version/:version/preview', requireRole(['admin', 'editor', 'author']), async (c) => {\n try {\n const id = c.req.param('id')\n const version = parseInt(c.req.param('version') || '0')\n const db = c.env.DB\n\n // Get the specific version\n const versionStmt = db.prepare(`\n SELECT cv.*, c.collection_id, col.display_name as collection_name\n FROM content_versions cv\n JOIN content c ON cv.content_id = c.id\n JOIN collections col ON c.collection_id = col.id\n WHERE cv.content_id = ? AND cv.version = ?\n `)\n const versionData = await versionStmt.bind(id, version).first() as any\n\n if (!versionData) {\n return c.html('

Version not found

')\n }\n\n const data = JSON.parse(versionData.data || '{}')\n\n // Sanitize user-controlled values before rendering\n const safeTitle = escapeHtml(data.title || 'Untitled')\n const safeContent = data.content ? sanitizeRichText(data.content) : '

No content provided.

'\n const safeExcerpt = data.excerpt ? escapeHtml(data.excerpt) : ''\n const safeCollectionName = escapeHtml(versionData.collection_name || '')\n\n // Generate preview HTML\n const previewHTML = `\n \n \n \n \n \n Version ${version} Preview: ${safeTitle}\n \n \n \n
\n Version ${version}\n Collection: ${safeCollectionName}
\n Created: ${new Date(versionData.created_at).toLocaleString()}
\n This is a historical version preview\n
\n\n

${safeTitle}

\n\n
\n ${safeContent}\n
\n\n ${safeExcerpt ? `

Excerpt:

${safeExcerpt}

` : ''}\n\n

All Field Data:

\n
\n${escapeHtml(JSON.stringify(data, null, 2))}\n        
\n \n \n `\n\n return c.html(previewHTML)\n } catch (error) {\n console.error('Error generating version preview:', error)\n return c.html('

Error generating preview

')\n }\n})\nexport default adminContentRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserProfile {\n id: string\n email: string\n username: string\n first_name: string\n last_name: string\n phone?: string\n bio?: string\n avatar_url?: string\n timezone: string\n language: string\n theme: string\n email_notifications: boolean\n two_factor_enabled: boolean\n role: string\n created_at: number\n last_login_at?: number\n}\n\nexport interface ProfilePageData {\n profile: UserProfile\n timezones: Array<{ value: string; label: string }>\n languages: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderAvatarImage(avatarUrl: string | undefined, firstName: string, lastName: string): string {\n return `
\n ${avatarUrl\n ? `\"Profile`\n : `${firstName.charAt(0)}${lastName.charAt(0)}`\n }\n
`\n}\n\nexport function renderProfilePage(data: ProfilePageData): string {\n const pageContent = `\n
\n \n
\n
\n

User Profile

\n

\n Manage your account settings and preferences\n

\n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n \n
\n
\n \n
\n
\n
\n \n \n \n
\n
\n

Profile Information

\n

Update your account details

\n
\n
\n
\n\n \n
\n
\n\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n ${data.profile.bio || ''}\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Preferences

\n\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Notifications

\n\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n \n

Receive email updates about new features and product announcements.

\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Update Profile\n \n
\n
\n
\n
\n\n \n
\n \n
\n

Profile Picture

\n\n
\n ${renderAvatarImage(data.profile.avatar_url, data.profile.first_name, data.profile.last_name)}\n\n
\n \n \n \n \n \n \n Change Picture\n \n \n\n
\n
\n
\n\n \n
\n

Account Information

\n\n
\n
\n
Role
\n
\n \n ${data.profile.role}\n \n
\n
\n
\n
Member Since
\n
${new Date(data.profile.created_at).toLocaleDateString()}
\n
\n ${data.profile.last_login_at ? `\n
\n
Last Login
\n
${new Date(data.profile.last_login_at).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Two-Factor Auth
\n
\n ${data.profile.two_factor_enabled\n ? 'Enabled'\n : 'Disabled'\n }\n
\n
\n
\n
\n\n \n
\n

Security

\n\n
\n \n \n \n \n Change Password\n \n\n \n \n \n \n ${data.profile.two_factor_enabled ? 'Disable' : 'Enable'} 2FA\n \n
\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Change Password

\n \n
\n
\n\n
\n
\n\n
\n \n \n
\n\n
\n \n \n

Must be at least 8 characters

\n
\n\n
\n \n \n
\n\n
\n \n Cancel\n \n \n \n \n \n Update Password\n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'User Profile',\n pageTitle: 'Profile',\n currentPath: '/admin/profile',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { escapeHtml } from '../../utils/sanitize'\n\nexport type AlertType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface AlertData {\n type: AlertType\n title?: string\n message: string\n dismissible?: boolean\n className?: string\n icon?: boolean\n}\n\nexport function renderAlert(data: AlertData): string {\n const typeClasses = {\n success: 'bg-green-50 dark:bg-green-500/10 border border-green-600/20 dark:border-green-500/20',\n error: 'bg-error/10 border border-red-600/20 dark:border-red-500/20',\n warning: 'bg-amber-50 dark:bg-amber-500/10 border border-amber-600/20 dark:border-amber-500/20',\n info: 'bg-blue-50 dark:bg-blue-500/10 border border-blue-600/20 dark:border-blue-500/20'\n }\n\n const iconClasses = {\n success: 'text-green-600 dark:text-green-400',\n error: 'text-red-600 dark:text-red-400',\n warning: 'text-amber-600 dark:text-amber-400',\n info: 'text-blue-600 dark:text-blue-400'\n }\n\n const textClasses = {\n success: 'text-green-900 dark:text-green-300',\n error: 'text-red-900 dark:text-red-300',\n warning: 'text-amber-900 dark:text-amber-300',\n info: 'text-blue-900 dark:text-blue-300'\n }\n\n const messageTextClasses = {\n success: 'text-green-700 dark:text-green-400',\n error: 'text-red-700 dark:text-red-400',\n warning: 'text-amber-700 dark:text-amber-400',\n info: 'text-blue-700 dark:text-blue-400'\n }\n\n const icons = {\n success: ``,\n error: ``,\n warning: ``,\n info: ``\n }\n\n return `\n
\n
\n ${data.icon !== false ? `\n
\n \n ${icons[data.type]}\n \n
\n ` : ''}\n
\n ${data.title ? `\n

\n ${escapeHtml(data.title)}\n

\n ` : ''}\n
\n

${escapeHtml(data.message)}

\n
\n
\n ${data.dismissible ? `\n
\n
\n \n Dismiss\n \n \n \n \n
\n
\n ` : ''}\n
\n
\n `\n}\n\nexport function renderSuccessAlert(message: string, title?: string): string {\n return renderAlert({ type: 'success', message, title })\n}\n\nexport function renderErrorAlert(message: string, title?: string): string {\n return renderAlert({ type: 'error', message, title })\n}\n\nexport function renderWarningAlert(message: string, title?: string): string {\n return renderAlert({ type: 'warning', message, title })\n}\n\nexport function renderInfoAlert(message: string, title?: string): string {\n return renderAlert({ type: 'info', message, title })\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\n\nexport interface ActivityLog {\n id: string\n user_id: string\n action: string\n resource_type?: string\n resource_id?: string\n details?: any\n ip_address?: string\n user_agent?: string\n created_at: number\n user_email?: string\n user_name?: string\n}\n\nexport interface ActivityLogsPageData {\n logs: ActivityLog[]\n pagination: {\n page: number\n limit: number\n total: number\n pages: number\n }\n filters: {\n user_id?: string\n action?: string\n resource_type?: string\n date_from?: string\n date_to?: string\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderActivityLogsPage(data: ActivityLogsPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Activity Logs

\n

Monitor user actions and system activity

\n
\n
\n\n \n \n\n \n
\n

Filters

\n \n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n Clear Filters\n \n
\n
\n
\n\n \n
\n
\n
\n
\n

Recent Activity

\n
\n Showing ${data.logs.length} of ${data.pagination.total} logs\n
\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${data.logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimestampUserActionResourceIP AddressDetails
\n ${new Date(log.created_at).toLocaleString()}\n \n
${log.user_name || 'Unknown'}
\n
${log.user_email || 'N/A'}
\n
\n \n ${formatAction(log.action)}\n \n \n ${log.resource_type ? `\n
${log.resource_type}
\n ${log.resource_id ? `
${log.resource_id}
` : ''}\n ` : 'N/A'}\n
\n ${log.ip_address || 'N/A'}\n \n ${log.details ? `\n
\n View Details\n
${JSON.stringify(log.details, null, 2)}
\n
\n ` : 'N/A'}\n
\n
\n\n ${data.logs.length === 0 ? `\n
\n \n \n \n

No activity logs found

\n

Try adjusting your filters or check back later.

\n
\n ` : ''}\n\n \n ${data.pagination.pages > 1 ? `\n
\n
\n Page ${data.pagination.page} of ${data.pagination.pages} (${data.pagination.total} total logs)\n
\n \n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutData = {\n title: 'Activity Logs',\n pageTitle: 'Activity Logs',\n currentPath: '/admin/activity-logs',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction getActionBadgeClass(action: string): string {\n if (action.includes('login') || action.includes('logout')) {\n return 'bg-blue-500/20 text-blue-300'\n } else if (action.includes('create') || action.includes('invite')) {\n return 'bg-green-500/20 text-green-300'\n } else if (action.includes('update') || action.includes('change')) {\n return 'bg-yellow-500/20 text-yellow-300'\n } else if (action.includes('delete') || action.includes('cancel')) {\n return 'bg-red-500/20 text-red-300'\n } else {\n return 'bg-gray-500/20 text-gray-300'\n }\n}\n\nfunction formatAction(action: string): string {\n // Convert action from dot notation to readable format\n return action\n .split('.')\n .map(part => part.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()))\n .join(' - ')\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface UserProfileData {\n displayName?: string\n bio?: string\n company?: string\n jobTitle?: string\n website?: string\n location?: string\n dateOfBirth?: number\n}\n\nexport interface UserEditData {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n phone?: string\n avatarUrl?: string\n role: string\n isActive: boolean\n emailVerified: boolean\n twoFactorEnabled: boolean\n createdAt: number\n lastLoginAt?: number\n profile?: UserProfileData\n}\n\nexport interface UserEditPageData {\n userToEdit: UserEditData\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n customProfileFieldsHtml?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserEditPage(data: UserEditPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Edit User

\n
\n

Update user account and permissions

\n
\n
\n \n \n \n \n Save Changes\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n
\n\n \n
\n

Profile Information

\n

Extended profile data for this user

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n
\n\n
\n \n ${escapeHtml(data.userToEdit.profile?.bio || '')}\n
\n
\n\n ${data.customProfileFieldsHtml || ''}\n\n \n
\n

Set Password

\n

Leave blank to keep the current password

\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User has verified their email address

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

User Details

\n
\n
\n
User ID
\n
${data.userToEdit.id}
\n
\n
\n
Created
\n
${new Date(data.userToEdit.createdAt).toLocaleDateString()}
\n
\n ${data.userToEdit.lastLoginAt ? `\n
\n
Last Login
\n
${new Date(data.userToEdit.lastLoginAt).toLocaleDateString()}
\n
\n ` : ''}\n
\n
Status
\n
\n ${data.userToEdit.isActive\n ? 'Active'\n : 'Inactive'\n }\n
\n
\n ${data.userToEdit.twoFactorEnabled ? `\n
\n
Security
\n
\n 2FA Enabled\n
\n
\n ` : ''}\n
\n
\n\n \n
\n

Danger Zone

\n

Irreversible and destructive actions

\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Permanently remove from database. Unchecked performs soft delete (deactivate only).

\n
\n
\n\n \n \n \n \n Delete User\n \n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-user-confirm',\n title: 'Delete User',\n message: 'Are you sure you want to delete this user? Check the \"Hard Delete\" option to permanently remove all data from the database. This action cannot be undone!',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteUser()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Edit User',\n pageTitle: `Edit User - ${data.userToEdit.firstName} ${data.userToEdit.lastName}`,\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","export interface ConfirmationDialogOptions {\n id: string\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmClass?: string\n iconColor?: 'red' | 'yellow' | 'blue'\n onConfirm?: string // JavaScript code to execute on confirm\n}\n\nexport function renderConfirmationDialog(options: ConfirmationDialogOptions): string {\n const {\n id,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmClass = 'bg-red-500 hover:bg-red-400',\n iconColor = 'red',\n onConfirm = ''\n } = options\n\n const iconColorClasses = {\n red: 'bg-red-500/10 text-red-400',\n yellow: 'bg-yellow-500/10 text-yellow-400',\n blue: 'bg-blue-500/10 text-blue-400'\n }\n\n return `\n \n \n \n\n
\n \n
\n
\n \n \n \n
\n
\n

${title}

\n
\n

${message}

\n
\n
\n
\n
\n \n ${confirmText}\n \n \n ${cancelText}\n \n
\n
\n
\n \n
\n `\n}\n\n/**\n * Helper function to show a confirmation dialog programmatically\n * Usage in templates: Add this script and call showConfirmDialog()\n */\nexport function getConfirmationDialogScript(): string {\n return `\n \n \n `\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderAlert } from '../alert.template'\n\nexport interface UserNewPageData {\n roles: Array<{ value: string; label: string }>\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderUserNewPage(data: UserNewPageData): string {\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n \n

Create New User

\n
\n

Add a new user account to the system

\n
\n
\n \n \n \n \n Create User\n \n \n Cancel\n \n
\n
\n\n \n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n
\n\n \n
\n \n
\n
\n
\n\n \n
\n

Basic Information

\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n
\n \n ${data.roles.map(role => `\n \n `).join('')}\n \n \n \n \n
\n
\n
\n\n
\n \n \n
\n
\n\n \n
\n

Password

\n
\n
\n \n \n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

Account Status

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

User can sign in and access the system

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n

Mark email as verified

\n
\n
\n
\n
\n\n
\n
\n
\n\n \n
\n \n
\n

Creating a User

\n
\n

Fill in the required fields marked with * to create a new user account.

\n

The password must be at least 8 characters long.

\n

By default, new users are created as active and can sign in immediately.

\n

You can edit user details and permissions after creation.

\n
\n
\n\n \n
\n

Role Descriptions

\n
\n
\n
Administrator
\n
Full system access and permissions
\n
\n
\n
Editor
\n
Can create and edit content
\n
\n
\n
Author
\n
Can create own content
\n
\n
\n
Viewer
\n
Read-only access
\n
\n
\n
\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create User',\n pageTitle: 'Create New User',\n currentPath: '/admin/users',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderPagination, PaginationData } from '../pagination.template'\nimport { renderAlert } from '../alert.template'\nimport { renderTable, TableColumn, TableData } from '../table.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface User {\n id: string\n email: string\n username: string\n firstName: string\n lastName: string\n role: string\n avatar?: string\n isActive: boolean\n lastLoginAt?: number\n createdAt: number\n updatedAt: number\n formattedLastLogin?: string\n formattedCreatedAt?: string\n}\n\nexport interface UsersListPageData {\n users: User[]\n pagination?: PaginationData\n currentPage: number\n totalPages: number\n totalUsers: number\n statusFilter?: string\n roleFilter?: string\n searchFilter?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderUsersListPage(data: UsersListPageData): string {\n const columns: TableColumn[] = [\n {\n key: 'avatar',\n label: '',\n className: 'w-12',\n sortable: false,\n render: (value: string | null, row: User) => {\n const initials = `${row.firstName.charAt(0)}${row.lastName.charAt(0)}`.toUpperCase()\n if (value) {\n return `\"${row.firstName}`\n }\n return `\n
\n ${initials}\n
\n `\n }\n },\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, row: User) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n \n const truncatedFirstName = row.firstName.length > 25 ? row.firstName.substring(0, 25) + '...' : row.firstName\n const truncatedLastName = row.lastName.length > 25 ? row.lastName.substring(0, 25) + '...' : row.lastName\n const fullName = escapeHtml(`${truncatedFirstName} ${truncatedLastName}`)\n const truncatedUsername = row.username.length > 100 ? row.username.substring(0, 100) + '...' : row.username\n const username = escapeHtml(truncatedUsername)\n const statusBadge = row.isActive ?\n 'Active' :\n 'Inactive'\n return `\n
\n
${fullName}${statusBadge}
\n
@${username}
\n
\n `\n }\n },\n {\n key: 'email',\n label: 'Email',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const escapeHtml = (text: string) => text.replace(/[&<>\"']/g, (char) => ({\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }[char] || char))\n const escapedEmail = escapeHtml(value)\n return `${escapedEmail}`\n }\n },\n {\n key: 'role',\n label: 'Role',\n sortable: true,\n sortType: 'string',\n render: (value: string) => {\n const roleColors = {\n admin: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-1 ring-inset ring-red-700/10 dark:ring-red-500/20',\n editor: 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400 ring-1 ring-inset ring-blue-700/10 dark:ring-blue-500/20',\n author: 'bg-cyan-50 dark:bg-cyan-500/10 text-cyan-700 dark:text-cyan-400 ring-1 ring-inset ring-cyan-700/10 dark:ring-cyan-500/20',\n viewer: 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n }\n const colorClass = roleColors[value as keyof typeof roleColors] || 'bg-zinc-50 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400 ring-1 ring-inset ring-zinc-500/10 dark:ring-zinc-400/20'\n return `${value.charAt(0).toUpperCase() + value.slice(1)}`\n }\n },\n {\n key: 'lastLoginAt',\n label: 'Last Login',\n sortable: true,\n sortType: 'date',\n render: (value: number | null) => {\n if (!value) return 'Never'\n return `${new Date(value).toLocaleDateString()}`\n }\n },\n {\n key: 'createdAt',\n label: 'Created',\n sortable: true,\n sortType: 'date',\n render: (value: number) => `${new Date(value).toLocaleDateString()}`\n },\n {\n key: 'actions',\n label: 'Actions',\n className: 'text-right',\n sortable: false,\n render: (_value: any, row: User) => `\n
\n ${row.isActive ?\n `` :\n ``\n }\n
\n `\n }\n ]\n\n const tableData: TableData = {\n tableId: 'users-table',\n columns,\n rows: data.users,\n selectable: false,\n rowClickable: true,\n rowClickUrl: (row: User) => `/admin/users/${row.id}/edit`,\n emptyMessage: 'No users found'\n }\n\n const pageContent = `\n
\n \n
\n
\n

User Management

\n

Manage user accounts and permissions

\n
\n
\n \n \n \n \n Add User\n \n \n
\n
\n\n \n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n
\n

User Statistics

\n
\n
\n
Total Users
\n
\n
\n ${data.totalUsers}\n
\n
\n \n \n \n Increased by\n 5.2%\n
\n
\n
\n
\n
Active Users
\n
\n
\n ${data.users.filter(u => u.isActive).length}\n
\n
\n \n \n \n Increased by\n 3.1%\n
\n
\n
\n
\n
Administrators
\n
\n
\n ${data.users.filter(u => u.role === 'admin').length}\n
\n
\n \n \n \n Increased by\n 1.8%\n
\n
\n
\n
\n
Active This Week
\n
\n
\n ${data.users.filter(u => u.lastLoginAt && u.lastLoginAt > Date.now() - 7 * 24 * 60 * 60 * 1000).length}\n
\n
\n \n \n \n Decreased by\n 2.3%\n
\n
\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n
\n
\n \n
\n \n
\n {\n input.focus();\n input.setSelectionRange(len, len);\n }, 10);\n }\n \"\n >\n \n
\n \n \n \n
\n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n \n Clear Filters\n \n
\n
\n
\n
\n
\n
\n\n \n ${renderTable(tableData)}\n\n \n ${data.pagination ? renderPagination(data.pagination) : ''}\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'toggle-user-status-confirm',\n title: 'Toggle User Status',\n message: 'Are you sure you want to activate/deactivate this user?',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performToggleUserStatus()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Users',\n pageTitle: 'User Management',\n currentPath: '/admin/users',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n} ","import { Hono } from 'hono'\nimport { requireAuth, requireRole, logActivity, AuthManager } from '../middleware'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { renderProfilePage, renderAvatarImage, type UserProfile, type ProfilePageData } from '../templates/pages/admin-profile.template'\nimport { renderAlert } from '../templates/components/alert.template'\nimport { renderActivityLogsPage, type ActivityLogsPageData, type ActivityLog } from '../templates/pages/admin-activity-logs.template'\nimport { renderUserEditPage, type UserEditPageData, type UserEditData, type UserProfileData } from '../templates/pages/admin-user-edit.template'\nimport { renderUserNewPage, type UserNewPageData } from '../templates/pages/admin-user-new.template'\nimport { renderUsersListPage, type UsersListPageData, type User } from '../templates/pages/admin-users-list.template'\nimport type { Bindings, Variables } from '../app'\nimport { getUserProfileConfig, renderCustomProfileSection, getCustomData, saveCustomData, extractCustomFieldsFromForm, sanitizeCustomData, validateCustomData } from '../plugins/core-plugins/user-profiles'\n\nconst userRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware to all routes\nuserRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on user management routes\nuserRoutes.use('/users/*', requireRole(['admin']))\nuserRoutes.use('/users', requireRole(['admin']))\nuserRoutes.use('/invite-user', requireRole(['admin']))\nuserRoutes.use('/resend-invitation/*', requireRole(['admin']))\nuserRoutes.use('/cancel-invitation/*', requireRole(['admin']))\nuserRoutes.use('/activity-logs', requireRole(['admin']))\nuserRoutes.use('/activity-logs/*', requireRole(['admin']))\n\n// Redirect /admin to /admin/dashboard\nuserRoutes.get('/', (c) => {\n return c.redirect('/admin/dashboard')\n})\n\n// Timezone options for profile form\nconst TIMEZONES = [\n { value: 'UTC', label: 'UTC' },\n { value: 'America/New_York', label: 'Eastern Time' },\n { value: 'America/Chicago', label: 'Central Time' },\n { value: 'America/Denver', label: 'Mountain Time' },\n { value: 'America/Los_Angeles', label: 'Pacific Time' },\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Australia/Sydney', label: 'Sydney' }\n]\n\n// Language options for profile form\nconst LANGUAGES = [\n { value: 'en', label: 'English' },\n { value: 'es', label: 'Spanish' },\n { value: 'fr', label: 'French' },\n { value: 'de', label: 'German' },\n { value: 'it', label: 'Italian' },\n { value: 'pt', label: 'Portuguese' },\n { value: 'ja', label: 'Japanese' },\n { value: 'ko', label: 'Korean' },\n { value: 'zh', label: 'Chinese' }\n]\n\n// Role options for user form\nconst ROLES = [\n { value: 'admin', label: 'Administrator' },\n { value: 'editor', label: 'Editor' },\n { value: 'author', label: 'Author' },\n { value: 'viewer', label: 'Viewer' }\n]\n\n/**\n * GET /admin/profile - Show user profile page\n */\nuserRoutes.get('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n // Get user profile data\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n timezone, language, theme, email_notifications, two_factor_enabled,\n role, created_at, last_login_at\n FROM users \n WHERE id = ? AND is_active = 1\n `)\n \n const userProfile = await userStmt.bind(user!.userId).first() as any\n\n if (!userProfile) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Convert to UserProfile interface\n const profile: UserProfile = {\n id: userProfile.id,\n email: userProfile.email,\n username: userProfile.username || '',\n first_name: userProfile.first_name || '',\n last_name: userProfile.last_name || '',\n phone: userProfile.phone,\n bio: userProfile.bio,\n avatar_url: userProfile.avatar_url,\n timezone: userProfile.timezone || 'UTC',\n language: userProfile.language || 'en',\n theme: userProfile.theme || 'dark',\n email_notifications: Boolean(userProfile.email_notifications),\n two_factor_enabled: Boolean(userProfile.two_factor_enabled),\n role: userProfile.role,\n created_at: userProfile.created_at,\n last_login_at: userProfile.last_login_at\n }\n\n // Get custom profile data\n const customData = await getCustomData(db, user!.userId)\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n const pageData: ProfilePageData = {\n profile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n customProfileFieldsHtml,\n user: {\n name: `${profile.first_name} ${profile.last_name}`.trim() || profile.username || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n } catch (error) {\n console.error('Profile page error:', error)\n \n const pageData: ProfilePageData = {\n profile: {} as UserProfile,\n timezones: TIMEZONES,\n languages: LANGUAGES,\n error: 'Failed to load profile. Please try again.',\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderProfilePage(pageData))\n }\n})\n\n/**\n * PUT /admin/profile - Update user profile\n */\nuserRoutes.put('/profile', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const timezone = formData.get('timezone')?.toString() || 'UTC'\n const language = formData.get('language')?.toString() || 'en'\n const emailNotifications = formData.get('email_notifications') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please enter a valid email address.',\n dismissible: true \n }))\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users \n WHERE (username = ? OR email = ?) AND id != ? AND is_active = 1\n `)\n const existingUser = await checkStmt.bind(username, email, user!.userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Username or email is already taken by another user!.',\n dismissible: true \n }))\n }\n\n // Update user profile\n const updateStmt = db.prepare(`\n UPDATE users SET \n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, bio = ?, timezone = ?, language = ?,\n email_notifications = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, bio, timezone, language,\n emailNotifications ? 1 : 0, Date.now(),\n user!.userId\n ).run()\n\n // Save custom profile fields\n const profileConfig = getUserProfileConfig()\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n await saveCustomData(db, user!.userId, sanitized)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.update', 'users', user!.userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'bio', 'timezone', 'language', 'email_notifications'] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success', \n message: 'Profile updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Profile update error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update profile. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/avatar - Upload user avatar\n */\nuserRoutes.post('/profile/avatar', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n const avatarFile = formData.get('avatar') as File | null\n\n if (!avatarFile || typeof avatarFile === 'string' || !avatarFile.name) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please select an image file.',\n dismissible: true\n }))\n }\n\n // Validate file type\n const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']\n if (!allowedTypes.includes(avatarFile.type)) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Please upload a valid image file (JPEG, PNG, GIF, or WebP).',\n dismissible: true \n }))\n }\n\n // Validate file size (5MB max)\n const maxSize = 5 * 1024 * 1024\n if (avatarFile.size > maxSize) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Image file must be smaller than 5MB.',\n dismissible: true \n }))\n }\n\n // For now, we'll simulate storing the avatar\n // In a real implementation, you'd upload to cloud storage (R2, S3, etc.)\n const avatarUrl = `/uploads/avatars/${user!.userId}-${Date.now()}.${avatarFile.type.split('/')[1]}`\n\n // Update user avatar URL in database\n const updateStmt = db.prepare(`\n UPDATE users SET avatar_url = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(avatarUrl, Date.now(), user!.userId).run()\n\n // Get updated user data to render the avatar\n const userStmt = db.prepare(`\n SELECT first_name, last_name FROM users WHERE id = ?\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.avatar_update', 'users', user!.userId,\n { avatar_url: avatarUrl },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return both the alert message and the updated avatar image using HTMX out-of-band swap\n const alertHtml = renderAlert({\n type: 'success',\n message: 'Profile picture updated successfully!',\n dismissible: true\n })\n\n // Add timestamp to avatar URL to bust cache\n const avatarUrlWithCache = `${avatarUrl}?t=${Date.now()}`\n const avatarImageHtml = renderAvatarImage(avatarUrlWithCache, userData.first_name, userData.last_name)\n\n // Use hx-swap-oob to update the avatar image container\n const avatarImageWithOob = avatarImageHtml.replace(\n 'id=\"avatar-image-container\"',\n 'id=\"avatar-image-container\" hx-swap-oob=\"true\"'\n )\n\n return c.html(alertHtml + avatarImageWithOob)\n\n } catch (error) {\n console.error('Avatar upload error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to upload profile picture. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * POST /admin/profile/password - Change user password\n */\nuserRoutes.post('/profile/password', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n try {\n const formData = await c.req.formData()\n \n const currentPassword = formData.get('current_password')?.toString() || ''\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Validate input\n if (!currentPassword || !newPassword || !confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'All password fields are required.',\n dismissible: true \n }))\n }\n\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New passwords do not match.',\n dismissible: true \n }))\n }\n\n if (newPassword.length < 8) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'New password must be at least 8 characters long.',\n dismissible: true \n }))\n }\n\n // Get current user data\n const userStmt = db.prepare(`\n SELECT password_hash FROM users WHERE id = ? AND is_active = 1\n `)\n const userData = await userStmt.bind(user!.userId).first() as any\n\n if (!userData) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'User not found.',\n dismissible: true \n }))\n }\n\n // Verify current password\n const validPassword = await AuthManager.verifyPassword(currentPassword, userData.password_hash)\n if (!validPassword) {\n return c.html(renderAlert({ \n type: 'error', \n message: 'Current password is incorrect.',\n dismissible: true \n }))\n }\n\n // Hash new password\n const newPasswordHash = await AuthManager.hashPassword(newPassword)\n\n // Store old password in history\n const historyStmt = db.prepare(`\n INSERT INTO password_history (id, user_id, password_hash, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await historyStmt.bind(\n crypto.randomUUID(),\n user!.userId,\n userData.password_hash,\n Date.now()\n ).run()\n\n // Update user password\n const updateStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(newPasswordHash, Date.now(), user!.userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'profile.password_change', 'users', user!.userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({ \n type: 'success', \n message: 'Password updated successfully!',\n dismissible: true \n }))\n\n } catch (error) {\n console.error('Password change error:', error)\n return c.html(renderAlert({ \n type: 'error', \n message: 'Failed to update password. Please try again.',\n dismissible: true \n }))\n }\n})\n\n/**\n * GET /admin/users - List all users\n * Returns HTML for browser requests and JSON for API requests\n * Note: Already protected by requireAuth() and requireRole(['admin', 'editor'])\n */\nuserRoutes.get('/users', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '20')\n const search = c.req.query('search') || ''\n const roleFilter = c.req.query('role') || ''\n const statusFilter = c.req.query('status') || 'active'\n const offset = (page - 1) * limit\n\n // Build search query\n let whereClause = ''\n let params: any[] = []\n\n // Handle status filter\n if (statusFilter === 'active') {\n whereClause = 'WHERE u.is_active = 1'\n } else if (statusFilter === 'inactive') {\n whereClause = 'WHERE u.is_active = 0'\n } else {\n // 'all' - no filter\n whereClause = 'WHERE 1=1'\n }\n\n if (search) {\n whereClause += ' AND (u.first_name LIKE ? OR u.last_name LIKE ? OR u.email LIKE ? OR u.username LIKE ?)'\n const searchParam = `%${search}%`\n params.push(searchParam, searchParam, searchParam, searchParam)\n }\n\n if (roleFilter) {\n whereClause += ' AND u.role = ?'\n params.push(roleFilter)\n }\n\n // Get users\n const usersStmt = db.prepare(`\n SELECT u.id, u.email, u.username, u.first_name, u.last_name,\n u.role, u.avatar_url, u.created_at, u.last_login_at, u.updated_at,\n u.email_verified, u.two_factor_enabled, u.is_active\n FROM users u\n ${whereClause}\n ORDER BY u.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: usersData } = await usersStmt.bind(...params, limit, offset).all()\n\n // Get total count\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total FROM users u ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalUsers = countResult?.total || 0\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'users.list_view', 'users', undefined,\n { search, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Check if this is an API request (accept header contains 'application/json')\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n // Return JSON for API requests\n return c.json({\n users: usersData || [],\n pagination: {\n page,\n limit,\n total: totalUsers,\n pages: Math.ceil(totalUsers / limit)\n }\n })\n }\n\n // Return HTML for browser requests\n const users: User[] = (usersData || []).map((u: any) => ({\n id: u.id,\n email: u.email,\n username: u.username || '',\n firstName: u.first_name || '',\n lastName: u.last_name || '',\n role: u.role,\n avatar: u.avatar_url,\n isActive: Boolean(u.is_active),\n lastLoginAt: u.last_login_at,\n createdAt: u.created_at,\n updatedAt: u.updated_at,\n formattedLastLogin: u.last_login_at ? new Date(u.last_login_at).toLocaleDateString() : undefined,\n formattedCreatedAt: new Date(u.created_at).toLocaleDateString()\n }))\n\n const successMessage = c.req.query('success') || undefined\n\n const pageData: UsersListPageData = {\n users,\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalUsers,\n searchFilter: search,\n roleFilter,\n statusFilter,\n success: successMessage,\n pagination: {\n currentPage: page,\n totalPages: Math.ceil(totalUsers / limit),\n totalItems: totalUsers,\n itemsPerPage: limit,\n startItem: offset + 1,\n endItem: Math.min(offset + limit, totalUsers),\n baseUrl: '/admin/users'\n },\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUsersListPage(pageData))\n\n } catch (error) {\n console.error('Users list error:', error)\n\n const acceptHeader = c.req.header('accept') || ''\n const isApiRequest = acceptHeader.includes('application/json')\n\n if (isApiRequest) {\n return c.json({ error: 'Failed to load users' }, 500)\n }\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load users. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * GET /admin/users/new - Show new user creation page\n */\nuserRoutes.get('/users/new', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: UserNewPageData = {\n roles: ROLES,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserNewPage(pageData))\n } catch (error) {\n console.error('User new page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user creation page. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * POST /admin/users/new - Create new user\n */\nuserRoutes.post('/users/new', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const bio = sanitizeInput(formData.get('bio')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const password = formData.get('password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Validate required fields\n if (!firstName || !lastName || !username || !email || !password) {\n return c.html(renderAlert({\n type: 'error',\n message: 'First name, last name, username, email, and password are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password\n if (password.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n\n if (password !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n\n // Check if username/email are already taken\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE username = ? OR email = ?\n `)\n const existingUser = await checkStmt.bind(username, email).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken.',\n dismissible: true\n }))\n }\n\n // Hash password\n const passwordHash = await AuthManager.hashPassword(password)\n\n // Create user\n const userId = crypto.randomUUID()\n const createStmt = db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name, phone, bio,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createStmt.bind(\n userId, email, username, firstName, lastName, phone, bio,\n passwordHash, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.create', 'users', userId,\n { email, username, role },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Redirect to user list (use HX-Redirect for HTMX requests)\n c.header('HX-Redirect', '/admin/users?success=User created successfully')\n return c.body(null, 200)\n\n } catch (error) {\n console.error('User creation error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to create user!. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * GET /admin/users/:id - Get user by ID\n * Note: This endpoint returns users regardless of is_active status for admin purposes\n */\nuserRoutes.get('/users/:id', async (c) => {\n // Check if this is actually the edit route\n if (c.req.path.endsWith('/edit')) {\n return c.notFound()\n }\n\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (including inactive users for admin access)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, bio, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userRecord = await userStmt.bind(userId).first() as any\n\n if (!userRecord) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.view', 'users', userId,\n null,\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n user: {\n id: userRecord.id,\n email: userRecord.email,\n username: userRecord.username,\n first_name: userRecord.first_name,\n last_name: userRecord.last_name,\n phone: userRecord.phone,\n bio: userRecord.bio,\n avatar_url: userRecord.avatar_url,\n role: userRecord.role,\n is_active: userRecord.is_active,\n email_verified: userRecord.email_verified,\n two_factor_enabled: userRecord.two_factor_enabled,\n created_at: userRecord.created_at,\n last_login_at: userRecord.last_login_at\n }\n })\n\n } catch (error) {\n console.error('User fetch error:', error)\n return c.json({ error: 'Failed to fetch user' }, 500)\n }\n})\n\n/**\n * GET /admin/users/:id/edit - Show user edit page\n */\nuserRoutes.get('/users/:id/edit', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get user data (removed bio - now in profile)\n const userStmt = db.prepare(`\n SELECT id, email, username, first_name, last_name, phone, avatar_url,\n role, is_active, email_verified, two_factor_enabled, created_at, last_login_at\n FROM users\n WHERE id = ?\n `)\n\n const userToEdit = await userStmt.bind(userId).first() as any\n\n if (!userToEdit) {\n return c.html(renderAlert({\n type: 'error',\n message: 'User not found',\n dismissible: true\n }), 404)\n }\n\n // Get user profile data\n const profileStmt = db.prepare(`\n SELECT display_name, bio, company, job_title, website, location, date_of_birth, data\n FROM user_profiles\n WHERE user_id = ?\n `)\n const profileData = await profileStmt.bind(userId).first() as any\n\n // Convert profile to UserProfileData interface\n const profile: UserProfileData | undefined = profileData ? {\n displayName: profileData.display_name,\n bio: profileData.bio,\n company: profileData.company,\n jobTitle: profileData.job_title,\n website: profileData.website,\n location: profileData.location,\n dateOfBirth: profileData.date_of_birth\n } : undefined\n\n // Parse custom profile data\n let customData: Record = {}\n if (profileData?.data) {\n try { customData = JSON.parse(profileData.data) } catch {}\n }\n const profileConfig = getUserProfileConfig()\n const customProfileFieldsHtml = renderCustomProfileSection(profileConfig, customData)\n\n // Convert to UserEditData interface\n const editData: UserEditData = {\n id: userToEdit.id,\n email: userToEdit.email,\n username: userToEdit.username || '',\n firstName: userToEdit.first_name || '',\n lastName: userToEdit.last_name || '',\n phone: userToEdit.phone,\n avatarUrl: userToEdit.avatar_url,\n role: userToEdit.role,\n isActive: Boolean(userToEdit.is_active),\n emailVerified: Boolean(userToEdit.email_verified),\n twoFactorEnabled: Boolean(userToEdit.two_factor_enabled),\n createdAt: userToEdit.created_at,\n lastLoginAt: userToEdit.last_login_at,\n profile\n }\n\n const pageData: UserEditPageData = {\n userToEdit: editData,\n roles: ROLES,\n customProfileFieldsHtml,\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderUserEditPage(pageData))\n } catch (error) {\n console.error('User edit page error:', error)\n\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to load user. Please try again.',\n dismissible: true\n }), 500)\n }\n})\n\n/**\n * PUT /admin/users/:id - Update user\n */\nuserRoutes.put('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n const username = sanitizeInput(formData.get('username')?.toString())\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const phone = sanitizeInput(formData.get('phone')?.toString()) || null\n const roleInput = formData.get('role')?.toString() || 'viewer'\n const validRoles = ['admin', 'editor', 'author', 'viewer']\n const role = validRoles.includes(roleInput) ? roleInput : 'viewer'\n const isActive = formData.get('is_active') === '1'\n const emailVerified = formData.get('email_verified') === '1'\n\n // Optional password change\n const newPassword = formData.get('new_password')?.toString() || ''\n const confirmPassword = formData.get('confirm_password')?.toString() || ''\n\n // Extract profile fields\n const profileDisplayName = sanitizeInput(formData.get('profile_display_name')?.toString()) || null\n const profileBio = sanitizeInput(formData.get('profile_bio')?.toString()) || null\n const profileCompany = sanitizeInput(formData.get('profile_company')?.toString()) || null\n const profileJobTitle = sanitizeInput(formData.get('profile_job_title')?.toString()) || null\n const profileWebsite = formData.get('profile_website')?.toString()?.trim() || null\n const profileLocation = sanitizeInput(formData.get('profile_location')?.toString()) || null\n const profileDateOfBirthStr = formData.get('profile_date_of_birth')?.toString()?.trim() || null\n const profileDateOfBirth = profileDateOfBirthStr ? new Date(profileDateOfBirthStr).getTime() : null\n\n // Extract custom profile fields\n const profileConfig = getUserProfileConfig()\n let customDataJson: string | null = null\n if (profileConfig) {\n const rawCustom = extractCustomFieldsFromForm(formData, profileConfig)\n const sanitized = sanitizeCustomData(rawCustom, profileConfig)\n const validation = validateCustomData(sanitized, profileConfig)\n if (!validation.valid) {\n const errorMessages = Object.values(validation.errors).join(', ')\n return c.html(renderAlert({ type: 'error', message: errorMessages, dismissible: true }), 400)\n }\n // Merge with existing custom data\n const existingCustom = await getCustomData(db, userId)\n const merged = { ...existingCustom, ...sanitized }\n customDataJson = JSON.stringify(merged)\n }\n\n // Validate required fields\n if (!username || !email) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username and email are required.',\n dismissible: true\n }))\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid email address.',\n dismissible: true\n }))\n }\n\n // Validate password if provided\n if (newPassword) {\n if (newPassword.length < 8) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Password must be at least 8 characters long.',\n dismissible: true\n }))\n }\n if (newPassword !== confirmPassword) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Passwords do not match.',\n dismissible: true\n }))\n }\n }\n\n // Validate website URL if provided\n if (profileWebsite) {\n try {\n new URL(profileWebsite)\n } catch {\n return c.html(renderAlert({\n type: 'error',\n message: 'Please enter a valid website URL.',\n dismissible: true\n }))\n }\n }\n\n // Check if username/email are taken by another user\n const checkStmt = db.prepare(`\n SELECT id FROM users\n WHERE (username = ? OR email = ?) AND id != ?\n `)\n const existingUser = await checkStmt.bind(username, email, userId).first()\n\n if (existingUser) {\n return c.html(renderAlert({\n type: 'error',\n message: 'Username or email is already taken by another user.',\n dismissible: true\n }))\n }\n\n // Update user (removed bio - now in profile)\n const updateStmt = db.prepare(`\n UPDATE users SET\n first_name = ?, last_name = ?, username = ?, email = ?,\n phone = ?, role = ?, is_active = ?, email_verified = ?,\n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n firstName, lastName, username, email,\n phone, role, isActive ? 1 : 0, emailVerified ? 1 : 0,\n Date.now(), userId\n ).run()\n\n // Update password if provided\n if (newPassword) {\n const passwordHash = await AuthManager.hashPassword(newPassword)\n const updatePasswordStmt = db.prepare(`\n UPDATE users SET password_hash = ?, updated_at = ? WHERE id = ?\n `)\n await updatePasswordStmt.bind(passwordHash, Date.now(), userId).run()\n }\n\n // Check if any profile field has data\n const hasProfileData = profileDisplayName || profileBio || profileCompany ||\n profileJobTitle || profileWebsite || profileLocation || profileDateOfBirth\n\n if (hasProfileData || customDataJson !== null) {\n const now = Date.now()\n\n // Check if profile exists\n const profileCheckStmt = db.prepare(`SELECT id FROM user_profiles WHERE user_id = ?`)\n const existingProfile = await profileCheckStmt.bind(userId).first() as any\n\n if (existingProfile) {\n // Update existing profile\n const updateProfileStmt = db.prepare(`\n UPDATE user_profiles SET\n display_name = ?, bio = ?, company = ?, job_title = ?,\n website = ?, location = ?, date_of_birth = ?, updated_at = ?\n ${customDataJson !== null ? ', data = ?' : ''}\n WHERE user_id = ?\n `)\n const updateBindings = [\n profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, now,\n ...(customDataJson !== null ? [customDataJson] : []),\n userId\n ]\n await updateProfileStmt.bind(...updateBindings).run()\n } else {\n // Create new profile\n const profileId = `profile_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const insertProfileStmt = db.prepare(`\n INSERT INTO user_profiles (id, user_id, display_name, bio, company, job_title, website, location, date_of_birth, data, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n await insertProfileStmt.bind(\n profileId, userId, profileDisplayName, profileBio, profileCompany, profileJobTitle,\n profileWebsite, profileLocation, profileDateOfBirth, customDataJson || '{}', now, now\n ).run()\n }\n }\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user.update', 'users', userId,\n { fields: ['first_name', 'last_name', 'username', 'email', 'phone', 'role', 'is_active', 'email_verified', 'profile', ...(newPassword ? ['password'] : [])] },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.html(renderAlert({\n type: 'success',\n message: 'User updated successfully!',\n dismissible: true\n }))\n\n } catch (error) {\n console.error('User update error:', error)\n return c.html(renderAlert({\n type: 'error',\n message: 'Failed to update user. Please try again.',\n dismissible: true\n }))\n }\n})\n\n/**\n * POST /admin/users/:id/toggle - Toggle user active status\n */\nuserRoutes.post('/users/:id/toggle', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n const body = await c.req.json().catch(() => ({ active: true }))\n const active = body.active === true\n\n // Prevent self-deactivation\n if (userId === user!.userId && !active) {\n return c.json({ error: 'You cannot deactivate your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToToggle = await userStmt.bind(userId).first() as any\n\n if (!userToToggle) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n // Toggle user status\n const toggleStmt = db.prepare(`\n UPDATE users SET is_active = ?, updated_at = ? WHERE id = ?\n `)\n await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, active ? 'user.activate' : 'user.deactivate', 'users', userId,\n { email: userToToggle.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: active ? 'User activated successfully' : 'User deactivated successfully'\n })\n\n } catch (error) {\n console.error('User toggle error:', error)\n return c.json({ error: 'Failed to toggle user status' }, 500)\n }\n})\n\n/**\n * DELETE /admin/users/:id - Delete user\n */\nuserRoutes.delete('/users/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Get request body to check for hard delete option\n const body = await c.req.json().catch(() => ({ hardDelete: false }))\n const hardDelete = body.hardDelete === true\n\n // Prevent self-deletion\n if (userId === user!.userId) {\n return c.json({ error: 'You cannot delete your own account' }, 400)\n }\n\n // Check if user exists\n const userStmt = db.prepare(`\n SELECT id, email FROM users WHERE id = ?\n `)\n const userToDelete = await userStmt.bind(userId).first() as any\n\n if (!userToDelete) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n if (hardDelete) {\n // Hard delete - permanently remove from database\n const deleteStmt = db.prepare(`\n DELETE FROM users WHERE id = ?\n `)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.hard_delete', 'users', userId,\n { email: userToDelete.email, permanent: true },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User permanently deleted'\n })\n } else {\n // Soft delete - deactivate by setting is_active = 0\n const deleteStmt = db.prepare(`\n UPDATE users SET is_active = 0, updated_at = ? WHERE id = ?\n `)\n await deleteStmt.bind(Date.now(), userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.soft_delete', 'users', userId,\n { email: userToDelete.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'User deactivated successfully'\n })\n }\n\n } catch (error) {\n console.error('User deletion error:', error)\n return c.json({ error: 'Failed to delete user' }, 500)\n }\n})\n\n/**\n * POST /admin/invite-user - Invite a new user\n */\nuserRoutes.post('/invite-user', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n const formData = await c.req.formData()\n\n // Sanitize all user inputs to prevent XSS attacks\n const email = formData.get('email')?.toString()?.trim().toLowerCase() || ''\n const role = formData.get('role')?.toString()?.trim() || 'viewer'\n const firstName = sanitizeInput(formData.get('first_name')?.toString())\n const lastName = sanitizeInput(formData.get('last_name')?.toString())\n\n // Validate input\n if (!email || !firstName || !lastName) {\n return c.json({ error: 'Email, first name, and last name are required' }, 400)\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(email)) {\n return c.json({ error: 'Please enter a valid email address' }, 400)\n }\n\n // Check if user already exists\n const existingUserStmt = db.prepare(`\n SELECT id FROM users WHERE email = ?\n `)\n const existingUser = await existingUserStmt.bind(email).first()\n\n if (existingUser) {\n return c.json({ error: 'A user with this email already exists' }, 400)\n }\n\n // Generate invitation token\n const invitationToken = crypto.randomUUID()\n // const invitationExpires = Date.now() + (7 * 24 * 60 * 60 * 1000) // 7 days\n\n // Create user record with invitation\n const userId = crypto.randomUUID()\n const createUserStmt = db.prepare(`\n INSERT INTO users (\n id, email, first_name, last_name, role, \n invitation_token, invited_by, invited_at,\n is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await createUserStmt.bind(\n userId, email, firstName, lastName, role,\n invitationToken, user!.userId, Date.now(),\n 0, 0, Date.now(), Date.now()\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invite_sent', 'users', userId,\n { email, role, invited_user_id: userId },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // In a real implementation, you would send an email here\n // For now, we'll return the invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${invitationToken}`\n\n return c.json({\n success: true,\n message: 'User invitation sent successfully',\n user: {\n id: userId,\n email,\n first_name: firstName,\n last_name: lastName,\n role\n },\n invitation_link: invitationLink // In production, this would be sent via email\n })\n\n } catch (error) {\n console.error('User invitation error:', error)\n return c.json({ error: 'Failed to send user invitation' }, 500)\n }\n})\n\n/**\n * POST /admin/resend-invitation/:id - Resend invitation\n */\nuserRoutes.post('/resend-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email, first_name, last_name, role, invitation_token\n FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Generate new invitation token\n const newInvitationToken = crypto.randomUUID()\n\n // Update invitation token and date\n const updateStmt = db.prepare(`\n UPDATE users SET \n invitation_token = ?, \n invited_at = ?, \n updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(\n newInvitationToken,\n Date.now(),\n Date.now(),\n userId\n ).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_resent', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Generate new invitation link\n const invitationLink = `${c.req.header('origin') || 'http://localhost:8787'}/auth/accept-invitation?token=${newInvitationToken}`\n\n return c.json({\n success: true,\n message: 'Invitation resent successfully',\n invitation_link: invitationLink\n })\n\n } catch (error) {\n console.error('Resend invitation error:', error)\n return c.json({ error: 'Failed to resend invitation' }, 500)\n }\n})\n\n/**\n * DELETE /admin/cancel-invitation/:id - Cancel invitation\n */\nuserRoutes.delete('/cancel-invitation/:id', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const userId = c.req.param('id')\n\n try {\n // Check if user exists and is invited but not active\n const userStmt = db.prepare(`\n SELECT id, email FROM users \n WHERE id = ? AND is_active = 0 AND invitation_token IS NOT NULL\n `)\n const invitedUser = await userStmt.bind(userId).first() as any\n\n if (!invitedUser) {\n return c.json({ error: 'User not found or invitation not valid' }, 404)\n }\n\n // Delete the user record (since they haven't activated yet)\n const deleteStmt = db.prepare(`DELETE FROM users WHERE id = ?`)\n await deleteStmt.bind(userId).run()\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'user!.invitation_cancelled', 'users', userId,\n { email: invitedUser.email },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n return c.json({\n success: true,\n message: 'Invitation cancelled successfully'\n })\n\n } catch (error) {\n console.error('Cancel invitation error:', error)\n return c.json({ error: 'Failed to cancel invitation' }, 500)\n }\n})\n\n/**\n * GET /admin/activity-logs - View activity logs\n */\nuserRoutes.get('/activity-logs', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get pagination and filter parameters\n const page = parseInt(c.req.query('page') || '1')\n const limit = parseInt(c.req.query('limit') || '50')\n const offset = (page - 1) * limit\n\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get activity logs with user information\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results: logs } = await logsStmt.bind(...params, limit, offset).all()\n\n // Get total count for pagination\n const countStmt = db.prepare(`\n SELECT COUNT(*) as total \n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first() as any\n const totalLogs = countResult?.total || 0\n\n // Parse details JSON for each log\n const formattedLogs: ActivityLog[] = (logs || []).map((log: any) => ({\n ...log,\n details: log.details ? JSON.parse(log.details) : null\n }))\n\n // Log the activity\n await logActivity(\n db, user!.userId, 'activity.logs_viewed', undefined, undefined,\n { filters, page, limit },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n const pageData: ActivityLogsPageData = {\n logs: formattedLogs,\n pagination: {\n page,\n limit,\n total: totalLogs,\n pages: Math.ceil(totalLogs / limit)\n },\n filters,\n user: {\n name: user!.email.split('@')[0] || user!.email, // Use email username as fallback\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n\n } catch (error) {\n console.error('Activity logs error:', error)\n \n const pageData: ActivityLogsPageData = {\n logs: [],\n pagination: { page: 1, limit: 50, total: 0, pages: 0 },\n filters: {},\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n }\n }\n\n return c.html(renderActivityLogsPage(pageData))\n }\n})\n\n/**\n * GET /admin/activity-logs/export - Export activity logs to CSV\n */\nuserRoutes.get('/activity-logs/export', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n\n try {\n // Get filter parameters (same as list view)\n const filters = {\n action: c.req.query('action') || '',\n resource_type: c.req.query('resource_type') || '',\n date_from: c.req.query('date_from') || '',\n date_to: c.req.query('date_to') || '',\n user_id: c.req.query('user_id') || ''\n }\n\n // Build where clause\n let whereConditions: string[] = []\n let params: any[] = []\n\n if (filters.action) {\n whereConditions.push('al.action = ?')\n params.push(filters.action)\n }\n\n if (filters.resource_type) {\n whereConditions.push('al.resource_type = ?')\n params.push(filters.resource_type)\n }\n\n if (filters.user_id) {\n whereConditions.push('al.user_id = ?')\n params.push(filters.user_id)\n }\n\n if (filters.date_from) {\n const fromTimestamp = new Date(filters.date_from).getTime()\n whereConditions.push('al.created_at >= ?')\n params.push(fromTimestamp)\n }\n\n if (filters.date_to) {\n const toTimestamp = new Date(filters.date_to + ' 23:59:59').getTime()\n whereConditions.push('al.created_at <= ?')\n params.push(toTimestamp)\n }\n\n const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : ''\n\n // Get all matching activity logs (limit to 10,000 for performance)\n const logsStmt = db.prepare(`\n SELECT \n al.id, al.user_id, al.action, al.resource_type, al.resource_id,\n al.details, al.ip_address, al.user_agent, al.created_at,\n u.email as user_email,\n COALESCE(u.first_name || ' ' || u.last_name, u.username, u.email) as user_name\n FROM activity_logs al\n LEFT JOIN users u ON al.user_id = u.id\n ${whereClause}\n ORDER BY al.created_at DESC\n LIMIT 10000\n `)\n\n const { results: logs } = await logsStmt.bind(...params).all()\n\n // Generate CSV content\n const csvHeaders = ['Timestamp', 'User', 'Email', 'Action', 'Resource Type', 'Resource ID', 'IP Address', 'Details']\n const csvRows = [csvHeaders.join(',')]\n\n for (const log of (logs || [])) {\n const row = [\n `\"${new Date((log as any).created_at).toISOString()}\"`,\n `\"${(log as any).user_name || 'Unknown'}\"`,\n `\"${(log as any).user_email || 'N/A'}\"`,\n `\"${(log as any).action}\"`,\n `\"${(log as any).resource_type || 'N/A'}\"`,\n `\"${(log as any).resource_id || 'N/A'}\"`,\n `\"${(log as any).ip_address || 'N/A'}\"`,\n `\"${(log as any).details ? JSON.stringify(JSON.parse((log as any).details)) : 'N/A'}\"`\n ]\n csvRows.push(row.join(','))\n }\n\n const csvContent = csvRows.join('\\n')\n\n // Log the export activity\n await logActivity(\n db, user!.userId, 'activity.logs_exported', undefined, undefined,\n { filters, count: logs?.length || 0 },\n c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip'),\n c.req.header('user-agent')\n )\n\n // Return CSV file\n const filename = `activity-logs-${new Date().toISOString().split('T')[0]}.csv`\n \n return new Response(csvContent, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"${filename}\"`\n }\n })\n\n } catch (error) {\n console.error('Activity logs export error:', error)\n return c.json({ error: 'Failed to export activity logs' }, 500)\n }\n})\n\nexport { userRoutes }","export interface MediaFile {\n id: string;\n filename: string;\n original_name: string;\n mime_type: string;\n size: number;\n public_url: string;\n thumbnail_url?: string;\n alt?: string;\n caption?: string;\n tags: string[];\n uploaded_at: string;\n fileSize: string;\n uploadedAt: string;\n isImage: boolean;\n isVideo: boolean;\n isDocument: boolean;\n}\n\nexport interface MediaGridData {\n files: MediaFile[];\n viewMode?: \"grid\" | \"list\";\n selectable?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function renderMediaGrid(data: MediaGridData): string {\n if (data.files.length === 0) {\n return `\n
\n \n \n \n

No media files

\n

${\n data.emptyMessage || \"Get started by uploading your first file.\"\n }

\n
\n `;\n }\n\n const gridClass = data.viewMode === \"list\" ? \"space-y-4\" : \"media-grid\";\n\n return `\n
\n ${data.files\n .map((file) =>\n renderMediaFileCard(file, data.viewMode, data.selectable)\n )\n .join(\"\")}\n
\n `;\n}\n\nexport function renderMediaFileCard(\n file: MediaFile,\n viewMode: \"grid\" | \"list\" = \"grid\",\n selectable: boolean = false\n): string {\n if (viewMode === \"list\") {\n return `\n
\n
\n ${\n selectable\n ? `\n
\n
\n \n \n \n \n \n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n
\n\n
\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n \n \n \n \n \n
\n
\n
\n ${file.uploadedAt}\n ${\n file.tags.length > 0\n ? `\n \n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n
\n
\n `;\n }\n\n // Grid view\n return `\n
\n ${\n selectable\n ? `\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n `\n : \"\"\n }\n\n
\n ${\n file.isImage\n ? `\n \"${\n\n `\n : `\n
\n ${getFileIcon(file.mime_type)}\n
\n `\n }\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n\n
\n

\n ${file.original_name}\n

\n
\n ${\n file.fileSize\n }\n ${\n file.uploadedAt\n }\n
\n ${\n file.tags.length > 0\n ? `\n
\n ${file.tags\n .slice(0, 2)\n .map(\n (tag) => `\n \n ${tag}\n \n `\n )\n .join(\"\")}\n ${\n file.tags.length > 2\n ? `+${\n file.tags.length - 2\n }`\n : \"\"\n }\n
\n `\n : \"\"\n }\n
\n
\n `;\n}\n\nfunction getFileIcon(mimeType: string): string {\n if (mimeType.startsWith(\"image/\")) {\n return `\n \n \n \n `;\n } else if (mimeType.startsWith(\"video/\")) {\n return `\n \n \n \n `;\n } else if (mimeType === \"application/pdf\") {\n return `\n \n \n \n `;\n } else {\n return `\n \n \n \n `;\n }\n}\n","import {\n getConfirmationDialogScript,\n renderConfirmationDialog,\n} from \"../components/confirmation-dialog.template\";\nimport { MediaFile, renderMediaGrid } from \"../components/media-grid.template\";\nimport {\n AdminLayoutCatalystData,\n renderAdminLayoutCatalyst,\n} from \"../layouts/admin-layout-catalyst.template\";\n\nexport interface FolderStats {\n folder: string;\n count: number;\n totalSize: number;\n}\n\nexport interface TypeStats {\n type: string;\n count: number;\n}\n\nexport interface MediaLibraryPageData {\n files: MediaFile[];\n folders: FolderStats[];\n types: TypeStats[];\n currentFolder: string;\n currentType: string;\n currentView: \"grid\" | \"list\";\n currentPage: number;\n totalFiles: number;\n hasNextPage: boolean;\n user?: {\n name: string;\n email: string;\n role: string;\n };\n version?: string;\n}\n\nexport function renderMediaLibraryPage(data: MediaLibraryPageData): string {\n const pageContent = `\n
\n \n
\n
\n

Media Library

\n

Manage your media files and assets

\n
\n
\n \n \n \n \n Upload Media\n \n
\n
\n \n
\n \n
\n
\n \n
\n \n Upload Files\n \n
\n\n \n
\n

Folders

\n \n
\n\n \n
\n

File Types

\n \n
\n\n \n
\n

Quick Actions

\n
\n \n Create Folder\n \n \n Cleanup Unused\n \n
\n
\n
\n
\n \n \n
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n \n
\n \n \n \n
\n \n \n \n \n \n \n \n
\n
\n\n
\n ${\n data.files.length\n } files\n \n Select All\n \n
\n \n Bulk Actions\n \n \n \n \n\n \n
\n \n \n \n \n Move to Folder\n \n
\n
\n \n \n \n \n Delete Selected Files\n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n ${renderMediaGrid({\n files: data.files,\n viewMode: data.currentView,\n selectable: true,\n emptyMessage:\n \"No media files found. Upload your first file to get started.\",\n })}\n
\n \n \n ${\n data.hasNextPage\n ? `\n
\n
\n ${\n data.currentPage > 1\n ? `\n \n Previous\n \n `\n : \"\"\n }\n Page ${\n data.currentPage\n }\n \n Next\n \n
\n
\n `\n : \"\"\n }\n
\n
\n \n \n \n
\n
\n
\n

Upload Files

\n \n
\n \n \n { window.location.href = '/admin/media?t=' + Date.now(); }, 1500); }\"\n class=\"space-y-4\"\n >\n \n \n \n \n \n
\n

Drop files here or click to upload

\n

PNG, JPG, GIF, PDF up to 10MB

\n
\n
\n \n \n \n \n
\n \n \n
\n\n \n
\n

Selected Files:

\n
\n
\n\n \n
\n \n Cancel\n \n \n Upload Files\n \n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n
\n
\n\n \n
\n
\n
\n

Move to Folder

\n \n
\n\n

\n Select a folder to move 0 selected file(s) to:\n

\n\n
\n ${\n data.folders.length > 0\n ? data.folders\n .map(\n (folder) => `\n \n
\n ${folder.folder}\n ${folder.count} files\n
\n \n `\n )\n .join(\"\")\n : '

No folders available

'\n }\n
\n\n
\n \n Cancel\n \n
\n
\n
\n\n \n
\n
\n
\n

Create New Folder

\n \n
\n\n
\n
\n \n \n

\n Use lowercase letters, numbers, hyphens, and underscores only\n

\n
\n\n
\n \n Cancel\n \n \n Create Folder\n \n
\n
\n
\n
\n\n \n \n \n\n \n ${renderConfirmationDialog({\n id: \"media-bulk-delete-confirm\",\n title: \"Delete Selected Files\",\n message: `Are you sure you want to delete ${\n data.files.length > 0 ? \"the selected files\" : \"these files\"\n }? This action cannot be undone and the files will be permanently removed.`,\n confirmText: \"Delete Files\",\n cancelText: \"Cancel\",\n confirmClass: \"bg-red-500 hover:bg-red-400\",\n iconColor: \"red\",\n onConfirm: \"performBulkDelete()\",\n })}\n\n \n ${getConfirmationDialogScript()}\n `;\n\n function buildPageUrl(page: number, folder: string, type: string): string {\n const params = new URLSearchParams();\n params.set(\"page\", page.toString());\n if (folder !== \"all\") params.set(\"folder\", folder);\n if (type !== \"all\") params.set(\"type\", type);\n return `/admin/media?${params.toString()}`;\n }\n\n const layoutData: AdminLayoutCatalystData = {\n title: \"Media Library\",\n pageTitle: \"Media Library\",\n currentPath: \"/admin/media\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayoutCatalyst(layoutData);\n}\n","import { MediaFile } from './media-grid.template'\n\nexport interface MediaFileDetailsData {\n file: MediaFile & {\n width?: number\n height?: number\n folder: string\n uploadedAt: string\n }\n}\n\nexport function renderMediaFileDetails(data: MediaFileDetailsData): string {\n const { file } = data\n \n return `\n
\n

File Details

\n \n
\n \n
\n \n
\n
\n ${file.isImage ? `\n \"${file.alt\n ` : file.isVideo ? `\n \n ` : `\n
\n \n \n \n
\n `}\n
\n\n
\n \n Copy URL\n \n \n Open Original\n \n
\n
\n \n \n
\n
\n \n

${file.original_name}

\n
\n\n
\n
\n \n

${file.fileSize}

\n
\n
\n \n

${file.mime_type}

\n
\n
\n\n ${file.width && file.height ? `\n
\n
\n \n

${file.width}px

\n
\n
\n \n

${file.height}px

\n
\n
\n ` : ''}\n\n
\n \n

${file.folder}

\n
\n\n
\n \n

${file.uploadedAt}

\n
\n\n \n
\n
\n \n \n
\n\n
\n \n ${file.caption || ''}\n
\n\n
\n \n \n
\n\n
\n \n Save Changes\n \n \n Delete File\n \n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\nimport { html, raw } from 'hono/html'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth, requireRole } from '../middleware'\nimport { renderMediaLibraryPage, MediaLibraryPageData, FolderStats, TypeStats } from '../templates/pages/admin-media-library.template'\nimport { renderMediaFileDetails, MediaFileDetailsData } from '../templates/components/media-file-details.template'\nimport { MediaFile, renderMediaFileCard } from '../templates/components/media-grid.template'\nimport type { Bindings, Variables } from '../app'\n\n// File validation schema\nconst fileValidationSchema = z.object({\n name: z.string().min(1).max(255),\n type: z.string().refine(\n (type) => {\n const allowedTypes = [\n // Images\n 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\n // Documents\n 'application/pdf', 'text/plain', 'application/msword', \n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // Videos\n 'video/mp4', 'video/webm', 'video/ogg', 'video/avi', 'video/mov',\n // Audio\n 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a'\n ]\n return allowedTypes.includes(type)\n },\n { message: 'Unsupported file type' }\n ),\n size: z.number().min(1).max(50 * 1024 * 1024) // 50MB max\n})\n\nconst adminMediaRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminMediaRoutes.use('*', requireAuth())\n\n// Media library main page\nadminMediaRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { searchParams } = new URL(c.req.url)\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const view = searchParams.get('view') || 'grid'\n const page = parseInt(searchParams.get('page') || '1')\n const _cacheBust = searchParams.get('t') // Cache-busting parameter\n const limit = 24\n const offset = (page - 1) * limit\n\n const db = c.env.DB\n\n // TODO: Cache implementation removed during migration - will be added back when cache plugin is migrated\n\n // Build query for media files\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = ['deleted_at IS NULL']\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT ${limit} OFFSET ${offset}`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n // Get folder statistics\n const foldersStmt = db.prepare(`\n SELECT folder, COUNT(*) as count, SUM(size) as totalSize\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY folder\n ORDER BY folder\n `)\n const { results: folders } = await foldersStmt.all()\n \n // Get type statistics\n const typesStmt = db.prepare(`\n SELECT\n CASE\n WHEN mime_type LIKE 'image/%' THEN 'images'\n WHEN mime_type LIKE 'video/%' THEN 'videos'\n WHEN mime_type IN ('application/pdf', 'text/plain') THEN 'documents'\n ELSE 'other'\n END as type,\n COUNT(*) as count\n FROM media\n WHERE deleted_at IS NULL\n GROUP BY type\n `)\n const { results: types } = await typesStmt.all()\n \n // Process media files with local serving URLs\n const mediaFiles: MediaFile[] = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n caption: row.caption,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const pageData: MediaLibraryPageData = {\n files: mediaFiles,\n folders: folders.map((f: any) => ({\n folder: f.folder,\n count: f.count,\n totalSize: f.totalSize\n })) as FolderStats[],\n types: types.map((t: any) => ({\n type: t.type,\n count: t.count\n })) as TypeStats[],\n currentFolder: folder,\n currentType: type,\n currentView: view as 'grid' | 'list',\n currentPage: page,\n totalFiles: results.length,\n hasNextPage: results.length === limit,\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: c.get('appVersion')\n }\n\n // TODO: Cache implementation removed during migration\n\n return c.html(renderMediaLibraryPage(pageData))\n } catch (error) {\n console.error('Error loading media library:', error)\n return c.html(html`

Error loading media library

`)\n }\n})\n\n// Media selector endpoint (HTMX endpoint for content form media selection)\nadminMediaRoutes.get('/selector', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const db = c.env.DB\n\n // Build search query\n let query = 'SELECT * FROM media WHERE deleted_at IS NULL'\n const params: any[] = []\n\n if (search.trim()) {\n query += ' AND (filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n query += ' ORDER BY uploaded_at DESC LIMIT 24'\n\n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n alt: row.alt,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n // Render media selector grid\n return c.html(html`\n
\n \n
\n\n
\n ${raw(mediaFiles.map(file => `\n \n
\n ${file.isImage ? `\n \n ` : file.isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n\n
\n \n Select\n \n
\n
\n\n
\n

\n ${file.original_name}\n

\n

\n ${file.fileSize}\n

\n
\n
\n `).join(''))}\n \n\n ${mediaFiles.length === 0 ? html`\n
\n \n \n \n

No media files found

\n
\n ` : ''}\n `)\n } catch (error) {\n console.error('Error loading media selector:', error)\n return c.html(html`
Error loading media files
`)\n }\n})\n\n// Search media files (HTMX endpoint)\nadminMediaRoutes.get('/search', async (c) => {\n try {\n const { searchParams } = new URL(c.req.url)\n const search = searchParams.get('search') || ''\n const folder = searchParams.get('folder') || 'all'\n const type = searchParams.get('type') || 'all'\n const db = c.env.DB\n \n // Build search query\n let query = 'SELECT * FROM media'\n const params: any[] = []\n const conditions: string[] = []\n \n if (search.trim()) {\n conditions.push('(filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)')\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n \n if (folder !== 'all') {\n conditions.push('folder = ?')\n params.push(folder)\n }\n \n if (type !== 'all') {\n switch (type) {\n case 'images':\n conditions.push('mime_type LIKE ?')\n params.push('image/%')\n break\n case 'documents':\n conditions.push('mime_type IN (?, ?, ?)')\n params.push('application/pdf', 'text/plain', 'application/msword')\n break\n case 'videos':\n conditions.push('mime_type LIKE ?')\n params.push('video/%')\n break\n }\n }\n \n if (conditions.length > 0) {\n query += ` WHERE ${conditions.join(' AND ')}`\n }\n \n query += ` ORDER BY uploaded_at DESC LIMIT 24`\n \n const stmt = db.prepare(query)\n const { results } = await stmt.bind(...params).all()\n \n const mediaFiles = results.map((row: any) => ({\n ...row,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n fileSize: formatFileSize(row.size),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n \n const gridHTML = mediaFiles.map(file => generateMediaItemHTML(file)).join('')\n \n return c.html(raw(gridHTML))\n } catch (error) {\n console.error('Error searching media:', error)\n return c.html('
Error searching files
')\n }\n})\n\n// Get file details modal (HTMX endpoint)\nadminMediaRoutes.get('/:id/details', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n \n const stmt = db.prepare('SELECT * FROM media WHERE id = ?')\n const result = await stmt.bind(id).first() as any\n \n if (!result) {\n return c.html('
File not found
')\n }\n \n const file: MediaFile & { width?: number; height?: number; folder: string; uploadedAt: string } = {\n id: result.id,\n filename: result.filename,\n original_name: result.original_name,\n mime_type: result.mime_type,\n size: result.size,\n public_url: `/files/${result.r2_key}`,\n thumbnail_url: result.mime_type.startsWith('image/') ? `/files/${result.r2_key}` : undefined,\n alt: result.alt,\n caption: result.caption,\n tags: result.tags ? JSON.parse(result.tags) : [],\n uploaded_at: result.uploaded_at,\n fileSize: formatFileSize(result.size),\n uploadedAt: new Date(result.uploaded_at).toLocaleString(),\n isImage: result.mime_type.startsWith('image/'),\n isVideo: result.mime_type.startsWith('video/'),\n isDocument: !result.mime_type.startsWith('image/') && !result.mime_type.startsWith('video/'),\n width: result.width,\n height: result.height,\n folder: result.folder\n }\n \n const detailsData: MediaFileDetailsData = { file }\n \n return c.html(renderMediaFileDetails(detailsData))\n } catch (error) {\n console.error('Error fetching file details:', error)\n return c.html('
Error loading file details
')\n }\n})\n\n// Upload files endpoint (HTMX compatible)\nadminMediaRoutes.post('/upload', async (c) => {\n try {\n const user = c.get('user')\n const formData = await c.req.formData()\n const fileEntries = formData.getAll('files') as unknown[]\n const files: File[] = []\n\n for (const entry of fileEntries) {\n if (entry instanceof File) {\n files.push(entry)\n }\n }\n \n if (!files || files.length === 0) {\n return c.html(html`\n
\n No files provided\n
\n `)\n }\n\n const uploadResults = []\n const errors = []\n\n // Check if MEDIA_BUCKET is available\n console.log('[MEDIA UPLOAD] c.env keys:', Object.keys(c.env))\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET defined?', !!c.env.MEDIA_BUCKET)\n console.log('[MEDIA UPLOAD] MEDIA_BUCKET type:', typeof c.env.MEDIA_BUCKET)\n\n if (!c.env.MEDIA_BUCKET) {\n console.error('[MEDIA UPLOAD] MEDIA_BUCKET is not available! Available env keys:', Object.keys(c.env))\n return c.html(html`\n
\n Media storage (R2) is not configured. Please check your wrangler.toml configuration.\n
Debug: Available bindings: ${Object.keys(c.env).join(', ')}\n
\n `)\n }\n\n for (const file of files) {\n try {\n // Validate file\n const validation = fileValidationSchema.safeParse({\n name: file.name,\n type: file.type,\n size: file.size\n })\n\n if (!validation.success) {\n errors.push({\n filename: file.name,\n error: validation.error.issues[0]?.message || 'Validation failed'\n })\n continue\n }\n\n // Generate unique filename and R2 key\n const fileId = crypto.randomUUID()\n const fileExtension = file.name.split('.').pop() || ''\n const filename = `${fileId}.${fileExtension}`\n const folder = formData.get('folder') as string || 'uploads'\n const r2Key = `${folder}/${filename}`\n\n // Upload to R2\n const arrayBuffer = await file.arrayBuffer()\n const uploadResult = await c.env.MEDIA_BUCKET.put(r2Key, arrayBuffer, {\n httpMetadata: {\n contentType: file.type,\n contentDisposition: `inline; filename=\"${file.name}\"`\n },\n customMetadata: {\n originalName: file.name,\n uploadedBy: user!.userId,\n uploadedAt: new Date().toISOString()\n }\n })\n\n if (!uploadResult) {\n errors.push({\n filename: file.name,\n error: 'Failed to upload to storage'\n })\n continue\n }\n\n // Extract image dimensions if it's an image\n let width: number | null = null\n let height: number | null = null\n\n if (file.type.startsWith('image/') && !file.type.includes('svg')) {\n try {\n const dimensions = await getImageDimensions(arrayBuffer)\n width = dimensions.width\n height = dimensions.height\n } catch (error) {\n console.warn('Failed to extract image dimensions:', error)\n }\n }\n\n // Generate URLs - use public serving route\n const publicUrl = `/files/${r2Key}`\n const thumbnailUrl = file.type.startsWith('image/') ? publicUrl : null\n\n // Save to database\n const stmt = c.env.DB.prepare(`\n INSERT INTO media (\n id, filename, original_name, mime_type, size, width, height, \n folder, r2_key, public_url, thumbnail_url, uploaded_by, uploaded_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n fileId,\n filename,\n file.name,\n file.type,\n file.size,\n width,\n height,\n folder,\n r2Key,\n publicUrl,\n thumbnailUrl,\n user!.userId,\n Math.floor(Date.now() / 1000)\n ).run()\n\n uploadResults.push({\n id: fileId,\n filename: filename,\n originalName: file.name,\n mimeType: file.type,\n size: file.size,\n publicUrl: publicUrl\n })\n } catch (error) {\n errors.push({\n filename: file.name,\n error: 'Upload failed: ' + (error instanceof Error ? error.message : 'Unknown error')\n })\n }\n }\n\n // TODO: Cache invalidation removed during migration\n\n // Fetch updated media list to include in response\n let mediaGridHTML = ''\n if (uploadResults.length > 0) {\n try {\n const folderEntry = formData.get('folder')\n const folder = typeof folderEntry === 'string' ? folderEntry : 'uploads'\n const query = 'SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT 24'\n const stmt = c.env.DB.prepare(query)\n const { results } = await stmt.all()\n\n const mediaFiles = results.map((row: any) => ({\n id: row.id,\n filename: row.filename,\n original_name: row.original_name,\n mime_type: row.mime_type,\n size: row.size,\n public_url: `/files/${row.r2_key}`,\n thumbnail_url: row.mime_type.startsWith('image/') ? `/files/${row.r2_key}` : undefined,\n tags: row.tags ? JSON.parse(row.tags) : [],\n uploaded_at: row.uploaded_at,\n fileSize: formatFileSize(row.size),\n uploadedAt: new Date(row.uploaded_at).toLocaleDateString(),\n isImage: row.mime_type.startsWith('image/'),\n isVideo: row.mime_type.startsWith('video/'),\n isDocument: !row.mime_type.startsWith('image/') && !row.mime_type.startsWith('video/')\n }))\n\n mediaGridHTML = mediaFiles.map(file => renderMediaFileCard(file, 'grid', true)).join('')\n } catch (error) {\n console.error('Error fetching updated media list:', error)\n }\n }\n\n // Return HTMX response with results\n return c.html(html`\n ${uploadResults.length > 0 ? html`\n
\n Successfully uploaded ${uploadResults.length} file${uploadResults.length > 1 ? 's' : ''}\n
\n ` : ''}\n\n ${errors.length > 0 ? html`\n
\n

Upload errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n ${uploadResults.length > 0 ? html`\n \n ` : ''}\n `)\n } catch (error) {\n console.error('Upload error:', error)\n return c.html(html`\n
\n Upload failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Serve files from R2 storage\nadminMediaRoutes.get('/file/*', async (c) => {\n try {\n const r2Key = c.req.path.replace('/admin/media/file/', '')\n \n if (!r2Key) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(r2Key)\n \n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n \n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n})\n\n// Update media file metadata (HTMX compatible)\nadminMediaRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n const formData = await c.req.formData()\n \n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n \n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow updates by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Extract form data\n const alt = formData.get('alt') as string || null\n const caption = formData.get('caption') as string || null\n const tagsString = formData.get('tags') as string || ''\n const tags = tagsString ? tagsString.split(',').map(tag => tag.trim()).filter(tag => tag) : []\n\n // Update database\n const updateStmt = c.env.DB.prepare(`\n UPDATE media \n SET alt = ?, caption = ?, tags = ?, updated_at = ?\n WHERE id = ?\n `)\n await updateStmt.bind(\n alt,\n caption,\n JSON.stringify(tags),\n Math.floor(Date.now() / 1000),\n fileId\n ).run()\n\n // TODO: Cache invalidation removed during migration\n\n return c.html(html`\n
\n File updated successfully\n
\n \n `)\n } catch (error) {\n console.error('Update error:', error)\n return c.html(html`\n
\n Update failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Cleanup unused media files (HTMX compatible)\nadminMediaRoutes.delete('/cleanup', requireRole('admin'), async (c) => {\n try {\n const db = c.env.DB\n\n // Find all media files\n const allMediaStmt = db.prepare('SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL')\n const { results: allMedia } = await allMediaStmt.all<{ id: string; r2_key: string; filename: string }>()\n\n // Find media files referenced in content\n // Content can reference media in various JSON fields like data, hero_image, etc.\n const contentStmt = db.prepare('SELECT data FROM content')\n const { results: contentRecords } = await contentStmt.all<{ data: unknown }>()\n\n // Extract all media URLs from content\n const referencedUrls = new Set()\n for (const record of contentRecords || []) {\n if (record.data) {\n const dataStr = typeof record.data === 'string' ? record.data : JSON.stringify(record.data)\n // Find all /files/ URLs in the content\n const urlMatches = dataStr.matchAll(/\\/files\\/([^\\s\"',]+)/g)\n for (const match of urlMatches) {\n referencedUrls.add(match[1]!)\n }\n }\n }\n\n // Find unreferenced media files\n const mediaRows = allMedia || []\n const unusedFiles = mediaRows.filter((file) => !referencedUrls.has(file.r2_key))\n\n if (unusedFiles.length === 0) {\n return c.html(html`\n
\n No unused media files found. All files are referenced in content.\n
\n \n `)\n }\n\n // Delete unused files from R2 and database\n let deletedCount = 0\n const errors = []\n\n for (const file of unusedFiles) {\n try {\n // Delete from R2\n await c.env.MEDIA_BUCKET.delete(file.r2_key)\n\n // Soft delete in database\n const deleteStmt = db.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), file.id).run()\n\n deletedCount++\n } catch (error) {\n console.error(`Failed to delete ${file.filename}:`, error)\n errors.push({\n filename: file.filename,\n error: error instanceof Error ? error.message : 'Unknown error'\n })\n }\n }\n\n // Return success response\n return c.html(html`\n
\n Successfully cleaned up ${deletedCount} unused media file${deletedCount !== 1 ? 's' : ''}.\n ${errors.length > 0 ? html`\n
Failed to delete ${errors.length} file${errors.length !== 1 ? 's' : ''}.\n ` : ''}\n
\n\n ${errors.length > 0 ? html`\n
\n

Cleanup errors:

\n
    \n ${errors.map(error => html`\n
  • ${error.filename}: ${error.error}
  • \n `)}\n
\n
\n ` : ''}\n\n \n `)\n } catch (error) {\n console.error('Cleanup error:', error)\n return c.html(html`\n
\n Cleanup failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Delete media file (HTMX compatible)\nadminMediaRoutes.delete('/:id', async (c) => {\n try {\n const user = c.get('user')\n const fileId = c.req.param('id')\n\n // Get file record\n const stmt = c.env.DB.prepare('SELECT * FROM media WHERE id = ? AND deleted_at IS NULL')\n const fileRecord = await stmt.bind(fileId).first() as any\n\n if (!fileRecord) {\n return c.html(html`\n
\n File not found\n
\n `)\n }\n\n // Check permissions (only allow deletion by uploader or admin)\n if (fileRecord.uploaded_by !== user!.userId && user!.role !== 'admin') {\n return c.html(html`\n
\n Permission denied\n
\n `)\n }\n\n // Delete from R2\n try {\n await c.env.MEDIA_BUCKET.delete(fileRecord.r2_key)\n } catch (error) {\n console.warn('Failed to delete from R2:', error)\n // Continue with database deletion even if R2 deletion fails\n }\n\n // Soft delete in database\n const deleteStmt = c.env.DB.prepare('UPDATE media SET deleted_at = ? WHERE id = ?')\n await deleteStmt.bind(Math.floor(Date.now() / 1000), fileId).run()\n\n // TODO: Cache invalidation removed during migration\n\n // Return HTMX response that redirects to media library\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Delete error:', error)\n return c.html(html`\n
\n Delete failed: ${error instanceof Error ? error.message : 'Unknown error'}\n
\n `)\n }\n})\n\n// Helper function to extract image dimensions\nasync function getImageDimensions(arrayBuffer: ArrayBuffer): Promise<{ width: number; height: number }> {\n const uint8Array = new Uint8Array(arrayBuffer)\n \n // Check for JPEG\n if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8) {\n return getJPEGDimensions(uint8Array)\n }\n \n // Check for PNG\n if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4E && uint8Array[3] === 0x47) {\n return getPNGDimensions(uint8Array)\n }\n \n // Default fallback\n return { width: 0, height: 0 }\n}\n\nfunction getJPEGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n let i = 2\n while (i < uint8Array.length - 8) {\n if (uint8Array[i] === 0xFF && uint8Array[i + 1] === 0xC0) {\n return {\n height: (uint8Array[i + 5]! << 8) | uint8Array[i + 6]!,\n width: (uint8Array[i + 7]! << 8) | uint8Array[i + 8]!\n }\n }\n const segmentLength = (uint8Array[i + 2]! << 8) | uint8Array[i + 3]!\n i += 2 + segmentLength\n }\n return { width: 0, height: 0 }\n}\n\nfunction getPNGDimensions(uint8Array: Uint8Array): { width: number; height: number } {\n if (uint8Array.length < 24) {\n return { width: 0, height: 0 }\n }\n return {\n width: (uint8Array[16]! << 24) | (uint8Array[17]! << 16) | (uint8Array[18]! << 8) | uint8Array[19]!,\n height: (uint8Array[20]! << 24) | (uint8Array[21]! << 16) | (uint8Array[22]! << 8) | uint8Array[23]!\n }\n}\n\n// Helper function to generate media item HTML\nfunction generateMediaItemHTML(file: any): string {\n const isImage = file.isImage\n const isVideo = file.isVideo\n \n return `\n
\n
\n ${isImage ? `\n \"${file.alt\n ` : isVideo ? `\n \n ` : `\n
\n
\n \n \n \n ${file.filename.split('.').pop()?.toUpperCase()}\n
\n
\n `}\n \n
\n
\n \n \n
\n
\n
\n \n
\n

\n ${file.original_name}\n

\n
\n ${file.fileSize}\n ${file.uploadedAt}\n
\n ${file.tags.length > 0 ? `\n
\n ${file.tags.slice(0, 2).map((tag: string) => `\n \n ${tag}\n \n `).join('')}\n ${file.tags.length > 2 ? `+${file.tags.length - 2}` : ''}\n
\n ` : ''}\n
\n
\n `\n}\n\n// Helper function to format file size\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n\nexport { adminMediaRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface Plugin {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error' | 'uninstalled'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n}\n\nexport interface PluginsListPageData {\n plugins: Plugin[]\n stats?: {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderPluginsListPage(data: PluginsListPageData): string {\n const categories = [\n { value: 'content', label: 'Content Management' },\n { value: 'media', label: 'Media' },\n { value: 'editor', label: 'Editors' },\n { value: 'seo', label: 'SEO & Analytics' },\n { value: 'security', label: 'Security' },\n { value: 'utilities', label: 'Utilities' },\n { value: 'system', label: 'System' },\n { value: 'development', label: 'Development' },\n { value: 'demo', label: 'Demo' }\n ];\n\n const statuses = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'uninstalled', label: 'Available to Install' },\n { value: 'error', label: 'Error' }\n ];\n\n // Calculate counts\n const categoryCounts: Record = {};\n categories.forEach(cat => {\n categoryCounts[cat.value] = data.plugins.filter(p => p.category === cat.value).length;\n });\n\n // Sort categories by count (descending)\n categories.sort((a, b) => (categoryCounts[b.value] || 0) - (categoryCounts[a.value] || 0));\n\n const statusCounts: Record = {};\n statuses.forEach(status => {\n statusCounts[status.value] = data.plugins.filter(p => p.status === status.value).length;\n });\n\n // Sort statuses by count (descending)\n statuses.sort((a, b) => (statusCounts[b.value] || 0) - (statusCounts[a.value] || 0));\n\n const pageContent = `\n
\n \n
\n
\n

Plugins

\n

Manage and extend functionality with plugins

\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n
\n

\n Experimental Feature\n

\n
\n

\n Plugin management is currently under active development. While functional, some features may change or have limitations.\n Please report any issues you encounter on our Discord community.\n

\n
\n
\n
\n
\n\n
\n \n \n\n \n
\n \n
\n
\n
Total
\n
${data.stats?.total || 0}
\n
\n
\n
Active
\n
${data.stats?.active || 0}
\n
\n
\n
Available
\n
${data.stats?.uninstalled || 0}
\n
\n
\n
Errors
\n
${data.stats?.errors || 0}
\n
\n
\n\n \n
\n
\n
\n \n \n \n
\n \n
\n\n
\n \n\n \n \n \n \n \n
\n
\n\n \n
\n ${data.plugins.map(plugin => renderPluginCard(plugin)).join('')}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'uninstall-plugin-confirm',\n title: 'Uninstall Plugin',\n message: 'Are you sure you want to uninstall this plugin? This action cannot be undone.',\n confirmText: 'Uninstall',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performUninstallPlugin()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Plugins',\n pageTitle: 'Plugin Management',\n currentPath: '/admin/plugins',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderPluginCard(plugin: Plugin): string {\n const statusColors = {\n active: 'bg-emerald-50 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-400 ring-emerald-600/20',\n inactive: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400 ring-zinc-600/20',\n error: 'bg-red-50 dark:bg-red-500/10 text-red-700 dark:text-red-400 ring-red-600/20',\n uninstalled: 'bg-zinc-50 dark:bg-zinc-500/10 text-zinc-600 dark:text-zinc-500 ring-zinc-600/20'\n }\n\n const statusIcons = {\n active: '
',\n inactive: '
',\n error: '
',\n uninstalled: '
'\n }\n\n // Core system plugins that cannot be deactivated\n const criticalCorePlugins = ['core-auth', 'core-media']\n const canToggle = !criticalCorePlugins.includes(plugin.id)\n\n let actionButton = ''\n if (plugin.status === 'uninstalled') {\n actionButton = ``\n } else {\n const isActive = plugin.status === 'active';\n const action = isActive ? 'deactivate' : 'activate';\n // Use bg-emerald-600 for active, bg-zinc-200 (light) / bg-zinc-700 (dark) for inactive\n const bgClass = isActive ? 'bg-emerald-600' : 'bg-zinc-200 dark:bg-zinc-700';\n const translateClass = isActive ? 'translate-x-5' : 'translate-x-0';\n \n if (canToggle) {\n actionButton = `\n \n `\n } else {\n // Critical core plugins cannot be toggled\n actionButton = `\n
\n \n
\n `\n }\n }\n\n return `\n
\n
\n
\n
\n ${plugin.icon || getDefaultPluginIcon(plugin.category)}\n
\n
\n
\n

${plugin.displayName}

\n \n ${statusIcons[plugin.status]}${plugin.status.charAt(0).toUpperCase() + plugin.status.slice(1)}\n \n
\n

v${plugin.version} • ${plugin.author}

\n
\n
\n \n
\n ${!plugin.isCore && plugin.status !== 'uninstalled' ? `\n \n ` : ''}\n
\n
\n\n

${plugin.description}

\n\n
\n \n ${plugin.category}\n \n ${plugin.isCore ? 'Core' : ''}\n \n ${plugin.dependencies && plugin.dependencies.map(dep => `\n \n ${dep}\n \n `).join('') || ''}\n
\n\n
\n
\n ${actionButton}\n
\n
\n
\n `\n}\n\nfunction getDefaultPluginIcon(category: string): string {\n const iconColor = 'text-zinc-600 dark:text-zinc-400'\n\n const icons: Record = {\n 'content': `\n \n \n \n `,\n 'media': `\n \n \n \n `,\n 'seo': `\n \n \n \n `,\n 'analytics': `\n \n \n \n `,\n 'ecommerce': `\n \n \n \n `,\n 'email': `\n \n \n \n `,\n 'workflow': `\n \n \n \n `,\n 'security': `\n \n \n \n `,\n 'social': `\n \n \n \n `,\n 'utility': `\n \n \n \n \n `,\n }\n\n const iconKey = category.toLowerCase() as keyof typeof icons\n return icons[iconKey] || icons['utility'] || ''\n}\n\n// Mock data generator\nexport function generateMockPlugins(): Plugin[] {\n return [\n {\n id: '1',\n name: 'seo-optimizer',\n displayName: 'SEO Optimizer',\n description: 'Advanced SEO optimization tools including meta tag management, sitemap generation, and analytics integration. Boost your search engine rankings with automated optimizations.',\n version: '2.1.4',\n author: 'SonicJS Team',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 15420,\n rating: 4.8,\n lastUpdated: '2 days ago',\n dependencies: ['analytics-plugin'],\n permissions: ['read:content', 'write:meta'],\n isCore: true\n },\n {\n id: '2',\n name: 'image-optimizer',\n displayName: 'Image Optimizer',\n description: 'Automatically compress and optimize images on upload. Supports WebP conversion, lazy loading, and responsive image generation for better performance.',\n version: '1.5.2',\n author: 'MediaPro',\n status: 'active',\n category: 'media',\n icon: ``,\n downloadCount: 8930,\n rating: 4.6,\n lastUpdated: '1 week ago',\n dependencies: [],\n permissions: ['write:media', 'read:settings']\n },\n {\n id: '3',\n name: 'backup-manager',\n displayName: 'Backup Manager',\n description: 'Automated backup solution for content and media files. Schedule regular backups to cloud storage with encryption and restore capabilities.',\n version: '3.0.1',\n author: 'BackupCorp',\n status: 'inactive',\n category: 'utilities',\n icon: ``,\n downloadCount: 12450,\n rating: 4.9,\n lastUpdated: '3 days ago',\n dependencies: ['cloud-storage'],\n permissions: ['read:all', 'write:backups']\n },\n {\n id: '4',\n name: 'security-scanner',\n displayName: 'Security Scanner',\n description: 'Real-time security monitoring and vulnerability scanning. Detects malware, suspicious activities, and provides security recommendations.',\n version: '1.2.8',\n author: 'SecureWeb',\n status: 'error',\n category: 'security',\n icon: ``,\n downloadCount: 5680,\n rating: 4.3,\n lastUpdated: '5 days ago',\n dependencies: ['security-core'],\n permissions: ['read:logs', 'read:files', 'write:security']\n },\n {\n id: '5',\n name: 'social-share',\n displayName: 'Social Share',\n description: 'Easy social media sharing buttons and Open Graph meta tag generation. Supports all major social platforms with customizable styling.',\n version: '2.3.0',\n author: 'SocialPlus',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 22100,\n rating: 4.7,\n lastUpdated: '4 days ago',\n dependencies: [],\n permissions: ['read:content', 'write:meta']\n },\n {\n id: '6',\n name: 'analytics-pro',\n displayName: 'Analytics Pro',\n description: 'Advanced analytics dashboard with custom tracking events, conversion funnels, and detailed visitor insights. GDPR compliant with privacy controls.',\n version: '4.1.2',\n author: 'AnalyticsPro Inc',\n status: 'active',\n category: 'seo',\n icon: ``,\n downloadCount: 18750,\n rating: 4.9,\n lastUpdated: '1 day ago',\n dependencies: ['gdpr-compliance'],\n permissions: ['read:analytics', 'write:tracking', 'read:users']\n },\n {\n id: '7',\n name: 'form-builder',\n displayName: 'Advanced Form Builder',\n description: 'Drag-and-drop form builder with conditional logic, file uploads, payment integration, and email notifications. Perfect for contact forms and surveys.',\n version: '1.8.5',\n author: 'FormWorks',\n status: 'inactive',\n category: 'content',\n icon: ``,\n downloadCount: 9870,\n rating: 4.4,\n lastUpdated: '1 week ago',\n dependencies: ['email-service'],\n permissions: ['write:forms', 'read:submissions', 'send:emails']\n },\n {\n id: '8',\n name: 'cache-optimizer',\n displayName: 'Cache Optimizer',\n description: 'Intelligent caching system with Redis support, CDN integration, and automatic cache invalidation. Dramatically improves site performance.',\n version: '2.7.3',\n author: 'SpeedBoost',\n status: 'active',\n category: 'utilities',\n icon: ``,\n downloadCount: 13240,\n rating: 4.8,\n lastUpdated: '6 days ago',\n dependencies: ['redis-connector'],\n permissions: ['read:cache', 'write:cache', 'manage:cdn'],\n isCore: true\n },\n {\n id: '9',\n name: 'multilingual',\n displayName: 'Multilingual Support',\n description: 'Complete internationalization solution with automatic translation, language detection, and localized content management for global websites.',\n version: '3.2.1',\n author: 'GlobalWeb',\n status: 'active',\n category: 'content',\n icon: ``,\n downloadCount: 7650,\n rating: 4.5,\n lastUpdated: '2 weeks ago',\n dependencies: ['translation-api'],\n permissions: ['read:content', 'write:translations', 'manage:languages']\n }\n ]\n}\n","import type { AuthSettings } from '../../services/auth-validation'\n\nexport function renderAuthSettingsForm(settings: AuthSettings): string {\n const fields = settings.requiredFields\n const validation = settings.validation\n const registration = settings.registration\n\n return `\n
\n \n
\n

Registration Fields

\n

Configure which fields are required during user registration and their minimum lengths.

\n\n
\n ${Object.entries(fields).map(([fieldName, config]: [string, any]) => `\n
\n
\n
\n

${config.label}

\n

Field type: ${config.type}

\n
\n \n
\n\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n `).join('')}\n
\n
\n\n \n
\n

Password Requirements

\n

Additional password complexity requirements.

\n\n
\n
\n
\n \n

Password must contain at least one uppercase letter (A-Z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one lowercase letter (a-z)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one number (0-9)

\n
\n \n
\n\n
\n
\n \n

Password must contain at least one special character (!@#$%^&*)

\n
\n \n
\n
\n
\n\n \n
\n

Registration Settings

\n

General registration behavior.

\n\n
\n
\n
\n \n

Enable or disable public user registration

\n
\n \n
\n\n
\n
\n \n

Users must verify their email before accessing the system

\n
\n \n
\n\n
\n \n \n \n \n \n \n

Role assigned to new users upon registration

\n
\n
\n
\n\n \n
\n

Validation Settings

\n

Additional validation rules.

\n\n
\n
\n
\n \n

Validate that email addresses are in correct format

\n
\n \n
\n\n
\n
\n \n

Ensure usernames are unique across all users

\n
\n \n
\n
\n
\n
\n `\n}\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAuthSettingsForm } from '../components/auth-settings-form.template'\nimport type { AuthSettings } from '../../services/auth-validation'\n\n/**\n * Escape HTML attribute values to prevent XSS\n */\nfunction escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport interface PluginSettings {\n [key: string]: any\n}\n\nexport interface PluginActivity {\n id: string\n action: string\n message: string\n timestamp: number\n user?: string\n}\n\nexport interface PluginSettingsPageData {\n plugin: {\n id: string\n name: string\n displayName: string\n description: string\n version: string\n author: string\n status: 'active' | 'inactive' | 'error'\n category: string\n icon: string\n downloadCount?: number\n rating?: number\n lastUpdated: string\n dependencies?: string[]\n permissions?: string[]\n isCore?: boolean\n settings?: PluginSettings\n }\n activity?: PluginActivity[]\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderPluginSettingsPage(data: PluginSettingsPageData): string {\n const { plugin, activity = [], user } = data\n \n const pageContent = `\n
\n \n
\n
\n

Plugin Settings

\n

\n ${plugin.description}\n

\n
\n \n
\n\n \n
\n
\n
\n
\n ${plugin.icon || plugin.displayName.charAt(0).toUpperCase()}\n
\n
\n

${plugin.displayName}

\n
\n v${plugin.version}\n by ${plugin.author}\n ${plugin.category}\n ${plugin.downloadCount ? `${plugin.downloadCount.toLocaleString()} downloads` : ''}\n ${plugin.rating ? `★ ${plugin.rating}` : ''}\n
\n
\n
\n\n
\n ${renderStatusBadge(plugin.status)}\n ${renderToggleButton(plugin)}\n
\n
\n
\n\n \n
\n \n
\n\n \n
\n \n
\n ${renderSettingsTab(plugin)}\n
\n\n \n
\n ${renderActivityTab(activity)}\n
\n\n \n
\n ${renderInformationTab(plugin)}\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${plugin.displayName} Settings`,\n pageTitle: `${plugin.displayName} Settings`,\n currentPath: `/admin/plugins/${plugin.id}`,\n user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction renderStatusBadge(status: string): string {\n const statusColors: Record = {\n active: 'bg-green-900/50 text-green-300 border-green-600/30',\n inactive: 'bg-gray-800/50 text-gray-400 border-gray-600/30',\n error: 'bg-red-900/50 text-red-300 border-red-600/30'\n }\n\n const statusIcons: Record = {\n active: '
',\n inactive: '
',\n error: '
'\n }\n\n return `\n \n ${statusIcons[status] || statusIcons.inactive}${status.charAt(0).toUpperCase() + status.slice(1)}\n \n `\n}\n\nfunction renderToggleButton(plugin: any): string {\n if (plugin.isCore) {\n return 'Core Plugin'\n }\n\n return plugin.status === 'active' \n ? ``\n : ``\n}\n\nfunction renderSettingsTab(plugin: any): string {\n const settings = plugin.settings || {}\n const pluginId = plugin.id || plugin.name\n\n // Check for custom settings component first\n const customRenderer = pluginSettingsComponents[pluginId]\n if (customRenderer) {\n return `\n
\n ${customRenderer(plugin, settings)}\n\n
\n \n Save Settings\n \n
\n
\n `\n }\n\n const isSeedDataPlugin = plugin.id === 'seed-data' || plugin.name === 'seed-data'\n const isAuthPlugin = plugin.id === 'core-auth' || plugin.name === 'core-auth'\n const isTurnstilePlugin = plugin.id === 'turnstile' || plugin.name === 'turnstile'\n\n return `\n ${isSeedDataPlugin ? `\n
\n
\n
\n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n
\n \n \n \n \n Open Seed Data Tool\n \n
\n
\n ` : ''}\n\n
\n ${isAuthPlugin ? `\n

Authentication Settings

\n

Configure user registration fields and validation rules.

\n ` : isTurnstilePlugin ? `\n

Cloudflare Turnstile Settings

\n

Configure CAPTCHA-free bot protection for your forms.

\n ` : `\n

Plugin Settings

\n `}\n\n
\n ${isAuthPlugin && Object.keys(settings).length > 0\n ? renderAuthSettingsForm(settings as AuthSettings)\n : isTurnstilePlugin && Object.keys(settings).length > 0\n ? renderTurnstileSettingsForm(settings)\n : Object.keys(settings).length > 0\n ? renderSettingsFields(settings)\n : renderNoSettings(plugin)\n }\n\n ${Object.keys(settings).length > 0 ? `\n
\n \n Save Settings\n \n
\n ` : ''}\n
\n
\n `\n}\n\nfunction renderSettingsFields(settings: PluginSettings): string {\n return Object.entries(settings).map(([key, value]) => {\n const fieldId = `setting_${key}`\n const displayName = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase())\n \n if (typeof value === 'boolean') {\n return `\n
\n
\n \n

Enable or disable this feature

\n
\n \n
\n `\n } else if (typeof value === 'number') {\n return `\n
\n \n \n
\n `\n } else {\n return `\n
\n \n \n
\n `\n }\n }).join('')\n}\n\nfunction renderTurnstileSettingsForm(settings: any): string {\n const inputClass = \"backdrop-blur-sm bg-white/10 border border-white/20 rounded-lg px-3 py-2 text-white placeholder-gray-300 focus:border-blue-400 focus:outline-none transition-colors w-full\"\n const selectClass = \"backdrop-blur-sm bg-zinc-800 border border-white/20 rounded-lg px-3 py-2 text-white focus:border-blue-400 focus:outline-none transition-colors w-full [&>option]:bg-zinc-800 [&>option]:text-white\"\n \n return `\n \n
\n
\n \n

Enable or disable Turnstile verification globally

\n
\n \n
\n\n \n
\n \n \n

Your Cloudflare Turnstile site key (public)

\n
\n\n \n
\n \n \n

Your Cloudflare Turnstile secret key (private)

\n
\n\n \n
\n \n \n

Visual appearance of the Turnstile widget

\n
\n\n \n
\n \n \n

Size of the Turnstile challenge widget

\n
\n\n \n
\n \n \n

Managed: Shows challenge only when needed. Non-Interactive: Always shows but doesn't require interaction. Invisible: Runs in background without UI.

\n
\n\n \n
\n \n \n

Controls when Turnstile verification occurs. Always: Verifies immediately (pre-clearance). Execute: Verifies on form submit. Interaction Only: Only after user interaction.

\n
\n `\n}\n\nfunction renderNoSettings(plugin: any): string {\n // Special handling for seed-data plugin\n if (plugin.id === 'seed-data' || plugin.name === 'seed-data') {\n return `\n
\n \n \n \n

Seed Data Generator

\n

Generate realistic example data for testing and development.

\n \n \n \n \n Generate Seed Data\n \n
\n `\n }\n\n return `\n
\n \n \n \n \n

No Settings Available

\n

This plugin doesn't have any configurable settings.

\n
\n `\n}\n\nfunction renderActivityTab(activity: PluginActivity[]): string {\n return `\n
\n

Activity Log

\n \n ${activity.length > 0 ? `\n
\n ${activity.map(item => `\n
\n
\n
\n
\n ${item.action}\n ${formatTimestamp(item.timestamp)}\n
\n

${item.message}

\n ${item.user ? `

by ${item.user}

` : ''}\n
\n
\n `).join('')}\n
\n ` : `\n
\n \n \n \n

No Activity

\n

No recent activity for this plugin.

\n
\n `}\n
\n `\n}\n\nfunction renderInformationTab(plugin: any): string {\n return `\n
\n \n
\n

Plugin Details

\n
\n
\n Name:\n ${plugin.displayName}\n
\n
\n Version:\n ${plugin.version}\n
\n
\n Author:\n ${plugin.author}\n
\n
\n Category:\n ${plugin.category}\n
\n
\n Status:\n ${plugin.status}\n
\n
\n Last Updated:\n ${plugin.lastUpdated}\n
\n
\n
\n\n \n
\n

Dependencies & Permissions

\n \n ${plugin.dependencies && plugin.dependencies.length > 0 ? `\n
\n

Dependencies:

\n
\n ${plugin.dependencies.map((dep: string) => `\n
${dep}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${plugin.permissions && plugin.permissions.length > 0 ? `\n
\n

Permissions:

\n
\n ${plugin.permissions.map((perm: string) => `\n
${perm}
\n `).join('')}\n
\n
\n ` : ''}\n\n ${(!plugin.dependencies || plugin.dependencies.length === 0) && (!plugin.permissions || plugin.permissions.length === 0) ? `\n

No dependencies or special permissions required.

\n ` : ''}\n
\n
\n `\n}\n\nfunction formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp * 1000)\n return date.toLocaleString()\n}\n\n// ==================== Plugin Settings Components ====================\n// These render just the settings content, embedded within the shared layout\n\n/**\n * Registry of custom plugin settings components\n * Plugins with custom settings UI register their render functions here\n */\ntype PluginSettingsRenderer = (plugin: any, settings: PluginSettings) => string\n\nconst pluginSettingsComponents: Record = {\n 'otp-login': renderOTPLoginSettingsContent,\n 'email': renderEmailSettingsContent,\n}\n\n/**\n * OTP Login plugin settings content\n */\nfunction renderOTPLoginSettingsContent(plugin: any, settings: PluginSettings): string {\n const siteName = settings.siteName || 'SonicJS'\n const emailConfigured = settings._emailConfigured || false\n const codeLength = settings.codeLength || 6\n const codeExpiryMinutes = settings.codeExpiryMinutes || 10\n const maxAttempts = settings.maxAttempts || 3\n const rateLimitPerHour = settings.rateLimitPerHour || 5\n const allowNewUserRegistration = settings.allowNewUserRegistration || false\n const logoUrl = settings.logoUrl || ''\n const logoWidth = Number(settings.logoWidth) || 150\n const logoBorderWidth = Number(settings.logoBorderWidth) || 0\n const logoBorderColor = settings.logoBorderColor || '#ffffff'\n const loginUrl = settings.loginUrl || ''\n const loginButtonText = settings.loginButtonText || ''\n const previewButtonText = loginButtonText.trim() || `Sign in to ${siteName}`\n const previewLogoBorder = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${escapeHtmlAttr(logoBorderColor)}; border-radius: 8px;`\n : ''\n\n return `\n
\n \n
\n

\n 📧 Test OTP Email\n

\n\n ${!emailConfigured ? `\n
\n

\n ⚠️ Email not configured.\n Configure the Email plugin\n to send real emails. Dev mode will show codes in the response.\n

\n
\n ` : `\n
\n

\n ✅ Email configured. Test emails will be sent via Resend.\n

\n
\n `}\n\n
\n
\n \n \n
\n\n \n Send Test Code\n \n \n \n \n \n \n \n \n\n
\n\n \n
\n

Verify Code

\n
\n
\n \n \n
\n \n Verify Code\n \n \n
\n
\n
\n\n \n
\n

Code Settings

\n\n
\n
\n \n \n

Optional. Displayed at the top of the OTP email.

\n
\n\n
\n
\n \n \n

Max width of the logo (20-600).

\n
\n\n
\n \n \n

0 disables the border.

\n
\n\n
\n \n
\n \n \n
\n

Hex, rgb(), or named color.

\n
\n
\n\n
\n \n \n

Optional. If set, a \"Sign in\" button is added to the email.

\n
\n\n
\n \n \n

Optional. Defaults to \"Sign in to ${siteName}\".

\n
\n\n
\n
\n \n \n

Number of digits (4-8)

\n
\n\n
\n \n \n

How long codes remain valid

\n
\n\n
\n \n \n

Max verification attempts

\n
\n\n
\n \n \n

Max requests per email per hour

\n
\n
\n\n
\n \n \n
\n
\n
\n\n \n
\n

\n 👁️ Email Preview\n

\n

\n This is how the OTP email will appear to users. The site name \"${siteName}\" is configured in\n General Settings.\n

\n\n
\n
\n ${logoUrl ? `\"Logo\"` : ''}\n

Your Login Code

\n

Enter this code to sign in to ${siteName}

\n
\n\n
\n
\n
\n 123456\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${codeExpiryMinutes} minutes\n

\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${siteName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n
\n
\n\n \n
\n

🔢 Features

\n
    \n
  • ✓ Passwordless authentication
  • \n
  • ✓ Secure random code generation
  • \n
  • ✓ Rate limiting protection
  • \n
  • ✓ Brute force prevention
  • \n
  • ✓ Mobile-friendly UX
  • \n
\n
\n\n \n \n
\n\n \n `\n}\n\n/**\n * Email plugin settings content\n */\nfunction renderEmailSettingsContent(plugin: any, settings: PluginSettings): string {\n const apiKey = settings.apiKey || ''\n const fromEmail = settings.fromEmail || ''\n const fromName = settings.fromName || ''\n const replyTo = settings.replyTo || ''\n const logoUrl = settings.logoUrl || ''\n\n return `\n
\n \n
\n

Resend Configuration

\n\n
\n \n
\n \n \n

\n Get your API key from resend.com/api-keys\n

\n
\n\n \n
\n \n \n

Must be a verified domain in Resend

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n
\n\n \n
\n \n \n

Logo to display in email templates

\n
\n
\n
\n\n \n
\n

Send Test Email

\n
\n \n \n Send Test\n \n
\n
\n
\n\n \n
\n

📧 Email Templates Included

\n
    \n
  • ✓ Registration confirmation
  • \n
  • ✓ Email verification
  • \n
  • ✓ Password reset
  • \n
  • ✓ One-time code (2FA)
  • \n
\n

\n Templates are code-based and can be customized by editing the plugin files.\n

\n
\n
\n\n \n `\n}\n\n/**\n * Check if a plugin has a custom settings component\n */\nexport function hasCustomSettingsComponent(pluginId: string): boolean {\n return pluginId in pluginSettingsComponents\n}\n\n/**\n * Get the custom settings component for a plugin\n */\nexport function getCustomSettingsComponent(pluginId: string): PluginSettingsRenderer | undefined {\n return pluginSettingsComponents[pluginId]\n}","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderPluginsListPage, PluginsListPageData, Plugin } from '../templates/pages/admin-plugins-list.template'\nimport { renderPluginSettingsPage, PluginSettingsPageData } from '../templates/pages/admin-plugin-settings.template'\nimport { SettingsService } from '../services/settings'\nimport { PluginService } from '../services'\nimport { PLUGIN_REGISTRY, findPluginByCodeName } from '../plugins/manifest-registry'\nimport type { Bindings, Variables } from '../app'\n\nconst adminPluginRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminPluginRoutes.use('*', requireAuth())\n\n// Build available plugins list from the auto-generated registry.\n// To add a new plugin to this list, create a manifest.json in the plugin directory\n// and run: node packages/scripts/generate-plugin-registry.mjs\nconst AVAILABLE_PLUGINS = Object.values(PLUGIN_REGISTRY).map(p => ({\n id: p.id,\n name: p.codeName,\n display_name: p.displayName,\n description: p.description,\n version: p.version,\n author: p.author,\n category: p.category,\n icon: p.iconEmoji,\n permissions: p.permissions,\n dependencies: p.dependencies,\n is_core: p.is_core\n}))\n\n// Plugin list page\nadminPluginRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n // TODO: Fix permission system\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n\n const pluginService = new PluginService(db)\n\n // Get all installed plugins with error handling\n let installedPlugins: any[] = []\n let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 }\n\n try {\n installedPlugins = await pluginService.getAllPlugins()\n stats = await pluginService.getPluginStats()\n } catch (error) {\n console.error('Error loading plugins:', error)\n // Continue with empty data\n }\n\n // Get list of installed plugin IDs\n const installedPluginIds = new Set(installedPlugins.map(p => p.id))\n\n // Find uninstalled plugins\n const uninstalledPlugins = AVAILABLE_PLUGINS.filter(p => !installedPluginIds.has(p.id))\n\n // Map installed plugins to template format\n const templatePlugins: Plugin[] = installedPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: p.status,\n category: p.category,\n icon: p.icon,\n downloadCount: p.download_count,\n rating: p.rating,\n lastUpdated: formatLastUpdated(p.last_updated),\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Add uninstalled plugins to the list\n const uninstalledTemplatePlugins: Plugin[] = uninstalledPlugins.map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.display_name,\n description: p.description,\n version: p.version,\n author: p.author,\n status: 'uninstalled' as const,\n category: p.category,\n icon: p.icon,\n downloadCount: 0,\n rating: 0,\n lastUpdated: 'Not installed',\n dependencies: p.dependencies,\n permissions: p.permissions,\n isCore: p.is_core\n }))\n\n // Combine installed and uninstalled plugins\n const allPlugins = [...templatePlugins, ...uninstalledTemplatePlugins]\n\n // Update stats with uninstalled count\n stats.uninstalled = uninstalledPlugins.length\n stats.total = installedPlugins.length + uninstalledPlugins.length\n\n const pageData: PluginsListPageData = {\n plugins: allPlugins,\n stats,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n },\n version: c.get('appVersion')\n }\n\n return c.html(renderPluginsListPage(pageData))\n } catch (error) {\n console.error('Error loading plugins page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Get plugin settings page\nadminPluginRoutes.get('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Check authorization first\n if (user?.role !== 'admin') {\n return c.redirect('/admin/plugins')\n }\n\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin(pluginId)\n\n if (!plugin) {\n return c.text('Plugin not found', 404)\n }\n\n // Get activity log\n const activity = await pluginService.getPluginActivity(pluginId, 20)\n\n // Load additional context for plugins with custom settings components\n let enrichedSettings = plugin.settings || {}\n\n // For OTP Login plugin, add site name and email config status\n if (pluginId === 'otp-login') {\n // Get site name from general settings via SettingsService\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName || 'SonicJS'\n\n // Check if email plugin is configured\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n let emailConfigured = false\n if (emailPlugin?.settings) {\n try {\n const emailSettings = JSON.parse(emailPlugin.settings)\n emailConfigured = !!(emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName)\n } catch (e) { /* ignore */ }\n }\n\n enrichedSettings = {\n ...enrichedSettings,\n siteName,\n _emailConfigured: emailConfigured\n }\n }\n\n // Map plugin data to template format\n const templatePlugin = {\n id: plugin.id,\n name: plugin.name,\n displayName: plugin.display_name,\n description: plugin.description,\n version: plugin.version,\n author: plugin.author,\n status: plugin.status,\n category: plugin.category,\n icon: plugin.icon,\n downloadCount: plugin.download_count,\n rating: plugin.rating,\n lastUpdated: formatLastUpdated(plugin.last_updated),\n dependencies: plugin.dependencies,\n permissions: plugin.permissions,\n isCore: plugin.is_core,\n settings: enrichedSettings\n }\n\n // Map activity data\n const templateActivity = (activity || []).map(item => ({\n id: item.id,\n action: item.action,\n message: item.message,\n timestamp: item.timestamp,\n user: item.user_email\n }))\n\n const pageData: PluginSettingsPageData = {\n plugin: templatePlugin,\n activity: templateActivity,\n user: {\n name: user?.email || 'User',\n email: user?.email || '',\n role: user?.role || 'user'\n }\n }\n\n return c.html(renderPluginSettingsPage(pageData))\n } catch (error) {\n console.error('Error getting plugin settings page:', error)\n return c.text('Internal server error', 500)\n }\n})\n\n// Activate plugin\nadminPluginRoutes.post('/:id/activate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.activatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error activating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to activate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Deactivate plugin\nadminPluginRoutes.post('/:id/deactivate', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.deactivatePlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deactivating plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to deactivate plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Generic install handler - uses the auto-generated plugin registry.\n// No per-plugin switch/case needed. Adding a manifest.json is enough.\nadminPluginRoutes.post('/install', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const body = await c.req.json()\n const pluginService = new PluginService(db)\n\n // Look up plugin in registry by codeName (what the frontend sends as body.name)\n // or by id\n const registryEntry = findPluginByCodeName(body.name)\n || PLUGIN_REGISTRY[body.name]\n || PLUGIN_REGISTRY[body.id]\n\n if (!registryEntry) {\n return c.json({ error: 'Plugin not found in registry' }, 404)\n }\n\n const plugin = await pluginService.installPlugin({\n id: registryEntry.id,\n name: registryEntry.codeName,\n display_name: registryEntry.displayName,\n description: registryEntry.description,\n version: registryEntry.version,\n author: registryEntry.author,\n category: registryEntry.category,\n icon: registryEntry.iconEmoji,\n permissions: registryEntry.permissions,\n dependencies: registryEntry.dependencies,\n is_core: registryEntry.is_core,\n settings: registryEntry.defaultSettings,\n })\n\n return c.json({ success: true, plugin })\n } catch (error) {\n console.error('Error installing plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to install plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Uninstall plugin\nadminPluginRoutes.post('/:id/uninstall', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const pluginService = new PluginService(db)\n await pluginService.uninstallPlugin(pluginId)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error uninstalling plugin:', error)\n const message = error instanceof Error ? error.message : 'Failed to uninstall plugin'\n return c.json({ error: message }, 400)\n }\n})\n\n// Update plugin settings\nadminPluginRoutes.post('/:id/settings', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const pluginId = c.req.param('id')\n\n // Temporarily skip permission check for admin users\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n\n const settings = await c.req.json()\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings(pluginId, settings)\n\n // Clear auth validation cache if updating core-auth plugin\n if (pluginId === 'core-auth') {\n try {\n const cacheKv = c.env.CACHE_KV\n if (cacheKv) {\n await cacheKv.delete('auth:settings')\n await cacheKv.delete('auth:registration-enabled')\n console.log('[AuthSettings] Cache cleared after updating authentication settings')\n }\n } catch (cacheError) {\n console.error('[AuthSettings] Failed to clear cache:', cacheError)\n }\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating plugin settings:', error)\n const message = error instanceof Error ? error.message : 'Failed to update settings'\n return c.json({ error: message }, 400)\n }\n})\n\n// Helper function to format last updated time\nfunction formatLastUpdated(timestamp: number): string {\n const now = Date.now() / 1000\n const diff = now - timestamp\n\n if (diff < 60) return 'just now'\n if (diff < 3600) return `${Math.floor(diff / 60)} minutes ago`\n if (diff < 86400) return `${Math.floor(diff / 3600)} hours ago`\n if (diff < 604800) return `${Math.floor(diff / 86400)} days ago`\n if (diff < 2592000) return `${Math.floor(diff / 604800)} weeks ago`\n return `${Math.floor(diff / 2592000)} months ago`\n}\n\nexport { adminPluginRoutes }\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogEntry {\n id: string\n level: string\n category: string\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags: string[]\n source?: string\n createdAt: Date\n formattedDate: string\n formattedDuration?: string\n levelClass: string\n categoryClass: string\n}\n\nexport interface LogsListPageData {\n logs: LogEntry[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n baseUrl: string\n }\n filters: {\n level: string\n category: string\n search: string\n startDate: string\n endDate: string\n source: string\n }\n user?: BaseUser\n}\n\nexport function renderLogsListPage(data: LogsListPageData) {\n const { logs, pagination, filters, user } = data\n\n const content = `\n
\n
\n
\n

System Logs

\n

\n Monitor and analyze system activity, errors, and performance metrics.\n

\n
\n
\n \n Configure\n \n \n Export\n \n
\n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n Apply Filters\n \n \n Clear\n \n
\n
\n\n
\n ${pagination.totalItems} ${pagination.totalItems === 1 ? 'entry' : 'entries'}\n
\n
\n
\n
\n
\n\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${logs.map(log => `\n \n \n \n \n \n \n \n \n `).join('')}\n \n
\n Level\n \n Category\n \n Message\n \n Source\n \n Time\n \n Actions\n
\n \n ${log.level}\n \n \n \n ${log.category}\n \n \n
\n
${log.message}
\n ${log.url ? `
${log.method} ${log.url}
` : ''}\n ${log.duration ? `
${log.formattedDuration}
` : ''}\n
\n
\n ${log.source || '-'}\n \n ${log.formattedDate}\n \n \n View Details\n \n
\n
\n\n ${logs.length === 0 ? `\n
\n \n \n \n

No log entries

\n

No log entries found matching your criteria.

\n
\n ` : ''}\n
\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : `\n \n Previous\n \n `}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : `\n \n Next\n \n `}\n
\n
\n
\n

\n Showing ${pagination.startItem} to ${pagination.endItem} of{' '}\n ${pagination.totalItems} results\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'System Logs',\n pageTitle: 'System Logs',\n currentPath: '/admin/logs',\n user,\n content\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport { LogEntry } from './admin-logs-list.template'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogDetailsPageData {\n log: LogEntry\n user?: BaseUser\n}\n\nexport function renderLogDetailsPage(data: LogDetailsPageData) {\n const { log, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Details

\n

\n Detailed information for log entry ${log.id}\n

\n
\n
\n\n
\n
\n
\n

Log Entry Information

\n
\n \n ${log.level}\n \n \n ${log.category}\n \n
\n
\n
\n \n
\n
\n
\n
ID
\n
${log.id}
\n
\n \n
\n
Timestamp
\n
${log.formattedDate}
\n
\n \n
\n
Level
\n
\n \n ${log.level}\n \n
\n
\n \n
\n
Category
\n
\n \n ${log.category}\n \n
\n
\n \n ${log.source ? html`\n
\n
Source
\n
${log.source}
\n
\n ` : ''}\n \n ${log.userId ? html`\n
\n
User ID
\n
${log.userId}
\n
\n ` : ''}\n \n ${log.sessionId ? html`\n
\n
Session ID
\n
${log.sessionId}
\n
\n ` : ''}\n \n ${log.requestId ? html`\n
\n
Request ID
\n
${log.requestId}
\n
\n ` : ''}\n \n ${log.ipAddress ? html`\n
\n
IP Address
\n
${log.ipAddress}
\n
\n ` : ''}\n \n ${log.method && log.url ? html`\n
\n
HTTP Request
\n
\n ${log.method} ${log.url}\n ${log.statusCode ? html`(${log.statusCode})` : ''}\n
\n
\n ` : ''}\n \n ${log.duration ? html`\n
\n
Duration
\n
${log.formattedDuration}
\n
\n ` : ''}\n \n ${log.userAgent ? html`\n
\n
User Agent
\n
${log.userAgent}
\n
\n ` : ''}\n
\n
\n
\n\n \n
\n
\n

Message

\n
\n
\n
\n ${log.message}\n
\n
\n
\n\n \n ${log.tags && log.tags.length > 0 ? html`\n
\n
\n

Tags

\n
\n
\n
\n ${log.tags.map(tag => html`\n \n ${tag}\n \n `).join('')}\n
\n
\n
\n ` : ''}\n\n \n ${log.data ? html`\n
\n
\n

Additional Data

\n
\n
\n
${JSON.stringify(log.data, null, 2)}
\n
\n
\n ` : ''}\n\n \n ${log.stackTrace ? html`\n
\n
\n

Stack Trace

\n
\n
\n
${log.stackTrace}
\n
\n
\n ` : ''}\n\n \n
\n \n ← Back to Logs\n \n \n
\n ${log.level === 'error' || log.level === 'fatal' ? html`\n \n Report Issue\n \n ` : ''}\n \n alert('Log details copied to clipboard'))\"\n >\n Copy Details\n \n
\n
\n
\n `\n\n return adminLayoutV2({\n title: `Log Details - ${log.id}`,\n user,\n content: content as string\n })\n}","import { html } from 'hono/html'\nimport { adminLayoutV2 } from '../layouts/admin-layout-v2.template'\nimport type { LogConfig } from '../../db/schema'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface LogConfigPageData {\n configs: LogConfig[]\n user?: BaseUser\n}\n\nexport function renderLogConfigPage(data: LogConfigPageData) {\n const { configs, user } = data\n\n const content = html`\n
\n
\n
\n \n

Log Configuration

\n

\n Configure logging settings for different categories and manage log retention policies.\n

\n
\n
\n \n Run Cleanup\n \n
\n
\n\n
\n\n \n
\n
\n

Log Levels Reference

\n
\n
\n
\n
\n \n debug\n \n

Detailed diagnostic information

\n
\n
\n \n info\n \n

General information messages

\n
\n
\n \n warn\n \n

Warning conditions

\n
\n
\n \n error\n \n

Error conditions

\n
\n
\n \n fatal\n \n

Critical system errors

\n
\n
\n
\n
\n\n \n
\n ${configs.map(config => html`\n
\n
\n
\n

${config.category}

\n
\n ${config.enabled ? html`\n \n Enabled\n \n ` : html`\n \n Disabled\n \n `}\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n \n \n \n \n \n \n

Only logs at this level or higher will be stored

\n
\n \n
\n \n \n

Logs older than this will be deleted

\n
\n \n
\n \n \n

Maximum number of logs to keep for this category

\n
\n
\n \n
\n
\n \n Update Configuration\n \n
\n
\n \n
\n
\n
Created: ${new Date(config.createdAt).toLocaleDateString()}
\n
Updated: ${new Date(config.updatedAt).toLocaleDateString()}
\n
\n
\n
\n `).join('')}\n
\n\n \n
\n
\n

Global Log Settings

\n
\n
\n
\n
\n

Storage Information

\n
\n
\n
-
\n
Total Log Entries
\n
\n
\n
-
\n
Storage Used
\n
\n
\n
-
\n
Oldest Log
\n
\n
\n
\n \n
\n

Log Categories

\n
\n
    \n
  • auth - Authentication and authorization events
  • \n
  • api - API requests and responses
  • \n
  • workflow - Content workflow state changes
  • \n
  • plugin - Plugin-related activities
  • \n
  • media - File upload and media operations
  • \n
  • system - General system events
  • \n
  • security - Security-related events and alerts
  • \n
  • error - General error conditions
  • \n
\n
\n
\n
\n
\n
\n
\n\n \n `\n\n return adminLayoutV2({\n title: 'Log Configuration',\n user,\n content: content as string\n })\n}","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport type { D1Database, KVNamespace } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport { getLogger, type LogLevel, type LogCategory, type LogFilter } from '../services'\nimport { renderLogsListPage, type LogsListPageData } from '../templates/pages/admin-logs-list.template'\nimport { renderLogDetailsPage, type LogDetailsPageData } from '../templates/pages/admin-log-details.template'\nimport { renderLogConfigPage, type LogConfigPageData } from '../templates/pages/admin-log-config.template'\nimport type { Bindings, Variables } from '../app'\n\nconst adminLogsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminLogsRoutes.use('*', requireAuth())\n\n// Main logs listing page\nadminLogsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Use Hono's built-in query method instead of parsing URL\n const query = c.req.query()\n \n // Parse query parameters\n const page = parseInt(query.page || '1')\n const limit = parseInt(query.limit || '50')\n const level = query.level\n const category = query.category\n const search = query.search\n const startDate = query.start_date\n const endDate = query.end_date\n const source = query.source\n \n // Build filter\n const filter: LogFilter = {\n limit,\n offset: (page - 1) * limit,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (search) {\n filter.search = search\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n if (source) {\n filter.source = source\n }\n \n // Get logs and total count\n const { logs, total } = await logger.getLogs(filter)\n \n // Format logs for display\n const formattedLogs = logs.map(log => ({\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }))\n \n const totalPages = Math.ceil(total / limit)\n \n const pageData: LogsListPageData = {\n logs: formattedLogs,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total),\n baseUrl: '/admin/logs'\n },\n filters: {\n level: level || '',\n category: category || '',\n search: search || '',\n startDate: startDate || '',\n endDate: endDate || '',\n source: source || ''\n },\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogsListPage(pageData))\n } catch (error) {\n console.error('Error fetching logs:', error)\n return c.html(html`

Error loading logs: ${error}

`)\n }\n})\n\n// Log details page\nadminLogsRoutes.get('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get single log by ID\n const { logs } = await logger.getLogs({ \n limit: 1, \n offset: 0,\n search: id // Using search to find by ID - this is a simplification\n })\n \n const log = logs.find(l => l.id === id)\n \n if (!log) {\n return c.html(html`

Log entry not found

`)\n }\n \n const formattedLog = {\n ...log,\n data: log.data ? JSON.parse(log.data) : null,\n tags: log.tags ? JSON.parse(log.tags) : [],\n formattedDate: new Date(log.createdAt).toLocaleString(),\n formattedDuration: log.duration ? `${log.duration}ms` : null,\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n \n const pageData: LogDetailsPageData = {\n log: formattedLog,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogDetailsPage(pageData))\n } catch (error) {\n console.error('Error fetching log details:', error)\n return c.html(html`

Error loading log details: ${error}

`)\n }\n})\n\n// Log configuration page\nadminLogsRoutes.get('/config', async (c) => {\n try {\n const user = c.get('user')\n const logger = getLogger(c.env.DB)\n \n // Get all log configurations\n const configs = await logger.getAllConfigs()\n \n const pageData: LogConfigPageData = {\n configs,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderLogConfigPage(pageData))\n } catch (error) {\n console.error('Error fetching log config:', error)\n return c.html(html`

Error loading log configuration: ${error}

`)\n }\n})\n\n// Update log configuration\nadminLogsRoutes.post('/config/:category', async (c) => {\n try {\n const category = c.req.param('category') as LogCategory\n const formData = await c.req.formData()\n \n const enabled = formData.get('enabled') === 'on'\n const level = formData.get('level') as string\n const retention = parseInt(formData.get('retention') as string)\n const maxSize = parseInt(formData.get('max_size') as string)\n \n const logger = getLogger(c.env.DB)\n await logger.updateConfig(category, {\n enabled,\n level,\n retention,\n maxSize\n })\n \n return c.html(html`\n
\n Configuration updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating log config:', error)\n return c.html(html`\n
\n Failed to update configuration. Please try again.\n
\n `)\n }\n})\n\n// Export logs\nadminLogsRoutes.get('/export', async (c) => {\n try {\n const query = c.req.query()\n const format = query.format || 'csv'\n const level = query.level\n const category = query.category\n const startDate = query.start_date\n const endDate = query.end_date\n \n const logger = getLogger(c.env.DB)\n \n // Build filter for export\n const filter: LogFilter = {\n limit: 10000, // Export up to 10k logs\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (level) {\n filter.level = level.split(',') as LogLevel[]\n }\n \n if (category) {\n filter.category = category.split(',') as LogCategory[]\n }\n \n if (startDate) {\n filter.startDate = new Date(startDate)\n }\n \n if (endDate) {\n filter.endDate = new Date(endDate)\n }\n \n const { logs } = await logger.getLogs(filter)\n \n if (format === 'json') {\n return c.json(logs, 200, {\n 'Content-Disposition': 'attachment; filename=\"logs-export.json\"'\n })\n } else {\n // Default to CSV\n const headers = [\n 'ID', 'Level', 'Category', 'Message', 'Source', 'User ID', \n 'IP Address', 'Method', 'URL', 'Status Code', 'Duration', \n 'Created At'\n ]\n const csvRows = [headers.join(',')]\n \n logs.forEach(log => {\n const row = [\n log.id,\n log.level,\n log.category,\n `\"${log.message.replace(/\"/g, '\"\"')}\"`, // Escape quotes\n log.source || '',\n log.userId || '',\n log.ipAddress || '',\n log.method || '',\n log.url || '',\n log.statusCode || '',\n log.duration || '',\n new Date(log.createdAt).toISOString()\n ]\n csvRows.push(row.join(','))\n })\n \n const csv = csvRows.join('\\n')\n \n return new Response(csv, {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': 'attachment; filename=\"logs-export.csv\"'\n }\n })\n }\n } catch (error) {\n console.error('Error exporting logs:', error)\n return c.json({ error: 'Failed to export logs' }, 500)\n }\n})\n\n// Clean up old logs\nadminLogsRoutes.post('/cleanup', async (c) => {\n try {\n const user = c.get('user')\n \n // Only allow admin users to run cleanup\n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n \n const logger = getLogger(c.env.DB)\n await logger.cleanupByRetention()\n \n return c.html(html`\n
\n Log cleanup completed successfully!\n
\n `)\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n return c.html(html`\n
\n Failed to clean up logs. Please try again.\n
\n `)\n }\n})\n\n// Search logs (HTMX endpoint)\nadminLogsRoutes.post('/search', async (c) => {\n try {\n const formData = await c.req.formData()\n const search = formData.get('search') as string\n const level = formData.get('level') as string\n const category = formData.get('category') as string\n \n const logger = getLogger(c.env.DB)\n \n const filter: LogFilter = {\n limit: 20,\n offset: 0,\n sortBy: 'created_at',\n sortOrder: 'desc'\n }\n \n if (search) filter.search = search\n if (level) filter.level = [level] as LogLevel[]\n if (category) filter.category = [category] as LogCategory[]\n \n const { logs } = await logger.getLogs(filter)\n \n // Return just the logs table rows for HTMX\n const rows = logs.map(log => {\n const formattedLog = {\n ...log,\n formattedDate: new Date(log.createdAt).toLocaleString(),\n levelClass: getLevelClass(log.level),\n categoryClass: getCategoryClass(log.category)\n }\n\n return `\n \n \n \n ${formattedLog.level}\n \n \n \n \n ${formattedLog.category}\n \n \n \n
${formattedLog.message}
\n \n ${formattedLog.source || '-'}\n ${formattedLog.formattedDate}\n \n View\n \n \n `\n }).join('')\n\n return c.html(rows)\n } catch (error) {\n console.error('Error searching logs:', error)\n return c.html(html`Error searching logs`)\n }\n})\n\n// Helper functions\nfunction getLevelClass(level: string): string {\n switch (level) {\n case 'debug': return 'bg-gray-100 text-gray-800'\n case 'info': return 'bg-blue-100 text-blue-800'\n case 'warn': return 'bg-yellow-100 text-yellow-800'\n case 'error': return 'bg-red-100 text-red-800'\n case 'fatal': return 'bg-purple-100 text-purple-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nfunction getCategoryClass(category: string): string {\n switch (category) {\n case 'auth': return 'bg-green-100 text-green-800'\n case 'api': return 'bg-blue-100 text-blue-800'\n case 'workflow': return 'bg-purple-100 text-purple-800'\n case 'plugin': return 'bg-indigo-100 text-indigo-800'\n case 'media': return 'bg-pink-100 text-pink-800'\n case 'system': return 'bg-gray-100 text-gray-800'\n case 'security': return 'bg-red-100 text-red-800'\n case 'error': return 'bg-red-100 text-red-800'\n default: return 'bg-gray-100 text-gray-800'\n }\n}\n\nexport { adminLogsRoutes }","import { Hono } from 'hono'\nimport { renderDesignPage, DesignPageData } from '../templates/pages/admin-design.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminDesignRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminDesignRoutes.get('/', (c) => {\n const user = c.get('user')\n \n const pageData: DesignPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n \n return c.html(renderDesignPage(pageData))\n})","import { Hono } from 'hono'\nimport { renderCheckboxPage, CheckboxPageData } from '../templates/pages/admin-checkboxes.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport const adminCheckboxRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCheckboxRoutes.get('/', (c) => {\n const user = c.get('user')\n\n const pageData: CheckboxPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }\n\n return c.html(renderCheckboxPage(pageData))\n})\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface Testimonial {\n id?: number\n authorName: string\n authorTitle?: string\n authorCompany?: string\n testimonialText: string\n rating?: number\n isPublished: boolean\n sortOrder: number\n}\n\ninterface TestimonialsFormData {\n testimonial?: Testimonial\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderTestimonialsForm(data: TestimonialsFormData): string {\n const { testimonial, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Testimonial' : 'New Testimonial'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the testimonial details below' : 'Create a new customer testimonial'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Author Information

\n\n \n
\n \n
\n \n
\n ${errors?.authorName ? `\n
\n ${errors.authorName.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.authorTitle ? `\n
\n ${errors.authorTitle.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.authorCompany ? `\n
\n ${errors.authorCompany.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Testimonial

\n\n \n
\n \n
\n \n

\n 0/1000 characters\n

\n
\n ${errors?.testimonialText ? `\n
\n ${errors.testimonialText.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.rating ? `\n
\n ${errors.rating.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/testimonials/${testimonial?.id}` : '/admin/testimonials/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderTestimonialsList } from '../templates/pages/admin-testimonials-list.template'\nimport { renderTestimonialsForm } from '../templates/pages/admin-testimonials-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst testimonialSchema = z.object({\n authorName: z.string().min(1, 'Author name is required').max(100, 'Author name must be under 100 characters'),\n authorTitle: z.string().optional(),\n authorCompany: z.string().optional(),\n testimonialText: z.string().min(1, 'Testimonial is required').max(1000, 'Testimonial must be under 1000 characters'),\n rating: z.string().transform(val => val ? parseInt(val, 10) : undefined).pipe(z.number().min(1).max(5).optional()),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminTestimonialsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminTestimonialsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, minRating, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (minRating) {\n whereClause += ' AND rating >= ?'\n params.push(parseInt(minRating, 10))\n }\n\n if (search) {\n whereClause += ' AND (author_name LIKE ? OR testimonial_text LIKE ? OR author_company LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM testimonials ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM testimonials\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: testimonials } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderTestimonialsList({\n testimonials: testimonials || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonials:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsList({\n testimonials: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonials',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminTestimonialsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO testimonials (author_name, author_title, author_company, testimonial_text, rating, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial created successfully')\n } else {\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating testimonial:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM testimonials WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/testimonials?message=Testimonial not found&type=error')\n }\n\n const testimonial = results[0] as any\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id: testimonial.id,\n authorName: testimonial.author_name,\n authorTitle: testimonial.author_title,\n authorCompany: testimonial.author_company,\n testimonialText: testimonial.testimonial_text,\n rating: testimonial.rating,\n isPublished: Boolean(testimonial.isPublished),\n sortOrder: testimonial.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching testimonial:', error)\n const user = c.get('user')\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = testimonialSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderTestimonialsForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE testimonials\n SET author_name = ?, author_title = ?, author_company = ?, testimonial_text = ?, rating = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.authorName,\n validatedData.authorTitle || null,\n validatedData.authorCompany || null,\n validatedData.testimonialText,\n validatedData.rating || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/testimonials?message=Testimonial updated successfully')\n } else {\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: validatedData.authorName,\n authorTitle: validatedData.authorTitle,\n authorCompany: validatedData.authorCompany,\n testimonialText: validatedData.testimonialText,\n rating: validatedData.rating,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Testimonial not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating testimonial:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderTestimonialsForm({\n testimonial: {\n id,\n authorName: '',\n authorTitle: '',\n authorCompany: '',\n testimonialText: '',\n rating: undefined,\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update testimonial',\n messageType: 'error'\n }))\n }\n})\n\nadminTestimonialsRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM testimonials WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Testimonial not found' }, 404)\n }\n\n return c.redirect('/admin/testimonials?message=Testimonial deleted successfully')\n } catch (error) {\n console.error('Error deleting testimonial:', error)\n return c.json({ error: 'Failed to delete testimonial' }, 500)\n }\n})\n\nexport default adminTestimonialsRoutes\n","import { renderAdminLayout, AdminLayoutData } from '../layouts/admin-layout-v2.template'\nimport { renderAlert } from '../alert.template'\n\ninterface CodeExample {\n id?: number\n title: string\n description?: string\n code: string\n language: string\n category?: string\n tags?: string\n isPublished: boolean\n sortOrder: number\n}\n\ninterface CodeExamplesFormData {\n codeExample?: CodeExample\n isEdit: boolean\n errors?: Record\n user?: { name: string; email: string; role: string }\n message?: string\n messageType?: 'success' | 'error' | 'warning' | 'info'\n}\n\nexport function renderCodeExamplesForm(data: CodeExamplesFormData): string {\n const { codeExample, isEdit, errors, message, messageType } = data\n const pageTitle = isEdit ? 'Edit Code Example' : 'New Code Example'\n\n const pageContent = `\n
\n \n
\n
\n

${pageTitle}

\n

\n ${isEdit ? 'Update the code example details below' : 'Create a new code snippet or example'}\n

\n
\n \n
\n\n ${message ? renderAlert({ type: messageType || 'info', message, dismissible: true }) : ''}\n\n \n
\n
\n\n \n
\n

Basic Information

\n\n \n
\n \n
\n \n
\n ${errors?.title ? `\n
\n ${errors.title.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

\n 0/500 characters\n

\n
\n ${errors?.description ? `\n
\n ${errors.description.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n
\n \n
\n \n
\n \n
\n ${errors?.language ? `\n
\n ${errors.language.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n
\n ${errors?.category ? `\n
\n ${errors.category.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n\n \n
\n \n
\n \n

Comma-separated tags

\n
\n ${errors?.tags ? `\n
\n ${errors.tags.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n
\n\n \n
\n

Code

\n\n \n
\n \n
\n \n

\n 0 characters\n

\n
\n ${errors?.code ? `\n
\n ${errors.code.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n \n
\n \n

Lower numbers appear first (0 = highest priority)

\n
\n ${errors?.sortOrder ? `\n
\n ${errors.sortOrder.map(error => `\n

${escapeHtml(error)}

\n `).join('')}\n
\n ` : ''}\n
\n
\n\n \n
\n \n Cancel\n \n \n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutData = {\n title: `${pageTitle} - Admin`,\n pageTitle,\n currentPath: isEdit ? `/admin/code-examples/${codeExample?.id}` : '/admin/code-examples/new',\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayout(layoutData)\n}\n\nfunction escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { renderCodeExamplesList } from '../templates/pages/admin-code-examples-list.template'\nimport { renderCodeExamplesForm } from '../templates/pages/admin-code-examples-form.template'\n\ntype Bindings = {\n DB: D1Database\n KV: KVNamespace\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n}\n\nconst codeExampleSchema = z.object({\n title: z.string().min(1, 'Title is required').max(200, 'Title must be under 200 characters'),\n description: z.string().max(500, 'Description must be under 500 characters').optional(),\n code: z.string().min(1, 'Code is required'),\n language: z.string().min(1, 'Language is required'),\n category: z.string().max(50, 'Category must be under 50 characters').optional(),\n tags: z.string().max(200, 'Tags must be under 200 characters').optional(),\n isPublished: z.string().transform(val => val === 'true'),\n sortOrder: z.string().transform(val => parseInt(val, 10)).pipe(z.number().min(0))\n})\n\nconst adminCodeExamplesRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminCodeExamplesRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const { published, language, search, page = '1' } = c.req.query()\n const currentPage = parseInt(page, 10) || 1\n const limit = 20\n const offset = (currentPage - 1) * limit\n\n const db = (c as any).env?.DB\n if (!db) {\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n let whereClause = 'WHERE 1=1'\n const params: any[] = []\n\n if (published !== undefined) {\n whereClause += ' AND isPublished = ?'\n params.push(published === 'true' ? 1 : 0)\n }\n\n if (language) {\n whereClause += ' AND language = ?'\n params.push(language)\n }\n\n if (search) {\n whereClause += ' AND (title LIKE ? OR description LIKE ? OR code LIKE ? OR tags LIKE ?)'\n const searchTerm = `%${search}%`\n params.push(searchTerm, searchTerm, searchTerm, searchTerm)\n }\n\n const countQuery = `SELECT COUNT(*) as count FROM code_examples ${whereClause}`\n const { results: countResults } = await db.prepare(countQuery).bind(...params).all()\n const totalCount = countResults?.[0]?.count || 0\n\n const dataQuery = `\n SELECT * FROM code_examples\n ${whereClause}\n ORDER BY sortOrder ASC, created_at DESC\n LIMIT ? OFFSET ?\n `\n const { results: codeExamples } = await db.prepare(dataQuery).bind(...params, limit, offset).all()\n\n const totalPages = Math.ceil(totalCount / limit)\n\n return c.html(renderCodeExamplesList({\n codeExamples: codeExamples || [],\n totalCount,\n currentPage,\n totalPages,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code examples:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesList({\n codeExamples: [],\n totalCount: 0,\n currentPage: 1,\n totalPages: 1,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code examples',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/new', async (c) => {\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n})\n\nadminCodeExamplesRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n INSERT INTO code_examples (title, description, code, language, category, tags, isPublished, sortOrder)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example created successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error creating code example:', error)\n const user = c.get('user')\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to create code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.get('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare('SELECT * FROM code_examples WHERE id = ?').bind(id).all()\n\n if (!results || results.length === 0) {\n return c.redirect('/admin/code-examples?message=Code example not found&type=error')\n }\n\n const example = results[0] as any\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id: example.id,\n title: example.title,\n description: example.description,\n code: example.code,\n language: example.language,\n category: example.category,\n tags: example.tags,\n isPublished: Boolean(example.isPublished),\n sortOrder: example.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined\n }))\n } catch (error) {\n console.error('Error fetching code example:', error)\n const user = c.get('user')\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to load code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.put('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const formData = await c.req.formData()\n const data = Object.fromEntries(formData.entries())\n\n const validatedData = codeExampleSchema.parse(data)\n const user = c.get('user')\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.html(renderCodeExamplesForm({\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Database not available',\n messageType: 'error'\n }))\n }\n\n const { results } = await db.prepare(`\n UPDATE code_examples\n SET title = ?, description = ?, code = ?, language = ?, category = ?, tags = ?, isPublished = ?, sortOrder = ?\n WHERE id = ?\n RETURNING *\n `).bind(\n validatedData.title,\n validatedData.description || null,\n validatedData.code,\n validatedData.language,\n validatedData.category || null,\n validatedData.tags || null,\n validatedData.isPublished ? 1 : 0,\n validatedData.sortOrder,\n id\n ).all()\n\n if (results && results.length > 0) {\n return c.redirect('/admin/code-examples?message=Code example updated successfully')\n } else {\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: validatedData.title,\n description: validatedData.description,\n code: validatedData.code,\n language: validatedData.language,\n category: validatedData.category,\n tags: validatedData.tags,\n isPublished: validatedData.isPublished,\n sortOrder: validatedData.sortOrder\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Code example not found',\n messageType: 'error'\n }))\n }\n } catch (error) {\n console.error('Error updating code example:', error)\n const user = c.get('user')\n const id = parseInt(c.req.param('id'))\n\n if (error instanceof z.ZodError) {\n const errors: Record = {}\n error.issues.forEach(err => {\n const field = err.path[0] as string\n if (!errors[field]) errors[field] = []\n errors[field].push(err.message)\n })\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n errors,\n message: 'Please correct the errors below',\n messageType: 'error'\n }))\n }\n\n return c.html(renderCodeExamplesForm({\n codeExample: {\n id,\n title: '',\n description: '',\n code: '',\n language: '',\n category: '',\n tags: '',\n isPublished: true,\n sortOrder: 0\n },\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n message: 'Failed to update code example',\n messageType: 'error'\n }))\n }\n})\n\nadminCodeExamplesRoutes.delete('/:id', async (c) => {\n try {\n const id = parseInt(c.req.param('id'))\n const db = (c as any).env?.DB\n\n if (!db) {\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const { changes } = await db.prepare('DELETE FROM code_examples WHERE id = ?').bind(id).run()\n\n if (changes === 0) {\n return c.json({ error: 'Code example not found' }, 404)\n }\n\n return c.redirect('/admin/code-examples?message=Code example deleted successfully')\n } catch (error) {\n console.error('Error deleting code example:', error)\n return c.json({ error: 'Failed to delete code example' }, 500)\n }\n})\n\nexport default adminCodeExamplesRoutes\n","import {\n AdminLayoutData,\n renderAdminLayout,\n} from \"../layouts/admin-layout-v2.template\";\n\nexport interface DashboardStats {\n collections: number;\n contentItems: number;\n mediaFiles: number;\n users: number;\n databaseSize?: number; // Size in bytes\n mediaSize?: number; // Total size of all media files in bytes\n recentActivity?: ActivityItem[];\n analytics?: AnalyticsData;\n}\n\nexport interface ActivityItem {\n id: string;\n type: \"content\" | \"media\" | \"user\" | \"collection\";\n action: string;\n description: string;\n timestamp: string;\n user: string;\n}\n\nexport interface AnalyticsData {\n pageViews: number;\n uniqueVisitors: number;\n contentPublished: number;\n mediaUploaded: number;\n weeklyGrowth: {\n pageViews: number;\n visitors: number;\n content: number;\n media: number;\n };\n}\n\nexport interface DashboardPageData {\n user?: {\n name: string;\n email: string;\n role: string;\n };\n stats?: DashboardStats;\n version?: string;\n enableExperimentalFeatures?: boolean;\n}\n\nexport function renderDashboardPage(data: DashboardPageData): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n \n \n ${renderStatsCardsSkeleton()}\n \n\n \n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n \n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n content: pageContent,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderDashboardPageWithDynamicMenu(\n data: DashboardPageData,\n dynamicMenuItems: Array<{ label: string; path: string; icon: string }>\n): string {\n const pageContent = `\n
\n
\n

Dashboard

\n

Welcome to your SonicJS AI admin dashboard

\n
\n \n
\n\n
\n ${renderStatsCards({\n collections: 0,\n contentItems: 0,\n mediaFiles: 0,\n users: 0,\n })}\n
\n\n
\n \n
\n ${renderAnalyticsChart()}\n
\n\n \n \n ${renderRecentActivitySkeleton()}\n
\n \n\n
\n \n ${renderQuickActions()}\n\n \n ${renderSystemStatus()}\n\n \n
\n ${renderStorageUsage()}\n
\n
\n\n \n `;\n\n const layoutData: AdminLayoutData = {\n title: \"Dashboard\",\n pageTitle: \"Dashboard\",\n currentPath: \"/admin\",\n user: data.user,\n version: data.version,\n enableExperimentalFeatures: data.enableExperimentalFeatures,\n content: pageContent,\n dynamicMenuItems,\n };\n\n return renderAdminLayout(layoutData);\n}\n\nexport function renderStatsCards(stats: DashboardStats): string {\n const cards = [\n {\n title: \"Total Collections\",\n value: stats.collections.toString(),\n change: \"12.5\",\n isPositive: true,\n },\n {\n title: \"Content Items\",\n value: stats.contentItems.toString(),\n change: \"8.2\",\n isPositive: true,\n },\n {\n title: \"Media Files\",\n value: stats.mediaFiles.toString(),\n change: \"15.3\",\n isPositive: true,\n },\n {\n title: \"Active Users\",\n value: stats.users.toString(),\n change: \"2.4\",\n isPositive: false,\n },\n ];\n\n const cardColors = ['text-cyan-400', 'text-lime-400', 'text-pink-400', 'text-purple-400'];\n\n return `\n
\n

Last 30 days

\n
\n ${cards.map((card, index) => `\n
\n
${card.title}
\n
\n
\n ${card.value}\n
\n
\n \n ${card.isPositive\n ? ''\n : ''\n }\n \n ${card.isPositive ? 'Increased' : 'Decreased'} by\n ${card.change}%\n
\n
\n
\n `).join('')}\n
\n
\n `;\n}\n\nfunction renderStatsCardsSkeleton(): string {\n return `\n
\n
\n
\n ${Array(4)\n .fill(0)\n .map(\n () => `\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n `;\n}\n\nfunction renderAnalyticsChart(): string {\n return `\n
\n
\n
\n
\n

Real-Time Analytics

\n

Requests per second (live)

\n
\n
\n
\n Live\n
\n
\n
\n 0\n req/s\n
\n
\n\n
\n \n
\n\n \n
\n \n\n \n `;\n}\n\nexport function renderRecentActivitySkeleton(): string {\n return `\n
\n
\n
\n
\n
\n
\n ${Array(3).fill(0).map(() => `\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n}\n\nexport function renderRecentActivity(activities?: ActivityItem[]): string {\n // Helper to get user initials\n const getInitials = (user: string): string => {\n const parts = user.split(' ').filter(p => p.length > 0)\n if (parts.length >= 2) {\n const first = parts[0]?.[0] || ''\n const second = parts[1]?.[0] || ''\n return (first + second).toUpperCase()\n }\n return user.substring(0, 2).toUpperCase()\n }\n\n // Helper to get relative time\n const getRelativeTime = (timestamp: string): string => {\n const date = new Date(timestamp)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) return 'just now'\n if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`\n return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`\n }\n\n // Helper to get color classes based on activity type\n const getColorClasses = (type: string): { bgColor: string; textColor: string } => {\n switch (type) {\n case 'content':\n return {\n bgColor: 'bg-lime-500/10 dark:bg-lime-400/10',\n textColor: 'text-lime-700 dark:text-lime-300'\n }\n case 'media':\n return {\n bgColor: 'bg-cyan-500/10 dark:bg-cyan-400/10',\n textColor: 'text-cyan-700 dark:text-cyan-300'\n }\n case 'user':\n return {\n bgColor: 'bg-pink-500/10 dark:bg-pink-400/10',\n textColor: 'text-pink-700 dark:text-pink-300'\n }\n case 'collection':\n return {\n bgColor: 'bg-purple-500/10 dark:bg-purple-400/10',\n textColor: 'text-purple-700 dark:text-purple-300'\n }\n default:\n return {\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300'\n }\n }\n }\n\n // Format activities with colors and times\n const formattedActivities = (activities || []).map(activity => {\n const colors = getColorClasses(activity.type)\n return {\n ...activity,\n initials: getInitials(activity.user),\n time: getRelativeTime(activity.timestamp),\n ...colors\n }\n })\n\n // If no activities, show empty state\n if (formattedActivities.length === 0) {\n formattedActivities.push({\n type: 'content' as const,\n description: 'No recent activity',\n user: 'System',\n time: '',\n initials: 'SY',\n bgColor: 'bg-gray-500/10 dark:bg-gray-400/10',\n textColor: 'text-gray-700 dark:text-gray-300',\n id: '0',\n action: '',\n timestamp: new Date().toISOString()\n })\n }\n\n return `\n
\n
\n
\n

Recent Activity

\n \n
\n
\n\n
\n
    \n ${formattedActivities\n .map(\n (activity) => `\n
  • \n
    \n ${activity.initials}\n
    \n
    \n

    ${activity.description}

    \n

    \n ${activity.user}\n · \n ${activity.time}\n

    \n
    \n
  • \n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderQuickActions(): string {\n const actions = [\n {\n title: \"Create Content\",\n description: \"Add new blog post or page\",\n href: \"/admin/content/new\",\n icon: `\n \n `,\n },\n {\n title: \"Upload Media\",\n description: \"Add images and files\",\n href: \"/admin/media\",\n icon: `\n \n `,\n },\n {\n title: \"Manage Users\",\n description: \"Add or edit user accounts\",\n href: \"/admin/users\",\n icon: `\n \n `,\n },\n ];\n\n return `\n
\n
\n

Quick Actions

\n
\n\n
\n
\n ${actions\n .map(\n (action) => `\n \n
\n ${action.icon}\n
\n
\n

${action.title}

\n

${action.description}

\n
\n \n \n \n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}\n\nfunction renderSystemStatus(): string {\n return `\n
\n
\n
\n

System Status

\n
\n
\n Live\n
\n
\n
\n\n \n \n
\n ${[\n { color: 'from-blue-500/20 to-cyan-500/20', darkColor: 'dark:from-blue-500/10 dark:to-cyan-500/10' },\n { color: 'from-purple-500/20 to-pink-500/20', darkColor: 'dark:from-purple-500/10 dark:to-pink-500/10' },\n { color: 'from-amber-500/20 to-orange-500/20', darkColor: 'dark:from-amber-500/10 dark:to-orange-500/10' },\n { color: 'from-lime-500/20 to-emerald-500/20', darkColor: 'dark:from-lime-500/10 dark:to-emerald-500/10' }\n ].map((gradient, i) => `\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n `).join('')}\n
\n
\n \n\n \n `;\n}\n\nexport function renderStorageUsage(databaseSizeBytes?: number, mediaSizeBytes?: number): string {\n // Helper to format bytes to human readable\n const formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`\n }\n\n const dbSizeGB = databaseSizeBytes ? databaseSizeBytes / (1024 ** 3) : 0\n const dbMaxGB = 10\n const dbPercentageRaw = (dbSizeGB / dbMaxGB) * 100\n // Ensure minimum 0.5% visibility for progress bar, max 100%\n const dbPercentage = Math.min(Math.max(dbPercentageRaw, 0.5), 100)\n const dbUsedFormatted = databaseSizeBytes ? formatBytes(databaseSizeBytes) : 'Unknown'\n\n const mediaUsedFormatted = mediaSizeBytes ? formatBytes(mediaSizeBytes) : '0 B'\n\n const storageItems = [\n {\n label: \"Database\",\n used: dbUsedFormatted,\n total: \"10 GB\",\n percentage: dbPercentage,\n color: dbPercentage > 80 ? \"bg-red-500 dark:bg-red-400\" : dbPercentage > 60 ? \"bg-amber-500 dark:bg-amber-400\" : \"bg-cyan-500 dark:bg-cyan-400\",\n },\n {\n label: \"Media Files\",\n used: mediaUsedFormatted,\n total: \"∞\",\n percentage: 0,\n color: \"bg-lime-500 dark:bg-lime-400\",\n note: \"Stored in R2\"\n },\n {\n label: \"Cache (KV)\",\n used: \"N/A\",\n total: \"∞\",\n percentage: 0,\n color: \"bg-purple-500 dark:bg-purple-400\",\n note: \"Unlimited\"\n },\n ];\n\n return `\n
\n
\n

Storage Usage

\n
\n\n
\n
\n ${storageItems\n .map(\n (item: any) => `\n
\n
\n
\n ${item.label}\n ${item.note ? `(${item.note})` : ''}\n
\n
${item.used} / ${item.total}
\n
\n
\n
\n
\n
\n `\n )\n .join(\"\")}\n
\n
\n
\n `;\n}","import { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderDashboardPage,\n type DashboardPageData,\n renderStatsCards,\n renderStorageUsage,\n renderRecentActivity,\n type ActivityItem\n} from '../templates/pages/admin-dashboard.template'\nimport { getCoreVersion } from '../utils/version'\nimport { metricsTracker } from '../utils/metrics'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin - Admin Dashboard\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const pageData: DashboardPageData = {\n user: {\n name: user!.email.split('@')[0] || user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n } catch (error) {\n console.error('Dashboard error:', error)\n\n // Return dashboard with error state\n const pageData: DashboardPageData = {\n user: {\n name: user!.email,\n email: user!.email,\n role: user!.role\n },\n version: VERSION\n }\n\n return c.html(renderDashboardPage(pageData))\n }\n})\n\n/**\n * GET /admin/dashboard/stats - Dashboard stats HTML fragment (HTMX endpoint)\n */\nrouter.get('/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get collections count\n let collectionsCount = 0\n try {\n const collectionsStmt = db.prepare(\"SELECT COUNT(*) as count FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user')\")\n const collectionsResult = await collectionsStmt.first()\n collectionsCount = (collectionsResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching collections count:', error)\n }\n\n // Get content count\n let contentCount = 0\n try {\n const contentStmt = db.prepare(\"SELECT COUNT(*) as count FROM content c JOIN collections col ON c.collection_id = col.id WHERE (col.source_type IS NULL OR col.source_type = 'user')\")\n const contentResult = await contentStmt.first()\n contentCount = (contentResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching content count:', error)\n }\n\n // Get media count and total size\n let mediaCount = 0\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COUNT(*) as count, COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaCount = (mediaResult as any)?.count || 0\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media count:', error)\n }\n\n // Get users count\n let usersCount = 0\n try {\n const usersStmt = db.prepare('SELECT COUNT(*) as count FROM users WHERE is_active = 1')\n const usersResult = await usersStmt.first()\n usersCount = (usersResult as any)?.count || 0\n } catch (error) {\n console.error('Error fetching users count:', error)\n }\n\n const html = renderStatsCards({\n collections: collectionsCount,\n contentItems: contentCount,\n mediaFiles: mediaCount,\n users: usersCount,\n mediaSize: mediaSize\n })\n\n return c.html(html)\n } catch (error) {\n console.error('Error fetching stats:', error)\n return c.html('
Failed to load statistics
')\n }\n})\n\n/**\n * GET /admin/dashboard/storage - Storage usage HTML fragment (HTMX endpoint)\n */\nrouter.get('/storage', async (c) => {\n try {\n const db = c.env.DB\n\n // Get database size from D1 metadata\n let databaseSize = 0\n try {\n const result = await db.prepare('SELECT 1').run()\n databaseSize = (result as any)?.meta?.size_after || 0\n } catch (error) {\n console.error('Error fetching database size:', error)\n }\n\n // Get media total size\n let mediaSize = 0\n try {\n const mediaStmt = db.prepare('SELECT COALESCE(SUM(size), 0) as total_size FROM media WHERE deleted_at IS NULL')\n const mediaResult = await mediaStmt.first()\n mediaSize = (mediaResult as any)?.total_size || 0\n } catch (error) {\n console.error('Error fetching media size:', error)\n }\n\n const html = renderStorageUsage(databaseSize, mediaSize)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching storage usage:', error)\n return c.html('
Failed to load storage information
')\n }\n})\n\n/**\n * GET /admin/dashboard/recent-activity - Recent activity HTML fragment (HTMX endpoint)\n */\nrouter.get('/recent-activity', async (c) => {\n try {\n const db = c.env.DB\n const limit = parseInt(c.req.query('limit') || '5')\n\n // Get recent activities from activity_logs table\n const activityStmt = db.prepare(`\n SELECT\n a.id,\n a.action,\n a.resource_type,\n a.resource_id,\n a.details,\n a.created_at,\n u.email,\n u.first_name,\n u.last_name\n FROM activity_logs a\n LEFT JOIN users u ON a.user_id = u.id\n WHERE a.resource_type IN ('content', 'collections', 'users', 'media')\n ORDER BY a.created_at DESC\n LIMIT ?\n `)\n\n const { results } = await activityStmt.bind(limit).all()\n\n const activities: ActivityItem[] = (results || []).map((row: any) => {\n const userName = row.first_name && row.last_name\n ? `${row.first_name} ${row.last_name}`\n : row.email || 'System'\n\n // Format description based on action and resource type\n let description = ''\n if (row.action === 'create') {\n description = `Created new ${row.resource_type}`\n } else if (row.action === 'update') {\n description = `Updated ${row.resource_type}`\n } else if (row.action === 'delete') {\n description = `Deleted ${row.resource_type}`\n } else {\n description = `${row.action} ${row.resource_type}`\n }\n\n return {\n id: row.id,\n type: row.resource_type,\n action: row.action,\n description,\n timestamp: new Date(Number(row.created_at)).toISOString(),\n user: userName\n }\n })\n\n const html = renderRecentActivity(activities)\n return c.html(html)\n } catch (error) {\n console.error('Error fetching recent activity:', error)\n const html = renderRecentActivity([])\n return c.html(html)\n }\n})\n\n/**\n * GET /admin/api/metrics - Real-time metrics for analytics chart\n * Returns JSON with current requests per second from the metrics tracker\n */\nrouter.get('/api/metrics', async (c) => {\n return c.json({\n requestsPerSecond: metricsTracker.getRequestsPerSecond(),\n totalRequests: metricsTracker.getTotalRequests(),\n averageRPS: Number(metricsTracker.getAverageRPS().toFixed(2)),\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/dashboard/system-status - System status HTML fragment (HTMX endpoint)\n */\nrouter.get('/system-status', async (c) => {\n try {\n const html = `\n
\n
\n
\n
\n
\n API Status\n \n \n \n
\n

Operational

\n
\n
\n\n
\n
\n
\n
\n Database\n \n \n \n
\n

Connected

\n
\n
\n\n
\n
\n
\n
\n R2 Storage\n \n \n \n
\n

Available

\n
\n
\n\n
\n
\n
\n
\n KV Cache\n \n \n \n
\n

Ready

\n
\n
\n
\n `\n return c.html(html)\n } catch (error) {\n console.error('Error fetching system status:', error)\n return c.html('
Failed to load system status
')\n }\n})\n\nexport { router as adminDashboardRoutes }\n","export function isMarkdownEditorType(fieldType: string): boolean {\n return fieldType === 'markdown' || fieldType === 'mdxeditor' || fieldType === 'easymde'\n}\n\nexport function normalizeFieldType(fieldType: string): string {\n if (isMarkdownEditorType(fieldType)) {\n return 'markdown'\n }\n\n if (fieldType === 'tinymce') {\n return 'richtext'\n }\n\n return fieldType\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\nexport interface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCollectionsListPage(data: CollectionsListPageData): string {\n const tableData: any = {\n tableId: 'collections-table',\n rowClickable: true,\n rowClickUrl: (collection: Collection) => `/admin/collections/${collection.id}`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => `\n
\n \n ${collection.name}\n \n ${collection.managed ? `\n \n \n \n \n Config\n \n ` : ''}\n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'description',\n label: 'Description',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => collection.description || '-'\n },\n {\n key: 'field_count',\n label: 'Fields',\n sortable: true,\n sortType: 'number',\n render: (_value: any, collection: any) => {\n const count = collection.field_count || 0\n return `\n
\n \n ${count} ${count === 1 ? 'field' : 'fields'}\n \n
\n `\n }\n },\n {\n key: 'managed',\n label: 'Source',\n sortable: true,\n sortType: 'string',\n render: (_value: any, collection: any) => {\n if (collection.managed) {\n return `\n
\n \n \n \n Code\n
\n `\n } else {\n return `\n
\n \n \n \n \n \n Database\n
\n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Content',\n sortable: false,\n render: (_value: any, collection: any) => {\n if (!collection || !collection.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.collections,\n emptyMessage: 'No collections found.'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Collections

\n

Manage your content collections and their schemas

\n
\n \n
\n\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n Search\n \n \n \n
\n
\n ${data.collections.length} ${data.collections.length === 1 ? 'collection' : 'collections'}\n \n \n \n \n Refresh\n \n
\n
\n
\n
\n
\n\n \n
\n ${renderTable(tableData)}\n
\n\n \n ${data.collections.length === 0 ? `\n
\n \n \n \n

No collections found

\n

Get started by creating your first collection

\n \n
\n ` : ''}\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Collections',\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}","export interface TableColumn {\n key: string\n label: string\n sortable?: boolean\n className?: string\n sortType?: 'string' | 'number' | 'date' | 'boolean'\n render?: (value: any, row: any) => string\n}\n\nexport interface TableData {\n columns: TableColumn[]\n rows: T[]\n selectable?: boolean\n className?: string\n emptyMessage?: string\n tableId?: string\n title?: string\n rowClickable?: boolean\n rowClickUrl?: (row: T) => string\n}\n\nexport function renderTable(data: TableData): string {\n const tableId = data.tableId || `table-${Math.random().toString(36).substr(2, 9)}`\n\n if (data.rows.length === 0) {\n return `\n
\n
\n \n \n \n

${data.emptyMessage || 'No data available'}

\n
\n
\n `\n }\n\n return `\n
\n ${data.title ? `\n
\n

${data.title}

\n
\n ` : ''}\n
\n \n \n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, index) => {\n const isFirst = index === 0 && !data.selectable\n const isLast = index === data.columns.length - 1\n return `\n \n `}).join('')}\n \n \n \n ${data.rows.map((row, rowIndex) => {\n if (!row) return ''\n const clickableClass = data.rowClickable ? 'cursor-pointer' : ''\n const clickHandler = data.rowClickable && data.rowClickUrl ? `onclick=\"window.location.href='${data.rowClickUrl(row)}'\"` : ''\n return `\n \n ${data.selectable ? `\n \n ` : ''}\n ${data.columns.map((column, colIndex) => {\n const value = (row as any)[column.key]\n const displayValue = column.render ? column.render(value, row) : value\n const stopPropagation = column.key === 'actions' ? 'onclick=\"event.stopPropagation()\"' : ''\n const isFirst = colIndex === 0 && !data.selectable\n const isLast = colIndex === data.columns.length - 1\n return `\n \n `\n }).join('')}\n \n `\n }).join('')}\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${column.sortable ? `\n \n ${column.label}\n
\n \n \n \n \n \n \n
\n \n ` : column.label}\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n ${displayValue || ''}\n
\n
\n\n \n
\n `\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm, FormData, FormField } from '../form.template'\nimport { renderAlert } from '../components/alert.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\nimport { escapeHtml } from '../../utils/sanitize'\n\nexport interface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\nexport interface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\n// Helper function to get field type badge with color\nfunction getFieldTypeBadge(fieldType: string): string {\n const typeLabels: Record = {\n 'text': 'Text',\n 'slug': 'URL Slug',\n 'richtext': 'Rich Text (TinyMCE)',\n 'quill': 'Rich Text (Quill)',\n 'markdown': 'Markdown',\n 'mdxeditor': 'Markdown',\n 'easymde': 'Markdown',\n 'number': 'Number',\n 'boolean': 'Boolean',\n 'date': 'Date',\n 'select': 'Select',\n 'media': 'Media',\n 'reference': 'Reference'\n }\n const typeColors: Record = {\n 'text': 'bg-blue-500/10 dark:bg-blue-400/10 text-blue-700 dark:text-blue-300 ring-blue-500/20 dark:ring-blue-400/20',\n 'slug': 'bg-sky-500/10 dark:bg-sky-400/10 text-sky-700 dark:text-sky-300 ring-sky-500/20 dark:ring-sky-400/20',\n 'richtext': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'quill': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'markdown': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'mdxeditor': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'easymde': 'bg-purple-500/10 dark:bg-purple-400/10 text-purple-700 dark:text-purple-300 ring-purple-500/20 dark:ring-purple-400/20',\n 'number': 'bg-green-500/10 dark:bg-green-400/10 text-green-700 dark:text-green-300 ring-green-500/20 dark:ring-green-400/20',\n 'boolean': 'bg-amber-500/10 dark:bg-amber-400/10 text-amber-700 dark:text-amber-300 ring-amber-500/20 dark:ring-amber-400/20',\n 'date': 'bg-cyan-500/10 dark:bg-cyan-400/10 text-cyan-700 dark:text-cyan-300 ring-cyan-500/20 dark:ring-cyan-400/20',\n 'select': 'bg-indigo-500/10 dark:bg-indigo-400/10 text-indigo-700 dark:text-indigo-300 ring-indigo-500/20 dark:ring-indigo-400/20',\n 'media': 'bg-rose-500/10 dark:bg-rose-400/10 text-rose-700 dark:text-rose-300 ring-rose-500/20 dark:ring-rose-400/20',\n 'reference': 'bg-teal-500/10 dark:bg-teal-400/10 text-teal-700 dark:text-teal-300 ring-teal-500/20 dark:ring-teal-400/20'\n }\n const label = typeLabels[fieldType] || fieldType\n const color = typeColors[fieldType] || 'bg-zinc-500/10 dark:bg-zinc-400/10 text-zinc-700 dark:text-zinc-300 ring-zinc-500/20 dark:ring-zinc-400/20'\n return `${label}`\n}\n\nexport function renderCollectionFormPage(data: CollectionFormData): string {\n console.log('[renderCollectionFormPage] editorPlugins:', data.editorPlugins)\n\n const isEdit = data.isEdit || !!data.id\n const title = isEdit ? 'Edit Collection' : 'Create New Collection'\n const subtitle = isEdit\n ? `Update collection: ${data.display_name}`\n : 'Define a new content collection with custom fields and settings.'\n\n // Pre-compute data attribute for all fields (without badge HTML to avoid escaping issues)\n const fieldsWithData = (data.fields || []).map(field => ({\n ...field,\n dataFieldJSON: JSON.stringify(JSON.stringify(field))\n }))\n\n const fields: FormField[] = [\n {\n name: 'displayName',\n label: 'Display Name',\n type: 'text',\n value: data.display_name || '',\n placeholder: 'Blog Posts',\n required: true,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'name',\n label: 'Collection Name',\n type: 'text',\n value: data.name || '',\n placeholder: 'blog_posts',\n required: true,\n readonly: isEdit,\n helpText: isEdit ? 'Collection name cannot be changed' : 'Lowercase letters, numbers, and underscores only',\n className: isEdit ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n },\n {\n name: 'description',\n label: 'Description',\n type: 'textarea',\n value: data.description || '',\n placeholder: 'Description of this collection...',\n rows: 3,\n readonly: data.managed,\n className: data.managed ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 cursor-not-allowed' : ''\n }\n ]\n\n\n const formData: FormData = {\n id: 'collection-form',\n ...(isEdit\n ? { hxPut: `/admin/collections/${data.id}`, action: `/admin/collections/${data.id}`, method: 'PUT' }\n : { hxPost: '/admin/collections', action: '/admin/collections' }\n ),\n hxTarget: '#form-messages',\n fields: fields,\n submitButtons: data.managed ? [] : [\n {\n label: isEdit ? 'Update Collection' : 'Create Collection',\n type: 'submit',\n className: 'btn-primary'\n }\n ]\n }\n\n const pageContent = `\n
\n \n ${data.managed ? `\n
\n
\n \n \n \n
\n

\n Config-Managed Collection\n

\n
\n

This collection is managed by a configuration file and cannot be edited through the admin interface.

\n

\n Config file:\n \n src/collections/${data.name}.collection.ts\n \n

\n

\n To modify this collection's schema, edit the configuration file directly in your code editor.\n

\n
\n
\n
\n
\n ` : ''}\n\n \n
\n
\n

${title}

\n

${subtitle}

\n
\n \n
\n\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n

Collection Details

\n

Configure your collection settings below

\n
\n\n ${isEdit && data.name ? `\n \n
\n \n \n \n \n \n
\n ` : ''}\n
\n
\n\n \n
\n
\n ${data.error ? renderAlert({ type: 'error', message: data.error, dismissible: true }) : ''}\n ${data.success ? renderAlert({ type: 'success', message: data.success, dismissible: true }) : ''}\n\n \n \n \n ${renderForm(formData)}\n\n ${isEdit && data.managed ? `\n \n
\n
\n

Collection Fields

\n

Fields defined in the configuration file (read-only)

\n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n ${field.field_name}\n
\n
\n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add fields to your collection configuration file to see them here.

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${isEdit && !data.managed ? `\n \n
\n
\n
\n

Collection Fields

\n

Define the fields that content in this collection will have

\n
\n \n \n \n \n Add Field\n \n
\n\n \n
\n ${fieldsWithData.map(field => `\n
\n
\n
\n
\n \n \n \n
\n
\n
\n ${field.field_label}\n ${getFieldTypeBadge(field.field_type)}\n ${field.is_required ? `\n \n Required\n \n ` : ''}\n ${field.is_searchable ? `\n \n Searchable\n \n ` : ''}\n
\n
\n Field name: ${field.field_name}\n
\n
\n
\n
\n \n \n \n \n Edit\n \n \n \n \n \n Delete\n \n
\n
\n
\n `).join('')}\n\n ${(data.fields || []).length === 0 ? `\n
\n \n \n \n

No fields defined

\n

Add your first field to get started

\n
\n ` : ''}\n
\n
\n ` : ''}\n\n ${!isEdit ? `\n
\n
\n \n \n \n
\n

\n Create Collection First\n

\n

\n After creating the collection, you'll be able to add and configure custom fields.\n

\n
\n
\n
\n ` : ''}\n \n \n
\n \n \n \n \n ${data.managed ? 'Back to Collections' : 'Cancel'}\n \n\n ${isEdit && !data.managed ? `\n \n \n \n \n Delete Collection\n \n ` : ''}\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n

Add Field

\n \n
\n
\n\n
\n \n\n
\n \n \n

Lowercase letters, numbers, and underscores only

\n
\n\n
\n \n
\n \n \n \n \n ${data.editorPlugins?.tinymce ? '' : ''}\n ${data.editorPlugins?.quill ? '' : ''}\n ${data.editorPlugins?.easyMdx ? '' : ''}\n \n \n \n \n \n \n \n \n \n \n \n
\n

\n
\n\n
\n \n \n
\n\n
\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n\n
\n \n \n

JSON configuration for field-specific options

\n
\n\n
\n \n Cancel\n \n \n Add Field\n \n
\n
\n
\n
\n\n ${isEdit && data.name ? `\n \n
\n
\n
\n
\n

\n Code-Based version of ${escapeHtml(data.display_name || 'this collection')}\n

\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n

\n This is a code-based representation of ${data.display_name ? `the ${escapeHtml(data.display_name)}` : 'this'} collection.\n Learn more about\n \n collections here.\n \n

\n Copied!\n
\n
\n\n
\n \n Close\n \n
\n
\n
\n
\n\n \n ` : ''}\n \n\n \n ${renderConfirmationDialog({\n id: 'delete-field-confirm',\n title: 'Delete Field',\n message: 'Are you sure you want to delete this field? This action cannot be undone.',\n confirmText: 'Delete',\n cancelText: 'Cancel',\n iconColor: 'red',\n confirmClass: 'bg-red-500 hover:bg-red-400',\n onConfirm: 'performDeleteField()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: title,\n pageTitle: 'Collections',\n currentPath: '/admin/collections',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { html } from 'hono/html'\nimport { requireAuth, requireRole } from '../middleware'\nimport { isPluginActive } from '../middleware/plugin-middleware'\nimport { normalizeFieldType } from './admin-collections-field-types'\nimport { renderCollectionsListPage } from '../templates/pages/admin-collections-list.template'\nimport { renderCollectionFormPage } from '../templates/pages/admin-collections-form.template'\n\n// Type definitions for collections\ninterface Collection {\n id: string\n name: string\n display_name: string\n description?: string\n created_at: number\n formattedDate: string\n field_count?: number\n managed?: boolean\n}\n\ninterface CollectionFormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n fields?: CollectionField[]\n managed?: boolean\n isEdit?: boolean\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n editorPlugins?: {\n tinymce: boolean\n quill: boolean\n easyMdx: boolean\n }\n}\n\ninterface CollectionField {\n id: string\n field_name: string\n field_type: string\n field_label: string\n field_options: any\n field_order: number\n is_required: boolean\n is_searchable: boolean\n}\n\ninterface CollectionsListPageData {\n collections: Collection[]\n search?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminCollectionsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminCollectionsRoutes.use('*', requireAuth())\n\n// Enforce admin-only access on collection modification routes\nadminCollectionsRoutes.post('*', requireRole(['admin']))\nadminCollectionsRoutes.put('*', requireRole(['admin']))\nadminCollectionsRoutes.delete('*', requireRole(['admin']))\n\n// Collections management - List all collections\nadminCollectionsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const url = new URL(c.req.url)\n const search = url.searchParams.get('search') || ''\n\n // Build query based on search\n let stmt\n let results\n if (search) {\n stmt = db.prepare(`\n SELECT id, name, display_name, description, created_at, managed, schema\n FROM collections\n WHERE is_active = 1\n AND (source_type IS NULL OR source_type = 'user')\n AND (name LIKE ? OR display_name LIKE ? OR description LIKE ?)\n ORDER BY created_at DESC\n `)\n const searchParam = `%${search}%`\n const queryResults = await stmt.bind(searchParam, searchParam, searchParam).all()\n results = queryResults.results\n } else {\n stmt = db.prepare(\"SELECT id, name, display_name, description, created_at, managed, schema FROM collections WHERE is_active = 1 AND (source_type IS NULL OR source_type = 'user') ORDER BY created_at DESC\")\n const queryResults = await stmt.all()\n results = queryResults.results\n }\n\n // Fetch field counts for all collections from content_fields table (legacy)\n const fieldCountStmt = db.prepare('SELECT collection_id, COUNT(*) as count FROM content_fields GROUP BY collection_id')\n const { results: fieldCountResults } = await fieldCountStmt.all()\n const fieldCounts = new Map((fieldCountResults || []).map((row: any) => [String(row.collection_id), Number(row.count)]))\n\n const collections: Collection[] = (results || [])\n .filter((row: any) => row && row.id)\n .map((row: any) => {\n // Calculate field count: use schema if available, otherwise use content_fields table\n let fieldCount = 0\n if (row.schema) {\n try {\n const schema = typeof row.schema === 'string' ? JSON.parse(row.schema) : row.schema\n if (schema && schema.properties) {\n fieldCount = Object.keys(schema.properties).length\n }\n } catch (e) {\n // If schema parsing fails, fall back to content_fields count\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n } else {\n fieldCount = fieldCounts.get(String(row.id)) || 0\n }\n\n return {\n id: String(row.id || ''),\n name: String(row.name || ''),\n display_name: String(row.display_name || ''),\n description: row.description ? String(row.description) : undefined,\n created_at: Number(row.created_at || 0),\n formattedDate: row.created_at ? new Date(Number(row.created_at)).toLocaleDateString() : 'Unknown',\n field_count: fieldCount,\n managed: row.managed === 1\n }\n })\n\n const pageData: CollectionsListPageData = {\n collections,\n search,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCollectionsListPage(pageData))\n } catch (error) {\n console.error('Error fetching collections:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n return c.html(html`

Error loading collections: ${errorMessage}

`)\n }\n})\n\n// New collection form\nadminCollectionsRoutes.get('/new', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /new] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n isEdit: false,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n})\n\n// Create collection\nadminCollectionsRoutes.post('/', async (c) => {\n try {\n const formData = await c.req.formData()\n const name = formData.get('name') as string\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n // Check if this is an HTMX request\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n // Basic validation\n if (!name || !displayName) {\n const errorMsg = 'Name and display name are required.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n // For regular form submission, redirect back with error\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Validate name format\n if (!/^[a-z0-9_]+$/.test(name)) {\n const errorMsg = 'Collection name must contain only lowercase letters, numbers, and underscores.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n const db = c.env.DB\n\n // Check if collection already exists\n const existingStmt = db.prepare('SELECT id FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(name).first()\n\n if (existing) {\n const errorMsg = 'A collection with this name already exists.'\n if (isHtmx) {\n return c.html(html`\n
\n ${errorMsg}\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n\n // Create basic schema for the collection\n const basicSchema = {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n title: \"Title\",\n required: true\n },\n content: {\n type: \"string\",\n title: \"Content\",\n format: \"richtext\"\n },\n status: {\n type: \"string\",\n title: \"Status\",\n enum: [\"draft\", \"published\", \"archived\"],\n default: \"draft\"\n }\n },\n required: [\"title\"]\n }\n\n // Create collection\n const collectionId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n name,\n displayName,\n description || null,\n JSON.stringify(basicSchema),\n 1, // is_active\n now,\n now\n ).run()\n\n // Clear cache (only if CACHE_KV is available)\n if (c.env.CACHE_KV) {\n try {\n await c.env.CACHE_KV.delete('cache:collections:all')\n await c.env.CACHE_KV.delete(`cache:collection:${name}`)\n } catch (e) {\n console.error('Error clearing cache:', e)\n }\n }\n\n if (isHtmx) {\n return c.html(html`\n
\n Collection created successfully! Redirecting to edit mode...\n \n
\n `)\n } else {\n // For regular form submission, redirect to edit page\n return c.redirect(`/admin/collections/${collectionId}`)\n }\n } catch (error) {\n console.error('Error creating collection:', error)\n const isHtmx = c.req.header('HX-Request') === 'true'\n\n if (isHtmx) {\n return c.html(html`\n
\n Failed to create collection. Please try again.\n
\n `)\n } else {\n return c.redirect('/admin/collections/new')\n }\n }\n})\n\n// Edit collection form\nadminCollectionsRoutes.get('/:id', async (c) => {\n const db = c.env.DB\n try {\n const id = c.req.param('id')\n const user = c.get('user')\n\n const stmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await stmt.bind(id).first() as any\n\n if (!collection) {\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Collection not found.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n\n // Get collection fields - try schema first, then content_fields table\n let fields: CollectionField[] = []\n\n // If collection has a schema, parse it\n if (collection.schema) {\n try {\n const schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (schema && schema.properties) {\n // Convert schema properties to field format\n let fieldOrder = 0\n fields = Object.entries(schema.properties).map(([fieldName, fieldConfig]: [string, any]) => {\n // Normalize schema formats to UI field types\n let fieldType = fieldConfig.type || 'string'\n if (fieldConfig.enum) {\n fieldType = 'select'\n } else if (fieldConfig.format === 'richtext') {\n fieldType = 'richtext'\n } else if (fieldConfig.format === 'media') {\n fieldType = 'media'\n } else if (fieldConfig.format === 'date-time') {\n fieldType = 'date'\n } else if (fieldConfig.type === 'slug' || fieldConfig.format === 'slug') {\n fieldType = 'slug'\n }\n \n return {\n id: `schema-${fieldName}`,\n field_name: fieldName,\n field_type: fieldType,\n field_label: fieldConfig.title || fieldName,\n field_options: fieldConfig,\n field_order: fieldOrder++,\n is_required: fieldConfig.required === true || (schema.required && schema.required.includes(fieldName)),\n is_searchable: fieldConfig.searchable === true || false\n }\n })\n }\n } catch (e) {\n console.error('Error parsing collection schema:', e)\n }\n }\n\n // Fall back to content_fields table if no schema or parsing failed\n if (fields.length === 0) {\n const fieldsStmt = db.prepare(`\n SELECT * FROM content_fields\n WHERE collection_id = ?\n ORDER BY field_order ASC\n `)\n const { results: fieldsResults } = await fieldsStmt.bind(id).all()\n fields = (fieldsResults || []).map((row: any) => {\n let fieldOptions = {}\n if (row.field_options) {\n try {\n fieldOptions = typeof row.field_options === 'string' ? JSON.parse(row.field_options) : row.field_options\n } catch (e) {\n console.error('Error parsing field_options for field:', row.field_name, e)\n fieldOptions = {}\n }\n }\n return {\n id: row.id,\n field_name: row.field_name,\n field_type: row.field_type,\n field_label: row.field_label,\n field_options: fieldOptions,\n field_order: row.field_order,\n is_required: row.is_required === 1,\n is_searchable: row.is_searchable === 1\n }\n })\n }\n\n // Check which editor plugins are active\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n console.log('[Collections /:id] Editor plugins status:', {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n })\n\n const formData: CollectionFormData = {\n id: collection.id,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n fields: fields,\n managed: collection.managed === 1,\n isEdit: true,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n\n return c.html(renderCollectionFormPage(formData))\n } catch (error) {\n console.error('Error fetching collection:', error)\n const user = c.get('user')\n\n // Check which editor plugins are active (even in error state)\n const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([\n isPluginActive(db, 'tinymce-plugin'),\n isPluginActive(db, 'quill-editor'),\n isPluginActive(db, 'easy-mdx')\n ])\n\n const formData: CollectionFormData = {\n isEdit: true,\n error: 'Failed to load collection.',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion'),\n editorPlugins: {\n tinymce: tinymceActive,\n quill: quillActive,\n easyMdx: mdxeditorActive\n }\n }\n return c.html(renderCollectionFormPage(formData))\n }\n})\n\n// Update collection\nadminCollectionsRoutes.put('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const formData = await c.req.formData()\n const displayName = formData.get('displayName') as string\n const description = formData.get('description') as string\n\n if (!displayName) {\n return c.html(html`\n
\n Display name is required.\n
\n `)\n }\n\n const db = c.env.DB\n\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateStmt.bind(displayName, description || null, Date.now(), id).run()\n\n return c.html(html`\n
\n Collection updated successfully!\n
\n `)\n } catch (error) {\n console.error('Error updating collection:', error)\n return c.html(html`\n
\n Failed to update collection. Please try again.\n
\n `)\n }\n})\n\n// Delete collection\nadminCollectionsRoutes.delete('/:id', async (c) => {\n try {\n const id = c.req.param('id')\n const db = c.env.DB\n\n // Check if collection has content\n const contentStmt = db.prepare('SELECT COUNT(*) as count FROM content WHERE collection_id = ?')\n const contentResult = await contentStmt.bind(id).first() as any\n\n if (contentResult && contentResult.count > 0) {\n return c.html(html`\n
\n Cannot delete collection: it contains ${contentResult.count} content item(s). Delete all content first.\n
\n `)\n }\n\n // Delete collection fields first\n const deleteFieldsStmt = db.prepare('DELETE FROM content_fields WHERE collection_id = ?')\n await deleteFieldsStmt.bind(id).run()\n\n // Delete collection\n const deleteStmt = db.prepare('DELETE FROM collections WHERE id = ?')\n await deleteStmt.bind(id).run()\n\n return c.html(html`\n \n `)\n } catch (error) {\n console.error('Error deleting collection:', error)\n return c.html(html`\n
\n Failed to delete collection. Please try again.\n
\n `)\n }\n})\n\n// Add field to collection\nadminCollectionsRoutes.post('/:id/fields', async (c) => {\n try {\n const collectionId = c.req.param('id')\n const formData = await c.req.formData()\n const fieldName = formData.get('field_name') as string\n const fieldType = formData.get('field_type') as string\n const fieldLabel = formData.get('field_label') as string\n const isRequired = formData.get('is_required') === '1'\n const isSearchable = formData.get('is_searchable') === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n if (!fieldName || !fieldType || !fieldLabel) {\n return c.json({ success: false, error: 'Field name, type, and label are required.' })\n }\n\n // Validate field name format\n if (!/^[a-z0-9_]+$/.test(fieldName)) {\n return c.json({ success: false, error: 'Field name must contain only lowercase letters, numbers, and underscores.' })\n }\n\n const db = c.env.DB\n\n // Get current collection to check its schema\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Check if field already exists in schema\n let schema = collection.schema ? (typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema) : null\n\n if (schema && schema.properties && schema.properties[fieldName]) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Also check content_fields table for legacy support\n const existingStmt = db.prepare('SELECT id FROM content_fields WHERE collection_id = ? AND field_name = ?')\n const existing = await existingStmt.bind(collectionId, fieldName).first()\n\n if (existing) {\n return c.json({ success: false, error: 'A field with this name already exists.' })\n }\n\n // Parse field options\n let parsedOptions = {}\n try {\n parsedOptions = fieldOptions ? JSON.parse(fieldOptions) : {}\n } catch (e) {\n console.error('Error parsing field options:', e)\n }\n\n // Add field to schema (primary storage method)\n if (schema) {\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Build field config based on type\n const fieldConfig: any = {\n type: fieldType === 'number' ? 'number' : fieldType === 'boolean' ? 'boolean' : 'string',\n title: fieldLabel,\n searchable: isSearchable,\n ...parsedOptions\n }\n\n const normalizedFieldType = normalizeFieldType(fieldType)\n\n // Handle special field types\n if (normalizedFieldType === 'richtext') {\n fieldConfig.format = 'richtext'\n } else if (normalizedFieldType === 'date') {\n fieldConfig.format = 'date-time'\n } else if (normalizedFieldType === 'select') {\n fieldConfig.enum = (parsedOptions as any).options || []\n } else if (fieldType === 'radio') {\n fieldConfig.type = 'radio'\n if (!(parsedOptions as any).enum && (parsedOptions as any).options) {\n fieldConfig.enum = (parsedOptions as any).options\n }\n } else if (fieldType === 'media') {\n fieldConfig.format = 'media'\n } else if (normalizedFieldType === 'slug') {\n fieldConfig.type = 'slug'\n fieldConfig.format = 'slug'\n } else if (normalizedFieldType === 'quill') {\n fieldConfig.type = 'quill'\n } else if (normalizedFieldType === 'markdown') {\n fieldConfig.type = 'markdown'\n } else if (normalizedFieldType === 'reference') {\n fieldConfig.type = 'reference'\n }\n\n schema.properties[fieldName] = fieldConfig\n\n // Add to required array if needed\n if (isRequired && !schema.required.includes(fieldName)) {\n schema.required.push(fieldName)\n }\n\n // Update collection schema in database\n const updateSchemaStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateSchemaStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Add Field] Added field to schema:', fieldName, fieldConfig)\n\n return c.json({ success: true, fieldId: `schema-${fieldName}` })\n }\n\n // Fallback: If no schema exists, use content_fields table\n // Get next field order\n const orderStmt = db.prepare('SELECT MAX(field_order) as max_order FROM content_fields WHERE collection_id = ?')\n const orderResult = await orderStmt.bind(collectionId).first() as any\n const nextOrder = (orderResult?.max_order || 0) + 1\n\n // Create field in content_fields table\n const fieldId = crypto.randomUUID()\n const now = Date.now()\n\n const insertStmt = db.prepare(`\n INSERT INTO content_fields (\n id, collection_id, field_name, field_type, field_label,\n field_options, field_order, is_required, is_searchable,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n fieldId,\n collectionId,\n fieldName,\n fieldType,\n fieldLabel,\n fieldOptions,\n nextOrder,\n isRequired ? 1 : 0,\n isSearchable ? 1 : 0,\n now,\n now\n ).run()\n\n return c.json({ success: true, fieldId })\n } catch (error) {\n console.error('Error adding field:', error)\n return c.json({ success: false, error: 'Failed to add field.' })\n }\n})\n\n// Update field\nadminCollectionsRoutes.put('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const formData = await c.req.formData()\n const fieldLabel = formData.get('field_label') as string\n const fieldType = formData.get('field_type') as string\n // Use getAll() to handle hidden input + checkbox pattern (get last value)\n const isRequiredValues = formData.getAll('is_required')\n const isSearchableValues = formData.getAll('is_searchable')\n const isRequired = isRequiredValues[isRequiredValues.length - 1] === '1'\n const isSearchable = isSearchableValues[isSearchableValues.length - 1] === '1'\n const fieldOptions = formData.get('field_options') as string || '{}'\n\n // Log all form data for debugging\n console.log('[Field Update] Field ID:', fieldId)\n console.log('[Field Update] Form data received:', {\n field_label: fieldLabel,\n field_type: fieldType,\n is_required: formData.get('is_required'),\n is_searchable: formData.get('is_searchable'),\n field_options: fieldOptions\n })\n\n if (!fieldLabel) {\n return c.json({ success: false, error: 'Field label is required.' })\n }\n\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n // Schema fields are part of the collection's JSON schema\n // We need to update the collection's schema in the database\n const fieldName = fieldId.replace('schema-', '')\n\n console.log('[Field Update] Updating schema field:', fieldName)\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first()\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema) {\n schema = { type: 'object', properties: {}, required: [] }\n }\n if (!schema.properties) {\n schema.properties = {}\n }\n if (!schema.required) {\n schema.required = []\n }\n\n // Update the field in the schema\n if (schema.properties[fieldName]) {\n // Parse field options from form\n let parsedFieldOptions: Record = {}\n try {\n parsedFieldOptions = JSON.parse(fieldOptions)\n } catch (e) {\n console.error('[Field Update] Error parsing field options:', e)\n }\n\n // Build the updated field config - merge in field options\n const updatedFieldConfig: any = {\n ...schema.properties[fieldName],\n ...parsedFieldOptions,\n type: fieldType,\n title: fieldLabel,\n searchable: isSearchable\n }\n\n // Also set/remove the individual required property on the field\n // This ensures consistency regardless of which format is checked in GET\n if (isRequired) {\n updatedFieldConfig.required = true\n } else {\n delete updatedFieldConfig.required\n }\n\n schema.properties[fieldName] = updatedFieldConfig\n\n // Handle required field in the schema's required array (proper JSON Schema way)\n const requiredIndex = schema.required.indexOf(fieldName)\n console.log('[Field Update] Required field handling:', {\n fieldName,\n isRequired,\n currentRequiredArray: schema.required,\n requiredIndex\n })\n\n if (isRequired && requiredIndex === -1) {\n // Add to required array if checked and not already there\n schema.required.push(fieldName)\n console.log('[Field Update] Added field to required array')\n } else if (!isRequired && requiredIndex !== -1) {\n // Remove from required array if unchecked and currently there\n schema.required.splice(requiredIndex, 1)\n console.log('[Field Update] Removed field from required array')\n }\n\n console.log('[Field Update] Final required array:', schema.required)\n console.log('[Field Update] Final field config:', schema.properties[fieldName])\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Field Update] Schema update result:', {\n success: result.success,\n changes: result.meta?.changes\n })\n\n return c.json({ success: true })\n }\n\n // For regular database fields\n const updateStmt = db.prepare(`\n UPDATE content_fields\n SET field_label = ?, field_type = ?, field_options = ?, is_required = ?, is_searchable = ?, updated_at = ?\n WHERE id = ?\n `)\n\n const result = await updateStmt.bind(fieldLabel, fieldType, fieldOptions, isRequired ? 1 : 0, isSearchable ? 1 : 0, Date.now(), fieldId).run()\n\n console.log('[Field Update] Update result:', {\n success: result.success,\n meta: result.meta,\n changes: result.meta?.changes,\n last_row_id: result.meta?.last_row_id\n })\n\n // Verify the update by reading back the field\n const verifyStmt = db.prepare('SELECT * FROM content_fields WHERE id = ?')\n const verifyResult = await verifyStmt.bind(fieldId).first()\n console.log('[Field Update] Verification - field after update:', verifyResult)\n\n console.log('[Field Update] Successfully updated field with type:', fieldType)\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error updating field:', error)\n return c.json({ success: false, error: 'Failed to update field.' })\n }\n})\n\n// Delete field\nadminCollectionsRoutes.delete('/:collectionId/fields/:fieldId', async (c) => {\n try {\n const fieldId = c.req.param('fieldId')\n const collectionId = c.req.param('collectionId')\n const db = c.env.DB\n\n // Check if this is a schema field (starts with \"schema-\")\n if (fieldId.startsWith('schema-')) {\n const fieldName = fieldId.replace('schema-', '')\n\n // Get the current collection\n const getCollectionStmt = db.prepare('SELECT * FROM collections WHERE id = ?')\n const collection = await getCollectionStmt.bind(collectionId).first() as any\n\n if (!collection) {\n return c.json({ success: false, error: 'Collection not found.' })\n }\n\n // Parse the current schema\n let schema = typeof collection.schema === 'string' ? JSON.parse(collection.schema) : collection.schema\n if (!schema || !schema.properties) {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n\n // Remove field from schema\n if (schema.properties[fieldName]) {\n delete schema.properties[fieldName]\n\n // Also remove from required array if present\n if (schema.required && Array.isArray(schema.required)) {\n const requiredIndex = schema.required.indexOf(fieldName)\n if (requiredIndex !== -1) {\n schema.required.splice(requiredIndex, 1)\n }\n }\n\n // Update the collection in the database\n const updateCollectionStmt = db.prepare(`\n UPDATE collections\n SET schema = ?, updated_at = ?\n WHERE id = ?\n `)\n\n await updateCollectionStmt.bind(JSON.stringify(schema), Date.now(), collectionId).run()\n\n console.log('[Delete Field] Removed field from schema:', fieldName)\n\n return c.json({ success: true })\n } else {\n return c.json({ success: false, error: 'Field not found in schema.' })\n }\n }\n\n // For regular database fields\n const deleteStmt = db.prepare('DELETE FROM content_fields WHERE id = ?')\n await deleteStmt.bind(fieldId).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error deleting field:', error)\n return c.json({ success: false, error: 'Failed to delete field.' })\n }\n})\n\n// Update field order\nadminCollectionsRoutes.post('/:collectionId/fields/reorder', async (c) => {\n try {\n const body = await c.req.json()\n const fieldIds = body.fieldIds as string[]\n\n if (!Array.isArray(fieldIds)) {\n return c.json({ success: false, error: 'Invalid field order data.' })\n }\n\n const db = c.env.DB\n\n // Update field order\n for (let i = 0; i < fieldIds.length; i++) {\n const updateStmt = db.prepare('UPDATE content_fields SET field_order = ?, updated_at = ? WHERE id = ?')\n await updateStmt.bind(i + 1, Date.now(), fieldIds[i]).run()\n }\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error reordering fields:', error)\n return c.json({ success: false, error: 'Failed to reorder fields.' })\n }\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface SettingsPageData {\n user?: {\n name: string\n email: string\n role: string\n }\n settings?: {\n general?: GeneralSettings\n appearance?: AppearanceSettings\n security?: SecuritySettings\n notifications?: NotificationSettings\n storage?: StorageSettings\n migrations?: MigrationSettings\n databaseTools?: DatabaseToolsSettings\n }\n activeTab?: string\n version?: string\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface AppearanceSettings {\n theme: 'light' | 'dark' | 'auto'\n primaryColor: string\n logoUrl: string\n favicon: string\n customCSS: string\n}\n\nexport interface SecuritySettings {\n twoFactorEnabled: boolean\n sessionTimeout: number\n passwordRequirements: {\n minLength: number\n requireUppercase: boolean\n requireNumbers: boolean\n requireSymbols: boolean\n }\n ipWhitelist: string[]\n jwtExpiresIn?: string\n jwtRefreshGraceSeconds?: number\n}\n\nexport interface NotificationSettings {\n emailNotifications: boolean\n contentUpdates: boolean\n systemAlerts: boolean\n userRegistrations: boolean\n emailFrequency: 'immediate' | 'daily' | 'weekly'\n}\n\nexport interface StorageSettings {\n maxFileSize: number\n allowedFileTypes: string[]\n storageProvider: 'local' | 'cloudflare' | 's3'\n backupFrequency: 'daily' | 'weekly' | 'monthly'\n retentionPeriod: number\n}\n\nexport interface MigrationSettings {\n totalMigrations: number\n appliedMigrations: number\n pendingMigrations: number\n lastApplied?: string\n migrations: Array<{\n id: string\n name: string\n filename: string\n description?: string\n applied: boolean\n appliedAt?: string\n size?: number\n }>\n}\n\nexport interface DatabaseToolsSettings {\n totalTables: number\n totalRows: number\n lastBackup?: string\n databaseSize?: string\n tables: Array<{\n name: string\n rowCount: number\n }>\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const activeTab = data.activeTab || 'general'\n \n const pageContent = `\n
\n \n
\n
\n

Settings

\n

Manage your application settings and preferences

\n
\n
\n\n \n
\n
\n \n
\n
\n\n \n
\n
\n ${renderTabContent(activeTab, data.settings)}\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'run-migrations-confirm',\n title: 'Run Migrations',\n message: 'Are you sure you want to run pending migrations? This action cannot be undone.',\n confirmText: 'Run Migrations',\n cancelText: 'Cancel',\n iconColor: 'blue',\n confirmClass: 'bg-blue-500 hover:bg-blue-400',\n onConfirm: 'performRunMigrations()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Settings',\n pageTitle: 'Settings',\n currentPath: '/admin/settings',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderTabButton(tabId: string, label: string, iconPath: string, activeTab: string): string {\n const isActive = activeTab === tabId\n const baseClasses = 'flex items-center space-x-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 whitespace-nowrap no-underline'\n const activeClasses = isActive\n ? 'border-zinc-950 dark:border-white text-zinc-950 dark:text-white'\n : 'border-transparent text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-300 hover:border-zinc-300 dark:hover:border-zinc-700'\n\n return `\n \n \n \n \n ${label}\n \n `\n}\n\nfunction renderTabContent(activeTab: string, settings?: SettingsPageData['settings']): string {\n switch (activeTab) {\n case 'general':\n return renderGeneralSettings(settings?.general)\n case 'appearance':\n return renderAppearanceSettings(settings?.appearance)\n case 'security':\n return renderSecuritySettings(settings?.security)\n case 'notifications':\n return renderNotificationSettings(settings?.notifications)\n case 'storage':\n return renderStorageSettings(settings?.storage)\n case 'migrations':\n return renderMigrationSettings(settings?.migrations)\n case 'database-tools':\n return renderDatabaseToolsSettings(settings?.databaseTools)\n default:\n return renderGeneralSettings(settings?.general)\n }\n}\n\nfunction renderGeneralSettings(settings?: GeneralSettings): string {\n return `\n
\n
\n

General Settings

\n

Configure basic application settings and preferences.

\n
\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n
\n \n ${settings?.siteDescription || ''}\n
\n\n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderAppearanceSettings(settings?: AppearanceSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Appearance Settings

\n

Customize the look and feel of your application.

\n
\n \n
\n
\n
\n \n
\n \n \n \n
\n
\n \n
\n \n
\n \n \n
\n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderSecuritySettings(settings?: SecuritySettings): string {\n const jwtExpiresIn = settings?.jwtExpiresIn ?? '30d'\n const jwtRefreshGraceSeconds =\n typeof settings?.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n\n return `\n
\n \n
\n

Session / JWT

\n

\n Configure how long a signed-in session lasts and how long an expired token can still be refreshed.\n The JWT_EXPIRES_IN and JWT_REFRESH_GRACE_SECONDS\n environment variables, when set, override the values below.\n

\n\n
\n
\n \n \n

\n Accepts 30d, 12h, 3600s, or bare seconds. Default: 30 days.\n

\n
\n\n
\n \n \n

\n How long an expired token can still be exchanged at /auth/refresh. Default: 604800 (7 days).\n

\n
\n
\n\n
\n \n \n \n \n Save Session Settings\n \n
\n
\n\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n The fields below are under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Security Settings

\n

Configure security and authentication settings.

\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n \n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n

Leave empty to allow all IPs

\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderNotificationSettings(settings?: NotificationSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Notification Settings

\n

Configure how and when you receive notifications.

\n
\n \n
\n
\n
\n

Email Notifications

\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Notification Preferences
\n

\n Critical system alerts will always be sent immediately regardless of your frequency setting.\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderStorageSettings(settings?: StorageSettings): string {\n return `\n
\n \n
\n
\n \n \n \n
\n

Work in Progress

\n

\n This settings section is currently under development and provided for reference and design feedback only. Changes made here will not be saved.\n

\n
\n
\n
\n\n
\n

Storage Settings

\n

Configure file storage and backup settings.

\n
\n \n
\n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n \n
\n \n \n
\n \n
\n
\n \n \n \n
\n
Storage Status
\n

\n Current usage: 2.4 GB / 10 GB available\n

\n
\n
\n
\n
\n
\n\n \n
\n \n \n \n \n Save Changes\n \n
\n
\n `\n}\n\nfunction renderMigrationSettings(settings?: MigrationSettings): string {\n return `\n
\n
\n

Database Migrations

\n

View and manage database migrations to keep your schema up to date.

\n
\n \n \n
\n
\n
\n
\n

Total Migrations

\n

${settings?.totalMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Applied

\n

${settings?.appliedMigrations || '0'}

\n
\n \n \n \n
\n
\n \n
\n
\n
\n

Pending

\n

${settings?.pendingMigrations || '0'}

\n
\n \n \n \n
\n
\n
\n\n \n
\n \n \n \n\n \n
\n\n \n
\n
\n

Migration History

\n

List of all available database migrations

\n
\n \n
\n
\n \n \n \n

Loading migration status...

\n
\n
\n
\n
\n\n \n `\n}\n\nfunction renderDatabaseToolsSettings(settings?: DatabaseToolsSettings): string {\n return `\n
\n
\n

Database Tools

\n

Manage database operations including backup, restore, and maintenance.

\n
\n\n \n
\n
\n
\n
\n

Total Tables

\n

${settings?.totalTables || '0'}

\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n
\n

Total Rows

\n

${settings?.totalRows?.toLocaleString() || '0'}

\n
\n
\n \n \n \n
\n
\n
\n
\n\n \n
\n \n
\n

Safe Operations

\n
\n \n \n \n \n Refresh Stats\n \n\n \n \n \n \n Create Backup\n \n\n \n \n \n \n Validate Database\n \n
\n
\n
\n\n \n
\n
\n

Database Tables

\n

Click on a table to view its data

\n
\n\n
\n
\n \n \n \n

Loading database statistics...

\n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

Danger Zone

\n

\n These operations are destructive and cannot be undone.\n Your admin account will be preserved, but all other data will be permanently deleted.\n

\n
\n \n \n \n \n Truncate All Data\n \n
\n
\n
\n
\n
\n `\n}","import { Hono } from 'hono'\n// import { html } from 'hono/html'\nimport { requireAuth } from '../middleware'\nimport { renderSettingsPage, SettingsPageData } from '../templates/pages/admin-settings.template'\nimport { MigrationService } from '../services/migrations'\nimport { SettingsService } from '../services/settings'\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminSettingsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminSettingsRoutes.use('*', requireAuth())\n\n// Helper function to get mock settings data\nfunction getMockSettings(user: any) {\n return {\n general: {\n siteName: 'SonicJS AI',\n siteDescription: 'A modern headless CMS powered by AI',\n adminEmail: user?.email || 'admin@example.com',\n timezone: 'UTC',\n language: 'en',\n maintenanceMode: false\n },\n appearance: {\n theme: 'dark' as const,\n primaryColor: '#465FFF',\n logoUrl: '',\n favicon: '',\n customCSS: ''\n },\n security: {\n twoFactorEnabled: false,\n sessionTimeout: 30,\n passwordRequirements: {\n minLength: 8,\n requireUppercase: true,\n requireNumbers: true,\n requireSymbols: false\n },\n ipWhitelist: []\n },\n notifications: {\n emailNotifications: true,\n contentUpdates: true,\n systemAlerts: true,\n userRegistrations: false,\n emailFrequency: 'immediate' as const\n },\n storage: {\n maxFileSize: 10,\n allowedFileTypes: ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'docx'],\n storageProvider: 'cloudflare' as const,\n backupFrequency: 'daily' as const,\n retentionPeriod: 30\n },\n migrations: {\n totalMigrations: 0,\n appliedMigrations: 0,\n pendingMigrations: 0,\n lastApplied: undefined,\n migrations: []\n },\n databaseTools: {\n totalTables: 0,\n totalRows: 0,\n lastBackup: undefined,\n databaseSize: '0 MB',\n tables: []\n }\n }\n}\n\n// Settings page (redirects to general settings)\nadminSettingsRoutes.get('/', (c) => {\n return c.redirect('/admin/settings/general')\n})\n\n// General settings\nadminSettingsRoutes.get('/general', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Get real general settings from database\n const generalSettings = await settingsService.getGeneralSettings(user?.email)\n\n const mockSettings = getMockSettings(user)\n mockSettings.general = generalSettings\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'general',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Appearance settings\nadminSettingsRoutes.get('/appearance', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'appearance',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Security settings\nadminSettingsRoutes.get('/security', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Load persisted security settings (JWT TTL + refresh grace)\n const persisted = await settingsService.getSecuritySettings()\n\n const mockSettings = getMockSettings(user)\n mockSettings.security = {\n ...mockSettings.security,\n jwtExpiresIn: persisted.jwtExpiresIn,\n jwtRefreshGraceSeconds: persisted.jwtRefreshGraceSeconds\n } as any\n\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: mockSettings,\n activeTab: 'security',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Notifications settings\nadminSettingsRoutes.get('/notifications', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'notifications',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Storage settings\nadminSettingsRoutes.get('/storage', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'storage',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Migrations settings\nadminSettingsRoutes.get('/migrations', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'migrations',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Database tools settings\nadminSettingsRoutes.get('/database-tools', (c) => {\n const user = c.get('user')\n const pageData: SettingsPageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n settings: getMockSettings(user),\n activeTab: 'database-tools',\n version: c.get('appVersion')\n }\n return c.html(renderSettingsPage(pageData))\n})\n\n// Get migration status\nadminSettingsRoutes.get('/api/migrations/status', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const status = await migrationService.getMigrationStatus()\n\n return c.json({\n success: true,\n data: status\n })\n } catch (error) {\n console.error('Error fetching migration status:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch migration status'\n }, 500)\n }\n})\n\n// Run pending migrations\nadminSettingsRoutes.post('/api/migrations/run', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users to run migrations\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const result = await migrationService.runPendingMigrations()\n\n return c.json({\n success: result.success,\n message: result.message,\n applied: result.applied\n })\n } catch (error) {\n console.error('Error running migrations:', error)\n return c.json({\n success: false,\n error: 'Failed to run migrations'\n }, 500)\n }\n})\n\n// Validate database schema\nadminSettingsRoutes.get('/api/migrations/validate', async (c) => {\n try {\n const db = c.env.DB\n const migrationService = new MigrationService(db)\n const validation = await migrationService.validateSchema()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating schema:', error)\n return c.json({\n success: false,\n error: 'Failed to validate schema'\n }, 500)\n }\n})\n\n// Get database tools stats\nadminSettingsRoutes.get('/api/database-tools/stats', async (c) => {\n try {\n const db = c.env.DB\n\n // Get list of all tables\n const tablesQuery = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT LIKE '_cf_%'\n ORDER BY name\n `).all()\n\n const tables = tablesQuery.results || []\n let totalRows = 0\n\n // Get row count for each table\n const tableStats = await Promise.all(\n tables.map(async (table: any) => {\n try {\n const countResult = await db.prepare(`SELECT COUNT(*) as count FROM ${table.name}`).first()\n const rowCount = (countResult as any)?.count || 0\n totalRows += rowCount\n return {\n name: table.name,\n rowCount\n }\n } catch (error) {\n console.error(`Error counting rows in ${table.name}:`, error)\n return {\n name: table.name,\n rowCount: 0\n }\n }\n })\n )\n\n // D1 doesn't expose database size directly, so we'll estimate based on row counts\n // Average row size estimate: 1KB per row (rough approximation)\n const estimatedSizeBytes = totalRows * 1024\n const databaseSizeMB = (estimatedSizeBytes / (1024 * 1024)).toFixed(2)\n\n return c.json({\n success: true,\n data: {\n totalTables: tables.length,\n totalRows,\n databaseSize: `${databaseSizeMB} MB (estimated)`,\n tables: tableStats\n }\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({\n success: false,\n error: 'Failed to fetch database statistics'\n }, 500)\n }\n})\n\n// Validate database\nadminSettingsRoutes.get('/api/database-tools/validate', async (c) => {\n try {\n const db = c.env.DB\n\n // Run PRAGMA integrity_check\n const integrityResult = await db.prepare('PRAGMA integrity_check').first()\n const isValid = (integrityResult as any)?.integrity_check === 'ok'\n\n return c.json({\n success: true,\n data: {\n valid: isValid,\n message: isValid ? 'Database integrity check passed' : 'Database integrity check failed'\n }\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n})\n\n// Backup database\nadminSettingsRoutes.post('/api/database-tools/backup', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n // TODO: Implement actual backup functionality\n // For now, return success message\n return c.json({\n success: true,\n message: 'Database backup feature coming soon. Use Cloudflare Dashboard for backups.'\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({\n success: false,\n error: 'Failed to create backup'\n }, 500)\n }\n})\n\n// Truncate tables\nadminSettingsRoutes.post('/api/database-tools/truncate', async (c) => {\n try {\n const user = c.get('user')\n\n // Only allow admin users\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const body = await c.req.json()\n const tablesToTruncate = body.tables || []\n\n if (!Array.isArray(tablesToTruncate) || tablesToTruncate.length === 0) {\n return c.json({\n success: false,\n error: 'No tables specified for truncation'\n }, 400)\n }\n\n const db = c.env.DB\n const results = []\n\n // Validate table names against actual database tables (prevents SQL injection)\n const tablesResult = await db.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n AND name NOT LIKE 'sqlite_%'\n `).all()\n const validTables = new Set(\n (tablesResult.results || []).map((row: any) => row.name)\n )\n\n for (const tableName of tablesToTruncate) {\n if (!validTables.has(tableName)) {\n results.push({ table: tableName, success: false, error: 'Table not found' })\n continue\n }\n try {\n await db.prepare(`DELETE FROM ${tableName}`).run()\n results.push({ table: tableName, success: true })\n } catch (error) {\n console.error(`Error truncating ${tableName}:`, error)\n results.push({ table: tableName, success: false, error: String(error) })\n }\n }\n\n return c.json({\n success: true,\n message: `Truncated ${results.filter(r => r.success).length} of ${tablesToTruncate.length} tables`,\n results\n })\n } catch (error) {\n console.error('Error truncating tables:', error)\n return c.json({\n success: false,\n error: 'Failed to truncate tables'\n }, 500)\n }\n})\n\n// Save general settings\nadminSettingsRoutes.post('/general', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n // Extract general settings from form data\n const settings = {\n siteName: formData.get('siteName') as string,\n siteDescription: formData.get('siteDescription') as string,\n adminEmail: formData.get('adminEmail') as string,\n timezone: formData.get('timezone') as string,\n language: formData.get('language') as string,\n maintenanceMode: formData.get('maintenanceMode') === 'true'\n }\n\n // Validate required fields\n if (!settings.siteName || !settings.siteDescription) {\n return c.json({\n success: false,\n error: 'Site name and description are required'\n }, 400)\n }\n\n // Save settings to database\n const success = await settingsService.saveGeneralSettings(settings)\n\n if (success) {\n return c.json({\n success: true,\n message: 'General settings saved successfully!'\n })\n } else {\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n }\n } catch (error) {\n console.error('Error saving general settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save security settings (JWT TTL + refresh grace)\nadminSettingsRoutes.post('/security', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const formData = await c.req.formData()\n const db = c.env.DB\n const settingsService = new SettingsService(db)\n\n const jwtExpiresInRaw = (formData.get('jwtExpiresIn') as string | null)?.trim() || ''\n const graceRaw = (formData.get('jwtRefreshGraceSeconds') as string | null)?.trim() || ''\n\n // Validate jwtExpiresIn: bare seconds or \n if (!/^\\d+(?:s|m|h|d)?$/i.test(jwtExpiresInRaw)) {\n return c.json({\n success: false,\n error: 'JWT expiration must be a number optionally suffixed with s/m/h/d (e.g. 30d, 12h, 3600).'\n }, 400)\n }\n\n const graceSeconds = Number.parseInt(graceRaw, 10)\n if (!Number.isFinite(graceSeconds) || graceSeconds < 0 || graceSeconds > 60 * 60 * 24 * 90) {\n return c.json({\n success: false,\n error: 'Refresh grace must be an integer between 0 and 7776000 seconds (90 days).'\n }, 400)\n }\n\n const success = await settingsService.saveSecuritySettings({\n jwtExpiresIn: jwtExpiresInRaw,\n jwtRefreshGraceSeconds: graceSeconds\n })\n\n if (success) {\n return c.json({\n success: true,\n message: 'Security settings saved successfully!'\n })\n }\n return c.json({\n success: false,\n error: 'Failed to save settings'\n }, 500)\n } catch (error) {\n console.error('Error saving security settings:', error)\n return c.json({\n success: false,\n error: 'Failed to save settings. Please try again.'\n }, 500)\n }\n})\n\n// Save settings (legacy endpoint - redirect to general)\nadminSettingsRoutes.post('/', async (c) => {\n return c.redirect('/admin/settings/general')\n})\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderTable } from '../components/table.template'\n\nexport interface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n formattedDate: string\n}\n\nexport interface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormsListPage(data: FormsListPageData): string {\n const tableData: any = {\n tableId: 'forms-table',\n rowClickable: true,\n rowClickUrl: (form: Form) => `/admin/forms/${form.id}/builder`,\n columns: [\n {\n key: 'name',\n label: 'Name',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => `\n
\n \n ${form.name}\n \n
\n `\n },\n {\n key: 'display_name',\n label: 'Display Name',\n sortable: true,\n sortType: 'string'\n },\n {\n key: 'category',\n label: 'Category',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n const categoryColors: Record = {\n 'contact': 'bg-blue-50 dark:bg-blue-500/10 text-blue-700 dark:text-blue-300 ring-blue-700/10 dark:ring-blue-400/20',\n 'survey': 'bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-300 ring-purple-700/10 dark:ring-purple-400/20',\n 'registration': 'bg-green-50 dark:bg-green-500/10 text-green-700 dark:text-green-300 ring-green-700/10 dark:ring-green-400/20',\n 'feedback': 'bg-orange-50 dark:bg-orange-500/10 text-orange-700 dark:text-orange-300 ring-orange-700/10 dark:ring-orange-400/20',\n 'general': 'bg-gray-50 dark:bg-gray-500/10 text-gray-700 dark:text-gray-300 ring-gray-700/10 dark:ring-gray-400/20'\n }\n const colorClass = categoryColors[form.category] || categoryColors['general']\n return `\n \n ${form.category || 'general'}\n \n `\n }\n },\n {\n key: 'submission_count',\n label: 'Submissions',\n sortable: true,\n sortType: 'number',\n render: (_value: any, form: any) => {\n const count = form.submission_count || 0\n return `\n
\n \n ${count}\n \n
\n `\n }\n },\n {\n key: 'is_active',\n label: 'Status',\n sortable: true,\n sortType: 'string',\n render: (_value: any, form: any) => {\n if (form.is_active) {\n return `\n \n Active\n \n `\n } else {\n return `\n \n Inactive\n \n `\n }\n }\n },\n {\n key: 'formattedDate',\n label: 'Created',\n sortable: true,\n sortType: 'date'\n },\n {\n key: 'actions',\n label: 'Actions',\n sortable: false,\n render: (_value: any, form: any) => {\n if (!form || !form.id) return '-'\n return `\n \n `\n }\n }\n ],\n rows: data.forms,\n emptyMessage: 'No forms found. Create your first form to get started!'\n }\n\n const pageContent = `\n
\n \n
\n
\n

Forms

\n

Create and manage forms with the visual form builder

\n
\n \n
\n\n \n
\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Forms
\n
${data.forms.length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Active Forms
\n
${data.forms.filter(f => f.is_active).length}
\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n
\n
\n
\n
Total Submissions
\n
${data.forms.reduce((sum, f) => sum + (f.submission_count || 0), 0)}
\n
\n
\n
\n
\n
\n\n \n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Filter\n \n ${data.search || data.category ? `\n \n Clear\n \n ` : ''}\n \n
\n\n \n
\n ${renderTable(tableData)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Forms',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface FormBuilderPageData {\n id: string\n name: string\n display_name: string\n description?: string\n category?: string\n formio_schema: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\n// Inline Turnstile component for Form.io builder\nfunction getTurnstileComponentScript(): string {\n return `\n (function() {\n 'use strict';\n\n if (!window.Formio || !window.Formio.Components) {\n console.error('Form.io library not loaded');\n return;\n }\n\n const FieldComponent = Formio.Components.components.field;\n\n class TurnstileComponent extends FieldComponent {\n static schema(...extend) {\n return FieldComponent.schema({\n type: 'turnstile',\n label: 'Turnstile Verification',\n key: 'turnstile',\n input: true,\n persistent: false,\n protected: true,\n unique: false,\n hidden: false,\n clearOnHide: true,\n tableView: false,\n validate: {\n required: false\n },\n siteKey: '',\n theme: 'auto',\n size: 'normal',\n action: '',\n appearance: 'always',\n errorMessage: 'Please complete the security verification'\n }, ...extend);\n }\n\n static get builderInfo() {\n return {\n title: 'Turnstile',\n group: 'premium',\n icon: 'fa fa-shield-alt',\n weight: 120,\n documentation: '/admin/forms/docs#turnstile',\n schema: TurnstileComponent.schema()\n };\n }\n\n constructor(component, options, data) {\n super(component, options, data);\n this.widgetId = null;\n this.scriptLoaded = false;\n }\n\n init() {\n super.init();\n // Only load script if NOT in builder/edit mode\n if (!this.options.editMode && !this.options.builder && !this.builderMode) {\n this.loadTurnstileScript();\n }\n }\n\n loadTurnstileScript() {\n // Extra safety: never load in builder\n if (this.options.editMode || this.options.builder || this.builderMode) {\n console.log('Turnstile: Skipping script load in builder mode');\n return Promise.resolve();\n }\n\n if (window.turnstile) {\n this.scriptLoaded = true;\n return Promise.resolve();\n }\n\n if (this.scriptPromise) {\n return this.scriptPromise;\n }\n\n console.log('Turnstile: Loading script for form mode');\n this.scriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js';\n script.async = true;\n script.defer = true;\n script.onload = () => {\n this.scriptLoaded = true;\n resolve();\n };\n script.onerror = () => reject(new Error('Failed to load Turnstile'));\n document.head.appendChild(script);\n });\n\n return this.scriptPromise;\n }\n\n render() {\n return super.render(\\`\n
\n
\n \\${this.component.description ? \\`
\\${this.component.description}
\\` : ''}\n
\n \\`);\n }\n\n attach(element) {\n this.loadRefs(element, {\n turnstileContainer: 'single',\n turnstileWidget: 'single'\n });\n\n const superAttach = super.attach(element);\n\n // Check if we're in builder mode or form mode\n if (this.options.editMode || this.options.builder) {\n // Builder mode - show placeholder only\n this.renderPlaceholder();\n } else {\n // Form mode - render actual widget\n this.loadTurnstileScript()\n .then(() => this.renderWidget())\n .catch(err => {\n console.error('Failed to load Turnstile:', err);\n if (this.refs.turnstileWidget) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to load security verification\n
\n \\`;\n }\n });\n }\n\n return superAttach;\n }\n\n renderPlaceholder() {\n if (!this.refs.turnstileWidget) {\n return;\n }\n \n this.refs.turnstileWidget.innerHTML = \\`\n
\n
🛡️
\n
Turnstile Verification
\n
CAPTCHA-free bot protection by Cloudflare
\n
Widget will appear here on the live form
\n
\n \\`;\n }\n\n renderWidget() {\n if (!this.refs.turnstileWidget || !window.turnstile) {\n return;\n }\n\n this.refs.turnstileWidget.innerHTML = '';\n\n const siteKey = this.component.siteKey || \n (this.root && this.root.options && this.root.options.turnstileSiteKey) || \n '';\n \n if (!siteKey) {\n this.refs.turnstileWidget.innerHTML = \\`\n
\n ⚠️ Configuration Required: Turnstile site key not configured. \n Please enable the Turnstile plugin in Settings → Plugins.\n
\n \\`;\n return;\n }\n\n try {\n const self = this;\n this.widgetId = window.turnstile.render(this.refs.turnstileWidget, {\n sitekey: siteKey,\n theme: this.component.theme || 'auto',\n size: this.component.size || 'normal',\n action: this.component.action || '',\n appearance: this.component.appearance || 'always',\n callback: function(token) {\n self.updateValue(token);\n self.triggerChange();\n },\n 'error-callback': function() {\n self.updateValue(null);\n self.setCustomValidity(self.component.errorMessage || 'Security verification failed');\n },\n 'expired-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification expired. Please verify again.');\n },\n 'timeout-callback': function() {\n self.updateValue(null);\n self.setCustomValidity('Security verification timed out. Please try again.');\n }\n });\n } catch (err) {\n console.error('Failed to render Turnstile widget:', err);\n this.refs.turnstileWidget.innerHTML = \\`\n
\n Error: Failed to render security verification\n
\n \\`;\n }\n }\n\n detach() {\n if (this.widgetId !== null && window.turnstile) {\n try {\n window.turnstile.remove(this.widgetId);\n this.widgetId = null;\n } catch (err) {\n console.error('Failed to remove Turnstile widget:', err);\n }\n }\n return super.detach();\n }\n\n getValue() {\n if (this.widgetId !== null && window.turnstile) {\n return window.turnstile.getResponse(this.widgetId);\n }\n return this.dataValue;\n }\n\n setValue(value, flags) {\n const changed = super.setValue(value, flags);\n return changed;\n }\n\n getValueAsString(value) {\n return value ? '✅ Verified' : '❌ Not Verified';\n }\n\n isEmpty(value) {\n return !value;\n }\n\n updateValue(value, flags) {\n const changed = super.updateValue(value, flags);\n \n if (value) {\n this.setCustomValidity('');\n }\n \n return changed;\n }\n\n checkValidity(data, dirty, row) {\n const result = super.checkValidity(data, dirty, row);\n \n if (this.component.validate && this.component.validate.required) {\n const value = this.getValue();\n if (!value) {\n this.setCustomValidity(this.component.errorMessage || 'Please complete the security verification');\n return false;\n }\n }\n \n return result;\n }\n }\n\n Formio.Components.addComponent('turnstile', TurnstileComponent);\n console.log('✅ Turnstile component registered with Form.io');\n window.TurnstileComponent = TurnstileComponent;\n })();\n `;\n}\n\nexport function renderFormBuilderPage(data: FormBuilderPageData): string {\n const formioSchema = data.formio_schema || { components: [] }\n const settings = data.settings || {}\n const googleMapsApiKey = data.google_maps_api_key || ''\n const turnstileSiteKey = data.turnstile_site_key || ''\n\n const pageContent = `\n \n\n
\n \n
\n
\n
\n \n \n \n \n \n
\n

\n Form Builder: ${data.display_name}\n

\n

\n \n ${data.name}\n \n

\n
\n
\n\n \n
\n \n \n \n \n \n Preview\n \n\n \n \n \n \n Save Form\n \n\n \n \n \n \n View Public Form\n \n\n \n \n \n \n View Submissions\n \n
\n
\n
\n\n \n
\n \n
\n \n \n \n \n Single Page\n \n \n \n \n \n Multi-Page Wizard\n \n
\n \n 💡 Use Panel components (Layout tab) for each page\n \n
\n\n \n
\n\n \n
\n
\n \n \n \n \n

Loading Form Builder...

\n
\n
\n\n \n
\n\n \n
\n
\n
\n

Form Preview

\n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n\n \n \n\n \n\n \n \n \n \n \n\n \n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Form Builder: ${data.display_name}`,\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderForm } from '../components/form.template'\n\nexport interface FormCreatePageData {\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderFormCreatePage(data: FormCreatePageData): string {\n const pageContent = `\n
\n \n
\n
\n \n \n \n \n \n
\n

Create New Form

\n

Enter basic information to create your form. You'll be able to add fields in the builder.

\n
\n
\n
\n\n \n ${data.error ? `\n
\n
\n \n \n \n

${data.error}

\n
\n
\n ` : ''}\n\n ${data.success ? `\n
\n
\n \n \n \n

${data.success}

\n
\n
\n ` : ''}\n\n \n
\n
\n \n
\n \n
\n \n \n

\n Lowercase letters, numbers, and underscores only. Used in URLs and API.\n

\n
\n\n \n
\n \n \n

\n Human-readable name shown in the admin interface.\n

\n
\n\n \n
\n \n \n
\n\n \n
\n \n \n \n \n \n \n \n \n

\n Helps organize forms in the admin panel.\n

\n
\n
\n\n \n
\n \n Cancel\n \n \n \n \n \n Create & Open Builder\n \n
\n
\n
\n\n \n
\n
\n \n \n \n
\n

What happens next?

\n
\n

After creating your form, you'll be taken to the Form Builder where you can:

\n
    \n
  • Drag and drop fields onto your form
  • \n
  • Configure field properties and validation
  • \n
  • Add conditional logic
  • \n
  • Preview your form in real-time
  • \n
  • Publish when ready
  • \n
\n
\n
\n
\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Create Form',\n content: pageContent,\n user: data.user,\n version: data.version\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../middleware'\nimport { renderFormsListPage } from '../templates/pages/admin-forms-list.template'\nimport { renderFormBuilderPage, type FormBuilderPageData } from '../templates/pages/admin-forms-builder.template'\nimport { renderFormCreatePage } from '../templates/pages/admin-forms-create.template'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\n\n// Type definitions for forms\ninterface Form {\n id: string\n name: string\n display_name: string\n description?: string\n category: string\n submission_count: number\n is_active: boolean\n is_public: boolean\n created_at: number\n updated_at: number\n formattedDate: string\n}\n\ninterface FormData {\n id?: string\n name?: string\n display_name?: string\n description?: string\n category?: string\n formio_schema?: any\n settings?: any\n is_active?: boolean\n is_public?: boolean\n google_maps_api_key?: string\n turnstile_site_key?: string\n error?: string\n success?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ninterface FormsListPageData {\n forms: Form[]\n search?: string\n category?: string\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const adminFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminFormsRoutes.use('*', requireAuth())\n\n// Forms management - List all forms\nadminFormsRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const search = c.req.query('search') || ''\n const category = c.req.query('category') || ''\n\n // Build query\n let query = 'SELECT * FROM forms WHERE 1=1'\n const params: string[] = []\n\n if (search) {\n query += ' AND (name LIKE ? OR display_name LIKE ?)'\n params.push(`%${search}%`, `%${search}%`)\n }\n\n if (category) {\n query += ' AND category = ?'\n params.push(category)\n }\n\n query += ' ORDER BY created_at DESC'\n\n const result = await db.prepare(query).bind(...params).all()\n\n // Format dates\n const forms = result.results.map((form: any) => ({\n ...form,\n formattedDate: new Date(form.created_at).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n }))\n\n const pageData: FormsListPageData = {\n forms,\n search,\n category,\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsListPage(pageData))\n } catch (error: any) {\n console.error('Error listing forms:', error)\n return c.html('

Error loading forms

', 500)\n }\n})\n\n// Show create form page\nadminFormsRoutes.get('/new', async (c) => {\n try {\n const user = c.get('user')\n\n const pageData: FormData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormCreatePage(pageData))\n } catch (error: any) {\n console.error('Error showing create form page:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Show docs page\nadminFormsRoutes.get('/docs', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsDocsPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsDocsPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms docs page:', error)\n return c.html('

Error loading documentation

', 500)\n }\n})\n\n// Show examples page\nadminFormsRoutes.get('/examples', async (c) => {\n try {\n const user = c.get('user')\n const { renderFormsExamplesPage } = await import('../templates/index.js')\n\n const pageData = {\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormsExamplesPage(pageData))\n } catch (error: any) {\n console.error('Error showing forms examples page:', error)\n return c.html('

Error loading examples

', 500)\n }\n})\n\n// Create new form\nadminFormsRoutes.post('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const name = body.name as string\n const displayName = body.displayName as string\n const description = (body.description as string) || ''\n const category = (body.category as string) || 'general'\n\n // Validate required fields\n if (!name || !displayName) {\n return c.json({ error: 'Name and display name are required' }, 400)\n }\n\n // Validate name format (lowercase, numbers, underscores only)\n if (!/^[a-z0-9_]+$/.test(name)) {\n return c.json({ \n error: 'Form name must contain only lowercase letters, numbers, and underscores' \n }, 400)\n }\n\n // Check for duplicate name\n const existing = await db.prepare('SELECT id FROM forms WHERE name = ?')\n .bind(name)\n .first()\n\n if (existing) {\n return c.json({ error: 'A form with this name already exists' }, 400)\n }\n\n // Create form with empty schema\n const formId = crypto.randomUUID()\n const now = Date.now()\n const emptySchema = { components: [] } // Empty Form.io schema\n\n await db.prepare(`\n INSERT INTO forms (\n id, name, display_name, description, category,\n formio_schema, settings, is_active, is_public,\n created_by, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n formId,\n name,\n displayName,\n description,\n category,\n JSON.stringify(emptySchema),\n JSON.stringify({\n submitButtonText: 'Submit',\n successMessage: 'Thank you for your submission!',\n requireAuth: false,\n emailNotifications: false\n }),\n 1, // is_active\n 1, // is_public\n user?.userId || null,\n now,\n now\n ).run()\n\n // Redirect to builder\n return c.redirect(`/admin/forms/${formId}/builder`)\n } catch (error: any) {\n console.error('Error creating form:', error)\n return c.json({ error: 'Failed to create form' }, 500)\n }\n})\n\n// Show form builder\nadminFormsRoutes.get('/:id/builder', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get Turnstile configuration\n const turnstileService = new TurnstileService(db)\n const turnstileSettings = await turnstileService.getSettings()\n\n const pageData: FormData = {\n id: form.id as string,\n name: form.name as string,\n display_name: form.display_name as string,\n description: form.description as string | undefined,\n category: form.category as string,\n formio_schema: form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] },\n settings: form.settings ? JSON.parse(form.settings as string) : {},\n is_active: Boolean(form.is_active),\n is_public: Boolean(form.is_public),\n google_maps_api_key: googleMapsApiKey,\n turnstile_site_key: turnstileSettings?.siteKey || '',\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderFormBuilderPage(pageData as FormBuilderPageData))\n } catch (error: any) {\n console.error('Error showing form builder:', error)\n return c.html('

Error loading form builder

', 500)\n }\n})\n\n// Update form (save schema)\nadminFormsRoutes.put('/:id', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n const body = await c.req.json()\n\n // Check if form exists\n const form = await db.prepare('SELECT id FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const now = Date.now()\n\n // Update form\n await db.prepare(`\n UPDATE forms \n SET formio_schema = ?, \n updated_by = ?, \n updated_at = ?\n WHERE id = ?\n `).bind(\n JSON.stringify(body.formio_schema),\n user?.userId || null,\n now,\n formId\n ).run()\n\n return c.json({ success: true, message: 'Form saved successfully' })\n } catch (error: any) {\n console.error('Error updating form:', error)\n return c.json({ error: 'Failed to save form' }, 500)\n }\n})\n\n// Delete form\nadminFormsRoutes.delete('/:id', async (c) => {\n try {\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Check if form exists\n const form = await db.prepare('SELECT id, submission_count FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Warn if form has submissions\n const submissionCount = form.submission_count as number || 0\n if (submissionCount > 0) {\n return c.json({ \n error: `Cannot delete form with ${submissionCount} submissions. Archive it instead.` \n }, 400)\n }\n\n // Delete form (cascade will delete submissions and files)\n await db.prepare('DELETE FROM forms WHERE id = ?').bind(formId).run()\n\n return c.json({ success: true, message: 'Form deleted successfully' })\n } catch (error: any) {\n console.error('Error deleting form:', error)\n return c.json({ error: 'Failed to delete form' }, 500)\n }\n})\n\n// View form submissions\nadminFormsRoutes.get('/:id/submissions', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const formId = c.req.param('id')\n\n // Get form\n const form = await db.prepare('SELECT * FROM forms WHERE id = ?')\n .bind(formId)\n .first()\n\n if (!form) {\n return c.html('

Form not found

', 404)\n }\n\n // Get submissions\n const submissions = await db.prepare(\n 'SELECT * FROM form_submissions WHERE form_id = ? ORDER BY submitted_at DESC'\n ).bind(formId).all()\n\n // Simple submissions page for now\n const html = `\n \n \n \n Submissions - ${form.display_name}\n \n \n \n ← Back to Forms\n

Submissions: ${form.display_name}

\n

Total submissions: ${submissions.results.length}

\n ${submissions.results.length > 0 ? `\n \n \n \n \n \n \n \n \n \n ${submissions.results.map((sub: any) => `\n \n \n \n \n \n `).join('')}\n \n
IDSubmittedData
${sub.id.substring(0, 8)}${new Date(sub.submitted_at).toLocaleString()}
${JSON.stringify(JSON.parse(sub.submission_data), null, 2)}
\n ` : '

No submissions yet.

'}\n \n \n `\n \n return c.html(html)\n } catch (error: any) {\n console.error('Error loading submissions:', error)\n return c.html('

Error loading submissions

', 500)\n }\n})\n\nexport default adminFormsRoutes\n","import { Hono } from 'hono'\nimport { TurnstileService } from '../plugins/core-plugins/turnstile-plugin/services/turnstile'\nimport { sanitizeInput } from '../utils/sanitize'\nimport { createContentFromSubmission } from '../services/form-collection-sync'\n\n/**\n * Recursively sanitize all string values in arbitrary JSON data.\n * HTML-encodes entities (e.g., < becomes <) to prevent stored XSS\n * when form submission data is rendered in admin templates.\n */\nfunction sanitizeDeep(value: unknown): unknown {\n if (typeof value === 'string') {\n return sanitizeInput(value)\n }\n if (Array.isArray(value)) {\n return value.map(sanitizeDeep)\n }\n if (value !== null && typeof value === 'object') {\n const result: Record = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = sanitizeDeep(v)\n }\n return result\n }\n return value // numbers, booleans, null pass through\n}\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n ENVIRONMENT?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n}\n\nexport const publicFormsRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Get Turnstile configuration for a form (for headless frontends)\npublicFormsRoutes.get('/:identifier/turnstile-config', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form\n const form = await db.prepare(\n 'SELECT id, turnstile_enabled, turnstile_settings FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const turnstileService = new TurnstileService(db)\n const globalSettings = await turnstileService.getSettings()\n \n const formSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string)\n : { inherit: true }\n\n // Determine effective settings\n const enabled = form.turnstile_enabled === 1 || \n (formSettings.inherit && globalSettings?.enabled)\n\n if (!enabled || !globalSettings) {\n return c.json({ enabled: false })\n }\n\n return c.json({\n enabled: true,\n siteKey: formSettings.siteKey || globalSettings.siteKey,\n theme: formSettings.theme || globalSettings.theme || 'auto',\n size: formSettings.size || globalSettings.size || 'normal',\n mode: formSettings.mode || globalSettings.mode || 'managed',\n appearance: formSettings.appearance || globalSettings.appearance || 'always'\n })\n } catch (error: any) {\n console.error('Error fetching Turnstile config:', error)\n return c.json({ error: 'Failed to fetch config' }, 500)\n }\n})\n\n// Get form schema as JSON (for headless frontends)\npublicFormsRoutes.get('/:identifier/schema', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT id, name, display_name, description, category, formio_schema, settings, is_active, is_public FROM forms WHERE (id = ? OR name = ?) AND is_active = 1 AND is_public = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n return c.json({\n id: form.id,\n name: form.name,\n displayName: form.display_name,\n description: form.description,\n category: form.category,\n schema: formioSchema,\n settings: settings,\n submitUrl: `/api/forms/${form.id}/submit`\n })\n } catch (error: any) {\n console.error('Error fetching form schema:', error)\n return c.json({ error: 'Failed to fetch form schema' }, 500)\n }\n})\n\n// Render public form by name\npublicFormsRoutes.get('/:name', async (c) => {\n try {\n const db = c.env.DB\n const formName = c.req.param('name')\n const googleMapsApiKey = c.env.GOOGLE_MAPS_API_KEY || ''\n\n // Get form by name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE name = ? AND is_active = 1 AND is_public = 1'\n ).bind(formName).first()\n\n if (!form) {\n return c.html('

Form not found

This form does not exist or is not publicly available.

', 404)\n }\n\n const formioSchema = form.formio_schema ? JSON.parse(form.formio_schema as string) : { components: [] }\n const settings = form.settings ? JSON.parse(form.settings as string) : {}\n\n const html = `\n \n \n \n \n \n ${form.display_name}\n \n \n \n \n \n \n \n
\n

${form.display_name}

\n ${form.description ? `

${form.description}

` : ''}\n \n
\n \n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n `\n\n return c.html(html)\n } catch (error: any) {\n console.error('Error rendering form:', error)\n return c.html('

Error loading form

', 500)\n }\n})\n\n// Handle form submission (accepts either name or ID)\npublicFormsRoutes.post('/:identifier/submit', async (c) => {\n try {\n const db = c.env.DB\n const identifier = c.req.param('identifier')\n const body = await c.req.json()\n\n // Get form by ID or name\n const form = await db.prepare(\n 'SELECT * FROM forms WHERE (id = ? OR name = ?) AND is_active = 1'\n ).bind(identifier, identifier).first()\n\n if (!form) {\n return c.json({ error: 'Form not found' }, 404)\n }\n\n // Check if Turnstile is enabled for this form\n const turnstileEnabled = form.turnstile_enabled === 1\n const turnstileSettings = form.turnstile_settings \n ? JSON.parse(form.turnstile_settings as string) \n : { inherit: true }\n\n // Validate Turnstile if enabled (or inheriting global settings)\n if (turnstileEnabled || turnstileSettings.inherit) {\n const turnstileService = new TurnstileService(db)\n \n // Check if Turnstile is globally enabled\n const globalEnabled = await turnstileService.isEnabled()\n \n if (globalEnabled || turnstileEnabled) {\n // Extract Turnstile token from submission data\n const turnstileToken = body.data?.turnstile || body.turnstile\n \n if (!turnstileToken) {\n return c.json({ \n error: 'Turnstile verification required. Please complete the security check.',\n code: 'TURNSTILE_MISSING'\n }, 400)\n }\n\n // Verify the token\n const clientIp = c.req.header('cf-connecting-ip')\n const verification = await turnstileService.verifyToken(turnstileToken, clientIp)\n \n if (!verification.success) {\n return c.json({ \n error: verification.error || 'Security verification failed. Please try again.',\n code: 'TURNSTILE_INVALID'\n }, 403)\n }\n\n // Remove Turnstile token from submission data before storing\n if (body.data?.turnstile) {\n delete body.data.turnstile\n }\n }\n }\n\n // Sanitize all string values in submission data to prevent stored XSS.\n // HTML-encodes entities (e.g., < becomes <) before storage.\n const sanitizedData = sanitizeDeep(body.data) as Record\n\n // Create submission\n const submissionId = crypto.randomUUID()\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO form_submissions (\n id, form_id, submission_data, user_id, ip_address, user_agent,\n submitted_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n submissionId,\n form.id,\n JSON.stringify(sanitizedData),\n null, // user_id (for authenticated users)\n c.req.header('cf-connecting-ip') || null,\n c.req.header('user-agent') || null,\n now,\n now\n ).run()\n\n // Update submission count\n await db.prepare(`\n UPDATE forms\n SET submission_count = submission_count + 1,\n updated_at = ?\n WHERE id = ?\n `).bind(now, form.id).run()\n\n // Dual-write: create content item for this submission\n let contentId: string | null = null\n try {\n contentId = await createContentFromSubmission(\n db,\n sanitizedData as Record,\n { id: form.id as string, name: form.name as string, display_name: form.display_name as string },\n submissionId,\n {\n ipAddress: c.req.header('cf-connecting-ip') || null,\n userAgent: c.req.header('user-agent') || null,\n userEmail: (sanitizedData as any)?.email || null,\n userId: null // anonymous submission\n }\n )\n if (!contentId) {\n console.warn('[FormSubmit] Content creation returned null for submission:', submissionId)\n }\n } catch (contentError) {\n // Don't fail the submission if content creation fails\n console.error('[FormSubmit] Error creating content from submission:', contentError)\n }\n\n return c.json({\n success: true,\n submissionId,\n contentId,\n message: 'Form submitted successfully'\n })\n } catch (error: any) {\n console.error('Error submitting form:', error)\n return c.json({ error: 'Failed to submit form' }, 500)\n }\n})\n\nexport default publicFormsRoutes\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { CATEGORY_INFO } from '../../services/route-metadata'\n\nexport interface APIEndpoint {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented?: boolean\n}\n\nexport interface APIReferencePageData {\n endpoints: APIEndpoint[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nfunction renderAuthBadge(auth: boolean | 'unknown'): string {\n if (auth === true) {\n return `\n \n \n \n \n Auth\n `\n }\n if (auth === false) {\n return `\n \n \n \n \n Public\n `\n }\n // unknown\n return `\n \n \n \n \n Unknown\n `\n}\n\nexport function renderAPIReferencePage(data: APIReferencePageData): string {\n // Group endpoints by category\n const endpointsByCategory = data.endpoints.reduce((acc, endpoint) => {\n if (!acc[endpoint.category]) {\n acc[endpoint.category] = []\n }\n acc[endpoint.category]!.push(endpoint)\n return acc\n }, {} as Record)\n\n // Get unique categories from actual data\n const categories = Object.keys(endpointsByCategory)\n\n // Count stats\n const totalEndpoints = data.endpoints.length\n const publicEndpoints = data.endpoints.filter(e => e.authentication === false).length\n const protectedEndpoints = data.endpoints.filter(e => e.authentication === true).length\n const undocumentedCount = data.endpoints.filter(e => e.documented === false).length\n\n const pageContent = `\n
\n \n
\n
\n

API Reference

\n

Auto-discovered documentation of all registered API endpoints

\n
\n \n
\n\n \n
\n
\n
Total Endpoints
\n
\n ${totalEndpoints}\n
\n
\n
\n
Public Endpoints
\n
\n ${publicEndpoints}\n
\n
\n
\n
Protected Endpoints
\n
\n ${protectedEndpoints}\n
\n
\n
\n
Categories
\n
\n ${categories.length}\n
\n
\n
\n
Undocumented
\n
\n 0 ? 'text-zinc-400 dark:text-zinc-500' : 'text-lime-600 dark:text-lime-400'}\">${undocumentedCount}\n
\n
\n
\n\n \n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n \n
\n
\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n \n \n ${categories.map(category => {\n const info = CATEGORY_INFO[category]\n const title = info ? info.title : category\n return ``\n }).join('\\n ')}\n \n \n \n \n
\n
\n
\n
\n
\n\n \n
\n ${Object.entries(endpointsByCategory).map(([category, endpoints]) => {\n const info = CATEGORY_INFO[category] || { title: category, description: '', icon: '📋' }\n return `\n
\n
\n \n
\n
\n ${info.icon}\n
\n

${info.title}

\n

${info.description}

\n
\n
\n \n ${endpoints.length} endpoint${endpoints.length !== 1 ? 's' : ''}\n \n
\n
\n
\n\n \n
\n ${endpoints.map(endpoint => `\n
\n
\n \n ${endpoint.method}\n \n
\n
\n ${endpoint.path}\n ${renderAuthBadge(endpoint.authentication)}\n ${endpoint.documented === false ? `\n \n Auto-discovered\n \n ` : ''}\n
\n

${endpoint.description || 'No description available'}

\n
\n
\n
\n `).join('')}\n
\n
\n
\n `\n }).join('')}\n
\n\n \n
\n \n \n \n

No endpoints found

\n

Try adjusting your search or filter criteria

\n
\n
\n\n \n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'API Reference',\n pageTitle: 'API Reference',\n currentPath: '/admin/api-reference',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","/**\n * Admin API Reference Routes\n *\n * Provides the API Reference page for the admin dashboard.\n * Uses auto-discovery via Hono's inspectRoutes() to always show\n * the complete list of registered API endpoints.\n */\n\nimport { Hono } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport { requireAuth } from '../middleware'\nimport {\n renderAPIReferencePage,\n type APIReferencePageData\n} from '../templates/pages/admin-api-reference.template'\nimport { getCoreVersion } from '../utils/version'\nimport { buildRouteList, getAppInstance } from '../services/route-metadata'\n\nconst VERSION = getCoreVersion()\n\ntype Bindings = {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nconst router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nrouter.use('*', requireAuth())\n\n/**\n * GET /admin/api-reference - API Reference Page\n *\n * Auto-discovers all registered routes using Hono's inspectRoutes()\n * and enriches them with metadata from the route-metadata registry.\n */\nrouter.get('/', async (c) => {\n const user = c.get('user')\n\n try {\n const app = getAppInstance()\n const endpoints = buildRouteList(app)\n\n const pageData: APIReferencePageData = {\n endpoints,\n user: user ? {\n name: user.email.split('@')[0] || user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n } catch (error) {\n console.error('API Reference page error:', error)\n\n const pageData: APIReferencePageData = {\n endpoints: [],\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: VERSION\n }\n\n return c.html(renderAPIReferencePage(pageData))\n }\n})\n\nexport { router as adminApiReferenceRoutes }\n","/**\n * Routes Module Exports\n *\n * Routes are being migrated incrementally from the monolith.\n * Each route is refactored to remove monolith-specific dependencies.\n */\n\n// API routes\nexport { default as apiRoutes } from './api'\nexport { default as apiContentCrudRoutes } from './api-content-crud'\nexport { default as apiMediaRoutes } from './api-media'\nexport { default as apiSystemRoutes } from './api-system'\nexport { default as adminApiRoutes } from './admin-api'\n\n// Auth routes\nexport { default as authRoutes } from './auth'\n\n// Test routes (only for development/test environments)\nexport { default as testCleanupRoutes } from './test-cleanup'\n\n// Admin UI routes\nexport { default as adminContentRoutes } from './admin-content'\nexport { userRoutes as adminUsersRoutes } from './admin-users'\nexport { adminMediaRoutes } from './admin-media'\nexport { adminPluginRoutes } from './admin-plugins'\nexport { adminLogsRoutes } from './admin-logs'\nexport { adminDesignRoutes } from './admin-design'\nexport { adminCheckboxRoutes } from './admin-checkboxes'\nexport { default as adminTestimonialsRoutes } from './admin-testimonials'\nexport { default as adminCodeExamplesRoutes } from './admin-code-examples'\nexport { adminDashboardRoutes } from './admin-dashboard'\nexport { adminCollectionsRoutes } from './admin-collections'\nexport { adminSettingsRoutes } from './admin-settings'\nexport { adminFormsRoutes } from './admin-forms'\nexport { default as publicFormsRoutes } from './public-forms'\nexport { adminApiReferenceRoutes } from './admin-api-reference'\n\nexport const ROUTES_INFO = {\n message: 'Core routes available',\n available: [\n 'apiRoutes',\n 'apiContentCrudRoutes',\n 'apiMediaRoutes',\n 'apiSystemRoutes',\n 'adminApiRoutes',\n 'authRoutes',\n 'testCleanupRoutes',\n 'adminContentRoutes',\n 'adminUsersRoutes',\n 'adminMediaRoutes',\n 'adminPluginRoutes',\n 'adminLogsRoutes',\n 'adminDesignRoutes',\n 'adminCheckboxRoutes',\n 'adminTestimonialsRoutes',\n 'adminCodeExamplesRoutes',\n 'adminDashboardRoutes',\n 'adminCollectionsRoutes',\n 'adminSettingsRoutes',\n 'adminFormsRoutes',\n 'publicFormsRoutes',\n 'adminApiReferenceRoutes'\n ],\n status: 'Core package routes ready',\n reference: 'https://github.com/sonicjs/sonicjs'\n} as const\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-656GGECX.cjs b/packages/core/dist/chunk-QOZZJZ76.cjs similarity index 99% rename from packages/core/dist/chunk-656GGECX.cjs rename to packages/core/dist/chunk-QOZZJZ76.cjs index 90b8a6a00..e233a25e0 100644 --- a/packages/core/dist/chunk-656GGECX.cjs +++ b/packages/core/dist/chunk-QOZZJZ76.cjs @@ -1802,5 +1802,5 @@ exports.syncCollection = syncCollection; exports.syncCollections = syncCollections; exports.syncFormCollection = syncFormCollection; exports.validateCollectionConfig = validateCollectionConfig; -//# sourceMappingURL=chunk-656GGECX.cjs.map -//# sourceMappingURL=chunk-656GGECX.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-QOZZJZ76.cjs.map +//# sourceMappingURL=chunk-QOZZJZ76.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-656GGECX.cjs.map b/packages/core/dist/chunk-QOZZJZ76.cjs.map similarity index 99% rename from packages/core/dist/chunk-656GGECX.cjs.map rename to packages/core/dist/chunk-QOZZJZ76.cjs.map index 7f5b5d76f..13bd928b4 100644 --- a/packages/core/dist/chunk-656GGECX.cjs.map +++ b/packages/core/dist/chunk-QOZZJZ76.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/services/collection-loader.ts","../src/services/collection-sync.ts","../src/services/form-collection-sync.ts","../src/services/plugin-service.ts","../src/plugins/manifest-registry.ts","../src/services/plugin-bootstrap.ts"],"names":[],"mappings":"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","file":"chunk-656GGECX.cjs","sourcesContent":["/**\n * Collection Loader Service\n *\n * Loads collection configuration files from the collections directory.\n * Supports both development (reading from filesystem) and production (bundled).\n */\n\nimport { CollectionConfig, CollectionConfigModule } from '../types/collection-config'\n\n// Global registry for externally registered collections\nconst registeredCollections: CollectionConfig[] = []\n\n/**\n * Register collections from the application code\n * This should be called before creating the app\n */\nexport function registerCollections(collections: CollectionConfig[]): void {\n for (const config of collections) {\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config: missing required fields`, config)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n registeredCollections.push(normalizedConfig)\n console.log(`✓ Registered collection: ${config.name}`)\n }\n}\n\n/**\n * Load all collection configurations from the collections directory\n */\nexport async function loadCollectionConfigs(): Promise {\n const collections: CollectionConfig[] = [...registeredCollections]\n\n // Log registered collections summary\n if (registeredCollections.length > 0) {\n console.log(`📦 Found ${registeredCollections.length} registered collection(s) from application`)\n } else {\n console.log(`⚠️ No collections registered. Make sure to call registerCollections() in your app's index.ts`)\n console.log(` Example: import myCollection from './collections/my-collection.collection'`)\n console.log(` registerCollections([myCollection])`)\n }\n\n try {\n // Import all collection files dynamically from core package\n // In production, these will be bundled with the application\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts', { eager: true }) || {}\n let coreCollectionCount = 0\n\n for (const [path, module] of Object.entries(modules)) {\n try {\n const configModule = module as CollectionConfigModule\n\n if (!configModule.default) {\n console.warn(`Collection file ${path} does not export a default config`)\n continue\n }\n\n const config = configModule.default\n\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config in ${path}: missing required fields`)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n collections.push(normalizedConfig)\n coreCollectionCount++\n console.log(`✓ Loaded core collection: ${config.name}`)\n } catch (error) {\n console.error(`Error loading collection from ${path}:`, error)\n }\n }\n\n console.log(`📊 Collection summary: ${collections.length} total (${registeredCollections.length} from app, ${coreCollectionCount} from core)`)\n return collections\n } catch (error) {\n console.error('Error loading collection configurations:', error)\n return collections // Return registered collections even if core loading fails\n }\n}\n\n/**\n * Load a specific collection configuration by name\n * Note: This function requires implementation in the consuming application\n * as it depends on project-specific collection files\n */\nexport async function loadCollectionConfig(name: string): Promise {\n try {\n // Dynamic imports are not supported in library builds\n // This should be implemented in the consuming application\n console.warn('loadCollectionConfig requires implementation in consuming application')\n return null\n } catch (error) {\n console.error(`Error loading collection ${name}:`, error)\n return null\n }\n}\n\n/**\n * Get list of all available collection config file names\n */\nexport async function getAvailableCollectionNames(): Promise {\n try {\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts') || {}\n const names: string[] = []\n\n for (const path of Object.keys(modules)) {\n // Extract collection name from path\n // e.g., '../collections/blog-posts.collection.ts' -> 'blog-posts'\n const match = path.match(/\\/([^/]+)\\.collection\\.ts$/)\n if (match && match[1]) {\n names.push(match[1])\n }\n }\n\n return names\n } catch (error) {\n console.error('Error getting collection names:', error)\n return []\n }\n}\n\n/**\n * Validate a collection configuration\n */\nexport function validateCollectionConfig(config: CollectionConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push('Collection name is required')\n } else if (!/^[a-z0-9_-]+$/.test(config.name)) {\n errors.push('Collection name must contain only lowercase letters, numbers, underscores, and hyphens')\n }\n\n if (!config.displayName) {\n errors.push('Display name is required')\n }\n\n if (!config.schema) {\n errors.push('Schema is required')\n } else {\n // Validate schema structure\n if (config.schema.type !== 'object') {\n errors.push('Schema type must be \"object\"')\n }\n\n if (!config.schema.properties || typeof config.schema.properties !== 'object') {\n errors.push('Schema must have properties')\n }\n\n // Validate field types\n for (const [fieldName, fieldConfig] of Object.entries(config.schema.properties || {})) {\n if (!fieldConfig.type) {\n errors.push(`Field \"${fieldName}\" is missing type`)\n }\n\n // Validate reference fields\n if (fieldConfig.type === 'reference' && !fieldConfig.collection) {\n errors.push(`Reference field \"${fieldName}\" is missing collection property`)\n }\n\n const layoutValue = fieldConfig.objectLayout\n if (layoutValue !== undefined) {\n if (fieldConfig.type !== 'object') {\n errors.push(`Field \"${fieldName}\" uses objectLayout but is not an object field`)\n } else if (!['nested', 'flat'].includes(layoutValue)) {\n errors.push(`Object field \"${fieldName}\" has invalid objectLayout. Use \"nested\" or \"flat\"`)\n }\n }\n\n // Validate select fields\n if (['select', 'multiselect', 'radio'].includes(fieldConfig.type) && !fieldConfig.enum) {\n errors.push(`Select field \"${fieldName}\" is missing enum options`)\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n}\n","/**\n * Collection Sync Service\n *\n * Syncs collection configurations from code to the database.\n * Handles create, update, and validation of config-managed collections.\n */\n\nimport { CollectionConfig, CollectionSyncResult } from '../types/collection-config'\nimport { loadCollectionConfigs, validateCollectionConfig } from './collection-loader'\n\n/**\n * Sync all collection configurations to the database\n */\nexport async function syncCollections(db: D1Database): Promise {\n console.log('🔄 Starting collection sync...')\n\n const results: CollectionSyncResult[] = []\n const configs = await loadCollectionConfigs()\n\n if (configs.length === 0) {\n console.log('⚠️ No collection configurations found')\n return results\n }\n\n for (const config of configs) {\n const result = await syncCollection(db, config)\n results.push(result)\n }\n\n const created = results.filter(r => r.status === 'created').length\n const updated = results.filter(r => r.status === 'updated').length\n const unchanged = results.filter(r => r.status === 'unchanged').length\n const errors = results.filter(r => r.status === 'error').length\n\n console.log(`✅ Collection sync complete: ${created} created, ${updated} updated, ${unchanged} unchanged, ${errors} errors`)\n\n return results\n}\n\n/**\n * Sync a single collection configuration to the database\n */\nexport async function syncCollection(db: D1Database, config: CollectionConfig): Promise {\n try {\n // Validate config\n const validation = validateCollectionConfig(config)\n if (!validation.valid) {\n return {\n name: config.name,\n status: 'error',\n error: `Validation failed: ${validation.errors.join(', ')}`\n }\n }\n\n // Check if collection exists\n const existingStmt = db.prepare('SELECT * FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(config.name).first() as any\n\n const now = Date.now()\n const collectionId = existing?.id || `col-${config.name}-${crypto.randomUUID().slice(0, 8)}`\n\n // Prepare collection data\n const schemaJson = JSON.stringify(config.schema)\n const isActive = config.isActive !== false ? 1 : 0\n const managed = config.managed !== false ? 1 : 0\n\n if (!existing) {\n // Create new collection\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n config.name,\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n now\n ).run()\n\n console.log(` ✓ Created collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'created',\n message: `Created collection \"${config.displayName}\"`\n }\n } else {\n // Check if update is needed\n const existingSchema = existing.schema ? JSON.stringify(existing.schema) : '{}'\n const existingDisplayName = existing.display_name\n const existingDescription = existing.description\n const existingIsActive = existing.is_active\n const existingManaged = existing.managed\n\n const needsUpdate =\n schemaJson !== existingSchema ||\n config.displayName !== existingDisplayName ||\n (config.description || null) !== existingDescription ||\n isActive !== existingIsActive ||\n managed !== existingManaged\n\n if (!needsUpdate) {\n return {\n name: config.name,\n status: 'unchanged',\n message: `Collection \"${config.displayName}\" is up to date`\n }\n }\n\n // Update existing collection\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, schema = ?, is_active = ?, managed = ?, updated_at = ?\n WHERE name = ?\n `)\n\n await updateStmt.bind(\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n config.name\n ).run()\n\n console.log(` ✓ Updated collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'updated',\n message: `Updated collection \"${config.displayName}\"`\n }\n }\n } catch (error) {\n console.error(` ✗ Error syncing collection ${config.name}:`, error)\n\n return {\n name: config.name,\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n}\n\n/**\n * Check if a collection is managed by config\n */\nexport async function isCollectionManaged(db: D1Database, collectionName: string): Promise {\n try {\n const stmt = db.prepare('SELECT managed FROM collections WHERE name = ?')\n const result = await stmt.bind(collectionName).first() as any\n\n return result?.managed === 1\n } catch (error) {\n console.error(`Error checking if collection is managed:`, error)\n return false\n }\n}\n\n/**\n * Get all managed collections from database\n */\nexport async function getManagedCollections(db: D1Database): Promise {\n try {\n const stmt = db.prepare('SELECT name FROM collections WHERE managed = 1')\n const { results } = await stmt.all()\n\n return (results || []).map((row: any) => row.name)\n } catch (error) {\n console.error('Error getting managed collections:', error)\n return []\n }\n}\n\n/**\n * Remove collections that are no longer in config files\n * (Only removes managed collections that aren't in the config)\n */\nexport async function cleanupRemovedCollections(db: D1Database): Promise {\n try {\n const configs = await loadCollectionConfigs()\n const configNames = new Set(configs.map(c => c.name))\n const managedCollections = await getManagedCollections(db)\n const removed: string[] = []\n\n for (const managedName of managedCollections) {\n if (!configNames.has(managedName)) {\n // This managed collection no longer has a config file\n // Mark as inactive instead of deleting (safer)\n const updateStmt = db.prepare(`\n UPDATE collections\n SET is_active = 0, updated_at = ?\n WHERE name = ? AND managed = 1\n `)\n\n await updateStmt.bind(Date.now(), managedName).run()\n removed.push(managedName)\n console.log(` ⚠️ Deactivated removed collection: ${managedName}`)\n }\n }\n\n return removed\n } catch (error) {\n console.error('Error cleaning up removed collections:', error)\n return []\n }\n}\n\n/**\n * Full sync: sync all configs and cleanup removed\n */\nexport async function fullCollectionSync(db: D1Database): Promise<{\n results: CollectionSyncResult[]\n removed: string[]\n}> {\n const results = await syncCollections(db)\n const removed = await cleanupRemovedCollections(db)\n\n return { results, removed }\n}\n","/**\n * Form-Collection Sync Service\n *\n * Bridge logic that creates \"shadow collections\" for forms and\n * dual-writes form submissions to the content table, enabling\n * unified content management for form submissions.\n */\n\nconst SYSTEM_FORM_USER_ID = 'system-form-submission'\n\n/**\n * Convert Form.io component type to collection schema field type\n */\nfunction mapFormioTypeToSchemaType(component: any): { type: string; [key: string]: any } {\n switch (component.type) {\n case 'textfield':\n case 'textarea':\n case 'password':\n case 'phoneNumber':\n case 'url':\n return { type: 'string', title: component.label || component.key }\n case 'email':\n return { type: 'string', format: 'email', title: component.label || component.key }\n case 'number':\n case 'currency':\n return { type: 'number', title: component.label || component.key }\n case 'checkbox':\n return { type: 'boolean', title: component.label || component.key }\n case 'select':\n case 'radio': {\n const enumValues = (component.data?.values || component.values || []).map((v: any) => v.value)\n const enumLabels = (component.data?.values || component.values || []).map((v: any) => v.label)\n return {\n type: 'select',\n title: component.label || component.key,\n enum: enumValues,\n enumLabels\n }\n }\n case 'selectboxes':\n return { type: 'object', title: component.label || component.key }\n case 'datetime':\n case 'day':\n case 'time':\n return { type: 'string', format: 'date-time', title: component.label || component.key }\n case 'file':\n case 'signature':\n return { type: 'string', title: component.label || component.key }\n case 'address':\n return { type: 'object', title: component.label || component.key }\n case 'hidden':\n return { type: 'string', title: component.label || component.key }\n default:\n return { type: 'string', title: component.label || component.key }\n }\n}\n\n/**\n * Recursively extract field components from a Form.io schema,\n * skipping layout-only components (panels, columns, fieldsets, etc.)\n */\nfunction extractFieldComponents(components: any[]): any[] {\n const fields: any[] = []\n if (!components) return fields\n\n for (const comp of components) {\n // Layout components — recurse into children\n if (comp.type === 'panel' || comp.type === 'fieldset' || comp.type === 'well' || comp.type === 'tabs') {\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n continue\n }\n if (comp.type === 'columns' && comp.columns) {\n for (const col of comp.columns) {\n if (col.components) {\n fields.push(...extractFieldComponents(col.components))\n }\n }\n continue\n }\n if (comp.type === 'table' && comp.rows) {\n for (const row of comp.rows) {\n if (Array.isArray(row)) {\n for (const cell of row) {\n if (cell.components) {\n fields.push(...extractFieldComponents(cell.components))\n }\n }\n }\n }\n continue\n }\n // Skip buttons and non-input layout elements\n if (comp.type === 'button' || comp.type === 'htmlelement' || comp.type === 'content') {\n continue\n }\n // Skip turnstile (not data)\n if (comp.type === 'turnstile') {\n continue\n }\n // It's a real field\n if (comp.key) {\n fields.push(comp)\n }\n // Recurse into sub-components for containers\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n }\n return fields\n}\n\n/**\n * Convert a Form.io schema into a collection JSON schema definition\n */\nexport function deriveCollectionSchemaFromFormio(formioSchema: any): any {\n const components = formioSchema?.components || []\n const fieldComponents = extractFieldComponents(components)\n\n const properties: Record = {\n // Always include a title field for the content item\n title: { type: 'string', title: 'Title', required: true }\n }\n const required: string[] = ['title']\n\n for (const comp of fieldComponents) {\n const key = comp.key\n if (!key || key === 'submit' || key === 'title') continue\n const fieldDef = mapFormioTypeToSchemaType(comp)\n if (comp.validate?.required) {\n fieldDef.required = true\n required.push(key)\n }\n properties[key] = fieldDef\n }\n\n return { type: 'object', properties, required }\n}\n\n/**\n * Derive a human-readable title from form submission data\n */\nexport function deriveSubmissionTitle(data: Record, formDisplayName: string): string {\n // Try common fields in order of preference\n const candidates = ['name', 'fullName', 'full_name', 'firstName', 'first_name']\n for (const key of candidates) {\n if (data[key] && typeof data[key] === 'string' && data[key].trim()) {\n // Append last name if available\n if (key === 'firstName' || key === 'first_name') {\n const last = data['lastName'] || data['last_name'] || data['lastname'] || ''\n if (last) return `${data[key].trim()} ${last.trim()}`\n }\n return data[key].trim()\n }\n }\n // Try email\n if (data.email && typeof data.email === 'string' && data.email.trim()) {\n return data.email.trim()\n }\n // Try subject\n if (data.subject && typeof data.subject === 'string' && data.subject.trim()) {\n return data.subject.trim()\n }\n // Fallback\n const dateStr = new Date().toLocaleDateString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })\n return `${formDisplayName} - ${dateStr}`\n}\n\n/**\n * Map form submission status to content status.\n * Form submissions are complete data — they default to 'published'.\n * Only rejected/spam submissions get demoted.\n */\nexport function mapFormStatusToContentStatus(formStatus: string): string {\n switch (formStatus) {\n case 'pending': return 'published'\n case 'reviewed': return 'published'\n case 'approved': return 'published'\n case 'rejected': return 'archived'\n case 'spam': return 'deleted'\n default: return 'published'\n }\n}\n\n/**\n * Create or update a shadow collection for a given form\n */\nexport async function syncFormCollection(db: D1Database, form: {\n id: string\n name: string\n display_name: string\n description?: string | null\n formio_schema: any\n is_active: number | boolean\n}): Promise<{ collectionId: string; status: 'created' | 'updated' | 'unchanged' }> {\n const collectionName = `form_${form.name}`\n const displayName = `${form.display_name} (Form)`\n\n // Parse formio_schema\n const formioSchema = typeof form.formio_schema === 'string'\n ? JSON.parse(form.formio_schema)\n : form.formio_schema\n\n const schema = deriveCollectionSchemaFromFormio(formioSchema)\n const schemaJson = JSON.stringify(schema)\n const now = Date.now()\n const isActive = form.is_active ? 1 : 0\n\n // Check if shadow collection already exists\n const existing = await db.prepare(\n 'SELECT id, schema, display_name, description, is_active FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!existing) {\n // Create new shadow collection\n const collectionId = `col-form-${form.name}-${crypto.randomUUID().slice(0, 8)}`\n\n await db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, source_type, source_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, 1, 'form', ?, ?, ?)\n `).bind(\n collectionId,\n collectionName,\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n form.id,\n now,\n now\n ).run()\n\n console.log(`[FormSync] Created shadow collection: ${collectionName}`)\n return { collectionId, status: 'created' }\n }\n\n // Check if update needed\n const existingSchema = existing.schema ? JSON.stringify(typeof existing.schema === 'string' ? JSON.parse(existing.schema) : existing.schema) : '{}'\n const needsUpdate =\n schemaJson !== existingSchema ||\n displayName !== existing.display_name ||\n (form.description || null) !== existing.description ||\n isActive !== existing.is_active\n\n if (!needsUpdate) {\n return { collectionId: existing.id, status: 'unchanged' }\n }\n\n await db.prepare(`\n UPDATE collections SET display_name = ?, description = ?, schema = ?, is_active = ?, updated_at = ?\n WHERE id = ?\n `).bind(\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n now,\n existing.id\n ).run()\n\n console.log(`[FormSync] Updated shadow collection: ${collectionName}`)\n return { collectionId: existing.id, status: 'updated' }\n}\n\n/**\n * Sync all active forms to shadow collections\n */\nexport async function syncAllFormCollections(db: D1Database): Promise {\n try {\n // Check if forms table exists\n const tableCheck = await db.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='forms'\"\n ).first()\n if (!tableCheck) {\n console.log('[FormSync] Forms table does not exist, skipping form sync')\n return\n }\n\n const { results: forms } = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms'\n ).all()\n\n if (!forms || forms.length === 0) {\n console.log('[FormSync] No forms found, skipping')\n return\n }\n\n let created = 0\n let updated = 0\n\n for (const form of forms) {\n try {\n const result = await syncFormCollection(db, form as any)\n if (result.status === 'created') created++\n if (result.status === 'updated') updated++\n\n // Backfill existing submissions that don't have content_id\n await backfillFormSubmissions(db, form.id as string, result.collectionId)\n } catch (error) {\n console.error(`[FormSync] Error syncing form ${form.name}:`, error)\n }\n }\n\n console.log(`[FormSync] Sync complete: ${created} created, ${updated} updated out of ${forms.length} forms`)\n } catch (error) {\n console.error('[FormSync] Error syncing form collections:', error)\n }\n}\n\n/**\n * Create a content item from a form submission\n */\nexport async function createContentFromSubmission(\n db: D1Database,\n submissionData: Record,\n form: { id: string; name: string; display_name: string },\n submissionId: string,\n metadata: {\n ipAddress?: string | null\n userAgent?: string | null\n userEmail?: string | null\n userId?: string | null\n } = {}\n): Promise {\n try {\n // Find the shadow collection\n let collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!collection) {\n // Shadow collection missing — try to create it on the fly\n console.warn(`[FormSync] No shadow collection found for form ${form.name}, attempting to create...`)\n try {\n const fullForm = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms WHERE id = ?'\n ).bind(form.id).first() as any\n\n if (fullForm) {\n const schema = typeof fullForm.formio_schema === 'string'\n ? JSON.parse(fullForm.formio_schema)\n : fullForm.formio_schema\n const result = await syncFormCollection(db, {\n id: fullForm.id,\n name: fullForm.name,\n display_name: fullForm.display_name,\n description: fullForm.description,\n formio_schema: schema,\n is_active: fullForm.is_active ?? 1\n })\n // Re-query the collection\n collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n console.log(`[FormSync] On-the-fly sync result: ${result.status}, collectionId: ${result.collectionId}`)\n }\n } catch (syncErr) {\n console.error('[FormSync] On-the-fly shadow collection creation failed:', syncErr)\n }\n\n if (!collection) {\n console.error(`[FormSync] Still no shadow collection for form ${form.name} after recovery attempt`)\n return null\n }\n }\n\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const title = deriveSubmissionTitle(submissionData, form.display_name)\n const slug = `submission-${submissionId.slice(0, 8)}`\n\n // Build content data with embedded metadata\n const contentData: Record = {\n title,\n ...submissionData,\n _submission_metadata: {\n submissionId,\n formId: form.id,\n formName: form.name,\n email: metadata.userEmail || submissionData.email || null,\n ipAddress: metadata.ipAddress || null,\n userAgent: metadata.userAgent || null,\n submittedAt: now\n }\n }\n\n const authorId = metadata.userId || SYSTEM_FORM_USER_ID\n\n // Ensure the system user exists (D1 enforces foreign keys)\n if (authorId === SYSTEM_FORM_USER_ID) {\n const systemUser = await db.prepare('SELECT id FROM users WHERE id = ?').bind(SYSTEM_FORM_USER_ID).first()\n if (!systemUser) {\n console.log('[FormSync] System form user missing, creating...')\n const sysNow = Date.now()\n await db.prepare(`\n INSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 0, ?, ?)\n `).bind(SYSTEM_FORM_USER_ID, 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', sysNow, sysNow).run()\n }\n }\n\n console.log(`[FormSync] Inserting content: id=${contentId}, collection=${collection.id}, slug=${slug}, title=${title}, author=${authorId}`)\n\n await db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, 'published', ?, ?, ?)\n `).bind(\n contentId,\n collection.id,\n slug,\n title,\n JSON.stringify(contentData),\n authorId,\n now,\n now\n ).run()\n\n // Link submission to content\n await db.prepare(\n 'UPDATE form_submissions SET content_id = ? WHERE id = ?'\n ).bind(contentId, submissionId).run()\n\n console.log(`[FormSync] Content created successfully: ${contentId}`)\n return contentId\n } catch (error) {\n console.error('[FormSync] Error creating content from submission:', error)\n return null\n }\n}\n\n/**\n * Backfill existing form submissions that don't have a content_id\n */\nexport async function backfillFormSubmissions(\n db: D1Database,\n formId: string,\n collectionId: string\n): Promise {\n try {\n const { results: submissions } = await db.prepare(\n 'SELECT id, submission_data, user_email, ip_address, user_agent, user_id, submitted_at FROM form_submissions WHERE form_id = ? AND content_id IS NULL'\n ).bind(formId).all()\n\n if (!submissions || submissions.length === 0) {\n return 0\n }\n\n // Get form info\n const form = await db.prepare(\n 'SELECT id, name, display_name FROM forms WHERE id = ?'\n ).bind(formId).first() as any\n\n if (!form) return 0\n\n let count = 0\n for (const sub of submissions) {\n try {\n const submissionData = typeof sub.submission_data === 'string'\n ? JSON.parse(sub.submission_data as string)\n : sub.submission_data\n\n const contentId = await createContentFromSubmission(\n db,\n submissionData,\n { id: form.id, name: form.name, display_name: form.display_name },\n sub.id as string,\n {\n ipAddress: sub.ip_address as string | null,\n userAgent: sub.user_agent as string | null,\n userEmail: sub.user_email as string | null,\n userId: sub.user_id as string | null\n }\n )\n if (contentId) count++\n } catch (error) {\n console.error(`[FormSync] Error backfilling submission ${sub.id}:`, error)\n }\n }\n\n if (count > 0) {\n console.log(`[FormSync] Backfilled ${count} submissions for form ${formId}`)\n }\n return count\n } catch (error) {\n console.error('[FormSync] Error backfilling submissions:', error)\n return 0\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\n// Note: PLUGIN_REGISTRY and CORE_PLUGIN_IDS are project-specific\n// They should be passed as parameters to the service in the consuming application\n// import { PLUGIN_REGISTRY, CORE_PLUGIN_IDS } from '../plugins/plugin-registry'\n\nexport interface PluginData {\n id: string\n name: string\n display_name: string\n description: string\n version: string\n author: string\n category: string\n icon: string\n status: 'active' | 'inactive' | 'error'\n is_core: boolean\n settings?: any\n permissions?: string[]\n dependencies?: string[]\n download_count: number\n rating: number\n installed_at: number\n activated_at?: number\n last_updated: number\n error_message?: string\n}\n\nexport interface PluginStats {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n}\n\nexport class PluginService {\n constructor(private db: D1Database) {}\n\n async getAllPlugins(): Promise {\n // Ensure all plugins from registry exist in database (auto-install if missing)\n await this.ensureAllPluginsExist()\n\n const stmt = this.db.prepare(`\n SELECT * FROM plugins\n ORDER BY is_core DESC, display_name ASC\n `)\n\n const { results } = await stmt.all()\n return (results || []).map(this.mapPluginFromDb)\n }\n\n /**\n * Ensure all plugins from the registry exist in the database\n * Auto-installs any newly detected plugins with inactive status\n *\n * Note: This method should be overridden or configured with a plugin registry\n * in the consuming application\n */\n private async ensureAllPluginsExist(): Promise {\n // This functionality requires a project-specific PLUGIN_REGISTRY\n // In the consuming application, you should pass the registry to this service\n console.log('[PluginService] ensureAllPluginsExist - requires PLUGIN_REGISTRY configuration')\n }\n\n async getPlugin(pluginId: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE id = ?')\n const plugin = await stmt.bind(pluginId).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginByName(name: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE name = ?')\n const plugin = await stmt.bind(name).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginStats(): Promise {\n const stmt = this.db.prepare(`\n SELECT \n COUNT(*) as total,\n COUNT(CASE WHEN status = 'active' THEN 1 END) as active,\n COUNT(CASE WHEN status = 'inactive' THEN 1 END) as inactive,\n COUNT(CASE WHEN status = 'error' THEN 1 END) as errors\n FROM plugins\n `)\n \n const stats = await stmt.first() as any\n return {\n total: stats.total || 0,\n active: stats.active || 0,\n inactive: stats.inactive || 0,\n errors: stats.errors || 0,\n uninstalled: 0\n }\n }\n\n async installPlugin(pluginData: Partial): Promise {\n const id = pluginData.id || `plugin-${Date.now()}`\n const now = Math.floor(Date.now() / 1000)\n \n const stmt = this.db.prepare(`\n INSERT INTO plugins (\n id, name, display_name, description, version, author, category, icon,\n status, is_core, settings, permissions, dependencies, download_count, \n rating, installed_at, last_updated\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginData.name || id,\n pluginData.display_name || 'Unnamed Plugin',\n pluginData.description || '',\n pluginData.version || '1.0.0',\n pluginData.author || 'Unknown',\n pluginData.category || 'utilities',\n pluginData.icon || '🔌',\n 'inactive',\n pluginData.is_core || false,\n JSON.stringify(pluginData.settings || {}),\n JSON.stringify(pluginData.permissions || []),\n JSON.stringify(pluginData.dependencies || []),\n pluginData.download_count || 0,\n pluginData.rating || 0,\n now,\n now\n ).run()\n \n // Log the installation\n await this.logActivity(id, 'installed', null, { version: pluginData.version })\n \n const installed = await this.getPlugin(id)\n if (!installed) throw new Error('Failed to install plugin')\n \n return installed\n }\n\n async uninstallPlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n if (plugin.is_core) throw new Error('Cannot uninstall core plugins')\n \n // First deactivate if active\n if (plugin.status === 'active') {\n await this.deactivatePlugin(pluginId)\n }\n \n // Delete the plugin\n const stmt = this.db.prepare('DELETE FROM plugins WHERE id = ?')\n await stmt.bind(pluginId).run()\n \n // Log the uninstallation\n await this.logActivity(pluginId, 'uninstalled', null, { name: plugin.name })\n }\n\n async activatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check dependencies\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n await this.checkDependencies(plugin.dependencies)\n }\n \n const now = Math.floor(Date.now() / 1000)\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'active', activated_at = ?, error_message = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(now, pluginId).run()\n \n // Log the activation\n await this.logActivity(pluginId, 'activated', null)\n }\n\n async deactivatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check if other plugins depend on this one\n await this.checkDependents(plugin.name)\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'inactive', activated_at = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(pluginId).run()\n \n // Log the deactivation\n await this.logActivity(pluginId, 'deactivated', null)\n }\n\n async updatePluginSettings(pluginId: string, settings: any): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET settings = ?, updated_at = unixepoch() \n WHERE id = ?\n `)\n \n await stmt.bind(JSON.stringify(settings), pluginId).run()\n \n // Log the settings update\n await this.logActivity(pluginId, 'settings_updated', null)\n }\n\n async setPluginError(pluginId: string, error: string): Promise {\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'error', error_message = ? \n WHERE id = ?\n `)\n \n await stmt.bind(error, pluginId).run()\n \n // Log the error\n await this.logActivity(pluginId, 'error', null, { error })\n }\n\n async getPluginActivity(pluginId: string, limit: number = 10): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_activity_log \n WHERE plugin_id = ? \n ORDER BY timestamp DESC \n LIMIT ?\n `)\n \n const { results } = await stmt.bind(pluginId, limit).all()\n return (results || []).map((row: any) => ({\n id: row.id,\n action: row.action,\n userId: row.user_id,\n details: row.details ? JSON.parse(row.details) : null,\n timestamp: row.timestamp\n }))\n }\n\n async registerHook(pluginId: string, hookName: string, handlerName: string, priority: number = 10): Promise {\n const id = `hook-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_hooks (id, plugin_id, hook_name, handler_name, priority)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(id, pluginId, hookName, handlerName, priority).run()\n }\n\n async registerRoute(pluginId: string, path: string, method: string, handlerName: string, middleware?: any[]): Promise {\n const id = `route-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_routes (id, plugin_id, path, method, handler_name, middleware)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id, \n pluginId, \n path, \n method, \n handlerName, \n JSON.stringify(middleware || [])\n ).run()\n }\n\n async getPluginHooks(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_hooks \n WHERE plugin_id = ? AND is_active = TRUE\n ORDER BY priority ASC\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n async getPluginRoutes(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_routes \n WHERE plugin_id = ? AND is_active = TRUE\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n private async checkDependencies(dependencies: string[]): Promise {\n for (const dep of dependencies) {\n const plugin = await this.getPluginByName(dep)\n if (!plugin || plugin.status !== 'active') {\n throw new Error(`Required dependency '${dep}' is not active`)\n }\n }\n }\n\n private async checkDependents(pluginName: string): Promise {\n const stmt = this.db.prepare(`\n SELECT id, display_name FROM plugins \n WHERE status = 'active' \n AND dependencies LIKE ?\n `)\n \n const { results } = await stmt.bind(`%\"${pluginName}\"%`).all()\n if (results && results.length > 0) {\n const names = results.map((p: any) => p.display_name).join(', ')\n throw new Error(`Cannot deactivate. The following plugins depend on this one: ${names}`)\n }\n }\n\n private async logActivity(pluginId: string, action: string, userId: string | null, details?: any): Promise {\n const id = `activity-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_activity_log (id, plugin_id, action, user_id, details)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginId,\n action,\n userId,\n details ? JSON.stringify(details) : null\n ).run()\n }\n\n private mapPluginFromDb(row: any): PluginData {\n return {\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n version: row.version,\n author: row.author,\n category: row.category,\n icon: row.icon,\n status: row.status,\n is_core: row.is_core === 1,\n settings: row.settings ? JSON.parse(row.settings) : undefined,\n permissions: row.permissions ? JSON.parse(row.permissions) : undefined,\n dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,\n download_count: row.download_count || 0,\n rating: row.rating || 0,\n installed_at: row.installed_at,\n activated_at: row.activated_at,\n last_updated: row.last_updated,\n error_message: row.error_message\n }\n }\n}\n","/**\n * Plugin Registry - AUTO-GENERATED\n *\n * Generated by: packages/scripts/generate-plugin-registry.mjs\n * Generated at: 2026-05-16T15:00:20.475Z\n * Source: All manifest.json files in src/plugins/\n *\n * DO NOT EDIT MANUALLY - run the generator script instead.\n * To add a new plugin, create a manifest.json in the plugin directory.\n */\n\nexport interface PluginRegistryEntry {\n id: string\n codeName: string\n displayName: string\n description: string\n version: string\n author: string\n category: string\n iconEmoji: string\n is_core: boolean\n permissions: string[]\n dependencies: string[]\n defaultSettings: Record\n adminMenu: {\n label: string\n icon: string\n path: string\n order: number\n } | null\n}\n\n/**\n * All discovered plugins, keyed by plugin ID.\n */\nexport const PLUGIN_REGISTRY: Record = {\n 'ai-search': {\n \"id\": \"ai-search\",\n \"codeName\": \"ai-search-plugin\",\n \"displayName\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"path\": \"/admin/plugins/ai-search\",\n \"order\": 50\n }\n },\n\n 'code-examples-plugin': {\n \"id\": \"code-examples-plugin\",\n \"codeName\": \"code-examples-plugin\",\n \"displayName\": \"Code Examples\",\n \"description\": \"Code snippets and examples library with syntax highlighting and categorization\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💻\",\n \"is_core\": false,\n \"permissions\": [\n \"code-examples:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'core-analytics': {\n \"id\": \"core-analytics\",\n \"codeName\": \"core-analytics\",\n \"displayName\": \"Analytics & Insights\",\n \"description\": \"Core analytics system for tracking page views, user behavior, and content performance. Provides dashboards and reports with real-time metrics\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"seo\",\n \"iconEmoji\": \"📊\",\n \"is_core\": true,\n \"permissions\": [\n \"analytics:view\",\n \"analytics:export\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Analytics\",\n \"icon\": \"chart-bar\",\n \"path\": \"/admin/analytics\",\n \"order\": 50\n }\n },\n\n 'core-auth': {\n \"id\": \"core-auth\",\n \"codeName\": \"core-auth\",\n \"displayName\": \"Authentication System\",\n \"description\": \"Core authentication and user management system with role-based access control, session management, and security features\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔐\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:users\",\n \"manage:roles\",\n \"manage:permissions\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"requiredFields\": {\n \"email\": {\n \"required\": true,\n \"minLength\": 5,\n \"label\": \"Email\",\n \"type\": \"email\"\n },\n \"password\": {\n \"required\": true,\n \"minLength\": 8,\n \"label\": \"Password\",\n \"type\": \"password\"\n },\n \"username\": {\n \"required\": true,\n \"minLength\": 3,\n \"label\": \"Username\",\n \"type\": \"text\"\n },\n \"firstName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"First Name\",\n \"type\": \"text\"\n },\n \"lastName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"Last Name\",\n \"type\": \"text\"\n }\n },\n \"validation\": {\n \"emailFormat\": true,\n \"allowDuplicateUsernames\": false,\n \"passwordRequirements\": {\n \"requireUppercase\": false,\n \"requireLowercase\": false,\n \"requireNumbers\": false,\n \"requireSpecialChars\": false\n }\n },\n \"registration\": {\n \"enabled\": true,\n \"requireEmailVerification\": false,\n \"defaultRole\": \"viewer\"\n }\n },\n \"adminMenu\": null\n },\n\n 'core-cache': {\n \"id\": \"core-cache\",\n \"codeName\": \"core-cache\",\n \"displayName\": \"Cache System\",\n \"description\": \"Three-tiered caching system with in-memory and KV storage. Provides automatic caching for content, users, media, and API responses with configurable TTL and invalidation patterns.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"system\",\n \"iconEmoji\": \"⚡\",\n \"is_core\": true,\n \"permissions\": [\n \"cache.view\",\n \"cache.clear\",\n \"cache.invalidate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableMemoryCache\": true,\n \"enableKVCache\": true,\n \"enableDatabaseCache\": true,\n \"defaultTTL\": 3600\n },\n \"adminMenu\": null\n },\n\n 'core-media': {\n \"id\": \"core-media\",\n \"codeName\": \"core-media\",\n \"displayName\": \"Media Manager\",\n \"description\": \"Core media upload and management system with support for images, videos, and documents. Includes automatic optimization, thumbnail generation, and cloud storage integration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"media\",\n \"iconEmoji\": \"📸\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:media\",\n \"upload:files\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Media\",\n \"icon\": \"image\",\n \"path\": \"/admin/media\",\n \"order\": 30\n }\n },\n\n 'database-tools': {\n \"id\": \"database-tools\",\n \"codeName\": \"database-tools\",\n \"displayName\": \"Database Tools\",\n \"description\": \"Database management and administration tools including migrations, backups, and query execution\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🗄️\",\n \"is_core\": false,\n \"permissions\": [\n \"database:admin\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableTruncate\": true,\n \"enableBackup\": true,\n \"enableValidation\": true,\n \"requireConfirmation\": true\n },\n \"adminMenu\": null\n },\n\n 'demo-login-plugin': {\n \"id\": \"demo-login-plugin\",\n \"codeName\": \"demo-login-plugin\",\n \"displayName\": \"Demo Login\",\n \"description\": \"Quick demo login functionality for testing and demonstrations\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎯\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"core-auth\"\n ],\n \"defaultSettings\": {\n \"enableNotice\": true,\n \"demoEmail\": \"admin@sonicjs.com\",\n \"demoPassword\": \"sonicjs!\"\n },\n \"adminMenu\": null\n },\n\n 'design': {\n \"id\": \"design\",\n \"codeName\": \"design\",\n \"displayName\": \"Design System\",\n \"description\": \"Design system management including themes, components, and UI customization. Provides a visual interface for managing design tokens, typography, colors, and component library.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎨\",\n \"is_core\": false,\n \"permissions\": [\n \"design.view\",\n \"design.edit\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultTheme\": \"light\",\n \"customCSS\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Design\",\n \"icon\": \"palette\",\n \"path\": \"/admin/design\",\n \"order\": 80\n }\n },\n\n 'easy-mdx': {\n \"id\": \"easy-mdx\",\n \"codeName\": \"easy-mdx\",\n \"displayName\": \"EasyMDE Markdown Editor\",\n \"description\": \"Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultHeight\": 400,\n \"theme\": \"dark\",\n \"toolbar\": \"full\",\n \"placeholder\": \"Start writing your content...\"\n },\n \"adminMenu\": null\n },\n\n 'email': {\n \"id\": \"email\",\n \"codeName\": \"email\",\n \"displayName\": \"Email\",\n \"description\": \"Send transactional emails using Resend\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"📧\",\n \"is_core\": false,\n \"permissions\": [\n \"email:manage\",\n \"email:send\",\n \"email:view-logs\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"\",\n \"fromEmail\": \"\",\n \"fromName\": \"\",\n \"replyTo\": \"\",\n \"logoUrl\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Email\",\n \"icon\": \"envelope\",\n \"path\": \"/admin/plugins/email/settings\",\n \"order\": 80\n }\n },\n\n 'global-variables': {\n \"id\": \"global-variables\",\n \"codeName\": \"global-variables\",\n \"displayName\": \"Global Variables\",\n \"description\": \"Dynamic content variables with inline token support. Manage key-value variables via admin UI and use {variable_key} syntax in rich text fields for server-side resolution. Includes full CRUD admin page.\",\n \"version\": \"1.1.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔤\",\n \"is_core\": false,\n \"permissions\": [\n \"global-variables:manage\",\n \"global-variables:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableResolution\": true,\n \"cacheEnabled\": true,\n \"cacheTTL\": 300\n },\n \"adminMenu\": {\n \"label\": \"Global Variables\",\n \"icon\": \"variable\",\n \"path\": \"/admin/global-variables\",\n \"order\": 45\n }\n },\n\n 'hello-world': {\n \"id\": \"hello-world\",\n \"codeName\": \"hello-world\",\n \"displayName\": \"Hello World\",\n \"description\": \"A simple Hello World plugin demonstration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"👋\",\n \"is_core\": false,\n \"permissions\": [\n \"hello-world:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Hello World\",\n \"icon\": \"hand-raised\",\n \"path\": \"/admin/hello-world\",\n \"order\": 90\n }\n },\n\n 'magic-link-auth': {\n \"id\": \"magic-link-auth\",\n \"codeName\": \"magic-link-auth\",\n \"displayName\": \"Magic Link Authentication\",\n \"description\": \"Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔗\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"linkExpiryMinutes\": 15,\n \"rateLimitPerHour\": 5,\n \"allowNewUsers\": true\n },\n \"adminMenu\": null\n },\n\n 'oauth-providers': {\n \"id\": \"oauth-providers\",\n \"codeName\": \"oauth-providers\",\n \"displayName\": \"OAuth Providers\",\n \"description\": \"OAuth2/OIDC social login with GitHub, Google, and more\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"authentication\",\n \"iconEmoji\": \"🔑\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"providers\": {\n \"github\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n },\n \"google\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n }\n }\n },\n \"adminMenu\": null\n },\n\n 'otp-login': {\n \"id\": \"otp-login\",\n \"codeName\": \"otp-login\",\n \"displayName\": \"OTP Login\",\n \"description\": \"Passwordless authentication via email one-time codes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔢\",\n \"is_core\": false,\n \"permissions\": [\n \"otp:manage\",\n \"otp:request\",\n \"otp:verify\"\n ],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"codeLength\": 6,\n \"codeExpiryMinutes\": 10,\n \"maxAttempts\": 3,\n \"rateLimitPerHour\": 5,\n \"allowNewUserRegistration\": false,\n \"logoUrl\": \"\",\n \"logoWidth\": 150,\n \"logoBorderWidth\": 0,\n \"logoBorderColor\": \"#ffffff\",\n \"loginUrl\": \"\",\n \"loginButtonText\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"OTP Login\",\n \"icon\": \"key\",\n \"path\": \"/admin/plugins/otp-login/settings\",\n \"order\": 85\n }\n },\n\n 'quill-editor': {\n \"id\": \"quill-editor\",\n \"codeName\": \"quill-editor\",\n \"displayName\": \"Quill Rich Text Editor\",\n \"description\": \"Quill WYSIWYG editor integration for rich text editing. Lightweight, modern editor with customizable toolbars and dark mode support.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"✍️\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"version\": \"2.0.2\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"theme\": \"snow\"\n },\n \"adminMenu\": null\n },\n\n 'redirect-management': {\n \"id\": \"redirect-management\",\n \"codeName\": \"redirect-management\",\n \"displayName\": \"Redirect Management\",\n \"description\": \"URL redirect management with exact, partial, and regex matching\",\n \"version\": \"1.0.0\",\n \"author\": \"ahaas\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"↪️\",\n \"is_core\": false,\n \"permissions\": [\n \"redirect.manage\",\n \"redirect.view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"autoOffloadEnabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Redirects\",\n \"icon\": \"arrow-right\",\n \"path\": \"/admin/redirects\",\n \"order\": 85\n }\n },\n\n 'security-audit': {\n \"id\": \"security-audit\",\n \"codeName\": \"security-audit\",\n \"displayName\": \"Security Audit\",\n \"description\": \"Security event logging, brute-force detection, and analytics dashboard. Monitors login attempts, registrations, lockouts, and suspicious activity.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": false,\n \"permissions\": [\n \"security-audit:view\",\n \"security-audit:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"retention\": {\n \"daysToKeep\": 90,\n \"maxEvents\": 100000,\n \"autoPurge\": true\n },\n \"bruteForce\": {\n \"enabled\": true,\n \"maxFailedAttemptsPerIP\": 10,\n \"maxFailedAttemptsPerEmail\": 5,\n \"windowMinutes\": 15,\n \"lockoutDurationMinutes\": 30,\n \"alertThreshold\": 20\n },\n \"logging\": {\n \"logSuccessfulLogins\": true,\n \"logLogouts\": true,\n \"logRegistrations\": true,\n \"logPasswordResets\": true,\n \"logPermissionDenied\": true\n }\n },\n \"adminMenu\": {\n \"label\": \"Security Audit\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/security-audit\",\n \"order\": 85\n }\n },\n\n 'seed-data': {\n \"id\": \"seed-data\",\n \"codeName\": \"seed-data\",\n \"displayName\": \"Seed Data Generator\",\n \"description\": \"Development tool for generating sample data and testing content. Useful for demos and development environments\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🌱\",\n \"is_core\": false,\n \"permissions\": [\n \"seed-data:generate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"userCount\": 20,\n \"contentCount\": 200,\n \"defaultPassword\": \"password123\"\n },\n \"adminMenu\": null\n },\n\n 'shortcodes': {\n \"id\": \"shortcodes\",\n \"codeName\": \"shortcodes\",\n \"displayName\": \"Shortcodes\",\n \"description\": \"Registered shortcode functions for dynamic content. Use [[shortcode_name param=\\\"value\\\"]] syntax in rich text fields for server-side resolution. Includes handler registry, CRUD admin, and live preview.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"\",\n \"is_core\": false,\n \"permissions\": [\n \"shortcodes:manage\",\n \"shortcodes:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Shortcodes\",\n \"icon\": \"bolt\",\n \"path\": \"/admin/shortcodes\",\n \"order\": 46\n }\n },\n\n 'stripe': {\n \"id\": \"stripe\",\n \"codeName\": \"stripe\",\n \"displayName\": \"Stripe Subscriptions\",\n \"description\": \"Stripe subscription management with webhook handling, checkout sessions, and subscription gating\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"payments\",\n \"iconEmoji\": \"💳\",\n \"is_core\": true,\n \"permissions\": [\n \"stripe:manage\",\n \"stripe:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"stripeSecretKey\": \"\",\n \"stripeWebhookSecret\": \"\",\n \"stripePriceId\": \"\",\n \"successUrl\": \"/admin/dashboard\",\n \"cancelUrl\": \"/admin/dashboard\"\n },\n \"adminMenu\": {\n \"label\": \"Stripe\",\n \"icon\": \"credit-card\",\n \"path\": \"/admin/plugins/stripe\",\n \"order\": 90\n }\n },\n\n 'testimonials-plugin': {\n \"id\": \"testimonials-plugin\",\n \"codeName\": \"testimonials-plugin\",\n \"displayName\": \"Testimonials\",\n \"description\": \"Customer testimonials and reviews management with display widgets and ratings\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💬\",\n \"is_core\": false,\n \"permissions\": [\n \"testimonials:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'tinymce-plugin': {\n \"id\": \"tinymce-plugin\",\n \"codeName\": \"tinymce-plugin\",\n \"displayName\": \"TinyMCE Rich Text Editor\",\n \"description\": \"Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"no-api-key\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"skin\": \"oxide-dark\"\n },\n \"adminMenu\": null\n },\n\n 'turnstile': {\n \"id\": \"turnstile\",\n \"codeName\": \"turnstile-plugin\",\n \"displayName\": \"Cloudflare Turnstile\",\n \"description\": \"CAPTCHA-free bot protection using Cloudflare Turnstile. Provides reusable verification for any form.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"siteKey\": \"\",\n \"secretKey\": \"\",\n \"theme\": \"auto\",\n \"size\": \"normal\",\n \"mode\": \"managed\",\n \"appearance\": \"always\",\n \"preClearanceEnabled\": false,\n \"preClearanceLevel\": \"managed\",\n \"enabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Turnstile\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/turnstile/settings\",\n \"order\": 100\n }\n },\n\n 'user-profiles': {\n \"id\": \"user-profiles\",\n \"codeName\": \"user-profiles\",\n \"displayName\": \"User Profiles\",\n \"description\": \"Configurable custom profile fields for users\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"users\",\n \"iconEmoji\": \"👤\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'workflow-plugin': {\n \"id\": \"workflow-plugin\",\n \"codeName\": \"workflow-plugin\",\n \"displayName\": \"Workflow Engine\",\n \"description\": \"Content workflow and approval system with customizable states, transitions, and review processes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔄\",\n \"is_core\": false,\n \"permissions\": [\n \"workflow:manage\",\n \"workflow:approve\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableApprovalChains\": true,\n \"enableScheduling\": true,\n \"enableAutomation\": true,\n \"enableNotifications\": true\n },\n \"adminMenu\": null\n }\n} as const\n\n/**\n * All plugin IDs.\n */\nexport const ALL_PLUGIN_IDS = Object.keys(PLUGIN_REGISTRY)\n\n/**\n * Plugins that have their own admin page (have an adminMenu entry).\n */\nexport const PLUGINS_WITH_ADMIN_PAGES = ALL_PLUGIN_IDS.filter(\n id => PLUGIN_REGISTRY[id]?.adminMenu !== null\n)\n\n/**\n * Look up a plugin by its codeName (the `name` field stored in the DB).\n * Falls back to id lookup if no codeName match.\n */\nexport function findPluginByCodeName(codeName: string): PluginRegistryEntry | undefined {\n return Object.values(PLUGIN_REGISTRY).find(p => p.codeName === codeName)\n || PLUGIN_REGISTRY[codeName]\n}\n\n/**\n * Get a plugin by ID.\n */\nexport function getPlugin(id: string): PluginRegistryEntry | undefined {\n return PLUGIN_REGISTRY[id]\n}\n","import type { D1Database } from \"@cloudflare/workers-types\";\nimport { PluginService } from \"./plugin-service\";\nimport { PLUGIN_REGISTRY } from \"../plugins/manifest-registry\";\nimport type { PluginRegistryEntry } from \"../plugins/manifest-registry\";\n\nexport interface CorePlugin {\n id: string;\n name: string;\n display_name: string;\n description: string;\n version: string;\n author: string;\n category: string;\n icon: string;\n permissions: string[];\n dependencies: string[];\n settings?: any;\n}\n\n/**\n * Build the CORE_PLUGINS list from the auto-generated registry.\n * To add a new bootstrapped plugin, create a manifest.json and\n * run: node packages/scripts/generate-plugin-registry.mjs\n *\n * Only plugins that are in the BOOTSTRAP_PLUGIN_IDS list will be\n * auto-installed on first boot. Edit this list to control which\n * plugins are bootstrapped.\n */\nconst BOOTSTRAP_PLUGIN_IDS = [\n \"core-auth\",\n \"core-media\",\n \"database-tools\",\n \"seed-data\",\n \"core-cache\",\n \"workflow-plugin\",\n \"easy-mdx\",\n \"ai-search\",\n \"oauth-providers\",\n \"global-variables\",\n \"user-profiles\",\n \"stripe\",\n];\n\nfunction registryToCorePlugin(entry: PluginRegistryEntry): CorePlugin {\n return {\n id: entry.id,\n name: entry.codeName,\n display_name: entry.displayName,\n description: entry.description,\n version: entry.version,\n author: entry.author,\n category: entry.category,\n icon: entry.iconEmoji,\n permissions: entry.permissions,\n dependencies: entry.dependencies,\n settings: entry.defaultSettings,\n };\n}\n\nexport class PluginBootstrapService {\n private pluginService: PluginService;\n\n constructor(private db: D1Database) {\n this.pluginService = new PluginService(db);\n }\n\n /**\n * Core plugins derived from the auto-generated plugin registry.\n * Only plugins listed in BOOTSTRAP_PLUGIN_IDS are included.\n */\n private readonly CORE_PLUGINS: CorePlugin[] = BOOTSTRAP_PLUGIN_IDS\n .filter((id) => PLUGIN_REGISTRY[id] !== undefined)\n .map((id) => registryToCorePlugin(PLUGIN_REGISTRY[id]!));\n\n /**\n * Bootstrap all core plugins - install them if they don't exist\n */\n async bootstrapCorePlugins(): Promise {\n console.log(\"[PluginBootstrap] Starting core plugin bootstrap process...\");\n\n try {\n // Check each core plugin\n for (const corePlugin of this.CORE_PLUGINS) {\n await this.ensurePluginInstalled(corePlugin);\n }\n\n console.log(\n \"[PluginBootstrap] Core plugin bootstrap completed successfully\"\n );\n } catch (error) {\n console.error(\"[PluginBootstrap] Error during plugin bootstrap:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure a specific plugin is installed\n */\n private async ensurePluginInstalled(plugin: CorePlugin): Promise {\n try {\n // Check if plugin already exists\n const existingPlugin = await this.pluginService.getPlugin(plugin.id);\n\n if (existingPlugin) {\n console.log(\n `[PluginBootstrap] Plugin already installed: ${plugin.display_name} (status: ${existingPlugin.status})`\n );\n\n // Update plugin if version changed\n if (existingPlugin.version !== plugin.version) {\n console.log(\n `[PluginBootstrap] Updating plugin version: ${plugin.display_name} from ${existingPlugin.version} to ${plugin.version}`\n );\n await this.updatePlugin(plugin);\n }\n\n // ALWAYS ensure core-auth is active (critical for system functionality)\n if (plugin.id === 'core-auth' && existingPlugin.status !== 'active') {\n console.log(\n `[PluginBootstrap] Core-auth plugin is inactive, activating it now...`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n\n // Only auto-activate on first install, respect user's activation state on subsequent boots\n } else {\n // Install the plugin\n console.log(\n `[PluginBootstrap] Installing plugin: ${plugin.display_name}`\n );\n await this.pluginService.installPlugin({\n ...plugin,\n is_core: plugin.name.startsWith(\"core-\"),\n });\n\n // Activate plugins immediately after installation\n console.log(\n `[PluginBootstrap] Activating newly installed plugin: ${plugin.display_name}`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n } catch (error) {\n console.error(\n `[PluginBootstrap] Error ensuring plugin ${plugin.display_name}:`,\n error\n );\n // Don't throw - continue with other plugins\n }\n }\n\n /**\n * Update an existing plugin\n */\n private async updatePlugin(plugin: CorePlugin): Promise {\n const now = Math.floor(Date.now() / 1000);\n\n const stmt = this.db.prepare(`\n UPDATE plugins\n SET\n version = ?,\n description = ?,\n permissions = ?,\n settings = ?,\n last_updated = ?\n WHERE id = ?\n `);\n\n await stmt\n .bind(\n plugin.version,\n plugin.description,\n JSON.stringify(plugin.permissions),\n JSON.stringify(plugin.settings || {}),\n now,\n plugin.id\n )\n .run();\n }\n\n /**\n * Check if bootstrap is needed (first run detection)\n */\n async isBootstrapNeeded(): Promise {\n try {\n // Check if any core plugins are missing\n for (const corePlugin of this.CORE_PLUGINS.filter((p) =>\n p.name.startsWith(\"core-\")\n )) {\n const exists = await this.pluginService.getPlugin(corePlugin.id);\n if (!exists) {\n return true;\n }\n }\n return false;\n } catch (error) {\n // If there's an error (like table doesn't exist), we need bootstrap\n console.error(\n \"[PluginBootstrap] Error checking bootstrap status:\",\n error\n );\n return true;\n }\n }\n\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/services/collection-loader.ts","../src/services/collection-sync.ts","../src/services/form-collection-sync.ts","../src/services/plugin-service.ts","../src/plugins/manifest-registry.ts","../src/services/plugin-bootstrap.ts"],"names":[],"mappings":";;;AAUA,IAAM,wBAA4C,EAAC;AAM5C,SAAS,oBAAoB,WAAA,EAAuC;AACzE,EAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAEhC,IAAA,IAAI,CAAC,OAAO,IAAA,IAAQ,CAAC,OAAO,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACzD,MAAA,OAAA,CAAQ,KAAA,CAAM,sDAAsD,MAAM,CAAA;AAC1E,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,gBAAA,GAAqC;AAAA,MACzC,GAAG,MAAA;AAAA,MACH,OAAA,EAAS,MAAA,CAAO,OAAA,KAAY,MAAA,GAAY,OAAO,OAAA,GAAU,IAAA;AAAA,MACzD,QAAA,EAAU,MAAA,CAAO,QAAA,KAAa,MAAA,GAAY,OAAO,QAAA,GAAW;AAAA,KAC9D;AAEA,IAAA,qBAAA,CAAsB,KAAK,gBAAgB,CAAA;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8BAAA,EAA4B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,EACvD;AACF;AAKA,eAAsB,qBAAA,GAAqD;AACzE,EAAA,MAAM,WAAA,GAAkC,CAAC,GAAG,qBAAqB,CAAA;AAGjE,EAAA,IAAI,qBAAA,CAAsB,SAAS,CAAA,EAAG;AACpC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAY,qBAAA,CAAsB,MAAM,CAAA,0CAAA,CAA4C,CAAA;AAAA,EAClG,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAI,CAAA,uGAAA,CAA+F,CAAA;AAC3G,IAAA,OAAA,CAAQ,IAAI,CAAA,6EAAA,CAA+E,CAAA;AAC3F,IAAA,OAAA,CAAQ,IAAI,CAAA,+CAAA,CAAiD,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAI;AAGF,IAAA,MAAM,OAAA,GAAW,SAAoB,GAAO,gCAAA,EAAkC,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,IAAK,EAAC;AACnG,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAE1B,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpD,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,MAAA;AAErB,QAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAI,CAAA,iCAAA,CAAmC,CAAA;AACvE,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,SAAS,YAAA,CAAa,OAAA;AAG5B,QAAA,IAAI,CAAC,OAAO,IAAA,IAAQ,CAAC,OAAO,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACzD,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6BAAA,EAAgC,IAAI,CAAA,yBAAA,CAA2B,CAAA;AAC7E,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,gBAAA,GAAqC;AAAA,UACzC,GAAG,MAAA;AAAA,UACH,OAAA,EAAS,MAAA,CAAO,OAAA,KAAY,KAAA,CAAA,GAAY,OAAO,OAAA,GAAU,IAAA;AAAA,UACzD,QAAA,EAAU,MAAA,CAAO,QAAA,KAAa,KAAA,CAAA,GAAY,OAAO,QAAA,GAAW;AAAA,SAC9D;AAEA,QAAA,WAAA,CAAY,KAAK,gBAAgB,CAAA;AACjC,QAAA,mBAAA,EAAA;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAA6B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,MACxD,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MAC/D;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,iCAA0B,WAAA,CAAY,MAAM,WAAW,qBAAA,CAAsB,MAAM,CAAA,WAAA,EAAc,mBAAmB,CAAA,WAAA,CAAa,CAAA;AAC7I,IAAA,OAAO,WAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,KAAK,CAAA;AAC/D,IAAA,OAAO,WAAA;AAAA,EACT;AACF;AAOA,eAAsB,qBAAqB,IAAA,EAAgD;AACzF,EAAA,IAAI;AAGF,IAAA,OAAA,CAAQ,KAAK,uEAAuE,CAAA;AACpF,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yBAAA,EAA4B,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,eAAsB,2BAAA,GAAiD;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAW,SAAoB,GAAO,gCAAgC,KAAK,EAAC;AAClF,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AAGvC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA;AACrD,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,CAAC,CAAA,EAAG;AACrB,QAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAKO,SAAS,yBAAyB,MAAA,EAAgE;AACvG,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,MAAA,CAAO,KAAK,6BAA6B,CAAA;AAAA,EAC3C,WAAW,CAAC,eAAA,CAAgB,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AAC7C,IAAA,MAAA,CAAO,KAAK,wFAAwF,CAAA;AAAA,EACtG;AAEA,EAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACvB,IAAA,MAAA,CAAO,KAAK,0BAA0B,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,IAAA,MAAA,CAAO,KAAK,oBAAoB,CAAA;AAAA,EAClC,CAAA,MAAO;AAEL,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU;AACnC,MAAA,MAAA,CAAO,KAAK,8BAA8B,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,CAAC,OAAO,MAAA,CAAO,UAAA,IAAc,OAAO,MAAA,CAAO,MAAA,CAAO,eAAe,QAAA,EAAU;AAC7E,MAAA,MAAA,CAAO,KAAK,6BAA6B,CAAA;AAAA,IAC3C;AAGA,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,WAAW,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,UAAA,IAAc,EAAE,CAAA,EAAG;AACrF,MAAA,IAAI,CAAC,YAAY,IAAA,EAAM;AACrB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,SAAS,CAAA,iBAAA,CAAmB,CAAA;AAAA,MACpD;AAGA,MAAA,IAAI,WAAA,CAAY,IAAA,KAAS,WAAA,IAAe,CAAC,YAAY,UAAA,EAAY;AAC/D,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,SAAS,CAAA,gCAAA,CAAkC,CAAA;AAAA,MAC7E;AAEA,MAAA,MAAM,cAAc,WAAA,CAAY,YAAA;AAChC,MAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,QAAA,IAAI,WAAA,CAAY,SAAS,QAAA,EAAU;AACjC,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,SAAS,CAAA,8CAAA,CAAgD,CAAA;AAAA,QACjF,CAAA,MAAA,IAAW,CAAC,CAAC,QAAA,EAAU,MAAM,CAAA,CAAE,QAAA,CAAS,WAAW,CAAA,EAAG;AACpD,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiB,SAAS,CAAA,kDAAA,CAAoD,CAAA;AAAA,QAC5F;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,QAAA,EAAU,aAAA,EAAe,OAAO,CAAA,CAAE,QAAA,CAAS,WAAA,CAAY,IAAI,CAAA,IAAK,CAAC,WAAA,CAAY,IAAA,EAAM;AACtF,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiB,SAAS,CAAA,yBAAA,CAA2B,CAAA;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;;;ACzLA,eAAsB,gBAAgB,EAAA,EAAiD;AACrF,EAAA,OAAA,CAAQ,IAAI,uCAAgC,CAAA;AAE5C,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,MAAM,OAAA,GAAU,MAAM,qBAAA,EAAsB;AAE5C,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAA,CAAQ,IAAI,kDAAwC,CAAA;AACpD,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,EAAA,EAAI,MAAM,CAAA;AAC9C,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAC5D,EAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAC5D,EAAA,MAAM,YAAY,OAAA,CAAQ,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAChE,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,OAAO,CAAA,CAAE,MAAA;AAEzD,EAAA,OAAA,CAAQ,GAAA,CAAI,oCAA+B,OAAO,CAAA,UAAA,EAAa,OAAO,CAAA,UAAA,EAAa,SAAS,CAAA,YAAA,EAAe,MAAM,CAAA,OAAA,CAAS,CAAA;AAE1H,EAAA,OAAO,OAAA;AACT;AAKA,eAAsB,cAAA,CAAe,IAAgB,MAAA,EAAyD;AAC5G,EAAA,IAAI;AAEF,IAAA,MAAM,UAAA,GAAa,yBAAyB,MAAM,CAAA;AAClD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO;AAAA,QACL,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,MAAA,EAAQ,OAAA;AAAA,QACR,OAAO,CAAA,mBAAA,EAAsB,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OAC3D;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,EAAA,CAAG,OAAA,CAAQ,0CAA0C,CAAA;AAC1E,IAAA,MAAM,WAAW,MAAM,YAAA,CAAa,KAAK,MAAA,CAAO,IAAI,EAAE,KAAA,EAAM;AAE5D,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,YAAA,GAAe,QAAA,EAAU,EAAA,IAAM,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAG1F,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAC/C,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,KAAa,KAAA,GAAQ,CAAA,GAAI,CAAA;AACjD,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,KAAY,KAAA,GAAQ,CAAA,GAAI,CAAA;AAE/C,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA,MAAM,UAAA,GAAa,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAG7B,CAAA;AAED,MAAA,MAAM,UAAA,CAAW,IAAA;AAAA,QACf,YAAA;AAAA,QACA,MAAA,CAAO,IAAA;AAAA,QACP,MAAA,CAAO,WAAA;AAAA,QACP,OAAO,WAAA,IAAe,IAAA;AAAA,QACtB,UAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,QACA,GAAA,EAAI;AAEN,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAA2B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAEpD,MAAA,OAAO;AAAA,QACL,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,CAAA,oBAAA,EAAuB,MAAA,CAAO,WAAW,CAAA,CAAA;AAAA,OACpD;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,iBAAiB,QAAA,CAAS,MAAA,GAAS,KAAK,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,GAAI,IAAA;AAC3E,MAAA,MAAM,sBAAsB,QAAA,CAAS,YAAA;AACrC,MAAA,MAAM,sBAAsB,QAAA,CAAS,WAAA;AACrC,MAAA,MAAM,mBAAmB,QAAA,CAAS,SAAA;AAClC,MAAA,MAAM,kBAAkB,QAAA,CAAS,OAAA;AAEjC,MAAA,MAAM,WAAA,GACJ,UAAA,KAAe,cAAA,IACf,MAAA,CAAO,WAAA,KAAgB,mBAAA,IAAA,CACtB,MAAA,CAAO,WAAA,IAAe,IAAA,MAAU,mBAAA,IACjC,QAAA,KAAa,gBAAA,IACb,OAAA,KAAY,eAAA;AAEd,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO;AAAA,UACL,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAA,EAAQ,WAAA;AAAA,UACR,OAAA,EAAS,CAAA,YAAA,EAAe,MAAA,CAAO,WAAW,CAAA,eAAA;AAAA,SAC5C;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAa,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,MAAA,CAI7B,CAAA;AAED,MAAA,MAAM,UAAA,CAAW,IAAA;AAAA,QACf,MAAA,CAAO,WAAA;AAAA,QACP,OAAO,WAAA,IAAe,IAAA;AAAA,QACtB,UAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,GAAA;AAAA,QACA,MAAA,CAAO;AAAA,QACP,GAAA,EAAI;AAEN,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAA2B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAEpD,MAAA,OAAO;AAAA,QACL,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,CAAA,oBAAA,EAAuB,MAAA,CAAO,WAAW,CAAA,CAAA;AAAA,OACpD;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kCAAA,EAAgC,MAAA,CAAO,IAAI,KAAK,KAAK,CAAA;AAEnE,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AAKA,eAAsB,mBAAA,CAAoB,IAAgB,cAAA,EAA0C;AAClG,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,gDAAgD,CAAA;AACxE,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,cAAc,EAAE,KAAA,EAAM;AAErD,IAAA,OAAO,QAAQ,OAAA,KAAY,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,KAAK,CAAA;AAC/D,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,eAAsB,sBAAsB,EAAA,EAAmC;AAC7E,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,gDAAgD,CAAA;AACxE,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAK,GAAA,EAAI;AAEnC,IAAA,OAAA,CAAQ,WAAW,EAAC,EAAG,IAAI,CAAC,GAAA,KAAa,IAAI,IAAI,CAAA;AAAA,EACnD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAMA,eAAsB,0BAA0B,EAAA,EAAmC;AACjF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,qBAAA,EAAsB;AAC5C,IAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AACpD,IAAA,MAAM,kBAAA,GAAqB,MAAM,qBAAA,CAAsB,EAAE,CAAA;AACzD,IAAA,MAAM,UAAoB,EAAC;AAE3B,IAAA,KAAA,MAAW,eAAe,kBAAA,EAAoB;AAC5C,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,WAAW,CAAA,EAAG;AAGjC,QAAA,MAAM,UAAA,GAAa,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,QAAA,CAI7B,CAAA;AAED,QAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,KAAI,EAAG,WAAW,EAAE,GAAA,EAAI;AACnD,QAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AACxB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gDAAA,EAAyC,WAAW,CAAA,CAAE,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAC7D,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAKA,eAAsB,mBAAmB,EAAA,EAGtC;AACD,EAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,EAAE,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,MAAM,yBAAA,CAA0B,EAAE,CAAA;AAElD,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B;;;AC1NA,IAAM,mBAAA,GAAsB,wBAAA;AAK5B,SAAS,0BAA0B,SAAA,EAAsD;AACvF,EAAA,QAAQ,UAAU,IAAA;AAAM,IACtB,KAAK,WAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,SAAA,CAAU,KAAA,IAAS,UAAU,GAAA,EAAI;AAAA,IACnE,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,MAAM,QAAA,EAAU,MAAA,EAAQ,SAAS,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAA,CAAU,GAAA,EAAI;AAAA,IACpF,KAAK,QAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,SAAA,CAAU,KAAA,IAAS,UAAU,GAAA,EAAI;AAAA,IACnE,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,SAAA,CAAU,KAAA,IAAS,UAAU,GAAA,EAAI;AAAA,IACpE,KAAK,QAAA;AAAA,IACL,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,UAAA,GAAA,CAAc,SAAA,CAAU,IAAA,EAAM,MAAA,IAAU,SAAA,CAAU,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,KAAK,CAAA;AAC7F,MAAA,MAAM,UAAA,GAAA,CAAc,SAAA,CAAU,IAAA,EAAM,MAAA,IAAU,SAAA,CAAU,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,KAAK,CAAA;AAC7F,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAA,CAAU,GAAA;AAAA,QACpC,IAAA,EAAM,UAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF;AAAA,IACA,KAAK,aAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,SAAA,CAAU,KAAA,IAAS,UAAU,GAAA,EAAI;AAAA,IACnE,KAAK,UAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,MAAM,QAAA,EAAU,MAAA,EAAQ,aAAa,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAA,CAAU,GAAA,EAAI;AAAA,IACxF,KAAK,MAAA;AAAA,IACL,KAAK,WAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,SAAA,CAAU,KAAA,IAAS,UAAU,GAAA,EAAI;AAAA,IACnE,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,SAAA,CAAU,KAAA,IAAS,UAAU,GAAA,EAAI;AAAA,IACnE,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,SAAA,CAAU,KAAA,IAAS,UAAU,GAAA,EAAI;AAAA,IACnE;AACE,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,SAAA,CAAU,KAAA,IAAS,UAAU,GAAA,EAAI;AAAA;AAEvE;AAMA,SAAS,uBAAuB,UAAA,EAA0B;AACxD,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AAExB,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAE7B,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AACrG,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,sBAAA,CAAuB,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,MACxD;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,OAAA,EAAS;AAC3C,MAAA,KAAA,MAAW,GAAA,IAAO,KAAK,OAAA,EAAS;AAC9B,QAAA,IAAI,IAAI,UAAA,EAAY;AAClB,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,sBAAA,CAAuB,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,QACvD;AAAA,MACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,IAAA,EAAM;AACtC,MAAA,KAAA,MAAW,GAAA,IAAO,KAAK,IAAA,EAAM;AAC3B,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,UAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,YAAA,IAAI,KAAK,UAAA,EAAY;AACnB,cAAA,MAAA,CAAO,IAAA,CAAK,GAAG,sBAAA,CAAuB,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,YACxD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,IAAY,IAAA,CAAK,SAAS,aAAA,IAAiB,IAAA,CAAK,SAAS,SAAA,EAAW;AACpF,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAEA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,sBAAA,CAAuB,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,iCAAiC,YAAA,EAAwB;AACvE,EAAA,MAAM,UAAA,GAAa,YAAA,EAAc,UAAA,IAAc,EAAC;AAChD,EAAA,MAAM,eAAA,GAAkB,uBAAuB,UAAU,CAAA;AAEzD,EAAA,MAAM,UAAA,GAAkC;AAAA;AAAA,IAEtC,OAAO,EAAE,IAAA,EAAM,UAAU,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA;AAAK,GAC1D;AACA,EAAA,MAAM,QAAA,GAAqB,CAAC,OAAO,CAAA;AAEnC,EAAA,KAAA,MAAW,QAAQ,eAAA,EAAiB;AAClC,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,QAAA,IAAY,QAAQ,OAAA,EAAS;AACjD,IAAA,MAAM,QAAA,GAAW,0BAA0B,IAAI,CAAA;AAC/C,IAAA,IAAI,IAAA,CAAK,UAAU,QAAA,EAAU;AAC3B,MAAA,QAAA,CAAS,QAAA,GAAW,IAAA;AACpB,MAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,IACnB;AACA,IAAA,UAAA,CAAW,GAAG,CAAA,GAAI,QAAA;AAAA,EACpB;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,QAAA,EAAS;AAChD;AAKO,SAAS,qBAAA,CAAsB,MAA2B,eAAA,EAAiC;AAEhG,EAAA,MAAM,aAAa,CAAC,MAAA,EAAQ,UAAA,EAAY,WAAA,EAAa,aAAa,YAAY,CAAA;AAC9E,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,IAAI,IAAA,CAAK,GAAG,CAAA,IAAK,OAAO,IAAA,CAAK,GAAG,CAAA,KAAM,QAAA,IAAY,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK,EAAG;AAElE,MAAA,IAAI,GAAA,KAAQ,WAAA,IAAe,GAAA,KAAQ,YAAA,EAAc;AAC/C,QAAA,MAAM,IAAA,GAAO,KAAK,UAAU,CAAA,IAAK,KAAK,WAAW,CAAA,IAAK,IAAA,CAAK,UAAU,CAAA,IAAK,EAAA;AAC1E,QAAA,IAAI,IAAA,EAAM,OAAO,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAM,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,EAAM,CAAA,CAAA;AAAA,MACrD;AACA,MAAA,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA,CAAK,UAAU,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACrE,IAAA,OAAO,IAAA,CAAK,MAAM,IAAA,EAAK;AAAA,EACzB;AAEA,EAAA,IAAI,IAAA,CAAK,WAAW,OAAO,IAAA,CAAK,YAAY,QAAA,IAAY,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,EAAG;AAC3E,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,EAC3B;AAEA,EAAA,MAAM,OAAA,GAAA,iBAAU,IAAI,IAAA,EAAK,EAAE,mBAAmB,OAAA,EAAS;AAAA,IACrD,IAAA,EAAM,SAAA;AAAA,IAAW,KAAA,EAAO,OAAA;AAAA,IAAS,GAAA,EAAK,SAAA;AAAA,IAAW,IAAA,EAAM,SAAA;AAAA,IAAW,MAAA,EAAQ;AAAA,GAC3E,CAAA;AACD,EAAA,OAAO,CAAA,EAAG,eAAe,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA;AACxC;AAOO,SAAS,6BAA6B,UAAA,EAA4B;AACvE,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,SAAA;AAAW,MAAA,OAAO,WAAA;AAAA,IACvB,KAAK,UAAA;AAAY,MAAA,OAAO,WAAA;AAAA,IACxB,KAAK,UAAA;AAAY,MAAA,OAAO,WAAA;AAAA,IACxB,KAAK,UAAA;AAAY,MAAA,OAAO,UAAA;AAAA,IACxB,KAAK,MAAA;AAAQ,MAAA,OAAO,SAAA;AAAA,IACpB;AAAS,MAAA,OAAO,WAAA;AAAA;AAEpB;AAKA,eAAsB,kBAAA,CAAmB,IAAgB,IAAA,EAO0B;AACjF,EAAA,MAAM,cAAA,GAAiB,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,CAAA;AACxC,EAAA,MAAM,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,YAAY,CAAA,OAAA,CAAA;AAGxC,EAAA,MAAM,YAAA,GAAe,OAAO,IAAA,CAAK,aAAA,KAAkB,QAAA,GAC/C,KAAK,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA,GAC7B,IAAA,CAAK,aAAA;AAET,EAAA,MAAM,MAAA,GAAS,iCAAiC,YAAY,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,GAAY,CAAA,GAAI,CAAA;AAGtC,EAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,OAAA;AAAA,IACxB;AAAA,IACA,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAE9B,EAAA,IAAI,CAAC,QAAA,EAAU;AAEb,IAAA,MAAM,YAAA,GAAe,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAE7E,IAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAGhB,CAAA,CAAE,IAAA;AAAA,MACD,YAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAK,WAAA,IAAe,IAAA;AAAA,MACpB,UAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,CAAK,EAAA;AAAA,MACL,GAAA;AAAA,MACA;AAAA,MACA,GAAA,EAAI;AAEN,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAyC,cAAc,CAAA,CAAE,CAAA;AACrE,IAAA,OAAO,EAAE,YAAA,EAAc,MAAA,EAAQ,SAAA,EAAU;AAAA,EAC3C;AAGA,EAAA,MAAM,iBAAiB,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,OAAO,QAAA,CAAS,MAAA,KAAW,QAAA,GAAW,IAAA,CAAK,MAAM,QAAA,CAAS,MAAM,CAAA,GAAI,QAAA,CAAS,MAAM,CAAA,GAAI,IAAA;AAC/I,EAAA,MAAM,WAAA,GACJ,UAAA,KAAe,cAAA,IACf,WAAA,KAAgB,QAAA,CAAS,YAAA,IAAA,CACxB,IAAA,CAAK,WAAA,IAAe,IAAA,MAAU,QAAA,CAAS,WAAA,IACxC,QAAA,KAAa,QAAA,CAAS,SAAA;AAExB,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,EAAE,YAAA,EAAc,QAAA,CAAS,EAAA,EAAI,QAAQ,WAAA,EAAY;AAAA,EAC1D;AAEA,EAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,EAAA,CAGhB,CAAA,CAAE,IAAA;AAAA,IACD,WAAA;AAAA,IACA,KAAK,WAAA,IAAe,IAAA;AAAA,IACpB,UAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA,CAAS;AAAA,IACT,GAAA,EAAI;AAEN,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAyC,cAAc,CAAA,CAAE,CAAA;AACrE,EAAA,OAAO,EAAE,YAAA,EAAc,QAAA,CAAS,EAAA,EAAI,QAAQ,SAAA,EAAU;AACxD;AAKA,eAAsB,uBAAuB,EAAA,EAA+B;AAC1E,EAAA,IAAI;AAEF,IAAA,MAAM,UAAA,GAAa,MAAM,EAAA,CAAG,OAAA;AAAA,MAC1B;AAAA,MACA,KAAA,EAAM;AACR,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AACvE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,MAAM,EAAA,CAAG,OAAA;AAAA,MAClC;AAAA,MACA,GAAA,EAAI;AAEN,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,EAAA,EAAI,IAAW,CAAA;AACvD,QAAA,IAAI,MAAA,CAAO,WAAW,SAAA,EAAW,OAAA,EAAA;AACjC,QAAA,IAAI,MAAA,CAAO,WAAW,SAAA,EAAW,OAAA,EAAA;AAGjC,QAAA,MAAM,uBAAA,CAAwB,EAAA,EAAI,IAAA,CAAK,EAAA,EAAc,OAAO,YAAY,CAAA;AAAA,MAC1E,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAA,CAAK,IAAI,KAAK,KAAK,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,6BAA6B,OAAO,CAAA,UAAA,EAAa,OAAO,CAAA,gBAAA,EAAmB,KAAA,CAAM,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,EAC7G,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,KAAK,CAAA;AAAA,EACnE;AACF;AAKA,eAAsB,4BACpB,EAAA,EACA,cAAA,EACA,MACA,YAAA,EACA,QAAA,GAKI,EAAC,EACmB;AACxB,EAAA,IAAI;AAEF,IAAA,IAAI,UAAA,GAAa,MAAM,EAAA,CAAG,OAAA;AAAA,MACxB;AAAA,MACA,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAE9B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEf,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+CAAA,EAAkD,IAAA,CAAK,IAAI,CAAA,yBAAA,CAA2B,CAAA;AACnG,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,OAAA;AAAA,UACxB;AAAA,SACF,CAAE,IAAA,CAAK,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAEtB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,MAAA,GAAS,OAAO,QAAA,CAAS,aAAA,KAAkB,QAAA,GAC7C,KAAK,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,GACjC,QAAA,CAAS,aAAA;AACb,UAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,EAAA,EAAI;AAAA,YAC1C,IAAI,QAAA,CAAS,EAAA;AAAA,YACb,MAAM,QAAA,CAAS,IAAA;AAAA,YACf,cAAc,QAAA,CAAS,YAAA;AAAA,YACvB,aAAa,QAAA,CAAS,WAAA;AAAA,YACtB,aAAA,EAAe,MAAA;AAAA,YACf,SAAA,EAAW,SAAS,SAAA,IAAa;AAAA,WAClC,CAAA;AAED,UAAA,UAAA,GAAa,MAAM,EAAA,CAAG,OAAA;AAAA,YACpB;AAAA,YACA,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,EAAE,EAAE,KAAA,EAAM;AAC9B,UAAA,OAAA,CAAQ,IAAI,CAAA,mCAAA,EAAsC,MAAA,CAAO,MAAM,CAAA,gBAAA,EAAmB,MAAA,CAAO,YAAY,CAAA,CAAE,CAAA;AAAA,QACzG;AAAA,MACF,SAAS,OAAA,EAAS;AAChB,QAAA,OAAA,CAAQ,KAAA,CAAM,4DAA4D,OAAO,CAAA;AAAA,MACnF;AAEA,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+CAAA,EAAkD,IAAA,CAAK,IAAI,CAAA,uBAAA,CAAyB,CAAA;AAClG,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAW;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,cAAA,EAAgB,IAAA,CAAK,YAAY,CAAA;AACrE,IAAA,MAAM,OAAO,CAAA,WAAA,EAAc,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAGnD,IAAA,MAAM,WAAA,GAAmC;AAAA,MACvC,KAAA;AAAA,MACA,GAAG,cAAA;AAAA,MACH,oBAAA,EAAsB;AAAA,QACpB,YAAA;AAAA,QACA,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,KAAA,EAAO,QAAA,CAAS,SAAA,IAAa,cAAA,CAAe,KAAA,IAAS,IAAA;AAAA,QACrD,SAAA,EAAW,SAAS,SAAA,IAAa,IAAA;AAAA,QACjC,SAAA,EAAW,SAAS,SAAA,IAAa,IAAA;AAAA,QACjC,WAAA,EAAa;AAAA;AACf,KACF;AAEA,IAAA,MAAM,QAAA,GAAW,SAAS,MAAA,IAAU,mBAAA;AAGpC,IAAA,IAAI,aAAa,mBAAA,EAAqB;AACpC,MAAA,MAAM,UAAA,GAAa,MAAM,EAAA,CAAG,OAAA,CAAQ,mCAAmC,CAAA,CAAE,IAAA,CAAK,mBAAmB,CAAA,CAAE,KAAA,EAAM;AACzG,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAA,CAAQ,IAAI,kDAAkD,CAAA;AAC9D,QAAA,MAAM,MAAA,GAAS,KAAK,GAAA,EAAI;AACxB,QAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,QAAA,CAGhB,CAAA,CAAE,IAAA,CAAK,mBAAA,EAAqB,+BAAA,EAAiC,cAAA,EAAgB,QAAQ,YAAA,EAAc,MAAA,EAAQ,MAAM,CAAA,CAAE,GAAA,EAAI;AAAA,MAC1H;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iCAAA,EAAoC,SAAS,CAAA,aAAA,EAAgB,UAAA,CAAW,EAAE,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,EAAW,KAAK,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAE,CAAA;AAE1I,IAAA,MAAM,GAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAGhB,CAAA,CAAE,IAAA;AAAA,MACD,SAAA;AAAA,MACA,UAAA,CAAW,EAAA;AAAA,MACX,IAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA,MAC1B,QAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,MACA,GAAA,EAAI;AAGN,IAAA,MAAM,EAAA,CAAG,OAAA;AAAA,MACP;AAAA,KACF,CAAE,IAAA,CAAK,SAAA,EAAW,YAAY,EAAE,GAAA,EAAI;AAEpC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yCAAA,EAA4C,SAAS,CAAA,CAAE,CAAA;AACnE,IAAA,OAAO,SAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,sDAAsD,KAAK,CAAA;AACzE,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,eAAsB,uBAAA,CACpB,EAAA,EACA,MAAA,EACA,YAAA,EACiB;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,MAAM,EAAA,CAAG,OAAA;AAAA,MACxC;AAAA,KACF,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,EAAI;AAEnB,IAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC5C,MAAA,OAAO,CAAA;AAAA,IACT;AAGA,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA;AAAA,MACpB;AAAA,KACF,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,EAAM;AAErB,IAAA,IAAI,CAAC,MAAM,OAAO,CAAA;AAElB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,GAAiB,OAAO,GAAA,CAAI,eAAA,KAAoB,QAAA,GAClD,KAAK,KAAA,CAAM,GAAA,CAAI,eAAyB,CAAA,GACxC,GAAA,CAAI,eAAA;AAER,QAAA,MAAM,YAAY,MAAM,2BAAA;AAAA,UACtB,EAAA;AAAA,UACA,cAAA;AAAA,UACA,EAAE,IAAI,IAAA,CAAK,EAAA,EAAI,MAAM,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,IAAA,CAAK,YAAA,EAAa;AAAA,UAChE,GAAA,CAAI,EAAA;AAAA,UACJ;AAAA,YACE,WAAW,GAAA,CAAI,UAAA;AAAA,YACf,WAAW,GAAA,CAAI,UAAA;AAAA,YACf,WAAW,GAAA,CAAI,UAAA;AAAA,YACf,QAAQ,GAAA,CAAI;AAAA;AACd,SACF;AACA,QAAA,IAAI,SAAA,EAAW,KAAA,EAAA;AAAA,MACjB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wCAAA,EAA2C,GAAA,CAAI,EAAE,KAAK,KAAK,CAAA;AAAA,MAC3E;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,KAAK,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,KAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAChE,IAAA,OAAO,CAAA;AAAA,EACT;AACF;;;ACxcO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA,EAErC,MAAM,aAAA,GAAuC;AAE3C,IAAA,MAAM,KAAK,qBAAA,EAAsB;AAEjC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAG5B,CAAA;AAED,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAK,GAAA,EAAI;AACnC,IAAA,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,KAAK,eAAe,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,qBAAA,GAAuC;AAGnD,IAAA,OAAA,CAAQ,IAAI,gFAAgF,CAAA;AAAA,EAC9F;AAAA,EAEA,MAAM,UAAU,QAAA,EAA8C;AAC5D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,oCAAoC,CAAA;AACjE,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,EAAE,KAAA,EAAM;AAE/C,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,OAAO,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,gBAAgB,IAAA,EAA0C;AAC9D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,sCAAsC,CAAA;AACnE,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,EAAE,KAAA,EAAM;AAE3C,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,OAAO,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,cAAA,GAAuC;AAC3C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAO5B,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,EAAM;AAC/B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,MAAM,KAAA,IAAS,CAAA;AAAA,MACtB,MAAA,EAAQ,MAAM,MAAA,IAAU,CAAA;AAAA,MACxB,QAAA,EAAU,MAAM,QAAA,IAAY,CAAA;AAAA,MAC5B,MAAA,EAAQ,MAAM,MAAA,IAAU,CAAA;AAAA,MACxB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,UAAA,EAAsD;AACxE,IAAA,MAAM,KAAK,UAAA,CAAW,EAAA,IAAM,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAChD,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAExC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAM5B,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,IAAA;AAAA,MACT,EAAA;AAAA,MACA,WAAW,IAAA,IAAQ,EAAA;AAAA,MACnB,WAAW,YAAA,IAAgB,gBAAA;AAAA,MAC3B,WAAW,WAAA,IAAe,EAAA;AAAA,MAC1B,WAAW,OAAA,IAAW,OAAA;AAAA,MACtB,WAAW,MAAA,IAAU,SAAA;AAAA,MACrB,WAAW,QAAA,IAAY,WAAA;AAAA,MACvB,WAAW,IAAA,IAAQ,WAAA;AAAA,MACnB,UAAA;AAAA,MACA,WAAW,OAAA,IAAW,KAAA;AAAA,MACtB,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,QAAA,IAAY,EAAE,CAAA;AAAA,MACxC,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,WAAA,IAAe,EAAE,CAAA;AAAA,MAC3C,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,YAAA,IAAgB,EAAE,CAAA;AAAA,MAC5C,WAAW,cAAA,IAAkB,CAAA;AAAA,MAC7B,WAAW,MAAA,IAAU,CAAA;AAAA,MACrB,GAAA;AAAA,MACA;AAAA,MACA,GAAA,EAAI;AAGN,IAAA,MAAM,IAAA,CAAK,YAAY,EAAA,EAAI,WAAA,EAAa,MAAM,EAAE,OAAA,EAAS,UAAA,CAAW,OAAA,EAAS,CAAA;AAE7E,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAE1D,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,QAAA,EAAiC;AACrD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAC/C,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAGnE,IAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AAAA,IACtC;AAGA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,kCAAkC,CAAA;AAC/D,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,CAAE,GAAA,EAAI;AAG9B,IAAA,MAAM,IAAA,CAAK,YAAY,QAAA,EAAU,aAAA,EAAe,MAAM,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAM,eAAe,QAAA,EAAiC;AACpD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAG/C,IAAA,IAAI,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA,EAAG;AACzD,MAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,YAAY,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAI5B,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,EAAE,GAAA,EAAI;AAGnC,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,WAAA,EAAa,IAAI,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,iBAAiB,QAAA,EAAiC;AACtD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAG/C,IAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA;AAEtC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAI5B,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,CAAE,GAAA,EAAI;AAG9B,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,aAAA,EAAe,IAAI,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,oBAAA,CAAqB,QAAA,EAAkB,QAAA,EAA8B;AACzE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAE/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAI5B,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,KAAK,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG,QAAQ,EAAE,GAAA,EAAI;AAGxD,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,kBAAA,EAAoB,IAAI,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,cAAA,CAAe,QAAA,EAAkB,KAAA,EAA8B;AACnE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAI5B,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,QAAQ,EAAE,GAAA,EAAI;AAGrC,IAAA,MAAM,KAAK,WAAA,CAAY,QAAA,EAAU,SAAS,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,iBAAA,CAAkB,QAAA,EAAkB,KAAA,GAAgB,EAAA,EAAoB;AAC5E,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAK5B,CAAA;AAED,IAAA,MAAM,EAAE,SAAQ,GAAI,MAAM,KAAK,IAAA,CAAK,QAAA,EAAU,KAAK,CAAA,CAAE,GAAA,EAAI;AACzD,IAAA,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACxC,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,SAAS,GAAA,CAAI,OAAA,GAAU,KAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AAAA,MACjD,WAAW,GAAA,CAAI;AAAA,KACjB,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,YAAA,CAAa,QAAA,EAAkB,QAAA,EAAkB,WAAA,EAAqB,WAAmB,EAAA,EAAmB;AAChH,IAAA,MAAM,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAG5B,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,KAAK,EAAA,EAAI,QAAA,EAAU,UAAU,WAAA,EAAa,QAAQ,EAAE,GAAA,EAAI;AAAA,EACrE;AAAA,EAEA,MAAM,aAAA,CAAc,QAAA,EAAkB,IAAA,EAAc,MAAA,EAAgB,aAAqB,UAAA,EAAmC;AAC1H,IAAA,MAAM,EAAA,GAAK,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAG5B,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,IAAA;AAAA,MACT,EAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA,CAAK,SAAA,CAAU,UAAA,IAAc,EAAE;AAAA,MAC/B,GAAA,EAAI;AAAA,EACR;AAAA,EAEA,MAAM,eAAe,QAAA,EAAkC;AACrD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAI5B,CAAA;AAED,IAAA,MAAM,EAAE,SAAQ,GAAI,MAAM,KAAK,IAAA,CAAK,QAAQ,EAAE,GAAA,EAAI;AAClD,IAAA,OAAO,WAAW,EAAC;AAAA,EACrB;AAAA,EAEA,MAAM,gBAAgB,QAAA,EAAkC;AACtD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAG5B,CAAA;AAED,IAAA,MAAM,EAAE,SAAQ,GAAI,MAAM,KAAK,IAAA,CAAK,QAAQ,EAAE,GAAA,EAAI;AAClD,IAAA,OAAO,WAAW,EAAC;AAAA,EACrB;AAAA,EAEA,MAAc,kBAAkB,YAAA,EAAuC;AACrE,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAA;AAC7C,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,QAAA,EAAU;AACzC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,GAAG,CAAA,eAAA,CAAiB,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,UAAA,EAAmC;AAC/D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAI5B,CAAA;AAED,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,UAAU,CAAA,EAAA,CAAI,CAAA,CAAE,GAAA,EAAI;AAC7D,IAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,MAAM,KAAA,GAAQ,QAAQ,GAAA,CAAI,CAAC,MAAW,CAAA,CAAE,YAAY,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC/D,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6DAAA,EAAgE,KAAK,CAAA,CAAE,CAAA;AAAA,IACzF;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,CAAY,QAAA,EAAkB,MAAA,EAAgB,QAAuB,OAAA,EAA8B;AAC/G,IAAA,MAAM,EAAA,GAAK,CAAA,SAAA,EAAY,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACjC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,IAAA,CAG5B,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,IAAA;AAAA,MACT,EAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,GAAI;AAAA,MACpC,GAAA,EAAI;AAAA,EACR;AAAA,EAEQ,gBAAgB,GAAA,EAAsB;AAC5C,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,OAAA,EAAS,IAAI,OAAA,KAAY,CAAA;AAAA,MACzB,UAAU,GAAA,CAAI,QAAA,GAAW,KAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AAAA,MACpD,aAAa,GAAA,CAAI,WAAA,GAAc,KAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA,GAAI,MAAA;AAAA,MAC7D,cAAc,GAAA,CAAI,YAAA,GAAe,KAAK,KAAA,CAAM,GAAA,CAAI,YAAY,CAAA,GAAI,MAAA;AAAA,MAChE,cAAA,EAAgB,IAAI,cAAA,IAAkB,CAAA;AAAA,MACtC,MAAA,EAAQ,IAAI,MAAA,IAAU,CAAA;AAAA,MACtB,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,eAAe,GAAA,CAAI;AAAA,KACrB;AAAA,EACF;AACF;;;AClUO,IAAM,eAAA,GAAuD;AAAA,EAClE,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,WAAA;AAAA,IACN,UAAA,EAAY,kBAAA;AAAA,IACZ,aAAA,EAAe,WAAA;AAAA,IACf,aAAA,EAAe,sIAAA;AAAA,IACf,SAAA,EAAW,OAAA;AAAA,IACX,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,gBAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,SAAA,EAAW,IAAA;AAAA,MACX,iBAAA,EAAmB,IAAA;AAAA,MACnB,wBAAwB,EAAC;AAAA,MACzB,yBAAyB,EAAC;AAAA,MAC1B,sBAAA,EAAwB,IAAA;AAAA,MACxB,gBAAA,EAAkB,CAAA;AAAA,MAClB,eAAA,EAAiB,EAAA;AAAA,MACjB,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ,kBAAA;AAAA,MACR,MAAA,EAAQ,0BAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,sBAAA;AAAA,IACN,UAAA,EAAY,sBAAA;AAAA,IACZ,aAAA,EAAe,eAAA;AAAA,IACf,aAAA,EAAe,gFAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,mBAAmB,EAAC;AAAA,IACpB,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,gBAAA;AAAA,IACN,UAAA,EAAY,gBAAA;AAAA,IACZ,aAAA,EAAe,sBAAA;AAAA,IACf,aAAA,EAAe,+IAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,gBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,mBAAmB,EAAC;AAAA,IACpB,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,kBAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,WAAA;AAAA,IACN,UAAA,EAAY,WAAA;AAAA,IACZ,aAAA,EAAe,uBAAA;AAAA,IACf,aAAA,EAAe,0HAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,UAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,cAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,gBAAA,EAAkB;AAAA,QAChB,OAAA,EAAS;AAAA,UACP,UAAA,EAAY,IAAA;AAAA,UACZ,WAAA,EAAa,CAAA;AAAA,UACb,OAAA,EAAS,OAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,UAAA,EAAY;AAAA,UACV,UAAA,EAAY,IAAA;AAAA,UACZ,WAAA,EAAa,CAAA;AAAA,UACb,OAAA,EAAS,UAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,UAAA,EAAY;AAAA,UACV,UAAA,EAAY,IAAA;AAAA,UACZ,WAAA,EAAa,CAAA;AAAA,UACb,OAAA,EAAS,UAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,WAAA,EAAa;AAAA,UACX,UAAA,EAAY,IAAA;AAAA,UACZ,WAAA,EAAa,CAAA;AAAA,UACb,OAAA,EAAS,YAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,UAAA,EAAY;AAAA,UACV,UAAA,EAAY,IAAA;AAAA,UACZ,WAAA,EAAa,CAAA;AAAA,UACb,OAAA,EAAS,WAAA;AAAA,UACT,MAAA,EAAQ;AAAA;AACV,OACF;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,aAAA,EAAe,IAAA;AAAA,QACf,yBAAA,EAA2B,KAAA;AAAA,QAC3B,sBAAA,EAAwB;AAAA,UACtB,kBAAA,EAAoB,KAAA;AAAA,UACpB,kBAAA,EAAoB,KAAA;AAAA,UACpB,gBAAA,EAAkB,KAAA;AAAA,UAClB,qBAAA,EAAuB;AAAA;AACzB,OACF;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,SAAA,EAAW,IAAA;AAAA,QACX,0BAAA,EAA4B,KAAA;AAAA,QAC5B,aAAA,EAAe;AAAA;AACjB,KACF;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,UAAA,EAAY,YAAA;AAAA,IACZ,aAAA,EAAe,cAAA;AAAA,IACf,aAAA,EAAe,qLAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,WAAA,EAAa,QAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,YAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,mBAAA,EAAqB,IAAA;AAAA,MACrB,eAAA,EAAiB,IAAA;AAAA,MACjB,qBAAA,EAAuB,IAAA;AAAA,MACvB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,UAAA,EAAY,YAAA;AAAA,IACZ,aAAA,EAAe,eAAA;AAAA,IACf,aAAA,EAAe,8KAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,OAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,cAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,mBAAmB,EAAC;AAAA,IACpB,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,OAAA;AAAA,MACT,MAAA,EAAQ,OAAA;AAAA,MACR,MAAA,EAAQ,cAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,gBAAA;AAAA,IACN,UAAA,EAAY,gBAAA;AAAA,IACZ,aAAA,EAAe,gBAAA;AAAA,IACf,aAAA,EAAe,iGAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,aAAA;AAAA,IACZ,WAAA,EAAa,iBAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,gBAAA,EAAkB,IAAA;AAAA,MAClB,cAAA,EAAgB,IAAA;AAAA,MAChB,kBAAA,EAAoB,IAAA;AAAA,MACpB,qBAAA,EAAuB;AAAA,KACzB;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,mBAAA;AAAA,IACN,UAAA,EAAY,mBAAA;AAAA,IACZ,aAAA,EAAe,YAAA;AAAA,IACf,aAAA,EAAe,+DAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,WAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,eAAe,EAAC;AAAA,IAChB,cAAA,EAAgB;AAAA,MACd;AAAA,KACF;AAAA,IACA,iBAAA,EAAmB;AAAA,MACjB,cAAA,EAAgB,IAAA;AAAA,MAChB,WAAA,EAAa,mBAAA;AAAA,MACb,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,QAAA;AAAA,IACZ,aAAA,EAAe,eAAA;AAAA,IACf,aAAA,EAAe,iLAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,WAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,aAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,cAAA,EAAgB,OAAA;AAAA,MAChB,WAAA,EAAa;AAAA,KACf;AAAA,IACA,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,QAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,eAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,UAAA;AAAA,IACN,UAAA,EAAY,UAAA;AAAA,IACZ,aAAA,EAAe,yBAAA;AAAA,IACf,aAAA,EAAe,kIAAA;AAAA,IACf,SAAA,EAAW,OAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,eAAe,EAAC;AAAA,IAChB,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,eAAA,EAAiB,GAAA;AAAA,MACjB,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAW,MAAA;AAAA,MACX,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,OAAA;AAAA,IACN,UAAA,EAAY,OAAA;AAAA,IACZ,aAAA,EAAe,OAAA;AAAA,IACf,aAAA,EAAe,wCAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,WAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,cAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,QAAA,EAAU,EAAA;AAAA,MACV,WAAA,EAAa,EAAA;AAAA,MACb,UAAA,EAAY,EAAA;AAAA,MACZ,SAAA,EAAW,EAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,IACA,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,OAAA;AAAA,MACT,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,+BAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,kBAAA;AAAA,IACN,UAAA,EAAY,kBAAA;AAAA,IACZ,aAAA,EAAe,kBAAA;AAAA,IACf,aAAA,EAAe,2MAAA;AAAA,IACf,SAAA,EAAW,OAAA;AAAA,IACX,QAAA,EAAU,mBAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,yBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,kBAAA,EAAoB,IAAA;AAAA,MACpB,cAAA,EAAgB,IAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACd;AAAA,IACA,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,kBAAA;AAAA,MACT,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,yBAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,aAAA;AAAA,IACN,UAAA,EAAY,aAAA;AAAA,IACZ,aAAA,EAAe,aAAA;AAAA,IACf,aAAA,EAAe,2CAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,WAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,mBAAmB,EAAC;AAAA,IACpB,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,aAAA;AAAA,MACT,MAAA,EAAQ,aAAA;AAAA,MACR,MAAA,EAAQ,oBAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,iBAAA;AAAA,IACN,UAAA,EAAY,iBAAA;AAAA,IACZ,aAAA,EAAe,2BAAA;AAAA,IACf,aAAA,EAAe,iIAAA;AAAA,IACf,SAAA,EAAW,OAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,UAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,eAAe,EAAC;AAAA,IAChB,cAAA,EAAgB;AAAA,MACd;AAAA,KACF;AAAA,IACA,iBAAA,EAAmB;AAAA,MACjB,mBAAA,EAAqB,EAAA;AAAA,MACrB,kBAAA,EAAoB,CAAA;AAAA,MACpB,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,iBAAA;AAAA,IACN,UAAA,EAAY,iBAAA;AAAA,IACZ,aAAA,EAAe,iBAAA;AAAA,IACf,aAAA,EAAe,wDAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,gBAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,eAAe,EAAC;AAAA,IAChB,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,WAAA,EAAa;AAAA,QACX,QAAA,EAAU;AAAA,UACR,UAAA,EAAY,EAAA;AAAA,UACZ,cAAA,EAAgB,EAAA;AAAA,UAChB,SAAA,EAAW;AAAA,SACb;AAAA,QACA,QAAA,EAAU;AAAA,UACR,UAAA,EAAY,EAAA;AAAA,UACZ,cAAA,EAAgB,EAAA;AAAA,UAChB,SAAA,EAAW;AAAA;AACb;AACF,KACF;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,WAAA;AAAA,IACN,UAAA,EAAY,WAAA;AAAA,IACZ,aAAA,EAAe,WAAA;AAAA,IACf,aAAA,EAAe,sDAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,UAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,YAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,cAAA,EAAgB;AAAA,MACd;AAAA,KACF;AAAA,IACA,iBAAA,EAAmB;AAAA,MACjB,YAAA,EAAc,CAAA;AAAA,MACd,mBAAA,EAAqB,EAAA;AAAA,MACrB,aAAA,EAAe,CAAA;AAAA,MACf,kBAAA,EAAoB,CAAA;AAAA,MACpB,0BAAA,EAA4B,KAAA;AAAA,MAC5B,SAAA,EAAW,EAAA;AAAA,MACX,WAAA,EAAa,GAAA;AAAA,MACb,iBAAA,EAAmB,CAAA;AAAA,MACnB,iBAAA,EAAmB,SAAA;AAAA,MACnB,UAAA,EAAY,EAAA;AAAA,MACZ,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ,mCAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,cAAA;AAAA,IACN,UAAA,EAAY,cAAA;AAAA,IACZ,aAAA,EAAe,wBAAA;AAAA,IACf,aAAA,EAAe,sIAAA;AAAA,IACf,SAAA,EAAW,OAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,WAAA,EAAa,cAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,eAAe,EAAC;AAAA,IAChB,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,SAAA,EAAW,OAAA;AAAA,MACX,eAAA,EAAiB,GAAA;AAAA,MACjB,gBAAA,EAAkB,MAAA;AAAA,MAClB,OAAA,EAAS;AAAA,KACX;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,qBAAA;AAAA,IACN,UAAA,EAAY,qBAAA;AAAA,IACZ,aAAA,EAAe,qBAAA;AAAA,IACf,aAAA,EAAe,iEAAA;AAAA,IACf,SAAA,EAAW,OAAA;AAAA,IACX,QAAA,EAAU,OAAA;AAAA,IACV,UAAA,EAAY,WAAA;AAAA,IACZ,WAAA,EAAa,cAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,SAAA,EAAW,IAAA;AAAA,MACX,oBAAA,EAAsB;AAAA,KACxB;AAAA,IACA,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ,aAAA;AAAA,MACR,MAAA,EAAQ,kBAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,gBAAA;AAAA,IACN,UAAA,EAAY,gBAAA;AAAA,IACZ,aAAA,EAAe,gBAAA;AAAA,IACf,aAAA,EAAe,oJAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,UAAA;AAAA,IACZ,WAAA,EAAa,iBAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,WAAA,EAAa;AAAA,QACX,YAAA,EAAc,EAAA;AAAA,QACd,WAAA,EAAa,GAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,SAAA,EAAW,IAAA;AAAA,QACX,wBAAA,EAA0B,EAAA;AAAA,QAC1B,2BAAA,EAA6B,CAAA;AAAA,QAC7B,eAAA,EAAiB,EAAA;AAAA,QACjB,wBAAA,EAA0B,EAAA;AAAA,QAC1B,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,SAAA,EAAW;AAAA,QACT,qBAAA,EAAuB,IAAA;AAAA,QACvB,YAAA,EAAc,IAAA;AAAA,QACd,kBAAA,EAAoB,IAAA;AAAA,QACpB,mBAAA,EAAqB,IAAA;AAAA,QACrB,qBAAA,EAAuB;AAAA;AACzB,KACF;AAAA,IACA,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,gBAAA;AAAA,MACT,MAAA,EAAQ,cAAA;AAAA,MACR,MAAA,EAAQ,+BAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,WAAA;AAAA,IACN,UAAA,EAAY,WAAA;AAAA,IACZ,aAAA,EAAe,qBAAA;AAAA,IACf,aAAA,EAAe,gHAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,aAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,WAAA,EAAa,EAAA;AAAA,MACb,cAAA,EAAgB,GAAA;AAAA,MAChB,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,UAAA,EAAY,YAAA;AAAA,IACZ,aAAA,EAAe,YAAA;AAAA,IACf,aAAA,EAAe,0MAAA;AAAA,IACf,SAAA,EAAW,OAAA;AAAA,IACX,QAAA,EAAU,mBAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,EAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,mBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,mBAAmB,EAAC;AAAA,IACpB,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ,mBAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,QAAA;AAAA,IACZ,aAAA,EAAe,sBAAA;AAAA,IACf,aAAA,EAAe,kGAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,UAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,eAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,iBAAA,EAAmB,EAAA;AAAA,MACnB,qBAAA,EAAuB,EAAA;AAAA,MACvB,eAAA,EAAiB,EAAA;AAAA,MACjB,YAAA,EAAc,kBAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,QAAA;AAAA,MACT,MAAA,EAAQ,aAAA;AAAA,MACR,MAAA,EAAQ,uBAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,qBAAA;AAAA,IACN,UAAA,EAAY,qBAAA;AAAA,IACZ,aAAA,EAAe,cAAA;AAAA,IACf,aAAA,EAAe,+EAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,mBAAmB,EAAC;AAAA,IACpB,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,gBAAA;AAAA,IACN,UAAA,EAAY,gBAAA;AAAA,IACZ,aAAA,EAAe,0BAAA;AAAA,IACf,aAAA,EAAe,0KAAA;AAAA,IACf,SAAA,EAAW,OAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,eAAe,EAAC;AAAA,IAChB,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,QAAA,EAAU,YAAA;AAAA,MACV,eAAA,EAAiB,GAAA;AAAA,MACjB,gBAAA,EAAkB,MAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,WAAA;AAAA,IACN,UAAA,EAAY,kBAAA;AAAA,IACZ,aAAA,EAAe,sBAAA;AAAA,IACf,aAAA,EAAe,sGAAA;AAAA,IACf,SAAA,EAAW,OAAA;AAAA,IACX,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,UAAA;AAAA,IACZ,WAAA,EAAa,iBAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,gBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,SAAA,EAAW,EAAA;AAAA,MACX,WAAA,EAAa,EAAA;AAAA,MACb,OAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA,EAAc,QAAA;AAAA,MACd,qBAAA,EAAuB,KAAA;AAAA,MACvB,mBAAA,EAAqB,SAAA;AAAA,MACrB,SAAA,EAAW;AAAA,KACb;AAAA,IACA,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ,cAAA;AAAA,MACR,MAAA,EAAQ,mCAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EAEA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,eAAA;AAAA,IACN,UAAA,EAAY,eAAA;AAAA,IACZ,aAAA,EAAe,eAAA;AAAA,IACf,aAAA,EAAe,8CAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,OAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,eAAe,EAAC;AAAA,IAChB,gBAAgB,EAAC;AAAA,IACjB,mBAAmB,EAAC;AAAA,IACpB,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,iBAAA;AAAA,IACN,UAAA,EAAY,iBAAA;AAAA,IACZ,aAAA,EAAe,iBAAA;AAAA,IACf,aAAA,EAAe,kGAAA;AAAA,IACf,SAAA,EAAW,cAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe;AAAA,MACb,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAA,EAAmB;AAAA,MACjB,sBAAA,EAAwB,IAAA;AAAA,MACxB,kBAAA,EAAoB,IAAA;AAAA,MACpB,kBAAA,EAAoB,IAAA;AAAA,MACpB,qBAAA,EAAuB;AAAA,KACzB;AAAA,IACA,WAAA,EAAa;AAAA;AAEjB;AAKO,IAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA;AAKjB,cAAA,CAAe,MAAA;AAAA,EACrD,CAAA,EAAA,KAAM,eAAA,CAAgB,EAAE,CAAA,EAAG,SAAA,KAAc;AAC3C;AAMO,SAAS,qBAAqB,QAAA,EAAmD;AACtF,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA,IAClE,eAAA,CAAgB,QAAQ,CAAA;AAC/B;;;AChwBA,IAAM,oBAAA,GAAuB;AAAA,EAC3B,WAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,qBAAqB,KAAA,EAAwC;AACpE,EAAA,OAAO;AAAA,IACL,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,MAAM,KAAA,CAAM,QAAA;AAAA,IACZ,cAAc,KAAA,CAAM,WAAA;AAAA,IACpB,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,MAAM,KAAA,CAAM,SAAA;AAAA,IACZ,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,cAAc,KAAA,CAAM,YAAA;AAAA,IACpB,UAAU,KAAA,CAAM;AAAA,GAClB;AACF;AAEO,IAAM,yBAAN,MAA6B;AAAA,EAGlC,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAClB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,CAAc,EAAE,CAAA;AAAA,EAC3C;AAAA,EAJQ,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUS,eAA6B,oBAAA,CAC3C,MAAA,CAAO,CAAC,EAAA,KAAO,gBAAgB,EAAE,CAAA,KAAM,MAAS,CAAA,CAChD,IAAI,CAAC,EAAA,KAAO,qBAAqB,eAAA,CAAgB,EAAE,CAAE,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKzD,MAAM,oBAAA,GAAsC;AAC1C,IAAA,OAAA,CAAQ,IAAI,6DAA6D,CAAA;AAEzE,IAAA,IAAI;AAEF,MAAA,KAAA,MAAW,UAAA,IAAc,KAAK,YAAA,EAAc;AAC1C,QAAA,MAAM,IAAA,CAAK,sBAAsB,UAAU,CAAA;AAAA,MAC7C;AAEA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,oDAAoD,KAAK,CAAA;AACvE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBAAsB,MAAA,EAAmC;AACrE,IAAA,IAAI;AAEF,MAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,OAAO,EAAE,CAAA;AAEnE,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,4CAAA,EAA+C,MAAA,CAAO,YAAY,CAAA,UAAA,EAAa,eAAe,MAAM,CAAA,CAAA;AAAA,SACtG;AAGA,QAAA,IAAI,cAAA,CAAe,OAAA,KAAY,MAAA,CAAO,OAAA,EAAS;AAC7C,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,CAAA,2CAAA,EAA8C,OAAO,YAAY,CAAA,MAAA,EAAS,eAAe,OAAO,CAAA,IAAA,EAAO,OAAO,OAAO,CAAA;AAAA,WACvH;AACA,UAAA,MAAM,IAAA,CAAK,aAAa,MAAM,CAAA;AAAA,QAChC;AAGA,QAAA,IAAI,MAAA,CAAO,EAAA,KAAO,WAAA,IAAe,cAAA,CAAe,WAAW,QAAA,EAAU;AACnE,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,CAAA,oEAAA;AAAA,WACF;AACA,UAAA,MAAM,IAAA,CAAK,aAAA,CAAc,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA;AAAA,QACnD;AAAA,MAGF,CAAA,MAAO;AAEL,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,qCAAA,EAAwC,OAAO,YAAY,CAAA;AAAA,SAC7D;AACA,QAAA,MAAM,IAAA,CAAK,cAAc,aAAA,CAAc;AAAA,UACrC,GAAG,MAAA;AAAA,UACH,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,OAAO;AAAA,SACxC,CAAA;AAGD,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,qDAAA,EAAwD,OAAO,YAAY,CAAA;AAAA,SAC7E;AACA,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA;AAAA,MACnD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,CAAA,wCAAA,EAA2C,OAAO,YAAY,CAAA,CAAA,CAAA;AAAA,QAC9D;AAAA,OACF;AAAA,IAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,MAAA,EAAmC;AAC5D,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAExC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAS5B,CAAA;AAED,IAAA,MAAM,IAAA,CACH,IAAA;AAAA,MACC,MAAA,CAAO,OAAA;AAAA,MACP,MAAA,CAAO,WAAA;AAAA,MACP,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,WAAW,CAAA;AAAA,MACjC,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA;AAAA,MACpC,GAAA;AAAA,MACA,MAAA,CAAO;AAAA,MAER,GAAA,EAAI;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,GAAsC;AAC1C,IAAA,IAAI;AAEF,MAAA,KAAA,MAAW,UAAA,IAAc,KAAK,YAAA,CAAa,MAAA;AAAA,QAAO,CAAC,CAAA,KACjD,CAAA,CAAE,IAAA,CAAK,WAAW,OAAO;AAAA,OAC3B,EAAG;AACD,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,WAAW,EAAE,CAAA;AAC/D,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,oDAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEF","file":"chunk-QOZZJZ76.cjs","sourcesContent":["/**\n * Collection Loader Service\n *\n * Loads collection configuration files from the collections directory.\n * Supports both development (reading from filesystem) and production (bundled).\n */\n\nimport { CollectionConfig, CollectionConfigModule } from '../types/collection-config'\n\n// Global registry for externally registered collections\nconst registeredCollections: CollectionConfig[] = []\n\n/**\n * Register collections from the application code\n * This should be called before creating the app\n */\nexport function registerCollections(collections: CollectionConfig[]): void {\n for (const config of collections) {\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config: missing required fields`, config)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n registeredCollections.push(normalizedConfig)\n console.log(`✓ Registered collection: ${config.name}`)\n }\n}\n\n/**\n * Load all collection configurations from the collections directory\n */\nexport async function loadCollectionConfigs(): Promise {\n const collections: CollectionConfig[] = [...registeredCollections]\n\n // Log registered collections summary\n if (registeredCollections.length > 0) {\n console.log(`📦 Found ${registeredCollections.length} registered collection(s) from application`)\n } else {\n console.log(`⚠️ No collections registered. Make sure to call registerCollections() in your app's index.ts`)\n console.log(` Example: import myCollection from './collections/my-collection.collection'`)\n console.log(` registerCollections([myCollection])`)\n }\n\n try {\n // Import all collection files dynamically from core package\n // In production, these will be bundled with the application\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts', { eager: true }) || {}\n let coreCollectionCount = 0\n\n for (const [path, module] of Object.entries(modules)) {\n try {\n const configModule = module as CollectionConfigModule\n\n if (!configModule.default) {\n console.warn(`Collection file ${path} does not export a default config`)\n continue\n }\n\n const config = configModule.default\n\n // Validate required fields\n if (!config.name || !config.displayName || !config.schema) {\n console.error(`Invalid collection config in ${path}: missing required fields`)\n continue\n }\n\n // Set defaults\n const normalizedConfig: CollectionConfig = {\n ...config,\n managed: config.managed !== undefined ? config.managed : true,\n isActive: config.isActive !== undefined ? config.isActive : true\n }\n\n collections.push(normalizedConfig)\n coreCollectionCount++\n console.log(`✓ Loaded core collection: ${config.name}`)\n } catch (error) {\n console.error(`Error loading collection from ${path}:`, error)\n }\n }\n\n console.log(`📊 Collection summary: ${collections.length} total (${registeredCollections.length} from app, ${coreCollectionCount} from core)`)\n return collections\n } catch (error) {\n console.error('Error loading collection configurations:', error)\n return collections // Return registered collections even if core loading fails\n }\n}\n\n/**\n * Load a specific collection configuration by name\n * Note: This function requires implementation in the consuming application\n * as it depends on project-specific collection files\n */\nexport async function loadCollectionConfig(name: string): Promise {\n try {\n // Dynamic imports are not supported in library builds\n // This should be implemented in the consuming application\n console.warn('loadCollectionConfig requires implementation in consuming application')\n return null\n } catch (error) {\n console.error(`Error loading collection ${name}:`, error)\n return null\n }\n}\n\n/**\n * Get list of all available collection config file names\n */\nexport async function getAvailableCollectionNames(): Promise {\n try {\n const modules = (import.meta as any).glob?.('../collections/*.collection.ts') || {}\n const names: string[] = []\n\n for (const path of Object.keys(modules)) {\n // Extract collection name from path\n // e.g., '../collections/blog-posts.collection.ts' -> 'blog-posts'\n const match = path.match(/\\/([^/]+)\\.collection\\.ts$/)\n if (match && match[1]) {\n names.push(match[1])\n }\n }\n\n return names\n } catch (error) {\n console.error('Error getting collection names:', error)\n return []\n }\n}\n\n/**\n * Validate a collection configuration\n */\nexport function validateCollectionConfig(config: CollectionConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n // Required fields\n if (!config.name) {\n errors.push('Collection name is required')\n } else if (!/^[a-z0-9_-]+$/.test(config.name)) {\n errors.push('Collection name must contain only lowercase letters, numbers, underscores, and hyphens')\n }\n\n if (!config.displayName) {\n errors.push('Display name is required')\n }\n\n if (!config.schema) {\n errors.push('Schema is required')\n } else {\n // Validate schema structure\n if (config.schema.type !== 'object') {\n errors.push('Schema type must be \"object\"')\n }\n\n if (!config.schema.properties || typeof config.schema.properties !== 'object') {\n errors.push('Schema must have properties')\n }\n\n // Validate field types\n for (const [fieldName, fieldConfig] of Object.entries(config.schema.properties || {})) {\n if (!fieldConfig.type) {\n errors.push(`Field \"${fieldName}\" is missing type`)\n }\n\n // Validate reference fields\n if (fieldConfig.type === 'reference' && !fieldConfig.collection) {\n errors.push(`Reference field \"${fieldName}\" is missing collection property`)\n }\n\n const layoutValue = fieldConfig.objectLayout\n if (layoutValue !== undefined) {\n if (fieldConfig.type !== 'object') {\n errors.push(`Field \"${fieldName}\" uses objectLayout but is not an object field`)\n } else if (!['nested', 'flat'].includes(layoutValue)) {\n errors.push(`Object field \"${fieldName}\" has invalid objectLayout. Use \"nested\" or \"flat\"`)\n }\n }\n\n // Validate select fields\n if (['select', 'multiselect', 'radio'].includes(fieldConfig.type) && !fieldConfig.enum) {\n errors.push(`Select field \"${fieldName}\" is missing enum options`)\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n}\n","/**\n * Collection Sync Service\n *\n * Syncs collection configurations from code to the database.\n * Handles create, update, and validation of config-managed collections.\n */\n\nimport { CollectionConfig, CollectionSyncResult } from '../types/collection-config'\nimport { loadCollectionConfigs, validateCollectionConfig } from './collection-loader'\n\n/**\n * Sync all collection configurations to the database\n */\nexport async function syncCollections(db: D1Database): Promise {\n console.log('🔄 Starting collection sync...')\n\n const results: CollectionSyncResult[] = []\n const configs = await loadCollectionConfigs()\n\n if (configs.length === 0) {\n console.log('⚠️ No collection configurations found')\n return results\n }\n\n for (const config of configs) {\n const result = await syncCollection(db, config)\n results.push(result)\n }\n\n const created = results.filter(r => r.status === 'created').length\n const updated = results.filter(r => r.status === 'updated').length\n const unchanged = results.filter(r => r.status === 'unchanged').length\n const errors = results.filter(r => r.status === 'error').length\n\n console.log(`✅ Collection sync complete: ${created} created, ${updated} updated, ${unchanged} unchanged, ${errors} errors`)\n\n return results\n}\n\n/**\n * Sync a single collection configuration to the database\n */\nexport async function syncCollection(db: D1Database, config: CollectionConfig): Promise {\n try {\n // Validate config\n const validation = validateCollectionConfig(config)\n if (!validation.valid) {\n return {\n name: config.name,\n status: 'error',\n error: `Validation failed: ${validation.errors.join(', ')}`\n }\n }\n\n // Check if collection exists\n const existingStmt = db.prepare('SELECT * FROM collections WHERE name = ?')\n const existing = await existingStmt.bind(config.name).first() as any\n\n const now = Date.now()\n const collectionId = existing?.id || `col-${config.name}-${crypto.randomUUID().slice(0, 8)}`\n\n // Prepare collection data\n const schemaJson = JSON.stringify(config.schema)\n const isActive = config.isActive !== false ? 1 : 0\n const managed = config.managed !== false ? 1 : 0\n\n if (!existing) {\n // Create new collection\n const insertStmt = db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await insertStmt.bind(\n collectionId,\n config.name,\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n now\n ).run()\n\n console.log(` ✓ Created collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'created',\n message: `Created collection \"${config.displayName}\"`\n }\n } else {\n // Check if update is needed\n const existingSchema = existing.schema ? JSON.stringify(existing.schema) : '{}'\n const existingDisplayName = existing.display_name\n const existingDescription = existing.description\n const existingIsActive = existing.is_active\n const existingManaged = existing.managed\n\n const needsUpdate =\n schemaJson !== existingSchema ||\n config.displayName !== existingDisplayName ||\n (config.description || null) !== existingDescription ||\n isActive !== existingIsActive ||\n managed !== existingManaged\n\n if (!needsUpdate) {\n return {\n name: config.name,\n status: 'unchanged',\n message: `Collection \"${config.displayName}\" is up to date`\n }\n }\n\n // Update existing collection\n const updateStmt = db.prepare(`\n UPDATE collections\n SET display_name = ?, description = ?, schema = ?, is_active = ?, managed = ?, updated_at = ?\n WHERE name = ?\n `)\n\n await updateStmt.bind(\n config.displayName,\n config.description || null,\n schemaJson,\n isActive,\n managed,\n now,\n config.name\n ).run()\n\n console.log(` ✓ Updated collection: ${config.name}`)\n\n return {\n name: config.name,\n status: 'updated',\n message: `Updated collection \"${config.displayName}\"`\n }\n }\n } catch (error) {\n console.error(` ✗ Error syncing collection ${config.name}:`, error)\n\n return {\n name: config.name,\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n }\n}\n\n/**\n * Check if a collection is managed by config\n */\nexport async function isCollectionManaged(db: D1Database, collectionName: string): Promise {\n try {\n const stmt = db.prepare('SELECT managed FROM collections WHERE name = ?')\n const result = await stmt.bind(collectionName).first() as any\n\n return result?.managed === 1\n } catch (error) {\n console.error(`Error checking if collection is managed:`, error)\n return false\n }\n}\n\n/**\n * Get all managed collections from database\n */\nexport async function getManagedCollections(db: D1Database): Promise {\n try {\n const stmt = db.prepare('SELECT name FROM collections WHERE managed = 1')\n const { results } = await stmt.all()\n\n return (results || []).map((row: any) => row.name)\n } catch (error) {\n console.error('Error getting managed collections:', error)\n return []\n }\n}\n\n/**\n * Remove collections that are no longer in config files\n * (Only removes managed collections that aren't in the config)\n */\nexport async function cleanupRemovedCollections(db: D1Database): Promise {\n try {\n const configs = await loadCollectionConfigs()\n const configNames = new Set(configs.map(c => c.name))\n const managedCollections = await getManagedCollections(db)\n const removed: string[] = []\n\n for (const managedName of managedCollections) {\n if (!configNames.has(managedName)) {\n // This managed collection no longer has a config file\n // Mark as inactive instead of deleting (safer)\n const updateStmt = db.prepare(`\n UPDATE collections\n SET is_active = 0, updated_at = ?\n WHERE name = ? AND managed = 1\n `)\n\n await updateStmt.bind(Date.now(), managedName).run()\n removed.push(managedName)\n console.log(` ⚠️ Deactivated removed collection: ${managedName}`)\n }\n }\n\n return removed\n } catch (error) {\n console.error('Error cleaning up removed collections:', error)\n return []\n }\n}\n\n/**\n * Full sync: sync all configs and cleanup removed\n */\nexport async function fullCollectionSync(db: D1Database): Promise<{\n results: CollectionSyncResult[]\n removed: string[]\n}> {\n const results = await syncCollections(db)\n const removed = await cleanupRemovedCollections(db)\n\n return { results, removed }\n}\n","/**\n * Form-Collection Sync Service\n *\n * Bridge logic that creates \"shadow collections\" for forms and\n * dual-writes form submissions to the content table, enabling\n * unified content management for form submissions.\n */\n\nconst SYSTEM_FORM_USER_ID = 'system-form-submission'\n\n/**\n * Convert Form.io component type to collection schema field type\n */\nfunction mapFormioTypeToSchemaType(component: any): { type: string; [key: string]: any } {\n switch (component.type) {\n case 'textfield':\n case 'textarea':\n case 'password':\n case 'phoneNumber':\n case 'url':\n return { type: 'string', title: component.label || component.key }\n case 'email':\n return { type: 'string', format: 'email', title: component.label || component.key }\n case 'number':\n case 'currency':\n return { type: 'number', title: component.label || component.key }\n case 'checkbox':\n return { type: 'boolean', title: component.label || component.key }\n case 'select':\n case 'radio': {\n const enumValues = (component.data?.values || component.values || []).map((v: any) => v.value)\n const enumLabels = (component.data?.values || component.values || []).map((v: any) => v.label)\n return {\n type: 'select',\n title: component.label || component.key,\n enum: enumValues,\n enumLabels\n }\n }\n case 'selectboxes':\n return { type: 'object', title: component.label || component.key }\n case 'datetime':\n case 'day':\n case 'time':\n return { type: 'string', format: 'date-time', title: component.label || component.key }\n case 'file':\n case 'signature':\n return { type: 'string', title: component.label || component.key }\n case 'address':\n return { type: 'object', title: component.label || component.key }\n case 'hidden':\n return { type: 'string', title: component.label || component.key }\n default:\n return { type: 'string', title: component.label || component.key }\n }\n}\n\n/**\n * Recursively extract field components from a Form.io schema,\n * skipping layout-only components (panels, columns, fieldsets, etc.)\n */\nfunction extractFieldComponents(components: any[]): any[] {\n const fields: any[] = []\n if (!components) return fields\n\n for (const comp of components) {\n // Layout components — recurse into children\n if (comp.type === 'panel' || comp.type === 'fieldset' || comp.type === 'well' || comp.type === 'tabs') {\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n continue\n }\n if (comp.type === 'columns' && comp.columns) {\n for (const col of comp.columns) {\n if (col.components) {\n fields.push(...extractFieldComponents(col.components))\n }\n }\n continue\n }\n if (comp.type === 'table' && comp.rows) {\n for (const row of comp.rows) {\n if (Array.isArray(row)) {\n for (const cell of row) {\n if (cell.components) {\n fields.push(...extractFieldComponents(cell.components))\n }\n }\n }\n }\n continue\n }\n // Skip buttons and non-input layout elements\n if (comp.type === 'button' || comp.type === 'htmlelement' || comp.type === 'content') {\n continue\n }\n // Skip turnstile (not data)\n if (comp.type === 'turnstile') {\n continue\n }\n // It's a real field\n if (comp.key) {\n fields.push(comp)\n }\n // Recurse into sub-components for containers\n if (comp.components) {\n fields.push(...extractFieldComponents(comp.components))\n }\n }\n return fields\n}\n\n/**\n * Convert a Form.io schema into a collection JSON schema definition\n */\nexport function deriveCollectionSchemaFromFormio(formioSchema: any): any {\n const components = formioSchema?.components || []\n const fieldComponents = extractFieldComponents(components)\n\n const properties: Record = {\n // Always include a title field for the content item\n title: { type: 'string', title: 'Title', required: true }\n }\n const required: string[] = ['title']\n\n for (const comp of fieldComponents) {\n const key = comp.key\n if (!key || key === 'submit' || key === 'title') continue\n const fieldDef = mapFormioTypeToSchemaType(comp)\n if (comp.validate?.required) {\n fieldDef.required = true\n required.push(key)\n }\n properties[key] = fieldDef\n }\n\n return { type: 'object', properties, required }\n}\n\n/**\n * Derive a human-readable title from form submission data\n */\nexport function deriveSubmissionTitle(data: Record, formDisplayName: string): string {\n // Try common fields in order of preference\n const candidates = ['name', 'fullName', 'full_name', 'firstName', 'first_name']\n for (const key of candidates) {\n if (data[key] && typeof data[key] === 'string' && data[key].trim()) {\n // Append last name if available\n if (key === 'firstName' || key === 'first_name') {\n const last = data['lastName'] || data['last_name'] || data['lastname'] || ''\n if (last) return `${data[key].trim()} ${last.trim()}`\n }\n return data[key].trim()\n }\n }\n // Try email\n if (data.email && typeof data.email === 'string' && data.email.trim()) {\n return data.email.trim()\n }\n // Try subject\n if (data.subject && typeof data.subject === 'string' && data.subject.trim()) {\n return data.subject.trim()\n }\n // Fallback\n const dateStr = new Date().toLocaleDateString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })\n return `${formDisplayName} - ${dateStr}`\n}\n\n/**\n * Map form submission status to content status.\n * Form submissions are complete data — they default to 'published'.\n * Only rejected/spam submissions get demoted.\n */\nexport function mapFormStatusToContentStatus(formStatus: string): string {\n switch (formStatus) {\n case 'pending': return 'published'\n case 'reviewed': return 'published'\n case 'approved': return 'published'\n case 'rejected': return 'archived'\n case 'spam': return 'deleted'\n default: return 'published'\n }\n}\n\n/**\n * Create or update a shadow collection for a given form\n */\nexport async function syncFormCollection(db: D1Database, form: {\n id: string\n name: string\n display_name: string\n description?: string | null\n formio_schema: any\n is_active: number | boolean\n}): Promise<{ collectionId: string; status: 'created' | 'updated' | 'unchanged' }> {\n const collectionName = `form_${form.name}`\n const displayName = `${form.display_name} (Form)`\n\n // Parse formio_schema\n const formioSchema = typeof form.formio_schema === 'string'\n ? JSON.parse(form.formio_schema)\n : form.formio_schema\n\n const schema = deriveCollectionSchemaFromFormio(formioSchema)\n const schemaJson = JSON.stringify(schema)\n const now = Date.now()\n const isActive = form.is_active ? 1 : 0\n\n // Check if shadow collection already exists\n const existing = await db.prepare(\n 'SELECT id, schema, display_name, description, is_active FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!existing) {\n // Create new shadow collection\n const collectionId = `col-form-${form.name}-${crypto.randomUUID().slice(0, 8)}`\n\n await db.prepare(`\n INSERT INTO collections (id, name, display_name, description, schema, is_active, managed, source_type, source_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, 1, 'form', ?, ?, ?)\n `).bind(\n collectionId,\n collectionName,\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n form.id,\n now,\n now\n ).run()\n\n console.log(`[FormSync] Created shadow collection: ${collectionName}`)\n return { collectionId, status: 'created' }\n }\n\n // Check if update needed\n const existingSchema = existing.schema ? JSON.stringify(typeof existing.schema === 'string' ? JSON.parse(existing.schema) : existing.schema) : '{}'\n const needsUpdate =\n schemaJson !== existingSchema ||\n displayName !== existing.display_name ||\n (form.description || null) !== existing.description ||\n isActive !== existing.is_active\n\n if (!needsUpdate) {\n return { collectionId: existing.id, status: 'unchanged' }\n }\n\n await db.prepare(`\n UPDATE collections SET display_name = ?, description = ?, schema = ?, is_active = ?, updated_at = ?\n WHERE id = ?\n `).bind(\n displayName,\n form.description || null,\n schemaJson,\n isActive,\n now,\n existing.id\n ).run()\n\n console.log(`[FormSync] Updated shadow collection: ${collectionName}`)\n return { collectionId: existing.id, status: 'updated' }\n}\n\n/**\n * Sync all active forms to shadow collections\n */\nexport async function syncAllFormCollections(db: D1Database): Promise {\n try {\n // Check if forms table exists\n const tableCheck = await db.prepare(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='forms'\"\n ).first()\n if (!tableCheck) {\n console.log('[FormSync] Forms table does not exist, skipping form sync')\n return\n }\n\n const { results: forms } = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms'\n ).all()\n\n if (!forms || forms.length === 0) {\n console.log('[FormSync] No forms found, skipping')\n return\n }\n\n let created = 0\n let updated = 0\n\n for (const form of forms) {\n try {\n const result = await syncFormCollection(db, form as any)\n if (result.status === 'created') created++\n if (result.status === 'updated') updated++\n\n // Backfill existing submissions that don't have content_id\n await backfillFormSubmissions(db, form.id as string, result.collectionId)\n } catch (error) {\n console.error(`[FormSync] Error syncing form ${form.name}:`, error)\n }\n }\n\n console.log(`[FormSync] Sync complete: ${created} created, ${updated} updated out of ${forms.length} forms`)\n } catch (error) {\n console.error('[FormSync] Error syncing form collections:', error)\n }\n}\n\n/**\n * Create a content item from a form submission\n */\nexport async function createContentFromSubmission(\n db: D1Database,\n submissionData: Record,\n form: { id: string; name: string; display_name: string },\n submissionId: string,\n metadata: {\n ipAddress?: string | null\n userAgent?: string | null\n userEmail?: string | null\n userId?: string | null\n } = {}\n): Promise {\n try {\n // Find the shadow collection\n let collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n\n if (!collection) {\n // Shadow collection missing — try to create it on the fly\n console.warn(`[FormSync] No shadow collection found for form ${form.name}, attempting to create...`)\n try {\n const fullForm = await db.prepare(\n 'SELECT id, name, display_name, description, formio_schema, is_active FROM forms WHERE id = ?'\n ).bind(form.id).first() as any\n\n if (fullForm) {\n const schema = typeof fullForm.formio_schema === 'string'\n ? JSON.parse(fullForm.formio_schema)\n : fullForm.formio_schema\n const result = await syncFormCollection(db, {\n id: fullForm.id,\n name: fullForm.name,\n display_name: fullForm.display_name,\n description: fullForm.description,\n formio_schema: schema,\n is_active: fullForm.is_active ?? 1\n })\n // Re-query the collection\n collection = await db.prepare(\n 'SELECT id FROM collections WHERE source_type = ? AND source_id = ?'\n ).bind('form', form.id).first() as any\n console.log(`[FormSync] On-the-fly sync result: ${result.status}, collectionId: ${result.collectionId}`)\n }\n } catch (syncErr) {\n console.error('[FormSync] On-the-fly shadow collection creation failed:', syncErr)\n }\n\n if (!collection) {\n console.error(`[FormSync] Still no shadow collection for form ${form.name} after recovery attempt`)\n return null\n }\n }\n\n const contentId = crypto.randomUUID()\n const now = Date.now()\n\n const title = deriveSubmissionTitle(submissionData, form.display_name)\n const slug = `submission-${submissionId.slice(0, 8)}`\n\n // Build content data with embedded metadata\n const contentData: Record = {\n title,\n ...submissionData,\n _submission_metadata: {\n submissionId,\n formId: form.id,\n formName: form.name,\n email: metadata.userEmail || submissionData.email || null,\n ipAddress: metadata.ipAddress || null,\n userAgent: metadata.userAgent || null,\n submittedAt: now\n }\n }\n\n const authorId = metadata.userId || SYSTEM_FORM_USER_ID\n\n // Ensure the system user exists (D1 enforces foreign keys)\n if (authorId === SYSTEM_FORM_USER_ID) {\n const systemUser = await db.prepare('SELECT id FROM users WHERE id = ?').bind(SYSTEM_FORM_USER_ID).first()\n if (!systemUser) {\n console.log('[FormSync] System form user missing, creating...')\n const sysNow = Date.now()\n await db.prepare(`\n INSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 0, ?, ?)\n `).bind(SYSTEM_FORM_USER_ID, 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', sysNow, sysNow).run()\n }\n }\n\n console.log(`[FormSync] Inserting content: id=${contentId}, collection=${collection.id}, slug=${slug}, title=${title}, author=${authorId}`)\n\n await db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, 'published', ?, ?, ?)\n `).bind(\n contentId,\n collection.id,\n slug,\n title,\n JSON.stringify(contentData),\n authorId,\n now,\n now\n ).run()\n\n // Link submission to content\n await db.prepare(\n 'UPDATE form_submissions SET content_id = ? WHERE id = ?'\n ).bind(contentId, submissionId).run()\n\n console.log(`[FormSync] Content created successfully: ${contentId}`)\n return contentId\n } catch (error) {\n console.error('[FormSync] Error creating content from submission:', error)\n return null\n }\n}\n\n/**\n * Backfill existing form submissions that don't have a content_id\n */\nexport async function backfillFormSubmissions(\n db: D1Database,\n formId: string,\n collectionId: string\n): Promise {\n try {\n const { results: submissions } = await db.prepare(\n 'SELECT id, submission_data, user_email, ip_address, user_agent, user_id, submitted_at FROM form_submissions WHERE form_id = ? AND content_id IS NULL'\n ).bind(formId).all()\n\n if (!submissions || submissions.length === 0) {\n return 0\n }\n\n // Get form info\n const form = await db.prepare(\n 'SELECT id, name, display_name FROM forms WHERE id = ?'\n ).bind(formId).first() as any\n\n if (!form) return 0\n\n let count = 0\n for (const sub of submissions) {\n try {\n const submissionData = typeof sub.submission_data === 'string'\n ? JSON.parse(sub.submission_data as string)\n : sub.submission_data\n\n const contentId = await createContentFromSubmission(\n db,\n submissionData,\n { id: form.id, name: form.name, display_name: form.display_name },\n sub.id as string,\n {\n ipAddress: sub.ip_address as string | null,\n userAgent: sub.user_agent as string | null,\n userEmail: sub.user_email as string | null,\n userId: sub.user_id as string | null\n }\n )\n if (contentId) count++\n } catch (error) {\n console.error(`[FormSync] Error backfilling submission ${sub.id}:`, error)\n }\n }\n\n if (count > 0) {\n console.log(`[FormSync] Backfilled ${count} submissions for form ${formId}`)\n }\n return count\n } catch (error) {\n console.error('[FormSync] Error backfilling submissions:', error)\n return 0\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\n// Note: PLUGIN_REGISTRY and CORE_PLUGIN_IDS are project-specific\n// They should be passed as parameters to the service in the consuming application\n// import { PLUGIN_REGISTRY, CORE_PLUGIN_IDS } from '../plugins/plugin-registry'\n\nexport interface PluginData {\n id: string\n name: string\n display_name: string\n description: string\n version: string\n author: string\n category: string\n icon: string\n status: 'active' | 'inactive' | 'error'\n is_core: boolean\n settings?: any\n permissions?: string[]\n dependencies?: string[]\n download_count: number\n rating: number\n installed_at: number\n activated_at?: number\n last_updated: number\n error_message?: string\n}\n\nexport interface PluginStats {\n total: number\n active: number\n inactive: number\n errors: number\n uninstalled: number\n}\n\nexport class PluginService {\n constructor(private db: D1Database) {}\n\n async getAllPlugins(): Promise {\n // Ensure all plugins from registry exist in database (auto-install if missing)\n await this.ensureAllPluginsExist()\n\n const stmt = this.db.prepare(`\n SELECT * FROM plugins\n ORDER BY is_core DESC, display_name ASC\n `)\n\n const { results } = await stmt.all()\n return (results || []).map(this.mapPluginFromDb)\n }\n\n /**\n * Ensure all plugins from the registry exist in the database\n * Auto-installs any newly detected plugins with inactive status\n *\n * Note: This method should be overridden or configured with a plugin registry\n * in the consuming application\n */\n private async ensureAllPluginsExist(): Promise {\n // This functionality requires a project-specific PLUGIN_REGISTRY\n // In the consuming application, you should pass the registry to this service\n console.log('[PluginService] ensureAllPluginsExist - requires PLUGIN_REGISTRY configuration')\n }\n\n async getPlugin(pluginId: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE id = ?')\n const plugin = await stmt.bind(pluginId).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginByName(name: string): Promise {\n const stmt = this.db.prepare('SELECT * FROM plugins WHERE name = ?')\n const plugin = await stmt.bind(name).first()\n \n if (!plugin) return null\n return this.mapPluginFromDb(plugin)\n }\n\n async getPluginStats(): Promise {\n const stmt = this.db.prepare(`\n SELECT \n COUNT(*) as total,\n COUNT(CASE WHEN status = 'active' THEN 1 END) as active,\n COUNT(CASE WHEN status = 'inactive' THEN 1 END) as inactive,\n COUNT(CASE WHEN status = 'error' THEN 1 END) as errors\n FROM plugins\n `)\n \n const stats = await stmt.first() as any\n return {\n total: stats.total || 0,\n active: stats.active || 0,\n inactive: stats.inactive || 0,\n errors: stats.errors || 0,\n uninstalled: 0\n }\n }\n\n async installPlugin(pluginData: Partial): Promise {\n const id = pluginData.id || `plugin-${Date.now()}`\n const now = Math.floor(Date.now() / 1000)\n \n const stmt = this.db.prepare(`\n INSERT INTO plugins (\n id, name, display_name, description, version, author, category, icon,\n status, is_core, settings, permissions, dependencies, download_count, \n rating, installed_at, last_updated\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginData.name || id,\n pluginData.display_name || 'Unnamed Plugin',\n pluginData.description || '',\n pluginData.version || '1.0.0',\n pluginData.author || 'Unknown',\n pluginData.category || 'utilities',\n pluginData.icon || '🔌',\n 'inactive',\n pluginData.is_core || false,\n JSON.stringify(pluginData.settings || {}),\n JSON.stringify(pluginData.permissions || []),\n JSON.stringify(pluginData.dependencies || []),\n pluginData.download_count || 0,\n pluginData.rating || 0,\n now,\n now\n ).run()\n \n // Log the installation\n await this.logActivity(id, 'installed', null, { version: pluginData.version })\n \n const installed = await this.getPlugin(id)\n if (!installed) throw new Error('Failed to install plugin')\n \n return installed\n }\n\n async uninstallPlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n if (plugin.is_core) throw new Error('Cannot uninstall core plugins')\n \n // First deactivate if active\n if (plugin.status === 'active') {\n await this.deactivatePlugin(pluginId)\n }\n \n // Delete the plugin\n const stmt = this.db.prepare('DELETE FROM plugins WHERE id = ?')\n await stmt.bind(pluginId).run()\n \n // Log the uninstallation\n await this.logActivity(pluginId, 'uninstalled', null, { name: plugin.name })\n }\n\n async activatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check dependencies\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n await this.checkDependencies(plugin.dependencies)\n }\n \n const now = Math.floor(Date.now() / 1000)\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'active', activated_at = ?, error_message = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(now, pluginId).run()\n \n // Log the activation\n await this.logActivity(pluginId, 'activated', null)\n }\n\n async deactivatePlugin(pluginId: string): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n // Check if other plugins depend on this one\n await this.checkDependents(plugin.name)\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'inactive', activated_at = NULL \n WHERE id = ?\n `)\n \n await stmt.bind(pluginId).run()\n \n // Log the deactivation\n await this.logActivity(pluginId, 'deactivated', null)\n }\n\n async updatePluginSettings(pluginId: string, settings: any): Promise {\n const plugin = await this.getPlugin(pluginId)\n if (!plugin) throw new Error('Plugin not found')\n \n const stmt = this.db.prepare(`\n UPDATE plugins \n SET settings = ?, updated_at = unixepoch() \n WHERE id = ?\n `)\n \n await stmt.bind(JSON.stringify(settings), pluginId).run()\n \n // Log the settings update\n await this.logActivity(pluginId, 'settings_updated', null)\n }\n\n async setPluginError(pluginId: string, error: string): Promise {\n const stmt = this.db.prepare(`\n UPDATE plugins \n SET status = 'error', error_message = ? \n WHERE id = ?\n `)\n \n await stmt.bind(error, pluginId).run()\n \n // Log the error\n await this.logActivity(pluginId, 'error', null, { error })\n }\n\n async getPluginActivity(pluginId: string, limit: number = 10): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_activity_log \n WHERE plugin_id = ? \n ORDER BY timestamp DESC \n LIMIT ?\n `)\n \n const { results } = await stmt.bind(pluginId, limit).all()\n return (results || []).map((row: any) => ({\n id: row.id,\n action: row.action,\n userId: row.user_id,\n details: row.details ? JSON.parse(row.details) : null,\n timestamp: row.timestamp\n }))\n }\n\n async registerHook(pluginId: string, hookName: string, handlerName: string, priority: number = 10): Promise {\n const id = `hook-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_hooks (id, plugin_id, hook_name, handler_name, priority)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(id, pluginId, hookName, handlerName, priority).run()\n }\n\n async registerRoute(pluginId: string, path: string, method: string, handlerName: string, middleware?: any[]): Promise {\n const id = `route-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_routes (id, plugin_id, path, method, handler_name, middleware)\n VALUES (?, ?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id, \n pluginId, \n path, \n method, \n handlerName, \n JSON.stringify(middleware || [])\n ).run()\n }\n\n async getPluginHooks(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_hooks \n WHERE plugin_id = ? AND is_active = TRUE\n ORDER BY priority ASC\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n async getPluginRoutes(pluginId: string): Promise {\n const stmt = this.db.prepare(`\n SELECT * FROM plugin_routes \n WHERE plugin_id = ? AND is_active = TRUE\n `)\n \n const { results } = await stmt.bind(pluginId).all()\n return results || []\n }\n\n private async checkDependencies(dependencies: string[]): Promise {\n for (const dep of dependencies) {\n const plugin = await this.getPluginByName(dep)\n if (!plugin || plugin.status !== 'active') {\n throw new Error(`Required dependency '${dep}' is not active`)\n }\n }\n }\n\n private async checkDependents(pluginName: string): Promise {\n const stmt = this.db.prepare(`\n SELECT id, display_name FROM plugins \n WHERE status = 'active' \n AND dependencies LIKE ?\n `)\n \n const { results } = await stmt.bind(`%\"${pluginName}\"%`).all()\n if (results && results.length > 0) {\n const names = results.map((p: any) => p.display_name).join(', ')\n throw new Error(`Cannot deactivate. The following plugins depend on this one: ${names}`)\n }\n }\n\n private async logActivity(pluginId: string, action: string, userId: string | null, details?: any): Promise {\n const id = `activity-${Date.now()}`\n const stmt = this.db.prepare(`\n INSERT INTO plugin_activity_log (id, plugin_id, action, user_id, details)\n VALUES (?, ?, ?, ?, ?)\n `)\n \n await stmt.bind(\n id,\n pluginId,\n action,\n userId,\n details ? JSON.stringify(details) : null\n ).run()\n }\n\n private mapPluginFromDb(row: any): PluginData {\n return {\n id: row.id,\n name: row.name,\n display_name: row.display_name,\n description: row.description,\n version: row.version,\n author: row.author,\n category: row.category,\n icon: row.icon,\n status: row.status,\n is_core: row.is_core === 1,\n settings: row.settings ? JSON.parse(row.settings) : undefined,\n permissions: row.permissions ? JSON.parse(row.permissions) : undefined,\n dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,\n download_count: row.download_count || 0,\n rating: row.rating || 0,\n installed_at: row.installed_at,\n activated_at: row.activated_at,\n last_updated: row.last_updated,\n error_message: row.error_message\n }\n }\n}\n","/**\n * Plugin Registry - AUTO-GENERATED\n *\n * Generated by: packages/scripts/generate-plugin-registry.mjs\n * Generated at: 2026-05-01T00:32:37.025Z\n * Source: All manifest.json files in src/plugins/\n *\n * DO NOT EDIT MANUALLY - run the generator script instead.\n * To add a new plugin, create a manifest.json in the plugin directory.\n */\n\nexport interface PluginRegistryEntry {\n id: string\n codeName: string\n displayName: string\n description: string\n version: string\n author: string\n category: string\n iconEmoji: string\n is_core: boolean\n permissions: string[]\n dependencies: string[]\n defaultSettings: Record\n adminMenu: {\n label: string\n icon: string\n path: string\n order: number\n } | null\n}\n\n/**\n * All discovered plugins, keyed by plugin ID.\n */\nexport const PLUGIN_REGISTRY: Record = {\n 'ai-search': {\n \"id\": \"ai-search\",\n \"codeName\": \"ai-search-plugin\",\n \"displayName\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"path\": \"/admin/plugins/ai-search\",\n \"order\": 50\n }\n },\n\n 'code-examples-plugin': {\n \"id\": \"code-examples-plugin\",\n \"codeName\": \"code-examples-plugin\",\n \"displayName\": \"Code Examples\",\n \"description\": \"Code snippets and examples library with syntax highlighting and categorization\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💻\",\n \"is_core\": false,\n \"permissions\": [\n \"code-examples:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'core-analytics': {\n \"id\": \"core-analytics\",\n \"codeName\": \"core-analytics\",\n \"displayName\": \"Analytics & Insights\",\n \"description\": \"Core analytics system for tracking page views, user behavior, and content performance. Provides dashboards and reports with real-time metrics\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"seo\",\n \"iconEmoji\": \"📊\",\n \"is_core\": true,\n \"permissions\": [\n \"analytics:view\",\n \"analytics:export\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Analytics\",\n \"icon\": \"chart-bar\",\n \"path\": \"/admin/analytics\",\n \"order\": 50\n }\n },\n\n 'core-auth': {\n \"id\": \"core-auth\",\n \"codeName\": \"core-auth\",\n \"displayName\": \"Authentication System\",\n \"description\": \"Core authentication and user management system with role-based access control, session management, and security features\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔐\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:users\",\n \"manage:roles\",\n \"manage:permissions\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"requiredFields\": {\n \"email\": {\n \"required\": true,\n \"minLength\": 5,\n \"label\": \"Email\",\n \"type\": \"email\"\n },\n \"password\": {\n \"required\": true,\n \"minLength\": 8,\n \"label\": \"Password\",\n \"type\": \"password\"\n },\n \"username\": {\n \"required\": true,\n \"minLength\": 3,\n \"label\": \"Username\",\n \"type\": \"text\"\n },\n \"firstName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"First Name\",\n \"type\": \"text\"\n },\n \"lastName\": {\n \"required\": true,\n \"minLength\": 1,\n \"label\": \"Last Name\",\n \"type\": \"text\"\n }\n },\n \"validation\": {\n \"emailFormat\": true,\n \"allowDuplicateUsernames\": false,\n \"passwordRequirements\": {\n \"requireUppercase\": false,\n \"requireLowercase\": false,\n \"requireNumbers\": false,\n \"requireSpecialChars\": false\n }\n },\n \"registration\": {\n \"enabled\": true,\n \"requireEmailVerification\": false,\n \"defaultRole\": \"viewer\"\n }\n },\n \"adminMenu\": null\n },\n\n 'core-cache': {\n \"id\": \"core-cache\",\n \"codeName\": \"core-cache\",\n \"displayName\": \"Cache System\",\n \"description\": \"Three-tiered caching system with in-memory and KV storage. Provides automatic caching for content, users, media, and API responses with configurable TTL and invalidation patterns.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"system\",\n \"iconEmoji\": \"⚡\",\n \"is_core\": true,\n \"permissions\": [\n \"cache.view\",\n \"cache.clear\",\n \"cache.invalidate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableMemoryCache\": true,\n \"enableKVCache\": true,\n \"enableDatabaseCache\": true,\n \"defaultTTL\": 3600\n },\n \"adminMenu\": null\n },\n\n 'core-media': {\n \"id\": \"core-media\",\n \"codeName\": \"core-media\",\n \"displayName\": \"Media Manager\",\n \"description\": \"Core media upload and management system with support for images, videos, and documents. Includes automatic optimization, thumbnail generation, and cloud storage integration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"media\",\n \"iconEmoji\": \"📸\",\n \"is_core\": true,\n \"permissions\": [\n \"manage:media\",\n \"upload:files\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Media\",\n \"icon\": \"image\",\n \"path\": \"/admin/media\",\n \"order\": 30\n }\n },\n\n 'database-tools': {\n \"id\": \"database-tools\",\n \"codeName\": \"database-tools\",\n \"displayName\": \"Database Tools\",\n \"description\": \"Database management and administration tools including migrations, backups, and query execution\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🗄️\",\n \"is_core\": false,\n \"permissions\": [\n \"database:admin\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableTruncate\": true,\n \"enableBackup\": true,\n \"enableValidation\": true,\n \"requireConfirmation\": true\n },\n \"adminMenu\": null\n },\n\n 'demo-login-plugin': {\n \"id\": \"demo-login-plugin\",\n \"codeName\": \"demo-login-plugin\",\n \"displayName\": \"Demo Login\",\n \"description\": \"Quick demo login functionality for testing and demonstrations\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎯\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"core-auth\"\n ],\n \"defaultSettings\": {\n \"enableNotice\": true,\n \"demoEmail\": \"admin@sonicjs.com\",\n \"demoPassword\": \"sonicjs!\"\n },\n \"adminMenu\": null\n },\n\n 'design': {\n \"id\": \"design\",\n \"codeName\": \"design\",\n \"displayName\": \"Design System\",\n \"description\": \"Design system management including themes, components, and UI customization. Provides a visual interface for managing design tokens, typography, colors, and component library.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"🎨\",\n \"is_core\": false,\n \"permissions\": [\n \"design.view\",\n \"design.edit\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultTheme\": \"light\",\n \"customCSS\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Design\",\n \"icon\": \"palette\",\n \"path\": \"/admin/design\",\n \"order\": 80\n }\n },\n\n 'easy-mdx': {\n \"id\": \"easy-mdx\",\n \"codeName\": \"easy-mdx\",\n \"displayName\": \"EasyMDE Markdown Editor\",\n \"description\": \"Lightweight markdown editor with live preview. Provides a simple and efficient editor with markdown support for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"defaultHeight\": 400,\n \"theme\": \"dark\",\n \"toolbar\": \"full\",\n \"placeholder\": \"Start writing your content...\"\n },\n \"adminMenu\": null\n },\n\n 'email': {\n \"id\": \"email\",\n \"codeName\": \"email\",\n \"displayName\": \"Email\",\n \"description\": \"Send transactional emails using Resend\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"📧\",\n \"is_core\": false,\n \"permissions\": [\n \"email:manage\",\n \"email:send\",\n \"email:view-logs\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"\",\n \"fromEmail\": \"\",\n \"fromName\": \"\",\n \"replyTo\": \"\",\n \"logoUrl\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"Email\",\n \"icon\": \"envelope\",\n \"path\": \"/admin/plugins/email/settings\",\n \"order\": 80\n }\n },\n\n 'global-variables': {\n \"id\": \"global-variables\",\n \"codeName\": \"global-variables\",\n \"displayName\": \"Global Variables\",\n \"description\": \"Dynamic content variables with inline token support. Manage key-value variables via admin UI and use {variable_key} syntax in rich text fields for server-side resolution. Includes full CRUD admin page.\",\n \"version\": \"1.1.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔤\",\n \"is_core\": false,\n \"permissions\": [\n \"global-variables:manage\",\n \"global-variables:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableResolution\": true,\n \"cacheEnabled\": true,\n \"cacheTTL\": 300\n },\n \"adminMenu\": {\n \"label\": \"Global Variables\",\n \"icon\": \"variable\",\n \"path\": \"/admin/global-variables\",\n \"order\": 45\n }\n },\n\n 'hello-world': {\n \"id\": \"hello-world\",\n \"codeName\": \"hello-world\",\n \"displayName\": \"Hello World\",\n \"description\": \"A simple Hello World plugin demonstration\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"👋\",\n \"is_core\": false,\n \"permissions\": [\n \"hello-world:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Hello World\",\n \"icon\": \"hand-raised\",\n \"path\": \"/admin/hello-world\",\n \"order\": 90\n }\n },\n\n 'magic-link-auth': {\n \"id\": \"magic-link-auth\",\n \"codeName\": \"magic-link-auth\",\n \"displayName\": \"Magic Link Authentication\",\n \"description\": \"Passwordless authentication via email magic links. Users receive a secure one-time link to sign in without entering a password.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔗\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"linkExpiryMinutes\": 15,\n \"rateLimitPerHour\": 5,\n \"allowNewUsers\": true\n },\n \"adminMenu\": null\n },\n\n 'oauth-providers': {\n \"id\": \"oauth-providers\",\n \"codeName\": \"oauth-providers\",\n \"displayName\": \"OAuth Providers\",\n \"description\": \"OAuth2/OIDC social login with GitHub, Google, and more\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"authentication\",\n \"iconEmoji\": \"🔑\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"providers\": {\n \"github\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n },\n \"google\": {\n \"clientId\": \"\",\n \"clientSecret\": \"\",\n \"enabled\": false\n }\n }\n },\n \"adminMenu\": null\n },\n\n 'otp-login': {\n \"id\": \"otp-login\",\n \"codeName\": \"otp-login\",\n \"displayName\": \"OTP Login\",\n \"description\": \"Passwordless authentication via email one-time codes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🔢\",\n \"is_core\": false,\n \"permissions\": [\n \"otp:manage\",\n \"otp:request\",\n \"otp:verify\"\n ],\n \"dependencies\": [\n \"email\"\n ],\n \"defaultSettings\": {\n \"codeLength\": 6,\n \"codeExpiryMinutes\": 10,\n \"maxAttempts\": 3,\n \"rateLimitPerHour\": 5,\n \"allowNewUserRegistration\": false,\n \"logoUrl\": \"\",\n \"logoWidth\": 150,\n \"logoBorderWidth\": 0,\n \"logoBorderColor\": \"#ffffff\",\n \"loginUrl\": \"\",\n \"loginButtonText\": \"\"\n },\n \"adminMenu\": {\n \"label\": \"OTP Login\",\n \"icon\": \"key\",\n \"path\": \"/admin/plugins/otp-login/settings\",\n \"order\": 85\n }\n },\n\n 'quill-editor': {\n \"id\": \"quill-editor\",\n \"codeName\": \"quill-editor\",\n \"displayName\": \"Quill Rich Text Editor\",\n \"description\": \"Quill WYSIWYG editor integration for rich text editing. Lightweight, modern editor with customizable toolbars and dark mode support.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"✍️\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"version\": \"2.0.2\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"theme\": \"snow\"\n },\n \"adminMenu\": null\n },\n\n 'redirect-management': {\n \"id\": \"redirect-management\",\n \"codeName\": \"redirect-management\",\n \"displayName\": \"Redirect Management\",\n \"description\": \"URL redirect management with exact, partial, and regex matching\",\n \"version\": \"1.0.0\",\n \"author\": \"ahaas\",\n \"category\": \"utilities\",\n \"iconEmoji\": \"↪️\",\n \"is_core\": false,\n \"permissions\": [\n \"redirect.manage\",\n \"redirect.view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enabled\": true,\n \"autoOffloadEnabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Redirects\",\n \"icon\": \"arrow-right\",\n \"path\": \"/admin/redirects\",\n \"order\": 85\n }\n },\n\n 'security-audit': {\n \"id\": \"security-audit\",\n \"codeName\": \"security-audit\",\n \"displayName\": \"Security Audit\",\n \"description\": \"Security event logging, brute-force detection, and analytics dashboard. Monitors login attempts, registrations, lockouts, and suspicious activity.\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": false,\n \"permissions\": [\n \"security-audit:view\",\n \"security-audit:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"retention\": {\n \"daysToKeep\": 90,\n \"maxEvents\": 100000,\n \"autoPurge\": true\n },\n \"bruteForce\": {\n \"enabled\": true,\n \"maxFailedAttemptsPerIP\": 10,\n \"maxFailedAttemptsPerEmail\": 5,\n \"windowMinutes\": 15,\n \"lockoutDurationMinutes\": 30,\n \"alertThreshold\": 20\n },\n \"logging\": {\n \"logSuccessfulLogins\": true,\n \"logLogouts\": true,\n \"logRegistrations\": true,\n \"logPasswordResets\": true,\n \"logPermissionDenied\": true\n }\n },\n \"adminMenu\": {\n \"label\": \"Security Audit\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/security-audit\",\n \"order\": 85\n }\n },\n\n 'seed-data': {\n \"id\": \"seed-data\",\n \"codeName\": \"seed-data\",\n \"displayName\": \"Seed Data Generator\",\n \"description\": \"Development tool for generating sample data and testing content. Useful for demos and development environments\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"development\",\n \"iconEmoji\": \"🌱\",\n \"is_core\": false,\n \"permissions\": [\n \"seed-data:generate\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"userCount\": 20,\n \"contentCount\": 200,\n \"defaultPassword\": \"password123\"\n },\n \"adminMenu\": null\n },\n\n 'shortcodes': {\n \"id\": \"shortcodes\",\n \"codeName\": \"shortcodes\",\n \"displayName\": \"Shortcodes\",\n \"description\": \"Registered shortcode functions for dynamic content. Use [[shortcode_name param=\\\"value\\\"]] syntax in rich text fields for server-side resolution. Includes handler registry, CRUD admin, and live preview.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Community\",\n \"category\": \"content\",\n \"iconEmoji\": \"\",\n \"is_core\": false,\n \"permissions\": [\n \"shortcodes:manage\",\n \"shortcodes:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": {\n \"label\": \"Shortcodes\",\n \"icon\": \"bolt\",\n \"path\": \"/admin/shortcodes\",\n \"order\": 46\n }\n },\n\n 'stripe': {\n \"id\": \"stripe\",\n \"codeName\": \"stripe\",\n \"displayName\": \"Stripe Subscriptions\",\n \"description\": \"Stripe subscription management with webhook handling, checkout sessions, and subscription gating\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"payments\",\n \"iconEmoji\": \"💳\",\n \"is_core\": true,\n \"permissions\": [\n \"stripe:manage\",\n \"stripe:view\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"stripeSecretKey\": \"\",\n \"stripeWebhookSecret\": \"\",\n \"stripePriceId\": \"\",\n \"successUrl\": \"/admin/dashboard\",\n \"cancelUrl\": \"/admin/dashboard\"\n },\n \"adminMenu\": {\n \"label\": \"Stripe\",\n \"icon\": \"credit-card\",\n \"path\": \"/admin/plugins/stripe\",\n \"order\": 90\n }\n },\n\n 'testimonials-plugin': {\n \"id\": \"testimonials-plugin\",\n \"codeName\": \"testimonials-plugin\",\n \"displayName\": \"Testimonials\",\n \"description\": \"Customer testimonials and reviews management with display widgets and ratings\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"💬\",\n \"is_core\": false,\n \"permissions\": [\n \"testimonials:manage\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'tinymce-plugin': {\n \"id\": \"tinymce-plugin\",\n \"codeName\": \"tinymce-plugin\",\n \"displayName\": \"TinyMCE Rich Text Editor\",\n \"description\": \"Powerful WYSIWYG rich text editor for content creation. Provides a full-featured editor with formatting, media embedding, and customizable toolbars for richtext fields.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS Team\",\n \"category\": \"editor\",\n \"iconEmoji\": \"📝\",\n \"is_core\": false,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"apiKey\": \"no-api-key\",\n \"defaultHeight\": 300,\n \"defaultToolbar\": \"full\",\n \"skin\": \"oxide-dark\"\n },\n \"adminMenu\": null\n },\n\n 'turnstile': {\n \"id\": \"turnstile\",\n \"codeName\": \"turnstile-plugin\",\n \"displayName\": \"Cloudflare Turnstile\",\n \"description\": \"CAPTCHA-free bot protection using Cloudflare Turnstile. Provides reusable verification for any form.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"security\",\n \"iconEmoji\": \"🛡️\",\n \"is_core\": true,\n \"permissions\": [\n \"settings:write\",\n \"admin:access\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"siteKey\": \"\",\n \"secretKey\": \"\",\n \"theme\": \"auto\",\n \"size\": \"normal\",\n \"mode\": \"managed\",\n \"appearance\": \"always\",\n \"preClearanceEnabled\": false,\n \"preClearanceLevel\": \"managed\",\n \"enabled\": false\n },\n \"adminMenu\": {\n \"label\": \"Turnstile\",\n \"icon\": \"shield-check\",\n \"path\": \"/admin/plugins/turnstile/settings\",\n \"order\": 100\n }\n },\n\n 'user-profiles': {\n \"id\": \"user-profiles\",\n \"codeName\": \"user-profiles\",\n \"displayName\": \"User Profiles\",\n \"description\": \"Configurable custom profile fields for users\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"users\",\n \"iconEmoji\": \"👤\",\n \"is_core\": true,\n \"permissions\": [],\n \"dependencies\": [],\n \"defaultSettings\": {},\n \"adminMenu\": null\n },\n\n 'workflow-plugin': {\n \"id\": \"workflow-plugin\",\n \"codeName\": \"workflow-plugin\",\n \"displayName\": \"Workflow Engine\",\n \"description\": \"Content workflow and approval system with customizable states, transitions, and review processes\",\n \"version\": \"1.0.0-beta.1\",\n \"author\": \"SonicJS Team\",\n \"category\": \"content\",\n \"iconEmoji\": \"🔄\",\n \"is_core\": false,\n \"permissions\": [\n \"workflow:manage\",\n \"workflow:approve\"\n ],\n \"dependencies\": [],\n \"defaultSettings\": {\n \"enableApprovalChains\": true,\n \"enableScheduling\": true,\n \"enableAutomation\": true,\n \"enableNotifications\": true\n },\n \"adminMenu\": null\n }\n} as const\n\n/**\n * All plugin IDs.\n */\nexport const ALL_PLUGIN_IDS = Object.keys(PLUGIN_REGISTRY)\n\n/**\n * Plugins that have their own admin page (have an adminMenu entry).\n */\nexport const PLUGINS_WITH_ADMIN_PAGES = ALL_PLUGIN_IDS.filter(\n id => PLUGIN_REGISTRY[id]?.adminMenu !== null\n)\n\n/**\n * Look up a plugin by its codeName (the `name` field stored in the DB).\n * Falls back to id lookup if no codeName match.\n */\nexport function findPluginByCodeName(codeName: string): PluginRegistryEntry | undefined {\n return Object.values(PLUGIN_REGISTRY).find(p => p.codeName === codeName)\n || PLUGIN_REGISTRY[codeName]\n}\n\n/**\n * Get a plugin by ID.\n */\nexport function getPlugin(id: string): PluginRegistryEntry | undefined {\n return PLUGIN_REGISTRY[id]\n}\n","import type { D1Database } from \"@cloudflare/workers-types\";\nimport { PluginService } from \"./plugin-service\";\nimport { PLUGIN_REGISTRY } from \"../plugins/manifest-registry\";\nimport type { PluginRegistryEntry } from \"../plugins/manifest-registry\";\n\nexport interface CorePlugin {\n id: string;\n name: string;\n display_name: string;\n description: string;\n version: string;\n author: string;\n category: string;\n icon: string;\n permissions: string[];\n dependencies: string[];\n settings?: any;\n}\n\n/**\n * Build the CORE_PLUGINS list from the auto-generated registry.\n * To add a new bootstrapped plugin, create a manifest.json and\n * run: node packages/scripts/generate-plugin-registry.mjs\n *\n * Only plugins that are in the BOOTSTRAP_PLUGIN_IDS list will be\n * auto-installed on first boot. Edit this list to control which\n * plugins are bootstrapped.\n */\nconst BOOTSTRAP_PLUGIN_IDS = [\n \"core-auth\",\n \"core-media\",\n \"database-tools\",\n \"seed-data\",\n \"core-cache\",\n \"workflow-plugin\",\n \"easy-mdx\",\n \"ai-search\",\n \"oauth-providers\",\n \"global-variables\",\n \"user-profiles\",\n \"stripe\",\n];\n\nfunction registryToCorePlugin(entry: PluginRegistryEntry): CorePlugin {\n return {\n id: entry.id,\n name: entry.codeName,\n display_name: entry.displayName,\n description: entry.description,\n version: entry.version,\n author: entry.author,\n category: entry.category,\n icon: entry.iconEmoji,\n permissions: entry.permissions,\n dependencies: entry.dependencies,\n settings: entry.defaultSettings,\n };\n}\n\nexport class PluginBootstrapService {\n private pluginService: PluginService;\n\n constructor(private db: D1Database) {\n this.pluginService = new PluginService(db);\n }\n\n /**\n * Core plugins derived from the auto-generated plugin registry.\n * Only plugins listed in BOOTSTRAP_PLUGIN_IDS are included.\n */\n private readonly CORE_PLUGINS: CorePlugin[] = BOOTSTRAP_PLUGIN_IDS\n .filter((id) => PLUGIN_REGISTRY[id] !== undefined)\n .map((id) => registryToCorePlugin(PLUGIN_REGISTRY[id]!));\n\n /**\n * Bootstrap all core plugins - install them if they don't exist\n */\n async bootstrapCorePlugins(): Promise {\n console.log(\"[PluginBootstrap] Starting core plugin bootstrap process...\");\n\n try {\n // Check each core plugin\n for (const corePlugin of this.CORE_PLUGINS) {\n await this.ensurePluginInstalled(corePlugin);\n }\n\n console.log(\n \"[PluginBootstrap] Core plugin bootstrap completed successfully\"\n );\n } catch (error) {\n console.error(\"[PluginBootstrap] Error during plugin bootstrap:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure a specific plugin is installed\n */\n private async ensurePluginInstalled(plugin: CorePlugin): Promise {\n try {\n // Check if plugin already exists\n const existingPlugin = await this.pluginService.getPlugin(plugin.id);\n\n if (existingPlugin) {\n console.log(\n `[PluginBootstrap] Plugin already installed: ${plugin.display_name} (status: ${existingPlugin.status})`\n );\n\n // Update plugin if version changed\n if (existingPlugin.version !== plugin.version) {\n console.log(\n `[PluginBootstrap] Updating plugin version: ${plugin.display_name} from ${existingPlugin.version} to ${plugin.version}`\n );\n await this.updatePlugin(plugin);\n }\n\n // ALWAYS ensure core-auth is active (critical for system functionality)\n if (plugin.id === 'core-auth' && existingPlugin.status !== 'active') {\n console.log(\n `[PluginBootstrap] Core-auth plugin is inactive, activating it now...`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n\n // Only auto-activate on first install, respect user's activation state on subsequent boots\n } else {\n // Install the plugin\n console.log(\n `[PluginBootstrap] Installing plugin: ${plugin.display_name}`\n );\n await this.pluginService.installPlugin({\n ...plugin,\n is_core: plugin.name.startsWith(\"core-\"),\n });\n\n // Activate plugins immediately after installation\n console.log(\n `[PluginBootstrap] Activating newly installed plugin: ${plugin.display_name}`\n );\n await this.pluginService.activatePlugin(plugin.id);\n }\n } catch (error) {\n console.error(\n `[PluginBootstrap] Error ensuring plugin ${plugin.display_name}:`,\n error\n );\n // Don't throw - continue with other plugins\n }\n }\n\n /**\n * Update an existing plugin\n */\n private async updatePlugin(plugin: CorePlugin): Promise {\n const now = Math.floor(Date.now() / 1000);\n\n const stmt = this.db.prepare(`\n UPDATE plugins\n SET\n version = ?,\n description = ?,\n permissions = ?,\n settings = ?,\n last_updated = ?\n WHERE id = ?\n `);\n\n await stmt\n .bind(\n plugin.version,\n plugin.description,\n JSON.stringify(plugin.permissions),\n JSON.stringify(plugin.settings || {}),\n now,\n plugin.id\n )\n .run();\n }\n\n /**\n * Check if bootstrap is needed (first run detection)\n */\n async isBootstrapNeeded(): Promise {\n try {\n // Check if any core plugins are missing\n for (const corePlugin of this.CORE_PLUGINS.filter((p) =>\n p.name.startsWith(\"core-\")\n )) {\n const exists = await this.pluginService.getPlugin(corePlugin.id);\n if (!exists) {\n return true;\n }\n }\n return false;\n } catch (error) {\n // If there's an error (like table doesn't exist), we need bootstrap\n console.error(\n \"[PluginBootstrap] Error checking bootstrap status:\",\n error\n );\n return true;\n }\n }\n\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-TAOOLOUH.cjs.map b/packages/core/dist/chunk-TAOOLOUH.cjs.map deleted file mode 100644 index 9edd1dfbd..000000000 --- a/packages/core/dist/chunk-TAOOLOUH.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/middleware/bootstrap.ts","../src/middleware/auth.ts","../src/middleware/metrics.ts","../src/middleware/csrf.ts","../src/middleware/rate-limit.ts","../src/middleware/security-headers.ts","../src/middleware/index.ts"],"names":["MigrationService","syncCollections","syncAllFormCollections","PluginBootstrapService","sign","verify","getCookie","result","setCookie","metricsTracker","JWT_SECRET_FALLBACK"],"mappings":"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","file":"chunk-TAOOLOUH.cjs","sourcesContent":["import { Context, Next } from \"hono\";\nimport { syncCollections } from \"../services/collection-sync\";\nimport { syncAllFormCollections } from \"../services/form-collection-sync\";\nimport { MigrationService } from \"../services/migrations\";\nimport { PluginBootstrapService } from \"../services/plugin-bootstrap\";\nimport type { SonicJSConfig } from \"../app\";\n\ntype Bindings = {\n DB: D1Database;\n KV: KVNamespace;\n JWT_SECRET?: string;\n CORS_ORIGINS?: string;\n ENVIRONMENT?: string;\n};\n\n// Track if bootstrap has been run in this worker instance\nlet bootstrapComplete = false;\n\n/**\n * Verify security-critical environment configuration at startup.\n * Logs warnings in development, throws in production to prevent\n * insecure deployments from silently running.\n */\nexport function verifySecurityConfig(env: Bindings): void {\n const warnings: string[] = [];\n\n // Check JWT secret\n if (!env.JWT_SECRET) {\n warnings.push(\n \"JWT_SECRET is not set — using hardcoded fallback. Set via `wrangler secret put JWT_SECRET`\"\n );\n } else if (env.JWT_SECRET.includes(\"change-in-production\")) {\n warnings.push(\n \"JWT_SECRET contains the default value — tokens are forgeable. Generate a strong random secret\"\n );\n }\n\n // Check CORS origins\n if (!env.CORS_ORIGINS) {\n warnings.push(\n \"CORS_ORIGINS is not set — all cross-origin API requests will be rejected\"\n );\n }\n\n // Check environment designation\n if (!env.ENVIRONMENT) {\n warnings.push(\n \"ENVIRONMENT is not set — HSTS header will not be applied. Set to \\\"production\\\" or \\\"development\\\"\"\n );\n }\n\n if (warnings.length === 0) {\n return;\n }\n\n const isProduction = env.ENVIRONMENT === \"production\";\n\n for (const warning of warnings) {\n console.warn(`[SonicJS Security] ${warning}`);\n }\n\n if (isProduction) {\n // In production, a missing or default JWT_SECRET is a hard failure —\n // every token issued would be forgeable by anyone reading the source code.\n const hasCritical =\n !env.JWT_SECRET || env.JWT_SECRET.includes(\"change-in-production\");\n if (hasCritical) {\n throw new Error(\n \"[SonicJS Security] CRITICAL: Production deployment is missing a secure JWT_SECRET. \" +\n \"Set it via `wrangler secret put JWT_SECRET` before deploying.\"\n );\n }\n }\n}\n\n/**\n * Bootstrap middleware that ensures system initialization\n * Runs once per worker instance\n */\nexport function bootstrapMiddleware(config: SonicJSConfig = {}) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n // Skip if already bootstrapped in this worker instance\n if (bootstrapComplete) {\n return next();\n }\n\n // Skip bootstrap for static assets and health checks\n const path = c.req.path;\n if (\n path.startsWith(\"/images/\") ||\n path.startsWith(\"/assets/\") ||\n path === \"/health\" ||\n path.endsWith(\".js\") ||\n path.endsWith(\".css\") ||\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".ico\")\n ) {\n return next();\n }\n\n try {\n console.log(\"[Bootstrap] Starting system initialization...\");\n\n // 1. Run database migrations first\n console.log(\"[Bootstrap] Running database migrations...\");\n const migrationService = new MigrationService(c.env.DB);\n await migrationService.runPendingMigrations();\n\n // 2. Sync collection configurations\n console.log(\"[Bootstrap] Syncing collection configurations...\");\n try {\n await syncCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing collections:\", error);\n // Continue bootstrap even if collection sync fails\n }\n\n // 2b. Sync form-derived shadow collections\n console.log(\"[Bootstrap] Syncing form collections...\");\n try {\n await syncAllFormCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing form collections:\", error);\n }\n\n // 3. Bootstrap core plugins (unless disableAll is set)\n if (!config.plugins?.disableAll) {\n console.log(\"[Bootstrap] Bootstrapping core plugins...\");\n const bootstrapService = new PluginBootstrapService(c.env.DB);\n\n // Check if bootstrap is needed\n const needsBootstrap = await bootstrapService.isBootstrapNeeded();\n if (needsBootstrap) {\n await bootstrapService.bootstrapCorePlugins();\n }\n } else {\n console.log(\"[Bootstrap] Plugin bootstrap skipped (disableAll is true)\");\n }\n\n // Mark bootstrap as complete for this worker instance\n bootstrapComplete = true;\n console.log(\"[Bootstrap] System initialization completed\");\n } catch (error) {\n console.error(\"[Bootstrap] Error during system initialization:\", error);\n // Don't prevent the app from starting, but log the error\n }\n\n // 4. Verify security configuration (outside try/catch so critical\n // errors in production propagate and prevent insecure deployments)\n verifySecurityConfig(c.env as Bindings);\n\n return next();\n };\n}\n\n/**\n * Reset bootstrap flag (useful for testing)\n */\nexport function resetBootstrap() {\n bootstrapComplete = false;\n}\n","import { sign, verify } from 'hono/jwt'\nimport { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\ntype JWTPayload = {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n}\n\n// Fallback JWT secret for local development only (no wrangler secret set)\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// Default JWT TTL: 30 days. Can be overridden via JWT_EXPIRES_IN env var.\nconst DEFAULT_JWT_EXPIRES_IN_SECONDS = 60 * 60 * 24 * 30\n\n/**\n * Parse a TTL string like \"30d\", \"12h\", \"3600s\", or a bare number-of-seconds\n * into a seconds value. Returns null if the input is missing/unparseable.\n */\nfunction parseDuration(input: string | number | undefined | null): number | null {\n if (input === undefined || input === null || input === '') return null\n if (typeof input === 'number' && Number.isFinite(input) && input > 0) {\n return Math.floor(input)\n }\n const raw = String(input).trim()\n if (/^\\d+$/.test(raw)) {\n const n = parseInt(raw, 10)\n return n > 0 ? n : null\n }\n const match = raw.match(/^(\\d+)\\s*(s|sec|secs|seconds|m|min|mins|minutes|h|hr|hrs|hours|d|day|days)$/i)\n if (!match) return null\n const value = parseInt(match[1]!, 10)\n const unit = match[2]!.toLowerCase()\n if (unit.startsWith('s')) return value\n if (unit.startsWith('m')) return value * 60\n if (unit.startsWith('h')) return value * 60 * 60\n if (unit.startsWith('d')) return value * 60 * 60 * 24\n return null\n}\n\n/**\n * Resolve the JWT expiry in seconds from the environment.\n * Honors `JWT_EXPIRES_IN` (seconds or \"30d\"/\"12h\"/\"3600s\") with a 30-day default.\n */\nexport function getJwtExpirySeconds(env?: Record | null): number {\n const configured = parseDuration(env?.JWT_EXPIRES_IN)\n return configured ?? DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the JWT expiry in seconds. Precedence: `JWT_EXPIRES_IN` env var\n * (authoritative ceiling) → `settings.security.jwtExpiresIn` DB value\n * (admin-configurable) → 30-day default.\n *\n * The env var wins so operators can cap runtime overrides — admins can adjust\n * the TTL from /admin/settings/security, but an env var, if set, always wins.\n * DB failures fall back to env/default so auth never breaks if the settings\n * table is unreachable.\n */\nexport async function getJwtExpirySecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const envParsed = parseDuration(env?.JWT_EXPIRES_IN)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtExpiresIn'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* value may already be a bare string */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtExpiresIn from settings, falling back to default:', err)\n }\n }\n return DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the refresh grace window (seconds) for `/auth/refresh`. Precedence:\n * `JWT_REFRESH_GRACE_SECONDS` env var → `settings.security.jwtRefreshGraceSeconds`\n * DB value → 7-day default.\n */\nexport async function getJwtRefreshGraceSecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const DEFAULT_GRACE = 60 * 60 * 24 * 7\n const envParsed = parseDuration(env?.JWT_REFRESH_GRACE_SECONDS)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtRefreshGraceSeconds'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* may be bare */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtRefreshGraceSeconds from settings:', err)\n }\n }\n return DEFAULT_GRACE\n}\n\n/**\n * Decode a JWT payload without verifying the signature. Returns null on any\n * parsing failure. Callers MUST independently verify the signature before\n * trusting this value — used from the grace-window refresh path where the\n * signature is verified explicitly via `verifyHs256Signature`.\n */\nfunction decodeJwtPayload(token: string): JWTPayload | null {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return null\n const b64 = parts[1]!.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const json = atob(padded)\n const obj = JSON.parse(json)\n if (!obj || typeof obj.exp !== 'number') return null\n return obj as JWTPayload\n } catch {\n return null\n }\n}\n\nfunction base64UrlToBytes(b64url: string): Uint8Array {\n const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const bin = atob(padded)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return bytes\n}\n\n/**\n * Verify a JWT's HS256 signature using Web Crypto, independent of hono/jwt.\n * Returns true iff the signature matches the header.payload portion.\n */\nasync function verifyHs256Signature(token: string, secret: string): Promise {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return false\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n )\n const signature = base64UrlToBytes(parts[2]!)\n const message = encoder.encode(`${parts[0]}.${parts[1]}`)\n return await crypto.subtle.verify('HMAC', key, signature, message)\n } catch {\n return false\n }\n}\n\nexport class AuthManager {\n static async generateToken(\n userId: string,\n email: string,\n role: string,\n secret?: string,\n expiresInSeconds?: number\n ): Promise {\n const ttl = expiresInSeconds && expiresInSeconds > 0\n ? Math.floor(expiresInSeconds)\n : DEFAULT_JWT_EXPIRES_IN_SECONDS\n const now = Math.floor(Date.now() / 1000)\n const payload: JWTPayload = {\n userId,\n email,\n role,\n exp: now + ttl,\n iat: now\n }\n\n return await sign(payload, secret || JWT_SECRET_FALLBACK, 'HS256')\n }\n\n /**\n * Verify a token's signature and expiration.\n *\n * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the\n * `secret` argument. If omitted, this falls back to a development-only\n * placeholder secret — tokens signed with the real `JWT_SECRET` will then\n * silently fail verification. From inside a Hono handler prefer\n * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction\n * and pulls the secret from `c.env` for you.\n *\n * If `graceSeconds` > 0, tokens whose `exp` is within the grace window\n * (i.e. expired by no more than `graceSeconds`) are still returned. This\n * supports a sliding-session refresh endpoint that accepts recently-expired\n * tokens. Signature failures always return null.\n */\n static async verifyToken(\n token: string,\n secret?: string,\n graceSeconds: number = 0\n ): Promise {\n const effectiveSecret = secret || JWT_SECRET_FALLBACK\n try {\n let payload: JWTPayload | null = null\n try {\n payload = await verify(token, effectiveSecret, 'HS256') as JWTPayload\n } catch (verifyError: any) {\n // hono/jwt checks `exp` before signature, so a bad-signature token\n // that happens to be expired will throw JwtTokenExpired here. For\n // the grace window, we still require a valid HS256 signature before\n // accepting the payload.\n const name = verifyError?.name || ''\n const message = String(verifyError?.message || '')\n const isExpired = name === 'JwtTokenExpired' || message.includes('expired')\n if (!isExpired || graceSeconds <= 0) {\n throw verifyError\n }\n const signatureValid = await verifyHs256Signature(token, effectiveSecret)\n if (!signatureValid) return null\n const decoded = decodeJwtPayload(token)\n if (!decoded) return null\n payload = decoded\n }\n\n if (!payload) return null\n\n const now = Math.floor(Date.now() / 1000)\n if (payload.exp < now - Math.max(0, Math.floor(graceSeconds))) {\n return null\n }\n\n return payload\n } catch (error) {\n console.error('Token verification failed:', error)\n return null\n }\n }\n\n /**\n * Verify the JWT on an incoming Hono request using the `JWT_SECRET`\n * binding from `c.env`. Reads the token from the `Authorization: Bearer …`\n * header first, then falls back to the `auth_token` cookie. Returns the\n * decoded payload, or null when the token is missing, malformed, expired,\n * or signed with a different secret.\n *\n * Use this from custom Hono routes mounted alongside SonicJS — it\n * resolves the secret the same way `requireAuth()` does, without forcing\n * the caller to plumb it through manually.\n */\n static async verifyAuthRequest(c: Context): Promise {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n if (!token) return null\n const secret = (c.env as any)?.JWT_SECRET\n return await AuthManager.verifyToken(token, secret)\n }\n\n static async hashPassword(password: string): Promise {\n const iterations = 100000\n const salt = new Uint8Array(16)\n crypto.getRandomValues(salt)\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const saltHex = Array.from(salt).map(b => b.toString(16).padStart(2, '0')).join('')\n const hashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n return `pbkdf2:${iterations}:${saltHex}:${hashHex}`\n }\n\n static async hashPasswordLegacy(password: string): Promise {\n const encoder = new TextEncoder()\n const data = encoder.encode(password + 'salt-change-in-production')\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n static async verifyPassword(password: string, storedHash: string): Promise {\n if (storedHash.startsWith('pbkdf2:')) {\n // PBKDF2 format: pbkdf2:::\n const parts = storedHash.split(':')\n if (parts.length !== 4) return false\n\n const iterationsStr = parts[1]!\n const saltHex = parts[2]!\n const expectedHashHex = parts[3]!\n const iterations = parseInt(iterationsStr, 10)\n\n const saltBytes = saltHex.match(/.{2}/g)\n if (!saltBytes) return false\n const salt = new Uint8Array(saltBytes.map(byte => parseInt(byte, 16)))\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const actualHashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n // Constant-time comparison\n if (actualHashHex.length !== expectedHashHex.length) return false\n let result = 0\n for (let i = 0; i < actualHashHex.length; i++) {\n result |= actualHashHex.charCodeAt(i) ^ expectedHashHex.charCodeAt(i)\n }\n return result === 0\n }\n\n // Legacy SHA-256 format (no colons in hash)\n const legacyHash = await this.hashPasswordLegacy(password)\n // Constant-time comparison for legacy too\n if (legacyHash.length !== storedHash.length) return false\n let result = 0\n for (let i = 0; i < legacyHash.length; i++) {\n result |= legacyHash.charCodeAt(i) ^ storedHash.charCodeAt(i)\n }\n return result === 0\n }\n\n static isLegacyHash(storedHash: string): boolean {\n return !storedHash.startsWith('pbkdf2:')\n }\n\n /**\n * Set authentication cookie - useful for plugins implementing alternative auth methods\n * @param c - Hono context\n * @param token - JWT token to set in cookie\n * @param options - Optional cookie configuration\n */\n static setAuthCookie(c: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void {\n setCookie(c, 'auth_token', token, {\n httpOnly: options?.httpOnly ?? true,\n secure: options?.secure ?? true,\n sameSite: options?.sameSite ?? 'Strict',\n maxAge: options?.maxAge ?? getJwtExpirySeconds((c as any)?.env)\n })\n }\n}\n\n// Middleware to require authentication\nexport const requireAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n // Try to get token from Authorization header\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n\n // If no header token, try cookie\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n\n if (!token) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n // Try to get cached token verification from KV\n const kv = c.env?.KV\n let payload: JWTPayload | null = null\n\n if (kv) {\n const cacheKey = `auth:${token.substring(0, 20)}` // Use token prefix as key\n const cached = await kv.get(cacheKey, 'json')\n if (cached) {\n payload = cached as JWTPayload\n }\n }\n\n // If not cached, verify token\n if (!payload) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n payload = await AuthManager.verifyToken(token, jwtSecret)\n\n // Cache the verified payload for 5 minutes\n if (payload && kv) {\n const cacheKey = `auth:${token.substring(0, 20)}`\n await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 })\n }\n }\n\n if (!payload) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Your session has expired, please login again')\n }\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Add user info to context\n c.set('user', payload)\n\n return await next()\n } catch (error) {\n console.error('Auth middleware error:', error)\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Authentication failed, please login again')\n }\n return c.json({ error: 'Authentication failed' }, 401)\n }\n }\n}\n\n// Middleware to require specific role\nexport const requireRole = (requiredRole: string | string[]) => {\n return async (c: Context, next: Next) => {\n const user = c.get('user') as JWTPayload\n \n if (!user) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n \n const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]\n \n if (!roles.includes(user.role)) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=You do not have permission to access this area')\n }\n return c.json({ error: 'Insufficient permissions' }, 403)\n }\n \n return await next()\n }\n}\n\n// Optional auth middleware (doesn't block if no token)\nexport const optionalAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n \n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n \n if (token) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n const payload = await AuthManager.verifyToken(token, jwtSecret)\n if (payload) {\n c.set('user', payload)\n }\n }\n \n return await next()\n } catch (error) {\n // Don't block on auth errors in optional auth\n console.error('Optional auth error:', error)\n return await next()\n }\n }\n}\n","import { MiddlewareHandler } from 'hono'\nimport { metricsTracker } from '../utils/metrics'\n\n/**\n * Middleware to track all HTTP requests for real-time analytics\n * Excludes the metrics endpoint itself to avoid inflating the count\n */\nexport const metricsMiddleware = (): MiddlewareHandler => {\n return async (c, next) => {\n const path = new URL(c.req.url).pathname\n\n // Don't track the metrics endpoint itself to avoid self-inflating counts\n if (path !== '/admin/dashboard/api/metrics') {\n metricsTracker.recordRequest()\n }\n\n // Continue with the request\n await next()\n }\n}\n","/**\n * CSRF Protection Middleware — Signed Double-Submit Cookie\n *\n * Stateless CSRF protection for Cloudflare Workers (no session store needed).\n * Token format: `.` where HMAC-SHA256 is keyed with JWT_SECRET.\n *\n * Flow:\n * GET — ensureCsrfCookie(): reuse existing valid cookie or set a new one\n * POST/PUT/DELETE/PATCH — validate X-CSRF-Token header === csrf_token cookie, HMAC valid\n *\n * Exempt:\n * - Safe methods (GET, HEAD, OPTIONS)\n * - Auth routes that create sessions (/auth/login*, /auth/register*, etc.)\n * - Public form submissions (/forms/*, /api/forms/*) — NOT /admin/forms/*\n * - Requests with no auth_token cookie (Bearer-only or API-key-only)\n */\n\nimport type { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\n// Fallback secret — mirrors auth.ts behavior for local dev without wrangler secret\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Convert ArrayBuffer to URL-safe base64 (no padding). */\nexport function arrayBufferToBase64Url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!)\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Import a string key for HMAC-SHA256. */\nasync function getHmacKey(secret: string): Promise {\n const encoder = new TextEncoder()\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify']\n )\n}\n\n// ============================================================================\n// Token Generation & Validation\n// ============================================================================\n\n/**\n * Generate a signed CSRF token: `.`\n * - nonce = 32 random bytes, base64url-encoded\n * - signature = HMAC-SHA256(nonce, secret), base64url-encoded\n */\nexport async function generateCsrfToken(secret: string): Promise {\n const nonceBytes = new Uint8Array(32)\n crypto.getRandomValues(nonceBytes)\n const nonce = arrayBufferToBase64Url(nonceBytes.buffer)\n\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(nonce))\n const signature = arrayBufferToBase64Url(signatureBuffer)\n\n return `${nonce}.${signature}`\n}\n\n/**\n * Validate a signed CSRF token.\n *\n * Checks that the token has the correct `.` format and that\n * the HMAC signature is valid for the given secret. Uses crypto.subtle.verify\n * which provides constant-time comparison.\n *\n * NOTE: No expiry check here — by design. The security property of signed\n * double-submit comes from the unpredictability of the nonce + the\n * secret-bound HMAC, not from time-bounding. The cookie's maxAge (86400s)\n * handles expiry at the browser level.\n */\nexport async function validateCsrfToken(token: string, secret: string): Promise {\n if (!token || typeof token !== 'string') return false\n\n const dotIndex = token.indexOf('.')\n if (dotIndex === -1) return false\n\n const nonce = token.substring(0, dotIndex)\n const signature = token.substring(dotIndex + 1)\n\n if (!nonce || !signature) return false\n\n try {\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n\n // Decode the signature from base64url\n const sigPadded = signature.replace(/-/g, '+').replace(/_/g, '/')\n const sigBinary = atob(sigPadded)\n const sigBytes = new Uint8Array(sigBinary.length)\n for (let i = 0; i < sigBinary.length; i++) {\n sigBytes[i] = sigBinary.charCodeAt(i)\n }\n\n // crypto.subtle.verify is constant-time\n return await crypto.subtle.verify('HMAC', key, sigBytes.buffer, encoder.encode(nonce))\n } catch {\n return false\n }\n}\n\n// ============================================================================\n// Default Exempt Paths\n// ============================================================================\n\nconst DEFAULT_EXEMPT_PATHS = [\n '/auth/login',\n '/auth/register',\n '/auth/seed-admin',\n '/auth/accept-invitation',\n '/auth/reset-password',\n '/auth/request-password-reset',\n '/auth/otp',\n '/auth/magic-link',\n '/auth/verify',\n '/api/stripe/webhook',\n '/api/events',\n]\n\n/**\n * Check whether a request path is exempt from CSRF validation.\n * - Exact match or startsWith for auth routes (e.g. /auth/login/form)\n * - /forms/* and /api/forms/* are exempt (public submissions)\n * - /api/search* is exempt (read-only POST for complex query params)\n * - /admin/forms/* is NOT exempt\n */\nfunction isExemptPath(path: string, extraExemptPaths: string[] = []): boolean {\n // Public form routes — NOT /admin/forms/*\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/') || path === '/forms' || path === '/api/forms') {\n return true\n }\n\n // Search API — read-only POST (includes /api/search/click, /api/search/facet-click)\n if (path.startsWith('/api/search')) {\n return true\n }\n\n const allExempt = [...DEFAULT_EXEMPT_PATHS, ...extraExemptPaths]\n for (const exempt of allExempt) {\n if (path === exempt || path.startsWith(exempt + '/')) {\n return true\n }\n }\n\n return false\n}\n\n// ============================================================================\n// Middleware\n// ============================================================================\n\nexport interface CsrfOptions {\n /** Additional paths to exempt from CSRF validation. */\n exemptPaths?: string[]\n}\n\n/**\n * CSRF protection middleware (Signed Double-Submit Cookie).\n *\n * - GET/HEAD/OPTIONS: ensure a valid csrf_token cookie exists\n * - POST/PUT/DELETE/PATCH: validate X-CSRF-Token header matches cookie, HMAC valid\n * - Exempt: auth routes, public /forms/*, Bearer-only, API-key-only\n */\nexport function csrfProtection(options: CsrfOptions = {}) {\n return async (c: Context, next: Next): Promise => {\n const method = c.req.method.toUpperCase()\n const path = new URL(c.req.url).pathname\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n\n // Warn if using fallback secret in production\n if (c.env?.ENVIRONMENT === 'production' && !c.env?.JWT_SECRET) {\n console.warn(\n '[CSRF] WARNING: JWT_SECRET is not set in production. ' +\n 'CSRF tokens are signed with the fallback key, which is insecure.'\n )\n }\n\n // Safe methods — just ensure cookie, then pass through\n if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS') {\n await ensureCsrfCookie(c, secret)\n await next()\n return\n }\n\n // Exempt paths — pass through without validation\n if (isExemptPath(path, options.exemptPaths)) {\n await next()\n return\n }\n\n // Bearer-only or API-key-only requests (no auth_token cookie) — exempt\n const authCookie = getCookie(c, 'auth_token')\n if (!authCookie) {\n await next()\n return\n }\n\n // Requests with an Authorization header use token-based auth — the cookie\n // is incidental and CSRF protection is unnecessary (the attacker cannot\n // forge the Authorization header from a cross-origin page).\n const authHeader = c.req.header('Authorization')\n if (authHeader) {\n await next()\n return\n }\n\n // State-changing request with cookie auth — validate CSRF\n const cookieToken = getCookie(c, 'csrf_token')\n let headerToken = c.req.header('X-CSRF-Token')\n\n // Fallback: check _csrf field in form-encoded body (regular HTML form submissions)\n if (!headerToken) {\n const contentType = c.req.header('Content-Type') || ''\n if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n try {\n const body = await c.req.parseBody()\n headerToken = body['_csrf'] as string | undefined\n } catch {\n // Body not parseable — leave headerToken undefined\n }\n }\n }\n\n if (!cookieToken || !headerToken) {\n return csrfError(c, 'CSRF token missing')\n }\n\n if (cookieToken !== headerToken) {\n return csrfError(c, 'CSRF token mismatch')\n }\n\n const isValid = await validateCsrfToken(cookieToken, secret)\n if (!isValid) {\n return csrfError(c, 'CSRF token invalid')\n }\n\n await next()\n }\n}\n\n/**\n * Ensure a valid CSRF cookie exists. Check-then-reuse: if the existing cookie\n * has a valid HMAC signature, reuse it (no new Set-Cookie header). Only\n * generate a fresh token when the cookie is missing or has an invalid signature.\n */\nasync function ensureCsrfCookie(c: Context, secret: string): Promise {\n const existing = getCookie(c, 'csrf_token')\n\n if (existing) {\n const isValid = await validateCsrfToken(existing, secret)\n if (isValid) {\n // Reuse existing valid token — no Set-Cookie needed\n c.set('csrfToken', existing)\n return\n }\n }\n\n // Generate fresh token\n const token = await generateCsrfToken(secret)\n c.set('csrfToken', token)\n\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n setCookie(c, 'csrf_token', token, {\n httpOnly: false, // JS must read this cookie\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: 86400, // 24 hours — browser-side expiry\n })\n}\n\n/** Return a 403 CSRF error — HTML for browser requests, JSON for API. */\nfunction csrfError(c: Context, message: string): Response {\n const accept = c.req.header('Accept') || ''\n if (accept.includes('text/html')) {\n return c.html(\n `403 Forbidden` +\n `

403 Forbidden

${message}

`,\n 403\n )\n }\n return c.json({ error: message, status: 403 }, 403)\n}\n","import { Context, Next } from 'hono'\n\ninterface RateLimitOptions {\n max: number\n windowMs: number\n keyPrefix: string\n}\n\ninterface RateLimitEntry {\n count: number\n resetAt: number\n}\n\n/**\n * KV-based sliding window rate limiter middleware.\n * Gracefully skips if CACHE_KV binding is not available.\n */\nexport function rateLimit(options: RateLimitOptions) {\n const { max, windowMs, keyPrefix } = options\n\n return async (c: Context, next: Next) => {\n const kv = (c.env as any)?.CACHE_KV\n if (!kv) {\n // No KV binding available — skip rate limiting\n return await next()\n }\n\n const ip = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const key = `ratelimit:${keyPrefix}:${ip}`\n\n try {\n const now = Date.now()\n const stored = await kv.get(key, 'json') as RateLimitEntry | null\n\n let entry: RateLimitEntry\n if (stored && stored.resetAt > now) {\n entry = stored\n } else {\n entry = { count: 0, resetAt: now + windowMs }\n }\n\n entry.count++\n\n // Calculate TTL in seconds (KV expiration)\n const ttlSeconds = Math.ceil((entry.resetAt - now) / 1000)\n\n if (entry.count > max) {\n // Store the updated count even when rejecting\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n const retryAfter = Math.ceil((entry.resetAt - now) / 1000)\n c.header('Retry-After', String(retryAfter))\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', '0')\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n return c.json({ error: 'Too many requests. Please try again later.' }, 429)\n }\n\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', String(max - entry.count))\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n\n return await next()\n } catch (error) {\n // Rate limiting should never break the app\n console.error('Rate limiter error (non-fatal):', error)\n return await next()\n }\n }\n}\n","import { Context, Next } from 'hono'\n\n/**\n * Security headers middleware.\n * Sets standard security headers on every response.\n * Skips HSTS in development to avoid local dev issues.\n */\nexport const securityHeadersMiddleware = () => {\n return async (c: Context, next: Next) => {\n await next()\n\n c.header('X-Content-Type-Options', 'nosniff')\n c.header('X-Frame-Options', 'SAMEORIGIN')\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin')\n c.header('Permissions-Policy', 'camera=(), microphone=(), geolocation=()')\n\n // Only set HSTS in non-development environments\n const environment = (c.env as any)?.ENVIRONMENT\n if (environment !== 'development') {\n c.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains')\n }\n }\n}\n","/**\n * Middleware Module Exports\n *\n * Request processing middleware for SonicJS\n *\n * Note: Most middleware is currently in the monolith and will be migrated later.\n * For now, we only export the bootstrap middleware which is used for system initialization.\n */\n\n// Bootstrap middleware\nexport { bootstrapMiddleware, verifySecurityConfig } from './bootstrap'\n\n// Auth middleware\nexport {\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n getJwtExpirySeconds,\n getJwtExpirySecondsFromDb,\n getJwtRefreshGraceSecondsFromDb,\n} from './auth'\n\n// Metrics middleware\nexport { metricsMiddleware } from './metrics'\n\n// CSRF protection middleware\nexport { csrfProtection, generateCsrfToken, validateCsrfToken } from './csrf'\n\n// Rate limiting middleware\nexport { rateLimit } from './rate-limit'\n\n// Re-export types and functions that are referenced but implemented in monolith\n// These are placeholder exports to maintain API compatibility\nexport type Permission = string\nexport type UserPermissions = {\n userId: string\n permissions: Permission[]\n}\n\n// Middleware stubs - these return pass-through middleware that call next()\nexport const loggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const detailedLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const securityLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const performanceLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const cacheHeaders: any = () => async (_c: any, next: any) => await next()\nexport const compressionMiddleware: any = async (_c: any, next: any) => await next()\nexport { securityHeadersMiddleware as securityHeaders } from './security-headers'\n\n// Other stubs\nexport const PermissionManager: any = {}\nexport const requirePermission: any = () => async (_c: any, next: any) => await next()\nexport const requireAnyPermission: any = () => async (_c: any, next: any) => await next()\nexport const logActivity: any = () => {}\nexport const requireActivePlugin: any = () => async (_c: any, next: any) => await next()\nexport const requireActivePlugins: any = () => async (_c: any, next: any) => await next()\nexport const getActivePlugins: any = () => []\nexport const isPluginActive: any = () => false\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-TFNTM3OA.js.map b/packages/core/dist/chunk-TFNTM3OA.js.map deleted file mode 100644 index eb87c8df2..000000000 --- a/packages/core/dist/chunk-TFNTM3OA.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../../node_modules/semver/internal/constants.js","../../../node_modules/semver/internal/debug.js","../../../node_modules/semver/internal/re.js","../../../node_modules/semver/internal/parse-options.js","../../../node_modules/semver/internal/identifiers.js","../../../node_modules/semver/classes/semver.js","../../../node_modules/semver/functions/parse.js","../../../node_modules/semver/functions/valid.js","../../../node_modules/semver/functions/clean.js","../../../node_modules/semver/functions/inc.js","../../../node_modules/semver/functions/diff.js","../../../node_modules/semver/functions/major.js","../../../node_modules/semver/functions/minor.js","../../../node_modules/semver/functions/patch.js","../../../node_modules/semver/functions/prerelease.js","../../../node_modules/semver/functions/compare.js","../../../node_modules/semver/functions/rcompare.js","../../../node_modules/semver/functions/compare-loose.js","../../../node_modules/semver/functions/compare-build.js","../../../node_modules/semver/functions/sort.js","../../../node_modules/semver/functions/rsort.js","../../../node_modules/semver/functions/gt.js","../../../node_modules/semver/functions/lt.js","../../../node_modules/semver/functions/eq.js","../../../node_modules/semver/functions/neq.js","../../../node_modules/semver/functions/gte.js","../../../node_modules/semver/functions/lte.js","../../../node_modules/semver/functions/cmp.js","../../../node_modules/semver/functions/coerce.js","../../../node_modules/semver/internal/lrucache.js","../../../node_modules/semver/classes/range.js","../../../node_modules/semver/classes/comparator.js","../../../node_modules/semver/functions/satisfies.js","../../../node_modules/semver/ranges/to-comparators.js","../../../node_modules/semver/ranges/max-satisfying.js","../../../node_modules/semver/ranges/min-satisfying.js","../../../node_modules/semver/ranges/min-version.js","../../../node_modules/semver/ranges/valid.js","../../../node_modules/semver/ranges/outside.js","../../../node_modules/semver/ranges/gtr.js","../../../node_modules/semver/ranges/ltr.js","../../../node_modules/semver/ranges/intersects.js","../../../node_modules/semver/ranges/simplify.js","../../../node_modules/semver/ranges/subset.js","../../../node_modules/semver/index.js","../src/plugins/hook-system.ts","../src/plugins/plugin-validator.ts","../src/plugins/plugin-registry.ts","../src/plugins/plugin-manager.ts","../src/plugins/core-plugins/turnstile-plugin/middleware/verify.ts","../src/plugins/core-plugins/turnstile-plugin/index.ts"],"names":["exports","z","require_valid","require_semver","semver"],"mappings":"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","file":"chunk-TFNTM3OA.js","sourcesContent":["'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a === b ? 0 : a < b ? -1 : 1\n }\n\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n if (this.major < other.major) {\n return -1\n }\n if (this.major > other.major) {\n return 1\n }\n if (this.minor < other.minor) {\n return -1\n }\n if (this.minor > other.minor) {\n return 1\n }\n if (this.patch < other.patch) {\n return -1\n }\n if (this.patch > other.patch) {\n return 1\n }\n return 0\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n comp = comp.replace(re[t.BUILD], '')\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","/**\n * Hook System Implementation\n * \n * Provides event-driven extensibility for plugins\n */\n\nimport { HookSystem, HookHandler, PluginHook, HookContext } from '../types'\n\nexport class HookSystemImpl implements HookSystem {\n private hooks: Map = new Map()\n private executing: Set = new Set()\n\n /**\n * Register a hook handler\n */\n register(hookName: string, handler: HookHandler, priority: number = 10): void {\n if (!this.hooks.has(hookName)) {\n this.hooks.set(hookName, [])\n }\n\n const hooks = this.hooks.get(hookName)!\n const hook: PluginHook = {\n name: hookName,\n handler,\n priority,\n }\n\n // Insert hook in priority order (lower priority = earlier execution)\n const insertIndex = hooks.findIndex(h => h.priority! > priority)\n if (insertIndex === -1) {\n hooks.push(hook)\n } else {\n hooks.splice(insertIndex, 0, hook)\n }\n\n console.debug(`Hook registered: ${hookName} (priority: ${priority})`)\n }\n\n /**\n * Execute all handlers for a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n const hooks = this.hooks.get(hookName)\n if (!hooks || hooks.length === 0) {\n return data\n }\n\n // Prevent infinite recursion\n if (this.executing.has(hookName)) {\n console.warn(`Hook recursion detected for: ${hookName}`)\n return data\n }\n\n this.executing.add(hookName)\n\n try {\n let result = data\n let cancelled = false\n\n const hookContext: HookContext = {\n plugin: '', // Will be set by the plugin manager\n context: context || {},\n cancel: () => { cancelled = true }\n }\n\n for (const hook of hooks) {\n if (cancelled) {\n console.debug(`Hook execution cancelled: ${hookName}`)\n break\n }\n\n try {\n console.debug(`Executing hook: ${hookName} (priority: ${hook.priority})`)\n result = await hook.handler(result, hookContext)\n } catch (error) {\n console.error(`Hook execution failed: ${hookName}`, error)\n // Continue executing other hooks unless it's a critical error\n if (error instanceof Error && error.message.includes('CRITICAL')) {\n throw error\n }\n }\n }\n\n return result\n } finally {\n this.executing.delete(hookName)\n }\n }\n\n /**\n * Remove a hook handler\n */\n unregister(hookName: string, handler: HookHandler): void {\n const hooks = this.hooks.get(hookName)\n if (!hooks) return\n\n const index = hooks.findIndex(h => h.handler === handler)\n if (index !== -1) {\n hooks.splice(index, 1)\n console.debug(`Hook unregistered: ${hookName}`)\n }\n\n // Clean up empty hook arrays\n if (hooks.length === 0) {\n this.hooks.delete(hookName)\n }\n }\n\n /**\n * Get all registered hooks for a name\n */\n getHooks(hookName: string): PluginHook[] {\n return this.hooks.get(hookName) || []\n }\n\n /**\n * Get all registered hook names\n */\n getHookNames(): string[] {\n return Array.from(this.hooks.keys())\n }\n\n /**\n * Get hook statistics\n */\n getStats(): { hookName: string; handlerCount: number }[] {\n return Array.from(this.hooks.entries()).map(([hookName, handlers]) => ({\n hookName,\n handlerCount: handlers.length\n }))\n }\n\n /**\n * Clear all hooks (useful for testing)\n */\n clear(): void {\n this.hooks.clear()\n this.executing.clear()\n }\n\n /**\n * Create a scoped hook system for a plugin\n */\n createScope(_pluginName: string): ScopedHookSystem {\n return new ScopedHookSystem(this)\n }\n}\n\n/**\n * Scoped hook system for individual plugins\n */\nexport class ScopedHookSystem {\n private registeredHooks: { hookName: string; handler: HookHandler }[] = []\n\n constructor(\n private parent: HookSystemImpl\n ) {}\n\n /**\n * Register a hook (scoped to this plugin)\n */\n register(hookName: string, handler: HookHandler, priority?: number): void {\n this.parent.register(hookName, handler, priority)\n this.registeredHooks.push({ hookName, handler })\n }\n\n /**\n * Execute a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n return this.parent.execute(hookName, data, context)\n }\n\n /**\n * Unregister a specific hook\n */\n unregister(hookName: string, handler: HookHandler): void {\n this.parent.unregister(hookName, handler)\n const index = this.registeredHooks.findIndex(\n h => h.hookName === hookName && h.handler === handler\n )\n if (index !== -1) {\n this.registeredHooks.splice(index, 1)\n }\n }\n\n /**\n * Unregister all hooks for this plugin\n */\n unregisterAll(): void {\n for (const { hookName, handler } of this.registeredHooks) {\n this.parent.unregister(hookName, handler)\n }\n this.registeredHooks.length = 0\n }\n\n /**\n * Get hooks registered by this plugin\n */\n getRegisteredHooks(): { hookName: string; handler: HookHandler }[] {\n return [...this.registeredHooks]\n }\n}\n\n/**\n * Hook utilities\n */\nexport class HookUtils {\n /**\n * Create a hook name with namespace\n */\n static createHookName(namespace: string, event: string): string {\n return `${namespace}:${event}`\n }\n\n /**\n * Parse a hook name to extract namespace and event\n */\n static parseHookName(hookName: string): { namespace: string; event: string } {\n const parts = hookName.split(':')\n return {\n namespace: parts[0] || '',\n event: parts.slice(1).join(':') || ''\n }\n }\n\n /**\n * Create a middleware that executes hooks\n */\n static createHookMiddleware(\n hookSystem: HookSystem,\n beforeHook?: string,\n afterHook?: string\n ) {\n return async (c: any, next: any) => {\n if (beforeHook) {\n const beforeData = { request: c.req, context: c }\n await hookSystem.execute(beforeHook, beforeData)\n }\n\n await next()\n\n if (afterHook) {\n const afterData = { request: c.req, response: c.res, context: c }\n await hookSystem.execute(afterHook, afterData)\n }\n }\n }\n\n /**\n * Create a debounced hook handler\n */\n static debounce(handler: HookHandler, delay: number): HookHandler {\n let timeoutId: any\n \n return async (data: any, context: HookContext) => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n return new Promise((resolve, reject) => {\n timeoutId = setTimeout(async () => {\n try {\n const result = await handler(data, context)\n resolve(result)\n } catch (error) {\n reject(error)\n }\n }, delay)\n })\n }\n }\n\n /**\n * Create a throttled hook handler\n */\n static throttle(handler: HookHandler, limit: number): HookHandler {\n let lastExecution = 0\n\n return async (data: any, context: HookContext) => {\n const now = Date.now()\n if (now - lastExecution >= limit) {\n lastExecution = now\n return handler(data, context)\n }\n return data\n }\n }\n}","/**\n * Plugin Validator\n * \n * Validates plugin definitions, dependencies, and compatibility\n */\n\nimport { z } from 'zod'\nimport { Plugin, PluginValidator as IPluginValidator, PluginValidationResult, PluginRegistry } from '../types'\nimport semver from 'semver'\n\n// Zod schemas for plugin validation\nconst PluginAuthorSchema = z.object({\n name: z.string().min(1),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n})\n\nconst PluginRoutesSchema = z.object({\n path: z.string().min(1),\n handler: z.any(), // Hono instance\n description: z.string().optional(),\n requiresAuth: z.boolean().optional(),\n roles: z.array(z.string()).optional(),\n priority: z.number().optional(),\n})\n\nconst PluginMiddlewareSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n description: z.string().optional(),\n priority: z.number().optional(),\n routes: z.array(z.string()).optional(),\n global: z.boolean().optional(),\n})\n\nconst PluginModelSchema = z.object({\n name: z.string().min(1),\n tableName: z.string().min(1),\n schema: z.any(), // Zod schema\n migrations: z.array(z.string()),\n relationships: z.array(z.object({\n type: z.enum(['oneToOne', 'oneToMany', 'manyToMany']),\n target: z.string(),\n foreignKey: z.string().optional(),\n joinTable: z.string().optional(),\n })).optional(),\n extendsContent: z.boolean().optional(),\n})\n\nconst PluginServiceSchema = z.object({\n name: z.string().min(1),\n implementation: z.any(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n singleton: z.boolean().optional(),\n})\n\nconst PluginAdminPageSchema = z.object({\n path: z.string().min(1),\n title: z.string().min(1),\n component: z.string().min(1),\n description: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n menuItem: z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n }).optional(),\n icon: z.string().optional(),\n})\n\nconst PluginComponentSchema = z.object({\n name: z.string().min(1),\n template: z.function(),\n description: z.string().optional(),\n propsSchema: z.any().optional(), // Zod schema\n})\n\nconst PluginHookSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n priority: z.number().optional(),\n description: z.string().optional(),\n})\n\nconst PluginSchema = z.object({\n name: z.string().min(1).regex(/^[a-z0-9-]+$/, 'Plugin name must be lowercase with hyphens'),\n version: z.string().refine(v => semver.valid(v), 'Version must be valid semver'),\n description: z.string().optional(),\n author: PluginAuthorSchema.optional(),\n dependencies: z.array(z.string()).optional(),\n compatibility: z.string().optional(),\n license: z.string().optional(),\n \n // Extension points\n routes: z.array(PluginRoutesSchema).optional(),\n middleware: z.array(PluginMiddlewareSchema).optional(),\n models: z.array(PluginModelSchema).optional(),\n services: z.array(PluginServiceSchema).optional(),\n adminPages: z.array(PluginAdminPageSchema).optional(),\n adminComponents: z.array(PluginComponentSchema).optional(),\n menuItems: z.array(z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n })).optional(),\n hooks: z.array(PluginHookSchema).optional(),\n \n // Lifecycle hooks\n install: z.function().optional(),\n uninstall: z.function().optional(),\n activate: z.function().optional(),\n deactivate: z.function().optional(),\n configure: z.function().optional(),\n})\n\nexport class PluginValidator implements IPluginValidator {\n private static readonly RESERVED_NAMES = [\n 'core', 'system', 'admin', 'api', 'auth', 'content', 'media', 'users', 'collections'\n ]\n\n private static readonly RESERVED_PATHS = [\n '/admin', '/api', '/auth', '/docs', '/media', '/_assets'\n ]\n\n /**\n * Validate plugin definition\n */\n validate(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n try {\n // Schema validation\n const result = PluginSchema.safeParse(plugin)\n if (!result.success) {\n result.error.issues.forEach((err: any) => {\n errors.push(`${err.path.join('.')}: ${err.message}`)\n })\n }\n\n // Reserved name validation\n if (PluginValidator.RESERVED_NAMES.includes(plugin.name)) {\n errors.push(`Plugin name \"${plugin.name}\" is reserved`)\n }\n\n // Route path validation\n if (plugin.routes) {\n for (const route of plugin.routes) {\n if (PluginValidator.RESERVED_PATHS.some(path => route.path.startsWith(path))) {\n errors.push(`Route path \"${route.path}\" conflicts with reserved system path`)\n }\n \n if (!route.path.startsWith('/')) {\n errors.push(`Route path \"${route.path}\" must start with /`)\n }\n }\n }\n\n // Model validation\n if (plugin.models) {\n const modelNames = new Set()\n const tableNames = new Set()\n \n for (const model of plugin.models) {\n // Check for duplicate model names\n if (modelNames.has(model.name)) {\n errors.push(`Duplicate model name: ${model.name}`)\n }\n modelNames.add(model.name)\n \n // Check for duplicate table names\n if (tableNames.has(model.tableName)) {\n errors.push(`Duplicate table name: ${model.tableName}`)\n }\n tableNames.add(model.tableName)\n \n // Validate table name format\n if (!/^[a-z][a-z0-9_]*$/.test(model.tableName)) {\n errors.push(`Invalid table name format: ${model.tableName}`)\n }\n \n // Check for system table conflicts\n const systemTables = ['users', 'collections', 'content', 'content_versions', 'media', 'api_tokens']\n if (systemTables.includes(model.tableName)) {\n errors.push(`Table name \"${model.tableName}\" conflicts with system table`)\n }\n }\n }\n\n // Service validation\n if (plugin.services) {\n const serviceNames = new Set()\n \n for (const service of plugin.services) {\n if (serviceNames.has(service.name)) {\n errors.push(`Duplicate service name: ${service.name}`)\n }\n serviceNames.add(service.name)\n \n // Check for system service conflicts\n const systemServices = ['auth', 'content', 'media', 'cdn']\n if (systemServices.includes(service.name)) {\n warnings.push(`Service name \"${service.name}\" conflicts with system service`)\n }\n }\n }\n\n // Admin page validation\n if (plugin.adminPages) {\n const pagePaths = new Set()\n \n for (const page of plugin.adminPages) {\n if (pagePaths.has(page.path)) {\n errors.push(`Duplicate admin page path: ${page.path}`)\n }\n pagePaths.add(page.path)\n \n if (!page.path.startsWith('/')) {\n errors.push(`Admin page path \"${page.path}\" must start with /`)\n }\n \n // Check for system admin page conflicts\n const systemPaths = ['/', '/collections', '/content', '/media', '/users', '/settings']\n if (systemPaths.includes(page.path)) {\n errors.push(`Admin page path \"${page.path}\" conflicts with system page`)\n }\n }\n }\n\n // Component validation\n if (plugin.adminComponents) {\n const componentNames = new Set()\n \n for (const component of plugin.adminComponents) {\n if (componentNames.has(component.name)) {\n errors.push(`Duplicate component name: ${component.name}`)\n }\n componentNames.add(component.name)\n \n // Check for system component conflicts\n const systemComponents = ['table', 'form', 'alert', 'media-grid', 'pagination']\n if (systemComponents.includes(component.name)) {\n warnings.push(`Component name \"${component.name}\" conflicts with system component`)\n }\n }\n }\n\n // Hook validation\n if (plugin.hooks) {\n for (const hook of plugin.hooks) {\n if (!hook.name.includes(':')) {\n warnings.push(`Hook name \"${hook.name}\" should include namespace (e.g., \"plugin:event\")`)\n }\n }\n }\n\n // Dependency cycle detection (basic)\n if (plugin.dependencies?.includes(plugin.name)) {\n errors.push(`Plugin cannot depend on itself`)\n }\n\n // License validation\n if (plugin.license) {\n const validLicenses = ['MIT', 'Apache-2.0', 'GPL-3.0', 'BSD-3-Clause', 'ISC']\n if (!validLicenses.includes(plugin.license)) {\n warnings.push(`License \"${plugin.license}\" is not a common SPDX identifier`)\n }\n }\n\n // Performance warnings\n if (plugin.middleware && plugin.middleware.length > 5) {\n warnings.push(`Plugin defines ${plugin.middleware.length} middleware functions, consider consolidating`)\n }\n\n if (plugin.hooks && plugin.hooks.length > 10) {\n warnings.push(`Plugin defines ${plugin.hooks.length} hooks, ensure they are necessary`)\n }\n\n } catch (error) {\n errors.push(`Validation error: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin dependencies\n */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.dependencies || plugin.dependencies.length === 0) {\n return { valid: true, errors, warnings }\n }\n\n // Check if all dependencies are registered\n for (const depName of plugin.dependencies) {\n if (!registry.has(depName)) {\n errors.push(`Dependency \"${depName}\" is not registered`)\n continue\n }\n\n const dependency = registry.get(depName)!\n \n // Check dependency version compatibility\n if (dependency.compatibility && plugin.compatibility) {\n if (!this.isCompatible(dependency.compatibility, plugin.compatibility)) {\n warnings.push(`Potential compatibility issue with dependency \"${depName}\"`)\n }\n }\n }\n\n // Check for circular dependencies\n const visited = new Set()\n const visiting = new Set()\n \n const checkCircular = (name: string): boolean => {\n if (visiting.has(name)) return true\n if (visited.has(name)) return false\n \n visiting.add(name)\n \n const current = registry.get(name)\n if (current?.dependencies) {\n for (const depName of current.dependencies) {\n if (checkCircular(depName)) {\n errors.push(`Circular dependency detected: ${name} -> ${depName}`)\n return true\n }\n }\n }\n \n visiting.delete(name)\n visited.add(name)\n return false\n }\n\n checkCircular(plugin.name)\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin compatibility with SonicJS version\n */\n validateCompatibility(plugin: Plugin, sonicVersion: string): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.compatibility) {\n warnings.push('Plugin does not specify compatibility version')\n return { valid: true, errors, warnings }\n }\n\n try {\n if (!semver.satisfies(sonicVersion, plugin.compatibility)) {\n errors.push(`Plugin requires SonicJS ${plugin.compatibility}, but current version is ${sonicVersion}`)\n }\n } catch (error) {\n errors.push(`Invalid compatibility version format: ${plugin.compatibility}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Check if two version ranges are compatible\n */\n private isCompatible(version1: string, version2: string): boolean {\n try {\n // Simple compatibility check - can be enhanced\n return semver.intersects(version1, version2)\n } catch {\n return false\n }\n }\n\n /**\n * Validate plugin security constraints\n */\n validateSecurity(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n // Check for potentially dangerous patterns\n const pluginCode = JSON.stringify(plugin)\n \n // Check for eval or Function constructor usage\n if (pluginCode.includes('eval(') || pluginCode.includes('Function(')) {\n errors.push('Plugin contains potentially dangerous code execution patterns')\n }\n\n // Check for file system access attempts\n if (pluginCode.includes('fs.') || pluginCode.includes('require(')) {\n warnings.push('Plugin may attempt file system access (not available in Cloudflare Workers)')\n }\n\n // Check for network access patterns\n if (pluginCode.includes('fetch(') || pluginCode.includes('XMLHttpRequest')) {\n warnings.push('Plugin contains network access code - ensure it follows security guidelines')\n }\n\n // Check for sensitive data patterns\n const sensitivePatterns = ['password', 'secret', 'key', 'token', 'credential']\n for (const pattern of sensitivePatterns) {\n if (pluginCode.toLowerCase().includes(pattern)) {\n warnings.push(`Plugin code contains \"${pattern}\" - ensure sensitive data is properly handled`)\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n}","/**\n * Plugin Registry Implementation\n * \n * Manages plugin registration, activation, and lifecycle\n */\n\nimport { Plugin, PluginRegistry, PluginConfig, PluginStatus } from '../types'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginRegistryImpl implements PluginRegistry {\n private plugins: Map = new Map()\n private configs: Map = new Map()\n private statuses: Map = new Map()\n private validator: PluginValidator\n\n constructor(validator?: PluginValidator) {\n this.validator = validator || new PluginValidator()\n }\n\n /**\n * Get plugin by name\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name)\n }\n\n /**\n * Get all registered plugins\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values())\n }\n\n /**\n * Get active plugins\n */\n getActive(): Plugin[] {\n return this.getAll().filter(plugin => {\n const status = this.statuses.get(plugin.name)\n return status?.active === true\n })\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise {\n console.info(`Registering plugin: ${plugin.name} v${plugin.version}`)\n\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed for ${plugin.name}: ${validation.errors.join(', ')}`)\n }\n\n // Check for conflicts\n if (this.plugins.has(plugin.name)) {\n const existingPlugin = this.plugins.get(plugin.name)!\n if (existingPlugin.version !== plugin.version) {\n console.warn(`Plugin ${plugin.name} is already registered with version ${existingPlugin.version}, replacing with ${plugin.version}`)\n }\n }\n\n // Validate dependencies\n const depValidation = this.validator.validateDependencies(plugin, this)\n if (!depValidation.valid) {\n throw new Error(`Plugin dependency validation failed for ${plugin.name}: ${depValidation.errors.join(', ')}`)\n }\n\n // Register plugin\n this.plugins.set(plugin.name, plugin)\n \n // Initialize status\n this.statuses.set(plugin.name, {\n name: plugin.name,\n version: plugin.version,\n active: false,\n installed: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin registered successfully: ${plugin.name}`)\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise {\n console.info(`Unregistering plugin: ${name}`)\n\n if (!this.plugins.has(name)) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n // Check if other plugins depend on this one\n const dependents = this.getDependents(name)\n if (dependents.length > 0) {\n throw new Error(`Cannot unregister ${name}: plugins ${dependents.join(', ')} depend on it`)\n }\n\n // Remove plugin\n this.plugins.delete(name)\n this.configs.delete(name)\n this.statuses.delete(name)\n\n console.info(`Plugin unregistered: ${name}`)\n }\n\n /**\n * Check if plugin is registered\n */\n has(name: string): boolean {\n return this.plugins.has(name)\n }\n\n /**\n * Activate a plugin\n */\n async activate(name: string): Promise {\n console.info(`Activating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (status?.active) {\n console.warn(`Plugin ${name} is already active`)\n return\n }\n\n try {\n // Activate dependencies first\n if (plugin.dependencies) {\n for (const depName of plugin.dependencies) {\n const depStatus = this.statuses.get(depName)\n if (!depStatus?.active) {\n await this.activate(depName)\n }\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin activated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n active: false,\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to activate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Deactivate a plugin\n */\n async deactivate(name: string): Promise {\n console.info(`Deactivating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (!status?.active) {\n console.warn(`Plugin ${name} is not active`)\n return\n }\n\n try {\n // Deactivate dependents first\n const dependents = this.getDependents(name)\n for (const depName of dependents) {\n const depStatus = this.statuses.get(depName)\n if (depStatus?.active) {\n await this.deactivate(depName)\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: false,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin deactivated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to deactivate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Get plugin configuration\n */\n getConfig(name: string): PluginConfig | undefined {\n return this.configs.get(name)\n }\n\n /**\n * Set plugin configuration\n */\n setConfig(name: string, config: PluginConfig): void {\n this.configs.set(name, {\n ...config,\n updatedAt: Date.now()\n })\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus | undefined {\n return this.statuses.get(name)\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): Map {\n return new Map(this.statuses)\n }\n\n /**\n * Update plugin status\n */\n private updateStatus(name: string, updates: Partial): void {\n const current = this.statuses.get(name)\n if (current) {\n this.statuses.set(name, { ...current, ...updates })\n }\n }\n\n /**\n * Get plugins that depend on the specified plugin\n */\n private getDependents(name: string): string[] {\n const dependents: string[] = []\n \n for (const [pluginName, plugin] of this.plugins) {\n if (plugin.dependencies?.includes(name)) {\n dependents.push(pluginName)\n }\n }\n \n return dependents\n }\n\n /**\n * Get dependency graph\n */\n getDependencyGraph(): Map {\n const graph = new Map()\n \n for (const [name, plugin] of this.plugins) {\n graph.set(name, plugin.dependencies || [])\n }\n \n return graph\n }\n\n /**\n * Resolve plugin load order based on dependencies\n */\n resolveLoadOrder(): string[] {\n const graph = this.getDependencyGraph()\n const visited = new Set()\n const visiting = new Set()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected involving plugin: ${name}`)\n }\n\n visiting.add(name)\n \n const dependencies = graph.get(name) || []\n for (const dep of dependencies) {\n if (!graph.has(dep)) {\n throw new Error(`Plugin ${name} depends on ${dep}, but ${dep} is not registered`)\n }\n visit(dep)\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n for (const name of graph.keys()) {\n visit(name)\n }\n\n return result\n }\n\n /**\n * Export plugin configuration\n */\n exportConfig(): { plugins: PluginConfig[] } {\n const plugins: PluginConfig[] = []\n \n for (const [name, config] of this.configs) {\n plugins.push({\n ...config,\n name\n } as PluginConfig & { name: string })\n }\n \n return { plugins }\n }\n\n /**\n * Import plugin configuration\n */\n importConfig(config: { plugins: PluginConfig[] }): void {\n for (const pluginConfig of config.plugins) {\n if ('name' in pluginConfig) {\n const { name, ...rest } = pluginConfig as PluginConfig & { name: string }\n this.setConfig(name, rest)\n }\n }\n }\n\n /**\n * Clear all plugins (useful for testing)\n */\n clear(): void {\n this.plugins.clear()\n this.configs.clear()\n this.statuses.clear()\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n total: number\n active: number\n inactive: number\n withErrors: number\n } {\n const statuses = Array.from(this.statuses.values())\n \n return {\n total: statuses.length,\n active: statuses.filter(s => s.active).length,\n inactive: statuses.filter(s => !s.active).length,\n withErrors: statuses.filter(s => s.hasErrors).length\n }\n }\n}","/**\n * Plugin Manager\n * \n * Central orchestrator for the plugin system\n */\n\nimport { Hono } from 'hono'\nimport { Plugin, PluginManager as IPluginManager, PluginRegistry, PluginConfig, PluginContext, PluginStatus, HookSystem, PluginLogger, HOOKS } from '../types'\nimport { PluginRegistryImpl } from './plugin-registry'\nimport { HookSystemImpl, ScopedHookSystem } from './hook-system'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginManager implements IPluginManager {\n public readonly registry: PluginRegistry\n public readonly hooks: HookSystem\n private validator: PluginValidator\n private context?: PluginContext\n private scopedHooks: Map = new Map()\n private pluginRoutes: Map = new Map()\n\n constructor() {\n this.validator = new PluginValidator()\n this.registry = new PluginRegistryImpl(this.validator)\n this.hooks = new HookSystemImpl()\n }\n\n /**\n * Initialize plugin system\n */\n async initialize(context: PluginContext): Promise {\n console.info('Initializing plugin system...')\n \n this.context = context\n \n // Execute app init hook\n await this.hooks.execute(HOOKS.APP_INIT, {\n pluginManager: this,\n context\n })\n\n console.info('Plugin system initialized')\n }\n\n /**\n * Load plugins from configuration\n */\n async loadPlugins(configs: PluginConfig[]): Promise {\n console.info(`Loading ${configs.length} plugins...`)\n\n // Filter enabled plugins\n const enabledConfigs = configs.filter(config => config.enabled)\n \n if (enabledConfigs.length === 0) {\n console.info('No enabled plugins to load')\n return\n }\n\n // Load and register plugins (implementation would depend on how plugins are distributed)\n for (const config of enabledConfigs) {\n try {\n // In a real implementation, this would load the plugin from a registry or file system\n // For now, we'll assume plugins are already imported\n console.info(`Loading plugin configuration: ${JSON.stringify(config)}`)\n \n // Store configuration\n if ('name' in config) {\n this.registry.setConfig(config.name as string, config)\n }\n } catch (error) {\n console.error(`Failed to load plugin configuration:`, error)\n }\n }\n\n // Resolve load order based on dependencies\n try {\n const loadOrder = this.registry.resolveLoadOrder()\n console.info(`Plugin load order: ${loadOrder.join(' -> ')}`)\n\n // Activate plugins in dependency order\n for (const pluginName of loadOrder) {\n const config = this.registry.getConfig(pluginName)\n if (config?.enabled) {\n await this.registry.activate(pluginName)\n }\n }\n } catch (error) {\n console.error('Failed to resolve plugin load order:', error)\n }\n\n console.info('Plugin loading completed')\n }\n\n /**\n * Install a plugin\n */\n async install(plugin: Plugin, config?: PluginConfig): Promise {\n console.info(`Installing plugin: ${plugin.name}`)\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed: ${validation.errors.join(', ')}`)\n }\n\n // Register plugin\n await this.registry.register(plugin)\n\n // Set configuration\n const pluginConfig: PluginConfig = {\n enabled: true,\n installedAt: Date.now(),\n ...config\n }\n this.registry.setConfig(plugin.name, pluginConfig)\n\n // Create scoped hook system for plugin\n const scopedHooks = this.hooks.createScope ? \n (this.hooks as HookSystemImpl).createScope(plugin.name) : \n this.hooks\n\n this.scopedHooks.set(plugin.name, scopedHooks as ScopedHookSystem)\n\n // Create plugin context\n const pluginContext: PluginContext = {\n ...this.context,\n config: pluginConfig,\n hooks: scopedHooks,\n logger: this.createLogger(plugin.name)\n }\n\n // Register plugin extensions\n await this.registerPluginExtensions(plugin, pluginContext)\n\n // Run plugin install hook\n if (plugin.install) {\n await plugin.install(pluginContext)\n }\n\n // Execute plugin install hook\n await this.hooks.execute(HOOKS.PLUGIN_INSTALL, {\n plugin: plugin.name,\n version: plugin.version,\n context: pluginContext\n })\n\n console.info(`Plugin installed successfully: ${plugin.name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to install plugin ${plugin.name}:`, errorMessage)\n \n // Update status with error\n const status = this.registry.getStatus(plugin.name)\n if (status) {\n this.updatePluginStatus(plugin.name, {\n hasErrors: true,\n errors: [...(status.errors || []), errorMessage],\n lastError: errorMessage\n })\n }\n \n throw error\n }\n }\n\n /**\n * Uninstall a plugin\n */\n async uninstall(name: string): Promise {\n console.info(`Uninstalling plugin: ${name}`)\n\n const plugin = this.registry.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Deactivate plugin first\n const status = this.registry.getStatus(name)\n if (status?.active) {\n await this.registry.deactivate(name)\n }\n\n // Create plugin context\n const config = this.registry.getConfig(name) || { enabled: false }\n const pluginContext: PluginContext = {\n ...this.context,\n config,\n hooks: this.scopedHooks.get(name) || this.hooks,\n logger: this.createLogger(name)\n }\n\n // Run plugin uninstall hook\n if (plugin.uninstall) {\n await plugin.uninstall(pluginContext)\n }\n\n // Unregister plugin extensions\n await this.unregisterPluginExtensions(plugin)\n\n // Clean up scoped hooks\n const scopedHooks = this.scopedHooks.get(name)\n if (scopedHooks && 'unregisterAll' in scopedHooks) {\n scopedHooks.unregisterAll()\n }\n this.scopedHooks.delete(name)\n\n // Remove plugin routes\n this.pluginRoutes.delete(name)\n\n // Execute plugin uninstall hook\n await this.hooks.execute(HOOKS.PLUGIN_UNINSTALL, {\n plugin: name,\n context: pluginContext\n })\n\n // Unregister plugin\n await this.registry.unregister(name)\n\n console.info(`Plugin uninstalled successfully: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to uninstall plugin ${name}:`, errorMessage)\n throw error\n }\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus {\n const status = this.registry.getStatus(name)\n if (!status) {\n return {\n name,\n version: 'unknown',\n active: false,\n installed: false,\n hasErrors: false\n }\n }\n return status\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): PluginStatus[] {\n return Array.from(this.registry.getAllStatuses().values())\n }\n\n /**\n * Register plugin extensions (routes, middleware, etc.)\n */\n private async registerPluginExtensions(plugin: Plugin, _context: PluginContext): Promise {\n // Register routes\n if (plugin.routes) {\n const pluginApp = new Hono()\n \n for (const route of plugin.routes) {\n console.debug(`Registering plugin route: ${route.path}`)\n pluginApp.route(route.path, route.handler)\n }\n \n this.pluginRoutes.set(plugin.name, pluginApp)\n }\n\n // Register middleware\n if (plugin.middleware) {\n for (const middleware of plugin.middleware) {\n console.debug(`Registering plugin middleware: ${middleware.name}`)\n // Middleware registration would be handled by the main app\n }\n }\n\n // Register hooks\n if (plugin.hooks) {\n const scopedHooks = this.scopedHooks.get(plugin.name)\n for (const hook of plugin.hooks) {\n console.debug(`Registering plugin hook: ${hook.name}`)\n if (scopedHooks) {\n scopedHooks.register(hook.name, hook.handler, hook.priority)\n } else {\n this.hooks.register(hook.name, hook.handler, hook.priority)\n }\n }\n }\n\n // Register services\n if (plugin.services) {\n for (const service of plugin.services) {\n console.debug(`Registering plugin service: ${service.name}`)\n // Service registration would be handled by a service container\n }\n }\n\n // Register database models\n if (plugin.models) {\n for (const model of plugin.models) {\n console.debug(`Registering plugin model: ${model.name}`)\n // Model registration would involve database migrations\n }\n }\n }\n\n /**\n * Unregister plugin extensions\n */\n private async unregisterPluginExtensions(plugin: Plugin): Promise {\n // Clean up is mostly handled by the scoped systems\n console.debug(`Unregistering extensions for plugin: ${plugin.name}`)\n }\n\n /**\n * Update plugin status\n */\n private updatePluginStatus(name: string, updates: Partial): void {\n const current = this.registry.getStatus(name)\n if (current && 'updateStatus' in this.registry) {\n // This would require extending the registry interface\n console.debug(`Updating status for plugin: ${name}`, updates)\n }\n }\n\n /**\n * Create a logger for a plugin\n */\n private createLogger(pluginName: string): PluginLogger {\n return {\n debug: (message: string, data?: any) => {\n console.debug(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n info: (message: string, data?: any) => {\n console.info(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n warn: (message: string, data?: any) => {\n console.warn(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n error: (message: string, error?: Error, data?: any) => {\n console.error(`[Plugin:${pluginName}] ${message}`, error || '', data || '')\n }\n }\n }\n\n /**\n * Get plugin routes for mounting in main app\n */\n getPluginRoutes(): Map {\n return new Map(this.pluginRoutes)\n }\n\n /**\n * Get plugin middleware for main app\n */\n getPluginMiddleware(): Array<{ name: string; handler: any; priority: number; global: boolean }> {\n const middleware: Array<{ name: string; handler: any; priority: number; global: boolean }> = []\n \n for (const plugin of this.registry.getActive()) {\n if (plugin.middleware) {\n for (const mw of plugin.middleware) {\n middleware.push({\n name: `${plugin.name}:${mw.name}`,\n handler: mw.handler,\n priority: mw.priority || 10,\n global: mw.global || false\n })\n }\n }\n }\n \n // Sort by priority\n return middleware.sort((a, b) => a.priority - b.priority)\n }\n\n /**\n * Execute shutdown procedures\n */\n async shutdown(): Promise {\n console.info('Shutting down plugin system...')\n \n // Execute app shutdown hook\n await this.hooks.execute(HOOKS.APP_SHUTDOWN, {\n pluginManager: this\n })\n\n // Deactivate all active plugins\n const activePlugins = this.registry.getActive()\n for (const plugin of activePlugins.reverse()) { // Reverse order\n try {\n await this.registry.deactivate(plugin.name)\n } catch (error) {\n console.error(`Error deactivating plugin ${plugin.name}:`, error)\n }\n }\n\n console.info('Plugin system shutdown completed')\n }\n\n /**\n * Get plugin system statistics\n */\n getStats(): {\n registry: ReturnType\n hooks: Array<{ hookName: string; handlerCount: number }>\n routes: number\n middleware: number\n } {\n return {\n registry: (this.registry as PluginRegistryImpl).getStats(),\n hooks: (this.hooks as HookSystemImpl).getStats(),\n routes: this.pluginRoutes.size,\n middleware: this.getPluginMiddleware().length\n }\n }\n}","import type { Context, Next } from 'hono'\nimport { TurnstileService } from '../services/turnstile'\n\n/**\n * Middleware to verify Turnstile token on form submissions\n * \n * Usage:\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Token already verified, process form...\n * })\n * ```\n */\nexport async function verifyTurnstile(c: Context, next: Next) {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n console.error('Turnstile middleware: Database not available')\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n\n // Check if Turnstile is enabled\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n // Turnstile not enabled, allow through\n return next()\n }\n\n // Get token from request\n let token: string | undefined\n let body: any\n\n if (c.req.method === 'POST') {\n const contentType = c.req.header('content-type') || ''\n \n if (contentType.includes('application/json')) {\n body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n }\n\n if (!token) {\n return c.json({ \n error: 'Turnstile token missing',\n message: 'Please complete the verification challenge'\n }, 400)\n }\n\n // Verify token\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return c.json({ \n error: 'Turnstile verification failed',\n message: result.error || 'Verification failed. Please try again.'\n }, 403)\n }\n\n // Verification successful, continue\n return next()\n}\n\n/**\n * Middleware factory that allows custom error handling\n */\nexport function createTurnstileMiddleware(options?: {\n onError?: (c: Context, error: string) => Response\n onMissing?: (c: Context) => Response\n}) {\n return async (c: Context, next: Next) => {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n return options?.onError?.(c, 'Database not available') || \n c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n return next()\n }\n\n let token: string | undefined\n const contentType = c.req.header('content-type') || ''\n\n if (contentType.includes('application/json')) {\n const body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n\n if (!token) {\n return options?.onMissing?.(c) ||\n c.json({ error: 'Turnstile token missing' }, 400)\n }\n\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return options?.onError?.(c, result.error || 'Verification failed') ||\n c.json({ error: 'Turnstile verification failed', message: result.error }, 403)\n }\n\n return next()\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { TurnstileService } from './services/turnstile'\nimport { verifyTurnstile } from './middleware/verify'\nimport manifest from './manifest.json'\n\n/**\n * Cloudflare Turnstile Plugin\n * \n * Provides CAPTCHA-free bot protection using Cloudflare Turnstile.\n * Can be used with any form by adding the verifyTurnstile middleware.\n * \n * Settings are managed through the generic admin plugin interface.\n * No custom routes needed - the admin system automatically handles settings.\n * \n * @example\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Process form after Turnstile verification\n * })\n * ```\n */\n\n// Build the plugin - no custom routes, generic admin handles settings\nexport const turnstilePlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('turnstile', TurnstileService)\n .addSingleMiddleware('verifyTurnstile', verifyTurnstile, {\n description: 'Verify Cloudflare Turnstile token',\n global: false,\n })\n .build()\n\n// Export service and middleware for easy import\nexport { TurnstileService } from './services/turnstile'\nexport { verifyTurnstile, createTurnstileMiddleware } from './middleware/verify'\nexport { renderTurnstileWidget, renderInlineTurnstile, getTurnstileScript, renderExplicitTurnstile } from './components/widget'\nexport type { TurnstileSettings, TurnstileVerificationResponse } from './services/turnstile'\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-TAOOLOUH.cjs b/packages/core/dist/chunk-V4V54BY3.cjs similarity index 93% rename from packages/core/dist/chunk-TAOOLOUH.cjs rename to packages/core/dist/chunk-V4V54BY3.cjs index b38cdc318..bbffb3673 100644 --- a/packages/core/dist/chunk-TAOOLOUH.cjs +++ b/packages/core/dist/chunk-V4V54BY3.cjs @@ -1,7 +1,7 @@ 'use strict'; -var chunk656GGECX_cjs = require('./chunk-656GGECX.cjs'); -var chunkICMNCCX2_cjs = require('./chunk-ICMNCCX2.cjs'); +var chunkQOZZJZ76_cjs = require('./chunk-QOZZJZ76.cjs'); +var chunk7KR6GOY3_cjs = require('./chunk-7KR6GOY3.cjs'); var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs'); var jwt = require('hono/jwt'); var cookie = require('hono/cookie'); @@ -57,23 +57,23 @@ function bootstrapMiddleware(config = {}) { try { console.log("[Bootstrap] Starting system initialization..."); console.log("[Bootstrap] Running database migrations..."); - const migrationService = new chunkICMNCCX2_cjs.MigrationService(c.env.DB); + const migrationService = new chunk7KR6GOY3_cjs.MigrationService(c.env.DB); await migrationService.runPendingMigrations(); console.log("[Bootstrap] Syncing collection configurations..."); try { - await chunk656GGECX_cjs.syncCollections(c.env.DB); + await chunkQOZZJZ76_cjs.syncCollections(c.env.DB); } catch (error) { console.error("[Bootstrap] Error syncing collections:", error); } console.log("[Bootstrap] Syncing form collections..."); try { - await chunk656GGECX_cjs.syncAllFormCollections(c.env.DB); + await chunkQOZZJZ76_cjs.syncAllFormCollections(c.env.DB); } catch (error) { console.error("[Bootstrap] Error syncing form collections:", error); } if (!config.plugins?.disableAll) { console.log("[Bootstrap] Bootstrapping core plugins..."); - const bootstrapService = new chunk656GGECX_cjs.PluginBootstrapService(c.env.DB); + const bootstrapService = new chunkQOZZJZ76_cjs.PluginBootstrapService(c.env.DB); const needsBootstrap = await bootstrapService.isBootstrapNeeded(); if (needsBootstrap) { await bootstrapService.bootstrapCorePlugins(); @@ -200,7 +200,7 @@ async function verifyHs256Signature(token, secret) { return false; } } -var AuthManager = class _AuthManager { +var AuthManager = class { static async generateToken(userId, email, role, secret, expiresInSeconds) { const ttl = expiresInSeconds && expiresInSeconds > 0 ? Math.floor(expiresInSeconds) : DEFAULT_JWT_EXPIRES_IN_SECONDS; const now = Math.floor(Date.now() / 1e3); @@ -216,13 +216,6 @@ var AuthManager = class _AuthManager { /** * Verify a token's signature and expiration. * - * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the - * `secret` argument. If omitted, this falls back to a development-only - * placeholder secret — tokens signed with the real `JWT_SECRET` will then - * silently fail verification. From inside a Hono handler prefer - * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction - * and pulls the secret from `c.env` for you. - * * If `graceSeconds` > 0, tokens whose `exp` is within the grace window * (i.e. expired by no more than `graceSeconds`) are still returned. This * supports a sliding-session refresh endpoint that accepts recently-expired @@ -258,26 +251,6 @@ var AuthManager = class _AuthManager { return null; } } - /** - * Verify the JWT on an incoming Hono request using the `JWT_SECRET` - * binding from `c.env`. Reads the token from the `Authorization: Bearer …` - * header first, then falls back to the `auth_token` cookie. Returns the - * decoded payload, or null when the token is missing, malformed, expired, - * or signed with a different secret. - * - * Use this from custom Hono routes mounted alongside SonicJS — it - * resolves the secret the same way `requireAuth()` does, without forcing - * the caller to plumb it through manually. - */ - static async verifyAuthRequest(c) { - let token = c.req.header("Authorization")?.replace("Bearer ", ""); - if (!token) { - token = cookie.getCookie(c, "auth_token"); - } - if (!token) return null; - const secret = c.env?.JWT_SECRET; - return await _AuthManager.verifyToken(token, secret); - } static async hashPassword(password) { const iterations = 1e5; const salt = new Uint8Array(16); @@ -745,5 +718,5 @@ exports.securityHeadersMiddleware = securityHeadersMiddleware; exports.securityLoggingMiddleware = securityLoggingMiddleware; exports.validateCsrfToken = validateCsrfToken; exports.verifySecurityConfig = verifySecurityConfig; -//# sourceMappingURL=chunk-TAOOLOUH.cjs.map -//# sourceMappingURL=chunk-TAOOLOUH.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-V4V54BY3.cjs.map +//# sourceMappingURL=chunk-V4V54BY3.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-V4V54BY3.cjs.map b/packages/core/dist/chunk-V4V54BY3.cjs.map new file mode 100644 index 000000000..1ca40d50b --- /dev/null +++ b/packages/core/dist/chunk-V4V54BY3.cjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/middleware/bootstrap.ts","../src/middleware/auth.ts","../src/middleware/metrics.ts","../src/middleware/csrf.ts","../src/middleware/rate-limit.ts","../src/middleware/security-headers.ts","../src/middleware/index.ts"],"names":["MigrationService","syncCollections","syncAllFormCollections","PluginBootstrapService","sign","verify","result","setCookie","getCookie","metricsTracker","JWT_SECRET_FALLBACK"],"mappings":"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","file":"chunk-V4V54BY3.cjs","sourcesContent":["import { Context, Next } from \"hono\";\nimport { syncCollections } from \"../services/collection-sync\";\nimport { syncAllFormCollections } from \"../services/form-collection-sync\";\nimport { MigrationService } from \"../services/migrations\";\nimport { PluginBootstrapService } from \"../services/plugin-bootstrap\";\nimport type { SonicJSConfig } from \"../app\";\n\ntype Bindings = {\n DB: D1Database;\n KV: KVNamespace;\n JWT_SECRET?: string;\n CORS_ORIGINS?: string;\n ENVIRONMENT?: string;\n};\n\n// Track if bootstrap has been run in this worker instance\nlet bootstrapComplete = false;\n\n/**\n * Verify security-critical environment configuration at startup.\n * Logs warnings in development, throws in production to prevent\n * insecure deployments from silently running.\n */\nexport function verifySecurityConfig(env: Bindings): void {\n const warnings: string[] = [];\n\n // Check JWT secret\n if (!env.JWT_SECRET) {\n warnings.push(\n \"JWT_SECRET is not set — using hardcoded fallback. Set via `wrangler secret put JWT_SECRET`\"\n );\n } else if (env.JWT_SECRET.includes(\"change-in-production\")) {\n warnings.push(\n \"JWT_SECRET contains the default value — tokens are forgeable. Generate a strong random secret\"\n );\n }\n\n // Check CORS origins\n if (!env.CORS_ORIGINS) {\n warnings.push(\n \"CORS_ORIGINS is not set — all cross-origin API requests will be rejected\"\n );\n }\n\n // Check environment designation\n if (!env.ENVIRONMENT) {\n warnings.push(\n \"ENVIRONMENT is not set — HSTS header will not be applied. Set to \\\"production\\\" or \\\"development\\\"\"\n );\n }\n\n if (warnings.length === 0) {\n return;\n }\n\n const isProduction = env.ENVIRONMENT === \"production\";\n\n for (const warning of warnings) {\n console.warn(`[SonicJS Security] ${warning}`);\n }\n\n if (isProduction) {\n // In production, a missing or default JWT_SECRET is a hard failure —\n // every token issued would be forgeable by anyone reading the source code.\n const hasCritical =\n !env.JWT_SECRET || env.JWT_SECRET.includes(\"change-in-production\");\n if (hasCritical) {\n throw new Error(\n \"[SonicJS Security] CRITICAL: Production deployment is missing a secure JWT_SECRET. \" +\n \"Set it via `wrangler secret put JWT_SECRET` before deploying.\"\n );\n }\n }\n}\n\n/**\n * Bootstrap middleware that ensures system initialization\n * Runs once per worker instance\n */\nexport function bootstrapMiddleware(config: SonicJSConfig = {}) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n // Skip if already bootstrapped in this worker instance\n if (bootstrapComplete) {\n return next();\n }\n\n // Skip bootstrap for static assets and health checks\n const path = c.req.path;\n if (\n path.startsWith(\"/images/\") ||\n path.startsWith(\"/assets/\") ||\n path === \"/health\" ||\n path.endsWith(\".js\") ||\n path.endsWith(\".css\") ||\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".ico\")\n ) {\n return next();\n }\n\n try {\n console.log(\"[Bootstrap] Starting system initialization...\");\n\n // 1. Run database migrations first\n console.log(\"[Bootstrap] Running database migrations...\");\n const migrationService = new MigrationService(c.env.DB);\n await migrationService.runPendingMigrations();\n\n // 2. Sync collection configurations\n console.log(\"[Bootstrap] Syncing collection configurations...\");\n try {\n await syncCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing collections:\", error);\n // Continue bootstrap even if collection sync fails\n }\n\n // 2b. Sync form-derived shadow collections\n console.log(\"[Bootstrap] Syncing form collections...\");\n try {\n await syncAllFormCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing form collections:\", error);\n }\n\n // 3. Bootstrap core plugins (unless disableAll is set)\n if (!config.plugins?.disableAll) {\n console.log(\"[Bootstrap] Bootstrapping core plugins...\");\n const bootstrapService = new PluginBootstrapService(c.env.DB);\n\n // Check if bootstrap is needed\n const needsBootstrap = await bootstrapService.isBootstrapNeeded();\n if (needsBootstrap) {\n await bootstrapService.bootstrapCorePlugins();\n }\n } else {\n console.log(\"[Bootstrap] Plugin bootstrap skipped (disableAll is true)\");\n }\n\n // Mark bootstrap as complete for this worker instance\n bootstrapComplete = true;\n console.log(\"[Bootstrap] System initialization completed\");\n } catch (error) {\n console.error(\"[Bootstrap] Error during system initialization:\", error);\n // Don't prevent the app from starting, but log the error\n }\n\n // 4. Verify security configuration (outside try/catch so critical\n // errors in production propagate and prevent insecure deployments)\n verifySecurityConfig(c.env as Bindings);\n\n return next();\n };\n}\n\n/**\n * Reset bootstrap flag (useful for testing)\n */\nexport function resetBootstrap() {\n bootstrapComplete = false;\n}\n","import { sign, verify } from 'hono/jwt'\nimport { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\ntype JWTPayload = {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n}\n\n// Fallback JWT secret for local development only (no wrangler secret set)\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// Default JWT TTL: 30 days. Can be overridden via JWT_EXPIRES_IN env var.\nconst DEFAULT_JWT_EXPIRES_IN_SECONDS = 60 * 60 * 24 * 30\n\n/**\n * Parse a TTL string like \"30d\", \"12h\", \"3600s\", or a bare number-of-seconds\n * into a seconds value. Returns null if the input is missing/unparseable.\n */\nfunction parseDuration(input: string | number | undefined | null): number | null {\n if (input === undefined || input === null || input === '') return null\n if (typeof input === 'number' && Number.isFinite(input) && input > 0) {\n return Math.floor(input)\n }\n const raw = String(input).trim()\n if (/^\\d+$/.test(raw)) {\n const n = parseInt(raw, 10)\n return n > 0 ? n : null\n }\n const match = raw.match(/^(\\d+)\\s*(s|sec|secs|seconds|m|min|mins|minutes|h|hr|hrs|hours|d|day|days)$/i)\n if (!match) return null\n const value = parseInt(match[1]!, 10)\n const unit = match[2]!.toLowerCase()\n if (unit.startsWith('s')) return value\n if (unit.startsWith('m')) return value * 60\n if (unit.startsWith('h')) return value * 60 * 60\n if (unit.startsWith('d')) return value * 60 * 60 * 24\n return null\n}\n\n/**\n * Resolve the JWT expiry in seconds from the environment.\n * Honors `JWT_EXPIRES_IN` (seconds or \"30d\"/\"12h\"/\"3600s\") with a 30-day default.\n */\nexport function getJwtExpirySeconds(env?: Record | null): number {\n const configured = parseDuration(env?.JWT_EXPIRES_IN)\n return configured ?? DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the JWT expiry in seconds. Precedence: `JWT_EXPIRES_IN` env var\n * (authoritative ceiling) → `settings.security.jwtExpiresIn` DB value\n * (admin-configurable) → 30-day default.\n *\n * The env var wins so operators can cap runtime overrides — admins can adjust\n * the TTL from /admin/settings/security, but an env var, if set, always wins.\n * DB failures fall back to env/default so auth never breaks if the settings\n * table is unreachable.\n */\nexport async function getJwtExpirySecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const envParsed = parseDuration(env?.JWT_EXPIRES_IN)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtExpiresIn'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* value may already be a bare string */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtExpiresIn from settings, falling back to default:', err)\n }\n }\n return DEFAULT_JWT_EXPIRES_IN_SECONDS\n}\n\n/**\n * Resolve the refresh grace window (seconds) for `/auth/refresh`. Precedence:\n * `JWT_REFRESH_GRACE_SECONDS` env var → `settings.security.jwtRefreshGraceSeconds`\n * DB value → 7-day default.\n */\nexport async function getJwtRefreshGraceSecondsFromDb(\n db: { prepare: (query: string) => any } | null | undefined,\n env?: Record | null\n): Promise {\n const DEFAULT_GRACE = 60 * 60 * 24 * 7\n const envParsed = parseDuration(env?.JWT_REFRESH_GRACE_SECONDS)\n if (envParsed) return envParsed\n\n if (db) {\n try {\n const row = await db\n .prepare(\"SELECT value FROM settings WHERE category = 'security' AND key = 'jwtRefreshGraceSeconds'\")\n .first() as { value: string } | null\n if (row?.value) {\n let stored: any = row.value\n try { stored = JSON.parse(row.value) } catch { /* may be bare */ }\n const parsed = parseDuration(stored)\n if (parsed) return parsed\n }\n } catch (err) {\n console.warn('Failed to read jwtRefreshGraceSeconds from settings:', err)\n }\n }\n return DEFAULT_GRACE\n}\n\n/**\n * Decode a JWT payload without verifying the signature. Returns null on any\n * parsing failure. Callers MUST independently verify the signature before\n * trusting this value — used from the grace-window refresh path where the\n * signature is verified explicitly via `verifyHs256Signature`.\n */\nfunction decodeJwtPayload(token: string): JWTPayload | null {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return null\n const b64 = parts[1]!.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const json = atob(padded)\n const obj = JSON.parse(json)\n if (!obj || typeof obj.exp !== 'number') return null\n return obj as JWTPayload\n } catch {\n return null\n }\n}\n\nfunction base64UrlToBytes(b64url: string): Uint8Array {\n const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4)\n const bin = atob(padded)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return bytes\n}\n\n/**\n * Verify a JWT's HS256 signature using Web Crypto, independent of hono/jwt.\n * Returns true iff the signature matches the header.payload portion.\n */\nasync function verifyHs256Signature(token: string, secret: string): Promise {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return false\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n )\n const signature = base64UrlToBytes(parts[2]!)\n const message = encoder.encode(`${parts[0]}.${parts[1]}`)\n return await crypto.subtle.verify('HMAC', key, signature, message)\n } catch {\n return false\n }\n}\n\nexport class AuthManager {\n static async generateToken(\n userId: string,\n email: string,\n role: string,\n secret?: string,\n expiresInSeconds?: number\n ): Promise {\n const ttl = expiresInSeconds && expiresInSeconds > 0\n ? Math.floor(expiresInSeconds)\n : DEFAULT_JWT_EXPIRES_IN_SECONDS\n const now = Math.floor(Date.now() / 1000)\n const payload: JWTPayload = {\n userId,\n email,\n role,\n exp: now + ttl,\n iat: now\n }\n\n return await sign(payload, secret || JWT_SECRET_FALLBACK, 'HS256')\n }\n\n /**\n * Verify a token's signature and expiration.\n *\n * If `graceSeconds` > 0, tokens whose `exp` is within the grace window\n * (i.e. expired by no more than `graceSeconds`) are still returned. This\n * supports a sliding-session refresh endpoint that accepts recently-expired\n * tokens. Signature failures always return null.\n */\n static async verifyToken(\n token: string,\n secret?: string,\n graceSeconds: number = 0\n ): Promise {\n const effectiveSecret = secret || JWT_SECRET_FALLBACK\n try {\n let payload: JWTPayload | null = null\n try {\n payload = await verify(token, effectiveSecret, 'HS256') as JWTPayload\n } catch (verifyError: any) {\n // hono/jwt checks `exp` before signature, so a bad-signature token\n // that happens to be expired will throw JwtTokenExpired here. For\n // the grace window, we still require a valid HS256 signature before\n // accepting the payload.\n const name = verifyError?.name || ''\n const message = String(verifyError?.message || '')\n const isExpired = name === 'JwtTokenExpired' || message.includes('expired')\n if (!isExpired || graceSeconds <= 0) {\n throw verifyError\n }\n const signatureValid = await verifyHs256Signature(token, effectiveSecret)\n if (!signatureValid) return null\n const decoded = decodeJwtPayload(token)\n if (!decoded) return null\n payload = decoded\n }\n\n if (!payload) return null\n\n const now = Math.floor(Date.now() / 1000)\n if (payload.exp < now - Math.max(0, Math.floor(graceSeconds))) {\n return null\n }\n\n return payload\n } catch (error) {\n console.error('Token verification failed:', error)\n return null\n }\n }\n\n static async hashPassword(password: string): Promise {\n const iterations = 100000\n const salt = new Uint8Array(16)\n crypto.getRandomValues(salt)\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const saltHex = Array.from(salt).map(b => b.toString(16).padStart(2, '0')).join('')\n const hashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n return `pbkdf2:${iterations}:${saltHex}:${hashHex}`\n }\n\n static async hashPasswordLegacy(password: string): Promise {\n const encoder = new TextEncoder()\n const data = encoder.encode(password + 'salt-change-in-production')\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n static async verifyPassword(password: string, storedHash: string): Promise {\n if (storedHash.startsWith('pbkdf2:')) {\n // PBKDF2 format: pbkdf2:::\n const parts = storedHash.split(':')\n if (parts.length !== 4) return false\n\n const iterationsStr = parts[1]!\n const saltHex = parts[2]!\n const expectedHashHex = parts[3]!\n const iterations = parseInt(iterationsStr, 10)\n\n const saltBytes = saltHex.match(/.{2}/g)\n if (!saltBytes) return false\n const salt = new Uint8Array(saltBytes.map(byte => parseInt(byte, 16)))\n\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n )\n\n const hashBuffer = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n )\n\n const actualHashHex = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')\n\n // Constant-time comparison\n if (actualHashHex.length !== expectedHashHex.length) return false\n let result = 0\n for (let i = 0; i < actualHashHex.length; i++) {\n result |= actualHashHex.charCodeAt(i) ^ expectedHashHex.charCodeAt(i)\n }\n return result === 0\n }\n\n // Legacy SHA-256 format (no colons in hash)\n const legacyHash = await this.hashPasswordLegacy(password)\n // Constant-time comparison for legacy too\n if (legacyHash.length !== storedHash.length) return false\n let result = 0\n for (let i = 0; i < legacyHash.length; i++) {\n result |= legacyHash.charCodeAt(i) ^ storedHash.charCodeAt(i)\n }\n return result === 0\n }\n\n static isLegacyHash(storedHash: string): boolean {\n return !storedHash.startsWith('pbkdf2:')\n }\n\n /**\n * Set authentication cookie - useful for plugins implementing alternative auth methods\n * @param c - Hono context\n * @param token - JWT token to set in cookie\n * @param options - Optional cookie configuration\n */\n static setAuthCookie(c: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void {\n setCookie(c, 'auth_token', token, {\n httpOnly: options?.httpOnly ?? true,\n secure: options?.secure ?? true,\n sameSite: options?.sameSite ?? 'Strict',\n maxAge: options?.maxAge ?? getJwtExpirySeconds((c as any)?.env)\n })\n }\n}\n\n// Middleware to require authentication\nexport const requireAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n // Try to get token from Authorization header\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n\n // If no header token, try cookie\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n\n if (!token) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n // Try to get cached token verification from KV\n const kv = c.env?.KV\n let payload: JWTPayload | null = null\n\n if (kv) {\n const cacheKey = `auth:${token.substring(0, 20)}` // Use token prefix as key\n const cached = await kv.get(cacheKey, 'json')\n if (cached) {\n payload = cached as JWTPayload\n }\n }\n\n // If not cached, verify token\n if (!payload) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n payload = await AuthManager.verifyToken(token, jwtSecret)\n\n // Cache the verified payload for 5 minutes\n if (payload && kv) {\n const cacheKey = `auth:${token.substring(0, 20)}`\n await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 })\n }\n }\n\n if (!payload) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Your session has expired, please login again')\n }\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Add user info to context\n c.set('user', payload)\n\n return await next()\n } catch (error) {\n console.error('Auth middleware error:', error)\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Authentication failed, please login again')\n }\n return c.json({ error: 'Authentication failed' }, 401)\n }\n }\n}\n\n// Middleware to require specific role\nexport const requireRole = (requiredRole: string | string[]) => {\n return async (c: Context, next: Next) => {\n const user = c.get('user') as JWTPayload\n \n if (!user) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n \n const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]\n \n if (!roles.includes(user.role)) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=You do not have permission to access this area')\n }\n return c.json({ error: 'Insufficient permissions' }, 403)\n }\n \n return await next()\n }\n}\n\n// Optional auth middleware (doesn't block if no token)\nexport const optionalAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n \n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n \n if (token) {\n const jwtSecret = (c.env as any)?.JWT_SECRET\n const payload = await AuthManager.verifyToken(token, jwtSecret)\n if (payload) {\n c.set('user', payload)\n }\n }\n \n return await next()\n } catch (error) {\n // Don't block on auth errors in optional auth\n console.error('Optional auth error:', error)\n return await next()\n }\n }\n}\n","import { MiddlewareHandler } from 'hono'\nimport { metricsTracker } from '../utils/metrics'\n\n/**\n * Middleware to track all HTTP requests for real-time analytics\n * Excludes the metrics endpoint itself to avoid inflating the count\n */\nexport const metricsMiddleware = (): MiddlewareHandler => {\n return async (c, next) => {\n const path = new URL(c.req.url).pathname\n\n // Don't track the metrics endpoint itself to avoid self-inflating counts\n if (path !== '/admin/dashboard/api/metrics') {\n metricsTracker.recordRequest()\n }\n\n // Continue with the request\n await next()\n }\n}\n","/**\n * CSRF Protection Middleware — Signed Double-Submit Cookie\n *\n * Stateless CSRF protection for Cloudflare Workers (no session store needed).\n * Token format: `.` where HMAC-SHA256 is keyed with JWT_SECRET.\n *\n * Flow:\n * GET — ensureCsrfCookie(): reuse existing valid cookie or set a new one\n * POST/PUT/DELETE/PATCH — validate X-CSRF-Token header === csrf_token cookie, HMAC valid\n *\n * Exempt:\n * - Safe methods (GET, HEAD, OPTIONS)\n * - Auth routes that create sessions (/auth/login*, /auth/register*, etc.)\n * - Public form submissions (/forms/*, /api/forms/*) — NOT /admin/forms/*\n * - Requests with no auth_token cookie (Bearer-only or API-key-only)\n */\n\nimport type { Context, Next } from 'hono'\nimport { getCookie, setCookie } from 'hono/cookie'\n\n// Fallback secret — mirrors auth.ts behavior for local dev without wrangler secret\nconst JWT_SECRET_FALLBACK = 'your-super-secret-jwt-key-change-in-production'\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Convert ArrayBuffer to URL-safe base64 (no padding). */\nexport function arrayBufferToBase64Url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!)\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Import a string key for HMAC-SHA256. */\nasync function getHmacKey(secret: string): Promise {\n const encoder = new TextEncoder()\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify']\n )\n}\n\n// ============================================================================\n// Token Generation & Validation\n// ============================================================================\n\n/**\n * Generate a signed CSRF token: `.`\n * - nonce = 32 random bytes, base64url-encoded\n * - signature = HMAC-SHA256(nonce, secret), base64url-encoded\n */\nexport async function generateCsrfToken(secret: string): Promise {\n const nonceBytes = new Uint8Array(32)\n crypto.getRandomValues(nonceBytes)\n const nonce = arrayBufferToBase64Url(nonceBytes.buffer)\n\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(nonce))\n const signature = arrayBufferToBase64Url(signatureBuffer)\n\n return `${nonce}.${signature}`\n}\n\n/**\n * Validate a signed CSRF token.\n *\n * Checks that the token has the correct `.` format and that\n * the HMAC signature is valid for the given secret. Uses crypto.subtle.verify\n * which provides constant-time comparison.\n *\n * NOTE: No expiry check here — by design. The security property of signed\n * double-submit comes from the unpredictability of the nonce + the\n * secret-bound HMAC, not from time-bounding. The cookie's maxAge (86400s)\n * handles expiry at the browser level.\n */\nexport async function validateCsrfToken(token: string, secret: string): Promise {\n if (!token || typeof token !== 'string') return false\n\n const dotIndex = token.indexOf('.')\n if (dotIndex === -1) return false\n\n const nonce = token.substring(0, dotIndex)\n const signature = token.substring(dotIndex + 1)\n\n if (!nonce || !signature) return false\n\n try {\n const key = await getHmacKey(secret)\n const encoder = new TextEncoder()\n\n // Decode the signature from base64url\n const sigPadded = signature.replace(/-/g, '+').replace(/_/g, '/')\n const sigBinary = atob(sigPadded)\n const sigBytes = new Uint8Array(sigBinary.length)\n for (let i = 0; i < sigBinary.length; i++) {\n sigBytes[i] = sigBinary.charCodeAt(i)\n }\n\n // crypto.subtle.verify is constant-time\n return await crypto.subtle.verify('HMAC', key, sigBytes.buffer, encoder.encode(nonce))\n } catch {\n return false\n }\n}\n\n// ============================================================================\n// Default Exempt Paths\n// ============================================================================\n\nconst DEFAULT_EXEMPT_PATHS = [\n '/auth/login',\n '/auth/register',\n '/auth/seed-admin',\n '/auth/accept-invitation',\n '/auth/reset-password',\n '/auth/request-password-reset',\n '/auth/otp',\n '/auth/magic-link',\n '/auth/verify',\n '/api/stripe/webhook',\n '/api/events',\n]\n\n/**\n * Check whether a request path is exempt from CSRF validation.\n * - Exact match or startsWith for auth routes (e.g. /auth/login/form)\n * - /forms/* and /api/forms/* are exempt (public submissions)\n * - /api/search* is exempt (read-only POST for complex query params)\n * - /admin/forms/* is NOT exempt\n */\nfunction isExemptPath(path: string, extraExemptPaths: string[] = []): boolean {\n // Public form routes — NOT /admin/forms/*\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/') || path === '/forms' || path === '/api/forms') {\n return true\n }\n\n // Search API — read-only POST (includes /api/search/click, /api/search/facet-click)\n if (path.startsWith('/api/search')) {\n return true\n }\n\n const allExempt = [...DEFAULT_EXEMPT_PATHS, ...extraExemptPaths]\n for (const exempt of allExempt) {\n if (path === exempt || path.startsWith(exempt + '/')) {\n return true\n }\n }\n\n return false\n}\n\n// ============================================================================\n// Middleware\n// ============================================================================\n\nexport interface CsrfOptions {\n /** Additional paths to exempt from CSRF validation. */\n exemptPaths?: string[]\n}\n\n/**\n * CSRF protection middleware (Signed Double-Submit Cookie).\n *\n * - GET/HEAD/OPTIONS: ensure a valid csrf_token cookie exists\n * - POST/PUT/DELETE/PATCH: validate X-CSRF-Token header matches cookie, HMAC valid\n * - Exempt: auth routes, public /forms/*, Bearer-only, API-key-only\n */\nexport function csrfProtection(options: CsrfOptions = {}) {\n return async (c: Context, next: Next): Promise => {\n const method = c.req.method.toUpperCase()\n const path = new URL(c.req.url).pathname\n const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK\n\n // Warn if using fallback secret in production\n if (c.env?.ENVIRONMENT === 'production' && !c.env?.JWT_SECRET) {\n console.warn(\n '[CSRF] WARNING: JWT_SECRET is not set in production. ' +\n 'CSRF tokens are signed with the fallback key, which is insecure.'\n )\n }\n\n // Safe methods — just ensure cookie, then pass through\n if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS') {\n await ensureCsrfCookie(c, secret)\n await next()\n return\n }\n\n // Exempt paths — pass through without validation\n if (isExemptPath(path, options.exemptPaths)) {\n await next()\n return\n }\n\n // Bearer-only or API-key-only requests (no auth_token cookie) — exempt\n const authCookie = getCookie(c, 'auth_token')\n if (!authCookie) {\n await next()\n return\n }\n\n // Requests with an Authorization header use token-based auth — the cookie\n // is incidental and CSRF protection is unnecessary (the attacker cannot\n // forge the Authorization header from a cross-origin page).\n const authHeader = c.req.header('Authorization')\n if (authHeader) {\n await next()\n return\n }\n\n // State-changing request with cookie auth — validate CSRF\n const cookieToken = getCookie(c, 'csrf_token')\n let headerToken = c.req.header('X-CSRF-Token')\n\n // Fallback: check _csrf field in form-encoded body (regular HTML form submissions)\n if (!headerToken) {\n const contentType = c.req.header('Content-Type') || ''\n if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n try {\n const body = await c.req.parseBody()\n headerToken = body['_csrf'] as string | undefined\n } catch {\n // Body not parseable — leave headerToken undefined\n }\n }\n }\n\n if (!cookieToken || !headerToken) {\n return csrfError(c, 'CSRF token missing')\n }\n\n if (cookieToken !== headerToken) {\n return csrfError(c, 'CSRF token mismatch')\n }\n\n const isValid = await validateCsrfToken(cookieToken, secret)\n if (!isValid) {\n return csrfError(c, 'CSRF token invalid')\n }\n\n await next()\n }\n}\n\n/**\n * Ensure a valid CSRF cookie exists. Check-then-reuse: if the existing cookie\n * has a valid HMAC signature, reuse it (no new Set-Cookie header). Only\n * generate a fresh token when the cookie is missing or has an invalid signature.\n */\nasync function ensureCsrfCookie(c: Context, secret: string): Promise {\n const existing = getCookie(c, 'csrf_token')\n\n if (existing) {\n const isValid = await validateCsrfToken(existing, secret)\n if (isValid) {\n // Reuse existing valid token — no Set-Cookie needed\n c.set('csrfToken', existing)\n return\n }\n }\n\n // Generate fresh token\n const token = await generateCsrfToken(secret)\n c.set('csrfToken', token)\n\n const isDev = c.env?.ENVIRONMENT === 'development' || !c.env?.ENVIRONMENT\n setCookie(c, 'csrf_token', token, {\n httpOnly: false, // JS must read this cookie\n secure: !isDev,\n sameSite: 'Strict',\n path: '/',\n maxAge: 86400, // 24 hours — browser-side expiry\n })\n}\n\n/** Return a 403 CSRF error — HTML for browser requests, JSON for API. */\nfunction csrfError(c: Context, message: string): Response {\n const accept = c.req.header('Accept') || ''\n if (accept.includes('text/html')) {\n return c.html(\n `403 Forbidden` +\n `

403 Forbidden

${message}

`,\n 403\n )\n }\n return c.json({ error: message, status: 403 }, 403)\n}\n","import { Context, Next } from 'hono'\n\ninterface RateLimitOptions {\n max: number\n windowMs: number\n keyPrefix: string\n}\n\ninterface RateLimitEntry {\n count: number\n resetAt: number\n}\n\n/**\n * KV-based sliding window rate limiter middleware.\n * Gracefully skips if CACHE_KV binding is not available.\n */\nexport function rateLimit(options: RateLimitOptions) {\n const { max, windowMs, keyPrefix } = options\n\n return async (c: Context, next: Next) => {\n const kv = (c.env as any)?.CACHE_KV\n if (!kv) {\n // No KV binding available — skip rate limiting\n return await next()\n }\n\n const ip = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const key = `ratelimit:${keyPrefix}:${ip}`\n\n try {\n const now = Date.now()\n const stored = await kv.get(key, 'json') as RateLimitEntry | null\n\n let entry: RateLimitEntry\n if (stored && stored.resetAt > now) {\n entry = stored\n } else {\n entry = { count: 0, resetAt: now + windowMs }\n }\n\n entry.count++\n\n // Calculate TTL in seconds (KV expiration)\n const ttlSeconds = Math.ceil((entry.resetAt - now) / 1000)\n\n if (entry.count > max) {\n // Store the updated count even when rejecting\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n const retryAfter = Math.ceil((entry.resetAt - now) / 1000)\n c.header('Retry-After', String(retryAfter))\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', '0')\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n return c.json({ error: 'Too many requests. Please try again later.' }, 429)\n }\n\n await kv.put(key, JSON.stringify(entry), { expirationTtl: Math.max(ttlSeconds, 60) })\n\n c.header('X-RateLimit-Limit', String(max))\n c.header('X-RateLimit-Remaining', String(max - entry.count))\n c.header('X-RateLimit-Reset', String(Math.ceil(entry.resetAt / 1000)))\n\n return await next()\n } catch (error) {\n // Rate limiting should never break the app\n console.error('Rate limiter error (non-fatal):', error)\n return await next()\n }\n }\n}\n","import { Context, Next } from 'hono'\n\n/**\n * Security headers middleware.\n * Sets standard security headers on every response.\n * Skips HSTS in development to avoid local dev issues.\n */\nexport const securityHeadersMiddleware = () => {\n return async (c: Context, next: Next) => {\n await next()\n\n c.header('X-Content-Type-Options', 'nosniff')\n c.header('X-Frame-Options', 'SAMEORIGIN')\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin')\n c.header('Permissions-Policy', 'camera=(), microphone=(), geolocation=()')\n\n // Only set HSTS in non-development environments\n const environment = (c.env as any)?.ENVIRONMENT\n if (environment !== 'development') {\n c.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains')\n }\n }\n}\n","/**\n * Middleware Module Exports\n *\n * Request processing middleware for SonicJS\n *\n * Note: Most middleware is currently in the monolith and will be migrated later.\n * For now, we only export the bootstrap middleware which is used for system initialization.\n */\n\n// Bootstrap middleware\nexport { bootstrapMiddleware, verifySecurityConfig } from './bootstrap'\n\n// Auth middleware\nexport {\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n getJwtExpirySeconds,\n getJwtExpirySecondsFromDb,\n getJwtRefreshGraceSecondsFromDb,\n} from './auth'\n\n// Metrics middleware\nexport { metricsMiddleware } from './metrics'\n\n// CSRF protection middleware\nexport { csrfProtection, generateCsrfToken, validateCsrfToken } from './csrf'\n\n// Rate limiting middleware\nexport { rateLimit } from './rate-limit'\n\n// Re-export types and functions that are referenced but implemented in monolith\n// These are placeholder exports to maintain API compatibility\nexport type Permission = string\nexport type UserPermissions = {\n userId: string\n permissions: Permission[]\n}\n\n// Middleware stubs - these return pass-through middleware that call next()\nexport const loggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const detailedLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const securityLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const performanceLoggingMiddleware: any = () => async (_c: any, next: any) => await next()\nexport const cacheHeaders: any = () => async (_c: any, next: any) => await next()\nexport const compressionMiddleware: any = async (_c: any, next: any) => await next()\nexport { securityHeadersMiddleware as securityHeaders } from './security-headers'\n\n// Other stubs\nexport const PermissionManager: any = {}\nexport const requirePermission: any = () => async (_c: any, next: any) => await next()\nexport const requireAnyPermission: any = () => async (_c: any, next: any) => await next()\nexport const logActivity: any = () => {}\nexport const requireActivePlugin: any = () => async (_c: any, next: any) => await next()\nexport const requireActivePlugins: any = () => async (_c: any, next: any) => await next()\nexport const getActivePlugins: any = () => []\nexport const isPluginActive: any = () => false\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-WAEQXGCX.cjs.map b/packages/core/dist/chunk-WAEQXGCX.cjs.map deleted file mode 100644 index 44f47d9b4..000000000 --- a/packages/core/dist/chunk-WAEQXGCX.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/db/schema.ts","../../../node_modules/src/constants.ts","../../../node_modules/src/utils.ts","../../../node_modules/src/column.ts","../../../node_modules/src/schema.ts","../src/services/logger.ts","../src/services/cache.ts","../src/services/settings.ts","../src/services/telemetry-service.ts","../src/services/route-metadata.ts"],"names":["__export","zod","z","integer","isTable","getTableColumns","getViewSelectedFields","is","Column","SQL","columns","isView","sqliteTable","text","drizzle","inArray","eq","like","gte","lte","and","count","asc","desc","getTelemetryConfig","sanitizeErrorMessage","sanitizeRoute","generateInstallationId","generateProjectId","inspectRoutes"],"mappings":"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","file":"chunk-WAEQXGCX.cjs","sourcesContent":["import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod';\n\n// Users table for authentication and user management\nexport const users = sqliteTable('users', {\n id: text('id').primaryKey(),\n email: text('email').notNull().unique(),\n username: text('username').notNull().unique(),\n firstName: text('first_name').notNull(),\n lastName: text('last_name').notNull(),\n passwordHash: text('password_hash'), // Hashed password, nullable for OAuth users\n role: text('role').notNull().default('viewer'), // 'admin', 'editor', 'author', 'viewer'\n avatar: text('avatar'),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n lastLoginAt: integer('last_login_at'),\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Content collections - dynamic schema definitions\nexport const collections = sqliteTable('collections', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n schema: text('schema', { mode: 'json' }).notNull(), // JSON schema definition\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false), // Config-managed collections cannot be edited in UI\n sourceType: text('source_type').default('user'), // 'user' (normal), 'form' (form-derived)\n sourceId: text('source_id'), // stores the form ID for form-derived collections\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content items - actual content data\nexport const content = sqliteTable('content', {\n id: text('id').primaryKey(),\n collectionId: text('collection_id').notNull().references(() => collections.id),\n slug: text('slug').notNull(),\n title: text('title').notNull(),\n data: text('data', { mode: 'json' }).notNull(), // JSON content data\n status: text('status').notNull().default('draft'), // 'draft', 'published', 'archived'\n publishedAt: integer('published_at', { mode: 'timestamp' }),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content versions for versioning system\nexport const contentVersions = sqliteTable('content_versions', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n version: integer('version').notNull(),\n data: text('data', { mode: 'json' }).notNull(),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Media/Files table\nexport const media = sqliteTable('media', {\n id: text('id').primaryKey(),\n filename: text('filename').notNull(),\n originalName: text('original_name').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n width: integer('width'),\n height: integer('height'),\n folder: text('folder').notNull().default('uploads'),\n r2Key: text('r2_key').notNull(), // R2 storage key\n publicUrl: text('public_url').notNull(), // CDN URL\n thumbnailUrl: text('thumbnail_url'),\n alt: text('alt'),\n caption: text('caption'),\n tags: text('tags', { mode: 'json' }), // JSON array of tags\n uploadedBy: text('uploaded_by').notNull().references(() => users.id),\n uploadedAt: integer('uploaded_at').notNull(),\n updatedAt: integer('updated_at'),\n publishedAt: integer('published_at'),\n scheduledAt: integer('scheduled_at'),\n archivedAt: integer('archived_at'),\n deletedAt: integer('deleted_at'),\n});\n\n// API tokens for programmatic access\nexport const apiTokens = sqliteTable('api_tokens', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n token: text('token').notNull().unique(),\n userId: text('user_id').notNull().references(() => users.id),\n permissions: text('permissions', { mode: 'json' }).notNull(), // Array of permissions\n expiresAt: integer('expires_at', { mode: 'timestamp' }),\n lastUsedAt: integer('last_used_at', { mode: 'timestamp' }),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n\n// Workflow history for content workflow tracking\nexport const workflowHistory = sqliteTable('workflow_history', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n action: text('action').notNull(),\n fromStatus: text('from_status').notNull(),\n toStatus: text('to_status').notNull(),\n userId: text('user_id').notNull().references(() => users.id),\n comment: text('comment'),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Plugin system tables\nexport const plugins = sqliteTable('plugins', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n version: text('version').notNull(),\n author: text('author').notNull(),\n category: text('category').notNull(),\n icon: text('icon'),\n status: text('status').notNull().default('inactive'), // 'active', 'inactive', 'error'\n isCore: integer('is_core', { mode: 'boolean' }).notNull().default(false),\n settings: text('settings', { mode: 'json' }),\n permissions: text('permissions', { mode: 'json' }),\n dependencies: text('dependencies', { mode: 'json' }),\n downloadCount: integer('download_count').notNull().default(0),\n rating: integer('rating').notNull().default(0),\n installedAt: integer('installed_at').notNull(),\n activatedAt: integer('activated_at'),\n lastUpdated: integer('last_updated').notNull(),\n errorMessage: text('error_message'),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n updatedAt: integer('updated_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginHooks = sqliteTable('plugin_hooks', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n hookName: text('hook_name').notNull(),\n handlerName: text('handler_name').notNull(),\n priority: integer('priority').notNull().default(10),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginRoutes = sqliteTable('plugin_routes', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n path: text('path').notNull(),\n method: text('method').notNull(),\n handlerName: text('handler_name').notNull(),\n middleware: text('middleware', { mode: 'json' }),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginAssets = sqliteTable('plugin_assets', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n assetType: text('asset_type').notNull(), // 'css', 'js', 'image', 'font'\n assetPath: text('asset_path').notNull(),\n loadOrder: integer('load_order').notNull().default(100),\n loadLocation: text('load_location').notNull().default('footer'), // 'header', 'footer'\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginActivityLog = sqliteTable('plugin_activity_log', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n action: text('action').notNull(),\n userId: text('user_id'),\n details: text('details', { mode: 'json' }),\n timestamp: integer('timestamp').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\n// Zod schemas for validation\nexport const insertUserSchema = createInsertSchema(users, {\n email: (schema: any) => schema.email(),\n firstName: (schema: any) => schema.min(1),\n lastName: (schema: any) => schema.min(1),\n username: (schema: any) => schema.min(3),\n});\n\nexport const selectUserSchema = createSelectSchema(users);\n\nexport const insertCollectionSchema = createInsertSchema(collections, {\n name: (schema: any) => schema.min(1).regex(/^[a-z0-9_]+$/, 'Collection name must be lowercase with underscores'),\n displayName: (schema: any) => schema.min(1),\n});\n\nexport const selectCollectionSchema = createSelectSchema(collections);\n\nexport const insertContentSchema = createInsertSchema(content, {\n slug: (schema: any) => schema.min(1).regex(/^[a-zA-Z0-9_-]+$/, 'Slug must contain only letters, numbers, underscores, and hyphens'),\n title: (schema: any) => schema.min(1),\n status: (schema: any) => schema,\n});\n\nexport const selectContentSchema = createSelectSchema(content);\n\nexport const insertMediaSchema = createInsertSchema(media, {\n filename: (schema: any) => schema.min(1),\n originalName: (schema: any) => schema.min(1),\n mimeType: (schema: any) => schema.min(1),\n size: (schema: any) => schema.positive(),\n r2Key: (schema: any) => schema.min(1),\n publicUrl: (schema: any) => schema.url(),\n folder: (schema: any) => schema.min(1),\n});\n\nexport const selectMediaSchema = createSelectSchema(media);\n\n\nexport const insertWorkflowHistorySchema = createInsertSchema(workflowHistory, {\n action: (schema: any) => schema.min(1),\n fromStatus: (schema: any) => schema.min(1),\n toStatus: (schema: any) => schema.min(1),\n});\n\nexport const selectWorkflowHistorySchema = createSelectSchema(workflowHistory);\n\nexport const insertPluginSchema = createInsertSchema(plugins, {\n name: (schema: any) => schema.min(1),\n displayName: (schema: any) => schema.min(1),\n version: (schema: any) => schema.min(1),\n author: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginSchema = createSelectSchema(plugins);\n\nexport const insertPluginHookSchema = createInsertSchema(pluginHooks, {\n hookName: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginHookSchema = createSelectSchema(pluginHooks);\n\nexport const insertPluginRouteSchema = createInsertSchema(pluginRoutes, {\n path: (schema: any) => schema.min(1),\n method: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginRouteSchema = createSelectSchema(pluginRoutes);\n\nexport const insertPluginAssetSchema = createInsertSchema(pluginAssets, {\n assetType: (schema: any) => schema.min(1),\n assetPath: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginAssetSchema = createSelectSchema(pluginAssets);\n\nexport const insertPluginActivityLogSchema = createInsertSchema(pluginActivityLog, {\n action: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginActivityLogSchema = createSelectSchema(pluginActivityLog);\n\n// System logs table for comprehensive logging\nexport const systemLogs = sqliteTable('system_logs', {\n id: text('id').primaryKey(),\n level: text('level').notNull(), // 'debug', 'info', 'warn', 'error', 'fatal'\n category: text('category').notNull(), // 'auth', 'api', 'workflow', 'plugin', 'media', 'system', etc.\n message: text('message').notNull(),\n data: text('data', { mode: 'json' }), // Additional structured data\n userId: text('user_id').references(() => users.id),\n sessionId: text('session_id'),\n requestId: text('request_id'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n method: text('method'), // HTTP method for API logs\n url: text('url'), // Request URL for API logs\n statusCode: integer('status_code'), // HTTP status code for API logs\n duration: integer('duration'), // Request duration in milliseconds\n stackTrace: text('stack_trace'), // Error stack trace for error logs\n tags: text('tags', { mode: 'json' }), // Array of tags for categorization\n source: text('source'), // Source component/module that generated the log\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Log configuration table\nexport const logConfig = sqliteTable('log_config', {\n id: text('id').primaryKey(),\n category: text('category').notNull().unique(),\n enabled: integer('enabled', { mode: 'boolean' }).notNull().default(true),\n level: text('level').notNull().default('info'), // minimum log level to store\n retention: integer('retention').notNull().default(30), // days to keep logs\n maxSize: integer('max_size').default(10000), // max number of logs per category\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Insert and select schemas for system logs\nexport const insertSystemLogSchema = createInsertSchema(systemLogs, {\n level: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n message: (schema: any) => schema.min(1),\n});\n\nexport const selectSystemLogSchema = createSelectSchema(systemLogs);\n\nexport const insertLogConfigSchema = createInsertSchema(logConfig, {\n category: (schema: any) => schema.min(1),\n level: (schema: any) => schema.min(1),\n});\n\nexport const selectLogConfigSchema = createSelectSchema(logConfig);\n\n// Type exports\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\nexport type Collection = typeof collections.$inferSelect;\nexport type NewCollection = typeof collections.$inferInsert;\nexport type Content = typeof content.$inferSelect;\nexport type NewContent = typeof content.$inferInsert;\nexport type Media = typeof media.$inferSelect;\nexport type NewMedia = typeof media.$inferInsert;\nexport type WorkflowHistory = typeof workflowHistory.$inferSelect;\nexport type NewWorkflowHistory = typeof workflowHistory.$inferInsert;\nexport type Plugin = typeof plugins.$inferSelect;\nexport type NewPlugin = typeof plugins.$inferInsert;\nexport type PluginHook = typeof pluginHooks.$inferSelect;\nexport type NewPluginHook = typeof pluginHooks.$inferInsert;\nexport type PluginRoute = typeof pluginRoutes.$inferSelect;\nexport type NewPluginRoute = typeof pluginRoutes.$inferInsert;\nexport type PluginAsset = typeof pluginAssets.$inferSelect;\nexport type NewPluginAsset = typeof pluginAssets.$inferInsert;\nexport type PluginActivityLog = typeof pluginActivityLog.$inferSelect;\nexport type NewPluginActivityLog = typeof pluginActivityLog.$inferInsert;\nexport type SystemLog = typeof systemLogs.$inferSelect;\nexport type NewSystemLog = typeof systemLogs.$inferInsert;\nexport type LogConfig = typeof logConfig.$inferSelect;\nexport type NewLogConfig = typeof logConfig.$inferInsert;\n\n// =====================================================\n// Security Audit Plugin Tables\n// =====================================================\n\nexport const securityEvents = sqliteTable('security_events', {\n id: text('id').primaryKey(),\n eventType: text('event_type').notNull(),\n severity: text('severity').notNull().default('info'),\n userId: text('user_id'),\n email: text('email'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n countryCode: text('country_code'),\n requestPath: text('request_path'),\n requestMethod: text('request_method'),\n details: text('details', { mode: 'json' }),\n fingerprint: text('fingerprint'),\n blocked: integer('blocked').notNull().default(0),\n createdAt: integer('created_at').notNull().$defaultFn(() => Date.now()),\n});\n\nexport const insertSecurityEventSchema = createInsertSchema(securityEvents, {\n eventType: (schema: any) => schema.min(1),\n severity: (schema: any) => schema.min(1),\n});\n\nexport const selectSecurityEventSchema = createSelectSchema(securityEvents);\n\nexport type SecurityEventRecord = typeof securityEvents.$inferSelect;\nexport type NewSecurityEventRecord = typeof securityEvents.$inferInsert;\n\n// =====================================================\n// Form.io Integration Tables\n// =====================================================\n\n// Forms table - stores Form.io form definitions\nexport const forms = sqliteTable('forms', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(), // Machine name (e.g., \"contact-form\")\n displayName: text('display_name').notNull(), // Human name (e.g., \"Contact Form\")\n description: text('description'),\n category: text('category').notNull().default('general'), // contact, survey, registration, etc.\n \n // Form.io schema (JSON)\n formioSchema: text('formio_schema', { mode: 'json' }).notNull(), // Complete Form.io JSON schema\n \n // Settings (JSON)\n settings: text('settings', { mode: 'json' }), // emailNotifications, successMessage, etc.\n \n // Status & Management\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n isPublic: integer('is_public', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false),\n \n // Metadata\n icon: text('icon'),\n color: text('color'),\n tags: text('tags', { mode: 'json' }), // JSON array\n \n // Stats\n submissionCount: integer('submission_count').notNull().default(0),\n viewCount: integer('view_count').notNull().default(0),\n \n // Ownership\n createdBy: text('created_by').references(() => users.id),\n updatedBy: text('updated_by').references(() => users.id),\n \n // Timestamps\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form submissions table\nexport const formSubmissions = sqliteTable('form_submissions', {\n id: text('id').primaryKey(),\n formId: text('form_id').notNull().references(() => forms.id, { onDelete: 'cascade' }),\n \n // Submission data\n submissionData: text('submission_data', { mode: 'json' }).notNull(), // The actual form data\n \n // Submission metadata\n status: text('status').notNull().default('pending'), // pending, reviewed, approved, rejected, spam\n submissionNumber: integer('submission_number'),\n \n // User information\n userId: text('user_id').references(() => users.id),\n userEmail: text('user_email'),\n \n // Tracking\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n referrer: text('referrer'),\n utmSource: text('utm_source'),\n utmMedium: text('utm_medium'),\n utmCampaign: text('utm_campaign'),\n \n // Review/Processing\n reviewedBy: text('reviewed_by').references(() => users.id),\n reviewedAt: integer('reviewed_at'),\n reviewNotes: text('review_notes'),\n \n // Flags\n isSpam: integer('is_spam', { mode: 'boolean' }).notNull().default(false),\n isArchived: integer('is_archived', { mode: 'boolean' }).notNull().default(false),\n\n // Content integration\n contentId: text('content_id').references(() => content.id), // Links submission to its content item\n\n // Timestamps\n submittedAt: integer('submitted_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form files table - links submissions to uploaded files\nexport const formFiles = sqliteTable('form_files', {\n id: text('id').primaryKey(),\n submissionId: text('submission_id').notNull().references(() => formSubmissions.id, { onDelete: 'cascade' }),\n mediaId: text('media_id').notNull().references(() => media.id, { onDelete: 'cascade' }),\n fieldName: text('field_name').notNull(), // Form field that uploaded this file\n uploadedAt: integer('uploaded_at').notNull(),\n});\n\n// Zod schemas for validation\nexport const insertFormSchema = createInsertSchema(forms);\nexport const selectFormSchema = createSelectSchema(forms);\nexport const insertFormSubmissionSchema = createInsertSchema(formSubmissions);\nexport const selectFormSubmissionSchema = createSelectSchema(formSubmissions);\nexport const insertFormFileSchema = createInsertSchema(formFiles);\nexport const selectFormFileSchema = createSelectSchema(formFiles);\n\n// TypeScript types\nexport type Form = typeof forms.$inferSelect;\nexport type NewForm = typeof forms.$inferInsert;\nexport type FormSubmission = typeof formSubmissions.$inferSelect;\nexport type NewFormSubmission = typeof formSubmissions.$inferInsert;\nexport type FormFile = typeof formFiles.$inferSelect;\nexport type NewFormFile = typeof formFiles.$inferInsert;",null,null,null,null,"import type { D1Database } from '@cloudflare/workers-types'\nimport { systemLogs, logConfig, type NewSystemLog, type LogConfig } from '../db/schema'\nimport { drizzle } from 'drizzle-orm/d1'\nimport { eq, and, gte, lte, desc, asc, count, like, inArray } from 'drizzle-orm'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal'\nexport type LogCategory = 'auth' | 'api' | 'workflow' | 'plugin' | 'media' | 'system' | 'security' | 'error'\n\nexport interface LogEntry {\n level: LogLevel\n category: LogCategory\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags?: string[]\n source?: string\n}\n\nexport interface LogFilter {\n level?: LogLevel[]\n category?: LogCategory[]\n userId?: string\n source?: string\n search?: string\n startDate?: Date\n endDate?: Date\n tags?: string[]\n limit?: number\n offset?: number\n sortBy?: 'created_at' | 'level' | 'category'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport class Logger {\n private db: ReturnType\n private enabled: boolean = true\n private configCache: Map = new Map()\n private lastConfigRefresh: number = 0\n private configRefreshInterval: number = 60000 // 1 minute\n\n constructor(database: D1Database) {\n this.db = drizzle(database)\n }\n\n /**\n * Log a debug message\n */\n async debug(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('debug', category, message, data, context)\n }\n\n /**\n * Log an info message\n */\n async info(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('info', category, message, data, context)\n }\n\n /**\n * Log a warning message\n */\n async warn(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('warn', category, message, data, context)\n }\n\n /**\n * Log an error message\n */\n async error(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('error', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log a fatal message\n */\n async fatal(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('fatal', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log an API request\n */\n async logRequest(\n method: string,\n url: string,\n statusCode: number,\n duration: number,\n context?: Partial\n ): Promise {\n const level: LogLevel = statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info'\n \n return this.log(level, 'api', `${method} ${url} - ${statusCode}`, {\n method,\n url,\n statusCode,\n duration\n }, {\n ...context,\n method,\n url,\n statusCode,\n duration\n })\n }\n\n /**\n * Log an authentication event\n */\n async logAuth(action: string, userId?: string, success: boolean = true, context?: Partial): Promise {\n const level: LogLevel = success ? 'info' : 'warn'\n \n return this.log(level, 'auth', `Authentication ${action}: ${success ? 'success' : 'failed'}`, {\n action,\n success,\n userId\n }, {\n ...context,\n userId,\n tags: ['authentication', action]\n })\n }\n\n /**\n * Log a security event\n */\n async logSecurity(event: string, severity: 'low' | 'medium' | 'high' | 'critical', context?: Partial): Promise {\n const level: LogLevel = severity === 'critical' ? 'fatal' : severity === 'high' ? 'error' : 'warn'\n \n return this.log(level, 'security', `Security event: ${event}`, {\n event,\n severity\n }, {\n ...context,\n tags: ['security', severity]\n })\n }\n\n /**\n * Core logging method\n */\n private async log(\n level: LogLevel,\n category: LogCategory,\n message: string,\n data?: any,\n context?: Partial\n ): Promise {\n if (!this.enabled) return\n\n try {\n // Check if logging is enabled for this category and level\n const config = await this.getConfig(category)\n if (!config || !config.enabled || !this.shouldLog(level, config.level)) {\n return\n }\n\n const logEntry: NewSystemLog = {\n id: crypto.randomUUID(),\n level,\n category,\n message,\n data: data ? JSON.stringify(data) : null,\n userId: context?.userId || null,\n sessionId: context?.sessionId || null,\n requestId: context?.requestId || null,\n ipAddress: context?.ipAddress || null,\n userAgent: context?.userAgent || null,\n method: context?.method || null,\n url: context?.url || null,\n statusCode: context?.statusCode || null,\n duration: context?.duration || null,\n stackTrace: context?.stackTrace || null,\n tags: context?.tags ? JSON.stringify(context.tags) : null,\n source: context?.source || null,\n createdAt: new Date()\n }\n\n await this.db.insert(systemLogs).values(logEntry)\n\n // Check if we need to clean up old logs\n if (config.maxSize) {\n await this.cleanupCategory(category, config.maxSize)\n }\n\n } catch (error) {\n // Don't log errors in the logger to avoid infinite loops\n console.error('Logger error:', error)\n }\n }\n\n /**\n * Get logs with filtering and pagination\n */\n async getLogs(filter: LogFilter = {}): Promise<{ logs: any[], total: number }> {\n try {\n const conditions = []\n \n if (filter.level && filter.level.length > 0) {\n conditions.push(inArray(systemLogs.level, filter.level))\n }\n \n if (filter.category && filter.category.length > 0) {\n conditions.push(inArray(systemLogs.category, filter.category))\n }\n \n if (filter.userId) {\n conditions.push(eq(systemLogs.userId, filter.userId))\n }\n \n if (filter.source) {\n conditions.push(eq(systemLogs.source, filter.source))\n }\n \n if (filter.search) {\n conditions.push(\n like(systemLogs.message, `%${filter.search}%`)\n )\n }\n \n if (filter.startDate) {\n conditions.push(gte(systemLogs.createdAt, filter.startDate))\n }\n \n if (filter.endDate) {\n conditions.push(lte(systemLogs.createdAt, filter.endDate))\n }\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined\n\n // Get total count\n const totalResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(whereClause)\n\n const total = totalResult[0]?.count || 0\n\n // Get logs with pagination and sorting\n const sortColumn = filter.sortBy === 'level' ? systemLogs.level :\n filter.sortBy === 'category' ? systemLogs.category :\n systemLogs.createdAt\n\n const sortFn = filter.sortOrder === 'asc' ? asc : desc\n\n const logs = await this.db\n .select()\n .from(systemLogs)\n .where(whereClause)\n .orderBy(sortFn(sortColumn))\n .limit(filter.limit || 50)\n .offset(filter.offset || 0)\n\n return { logs, total }\n } catch (error) {\n console.error('Error getting logs:', error)\n return { logs: [], total: 0 }\n }\n }\n\n /**\n * Get log configuration for a category\n */\n private async getConfig(category: LogCategory): Promise {\n try {\n // Check cache first\n const now = Date.now()\n if (this.configCache.has(category) && (now - this.lastConfigRefresh) < this.configRefreshInterval) {\n return this.configCache.get(category) || null\n }\n\n // Refresh config from database\n const configs = await this.db\n .select()\n .from(logConfig)\n .where(eq(logConfig.category, category))\n\n const config = configs[0] || null\n \n if (config) {\n this.configCache.set(category, config)\n this.lastConfigRefresh = now\n }\n\n return config\n } catch (error) {\n console.error('Error getting log config:', error)\n return null\n }\n }\n\n /**\n * Update log configuration\n */\n async updateConfig(category: LogCategory, updates: Partial): Promise {\n try {\n await this.db\n .update(logConfig)\n .set({\n ...updates,\n updatedAt: new Date()\n })\n .where(eq(logConfig.category, category))\n\n // Clear cache for this category\n this.configCache.delete(category)\n } catch (error) {\n console.error('Error updating log config:', error)\n }\n }\n\n /**\n * Get all log configurations\n */\n async getAllConfigs(): Promise {\n try {\n return await this.db.select().from(logConfig)\n } catch (error) {\n console.error('Error getting log configs:', error)\n return []\n }\n }\n\n /**\n * Clean up old logs for a category\n */\n private async cleanupCategory(category: LogCategory, maxSize: number): Promise {\n try {\n // Count current logs for this category\n const countResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n\n const currentCount = countResult[0]?.count || 0\n\n if (currentCount > maxSize) {\n // Get the cutoff date (keep newest maxSize logs)\n const cutoffLogs = await this.db\n .select({ createdAt: systemLogs.createdAt })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n .orderBy(desc(systemLogs.createdAt))\n .limit(1)\n .offset(maxSize - 1)\n\n if (cutoffLogs[0]) {\n // Delete older logs\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, category),\n lte(systemLogs.createdAt, cutoffLogs[0].createdAt)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n }\n }\n\n /**\n * Clean up logs based on retention policy\n */\n async cleanupByRetention(): Promise {\n try {\n const configs = await this.getAllConfigs()\n \n for (const config of configs) {\n if (config.retention > 0) {\n const cutoffDate = new Date()\n cutoffDate.setDate(cutoffDate.getDate() - config.retention)\n\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, config.category),\n lte(systemLogs.createdAt, cutoffDate)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs by retention:', error)\n }\n }\n\n /**\n * Check if a log level should be recorded based on configuration\n */\n private shouldLog(level: LogLevel, configLevel: string): boolean {\n const levels = ['debug', 'info', 'warn', 'error', 'fatal']\n const levelIndex = levels.indexOf(level)\n const configLevelIndex = levels.indexOf(configLevel)\n \n return levelIndex >= configLevelIndex\n }\n\n /**\n * Enable or disable logging\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton logger instance\nlet loggerInstance: Logger | null = null\n\n/**\n * Get the logger instance\n */\nexport function getLogger(database?: D1Database): Logger {\n if (!loggerInstance && database) {\n loggerInstance = new Logger(database)\n }\n \n if (!loggerInstance) {\n throw new Error('Logger not initialized. Call getLogger with a database instance first.')\n }\n \n return loggerInstance\n}\n\n/**\n * Initialize the logger with a database\n */\nexport function initLogger(database: D1Database): Logger {\n loggerInstance = new Logger(database)\n return loggerInstance\n}","/**\n * Simple Cache Service\n *\n * Provides basic caching functionality for the core package\n * Can be extended with KV or other storage backends\n */\n\nexport interface CacheConfig {\n ttl: number // Time to live in seconds\n keyPrefix: string\n}\n\nexport class CacheService {\n private config: CacheConfig\n private memoryCache: Map = new Map()\n\n constructor(config: CacheConfig) {\n this.config = config\n }\n\n /**\n * Generate cache key with prefix\n */\n generateKey(type: string, identifier?: string): string {\n const parts = [this.config.keyPrefix, type]\n if (identifier) {\n parts.push(identifier)\n }\n return parts.join(':')\n }\n\n /**\n * Get value from cache\n */\n async get(key: string): Promise {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return null\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return null\n }\n\n return cached.value as T\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise<{\n hit: boolean\n data: T | null\n source: string\n ttl?: number\n }> {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return {\n hit: false,\n data: null,\n source: 'none'\n }\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return {\n hit: false,\n data: null,\n source: 'expired'\n }\n }\n\n return {\n hit: true,\n data: cached.value as T,\n source: 'memory',\n ttl: (cached.expires - Date.now()) / 1000 // TTL in seconds\n }\n }\n\n /**\n * Set value in cache\n */\n async set(key: string, value: any, ttl?: number): Promise {\n const expires = Date.now() + ((ttl || this.config.ttl) * 1000)\n this.memoryCache.set(key, { value, expires })\n }\n\n /**\n * Delete specific key from cache\n */\n async delete(key: string): Promise {\n this.memoryCache.delete(key)\n }\n\n /**\n * Invalidate cache keys matching a pattern\n * For memory cache, we do simple string matching\n */\n async invalidate(pattern: string): Promise {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.')\n const regex = new RegExp(`^${regexPattern}$`)\n\n // Find and delete matching keys\n for (const key of this.memoryCache.keys()) {\n if (regex.test(key)) {\n this.memoryCache.delete(key)\n }\n }\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise {\n this.memoryCache.clear()\n }\n\n /**\n * Get value from cache or set it using a callback\n */\n async getOrSet(key: string, callback: () => Promise, ttl?: number): Promise {\n const cached = await this.get(key)\n\n if (cached !== null) {\n return cached\n }\n\n const value = await callback()\n await this.set(key, value, ttl)\n return value\n }\n}\n\n/**\n * Cache configurations for different data types\n */\nexport const CACHE_CONFIGS = {\n api: {\n ttl: 300, // 5 minutes\n keyPrefix: 'api'\n },\n user: {\n ttl: 600, // 10 minutes\n keyPrefix: 'user'\n },\n content: {\n ttl: 300, // 5 minutes\n keyPrefix: 'content'\n },\n collection: {\n ttl: 600, // 10 minutes\n keyPrefix: 'collection'\n }\n}\n\n/**\n * Get cache service instance for a config\n */\nexport function getCacheService(config: CacheConfig): CacheService {\n return new CacheService(config)\n}\n","export interface Setting {\n id: string\n category: string\n key: string\n value: string // JSON string\n created_at: number\n updated_at: number\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface SecuritySettings {\n jwtExpiresIn: string\n jwtRefreshGraceSeconds: number\n}\n\nexport class SettingsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get a setting value by category and key\n */\n async getSetting(category: string, key: string): Promise {\n try {\n const result = await this.db\n .prepare('SELECT value FROM settings WHERE category = ? AND key = ?')\n .bind(category, key)\n .first()\n\n if (!result) {\n return null\n }\n\n return JSON.parse((result as any).value)\n } catch (error) {\n console.error(`Error getting setting ${category}.${key}:`, error)\n return null\n }\n }\n\n /**\n * Get all settings for a category\n */\n async getCategorySettings(category: string): Promise> {\n try {\n const { results } = await this.db\n .prepare('SELECT key, value FROM settings WHERE category = ?')\n .bind(category)\n .all()\n\n const settings: Record = {}\n for (const row of results || []) {\n const r = row as any\n settings[r.key] = JSON.parse(r.value)\n }\n\n return settings\n } catch (error) {\n console.error(`Error getting category settings for ${category}:`, error)\n return {}\n }\n }\n\n /**\n * Set a setting value\n */\n async setSetting(category: string, key: string, value: any): Promise {\n try {\n const now = Date.now()\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n\n return true\n } catch (error) {\n console.error(`Error setting ${category}.${key}:`, error)\n return false\n }\n }\n\n /**\n * Set multiple settings at once\n */\n async setMultipleSettings(category: string, settings: Record): Promise {\n try {\n const now = Date.now()\n\n // Use a transaction-like approach with batch operations\n for (const [key, value] of Object.entries(settings)) {\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n }\n\n return true\n } catch (error) {\n console.error(`Error setting multiple settings for ${category}:`, error)\n return false\n }\n }\n\n /**\n * Get general settings with defaults\n */\n async getGeneralSettings(userEmail?: string): Promise {\n const settings = await this.getCategorySettings('general')\n\n return {\n siteName: settings.siteName || 'SonicJS AI',\n siteDescription: settings.siteDescription || 'A modern headless CMS powered by AI',\n adminEmail: settings.adminEmail || userEmail || 'admin@example.com',\n timezone: settings.timezone || 'UTC',\n language: settings.language || 'en',\n maintenanceMode: settings.maintenanceMode || false\n }\n }\n\n /**\n * Save general settings\n */\n async saveGeneralSettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.siteName !== undefined) settingsToSave.siteName = settings.siteName\n if (settings.siteDescription !== undefined) settingsToSave.siteDescription = settings.siteDescription\n if (settings.adminEmail !== undefined) settingsToSave.adminEmail = settings.adminEmail\n if (settings.timezone !== undefined) settingsToSave.timezone = settings.timezone\n if (settings.language !== undefined) settingsToSave.language = settings.language\n if (settings.maintenanceMode !== undefined) settingsToSave.maintenanceMode = settings.maintenanceMode\n\n return await this.setMultipleSettings('general', settingsToSave)\n }\n\n /**\n * Get security settings with defaults\n */\n async getSecuritySettings(): Promise {\n const settings = await this.getCategorySettings('security')\n\n return {\n jwtExpiresIn: settings.jwtExpiresIn || '30d',\n jwtRefreshGraceSeconds:\n typeof settings.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n }\n }\n\n /**\n * Save security settings\n */\n async saveSecuritySettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.jwtExpiresIn !== undefined) settingsToSave.jwtExpiresIn = settings.jwtExpiresIn\n if (settings.jwtRefreshGraceSeconds !== undefined)\n settingsToSave.jwtRefreshGraceSeconds = settings.jwtRefreshGraceSeconds\n\n return await this.setMultipleSettings('security', settingsToSave)\n }\n}\n","/**\n * Telemetry Service\n *\n * Privacy-first telemetry service using custom SonicJS stats endpoint\n * - No PII collection\n * - Opt-out by default\n * - Silent failures (never blocks app)\n */\n\nimport type { TelemetryEvent, TelemetryProperties, TelemetryConfig, TelemetryIdentity } from '../types/telemetry'\nimport { getTelemetryConfig } from '../utils/telemetry-config'\nimport { generateInstallationId, generateProjectId, sanitizeErrorMessage, sanitizeRoute } from '../utils/telemetry-id'\n\n/**\n * TelemetryService class\n *\n * Handles all telemetry tracking in a privacy-conscious way\n */\nexport class TelemetryService {\n private config: TelemetryConfig\n private identity: TelemetryIdentity | null = null\n private enabled: boolean = true\n private eventQueue: Array<{ event: TelemetryEvent; properties?: TelemetryProperties }> = []\n private isInitialized: boolean = false\n\n constructor(config?: Partial) {\n this.config = {\n ...getTelemetryConfig(),\n ...config\n }\n this.enabled = this.config.enabled\n }\n\n /**\n * Initialize the telemetry service\n */\n async initialize(identity: TelemetryIdentity): Promise {\n if (!this.enabled) {\n if (this.config.debug) {\n console.log('[Telemetry] Disabled via configuration')\n }\n return\n }\n\n try {\n this.identity = identity\n\n if (this.config.debug) {\n console.log('[Telemetry] Initialized with installation ID:', identity.installationId)\n }\n\n this.isInitialized = true\n\n // Flush any queued events\n await this.flushQueue()\n\n } catch (error) {\n // Silent fail - telemetry should never break the app\n if (this.config.debug) {\n console.error('[Telemetry] Initialization failed:', error)\n }\n this.enabled = false\n }\n }\n\n /**\n * Track a telemetry event\n */\n async track(event: TelemetryEvent, properties?: TelemetryProperties): Promise {\n if (!this.enabled) return\n\n try {\n // Sanitize properties\n const sanitizedProps = this.sanitizeProperties(properties)\n\n // Add standard properties\n const enrichedProps = {\n ...sanitizedProps,\n timestamp: new Date().toISOString(),\n version: this.getVersion()\n }\n\n // If not initialized, queue the event\n if (!this.isInitialized) {\n this.eventQueue.push({ event, properties: enrichedProps })\n if (this.config.debug) {\n console.log('[Telemetry] Queued event:', event, enrichedProps)\n }\n return\n }\n\n // Send to custom SonicJS stats endpoint\n if (this.identity && this.config.host) {\n const payload = {\n data: {\n installation_id: this.identity.installationId,\n event_type: event,\n properties: enrichedProps,\n timestamp: enrichedProps.timestamp\n }\n }\n\n // Fire and forget - don't block on response\n fetch(`${this.config.host}/v1/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload)\n }).catch(() => {}) // Silent fail\n\n if (this.config.debug) {\n console.log('[Telemetry] Tracked event:', event, enrichedProps)\n }\n } else if (this.config.debug) {\n console.log('[Telemetry] Event (no endpoint):', event, enrichedProps)\n }\n\n } catch (error) {\n // Silent fail\n if (this.config.debug) {\n console.error('[Telemetry] Failed to track event:', error)\n }\n }\n }\n\n /**\n * Track installation started\n */\n async trackInstallationStarted(properties?: TelemetryProperties): Promise {\n await this.track('installation_started', properties)\n }\n\n /**\n * Track installation completed\n */\n async trackInstallationCompleted(properties?: TelemetryProperties): Promise {\n await this.track('installation_completed', properties)\n }\n\n /**\n * Track installation failed\n */\n async trackInstallationFailed(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('installation_failed', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track dev server started\n */\n async trackDevServerStarted(properties?: TelemetryProperties): Promise {\n await this.track('dev_server_started', properties)\n }\n\n /**\n * Track page view in admin UI\n */\n async trackPageView(route: string, properties?: TelemetryProperties): Promise {\n await this.track('page_viewed', {\n ...properties,\n route: sanitizeRoute(route)\n })\n }\n\n /**\n * Track error (sanitized)\n */\n async trackError(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('error_occurred', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track plugin activation\n */\n async trackPluginActivated(properties?: TelemetryProperties): Promise {\n await this.track('plugin_activated', properties)\n }\n\n /**\n * Track migration run\n */\n async trackMigrationRun(properties?: TelemetryProperties): Promise {\n await this.track('migration_run', properties)\n }\n\n /**\n * Flush queued events\n */\n private async flushQueue(): Promise {\n if (this.eventQueue.length === 0) return\n\n const queue = [...this.eventQueue]\n this.eventQueue = []\n\n for (const { event, properties } of queue) {\n await this.track(event, properties)\n }\n }\n\n /**\n * Sanitize properties to ensure no PII\n */\n private sanitizeProperties(properties?: TelemetryProperties): TelemetryProperties {\n if (!properties) return {}\n\n const sanitized: TelemetryProperties = {}\n\n for (const [key, value] of Object.entries(properties)) {\n // Skip undefined values\n if (value === undefined) continue\n\n // Sanitize routes\n if (key === 'route' && typeof value === 'string') {\n sanitized[key] = sanitizeRoute(value)\n continue\n }\n\n // Sanitize error messages\n if (key.toLowerCase().includes('error') && typeof value === 'string') {\n sanitized[key] = sanitizeErrorMessage(value)\n continue\n }\n\n // Only allow specific types\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n sanitized[key] = value\n }\n }\n\n return sanitized\n }\n\n /**\n * Get SonicJS version\n */\n private getVersion(): string {\n try {\n // Safe environment access for Cloudflare Workers compatibility\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SONICJS_VERSION || '2.0.0'\n }\n return '2.0.0'\n } catch {\n return 'unknown'\n }\n }\n\n /**\n * Shutdown the telemetry service (no-op for fetch-based telemetry)\n */\n async shutdown(): Promise {\n // No-op - fetch requests are fire and forget\n }\n\n /**\n * Enable telemetry\n */\n enable(): void {\n this.enabled = true\n }\n\n /**\n * Disable telemetry\n */\n disable(): void {\n this.enabled = false\n }\n\n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton instance\nlet telemetryInstance: TelemetryService | null = null\n\n/**\n * Get the telemetry service instance\n */\nexport function getTelemetryService(config?: Partial): TelemetryService {\n if (!telemetryInstance) {\n telemetryInstance = new TelemetryService(config)\n }\n return telemetryInstance\n}\n\n/**\n * Initialize telemetry service\n */\nexport async function initTelemetry(identity: TelemetryIdentity, config?: Partial): Promise {\n const service = getTelemetryService(config)\n await service.initialize(identity)\n return service\n}\n\n/**\n * Create a new installation identity\n */\nexport function createInstallationIdentity(projectName?: string): TelemetryIdentity {\n const installationId = generateInstallationId()\n const identity: TelemetryIdentity = { installationId }\n\n if (projectName) {\n // Generate anonymous project ID\n identity.projectId = generateProjectId(projectName)\n }\n\n return identity\n}\n","/**\n * Route Metadata Service\n *\n * Auto-discovers API routes using Hono's inspectRoutes() and enriches them\n * with metadata from a static registry. Routes without metadata still appear\n * as \"auto-discovered\" — nothing is ever invisible.\n */\n\nimport { inspectRoutes } from 'hono/dev'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RouteMetadata {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented: boolean\n}\n\ninterface RouteMeta {\n description: string\n authentication: boolean\n category: string\n}\n\nexport interface CategoryInfo {\n title: string\n description: string\n icon: string\n}\n\n// ============================================================================\n// App Instance Storage\n// ============================================================================\n\nlet appInstance: any = null\n\nexport function setAppInstance(app: any): void {\n appInstance = app\n}\n\nexport function getAppInstance(): any {\n return appInstance\n}\n\n// ============================================================================\n// Category Information\n// ============================================================================\n\nexport const CATEGORY_INFO: Record = {\n 'Auth': {\n title: 'Authentication',\n description: 'User authentication and authorization endpoints',\n icon: '🔐'\n },\n 'Content': {\n title: 'Content Management',\n description: 'Content creation, retrieval, and management',\n icon: '📝'\n },\n 'Media': {\n title: 'Media Management',\n description: 'File upload, storage, and media operations',\n icon: '🖼️'\n },\n 'Admin': {\n title: 'Admin Interface',\n description: 'Administrative panel and management features',\n icon: '⚙️'\n },\n 'System': {\n title: 'System',\n description: 'Health checks and system information',\n icon: '🔧'\n },\n 'Search': {\n title: 'Search',\n description: 'AI-powered search, full-text search, and analytics',\n icon: '🔍'\n },\n 'API Keys': {\n title: 'API Keys',\n description: 'API key management and authentication',\n icon: '🔑'\n },\n 'Workflow': {\n title: 'Workflow',\n description: 'Content workflow and approval processes',\n icon: '🔄'\n },\n 'Cache': {\n title: 'Cache',\n description: 'Cache management and invalidation',\n icon: '⚡'\n },\n 'Forms': {\n title: 'Forms',\n description: 'Form submissions and management',\n icon: '📋'\n },\n 'Files': {\n title: 'Files',\n description: 'File serving from R2 storage',\n icon: '📁'\n }\n}\n\n// ============================================================================\n// Route Metadata Registry\n// ============================================================================\n\nconst ROUTE_METADATA: Record = {\n // Auth endpoints\n 'POST /auth/login': { description: 'Authenticate user with email and password (returns JWT)', category: 'Auth', authentication: false },\n 'POST /auth/login/form': { description: 'Form-based login (sets session cookie)', category: 'Auth', authentication: false },\n 'POST /auth/register': { description: 'Register a new user account', category: 'Auth', authentication: false },\n 'POST /auth/logout': { description: 'Log out the current user and invalidate session', category: 'Auth', authentication: true },\n 'GET /auth/me': { description: 'Get current authenticated user information', category: 'Auth', authentication: true },\n 'POST /auth/refresh': { description: 'Refresh authentication token', category: 'Auth', authentication: true },\n 'POST /auth/seed-admin': { description: 'Create or reset the admin user account', category: 'Auth', authentication: false },\n 'POST /auth/magic-link/request': { description: 'Request a magic link login email', category: 'Auth', authentication: false },\n 'GET /auth/magic-link/verify': { description: 'Verify magic link token and authenticate', category: 'Auth', authentication: false },\n 'POST /auth/otp/request': { description: 'Request a one-time password via email', category: 'Auth', authentication: false },\n 'POST /auth/otp/verify': { description: 'Verify OTP code and authenticate', category: 'Auth', authentication: false },\n\n // Content endpoints\n 'GET /api/collections': { description: 'List all available collections', category: 'Content', authentication: false },\n 'GET /api/collections/:collection/content': { description: 'Get all content items from a specific collection', category: 'Content', authentication: false },\n 'GET /api/content/:id': { description: 'Get a specific content item by ID', category: 'Content', authentication: false },\n 'POST /api/content': { description: 'Create a new content item', category: 'Content', authentication: true },\n 'PUT /api/content/:id': { description: 'Update an existing content item', category: 'Content', authentication: true },\n 'DELETE /api/content/:id': { description: 'Delete a content item', category: 'Content', authentication: true },\n 'GET /api/content/:id/versions': { description: 'Get version history for a content item', category: 'Content', authentication: true },\n 'POST /api/content/:id/restore/:versionId': { description: 'Restore a content item to a previous version', category: 'Content', authentication: true },\n\n // Media endpoints\n 'GET /api/media': { description: 'List all media files with pagination', category: 'Media', authentication: false },\n 'GET /api/media/:id': { description: 'Get a specific media file by ID', category: 'Media', authentication: false },\n 'POST /api/media/upload': { description: 'Upload a new media file to R2 storage', category: 'Media', authentication: true },\n 'DELETE /api/media/:id': { description: 'Delete a media file from storage', category: 'Media', authentication: true },\n\n // Admin API endpoints\n 'GET /admin/api/stats': { description: 'Get dashboard statistics (collections, content, media, users)', category: 'Admin', authentication: true },\n 'GET /admin/api/storage': { description: 'Get storage usage information', category: 'Admin', authentication: true },\n 'GET /admin/api/activity': { description: 'Get recent activity logs', category: 'Admin', authentication: true },\n 'GET /admin/api/collections': { description: 'List all collections with field counts', category: 'Admin', authentication: true },\n 'POST /admin/api/collections': { description: 'Create a new collection', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id': { description: 'Get a specific collection with its fields', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id': { description: 'Update an existing collection', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id': { description: 'Delete a collection (must be empty)', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id/fields': { description: 'Get fields for a specific collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields': { description: 'Add a field to a collection', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id/fields/:fieldId': { description: 'Update a collection field', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id/fields/:fieldId': { description: 'Remove a field from a collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields/reorder': { description: 'Reorder fields in a collection', category: 'Admin', authentication: true },\n 'GET /admin/api/migrations/status': { description: 'Get database migration status', category: 'Admin', authentication: true },\n 'POST /admin/api/migrations/run': { description: 'Run pending database migrations', category: 'Admin', authentication: true },\n 'GET /admin/api/content': { description: 'List content items with filtering and pagination', category: 'Admin', authentication: true },\n 'GET /admin/api/content/:id': { description: 'Get a content item for admin editing', category: 'Admin', authentication: true },\n 'POST /admin/api/content': { description: 'Create content via admin API', category: 'Admin', authentication: true },\n 'PUT /admin/api/content/:id': { description: 'Update content via admin API', category: 'Admin', authentication: true },\n 'DELETE /admin/api/content/:id': { description: 'Delete content via admin API', category: 'Admin', authentication: true },\n 'GET /admin/api/media': { description: 'List media files for admin management', category: 'Admin', authentication: true },\n 'POST /admin/api/media/upload': { description: 'Upload media via admin interface', category: 'Admin', authentication: true },\n 'DELETE /admin/api/media/:id': { description: 'Delete media via admin interface', category: 'Admin', authentication: true },\n 'GET /admin/api/users': { description: 'List all users', category: 'Admin', authentication: true },\n 'POST /admin/api/users': { description: 'Create a new user', category: 'Admin', authentication: true },\n 'PUT /admin/api/users/:id': { description: 'Update a user', category: 'Admin', authentication: true },\n 'DELETE /admin/api/users/:id': { description: 'Delete a user', category: 'Admin', authentication: true },\n 'GET /admin/api/logs': { description: 'Get application logs with filtering', category: 'Admin', authentication: true },\n 'GET /admin/api/plugins': { description: 'List all registered plugins', category: 'Admin', authentication: true },\n 'POST /admin/api/plugins/:id/toggle': { description: 'Enable or disable a plugin', category: 'Admin', authentication: true },\n 'GET /admin/api/settings': { description: 'Get application settings', category: 'Admin', authentication: true },\n 'PUT /admin/api/settings': { description: 'Update application settings', category: 'Admin', authentication: true },\n 'GET /admin/api/forms': { description: 'List all forms', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id': { description: 'Get form details and submissions', category: 'Admin', authentication: true },\n 'POST /admin/api/forms': { description: 'Create a new form', category: 'Admin', authentication: true },\n 'PUT /admin/api/forms/:id': { description: 'Update a form', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id': { description: 'Delete a form', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id/submissions': { description: 'Get form submissions', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id/submissions/:submissionId': { description: 'Delete a form submission', category: 'Admin', authentication: true },\n\n // Search endpoints\n 'GET /api/search': { description: 'Search content using AI, FTS5, keyword, or hybrid mode', category: 'Search', authentication: false },\n 'POST /api/search/click': { description: 'Track a search result click for analytics', category: 'Search', authentication: false },\n 'GET /admin/plugins/ai-search/api/status': { description: 'Get search plugin status and configuration', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index': { description: 'Trigger content indexing for search', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index/reset': { description: 'Reset the search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics': { description: 'Get search analytics and metrics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/queries': { description: 'Get top search queries', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/clicks': { description: 'Get click-through analytics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/fts5/status': { description: 'Get FTS5 full-text search status', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/fts5/rebuild': { description: 'Rebuild the FTS5 search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/facets': { description: 'Get available search facets', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments': { description: 'List search A/B test experiments', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments': { description: 'Create a search A/B test experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id': { description: 'Get experiment details', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/experiments/:id': { description: 'Update an experiment', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/experiments/:id': { description: 'Delete an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/start': { description: 'Start an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/stop': { description: 'Stop a running experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id/results': { description: 'Get experiment results and statistics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality': { description: 'Get search quality agent analysis', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/run': { description: 'Run search quality analysis', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality/recommendations': { description: 'Get quality improvement recommendations', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/apply': { description: 'Apply a quality recommendation', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/dismiss': { description: 'Dismiss a quality recommendation', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/synonyms': { description: 'List search synonyms', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/synonyms': { description: 'Add a search synonym', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/synonyms/:id': { description: 'Delete a search synonym', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/query-rules': { description: 'List search query rules', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/query-rules': { description: 'Create a query rule', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/query-rules/:id': { description: 'Update a query rule', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/query-rules/:id': { description: 'Delete a query rule', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/settings': { description: 'Get search plugin settings', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/settings': { description: 'Update search plugin settings', category: 'Search', authentication: true },\n\n // API Key endpoints\n 'GET /admin/api-keys/api/keys': { description: 'List all API keys', category: 'API Keys', authentication: true },\n 'POST /admin/api-keys/api/keys': { description: 'Create a new API key', category: 'API Keys', authentication: true },\n 'DELETE /admin/api-keys/api/keys/:id': { description: 'Revoke an API key', category: 'API Keys', authentication: true },\n 'PUT /admin/api-keys/api/keys/:id': { description: 'Update an API key', category: 'API Keys', authentication: true },\n\n // Cache endpoints\n 'GET /admin/cache/api/stats': { description: 'Get cache statistics', category: 'Cache', authentication: true },\n 'POST /admin/cache/api/purge': { description: 'Purge cache entries', category: 'Cache', authentication: true },\n 'GET /admin/cache/api/entries': { description: 'List cache entries', category: 'Cache', authentication: true },\n 'DELETE /admin/cache/api/entries/:key': { description: 'Delete a specific cache entry', category: 'Cache', authentication: true },\n\n // Workflow endpoints\n 'GET /workflow/status/:id': { description: 'Get workflow status for a content item', category: 'Workflow', authentication: true },\n 'POST /workflow/submit/:id': { description: 'Submit content for review', category: 'Workflow', authentication: true },\n 'POST /workflow/approve/:id': { description: 'Approve content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/reject/:id': { description: 'Reject content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/publish/:id': { description: 'Publish approved content', category: 'Workflow', authentication: true },\n 'POST /workflow/unpublish/:id': { description: 'Unpublish content', category: 'Workflow', authentication: true },\n 'GET /workflow/history/:id': { description: 'Get workflow history for a content item', category: 'Workflow', authentication: true },\n\n // Form endpoints (public)\n 'POST /forms/:formId/submit': { description: 'Submit a form (public endpoint)', category: 'Forms', authentication: false },\n 'GET /forms/:formId': { description: 'Get form definition for rendering', category: 'Forms', authentication: false },\n 'POST /api/forms/:formId/submit': { description: 'Submit a form via API', category: 'Forms', authentication: false },\n 'GET /api/forms/:formId': { description: 'Get form definition via API', category: 'Forms', authentication: false },\n\n // System endpoints\n 'GET /health': { description: 'Health check endpoint for monitoring', category: 'System', authentication: false },\n 'GET /api/health': { description: 'API health check with schema information', category: 'System', authentication: false },\n 'GET /api': { description: 'API root - returns API information and available endpoints', category: 'System', authentication: false },\n 'GET /api/system/info': { description: 'Get system information and version', category: 'System', authentication: false },\n 'GET /api/system/schema': { description: 'Get database schema information', category: 'System', authentication: false },\n\n // File serving\n 'GET /files/*': { description: 'Serve files from R2 storage (public access)', category: 'Files', authentication: false },\n\n // Database tools\n 'POST /admin/database-tools/api/query': { description: 'Execute a database query', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables': { description: 'List database tables', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables/:name': { description: 'Get table schema and sample data', category: 'Admin', authentication: true },\n\n // Seed data\n 'POST /admin/seed-data/api/generate': { description: 'Generate seed data for development', category: 'Admin', authentication: true },\n 'GET /admin/seed-data/api/status': { description: 'Get seed data generation status', category: 'Admin', authentication: true },\n\n // Email plugin\n 'POST /admin/plugins/email/api/send': { description: 'Send an email', category: 'Admin', authentication: true },\n 'GET /admin/plugins/email/api/templates': { description: 'List email templates', category: 'Admin', authentication: true },\n 'POST /admin/plugins/email/api/test': { description: 'Send a test email', category: 'Admin', authentication: true },\n}\n\n// ============================================================================\n// Whitelist Patterns for API routes\n// ============================================================================\n\nconst INCLUDED_ROUTE_PATTERNS: RegExp[] = [\n /^\\/api\\//, // All /api/* routes\n /^\\/api$/, // API root\n /^\\/auth\\/(?!login$|register$)/, // Auth routes except GET login/register HTML pages\n /^\\/auth\\/login$/, // POST /auth/login (method filtered later)\n /^\\/auth\\/register$/, // POST /auth/register (method filtered later)\n /^\\/admin\\/api\\//, // Admin API endpoints\n /^\\/admin\\/api-keys\\/api\\//, // API key management\n /^\\/admin\\/cache\\/api\\//, // Cache management API\n /^\\/admin\\/plugins\\/.*\\/api\\//, // Plugin API endpoints\n /^\\/admin\\/database-tools\\/api\\//, // Database tools API\n /^\\/admin\\/seed-data\\/api\\//, // Seed data API\n /^\\/workflow\\//, // Workflow endpoints\n /^\\/health$/, // Health check\n /^\\/files\\//, // File serving\n /^\\/forms\\//, // Public form endpoints\n]\n\n// Routes to always exclude (even if they match an include pattern)\nconst EXCLUDED_ROUTES = new Set([\n 'GET /auth/login',\n 'GET /auth/register',\n 'GET /auth/login/form',\n])\n\n// ============================================================================\n// Route Discovery\n// ============================================================================\n\nlet cachedRouteList: RouteMetadata[] | null = null\n\nfunction isIncludedRoute(method: string, path: string): boolean {\n // Check exclusions first\n const key = `${method} ${path}`\n if (EXCLUDED_ROUTES.has(key)) {\n return false\n }\n\n // Check if the path matches any include pattern\n return INCLUDED_ROUTE_PATTERNS.some(pattern => pattern.test(path))\n}\n\nfunction inferCategory(path: string): string {\n if (path.startsWith('/auth/')) return 'Auth'\n if (path.startsWith('/api/search')) return 'Search'\n if (path.startsWith('/api/media')) return 'Media'\n if (path.startsWith('/api/system')) return 'System'\n if (path.startsWith('/api/content') || path.startsWith('/api/collections')) return 'Content'\n if (path.startsWith('/api/forms')) return 'Forms'\n if (path.startsWith('/admin/api-keys')) return 'API Keys'\n if (path.startsWith('/admin/cache')) return 'Cache'\n if (path.startsWith('/admin/plugins/ai-search')) return 'Search'\n if (path.startsWith('/admin/api')) return 'Admin'\n if (path.startsWith('/admin/database-tools')) return 'Admin'\n if (path.startsWith('/admin/seed-data')) return 'Admin'\n if (path.startsWith('/admin/plugins/email')) return 'Admin'\n if (path.startsWith('/workflow/')) return 'Workflow'\n if (path.startsWith('/forms/')) return 'Forms'\n if (path.startsWith('/files/')) return 'Files'\n if (path === '/health' || path.startsWith('/api')) return 'System'\n return 'Other'\n}\n\nfunction inferAuth(path: string): boolean | 'unknown' {\n // Known public routes\n if (path === '/health' || path === '/api' || path === '/api/health') return false\n if (path === '/api/system/info' || path === '/api/system/schema') return false\n if (path.startsWith('/files/')) return false\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/')) return false\n\n // Admin routes require auth\n if (path.startsWith('/admin/')) return true\n if (path.startsWith('/workflow/')) return true\n\n return 'unknown'\n}\n\nexport function buildRouteList(app: any): RouteMetadata[] {\n if (cachedRouteList) return cachedRouteList\n\n if (!app) return []\n\n try {\n const routes = inspectRoutes(app as any)\n\n // Deduplicate and filter\n const seen = new Set()\n const result: RouteMetadata[] = []\n\n for (const route of routes) {\n // Skip middleware entries\n if (route.isMiddleware) continue\n // Skip ALL method (middleware-like catch-all)\n if (route.method === 'ALL') continue\n\n const key = `${route.method} ${route.path}`\n\n // Skip duplicates\n if (seen.has(key)) continue\n seen.add(key)\n\n // Apply whitelist filter\n if (!isIncludedRoute(route.method, route.path)) continue\n\n // Look up metadata\n const meta = ROUTE_METADATA[key]\n\n if (meta) {\n result.push({\n method: route.method,\n path: route.path,\n description: meta.description,\n authentication: meta.authentication,\n category: meta.category,\n documented: true\n })\n } else {\n // Auto-discovered: infer category and auth\n result.push({\n method: route.method,\n path: route.path,\n description: '',\n authentication: inferAuth(route.path),\n category: inferCategory(route.path),\n documented: false\n })\n }\n }\n\n // Sort: by category, then method order, then path\n const methodOrder: Record = { GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4 }\n result.sort((a, b) => {\n const catCmp = a.category.localeCompare(b.category)\n if (catCmp !== 0) return catCmp\n const methCmp = (methodOrder[a.method] ?? 5) - (methodOrder[b.method] ?? 5)\n if (methCmp !== 0) return methCmp\n return a.path.localeCompare(b.path)\n })\n\n cachedRouteList = result\n return result\n } catch (error) {\n console.error('Failed to inspect routes:', error)\n return []\n }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-WAEQXGCX.cjs b/packages/core/dist/chunk-XWQVFWPW.cjs similarity index 99% rename from packages/core/dist/chunk-WAEQXGCX.cjs rename to packages/core/dist/chunk-XWQVFWPW.cjs index de0b8f6cf..b1549aa0a 100644 --- a/packages/core/dist/chunk-WAEQXGCX.cjs +++ b/packages/core/dist/chunk-XWQVFWPW.cjs @@ -1894,5 +1894,5 @@ exports.setAppInstance = setAppInstance; exports.systemLogs = systemLogs; exports.users = users; exports.workflowHistory = workflowHistory; -//# sourceMappingURL=chunk-WAEQXGCX.cjs.map -//# sourceMappingURL=chunk-WAEQXGCX.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-XWQVFWPW.cjs.map +//# sourceMappingURL=chunk-XWQVFWPW.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-QFWHAFEO.js.map b/packages/core/dist/chunk-XWQVFWPW.cjs.map similarity index 53% rename from packages/core/dist/chunk-QFWHAFEO.js.map rename to packages/core/dist/chunk-XWQVFWPW.cjs.map index c442b21a0..dd0120fba 100644 --- a/packages/core/dist/chunk-QFWHAFEO.js.map +++ b/packages/core/dist/chunk-XWQVFWPW.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/db/schema.ts","../../../node_modules/src/constants.ts","../../../node_modules/src/utils.ts","../../../node_modules/src/column.ts","../../../node_modules/src/schema.ts","../src/services/logger.ts","../src/services/cache.ts","../src/services/settings.ts","../src/services/telemetry-service.ts","../src/services/route-metadata.ts"],"names":["zod","z","integer","columns"],"mappings":";;;;;;;;;AAAA,IAAA,cAAA,GAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,0BAAA,EAAA,MAAA,0BAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,6BAAA,EAAA,MAAA,6BAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,2BAAA,EAAA,MAAA,2BAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,0BAAA,EAAA,MAAA,0BAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,6BAAA,EAAA,MAAA,6BAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,2BAAA,EAAA,MAAA,2BAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;ACAO,IAAM,SAAA,GAAY;EACxB,QAAA,EAAU,IAAA;EACV,QAAA,EAAU,GAAA;EACV,iBAAA,EAAmB,GAAA;EACnB,SAAA,EAAW,MAAA;EACX,SAAA,EAAW,KAAA;EACX,kBAAA,EAAoB,KAAA;EACpB,SAAA,EAAW,QAAA;EACX,SAAA,EAAW,OAAA;EACX,kBAAA,EAAoB,QAAA;EACpB,SAAA,EAAW,WAAA;EACX,SAAA,EAAW,UAAA;EACX,kBAAA,EAAoB,UAAA;EACpB,SAAA,EAAW,gBAAA;EACX,SAAA,EAAW,eAAA;EACX,kBAAA,EAAoB,eAAA;AACpB,EAAA,SAAA,EAAW,CAAC,oBAAA;EACZ,SAAA,EAAW,oBAAA;EACX,kBAAA,EAAoB;;ACbL,SAAA,YAAA,CAA+B,QAAgB,WAAA,EAAqB;AACnF,EAAA,OAAO,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC9C;AAEM,SAAU,WAAW,MAAA,EAAc;AACxC,EAAA,OAAO,YAAA,IAAgB,UAAU,KAAA,CAAM,OAAA,CAAQ,OAAO,UAAU,CAAA,IAAK,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,CAAA;AACjG;AAEO,IAAM,QAAA,GAAqE,UAAA;ACgD3E,IAAM,gBAAgBA,CAAAA,CAAI,KAAA,CAAM,CAACA,CAAAA,CAAI,QAAM,EAAIA,CAAAA,CAAI,MAAA,EAAM,EAAIA,EAAI,OAAA,EAAO,EAAIA,CAAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AACjF,IAAA,UAAA,GAAgCA,EAAI,KAAA,CAAM;AACtD,EAAA,aAAA;AACAA,EAAAA,CAAAA,CAAI,OAAOA,CAAAA,CAAI,MAAA,EAAM,EAAIA,CAAAA,CAAI,KAAK,CAAA;EAClCA,CAAAA,CAAI,KAAA,CAAMA,CAAAA,CAAI,GAAA,EAAK;AACnB,CAAA,CAAA;AACY,IAAA,eAAoCA,CAAAA,CAAI,MAAA,CAAe,CAAC,CAAA,KAAM,aAAa,MAAM,CAAA;AAE9E,SAAA,cAAA,CACf,QACA,OAAA,EAIY;AAEZ,EAAA,MAAMC,GAAAA,GAAwCD,CAAAA;AAC9C,EAAA,MAAM,MAAA,GAA4B,EAAA;AAClC,EAAA,IAAI,MAAA;AAEJ,EAAA,IAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AACvB,IAAA,MAAA,GAAS,MAAA,CAAO,WAAW,MAAA,GAASC,GAAAA,CAAE,KAAK,MAAA,CAAO,UAAU,CAAA,GAAIA,GAAAA,CAAE,MAAA,EAAM;;AAGzE,EAAA,IAAI,CAAC,MAAA,EAAQ;AAEZ,IAAA,IAAI,aAAkD,MAAA,EAAQ,CAAC,YAAA,EAAc,cAAc,CAAC,CAAA,EAAG;AAC9F,MAAA,MAAA,GAASA,GAAAA,CAAE,MAAM,CAACA,GAAAA,CAAE,QAAM,EAAIA,GAAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAEzC,IAAA,CAAA,MAAA,IAAA,YAAA,CAAyD,MAAA,EAAQ,CAAC,kBAAA,EAAoB,eAAe,CAAC,CAAA,EACrG;AACD,MAAA,MAAA,GAASA,GAAAA,CAAE,MAAA,CAAO,EAAE,CAAA,EAAGA,GAAAA,CAAE,MAAA,EAAM,EAAI,CAAA,EAAGA,GAAAA,CAAE,MAAA,EAAM,EAAI,CAAA;AACxC,IAAA,CAAA,MAAA,IAAA,YAAA,CAAgD,MAAA,EAAQ,CAAC,cAAA,EAAgB,UAAU,CAAC,CAAA,EAAG;AACjG,MAAA,MAAA,GAASA,GAAAA,CAAE,KAAA,CAAMA,GAAAA,CAAE,MAAA,EAAQ,CAAA;AAC3B,MAAA,MAAA,GAAS,OAAO,UAAA,GAAc,MAAA,CAA6B,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,GAAI,MAAA;AAC7E,IAAA,CAAA,MAAA,IAAA,YAAA,CAA+B,MAAA,EAAQ,CAAC,QAAQ,CAAC,CAAA,EAAG;AAC9D,MAAA,MAAA,GAASA,GAAAA,CAAE,KAAA,CAAM,CAACA,GAAAA,CAAE,MAAA,EAAM,EAAIA,GAAAA,CAAE,MAAA,EAAM,EAAIA,GAAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAC3C,IAAA,CAAA,MAAA,IAAA,YAAA,CAA6B,MAAA,EAAQ,CAAC,WAAW,CAAC,CAAA,EAAG;AAC/D,MAAA,MAAA,GAASA,IAAE,MAAA,CAAO;AACjB,QAAA,CAAA,EAAGA,IAAE,MAAA,EAAM;AACX,QAAA,CAAA,EAAGA,IAAE,MAAA,EAAM;AACX,QAAA,CAAA,EAAGA,IAAE,MAAA;OACL,CAAA;AACF,IAAA,CAAA,MAAA,IACS,YAAA,CAAgC,MAAA,EAAQ,CAAC,SAAS,CAAC,CAAA,EAAG;AAC9D,MAAA,MAAA,GAASA,IAAE,KAAA,CAAM,cAAA,CAAe,MAAA,CAAO,UAAmB,CAAC,CAAA;AAC3D,MAAA,MAAA,GAAS,OAAO,IAAA,GAAQ,MAAA,CAA6B,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AACjE,IAAA,CAAA,MAAA,IAAA,MAAA,CAAO,aAAa,OAAA,EAAS;AACvC,MAAA,MAAA,GAASA,GAAAA,CAAE,KAAA,CAAMA,GAAAA,CAAE,GAAA,EAAK,CAAA;AACd,IAAA,CAAA,MAAA,IAAA,MAAA,CAAO,aAAa,QAAA,EAAU;AACxC,MAAA,MAAA,GAAS,oBAAA,CAAqB,MAAA,EAAQA,GAAAA,EAAG,MAAM,CAAA;AACrC,IAAA,CAAA,MAAA,IAAA,MAAA,CAAO,aAAa,QAAA,EAAU;AACxC,MAAA,MAAA,GAAS,oBAAA,CAAqB,MAAA,EAAQA,GAAAA,EAAG,MAAM,CAAA;AACrC,IAAA,CAAA,MAAA,IAAA,MAAA,CAAO,aAAa,SAAA,EAAW;AACzC,MAAA,MAAA,GAAS,MAAA,KAAW,QAAQ,MAAA,CAAO,OAAA,GAAUA,IAAE,MAAA,CAAO,OAAA,EAAO,GAAKA,GAAAA,CAAE,OAAA,EAAO;AACjE,IAAA,CAAA,MAAA,IAAA,MAAA,CAAO,aAAa,MAAA,EAAQ;AACtC,MAAA,MAAA,GAAS,MAAA,KAAW,QAAQ,MAAA,CAAO,IAAA,GAAOA,IAAE,MAAA,CAAO,IAAA,EAAI,GAAKA,GAAAA,CAAE,IAAA,EAAI;AACxD,IAAA,CAAA,MAAA,IAAA,MAAA,CAAO,aAAa,QAAA,EAAU;AACxC,MAAA,MAAA,GAAS,oBAAA,CAAqB,MAAA,EAAQA,GAAAA,EAAG,MAAM,CAAA;AACrC,IAAA,CAAA,MAAA,IAAA,MAAA,CAAO,aAAa,MAAA,EAAQ;AACtC,MAAA,MAAA,GAAS,UAAA;AACC,IAAA,CAAA,MAAA,IAAA,MAAA,CAAO,aAAa,QAAA,EAAU;AACxC,MAAA,MAAA,GAASA,IAAE,GAAA,EAAG;AACJ,IAAA,CAAA,MAAA,IAAA,MAAA,CAAO,aAAa,QAAA,EAAU;AACxC,MAAA,MAAA,GAAS,YAAA;;;AAIX,EAAA,IAAI,CAAC,MAAA,EAAQ;AACZ,IAAA,MAAA,GAASA,IAAE,GAAA,EAAG;;AAGf,EAAA,OAAO,MAAA;AACR;AAEA,SAAS,oBAAA,CACR,MAAA,EACAA,EAAAA,EACA,MAAA,EAEW;AAEX,EAAA,IAAI,QAAA,GAAW,MAAA,CAAO,UAAA,EAAU,CAAG,SAAS,UAAU,CAAA;AACtD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,GAAA;AACJ,EAAA,IAAIC,QAAAA,GAAU,KAAA;AAEd,EAAA,IAAI,aAA0D,MAAA,EAAQ,CAAC,cAAA,EAAgB,oBAAoB,CAAC,CAAA,EAAG;AAC9G,IAAA,GAAA,GAAM,QAAA,GAAW,IAAI,SAAA,CAAU,QAAA;AAC/B,IAAA,GAAA,GAAM,QAAA,GAAW,SAAA,CAAU,iBAAA,GAAoB,SAAA,CAAU,QAAA;AACzD,IAAAA,QAAAA,GAAU,IAAA;AAEV,EAAA,CAAA,MAAA,IAAA,YAAA,CAAmG,MAAA,EAAQ;AAC1G,IAAA,YAAA;AACA,IAAA,eAAA;AACA,IAAA,eAAA;AACA,IAAA;AACA,GAAA,CAAA,EACA;AACD,IAAA,GAAA,GAAM,QAAA,GAAW,IAAI,SAAA,CAAU,SAAA;AAC/B,IAAA,GAAA,GAAM,QAAA,GAAW,SAAA,CAAU,kBAAA,GAAqB,SAAA,CAAU,SAAA;AAC1D,IAAAA,QAAAA,GAAU,IAAA;AAEV,EAAA,CAAA,MAAA,IAAA,YAAA,CAEE,MAAA,EAAQ;AACT,IAAA,QAAA;AACA,IAAA,YAAA;AACA,IAAA,gBAAA;AACA,IAAA,sBAAA;AACA,IAAA;AACA,GAAA,CAAA,EACA;AACD,IAAA,GAAA,GAAM,QAAA,GAAW,IAAI,SAAA,CAAU,SAAA;AAC/B,IAAA,GAAA,GAAM,QAAA,GAAW,SAAA,CAAU,kBAAA,GAAqB,SAAA,CAAU,SAAA;AAC1D,IAAAA,WAAU,YAAA,CAAa,MAAA,EAAQ,CAAC,gBAAA,EAAkB,sBAAsB,CAAC,CAAA;AAEzE,EAAA,CAAA,MAAA,IAAA,YAAA,CAAmF,MAAA,EAAQ;AAC1F,IAAA,WAAA;AACA,IAAA,UAAA;AACA,IAAA,UAAA;AACA,IAAA;AACA,GAAA,CAAA,EACA;AACD,IAAA,GAAA,GAAM,QAAA,GAAW,IAAI,SAAA,CAAU,SAAA;AAC/B,IAAA,GAAA,GAAM,QAAA,GAAW,SAAA,CAAU,kBAAA,GAAqB,SAAA,CAAU,SAAA;AAC1D,IAAAA,QAAAA,GAAU,IAAA;AAEV,EAAA,CAAA,MAAA,IAAA,YAAA,CAOE,MAAA,EAAQ;AACT,IAAA,mBAAA;AACA,IAAA,WAAA;AACA,IAAA,aAAA;AACA,IAAA,iBAAA;AACA,IAAA,mBAAA;AACA,IAAA;AACA,GAAA,CAAA,EACA;AACD,IAAA,GAAA,GAAM,QAAA,GAAW,IAAI,SAAA,CAAU,SAAA;AAC/B,IAAA,GAAA,GAAM,QAAA,GAAW,SAAA,CAAU,kBAAA,GAAqB,SAAA,CAAU,SAAA;AAE1D,EAAA,CAAA,MAAA,IAAA,YAAA,CASC,MAAA,EACA;AACC,IAAA,YAAA;AACA,IAAA,eAAA;AACA,IAAA,eAAA;AACA,IAAA,aAAA;AACA,IAAA,qBAAA;AACA,IAAA,mBAAA;AACA,IAAA;AACA,GAAA,CAAA,EAED;AACD,IAAA,QAAA,GAAW,YAAY,YAAA,CAAa,MAAA,EAAQ,CAAC,aAAA,EAAe,mBAAmB,CAAC,CAAA;AAChF,IAAA,GAAA,GAAM,QAAA,GAAW,IAAI,MAAA,CAAO,gBAAA;AAC5B,IAAA,GAAA,GAAM,MAAA,CAAO,gBAAA;AACb,IAAAA,QAAAA,GAAU,IAAA;AACA,EAAA,CAAA,MAAA,IAAA,YAAA,CAAoD,MAAA,EAAQ,CAAC,WAAA,EAAa,iBAAiB,CAAC,CAAA,EAAG;AACzG,IAAA,GAAA,GAAM,IAAA;AACN,IAAA,GAAA,GAAM,IAAA;AACN,IAAAA,QAAAA,GAAU,IAAA;AACJ,EAAA,CAAA,MAAA;AACN,IAAA,GAAA,GAAM,MAAA,CAAO,gBAAA;AACb,IAAA,GAAA,GAAM,MAAA,CAAO,gBAAA;;AAGd,EAAA,IAAI,MAAA,GAAS,WAAW,IAAA,IAAQ,MAAA,EAAQ,SACrCA,QAAAA,GAAUD,EAAAA,CAAE,OAAO,MAAA,EAAM,GAAKA,GAAE,MAAA,CAAO,MAAA,GAAS,GAAA,EAAG,GACnDC,WACAD,EAAAA,CAAE,GAAA,EAAG,GACLA,EAAAA,CAAE,MAAA,EAAM;AACX,EAAA,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,CAAE,IAAI,GAAG,CAAA;AAChC,EAAA,OAAO,MAAA;AACR;AAEA,SAAS,oBAAA,CACR,MAAA,EACAA,EAAAA,EACA,MAAA,EAEW;AAEX,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,EAAU,CAAG,SAAS,UAAU,CAAA;AACxD,EAAA,MAAM,GAAA,GAAM,QAAA,GAAW,EAAA,GAAK,SAAA,CAAU,SAAA;AACtC,EAAA,MAAM,GAAA,GAAM,QAAA,GAAW,SAAA,CAAU,kBAAA,GAAqB,SAAA,CAAU,SAAA;AAEhE,EAAA,MAAM,MAAA,GAAS,MAAA,KAAW,IAAA,IAAQ,MAAA,EAAQ,MAAA,GAASA,GAAE,MAAA,CAAO,MAAA,EAAM,GAAKA,EAAAA,CAAE,MAAA,EAAM;AAC/E,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,CAAE,IAAI,GAAG,CAAA;AAC/B;AAEA,SAAS,oBAAA,CACR,MAAA,EACAA,EAAAA,EACA,MAAA,EAEW;AAEX,EAAA,IAAI,YAAA,CAA2D,MAAA,EAAQ,CAAC,QAAQ,CAAC,CAAA,EAAG;AACnF,IAAA,OAAOA,GAAE,IAAA,EAAI;;AAGd,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,KAAA,GAAQ,KAAA;AAEZ,EAAA,IAAI,aAA+C,MAAA,EAAQ,CAAC,WAAA,EAAa,YAAY,CAAC,CAAA,EAAG;AACxF,IAAA,GAAA,GAAM,MAAA,CAAO,MAAA;AAEb,EAAA,CAAA,MAAA,IAAA,YAAA,CAA0D,MAAA,EAAQ,CAAC,cAAA,EAAgB,oBAAoB,CAAC,CAAA,EACvG;AACD,IAAA,GAAA,GAAM,MAAA,CAAO,UAAU,SAAA,CAAU,kBAAA;AACvB,EAAA,CAAA,MAAA,IAAA,YAAA,CAAoD,MAAA,EAAQ,CAAC,WAAA,EAAa,iBAAiB,CAAC,CAAA,EAAG;AACzG,IAAA,IAAI,MAAA,CAAO,aAAa,UAAA,EAAY;AACnC,MAAA,GAAA,GAAM,SAAA,CAAU,kBAAA;AACN,IAAA,CAAA,MAAA,IAAA,MAAA,CAAO,aAAa,YAAA,EAAc;AAC5C,MAAA,GAAA,GAAM,SAAA,CAAU,kBAAA;AACN,IAAA,CAAA,MAAA,IAAA,MAAA,CAAO,aAAa,MAAA,EAAQ;AACtC,MAAA,GAAA,GAAM,SAAA,CAAU,kBAAA;AACV,IAAA,CAAA,MAAA;AACN,MAAA,GAAA,GAAM,SAAA,CAAU,iBAAA;;;AAIlB,EAAA,IACC,aAAkE,MAAA,EAAQ;AACzE,IAAA,QAAA;AACA,IAAA,WAAA;AACA,IAAA;AACA,GAAA,CAAA,EACA;AACD,IAAA,GAAA,GAAM,MAAA,CAAO,MAAA;AACb,IAAA,KAAA,GAAQ,IAAA;;AAGT,EAAA,IAAI,YAAA,CAAkC,MAAA,EAAQ,CAAC,gBAAgB,CAAC,CAAA,EAAG;AAClE,IAAA,KAAA,GAAQ,SAAA;AACR,IAAA,GAAA,GAAM,MAAA,CAAO,UAAA;;AAGd,EAAA,IAAI,MAAA,GAAS,MAAA,KAAW,IAAA,IAAQ,MAAA,EAAQ,MAAA,GAASA,GAAE,MAAA,CAAO,MAAA,EAAM,GAAKA,EAAAA,CAAE,MAAA,EAAM;AAC7E,EAAA,MAAA,GAAS,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,GAAI,MAAA;AACvC,EAAA,OAAO,GAAA,IAAO,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,GAAG,IAAI,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA;AACpE;AChTA,SAAS,WAAW,SAAA,EAAuB;AAC1C,EAAA,OAAO,QAAQ,SAAS,CAAA,GAAI,gBAAgB,SAAS,CAAA,GAAI,sBAAsB,SAAS,CAAA;AACzF;AAEA,SAAS,aAAA,CACR,OAAA,EACA,WAAA,EACA,UAAA,EACA,OAAA,EAEC;AAED,EAAA,MAAM,gBAA2C,EAAA;AAEjD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACtD,IAAA,IAAI,CAAC,EAAA,CAAG,QAAA,EAAU,MAAM,CAAA,IAAK,CAAC,GAAG,QAAA,EAAU,GAAG,CAAA,IAAK,CAAC,GAAG,QAAA,EAAU,GAAA,CAAI,OAAO,CAAA,IAAK,OAAO,aAAa,QAAA,EAAU;AAC9G,MAAA,MAAME,QAAAA,GAAU,QAAQ,QAAQ,CAAA,IAAK,OAAO,QAAQ,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,GAAI,QAAA;AAC/E,MAAA,aAAA,CAAc,GAAG,CAAA,GAAI,aAAA,CAAcA,QAAAA,EAAS,WAAA,CAAY,GAAG,CAAA,IAAK,EAAA,EAAI,UAAmB,CAAA;AACvF,MAAA;;AAGD,IAAA,MAAM,UAAA,GAAa,YAAY,GAAG,CAAA;AAClC,IAAA,IAAI,UAAA,KAAe,MAAA,IAAa,OAAO,UAAA,KAAe,UAAA,EAAY;AACjE,MAAA,aAAA,CAAc,GAAG,CAAA,GAAI,UAAA;AACrB,MAAA;;AAGD,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,QAAA,EAAU,MAAM,IAAI,QAAA,GAAW,MAAA;AACjD,IAAA,MAAM,SAAS,MAAA,GAAS,cAAA,CAAe,MAAe,CAAA,GAAI,EAAE,GAAA,EAAG;AAC/D,IAAA,MAAM,UAAU,OAAO,UAAA,KAAe,UAAA,GAAa,UAAA,CAAW,MAAM,CAAA,GAAI,MAAA;AAExE,IAAA,IAAI,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA,EAAG;AAC7B,MAAA;AACM,IAAA,CAAA,MAAA;AACN,MAAA,aAAA,CAAc,GAAG,CAAA,GAAI,OAAA;;AAGtB,IAAA,IAAI,MAAA,EAAQ;AACX,MAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG;AAChC,QAAA,aAAA,CAAc,GAAG,CAAA,GAAI,aAAA,CAAc,GAAG,EAAG,QAAA,EAAQ;;AAGlD,MAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG;AAChC,QAAA,aAAA,CAAc,GAAG,CAAA,GAAI,aAAA,CAAc,GAAG,EAAG,QAAA,EAAQ;;;;AAKpD,EAAA,OAAO,CAAA,CAAE,OAAO,aAAa,CAAA;AAC9B;AAEA,SAAS,UAAA,CACR,OACA,OAAA,EAEC;AAED,EAAA,MAAM,GAAA,GAAwC,CAAA;AAC9C,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACjC;AAEA,IAAM,gBAAA,GAA+B;AACpC,EAAA,KAAA,EAAO,MAAM,KAAA;AACb,EAAA,QAAA,EAAU,MAAM,KAAA;EAChB,QAAA,EAAU,CAAC,MAAA,KAAW,CAAC,MAAA,CAAO;;AAG/B,IAAM,gBAAA,GAA+B;EACpC,KAAA,EAAO,CAAC,WAAW,MAAA,EAAQ,SAAA,EAAW,SAAS,QAAA,IAAY,MAAA,EAAQ,mBAAmB,IAAA,KAAS,QAAA;AAC/F,EAAA,QAAA,EAAU,CAAC,MAAA,KAAW,CAAC,OAAO,OAAA,IAAY,MAAA,CAAO,WAAW,MAAA,CAAO,UAAA;EACnE,QAAA,EAAU,CAAC,MAAA,KAAW,CAAC,MAAA,CAAO;;IASlB,kBAAA,GAAoD,CAChE,QACA,MAAA,KACG;AACH,EAAA,IAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AACrB,IAAA,OAAO,WAAW,MAAM,CAAA;;AAEzB,EAAA,MAAM,OAAA,GAAU,WAAW,MAAM,CAAA;AACjC,EAAA,OAAO,aAAA,CAAc,OAAA,EAAmB,IAAI,gBAAgB,CAAA;AAC7D,CAAA;IAEa,kBAAA,GAAoD,CAChE,QACA,MAAA,KACG;AACH,EAAA,MAAM,OAAA,GAAU,WAAW,MAAM,CAAA;AACjC,EAAA,OAAO,aAAA,CAAc,OAAA,EAAS,MAAA,IAAU,IAAI,gBAAgB,CAAA;AAC7D,CAAA;;;AJ1GO,IAAM,KAAA,GAAQ,YAAY,OAAA,EAAS;AAAA,EACxC,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA,EACtC,UAAU,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA,EAC5C,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,EACtC,QAAA,EAAU,IAAA,CAAK,WAAW,CAAA,CAAE,OAAA,EAAQ;AAAA,EACpC,YAAA,EAAc,KAAK,eAAe,CAAA;AAAA;AAAA,EAClC,MAAM,IAAA,CAAK,MAAM,EAAE,OAAA,EAAQ,CAAE,QAAQ,QAAQ,CAAA;AAAA;AAAA,EAC7C,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAAA,EACrB,QAAA,EAAU,OAAA,CAAQ,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC1E,WAAA,EAAa,QAAQ,eAAe,CAAA;AAAA,EACpC,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,EACzC,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA;AACnC,CAAC;AAGM,IAAM,WAAA,GAAc,YAAY,aAAA,EAAe;AAAA,EACpD,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,MAAM,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA,EACpC,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC1C,WAAA,EAAa,KAAK,aAAa,CAAA;AAAA,EAC/B,MAAA,EAAQ,KAAK,QAAA,EAAU,EAAE,MAAM,MAAA,EAAQ,EAAE,OAAA,EAAQ;AAAA;AAAA,EACjD,QAAA,EAAU,OAAA,CAAQ,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC1E,OAAA,EAAS,OAAA,CAAQ,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA;AAAA,EACxE,UAAA,EAAY,IAAA,CAAK,aAAa,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA;AAAA,EAC9C,QAAA,EAAU,KAAK,WAAW,CAAA;AAAA;AAAA,EAC1B,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAc,EAAE,MAAM,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,sBAAM,IAAI,MAAM,CAAA;AAAA,EAC7F,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAc,EAAE,MAAM,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,sBAAM,IAAI,MAAM;AAC/F,CAAC;AAGM,IAAM,OAAA,GAAU,YAAY,SAAA,EAAW;AAAA,EAC5C,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,YAAA,EAAc,KAAK,eAAe,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,WAAA,CAAY,EAAE,CAAA;AAAA,EAC7E,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC3B,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC7B,IAAA,EAAM,KAAK,MAAA,EAAQ,EAAE,MAAM,MAAA,EAAQ,EAAE,OAAA,EAAQ;AAAA;AAAA,EAC7C,QAAQ,IAAA,CAAK,QAAQ,EAAE,OAAA,EAAQ,CAAE,QAAQ,OAAO,CAAA;AAAA;AAAA,EAChD,aAAa,OAAA,CAAQ,cAAA,EAAgB,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,EAC1D,QAAA,EAAU,KAAK,WAAW,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,KAAA,CAAM,EAAE,CAAA;AAAA,EAC/D,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAc,EAAE,MAAM,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,sBAAM,IAAI,MAAM,CAAA;AAAA,EAC7F,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAc,EAAE,MAAM,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,sBAAM,IAAI,MAAM;AAC/F,CAAC;AAGM,IAAM,eAAA,GAAkB,YAAY,kBAAA,EAAoB;AAAA,EAC7D,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,SAAA,EAAW,KAAK,YAAY,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,OAAA,CAAQ,EAAE,CAAA;AAAA,EACnE,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,EACpC,IAAA,EAAM,KAAK,MAAA,EAAQ,EAAE,MAAM,MAAA,EAAQ,EAAE,OAAA,EAAQ;AAAA,EAC7C,QAAA,EAAU,KAAK,WAAW,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,KAAA,CAAM,EAAE,CAAA;AAAA,EAC/D,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAc,EAAE,MAAM,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,sBAAM,IAAI,MAAM;AAC/F,CAAC;AAGM,IAAM,KAAA,GAAQ,YAAY,OAAA,EAAS;AAAA,EACxC,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA,EAAQ;AAAA,EACnC,YAAA,EAAc,IAAA,CAAK,eAAe,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC5C,QAAA,EAAU,IAAA,CAAK,WAAW,CAAA,CAAE,OAAA,EAAQ;AAAA,EACpC,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC9B,KAAA,EAAO,QAAQ,OAAO,CAAA;AAAA,EACtB,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AAAA,EACxB,QAAQ,IAAA,CAAK,QAAQ,EAAE,OAAA,EAAQ,CAAE,QAAQ,SAAS,CAAA;AAAA,EAClD,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EAC9B,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EACtC,YAAA,EAAc,KAAK,eAAe,CAAA;AAAA,EAClC,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA,EACf,OAAA,EAAS,KAAK,SAAS,CAAA;AAAA,EACvB,MAAM,IAAA,CAAK,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA;AAAA,EACnC,UAAA,EAAY,KAAK,aAAa,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,KAAA,CAAM,EAAE,CAAA;AAAA,EACnE,UAAA,EAAY,OAAA,CAAQ,aAAa,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC3C,SAAA,EAAW,QAAQ,YAAY,CAAA;AAAA,EAC/B,WAAA,EAAa,QAAQ,cAAc,CAAA;AAAA,EACnC,WAAA,EAAa,QAAQ,cAAc,CAAA;AAAA,EACnC,UAAA,EAAY,QAAQ,aAAa,CAAA;AAAA,EACjC,SAAA,EAAW,QAAQ,YAAY;AACjC,CAAC;AAGM,IAAM,SAAA,GAAY,YAAY,YAAA,EAAc;AAAA,EACjD,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC3B,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA,EACtC,MAAA,EAAQ,KAAK,SAAS,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,KAAA,CAAM,EAAE,CAAA;AAAA,EAC3D,WAAA,EAAa,KAAK,aAAA,EAAe,EAAE,MAAM,MAAA,EAAQ,EAAE,OAAA,EAAQ;AAAA;AAAA,EAC3D,WAAW,OAAA,CAAQ,YAAA,EAAc,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,EACtD,YAAY,OAAA,CAAQ,cAAA,EAAgB,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,EACzD,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAc,EAAE,MAAM,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,sBAAM,IAAI,MAAM;AAC/F,CAAC;AAIM,IAAM,eAAA,GAAkB,YAAY,kBAAA,EAAoB;AAAA,EAC7D,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,SAAA,EAAW,KAAK,YAAY,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,OAAA,CAAQ,EAAE,CAAA;AAAA,EACnE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC/B,UAAA,EAAY,IAAA,CAAK,aAAa,CAAA,CAAE,OAAA,EAAQ;AAAA,EACxC,QAAA,EAAU,IAAA,CAAK,WAAW,CAAA,CAAE,OAAA,EAAQ;AAAA,EACpC,MAAA,EAAQ,KAAK,SAAS,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,KAAA,CAAM,EAAE,CAAA;AAAA,EAC3D,OAAA,EAAS,KAAK,SAAS,CAAA;AAAA,EACvB,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAc,EAAE,MAAM,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,sBAAM,IAAI,MAAM;AAC/F,CAAC;AAGM,IAAM,OAAA,GAAU,YAAY,SAAA,EAAW;AAAA,EAC5C,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,MAAM,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA,EACpC,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC1C,WAAA,EAAa,KAAK,aAAa,CAAA;AAAA,EAC/B,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,EACjC,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC/B,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA,EAAQ;AAAA,EACnC,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,EACjB,QAAQ,IAAA,CAAK,QAAQ,EAAE,OAAA,EAAQ,CAAE,QAAQ,UAAU,CAAA;AAAA;AAAA,EACnD,MAAA,EAAQ,OAAA,CAAQ,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACvE,UAAU,IAAA,CAAK,UAAA,EAAY,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC3C,aAAa,IAAA,CAAK,aAAA,EAAe,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,EACjD,cAAc,IAAA,CAAK,cAAA,EAAgB,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,EACnD,eAAe,OAAA,CAAQ,gBAAgB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAC5D,QAAQ,OAAA,CAAQ,QAAQ,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAC7C,WAAA,EAAa,OAAA,CAAQ,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC7C,WAAA,EAAa,QAAQ,cAAc,CAAA;AAAA,EACnC,WAAA,EAAa,OAAA,CAAQ,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC7C,YAAA,EAAc,KAAK,eAAe,CAAA;AAAA,EAClC,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AAAA,EACzF,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAC;AAC3F,CAAC;AAEM,IAAM,WAAA,GAAc,YAAY,cAAA,EAAgB;AAAA,EACrD,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,QAAA,EAAU,KAAK,WAAW,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,OAAA,CAAQ,EAAE,CAAA;AAAA,EACjE,QAAA,EAAU,IAAA,CAAK,WAAW,CAAA,CAAE,OAAA,EAAQ;AAAA,EACpC,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC1C,UAAU,OAAA,CAAQ,UAAU,EAAE,OAAA,EAAQ,CAAE,QAAQ,EAAE,CAAA;AAAA,EAClD,QAAA,EAAU,OAAA,CAAQ,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC1E,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAC;AAC3F,CAAC;AAEM,IAAM,YAAA,GAAe,YAAY,eAAA,EAAiB;AAAA,EACvD,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,QAAA,EAAU,KAAK,WAAW,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,OAAA,CAAQ,EAAE,CAAA;AAAA,EACjE,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC3B,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC/B,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC1C,YAAY,IAAA,CAAK,YAAA,EAAc,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC/C,QAAA,EAAU,OAAA,CAAQ,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC1E,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAC;AAC3F,CAAC;AAEM,IAAM,YAAA,GAAe,YAAY,eAAA,EAAiB;AAAA,EACvD,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,QAAA,EAAU,KAAK,WAAW,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,OAAA,CAAQ,EAAE,CAAA;AAAA,EACjE,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EACtC,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,EACtC,WAAW,OAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,GAAG,CAAA;AAAA,EACtD,cAAc,IAAA,CAAK,eAAe,EAAE,OAAA,EAAQ,CAAE,QAAQ,QAAQ,CAAA;AAAA;AAAA,EAC9D,QAAA,EAAU,OAAA,CAAQ,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC1E,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAC;AAC3F,CAAC;AAEM,IAAM,iBAAA,GAAoB,YAAY,qBAAA,EAAuB;AAAA,EAClE,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,QAAA,EAAU,KAAK,WAAW,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,OAAA,CAAQ,EAAE,CAAA;AAAA,EACjE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC/B,MAAA,EAAQ,KAAK,SAAS,CAAA;AAAA,EACtB,SAAS,IAAA,CAAK,SAAA,EAAW,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,EACzC,SAAA,EAAW,OAAA,CAAQ,WAAW,CAAA,CAAE,SAAQ,CAAE,UAAA,CAAW,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAC;AAC1F,CAAC;AAGM,IAAM,gBAAA,GAAmB,mBAAmB,KAAA,EAAO;AAAA,EACxD,KAAA,EAAO,CAAC,MAAA,KAAgB,MAAA,CAAO,KAAA,EAAM;AAAA,EACrC,SAAA,EAAW,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACxC,QAAA,EAAU,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACvC,QAAA,EAAU,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AACzC,CAAC;AAEM,IAAM,gBAAA,GAAmB,mBAAmB,KAAK;AAEjD,IAAM,sBAAA,GAAyB,mBAAmB,WAAA,EAAa;AAAA,EACpE,IAAA,EAAM,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA,CAAE,KAAA,CAAM,cAAA,EAAgB,oDAAoD,CAAA;AAAA,EAC/G,WAAA,EAAa,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AAC5C,CAAC;AAEM,IAAM,sBAAA,GAAyB,mBAAmB,WAAW;AAE7D,IAAM,mBAAA,GAAsB,mBAAmB,OAAA,EAAS;AAAA,EAC7D,IAAA,EAAM,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA,CAAE,KAAA,CAAM,kBAAA,EAAoB,mEAAmE,CAAA;AAAA,EAClI,KAAA,EAAO,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACpC,MAAA,EAAQ,CAAC,MAAA,KAAgB;AAC3B,CAAC;AAEM,IAAM,mBAAA,GAAsB,mBAAmB,OAAO;AAEtD,IAAM,iBAAA,GAAoB,mBAAmB,KAAA,EAAO;AAAA,EACzD,QAAA,EAAU,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACvC,YAAA,EAAc,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EAC3C,QAAA,EAAU,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACvC,IAAA,EAAM,CAAC,MAAA,KAAgB,MAAA,CAAO,QAAA,EAAS;AAAA,EACvC,KAAA,EAAO,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACpC,SAAA,EAAW,CAAC,MAAA,KAAgB,MAAA,CAAO,GAAA,EAAI;AAAA,EACvC,MAAA,EAAQ,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AACvC,CAAC;AAEM,IAAM,iBAAA,GAAoB,mBAAmB,KAAK;AAGlD,IAAM,2BAAA,GAA8B,mBAAmB,eAAA,EAAiB;AAAA,EAC7E,MAAA,EAAQ,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACrC,UAAA,EAAY,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACzC,QAAA,EAAU,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AACzC,CAAC;AAEM,IAAM,2BAAA,GAA8B,mBAAmB,eAAe;AAEtE,IAAM,kBAAA,GAAqB,mBAAmB,OAAA,EAAS;AAAA,EAC5D,IAAA,EAAM,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACnC,WAAA,EAAa,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EAC1C,OAAA,EAAS,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACtC,MAAA,EAAQ,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACrC,QAAA,EAAU,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AACzC,CAAC;AAEM,IAAM,kBAAA,GAAqB,mBAAmB,OAAO;AAErD,IAAM,sBAAA,GAAyB,mBAAmB,WAAA,EAAa;AAAA,EACpE,QAAA,EAAU,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACvC,WAAA,EAAa,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AAC5C,CAAC;AAEM,IAAM,sBAAA,GAAyB,mBAAmB,WAAW;AAE7D,IAAM,uBAAA,GAA0B,mBAAmB,YAAA,EAAc;AAAA,EACtE,IAAA,EAAM,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACnC,MAAA,EAAQ,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACrC,WAAA,EAAa,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AAC5C,CAAC;AAEM,IAAM,uBAAA,GAA0B,mBAAmB,YAAY;AAE/D,IAAM,uBAAA,GAA0B,mBAAmB,YAAA,EAAc;AAAA,EACtE,SAAA,EAAW,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACxC,SAAA,EAAW,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AAC1C,CAAC;AAEM,IAAM,uBAAA,GAA0B,mBAAmB,YAAY;AAE/D,IAAM,6BAAA,GAAgC,mBAAmB,iBAAA,EAAmB;AAAA,EACjF,MAAA,EAAQ,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AACvC,CAAC;AAEM,IAAM,6BAAA,GAAgC,mBAAmB,iBAAiB;AAG1E,IAAM,UAAA,GAAa,YAAY,aAAA,EAAe;AAAA,EACnD,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EAC7B,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EACnC,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,EACjC,MAAM,IAAA,CAAK,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA;AAAA,EACnC,QAAQ,IAAA,CAAK,SAAS,EAAE,UAAA,CAAW,MAAM,MAAM,EAAE,CAAA;AAAA,EACjD,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA,EAC5B,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA,EAC5B,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA,EAC5B,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA,EAC5B,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAAA;AAAA,EACrB,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA;AAAA,EACf,UAAA,EAAY,QAAQ,aAAa,CAAA;AAAA;AAAA,EACjC,QAAA,EAAU,QAAQ,UAAU,CAAA;AAAA;AAAA,EAC5B,UAAA,EAAY,KAAK,aAAa,CAAA;AAAA;AAAA,EAC9B,MAAM,IAAA,CAAK,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA;AAAA,EACnC,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAAA;AAAA,EACrB,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAc,EAAE,MAAM,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,sBAAM,IAAI,MAAM;AAC/F,CAAC;AAGM,IAAM,SAAA,GAAY,YAAY,YAAA,EAAc;AAAA,EACjD,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,UAAU,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA,EAC5C,OAAA,EAAS,OAAA,CAAQ,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACvE,OAAO,IAAA,CAAK,OAAO,EAAE,OAAA,EAAQ,CAAE,QAAQ,MAAM,CAAA;AAAA;AAAA,EAC7C,WAAW,OAAA,CAAQ,WAAW,EAAE,OAAA,EAAQ,CAAE,QAAQ,EAAE,CAAA;AAAA;AAAA,EACpD,OAAA,EAAS,OAAA,CAAQ,UAAU,CAAA,CAAE,QAAQ,GAAK,CAAA;AAAA;AAAA,EAC1C,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAc,EAAE,MAAM,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,sBAAM,IAAI,MAAM,CAAA;AAAA,EAC7F,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAc,EAAE,MAAM,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,sBAAM,IAAI,MAAM;AAC/F,CAAC;AAGM,IAAM,qBAAA,GAAwB,mBAAmB,UAAA,EAAY;AAAA,EAClE,KAAA,EAAO,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACpC,QAAA,EAAU,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACvC,OAAA,EAAS,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AACxC,CAAC;AAEM,IAAM,qBAAA,GAAwB,mBAAmB,UAAU;AAE3D,IAAM,qBAAA,GAAwB,mBAAmB,SAAA,EAAW;AAAA,EACjE,QAAA,EAAU,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACvC,KAAA,EAAO,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AACtC,CAAC;AAEM,IAAM,qBAAA,GAAwB,mBAAmB,SAAS;AAgC1D,IAAM,cAAA,GAAiB,YAAY,iBAAA,EAAmB;AAAA,EAC3D,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,EACtC,UAAU,IAAA,CAAK,UAAU,EAAE,OAAA,EAAQ,CAAE,QAAQ,MAAM,CAAA;AAAA,EACnD,MAAA,EAAQ,KAAK,SAAS,CAAA;AAAA,EACtB,KAAA,EAAO,KAAK,OAAO,CAAA;AAAA,EACnB,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA,EAC5B,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA,EAC5B,WAAA,EAAa,KAAK,cAAc,CAAA;AAAA,EAChC,WAAA,EAAa,KAAK,cAAc,CAAA;AAAA,EAChC,aAAA,EAAe,KAAK,gBAAgB,CAAA;AAAA,EACpC,SAAS,IAAA,CAAK,SAAA,EAAW,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,EACzC,WAAA,EAAa,KAAK,aAAa,CAAA;AAAA,EAC/B,SAAS,OAAA,CAAQ,SAAS,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAC/C,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,MAAM,IAAA,CAAK,GAAA,EAAK;AACxE,CAAC,CAAA;AAEM,IAAM,yBAAA,GAA4B,mBAAmB,cAAA,EAAgB;AAAA,EAC1E,SAAA,EAAW,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACxC,QAAA,EAAU,CAAC,MAAA,KAAgB,MAAA,CAAO,IAAI,CAAC;AACzC,CAAC,CAAA;AAEM,IAAM,yBAAA,GAA4B,mBAAmB,cAAc,CAAA;AAUnE,IAAM,KAAA,GAAQ,YAAY,OAAA,EAAS;AAAA,EACxC,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,MAAM,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA;AAAA,EACpC,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EAC1C,WAAA,EAAa,KAAK,aAAa,CAAA;AAAA,EAC/B,UAAU,IAAA,CAAK,UAAU,EAAE,OAAA,EAAQ,CAAE,QAAQ,SAAS,CAAA;AAAA;AAAA;AAAA,EAGtD,YAAA,EAAc,KAAK,eAAA,EAAiB,EAAE,MAAM,MAAA,EAAQ,EAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,EAG9D,UAAU,IAAA,CAAK,UAAA,EAAY,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA;AAAA;AAAA,EAG3C,QAAA,EAAU,OAAA,CAAQ,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC1E,QAAA,EAAU,OAAA,CAAQ,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC1E,OAAA,EAAS,OAAA,CAAQ,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA;AAAA,EAGxE,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,EACjB,KAAA,EAAO,KAAK,OAAO,CAAA;AAAA,EACnB,MAAM,IAAA,CAAK,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA;AAAA;AAAA,EAGnC,iBAAiB,OAAA,CAAQ,kBAAkB,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA,EAChE,WAAW,OAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAGpD,WAAW,IAAA,CAAK,YAAY,EAAE,UAAA,CAAW,MAAM,MAAM,EAAE,CAAA;AAAA,EACvD,WAAW,IAAA,CAAK,YAAY,EAAE,UAAA,CAAW,MAAM,MAAM,EAAE,CAAA;AAAA;AAAA,EAGvD,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,EACzC,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA;AACnC,CAAC,CAAA;AAGM,IAAM,eAAA,GAAkB,YAAY,kBAAA,EAAoB;AAAA,EAC7D,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,MAAM,KAAA,CAAM,EAAA,EAAI,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA;AAAA,EAGpF,cAAA,EAAgB,KAAK,iBAAA,EAAmB,EAAE,MAAM,MAAA,EAAQ,EAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,EAGlE,QAAQ,IAAA,CAAK,QAAQ,EAAE,OAAA,EAAQ,CAAE,QAAQ,SAAS,CAAA;AAAA;AAAA,EAClD,gBAAA,EAAkB,QAAQ,mBAAmB,CAAA;AAAA;AAAA,EAG7C,QAAQ,IAAA,CAAK,SAAS,EAAE,UAAA,CAAW,MAAM,MAAM,EAAE,CAAA;AAAA,EACjD,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA;AAAA,EAG5B,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA,EAC5B,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA,EAC5B,QAAA,EAAU,KAAK,UAAU,CAAA;AAAA,EACzB,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA,EAC5B,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA,EAC5B,WAAA,EAAa,KAAK,cAAc,CAAA;AAAA;AAAA,EAGhC,YAAY,IAAA,CAAK,aAAa,EAAE,UAAA,CAAW,MAAM,MAAM,EAAE,CAAA;AAAA,EACzD,UAAA,EAAY,QAAQ,aAAa,CAAA;AAAA,EACjC,WAAA,EAAa,KAAK,cAAc,CAAA;AAAA;AAAA,EAGhC,MAAA,EAAQ,OAAA,CAAQ,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACvE,UAAA,EAAY,OAAA,CAAQ,aAAA,EAAe,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA;AAAA,EAG/E,WAAW,IAAA,CAAK,YAAY,EAAE,UAAA,CAAW,MAAM,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,EAGzD,WAAA,EAAa,OAAA,CAAQ,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC7C,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA;AACnC,CAAC,CAAA;AAGM,IAAM,SAAA,GAAY,YAAY,YAAA,EAAc;AAAA,EACjD,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,YAAA,EAAc,IAAA,CAAK,eAAe,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,MAAM,eAAA,CAAgB,EAAA,EAAI,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA,EAC1G,OAAA,EAAS,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,MAAM,KAAA,CAAM,EAAA,EAAI,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA,EACtF,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA;AAAA,EACtC,UAAA,EAAY,OAAA,CAAQ,aAAa,CAAA,CAAE,OAAA;AACrC,CAAC,CAAA;AAGM,IAAM,gBAAA,GAAmB,mBAAmB,KAAK,CAAA;AACjD,IAAM,gBAAA,GAAmB,mBAAmB,KAAK,CAAA;AACjD,IAAM,0BAAA,GAA6B,mBAAmB,eAAe,CAAA;AACrE,IAAM,0BAAA,GAA6B,mBAAmB,eAAe,CAAA;AACrE,IAAM,oBAAA,GAAuB,mBAAmB,SAAS,CAAA;AACzD,IAAM,oBAAA,GAAuB,mBAAmB,SAAS,CAAA;AKpazD,IAAM,SAAN,MAAa;AAAA,EACV,EAAA;AAAA,EACA,OAAA,GAAmB,IAAA;AAAA,EACnB,WAAA,uBAA0C,GAAA,EAAI;AAAA,EAC9C,iBAAA,GAA4B,CAAA;AAAA,EAC5B,qBAAA,GAAgC,GAAA;AAAA;AAAA,EAExC,YAAY,QAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,EAAA,GAAK,QAAQ,QAAQ,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,QAAA,EAAuB,OAAA,EAAiB,MAAY,OAAA,EAA4C;AAC1G,IAAA,OAAO,KAAK,GAAA,CAAI,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,QAAA,EAAuB,OAAA,EAAiB,MAAY,OAAA,EAA4C;AACzG,IAAA,OAAO,KAAK,GAAA,CAAI,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,QAAA,EAAuB,OAAA,EAAiB,MAAY,OAAA,EAA4C;AACzG,IAAA,OAAO,KAAK,GAAA,CAAI,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,QAAA,EAAuB,OAAA,EAAiB,OAAqB,OAAA,EAA4C;AACnH,IAAA,MAAM,SAAA,GAAY,iBAAiB,KAAA,GAAQ;AAAA,MACzC,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM;AAAA,KACf,GAAI,KAAA;AAEJ,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,QAAA,EAAU,SAAS,SAAA,EAAW;AAAA,MACrD,GAAG,OAAA;AAAA,MACH,UAAA,EAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ;AAAA,KACpD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,QAAA,EAAuB,OAAA,EAAiB,OAAqB,OAAA,EAA4C;AACnH,IAAA,MAAM,SAAA,GAAY,iBAAiB,KAAA,GAAQ;AAAA,MACzC,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM;AAAA,KACf,GAAI,KAAA;AAEJ,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,QAAA,EAAU,SAAS,SAAA,EAAW;AAAA,MACrD,GAAG,OAAA;AAAA,MACH,UAAA,EAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ;AAAA,KACpD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,MAAA,EACA,GAAA,EACA,UAAA,EACA,UACA,OAAA,EACe;AACf,IAAA,MAAM,QAAkB,UAAA,IAAc,GAAA,GAAM,OAAA,GAAU,UAAA,IAAc,MAAM,MAAA,GAAS,MAAA;AAEnF,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,UAAU,CAAA,CAAA,EAAI;AAAA,MAChE,MAAA;AAAA,MACA,GAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF,EAAG;AAAA,MACD,GAAG,OAAA;AAAA,MACH,MAAA;AAAA,MACA,GAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,MAAA,EAAgB,MAAA,EAAiB,OAAA,GAAmB,MAAM,OAAA,EAA4C;AAClH,IAAA,MAAM,KAAA,GAAkB,UAAU,MAAA,GAAS,MAAA;AAE3C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,eAAA,EAAkB,MAAM,CAAA,EAAA,EAAK,OAAA,GAAU,SAAA,GAAY,QAAQ,CAAA,CAAA,EAAI;AAAA,MAC5F,MAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF,EAAG;AAAA,MACD,GAAG,OAAA;AAAA,MACH,MAAA;AAAA,MACA,IAAA,EAAM,CAAC,gBAAA,EAAkB,MAAM;AAAA,KAChC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,KAAA,EAAe,QAAA,EAAkD,OAAA,EAA4C;AAC7H,IAAA,MAAM,QAAkB,QAAA,KAAa,UAAA,GAAa,OAAA,GAAU,QAAA,KAAa,SAAS,OAAA,GAAU,MAAA;AAE5F,IAAA,OAAO,KAAK,GAAA,CAAI,KAAA,EAAO,UAAA,EAAY,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAA,EAAI;AAAA,MAC7D,KAAA;AAAA,MACA;AAAA,KACF,EAAG;AAAA,MACD,GAAG,OAAA;AAAA,MACH,IAAA,EAAM,CAAC,UAAA,EAAY,QAAQ;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,GAAA,CACZ,KAAA,EACA,QAAA,EACA,OAAA,EACA,MACA,OAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEnB,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAC5C,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG;AACtE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAyB;AAAA,QAC7B,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,QACtB,KAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,IAAA;AAAA,QACpC,MAAA,EAAQ,SAAS,MAAA,IAAU,IAAA;AAAA,QAC3B,SAAA,EAAW,SAAS,SAAA,IAAa,IAAA;AAAA,QACjC,SAAA,EAAW,SAAS,SAAA,IAAa,IAAA;AAAA,QACjC,SAAA,EAAW,SAAS,SAAA,IAAa,IAAA;AAAA,QACjC,SAAA,EAAW,SAAS,SAAA,IAAa,IAAA;AAAA,QACjC,MAAA,EAAQ,SAAS,MAAA,IAAU,IAAA;AAAA,QAC3B,GAAA,EAAK,SAAS,GAAA,IAAO,IAAA;AAAA,QACrB,UAAA,EAAY,SAAS,UAAA,IAAc,IAAA;AAAA,QACnC,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,QAC/B,UAAA,EAAY,SAAS,UAAA,IAAc,IAAA;AAAA,QACnC,MAAM,OAAA,EAAS,IAAA,GAAO,KAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA;AAAA,QACrD,MAAA,EAAQ,SAAS,MAAA,IAAU,IAAA;AAAA,QAC3B,SAAA,sBAAe,IAAA;AAAK,OACtB;AAEA,MAAA,MAAM,KAAK,EAAA,CAAG,MAAA,CAAO,UAAU,CAAA,CAAE,OAAO,QAAQ,CAAA;AAGhD,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,MAAA,CAAO,OAAO,CAAA;AAAA,MACrD;AAAA,IAEF,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,KAAK,CAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,MAAA,GAAoB,EAAC,EAA4C;AAC7E,IAAA,IAAI;AACF,MAAA,MAAM,aAAa,EAAC;AAEpB,MAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AAC3C,QAAA,UAAA,CAAW,KAAK,OAAA,CAAQ,UAAA,CAAW,KAAA,EAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACzD;AAEA,MAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AACjD,QAAA,UAAA,CAAW,KAAK,OAAA,CAAQ,UAAA,CAAW,QAAA,EAAU,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,MAC/D;AAEA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,UAAA,CAAW,KAAK,EAAA,CAAG,UAAA,CAAW,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,MACtD;AAEA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,UAAA,CAAW,KAAK,EAAA,CAAG,UAAA,CAAW,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,MACtD;AAEA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,UAAA,CAAW,IAAA;AAAA,UACT,KAAK,UAAA,CAAW,OAAA,EAAS,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM,CAAA,CAAA,CAAG;AAAA,SAC/C;AAAA,MACF;AAEA,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,UAAA,CAAW,KAAK,GAAA,CAAI,UAAA,CAAW,SAAA,EAAW,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,MAC7D;AAEA,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,UAAA,CAAW,KAAK,GAAA,CAAI,UAAA,CAAW,SAAA,EAAW,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MAC3D;AAEA,MAAA,MAAM,cAAc,UAAA,CAAW,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,UAAU,CAAA,GAAI,KAAA,CAAA;AAGjE,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAC5B,OAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG,CAAA,CACzB,IAAA,CAAK,UAAU,CAAA,CACf,MAAM,WAAW,CAAA;AAEpB,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAC,CAAA,EAAG,KAAA,IAAS,CAAA;AAGvC,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,KAAW,OAAA,GAAU,UAAA,CAAW,KAAA,GACxC,MAAA,CAAO,MAAA,KAAW,UAAA,GAAa,UAAA,CAAW,QAAA,GAC1C,UAAA,CAAW,SAAA;AAE7B,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,KAAc,KAAA,GAAQ,GAAA,GAAM,IAAA;AAElD,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAA,CACrB,MAAA,GACA,IAAA,CAAK,UAAU,CAAA,CACf,KAAA,CAAM,WAAW,CAAA,CACjB,QAAQ,MAAA,CAAO,UAAU,CAAC,CAAA,CAC1B,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,CACxB,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,CAAC,CAAA;AAE5B,MAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AAAA,IACvB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,EAAE,IAAA,EAAM,EAAC,EAAG,OAAO,CAAA,EAAE;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAU,QAAA,EAAkD;AACxE,IAAA,IAAI;AAEF,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,IAAI,IAAA,CAAK,YAAY,GAAA,CAAI,QAAQ,KAAM,GAAA,GAAM,IAAA,CAAK,iBAAA,GAAqB,IAAA,CAAK,qBAAA,EAAuB;AACjG,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAA;AAAA,MAC3C;AAGA,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAA,CACxB,QAAO,CACP,IAAA,CAAK,SAAS,CAAA,CACd,KAAA,CAAM,EAAA,CAAG,SAAA,CAAU,QAAA,EAAU,QAAQ,CAAC,CAAA;AAEzC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,CAAC,CAAA,IAAK,IAAA;AAE7B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AACrC,QAAA,IAAA,CAAK,iBAAA,GAAoB,GAAA;AAAA,MAC3B;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,QAAA,EAAuB,OAAA,EAA4C;AACpF,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,EAAA,CACR,MAAA,CAAO,SAAS,EAChB,GAAA,CAAI;AAAA,QACH,GAAG,OAAA;AAAA,QACH,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA,CACA,KAAA,CAAM,GAAG,SAAA,CAAU,QAAA,EAAU,QAAQ,CAAC,CAAA;AAGzC,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,QAAQ,CAAA;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAsC;AAC1C,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,EAAA,CAAG,MAAA,EAAO,CAAE,KAAK,SAAS,CAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,CAAgB,QAAA,EAAuB,OAAA,EAAgC;AACnF,IAAA,IAAI;AAEF,MAAA,MAAM,cAAc,MAAM,IAAA,CAAK,GAC5B,MAAA,CAAO,EAAE,OAAO,KAAA,EAAM,EAAG,CAAA,CACzB,IAAA,CAAK,UAAU,CAAA,CACf,KAAA,CAAM,GAAG,UAAA,CAAW,QAAA,EAAU,QAAQ,CAAC,CAAA;AAE1C,MAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,EAAG,KAAA,IAAS,CAAA;AAE9C,MAAA,IAAI,eAAe,OAAA,EAAS;AAE1B,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,EAAA,CAC3B,OAAO,EAAE,SAAA,EAAW,UAAA,CAAW,SAAA,EAAW,CAAA,CAC1C,IAAA,CAAK,UAAU,EACf,KAAA,CAAM,EAAA,CAAG,UAAA,CAAW,QAAA,EAAU,QAAQ,CAAC,CAAA,CACvC,OAAA,CAAQ,KAAK,UAAA,CAAW,SAAS,CAAC,CAAA,CAClC,KAAA,CAAM,CAAC,CAAA,CACP,MAAA,CAAO,UAAU,CAAC,CAAA;AAErB,QAAA,IAAI,UAAA,CAAW,CAAC,CAAA,EAAG;AAEjB,UAAA,MAAM,IAAA,CAAK,EAAA,CACR,MAAA,CAAO,UAAU,CAAA,CACjB,KAAA;AAAA,YACC,GAAA;AAAA,cACE,EAAA,CAAG,UAAA,CAAW,QAAA,EAAU,QAAQ,CAAA;AAAA,cAChC,IAAI,UAAA,CAAW,SAAA,EAAW,UAAA,CAAW,CAAC,EAAE,SAAS;AAAA;AACnD,WACF;AAAA,QACJ;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAAoC;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,aAAA,EAAc;AAEzC,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AACxB,UAAA,MAAM,UAAA,uBAAiB,IAAA,EAAK;AAC5B,UAAA,UAAA,CAAW,OAAA,CAAQ,UAAA,CAAW,OAAA,EAAQ,GAAI,OAAO,SAAS,CAAA;AAE1D,UAAA,MAAM,IAAA,CAAK,EAAA,CACR,MAAA,CAAO,UAAU,CAAA,CACjB,KAAA;AAAA,YACC,GAAA;AAAA,cACE,EAAA,CAAG,UAAA,CAAW,QAAA,EAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,cACvC,GAAA,CAAI,UAAA,CAAW,SAAA,EAAW,UAAU;AAAA;AACtC,WACF;AAAA,QACJ;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,IAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CAAU,OAAiB,WAAA,EAA8B;AAC/D,IAAA,MAAM,SAAS,CAAC,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,SAAS,OAAO,CAAA;AACzD,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACvC,IAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AAEnD,IAAA,OAAO,UAAA,IAAc,gBAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAA,EAAwB;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF;AAGA,IAAI,cAAA,GAAgC,IAAA;AAK7B,SAAS,UAAU,QAAA,EAA+B;AACvD,EAAA,IAAI,CAAC,kBAAkB,QAAA,EAAU;AAC/B,IAAA,cAAA,GAAiB,IAAI,OAAO,QAAQ,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,MAAM,wEAAwE,CAAA;AAAA,EAC1F;AAEA,EAAA,OAAO,cAAA;AACT;AAKO,SAAS,WAAW,QAAA,EAA8B;AACvD,EAAA,cAAA,GAAiB,IAAI,OAAO,QAAQ,CAAA;AACpC,EAAA,OAAO,cAAA;AACT;;;ACtcO,IAAM,eAAN,MAAmB;AAAA,EAChB,MAAA;AAAA,EACA,WAAA,uBAAgE,GAAA,EAAI;AAAA,EAE5E,YAAY,MAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,MAAc,UAAA,EAA6B;AACrD,IAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,CAAK,MAAA,CAAO,WAAW,IAAI,CAAA;AAC1C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAO,GAAA,EAAgC;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAEvC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,OAAA,EAAS;AAC/B,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA,CAAO,KAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAiB,GAAA,EAKpB;AACD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAEvC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,IAAA,EAAM,IAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,OAAA,EAAS;AAC/B,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,IAAA,EAAM,IAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,MAAM,MAAA,CAAO,KAAA;AAAA,MACb,MAAA,EAAQ,QAAA;AAAA,MACR,GAAA,EAAA,CAAM,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,KAAI,IAAK;AAAA;AAAA,KACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAI,GAAA,EAAa,KAAA,EAAY,GAAA,EAA6B;AAC9D,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,MAAU,GAAA,IAAO,IAAA,CAAK,OAAO,GAAA,IAAO,GAAA;AACzD,IAAA,IAAA,CAAK,YAAY,GAAA,CAAI,GAAA,EAAK,EAAE,KAAA,EAAO,SAAS,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,GAAA,EAA4B;AACvC,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,OAAA,EAAgC;AAE/C,IAAA,MAAM,YAAA,GAAe,QAClB,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,CACnB,OAAA,CAAQ,OAAO,GAAG,CAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAG,CAAA;AAG5C,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,WAAA,CAAY,IAAA,EAAK,EAAG;AACzC,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG;AACnB,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAY,GAAA,EAAa,QAAA,EAA4B,GAAA,EAA0B;AACnF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAO,GAAG,CAAA;AAEpC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,EAAS;AAC7B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,IAAM,aAAA,GAAgB;AAAA,EAC3B,GAAA,EAAK;AAAA,IACH,GAAA,EAAK,GAAA;AAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,GAAA;AAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,GAAA,EAAK,GAAA;AAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA,EACA,UAAA,EAAY;AAAA,IACV,GAAA,EAAK,GAAA;AAAA;AAAA,IACL,SAAA,EAAW;AAAA;AAEf;AAKO,SAAS,gBAAgB,MAAA,EAAmC;AACjE,EAAA,OAAO,IAAI,aAAa,MAAM,CAAA;AAChC;;;ACpJO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAoB,EAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,MAAM,UAAA,CAAW,QAAA,EAAkB,GAAA,EAAkC;AACnE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CACvB,OAAA,CAAQ,2DAA2D,CAAA,CACnE,IAAA,CAAK,QAAA,EAAU,GAAG,CAAA,CAClB,KAAA,EAAM;AAET,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,IAAA,CAAK,KAAA,CAAO,MAAA,CAAe,KAAK,CAAA;AAAA,IACzC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,MAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAA,EAAI,GAAG,KAAK,KAAK,CAAA;AAChE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,QAAA,EAAgD;AACxE,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,IAAA,CAAK,EAAA,CAC5B,OAAA,CAAQ,oDAAoD,CAAA,CAC5D,IAAA,CAAK,QAAQ,CAAA,CACb,GAAA,EAAI;AAEP,MAAA,MAAM,WAAgC,EAAC;AACvC,MAAA,KAAA,MAAW,GAAA,IAAO,OAAA,IAAW,EAAC,EAAG;AAC/B,QAAA,MAAM,CAAA,GAAI,GAAA;AACV,QAAA,QAAA,CAAS,EAAE,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAE,KAAK,CAAA;AAAA,MACtC;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACvE,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,QAAA,EAAkB,GAAA,EAAa,KAAA,EAA8B;AAC5E,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAEtC,MAAA,MAAM,IAAA,CAAK,GACR,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAMR,CAAA,CACA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW,EAAG,QAAA,EAAU,GAAA,EAAK,SAAA,EAAW,GAAA,EAAK,GAAG,CAAA,CAC5D,GAAA,EAAI;AAEP,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,MAAM,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAA,EAAI,GAAG,KAAK,KAAK,CAAA;AACxD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CAAoB,QAAA,EAAkB,QAAA,EAAiD;AAC3F,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACnD,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAEtC,QAAA,MAAM,IAAA,CAAK,GACR,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAMR,CAAA,CACA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW,EAAG,QAAA,EAAU,GAAA,EAAK,SAAA,EAAW,GAAA,EAAK,GAAG,CAAA,CAC5D,GAAA,EAAI;AAAA,MACT;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACvE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAAA,EAA8C;AACrE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA;AAEzD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,SAAS,QAAA,IAAY,YAAA;AAAA,MAC/B,eAAA,EAAiB,SAAS,eAAA,IAAmB,qCAAA;AAAA,MAC7C,UAAA,EAAY,QAAA,CAAS,UAAA,IAAc,SAAA,IAAa,mBAAA;AAAA,MAChD,QAAA,EAAU,SAAS,QAAA,IAAY,KAAA;AAAA,MAC/B,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,MAC/B,eAAA,EAAiB,SAAS,eAAA,IAAmB;AAAA,KAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,QAAA,EAAsD;AAC9E,IAAA,MAAM,iBAAsC,EAAC;AAE7C,IAAA,IAAI,QAAA,CAAS,QAAA,KAAa,MAAA,EAAW,cAAA,CAAe,WAAW,QAAA,CAAS,QAAA;AACxE,IAAA,IAAI,QAAA,CAAS,eAAA,KAAoB,MAAA,EAAW,cAAA,CAAe,kBAAkB,QAAA,CAAS,eAAA;AACtF,IAAA,IAAI,QAAA,CAAS,UAAA,KAAe,MAAA,EAAW,cAAA,CAAe,aAAa,QAAA,CAAS,UAAA;AAC5E,IAAA,IAAI,QAAA,CAAS,QAAA,KAAa,MAAA,EAAW,cAAA,CAAe,WAAW,QAAA,CAAS,QAAA;AACxE,IAAA,IAAI,QAAA,CAAS,QAAA,KAAa,MAAA,EAAW,cAAA,CAAe,WAAW,QAAA,CAAS,QAAA;AACxE,IAAA,IAAI,QAAA,CAAS,eAAA,KAAoB,MAAA,EAAW,cAAA,CAAe,kBAAkB,QAAA,CAAS,eAAA;AAEtF,IAAA,OAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,SAAA,EAAW,cAAc,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,GAAiD;AACrD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,UAAU,CAAA;AAE1D,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,SAAS,YAAA,IAAgB,KAAA;AAAA,MACvC,sBAAA,EACE,OAAO,QAAA,CAAS,sBAAA,KAA2B,WACvC,QAAA,CAAS,sBAAA,GACT,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,QAAA,EAAuD;AAChF,IAAA,MAAM,iBAAsC,EAAC;AAE7C,IAAA,IAAI,QAAA,CAAS,YAAA,KAAiB,MAAA,EAAW,cAAA,CAAe,eAAe,QAAA,CAAS,YAAA;AAChF,IAAA,IAAI,SAAS,sBAAA,KAA2B,MAAA;AACtC,MAAA,cAAA,CAAe,yBAAyB,QAAA,CAAS,sBAAA;AAEnD,IAAA,OAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,UAAA,EAAY,cAAc,CAAA;AAAA,EAClE;AACF;;;ACvKO,IAAM,mBAAN,MAAuB;AAAA,EACpB,MAAA;AAAA,EACA,QAAA,GAAqC,IAAA;AAAA,EACrC,OAAA,GAAmB,IAAA;AAAA,EACnB,aAAiF,EAAC;AAAA,EAClF,aAAA,GAAyB,KAAA;AAAA,EAEjC,YAAY,MAAA,EAAmC;AAC7C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,kBAAA,EAAmB;AAAA,MACtB,GAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAA,EAA4C;AAC3D,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AAAA,MACtD;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAEhB,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,GAAA,CAAI,+CAAA,EAAiD,QAAA,CAAS,cAAc,CAAA;AAAA,MACtF;AAEA,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAGrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IAExB,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,MAC3D;AACA,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,KAAA,EAAuB,UAAA,EAAiD;AAClF,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEnB,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AAGzD,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,GAAG,cAAA;AAAA,QACH,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,OAAA,EAAS,KAAK,UAAA;AAAW,OAC3B;AAGA,MAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,QAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,KAAA,EAAO,UAAA,EAAY,eAAe,CAAA;AACzD,QAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,UAAA,OAAA,CAAQ,GAAA,CAAI,2BAAA,EAA6B,KAAA,EAAO,aAAa,CAAA;AAAA,QAC/D;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM;AACrC,QAAA,MAAM,OAAA,GAAU;AAAA,UACd,IAAA,EAAM;AAAA,YACJ,eAAA,EAAiB,KAAK,QAAA,CAAS,cAAA;AAAA,YAC/B,UAAA,EAAY,KAAA;AAAA,YACZ,UAAA,EAAY,aAAA;AAAA,YACZ,WAAW,aAAA,CAAc;AAAA;AAC3B,SACF;AAGA,QAAA,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,UAAA,CAAA,EAAc;AAAA,UACrC,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,SAC7B,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAEjB,QAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,UAAA,OAAA,CAAQ,GAAA,CAAI,4BAAA,EAA8B,KAAA,EAAO,aAAa,CAAA;AAAA,QAChE;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAC5B,QAAA,OAAA,CAAQ,GAAA,CAAI,kCAAA,EAAoC,KAAA,EAAO,aAAa,CAAA;AAAA,MACtE;AAAA,IAEF,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBAAyB,UAAA,EAAiD;AAC9E,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,sBAAA,EAAwB,UAAU,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,2BAA2B,UAAA,EAAiD;AAChF,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,wBAAA,EAA0B,UAAU,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAA,CAAwB,KAAA,EAAuB,UAAA,EAAiD;AACpG,IAAA,MAAM,IAAA,CAAK,MAAM,qBAAA,EAAuB;AAAA,MACtC,GAAG,UAAA;AAAA,MACH,SAAA,EAAW,qBAAqB,KAAK;AAAA,KACtC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,UAAA,EAAiD;AAC3E,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,oBAAA,EAAsB,UAAU,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,KAAA,EAAe,UAAA,EAAiD;AAClF,IAAA,MAAM,IAAA,CAAK,MAAM,aAAA,EAAe;AAAA,MAC9B,GAAG,UAAA;AAAA,MACH,KAAA,EAAO,cAAc,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,KAAA,EAAuB,UAAA,EAAiD;AACvF,IAAA,MAAM,IAAA,CAAK,MAAM,gBAAA,EAAkB;AAAA,MACjC,GAAG,UAAA;AAAA,MACH,SAAA,EAAW,qBAAqB,KAAK;AAAA,KACtC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,UAAA,EAAiD;AAC1E,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,kBAAA,EAAoB,UAAU,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,UAAA,EAAiD;AACvE,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,eAAA,EAAiB,UAAU,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAA,GAA4B;AACxC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAElC,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA;AACjC,IAAA,IAAA,CAAK,aAAa,EAAC;AAEnB,IAAA,KAAA,MAAW,EAAE,KAAA,EAAO,UAAA,EAAW,IAAK,KAAA,EAAO;AACzC,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,UAAU,CAAA;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,UAAA,EAAuD;AAChF,IAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AAEzB,IAAA,MAAM,YAAiC,EAAC;AAExC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAErD,MAAA,IAAI,UAAU,MAAA,EAAW;AAGzB,MAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AAChD,QAAA,SAAA,CAAU,GAAG,CAAA,GAAI,aAAA,CAAc,KAAK,CAAA;AACpC,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,GAAA,CAAI,aAAY,CAAE,QAAA,CAAS,OAAO,CAAA,IAAK,OAAO,UAAU,QAAA,EAAU;AACpE,QAAA,SAAA,CAAU,GAAG,CAAA,GAAI,oBAAA,CAAqB,KAAK,CAAA;AAC3C,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AACxF,QAAA,SAAA,CAAU,GAAG,CAAA,GAAI,KAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,GAAqB;AAC3B,IAAA,IAAI;AAEF,MAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK;AACjD,QAAA,OAAO,OAAA,CAAQ,IAAI,eAAA,IAAmB,OAAA;AAAA,MACxC;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF;AAGA,IAAI,iBAAA,GAA6C,IAAA;AAK1C,SAAS,oBAAoB,MAAA,EAAqD;AACvF,EAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,IAAA,iBAAA,GAAoB,IAAI,iBAAiB,MAAM,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,iBAAA;AACT;AAKA,eAAsB,aAAA,CAAc,UAA6B,MAAA,EAA8D;AAC7H,EAAA,MAAM,OAAA,GAAU,oBAAoB,MAAM,CAAA;AAC1C,EAAA,MAAM,OAAA,CAAQ,WAAW,QAAQ,CAAA;AACjC,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,2BAA2B,WAAA,EAAyC;AAClF,EAAA,MAAM,iBAAiB,sBAAA,EAAuB;AAC9C,EAAA,MAAM,QAAA,GAA8B,EAAE,cAAA,EAAe;AAErD,EAAA,IAAI,WAAA,EAAa;AAEf,IAAA,QAAA,CAAS,SAAA,GAAY,kBAAkB,WAAW,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,QAAA;AACT;ACpRA,IAAI,WAAA,GAAmB,IAAA;AAEhB,SAAS,eAAe,GAAA,EAAgB;AAC7C,EAAA,WAAA,GAAc,GAAA;AAChB;AAEO,SAAS,cAAA,GAAsB;AACpC,EAAA,OAAO,WAAA;AACT;AAMO,IAAM,aAAA,GAA8C;AAAA,EACzD,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,gBAAA;AAAA,IACP,WAAA,EAAa,iDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,oBAAA;AAAA,IACP,WAAA,EAAa,6CAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,kBAAA;AAAA,IACP,WAAA,EAAa,4CAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,iBAAA;AAAA,IACP,WAAA,EAAa,8CAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,QAAA;AAAA,IACP,WAAA,EAAa,sCAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,QAAA;AAAA,IACP,WAAA,EAAa,oDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,UAAA;AAAA,IACP,WAAA,EAAa,uCAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,UAAA;AAAA,IACP,WAAA,EAAa,yCAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,WAAA,EAAa,mCAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,WAAA,EAAa,iCAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,WAAA,EAAa,8BAAA;AAAA,IACb,IAAA,EAAM;AAAA;AAEV;AAMA,IAAM,cAAA,GAA4C;AAAA;AAAA,EAEhD,oBAAoB,EAAE,WAAA,EAAa,2DAA2D,QAAA,EAAU,MAAA,EAAQ,gBAAgB,KAAA,EAAM;AAAA,EACtI,yBAAyB,EAAE,WAAA,EAAa,0CAA0C,QAAA,EAAU,MAAA,EAAQ,gBAAgB,KAAA,EAAM;AAAA,EAC1H,uBAAuB,EAAE,WAAA,EAAa,+BAA+B,QAAA,EAAU,MAAA,EAAQ,gBAAgB,KAAA,EAAM;AAAA,EAC7G,qBAAqB,EAAE,WAAA,EAAa,mDAAmD,QAAA,EAAU,MAAA,EAAQ,gBAAgB,IAAA,EAAK;AAAA,EAC9H,gBAAgB,EAAE,WAAA,EAAa,8CAA8C,QAAA,EAAU,MAAA,EAAQ,gBAAgB,IAAA,EAAK;AAAA,EACpH,sBAAsB,EAAE,WAAA,EAAa,gCAAgC,QAAA,EAAU,MAAA,EAAQ,gBAAgB,IAAA,EAAK;AAAA,EAC5G,yBAAyB,EAAE,WAAA,EAAa,0CAA0C,QAAA,EAAU,MAAA,EAAQ,gBAAgB,KAAA,EAAM;AAAA,EAC1H,iCAAiC,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,MAAA,EAAQ,gBAAgB,KAAA,EAAM;AAAA,EAC5H,+BAA+B,EAAE,WAAA,EAAa,4CAA4C,QAAA,EAAU,MAAA,EAAQ,gBAAgB,KAAA,EAAM;AAAA,EAClI,0BAA0B,EAAE,WAAA,EAAa,yCAAyC,QAAA,EAAU,MAAA,EAAQ,gBAAgB,KAAA,EAAM;AAAA,EAC1H,yBAAyB,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,MAAA,EAAQ,gBAAgB,KAAA,EAAM;AAAA;AAAA,EAGpH,wBAAwB,EAAE,WAAA,EAAa,kCAAkC,QAAA,EAAU,SAAA,EAAW,gBAAgB,KAAA,EAAM;AAAA,EACpH,4CAA4C,EAAE,WAAA,EAAa,oDAAoD,QAAA,EAAU,SAAA,EAAW,gBAAgB,KAAA,EAAM;AAAA,EAC1J,wBAAwB,EAAE,WAAA,EAAa,qCAAqC,QAAA,EAAU,SAAA,EAAW,gBAAgB,KAAA,EAAM;AAAA,EACvH,qBAAqB,EAAE,WAAA,EAAa,6BAA6B,QAAA,EAAU,SAAA,EAAW,gBAAgB,IAAA,EAAK;AAAA,EAC3G,wBAAwB,EAAE,WAAA,EAAa,mCAAmC,QAAA,EAAU,SAAA,EAAW,gBAAgB,IAAA,EAAK;AAAA,EACpH,2BAA2B,EAAE,WAAA,EAAa,yBAAyB,QAAA,EAAU,SAAA,EAAW,gBAAgB,IAAA,EAAK;AAAA,EAC7G,iCAAiC,EAAE,WAAA,EAAa,0CAA0C,QAAA,EAAU,SAAA,EAAW,gBAAgB,IAAA,EAAK;AAAA,EACpI,4CAA4C,EAAE,WAAA,EAAa,gDAAgD,QAAA,EAAU,SAAA,EAAW,gBAAgB,IAAA,EAAK;AAAA;AAAA,EAGrJ,kBAAkB,EAAE,WAAA,EAAa,wCAAwC,QAAA,EAAU,OAAA,EAAS,gBAAgB,KAAA,EAAM;AAAA,EAClH,sBAAsB,EAAE,WAAA,EAAa,mCAAmC,QAAA,EAAU,OAAA,EAAS,gBAAgB,KAAA,EAAM;AAAA,EACjH,0BAA0B,EAAE,WAAA,EAAa,yCAAyC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC1H,yBAAyB,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA;AAAA,EAGpH,wBAAwB,EAAE,WAAA,EAAa,iEAAiE,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAChJ,0BAA0B,EAAE,WAAA,EAAa,iCAAiC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAClH,2BAA2B,EAAE,WAAA,EAAa,4BAA4B,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC9G,8BAA8B,EAAE,WAAA,EAAa,0CAA0C,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC/H,+BAA+B,EAAE,WAAA,EAAa,2BAA2B,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACjH,kCAAkC,EAAE,WAAA,EAAa,6CAA6C,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACtI,oCAAoC,EAAE,WAAA,EAAa,iCAAiC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC5H,qCAAqC,EAAE,WAAA,EAAa,uCAAuC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACnI,yCAAyC,EAAE,WAAA,EAAa,wCAAwC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACxI,0CAA0C,EAAE,WAAA,EAAa,+BAA+B,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAChI,oDAAoD,EAAE,WAAA,EAAa,6BAA6B,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACxI,qDAAqD,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAChJ,kDAAkD,EAAE,WAAA,EAAa,kCAAkC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC3I,oCAAoC,EAAE,WAAA,EAAa,iCAAiC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC5H,kCAAkC,EAAE,WAAA,EAAa,mCAAmC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC5H,0BAA0B,EAAE,WAAA,EAAa,oDAAoD,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACrI,8BAA8B,EAAE,WAAA,EAAa,wCAAwC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC7H,2BAA2B,EAAE,WAAA,EAAa,gCAAgC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAClH,8BAA8B,EAAE,WAAA,EAAa,gCAAgC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACrH,iCAAiC,EAAE,WAAA,EAAa,gCAAgC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACxH,wBAAwB,EAAE,WAAA,EAAa,yCAAyC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACxH,gCAAgC,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC3H,+BAA+B,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC1H,wBAAwB,EAAE,WAAA,EAAa,kBAAkB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACjG,yBAAyB,EAAE,WAAA,EAAa,qBAAqB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACrG,4BAA4B,EAAE,WAAA,EAAa,iBAAiB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACpG,+BAA+B,EAAE,WAAA,EAAa,iBAAiB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACvG,uBAAuB,EAAE,WAAA,EAAa,uCAAuC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACrH,0BAA0B,EAAE,WAAA,EAAa,+BAA+B,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAChH,sCAAsC,EAAE,WAAA,EAAa,8BAA8B,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC3H,2BAA2B,EAAE,WAAA,EAAa,4BAA4B,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC9G,2BAA2B,EAAE,WAAA,EAAa,+BAA+B,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACjH,wBAAwB,EAAE,WAAA,EAAa,kBAAkB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACjG,4BAA4B,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACvH,yBAAyB,EAAE,WAAA,EAAa,qBAAqB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACrG,4BAA4B,EAAE,WAAA,EAAa,iBAAiB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACpG,+BAA+B,EAAE,WAAA,EAAa,iBAAiB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACvG,wCAAwC,EAAE,WAAA,EAAa,wBAAwB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACvH,yDAAyD,EAAE,WAAA,EAAa,4BAA4B,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA;AAAA,EAG5I,mBAAmB,EAAE,WAAA,EAAa,0DAA0D,QAAA,EAAU,QAAA,EAAU,gBAAgB,KAAA,EAAM;AAAA,EACtI,0BAA0B,EAAE,WAAA,EAAa,6CAA6C,QAAA,EAAU,QAAA,EAAU,gBAAgB,KAAA,EAAM;AAAA,EAChI,2CAA2C,EAAE,WAAA,EAAa,8CAA8C,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACjJ,2CAA2C,EAAE,WAAA,EAAa,uCAAuC,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC1I,iDAAiD,EAAE,WAAA,EAAa,0BAA0B,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACnI,8CAA8C,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC1I,sDAAsD,EAAE,WAAA,EAAa,0BAA0B,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACxI,qDAAqD,EAAE,WAAA,EAAa,+BAA+B,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC5I,gDAAgD,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC5I,kDAAkD,EAAE,WAAA,EAAa,iCAAiC,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC3I,2CAA2C,EAAE,WAAA,EAAa,+BAA+B,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAClI,gDAAgD,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC5I,iDAAiD,EAAE,WAAA,EAAa,uCAAuC,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAChJ,oDAAoD,EAAE,WAAA,EAAa,0BAA0B,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACtI,oDAAoD,EAAE,WAAA,EAAa,wBAAwB,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACpI,uDAAuD,EAAE,WAAA,EAAa,wBAAwB,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACvI,2DAA2D,EAAE,WAAA,EAAa,uBAAuB,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC1I,0DAA0D,EAAE,WAAA,EAAa,6BAA6B,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC/I,4DAA4D,EAAE,WAAA,EAAa,yCAAyC,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC7J,4CAA4C,EAAE,WAAA,EAAa,qCAAqC,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACzI,iDAAiD,EAAE,WAAA,EAAa,+BAA+B,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACxI,4DAA4D,EAAE,WAAA,EAAa,2CAA2C,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC/J,uEAAuE,EAAE,WAAA,EAAa,kCAAkC,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACjK,yEAAyE,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACrK,6CAA6C,EAAE,WAAA,EAAa,wBAAwB,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC7H,8CAA8C,EAAE,WAAA,EAAa,wBAAwB,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAC9H,oDAAoD,EAAE,WAAA,EAAa,2BAA2B,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACvI,gDAAgD,EAAE,WAAA,EAAa,2BAA2B,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACnI,iDAAiD,EAAE,WAAA,EAAa,uBAAuB,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EAChI,oDAAoD,EAAE,WAAA,EAAa,uBAAuB,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACnI,uDAAuD,EAAE,WAAA,EAAa,uBAAuB,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACtI,6CAA6C,EAAE,WAAA,EAAa,8BAA8B,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA,EACnI,6CAA6C,EAAE,WAAA,EAAa,iCAAiC,QAAA,EAAU,QAAA,EAAU,gBAAgB,IAAA,EAAK;AAAA;AAAA,EAGtI,gCAAgC,EAAE,WAAA,EAAa,qBAAqB,QAAA,EAAU,UAAA,EAAY,gBAAgB,IAAA,EAAK;AAAA,EAC/G,iCAAiC,EAAE,WAAA,EAAa,wBAAwB,QAAA,EAAU,UAAA,EAAY,gBAAgB,IAAA,EAAK;AAAA,EACnH,uCAAuC,EAAE,WAAA,EAAa,qBAAqB,QAAA,EAAU,UAAA,EAAY,gBAAgB,IAAA,EAAK;AAAA,EACtH,oCAAoC,EAAE,WAAA,EAAa,qBAAqB,QAAA,EAAU,UAAA,EAAY,gBAAgB,IAAA,EAAK;AAAA;AAAA,EAGnH,8BAA8B,EAAE,WAAA,EAAa,wBAAwB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC7G,+BAA+B,EAAE,WAAA,EAAa,uBAAuB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC7G,gCAAgC,EAAE,WAAA,EAAa,sBAAsB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC7G,wCAAwC,EAAE,WAAA,EAAa,iCAAiC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA;AAAA,EAGhI,4BAA4B,EAAE,WAAA,EAAa,0CAA0C,QAAA,EAAU,UAAA,EAAY,gBAAgB,IAAA,EAAK;AAAA,EAChI,6BAA6B,EAAE,WAAA,EAAa,6BAA6B,QAAA,EAAU,UAAA,EAAY,gBAAgB,IAAA,EAAK;AAAA,EACpH,8BAA8B,EAAE,WAAA,EAAa,6BAA6B,QAAA,EAAU,UAAA,EAAY,gBAAgB,IAAA,EAAK;AAAA,EACrH,6BAA6B,EAAE,WAAA,EAAa,4BAA4B,QAAA,EAAU,UAAA,EAAY,gBAAgB,IAAA,EAAK;AAAA,EACnH,8BAA8B,EAAE,WAAA,EAAa,4BAA4B,QAAA,EAAU,UAAA,EAAY,gBAAgB,IAAA,EAAK;AAAA,EACpH,gCAAgC,EAAE,WAAA,EAAa,qBAAqB,QAAA,EAAU,UAAA,EAAY,gBAAgB,IAAA,EAAK;AAAA,EAC/G,6BAA6B,EAAE,WAAA,EAAa,2CAA2C,QAAA,EAAU,UAAA,EAAY,gBAAgB,IAAA,EAAK;AAAA;AAAA,EAGlI,8BAA8B,EAAE,WAAA,EAAa,mCAAmC,QAAA,EAAU,OAAA,EAAS,gBAAgB,KAAA,EAAM;AAAA,EACzH,sBAAsB,EAAE,WAAA,EAAa,qCAAqC,QAAA,EAAU,OAAA,EAAS,gBAAgB,KAAA,EAAM;AAAA,EACnH,kCAAkC,EAAE,WAAA,EAAa,yBAAyB,QAAA,EAAU,OAAA,EAAS,gBAAgB,KAAA,EAAM;AAAA,EACnH,0BAA0B,EAAE,WAAA,EAAa,+BAA+B,QAAA,EAAU,OAAA,EAAS,gBAAgB,KAAA,EAAM;AAAA;AAAA,EAGjH,eAAe,EAAE,WAAA,EAAa,wCAAwC,QAAA,EAAU,QAAA,EAAU,gBAAgB,KAAA,EAAM;AAAA,EAChH,mBAAmB,EAAE,WAAA,EAAa,4CAA4C,QAAA,EAAU,QAAA,EAAU,gBAAgB,KAAA,EAAM;AAAA,EACxH,YAAY,EAAE,WAAA,EAAa,8DAA8D,QAAA,EAAU,QAAA,EAAU,gBAAgB,KAAA,EAAM;AAAA,EACnI,wBAAwB,EAAE,WAAA,EAAa,sCAAsC,QAAA,EAAU,QAAA,EAAU,gBAAgB,KAAA,EAAM;AAAA,EACvH,0BAA0B,EAAE,WAAA,EAAa,mCAAmC,QAAA,EAAU,QAAA,EAAU,gBAAgB,KAAA,EAAM;AAAA;AAAA,EAGtH,gBAAgB,EAAE,WAAA,EAAa,+CAA+C,QAAA,EAAU,OAAA,EAAS,gBAAgB,KAAA,EAAM;AAAA;AAAA,EAGvH,wCAAwC,EAAE,WAAA,EAAa,4BAA4B,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC3H,wCAAwC,EAAE,WAAA,EAAa,wBAAwB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACvH,8CAA8C,EAAE,WAAA,EAAa,oCAAoC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA;AAAA,EAGzI,sCAAsC,EAAE,WAAA,EAAa,sCAAsC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACnI,mCAAmC,EAAE,WAAA,EAAa,mCAAmC,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA;AAAA,EAG7H,sCAAsC,EAAE,WAAA,EAAa,iBAAiB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EAC9G,0CAA0C,EAAE,WAAA,EAAa,wBAAwB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA,EAAK;AAAA,EACzH,sCAAsC,EAAE,WAAA,EAAa,qBAAqB,QAAA,EAAU,OAAA,EAAS,gBAAgB,IAAA;AAC/G,CAAA;AAMA,IAAM,uBAAA,GAAoC;AAAA,EACxC,UAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,+BAAA;AAAA;AAAA,EACA,iBAAA;AAAA;AAAA,EACA,oBAAA;AAAA;AAAA,EACA,iBAAA;AAAA;AAAA,EACA,2BAAA;AAAA;AAAA,EACA,wBAAA;AAAA;AAAA,EACA,8BAAA;AAAA;AAAA,EACA,iCAAA;AAAA;AAAA,EACA,4BAAA;AAAA;AAAA,EACA,eAAA;AAAA;AAAA,EACA,YAAA;AAAA;AAAA,EACA,YAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAA;AAGA,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAMD,IAAI,eAAA,GAA0C,IAAA;AAE9C,SAAS,eAAA,CAAgB,QAAgB,IAAA,EAAuB;AAE9D,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC7B,EAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,wBAAwB,IAAA,CAAK,CAAA,OAAA,KAAW,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AACnE;AAEA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,MAAA;AACtC,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA,EAAG,OAAO,QAAA;AAC3C,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG,OAAO,OAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA,EAAG,OAAO,QAAA;AAC3C,EAAA,IAAI,IAAA,CAAK,WAAW,cAAc,CAAA,IAAK,KAAK,UAAA,CAAW,kBAAkB,GAAG,OAAO,SAAA;AACnF,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG,OAAO,OAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,iBAAiB,CAAA,EAAG,OAAO,UAAA;AAC/C,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,cAAc,CAAA,EAAG,OAAO,OAAA;AAC5C,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,0BAA0B,CAAA,EAAG,OAAO,QAAA;AACxD,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG,OAAO,OAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,uBAAuB,CAAA,EAAG,OAAO,OAAA;AACrD,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,kBAAkB,CAAA,EAAG,OAAO,OAAA;AAChD,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,sBAAsB,CAAA,EAAG,OAAO,OAAA;AACpD,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG,OAAO,UAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,OAAA;AACvC,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,OAAA;AACvC,EAAA,IAAI,SAAS,SAAA,IAAa,IAAA,CAAK,UAAA,CAAW,MAAM,GAAG,OAAO,QAAA;AAC1D,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAAmC;AAEpD,EAAA,IAAI,SAAS,SAAA,IAAa,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,eAAe,OAAO,KAAA;AAC5E,EAAA,IAAI,IAAA,KAAS,kBAAA,IAAsB,IAAA,KAAS,oBAAA,EAAsB,OAAO,KAAA;AACzE,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,KAAA;AACvC,EAAA,IAAI,IAAA,CAAK,WAAW,SAAS,CAAA,IAAK,KAAK,UAAA,CAAW,aAAa,GAAG,OAAO,KAAA;AAGzE,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,IAAA;AACvC,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG,OAAO,IAAA;AAE1C,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,eAAe,GAAA,EAA2B;AACxD,EAAA,IAAI,iBAAiB,OAAO,eAAA;AAE5B,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAElB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,cAAc,GAAU,CAAA;AAGvC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,SAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,MAAA,IAAI,MAAM,YAAA,EAAc;AAExB,MAAA,IAAI,KAAA,CAAM,WAAW,KAAA,EAAO;AAE5B,MAAA,MAAM,MAAM,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,CAAA;AAGzC,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAGZ,MAAA,IAAI,CAAC,eAAA,CAAgB,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AAGhD,MAAA,MAAM,IAAA,GAAO,eAAe,GAAG,CAAA;AAE/B,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,gBAAgB,IAAA,CAAK,cAAA;AAAA,UACrB,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,WAAA,EAAa,EAAA;AAAA,UACb,cAAA,EAAgB,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,UACpC,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AAAA,UAClC,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAsC,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAC3F,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACpB,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,QAAA,CAAS,aAAA,CAAc,EAAE,QAAQ,CAAA;AAClD,MAAA,IAAI,MAAA,KAAW,GAAG,OAAO,MAAA;AACzB,MAAA,MAAM,OAAA,GAAA,CAAW,YAAY,CAAA,CAAE,MAAM,KAAK,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,MAAM,CAAA,IAAK,CAAA,CAAA;AACzE,MAAA,IAAI,OAAA,KAAY,GAAG,OAAO,OAAA;AAC1B,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAAA,IACpC,CAAC,CAAA;AAED,IAAA,eAAA,GAAkB,MAAA;AAClB,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,IAAA,OAAO,EAAC;AAAA,EACV;AACF","file":"chunk-QFWHAFEO.js","sourcesContent":["import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod';\n\n// Users table for authentication and user management\nexport const users = sqliteTable('users', {\n id: text('id').primaryKey(),\n email: text('email').notNull().unique(),\n username: text('username').notNull().unique(),\n firstName: text('first_name').notNull(),\n lastName: text('last_name').notNull(),\n passwordHash: text('password_hash'), // Hashed password, nullable for OAuth users\n role: text('role').notNull().default('viewer'), // 'admin', 'editor', 'author', 'viewer'\n avatar: text('avatar'),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n lastLoginAt: integer('last_login_at'),\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Content collections - dynamic schema definitions\nexport const collections = sqliteTable('collections', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n schema: text('schema', { mode: 'json' }).notNull(), // JSON schema definition\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false), // Config-managed collections cannot be edited in UI\n sourceType: text('source_type').default('user'), // 'user' (normal), 'form' (form-derived)\n sourceId: text('source_id'), // stores the form ID for form-derived collections\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content items - actual content data\nexport const content = sqliteTable('content', {\n id: text('id').primaryKey(),\n collectionId: text('collection_id').notNull().references(() => collections.id),\n slug: text('slug').notNull(),\n title: text('title').notNull(),\n data: text('data', { mode: 'json' }).notNull(), // JSON content data\n status: text('status').notNull().default('draft'), // 'draft', 'published', 'archived'\n publishedAt: integer('published_at', { mode: 'timestamp' }),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content versions for versioning system\nexport const contentVersions = sqliteTable('content_versions', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n version: integer('version').notNull(),\n data: text('data', { mode: 'json' }).notNull(),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Media/Files table\nexport const media = sqliteTable('media', {\n id: text('id').primaryKey(),\n filename: text('filename').notNull(),\n originalName: text('original_name').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n width: integer('width'),\n height: integer('height'),\n folder: text('folder').notNull().default('uploads'),\n r2Key: text('r2_key').notNull(), // R2 storage key\n publicUrl: text('public_url').notNull(), // CDN URL\n thumbnailUrl: text('thumbnail_url'),\n alt: text('alt'),\n caption: text('caption'),\n tags: text('tags', { mode: 'json' }), // JSON array of tags\n uploadedBy: text('uploaded_by').notNull().references(() => users.id),\n uploadedAt: integer('uploaded_at').notNull(),\n updatedAt: integer('updated_at'),\n publishedAt: integer('published_at'),\n scheduledAt: integer('scheduled_at'),\n archivedAt: integer('archived_at'),\n deletedAt: integer('deleted_at'),\n});\n\n// API tokens for programmatic access\nexport const apiTokens = sqliteTable('api_tokens', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n token: text('token').notNull().unique(),\n userId: text('user_id').notNull().references(() => users.id),\n permissions: text('permissions', { mode: 'json' }).notNull(), // Array of permissions\n expiresAt: integer('expires_at', { mode: 'timestamp' }),\n lastUsedAt: integer('last_used_at', { mode: 'timestamp' }),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n\n// Workflow history for content workflow tracking\nexport const workflowHistory = sqliteTable('workflow_history', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n action: text('action').notNull(),\n fromStatus: text('from_status').notNull(),\n toStatus: text('to_status').notNull(),\n userId: text('user_id').notNull().references(() => users.id),\n comment: text('comment'),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Plugin system tables\nexport const plugins = sqliteTable('plugins', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n version: text('version').notNull(),\n author: text('author').notNull(),\n category: text('category').notNull(),\n icon: text('icon'),\n status: text('status').notNull().default('inactive'), // 'active', 'inactive', 'error'\n isCore: integer('is_core', { mode: 'boolean' }).notNull().default(false),\n settings: text('settings', { mode: 'json' }),\n permissions: text('permissions', { mode: 'json' }),\n dependencies: text('dependencies', { mode: 'json' }),\n downloadCount: integer('download_count').notNull().default(0),\n rating: integer('rating').notNull().default(0),\n installedAt: integer('installed_at').notNull(),\n activatedAt: integer('activated_at'),\n lastUpdated: integer('last_updated').notNull(),\n errorMessage: text('error_message'),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n updatedAt: integer('updated_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginHooks = sqliteTable('plugin_hooks', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n hookName: text('hook_name').notNull(),\n handlerName: text('handler_name').notNull(),\n priority: integer('priority').notNull().default(10),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginRoutes = sqliteTable('plugin_routes', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n path: text('path').notNull(),\n method: text('method').notNull(),\n handlerName: text('handler_name').notNull(),\n middleware: text('middleware', { mode: 'json' }),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginAssets = sqliteTable('plugin_assets', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n assetType: text('asset_type').notNull(), // 'css', 'js', 'image', 'font'\n assetPath: text('asset_path').notNull(),\n loadOrder: integer('load_order').notNull().default(100),\n loadLocation: text('load_location').notNull().default('footer'), // 'header', 'footer'\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginActivityLog = sqliteTable('plugin_activity_log', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n action: text('action').notNull(),\n userId: text('user_id'),\n details: text('details', { mode: 'json' }),\n timestamp: integer('timestamp').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\n// Zod schemas for validation\nexport const insertUserSchema = createInsertSchema(users, {\n email: (schema: any) => schema.email(),\n firstName: (schema: any) => schema.min(1),\n lastName: (schema: any) => schema.min(1),\n username: (schema: any) => schema.min(3),\n});\n\nexport const selectUserSchema = createSelectSchema(users);\n\nexport const insertCollectionSchema = createInsertSchema(collections, {\n name: (schema: any) => schema.min(1).regex(/^[a-z0-9_]+$/, 'Collection name must be lowercase with underscores'),\n displayName: (schema: any) => schema.min(1),\n});\n\nexport const selectCollectionSchema = createSelectSchema(collections);\n\nexport const insertContentSchema = createInsertSchema(content, {\n slug: (schema: any) => schema.min(1).regex(/^[a-zA-Z0-9_-]+$/, 'Slug must contain only letters, numbers, underscores, and hyphens'),\n title: (schema: any) => schema.min(1),\n status: (schema: any) => schema,\n});\n\nexport const selectContentSchema = createSelectSchema(content);\n\nexport const insertMediaSchema = createInsertSchema(media, {\n filename: (schema: any) => schema.min(1),\n originalName: (schema: any) => schema.min(1),\n mimeType: (schema: any) => schema.min(1),\n size: (schema: any) => schema.positive(),\n r2Key: (schema: any) => schema.min(1),\n publicUrl: (schema: any) => schema.url(),\n folder: (schema: any) => schema.min(1),\n});\n\nexport const selectMediaSchema = createSelectSchema(media);\n\n\nexport const insertWorkflowHistorySchema = createInsertSchema(workflowHistory, {\n action: (schema: any) => schema.min(1),\n fromStatus: (schema: any) => schema.min(1),\n toStatus: (schema: any) => schema.min(1),\n});\n\nexport const selectWorkflowHistorySchema = createSelectSchema(workflowHistory);\n\nexport const insertPluginSchema = createInsertSchema(plugins, {\n name: (schema: any) => schema.min(1),\n displayName: (schema: any) => schema.min(1),\n version: (schema: any) => schema.min(1),\n author: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginSchema = createSelectSchema(plugins);\n\nexport const insertPluginHookSchema = createInsertSchema(pluginHooks, {\n hookName: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginHookSchema = createSelectSchema(pluginHooks);\n\nexport const insertPluginRouteSchema = createInsertSchema(pluginRoutes, {\n path: (schema: any) => schema.min(1),\n method: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginRouteSchema = createSelectSchema(pluginRoutes);\n\nexport const insertPluginAssetSchema = createInsertSchema(pluginAssets, {\n assetType: (schema: any) => schema.min(1),\n assetPath: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginAssetSchema = createSelectSchema(pluginAssets);\n\nexport const insertPluginActivityLogSchema = createInsertSchema(pluginActivityLog, {\n action: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginActivityLogSchema = createSelectSchema(pluginActivityLog);\n\n// System logs table for comprehensive logging\nexport const systemLogs = sqliteTable('system_logs', {\n id: text('id').primaryKey(),\n level: text('level').notNull(), // 'debug', 'info', 'warn', 'error', 'fatal'\n category: text('category').notNull(), // 'auth', 'api', 'workflow', 'plugin', 'media', 'system', etc.\n message: text('message').notNull(),\n data: text('data', { mode: 'json' }), // Additional structured data\n userId: text('user_id').references(() => users.id),\n sessionId: text('session_id'),\n requestId: text('request_id'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n method: text('method'), // HTTP method for API logs\n url: text('url'), // Request URL for API logs\n statusCode: integer('status_code'), // HTTP status code for API logs\n duration: integer('duration'), // Request duration in milliseconds\n stackTrace: text('stack_trace'), // Error stack trace for error logs\n tags: text('tags', { mode: 'json' }), // Array of tags for categorization\n source: text('source'), // Source component/module that generated the log\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Log configuration table\nexport const logConfig = sqliteTable('log_config', {\n id: text('id').primaryKey(),\n category: text('category').notNull().unique(),\n enabled: integer('enabled', { mode: 'boolean' }).notNull().default(true),\n level: text('level').notNull().default('info'), // minimum log level to store\n retention: integer('retention').notNull().default(30), // days to keep logs\n maxSize: integer('max_size').default(10000), // max number of logs per category\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Insert and select schemas for system logs\nexport const insertSystemLogSchema = createInsertSchema(systemLogs, {\n level: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n message: (schema: any) => schema.min(1),\n});\n\nexport const selectSystemLogSchema = createSelectSchema(systemLogs);\n\nexport const insertLogConfigSchema = createInsertSchema(logConfig, {\n category: (schema: any) => schema.min(1),\n level: (schema: any) => schema.min(1),\n});\n\nexport const selectLogConfigSchema = createSelectSchema(logConfig);\n\n// Type exports\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\nexport type Collection = typeof collections.$inferSelect;\nexport type NewCollection = typeof collections.$inferInsert;\nexport type Content = typeof content.$inferSelect;\nexport type NewContent = typeof content.$inferInsert;\nexport type Media = typeof media.$inferSelect;\nexport type NewMedia = typeof media.$inferInsert;\nexport type WorkflowHistory = typeof workflowHistory.$inferSelect;\nexport type NewWorkflowHistory = typeof workflowHistory.$inferInsert;\nexport type Plugin = typeof plugins.$inferSelect;\nexport type NewPlugin = typeof plugins.$inferInsert;\nexport type PluginHook = typeof pluginHooks.$inferSelect;\nexport type NewPluginHook = typeof pluginHooks.$inferInsert;\nexport type PluginRoute = typeof pluginRoutes.$inferSelect;\nexport type NewPluginRoute = typeof pluginRoutes.$inferInsert;\nexport type PluginAsset = typeof pluginAssets.$inferSelect;\nexport type NewPluginAsset = typeof pluginAssets.$inferInsert;\nexport type PluginActivityLog = typeof pluginActivityLog.$inferSelect;\nexport type NewPluginActivityLog = typeof pluginActivityLog.$inferInsert;\nexport type SystemLog = typeof systemLogs.$inferSelect;\nexport type NewSystemLog = typeof systemLogs.$inferInsert;\nexport type LogConfig = typeof logConfig.$inferSelect;\nexport type NewLogConfig = typeof logConfig.$inferInsert;\n\n// =====================================================\n// Security Audit Plugin Tables\n// =====================================================\n\nexport const securityEvents = sqliteTable('security_events', {\n id: text('id').primaryKey(),\n eventType: text('event_type').notNull(),\n severity: text('severity').notNull().default('info'),\n userId: text('user_id'),\n email: text('email'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n countryCode: text('country_code'),\n requestPath: text('request_path'),\n requestMethod: text('request_method'),\n details: text('details', { mode: 'json' }),\n fingerprint: text('fingerprint'),\n blocked: integer('blocked').notNull().default(0),\n createdAt: integer('created_at').notNull().$defaultFn(() => Date.now()),\n});\n\nexport const insertSecurityEventSchema = createInsertSchema(securityEvents, {\n eventType: (schema: any) => schema.min(1),\n severity: (schema: any) => schema.min(1),\n});\n\nexport const selectSecurityEventSchema = createSelectSchema(securityEvents);\n\nexport type SecurityEventRecord = typeof securityEvents.$inferSelect;\nexport type NewSecurityEventRecord = typeof securityEvents.$inferInsert;\n\n// =====================================================\n// Form.io Integration Tables\n// =====================================================\n\n// Forms table - stores Form.io form definitions\nexport const forms = sqliteTable('forms', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(), // Machine name (e.g., \"contact-form\")\n displayName: text('display_name').notNull(), // Human name (e.g., \"Contact Form\")\n description: text('description'),\n category: text('category').notNull().default('general'), // contact, survey, registration, etc.\n \n // Form.io schema (JSON)\n formioSchema: text('formio_schema', { mode: 'json' }).notNull(), // Complete Form.io JSON schema\n \n // Settings (JSON)\n settings: text('settings', { mode: 'json' }), // emailNotifications, successMessage, etc.\n \n // Status & Management\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n isPublic: integer('is_public', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false),\n \n // Metadata\n icon: text('icon'),\n color: text('color'),\n tags: text('tags', { mode: 'json' }), // JSON array\n \n // Stats\n submissionCount: integer('submission_count').notNull().default(0),\n viewCount: integer('view_count').notNull().default(0),\n \n // Ownership\n createdBy: text('created_by').references(() => users.id),\n updatedBy: text('updated_by').references(() => users.id),\n \n // Timestamps\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form submissions table\nexport const formSubmissions = sqliteTable('form_submissions', {\n id: text('id').primaryKey(),\n formId: text('form_id').notNull().references(() => forms.id, { onDelete: 'cascade' }),\n \n // Submission data\n submissionData: text('submission_data', { mode: 'json' }).notNull(), // The actual form data\n \n // Submission metadata\n status: text('status').notNull().default('pending'), // pending, reviewed, approved, rejected, spam\n submissionNumber: integer('submission_number'),\n \n // User information\n userId: text('user_id').references(() => users.id),\n userEmail: text('user_email'),\n \n // Tracking\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n referrer: text('referrer'),\n utmSource: text('utm_source'),\n utmMedium: text('utm_medium'),\n utmCampaign: text('utm_campaign'),\n \n // Review/Processing\n reviewedBy: text('reviewed_by').references(() => users.id),\n reviewedAt: integer('reviewed_at'),\n reviewNotes: text('review_notes'),\n \n // Flags\n isSpam: integer('is_spam', { mode: 'boolean' }).notNull().default(false),\n isArchived: integer('is_archived', { mode: 'boolean' }).notNull().default(false),\n\n // Content integration\n contentId: text('content_id').references(() => content.id), // Links submission to its content item\n\n // Timestamps\n submittedAt: integer('submitted_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form files table - links submissions to uploaded files\nexport const formFiles = sqliteTable('form_files', {\n id: text('id').primaryKey(),\n submissionId: text('submission_id').notNull().references(() => formSubmissions.id, { onDelete: 'cascade' }),\n mediaId: text('media_id').notNull().references(() => media.id, { onDelete: 'cascade' }),\n fieldName: text('field_name').notNull(), // Form field that uploaded this file\n uploadedAt: integer('uploaded_at').notNull(),\n});\n\n// Zod schemas for validation\nexport const insertFormSchema = createInsertSchema(forms);\nexport const selectFormSchema = createSelectSchema(forms);\nexport const insertFormSubmissionSchema = createInsertSchema(formSubmissions);\nexport const selectFormSubmissionSchema = createSelectSchema(formSubmissions);\nexport const insertFormFileSchema = createInsertSchema(formFiles);\nexport const selectFormFileSchema = createSelectSchema(formFiles);\n\n// TypeScript types\nexport type Form = typeof forms.$inferSelect;\nexport type NewForm = typeof forms.$inferInsert;\nexport type FormSubmission = typeof formSubmissions.$inferSelect;\nexport type NewFormSubmission = typeof formSubmissions.$inferInsert;\nexport type FormFile = typeof formFiles.$inferSelect;\nexport type NewFormFile = typeof formFiles.$inferInsert;",null,null,null,null,"import type { D1Database } from '@cloudflare/workers-types'\nimport { systemLogs, logConfig, type NewSystemLog, type LogConfig } from '../db/schema'\nimport { drizzle } from 'drizzle-orm/d1'\nimport { eq, and, gte, lte, desc, asc, count, like, inArray } from 'drizzle-orm'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal'\nexport type LogCategory = 'auth' | 'api' | 'workflow' | 'plugin' | 'media' | 'system' | 'security' | 'error'\n\nexport interface LogEntry {\n level: LogLevel\n category: LogCategory\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags?: string[]\n source?: string\n}\n\nexport interface LogFilter {\n level?: LogLevel[]\n category?: LogCategory[]\n userId?: string\n source?: string\n search?: string\n startDate?: Date\n endDate?: Date\n tags?: string[]\n limit?: number\n offset?: number\n sortBy?: 'created_at' | 'level' | 'category'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport class Logger {\n private db: ReturnType\n private enabled: boolean = true\n private configCache: Map = new Map()\n private lastConfigRefresh: number = 0\n private configRefreshInterval: number = 60000 // 1 minute\n\n constructor(database: D1Database) {\n this.db = drizzle(database)\n }\n\n /**\n * Log a debug message\n */\n async debug(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('debug', category, message, data, context)\n }\n\n /**\n * Log an info message\n */\n async info(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('info', category, message, data, context)\n }\n\n /**\n * Log a warning message\n */\n async warn(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('warn', category, message, data, context)\n }\n\n /**\n * Log an error message\n */\n async error(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('error', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log a fatal message\n */\n async fatal(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('fatal', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log an API request\n */\n async logRequest(\n method: string,\n url: string,\n statusCode: number,\n duration: number,\n context?: Partial\n ): Promise {\n const level: LogLevel = statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info'\n \n return this.log(level, 'api', `${method} ${url} - ${statusCode}`, {\n method,\n url,\n statusCode,\n duration\n }, {\n ...context,\n method,\n url,\n statusCode,\n duration\n })\n }\n\n /**\n * Log an authentication event\n */\n async logAuth(action: string, userId?: string, success: boolean = true, context?: Partial): Promise {\n const level: LogLevel = success ? 'info' : 'warn'\n \n return this.log(level, 'auth', `Authentication ${action}: ${success ? 'success' : 'failed'}`, {\n action,\n success,\n userId\n }, {\n ...context,\n userId,\n tags: ['authentication', action]\n })\n }\n\n /**\n * Log a security event\n */\n async logSecurity(event: string, severity: 'low' | 'medium' | 'high' | 'critical', context?: Partial): Promise {\n const level: LogLevel = severity === 'critical' ? 'fatal' : severity === 'high' ? 'error' : 'warn'\n \n return this.log(level, 'security', `Security event: ${event}`, {\n event,\n severity\n }, {\n ...context,\n tags: ['security', severity]\n })\n }\n\n /**\n * Core logging method\n */\n private async log(\n level: LogLevel,\n category: LogCategory,\n message: string,\n data?: any,\n context?: Partial\n ): Promise {\n if (!this.enabled) return\n\n try {\n // Check if logging is enabled for this category and level\n const config = await this.getConfig(category)\n if (!config || !config.enabled || !this.shouldLog(level, config.level)) {\n return\n }\n\n const logEntry: NewSystemLog = {\n id: crypto.randomUUID(),\n level,\n category,\n message,\n data: data ? JSON.stringify(data) : null,\n userId: context?.userId || null,\n sessionId: context?.sessionId || null,\n requestId: context?.requestId || null,\n ipAddress: context?.ipAddress || null,\n userAgent: context?.userAgent || null,\n method: context?.method || null,\n url: context?.url || null,\n statusCode: context?.statusCode || null,\n duration: context?.duration || null,\n stackTrace: context?.stackTrace || null,\n tags: context?.tags ? JSON.stringify(context.tags) : null,\n source: context?.source || null,\n createdAt: new Date()\n }\n\n await this.db.insert(systemLogs).values(logEntry)\n\n // Check if we need to clean up old logs\n if (config.maxSize) {\n await this.cleanupCategory(category, config.maxSize)\n }\n\n } catch (error) {\n // Don't log errors in the logger to avoid infinite loops\n console.error('Logger error:', error)\n }\n }\n\n /**\n * Get logs with filtering and pagination\n */\n async getLogs(filter: LogFilter = {}): Promise<{ logs: any[], total: number }> {\n try {\n const conditions = []\n \n if (filter.level && filter.level.length > 0) {\n conditions.push(inArray(systemLogs.level, filter.level))\n }\n \n if (filter.category && filter.category.length > 0) {\n conditions.push(inArray(systemLogs.category, filter.category))\n }\n \n if (filter.userId) {\n conditions.push(eq(systemLogs.userId, filter.userId))\n }\n \n if (filter.source) {\n conditions.push(eq(systemLogs.source, filter.source))\n }\n \n if (filter.search) {\n conditions.push(\n like(systemLogs.message, `%${filter.search}%`)\n )\n }\n \n if (filter.startDate) {\n conditions.push(gte(systemLogs.createdAt, filter.startDate))\n }\n \n if (filter.endDate) {\n conditions.push(lte(systemLogs.createdAt, filter.endDate))\n }\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined\n\n // Get total count\n const totalResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(whereClause)\n\n const total = totalResult[0]?.count || 0\n\n // Get logs with pagination and sorting\n const sortColumn = filter.sortBy === 'level' ? systemLogs.level :\n filter.sortBy === 'category' ? systemLogs.category :\n systemLogs.createdAt\n\n const sortFn = filter.sortOrder === 'asc' ? asc : desc\n\n const logs = await this.db\n .select()\n .from(systemLogs)\n .where(whereClause)\n .orderBy(sortFn(sortColumn))\n .limit(filter.limit || 50)\n .offset(filter.offset || 0)\n\n return { logs, total }\n } catch (error) {\n console.error('Error getting logs:', error)\n return { logs: [], total: 0 }\n }\n }\n\n /**\n * Get log configuration for a category\n */\n private async getConfig(category: LogCategory): Promise {\n try {\n // Check cache first\n const now = Date.now()\n if (this.configCache.has(category) && (now - this.lastConfigRefresh) < this.configRefreshInterval) {\n return this.configCache.get(category) || null\n }\n\n // Refresh config from database\n const configs = await this.db\n .select()\n .from(logConfig)\n .where(eq(logConfig.category, category))\n\n const config = configs[0] || null\n \n if (config) {\n this.configCache.set(category, config)\n this.lastConfigRefresh = now\n }\n\n return config\n } catch (error) {\n console.error('Error getting log config:', error)\n return null\n }\n }\n\n /**\n * Update log configuration\n */\n async updateConfig(category: LogCategory, updates: Partial): Promise {\n try {\n await this.db\n .update(logConfig)\n .set({\n ...updates,\n updatedAt: new Date()\n })\n .where(eq(logConfig.category, category))\n\n // Clear cache for this category\n this.configCache.delete(category)\n } catch (error) {\n console.error('Error updating log config:', error)\n }\n }\n\n /**\n * Get all log configurations\n */\n async getAllConfigs(): Promise {\n try {\n return await this.db.select().from(logConfig)\n } catch (error) {\n console.error('Error getting log configs:', error)\n return []\n }\n }\n\n /**\n * Clean up old logs for a category\n */\n private async cleanupCategory(category: LogCategory, maxSize: number): Promise {\n try {\n // Count current logs for this category\n const countResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n\n const currentCount = countResult[0]?.count || 0\n\n if (currentCount > maxSize) {\n // Get the cutoff date (keep newest maxSize logs)\n const cutoffLogs = await this.db\n .select({ createdAt: systemLogs.createdAt })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n .orderBy(desc(systemLogs.createdAt))\n .limit(1)\n .offset(maxSize - 1)\n\n if (cutoffLogs[0]) {\n // Delete older logs\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, category),\n lte(systemLogs.createdAt, cutoffLogs[0].createdAt)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n }\n }\n\n /**\n * Clean up logs based on retention policy\n */\n async cleanupByRetention(): Promise {\n try {\n const configs = await this.getAllConfigs()\n \n for (const config of configs) {\n if (config.retention > 0) {\n const cutoffDate = new Date()\n cutoffDate.setDate(cutoffDate.getDate() - config.retention)\n\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, config.category),\n lte(systemLogs.createdAt, cutoffDate)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs by retention:', error)\n }\n }\n\n /**\n * Check if a log level should be recorded based on configuration\n */\n private shouldLog(level: LogLevel, configLevel: string): boolean {\n const levels = ['debug', 'info', 'warn', 'error', 'fatal']\n const levelIndex = levels.indexOf(level)\n const configLevelIndex = levels.indexOf(configLevel)\n \n return levelIndex >= configLevelIndex\n }\n\n /**\n * Enable or disable logging\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton logger instance\nlet loggerInstance: Logger | null = null\n\n/**\n * Get the logger instance\n */\nexport function getLogger(database?: D1Database): Logger {\n if (!loggerInstance && database) {\n loggerInstance = new Logger(database)\n }\n \n if (!loggerInstance) {\n throw new Error('Logger not initialized. Call getLogger with a database instance first.')\n }\n \n return loggerInstance\n}\n\n/**\n * Initialize the logger with a database\n */\nexport function initLogger(database: D1Database): Logger {\n loggerInstance = new Logger(database)\n return loggerInstance\n}","/**\n * Simple Cache Service\n *\n * Provides basic caching functionality for the core package\n * Can be extended with KV or other storage backends\n */\n\nexport interface CacheConfig {\n ttl: number // Time to live in seconds\n keyPrefix: string\n}\n\nexport class CacheService {\n private config: CacheConfig\n private memoryCache: Map = new Map()\n\n constructor(config: CacheConfig) {\n this.config = config\n }\n\n /**\n * Generate cache key with prefix\n */\n generateKey(type: string, identifier?: string): string {\n const parts = [this.config.keyPrefix, type]\n if (identifier) {\n parts.push(identifier)\n }\n return parts.join(':')\n }\n\n /**\n * Get value from cache\n */\n async get(key: string): Promise {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return null\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return null\n }\n\n return cached.value as T\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise<{\n hit: boolean\n data: T | null\n source: string\n ttl?: number\n }> {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return {\n hit: false,\n data: null,\n source: 'none'\n }\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return {\n hit: false,\n data: null,\n source: 'expired'\n }\n }\n\n return {\n hit: true,\n data: cached.value as T,\n source: 'memory',\n ttl: (cached.expires - Date.now()) / 1000 // TTL in seconds\n }\n }\n\n /**\n * Set value in cache\n */\n async set(key: string, value: any, ttl?: number): Promise {\n const expires = Date.now() + ((ttl || this.config.ttl) * 1000)\n this.memoryCache.set(key, { value, expires })\n }\n\n /**\n * Delete specific key from cache\n */\n async delete(key: string): Promise {\n this.memoryCache.delete(key)\n }\n\n /**\n * Invalidate cache keys matching a pattern\n * For memory cache, we do simple string matching\n */\n async invalidate(pattern: string): Promise {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.')\n const regex = new RegExp(`^${regexPattern}$`)\n\n // Find and delete matching keys\n for (const key of this.memoryCache.keys()) {\n if (regex.test(key)) {\n this.memoryCache.delete(key)\n }\n }\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise {\n this.memoryCache.clear()\n }\n\n /**\n * Get value from cache or set it using a callback\n */\n async getOrSet(key: string, callback: () => Promise, ttl?: number): Promise {\n const cached = await this.get(key)\n\n if (cached !== null) {\n return cached\n }\n\n const value = await callback()\n await this.set(key, value, ttl)\n return value\n }\n}\n\n/**\n * Cache configurations for different data types\n */\nexport const CACHE_CONFIGS = {\n api: {\n ttl: 300, // 5 minutes\n keyPrefix: 'api'\n },\n user: {\n ttl: 600, // 10 minutes\n keyPrefix: 'user'\n },\n content: {\n ttl: 300, // 5 minutes\n keyPrefix: 'content'\n },\n collection: {\n ttl: 600, // 10 minutes\n keyPrefix: 'collection'\n }\n}\n\n/**\n * Get cache service instance for a config\n */\nexport function getCacheService(config: CacheConfig): CacheService {\n return new CacheService(config)\n}\n","export interface Setting {\n id: string\n category: string\n key: string\n value: string // JSON string\n created_at: number\n updated_at: number\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface SecuritySettings {\n jwtExpiresIn: string\n jwtRefreshGraceSeconds: number\n}\n\nexport class SettingsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get a setting value by category and key\n */\n async getSetting(category: string, key: string): Promise {\n try {\n const result = await this.db\n .prepare('SELECT value FROM settings WHERE category = ? AND key = ?')\n .bind(category, key)\n .first()\n\n if (!result) {\n return null\n }\n\n return JSON.parse((result as any).value)\n } catch (error) {\n console.error(`Error getting setting ${category}.${key}:`, error)\n return null\n }\n }\n\n /**\n * Get all settings for a category\n */\n async getCategorySettings(category: string): Promise> {\n try {\n const { results } = await this.db\n .prepare('SELECT key, value FROM settings WHERE category = ?')\n .bind(category)\n .all()\n\n const settings: Record = {}\n for (const row of results || []) {\n const r = row as any\n settings[r.key] = JSON.parse(r.value)\n }\n\n return settings\n } catch (error) {\n console.error(`Error getting category settings for ${category}:`, error)\n return {}\n }\n }\n\n /**\n * Set a setting value\n */\n async setSetting(category: string, key: string, value: any): Promise {\n try {\n const now = Date.now()\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n\n return true\n } catch (error) {\n console.error(`Error setting ${category}.${key}:`, error)\n return false\n }\n }\n\n /**\n * Set multiple settings at once\n */\n async setMultipleSettings(category: string, settings: Record): Promise {\n try {\n const now = Date.now()\n\n // Use a transaction-like approach with batch operations\n for (const [key, value] of Object.entries(settings)) {\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n }\n\n return true\n } catch (error) {\n console.error(`Error setting multiple settings for ${category}:`, error)\n return false\n }\n }\n\n /**\n * Get general settings with defaults\n */\n async getGeneralSettings(userEmail?: string): Promise {\n const settings = await this.getCategorySettings('general')\n\n return {\n siteName: settings.siteName || 'SonicJS AI',\n siteDescription: settings.siteDescription || 'A modern headless CMS powered by AI',\n adminEmail: settings.adminEmail || userEmail || 'admin@example.com',\n timezone: settings.timezone || 'UTC',\n language: settings.language || 'en',\n maintenanceMode: settings.maintenanceMode || false\n }\n }\n\n /**\n * Save general settings\n */\n async saveGeneralSettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.siteName !== undefined) settingsToSave.siteName = settings.siteName\n if (settings.siteDescription !== undefined) settingsToSave.siteDescription = settings.siteDescription\n if (settings.adminEmail !== undefined) settingsToSave.adminEmail = settings.adminEmail\n if (settings.timezone !== undefined) settingsToSave.timezone = settings.timezone\n if (settings.language !== undefined) settingsToSave.language = settings.language\n if (settings.maintenanceMode !== undefined) settingsToSave.maintenanceMode = settings.maintenanceMode\n\n return await this.setMultipleSettings('general', settingsToSave)\n }\n\n /**\n * Get security settings with defaults\n */\n async getSecuritySettings(): Promise {\n const settings = await this.getCategorySettings('security')\n\n return {\n jwtExpiresIn: settings.jwtExpiresIn || '30d',\n jwtRefreshGraceSeconds:\n typeof settings.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n }\n }\n\n /**\n * Save security settings\n */\n async saveSecuritySettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.jwtExpiresIn !== undefined) settingsToSave.jwtExpiresIn = settings.jwtExpiresIn\n if (settings.jwtRefreshGraceSeconds !== undefined)\n settingsToSave.jwtRefreshGraceSeconds = settings.jwtRefreshGraceSeconds\n\n return await this.setMultipleSettings('security', settingsToSave)\n }\n}\n","/**\n * Telemetry Service\n *\n * Privacy-first telemetry service using custom SonicJS stats endpoint\n * - No PII collection\n * - Opt-out by default\n * - Silent failures (never blocks app)\n */\n\nimport type { TelemetryEvent, TelemetryProperties, TelemetryConfig, TelemetryIdentity } from '../types/telemetry'\nimport { getTelemetryConfig } from '../utils/telemetry-config'\nimport { generateInstallationId, generateProjectId, sanitizeErrorMessage, sanitizeRoute } from '../utils/telemetry-id'\n\n/**\n * TelemetryService class\n *\n * Handles all telemetry tracking in a privacy-conscious way\n */\nexport class TelemetryService {\n private config: TelemetryConfig\n private identity: TelemetryIdentity | null = null\n private enabled: boolean = true\n private eventQueue: Array<{ event: TelemetryEvent; properties?: TelemetryProperties }> = []\n private isInitialized: boolean = false\n\n constructor(config?: Partial) {\n this.config = {\n ...getTelemetryConfig(),\n ...config\n }\n this.enabled = this.config.enabled\n }\n\n /**\n * Initialize the telemetry service\n */\n async initialize(identity: TelemetryIdentity): Promise {\n if (!this.enabled) {\n if (this.config.debug) {\n console.log('[Telemetry] Disabled via configuration')\n }\n return\n }\n\n try {\n this.identity = identity\n\n if (this.config.debug) {\n console.log('[Telemetry] Initialized with installation ID:', identity.installationId)\n }\n\n this.isInitialized = true\n\n // Flush any queued events\n await this.flushQueue()\n\n } catch (error) {\n // Silent fail - telemetry should never break the app\n if (this.config.debug) {\n console.error('[Telemetry] Initialization failed:', error)\n }\n this.enabled = false\n }\n }\n\n /**\n * Track a telemetry event\n */\n async track(event: TelemetryEvent, properties?: TelemetryProperties): Promise {\n if (!this.enabled) return\n\n try {\n // Sanitize properties\n const sanitizedProps = this.sanitizeProperties(properties)\n\n // Add standard properties\n const enrichedProps = {\n ...sanitizedProps,\n timestamp: new Date().toISOString(),\n version: this.getVersion()\n }\n\n // If not initialized, queue the event\n if (!this.isInitialized) {\n this.eventQueue.push({ event, properties: enrichedProps })\n if (this.config.debug) {\n console.log('[Telemetry] Queued event:', event, enrichedProps)\n }\n return\n }\n\n // Send to custom SonicJS stats endpoint\n if (this.identity && this.config.host) {\n const payload = {\n data: {\n installation_id: this.identity.installationId,\n event_type: event,\n properties: enrichedProps,\n timestamp: enrichedProps.timestamp\n }\n }\n\n // Fire and forget - don't block on response\n fetch(`${this.config.host}/v1/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload)\n }).catch(() => {}) // Silent fail\n\n if (this.config.debug) {\n console.log('[Telemetry] Tracked event:', event, enrichedProps)\n }\n } else if (this.config.debug) {\n console.log('[Telemetry] Event (no endpoint):', event, enrichedProps)\n }\n\n } catch (error) {\n // Silent fail\n if (this.config.debug) {\n console.error('[Telemetry] Failed to track event:', error)\n }\n }\n }\n\n /**\n * Track installation started\n */\n async trackInstallationStarted(properties?: TelemetryProperties): Promise {\n await this.track('installation_started', properties)\n }\n\n /**\n * Track installation completed\n */\n async trackInstallationCompleted(properties?: TelemetryProperties): Promise {\n await this.track('installation_completed', properties)\n }\n\n /**\n * Track installation failed\n */\n async trackInstallationFailed(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('installation_failed', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track dev server started\n */\n async trackDevServerStarted(properties?: TelemetryProperties): Promise {\n await this.track('dev_server_started', properties)\n }\n\n /**\n * Track page view in admin UI\n */\n async trackPageView(route: string, properties?: TelemetryProperties): Promise {\n await this.track('page_viewed', {\n ...properties,\n route: sanitizeRoute(route)\n })\n }\n\n /**\n * Track error (sanitized)\n */\n async trackError(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('error_occurred', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track plugin activation\n */\n async trackPluginActivated(properties?: TelemetryProperties): Promise {\n await this.track('plugin_activated', properties)\n }\n\n /**\n * Track migration run\n */\n async trackMigrationRun(properties?: TelemetryProperties): Promise {\n await this.track('migration_run', properties)\n }\n\n /**\n * Flush queued events\n */\n private async flushQueue(): Promise {\n if (this.eventQueue.length === 0) return\n\n const queue = [...this.eventQueue]\n this.eventQueue = []\n\n for (const { event, properties } of queue) {\n await this.track(event, properties)\n }\n }\n\n /**\n * Sanitize properties to ensure no PII\n */\n private sanitizeProperties(properties?: TelemetryProperties): TelemetryProperties {\n if (!properties) return {}\n\n const sanitized: TelemetryProperties = {}\n\n for (const [key, value] of Object.entries(properties)) {\n // Skip undefined values\n if (value === undefined) continue\n\n // Sanitize routes\n if (key === 'route' && typeof value === 'string') {\n sanitized[key] = sanitizeRoute(value)\n continue\n }\n\n // Sanitize error messages\n if (key.toLowerCase().includes('error') && typeof value === 'string') {\n sanitized[key] = sanitizeErrorMessage(value)\n continue\n }\n\n // Only allow specific types\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n sanitized[key] = value\n }\n }\n\n return sanitized\n }\n\n /**\n * Get SonicJS version\n */\n private getVersion(): string {\n try {\n // Safe environment access for Cloudflare Workers compatibility\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SONICJS_VERSION || '2.0.0'\n }\n return '2.0.0'\n } catch {\n return 'unknown'\n }\n }\n\n /**\n * Shutdown the telemetry service (no-op for fetch-based telemetry)\n */\n async shutdown(): Promise {\n // No-op - fetch requests are fire and forget\n }\n\n /**\n * Enable telemetry\n */\n enable(): void {\n this.enabled = true\n }\n\n /**\n * Disable telemetry\n */\n disable(): void {\n this.enabled = false\n }\n\n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton instance\nlet telemetryInstance: TelemetryService | null = null\n\n/**\n * Get the telemetry service instance\n */\nexport function getTelemetryService(config?: Partial): TelemetryService {\n if (!telemetryInstance) {\n telemetryInstance = new TelemetryService(config)\n }\n return telemetryInstance\n}\n\n/**\n * Initialize telemetry service\n */\nexport async function initTelemetry(identity: TelemetryIdentity, config?: Partial): Promise {\n const service = getTelemetryService(config)\n await service.initialize(identity)\n return service\n}\n\n/**\n * Create a new installation identity\n */\nexport function createInstallationIdentity(projectName?: string): TelemetryIdentity {\n const installationId = generateInstallationId()\n const identity: TelemetryIdentity = { installationId }\n\n if (projectName) {\n // Generate anonymous project ID\n identity.projectId = generateProjectId(projectName)\n }\n\n return identity\n}\n","/**\n * Route Metadata Service\n *\n * Auto-discovers API routes using Hono's inspectRoutes() and enriches them\n * with metadata from a static registry. Routes without metadata still appear\n * as \"auto-discovered\" — nothing is ever invisible.\n */\n\nimport { inspectRoutes } from 'hono/dev'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RouteMetadata {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented: boolean\n}\n\ninterface RouteMeta {\n description: string\n authentication: boolean\n category: string\n}\n\nexport interface CategoryInfo {\n title: string\n description: string\n icon: string\n}\n\n// ============================================================================\n// App Instance Storage\n// ============================================================================\n\nlet appInstance: any = null\n\nexport function setAppInstance(app: any): void {\n appInstance = app\n}\n\nexport function getAppInstance(): any {\n return appInstance\n}\n\n// ============================================================================\n// Category Information\n// ============================================================================\n\nexport const CATEGORY_INFO: Record = {\n 'Auth': {\n title: 'Authentication',\n description: 'User authentication and authorization endpoints',\n icon: '🔐'\n },\n 'Content': {\n title: 'Content Management',\n description: 'Content creation, retrieval, and management',\n icon: '📝'\n },\n 'Media': {\n title: 'Media Management',\n description: 'File upload, storage, and media operations',\n icon: '🖼️'\n },\n 'Admin': {\n title: 'Admin Interface',\n description: 'Administrative panel and management features',\n icon: '⚙️'\n },\n 'System': {\n title: 'System',\n description: 'Health checks and system information',\n icon: '🔧'\n },\n 'Search': {\n title: 'Search',\n description: 'AI-powered search, full-text search, and analytics',\n icon: '🔍'\n },\n 'API Keys': {\n title: 'API Keys',\n description: 'API key management and authentication',\n icon: '🔑'\n },\n 'Workflow': {\n title: 'Workflow',\n description: 'Content workflow and approval processes',\n icon: '🔄'\n },\n 'Cache': {\n title: 'Cache',\n description: 'Cache management and invalidation',\n icon: '⚡'\n },\n 'Forms': {\n title: 'Forms',\n description: 'Form submissions and management',\n icon: '📋'\n },\n 'Files': {\n title: 'Files',\n description: 'File serving from R2 storage',\n icon: '📁'\n }\n}\n\n// ============================================================================\n// Route Metadata Registry\n// ============================================================================\n\nconst ROUTE_METADATA: Record = {\n // Auth endpoints\n 'POST /auth/login': { description: 'Authenticate user with email and password (returns JWT)', category: 'Auth', authentication: false },\n 'POST /auth/login/form': { description: 'Form-based login (sets session cookie)', category: 'Auth', authentication: false },\n 'POST /auth/register': { description: 'Register a new user account', category: 'Auth', authentication: false },\n 'POST /auth/logout': { description: 'Log out the current user and invalidate session', category: 'Auth', authentication: true },\n 'GET /auth/me': { description: 'Get current authenticated user information', category: 'Auth', authentication: true },\n 'POST /auth/refresh': { description: 'Refresh authentication token', category: 'Auth', authentication: true },\n 'POST /auth/seed-admin': { description: 'Create or reset the admin user account', category: 'Auth', authentication: false },\n 'POST /auth/magic-link/request': { description: 'Request a magic link login email', category: 'Auth', authentication: false },\n 'GET /auth/magic-link/verify': { description: 'Verify magic link token and authenticate', category: 'Auth', authentication: false },\n 'POST /auth/otp/request': { description: 'Request a one-time password via email', category: 'Auth', authentication: false },\n 'POST /auth/otp/verify': { description: 'Verify OTP code and authenticate', category: 'Auth', authentication: false },\n\n // Content endpoints\n 'GET /api/collections': { description: 'List all available collections', category: 'Content', authentication: false },\n 'GET /api/collections/:collection/content': { description: 'Get all content items from a specific collection', category: 'Content', authentication: false },\n 'GET /api/content/:id': { description: 'Get a specific content item by ID', category: 'Content', authentication: false },\n 'POST /api/content': { description: 'Create a new content item', category: 'Content', authentication: true },\n 'PUT /api/content/:id': { description: 'Update an existing content item', category: 'Content', authentication: true },\n 'DELETE /api/content/:id': { description: 'Delete a content item', category: 'Content', authentication: true },\n 'GET /api/content/:id/versions': { description: 'Get version history for a content item', category: 'Content', authentication: true },\n 'POST /api/content/:id/restore/:versionId': { description: 'Restore a content item to a previous version', category: 'Content', authentication: true },\n\n // Media endpoints\n 'GET /api/media': { description: 'List all media files with pagination', category: 'Media', authentication: false },\n 'GET /api/media/:id': { description: 'Get a specific media file by ID', category: 'Media', authentication: false },\n 'POST /api/media/upload': { description: 'Upload a new media file to R2 storage', category: 'Media', authentication: true },\n 'DELETE /api/media/:id': { description: 'Delete a media file from storage', category: 'Media', authentication: true },\n\n // Admin API endpoints\n 'GET /admin/api/stats': { description: 'Get dashboard statistics (collections, content, media, users)', category: 'Admin', authentication: true },\n 'GET /admin/api/storage': { description: 'Get storage usage information', category: 'Admin', authentication: true },\n 'GET /admin/api/activity': { description: 'Get recent activity logs', category: 'Admin', authentication: true },\n 'GET /admin/api/collections': { description: 'List all collections with field counts', category: 'Admin', authentication: true },\n 'POST /admin/api/collections': { description: 'Create a new collection', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id': { description: 'Get a specific collection with its fields', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id': { description: 'Update an existing collection', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id': { description: 'Delete a collection (must be empty)', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id/fields': { description: 'Get fields for a specific collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields': { description: 'Add a field to a collection', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id/fields/:fieldId': { description: 'Update a collection field', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id/fields/:fieldId': { description: 'Remove a field from a collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields/reorder': { description: 'Reorder fields in a collection', category: 'Admin', authentication: true },\n 'GET /admin/api/migrations/status': { description: 'Get database migration status', category: 'Admin', authentication: true },\n 'POST /admin/api/migrations/run': { description: 'Run pending database migrations', category: 'Admin', authentication: true },\n 'GET /admin/api/content': { description: 'List content items with filtering and pagination', category: 'Admin', authentication: true },\n 'GET /admin/api/content/:id': { description: 'Get a content item for admin editing', category: 'Admin', authentication: true },\n 'POST /admin/api/content': { description: 'Create content via admin API', category: 'Admin', authentication: true },\n 'PUT /admin/api/content/:id': { description: 'Update content via admin API', category: 'Admin', authentication: true },\n 'DELETE /admin/api/content/:id': { description: 'Delete content via admin API', category: 'Admin', authentication: true },\n 'GET /admin/api/media': { description: 'List media files for admin management', category: 'Admin', authentication: true },\n 'POST /admin/api/media/upload': { description: 'Upload media via admin interface', category: 'Admin', authentication: true },\n 'DELETE /admin/api/media/:id': { description: 'Delete media via admin interface', category: 'Admin', authentication: true },\n 'GET /admin/api/users': { description: 'List all users', category: 'Admin', authentication: true },\n 'POST /admin/api/users': { description: 'Create a new user', category: 'Admin', authentication: true },\n 'PUT /admin/api/users/:id': { description: 'Update a user', category: 'Admin', authentication: true },\n 'DELETE /admin/api/users/:id': { description: 'Delete a user', category: 'Admin', authentication: true },\n 'GET /admin/api/logs': { description: 'Get application logs with filtering', category: 'Admin', authentication: true },\n 'GET /admin/api/plugins': { description: 'List all registered plugins', category: 'Admin', authentication: true },\n 'POST /admin/api/plugins/:id/toggle': { description: 'Enable or disable a plugin', category: 'Admin', authentication: true },\n 'GET /admin/api/settings': { description: 'Get application settings', category: 'Admin', authentication: true },\n 'PUT /admin/api/settings': { description: 'Update application settings', category: 'Admin', authentication: true },\n 'GET /admin/api/forms': { description: 'List all forms', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id': { description: 'Get form details and submissions', category: 'Admin', authentication: true },\n 'POST /admin/api/forms': { description: 'Create a new form', category: 'Admin', authentication: true },\n 'PUT /admin/api/forms/:id': { description: 'Update a form', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id': { description: 'Delete a form', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id/submissions': { description: 'Get form submissions', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id/submissions/:submissionId': { description: 'Delete a form submission', category: 'Admin', authentication: true },\n\n // Search endpoints\n 'GET /api/search': { description: 'Search content using AI, FTS5, keyword, or hybrid mode', category: 'Search', authentication: false },\n 'POST /api/search/click': { description: 'Track a search result click for analytics', category: 'Search', authentication: false },\n 'GET /admin/plugins/ai-search/api/status': { description: 'Get search plugin status and configuration', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index': { description: 'Trigger content indexing for search', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index/reset': { description: 'Reset the search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics': { description: 'Get search analytics and metrics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/queries': { description: 'Get top search queries', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/clicks': { description: 'Get click-through analytics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/fts5/status': { description: 'Get FTS5 full-text search status', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/fts5/rebuild': { description: 'Rebuild the FTS5 search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/facets': { description: 'Get available search facets', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments': { description: 'List search A/B test experiments', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments': { description: 'Create a search A/B test experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id': { description: 'Get experiment details', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/experiments/:id': { description: 'Update an experiment', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/experiments/:id': { description: 'Delete an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/start': { description: 'Start an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/stop': { description: 'Stop a running experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id/results': { description: 'Get experiment results and statistics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality': { description: 'Get search quality agent analysis', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/run': { description: 'Run search quality analysis', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality/recommendations': { description: 'Get quality improvement recommendations', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/apply': { description: 'Apply a quality recommendation', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/dismiss': { description: 'Dismiss a quality recommendation', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/synonyms': { description: 'List search synonyms', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/synonyms': { description: 'Add a search synonym', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/synonyms/:id': { description: 'Delete a search synonym', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/query-rules': { description: 'List search query rules', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/query-rules': { description: 'Create a query rule', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/query-rules/:id': { description: 'Update a query rule', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/query-rules/:id': { description: 'Delete a query rule', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/settings': { description: 'Get search plugin settings', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/settings': { description: 'Update search plugin settings', category: 'Search', authentication: true },\n\n // API Key endpoints\n 'GET /admin/api-keys/api/keys': { description: 'List all API keys', category: 'API Keys', authentication: true },\n 'POST /admin/api-keys/api/keys': { description: 'Create a new API key', category: 'API Keys', authentication: true },\n 'DELETE /admin/api-keys/api/keys/:id': { description: 'Revoke an API key', category: 'API Keys', authentication: true },\n 'PUT /admin/api-keys/api/keys/:id': { description: 'Update an API key', category: 'API Keys', authentication: true },\n\n // Cache endpoints\n 'GET /admin/cache/api/stats': { description: 'Get cache statistics', category: 'Cache', authentication: true },\n 'POST /admin/cache/api/purge': { description: 'Purge cache entries', category: 'Cache', authentication: true },\n 'GET /admin/cache/api/entries': { description: 'List cache entries', category: 'Cache', authentication: true },\n 'DELETE /admin/cache/api/entries/:key': { description: 'Delete a specific cache entry', category: 'Cache', authentication: true },\n\n // Workflow endpoints\n 'GET /workflow/status/:id': { description: 'Get workflow status for a content item', category: 'Workflow', authentication: true },\n 'POST /workflow/submit/:id': { description: 'Submit content for review', category: 'Workflow', authentication: true },\n 'POST /workflow/approve/:id': { description: 'Approve content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/reject/:id': { description: 'Reject content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/publish/:id': { description: 'Publish approved content', category: 'Workflow', authentication: true },\n 'POST /workflow/unpublish/:id': { description: 'Unpublish content', category: 'Workflow', authentication: true },\n 'GET /workflow/history/:id': { description: 'Get workflow history for a content item', category: 'Workflow', authentication: true },\n\n // Form endpoints (public)\n 'POST /forms/:formId/submit': { description: 'Submit a form (public endpoint)', category: 'Forms', authentication: false },\n 'GET /forms/:formId': { description: 'Get form definition for rendering', category: 'Forms', authentication: false },\n 'POST /api/forms/:formId/submit': { description: 'Submit a form via API', category: 'Forms', authentication: false },\n 'GET /api/forms/:formId': { description: 'Get form definition via API', category: 'Forms', authentication: false },\n\n // System endpoints\n 'GET /health': { description: 'Health check endpoint for monitoring', category: 'System', authentication: false },\n 'GET /api/health': { description: 'API health check with schema information', category: 'System', authentication: false },\n 'GET /api': { description: 'API root - returns API information and available endpoints', category: 'System', authentication: false },\n 'GET /api/system/info': { description: 'Get system information and version', category: 'System', authentication: false },\n 'GET /api/system/schema': { description: 'Get database schema information', category: 'System', authentication: false },\n\n // File serving\n 'GET /files/*': { description: 'Serve files from R2 storage (public access)', category: 'Files', authentication: false },\n\n // Database tools\n 'POST /admin/database-tools/api/query': { description: 'Execute a database query', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables': { description: 'List database tables', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables/:name': { description: 'Get table schema and sample data', category: 'Admin', authentication: true },\n\n // Seed data\n 'POST /admin/seed-data/api/generate': { description: 'Generate seed data for development', category: 'Admin', authentication: true },\n 'GET /admin/seed-data/api/status': { description: 'Get seed data generation status', category: 'Admin', authentication: true },\n\n // Email plugin\n 'POST /admin/plugins/email/api/send': { description: 'Send an email', category: 'Admin', authentication: true },\n 'GET /admin/plugins/email/api/templates': { description: 'List email templates', category: 'Admin', authentication: true },\n 'POST /admin/plugins/email/api/test': { description: 'Send a test email', category: 'Admin', authentication: true },\n}\n\n// ============================================================================\n// Whitelist Patterns for API routes\n// ============================================================================\n\nconst INCLUDED_ROUTE_PATTERNS: RegExp[] = [\n /^\\/api\\//, // All /api/* routes\n /^\\/api$/, // API root\n /^\\/auth\\/(?!login$|register$)/, // Auth routes except GET login/register HTML pages\n /^\\/auth\\/login$/, // POST /auth/login (method filtered later)\n /^\\/auth\\/register$/, // POST /auth/register (method filtered later)\n /^\\/admin\\/api\\//, // Admin API endpoints\n /^\\/admin\\/api-keys\\/api\\//, // API key management\n /^\\/admin\\/cache\\/api\\//, // Cache management API\n /^\\/admin\\/plugins\\/.*\\/api\\//, // Plugin API endpoints\n /^\\/admin\\/database-tools\\/api\\//, // Database tools API\n /^\\/admin\\/seed-data\\/api\\//, // Seed data API\n /^\\/workflow\\//, // Workflow endpoints\n /^\\/health$/, // Health check\n /^\\/files\\//, // File serving\n /^\\/forms\\//, // Public form endpoints\n]\n\n// Routes to always exclude (even if they match an include pattern)\nconst EXCLUDED_ROUTES = new Set([\n 'GET /auth/login',\n 'GET /auth/register',\n 'GET /auth/login/form',\n])\n\n// ============================================================================\n// Route Discovery\n// ============================================================================\n\nlet cachedRouteList: RouteMetadata[] | null = null\n\nfunction isIncludedRoute(method: string, path: string): boolean {\n // Check exclusions first\n const key = `${method} ${path}`\n if (EXCLUDED_ROUTES.has(key)) {\n return false\n }\n\n // Check if the path matches any include pattern\n return INCLUDED_ROUTE_PATTERNS.some(pattern => pattern.test(path))\n}\n\nfunction inferCategory(path: string): string {\n if (path.startsWith('/auth/')) return 'Auth'\n if (path.startsWith('/api/search')) return 'Search'\n if (path.startsWith('/api/media')) return 'Media'\n if (path.startsWith('/api/system')) return 'System'\n if (path.startsWith('/api/content') || path.startsWith('/api/collections')) return 'Content'\n if (path.startsWith('/api/forms')) return 'Forms'\n if (path.startsWith('/admin/api-keys')) return 'API Keys'\n if (path.startsWith('/admin/cache')) return 'Cache'\n if (path.startsWith('/admin/plugins/ai-search')) return 'Search'\n if (path.startsWith('/admin/api')) return 'Admin'\n if (path.startsWith('/admin/database-tools')) return 'Admin'\n if (path.startsWith('/admin/seed-data')) return 'Admin'\n if (path.startsWith('/admin/plugins/email')) return 'Admin'\n if (path.startsWith('/workflow/')) return 'Workflow'\n if (path.startsWith('/forms/')) return 'Forms'\n if (path.startsWith('/files/')) return 'Files'\n if (path === '/health' || path.startsWith('/api')) return 'System'\n return 'Other'\n}\n\nfunction inferAuth(path: string): boolean | 'unknown' {\n // Known public routes\n if (path === '/health' || path === '/api' || path === '/api/health') return false\n if (path === '/api/system/info' || path === '/api/system/schema') return false\n if (path.startsWith('/files/')) return false\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/')) return false\n\n // Admin routes require auth\n if (path.startsWith('/admin/')) return true\n if (path.startsWith('/workflow/')) return true\n\n return 'unknown'\n}\n\nexport function buildRouteList(app: any): RouteMetadata[] {\n if (cachedRouteList) return cachedRouteList\n\n if (!app) return []\n\n try {\n const routes = inspectRoutes(app as any)\n\n // Deduplicate and filter\n const seen = new Set()\n const result: RouteMetadata[] = []\n\n for (const route of routes) {\n // Skip middleware entries\n if (route.isMiddleware) continue\n // Skip ALL method (middleware-like catch-all)\n if (route.method === 'ALL') continue\n\n const key = `${route.method} ${route.path}`\n\n // Skip duplicates\n if (seen.has(key)) continue\n seen.add(key)\n\n // Apply whitelist filter\n if (!isIncludedRoute(route.method, route.path)) continue\n\n // Look up metadata\n const meta = ROUTE_METADATA[key]\n\n if (meta) {\n result.push({\n method: route.method,\n path: route.path,\n description: meta.description,\n authentication: meta.authentication,\n category: meta.category,\n documented: true\n })\n } else {\n // Auto-discovered: infer category and auth\n result.push({\n method: route.method,\n path: route.path,\n description: '',\n authentication: inferAuth(route.path),\n category: inferCategory(route.path),\n documented: false\n })\n }\n }\n\n // Sort: by category, then method order, then path\n const methodOrder: Record = { GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4 }\n result.sort((a, b) => {\n const catCmp = a.category.localeCompare(b.category)\n if (catCmp !== 0) return catCmp\n const methCmp = (methodOrder[a.method] ?? 5) - (methodOrder[b.method] ?? 5)\n if (methCmp !== 0) return methCmp\n return a.path.localeCompare(b.path)\n })\n\n cachedRouteList = result\n return result\n } catch (error) {\n console.error('Failed to inspect routes:', error)\n return []\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/db/schema.ts","../../../../../node_modules/src/constants.ts","../../../../../node_modules/src/utils.ts","../../../../../node_modules/src/column.ts","../../../../../node_modules/src/schema.ts","../src/services/logger.ts","../src/services/cache.ts","../src/services/settings.ts","../src/services/telemetry-service.ts","../src/services/route-metadata.ts"],"names":["__export","zod","z","integer","isTable","getTableColumns","getViewSelectedFields","is","Column","SQL","columns","isView","sqliteTable","text","drizzle","inArray","eq","like","gte","lte","and","count","asc","desc","getTelemetryConfig","sanitizeErrorMessage","sanitizeRoute","generateInstallationId","generateProjectId","inspectRoutes"],"mappings":"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","file":"chunk-XWQVFWPW.cjs","sourcesContent":["import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod';\n\n// Users table for authentication and user management\nexport const users = sqliteTable('users', {\n id: text('id').primaryKey(),\n email: text('email').notNull().unique(),\n username: text('username').notNull().unique(),\n firstName: text('first_name').notNull(),\n lastName: text('last_name').notNull(),\n passwordHash: text('password_hash'), // Hashed password, nullable for OAuth users\n role: text('role').notNull().default('viewer'), // 'admin', 'editor', 'author', 'viewer'\n avatar: text('avatar'),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n lastLoginAt: integer('last_login_at'),\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Content collections - dynamic schema definitions\nexport const collections = sqliteTable('collections', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n schema: text('schema', { mode: 'json' }).notNull(), // JSON schema definition\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false), // Config-managed collections cannot be edited in UI\n sourceType: text('source_type').default('user'), // 'user' (normal), 'form' (form-derived)\n sourceId: text('source_id'), // stores the form ID for form-derived collections\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content items - actual content data\nexport const content = sqliteTable('content', {\n id: text('id').primaryKey(),\n collectionId: text('collection_id').notNull().references(() => collections.id),\n slug: text('slug').notNull(),\n title: text('title').notNull(),\n data: text('data', { mode: 'json' }).notNull(), // JSON content data\n status: text('status').notNull().default('draft'), // 'draft', 'published', 'archived'\n publishedAt: integer('published_at', { mode: 'timestamp' }),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Content versions for versioning system\nexport const contentVersions = sqliteTable('content_versions', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n version: integer('version').notNull(),\n data: text('data', { mode: 'json' }).notNull(),\n authorId: text('author_id').notNull().references(() => users.id),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Media/Files table\nexport const media = sqliteTable('media', {\n id: text('id').primaryKey(),\n filename: text('filename').notNull(),\n originalName: text('original_name').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n width: integer('width'),\n height: integer('height'),\n folder: text('folder').notNull().default('uploads'),\n r2Key: text('r2_key').notNull(), // R2 storage key\n publicUrl: text('public_url').notNull(), // CDN URL\n thumbnailUrl: text('thumbnail_url'),\n alt: text('alt'),\n caption: text('caption'),\n tags: text('tags', { mode: 'json' }), // JSON array of tags\n uploadedBy: text('uploaded_by').notNull().references(() => users.id),\n uploadedAt: integer('uploaded_at').notNull(),\n updatedAt: integer('updated_at'),\n publishedAt: integer('published_at'),\n scheduledAt: integer('scheduled_at'),\n archivedAt: integer('archived_at'),\n deletedAt: integer('deleted_at'),\n});\n\n// API tokens for programmatic access\nexport const apiTokens = sqliteTable('api_tokens', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n token: text('token').notNull().unique(),\n userId: text('user_id').notNull().references(() => users.id),\n permissions: text('permissions', { mode: 'json' }).notNull(), // Array of permissions\n expiresAt: integer('expires_at', { mode: 'timestamp' }),\n lastUsedAt: integer('last_used_at', { mode: 'timestamp' }),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n\n// Workflow history for content workflow tracking\nexport const workflowHistory = sqliteTable('workflow_history', {\n id: text('id').primaryKey(),\n contentId: text('content_id').notNull().references(() => content.id),\n action: text('action').notNull(),\n fromStatus: text('from_status').notNull(),\n toStatus: text('to_status').notNull(),\n userId: text('user_id').notNull().references(() => users.id),\n comment: text('comment'),\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Plugin system tables\nexport const plugins = sqliteTable('plugins', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n displayName: text('display_name').notNull(),\n description: text('description'),\n version: text('version').notNull(),\n author: text('author').notNull(),\n category: text('category').notNull(),\n icon: text('icon'),\n status: text('status').notNull().default('inactive'), // 'active', 'inactive', 'error'\n isCore: integer('is_core', { mode: 'boolean' }).notNull().default(false),\n settings: text('settings', { mode: 'json' }),\n permissions: text('permissions', { mode: 'json' }),\n dependencies: text('dependencies', { mode: 'json' }),\n downloadCount: integer('download_count').notNull().default(0),\n rating: integer('rating').notNull().default(0),\n installedAt: integer('installed_at').notNull(),\n activatedAt: integer('activated_at'),\n lastUpdated: integer('last_updated').notNull(),\n errorMessage: text('error_message'),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n updatedAt: integer('updated_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginHooks = sqliteTable('plugin_hooks', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n hookName: text('hook_name').notNull(),\n handlerName: text('handler_name').notNull(),\n priority: integer('priority').notNull().default(10),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginRoutes = sqliteTable('plugin_routes', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n path: text('path').notNull(),\n method: text('method').notNull(),\n handlerName: text('handler_name').notNull(),\n middleware: text('middleware', { mode: 'json' }),\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginAssets = sqliteTable('plugin_assets', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n assetType: text('asset_type').notNull(), // 'css', 'js', 'image', 'font'\n assetPath: text('asset_path').notNull(),\n loadOrder: integer('load_order').notNull().default(100),\n loadLocation: text('load_location').notNull().default('footer'), // 'header', 'footer'\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n createdAt: integer('created_at').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\nexport const pluginActivityLog = sqliteTable('plugin_activity_log', {\n id: text('id').primaryKey(),\n pluginId: text('plugin_id').notNull().references(() => plugins.id),\n action: text('action').notNull(),\n userId: text('user_id'),\n details: text('details', { mode: 'json' }),\n timestamp: integer('timestamp').notNull().$defaultFn(() => Math.floor(Date.now() / 1000)),\n});\n\n// Zod schemas for validation\nexport const insertUserSchema = createInsertSchema(users, {\n email: (schema: any) => schema.email(),\n firstName: (schema: any) => schema.min(1),\n lastName: (schema: any) => schema.min(1),\n username: (schema: any) => schema.min(3),\n});\n\nexport const selectUserSchema = createSelectSchema(users);\n\nexport const insertCollectionSchema = createInsertSchema(collections, {\n name: (schema: any) => schema.min(1).regex(/^[a-z0-9_]+$/, 'Collection name must be lowercase with underscores'),\n displayName: (schema: any) => schema.min(1),\n});\n\nexport const selectCollectionSchema = createSelectSchema(collections);\n\nexport const insertContentSchema = createInsertSchema(content, {\n slug: (schema: any) => schema.min(1).regex(/^[a-zA-Z0-9_-]+$/, 'Slug must contain only letters, numbers, underscores, and hyphens'),\n title: (schema: any) => schema.min(1),\n status: (schema: any) => schema,\n});\n\nexport const selectContentSchema = createSelectSchema(content);\n\nexport const insertMediaSchema = createInsertSchema(media, {\n filename: (schema: any) => schema.min(1),\n originalName: (schema: any) => schema.min(1),\n mimeType: (schema: any) => schema.min(1),\n size: (schema: any) => schema.positive(),\n r2Key: (schema: any) => schema.min(1),\n publicUrl: (schema: any) => schema.url(),\n folder: (schema: any) => schema.min(1),\n});\n\nexport const selectMediaSchema = createSelectSchema(media);\n\n\nexport const insertWorkflowHistorySchema = createInsertSchema(workflowHistory, {\n action: (schema: any) => schema.min(1),\n fromStatus: (schema: any) => schema.min(1),\n toStatus: (schema: any) => schema.min(1),\n});\n\nexport const selectWorkflowHistorySchema = createSelectSchema(workflowHistory);\n\nexport const insertPluginSchema = createInsertSchema(plugins, {\n name: (schema: any) => schema.min(1),\n displayName: (schema: any) => schema.min(1),\n version: (schema: any) => schema.min(1),\n author: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginSchema = createSelectSchema(plugins);\n\nexport const insertPluginHookSchema = createInsertSchema(pluginHooks, {\n hookName: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginHookSchema = createSelectSchema(pluginHooks);\n\nexport const insertPluginRouteSchema = createInsertSchema(pluginRoutes, {\n path: (schema: any) => schema.min(1),\n method: (schema: any) => schema.min(1),\n handlerName: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginRouteSchema = createSelectSchema(pluginRoutes);\n\nexport const insertPluginAssetSchema = createInsertSchema(pluginAssets, {\n assetType: (schema: any) => schema.min(1),\n assetPath: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginAssetSchema = createSelectSchema(pluginAssets);\n\nexport const insertPluginActivityLogSchema = createInsertSchema(pluginActivityLog, {\n action: (schema: any) => schema.min(1),\n});\n\nexport const selectPluginActivityLogSchema = createSelectSchema(pluginActivityLog);\n\n// System logs table for comprehensive logging\nexport const systemLogs = sqliteTable('system_logs', {\n id: text('id').primaryKey(),\n level: text('level').notNull(), // 'debug', 'info', 'warn', 'error', 'fatal'\n category: text('category').notNull(), // 'auth', 'api', 'workflow', 'plugin', 'media', 'system', etc.\n message: text('message').notNull(),\n data: text('data', { mode: 'json' }), // Additional structured data\n userId: text('user_id').references(() => users.id),\n sessionId: text('session_id'),\n requestId: text('request_id'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n method: text('method'), // HTTP method for API logs\n url: text('url'), // Request URL for API logs\n statusCode: integer('status_code'), // HTTP status code for API logs\n duration: integer('duration'), // Request duration in milliseconds\n stackTrace: text('stack_trace'), // Error stack trace for error logs\n tags: text('tags', { mode: 'json' }), // Array of tags for categorization\n source: text('source'), // Source component/module that generated the log\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Log configuration table\nexport const logConfig = sqliteTable('log_config', {\n id: text('id').primaryKey(),\n category: text('category').notNull().unique(),\n enabled: integer('enabled', { mode: 'boolean' }).notNull().default(true),\n level: text('level').notNull().default('info'), // minimum log level to store\n retention: integer('retention').notNull().default(30), // days to keep logs\n maxSize: integer('max_size').default(10000), // max number of logs per category\n createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n});\n\n// Insert and select schemas for system logs\nexport const insertSystemLogSchema = createInsertSchema(systemLogs, {\n level: (schema: any) => schema.min(1),\n category: (schema: any) => schema.min(1),\n message: (schema: any) => schema.min(1),\n});\n\nexport const selectSystemLogSchema = createSelectSchema(systemLogs);\n\nexport const insertLogConfigSchema = createInsertSchema(logConfig, {\n category: (schema: any) => schema.min(1),\n level: (schema: any) => schema.min(1),\n});\n\nexport const selectLogConfigSchema = createSelectSchema(logConfig);\n\n// Type exports\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\nexport type Collection = typeof collections.$inferSelect;\nexport type NewCollection = typeof collections.$inferInsert;\nexport type Content = typeof content.$inferSelect;\nexport type NewContent = typeof content.$inferInsert;\nexport type Media = typeof media.$inferSelect;\nexport type NewMedia = typeof media.$inferInsert;\nexport type WorkflowHistory = typeof workflowHistory.$inferSelect;\nexport type NewWorkflowHistory = typeof workflowHistory.$inferInsert;\nexport type Plugin = typeof plugins.$inferSelect;\nexport type NewPlugin = typeof plugins.$inferInsert;\nexport type PluginHook = typeof pluginHooks.$inferSelect;\nexport type NewPluginHook = typeof pluginHooks.$inferInsert;\nexport type PluginRoute = typeof pluginRoutes.$inferSelect;\nexport type NewPluginRoute = typeof pluginRoutes.$inferInsert;\nexport type PluginAsset = typeof pluginAssets.$inferSelect;\nexport type NewPluginAsset = typeof pluginAssets.$inferInsert;\nexport type PluginActivityLog = typeof pluginActivityLog.$inferSelect;\nexport type NewPluginActivityLog = typeof pluginActivityLog.$inferInsert;\nexport type SystemLog = typeof systemLogs.$inferSelect;\nexport type NewSystemLog = typeof systemLogs.$inferInsert;\nexport type LogConfig = typeof logConfig.$inferSelect;\nexport type NewLogConfig = typeof logConfig.$inferInsert;\n\n// =====================================================\n// Security Audit Plugin Tables\n// =====================================================\n\nexport const securityEvents = sqliteTable('security_events', {\n id: text('id').primaryKey(),\n eventType: text('event_type').notNull(),\n severity: text('severity').notNull().default('info'),\n userId: text('user_id'),\n email: text('email'),\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n countryCode: text('country_code'),\n requestPath: text('request_path'),\n requestMethod: text('request_method'),\n details: text('details', { mode: 'json' }),\n fingerprint: text('fingerprint'),\n blocked: integer('blocked').notNull().default(0),\n createdAt: integer('created_at').notNull().$defaultFn(() => Date.now()),\n});\n\nexport const insertSecurityEventSchema = createInsertSchema(securityEvents, {\n eventType: (schema: any) => schema.min(1),\n severity: (schema: any) => schema.min(1),\n});\n\nexport const selectSecurityEventSchema = createSelectSchema(securityEvents);\n\nexport type SecurityEventRecord = typeof securityEvents.$inferSelect;\nexport type NewSecurityEventRecord = typeof securityEvents.$inferInsert;\n\n// =====================================================\n// Form.io Integration Tables\n// =====================================================\n\n// Forms table - stores Form.io form definitions\nexport const forms = sqliteTable('forms', {\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(), // Machine name (e.g., \"contact-form\")\n displayName: text('display_name').notNull(), // Human name (e.g., \"Contact Form\")\n description: text('description'),\n category: text('category').notNull().default('general'), // contact, survey, registration, etc.\n \n // Form.io schema (JSON)\n formioSchema: text('formio_schema', { mode: 'json' }).notNull(), // Complete Form.io JSON schema\n \n // Settings (JSON)\n settings: text('settings', { mode: 'json' }), // emailNotifications, successMessage, etc.\n \n // Status & Management\n isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true),\n isPublic: integer('is_public', { mode: 'boolean' }).notNull().default(true),\n managed: integer('managed', { mode: 'boolean' }).notNull().default(false),\n \n // Metadata\n icon: text('icon'),\n color: text('color'),\n tags: text('tags', { mode: 'json' }), // JSON array\n \n // Stats\n submissionCount: integer('submission_count').notNull().default(0),\n viewCount: integer('view_count').notNull().default(0),\n \n // Ownership\n createdBy: text('created_by').references(() => users.id),\n updatedBy: text('updated_by').references(() => users.id),\n \n // Timestamps\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form submissions table\nexport const formSubmissions = sqliteTable('form_submissions', {\n id: text('id').primaryKey(),\n formId: text('form_id').notNull().references(() => forms.id, { onDelete: 'cascade' }),\n \n // Submission data\n submissionData: text('submission_data', { mode: 'json' }).notNull(), // The actual form data\n \n // Submission metadata\n status: text('status').notNull().default('pending'), // pending, reviewed, approved, rejected, spam\n submissionNumber: integer('submission_number'),\n \n // User information\n userId: text('user_id').references(() => users.id),\n userEmail: text('user_email'),\n \n // Tracking\n ipAddress: text('ip_address'),\n userAgent: text('user_agent'),\n referrer: text('referrer'),\n utmSource: text('utm_source'),\n utmMedium: text('utm_medium'),\n utmCampaign: text('utm_campaign'),\n \n // Review/Processing\n reviewedBy: text('reviewed_by').references(() => users.id),\n reviewedAt: integer('reviewed_at'),\n reviewNotes: text('review_notes'),\n \n // Flags\n isSpam: integer('is_spam', { mode: 'boolean' }).notNull().default(false),\n isArchived: integer('is_archived', { mode: 'boolean' }).notNull().default(false),\n\n // Content integration\n contentId: text('content_id').references(() => content.id), // Links submission to its content item\n\n // Timestamps\n submittedAt: integer('submitted_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n});\n\n// Form files table - links submissions to uploaded files\nexport const formFiles = sqliteTable('form_files', {\n id: text('id').primaryKey(),\n submissionId: text('submission_id').notNull().references(() => formSubmissions.id, { onDelete: 'cascade' }),\n mediaId: text('media_id').notNull().references(() => media.id, { onDelete: 'cascade' }),\n fieldName: text('field_name').notNull(), // Form field that uploaded this file\n uploadedAt: integer('uploaded_at').notNull(),\n});\n\n// Zod schemas for validation\nexport const insertFormSchema = createInsertSchema(forms);\nexport const selectFormSchema = createSelectSchema(forms);\nexport const insertFormSubmissionSchema = createInsertSchema(formSubmissions);\nexport const selectFormSubmissionSchema = createSelectSchema(formSubmissions);\nexport const insertFormFileSchema = createInsertSchema(formFiles);\nexport const selectFormFileSchema = createSelectSchema(formFiles);\n\n// TypeScript types\nexport type Form = typeof forms.$inferSelect;\nexport type NewForm = typeof forms.$inferInsert;\nexport type FormSubmission = typeof formSubmissions.$inferSelect;\nexport type NewFormSubmission = typeof formSubmissions.$inferInsert;\nexport type FormFile = typeof formFiles.$inferSelect;\nexport type NewFormFile = typeof formFiles.$inferInsert;",null,null,null,null,"import type { D1Database } from '@cloudflare/workers-types'\nimport { systemLogs, logConfig, type NewSystemLog, type LogConfig } from '../db/schema'\nimport { drizzle } from 'drizzle-orm/d1'\nimport { eq, and, gte, lte, desc, asc, count, like, inArray } from 'drizzle-orm'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal'\nexport type LogCategory = 'auth' | 'api' | 'workflow' | 'plugin' | 'media' | 'system' | 'security' | 'error'\n\nexport interface LogEntry {\n level: LogLevel\n category: LogCategory\n message: string\n data?: any\n userId?: string\n sessionId?: string\n requestId?: string\n ipAddress?: string\n userAgent?: string\n method?: string\n url?: string\n statusCode?: number\n duration?: number\n stackTrace?: string\n tags?: string[]\n source?: string\n}\n\nexport interface LogFilter {\n level?: LogLevel[]\n category?: LogCategory[]\n userId?: string\n source?: string\n search?: string\n startDate?: Date\n endDate?: Date\n tags?: string[]\n limit?: number\n offset?: number\n sortBy?: 'created_at' | 'level' | 'category'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport class Logger {\n private db: ReturnType\n private enabled: boolean = true\n private configCache: Map = new Map()\n private lastConfigRefresh: number = 0\n private configRefreshInterval: number = 60000 // 1 minute\n\n constructor(database: D1Database) {\n this.db = drizzle(database)\n }\n\n /**\n * Log a debug message\n */\n async debug(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('debug', category, message, data, context)\n }\n\n /**\n * Log an info message\n */\n async info(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('info', category, message, data, context)\n }\n\n /**\n * Log a warning message\n */\n async warn(category: LogCategory, message: string, data?: any, context?: Partial): Promise {\n return this.log('warn', category, message, data, context)\n }\n\n /**\n * Log an error message\n */\n async error(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('error', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log a fatal message\n */\n async fatal(category: LogCategory, message: string, error?: Error | any, context?: Partial): Promise {\n const errorData = error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack\n } : error\n\n return this.log('fatal', category, message, errorData, {\n ...context,\n stackTrace: error instanceof Error ? error.stack : undefined\n })\n }\n\n /**\n * Log an API request\n */\n async logRequest(\n method: string,\n url: string,\n statusCode: number,\n duration: number,\n context?: Partial\n ): Promise {\n const level: LogLevel = statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info'\n \n return this.log(level, 'api', `${method} ${url} - ${statusCode}`, {\n method,\n url,\n statusCode,\n duration\n }, {\n ...context,\n method,\n url,\n statusCode,\n duration\n })\n }\n\n /**\n * Log an authentication event\n */\n async logAuth(action: string, userId?: string, success: boolean = true, context?: Partial): Promise {\n const level: LogLevel = success ? 'info' : 'warn'\n \n return this.log(level, 'auth', `Authentication ${action}: ${success ? 'success' : 'failed'}`, {\n action,\n success,\n userId\n }, {\n ...context,\n userId,\n tags: ['authentication', action]\n })\n }\n\n /**\n * Log a security event\n */\n async logSecurity(event: string, severity: 'low' | 'medium' | 'high' | 'critical', context?: Partial): Promise {\n const level: LogLevel = severity === 'critical' ? 'fatal' : severity === 'high' ? 'error' : 'warn'\n \n return this.log(level, 'security', `Security event: ${event}`, {\n event,\n severity\n }, {\n ...context,\n tags: ['security', severity]\n })\n }\n\n /**\n * Core logging method\n */\n private async log(\n level: LogLevel,\n category: LogCategory,\n message: string,\n data?: any,\n context?: Partial\n ): Promise {\n if (!this.enabled) return\n\n try {\n // Check if logging is enabled for this category and level\n const config = await this.getConfig(category)\n if (!config || !config.enabled || !this.shouldLog(level, config.level)) {\n return\n }\n\n const logEntry: NewSystemLog = {\n id: crypto.randomUUID(),\n level,\n category,\n message,\n data: data ? JSON.stringify(data) : null,\n userId: context?.userId || null,\n sessionId: context?.sessionId || null,\n requestId: context?.requestId || null,\n ipAddress: context?.ipAddress || null,\n userAgent: context?.userAgent || null,\n method: context?.method || null,\n url: context?.url || null,\n statusCode: context?.statusCode || null,\n duration: context?.duration || null,\n stackTrace: context?.stackTrace || null,\n tags: context?.tags ? JSON.stringify(context.tags) : null,\n source: context?.source || null,\n createdAt: new Date()\n }\n\n await this.db.insert(systemLogs).values(logEntry)\n\n // Check if we need to clean up old logs\n if (config.maxSize) {\n await this.cleanupCategory(category, config.maxSize)\n }\n\n } catch (error) {\n // Don't log errors in the logger to avoid infinite loops\n console.error('Logger error:', error)\n }\n }\n\n /**\n * Get logs with filtering and pagination\n */\n async getLogs(filter: LogFilter = {}): Promise<{ logs: any[], total: number }> {\n try {\n const conditions = []\n \n if (filter.level && filter.level.length > 0) {\n conditions.push(inArray(systemLogs.level, filter.level))\n }\n \n if (filter.category && filter.category.length > 0) {\n conditions.push(inArray(systemLogs.category, filter.category))\n }\n \n if (filter.userId) {\n conditions.push(eq(systemLogs.userId, filter.userId))\n }\n \n if (filter.source) {\n conditions.push(eq(systemLogs.source, filter.source))\n }\n \n if (filter.search) {\n conditions.push(\n like(systemLogs.message, `%${filter.search}%`)\n )\n }\n \n if (filter.startDate) {\n conditions.push(gte(systemLogs.createdAt, filter.startDate))\n }\n \n if (filter.endDate) {\n conditions.push(lte(systemLogs.createdAt, filter.endDate))\n }\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined\n\n // Get total count\n const totalResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(whereClause)\n\n const total = totalResult[0]?.count || 0\n\n // Get logs with pagination and sorting\n const sortColumn = filter.sortBy === 'level' ? systemLogs.level :\n filter.sortBy === 'category' ? systemLogs.category :\n systemLogs.createdAt\n\n const sortFn = filter.sortOrder === 'asc' ? asc : desc\n\n const logs = await this.db\n .select()\n .from(systemLogs)\n .where(whereClause)\n .orderBy(sortFn(sortColumn))\n .limit(filter.limit || 50)\n .offset(filter.offset || 0)\n\n return { logs, total }\n } catch (error) {\n console.error('Error getting logs:', error)\n return { logs: [], total: 0 }\n }\n }\n\n /**\n * Get log configuration for a category\n */\n private async getConfig(category: LogCategory): Promise {\n try {\n // Check cache first\n const now = Date.now()\n if (this.configCache.has(category) && (now - this.lastConfigRefresh) < this.configRefreshInterval) {\n return this.configCache.get(category) || null\n }\n\n // Refresh config from database\n const configs = await this.db\n .select()\n .from(logConfig)\n .where(eq(logConfig.category, category))\n\n const config = configs[0] || null\n \n if (config) {\n this.configCache.set(category, config)\n this.lastConfigRefresh = now\n }\n\n return config\n } catch (error) {\n console.error('Error getting log config:', error)\n return null\n }\n }\n\n /**\n * Update log configuration\n */\n async updateConfig(category: LogCategory, updates: Partial): Promise {\n try {\n await this.db\n .update(logConfig)\n .set({\n ...updates,\n updatedAt: new Date()\n })\n .where(eq(logConfig.category, category))\n\n // Clear cache for this category\n this.configCache.delete(category)\n } catch (error) {\n console.error('Error updating log config:', error)\n }\n }\n\n /**\n * Get all log configurations\n */\n async getAllConfigs(): Promise {\n try {\n return await this.db.select().from(logConfig)\n } catch (error) {\n console.error('Error getting log configs:', error)\n return []\n }\n }\n\n /**\n * Clean up old logs for a category\n */\n private async cleanupCategory(category: LogCategory, maxSize: number): Promise {\n try {\n // Count current logs for this category\n const countResult = await this.db\n .select({ count: count() })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n\n const currentCount = countResult[0]?.count || 0\n\n if (currentCount > maxSize) {\n // Get the cutoff date (keep newest maxSize logs)\n const cutoffLogs = await this.db\n .select({ createdAt: systemLogs.createdAt })\n .from(systemLogs)\n .where(eq(systemLogs.category, category))\n .orderBy(desc(systemLogs.createdAt))\n .limit(1)\n .offset(maxSize - 1)\n\n if (cutoffLogs[0]) {\n // Delete older logs\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, category),\n lte(systemLogs.createdAt, cutoffLogs[0].createdAt)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs:', error)\n }\n }\n\n /**\n * Clean up logs based on retention policy\n */\n async cleanupByRetention(): Promise {\n try {\n const configs = await this.getAllConfigs()\n \n for (const config of configs) {\n if (config.retention > 0) {\n const cutoffDate = new Date()\n cutoffDate.setDate(cutoffDate.getDate() - config.retention)\n\n await this.db\n .delete(systemLogs)\n .where(\n and(\n eq(systemLogs.category, config.category),\n lte(systemLogs.createdAt, cutoffDate)\n )\n )\n }\n }\n } catch (error) {\n console.error('Error cleaning up logs by retention:', error)\n }\n }\n\n /**\n * Check if a log level should be recorded based on configuration\n */\n private shouldLog(level: LogLevel, configLevel: string): boolean {\n const levels = ['debug', 'info', 'warn', 'error', 'fatal']\n const levelIndex = levels.indexOf(level)\n const configLevelIndex = levels.indexOf(configLevel)\n \n return levelIndex >= configLevelIndex\n }\n\n /**\n * Enable or disable logging\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton logger instance\nlet loggerInstance: Logger | null = null\n\n/**\n * Get the logger instance\n */\nexport function getLogger(database?: D1Database): Logger {\n if (!loggerInstance && database) {\n loggerInstance = new Logger(database)\n }\n \n if (!loggerInstance) {\n throw new Error('Logger not initialized. Call getLogger with a database instance first.')\n }\n \n return loggerInstance\n}\n\n/**\n * Initialize the logger with a database\n */\nexport function initLogger(database: D1Database): Logger {\n loggerInstance = new Logger(database)\n return loggerInstance\n}","/**\n * Simple Cache Service\n *\n * Provides basic caching functionality for the core package\n * Can be extended with KV or other storage backends\n */\n\nexport interface CacheConfig {\n ttl: number // Time to live in seconds\n keyPrefix: string\n}\n\nexport class CacheService {\n private config: CacheConfig\n private memoryCache: Map = new Map()\n\n constructor(config: CacheConfig) {\n this.config = config\n }\n\n /**\n * Generate cache key with prefix\n */\n generateKey(type: string, identifier?: string): string {\n const parts = [this.config.keyPrefix, type]\n if (identifier) {\n parts.push(identifier)\n }\n return parts.join(':')\n }\n\n /**\n * Get value from cache\n */\n async get(key: string): Promise {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return null\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return null\n }\n\n return cached.value as T\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise<{\n hit: boolean\n data: T | null\n source: string\n ttl?: number\n }> {\n const cached = this.memoryCache.get(key)\n\n if (!cached) {\n return {\n hit: false,\n data: null,\n source: 'none'\n }\n }\n\n // Check if expired\n if (Date.now() > cached.expires) {\n this.memoryCache.delete(key)\n return {\n hit: false,\n data: null,\n source: 'expired'\n }\n }\n\n return {\n hit: true,\n data: cached.value as T,\n source: 'memory',\n ttl: (cached.expires - Date.now()) / 1000 // TTL in seconds\n }\n }\n\n /**\n * Set value in cache\n */\n async set(key: string, value: any, ttl?: number): Promise {\n const expires = Date.now() + ((ttl || this.config.ttl) * 1000)\n this.memoryCache.set(key, { value, expires })\n }\n\n /**\n * Delete specific key from cache\n */\n async delete(key: string): Promise {\n this.memoryCache.delete(key)\n }\n\n /**\n * Invalidate cache keys matching a pattern\n * For memory cache, we do simple string matching\n */\n async invalidate(pattern: string): Promise {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.')\n const regex = new RegExp(`^${regexPattern}$`)\n\n // Find and delete matching keys\n for (const key of this.memoryCache.keys()) {\n if (regex.test(key)) {\n this.memoryCache.delete(key)\n }\n }\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise {\n this.memoryCache.clear()\n }\n\n /**\n * Get value from cache or set it using a callback\n */\n async getOrSet(key: string, callback: () => Promise, ttl?: number): Promise {\n const cached = await this.get(key)\n\n if (cached !== null) {\n return cached\n }\n\n const value = await callback()\n await this.set(key, value, ttl)\n return value\n }\n}\n\n/**\n * Cache configurations for different data types\n */\nexport const CACHE_CONFIGS = {\n api: {\n ttl: 300, // 5 minutes\n keyPrefix: 'api'\n },\n user: {\n ttl: 600, // 10 minutes\n keyPrefix: 'user'\n },\n content: {\n ttl: 300, // 5 minutes\n keyPrefix: 'content'\n },\n collection: {\n ttl: 600, // 10 minutes\n keyPrefix: 'collection'\n }\n}\n\n/**\n * Get cache service instance for a config\n */\nexport function getCacheService(config: CacheConfig): CacheService {\n return new CacheService(config)\n}\n","export interface Setting {\n id: string\n category: string\n key: string\n value: string // JSON string\n created_at: number\n updated_at: number\n}\n\nexport interface GeneralSettings {\n siteName: string\n siteDescription: string\n adminEmail: string\n timezone: string\n language: string\n maintenanceMode: boolean\n}\n\nexport interface SecuritySettings {\n jwtExpiresIn: string\n jwtRefreshGraceSeconds: number\n}\n\nexport class SettingsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get a setting value by category and key\n */\n async getSetting(category: string, key: string): Promise {\n try {\n const result = await this.db\n .prepare('SELECT value FROM settings WHERE category = ? AND key = ?')\n .bind(category, key)\n .first()\n\n if (!result) {\n return null\n }\n\n return JSON.parse((result as any).value)\n } catch (error) {\n console.error(`Error getting setting ${category}.${key}:`, error)\n return null\n }\n }\n\n /**\n * Get all settings for a category\n */\n async getCategorySettings(category: string): Promise> {\n try {\n const { results } = await this.db\n .prepare('SELECT key, value FROM settings WHERE category = ?')\n .bind(category)\n .all()\n\n const settings: Record = {}\n for (const row of results || []) {\n const r = row as any\n settings[r.key] = JSON.parse(r.value)\n }\n\n return settings\n } catch (error) {\n console.error(`Error getting category settings for ${category}:`, error)\n return {}\n }\n }\n\n /**\n * Set a setting value\n */\n async setSetting(category: string, key: string, value: any): Promise {\n try {\n const now = Date.now()\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n\n return true\n } catch (error) {\n console.error(`Error setting ${category}.${key}:`, error)\n return false\n }\n }\n\n /**\n * Set multiple settings at once\n */\n async setMultipleSettings(category: string, settings: Record): Promise {\n try {\n const now = Date.now()\n\n // Use a transaction-like approach with batch operations\n for (const [key, value] of Object.entries(settings)) {\n const jsonValue = JSON.stringify(value)\n\n await this.db\n .prepare(`\n INSERT INTO settings (id, category, key, value, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(category, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `)\n .bind(crypto.randomUUID(), category, key, jsonValue, now, now)\n .run()\n }\n\n return true\n } catch (error) {\n console.error(`Error setting multiple settings for ${category}:`, error)\n return false\n }\n }\n\n /**\n * Get general settings with defaults\n */\n async getGeneralSettings(userEmail?: string): Promise {\n const settings = await this.getCategorySettings('general')\n\n return {\n siteName: settings.siteName || 'SonicJS AI',\n siteDescription: settings.siteDescription || 'A modern headless CMS powered by AI',\n adminEmail: settings.adminEmail || userEmail || 'admin@example.com',\n timezone: settings.timezone || 'UTC',\n language: settings.language || 'en',\n maintenanceMode: settings.maintenanceMode || false\n }\n }\n\n /**\n * Save general settings\n */\n async saveGeneralSettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.siteName !== undefined) settingsToSave.siteName = settings.siteName\n if (settings.siteDescription !== undefined) settingsToSave.siteDescription = settings.siteDescription\n if (settings.adminEmail !== undefined) settingsToSave.adminEmail = settings.adminEmail\n if (settings.timezone !== undefined) settingsToSave.timezone = settings.timezone\n if (settings.language !== undefined) settingsToSave.language = settings.language\n if (settings.maintenanceMode !== undefined) settingsToSave.maintenanceMode = settings.maintenanceMode\n\n return await this.setMultipleSettings('general', settingsToSave)\n }\n\n /**\n * Get security settings with defaults\n */\n async getSecuritySettings(): Promise {\n const settings = await this.getCategorySettings('security')\n\n return {\n jwtExpiresIn: settings.jwtExpiresIn || '30d',\n jwtRefreshGraceSeconds:\n typeof settings.jwtRefreshGraceSeconds === 'number'\n ? settings.jwtRefreshGraceSeconds\n : 60 * 60 * 24 * 7\n }\n }\n\n /**\n * Save security settings\n */\n async saveSecuritySettings(settings: Partial): Promise {\n const settingsToSave: Record = {}\n\n if (settings.jwtExpiresIn !== undefined) settingsToSave.jwtExpiresIn = settings.jwtExpiresIn\n if (settings.jwtRefreshGraceSeconds !== undefined)\n settingsToSave.jwtRefreshGraceSeconds = settings.jwtRefreshGraceSeconds\n\n return await this.setMultipleSettings('security', settingsToSave)\n }\n}\n","/**\n * Telemetry Service\n *\n * Privacy-first telemetry service using custom SonicJS stats endpoint\n * - No PII collection\n * - Opt-out by default\n * - Silent failures (never blocks app)\n */\n\nimport type { TelemetryEvent, TelemetryProperties, TelemetryConfig, TelemetryIdentity } from '../types/telemetry'\nimport { getTelemetryConfig } from '../utils/telemetry-config'\nimport { generateInstallationId, generateProjectId, sanitizeErrorMessage, sanitizeRoute } from '../utils/telemetry-id'\n\n/**\n * TelemetryService class\n *\n * Handles all telemetry tracking in a privacy-conscious way\n */\nexport class TelemetryService {\n private config: TelemetryConfig\n private identity: TelemetryIdentity | null = null\n private enabled: boolean = true\n private eventQueue: Array<{ event: TelemetryEvent; properties?: TelemetryProperties }> = []\n private isInitialized: boolean = false\n\n constructor(config?: Partial) {\n this.config = {\n ...getTelemetryConfig(),\n ...config\n }\n this.enabled = this.config.enabled\n }\n\n /**\n * Initialize the telemetry service\n */\n async initialize(identity: TelemetryIdentity): Promise {\n if (!this.enabled) {\n if (this.config.debug) {\n console.log('[Telemetry] Disabled via configuration')\n }\n return\n }\n\n try {\n this.identity = identity\n\n if (this.config.debug) {\n console.log('[Telemetry] Initialized with installation ID:', identity.installationId)\n }\n\n this.isInitialized = true\n\n // Flush any queued events\n await this.flushQueue()\n\n } catch (error) {\n // Silent fail - telemetry should never break the app\n if (this.config.debug) {\n console.error('[Telemetry] Initialization failed:', error)\n }\n this.enabled = false\n }\n }\n\n /**\n * Track a telemetry event\n */\n async track(event: TelemetryEvent, properties?: TelemetryProperties): Promise {\n if (!this.enabled) return\n\n try {\n // Sanitize properties\n const sanitizedProps = this.sanitizeProperties(properties)\n\n // Add standard properties\n const enrichedProps = {\n ...sanitizedProps,\n timestamp: new Date().toISOString(),\n version: this.getVersion()\n }\n\n // If not initialized, queue the event\n if (!this.isInitialized) {\n this.eventQueue.push({ event, properties: enrichedProps })\n if (this.config.debug) {\n console.log('[Telemetry] Queued event:', event, enrichedProps)\n }\n return\n }\n\n // Send to custom SonicJS stats endpoint\n if (this.identity && this.config.host) {\n const payload = {\n data: {\n installation_id: this.identity.installationId,\n event_type: event,\n properties: enrichedProps,\n timestamp: enrichedProps.timestamp\n }\n }\n\n // Fire and forget - don't block on response\n fetch(`${this.config.host}/v1/events`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload)\n }).catch(() => {}) // Silent fail\n\n if (this.config.debug) {\n console.log('[Telemetry] Tracked event:', event, enrichedProps)\n }\n } else if (this.config.debug) {\n console.log('[Telemetry] Event (no endpoint):', event, enrichedProps)\n }\n\n } catch (error) {\n // Silent fail\n if (this.config.debug) {\n console.error('[Telemetry] Failed to track event:', error)\n }\n }\n }\n\n /**\n * Track installation started\n */\n async trackInstallationStarted(properties?: TelemetryProperties): Promise {\n await this.track('installation_started', properties)\n }\n\n /**\n * Track installation completed\n */\n async trackInstallationCompleted(properties?: TelemetryProperties): Promise {\n await this.track('installation_completed', properties)\n }\n\n /**\n * Track installation failed\n */\n async trackInstallationFailed(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('installation_failed', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track dev server started\n */\n async trackDevServerStarted(properties?: TelemetryProperties): Promise {\n await this.track('dev_server_started', properties)\n }\n\n /**\n * Track page view in admin UI\n */\n async trackPageView(route: string, properties?: TelemetryProperties): Promise {\n await this.track('page_viewed', {\n ...properties,\n route: sanitizeRoute(route)\n })\n }\n\n /**\n * Track error (sanitized)\n */\n async trackError(error: Error | string, properties?: TelemetryProperties): Promise {\n await this.track('error_occurred', {\n ...properties,\n errorType: sanitizeErrorMessage(error)\n })\n }\n\n /**\n * Track plugin activation\n */\n async trackPluginActivated(properties?: TelemetryProperties): Promise {\n await this.track('plugin_activated', properties)\n }\n\n /**\n * Track migration run\n */\n async trackMigrationRun(properties?: TelemetryProperties): Promise {\n await this.track('migration_run', properties)\n }\n\n /**\n * Flush queued events\n */\n private async flushQueue(): Promise {\n if (this.eventQueue.length === 0) return\n\n const queue = [...this.eventQueue]\n this.eventQueue = []\n\n for (const { event, properties } of queue) {\n await this.track(event, properties)\n }\n }\n\n /**\n * Sanitize properties to ensure no PII\n */\n private sanitizeProperties(properties?: TelemetryProperties): TelemetryProperties {\n if (!properties) return {}\n\n const sanitized: TelemetryProperties = {}\n\n for (const [key, value] of Object.entries(properties)) {\n // Skip undefined values\n if (value === undefined) continue\n\n // Sanitize routes\n if (key === 'route' && typeof value === 'string') {\n sanitized[key] = sanitizeRoute(value)\n continue\n }\n\n // Sanitize error messages\n if (key.toLowerCase().includes('error') && typeof value === 'string') {\n sanitized[key] = sanitizeErrorMessage(value)\n continue\n }\n\n // Only allow specific types\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n sanitized[key] = value\n }\n }\n\n return sanitized\n }\n\n /**\n * Get SonicJS version\n */\n private getVersion(): string {\n try {\n // Safe environment access for Cloudflare Workers compatibility\n if (typeof process !== 'undefined' && process.env) {\n return process.env.SONICJS_VERSION || '2.0.0'\n }\n return '2.0.0'\n } catch {\n return 'unknown'\n }\n }\n\n /**\n * Shutdown the telemetry service (no-op for fetch-based telemetry)\n */\n async shutdown(): Promise {\n // No-op - fetch requests are fire and forget\n }\n\n /**\n * Enable telemetry\n */\n enable(): void {\n this.enabled = true\n }\n\n /**\n * Disable telemetry\n */\n disable(): void {\n this.enabled = false\n }\n\n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n// Singleton instance\nlet telemetryInstance: TelemetryService | null = null\n\n/**\n * Get the telemetry service instance\n */\nexport function getTelemetryService(config?: Partial): TelemetryService {\n if (!telemetryInstance) {\n telemetryInstance = new TelemetryService(config)\n }\n return telemetryInstance\n}\n\n/**\n * Initialize telemetry service\n */\nexport async function initTelemetry(identity: TelemetryIdentity, config?: Partial): Promise {\n const service = getTelemetryService(config)\n await service.initialize(identity)\n return service\n}\n\n/**\n * Create a new installation identity\n */\nexport function createInstallationIdentity(projectName?: string): TelemetryIdentity {\n const installationId = generateInstallationId()\n const identity: TelemetryIdentity = { installationId }\n\n if (projectName) {\n // Generate anonymous project ID\n identity.projectId = generateProjectId(projectName)\n }\n\n return identity\n}\n","/**\n * Route Metadata Service\n *\n * Auto-discovers API routes using Hono's inspectRoutes() and enriches them\n * with metadata from a static registry. Routes without metadata still appear\n * as \"auto-discovered\" — nothing is ever invisible.\n */\n\nimport { inspectRoutes } from 'hono/dev'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RouteMetadata {\n method: string\n path: string\n description: string\n authentication: boolean | 'unknown'\n category: string\n documented: boolean\n}\n\ninterface RouteMeta {\n description: string\n authentication: boolean\n category: string\n}\n\nexport interface CategoryInfo {\n title: string\n description: string\n icon: string\n}\n\n// ============================================================================\n// App Instance Storage\n// ============================================================================\n\nlet appInstance: any = null\n\nexport function setAppInstance(app: any): void {\n appInstance = app\n}\n\nexport function getAppInstance(): any {\n return appInstance\n}\n\n// ============================================================================\n// Category Information\n// ============================================================================\n\nexport const CATEGORY_INFO: Record = {\n 'Auth': {\n title: 'Authentication',\n description: 'User authentication and authorization endpoints',\n icon: '🔐'\n },\n 'Content': {\n title: 'Content Management',\n description: 'Content creation, retrieval, and management',\n icon: '📝'\n },\n 'Media': {\n title: 'Media Management',\n description: 'File upload, storage, and media operations',\n icon: '🖼️'\n },\n 'Admin': {\n title: 'Admin Interface',\n description: 'Administrative panel and management features',\n icon: '⚙️'\n },\n 'System': {\n title: 'System',\n description: 'Health checks and system information',\n icon: '🔧'\n },\n 'Search': {\n title: 'Search',\n description: 'AI-powered search, full-text search, and analytics',\n icon: '🔍'\n },\n 'API Keys': {\n title: 'API Keys',\n description: 'API key management and authentication',\n icon: '🔑'\n },\n 'Workflow': {\n title: 'Workflow',\n description: 'Content workflow and approval processes',\n icon: '🔄'\n },\n 'Cache': {\n title: 'Cache',\n description: 'Cache management and invalidation',\n icon: '⚡'\n },\n 'Forms': {\n title: 'Forms',\n description: 'Form submissions and management',\n icon: '📋'\n },\n 'Files': {\n title: 'Files',\n description: 'File serving from R2 storage',\n icon: '📁'\n }\n}\n\n// ============================================================================\n// Route Metadata Registry\n// ============================================================================\n\nconst ROUTE_METADATA: Record = {\n // Auth endpoints\n 'POST /auth/login': { description: 'Authenticate user with email and password (returns JWT)', category: 'Auth', authentication: false },\n 'POST /auth/login/form': { description: 'Form-based login (sets session cookie)', category: 'Auth', authentication: false },\n 'POST /auth/register': { description: 'Register a new user account', category: 'Auth', authentication: false },\n 'POST /auth/logout': { description: 'Log out the current user and invalidate session', category: 'Auth', authentication: true },\n 'GET /auth/me': { description: 'Get current authenticated user information', category: 'Auth', authentication: true },\n 'POST /auth/refresh': { description: 'Refresh authentication token', category: 'Auth', authentication: true },\n 'POST /auth/seed-admin': { description: 'Create or reset the admin user account', category: 'Auth', authentication: false },\n 'POST /auth/magic-link/request': { description: 'Request a magic link login email', category: 'Auth', authentication: false },\n 'GET /auth/magic-link/verify': { description: 'Verify magic link token and authenticate', category: 'Auth', authentication: false },\n 'POST /auth/otp/request': { description: 'Request a one-time password via email', category: 'Auth', authentication: false },\n 'POST /auth/otp/verify': { description: 'Verify OTP code and authenticate', category: 'Auth', authentication: false },\n\n // Content endpoints\n 'GET /api/collections': { description: 'List all available collections', category: 'Content', authentication: false },\n 'GET /api/collections/:collection/content': { description: 'Get all content items from a specific collection', category: 'Content', authentication: false },\n 'GET /api/content/:id': { description: 'Get a specific content item by ID', category: 'Content', authentication: false },\n 'POST /api/content': { description: 'Create a new content item', category: 'Content', authentication: true },\n 'PUT /api/content/:id': { description: 'Update an existing content item', category: 'Content', authentication: true },\n 'DELETE /api/content/:id': { description: 'Delete a content item', category: 'Content', authentication: true },\n 'GET /api/content/:id/versions': { description: 'Get version history for a content item', category: 'Content', authentication: true },\n 'POST /api/content/:id/restore/:versionId': { description: 'Restore a content item to a previous version', category: 'Content', authentication: true },\n\n // Media endpoints\n 'GET /api/media': { description: 'List all media files with pagination', category: 'Media', authentication: false },\n 'GET /api/media/:id': { description: 'Get a specific media file by ID', category: 'Media', authentication: false },\n 'POST /api/media/upload': { description: 'Upload a new media file to R2 storage', category: 'Media', authentication: true },\n 'DELETE /api/media/:id': { description: 'Delete a media file from storage', category: 'Media', authentication: true },\n\n // Admin API endpoints\n 'GET /admin/api/stats': { description: 'Get dashboard statistics (collections, content, media, users)', category: 'Admin', authentication: true },\n 'GET /admin/api/storage': { description: 'Get storage usage information', category: 'Admin', authentication: true },\n 'GET /admin/api/activity': { description: 'Get recent activity logs', category: 'Admin', authentication: true },\n 'GET /admin/api/collections': { description: 'List all collections with field counts', category: 'Admin', authentication: true },\n 'POST /admin/api/collections': { description: 'Create a new collection', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id': { description: 'Get a specific collection with its fields', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id': { description: 'Update an existing collection', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id': { description: 'Delete a collection (must be empty)', category: 'Admin', authentication: true },\n 'GET /admin/api/collections/:id/fields': { description: 'Get fields for a specific collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields': { description: 'Add a field to a collection', category: 'Admin', authentication: true },\n 'PATCH /admin/api/collections/:id/fields/:fieldId': { description: 'Update a collection field', category: 'Admin', authentication: true },\n 'DELETE /admin/api/collections/:id/fields/:fieldId': { description: 'Remove a field from a collection', category: 'Admin', authentication: true },\n 'POST /admin/api/collections/:id/fields/reorder': { description: 'Reorder fields in a collection', category: 'Admin', authentication: true },\n 'GET /admin/api/migrations/status': { description: 'Get database migration status', category: 'Admin', authentication: true },\n 'POST /admin/api/migrations/run': { description: 'Run pending database migrations', category: 'Admin', authentication: true },\n 'GET /admin/api/content': { description: 'List content items with filtering and pagination', category: 'Admin', authentication: true },\n 'GET /admin/api/content/:id': { description: 'Get a content item for admin editing', category: 'Admin', authentication: true },\n 'POST /admin/api/content': { description: 'Create content via admin API', category: 'Admin', authentication: true },\n 'PUT /admin/api/content/:id': { description: 'Update content via admin API', category: 'Admin', authentication: true },\n 'DELETE /admin/api/content/:id': { description: 'Delete content via admin API', category: 'Admin', authentication: true },\n 'GET /admin/api/media': { description: 'List media files for admin management', category: 'Admin', authentication: true },\n 'POST /admin/api/media/upload': { description: 'Upload media via admin interface', category: 'Admin', authentication: true },\n 'DELETE /admin/api/media/:id': { description: 'Delete media via admin interface', category: 'Admin', authentication: true },\n 'GET /admin/api/users': { description: 'List all users', category: 'Admin', authentication: true },\n 'POST /admin/api/users': { description: 'Create a new user', category: 'Admin', authentication: true },\n 'PUT /admin/api/users/:id': { description: 'Update a user', category: 'Admin', authentication: true },\n 'DELETE /admin/api/users/:id': { description: 'Delete a user', category: 'Admin', authentication: true },\n 'GET /admin/api/logs': { description: 'Get application logs with filtering', category: 'Admin', authentication: true },\n 'GET /admin/api/plugins': { description: 'List all registered plugins', category: 'Admin', authentication: true },\n 'POST /admin/api/plugins/:id/toggle': { description: 'Enable or disable a plugin', category: 'Admin', authentication: true },\n 'GET /admin/api/settings': { description: 'Get application settings', category: 'Admin', authentication: true },\n 'PUT /admin/api/settings': { description: 'Update application settings', category: 'Admin', authentication: true },\n 'GET /admin/api/forms': { description: 'List all forms', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id': { description: 'Get form details and submissions', category: 'Admin', authentication: true },\n 'POST /admin/api/forms': { description: 'Create a new form', category: 'Admin', authentication: true },\n 'PUT /admin/api/forms/:id': { description: 'Update a form', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id': { description: 'Delete a form', category: 'Admin', authentication: true },\n 'GET /admin/api/forms/:id/submissions': { description: 'Get form submissions', category: 'Admin', authentication: true },\n 'DELETE /admin/api/forms/:id/submissions/:submissionId': { description: 'Delete a form submission', category: 'Admin', authentication: true },\n\n // Search endpoints\n 'GET /api/search': { description: 'Search content using AI, FTS5, keyword, or hybrid mode', category: 'Search', authentication: false },\n 'POST /api/search/click': { description: 'Track a search result click for analytics', category: 'Search', authentication: false },\n 'GET /admin/plugins/ai-search/api/status': { description: 'Get search plugin status and configuration', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index': { description: 'Trigger content indexing for search', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/index/reset': { description: 'Reset the search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics': { description: 'Get search analytics and metrics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/queries': { description: 'Get top search queries', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/analytics/clicks': { description: 'Get click-through analytics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/fts5/status': { description: 'Get FTS5 full-text search status', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/fts5/rebuild': { description: 'Rebuild the FTS5 search index', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/facets': { description: 'Get available search facets', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments': { description: 'List search A/B test experiments', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments': { description: 'Create a search A/B test experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id': { description: 'Get experiment details', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/experiments/:id': { description: 'Update an experiment', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/experiments/:id': { description: 'Delete an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/start': { description: 'Start an experiment', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/experiments/:id/stop': { description: 'Stop a running experiment', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/experiments/:id/results': { description: 'Get experiment results and statistics', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality': { description: 'Get search quality agent analysis', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/run': { description: 'Run search quality analysis', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/quality/recommendations': { description: 'Get quality improvement recommendations', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/apply': { description: 'Apply a quality recommendation', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/quality/recommendations/:id/dismiss': { description: 'Dismiss a quality recommendation', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/synonyms': { description: 'List search synonyms', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/synonyms': { description: 'Add a search synonym', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/synonyms/:id': { description: 'Delete a search synonym', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/query-rules': { description: 'List search query rules', category: 'Search', authentication: true },\n 'POST /admin/plugins/ai-search/api/query-rules': { description: 'Create a query rule', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/query-rules/:id': { description: 'Update a query rule', category: 'Search', authentication: true },\n 'DELETE /admin/plugins/ai-search/api/query-rules/:id': { description: 'Delete a query rule', category: 'Search', authentication: true },\n 'GET /admin/plugins/ai-search/api/settings': { description: 'Get search plugin settings', category: 'Search', authentication: true },\n 'PUT /admin/plugins/ai-search/api/settings': { description: 'Update search plugin settings', category: 'Search', authentication: true },\n\n // API Key endpoints\n 'GET /admin/api-keys/api/keys': { description: 'List all API keys', category: 'API Keys', authentication: true },\n 'POST /admin/api-keys/api/keys': { description: 'Create a new API key', category: 'API Keys', authentication: true },\n 'DELETE /admin/api-keys/api/keys/:id': { description: 'Revoke an API key', category: 'API Keys', authentication: true },\n 'PUT /admin/api-keys/api/keys/:id': { description: 'Update an API key', category: 'API Keys', authentication: true },\n\n // Cache endpoints\n 'GET /admin/cache/api/stats': { description: 'Get cache statistics', category: 'Cache', authentication: true },\n 'POST /admin/cache/api/purge': { description: 'Purge cache entries', category: 'Cache', authentication: true },\n 'GET /admin/cache/api/entries': { description: 'List cache entries', category: 'Cache', authentication: true },\n 'DELETE /admin/cache/api/entries/:key': { description: 'Delete a specific cache entry', category: 'Cache', authentication: true },\n\n // Workflow endpoints\n 'GET /workflow/status/:id': { description: 'Get workflow status for a content item', category: 'Workflow', authentication: true },\n 'POST /workflow/submit/:id': { description: 'Submit content for review', category: 'Workflow', authentication: true },\n 'POST /workflow/approve/:id': { description: 'Approve content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/reject/:id': { description: 'Reject content in review', category: 'Workflow', authentication: true },\n 'POST /workflow/publish/:id': { description: 'Publish approved content', category: 'Workflow', authentication: true },\n 'POST /workflow/unpublish/:id': { description: 'Unpublish content', category: 'Workflow', authentication: true },\n 'GET /workflow/history/:id': { description: 'Get workflow history for a content item', category: 'Workflow', authentication: true },\n\n // Form endpoints (public)\n 'POST /forms/:formId/submit': { description: 'Submit a form (public endpoint)', category: 'Forms', authentication: false },\n 'GET /forms/:formId': { description: 'Get form definition for rendering', category: 'Forms', authentication: false },\n 'POST /api/forms/:formId/submit': { description: 'Submit a form via API', category: 'Forms', authentication: false },\n 'GET /api/forms/:formId': { description: 'Get form definition via API', category: 'Forms', authentication: false },\n\n // System endpoints\n 'GET /health': { description: 'Health check endpoint for monitoring', category: 'System', authentication: false },\n 'GET /api/health': { description: 'API health check with schema information', category: 'System', authentication: false },\n 'GET /api': { description: 'API root - returns API information and available endpoints', category: 'System', authentication: false },\n 'GET /api/system/info': { description: 'Get system information and version', category: 'System', authentication: false },\n 'GET /api/system/schema': { description: 'Get database schema information', category: 'System', authentication: false },\n\n // File serving\n 'GET /files/*': { description: 'Serve files from R2 storage (public access)', category: 'Files', authentication: false },\n\n // Database tools\n 'POST /admin/database-tools/api/query': { description: 'Execute a database query', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables': { description: 'List database tables', category: 'Admin', authentication: true },\n 'GET /admin/database-tools/api/tables/:name': { description: 'Get table schema and sample data', category: 'Admin', authentication: true },\n\n // Seed data\n 'POST /admin/seed-data/api/generate': { description: 'Generate seed data for development', category: 'Admin', authentication: true },\n 'GET /admin/seed-data/api/status': { description: 'Get seed data generation status', category: 'Admin', authentication: true },\n\n // Email plugin\n 'POST /admin/plugins/email/api/send': { description: 'Send an email', category: 'Admin', authentication: true },\n 'GET /admin/plugins/email/api/templates': { description: 'List email templates', category: 'Admin', authentication: true },\n 'POST /admin/plugins/email/api/test': { description: 'Send a test email', category: 'Admin', authentication: true },\n}\n\n// ============================================================================\n// Whitelist Patterns for API routes\n// ============================================================================\n\nconst INCLUDED_ROUTE_PATTERNS: RegExp[] = [\n /^\\/api\\//, // All /api/* routes\n /^\\/api$/, // API root\n /^\\/auth\\/(?!login$|register$)/, // Auth routes except GET login/register HTML pages\n /^\\/auth\\/login$/, // POST /auth/login (method filtered later)\n /^\\/auth\\/register$/, // POST /auth/register (method filtered later)\n /^\\/admin\\/api\\//, // Admin API endpoints\n /^\\/admin\\/api-keys\\/api\\//, // API key management\n /^\\/admin\\/cache\\/api\\//, // Cache management API\n /^\\/admin\\/plugins\\/.*\\/api\\//, // Plugin API endpoints\n /^\\/admin\\/database-tools\\/api\\//, // Database tools API\n /^\\/admin\\/seed-data\\/api\\//, // Seed data API\n /^\\/workflow\\//, // Workflow endpoints\n /^\\/health$/, // Health check\n /^\\/files\\//, // File serving\n /^\\/forms\\//, // Public form endpoints\n]\n\n// Routes to always exclude (even if they match an include pattern)\nconst EXCLUDED_ROUTES = new Set([\n 'GET /auth/login',\n 'GET /auth/register',\n 'GET /auth/login/form',\n])\n\n// ============================================================================\n// Route Discovery\n// ============================================================================\n\nlet cachedRouteList: RouteMetadata[] | null = null\n\nfunction isIncludedRoute(method: string, path: string): boolean {\n // Check exclusions first\n const key = `${method} ${path}`\n if (EXCLUDED_ROUTES.has(key)) {\n return false\n }\n\n // Check if the path matches any include pattern\n return INCLUDED_ROUTE_PATTERNS.some(pattern => pattern.test(path))\n}\n\nfunction inferCategory(path: string): string {\n if (path.startsWith('/auth/')) return 'Auth'\n if (path.startsWith('/api/search')) return 'Search'\n if (path.startsWith('/api/media')) return 'Media'\n if (path.startsWith('/api/system')) return 'System'\n if (path.startsWith('/api/content') || path.startsWith('/api/collections')) return 'Content'\n if (path.startsWith('/api/forms')) return 'Forms'\n if (path.startsWith('/admin/api-keys')) return 'API Keys'\n if (path.startsWith('/admin/cache')) return 'Cache'\n if (path.startsWith('/admin/plugins/ai-search')) return 'Search'\n if (path.startsWith('/admin/api')) return 'Admin'\n if (path.startsWith('/admin/database-tools')) return 'Admin'\n if (path.startsWith('/admin/seed-data')) return 'Admin'\n if (path.startsWith('/admin/plugins/email')) return 'Admin'\n if (path.startsWith('/workflow/')) return 'Workflow'\n if (path.startsWith('/forms/')) return 'Forms'\n if (path.startsWith('/files/')) return 'Files'\n if (path === '/health' || path.startsWith('/api')) return 'System'\n return 'Other'\n}\n\nfunction inferAuth(path: string): boolean | 'unknown' {\n // Known public routes\n if (path === '/health' || path === '/api' || path === '/api/health') return false\n if (path === '/api/system/info' || path === '/api/system/schema') return false\n if (path.startsWith('/files/')) return false\n if (path.startsWith('/forms/') || path.startsWith('/api/forms/')) return false\n\n // Admin routes require auth\n if (path.startsWith('/admin/')) return true\n if (path.startsWith('/workflow/')) return true\n\n return 'unknown'\n}\n\nexport function buildRouteList(app: any): RouteMetadata[] {\n if (cachedRouteList) return cachedRouteList\n\n if (!app) return []\n\n try {\n const routes = inspectRoutes(app as any)\n\n // Deduplicate and filter\n const seen = new Set()\n const result: RouteMetadata[] = []\n\n for (const route of routes) {\n // Skip middleware entries\n if (route.isMiddleware) continue\n // Skip ALL method (middleware-like catch-all)\n if (route.method === 'ALL') continue\n\n const key = `${route.method} ${route.path}`\n\n // Skip duplicates\n if (seen.has(key)) continue\n seen.add(key)\n\n // Apply whitelist filter\n if (!isIncludedRoute(route.method, route.path)) continue\n\n // Look up metadata\n const meta = ROUTE_METADATA[key]\n\n if (meta) {\n result.push({\n method: route.method,\n path: route.path,\n description: meta.description,\n authentication: meta.authentication,\n category: meta.category,\n documented: true\n })\n } else {\n // Auto-discovered: infer category and auth\n result.push({\n method: route.method,\n path: route.path,\n description: '',\n authentication: inferAuth(route.path),\n category: inferCategory(route.path),\n documented: false\n })\n }\n }\n\n // Sort: by category, then method order, then path\n const methodOrder: Record = { GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4 }\n result.sort((a, b) => {\n const catCmp = a.category.localeCompare(b.category)\n if (catCmp !== 0) return catCmp\n const methCmp = (methodOrder[a.method] ?? 5) - (methodOrder[b.method] ?? 5)\n if (methCmp !== 0) return methCmp\n return a.path.localeCompare(b.path)\n })\n\n cachedRouteList = result\n return result\n } catch (error) {\n console.error('Failed to inspect routes:', error)\n return []\n }\n}\n"]} \ No newline at end of file diff --git a/packages/core/dist/chunk-ABB34XUS.cjs b/packages/core/dist/chunk-ZUXOAZWZ.cjs similarity index 94% rename from packages/core/dist/chunk-ABB34XUS.cjs rename to packages/core/dist/chunk-ZUXOAZWZ.cjs index 939f77c32..3ce2b4b06 100644 --- a/packages/core/dist/chunk-ABB34XUS.cjs +++ b/packages/core/dist/chunk-ZUXOAZWZ.cjs @@ -6,9 +6,9 @@ var chunkIGJUBJBW_cjs = require('./chunk-IGJUBJBW.cjs'); var zod = require('zod'); var hono = require('hono'); -// ../../node_modules/semver/internal/constants.js +// ../../../../node_modules/semver/internal/constants.js var require_constants = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/internal/constants.js"(exports$1, module) { + "../../../../node_modules/semver/internal/constants.js"(exports$1, module) { var SEMVER_SPEC_VERSION = "2.0.0"; var MAX_LENGTH = 256; var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */ @@ -37,18 +37,18 @@ var require_constants = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/internal/debug.js +// ../../../../node_modules/semver/internal/debug.js var require_debug = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/internal/debug.js"(exports$1, module) { + "../../../../node_modules/semver/internal/debug.js"(exports$1, module) { var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => { }; module.exports = debug; } }); -// ../../node_modules/semver/internal/re.js +// ../../../../node_modules/semver/internal/re.js var require_re = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/internal/re.js"(exports$1, module) { + "../../../../node_modules/semver/internal/re.js"(exports$1, module) { var { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, @@ -133,9 +133,9 @@ var require_re = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/internal/parse-options.js +// ../../../../node_modules/semver/internal/parse-options.js var require_parse_options = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/internal/parse-options.js"(exports$1, module) { + "../../../../node_modules/semver/internal/parse-options.js"(exports$1, module) { var looseOption = Object.freeze({ loose: true }); var emptyOpts = Object.freeze({}); var parseOptions = (options) => { @@ -151,9 +151,9 @@ var require_parse_options = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/internal/identifiers.js +// ../../../../node_modules/semver/internal/identifiers.js var require_identifiers = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/internal/identifiers.js"(exports$1, module) { + "../../../../node_modules/semver/internal/identifiers.js"(exports$1, module) { var numeric = /^[0-9]+$/; var compareIdentifiers = (a, b) => { if (typeof a === "number" && typeof b === "number") { @@ -175,9 +175,9 @@ var require_identifiers = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/classes/semver.js +// ../../../../node_modules/semver/classes/semver.js var require_semver = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/classes/semver.js"(exports$1, module) { + "../../../../node_modules/semver/classes/semver.js"(exports$1, module) { var debug = require_debug(); var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants(); var { safeRe: re, t } = require_re(); @@ -453,9 +453,9 @@ var require_semver = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/functions/parse.js +// ../../../../node_modules/semver/functions/parse.js var require_parse = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/parse.js"(exports$1, module) { + "../../../../node_modules/semver/functions/parse.js"(exports$1, module) { var SemVer = require_semver(); var parse = (version, options, throwErrors = false) => { if (version instanceof SemVer) { @@ -474,9 +474,9 @@ var require_parse = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/functions/valid.js +// ../../../../node_modules/semver/functions/valid.js var require_valid = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/valid.js"(exports$1, module) { + "../../../../node_modules/semver/functions/valid.js"(exports$1, module) { var parse = require_parse(); var valid = (version, options) => { const v = parse(version, options); @@ -486,9 +486,9 @@ var require_valid = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/functions/clean.js +// ../../../../node_modules/semver/functions/clean.js var require_clean = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/clean.js"(exports$1, module) { + "../../../../node_modules/semver/functions/clean.js"(exports$1, module) { var parse = require_parse(); var clean = (version, options) => { const s = parse(version.trim().replace(/^[=v]+/, ""), options); @@ -498,9 +498,9 @@ var require_clean = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/functions/inc.js +// ../../../../node_modules/semver/functions/inc.js var require_inc = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/inc.js"(exports$1, module) { + "../../../../node_modules/semver/functions/inc.js"(exports$1, module) { var SemVer = require_semver(); var inc = (version, release, options, identifier, identifierBase) => { if (typeof options === "string") { @@ -521,9 +521,9 @@ var require_inc = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/functions/diff.js +// ../../../../node_modules/semver/functions/diff.js var require_diff = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/diff.js"(exports$1, module) { + "../../../../node_modules/semver/functions/diff.js"(exports$1, module) { var parse = require_parse(); var diff = (version1, version2) => { const v1 = parse(version1, null, true); @@ -564,36 +564,36 @@ var require_diff = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/functions/major.js +// ../../../../node_modules/semver/functions/major.js var require_major = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/major.js"(exports$1, module) { + "../../../../node_modules/semver/functions/major.js"(exports$1, module) { var SemVer = require_semver(); var major = (a, loose) => new SemVer(a, loose).major; module.exports = major; } }); -// ../../node_modules/semver/functions/minor.js +// ../../../../node_modules/semver/functions/minor.js var require_minor = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/minor.js"(exports$1, module) { + "../../../../node_modules/semver/functions/minor.js"(exports$1, module) { var SemVer = require_semver(); var minor = (a, loose) => new SemVer(a, loose).minor; module.exports = minor; } }); -// ../../node_modules/semver/functions/patch.js +// ../../../../node_modules/semver/functions/patch.js var require_patch = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/patch.js"(exports$1, module) { + "../../../../node_modules/semver/functions/patch.js"(exports$1, module) { var SemVer = require_semver(); var patch = (a, loose) => new SemVer(a, loose).patch; module.exports = patch; } }); -// ../../node_modules/semver/functions/prerelease.js +// ../../../../node_modules/semver/functions/prerelease.js var require_prerelease = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/prerelease.js"(exports$1, module) { + "../../../../node_modules/semver/functions/prerelease.js"(exports$1, module) { var parse = require_parse(); var prerelease = (version, options) => { const parsed = parse(version, options); @@ -603,36 +603,36 @@ var require_prerelease = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/functions/compare.js +// ../../../../node_modules/semver/functions/compare.js var require_compare = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/compare.js"(exports$1, module) { + "../../../../node_modules/semver/functions/compare.js"(exports$1, module) { var SemVer = require_semver(); var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose)); module.exports = compare; } }); -// ../../node_modules/semver/functions/rcompare.js +// ../../../../node_modules/semver/functions/rcompare.js var require_rcompare = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/rcompare.js"(exports$1, module) { + "../../../../node_modules/semver/functions/rcompare.js"(exports$1, module) { var compare = require_compare(); var rcompare = (a, b, loose) => compare(b, a, loose); module.exports = rcompare; } }); -// ../../node_modules/semver/functions/compare-loose.js +// ../../../../node_modules/semver/functions/compare-loose.js var require_compare_loose = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/compare-loose.js"(exports$1, module) { + "../../../../node_modules/semver/functions/compare-loose.js"(exports$1, module) { var compare = require_compare(); var compareLoose = (a, b) => compare(a, b, true); module.exports = compareLoose; } }); -// ../../node_modules/semver/functions/compare-build.js +// ../../../../node_modules/semver/functions/compare-build.js var require_compare_build = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/compare-build.js"(exports$1, module) { + "../../../../node_modules/semver/functions/compare-build.js"(exports$1, module) { var SemVer = require_semver(); var compareBuild = (a, b, loose) => { const versionA = new SemVer(a, loose); @@ -643,81 +643,81 @@ var require_compare_build = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/functions/sort.js +// ../../../../node_modules/semver/functions/sort.js var require_sort = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/sort.js"(exports$1, module) { + "../../../../node_modules/semver/functions/sort.js"(exports$1, module) { var compareBuild = require_compare_build(); var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)); module.exports = sort; } }); -// ../../node_modules/semver/functions/rsort.js +// ../../../../node_modules/semver/functions/rsort.js var require_rsort = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/rsort.js"(exports$1, module) { + "../../../../node_modules/semver/functions/rsort.js"(exports$1, module) { var compareBuild = require_compare_build(); var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)); module.exports = rsort; } }); -// ../../node_modules/semver/functions/gt.js +// ../../../../node_modules/semver/functions/gt.js var require_gt = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/gt.js"(exports$1, module) { + "../../../../node_modules/semver/functions/gt.js"(exports$1, module) { var compare = require_compare(); var gt = (a, b, loose) => compare(a, b, loose) > 0; module.exports = gt; } }); -// ../../node_modules/semver/functions/lt.js +// ../../../../node_modules/semver/functions/lt.js var require_lt = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/lt.js"(exports$1, module) { + "../../../../node_modules/semver/functions/lt.js"(exports$1, module) { var compare = require_compare(); var lt = (a, b, loose) => compare(a, b, loose) < 0; module.exports = lt; } }); -// ../../node_modules/semver/functions/eq.js +// ../../../../node_modules/semver/functions/eq.js var require_eq = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/eq.js"(exports$1, module) { + "../../../../node_modules/semver/functions/eq.js"(exports$1, module) { var compare = require_compare(); var eq = (a, b, loose) => compare(a, b, loose) === 0; module.exports = eq; } }); -// ../../node_modules/semver/functions/neq.js +// ../../../../node_modules/semver/functions/neq.js var require_neq = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/neq.js"(exports$1, module) { + "../../../../node_modules/semver/functions/neq.js"(exports$1, module) { var compare = require_compare(); var neq = (a, b, loose) => compare(a, b, loose) !== 0; module.exports = neq; } }); -// ../../node_modules/semver/functions/gte.js +// ../../../../node_modules/semver/functions/gte.js var require_gte = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/gte.js"(exports$1, module) { + "../../../../node_modules/semver/functions/gte.js"(exports$1, module) { var compare = require_compare(); var gte = (a, b, loose) => compare(a, b, loose) >= 0; module.exports = gte; } }); -// ../../node_modules/semver/functions/lte.js +// ../../../../node_modules/semver/functions/lte.js var require_lte = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/lte.js"(exports$1, module) { + "../../../../node_modules/semver/functions/lte.js"(exports$1, module) { var compare = require_compare(); var lte = (a, b, loose) => compare(a, b, loose) <= 0; module.exports = lte; } }); -// ../../node_modules/semver/functions/cmp.js +// ../../../../node_modules/semver/functions/cmp.js var require_cmp = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/cmp.js"(exports$1, module) { + "../../../../node_modules/semver/functions/cmp.js"(exports$1, module) { var eq = require_eq(); var neq = require_neq(); var gt = require_gt(); @@ -764,9 +764,9 @@ var require_cmp = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/functions/coerce.js +// ../../../../node_modules/semver/functions/coerce.js var require_coerce = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/coerce.js"(exports$1, module) { + "../../../../node_modules/semver/functions/coerce.js"(exports$1, module) { var SemVer = require_semver(); var parse = require_parse(); var { safeRe: re, t } = require_re(); @@ -809,9 +809,9 @@ var require_coerce = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/internal/lrucache.js +// ../../../../node_modules/semver/internal/lrucache.js var require_lrucache = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/internal/lrucache.js"(exports$1, module) { + "../../../../node_modules/semver/internal/lrucache.js"(exports$1, module) { var LRUCache = class { constructor() { this.max = 1e3; @@ -846,9 +846,9 @@ var require_lrucache = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/classes/range.js +// ../../../../node_modules/semver/classes/range.js var require_range = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/classes/range.js"(exports$1, module) { + "../../../../node_modules/semver/classes/range.js"(exports$1, module) { var SPACE_CHARACTERS = /\s+/g; var Range = class _Range { constructor(range, options) { @@ -1222,9 +1222,9 @@ var require_range = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/classes/comparator.js +// ../../../../node_modules/semver/classes/comparator.js var require_comparator = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/classes/comparator.js"(exports$1, module) { + "../../../../node_modules/semver/classes/comparator.js"(exports$1, module) { var ANY = Symbol("SemVer ANY"); var Comparator = class _Comparator { static get ANY() { @@ -1334,9 +1334,9 @@ var require_comparator = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/functions/satisfies.js +// ../../../../node_modules/semver/functions/satisfies.js var require_satisfies = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/functions/satisfies.js"(exports$1, module) { + "../../../../node_modules/semver/functions/satisfies.js"(exports$1, module) { var Range = require_range(); var satisfies = (version, range, options) => { try { @@ -1350,18 +1350,18 @@ var require_satisfies = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/ranges/to-comparators.js +// ../../../../node_modules/semver/ranges/to-comparators.js var require_to_comparators = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/ranges/to-comparators.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/to-comparators.js"(exports$1, module) { var Range = require_range(); var toComparators = (range, options) => new Range(range, options).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" ")); module.exports = toComparators; } }); -// ../../node_modules/semver/ranges/max-satisfying.js +// ../../../../node_modules/semver/ranges/max-satisfying.js var require_max_satisfying = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/ranges/max-satisfying.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/max-satisfying.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var maxSatisfying = (versions, range, options) => { @@ -1387,9 +1387,9 @@ var require_max_satisfying = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/ranges/min-satisfying.js +// ../../../../node_modules/semver/ranges/min-satisfying.js var require_min_satisfying = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/ranges/min-satisfying.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/min-satisfying.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var minSatisfying = (versions, range, options) => { @@ -1415,9 +1415,9 @@ var require_min_satisfying = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/ranges/min-version.js +// ../../../../node_modules/semver/ranges/min-version.js var require_min_version = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/ranges/min-version.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/min-version.js"(exports$1, module) { var SemVer = require_semver(); var Range = require_range(); var gt = require_gt(); @@ -1473,9 +1473,9 @@ var require_min_version = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/ranges/valid.js +// ../../../../node_modules/semver/ranges/valid.js var require_valid2 = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/ranges/valid.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/valid.js"(exports$1, module) { var Range = require_range(); var validRange = (range, options) => { try { @@ -1488,9 +1488,9 @@ var require_valid2 = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/ranges/outside.js +// ../../../../node_modules/semver/ranges/outside.js var require_outside = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/ranges/outside.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/outside.js"(exports$1, module) { var SemVer = require_semver(); var Comparator = require_comparator(); var { ANY } = Comparator; @@ -1556,27 +1556,27 @@ var require_outside = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/ranges/gtr.js +// ../../../../node_modules/semver/ranges/gtr.js var require_gtr = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/ranges/gtr.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/gtr.js"(exports$1, module) { var outside = require_outside(); var gtr = (version, range, options) => outside(version, range, ">", options); module.exports = gtr; } }); -// ../../node_modules/semver/ranges/ltr.js +// ../../../../node_modules/semver/ranges/ltr.js var require_ltr = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/ranges/ltr.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/ltr.js"(exports$1, module) { var outside = require_outside(); var ltr = (version, range, options) => outside(version, range, "<", options); module.exports = ltr; } }); -// ../../node_modules/semver/ranges/intersects.js +// ../../../../node_modules/semver/ranges/intersects.js var require_intersects = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/ranges/intersects.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/intersects.js"(exports$1, module) { var Range = require_range(); var intersects = (r1, r2, options) => { r1 = new Range(r1, options); @@ -1587,9 +1587,9 @@ var require_intersects = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/ranges/simplify.js +// ../../../../node_modules/semver/ranges/simplify.js var require_simplify = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/ranges/simplify.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/simplify.js"(exports$1, module) { var satisfies = require_satisfies(); var compare = require_compare(); module.exports = (versions, range, options) => { @@ -1636,9 +1636,9 @@ var require_simplify = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/ranges/subset.js +// ../../../../node_modules/semver/ranges/subset.js var require_subset = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/ranges/subset.js"(exports$1, module) { + "../../../../node_modules/semver/ranges/subset.js"(exports$1, module) { var Range = require_range(); var Comparator = require_comparator(); var { ANY } = Comparator; @@ -1797,9 +1797,9 @@ var require_subset = chunkIGJUBJBW_cjs.__commonJS({ } }); -// ../../node_modules/semver/index.js +// ../../../../node_modules/semver/index.js var require_semver2 = chunkIGJUBJBW_cjs.__commonJS({ - "../../node_modules/semver/index.js"(exports$1, module) { + "../../../../node_modules/semver/index.js"(exports$1, module) { var internalRe = require_re(); var constants = require_constants(); var SemVer = require_semver(); @@ -3180,5 +3180,5 @@ exports.PluginValidator = PluginValidator; exports.ScopedHookSystem = ScopedHookSystem; exports.createTurnstileMiddleware = createTurnstileMiddleware; exports.verifyTurnstile = verifyTurnstile; -//# sourceMappingURL=chunk-ABB34XUS.cjs.map -//# sourceMappingURL=chunk-ABB34XUS.cjs.map \ No newline at end of file +//# sourceMappingURL=chunk-ZUXOAZWZ.cjs.map +//# sourceMappingURL=chunk-ZUXOAZWZ.cjs.map \ No newline at end of file diff --git a/packages/core/dist/chunk-ZUXOAZWZ.cjs.map b/packages/core/dist/chunk-ZUXOAZWZ.cjs.map new file mode 100644 index 000000000..7864e3b34 --- /dev/null +++ b/packages/core/dist/chunk-ZUXOAZWZ.cjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../../../node_modules/semver/internal/constants.js","../../../../../node_modules/semver/internal/debug.js","../../../../../node_modules/semver/internal/re.js","../../../../../node_modules/semver/internal/parse-options.js","../../../../../node_modules/semver/internal/identifiers.js","../../../../../node_modules/semver/classes/semver.js","../../../../../node_modules/semver/functions/parse.js","../../../../../node_modules/semver/functions/valid.js","../../../../../node_modules/semver/functions/clean.js","../../../../../node_modules/semver/functions/inc.js","../../../../../node_modules/semver/functions/diff.js","../../../../../node_modules/semver/functions/major.js","../../../../../node_modules/semver/functions/minor.js","../../../../../node_modules/semver/functions/patch.js","../../../../../node_modules/semver/functions/prerelease.js","../../../../../node_modules/semver/functions/compare.js","../../../../../node_modules/semver/functions/rcompare.js","../../../../../node_modules/semver/functions/compare-loose.js","../../../../../node_modules/semver/functions/compare-build.js","../../../../../node_modules/semver/functions/sort.js","../../../../../node_modules/semver/functions/rsort.js","../../../../../node_modules/semver/functions/gt.js","../../../../../node_modules/semver/functions/lt.js","../../../../../node_modules/semver/functions/eq.js","../../../../../node_modules/semver/functions/neq.js","../../../../../node_modules/semver/functions/gte.js","../../../../../node_modules/semver/functions/lte.js","../../../../../node_modules/semver/functions/cmp.js","../../../../../node_modules/semver/functions/coerce.js","../../../../../node_modules/semver/internal/lrucache.js","../../../../../node_modules/semver/classes/range.js","../../../../../node_modules/semver/classes/comparator.js","../../../../../node_modules/semver/functions/satisfies.js","../../../../../node_modules/semver/ranges/to-comparators.js","../../../../../node_modules/semver/ranges/max-satisfying.js","../../../../../node_modules/semver/ranges/min-satisfying.js","../../../../../node_modules/semver/ranges/min-version.js","../../../../../node_modules/semver/ranges/valid.js","../../../../../node_modules/semver/ranges/outside.js","../../../../../node_modules/semver/ranges/gtr.js","../../../../../node_modules/semver/ranges/ltr.js","../../../../../node_modules/semver/ranges/intersects.js","../../../../../node_modules/semver/ranges/simplify.js","../../../../../node_modules/semver/ranges/subset.js","../../../../../node_modules/semver/index.js","../src/plugins/hook-system.ts","../src/plugins/plugin-validator.ts","../src/plugins/plugin-registry.ts","../src/plugins/plugin-manager.ts","../src/plugins/core-plugins/turnstile-plugin/middleware/verify.ts","../src/plugins/core-plugins/turnstile-plugin/index.ts"],"names":["__commonJS","exports","z","require_valid","require_semver","__toESM","semver","HOOKS","Hono","TurnstileService","PluginBuilder","manifest_default"],"mappings":"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","file":"chunk-ZUXOAZWZ.cjs","sourcesContent":["'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a === b ? 0 : a < b ? -1 : 1\n }\n\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n if (this.major < other.major) {\n return -1\n }\n if (this.major > other.major) {\n return 1\n }\n if (this.minor < other.minor) {\n return -1\n }\n if (this.minor > other.minor) {\n return 1\n }\n if (this.patch < other.patch) {\n return -1\n }\n if (this.patch > other.patch) {\n return 1\n }\n return 0\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n comp = comp.replace(re[t.BUILD], '')\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","/**\n * Hook System Implementation\n * \n * Provides event-driven extensibility for plugins\n */\n\nimport { HookSystem, HookHandler, PluginHook, HookContext } from '../types'\n\nexport class HookSystemImpl implements HookSystem {\n private hooks: Map = new Map()\n private executing: Set = new Set()\n\n /**\n * Register a hook handler\n */\n register(hookName: string, handler: HookHandler, priority: number = 10): void {\n if (!this.hooks.has(hookName)) {\n this.hooks.set(hookName, [])\n }\n\n const hooks = this.hooks.get(hookName)!\n const hook: PluginHook = {\n name: hookName,\n handler,\n priority,\n }\n\n // Insert hook in priority order (lower priority = earlier execution)\n const insertIndex = hooks.findIndex(h => h.priority! > priority)\n if (insertIndex === -1) {\n hooks.push(hook)\n } else {\n hooks.splice(insertIndex, 0, hook)\n }\n\n console.debug(`Hook registered: ${hookName} (priority: ${priority})`)\n }\n\n /**\n * Execute all handlers for a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n const hooks = this.hooks.get(hookName)\n if (!hooks || hooks.length === 0) {\n return data\n }\n\n // Prevent infinite recursion\n if (this.executing.has(hookName)) {\n console.warn(`Hook recursion detected for: ${hookName}`)\n return data\n }\n\n this.executing.add(hookName)\n\n try {\n let result = data\n let cancelled = false\n\n const hookContext: HookContext = {\n plugin: '', // Will be set by the plugin manager\n context: context || {},\n cancel: () => { cancelled = true }\n }\n\n for (const hook of hooks) {\n if (cancelled) {\n console.debug(`Hook execution cancelled: ${hookName}`)\n break\n }\n\n try {\n console.debug(`Executing hook: ${hookName} (priority: ${hook.priority})`)\n result = await hook.handler(result, hookContext)\n } catch (error) {\n console.error(`Hook execution failed: ${hookName}`, error)\n // Continue executing other hooks unless it's a critical error\n if (error instanceof Error && error.message.includes('CRITICAL')) {\n throw error\n }\n }\n }\n\n return result\n } finally {\n this.executing.delete(hookName)\n }\n }\n\n /**\n * Remove a hook handler\n */\n unregister(hookName: string, handler: HookHandler): void {\n const hooks = this.hooks.get(hookName)\n if (!hooks) return\n\n const index = hooks.findIndex(h => h.handler === handler)\n if (index !== -1) {\n hooks.splice(index, 1)\n console.debug(`Hook unregistered: ${hookName}`)\n }\n\n // Clean up empty hook arrays\n if (hooks.length === 0) {\n this.hooks.delete(hookName)\n }\n }\n\n /**\n * Get all registered hooks for a name\n */\n getHooks(hookName: string): PluginHook[] {\n return this.hooks.get(hookName) || []\n }\n\n /**\n * Get all registered hook names\n */\n getHookNames(): string[] {\n return Array.from(this.hooks.keys())\n }\n\n /**\n * Get hook statistics\n */\n getStats(): { hookName: string; handlerCount: number }[] {\n return Array.from(this.hooks.entries()).map(([hookName, handlers]) => ({\n hookName,\n handlerCount: handlers.length\n }))\n }\n\n /**\n * Clear all hooks (useful for testing)\n */\n clear(): void {\n this.hooks.clear()\n this.executing.clear()\n }\n\n /**\n * Create a scoped hook system for a plugin\n */\n createScope(_pluginName: string): ScopedHookSystem {\n return new ScopedHookSystem(this)\n }\n}\n\n/**\n * Scoped hook system for individual plugins\n */\nexport class ScopedHookSystem {\n private registeredHooks: { hookName: string; handler: HookHandler }[] = []\n\n constructor(\n private parent: HookSystemImpl\n ) {}\n\n /**\n * Register a hook (scoped to this plugin)\n */\n register(hookName: string, handler: HookHandler, priority?: number): void {\n this.parent.register(hookName, handler, priority)\n this.registeredHooks.push({ hookName, handler })\n }\n\n /**\n * Execute a hook\n */\n async execute(hookName: string, data: any, context?: any): Promise {\n return this.parent.execute(hookName, data, context)\n }\n\n /**\n * Unregister a specific hook\n */\n unregister(hookName: string, handler: HookHandler): void {\n this.parent.unregister(hookName, handler)\n const index = this.registeredHooks.findIndex(\n h => h.hookName === hookName && h.handler === handler\n )\n if (index !== -1) {\n this.registeredHooks.splice(index, 1)\n }\n }\n\n /**\n * Unregister all hooks for this plugin\n */\n unregisterAll(): void {\n for (const { hookName, handler } of this.registeredHooks) {\n this.parent.unregister(hookName, handler)\n }\n this.registeredHooks.length = 0\n }\n\n /**\n * Get hooks registered by this plugin\n */\n getRegisteredHooks(): { hookName: string; handler: HookHandler }[] {\n return [...this.registeredHooks]\n }\n}\n\n/**\n * Hook utilities\n */\nexport class HookUtils {\n /**\n * Create a hook name with namespace\n */\n static createHookName(namespace: string, event: string): string {\n return `${namespace}:${event}`\n }\n\n /**\n * Parse a hook name to extract namespace and event\n */\n static parseHookName(hookName: string): { namespace: string; event: string } {\n const parts = hookName.split(':')\n return {\n namespace: parts[0] || '',\n event: parts.slice(1).join(':') || ''\n }\n }\n\n /**\n * Create a middleware that executes hooks\n */\n static createHookMiddleware(\n hookSystem: HookSystem,\n beforeHook?: string,\n afterHook?: string\n ) {\n return async (c: any, next: any) => {\n if (beforeHook) {\n const beforeData = { request: c.req, context: c }\n await hookSystem.execute(beforeHook, beforeData)\n }\n\n await next()\n\n if (afterHook) {\n const afterData = { request: c.req, response: c.res, context: c }\n await hookSystem.execute(afterHook, afterData)\n }\n }\n }\n\n /**\n * Create a debounced hook handler\n */\n static debounce(handler: HookHandler, delay: number): HookHandler {\n let timeoutId: any\n \n return async (data: any, context: HookContext) => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n return new Promise((resolve, reject) => {\n timeoutId = setTimeout(async () => {\n try {\n const result = await handler(data, context)\n resolve(result)\n } catch (error) {\n reject(error)\n }\n }, delay)\n })\n }\n }\n\n /**\n * Create a throttled hook handler\n */\n static throttle(handler: HookHandler, limit: number): HookHandler {\n let lastExecution = 0\n\n return async (data: any, context: HookContext) => {\n const now = Date.now()\n if (now - lastExecution >= limit) {\n lastExecution = now\n return handler(data, context)\n }\n return data\n }\n }\n}","/**\n * Plugin Validator\n * \n * Validates plugin definitions, dependencies, and compatibility\n */\n\nimport { z } from 'zod'\nimport { Plugin, PluginValidator as IPluginValidator, PluginValidationResult, PluginRegistry } from '../types'\nimport semver from 'semver'\n\n// Zod schemas for plugin validation\nconst PluginAuthorSchema = z.object({\n name: z.string().min(1),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n})\n\nconst PluginRoutesSchema = z.object({\n path: z.string().min(1),\n handler: z.any(), // Hono instance\n description: z.string().optional(),\n requiresAuth: z.boolean().optional(),\n roles: z.array(z.string()).optional(),\n priority: z.number().optional(),\n})\n\nconst PluginMiddlewareSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n description: z.string().optional(),\n priority: z.number().optional(),\n routes: z.array(z.string()).optional(),\n global: z.boolean().optional(),\n})\n\nconst PluginModelSchema = z.object({\n name: z.string().min(1),\n tableName: z.string().min(1),\n schema: z.any(), // Zod schema\n migrations: z.array(z.string()),\n relationships: z.array(z.object({\n type: z.enum(['oneToOne', 'oneToMany', 'manyToMany']),\n target: z.string(),\n foreignKey: z.string().optional(),\n joinTable: z.string().optional(),\n })).optional(),\n extendsContent: z.boolean().optional(),\n})\n\nconst PluginServiceSchema = z.object({\n name: z.string().min(1),\n implementation: z.any(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n singleton: z.boolean().optional(),\n})\n\nconst PluginAdminPageSchema = z.object({\n path: z.string().min(1),\n title: z.string().min(1),\n component: z.string().min(1),\n description: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n menuItem: z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n }).optional(),\n icon: z.string().optional(),\n})\n\nconst PluginComponentSchema = z.object({\n name: z.string().min(1),\n template: z.function(),\n description: z.string().optional(),\n propsSchema: z.any().optional(), // Zod schema\n})\n\nconst PluginHookSchema = z.object({\n name: z.string().min(1),\n handler: z.function(),\n priority: z.number().optional(),\n description: z.string().optional(),\n})\n\nconst PluginSchema = z.object({\n name: z.string().min(1).regex(/^[a-z0-9-]+$/, 'Plugin name must be lowercase with hyphens'),\n version: z.string().refine(v => semver.valid(v), 'Version must be valid semver'),\n description: z.string().optional(),\n author: PluginAuthorSchema.optional(),\n dependencies: z.array(z.string()).optional(),\n compatibility: z.string().optional(),\n license: z.string().optional(),\n \n // Extension points\n routes: z.array(PluginRoutesSchema).optional(),\n middleware: z.array(PluginMiddlewareSchema).optional(),\n models: z.array(PluginModelSchema).optional(),\n services: z.array(PluginServiceSchema).optional(),\n adminPages: z.array(PluginAdminPageSchema).optional(),\n adminComponents: z.array(PluginComponentSchema).optional(),\n menuItems: z.array(z.object({\n label: z.string(),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n parent: z.string().optional(),\n permissions: z.array(z.string()).optional(),\n active: z.boolean().optional(),\n })).optional(),\n hooks: z.array(PluginHookSchema).optional(),\n \n // Lifecycle hooks\n install: z.function().optional(),\n uninstall: z.function().optional(),\n activate: z.function().optional(),\n deactivate: z.function().optional(),\n configure: z.function().optional(),\n})\n\nexport class PluginValidator implements IPluginValidator {\n private static readonly RESERVED_NAMES = [\n 'core', 'system', 'admin', 'api', 'auth', 'content', 'media', 'users', 'collections'\n ]\n\n private static readonly RESERVED_PATHS = [\n '/admin', '/api', '/auth', '/docs', '/media', '/_assets'\n ]\n\n /**\n * Validate plugin definition\n */\n validate(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n try {\n // Schema validation\n const result = PluginSchema.safeParse(plugin)\n if (!result.success) {\n result.error.issues.forEach((err: any) => {\n errors.push(`${err.path.join('.')}: ${err.message}`)\n })\n }\n\n // Reserved name validation\n if (PluginValidator.RESERVED_NAMES.includes(plugin.name)) {\n errors.push(`Plugin name \"${plugin.name}\" is reserved`)\n }\n\n // Route path validation\n if (plugin.routes) {\n for (const route of plugin.routes) {\n if (PluginValidator.RESERVED_PATHS.some(path => route.path.startsWith(path))) {\n errors.push(`Route path \"${route.path}\" conflicts with reserved system path`)\n }\n \n if (!route.path.startsWith('/')) {\n errors.push(`Route path \"${route.path}\" must start with /`)\n }\n }\n }\n\n // Model validation\n if (plugin.models) {\n const modelNames = new Set()\n const tableNames = new Set()\n \n for (const model of plugin.models) {\n // Check for duplicate model names\n if (modelNames.has(model.name)) {\n errors.push(`Duplicate model name: ${model.name}`)\n }\n modelNames.add(model.name)\n \n // Check for duplicate table names\n if (tableNames.has(model.tableName)) {\n errors.push(`Duplicate table name: ${model.tableName}`)\n }\n tableNames.add(model.tableName)\n \n // Validate table name format\n if (!/^[a-z][a-z0-9_]*$/.test(model.tableName)) {\n errors.push(`Invalid table name format: ${model.tableName}`)\n }\n \n // Check for system table conflicts\n const systemTables = ['users', 'collections', 'content', 'content_versions', 'media', 'api_tokens']\n if (systemTables.includes(model.tableName)) {\n errors.push(`Table name \"${model.tableName}\" conflicts with system table`)\n }\n }\n }\n\n // Service validation\n if (plugin.services) {\n const serviceNames = new Set()\n \n for (const service of plugin.services) {\n if (serviceNames.has(service.name)) {\n errors.push(`Duplicate service name: ${service.name}`)\n }\n serviceNames.add(service.name)\n \n // Check for system service conflicts\n const systemServices = ['auth', 'content', 'media', 'cdn']\n if (systemServices.includes(service.name)) {\n warnings.push(`Service name \"${service.name}\" conflicts with system service`)\n }\n }\n }\n\n // Admin page validation\n if (plugin.adminPages) {\n const pagePaths = new Set()\n \n for (const page of plugin.adminPages) {\n if (pagePaths.has(page.path)) {\n errors.push(`Duplicate admin page path: ${page.path}`)\n }\n pagePaths.add(page.path)\n \n if (!page.path.startsWith('/')) {\n errors.push(`Admin page path \"${page.path}\" must start with /`)\n }\n \n // Check for system admin page conflicts\n const systemPaths = ['/', '/collections', '/content', '/media', '/users', '/settings']\n if (systemPaths.includes(page.path)) {\n errors.push(`Admin page path \"${page.path}\" conflicts with system page`)\n }\n }\n }\n\n // Component validation\n if (plugin.adminComponents) {\n const componentNames = new Set()\n \n for (const component of plugin.adminComponents) {\n if (componentNames.has(component.name)) {\n errors.push(`Duplicate component name: ${component.name}`)\n }\n componentNames.add(component.name)\n \n // Check for system component conflicts\n const systemComponents = ['table', 'form', 'alert', 'media-grid', 'pagination']\n if (systemComponents.includes(component.name)) {\n warnings.push(`Component name \"${component.name}\" conflicts with system component`)\n }\n }\n }\n\n // Hook validation\n if (plugin.hooks) {\n for (const hook of plugin.hooks) {\n if (!hook.name.includes(':')) {\n warnings.push(`Hook name \"${hook.name}\" should include namespace (e.g., \"plugin:event\")`)\n }\n }\n }\n\n // Dependency cycle detection (basic)\n if (plugin.dependencies?.includes(plugin.name)) {\n errors.push(`Plugin cannot depend on itself`)\n }\n\n // License validation\n if (plugin.license) {\n const validLicenses = ['MIT', 'Apache-2.0', 'GPL-3.0', 'BSD-3-Clause', 'ISC']\n if (!validLicenses.includes(plugin.license)) {\n warnings.push(`License \"${plugin.license}\" is not a common SPDX identifier`)\n }\n }\n\n // Performance warnings\n if (plugin.middleware && plugin.middleware.length > 5) {\n warnings.push(`Plugin defines ${plugin.middleware.length} middleware functions, consider consolidating`)\n }\n\n if (plugin.hooks && plugin.hooks.length > 10) {\n warnings.push(`Plugin defines ${plugin.hooks.length} hooks, ensure they are necessary`)\n }\n\n } catch (error) {\n errors.push(`Validation error: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin dependencies\n */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.dependencies || plugin.dependencies.length === 0) {\n return { valid: true, errors, warnings }\n }\n\n // Check if all dependencies are registered\n for (const depName of plugin.dependencies) {\n if (!registry.has(depName)) {\n errors.push(`Dependency \"${depName}\" is not registered`)\n continue\n }\n\n const dependency = registry.get(depName)!\n \n // Check dependency version compatibility\n if (dependency.compatibility && plugin.compatibility) {\n if (!this.isCompatible(dependency.compatibility, plugin.compatibility)) {\n warnings.push(`Potential compatibility issue with dependency \"${depName}\"`)\n }\n }\n }\n\n // Check for circular dependencies\n const visited = new Set()\n const visiting = new Set()\n \n const checkCircular = (name: string): boolean => {\n if (visiting.has(name)) return true\n if (visited.has(name)) return false\n \n visiting.add(name)\n \n const current = registry.get(name)\n if (current?.dependencies) {\n for (const depName of current.dependencies) {\n if (checkCircular(depName)) {\n errors.push(`Circular dependency detected: ${name} -> ${depName}`)\n return true\n }\n }\n }\n \n visiting.delete(name)\n visited.add(name)\n return false\n }\n\n checkCircular(plugin.name)\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Validate plugin compatibility with SonicJS version\n */\n validateCompatibility(plugin: Plugin, sonicVersion: string): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!plugin.compatibility) {\n warnings.push('Plugin does not specify compatibility version')\n return { valid: true, errors, warnings }\n }\n\n try {\n if (!semver.satisfies(sonicVersion, plugin.compatibility)) {\n errors.push(`Plugin requires SonicJS ${plugin.compatibility}, but current version is ${sonicVersion}`)\n }\n } catch (error) {\n errors.push(`Invalid compatibility version format: ${plugin.compatibility}`)\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n\n /**\n * Check if two version ranges are compatible\n */\n private isCompatible(version1: string, version2: string): boolean {\n try {\n // Simple compatibility check - can be enhanced\n return semver.intersects(version1, version2)\n } catch {\n return false\n }\n }\n\n /**\n * Validate plugin security constraints\n */\n validateSecurity(plugin: Plugin): PluginValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n // Check for potentially dangerous patterns\n const pluginCode = JSON.stringify(plugin)\n \n // Check for eval or Function constructor usage\n if (pluginCode.includes('eval(') || pluginCode.includes('Function(')) {\n errors.push('Plugin contains potentially dangerous code execution patterns')\n }\n\n // Check for file system access attempts\n if (pluginCode.includes('fs.') || pluginCode.includes('require(')) {\n warnings.push('Plugin may attempt file system access (not available in Cloudflare Workers)')\n }\n\n // Check for network access patterns\n if (pluginCode.includes('fetch(') || pluginCode.includes('XMLHttpRequest')) {\n warnings.push('Plugin contains network access code - ensure it follows security guidelines')\n }\n\n // Check for sensitive data patterns\n const sensitivePatterns = ['password', 'secret', 'key', 'token', 'credential']\n for (const pattern of sensitivePatterns) {\n if (pluginCode.toLowerCase().includes(pattern)) {\n warnings.push(`Plugin code contains \"${pattern}\" - ensure sensitive data is properly handled`)\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n }\n}","/**\n * Plugin Registry Implementation\n * \n * Manages plugin registration, activation, and lifecycle\n */\n\nimport { Plugin, PluginRegistry, PluginConfig, PluginStatus } from '../types'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginRegistryImpl implements PluginRegistry {\n private plugins: Map = new Map()\n private configs: Map = new Map()\n private statuses: Map = new Map()\n private validator: PluginValidator\n\n constructor(validator?: PluginValidator) {\n this.validator = validator || new PluginValidator()\n }\n\n /**\n * Get plugin by name\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name)\n }\n\n /**\n * Get all registered plugins\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values())\n }\n\n /**\n * Get active plugins\n */\n getActive(): Plugin[] {\n return this.getAll().filter(plugin => {\n const status = this.statuses.get(plugin.name)\n return status?.active === true\n })\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise {\n console.info(`Registering plugin: ${plugin.name} v${plugin.version}`)\n\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed for ${plugin.name}: ${validation.errors.join(', ')}`)\n }\n\n // Check for conflicts\n if (this.plugins.has(plugin.name)) {\n const existingPlugin = this.plugins.get(plugin.name)!\n if (existingPlugin.version !== plugin.version) {\n console.warn(`Plugin ${plugin.name} is already registered with version ${existingPlugin.version}, replacing with ${plugin.version}`)\n }\n }\n\n // Validate dependencies\n const depValidation = this.validator.validateDependencies(plugin, this)\n if (!depValidation.valid) {\n throw new Error(`Plugin dependency validation failed for ${plugin.name}: ${depValidation.errors.join(', ')}`)\n }\n\n // Register plugin\n this.plugins.set(plugin.name, plugin)\n \n // Initialize status\n this.statuses.set(plugin.name, {\n name: plugin.name,\n version: plugin.version,\n active: false,\n installed: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin registered successfully: ${plugin.name}`)\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise {\n console.info(`Unregistering plugin: ${name}`)\n\n if (!this.plugins.has(name)) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n // Check if other plugins depend on this one\n const dependents = this.getDependents(name)\n if (dependents.length > 0) {\n throw new Error(`Cannot unregister ${name}: plugins ${dependents.join(', ')} depend on it`)\n }\n\n // Remove plugin\n this.plugins.delete(name)\n this.configs.delete(name)\n this.statuses.delete(name)\n\n console.info(`Plugin unregistered: ${name}`)\n }\n\n /**\n * Check if plugin is registered\n */\n has(name: string): boolean {\n return this.plugins.has(name)\n }\n\n /**\n * Activate a plugin\n */\n async activate(name: string): Promise {\n console.info(`Activating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (status?.active) {\n console.warn(`Plugin ${name} is already active`)\n return\n }\n\n try {\n // Activate dependencies first\n if (plugin.dependencies) {\n for (const depName of plugin.dependencies) {\n const depStatus = this.statuses.get(depName)\n if (!depStatus?.active) {\n await this.activate(depName)\n }\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: true,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin activated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n active: false,\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to activate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Deactivate a plugin\n */\n async deactivate(name: string): Promise {\n console.info(`Deactivating plugin: ${name}`)\n\n const plugin = this.plugins.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n const status = this.statuses.get(name)\n if (!status?.active) {\n console.warn(`Plugin ${name} is not active`)\n return\n }\n\n try {\n // Deactivate dependents first\n const dependents = this.getDependents(name)\n for (const depName of dependents) {\n const depStatus = this.statuses.get(depName)\n if (depStatus?.active) {\n await this.deactivate(depName)\n }\n }\n\n // Update status\n this.updateStatus(name, {\n active: false,\n hasErrors: false,\n errors: []\n })\n\n console.info(`Plugin deactivated: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.updateStatus(name, {\n hasErrors: true,\n errors: [errorMessage],\n lastError: errorMessage\n })\n throw new Error(`Failed to deactivate plugin ${name}: ${errorMessage}`)\n }\n }\n\n /**\n * Get plugin configuration\n */\n getConfig(name: string): PluginConfig | undefined {\n return this.configs.get(name)\n }\n\n /**\n * Set plugin configuration\n */\n setConfig(name: string, config: PluginConfig): void {\n this.configs.set(name, {\n ...config,\n updatedAt: Date.now()\n })\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus | undefined {\n return this.statuses.get(name)\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): Map {\n return new Map(this.statuses)\n }\n\n /**\n * Update plugin status\n */\n private updateStatus(name: string, updates: Partial): void {\n const current = this.statuses.get(name)\n if (current) {\n this.statuses.set(name, { ...current, ...updates })\n }\n }\n\n /**\n * Get plugins that depend on the specified plugin\n */\n private getDependents(name: string): string[] {\n const dependents: string[] = []\n \n for (const [pluginName, plugin] of this.plugins) {\n if (plugin.dependencies?.includes(name)) {\n dependents.push(pluginName)\n }\n }\n \n return dependents\n }\n\n /**\n * Get dependency graph\n */\n getDependencyGraph(): Map {\n const graph = new Map()\n \n for (const [name, plugin] of this.plugins) {\n graph.set(name, plugin.dependencies || [])\n }\n \n return graph\n }\n\n /**\n * Resolve plugin load order based on dependencies\n */\n resolveLoadOrder(): string[] {\n const graph = this.getDependencyGraph()\n const visited = new Set()\n const visiting = new Set()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected involving plugin: ${name}`)\n }\n\n visiting.add(name)\n \n const dependencies = graph.get(name) || []\n for (const dep of dependencies) {\n if (!graph.has(dep)) {\n throw new Error(`Plugin ${name} depends on ${dep}, but ${dep} is not registered`)\n }\n visit(dep)\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n for (const name of graph.keys()) {\n visit(name)\n }\n\n return result\n }\n\n /**\n * Export plugin configuration\n */\n exportConfig(): { plugins: PluginConfig[] } {\n const plugins: PluginConfig[] = []\n \n for (const [name, config] of this.configs) {\n plugins.push({\n ...config,\n name\n } as PluginConfig & { name: string })\n }\n \n return { plugins }\n }\n\n /**\n * Import plugin configuration\n */\n importConfig(config: { plugins: PluginConfig[] }): void {\n for (const pluginConfig of config.plugins) {\n if ('name' in pluginConfig) {\n const { name, ...rest } = pluginConfig as PluginConfig & { name: string }\n this.setConfig(name, rest)\n }\n }\n }\n\n /**\n * Clear all plugins (useful for testing)\n */\n clear(): void {\n this.plugins.clear()\n this.configs.clear()\n this.statuses.clear()\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n total: number\n active: number\n inactive: number\n withErrors: number\n } {\n const statuses = Array.from(this.statuses.values())\n \n return {\n total: statuses.length,\n active: statuses.filter(s => s.active).length,\n inactive: statuses.filter(s => !s.active).length,\n withErrors: statuses.filter(s => s.hasErrors).length\n }\n }\n}","/**\n * Plugin Manager\n * \n * Central orchestrator for the plugin system\n */\n\nimport { Hono } from 'hono'\nimport { Plugin, PluginManager as IPluginManager, PluginRegistry, PluginConfig, PluginContext, PluginStatus, HookSystem, PluginLogger, HOOKS } from '../types'\nimport { PluginRegistryImpl } from './plugin-registry'\nimport { HookSystemImpl, ScopedHookSystem } from './hook-system'\nimport { PluginValidator } from './plugin-validator'\n\nexport class PluginManager implements IPluginManager {\n public readonly registry: PluginRegistry\n public readonly hooks: HookSystem\n private validator: PluginValidator\n private context?: PluginContext\n private scopedHooks: Map = new Map()\n private pluginRoutes: Map = new Map()\n\n constructor() {\n this.validator = new PluginValidator()\n this.registry = new PluginRegistryImpl(this.validator)\n this.hooks = new HookSystemImpl()\n }\n\n /**\n * Initialize plugin system\n */\n async initialize(context: PluginContext): Promise {\n console.info('Initializing plugin system...')\n \n this.context = context\n \n // Execute app init hook\n await this.hooks.execute(HOOKS.APP_INIT, {\n pluginManager: this,\n context\n })\n\n console.info('Plugin system initialized')\n }\n\n /**\n * Load plugins from configuration\n */\n async loadPlugins(configs: PluginConfig[]): Promise {\n console.info(`Loading ${configs.length} plugins...`)\n\n // Filter enabled plugins\n const enabledConfigs = configs.filter(config => config.enabled)\n \n if (enabledConfigs.length === 0) {\n console.info('No enabled plugins to load')\n return\n }\n\n // Load and register plugins (implementation would depend on how plugins are distributed)\n for (const config of enabledConfigs) {\n try {\n // In a real implementation, this would load the plugin from a registry or file system\n // For now, we'll assume plugins are already imported\n console.info(`Loading plugin configuration: ${JSON.stringify(config)}`)\n \n // Store configuration\n if ('name' in config) {\n this.registry.setConfig(config.name as string, config)\n }\n } catch (error) {\n console.error(`Failed to load plugin configuration:`, error)\n }\n }\n\n // Resolve load order based on dependencies\n try {\n const loadOrder = this.registry.resolveLoadOrder()\n console.info(`Plugin load order: ${loadOrder.join(' -> ')}`)\n\n // Activate plugins in dependency order\n for (const pluginName of loadOrder) {\n const config = this.registry.getConfig(pluginName)\n if (config?.enabled) {\n await this.registry.activate(pluginName)\n }\n }\n } catch (error) {\n console.error('Failed to resolve plugin load order:', error)\n }\n\n console.info('Plugin loading completed')\n }\n\n /**\n * Install a plugin\n */\n async install(plugin: Plugin, config?: PluginConfig): Promise {\n console.info(`Installing plugin: ${plugin.name}`)\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Validate plugin\n const validation = this.validator.validate(plugin)\n if (!validation.valid) {\n throw new Error(`Plugin validation failed: ${validation.errors.join(', ')}`)\n }\n\n // Register plugin\n await this.registry.register(plugin)\n\n // Set configuration\n const pluginConfig: PluginConfig = {\n enabled: true,\n installedAt: Date.now(),\n ...config\n }\n this.registry.setConfig(plugin.name, pluginConfig)\n\n // Create scoped hook system for plugin\n const scopedHooks = this.hooks.createScope ? \n (this.hooks as HookSystemImpl).createScope(plugin.name) : \n this.hooks\n\n this.scopedHooks.set(plugin.name, scopedHooks as ScopedHookSystem)\n\n // Create plugin context\n const pluginContext: PluginContext = {\n ...this.context,\n config: pluginConfig,\n hooks: scopedHooks,\n logger: this.createLogger(plugin.name)\n }\n\n // Register plugin extensions\n await this.registerPluginExtensions(plugin, pluginContext)\n\n // Run plugin install hook\n if (plugin.install) {\n await plugin.install(pluginContext)\n }\n\n // Execute plugin install hook\n await this.hooks.execute(HOOKS.PLUGIN_INSTALL, {\n plugin: plugin.name,\n version: plugin.version,\n context: pluginContext\n })\n\n console.info(`Plugin installed successfully: ${plugin.name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to install plugin ${plugin.name}:`, errorMessage)\n \n // Update status with error\n const status = this.registry.getStatus(plugin.name)\n if (status) {\n this.updatePluginStatus(plugin.name, {\n hasErrors: true,\n errors: [...(status.errors || []), errorMessage],\n lastError: errorMessage\n })\n }\n \n throw error\n }\n }\n\n /**\n * Uninstall a plugin\n */\n async uninstall(name: string): Promise {\n console.info(`Uninstalling plugin: ${name}`)\n\n const plugin = this.registry.get(name)\n if (!plugin) {\n throw new Error(`Plugin not found: ${name}`)\n }\n\n if (!this.context) {\n throw new Error('Plugin manager not initialized')\n }\n\n try {\n // Deactivate plugin first\n const status = this.registry.getStatus(name)\n if (status?.active) {\n await this.registry.deactivate(name)\n }\n\n // Create plugin context\n const config = this.registry.getConfig(name) || { enabled: false }\n const pluginContext: PluginContext = {\n ...this.context,\n config,\n hooks: this.scopedHooks.get(name) || this.hooks,\n logger: this.createLogger(name)\n }\n\n // Run plugin uninstall hook\n if (plugin.uninstall) {\n await plugin.uninstall(pluginContext)\n }\n\n // Unregister plugin extensions\n await this.unregisterPluginExtensions(plugin)\n\n // Clean up scoped hooks\n const scopedHooks = this.scopedHooks.get(name)\n if (scopedHooks && 'unregisterAll' in scopedHooks) {\n scopedHooks.unregisterAll()\n }\n this.scopedHooks.delete(name)\n\n // Remove plugin routes\n this.pluginRoutes.delete(name)\n\n // Execute plugin uninstall hook\n await this.hooks.execute(HOOKS.PLUGIN_UNINSTALL, {\n plugin: name,\n context: pluginContext\n })\n\n // Unregister plugin\n await this.registry.unregister(name)\n\n console.info(`Plugin uninstalled successfully: ${name}`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Failed to uninstall plugin ${name}:`, errorMessage)\n throw error\n }\n }\n\n /**\n * Get plugin status\n */\n getStatus(name: string): PluginStatus {\n const status = this.registry.getStatus(name)\n if (!status) {\n return {\n name,\n version: 'unknown',\n active: false,\n installed: false,\n hasErrors: false\n }\n }\n return status\n }\n\n /**\n * Get all plugin statuses\n */\n getAllStatuses(): PluginStatus[] {\n return Array.from(this.registry.getAllStatuses().values())\n }\n\n /**\n * Register plugin extensions (routes, middleware, etc.)\n */\n private async registerPluginExtensions(plugin: Plugin, _context: PluginContext): Promise {\n // Register routes\n if (plugin.routes) {\n const pluginApp = new Hono()\n \n for (const route of plugin.routes) {\n console.debug(`Registering plugin route: ${route.path}`)\n pluginApp.route(route.path, route.handler)\n }\n \n this.pluginRoutes.set(plugin.name, pluginApp)\n }\n\n // Register middleware\n if (plugin.middleware) {\n for (const middleware of plugin.middleware) {\n console.debug(`Registering plugin middleware: ${middleware.name}`)\n // Middleware registration would be handled by the main app\n }\n }\n\n // Register hooks\n if (plugin.hooks) {\n const scopedHooks = this.scopedHooks.get(plugin.name)\n for (const hook of plugin.hooks) {\n console.debug(`Registering plugin hook: ${hook.name}`)\n if (scopedHooks) {\n scopedHooks.register(hook.name, hook.handler, hook.priority)\n } else {\n this.hooks.register(hook.name, hook.handler, hook.priority)\n }\n }\n }\n\n // Register services\n if (plugin.services) {\n for (const service of plugin.services) {\n console.debug(`Registering plugin service: ${service.name}`)\n // Service registration would be handled by a service container\n }\n }\n\n // Register database models\n if (plugin.models) {\n for (const model of plugin.models) {\n console.debug(`Registering plugin model: ${model.name}`)\n // Model registration would involve database migrations\n }\n }\n }\n\n /**\n * Unregister plugin extensions\n */\n private async unregisterPluginExtensions(plugin: Plugin): Promise {\n // Clean up is mostly handled by the scoped systems\n console.debug(`Unregistering extensions for plugin: ${plugin.name}`)\n }\n\n /**\n * Update plugin status\n */\n private updatePluginStatus(name: string, updates: Partial): void {\n const current = this.registry.getStatus(name)\n if (current && 'updateStatus' in this.registry) {\n // This would require extending the registry interface\n console.debug(`Updating status for plugin: ${name}`, updates)\n }\n }\n\n /**\n * Create a logger for a plugin\n */\n private createLogger(pluginName: string): PluginLogger {\n return {\n debug: (message: string, data?: any) => {\n console.debug(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n info: (message: string, data?: any) => {\n console.info(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n warn: (message: string, data?: any) => {\n console.warn(`[Plugin:${pluginName}] ${message}`, data || '')\n },\n error: (message: string, error?: Error, data?: any) => {\n console.error(`[Plugin:${pluginName}] ${message}`, error || '', data || '')\n }\n }\n }\n\n /**\n * Get plugin routes for mounting in main app\n */\n getPluginRoutes(): Map {\n return new Map(this.pluginRoutes)\n }\n\n /**\n * Get plugin middleware for main app\n */\n getPluginMiddleware(): Array<{ name: string; handler: any; priority: number; global: boolean }> {\n const middleware: Array<{ name: string; handler: any; priority: number; global: boolean }> = []\n \n for (const plugin of this.registry.getActive()) {\n if (plugin.middleware) {\n for (const mw of plugin.middleware) {\n middleware.push({\n name: `${plugin.name}:${mw.name}`,\n handler: mw.handler,\n priority: mw.priority || 10,\n global: mw.global || false\n })\n }\n }\n }\n \n // Sort by priority\n return middleware.sort((a, b) => a.priority - b.priority)\n }\n\n /**\n * Execute shutdown procedures\n */\n async shutdown(): Promise {\n console.info('Shutting down plugin system...')\n \n // Execute app shutdown hook\n await this.hooks.execute(HOOKS.APP_SHUTDOWN, {\n pluginManager: this\n })\n\n // Deactivate all active plugins\n const activePlugins = this.registry.getActive()\n for (const plugin of activePlugins.reverse()) { // Reverse order\n try {\n await this.registry.deactivate(plugin.name)\n } catch (error) {\n console.error(`Error deactivating plugin ${plugin.name}:`, error)\n }\n }\n\n console.info('Plugin system shutdown completed')\n }\n\n /**\n * Get plugin system statistics\n */\n getStats(): {\n registry: ReturnType\n hooks: Array<{ hookName: string; handlerCount: number }>\n routes: number\n middleware: number\n } {\n return {\n registry: (this.registry as PluginRegistryImpl).getStats(),\n hooks: (this.hooks as HookSystemImpl).getStats(),\n routes: this.pluginRoutes.size,\n middleware: this.getPluginMiddleware().length\n }\n }\n}","import type { Context, Next } from 'hono'\nimport { TurnstileService } from '../services/turnstile'\n\n/**\n * Middleware to verify Turnstile token on form submissions\n * \n * Usage:\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Token already verified, process form...\n * })\n * ```\n */\nexport async function verifyTurnstile(c: Context, next: Next) {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n console.error('Turnstile middleware: Database not available')\n return c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n\n // Check if Turnstile is enabled\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n // Turnstile not enabled, allow through\n return next()\n }\n\n // Get token from request\n let token: string | undefined\n let body: any\n\n if (c.req.method === 'POST') {\n const contentType = c.req.header('content-type') || ''\n \n if (contentType.includes('application/json')) {\n body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n }\n\n if (!token) {\n return c.json({ \n error: 'Turnstile token missing',\n message: 'Please complete the verification challenge'\n }, 400)\n }\n\n // Verify token\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return c.json({ \n error: 'Turnstile verification failed',\n message: result.error || 'Verification failed. Please try again.'\n }, 403)\n }\n\n // Verification successful, continue\n return next()\n}\n\n/**\n * Middleware factory that allows custom error handling\n */\nexport function createTurnstileMiddleware(options?: {\n onError?: (c: Context, error: string) => Response\n onMissing?: (c: Context) => Response\n}) {\n return async (c: Context, next: Next) => {\n const db = c.get('db') || (c as any).env?.DB\n \n if (!db) {\n return options?.onError?.(c, 'Database not available') || \n c.json({ error: 'Database not available' }, 500)\n }\n\n const turnstileService = new TurnstileService(db)\n const isEnabled = await turnstileService.isEnabled()\n \n if (!isEnabled) {\n return next()\n }\n\n let token: string | undefined\n const contentType = c.req.header('content-type') || ''\n\n if (contentType.includes('application/json')) {\n const body = await c.req.json()\n token = body['cf-turnstile-response'] || body['turnstile-token']\n // Store parsed body in context so route handler can access it\n c.set('requestBody', body)\n } else if (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data')) {\n const formData = await c.req.formData()\n token = formData.get('cf-turnstile-response')?.toString() || formData.get('turnstile-token')?.toString()\n }\n\n if (!token) {\n return options?.onMissing?.(c) ||\n c.json({ error: 'Turnstile token missing' }, 400)\n }\n\n const remoteIp = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for')\n const result = await turnstileService.verifyToken(token, remoteIp)\n\n if (!result.success) {\n return options?.onError?.(c, result.error || 'Verification failed') ||\n c.json({ error: 'Turnstile verification failed', message: result.error }, 403)\n }\n\n return next()\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { TurnstileService } from './services/turnstile'\nimport { verifyTurnstile } from './middleware/verify'\nimport manifest from './manifest.json'\n\n/**\n * Cloudflare Turnstile Plugin\n * \n * Provides CAPTCHA-free bot protection using Cloudflare Turnstile.\n * Can be used with any form by adding the verifyTurnstile middleware.\n * \n * Settings are managed through the generic admin plugin interface.\n * No custom routes needed - the admin system automatically handles settings.\n * \n * @example\n * ```typescript\n * import { verifyTurnstile } from '@sonicjs-cms/core/plugins'\n * \n * app.post('/api/contact', verifyTurnstile, async (c) => {\n * // Process form after Turnstile verification\n * })\n * ```\n */\n\n// Build the plugin - no custom routes, generic admin handles settings\nexport const turnstilePlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('turnstile', TurnstileService)\n .addSingleMiddleware('verifyTurnstile', verifyTurnstile, {\n description: 'Verify Cloudflare Turnstile token',\n global: false,\n })\n .build()\n\n// Export service and middleware for easy import\nexport { TurnstileService } from './services/turnstile'\nexport { verifyTurnstile, createTurnstileMiddleware } from './middleware/verify'\nexport { renderTurnstileWidget, renderInlineTurnstile, getTurnstileScript, renderExplicitTurnstile } from './components/widget'\nexport type { TurnstileSettings, TurnstileVerificationResponse } from './services/turnstile'\n"]} \ No newline at end of file diff --git a/packages/core/dist/index.cjs b/packages/core/dist/index.cjs index b84f82e91..fc6b9279e 100644 --- a/packages/core/dist/index.cjs +++ b/packages/core/dist/index.cjs @@ -1,16 +1,16 @@ 'use strict'; -var chunkLPYFMGAK_cjs = require('./chunk-LPYFMGAK.cjs'); -var chunkWAEQXGCX_cjs = require('./chunk-WAEQXGCX.cjs'); -var chunkTAOOLOUH_cjs = require('./chunk-TAOOLOUH.cjs'); -var chunk656GGECX_cjs = require('./chunk-656GGECX.cjs'); -var chunkICMNCCX2_cjs = require('./chunk-ICMNCCX2.cjs'); +var chunkBX75LZES_cjs = require('./chunk-BX75LZES.cjs'); +var chunkXWQVFWPW_cjs = require('./chunk-XWQVFWPW.cjs'); +var chunkV4V54BY3_cjs = require('./chunk-V4V54BY3.cjs'); +var chunkQOZZJZ76_cjs = require('./chunk-QOZZJZ76.cjs'); +var chunk7KR6GOY3_cjs = require('./chunk-7KR6GOY3.cjs'); var chunk4ZSNJDLS_cjs = require('./chunk-4ZSNJDLS.cjs'); var chunkOHYBNCVL_cjs = require('./chunk-OHYBNCVL.cjs'); var chunkUYJ6TJHX_cjs = require('./chunk-UYJ6TJHX.cjs'); -var chunkABB34XUS_cjs = require('./chunk-ABB34XUS.cjs'); +var chunkZUXOAZWZ_cjs = require('./chunk-ZUXOAZWZ.cjs'); var chunk635JAMSE_cjs = require('./chunk-635JAMSE.cjs'); -var chunkGLRZAPX6_cjs = require('./chunk-GLRZAPX6.cjs'); +var chunk74BFRAQS_cjs = require('./chunk-74BFRAQS.cjs'); require('./chunk-P3XDZL6Q.cjs'); var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs'); var chunkMNWKYY5E_cjs = require('./chunk-MNWKYY5E.cjs'); @@ -560,7 +560,7 @@ function formatCellValue(value) { // src/plugins/core-plugins/database-tools-plugin/admin-routes.ts function createDatabaseToolsAdminRoutes() { const router3 = new hono.Hono(); - router3.use("*", chunkTAOOLOUH_cjs.requireAuth()); + router3.use("*", chunkV4V54BY3_cjs.requireAuth()); router3.get("/api/stats", async (c) => { try { const user = c.get("user"); @@ -1815,7 +1815,7 @@ function createOTPLoginPlugin() { console.warn("Failed to parse OTP plugin settings, using defaults"); } } - const settingsService = new chunkWAEQXGCX_cjs.SettingsService(db); + const settingsService = new chunkXWQVFWPW_cjs.SettingsService(db); const generalSettings = await settingsService.getGeneralSettings(); const siteName = generalSettings.siteName; const canRequest = await otpService.checkRateLimit(normalizedEmail, settings); @@ -1991,16 +1991,16 @@ function createOTPLoginPlugin() { error: "Account is deactivated" }, 403); } - const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(db, c.env); - const token = await chunkTAOOLOUH_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); + const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(db, c.env); + const token = await chunkV4V54BY3_cjs.AuthManager.generateToken(user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl); cookie.setCookie(c, "auth_token", token, { httpOnly: true, secure: true, sameSite: "Strict", maxAge: tokenTtl }); - const customData = await chunkLPYFMGAK_cjs.getCustomData(db, user.id); - const { is_active: _isActive, ...publicUser } = user; + const customData = await chunkBX75LZES_cjs.getCustomData(db, user.id); + const { is_active, ...publicUser } = user; return c.json({ success: true, user: { @@ -2462,15 +2462,15 @@ function createOAuthProvidersPlugin() { if (!user || !user.is_active) { return c.redirect("/auth/login?error=Account is deactivated"); } - const tokenTtl2 = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const jwt2 = await chunkTAOOLOUH_cjs.AuthManager.generateToken( + const tokenTtl2 = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const jwt2 = await chunkV4V54BY3_cjs.AuthManager.generateToken( user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl2 ); - chunkTAOOLOUH_cjs.AuthManager.setAuthCookie(c, jwt2, { sameSite: "Lax", maxAge: tokenTtl2 }); + chunkV4V54BY3_cjs.AuthManager.setAuthCookie(c, jwt2, { sameSite: "Lax", maxAge: tokenTtl2 }); return c.redirect("/admin"); } const existingUser = await oauthService.findUserByEmail(profile.email); @@ -2487,15 +2487,15 @@ function createOAuthProvidersPlugin() { tokenExpiresAt: tokenExpiresAt ?? void 0, profileData: JSON.stringify(profile) }); - const tokenTtl2 = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const jwt2 = await chunkTAOOLOUH_cjs.AuthManager.generateToken( + const tokenTtl2 = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const jwt2 = await chunkV4V54BY3_cjs.AuthManager.generateToken( existingUser.id, existingUser.email, existingUser.role, c.env.JWT_SECRET, tokenTtl2 ); - chunkTAOOLOUH_cjs.AuthManager.setAuthCookie(c, jwt2, { sameSite: "Lax", maxAge: tokenTtl2 }); + chunkV4V54BY3_cjs.AuthManager.setAuthCookie(c, jwt2, { sameSite: "Lax", maxAge: tokenTtl2 }); return c.redirect("/admin"); } const newUserId = await oauthService.createUserFromOAuth(profile); @@ -2508,15 +2508,15 @@ function createOAuthProvidersPlugin() { tokenExpiresAt: tokenExpiresAt ?? void 0, profileData: JSON.stringify(profile) }); - const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const jwt = await chunkTAOOLOUH_cjs.AuthManager.generateToken( + const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const jwt = await chunkV4V54BY3_cjs.AuthManager.generateToken( newUserId, profile.email.toLowerCase(), "viewer", c.env.JWT_SECRET, tokenTtl ); - chunkTAOOLOUH_cjs.AuthManager.setAuthCookie(c, jwt, { sameSite: "Lax", maxAge: tokenTtl }); + chunkV4V54BY3_cjs.AuthManager.setAuthCookie(c, jwt, { sameSite: "Lax", maxAge: tokenTtl }); return c.redirect("/admin"); } catch (error) { console.error("OAuth callback error:", error); @@ -4209,7 +4209,7 @@ function renderSettingsPage(data) { // src/plugins/core-plugins/ai-search-plugin/routes/admin.ts var adminRoutes = new hono.Hono(); -adminRoutes.use("*", chunkTAOOLOUH_cjs.requireAuth()); +adminRoutes.use("*", chunkV4V54BY3_cjs.requireAuth()); adminRoutes.get("/", async (c) => { try { const user = c.get("user"); @@ -4610,15 +4610,15 @@ function createMagicLinkAuthPlugin() { SET used = 1, used_at = ? WHERE id = ? `).bind(Date.now(), magicLink.id).run(); - const tokenTtl = await chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); - const jwtToken = await chunkTAOOLOUH_cjs.AuthManager.generateToken( + const tokenTtl = await chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env); + const jwtToken = await chunkV4V54BY3_cjs.AuthManager.generateToken( user.id, user.email, user.role, c.env.JWT_SECRET, tokenTtl ); - chunkTAOOLOUH_cjs.AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl }); + chunkV4V54BY3_cjs.AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl }); await db.prepare(` UPDATE users SET last_login_at = ? WHERE id = ? `).bind(Date.now(), user.id).run(); @@ -5628,7 +5628,7 @@ function renderSecuritySettingsPage(data) { // src/plugins/core-plugins/security-audit-plugin/routes/admin.ts var adminRoutes2 = new hono.Hono(); -adminRoutes2.use("*", chunkTAOOLOUH_cjs.requireAuth()); +adminRoutes2.use("*", chunkV4V54BY3_cjs.requireAuth()); adminRoutes2.use("*", async (c, next) => { const user = c.get("user"); if (user?.role !== "admin") { @@ -5638,7 +5638,7 @@ adminRoutes2.use("*", async (c, next) => { }); async function getSettings(db) { try { - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const plugin2 = await pluginService.getPlugin("security-audit"); if (plugin2?.settings) { const settings = typeof plugin2.settings === "string" ? JSON.parse(plugin2.settings) : plugin2.settings; @@ -5743,7 +5743,7 @@ adminRoutes2.post("/settings", async (c) => { autoPurge: body["retention.autoPurge"] === "true" } }; - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); await pluginService.updatePluginSettings("security-audit", settings); if (c.req.header("HX-Request")) { return c.json({ success: true }); @@ -5904,7 +5904,7 @@ var BruteForceDetector = class { // src/plugins/core-plugins/security-audit-plugin/routes/api.ts var apiRoutes2 = new hono.Hono(); -apiRoutes2.use("*", chunkTAOOLOUH_cjs.requireAuth()); +apiRoutes2.use("*", chunkV4V54BY3_cjs.requireAuth()); apiRoutes2.use("*", async (c, next) => { const user = c.get("user"); if (user?.role !== "admin") { @@ -5914,7 +5914,7 @@ apiRoutes2.use("*", async (c, next) => { }); async function getSettings2(db) { try { - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const plugin2 = await pluginService.getPlugin("security-audit"); if (plugin2?.settings) { const settings = typeof plugin2.settings === "string" ? JSON.parse(plugin2.settings) : plugin2.settings; @@ -6062,7 +6062,7 @@ function generateFingerprint(ip, userAgent) { } async function getPluginSettings(db) { try { - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const plugin2 = await pluginService.getPlugin("security-audit"); if (plugin2?.settings) { const settings = typeof plugin2.settings === "string" ? JSON.parse(plugin2.settings) : plugin2.settings; @@ -7072,7 +7072,7 @@ var DEFAULT_SETTINGS3 = { // src/plugins/core-plugins/stripe-plugin/routes/admin.ts var adminRoutes3 = new hono.Hono(); -adminRoutes3.use("*", chunkTAOOLOUH_cjs.requireAuth()); +adminRoutes3.use("*", chunkV4V54BY3_cjs.requireAuth()); adminRoutes3.use("*", async (c, next) => { const user = c.get("user"); if (user?.role !== "admin") { @@ -7082,7 +7082,7 @@ adminRoutes3.use("*", async (c, next) => { }); async function getSettings3(db) { try { - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const plugin2 = await pluginService.getPlugin("stripe"); if (plugin2?.settings) { const settings = typeof plugin2.settings === "string" ? JSON.parse(plugin2.settings) : plugin2.settings; @@ -7404,7 +7404,7 @@ function timingSafeEqual(a, b) { var apiRoutes3 = new hono.Hono(); async function getSettings4(db) { try { - const pluginService = new chunk656GGECX_cjs.PluginService(db); + const pluginService = new chunkQOZZJZ76_cjs.PluginService(db); const plugin2 = await pluginService.getPlugin("stripe"); if (plugin2?.settings) { const settings = typeof plugin2.settings === "string" ? JSON.parse(plugin2.settings) : plugin2.settings; @@ -7555,7 +7555,7 @@ apiRoutes3.post("/webhook", async (c) => { } return c.json({ received: true }); }); -apiRoutes3.post("/create-checkout-session", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { +apiRoutes3.post("/create-checkout-session", chunkV4V54BY3_cjs.requireAuth(), async (c) => { const db = c.env.DB; const user = c.get("user"); if (!user) return c.json({ error: "Unauthorized" }, 401); @@ -7595,7 +7595,7 @@ apiRoutes3.post("/create-checkout-session", chunkTAOOLOUH_cjs.requireAuth(), asy }); return c.json({ sessionId: session.id, url: session.url }); }); -apiRoutes3.get("/subscription", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { +apiRoutes3.get("/subscription", chunkV4V54BY3_cjs.requireAuth(), async (c) => { const user = c.get("user"); if (!user) return c.json({ error: "Unauthorized" }, 401); const db = c.env.DB; @@ -7607,7 +7607,7 @@ apiRoutes3.get("/subscription", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { } return c.json({ subscription }); }); -apiRoutes3.get("/subscriptions", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { +apiRoutes3.get("/subscriptions", chunkV4V54BY3_cjs.requireAuth(), async (c) => { const user = c.get("user"); if (user?.role !== "admin") return c.json({ error: "Access denied" }, 403); const db = c.env.DB; @@ -7623,7 +7623,7 @@ apiRoutes3.get("/subscriptions", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { const result = await subscriptionService.list(filters); return c.json(result); }); -apiRoutes3.get("/stats", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { +apiRoutes3.get("/stats", chunkV4V54BY3_cjs.requireAuth(), async (c) => { const user = c.get("user"); if (user?.role !== "admin") return c.json({ error: "Access denied" }, 403); const db = c.env.DB; @@ -7632,7 +7632,7 @@ apiRoutes3.get("/stats", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { const stats = await subscriptionService.getStats(); return c.json(stats); }); -apiRoutes3.post("/sync-subscriptions", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { +apiRoutes3.post("/sync-subscriptions", chunkV4V54BY3_cjs.requireAuth(), async (c) => { const user = c.get("user"); if (user?.role !== "admin") return c.json({ error: "Access denied" }, 403); const db = c.env.DB; @@ -7680,7 +7680,7 @@ apiRoutes3.post("/sync-subscriptions", chunkTAOOLOUH_cjs.requireAuth(), async (c }, 500); } }); -apiRoutes3.get("/events", chunkTAOOLOUH_cjs.requireAuth(), async (c) => { +apiRoutes3.get("/events", chunkV4V54BY3_cjs.requireAuth(), async (c) => { const user = c.get("user"); if (user?.role !== "admin") return c.json({ error: "Access denied" }, 403); const db = c.env.DB; @@ -7746,7 +7746,7 @@ function createStripePlugin() { var stripePlugin = createStripePlugin(); // src/middleware/plugin-menu.ts -var REGISTRY_MENU_PLUGINS = Object.values(chunk656GGECX_cjs.PLUGIN_REGISTRY).filter((p) => p.adminMenu !== null).map((p) => ({ +var REGISTRY_MENU_PLUGINS = Object.values(chunkQOZZJZ76_cjs.PLUGIN_REGISTRY).filter((p) => p.adminMenu !== null).map((p) => ({ codeName: p.codeName, label: p.adminMenu.label, path: p.adminMenu.path, @@ -7845,7 +7845,7 @@ var HOOKS2 = { USER_LOGIN: "user:login"}; chunkUYJ6TJHX_cjs.init_admin_layout_catalyst_template(); var adminRoutes4 = new hono.Hono(); -adminRoutes4.use("*", chunkTAOOLOUH_cjs.requireAuth()); +adminRoutes4.use("*", chunkV4V54BY3_cjs.requireAuth()); adminRoutes4.use("*", async (c, next) => { const user = c.get("user"); if (user?.role !== "admin") { @@ -9644,7 +9644,7 @@ function renderCacheDashboard(data) { - ${chunkLPYFMGAK_cjs.renderConfirmationDialog({ + ${chunkBX75LZES_cjs.renderConfirmationDialog({ id: "clear-all-cache-confirm", title: "Clear All Cache", message: "Are you sure you want to clear all cache entries? This cannot be undone.", @@ -9655,7 +9655,7 @@ function renderCacheDashboard(data) { onConfirm: "performClearAllCaches()" })} - ${chunkLPYFMGAK_cjs.renderConfirmationDialog({ + ${chunkBX75LZES_cjs.renderConfirmationDialog({ id: "clear-namespace-cache-confirm", title: "Clear Namespace Cache", message: "Clear cache for this namespace?", @@ -9666,7 +9666,7 @@ function renderCacheDashboard(data) { onConfirm: "performClearNamespaceCache()" })} - ${chunkLPYFMGAK_cjs.getConfirmationDialogScript()} + ${chunkBX75LZES_cjs.getConfirmationDialogScript()} `; const layoutData = { title: "Cache System", @@ -10352,14 +10352,14 @@ var faviconSvg = ` // src/app.ts function createSonicJSApp(config = {}) { const app2 = new hono.Hono(); - const appVersion = config.version || chunkGLRZAPX6_cjs.getCoreVersion(); + const appVersion = config.version || chunk74BFRAQS_cjs.getCoreVersion(); const appName = config.name || "SonicJS AI"; app2.use("*", async (c, next) => { c.set("appVersion", appVersion); await next(); }); - app2.use("*", chunkTAOOLOUH_cjs.metricsMiddleware()); - app2.use("*", chunkTAOOLOUH_cjs.bootstrapMiddleware(config)); + app2.use("*", chunkV4V54BY3_cjs.metricsMiddleware()); + app2.use("*", chunkV4V54BY3_cjs.bootstrapMiddleware(config)); if (config.middleware?.beforeAuth) { for (const middleware of config.middleware.beforeAuth) { app2.use("*", middleware); @@ -10368,32 +10368,32 @@ function createSonicJSApp(config = {}) { app2.use("*", async (_c, next) => { await next(); }); - app2.use("*", chunkTAOOLOUH_cjs.securityHeadersMiddleware()); - app2.use("*", chunkTAOOLOUH_cjs.csrfProtection()); + app2.use("*", chunkV4V54BY3_cjs.securityHeadersMiddleware()); + app2.use("*", chunkV4V54BY3_cjs.csrfProtection()); if (config.middleware?.afterAuth) { for (const middleware of config.middleware.afterAuth) { app2.use("*", middleware); } } const adminRoles = config.adminAccessRoles || ["admin"]; - app2.use("/admin/*", chunkTAOOLOUH_cjs.requireAuth()); - app2.use("/admin/*", chunkTAOOLOUH_cjs.requireRole(adminRoles)); + app2.use("/admin/*", chunkV4V54BY3_cjs.requireAuth()); + app2.use("/admin/*", chunkV4V54BY3_cjs.requireRole(adminRoles)); app2.use("/admin/*", pluginMenuMiddleware()); - app2.route("/api", chunkLPYFMGAK_cjs.api_default); - app2.route("/api/media", chunkLPYFMGAK_cjs.api_media_default); - app2.route("/api/system", chunkLPYFMGAK_cjs.api_system_default); - app2.route("/admin/api", chunkLPYFMGAK_cjs.admin_api_default); - app2.route("/admin/dashboard", chunkLPYFMGAK_cjs.router); - app2.route("/admin/collections", chunkLPYFMGAK_cjs.adminCollectionsRoutes); - app2.route("/admin/forms", chunkLPYFMGAK_cjs.adminFormsRoutes); - app2.route("/admin/settings", chunkLPYFMGAK_cjs.adminSettingsRoutes); - app2.route("/forms", chunkLPYFMGAK_cjs.public_forms_default); - app2.route("/api/forms", chunkLPYFMGAK_cjs.public_forms_default); - app2.route("/admin/api-reference", chunkLPYFMGAK_cjs.router2); + app2.route("/api", chunkBX75LZES_cjs.api_default); + app2.route("/api/media", chunkBX75LZES_cjs.api_media_default); + app2.route("/api/system", chunkBX75LZES_cjs.api_system_default); + app2.route("/admin/api", chunkBX75LZES_cjs.admin_api_default); + app2.route("/admin/dashboard", chunkBX75LZES_cjs.router); + app2.route("/admin/collections", chunkBX75LZES_cjs.adminCollectionsRoutes); + app2.route("/admin/forms", chunkBX75LZES_cjs.adminFormsRoutes); + app2.route("/admin/settings", chunkBX75LZES_cjs.adminSettingsRoutes); + app2.route("/forms", chunkBX75LZES_cjs.public_forms_default); + app2.route("/api/forms", chunkBX75LZES_cjs.public_forms_default); + app2.route("/admin/api-reference", chunkBX75LZES_cjs.router2); app2.route("/admin/database-tools", createDatabaseToolsAdminRoutes()); app2.route("/admin/seed-data", createSeedDataAdminRoutes()); - app2.route("/admin/content", chunkLPYFMGAK_cjs.admin_content_default); - app2.route("/admin/media", chunkLPYFMGAK_cjs.adminMediaRoutes); + app2.route("/admin/content", chunkBX75LZES_cjs.admin_content_default); + app2.route("/admin/media", chunkBX75LZES_cjs.adminMediaRoutes); app2.use("/auth/*", securityAuditMiddleware()); if (securityAuditPlugin.routes && securityAuditPlugin.routes.length > 0) { for (const route of securityAuditPlugin.routes) { @@ -10411,8 +10411,8 @@ function createSonicJSApp(config = {}) { app2.route(route.path, route.handler); } } - if (chunkLPYFMGAK_cjs.userProfilesPlugin.routes && chunkLPYFMGAK_cjs.userProfilesPlugin.routes.length > 0) { - for (const route of chunkLPYFMGAK_cjs.userProfilesPlugin.routes) { + if (chunkBX75LZES_cjs.userProfilesPlugin.routes && chunkBX75LZES_cjs.userProfilesPlugin.routes.length > 0) { + for (const route of chunkBX75LZES_cjs.userProfilesPlugin.routes) { app2.route(route.path, route.handler); } } @@ -10432,11 +10432,11 @@ function createSonicJSApp(config = {}) { app2.route(route.path, route.handler); } } - app2.route("/admin/plugins", chunkLPYFMGAK_cjs.adminPluginRoutes); - app2.route("/admin/logs", chunkLPYFMGAK_cjs.adminLogsRoutes); - app2.route("/admin", chunkLPYFMGAK_cjs.userRoutes); - app2.route("/auth", chunkLPYFMGAK_cjs.auth_default); - app2.route("/", chunkLPYFMGAK_cjs.test_cleanup_default); + app2.route("/admin/plugins", chunkBX75LZES_cjs.adminPluginRoutes); + app2.route("/admin/logs", chunkBX75LZES_cjs.adminLogsRoutes); + app2.route("/admin", chunkBX75LZES_cjs.userRoutes); + app2.route("/auth", chunkBX75LZES_cjs.auth_default); + app2.route("/", chunkBX75LZES_cjs.test_cleanup_default); if (emailPlugin.routes && emailPlugin.routes.length > 0) { for (const route of emailPlugin.routes) { app2.route(route.path, route.handler); @@ -10499,7 +10499,7 @@ function createSonicJSApp(config = {}) { timestamp: (/* @__PURE__ */ new Date()).toISOString() }); }); - chunkWAEQXGCX_cjs.setAppInstance(app2); + chunkXWQVFWPW_cjs.setAppInstance(app2); app2.notFound((c) => { return c.json({ error: "Not Found", status: 404 }, 404); }); @@ -10516,431 +10516,431 @@ function setupCoreRoutes(_app) { console.warn("setupCoreRoutes is deprecated. Use createSonicJSApp() instead."); } function createDb(d1$1) { - return d1.drizzle(d1$1, { schema: chunkWAEQXGCX_cjs.schema_exports }); + return d1.drizzle(d1$1, { schema: chunkXWQVFWPW_cjs.schema_exports }); } // src/index.ts -var VERSION = chunkGLRZAPX6_cjs.package_default.version; +var VERSION = chunk74BFRAQS_cjs.package_default.version; Object.defineProperty(exports, "ROUTES_INFO", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.ROUTES_INFO; } + get: function () { return chunkBX75LZES_cjs.ROUTES_INFO; } }); Object.defineProperty(exports, "adminApiRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.admin_api_default; } + get: function () { return chunkBX75LZES_cjs.admin_api_default; } }); Object.defineProperty(exports, "adminCheckboxRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminCheckboxRoutes; } + get: function () { return chunkBX75LZES_cjs.adminCheckboxRoutes; } }); Object.defineProperty(exports, "adminCodeExamplesRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.admin_code_examples_default; } + get: function () { return chunkBX75LZES_cjs.admin_code_examples_default; } }); Object.defineProperty(exports, "adminCollectionsRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminCollectionsRoutes; } + get: function () { return chunkBX75LZES_cjs.adminCollectionsRoutes; } }); Object.defineProperty(exports, "adminContentRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.admin_content_default; } + get: function () { return chunkBX75LZES_cjs.admin_content_default; } }); Object.defineProperty(exports, "adminDashboardRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.router; } + get: function () { return chunkBX75LZES_cjs.router; } }); Object.defineProperty(exports, "adminDesignRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminDesignRoutes; } + get: function () { return chunkBX75LZES_cjs.adminDesignRoutes; } }); Object.defineProperty(exports, "adminLogsRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminLogsRoutes; } + get: function () { return chunkBX75LZES_cjs.adminLogsRoutes; } }); Object.defineProperty(exports, "adminMediaRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminMediaRoutes; } + get: function () { return chunkBX75LZES_cjs.adminMediaRoutes; } }); Object.defineProperty(exports, "adminPluginRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminPluginRoutes; } + get: function () { return chunkBX75LZES_cjs.adminPluginRoutes; } }); Object.defineProperty(exports, "adminSettingsRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminSettingsRoutes; } + get: function () { return chunkBX75LZES_cjs.adminSettingsRoutes; } }); Object.defineProperty(exports, "adminTestimonialsRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.admin_testimonials_default; } + get: function () { return chunkBX75LZES_cjs.admin_testimonials_default; } }); Object.defineProperty(exports, "adminUsersRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.userRoutes; } + get: function () { return chunkBX75LZES_cjs.userRoutes; } }); Object.defineProperty(exports, "apiContentCrudRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.api_content_crud_default; } + get: function () { return chunkBX75LZES_cjs.api_content_crud_default; } }); Object.defineProperty(exports, "apiMediaRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.api_media_default; } + get: function () { return chunkBX75LZES_cjs.api_media_default; } }); Object.defineProperty(exports, "apiRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.api_default; } + get: function () { return chunkBX75LZES_cjs.api_default; } }); Object.defineProperty(exports, "apiSystemRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.api_system_default; } + get: function () { return chunkBX75LZES_cjs.api_system_default; } }); Object.defineProperty(exports, "authRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.auth_default; } + get: function () { return chunkBX75LZES_cjs.auth_default; } }); Object.defineProperty(exports, "createUserProfilesPlugin", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.createUserProfilesPlugin; } + get: function () { return chunkBX75LZES_cjs.createUserProfilesPlugin; } }); Object.defineProperty(exports, "defineUserProfile", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.defineUserProfile; } + get: function () { return chunkBX75LZES_cjs.defineUserProfile; } }); Object.defineProperty(exports, "getUserProfileConfig", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.getUserProfileConfig; } + get: function () { return chunkBX75LZES_cjs.getUserProfileConfig; } }); Object.defineProperty(exports, "userProfilesPlugin", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.userProfilesPlugin; } + get: function () { return chunkBX75LZES_cjs.userProfilesPlugin; } }); Object.defineProperty(exports, "Logger", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.Logger; } + get: function () { return chunkXWQVFWPW_cjs.Logger; } }); Object.defineProperty(exports, "apiTokens", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.apiTokens; } + get: function () { return chunkXWQVFWPW_cjs.apiTokens; } }); Object.defineProperty(exports, "collections", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.collections; } + get: function () { return chunkXWQVFWPW_cjs.collections; } }); Object.defineProperty(exports, "content", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.content; } + get: function () { return chunkXWQVFWPW_cjs.content; } }); Object.defineProperty(exports, "contentVersions", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.contentVersions; } + get: function () { return chunkXWQVFWPW_cjs.contentVersions; } }); Object.defineProperty(exports, "getLogger", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.getLogger; } + get: function () { return chunkXWQVFWPW_cjs.getLogger; } }); Object.defineProperty(exports, "initLogger", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.initLogger; } + get: function () { return chunkXWQVFWPW_cjs.initLogger; } }); Object.defineProperty(exports, "insertCollectionSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertCollectionSchema; } + get: function () { return chunkXWQVFWPW_cjs.insertCollectionSchema; } }); Object.defineProperty(exports, "insertContentSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertContentSchema; } + get: function () { return chunkXWQVFWPW_cjs.insertContentSchema; } }); Object.defineProperty(exports, "insertLogConfigSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertLogConfigSchema; } + get: function () { return chunkXWQVFWPW_cjs.insertLogConfigSchema; } }); Object.defineProperty(exports, "insertMediaSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertMediaSchema; } + get: function () { return chunkXWQVFWPW_cjs.insertMediaSchema; } }); Object.defineProperty(exports, "insertPluginActivityLogSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertPluginActivityLogSchema; } + get: function () { return chunkXWQVFWPW_cjs.insertPluginActivityLogSchema; } }); Object.defineProperty(exports, "insertPluginAssetSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertPluginAssetSchema; } + get: function () { return chunkXWQVFWPW_cjs.insertPluginAssetSchema; } }); Object.defineProperty(exports, "insertPluginHookSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertPluginHookSchema; } + get: function () { return chunkXWQVFWPW_cjs.insertPluginHookSchema; } }); Object.defineProperty(exports, "insertPluginRouteSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertPluginRouteSchema; } + get: function () { return chunkXWQVFWPW_cjs.insertPluginRouteSchema; } }); Object.defineProperty(exports, "insertPluginSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertPluginSchema; } + get: function () { return chunkXWQVFWPW_cjs.insertPluginSchema; } }); Object.defineProperty(exports, "insertSystemLogSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertSystemLogSchema; } + get: function () { return chunkXWQVFWPW_cjs.insertSystemLogSchema; } }); Object.defineProperty(exports, "insertUserSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertUserSchema; } + get: function () { return chunkXWQVFWPW_cjs.insertUserSchema; } }); Object.defineProperty(exports, "insertWorkflowHistorySchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.insertWorkflowHistorySchema; } + get: function () { return chunkXWQVFWPW_cjs.insertWorkflowHistorySchema; } }); Object.defineProperty(exports, "logConfig", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.logConfig; } + get: function () { return chunkXWQVFWPW_cjs.logConfig; } }); Object.defineProperty(exports, "media", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.media; } + get: function () { return chunkXWQVFWPW_cjs.media; } }); Object.defineProperty(exports, "pluginActivityLog", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.pluginActivityLog; } + get: function () { return chunkXWQVFWPW_cjs.pluginActivityLog; } }); Object.defineProperty(exports, "pluginAssets", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.pluginAssets; } + get: function () { return chunkXWQVFWPW_cjs.pluginAssets; } }); Object.defineProperty(exports, "pluginHooks", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.pluginHooks; } + get: function () { return chunkXWQVFWPW_cjs.pluginHooks; } }); Object.defineProperty(exports, "pluginRoutes", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.pluginRoutes; } + get: function () { return chunkXWQVFWPW_cjs.pluginRoutes; } }); Object.defineProperty(exports, "plugins", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.plugins; } + get: function () { return chunkXWQVFWPW_cjs.plugins; } }); Object.defineProperty(exports, "selectCollectionSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectCollectionSchema; } + get: function () { return chunkXWQVFWPW_cjs.selectCollectionSchema; } }); Object.defineProperty(exports, "selectContentSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectContentSchema; } + get: function () { return chunkXWQVFWPW_cjs.selectContentSchema; } }); Object.defineProperty(exports, "selectLogConfigSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectLogConfigSchema; } + get: function () { return chunkXWQVFWPW_cjs.selectLogConfigSchema; } }); Object.defineProperty(exports, "selectMediaSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectMediaSchema; } + get: function () { return chunkXWQVFWPW_cjs.selectMediaSchema; } }); Object.defineProperty(exports, "selectPluginActivityLogSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectPluginActivityLogSchema; } + get: function () { return chunkXWQVFWPW_cjs.selectPluginActivityLogSchema; } }); Object.defineProperty(exports, "selectPluginAssetSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectPluginAssetSchema; } + get: function () { return chunkXWQVFWPW_cjs.selectPluginAssetSchema; } }); Object.defineProperty(exports, "selectPluginHookSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectPluginHookSchema; } + get: function () { return chunkXWQVFWPW_cjs.selectPluginHookSchema; } }); Object.defineProperty(exports, "selectPluginRouteSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectPluginRouteSchema; } + get: function () { return chunkXWQVFWPW_cjs.selectPluginRouteSchema; } }); Object.defineProperty(exports, "selectPluginSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectPluginSchema; } + get: function () { return chunkXWQVFWPW_cjs.selectPluginSchema; } }); Object.defineProperty(exports, "selectSystemLogSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectSystemLogSchema; } + get: function () { return chunkXWQVFWPW_cjs.selectSystemLogSchema; } }); Object.defineProperty(exports, "selectUserSchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectUserSchema; } + get: function () { return chunkXWQVFWPW_cjs.selectUserSchema; } }); Object.defineProperty(exports, "selectWorkflowHistorySchema", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.selectWorkflowHistorySchema; } + get: function () { return chunkXWQVFWPW_cjs.selectWorkflowHistorySchema; } }); Object.defineProperty(exports, "systemLogs", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.systemLogs; } + get: function () { return chunkXWQVFWPW_cjs.systemLogs; } }); Object.defineProperty(exports, "users", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.users; } + get: function () { return chunkXWQVFWPW_cjs.users; } }); Object.defineProperty(exports, "workflowHistory", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.workflowHistory; } + get: function () { return chunkXWQVFWPW_cjs.workflowHistory; } }); Object.defineProperty(exports, "AuthManager", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.AuthManager; } + get: function () { return chunkV4V54BY3_cjs.AuthManager; } }); Object.defineProperty(exports, "PermissionManager", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.PermissionManager; } + get: function () { return chunkV4V54BY3_cjs.PermissionManager; } }); Object.defineProperty(exports, "bootstrapMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.bootstrapMiddleware; } + get: function () { return chunkV4V54BY3_cjs.bootstrapMiddleware; } }); Object.defineProperty(exports, "cacheHeaders", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.cacheHeaders; } + get: function () { return chunkV4V54BY3_cjs.cacheHeaders; } }); Object.defineProperty(exports, "compressionMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.compressionMiddleware; } + get: function () { return chunkV4V54BY3_cjs.compressionMiddleware; } }); Object.defineProperty(exports, "detailedLoggingMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.detailedLoggingMiddleware; } + get: function () { return chunkV4V54BY3_cjs.detailedLoggingMiddleware; } }); Object.defineProperty(exports, "getActivePlugins", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.getActivePlugins; } + get: function () { return chunkV4V54BY3_cjs.getActivePlugins; } }); Object.defineProperty(exports, "isPluginActive", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.isPluginActive; } + get: function () { return chunkV4V54BY3_cjs.isPluginActive; } }); Object.defineProperty(exports, "logActivity", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.logActivity; } + get: function () { return chunkV4V54BY3_cjs.logActivity; } }); Object.defineProperty(exports, "loggingMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.loggingMiddleware; } + get: function () { return chunkV4V54BY3_cjs.loggingMiddleware; } }); Object.defineProperty(exports, "optionalAuth", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.optionalAuth; } + get: function () { return chunkV4V54BY3_cjs.optionalAuth; } }); Object.defineProperty(exports, "performanceLoggingMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.performanceLoggingMiddleware; } + get: function () { return chunkV4V54BY3_cjs.performanceLoggingMiddleware; } }); Object.defineProperty(exports, "requireActivePlugin", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requireActivePlugin; } + get: function () { return chunkV4V54BY3_cjs.requireActivePlugin; } }); Object.defineProperty(exports, "requireActivePlugins", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requireActivePlugins; } + get: function () { return chunkV4V54BY3_cjs.requireActivePlugins; } }); Object.defineProperty(exports, "requireAnyPermission", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requireAnyPermission; } + get: function () { return chunkV4V54BY3_cjs.requireAnyPermission; } }); Object.defineProperty(exports, "requireAuth", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requireAuth; } + get: function () { return chunkV4V54BY3_cjs.requireAuth; } }); Object.defineProperty(exports, "requirePermission", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requirePermission; } + get: function () { return chunkV4V54BY3_cjs.requirePermission; } }); Object.defineProperty(exports, "requireRole", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requireRole; } + get: function () { return chunkV4V54BY3_cjs.requireRole; } }); Object.defineProperty(exports, "securityHeaders", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.securityHeadersMiddleware; } + get: function () { return chunkV4V54BY3_cjs.securityHeadersMiddleware; } }); Object.defineProperty(exports, "securityLoggingMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.securityLoggingMiddleware; } + get: function () { return chunkV4V54BY3_cjs.securityLoggingMiddleware; } }); Object.defineProperty(exports, "PluginBootstrapService", { enumerable: true, - get: function () { return chunk656GGECX_cjs.PluginBootstrapService; } + get: function () { return chunkQOZZJZ76_cjs.PluginBootstrapService; } }); Object.defineProperty(exports, "PluginServiceClass", { enumerable: true, - get: function () { return chunk656GGECX_cjs.PluginService; } + get: function () { return chunkQOZZJZ76_cjs.PluginService; } }); Object.defineProperty(exports, "backfillFormSubmissions", { enumerable: true, - get: function () { return chunk656GGECX_cjs.backfillFormSubmissions; } + get: function () { return chunkQOZZJZ76_cjs.backfillFormSubmissions; } }); Object.defineProperty(exports, "cleanupRemovedCollections", { enumerable: true, - get: function () { return chunk656GGECX_cjs.cleanupRemovedCollections; } + get: function () { return chunkQOZZJZ76_cjs.cleanupRemovedCollections; } }); Object.defineProperty(exports, "createContentFromSubmission", { enumerable: true, - get: function () { return chunk656GGECX_cjs.createContentFromSubmission; } + get: function () { return chunkQOZZJZ76_cjs.createContentFromSubmission; } }); Object.defineProperty(exports, "deriveCollectionSchemaFromFormio", { enumerable: true, - get: function () { return chunk656GGECX_cjs.deriveCollectionSchemaFromFormio; } + get: function () { return chunkQOZZJZ76_cjs.deriveCollectionSchemaFromFormio; } }); Object.defineProperty(exports, "deriveSubmissionTitle", { enumerable: true, - get: function () { return chunk656GGECX_cjs.deriveSubmissionTitle; } + get: function () { return chunkQOZZJZ76_cjs.deriveSubmissionTitle; } }); Object.defineProperty(exports, "fullCollectionSync", { enumerable: true, - get: function () { return chunk656GGECX_cjs.fullCollectionSync; } + get: function () { return chunkQOZZJZ76_cjs.fullCollectionSync; } }); Object.defineProperty(exports, "getAvailableCollectionNames", { enumerable: true, - get: function () { return chunk656GGECX_cjs.getAvailableCollectionNames; } + get: function () { return chunkQOZZJZ76_cjs.getAvailableCollectionNames; } }); Object.defineProperty(exports, "getManagedCollections", { enumerable: true, - get: function () { return chunk656GGECX_cjs.getManagedCollections; } + get: function () { return chunkQOZZJZ76_cjs.getManagedCollections; } }); Object.defineProperty(exports, "isCollectionManaged", { enumerable: true, - get: function () { return chunk656GGECX_cjs.isCollectionManaged; } + get: function () { return chunkQOZZJZ76_cjs.isCollectionManaged; } }); Object.defineProperty(exports, "loadCollectionConfig", { enumerable: true, - get: function () { return chunk656GGECX_cjs.loadCollectionConfig; } + get: function () { return chunkQOZZJZ76_cjs.loadCollectionConfig; } }); Object.defineProperty(exports, "loadCollectionConfigs", { enumerable: true, - get: function () { return chunk656GGECX_cjs.loadCollectionConfigs; } + get: function () { return chunkQOZZJZ76_cjs.loadCollectionConfigs; } }); Object.defineProperty(exports, "mapFormStatusToContentStatus", { enumerable: true, - get: function () { return chunk656GGECX_cjs.mapFormStatusToContentStatus; } + get: function () { return chunkQOZZJZ76_cjs.mapFormStatusToContentStatus; } }); Object.defineProperty(exports, "registerCollections", { enumerable: true, - get: function () { return chunk656GGECX_cjs.registerCollections; } + get: function () { return chunkQOZZJZ76_cjs.registerCollections; } }); Object.defineProperty(exports, "syncAllFormCollections", { enumerable: true, - get: function () { return chunk656GGECX_cjs.syncAllFormCollections; } + get: function () { return chunkQOZZJZ76_cjs.syncAllFormCollections; } }); Object.defineProperty(exports, "syncCollection", { enumerable: true, - get: function () { return chunk656GGECX_cjs.syncCollection; } + get: function () { return chunkQOZZJZ76_cjs.syncCollection; } }); Object.defineProperty(exports, "syncCollections", { enumerable: true, - get: function () { return chunk656GGECX_cjs.syncCollections; } + get: function () { return chunkQOZZJZ76_cjs.syncCollections; } }); Object.defineProperty(exports, "syncFormCollection", { enumerable: true, - get: function () { return chunk656GGECX_cjs.syncFormCollection; } + get: function () { return chunkQOZZJZ76_cjs.syncFormCollection; } }); Object.defineProperty(exports, "validateCollectionConfig", { enumerable: true, - get: function () { return chunk656GGECX_cjs.validateCollectionConfig; } + get: function () { return chunkQOZZJZ76_cjs.validateCollectionConfig; } }); Object.defineProperty(exports, "MigrationService", { enumerable: true, - get: function () { return chunkICMNCCX2_cjs.MigrationService; } + get: function () { return chunk7KR6GOY3_cjs.MigrationService; } }); Object.defineProperty(exports, "renderFilterBar", { enumerable: true, @@ -10976,27 +10976,27 @@ Object.defineProperty(exports, "renderTable", { }); Object.defineProperty(exports, "HookSystemImpl", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.HookSystemImpl; } + get: function () { return chunkZUXOAZWZ_cjs.HookSystemImpl; } }); Object.defineProperty(exports, "HookUtils", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.HookUtils; } + get: function () { return chunkZUXOAZWZ_cjs.HookUtils; } }); Object.defineProperty(exports, "PluginManagerClass", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.PluginManager; } + get: function () { return chunkZUXOAZWZ_cjs.PluginManager; } }); Object.defineProperty(exports, "PluginRegistryImpl", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.PluginRegistryImpl; } + get: function () { return chunkZUXOAZWZ_cjs.PluginRegistryImpl; } }); Object.defineProperty(exports, "PluginValidatorClass", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.PluginValidator; } + get: function () { return chunkZUXOAZWZ_cjs.PluginValidator; } }); Object.defineProperty(exports, "ScopedHookSystemClass", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.ScopedHookSystem; } + get: function () { return chunkZUXOAZWZ_cjs.ScopedHookSystem; } }); Object.defineProperty(exports, "PluginBuilder", { enumerable: true, @@ -11008,31 +11008,31 @@ Object.defineProperty(exports, "PluginHelpers", { }); Object.defineProperty(exports, "QueryFilterBuilder", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.QueryFilterBuilder; } + get: function () { return chunk74BFRAQS_cjs.QueryFilterBuilder; } }); Object.defineProperty(exports, "SONICJS_VERSION", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.SONICJS_VERSION; } + get: function () { return chunk74BFRAQS_cjs.SONICJS_VERSION; } }); Object.defineProperty(exports, "TemplateRenderer", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.TemplateRenderer; } + get: function () { return chunk74BFRAQS_cjs.TemplateRenderer; } }); Object.defineProperty(exports, "buildQuery", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.buildQuery; } + get: function () { return chunk74BFRAQS_cjs.buildQuery; } }); Object.defineProperty(exports, "getCoreVersion", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.getCoreVersion; } + get: function () { return chunk74BFRAQS_cjs.getCoreVersion; } }); Object.defineProperty(exports, "renderTemplate", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.renderTemplate; } + get: function () { return chunk74BFRAQS_cjs.renderTemplate; } }); Object.defineProperty(exports, "templateRenderer", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.templateRenderer; } + get: function () { return chunk74BFRAQS_cjs.templateRenderer; } }); Object.defineProperty(exports, "metricsTracker", { enumerable: true, diff --git a/packages/core/dist/index.cjs.map b/packages/core/dist/index.cjs.map index d7ae2d876..bb263e86a 100644 --- a/packages/core/dist/index.cjs.map +++ b/packages/core/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/core-plugins/database-tools-plugin/services/database-service.ts","../src/templates/pages/admin-database-table.template.ts","../src/plugins/core-plugins/database-tools-plugin/admin-routes.ts","../src/plugins/core-plugins/seed-data-plugin/services/seed-data-service.ts","../src/plugins/core-plugins/seed-data-plugin/admin-routes.ts","../src/plugins/core-plugins/email-plugin/index.ts","../src/plugins/core-plugins/otp-login-plugin/otp-service.ts","../src/plugins/core-plugins/otp-login-plugin/email-templates.ts","../src/plugins/core-plugins/otp-login-plugin/index.ts","../src/plugins/core-plugins/oauth-providers/oauth-service.ts","../src/plugins/core-plugins/oauth-providers/index.ts","../src/plugins/core-plugins/ai-search-plugin/services/embedding.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/chunking.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/custom-rag.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/ai-search.ts","../src/plugins/core-plugins/ai-search-plugin/services/indexer.ts","../src/plugins/core-plugins/ai-search-plugin/components/settings-page.ts","../src/plugins/core-plugins/ai-search-plugin/routes/admin.ts","../src/plugins/core-plugins/ai-search-plugin/routes/api.ts","../src/plugins/core-plugins/ai-search-plugin/manifest.json","../src/plugins/core-plugins/ai-search-plugin/index.ts","../src/plugins/available/magic-link-auth/index.ts","../src/plugins/core-plugins/security-audit-plugin/types.ts","../src/plugins/core-plugins/security-audit-plugin/services/security-audit-service.ts","../src/plugins/core-plugins/security-audit-plugin/components/dashboard-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/event-log-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/settings-page.ts","../src/plugins/core-plugins/security-audit-plugin/routes/admin.ts","../src/plugins/core-plugins/security-audit-plugin/services/brute-force-detector.ts","../src/plugins/core-plugins/security-audit-plugin/routes/api.ts","../src/plugins/core-plugins/security-audit-plugin/middleware/audit-middleware.ts","../src/plugins/core-plugins/security-audit-plugin/index.ts","../src/plugins/core-plugins/stripe-plugin/services/subscription-service.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-event-service.ts","../src/plugins/core-plugins/stripe-plugin/components/subscriptions-page.ts","../src/plugins/core-plugins/stripe-plugin/components/tab-bar.ts","../src/plugins/core-plugins/stripe-plugin/components/events-page.ts","../src/plugins/core-plugins/stripe-plugin/types.ts","../src/plugins/core-plugins/stripe-plugin/routes/admin.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-api.ts","../src/plugins/core-plugins/stripe-plugin/routes/api.ts","../src/plugins/core-plugins/stripe-plugin/index.ts","../src/middleware/plugin-menu.ts","../src/plugins/types.ts","../src/plugins/core-plugins/analytics/routes/admin.ts","../src/plugins/core-plugins/analytics/index.ts","../src/plugins/core-plugins/analytics/services/event-tracking-service.ts","../src/plugins/core-plugins/analytics/routes/api.ts","../src/plugins/cache/services/cache-config.ts","../src/plugins/cache/services/cache.ts","../src/plugins/cache/services/event-bus.ts","../src/plugins/cache/services/cache-invalidation.ts","../src/plugins/cache/services/cache-warming.ts","../src/templates/pages/admin-cache.template.ts","../src/plugins/cache/routes.ts","../src/plugins/cache/index.ts","../src/assets/favicon.ts","../src/app.ts","../src/db/index.ts","../src/index.ts"],"names":["init_admin_layout_catalyst_template","escapeHtml","renderAdminLayoutCatalyst","router","Hono","requireAuth","PluginBuilder","plugin","z","SettingsService","emailPlugin","getJwtExpirySecondsFromDb","AuthManager","setCookie","getCustomData","getCookie","tokenTtl","jwt","content","collections","statusBadge","renderAdminLayout","api_default","DEFAULT_SETTINGS","formatTimestamp","severityBadge","eventTypeBadge","adminRoutes","PluginService","apiRoutes","getSettings","isPluginActive","logPromise","renderPagination","PLUGIN_REGISTRY","HOOKS","PluginHelpers","media","renderConfirmationDialog","getConfirmationDialogScript","totalRequests","app","getCoreVersion","metricsMiddleware","bootstrapMiddleware","securityHeadersMiddleware","csrfProtection","requireRole","api_media_default","api_system_default","admin_api_default","adminCollectionsRoutes","adminFormsRoutes","adminSettingsRoutes","public_forms_default","admin_content_default","adminMediaRoutes","userProfilesPlugin","adminPluginRoutes","adminLogsRoutes","userRoutes","auth_default","test_cleanup_default","setAppInstance","d1","drizzle","schema_exports","package_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import { D1Database } from '@cloudflare/workers-types'\n\nexport interface TruncateResult {\n success: boolean\n message: string\n tablesCleared: string[]\n adminUserPreserved: boolean\n errors?: string[]\n}\n\nexport interface DatabaseStats {\n tables: Array<{\n name: string\n rowCount: number\n }>\n totalRows: number\n}\n\nexport interface TableData {\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n}\n\nexport class DatabaseToolsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get database statistics\n */\n async getDatabaseStats(): Promise {\n const tables = await this.getTables()\n const stats: DatabaseStats = {\n tables: [],\n totalRows: 0\n }\n\n for (const tableName of tables) {\n try {\n const result = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const rowCount = (result?.count as number) || 0\n \n stats.tables.push({\n name: tableName,\n rowCount\n })\n stats.totalRows += rowCount\n } catch (error) {\n // Skip tables that can't be counted (might be views or system tables)\n console.warn(`Could not count rows in table ${tableName}:`, error)\n }\n }\n\n return stats\n }\n\n /**\n * Get all tables in the database\n */\n private async getTables(): Promise {\n const result = await this.db.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='table' \n AND name NOT LIKE 'sqlite_%'\n ORDER BY name\n `).all()\n\n return result.results?.map((row: any) => row.name) || []\n }\n\n /**\n * Truncate all data except admin user\n */\n async truncateAllData(adminEmail: string): Promise {\n const errors: string[] = []\n const tablesCleared: string[] = []\n let adminUserPreserved = false\n\n try {\n // First, preserve the admin user data\n const adminUser = await this.db.prepare(\n 'SELECT * FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n if (!adminUser) {\n return {\n success: false,\n message: 'Admin user not found. Operation cancelled for safety.',\n tablesCleared: [],\n adminUserPreserved: false,\n errors: ['Admin user not found']\n }\n }\n\n // Define tables to truncate (excluding system tables)\n const tablesToTruncate = [\n 'content',\n 'content_versions', \n 'content_workflow_status',\n 'collections',\n 'media',\n 'sessions',\n 'notifications',\n 'api_tokens',\n 'workflow_history',\n 'scheduled_content',\n 'faqs',\n 'faq_categories',\n 'plugins',\n 'plugin_settings',\n 'email_templates',\n 'email_themes'\n ]\n\n // Check which tables exist\n const existingTables = await this.getTables()\n const tablesToClear = tablesToTruncate.filter(table => \n existingTables.includes(table)\n )\n\n // Clear all data except users table\n for (const tableName of tablesToClear) {\n try {\n await this.db.prepare(`DELETE FROM ${tableName}`).run()\n tablesCleared.push(tableName)\n } catch (error) {\n errors.push(`Failed to clear table ${tableName}: ${error}`)\n console.error(`Error clearing table ${tableName}:`, error)\n }\n }\n\n // Clear users table but preserve admin\n try {\n await this.db.prepare('DELETE FROM users WHERE email != ? OR role != ?')\n .bind(adminEmail, 'admin').run()\n \n // Verify admin user still exists\n const verifyAdmin = await this.db.prepare(\n 'SELECT id FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n adminUserPreserved = !!verifyAdmin\n tablesCleared.push('users (non-admin)')\n } catch (error) {\n errors.push(`Failed to clear non-admin users: ${error}`)\n console.error('Error clearing non-admin users:', error)\n }\n\n // Reset auto-increment counters if supported\n try {\n await this.db.prepare('DELETE FROM sqlite_sequence').run()\n } catch (error) {\n // sqlite_sequence might not exist, ignore\n }\n\n const message = errors.length > 0 \n ? `Truncation completed with ${errors.length} errors. ${tablesCleared.length} tables cleared.`\n : `Successfully truncated database. ${tablesCleared.length} tables cleared.`\n\n return {\n success: errors.length === 0,\n message,\n tablesCleared,\n adminUserPreserved,\n errors: errors.length > 0 ? errors : undefined\n }\n\n } catch (error) {\n return {\n success: false,\n message: `Database truncation failed: ${error}`,\n tablesCleared,\n adminUserPreserved,\n errors: [String(error)]\n }\n }\n }\n\n /**\n * Create a backup of current data (simplified version)\n */\n async createBackup(): Promise<{ success: boolean; message: string; backupId?: string }> {\n try {\n const backupId = `backup_${Date.now()}`\n const stats = await this.getDatabaseStats()\n \n // In a real implementation, this would export data to a file or cloud storage\n // For now, we'll just log the stats and return success\n console.log(`Backup ${backupId} created with ${stats.totalRows} total rows`)\n \n return {\n success: true,\n message: `Backup created successfully (${stats.totalRows} rows)`,\n backupId\n }\n } catch (error) {\n return {\n success: false,\n message: `Backup failed: ${error}`\n }\n }\n }\n\n /**\n * Get table data with optional pagination and sorting\n */\n async getTableData(\n tableName: string,\n limit: number = 100,\n offset: number = 0,\n sortColumn?: string,\n sortDirection: 'asc' | 'desc' = 'asc'\n ): Promise {\n try {\n // Validate table name to prevent SQL injection\n const tables = await this.getTables()\n if (!tables.includes(tableName)) {\n throw new Error(`Table ${tableName} not found`)\n }\n\n // Get column names\n const pragmaResult = await this.db.prepare(`PRAGMA table_info(${tableName})`).all()\n const columns = pragmaResult.results?.map((col: any) => col.name) || []\n\n // Validate sort column if provided\n if (sortColumn && !columns.includes(sortColumn)) {\n sortColumn = undefined\n }\n\n // Get total row count\n const countResult = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const totalRows = (countResult?.count as number) || 0\n\n // Build query with optional sorting\n let query = `SELECT * FROM ${tableName}`\n if (sortColumn) {\n query += ` ORDER BY ${sortColumn} ${sortDirection.toUpperCase()}`\n }\n query += ` LIMIT ${limit} OFFSET ${offset}`\n\n // Get paginated data\n const dataResult = await this.db.prepare(query).all()\n\n return {\n tableName,\n columns,\n rows: dataResult.results || [],\n totalRows\n }\n } catch (error) {\n throw new Error(`Failed to fetch table data: ${error}`)\n }\n }\n\n /**\n * Validate database integrity\n */\n async validateDatabase(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n try {\n // Check critical tables exist\n const requiredTables = ['users', 'content', 'collections']\n const existingTables = await this.getTables()\n\n for (const table of requiredTables) {\n if (!existingTables.includes(table)) {\n issues.push(`Critical table missing: ${table}`)\n }\n }\n\n // Check admin user exists\n const adminCount = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM users WHERE role = ?'\n ).bind('admin').first()\n\n if ((adminCount?.count as number) === 0) {\n issues.push('No admin users found')\n }\n\n // Run SQLite integrity check\n try {\n const integrityResult = await this.db.prepare('PRAGMA integrity_check').first()\n if (integrityResult && (integrityResult as any).integrity_check !== 'ok') {\n issues.push(`Database integrity check failed: ${(integrityResult as any).integrity_check}`)\n }\n } catch (error) {\n issues.push(`Could not run integrity check: ${error}`)\n }\n\n } catch (error) {\n issues.push(`Validation error: ${error}`)\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface DatabaseTablePageData {\n user?: {\n name: string\n email: string\n role: string\n }\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n currentPage: number\n pageSize: number\n sortColumn?: string\n sortDirection?: 'asc' | 'desc'\n}\n\nexport function renderDatabaseTablePage(data: DatabaseTablePageData): string {\n const totalPages = Math.ceil(data.totalRows / data.pageSize)\n const startRow = (data.currentPage - 1) * data.pageSize + 1\n const endRow = Math.min(data.currentPage * data.pageSize, data.totalRows)\n\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n Back to Database Tools\n \n
\n

Table: ${data.tableName}

\n

\n Showing ${startRow.toLocaleString()} - ${endRow.toLocaleString()} of ${data.totalRows.toLocaleString()} rows\n

\n
\n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Refresh\n \n
\n
\n\n \n
\n \n
\n \n \n \n ${data.columns.map(col => `\n \n
\n ${col}\n ${data.sortColumn === col ? `\n \n \n \n ` : `\n \n \n \n `}\n
\n \n `).join('')}\n
\n \n \n ${data.rows.length > 0\n ? data.rows.map((row, idx) => `\n \n ${data.columns.map(col => `\n \n `).join('')}\n \n `).join('')\n : `\n \n \n \n `\n }\n \n
\n ${formatCellValue(row[col])}\n
\n \n \n \n

No data in this table

\n
\n
\n\n \n ${totalPages > 1 ? `\n
\n
\n \n Previous\n \n \n Next\n \n
\n
\n
\n

\n Page ${data.currentPage} of ${totalPages}\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Table: ${data.tableName}`,\n pageTitle: `Database: ${data.tableName}`,\n currentPath: `/admin/database-tools/tables/${data.tableName}`,\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction generatePageNumbers(currentPage: number, totalPages: number): string {\n const pages: number[] = []\n const maxVisible = 7\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (currentPage <= 4) {\n for (let i = 1; i <= 5; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n } else if (currentPage >= totalPages - 3) {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = totalPages - 4; i <= totalPages; i++) pages.push(i)\n } else {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n }\n }\n\n return pages.map(page => {\n if (page === -1) {\n return `\n \n ...\n \n `\n }\n\n const isActive = page === currentPage\n return `\n \n ${page}\n \n `\n }).join('')\n}\n\nfunction escapeHtml(text: string): string {\n const map: Record = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }\n return String(text).replace(/[&<>\"']/g, m => map[m] || m)\n}\n\nfunction formatCellValue(value: any): string {\n if (value === null || value === undefined) {\n return 'null'\n }\n if (typeof value === 'boolean') {\n return `${value}`\n }\n if (typeof value === 'object') {\n return '' + JSON.stringify(value).substring(0, 50) + (JSON.stringify(value).length > 50 ? '...' : '') + ''\n }\n const str = String(value)\n if (str.length > 100) {\n return escapeHtml(str.substring(0, 100)) + '...'\n }\n return escapeHtml(str)\n}\n","import { Hono } from 'hono'\nimport { DatabaseToolsService } from './services/database-service'\nimport { renderDatabaseTablePage, DatabaseTablePageData } from '../../../templates/pages/admin-database-table.template'\nimport { requireAuth } from '../../../middleware'\n\ntype Bindings = {\n DB: D1Database\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport function createDatabaseToolsAdminRoutes() {\n const router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Apply authentication middleware\n router.use('*', requireAuth())\n\n // Get database statistics\n router.get('/api/stats', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const stats = await service.getDatabaseStats()\n\n return c.json({\n success: true,\n data: stats\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({ \n success: false, \n error: 'Failed to fetch database statistics' \n }, 500)\n }\n })\n\n // Truncate all data except admin user\n router.post('/api/truncate', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const body = await c.req.json()\n const { confirmText } = body\n\n // Require confirmation text for safety\n if (confirmText !== 'TRUNCATE ALL DATA') {\n return c.json({\n success: false,\n error: 'Invalid confirmation text. Operation cancelled.'\n }, 400)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.truncateAllData(user.email)\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n tablesCleared: result.tablesCleared,\n adminUserPreserved: result.adminUserPreserved,\n errors: result.errors\n }\n })\n } catch (error) {\n console.error('Error truncating database:', error)\n return c.json({ \n success: false, \n error: 'Failed to truncate database' \n }, 500)\n }\n })\n\n // Create backup\n router.post('/api/backup', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.createBackup()\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n backupId: result.backupId\n }\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({ \n success: false, \n error: 'Failed to create backup' \n }, 500)\n }\n })\n\n // Validate database\n router.get('/api/validate', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const validation = await service.validateDatabase()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n })\n\n // Get table data (API endpoint)\n router.get('/api/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const tableName = c.req.param('tableName')\n const limit = parseInt(c.req.query('limit') || '100')\n const offset = parseInt(c.req.query('offset') || '0')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, limit, offset, sortColumn, sortDirection)\n\n return c.json({\n success: true,\n data: tableData\n })\n } catch (error) {\n console.error('Error fetching table data:', error)\n return c.json({\n success: false,\n error: `Failed to fetch table data: ${error}`\n }, 500)\n }\n })\n\n // View table data page\n router.get('/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.redirect('/admin/login')\n }\n\n const tableName = c.req.param('tableName')\n const page = parseInt(c.req.query('page') || '1')\n const pageSize = parseInt(c.req.query('pageSize') || '20')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const offset = (page - 1) * pageSize\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, pageSize, offset, sortColumn, sortDirection)\n\n const pageData: DatabaseTablePageData = {\n user: {\n name: user.email.split('@')[0] || 'Unknown',\n email: user.email,\n role: user.role\n },\n tableName: tableData.tableName,\n columns: tableData.columns,\n rows: tableData.rows,\n totalRows: tableData.totalRows,\n currentPage: page,\n pageSize: pageSize,\n sortColumn: sortColumn,\n sortDirection: sortDirection\n }\n\n return c.html(renderDatabaseTablePage(pageData))\n } catch (error) {\n console.error('Error rendering table page:', error)\n return c.text(`Error: ${error}`, 500)\n }\n })\n\n return router\n}","import type { D1Database } from '@cloudflare/workers-types'\n\nexport class SeedDataService {\n constructor(private db: D1Database) {}\n\n // First names for generating realistic users\n private firstNames = [\n 'Emma', 'Liam', 'Olivia', 'Noah', 'Ava', 'Ethan', 'Sophia', 'Mason',\n 'Isabella', 'William', 'Mia', 'James', 'Charlotte', 'Benjamin', 'Amelia',\n 'Lucas', 'Harper', 'Henry', 'Evelyn', 'Alexander'\n ]\n\n // Last names for generating realistic users\n private lastNames = [\n 'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis',\n 'Rodriguez', 'Martinez', 'Hernandez', 'Lopez', 'Gonzalez', 'Wilson', 'Anderson',\n 'Thomas', 'Taylor', 'Moore', 'Jackson', 'Martin'\n ]\n\n // Content titles for blog posts\n private blogTitles = [\n 'Getting Started with Modern Web Development',\n 'The Future of JavaScript Frameworks',\n 'Building Scalable Applications with Microservices',\n 'Understanding TypeScript: A Complete Guide',\n 'Best Practices for API Design',\n 'Introduction to Cloud Computing',\n 'Mastering Git and Version Control',\n 'The Art of Code Review',\n 'Performance Optimization Techniques',\n 'Security Best Practices for Web Apps',\n 'Exploring Serverless Architecture',\n 'Database Design Fundamentals',\n 'Testing Strategies for Modern Apps',\n 'CI/CD Pipeline Implementation',\n 'Mobile-First Development Approach'\n ]\n\n // Content titles for pages\n private pageTitles = [\n 'About Us', 'Contact', 'Privacy Policy', 'Terms of Service',\n 'FAQ', 'Our Team', 'Careers', 'Press Kit',\n 'Support', 'Documentation', 'Pricing', 'Features'\n ]\n\n // Content titles for products\n private productTitles = [\n 'Premium Wireless Headphones',\n 'Smart Watch Pro',\n 'Laptop Stand Adjustable',\n 'Mechanical Keyboard RGB',\n 'HD Webcam 4K',\n 'USB-C Hub 7-in-1',\n 'Portable SSD 1TB',\n 'Wireless Mouse Ergonomic',\n 'Monitor 27\" 4K',\n 'Desk Lamp LED',\n 'Phone Case Premium',\n 'Tablet Stand Aluminum',\n 'Cable Management Kit',\n 'Power Bank 20000mAh',\n 'Bluetooth Speaker Portable'\n ]\n\n // Content for generating blog posts\n private blogContent = [\n 'This comprehensive guide covers everything you need to know about modern development practices and tools.',\n 'Learn the fundamentals and advanced concepts that will help you build better applications.',\n 'Discover the latest trends and best practices used by industry professionals.',\n 'A deep dive into the technologies and methodologies shaping the future of software development.',\n 'Practical tips and real-world examples to improve your development workflow.',\n 'Explore cutting-edge techniques and proven strategies for building robust applications.',\n 'Master the essential skills needed to excel in modern software development.',\n 'An in-depth look at the tools and frameworks that power today\\'s web applications.',\n 'Step-by-step instructions and expert insights for developers of all levels.',\n 'Understanding the core principles that drive successful software projects.'\n ]\n\n // Generate a random ID\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n\n // Generate a slug from a title\n private generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n }\n\n // Generate random date within the last year\n private randomDate(): Date {\n const now = new Date()\n const yearAgo = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate())\n const randomTime = yearAgo.getTime() + Math.random() * (now.getTime() - yearAgo.getTime())\n return new Date(randomTime)\n }\n\n // Create 20 example users\n async createUsers(): Promise {\n const roles = ['admin', 'editor', 'author', 'viewer']\n // const hashedPassword = await bcrypt.hash('password123', 10)\n const hashedPassword = 'password123' // TODO: Use actual bcrypt hash\n\n let count = 0\n for (let i = 0; i < 20; i++) {\n const firstName = this.firstNames[Math.floor(Math.random() * this.firstNames.length)] || 'John'\n const lastName = this.lastNames[Math.floor(Math.random() * this.lastNames.length)] || 'Doe'\n const username = `${firstName.toLowerCase()}${lastName.toLowerCase()}${i}`\n const email = `${username}@example.com`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n\n const stmt = this.db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, last_login_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n email,\n username,\n firstName,\n lastName,\n hashedPassword,\n roles[Math.floor(Math.random() * roles.length)],\n Math.random() > 0.1 ? 1 : 0, // 90% active\n Math.random() > 0.3 ? createdAtTimestamp : null,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Create 200 content items across different types\n async createContent(): Promise {\n // Get all users and collections\n const usersStmt = this.db.prepare('SELECT * FROM users')\n const { results: allUsers } = await usersStmt.all()\n\n const collectionsStmt = this.db.prepare('SELECT * FROM collections')\n const { results: allCollections } = await collectionsStmt.all()\n\n if (!allUsers || allUsers.length === 0) {\n throw new Error('No users found. Please create users first.')\n }\n\n if (!allCollections || allCollections.length === 0) {\n throw new Error('No collections found. Please create collections first.')\n }\n\n const statuses = ['draft', 'published', 'archived']\n\n // Create 200 content items\n let count = 0\n for (let i = 0; i < 200; i++) {\n const collection: any = allCollections[Math.floor(Math.random() * allCollections.length)]\n const author: any = allUsers[Math.floor(Math.random() * allUsers.length)]\n const status = statuses[Math.floor(Math.random() * statuses.length)]\n\n let title: string\n let contentData: any\n\n // Generate content based on collection type\n if (collection.name === 'blog_posts' || collection.name.includes('blog')) {\n title = this.blogTitles[Math.floor(Math.random() * this.blogTitles.length)] || 'Untitled Blog Post'\n contentData = {\n body: this.blogContent[Math.floor(Math.random() * this.blogContent.length)] || 'Blog content here',\n excerpt: 'A brief introduction to this article that provides an overview of the main topics covered.',\n tags: this.generateTags(),\n featured: Math.random() > 0.7\n }\n } else if (collection.name === 'pages' || collection.name.includes('page')) {\n title = this.pageTitles[Math.floor(Math.random() * this.pageTitles.length)] || 'Untitled Page'\n contentData = {\n body: 'This is a standard page with important information about our services and policies.',\n template: 'default',\n showInMenu: Math.random() > 0.5\n }\n } else if (collection.name === 'products' || collection.name.includes('product')) {\n title = this.productTitles[Math.floor(Math.random() * this.productTitles.length)] || 'Untitled Product'\n contentData = {\n description: 'High-quality product with excellent features and great value for money.',\n price: (Math.random() * 500 + 10).toFixed(2),\n sku: `SKU-${Math.random().toString(36).substr(2, 9).toUpperCase()}`,\n inStock: Math.random() > 0.2,\n rating: (Math.random() * 2 + 3).toFixed(1) // 3.0 - 5.0\n }\n } else {\n // Generic content\n title = `${collection.display_name || collection.name} Item ${i + 1}`\n contentData = {\n description: 'This is a sample content item with generic data.',\n value: Math.floor(Math.random() * 1000)\n }\n }\n\n const slug = `${this.generateSlug(title)}-${i}`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n const publishedAtTimestamp = status === 'published' ? createdAtTimestamp : null\n\n const stmt = this.db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, published_at, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n collection.id,\n slug,\n `${title} ${i}`,\n JSON.stringify(contentData),\n status,\n publishedAtTimestamp,\n author.id,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Generate random tags for blog posts\n private generateTags(): string[] {\n const allTags = [\n 'tutorial', 'guide', 'javascript', 'typescript', 'web-dev',\n 'backend', 'frontend', 'best-practices', 'security', 'performance',\n 'testing', 'deployment', 'cloud', 'database', 'api'\n ]\n\n const numTags = Math.floor(Math.random() * 4) + 1 // 1-4 tags\n const shuffled = allTags.sort(() => 0.5 - Math.random())\n return shuffled.slice(0, numTags)\n }\n\n // Seed all data\n async seedAll(): Promise<{ users: number; content: number }> {\n const userCount = await this.createUsers()\n const contentCount = await this.createContent()\n\n return {\n users: userCount,\n content: contentCount\n }\n }\n\n // Clear all seed data (optional cleanup method)\n async clearSeedData(): Promise {\n // Delete content first (due to foreign key constraints)\n const deleteContentStmt = this.db.prepare('DELETE FROM content')\n await deleteContentStmt.run()\n\n // Delete users (but keep admin users)\n const deleteUsersStmt = this.db.prepare(\n \"DELETE FROM users WHERE role != 'admin'\"\n )\n await deleteUsersStmt.run()\n }\n}\n","import { Hono } from 'hono'\nimport { SeedDataService } from './services/seed-data-service'\n\ntype Bindings = {\n DB: D1Database\n}\n\nexport function createSeedDataAdminRoutes() {\n const routes = new Hono<{ Bindings: Bindings }>()\n\n // Get seed data status/info\n routes.get('/', async (c) => {\n const html = `\n \n \n \n Seed Data - SonicJS Admin\n \n \n \n \n \n
\n ← Back to Plugin Settings\n

🌱 Seed Data Generator

\n

\n Generate realistic example data for testing and development. This will create 20 users and 200 content items with realistic data.\n

\n\n
\n ⚠️ Warning: This will create new data in your database. Make sure you're not running this in production!\n
\n\n
\n
\n\n
\n

What will be created?

\n
    \n
  • 20 Users: With realistic names, emails, and various roles (admin, editor, author, viewer)
  • \n
  • 200 Content Items: Including blog posts, pages, and products with realistic titles and data
  • \n
  • All passwords: Set to \"password123\" for testing
  • \n
  • Random dates: Created within the last year
  • \n
  • Various statuses: Draft, published, and archived content
  • \n
\n
\n\n
\n

Generate Seed Data

\n

Click the button below to generate example data. This may take a few moments.

\n \n
\n\n
\n

Clear Seed Data

\n

Remove all users and content from the database (except admin users).

\n \n
\n
\n\n \n \n \n `\n return c.html(html)\n })\n\n // Generate seed data\n routes.post('/generate', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n const result = await seedService.seedAll()\n\n return c.json({\n success: true,\n users: result.users,\n content: result.content\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n // Clear seed data\n routes.post('/clear', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n await seedService.clearSeedData()\n\n return c.json({\n success: true\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n return routes\n}\n","/**\n * Email Plugin\n *\n * Send transactional emails using Resend\n * Handles registration, verification, password reset, and one-time codes\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\nexport function createEmailPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'email',\n version: '1.0.0-beta.1',\n description: 'Send transactional emails using Resend'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Create the Email Settings route (POST only - GET is handled by generic plugin settings page)\n const emailRoutes = new Hono()\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // POST endpoint for saving settings\n emailRoutes.post('/settings', async (c: any) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n // Update plugin settings in database\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'email'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving email settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n })\n\n // POST endpoint for test email\n emailRoutes.post('/test', async (c: any) => {\n try {\n const db = c.env.DB\n const body = await c.req.json()\n\n // Load settings from database\n const plugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (!plugin?.settings) {\n return c.json({\n success: false,\n error: 'Email settings not configured. Please save your settings first.'\n }, 400)\n }\n\n const settings = JSON.parse(plugin.settings)\n\n // Validate required settings\n if (!settings.apiKey || !settings.fromEmail || !settings.fromName) {\n return c.json({\n success: false,\n error: 'Missing required settings. Please configure API Key, From Email, and From Name.'\n }, 400)\n }\n\n // Use provided email or fallback to fromEmail\n const toEmail = body.toEmail || settings.fromEmail\n\n // Validate email format\n if (!toEmail.match(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)) {\n return c.json({\n success: false,\n error: 'Invalid email address format'\n }, 400)\n }\n\n // Send test email via Resend API\n const response = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${settings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${settings.fromName} <${settings.fromEmail}>`,\n to: [toEmail],\n subject: 'Test Email from SonicJS',\n html: `\n
\n

Test Email Successful! 🎉

\n

This is a test email from your SonicJS Email plugin.

\n

Configuration:

\n
    \n
  • From: ${settings.fromName} <${settings.fromEmail}>
  • \n
  • Reply-To: ${settings.replyTo || 'Not set'}
  • \n
  • Sent at: ${new Date().toISOString()}
  • \n
\n

Your email settings are working correctly!

\n
\n `,\n reply_to: settings.replyTo || settings.fromEmail\n })\n })\n\n const data = await response.json() as any\n\n if (!response.ok) {\n console.error('Resend API error:', data)\n return c.json({\n success: false,\n error: data.message || 'Failed to send test email. Check your API key and domain verification.'\n }, response.status)\n }\n\n return c.json({\n success: true,\n message: `Test email sent successfully to ${toEmail}`,\n emailId: data.id\n })\n\n } catch (error: any) {\n console.error('Test email error:', error)\n return c.json({\n success: false,\n error: error.message || 'An error occurred while sending test email'\n }, 500)\n }\n })\n\n // Register the route\n builder.addRoute('/admin/plugins/email', emailRoutes, {\n description: 'Email plugin settings',\n requiresAuth: true,\n priority: 80\n })\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('Email', '/admin/plugins/email', {\n icon: 'envelope',\n order: 80,\n permissions: ['email:manage']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Email plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Email plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const emailPlugin = createEmailPlugin()\n","/**\n * OTP Service\n * Handles OTP code generation, verification, and management\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\nexport interface OTPSettings {\n codeLength: number\n codeExpiryMinutes: number\n maxAttempts: number\n rateLimitPerHour: number\n allowNewUserRegistration: boolean\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nexport interface OTPCode {\n id: string\n user_email: string\n code: string\n expires_at: number\n used: number\n used_at: number | null\n ip_address: string | null\n user_agent: string | null\n attempts: number\n created_at: number\n}\n\nexport class OTPService {\n constructor(private db: D1Database) {}\n\n /**\n * Generate a secure random OTP code\n */\n generateCode(length: number = 6): string {\n const digits = '0123456789'\n let code = ''\n\n for (let i = 0; i < length; i++) {\n const randomValues = new Uint8Array(1)\n crypto.getRandomValues(randomValues)\n const randomValue = randomValues[0] ?? 0\n code += digits[randomValue % digits.length]\n }\n\n return code\n }\n\n /**\n * Create and store a new OTP code\n */\n async createOTPCode(\n email: string,\n settings: OTPSettings,\n ipAddress?: string,\n userAgent?: string\n ): Promise {\n const code = this.generateCode(settings.codeLength)\n const id = crypto.randomUUID()\n const now = Date.now()\n const expiresAt = now + (settings.codeExpiryMinutes * 60 * 1000)\n\n const otpCode: OTPCode = {\n id,\n user_email: email.toLowerCase(),\n code,\n expires_at: expiresAt,\n used: 0,\n used_at: null,\n ip_address: ipAddress || null,\n user_agent: userAgent || null,\n attempts: 0,\n created_at: now\n }\n\n await this.db.prepare(`\n INSERT INTO otp_codes (\n id, user_email, code, expires_at, used, used_at,\n ip_address, user_agent, attempts, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n otpCode.id,\n otpCode.user_email,\n otpCode.code,\n otpCode.expires_at,\n otpCode.used,\n otpCode.used_at,\n otpCode.ip_address,\n otpCode.user_agent,\n otpCode.attempts,\n otpCode.created_at\n ).run()\n\n return otpCode\n }\n\n /**\n * Verify an OTP code\n */\n async verifyCode(\n email: string,\n code: string,\n settings: OTPSettings\n ): Promise<{ valid: boolean; attemptsRemaining?: number; error?: string }> {\n const normalizedEmail = email.toLowerCase()\n const now = Date.now()\n\n // Find the most recent unused code for this email\n const otpCode = await this.db.prepare(`\n SELECT * FROM otp_codes\n WHERE user_email = ? AND code = ? AND used = 0\n ORDER BY created_at DESC\n LIMIT 1\n `).bind(normalizedEmail, code).first() as OTPCode | null\n\n if (!otpCode) {\n return { valid: false, error: 'Invalid or expired code' }\n }\n\n // Check if expired\n if (now > otpCode.expires_at) {\n return { valid: false, error: 'Code has expired' }\n }\n\n // Check attempts\n if (otpCode.attempts >= settings.maxAttempts) {\n return { valid: false, error: 'Maximum attempts exceeded' }\n }\n\n // Code is valid - mark as used\n await this.db.prepare(`\n UPDATE otp_codes\n SET used = 1, used_at = ?, attempts = attempts + 1\n WHERE id = ?\n `).bind(now, otpCode.id).run()\n\n return { valid: true }\n }\n\n /**\n * Increment failed attempt count\n */\n async incrementAttempts(email: string, code: string): Promise {\n const normalizedEmail = email.toLowerCase()\n\n const result = await this.db.prepare(`\n UPDATE otp_codes\n SET attempts = attempts + 1\n WHERE user_email = ? AND code = ? AND used = 0\n RETURNING attempts\n `).bind(normalizedEmail, code).first() as { attempts: number } | null\n\n return result?.attempts || 0\n }\n\n /**\n * Check rate limiting\n */\n async checkRateLimit(email: string, settings: OTPSettings): Promise {\n const normalizedEmail = email.toLowerCase()\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n\n const result = await this.db.prepare(`\n SELECT COUNT(*) as count\n FROM otp_codes\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as { count: number } | null\n\n const count = result?.count || 0\n return count < settings.rateLimitPerHour\n }\n\n /**\n * Get recent OTP requests for activity log\n */\n async getRecentRequests(limit: number = 50): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM otp_codes\n ORDER BY created_at DESC\n LIMIT ?\n `).bind(limit).all()\n\n const rows = (result.results || []) as Record[]\n return rows.map(row => this.mapRowToOTP(row))\n }\n\n /**\n * Clean up expired codes (for maintenance)\n */\n async cleanupExpiredCodes(): Promise {\n const now = Date.now()\n\n const result = await this.db.prepare(`\n DELETE FROM otp_codes\n WHERE expires_at < ? OR (used = 1 AND used_at < ?)\n `).bind(now, now - (30 * 24 * 60 * 60 * 1000)).run() // Keep used codes for 30 days\n\n return result.meta.changes || 0\n }\n\n private mapRowToOTP(row: Record): OTPCode {\n return {\n id: String(row.id),\n user_email: String(row.user_email),\n code: String(row.code),\n expires_at: Number(row.expires_at ?? Date.now()),\n used: Number(row.used ?? 0),\n used_at: row.used_at === null || row.used_at === undefined ? null : Number(row.used_at),\n ip_address: typeof row.ip_address === 'string' ? row.ip_address : null,\n user_agent: typeof row.user_agent === 'string' ? row.user_agent : null,\n attempts: Number(row.attempts ?? 0),\n created_at: Number(row.created_at ?? Date.now())\n }\n }\n\n /**\n * Get OTP statistics\n */\n async getStats(days: number = 7): Promise<{\n total: number\n successful: number\n failed: number\n expired: number\n }> {\n const since = Date.now() - (days * 24 * 60 * 60 * 1000)\n\n const stats = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as successful,\n SUM(CASE WHEN attempts >= 3 AND used = 0 THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN expires_at < ? AND used = 0 THEN 1 ELSE 0 END) as expired\n FROM otp_codes\n WHERE created_at > ?\n `).bind(Date.now(), since).first() as any\n\n return {\n total: stats?.total || 0,\n successful: stats?.successful || 0,\n failed: stats?.failed || 0,\n expired: stats?.expired || 0\n }\n }\n}\n","/**\n * OTP Email Templates\n * HTML and plain text templates for OTP codes\n */\n\nexport interface OTPEmailData {\n code: string\n expiryMinutes: number\n codeLength: number\n maxAttempts: number\n email: string\n ipAddress?: string\n timestamp: string\n appName: string\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nfunction sanitizeColor(value?: string): string {\n if (!value) return ''\n // Allow #rgb, #rrggbb, #rrggbbaa, named colors, rgb()/rgba()/hsl()/hsla()\n if (/^#[0-9a-fA-F]{3,8}$/.test(value)) return value\n if (/^[a-zA-Z]+$/.test(value)) return value\n if (/^(rgb|rgba|hsl|hsla)\\([0-9.,\\s%]+\\)$/.test(value)) return value\n return ''\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport function renderOTPEmailHTML(data: OTPEmailData): string {\n const logoUrl = data.logoUrl ? escapeHtml(data.logoUrl) : ''\n const loginUrl = data.loginUrl ? escapeHtml(data.loginUrl) : ''\n const appName = escapeHtml(data.appName)\n const loginButtonText = escapeHtml(\n (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n )\n const logoWidth = Math.max(20, Math.min(600, Number(data.logoWidth) || 150))\n const logoBorderWidth = Math.max(0, Math.min(20, Number(data.logoBorderWidth) || 0))\n const logoBorderColor = sanitizeColor(data.logoBorderColor)\n const logoBorderStyle = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${logoBorderColor}; border-radius: 8px;`\n : ''\n\n return `\n\n\n \n \n Your Login Code\n\n\n\n
\n\n ${logoUrl ? `\n
\n \"${appName}\"\n
\n ` : ''}\n\n
\n

Your Login Code

\n

Enter this code to sign in to ${appName}

\n
\n\n
\n
\n
\n ${data.code}\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${data.expiryMinutes} minutes\n

\n
\n\n
\n

Quick Tips:

\n
    \n
  • Enter the code exactly as shown (${data.codeLength} digits)
  • \n
  • The code can only be used once
  • \n
  • You have ${data.maxAttempts} attempts to enter the correct code
  • \n
  • Request a new code if this one expires
  • \n
\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${appName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n\n
\n

\n Didn't request this code?
\n Someone may have entered your email by mistake. You can safely ignore this email.\n

\n\n
\n

This email was sent to ${escapeHtml(data.email)}

\n ${data.ipAddress ? `

IP Address: ${escapeHtml(data.ipAddress)}

` : ''}\n

Time: ${escapeHtml(data.timestamp)}

\n
\n
\n\n
\n\n
\n

© ${new Date().getFullYear()} ${appName}. All rights reserved.

\n
\n\n\n`\n}\n\nexport function renderOTPEmailText(data: OTPEmailData): string {\n const ctaLabel = (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n return `Your Login Code for ${data.appName}\n\nYour one-time verification code is:\n\n${data.code}\n\nThis code expires in ${data.expiryMinutes} minutes.\n${data.loginUrl ? `\\n${ctaLabel}: ${data.loginUrl}\\n` : ''}\n\nQuick Tips:\n• Enter the code exactly as shown (${data.codeLength} digits)\n• The code can only be used once\n• You have ${data.maxAttempts} attempts to enter the correct code\n• Request a new code if this one expires\n\nSecurity Notice:\nNever share this code with anyone. ${data.appName} will never ask you for this code via phone, email, or social media.\n\nDidn't request this code?\nSomeone may have entered your email by mistake. You can safely ignore this email.\n\n---\nThis email was sent to ${data.email}\n${data.ipAddress ? `IP Address: ${data.ipAddress}` : ''}\nTime: ${data.timestamp}\n\n© ${new Date().getFullYear()} ${data.appName}. All rights reserved.`\n}\n\nexport function renderOTPEmail(data: OTPEmailData): { html: string; text: string } {\n return {\n html: renderOTPEmailHTML(data),\n text: renderOTPEmailText(data)\n }\n}\n","/**\n * OTP Login Plugin\n *\n * Passwordless authentication via email one-time codes\n * Users receive a secure 6-digit code to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { setCookie } from 'hono/cookie'\nimport { z } from 'zod'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\nimport { OTPService, type OTPSettings } from './otp-service'\nimport { renderOTPEmail } from './email-templates'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\nimport { SettingsService } from '../../../services/settings'\nimport { getCustomData } from '../user-profiles'\n\n// Validation schemas\nconst otpRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nconst otpVerifySchema = z.object({\n email: z.string().email('Valid email is required'),\n code: z.string().min(4).max(8)\n})\n\n// Default settings (site name comes from general settings)\nconst DEFAULT_SETTINGS: OTPSettings = {\n codeLength: 6,\n codeExpiryMinutes: 10,\n maxAttempts: 3,\n rateLimitPerHour: 5,\n allowNewUserRegistration: false,\n logoUrl: '',\n logoWidth: 150,\n logoBorderWidth: 0,\n logoBorderColor: '#ffffff',\n loginUrl: '',\n loginButtonText: ''\n}\n\nexport function createOTPLoginPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'otp-login',\n version: '1.0.0-beta.1',\n description: 'Passwordless authentication via email one-time codes'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== API Routes ====================\n\n const otpAPI = new Hono()\n\n // POST /auth/otp/request - Request OTP code\n otpAPI.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings: OTPSettings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Get site name from general settings\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName\n\n // Check rate limiting\n const canRequest = await otpService.checkRateLimit(normalizedEmail, settings)\n if (!canRequest) {\n return c.json({\n error: 'Too many requests. Please try again in an hour.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && !settings.allowNewUserRegistration) {\n // Don't reveal if user exists or not (security)\n return c.json({\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Get IP and user agent\n const ipAddress = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n\n // Create OTP code\n const otpCode = await otpService.createOTPCode(\n normalizedEmail,\n settings,\n ipAddress,\n userAgent\n )\n\n // Send email via Email plugin\n try {\n const isDevMode = c.env.ENVIRONMENT === 'development'\n\n if (isDevMode) {\n console.log(`[DEV] OTP Code for ${normalizedEmail}: ${otpCode.code}`)\n }\n\n // Prepare email content\n const emailContent = renderOTPEmail({\n code: otpCode.code,\n expiryMinutes: settings.codeExpiryMinutes,\n codeLength: settings.codeLength,\n maxAttempts: settings.maxAttempts,\n email: normalizedEmail,\n ipAddress,\n timestamp: new Date().toISOString(),\n appName: siteName,\n logoUrl: settings.logoUrl || '',\n logoWidth: settings.logoWidth,\n logoBorderWidth: settings.logoBorderWidth,\n logoBorderColor: settings.logoBorderColor || '',\n loginUrl: settings.loginUrl || '',\n loginButtonText: settings.loginButtonText || ''\n })\n\n // Load email plugin settings from database\n // Note: We don't check status='active' because the email plugin's\n // settings UI works regardless of status, so we follow the same pattern\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (emailPlugin?.settings) {\n const emailSettings = JSON.parse(emailPlugin.settings)\n\n if (emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName) {\n // Send email via Resend API\n const emailResponse = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${emailSettings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${emailSettings.fromName} <${emailSettings.fromEmail}>`,\n to: [normalizedEmail],\n subject: `Your login code for ${siteName}`,\n html: emailContent.html,\n text: emailContent.text,\n reply_to: emailSettings.replyTo || emailSettings.fromEmail\n })\n })\n\n if (!emailResponse.ok) {\n const errorData = await emailResponse.json() as { message?: string }\n console.error('Failed to send OTP email via Resend:', errorData)\n // Don't expose error to user for security - just log it\n }\n } else {\n console.warn('Email plugin is not fully configured (missing apiKey, fromEmail, or fromName)')\n }\n } else {\n console.warn('Email plugin is not active or has no settings configured')\n }\n\n const response: any = {\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n }\n\n // In development, include the code\n if (isDevMode) {\n response.dev_code = otpCode.code\n }\n\n return c.json(response)\n } catch (emailError) {\n console.error('Error sending OTP email:', emailError)\n return c.json({\n error: 'Failed to send verification code. Please try again.'\n }, 500)\n }\n } catch (error) {\n console.error('OTP request error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/verify - Verify OTP code\n otpAPI.post('/verify', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpVerifySchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email, code } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Verify the code\n const verification = await otpService.verifyCode(normalizedEmail, code, settings)\n\n if (!verification.valid) {\n // Increment attempts on failure\n await otpService.incrementAttempts(normalizedEmail, code)\n\n return c.json({\n error: verification.error || 'Invalid code',\n attemptsRemaining: verification.attemptsRemaining\n }, 401)\n }\n\n // Code is valid - get user\n let user = await db.prepare(`\n SELECT id, email, username, first_name, last_name, role, is_active, created_at\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && settings.allowNewUserRegistration) {\n // Auto-create new user on first OTP verification\n const userId = crypto.randomUUID()\n const now = Date.now()\n const username = normalizedEmail.split('@')[0] + '_' + userId.slice(0, 6)\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, '', '', NULL, 'viewer', 1, 1, ?, ?)\n `).bind(userId, normalizedEmail, username, now, now).run()\n\n user = {\n id: userId,\n email: normalizedEmail,\n username,\n first_name: '',\n last_name: '',\n role: 'viewer',\n is_active: 1,\n created_at: now,\n }\n }\n\n if (!user) {\n return c.json({\n error: 'User not found'\n }, 404)\n }\n\n if (!user.is_active) {\n return c.json({\n error: 'Account is deactivated'\n }, 403)\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env as any)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, (c.env as any).JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n const customData = await getCustomData(db, user.id)\n const { is_active: _isActive, ...publicUser } = user\n\n return c.json({\n success: true,\n user: {\n ...publicUser,\n ...customData,\n },\n token,\n message: 'Authentication successful'\n })\n } catch (error) {\n console.error('OTP verify error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/resend - Resend OTP code\n otpAPI.post('/resend', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n // Reuse the request endpoint logic\n return otpAPI.fetch(\n new Request(c.req.url.replace('/resend', '/request'), {\n method: 'POST',\n headers: c.req.raw.headers,\n body: JSON.stringify({ email: validation.data.email })\n }),\n c.env\n )\n } catch (error) {\n console.error('OTP resend error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // Register API routes\n builder.addRoute('/auth/otp', otpAPI, {\n description: 'OTP authentication endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('OTP Login', '/admin/plugins/otp-login', {\n icon: 'key',\n order: 85,\n permissions: ['otp:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OTP Login plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OTP Login plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const otpLoginPlugin = createOTPLoginPlugin()\n","/**\n * OAuth Service\n * Handles OAuth2 authorization code flow, token exchange, and user info fetching.\n * Provider-agnostic — each provider is a simple config object.\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n// ─── Provider Configuration ─────────────────────────────────────────────────\n\nexport interface OAuthProviderConfig {\n id: string\n name: string\n authorizeUrl: string\n tokenUrl: string\n userInfoUrl: string\n scopes: string[]\n /** Map provider profile JSON to a normalized user profile */\n mapProfile: (profile: Record) => OAuthUserProfile\n}\n\nexport interface OAuthUserProfile {\n providerAccountId: string\n email: string\n name: string\n avatar?: string\n}\n\nexport interface OAuthPluginSettings {\n providers: Record\n}\n\n// ─── Built-in Providers ─────────────────────────────────────────────────────\n\nexport const GITHUB_PROVIDER: OAuthProviderConfig = {\n id: 'github',\n name: 'GitHub',\n authorizeUrl: 'https://github.com/login/oauth/authorize',\n tokenUrl: 'https://github.com/login/oauth/access_token',\n userInfoUrl: 'https://api.github.com/user',\n scopes: ['read:user', 'user:email'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || profile.login || '',\n avatar: profile.avatar_url || undefined\n })\n}\n\nexport const GOOGLE_PROVIDER: OAuthProviderConfig = {\n id: 'google',\n name: 'Google',\n authorizeUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n scopes: ['openid', 'email', 'profile'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || '',\n avatar: profile.picture || undefined\n })\n}\n\nexport const BUILT_IN_PROVIDERS: Record = {\n github: GITHUB_PROVIDER,\n google: GOOGLE_PROVIDER\n}\n\n// ─── OAuth Account DB Record ────────────────────────────────────────────────\n\nexport interface OAuthAccount {\n id: string\n user_id: string\n provider: string\n provider_account_id: string\n access_token: string | null\n refresh_token: string | null\n token_expires_at: number | null\n profile_data: string | null\n created_at: number\n updated_at: number\n}\n\n// ─── OAuth Service ──────────────────────────────────────────────────────────\n\nexport class OAuthService {\n constructor(private db: D1Database) {}\n\n /**\n * Build the authorization redirect URL for a provider.\n */\n buildAuthorizeUrl(\n provider: OAuthProviderConfig,\n clientId: string,\n redirectUri: string,\n state: string\n ): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope: provider.scopes.join(' '),\n state\n })\n\n // Google requires access_type for refresh tokens\n if (provider.id === 'google') {\n params.set('access_type', 'offline')\n params.set('prompt', 'consent')\n }\n\n return `${provider.authorizeUrl}?${params.toString()}`\n }\n\n /**\n * Exchange authorization code for tokens using native fetch.\n */\n async exchangeCode(\n provider: OAuthProviderConfig,\n clientId: string,\n clientSecret: string,\n code: string,\n redirectUri: string\n ): Promise<{ access_token: string; refresh_token?: string; expires_in?: number }> {\n const body: Record = {\n client_id: clientId,\n client_secret: clientSecret,\n code,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code'\n }\n\n const response = await fetch(provider.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json'\n },\n body: new URLSearchParams(body).toString()\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Token exchange failed (${response.status}): ${errorText}`)\n }\n\n const data = await response.json() as Record\n\n if (data.error) {\n throw new Error(`Token exchange error: ${data.error_description || data.error}`)\n }\n\n return {\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n expires_in: data.expires_in ? Number(data.expires_in) : undefined\n }\n }\n\n /**\n * Fetch user profile from the provider's userinfo endpoint.\n */\n async fetchUserProfile(\n provider: OAuthProviderConfig,\n accessToken: string\n ): Promise {\n const headers: Record = {\n 'Authorization': `Bearer ${accessToken}`,\n 'Accept': 'application/json'\n }\n\n // GitHub uses a different auth header format\n if (provider.id === 'github') {\n headers['Authorization'] = `token ${accessToken}`\n }\n\n const response = await fetch(provider.userInfoUrl, { headers })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch user profile (${response.status})`)\n }\n\n const profile = await response.json() as Record\n\n // For GitHub, email may not be in the profile — fetch from /user/emails\n if (provider.id === 'github' && !profile.email) {\n const emailResponse = await fetch('https://api.github.com/user/emails', {\n headers: {\n 'Authorization': `token ${accessToken}`,\n 'Accept': 'application/json'\n }\n })\n\n if (emailResponse.ok) {\n const emails = await emailResponse.json() as Array<{ email: string; primary: boolean; verified: boolean }>\n const primaryEmail = emails.find(e => e.primary && e.verified)\n if (primaryEmail) {\n profile.email = primaryEmail.email\n }\n }\n }\n\n return provider.mapProfile(profile)\n }\n\n // ─── Database Operations ────────────────────────────────────────────────\n\n /**\n * Find an existing OAuth account link.\n */\n async findOAuthAccount(\n provider: string,\n providerAccountId: string\n ): Promise {\n return await this.db.prepare(`\n SELECT * FROM oauth_accounts\n WHERE provider = ? AND provider_account_id = ?\n `).bind(provider, providerAccountId).first() as OAuthAccount | null\n }\n\n /**\n * Find all OAuth accounts for a user.\n */\n async findUserOAuthAccounts(userId: string): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM oauth_accounts WHERE user_id = ?\n `).bind(userId).all()\n return (result.results || []) as unknown as OAuthAccount[]\n }\n\n /**\n * Create a new OAuth account link.\n */\n async createOAuthAccount(params: {\n userId: string\n provider: string\n providerAccountId: string\n accessToken: string\n refreshToken?: string\n tokenExpiresAt?: number\n profileData?: string\n }): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO oauth_accounts (\n id, user_id, provider, provider_account_id,\n access_token, refresh_token, token_expires_at,\n profile_data, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n params.userId,\n params.provider,\n params.providerAccountId,\n params.accessToken,\n params.refreshToken || null,\n params.tokenExpiresAt || null,\n params.profileData || null,\n now,\n now\n ).run()\n\n return {\n id,\n user_id: params.userId,\n provider: params.provider,\n provider_account_id: params.providerAccountId,\n access_token: params.accessToken,\n refresh_token: params.refreshToken || null,\n token_expires_at: params.tokenExpiresAt || null,\n profile_data: params.profileData || null,\n created_at: now,\n updated_at: now\n }\n }\n\n /**\n * Update tokens for an existing OAuth account.\n */\n async updateOAuthTokens(\n id: string,\n accessToken: string,\n refreshToken?: string,\n tokenExpiresAt?: number\n ): Promise {\n await this.db.prepare(`\n UPDATE oauth_accounts\n SET access_token = ?, refresh_token = ?, token_expires_at = ?, updated_at = ?\n WHERE id = ?\n `).bind(accessToken, refreshToken || null, tokenExpiresAt || null, Date.now(), id).run()\n }\n\n /**\n * Unlink an OAuth account from a user (only if they have another auth method).\n */\n async unlinkOAuthAccount(userId: string, provider: string): Promise {\n // Check user has a password or another OAuth link before unlinking\n const user = await this.db.prepare(`\n SELECT password_hash FROM users WHERE id = ?\n `).bind(userId).first() as { password_hash: string | null } | null\n\n const otherLinks = await this.db.prepare(`\n SELECT COUNT(*) as count FROM oauth_accounts\n WHERE user_id = ? AND provider != ?\n `).bind(userId, provider).first() as { count: number } | null\n\n const hasPassword = !!user?.password_hash\n const hasOtherLinks = (otherLinks?.count || 0) > 0\n\n if (!hasPassword && !hasOtherLinks) {\n return false // Cannot unlink the only auth method\n }\n\n await this.db.prepare(`\n DELETE FROM oauth_accounts WHERE user_id = ? AND provider = ?\n `).bind(userId, provider).run()\n\n return true\n }\n\n /**\n * Find a user by email.\n */\n async findUserByEmail(email: string): Promise<{\n id: string\n email: string\n role: string\n is_active: number\n first_name: string\n last_name: string\n } | null> {\n return await this.db.prepare(`\n SELECT id, email, role, is_active, first_name, last_name\n FROM users WHERE email = ?\n `).bind(email.toLowerCase()).first() as any\n }\n\n /**\n * Create a new user from an OAuth profile.\n */\n async createUserFromOAuth(profile: OAuthUserProfile): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n const email = profile.email.toLowerCase()\n const nameParts = (profile.name || email.split('@')[0] || 'User').split(' ')\n const firstName = nameParts[0] || 'User'\n const lastName = nameParts.slice(1).join(' ') || ''\n const username = email.split('@')[0] || id.substring(0, 8)\n\n // Check for username collision and append random suffix if needed\n const existing = await this.db.prepare(\n 'SELECT id FROM users WHERE username = ?'\n ).bind(username).first()\n\n const finalUsername = existing\n ? `${username}-${id.substring(0, 6)}`\n : username\n\n await this.db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, avatar, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', ?, 1, ?, ?)\n `).bind(\n id, email, finalUsername, firstName, lastName,\n profile.avatar || null, now, now\n ).run()\n\n return id\n }\n\n /**\n * Generate a cryptographically random state parameter for CSRF protection.\n */\n generateState(): string {\n const bytes = new Uint8Array(32)\n crypto.getRandomValues(bytes)\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')\n }\n}\n","/**\n * OAuth Providers Plugin\n *\n * OAuth2/OIDC social login support for SonicJS.\n * Phase 1: Core OAuth2 authorization code flow with GitHub and Google providers.\n *\n * Routes:\n * GET /auth/oauth/:provider → Redirect to provider authorization\n * GET /auth/oauth/:provider/callback → Handle OAuth callback\n * POST /auth/oauth/link → Link OAuth provider to logged-in account\n * POST /auth/oauth/unlink → Unlink OAuth provider from account\n * GET /auth/oauth/accounts → List linked OAuth accounts for current user\n */\n\nimport { Hono } from 'hono'\nimport { setCookie, getCookie } from 'hono/cookie'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport {\n OAuthService,\n BUILT_IN_PROVIDERS,\n type OAuthPluginSettings,\n type OAuthProviderConfig\n} from './oauth-service'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst STATE_COOKIE_NAME = 'oauth_state'\nconst STATE_COOKIE_MAX_AGE = 600 // 10 minutes\n\nexport function createOAuthProvidersPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'oauth-providers',\n version: '1.0.0-beta.1',\n description: 'OAuth2/OIDC social login with GitHub, Google, and more'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== Helper Functions ====================\n\n function getCallbackUrl(c: any, provider: string): string {\n const proto = c.req.header('x-forwarded-proto') || 'https'\n const host = c.req.header('host') || 'localhost'\n return `${proto}://${host}/auth/oauth/${provider}/callback`\n }\n\n async function loadSettings(db: any): Promise {\n const row = await db.prepare(\n `SELECT settings FROM plugins WHERE id = 'oauth-providers'`\n ).first() as { settings: string | null } | null\n\n if (!row?.settings) return null\n\n try {\n return JSON.parse(row.settings) as OAuthPluginSettings\n } catch {\n return null\n }\n }\n\n function getProviderCredentials(\n settings: OAuthPluginSettings | null,\n providerId: string\n ): { clientId: string; clientSecret: string } | null {\n if (!settings?.providers?.[providerId]) return null\n const p = settings.providers[providerId]\n if (!p.enabled || !p.clientId || !p.clientSecret) return null\n return { clientId: p.clientId, clientSecret: p.clientSecret }\n }\n\n // ==================== API Routes ====================\n\n const oauthAPI = new Hono()\n\n // GET /auth/oauth/:provider — Redirect to provider authorization\n oauthAPI.get('/:provider', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.json({ error: `Unknown OAuth provider: ${providerId}` }, 400)\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.json({\n error: `OAuth provider \"${providerId}\" is not configured or not enabled`\n }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Store state in a cookie for CSRF validation on callback\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax', // Lax required for OAuth redirect flow\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n providerConfig,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.redirect(authorizeUrl)\n } catch (error) {\n console.error('OAuth authorize error:', error)\n return c.json({ error: 'Failed to initiate OAuth flow' }, 500)\n }\n })\n\n // GET /auth/oauth/:provider/callback — Handle OAuth callback\n oauthAPI.get('/:provider/callback', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.redirect('/auth/login?error=Unknown OAuth provider')\n }\n\n // Validate state (CSRF protection)\n const stateParam = c.req.query('state')\n const stateCookie = getCookie(c, STATE_COOKIE_NAME)\n\n if (!stateParam || !stateCookie || stateParam !== stateCookie) {\n return c.redirect('/auth/login?error=Invalid OAuth state. Please try again.')\n }\n\n // Clear the state cookie\n setCookie(c, STATE_COOKIE_NAME, '', {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: 0,\n path: '/auth/oauth'\n })\n\n // Check for error from provider\n const errorParam = c.req.query('error')\n if (errorParam) {\n const errorDesc = c.req.query('error_description') || errorParam\n return c.redirect(`/auth/login?error=${encodeURIComponent(errorDesc)}`)\n }\n\n const code = c.req.query('code')\n if (!code) {\n return c.redirect('/auth/login?error=No authorization code received')\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.redirect('/auth/login?error=OAuth provider not configured')\n }\n\n const oauthService = new OAuthService(db)\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Exchange code for tokens\n const tokens = await oauthService.exchangeCode(\n providerConfig,\n creds.clientId,\n creds.clientSecret,\n code,\n redirectUri\n )\n\n // Fetch user profile from provider\n const profile = await oauthService.fetchUserProfile(providerConfig, tokens.access_token)\n\n if (!profile.email) {\n return c.redirect('/auth/login?error=Could not retrieve email from OAuth provider. Please ensure your email is public or grant email permission.')\n }\n\n const tokenExpiresAt = tokens.expires_in\n ? Date.now() + (tokens.expires_in * 1000)\n : null\n\n // Check if this OAuth account is already linked to a user\n const existingOAuth = await oauthService.findOAuthAccount(providerId, profile.providerAccountId)\n\n if (existingOAuth) {\n // Existing OAuth link — update tokens and log in\n await oauthService.updateOAuthTokens(\n existingOAuth.id,\n tokens.access_token,\n tokens.refresh_token,\n tokenExpiresAt ?? undefined\n )\n\n // Fetch user to generate JWT\n const user = await db.prepare(\n 'SELECT id, email, role, is_active FROM users WHERE id = ?'\n ).bind(existingOAuth.user_id).first() as any\n\n if (!user || !user.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n user.id, user.email, user.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // No existing OAuth link — check if user exists by email\n const existingUser = await oauthService.findUserByEmail(profile.email)\n\n if (existingUser) {\n if (!existingUser.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n // Link OAuth to existing account\n await oauthService.createOAuthAccount({\n userId: existingUser.id,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n existingUser.id, existingUser.email, existingUser.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // Brand new user — create account from OAuth profile\n const newUserId = await oauthService.createUserFromOAuth(profile)\n\n await oauthService.createOAuthAccount({\n userId: newUserId,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n newUserId, profile.email.toLowerCase(), 'viewer',\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n\n } catch (error) {\n console.error('OAuth callback error:', error)\n const message = error instanceof Error ? error.message : 'OAuth authentication failed'\n return c.redirect(`/auth/login?error=${encodeURIComponent(message)}`)\n }\n })\n\n // POST /auth/oauth/link — Link an OAuth provider to the current logged-in user\n oauthAPI.post('/link', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider || !BUILT_IN_PROVIDERS[provider]) {\n return c.json({ error: 'Invalid provider' }, 400)\n }\n\n // Redirect the user to the OAuth flow — the callback will auto-link\n // since the user already exists by email\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, provider)\n\n if (!creds) {\n return c.json({ error: `OAuth provider \"${provider}\" is not configured` }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, provider)\n\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n BUILT_IN_PROVIDERS[provider]!,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.json({ redirectUrl: authorizeUrl })\n } catch (error) {\n console.error('OAuth link error:', error)\n return c.json({ error: 'Failed to initiate account linking' }, 500)\n }\n })\n\n // POST /auth/oauth/unlink — Unlink an OAuth provider from the current user\n oauthAPI.post('/unlink', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider) {\n return c.json({ error: 'Provider is required' }, 400)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const success = await oauthService.unlinkOAuthAccount(user.userId, provider)\n\n if (!success) {\n return c.json({\n error: 'Cannot unlink the only authentication method. Set a password first.'\n }, 400)\n }\n\n return c.json({ success: true, message: `${provider} account unlinked` })\n } catch (error) {\n console.error('OAuth unlink error:', error)\n return c.json({ error: 'Failed to unlink account' }, 500)\n }\n })\n\n // GET /auth/oauth/accounts — List linked OAuth accounts for current user\n oauthAPI.get('/accounts', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const accounts = await oauthService.findUserOAuthAccounts(user.userId)\n\n return c.json({\n accounts: accounts.map(a => ({\n provider: a.provider,\n providerAccountId: a.provider_account_id,\n linkedAt: a.created_at\n }))\n })\n } catch (error) {\n console.error('OAuth accounts error:', error)\n return c.json({ error: 'Failed to fetch linked accounts' }, 500)\n }\n })\n\n // Register routes\n builder.addRoute('/auth/oauth', oauthAPI, {\n description: 'OAuth2 social login endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Add menu item for admin settings\n builder.addMenuItem('OAuth Providers', '/admin/plugins/oauth-providers', {\n icon: 'shield',\n order: 86,\n permissions: ['oauth:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OAuth Providers plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OAuth Providers plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const oauthProvidersPlugin = createOAuthProvidersPlugin()\n","/**\n * Embedding Service\n * Generates embeddings using Cloudflare Workers AI\n */\n\nexport class EmbeddingService {\n constructor(private ai: any) {}\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string): Promise {\n try {\n // Use Cloudflare Workers AI embedding model\n // @cf/baai/bge-base-en-v1.5 produces 768-dimensional vectors\n const response = await this.ai.run('@cf/baai/bge-base-en-v1.5', {\n text: this.preprocessText(text)\n })\n\n // Extract embedding vector\n if (response.data && response.data.length > 0) {\n return response.data[0]\n }\n\n throw new Error('No embedding data returned')\n } catch (error) {\n console.error('[EmbeddingService] Error generating embedding:', error)\n throw error\n }\n }\n\n /**\n * Generate embeddings for multiple texts (batch processing)\n */\n async generateBatch(texts: string[]): Promise {\n try {\n // Process in smaller batches to avoid rate limits\n const batchSize = 10\n const batches: string[][] = []\n \n for (let i = 0; i < texts.length; i += batchSize) {\n batches.push(texts.slice(i, i + batchSize))\n }\n\n const allEmbeddings: number[][] = []\n\n for (const batch of batches) {\n const batchEmbeddings = await Promise.all(\n batch.map(text => this.generateEmbedding(text))\n )\n allEmbeddings.push(...batchEmbeddings)\n }\n\n return allEmbeddings\n } catch (error) {\n console.error('[EmbeddingService] Error generating batch embeddings:', error)\n throw error\n }\n }\n\n /**\n * Preprocess text before generating embedding\n * - Trim whitespace\n * - Limit length to avoid token limits\n * - Remove special characters that might cause issues\n */\n private preprocessText(text: string): string {\n if (!text) return ''\n\n // Trim and normalize whitespace\n let processed = text.trim().replace(/\\s+/g, ' ')\n\n // Limit to ~8000 characters (rough token limit)\n if (processed.length > 8000) {\n processed = processed.substring(0, 8000)\n }\n\n return processed\n }\n\n /**\n * Calculate cosine similarity between two embeddings\n */\n cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Embeddings must have same dimensions')\n }\n\n let dotProduct = 0\n let normA = 0\n let normB = 0\n\n for (let i = 0; i < a.length; i++) {\n const aVal = a[i] ?? 0\n const bVal = b[i] ?? 0\n dotProduct += aVal * bVal\n normA += aVal * aVal\n normB += bVal * bVal\n }\n\n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB))\n }\n}\n","/**\n * Chunking Service\n * Splits content into optimal chunks for embedding and search\n */\n\nexport interface ContentChunk {\n id: string\n content_id: string\n collection_id: string\n title: string\n text: string\n chunk_index: number\n metadata: Record\n}\n\nexport class ChunkingService {\n // Default chunk size (in approximate tokens)\n private readonly CHUNK_SIZE = 500\n private readonly CHUNK_OVERLAP = 50\n\n /**\n * Chunk a single content item\n */\n chunkContent(\n contentId: string,\n collectionId: string,\n title: string,\n data: any,\n metadata: Record = {}\n ): ContentChunk[] {\n // Extract all text from content\n const text = this.extractText(data)\n \n if (!text || text.trim().length === 0) {\n console.warn(`[ChunkingService] No text found for content ${contentId}`)\n return []\n }\n\n // Split into chunks\n const textChunks = this.splitIntoChunks(text)\n\n // Create chunk objects\n return textChunks.map((chunkText, index) => ({\n id: `${contentId}_chunk_${index}`,\n content_id: contentId,\n collection_id: collectionId,\n title: title,\n text: chunkText,\n chunk_index: index,\n metadata: {\n ...metadata,\n total_chunks: textChunks.length\n }\n }))\n }\n\n /**\n * Chunk multiple content items\n */\n chunkContentBatch(items: Array<{\n id: string\n collection_id: string\n title: string\n data: any\n metadata?: Record\n }>): ContentChunk[] {\n const allChunks: ContentChunk[] = []\n\n for (const item of items) {\n const chunks = this.chunkContent(\n item.id,\n item.collection_id,\n item.title,\n item.data,\n item.metadata\n )\n allChunks.push(...chunks)\n }\n\n return allChunks\n }\n\n /**\n * Extract all text from content data\n */\n private extractText(data: any): string {\n const parts: string[] = []\n\n // Common text fields\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n if (data.summary) parts.push(String(data.summary))\n\n // Recursively extract from nested objects\n const extractRecursive = (obj: any): void => {\n if (typeof obj === 'string') {\n // Skip very short strings and URLs\n if (obj.length > 10 && !obj.startsWith('http')) {\n parts.push(obj)\n }\n } else if (Array.isArray(obj)) {\n obj.forEach(extractRecursive)\n } else if (obj && typeof obj === 'object') {\n // Skip certain keys\n const skipKeys = ['id', 'slug', 'url', 'image', 'thumbnail', 'metadata']\n \n Object.entries(obj).forEach(([key, value]) => {\n if (!skipKeys.includes(key.toLowerCase())) {\n extractRecursive(value)\n }\n })\n }\n }\n\n extractRecursive(data)\n\n return parts.join('\\n\\n').trim()\n }\n\n /**\n * Split text into overlapping chunks\n */\n private splitIntoChunks(text: string): string[] {\n // Split by words\n const words = text.split(/\\s+/)\n \n if (words.length <= this.CHUNK_SIZE) {\n return [text]\n }\n\n const chunks: string[] = []\n let startIndex = 0\n\n while (startIndex < words.length) {\n // Get chunk with overlap\n const endIndex = Math.min(startIndex + this.CHUNK_SIZE, words.length)\n const chunk = words.slice(startIndex, endIndex).join(' ')\n chunks.push(chunk)\n\n // Move forward by chunk size minus overlap\n startIndex += this.CHUNK_SIZE - this.CHUNK_OVERLAP\n\n // Ensure we don't create a tiny last chunk\n if (startIndex >= words.length - this.CHUNK_OVERLAP) {\n break\n }\n }\n\n return chunks\n }\n\n /**\n * Get optimal chunk size based on content type\n */\n getOptimalChunkSize(contentType: string): number {\n switch (contentType) {\n case 'blog_posts':\n case 'articles':\n return 600 // Larger chunks for long-form content\n case 'products':\n case 'pages':\n return 400 // Medium chunks for structured content\n case 'messages':\n case 'comments':\n return 200 // Small chunks for short content\n default:\n return this.CHUNK_SIZE\n }\n }\n}\n","/**\n * Custom RAG Service\n * Implements full RAG pipeline using Cloudflare Vectorize\n * \n * Fulfills GitHub Issue #362: Advanced search with Cloudflare Search\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { EmbeddingService } from './embedding.service'\nimport { ChunkingService, type ContentChunk } from './chunking.service'\nimport type { SearchQuery, SearchResponse, SearchResult, AISearchSettings } from '../types'\n\nexport class CustomRAGService {\n private embeddingService: EmbeddingService\n private chunkingService: ChunkingService\n\n constructor(\n private db: D1Database,\n private ai: any,\n private vectorize: any\n ) {\n this.embeddingService = new EmbeddingService(ai)\n this.chunkingService = new ChunkingService()\n }\n\n /**\n * Index all content from a collection\n */\n async indexCollection(collectionId: string): Promise<{\n total_items: number\n total_chunks: number\n indexed_chunks: number\n errors: number\n }> {\n console.log(`[CustomRAG] Starting indexing for collection: ${collectionId}`)\n \n try {\n // Get all published content from collection\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.collection_id = ? AND c.status = 'published'\n `)\n .bind(collectionId)\n .all<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n const totalItems = contentItems?.length || 0\n \n if (totalItems === 0) {\n console.log(`[CustomRAG] No content found in collection ${collectionId}`)\n return { total_items: 0, total_chunks: 0, indexed_chunks: 0, errors: 0 }\n }\n\n // Chunk all content\n const items = (contentItems || []).map(item => ({\n id: item.id,\n collection_id: item.collection_id,\n title: item.title || 'Untitled',\n data: typeof item.data === 'string' ? JSON.parse(item.data) : item.data,\n metadata: {\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name\n }\n }))\n\n const chunks = this.chunkingService.chunkContentBatch(items)\n const totalChunks = chunks.length\n\n console.log(`[CustomRAG] Generated ${totalChunks} chunks from ${totalItems} items`)\n\n // Generate embeddings in batches\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n console.log(`[CustomRAG] Generated ${embeddings.length} embeddings`)\n\n // Store in Vectorize\n let indexedChunks = 0\n let errors = 0\n const batchSize = 100\n\n for (let i = 0; i < chunks.length; i += batchSize) {\n const chunkBatch = chunks.slice(i, i + batchSize)\n const embeddingBatch = embeddings.slice(i, i + batchSize)\n\n try {\n await this.vectorize.upsert(\n chunkBatch.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddingBatch[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500), // Store snippet for display\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n indexedChunks += chunkBatch.length\n console.log(`[CustomRAG] Indexed batch ${i / batchSize + 1}: ${chunkBatch.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error indexing batch ${i / batchSize + 1}:`, error)\n errors += chunkBatch.length\n }\n }\n\n console.log(`[CustomRAG] Indexing complete: ${indexedChunks}/${totalChunks} chunks indexed`)\n\n return {\n total_items: totalItems,\n total_chunks: totalChunks,\n indexed_chunks: indexedChunks,\n errors\n }\n } catch (error) {\n console.error(`[CustomRAG] Error indexing collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Search using RAG (semantic search with Vectorize)\n */\n async search(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n\n try {\n console.log(`[CustomRAG] Searching for: \"${query.query}\"`)\n\n // Generate query embedding\n const queryEmbedding = await this.embeddingService.generateEmbedding(query.query)\n\n // Build Vectorize query filters\n const filter: any = {}\n \n if (query.filters?.collections && query.filters.collections.length > 0) {\n filter.collection_id = { $in: query.filters.collections }\n } else if (settings.selected_collections.length > 0) {\n filter.collection_id = { $in: settings.selected_collections }\n }\n\n if (query.filters?.status && query.filters.status.length > 0) {\n filter.status = { $in: query.filters.status }\n }\n\n // Vectorize filters have issues, so we query without filter and manually filter results\n const vectorResults = await this.vectorize.query(queryEmbedding, {\n topK: 50, // Max allowed with returnMetadata: true\n returnMetadata: true\n })\n\n // Manually filter results by collection_id if filter exists\n let filteredMatches = vectorResults.matches || []\n if (filter.collection_id?.$in && Array.isArray(filter.collection_id.$in)) {\n const allowedCollections = filter.collection_id.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedCollections.includes(match.metadata?.collection_id)\n )\n }\n\n // Apply status filter if exists\n if (filter.status?.$in && Array.isArray(filter.status.$in)) {\n const allowedStatuses = filter.status.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedStatuses.includes(match.metadata?.status)\n )\n }\n\n // Limit to requested topK\n const topK = query.limit || settings.results_limit || 20\n filteredMatches = filteredMatches.slice(0, topK)\n\n // Replace matches with filtered results\n vectorResults.matches = filteredMatches\n\n if (!vectorResults.matches || vectorResults.matches.length === 0) {\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: 'ai'\n }\n }\n\n // Get unique content IDs\n const contentIds = [...new Set(\n vectorResults.matches.map((m: any) => m.metadata.content_id)\n )]\n\n // Fetch full content from D1\n const placeholders = contentIds.map(() => '?').join(',')\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.display_name as collection_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id IN (${placeholders})\n `)\n .bind(...contentIds)\n .all<{\n id: string\n title: string\n slug: string\n collection_id: string\n collection_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n }>()\n\n // Map results with relevance scores\n const searchResults: SearchResult[] = (contentItems || []).map(item => {\n // Find best matching chunk for this content\n const matchingChunks = vectorResults.matches.filter(\n (m: any) => m.metadata.content_id === item.id\n )\n \n const bestMatch = matchingChunks.reduce((best: any, current: any) => \n current.score > (best?.score || 0) ? current : best\n , null)\n\n return {\n id: item.id,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n collection_id: item.collection_id,\n collection_name: item.collection_name,\n snippet: bestMatch?.metadata?.text || '',\n relevance_score: bestMatch?.score || 0,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at\n }\n })\n\n // Sort by relevance score\n searchResults.sort((a, b) => (b.relevance_score || 0) - (a.relevance_score || 0))\n\n const queryTime = Date.now() - startTime\n console.log(`[CustomRAG] Search completed in ${queryTime}ms, ${searchResults.length} results`)\n\n return {\n results: searchResults,\n total: searchResults.length,\n query_time_ms: queryTime,\n mode: 'ai'\n }\n } catch (error) {\n console.error('[CustomRAG] Search error:', error)\n throw error\n }\n }\n\n /**\n * Update index for a single content item\n */\n async updateContentIndex(contentId: string): Promise {\n try {\n // Get content item\n const content = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n .bind(contentId)\n .first<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!content) {\n console.warn(`[CustomRAG] Content ${contentId} not found`)\n return\n }\n\n // If content is not published, remove from index\n if (content.status !== 'published') {\n await this.removeContentFromIndex(contentId)\n return\n }\n\n // Chunk content\n const chunks = this.chunkingService.chunkContent(\n content.id,\n content.collection_id,\n content.title || 'Untitled',\n typeof content.data === 'string' ? JSON.parse(content.data) : content.data,\n {\n status: content.status,\n created_at: content.created_at,\n updated_at: content.updated_at,\n author_id: content.author_id,\n collection_name: content.collection_name,\n collection_display_name: content.collection_display_name\n }\n )\n\n // Generate embeddings\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n // Update in Vectorize\n await this.vectorize.upsert(\n chunks.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddings[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500),\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n console.log(`[CustomRAG] Updated index for content ${contentId}: ${chunks.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error updating index for ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove content from index\n */\n async removeContentFromIndex(contentId: string): Promise {\n try {\n // Note: Vectorize doesn't have a bulk delete by metadata filter\n // We need to delete each chunk individually\n // In practice, we would track chunk IDs or use a different approach\n \n console.log(`[CustomRAG] Removing content ${contentId} from index`)\n \n // For now, we'll let stale chunks age out\n // A better approach would be to maintain a mapping in D1\n // TODO: Implement proper chunk tracking\n \n } catch (error) {\n console.error(`[CustomRAG] Error removing content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Get search suggestions based on query\n */\n async getSuggestions(partialQuery: string, limit: number = 5): Promise {\n try {\n // Generate embedding for partial query\n const queryEmbedding = await this.embeddingService.generateEmbedding(partialQuery)\n\n // Search for similar content titles\n const results = await this.vectorize.query(queryEmbedding, {\n topK: limit * 2, // Get more to filter\n returnMetadata: true\n })\n\n // Extract unique titles\n const suggestions = [...new Set(\n results.matches?.map((m: any) => m.metadata.title).filter(Boolean) || []\n )].slice(0, limit)\n\n return suggestions as string[]\n } catch (error) {\n console.error('[CustomRAG] Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Check if Vectorize is available and configured\n */\n isAvailable(): boolean {\n return !!this.vectorize && !!this.ai\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n NewCollectionNotification,\n} from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * AI Search Service\n * Handles search operations, settings management, and collection detection\n * Now uses Custom RAG with Vectorize for semantic search\n */\nexport class AISearchService {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[AISearchService] Custom RAG initialized')\n } else {\n console.log('[AISearchService] Custom RAG not available, using keyword search only')\n }\n }\n\n /**\n * Get plugin settings\n */\n async getSettings(): Promise {\n try {\n const plugin = await this.db\n .prepare(`SELECT settings FROM plugins WHERE id = ? LIMIT 1`)\n .bind('ai-search')\n .first<{ settings: string | null }>()\n\n if (!plugin || !plugin.settings) {\n return this.getDefaultSettings()\n }\n\n return JSON.parse(plugin.settings) as AISearchSettings\n } catch (error) {\n console.error('Error fetching AI Search settings:', error)\n return this.getDefaultSettings()\n }\n }\n\n /**\n * Get default settings\n */\n getDefaultSettings(): AISearchSettings {\n return {\n enabled: true,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n }\n\n /**\n * Update plugin settings\n */\n async updateSettings(settings: Partial): Promise {\n const existing = await this.getSettings()\n const updated: AISearchSettings = {\n ...existing!,\n ...settings,\n }\n\n try {\n // Update plugin settings in plugins table\n await this.db\n .prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'ai-search'\n `)\n .bind(JSON.stringify(updated))\n .run()\n\n return updated\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n throw error\n }\n }\n\n /**\n * Detect new collections that aren't indexed or dismissed\n */\n async detectNewCollections(): Promise {\n try {\n // Get all collections (exclude test collections)\n // Note: D1 doesn't support parameterized LIKE, so we filter in JavaScript\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: number\n name: string\n display_name: string\n description?: string\n }>()\n \n // Filter out test collections (starts with test_, ends with _test, or is test_collection)\n const collections = (allCollections || []).filter(\n (col) => {\n if (!col.name) return false\n const name = col.name.toLowerCase()\n return !name.startsWith('test_') && \n !name.endsWith('_test') && \n name !== 'test_collection' &&\n !name.includes('_test_') &&\n name !== 'large_payload_test' &&\n name !== 'concurrent_test'\n }\n )\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n\n // Get item counts for each collection\n const notifications: NewCollectionNotification[] = []\n\n for (const collection of collections || []) {\n const collectionId = String(collection.id)\n\n // Skip if already selected or dismissed\n if (selected.includes(collectionId) || dismissed.includes(collectionId)) {\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n notifications.push({\n collection: {\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: false,\n is_dismissed: false,\n is_new: true,\n },\n message: `New collection \"${collection.display_name}\" with ${itemCount} items available for indexing`,\n })\n }\n\n return notifications\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return []\n }\n }\n\n /**\n * Get all collections with indexing status\n */\n async getAllCollections(): Promise {\n try {\n // Get all collections (same query as content page)\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1 ORDER BY display_name'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: string\n name: string\n display_name: string\n description?: string\n }>()\n \n console.log('[AISearchService.getAllCollections] Raw collections from DB:', allCollections?.length || 0)\n const firstCollection = allCollections?.[0]\n if (firstCollection) {\n console.log('[AISearchService.getAllCollections] Sample collection:', {\n id: firstCollection.id,\n name: firstCollection.name,\n display_name: firstCollection.display_name\n })\n }\n \n // No filtering needed - test collections are now properly cleaned up by E2E tests\n const collections = (allCollections || []).filter(\n (col) => col.id && col.name\n )\n \n console.log('[AISearchService.getAllCollections] After filtering test collections:', collections.length)\n console.log('[AISearchService.getAllCollections] Remaining collections:', collections.map(c => c.name).join(', '))\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n \n console.log('[AISearchService.getAllCollections] Settings:', {\n selected_count: selected.length,\n dismissed_count: dismissed.length,\n selected: selected\n })\n\n // Get item counts and indexing status\n const collectionInfos: CollectionInfo[] = []\n\n for (const collection of collections) {\n if (!collection.id || !collection.name) continue\n const collectionId = String(collection.id)\n \n if (!collectionId) {\n console.warn('[AISearchService] Skipping invalid collection:', collection)\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n collectionInfos.push({\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name || collection.name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: selected.includes(collectionId),\n is_dismissed: dismissed.includes(collectionId),\n is_new: !selected.includes(collectionId) && !dismissed.includes(collectionId),\n })\n }\n \n console.log('[AISearchService.getAllCollections] Returning collectionInfos:', collectionInfos.length)\n const firstInfo = collectionInfos[0]\n if (collectionInfos.length > 0 && firstInfo) {\n console.log('[AISearchService.getAllCollections] First collectionInfo:', {\n id: firstInfo.id,\n name: firstInfo.name,\n display_name: firstInfo.display_name,\n item_count: firstInfo.item_count\n })\n }\n return collectionInfos\n } catch (error) {\n console.error('[AISearchService] Error fetching collections:', error)\n return []\n }\n }\n\n /**\n * Execute search query\n */\n async search(query: SearchQuery): Promise {\n const startTime = Date.now()\n const settings = await this.getSettings()\n\n if (!settings?.enabled) {\n return {\n results: [],\n total: 0,\n query_time_ms: 0,\n mode: query.mode,\n }\n }\n\n // Use AI Search if enabled and mode is 'ai'\n if (query.mode === 'ai' && settings.ai_mode_enabled && this.customRAG?.isAvailable()) {\n return this.searchAI(query, settings)\n }\n\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n\n /**\n * AI-powered semantic search using Custom RAG\n */\n private async searchAI(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n \n try {\n if (!this.customRAG) {\n console.warn('[AISearchService] CustomRAG not available, falling back to keyword search')\n return this.searchKeyword(query, settings)\n }\n\n // Use Custom RAG for semantic search - pass the full query object and settings\n const result = await this.customRAG.search(query, settings)\n\n return result\n } catch (error) {\n console.error('[AISearchService] AI search error, falling back to keyword:', error)\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n }\n\n /**\n * Traditional keyword search\n */\n private async searchKeyword(\n query: SearchQuery,\n settings: AISearchSettings\n ): Promise {\n const startTime = Date.now()\n\n try {\n const conditions: string[] = []\n const params: any[] = []\n\n // Search query\n if (query.query) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n const searchTerm = `%${query.query}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n // Collection filter\n if (query.filters?.collections && query.filters.collections.length > 0) {\n const placeholders = query.filters.collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...query.filters.collections)\n } else if (settings.selected_collections.length > 0) {\n // Only search indexed collections\n const placeholders = settings.selected_collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...settings.selected_collections)\n }\n\n // Status filter\n if (query.filters?.status && query.filters.status.length > 0) {\n const placeholders = query.filters.status.map(() => '?').join(',')\n conditions.push(`c.status IN (${placeholders})`)\n params.push(...query.filters.status)\n } else {\n // Exclude deleted by default\n conditions.push(\"c.status != 'deleted'\")\n }\n\n // Date range filter\n if (query.filters?.dateRange) {\n const field = query.filters.dateRange.field || 'created_at'\n if (query.filters.dateRange.start) {\n conditions.push(`c.${field} >= ?`)\n params.push(query.filters.dateRange.start.getTime())\n }\n if (query.filters.dateRange.end) {\n conditions.push(`c.${field} <= ?`)\n params.push(query.filters.dateRange.end.getTime())\n }\n }\n\n // Author filter\n if (query.filters?.author) {\n conditions.push('c.author_id = ?')\n params.push(query.filters.author)\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get results\n const limit = query.limit || settings.results_limit\n const offset = query.offset || 0\n\n const resultsStmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id, c.data,\n col.name as collection_name, col.display_name as collection_display_name,\n u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results } = await resultsStmt.bind(...params, limit, offset).all<{\n id: string\n title: string\n slug: string\n collection_id: number\n collection_name: string\n collection_display_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n author_email?: string\n data: string\n }>()\n\n const searchResults: SearchResult[] = (results || []).map((row) => ({\n id: String(row.id),\n title: row.title || 'Untitled',\n slug: row.slug || '',\n collection_id: String(row.collection_id),\n collection_name: row.collection_display_name || row.collection_name,\n snippet: this.extractSnippet(row.data, query.query),\n status: row.status,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n author_name: row.author_email,\n }))\n\n const queryTime = Date.now() - startTime\n\n // Log search history\n await this.logSearch(query.query, query.mode, searchResults.length)\n\n return {\n results: searchResults,\n total,\n query_time_ms: queryTime,\n mode: query.mode,\n }\n } catch (error) {\n console.error('Keyword search error:', error)\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: query.mode,\n }\n }\n }\n\n /**\n * Extract snippet from content data\n */\n private extractSnippet(data: string, query: string): string {\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data\n const text = JSON.stringify(parsed).toLowerCase()\n const queryLower = query.toLowerCase()\n\n const index = text.indexOf(queryLower)\n if (index === -1) {\n // Return first 200 chars\n return JSON.stringify(parsed).substring(0, 200) + '...'\n }\n\n // Extract context around match\n const start = Math.max(0, index - 50)\n const end = Math.min(text.length, index + query.length + 50)\n return text.substring(start, end) + '...'\n } catch {\n return data.substring(0, 200) + '...'\n }\n }\n\n /**\n * Get search suggestions (autocomplete)\n */\n async getSearchSuggestions(partial: string): Promise {\n try {\n const settings = await this.getSettings()\n if (!settings?.autocomplete_enabled) {\n return []\n }\n\n // If Custom RAG is available, use AI-powered suggestions\n if (this.customRAG?.isAvailable()) {\n try {\n const aiSuggestions = await this.customRAG.getSuggestions(partial, 5)\n if (aiSuggestions.length > 0) {\n return aiSuggestions\n }\n } catch (error) {\n console.error('[AISearchService] Error getting AI suggestions:', error)\n // Fall through to history-based suggestions\n }\n }\n\n // Fallback to history-based suggestions\n const stmt = this.db.prepare(`\n SELECT DISTINCT query \n FROM ai_search_history \n WHERE query LIKE ? \n ORDER BY created_at DESC \n LIMIT 10\n `)\n const { results } = await stmt.bind(`%${partial}%`).all<{ query: string }>()\n\n return (results || []).map((r) => r.query)\n } catch (error) {\n console.error('Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Log search query to history\n */\n private async logSearch(query: string, mode: 'ai' | 'keyword', resultsCount: number): Promise {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_history (query, mode, results_count, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await stmt.bind(query, mode, resultsCount, Date.now()).run()\n } catch (error) {\n console.error('Error logging search:', error)\n }\n }\n\n /**\n * Get search analytics\n */\n async getSearchAnalytics(): Promise<{\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }> {\n try {\n // Total queries (last 30 days)\n const totalStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n `)\n const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000\n const totalResult = await totalStmt.bind(thirtyDaysAgo).first<{ count: number }>()\n\n // AI vs Keyword breakdown\n const modeStmt = this.db.prepare(`\n SELECT mode, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY mode\n `)\n const { results: modeResults } = await modeStmt.bind(thirtyDaysAgo).all<{\n mode: string\n count: number\n }>()\n\n const aiCount = modeResults?.find((r) => r.mode === 'ai')?.count || 0\n const keywordCount = modeResults?.find((r) => r.mode === 'keyword')?.count || 0\n\n // Popular queries\n const popularStmt = this.db.prepare(`\n SELECT query, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY query \n ORDER BY count DESC \n LIMIT 10\n `)\n const { results: popularResults } = await popularStmt.bind(thirtyDaysAgo).all<{\n query: string\n count: number\n }>()\n\n return {\n total_queries: totalResult?.count || 0,\n ai_queries: aiCount,\n keyword_queries: keywordCount,\n popular_queries: (popularResults || []).map((r) => ({\n query: r.query,\n count: r.count,\n })),\n average_query_time: 0, // TODO: Track query times\n }\n } catch (error) {\n console.error('Error getting analytics:', error)\n return {\n total_queries: 0,\n ai_queries: 0,\n keyword_queries: 0,\n popular_queries: [],\n average_query_time: 0,\n }\n }\n }\n\n /**\n * Verify Custom RAG is available\n */\n verifyBinding(): boolean {\n return this.customRAG?.isAvailable() ?? false\n }\n\n /**\n * Get Custom RAG service instance (for indexer)\n */\n getCustomRAG(): CustomRAGService | undefined {\n return this.customRAG\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { AISearchSettings, IndexStatus } from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * Index Manager Service\n * Handles indexing of content items using Custom RAG with Vectorize\n */\nexport class IndexManager {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[IndexManager] Custom RAG initialized')\n }\n }\n\n /**\n * Index all content items within a collection using Custom RAG\n */\n async indexCollection(collectionId: string): Promise {\n try {\n // Get collection info\n const collectionStmt = this.db.prepare(\n 'SELECT id, name, display_name FROM collections WHERE id = ?'\n )\n const collection = await collectionStmt.bind(collectionId).first<{\n id: string\n name: string\n display_name: string\n }>()\n\n if (!collection) {\n throw new Error(`Collection ${collectionId} not found`)\n }\n\n // Update status to indexing\n await this.updateIndexStatus(collectionId, {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n status: 'indexing',\n })\n\n // Use Custom RAG for indexing if available\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Using Custom RAG to index collection ${collectionId}`)\n \n const result = await this.customRAG.indexCollection(collectionId)\n\n const finalStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: result.total_items,\n indexed_items: result.indexed_chunks,\n last_sync_at: Date.now(),\n status: result.errors > 0 ? 'error' : 'completed',\n error_message: result.errors > 0 ? `${result.errors} errors during indexing` : undefined\n }\n\n await this.updateIndexStatus(collectionId, finalStatus)\n return finalStatus\n }\n\n // Fallback: No indexing without Custom RAG\n console.warn(`[IndexManager] Custom RAG not available, skipping indexing for ${collectionId}`)\n \n const fallbackStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n last_sync_at: Date.now(),\n status: 'completed',\n error_message: 'Custom RAG not available - using keyword search only'\n }\n\n await this.updateIndexStatus(collectionId, fallbackStatus)\n return fallbackStatus\n } catch (error) {\n console.error(`[IndexManager] Error indexing collection ${collectionId}:`, error)\n const errorStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: 'Unknown',\n total_items: 0,\n indexed_items: 0,\n status: 'error',\n error_message: error instanceof Error ? error.message : String(error),\n }\n await this.updateIndexStatus(collectionId, errorStatus)\n return errorStatus\n }\n }\n\n /**\n * Index a single content item\n */\n private async indexContentItem(\n item: {\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n },\n collectionId: string\n ): Promise {\n try {\n // Parse content data\n let parsedData: any = {}\n try {\n parsedData = typeof item.data === 'string' ? JSON.parse(item.data) : item.data\n } catch {\n parsedData = {}\n }\n\n // Prepare document for AI Search\n const document = {\n id: `content_${item.id}`,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n content: this.extractSearchableText(parsedData),\n metadata: {\n collection_id: collectionId,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n },\n }\n\n // TODO: Call Cloudflare AI Search API to index document\n // await this.aiSearch.index(document)\n\n // For now, just log (actual implementation will use AI Search API)\n console.log(`Indexed content item: ${item.id}`)\n } catch (error) {\n console.error(`Error indexing content item ${item.id}:`, error)\n throw error\n }\n }\n\n /**\n * Extract searchable text from content data\n */\n private extractSearchableText(data: any): string {\n const parts: string[] = []\n\n // Add title if present\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n\n // Add description/content fields\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n\n // Add all string values from data\n const extractStrings = (obj: any): void => {\n if (typeof obj === 'string') {\n parts.push(obj)\n } else if (Array.isArray(obj)) {\n obj.forEach(extractStrings)\n } else if (obj && typeof obj === 'object') {\n Object.values(obj).forEach(extractStrings)\n }\n }\n\n extractStrings(data)\n\n return parts.join(' ')\n }\n\n /**\n * Update a single content item in the index\n */\n async updateIndex(collectionId: number, contentId: string): Promise {\n try {\n // Get content item\n const stmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.data, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ? AND c.collection_id = ?\n `)\n const item = await stmt.bind(contentId, collectionId).first<{\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!item) {\n throw new Error(`Content item ${contentId} not found`)\n }\n\n // Re-index the item\n await this.indexContentItem(item, String(collectionId))\n\n // Update last sync time for collection\n const status = await this.getIndexStatus(String(collectionId))\n if (status) {\n await this.updateIndexStatus(String(collectionId), {\n ...status,\n last_sync_at: Date.now(),\n })\n }\n } catch (error) {\n console.error(`Error updating index for content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove a content item from the index using Custom RAG\n */\n async removeFromIndex(collectionId: string, contentId: string): Promise {\n try {\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Removing content ${contentId} from index`)\n await this.customRAG.removeContentFromIndex(contentId)\n } else {\n console.warn(`[IndexManager] Custom RAG not available, skipping removal for ${contentId}`)\n }\n } catch (error) {\n console.error(`[IndexManager] Error removing content ${contentId} from index:`, error)\n throw error\n }\n }\n\n /**\n * Get indexing status for a collection\n */\n async getIndexStatus(collectionId: string): Promise {\n try {\n const stmt = this.db.prepare(\n 'SELECT * FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const result = await stmt.bind(collectionId).first<{\n id: number\n collection_id: string\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n if (!result) {\n return null\n }\n\n return {\n collection_id: String(result.collection_id),\n collection_name: result.collection_name,\n total_items: result.total_items,\n indexed_items: result.indexed_items,\n last_sync_at: result.last_sync_at,\n status: result.status as IndexStatus['status'],\n error_message: result.error_message,\n }\n } catch (error) {\n console.error(`Error getting index status for collection ${collectionId}:`, error)\n return null\n }\n }\n\n /**\n * Get indexing status for all collections\n */\n async getAllIndexStatus(): Promise> {\n try {\n const stmt = this.db.prepare('SELECT * FROM ai_search_index_meta')\n const { results } = await stmt.all<{\n id: number\n collection_id: number\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n const statusMap: Record = {}\n\n for (const row of results || []) {\n const collectionId = String(row.collection_id)\n statusMap[collectionId] = {\n collection_id: collectionId,\n collection_name: row.collection_name,\n total_items: row.total_items,\n indexed_items: row.indexed_items,\n last_sync_at: row.last_sync_at,\n status: row.status as IndexStatus['status'],\n error_message: row.error_message,\n }\n }\n\n return statusMap\n } catch (error) {\n console.error('Error getting all index status:', error)\n return {}\n }\n }\n\n /**\n * Update index status in database\n */\n private async updateIndexStatus(collectionId: string, status: IndexStatus): Promise {\n try {\n // Check if record exists\n const checkStmt = this.db.prepare(\n 'SELECT id FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const existing = await checkStmt.bind(collectionId).first<{ id: number }>()\n\n if (existing) {\n // Update existing\n const stmt = this.db.prepare(`\n UPDATE ai_search_index_meta \n SET collection_name = ?,\n total_items = ?,\n indexed_items = ?,\n last_sync_at = ?,\n status = ?,\n error_message = ?\n WHERE collection_id = ?\n `)\n await stmt\n .bind(\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null,\n String(collectionId)\n )\n .run()\n } else {\n // Insert new\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_index_meta (\n collection_id, collection_name, total_items, indexed_items,\n last_sync_at, status, error_message\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n await stmt\n .bind(\n String(status.collection_id),\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null\n )\n .run()\n }\n } catch (error) {\n console.error(`Error updating index status for collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Sync all selected collections\n */\n async syncAll(selectedCollections: string[]): Promise {\n for (const collectionId of selectedCollections) {\n try {\n await this.indexCollection(collectionId)\n } catch (error) {\n console.error(`Error syncing collection ${collectionId}:`, error)\n }\n }\n }\n}\n","import { renderAdminLayout } from '../../../../templates/layouts/admin-layout-v2.template'\nimport type {\n AISearchSettings,\n CollectionInfo,\n IndexStatus,\n NewCollectionNotification,\n} from '../types'\n\ninterface SettingsPageData {\n settings: AISearchSettings | null\n collections: CollectionInfo[]\n newCollections: NewCollectionNotification[]\n indexStatus: Record\n analytics: {\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const settings = data.settings || {\n enabled: false,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n\n // Ensure arrays exist\n const selectedCollections = Array.isArray(settings.selected_collections) ? settings.selected_collections : []\n const dismissedCollections = Array.isArray(settings.dismissed_collections) ? settings.dismissed_collections : []\n\n const enabled = settings.enabled === true\n const aiModeEnabled = settings.ai_mode_enabled !== false\n const autocompleteEnabled = settings.autocomplete_enabled !== false\n const indexMedia = settings.index_media === true\n\n const selectedCollectionIds = new Set(selectedCollections.map(id => String(id)))\n const dismissedCollectionIds = new Set(dismissedCollections.map(id => String(id)))\n\n // Ensure collections array exists\n const collections = Array.isArray(data.collections) ? data.collections : []\n\n // Debug: Log collections in template\n console.log('[SettingsPage Template] Collections received:', collections.length)\n if (collections.length > 0) {\n console.log('[SettingsPage Template] First collection:', collections[0])\n }\n\n const content = `\n
\n \n
\n
\n

🔍 AI Search Settings

\n

\n Configure advanced search with Cloudflare AI Search. Select collections to index and manage search preferences.\n

\n
\n \n
\n\n\n \n
\n
\n \n
\n

🔍 Search Settings

\n
\n
\n \n
\n \n

Turn on advanced search capabilities across your content

\n
\n
\n\n
\n \n
\n \n

\n Enable natural language queries (requires Cloudflare Workers AI binding)\n → Setup Guide\n

\n

\n ⚠️ If AI binding unavailable, will fallback to keyword search\n

\n
\n
\n
\n
\n\n
\n\n \n
\n
\n
\n

📚 Collections to Index

\n

\n Select which content collections should be indexed and searchable. Only checked collections will be included in search results.\n

\n
\n
\n
\n ${collections.length === 0\n ? '

No collections available. Create collections first.

'\n : collections.map((collection) => {\n const collectionId = String(collection.id)\n const isChecked = selectedCollectionIds.has(collectionId)\n const isDismissed = dismissedCollectionIds.has(collectionId)\n const indexStatusMap: Record = data.indexStatus || {}\n const status = indexStatusMap[collectionId]\n // Only show NEW badge if collection is new, not dismissed, and has never been indexed\n const isNew = collection.is_new === true && !isDismissed && !status\n // Only show status badge if collection is CHECKED and has status\n const statusBadge = (status && isChecked)\n ? `${status.status}`\n : ''\n\n return `
\n \n
\n \n

\n ${collection.description || collection.name || 'No description'} • ${collection.item_count || 0} items\n ${status ? ` • ${status.indexed_items}/${status.total_items} indexed` : ''}\n

\n ${status && status.status === 'indexing'\n ? `
\n
\n
`\n : ''}\n
\n ${isChecked ? `\n \n \n \n \n Re-index\n \n ` : ''}\n
`\n }).join('')}\n
\n
\n\n
\n\n \n
\n

⚙️ Advanced Options

\n
\n
\n \n
\n \n

Show search suggestions as users type

\n
\n
\n\n
\n \n
\n \n

Include media files in search results

\n
\n
\n\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

\n 💡 Collections marked as NEW haven't been indexed yet\n

\n \n
\n
\n
\n\n\n \n
\n

📊 Search Analytics

\n
\n
\n
Total Queries
\n
${data.analytics.total_queries}
\n
\n
\n
AI Queries
\n
${data.analytics.ai_queries}
\n
\n
\n
Keyword Queries
\n
${data.analytics.keyword_queries}
\n
\n
\n ${data.analytics.popular_queries.length > 0\n ? `\n
\n

Popular Searches

\n
\n ${data.analytics.popular_queries.map(\n (item) => `\n
\n \"${item.query}\"\n ${item.count} times\n
\n `\n ).join('')}\n
\n
\n `\n : '

No search history yet.

'}\n
\n\n \n
\n
\n \n Settings Saved Successfully!\n
\n
\n
\n \n `\n\n return renderAdminLayout({\n title: 'AI Search Settings',\n pageTitle: 'AI Search Settings',\n currentPath: '/admin/plugins/ai-search/settings',\n user: data.user,\n content: content\n })\n}\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { requireAuth } from '../../../../middleware'\nimport { AISearchService } from '../services/ai-search'\nimport { IndexManager } from '../services/indexer'\nimport { renderSettingsPage } from '../components/settings-page'\nimport type { AISearchSettings, SearchQuery } from '../types'\n\ntype Variables = {\n user: {\n id: number\n email: string\n role: string\n }\n}\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminRoutes.use('*', requireAuth())\n\n/**\n * GET /admin/plugins/ai-search\n * Render settings page\n */\nadminRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const ai = (c.env as any).AI // Workers AI for embeddings\n const vectorize = (c.env as any).VECTORIZE_INDEX // Vectorize for vector search\n\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n // Get settings\n const settings = await service.getSettings()\n console.log('[AI Search Settings Route] Settings loaded:', !!settings)\n\n // Get all collections with status\n const collections = await service.getAllCollections()\n console.log('[AI Search Settings Route] Collections returned:', collections.length)\n \n // If no collections, try direct query\n if (collections.length === 0) {\n const directQuery = await db.prepare('SELECT id, name, display_name FROM collections WHERE is_active = 1').all()\n console.log('[AI Search Settings Route] Direct DB query found:', directQuery.results?.length || 0, 'collections')\n if (directQuery.results && directQuery.results.length > 0) {\n console.log('[AI Search Settings Route] Sample from DB:', directQuery.results[0])\n }\n } else if (collections.length > 0 && collections[0]) {\n console.log('[AI Search Settings Route] First collection:', {\n id: collections[0].id,\n name: collections[0].name,\n display_name: collections[0].display_name\n })\n }\n\n // Get new collections notifications\n const newCollections = await service.detectNewCollections()\n console.log('AI Search: New collections:', newCollections.length)\n\n // Get index status for all collections\n const indexStatus = await indexer.getAllIndexStatus()\n console.log('AI Search: Index status:', Object.keys(indexStatus).length)\n\n // Get analytics\n const analytics = await service.getSearchAnalytics()\n\n return c.html(\n renderSettingsPage({\n settings,\n collections: collections || [],\n newCollections: newCollections || [],\n indexStatus: indexStatus || {},\n analytics,\n user: {\n name: user.email,\n email: user.email,\n role: user.role,\n },\n })\n )\n } catch (error) {\n console.error('Error rendering AI Search settings:', error)\n return c.html(`

Error loading settings: ${error instanceof Error ? error.message : String(error)}

`, 500)\n }\n})\n\n/**\n * POST /admin/plugins/ai-search\n * Update settings\n */\nadminRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n console.log('[AI Search POST] Received body:', JSON.stringify(body, null, 2))\n\n // Get current settings\n const currentSettings = await service.getSettings()\n console.log('[AI Search POST] Current settings selected_collections:', currentSettings?.selected_collections)\n\n // Update settings\n const updatedSettings: Partial = {\n enabled: body.enabled !== undefined ? Boolean(body.enabled) : currentSettings?.enabled,\n ai_mode_enabled: body.ai_mode_enabled !== undefined ? Boolean(body.ai_mode_enabled) : currentSettings?.ai_mode_enabled,\n selected_collections: Array.isArray(body.selected_collections) ? body.selected_collections.map(String) : (currentSettings?.selected_collections || []),\n dismissed_collections: Array.isArray(body.dismissed_collections) ? body.dismissed_collections.map(String) : (currentSettings?.dismissed_collections || []),\n autocomplete_enabled: body.autocomplete_enabled !== undefined ? Boolean(body.autocomplete_enabled) : currentSettings?.autocomplete_enabled,\n cache_duration: body.cache_duration ? Number(body.cache_duration) : currentSettings?.cache_duration,\n results_limit: body.results_limit ? Number(body.results_limit) : currentSettings?.results_limit,\n index_media: body.index_media !== undefined ? Boolean(body.index_media) : currentSettings?.index_media,\n }\n\n console.log('[AI Search POST] Updated settings selected_collections:', updatedSettings.selected_collections)\n\n // If collections changed, trigger indexing\n const collectionsChanged =\n JSON.stringify(updatedSettings.selected_collections) !==\n JSON.stringify(currentSettings?.selected_collections || [])\n\n const saved = await service.updateSettings(updatedSettings)\n console.log('[AI Search POST] Settings saved, selected_collections:', saved.selected_collections)\n\n // Start indexing if collections were added\n if (collectionsChanged && updatedSettings.selected_collections) {\n console.log('[AI Search POST] Collections changed, starting background indexing')\n // Start indexing in background (non-blocking) - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .syncAll(updatedSettings.selected_collections)\n .then(() => console.log('[AI Search POST] Background indexing completed'))\n .catch((error) => console.error('[AI Search POST] Background indexing error:', error))\n )\n }\n\n return c.json({ success: true, settings: saved })\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n return c.json({ error: 'Failed to update settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/settings\n * Get settings API endpoint\n */\nadminRoutes.get('/api/settings', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const settings = await service.getSettings()\n return c.json({ success: true, data: settings })\n } catch (error) {\n console.error('Error fetching settings:', error)\n return c.json({ error: 'Failed to fetch settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/new-collections\n * Get new collections that aren't indexed or dismissed\n */\nadminRoutes.get('/api/new-collections', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const notifications = await service.detectNewCollections()\n return c.json({ success: true, data: notifications })\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return c.json({ error: 'Failed to detect new collections' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/status\n * Get indexing status\n */\nadminRoutes.get('/api/status', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const status = await indexer.getAllIndexStatus()\n return c.json({ success: true, data: status })\n } catch (error) {\n console.error('Error fetching index status:', error)\n return c.json({ error: 'Failed to fetch status' }, 500)\n }\n})\n\n/**\n * POST /admin/api/ai-search/reindex\n * Trigger re-indexing for a collection\n */\nadminRoutes.post('/api/reindex', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n const collectionIdRaw: unknown = body.collection_id\n const collectionId = collectionIdRaw ? String(collectionIdRaw) : ''\n\n if (!collectionId || collectionId === 'undefined' || collectionId === 'null') {\n return c.json({ error: 'collection_id is required' }, 400)\n }\n\n // Start indexing in background - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .indexCollection(collectionId)\n .then(() => console.log(`[AI Search Reindex] Completed for collection ${collectionId}`))\n .catch((error) => console.error(`[AI Search Reindex] Error for collection ${collectionId}:`, error))\n )\n\n return c.json({ success: true, message: 'Re-indexing started' })\n } catch (error) {\n console.error('Error starting re-index:', error)\n return c.json({ error: 'Failed to start re-indexing' }, 500)\n }\n})\n\nexport default adminRoutes\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { AISearchService } from '../services/ai-search'\nimport type { SearchQuery } from '../types'\n\ntype Variables = {\n user?: {\n id: number\n email: string\n role: string\n }\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * POST /api/search\n * Execute search query\n */\napiRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const body = await c.req.json()\n\n const query: SearchQuery = {\n query: body.query || '',\n mode: body.mode || 'keyword',\n filters: body.filters || {},\n limit: body.limit ? Number(body.limit) : undefined,\n offset: body.offset ? Number(body.offset) : undefined,\n }\n\n // Convert date strings to Date objects if present\n if (query.filters?.dateRange) {\n if (typeof query.filters.dateRange.start === 'string') {\n query.filters.dateRange.start = new Date(query.filters.dateRange.start)\n }\n if (typeof query.filters.dateRange.end === 'string') {\n query.filters.dateRange.end = new Date(query.filters.dateRange.end)\n }\n }\n\n const results = await service.search(query)\n\n return c.json({\n success: true,\n data: results,\n })\n } catch (error) {\n console.error('Search error:', error)\n return c.json(\n {\n success: false,\n error: 'Search failed',\n message: error instanceof Error ? error.message : String(error),\n },\n 500\n )\n }\n})\n\n/**\n * GET /api/search/suggest\n * Get search suggestions (autocomplete)\n */\napiRoutes.get('/suggest', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const query = c.req.query('q') || ''\n\n if (!query || query.length < 2) {\n return c.json({ success: true, data: [] })\n }\n\n const suggestions = await service.getSearchSuggestions(query)\n\n return c.json({\n success: true,\n data: suggestions,\n })\n } catch (error) {\n console.error('Suggestions error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get suggestions',\n },\n 500\n )\n }\n})\n\n/**\n * GET /admin/api/search/analytics\n * Get search analytics\n */\napiRoutes.get('/analytics', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const analytics = await service.getSearchAnalytics()\n\n return c.json({\n success: true,\n data: analytics,\n })\n } catch (error) {\n console.error('Analytics error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get analytics',\n },\n 500\n )\n }\n})\n\nexport default apiRoutes\n","{\n \"id\": \"ai-search\",\n \"name\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"icon\": \"magnifying-glass\",\n \"homepage\": \"https://developers.cloudflare.com/ai-search/\",\n \"repository\": \"https://github.com/sonicjs/sonicjs\",\n \"license\": \"MIT\",\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"configSchema\": {\n \"enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI Search\",\n \"description\": \"Enable or disable AI Search functionality\",\n \"default\": true\n },\n \"ai_mode_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI/Semantic Search\",\n \"description\": \"Enable AI-powered semantic search (requires Cloudflare Workers AI binding)\",\n \"default\": false\n },\n \"ai_provider\": {\n \"type\": \"string\",\n \"label\": \"AI Provider\",\n \"description\": \"Which AI service to use for semantic search\",\n \"default\": \"cloudflare\",\n \"enum\": [\n \"cloudflare\",\n \"keyword-only\"\n ]\n },\n \"autocomplete_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable Autocomplete\",\n \"description\": \"Show search suggestions as user types\",\n \"default\": true\n },\n \"cache_duration\": {\n \"type\": \"number\",\n \"label\": \"Cache Duration (hours)\",\n \"description\": \"How long to cache search results\",\n \"default\": 1,\n \"min\": 0,\n \"max\": 24\n },\n \"results_limit\": {\n \"type\": \"number\",\n \"label\": \"Results Per Page\",\n \"description\": \"Maximum number of results to show per page\",\n \"default\": 20,\n \"min\": 10,\n \"max\": 100\n },\n \"index_media\": {\n \"type\": \"boolean\",\n \"label\": \"Index Media Metadata\",\n \"description\": \"Include R2 media files in search index\",\n \"default\": false\n }\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"href\": \"/admin/plugins/ai-search\",\n \"parentId\": \"plugins\",\n \"order\": 50\n },\n \"codeName\": \"ai-search-plugin\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { AISearchService } from './services/ai-search'\nimport { IndexManager } from './services/indexer'\nimport adminRoutes from './routes/admin'\nimport apiRoutes from './routes/api'\nimport manifest from './manifest.json'\n\n/**\n * AI Search Plugin\n * \n * Provides advanced search capabilities using Cloudflare AI Search.\n * Features:\n * - Semantic/AI-powered search with natural language queries\n * - Traditional keyword search\n * - Full-text search across all content collections\n * - Advanced filtering (collections, dates, status, tags)\n * - Autocomplete suggestions\n * - Search analytics\n * - Dynamic collection discovery and indexing\n * \n * @example\n * ```typescript\n * import { AISearchService } from '@sonicjs-cms/core/plugins'\n * \n * const service = new AISearchService(db, aiSearch)\n * const results = await service.search({\n * query: 'blog posts about security',\n * mode: 'ai',\n * filters: { collections: [1, 2] }\n * })\n * ```\n */\n\nexport const aiSearchPlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('aiSearch', AISearchService)\n .addService('indexManager', IndexManager)\n .addRoute('/admin/plugins/ai-search', adminRoutes as any)\n .addRoute('/api/search', apiRoutes as any)\n .build()\n\n// Export services and types for easy import\nexport { AISearchService } from './services/ai-search'\nexport { IndexManager } from './services/indexer'\nexport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n IndexStatus,\n} from './types'\n","/**\n * Magic Link Authentication Plugin\n *\n * Provides passwordless authentication via email magic links\n * Users receive a secure one-time link to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\nimport type { Plugin, PluginContext } from '../../types'\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { AuthManager, getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst magicLinkRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nexport function createMagicLinkAuthPlugin(): Plugin {\n const magicLinkRoutes = new Hono()\n\n // Request a magic link\n magicLinkRoutes.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = magicLinkRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB as D1Database\n\n // Check rate limiting\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n const recentLinks = await db.prepare(`\n SELECT COUNT(*) as count\n FROM magic_links\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as any\n\n const rateLimitPerHour = 5 // TODO: Get from plugin settings\n if (recentLinks && recentLinks.count >= rateLimitPerHour) {\n return c.json({\n error: 'Too many requests. Please try again later.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && !allowNewUsers) {\n // Don't reveal if user exists or not for security\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.'\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Generate secure token\n const token = crypto.randomUUID() + '-' + crypto.randomUUID()\n const tokenId = crypto.randomUUID()\n const linkExpiryMinutes = 15 // TODO: Get from plugin settings\n const expiresAt = Date.now() + (linkExpiryMinutes * 60 * 1000)\n\n // Store magic link\n await db.prepare(`\n INSERT INTO magic_links (\n id, user_email, token, expires_at, used, created_at, ip_address, user_agent\n ) VALUES (?, ?, ?, ?, 0, ?, ?, ?)\n `).bind(\n tokenId,\n normalizedEmail,\n token,\n expiresAt,\n Date.now(),\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown',\n c.req.header('user-agent') || 'unknown'\n ).run()\n\n // Generate magic link URL\n const baseUrl = new URL(c.req.url).origin\n const magicLink = `${baseUrl}/auth/magic-link/verify?token=${token}`\n\n // Send email via email plugin\n try {\n const emailPlugin = c.env.plugins?.get('email')\n if (emailPlugin && emailPlugin.sendEmail) {\n await emailPlugin.sendEmail({\n to: normalizedEmail,\n subject: 'Your Magic Link to Sign In',\n html: renderMagicLinkEmail(magicLink, linkExpiryMinutes)\n })\n } else {\n console.error('Email plugin not available')\n // In production, this should fail. For now, log the link for testing\n console.log(`Magic link for ${normalizedEmail}: ${magicLink}`)\n }\n } catch (error) {\n console.error('Failed to send magic link email:', error)\n return c.json({\n error: 'Failed to send email. Please try again later.'\n }, 500)\n }\n\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.',\n // For development only - remove in production\n ...(c.env.ENVIRONMENT === 'development' && { dev_link: magicLink })\n })\n } catch (error) {\n console.error('Magic link request error:', error)\n return c.json({ error: 'Failed to process request' }, 500)\n }\n })\n\n // Verify magic link and sign in\n magicLinkRoutes.get('/verify', async (c: any) => {\n try {\n const token = c.req.query('token')\n\n if (!token) {\n return c.redirect('/auth/login?error=Invalid magic link')\n }\n\n const db = c.env.DB as D1Database\n\n // Find magic link\n const magicLink = await db.prepare(`\n SELECT * FROM magic_links\n WHERE token = ? AND used = 0\n `).bind(token).first() as any\n\n if (!magicLink) {\n return c.redirect('/auth/login?error=Invalid or expired magic link')\n }\n\n // Check expiration\n if (magicLink.expires_at < Date.now()) {\n return c.redirect('/auth/login?error=This magic link has expired')\n }\n\n // Get or create user\n let user = await db.prepare(`\n SELECT * FROM users WHERE email = ? AND is_active = 1\n `).bind(magicLink.user_email).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && allowNewUsers) {\n // Create new user\n const userId = crypto.randomUUID()\n const username = magicLink.user_email.split('@')[0]\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 1, ?, ?)\n `).bind(\n userId,\n magicLink.user_email,\n username,\n username,\n '',\n now,\n now\n ).run()\n\n user = {\n id: userId,\n email: magicLink.user_email,\n username,\n role: 'viewer'\n }\n } else if (!user) {\n return c.redirect('/auth/login?error=No account found for this email')\n }\n\n // Mark magic link as used\n await db.prepare(`\n UPDATE magic_links\n SET used = 1, used_at = ?\n WHERE id = ?\n `).bind(Date.now(), magicLink.id).run()\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwtToken = await AuthManager.generateToken(\n user.id,\n user.email,\n user.role,\n (c.env as any).JWT_SECRET,\n tokenTtl\n )\n\n // Set auth cookie\n AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl })\n\n // Update last login\n await db.prepare(`\n UPDATE users SET last_login_at = ? WHERE id = ?\n `).bind(Date.now(), user.id).run()\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?message=Successfully signed in')\n } catch (error) {\n console.error('Magic link verification error:', error)\n return c.redirect('/auth/login?error=Authentication failed')\n }\n })\n\n return {\n name: 'magic-link-auth',\n version: '1.0.0',\n description: 'Passwordless authentication via email magic links',\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n dependencies: ['email'],\n\n routes: [{\n path: '/auth/magic-link',\n handler: magicLinkRoutes,\n description: 'Magic link authentication endpoints',\n requiresAuth: false\n }],\n\n async install(context: PluginContext) {\n console.log('Installing magic-link-auth plugin...')\n // Migration is handled by plugin system\n },\n\n async activate(context: PluginContext) {\n console.log('Magic link authentication activated')\n console.log('Users can now sign in via /auth/magic-link/request')\n },\n\n async deactivate(context: PluginContext) {\n console.log('Magic link authentication deactivated')\n },\n\n async uninstall(context: PluginContext) {\n console.log('Uninstalling magic-link-auth plugin...')\n // Optionally clean up magic_links table\n // await context.db.prepare('DROP TABLE IF EXISTS magic_links').run()\n }\n }\n}\n\n/**\n * Render magic link email template\n */\nfunction renderMagicLinkEmail(magicLink: string, expiryMinutes: number): string {\n return `\n \n \n \n \n \n Your Magic Link\n \n \n \n
\n
\n

🔗 Your Magic Link

\n
\n\n
\n

Hello!

\n

You requested a magic link to sign in to your account. Click the button below to continue:

\n\n
\n Sign In\n
\n\n

⏰ This link expires in ${expiryMinutes} minutes

\n\n
\n Security Notice: If you didn't request this link, you can safely ignore this email.\n Someone may have entered your email address by mistake.\n
\n
\n\n
\n

This is an automated email from SonicJS.

\n

For security, this link can only be used once.

\n
\n
\n \n \n `\n}\n\nexport default createMagicLinkAuthPlugin()\n","export type SecurityEventType =\n | 'login_success'\n | 'login_failure'\n | 'registration'\n | 'password_reset_request'\n | 'password_reset_complete'\n | 'account_lockout'\n | 'suspicious_activity'\n | 'logout'\n | 'permission_denied'\n\nexport type SecuritySeverity = 'info' | 'warning' | 'critical'\n\nexport interface SecurityEvent {\n id: string\n eventType: SecurityEventType\n severity: SecuritySeverity\n userId?: string | null\n email?: string | null\n ipAddress?: string | null\n userAgent?: string | null\n countryCode?: string | null\n requestPath?: string | null\n requestMethod?: string | null\n details?: Record | null\n fingerprint?: string | null\n blocked: boolean\n createdAt: number\n}\n\nexport interface SecurityEventInsert {\n eventType: SecurityEventType\n severity?: SecuritySeverity\n userId?: string\n email?: string\n ipAddress?: string\n userAgent?: string\n countryCode?: string\n requestPath?: string\n requestMethod?: string\n details?: Record\n fingerprint?: string\n blocked?: boolean\n}\n\nexport interface SecurityEventFilters {\n eventType?: SecurityEventType | SecurityEventType[]\n severity?: SecuritySeverity | SecuritySeverity[]\n email?: string\n ipAddress?: string\n search?: string\n startDate?: number\n endDate?: number\n blocked?: boolean\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'event_type' | 'severity'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SecurityStats {\n totalEvents: number\n failedLogins24h: number\n failedLoginsTrend: number // percentage change vs prior 24h\n activeLockouts: number\n flaggedIPs: number\n eventsByType: Record\n eventsBySeverity: Record\n}\n\nexport interface TopIP {\n ipAddress: string\n countryCode: string | null\n failedAttempts: number\n lastSeen: number\n locked: boolean\n}\n\nexport interface HourlyBucket {\n hour: string\n count: number\n}\n\nexport interface SecurityAuditSettings {\n retention: {\n daysToKeep: number\n maxEvents: number\n autoPurge: boolean\n }\n bruteForce: {\n enabled: boolean\n maxFailedAttemptsPerIP: number\n maxFailedAttemptsPerEmail: number\n windowMinutes: number\n lockoutDurationMinutes: number\n alertThreshold: number\n }\n logging: {\n logSuccessfulLogins: boolean\n logLogouts: boolean\n logRegistrations: boolean\n logPasswordResets: boolean\n logPermissionDenied: boolean\n }\n}\n\nexport const DEFAULT_SETTINGS: SecurityAuditSettings = {\n retention: {\n daysToKeep: 90,\n maxEvents: 100000,\n autoPurge: true\n },\n bruteForce: {\n enabled: true,\n maxFailedAttemptsPerIP: 10,\n maxFailedAttemptsPerEmail: 5,\n windowMinutes: 15,\n lockoutDurationMinutes: 30,\n alertThreshold: 20\n },\n logging: {\n logSuccessfulLogins: true,\n logLogouts: true,\n logRegistrations: true,\n logPasswordResets: true,\n logPermissionDenied: true\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n SecurityEvent,\n SecurityEventInsert,\n SecurityEventFilters,\n SecurityStats,\n TopIP,\n HourlyBucket,\n SecurityAuditSettings\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nexport class SecurityAuditService {\n constructor(\n private db: D1Database,\n private settings: SecurityAuditSettings = DEFAULT_SETTINGS\n ) {}\n\n async logEvent(event: SecurityEventInsert): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO security_events (id, event_type, severity, user_id, email, ip_address, user_agent, country_code, request_path, request_method, details, fingerprint, blocked, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n event.eventType,\n event.severity || 'info',\n event.userId || null,\n event.email || null,\n event.ipAddress || null,\n event.userAgent || null,\n event.countryCode || null,\n event.requestPath || null,\n event.requestMethod || null,\n event.details ? JSON.stringify(event.details) : null,\n event.fingerprint || null,\n event.blocked ? 1 : 0,\n now\n ).run()\n\n return id\n }\n\n async getEvents(filters: SecurityEventFilters = {}): Promise<{ events: SecurityEvent[], total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.eventType) {\n if (Array.isArray(filters.eventType)) {\n conditions.push(`event_type IN (${filters.eventType.map(() => '?').join(',')})`)\n params.push(...filters.eventType)\n } else {\n conditions.push('event_type = ?')\n params.push(filters.eventType)\n }\n }\n\n if (filters.severity) {\n if (Array.isArray(filters.severity)) {\n conditions.push(`severity IN (${filters.severity.map(() => '?').join(',')})`)\n params.push(...filters.severity)\n } else {\n conditions.push('severity = ?')\n params.push(filters.severity)\n }\n }\n\n if (filters.email) {\n conditions.push('email LIKE ?')\n params.push(`%${filters.email}%`)\n }\n\n if (filters.ipAddress) {\n conditions.push('ip_address LIKE ?')\n params.push(`%${filters.ipAddress}%`)\n }\n\n if (filters.search) {\n conditions.push('(email LIKE ? OR ip_address LIKE ? OR details LIKE ?)')\n params.push(`%${filters.search}%`, `%${filters.search}%`, `%${filters.search}%`)\n }\n\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n if (filters.blocked !== undefined) {\n conditions.push('blocked = ?')\n params.push(filters.blocked ? 1 : 0)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const page = filters.page || 1\n const limit = filters.limit || 50\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM security_events ${where}`\n ).bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get page of results\n const results = await this.db.prepare(\n `SELECT * FROM security_events ${where} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...params, limit, offset).all()\n\n const events: SecurityEvent[] = (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n\n return { events, total }\n }\n\n async getEvent(id: string): Promise {\n const row = await this.db.prepare(\n 'SELECT * FROM security_events WHERE id = ?'\n ).bind(id).first()\n\n if (!row) return null\n\n return {\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }\n }\n\n async getStats(): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n const h48 = now - 48 * 60 * 60 * 1000\n\n // Total events\n const totalResult = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM security_events'\n ).first<{ count: number }>()\n\n // Failed logins last 24h\n const failed24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ?\"\n ).bind(h24).first<{ count: number }>()\n\n // Failed logins prior 24h (for trend)\n const failedPrior24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ? AND created_at < ?\"\n ).bind(h48, h24).first<{ count: number }>()\n\n const failed24h = failed24hResult?.count || 0\n const failedPrior24h = failedPrior24hResult?.count || 0\n const trend = failedPrior24h > 0\n ? Math.round(((failed24h - failedPrior24h) / failedPrior24h) * 100)\n : (failed24h > 0 ? 100 : 0)\n\n // Active lockouts (events in last lockout window)\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutsResult = await this.db.prepare(\n \"SELECT COUNT(DISTINCT ip_address) as count FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).first<{ count: number }>()\n\n // Flagged IPs (IPs with more than threshold failed attempts in window)\n const windowStart = now - (this.settings.bruteForce.windowMinutes * 60 * 1000)\n const flaggedResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM (\n SELECT ip_address FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address HAVING COUNT(*) >= ?\n )`\n ).bind(windowStart, this.settings.bruteForce.maxFailedAttemptsPerIP).first<{ count: number }>()\n\n // Events by type\n const typeResults = await this.db.prepare(\n 'SELECT event_type, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY event_type'\n ).bind(h24).all()\n\n const eventsByType: Record = {}\n for (const row of (typeResults.results || []) as any[]) {\n eventsByType[row.event_type] = row.count\n }\n\n // Events by severity\n const severityResults = await this.db.prepare(\n 'SELECT severity, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY severity'\n ).bind(h24).all()\n\n const eventsBySeverity: Record = {}\n for (const row of (severityResults.results || []) as any[]) {\n eventsBySeverity[row.severity] = row.count\n }\n\n return {\n totalEvents: totalResult?.count || 0,\n failedLogins24h: failed24h,\n failedLoginsTrend: trend,\n activeLockouts: lockoutsResult?.count || 0,\n flaggedIPs: flaggedResult?.count || 0,\n eventsByType,\n eventsBySeverity\n }\n }\n\n async getTopIPs(limit: number = 10): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n\n const results = await this.db.prepare(`\n SELECT\n ip_address,\n country_code,\n COUNT(*) as failed_attempts,\n MAX(created_at) as last_seen\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address\n ORDER BY failed_attempts DESC\n LIMIT ?\n `).bind(h24, limit).all()\n\n // Check which IPs are locked\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutResults = await this.db.prepare(\n \"SELECT DISTINCT ip_address FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).all()\n\n const lockedIPs = new Set((lockoutResults.results || []).map((r: any) => r.ip_address))\n\n return (results.results || []).map((row: any) => ({\n ipAddress: row.ip_address,\n countryCode: row.country_code,\n failedAttempts: row.failed_attempts,\n lastSeen: row.last_seen,\n locked: lockedIPs.has(row.ip_address)\n }))\n }\n\n async getHourlyTrend(hours: number = 24): Promise {\n const now = Date.now()\n const start = now - hours * 60 * 60 * 1000\n\n // Build hourly buckets\n const buckets: HourlyBucket[] = []\n for (let i = 0; i < hours; i++) {\n const bucketStart = start + i * 60 * 60 * 1000\n const date = new Date(bucketStart)\n buckets.push({\n hour: `${date.getUTCHours().toString().padStart(2, '0')}:00`,\n count: 0\n })\n }\n\n const results = await this.db.prepare(`\n SELECT\n CAST((created_at - ?) / 3600000 AS INTEGER) as bucket,\n COUNT(*) as count\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY bucket\n ORDER BY bucket\n `).bind(start, start).all()\n\n for (const row of (results.results || []) as any[]) {\n const idx = row.bucket\n if (idx >= 0 && idx < buckets.length) {\n buckets[idx]!.count = row.count\n }\n }\n\n return buckets\n }\n\n async purgeOldEvents(daysToKeep?: number): Promise {\n const days = daysToKeep || this.settings.retention.daysToKeep\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000\n\n const result = await this.db.prepare(\n 'DELETE FROM security_events WHERE created_at < ?'\n ).bind(cutoff).run()\n\n return (result.meta as any)?.changes || 0\n }\n\n async getRecentCriticalEvents(limit: number = 20): Promise {\n const results = await this.db.prepare(\n \"SELECT * FROM security_events WHERE severity = 'critical' ORDER BY created_at DESC LIMIT ?\"\n ).bind(limit).all()\n\n return (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n }\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityStats, TopIP, HourlyBucket, SecurityEvent } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecurityDashboardData {\n stats: SecurityStats\n topIPs: TopIP[]\n hourlyTrend: HourlyBucket[]\n recentCritical: SecurityEvent[]\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n const now = Date.now()\n const diff = now - ts\n\n if (diff < 60000) return 'just now'\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n return labels[type] || type\n}\n\nfunction trendArrow(trend: number): string {\n if (trend > 0) return `+${trend}%`\n if (trend < 0) return `${trend}%`\n return `0%`\n}\n\nfunction renderBarChart(data: HourlyBucket[]): string {\n if (data.length === 0) return '

No data available

'\n\n const max = Math.max(...data.map(d => d.count), 1)\n\n const bars = data.map(d => {\n const height = Math.max((d.count / max) * 100, 2)\n const color = d.count === 0\n ? 'bg-zinc-200 dark:bg-zinc-700'\n : d.count >= max * 0.75\n ? 'bg-red-500'\n : d.count >= max * 0.5\n ? 'bg-amber-500'\n : 'bg-cyan-500'\n return `\n
\n
\n \n
\n
\n 12 ? 'hidden sm:block' : ''}\">${d.hour}\n
\n `\n }).join('')\n\n return `
${bars}
`\n}\n\nexport function renderSecurityDashboard(data: SecurityDashboardData): string {\n const { stats, topIPs, hourlyTrend, recentCritical, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Dashboard

\n

\n Monitor login attempts, brute-force detection, and security events.\n

\n
\n \n
\n\n \n
\n
\n

Total Events

\n

${stats.totalEvents.toLocaleString()}

\n
\n
\n

Failed Logins (24h)

\n

\n ${stats.failedLogins24h}\n ${trendArrow(stats.failedLoginsTrend)}\n

\n
\n
\n

Active Lockouts

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${stats.activeLockouts}

\n
\n
\n

Flagged IPs

\n

0 ? 'text-amber-600 dark:text-amber-400' : 'text-zinc-950 dark:text-white'}\">${stats.flaggedIPs}

\n
\n
\n\n \n
\n \n
\n

Failed Login Attempts (24h)

\n ${renderBarChart(hourlyTrend)}\n
\n\n \n
\n

Events by Type (24h)

\n
\n ${Object.entries(stats.eventsByType).length === 0\n ? '

No events in the last 24 hours

'\n : Object.entries(stats.eventsByType)\n .sort(([, a], [, b]) => b - a)\n .map(([type, count]) => {\n const total = Object.values(stats.eventsByType).reduce((s, v) => s + v, 0)\n const pct = total > 0 ? Math.round((count / total) * 100) : 0\n return `\n
\n
\n ${eventTypeBadge(type)}\n ${count}\n
\n
\n
\n
\n
\n `\n }).join('')\n }\n
\n
\n
\n\n \n
\n \n
\n
\n

Top IPs by Failed Logins (24h)

\n
\n ${topIPs.length === 0\n ? '

No failed login attempts

'\n : `\n \n \n \n \n \n \n \n \n \n ${topIPs.map(ip => `\n \n \n \n \n \n \n `).join('')}\n \n
IP AddressCountryAttemptsStatus
${ip.ipAddress}${ip.countryCode || '-'}= 10 ? 'text-red-600 dark:text-red-400' : 'text-zinc-900 dark:text-zinc-100'}\">${ip.failedAttempts}\n ${ip.locked\n ? 'Locked'\n : 'Active'\n }\n
`\n }\n
\n\n \n
\n
\n

Recent Critical Events

\n
\n ${recentCritical.length === 0\n ? '

No critical events

'\n : `
\n ${recentCritical.slice(0, 10).map(event => `\n
\n
\n
\n ${severityBadge(event.severity)}\n ${eventTypeBadge(event.eventType)}\n
\n ${formatTimestamp(event.createdAt)}\n
\n
\n ${event.ipAddress ? `IP: ${event.ipAddress}` : ''}\n ${event.email ? ` | ${event.email}` : ''}\n
\n
\n `).join('')}\n
`\n }\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Dashboard',\n pageTitle: 'Security Dashboard',\n currentPath: '/admin/plugins/security-audit',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityEvent, SecurityEventFilters } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface EventLogPageData {\n events: SecurityEvent[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n }\n filters: SecurityEventFilters\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const colors: Record = {\n login_success: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400',\n login_failure: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n registration: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n account_lockout: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n suspicious_activity: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\n logout: 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400',\n password_reset_request: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n permission_denied: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400'\n }\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n const color = colors[type] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400'\n return `${labels[type] || type}`\n}\n\nfunction buildFilterUrl(filters: SecurityEventFilters, overrides: Record = {}): string {\n const params = new URLSearchParams()\n if (filters.eventType && !overrides.type) params.set('type', String(filters.eventType))\n if (filters.severity && !overrides.severity) params.set('severity', String(filters.severity))\n if (filters.email && !overrides.email) params.set('email', filters.email)\n if (filters.ipAddress && !overrides.ip) params.set('ip', filters.ipAddress)\n if (filters.search && !overrides.search) params.set('search', filters.search)\n\n for (const [key, value] of Object.entries(overrides)) {\n if (value) params.set(key, value)\n }\n\n const qs = params.toString()\n return `/admin/plugins/security-audit/events${qs ? '?' + qs : ''}`\n}\n\nexport function renderEventLogPage(data: EventLogPageData): string {\n const { events, pagination, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Event Log

\n

\n Browse and filter all security events. Showing ${pagination.startItem}-${pagination.endItem} of ${pagination.totalItems}.\n

\n
\n \n
\n\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n Clear\n \n
\n
\n
\n\n \n
\n ${events.length === 0\n ? `
\n \n \n \n

No events found

\n

No security events match your current filters.

\n
`\n : `
\n \n \n \n \n \n \n \n \n \n \n \n \n \n ${events.map(event => `\n \n \n \n \n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimeTypeSeverityEmailIP AddressCountryStatus
${formatTimestamp(event.createdAt)}${eventTypeBadge(event.eventType)}${severityBadge(event.severity)}${event.email || '-'}${event.ipAddress || '-'}${event.countryCode || '-'}\n ${event.blocked\n ? 'Blocked'\n : 'Allowed'\n }\n
\n
\n
Event ID: ${event.id.substring(0, 8)}...
\n
User Agent: ${event.userAgent || '-'}
\n
Path: ${event.requestPath || '-'}
\n
Fingerprint: ${event.fingerprint || '-'}
\n ${event.details ? `
Details:
${JSON.stringify(event.details, null, 2)}
` : ''}\n
\n
\n
`\n }\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n Page ${pagination.currentPage} of ${pagination.totalPages}\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : ''}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : ''}\n
\n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Event Log',\n pageTitle: 'Security Event Log',\n currentPath: '/admin/plugins/security-audit/events',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityAuditSettings } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecuritySettingsPageData {\n settings: SecurityAuditSettings\n user?: BaseUser\n version?: string\n message?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSecuritySettingsPage(data: SecuritySettingsPageData): string {\n const { settings, user, version, message, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Audit Settings

\n

\n Configure brute-force detection thresholds, event logging, and data retention.\n

\n
\n \n
\n\n ${message ? `\n
\n

${message}

\n
\n ` : ''}\n\n
\n\n \n
\n

Brute-Force Detection

\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n

Events above this count trigger critical severity

\n
\n
\n
\n\n \n
\n

Event Logging

\n
\n \n \n \n \n \n
\n
\n\n \n
\n

Data Retention

\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n\n \n
\n \n \n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Audit Settings',\n pageTitle: 'Security Audit Settings',\n currentPath: '/admin/plugins/security-audit/settings',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { PluginService } from '../../../../services'\nimport { renderSecurityDashboard, SecurityDashboardData } from '../components/dashboard-page'\nimport { renderEventLogPage, EventLogPageData } from '../components/event-log-page'\nimport { renderSecuritySettingsPage, SecuritySettingsPageData } from '../components/settings-page'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const [stats, topIPs, hourlyTrend, recentCritical] = await Promise.all([\n service.getStats(),\n service.getTopIPs(10),\n service.getHourlyTrend(24),\n service.getRecentCriticalEvents(20)\n ])\n\n const pageData: SecurityDashboardData = {\n stats,\n topIPs,\n hourlyTrend,\n recentCritical,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecurityDashboard(pageData))\n})\n\n// Event log\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n\n const filters = {\n eventType: (c.req.query('type') as SecurityEventType) || undefined,\n severity: (c.req.query('severity') as SecuritySeverity) || undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n page,\n limit\n }\n\n const { events, total } = await service.getEvents(filters)\n const totalPages = Math.ceil(total / limit)\n\n const pageData: EventLogPageData = {\n events,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: total === 0 ? 0 : (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total)\n },\n filters,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderEventLogPage(pageData))\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const pageData: SecuritySettingsPageData = {\n settings,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n message: c.req.query('message') || undefined,\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecuritySettingsPage(pageData))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const settings: SecurityAuditSettings = {\n bruteForce: {\n enabled: body['bruteForce.enabled'] === 'true',\n maxFailedAttemptsPerIP: parseInt(body['bruteForce.maxFailedAttemptsPerIP'] as string) || 10,\n maxFailedAttemptsPerEmail: parseInt(body['bruteForce.maxFailedAttemptsPerEmail'] as string) || 5,\n windowMinutes: parseInt(body['bruteForce.windowMinutes'] as string) || 15,\n lockoutDurationMinutes: parseInt(body['bruteForce.lockoutDurationMinutes'] as string) || 30,\n alertThreshold: parseInt(body['bruteForce.alertThreshold'] as string) || 20\n },\n logging: {\n logSuccessfulLogins: body['logging.logSuccessfulLogins'] === 'true',\n logLogouts: body['logging.logLogouts'] === 'true',\n logRegistrations: body['logging.logRegistrations'] === 'true',\n logPasswordResets: body['logging.logPasswordResets'] === 'true',\n logPermissionDenied: body['logging.logPermissionDenied'] === 'true'\n },\n retention: {\n daysToKeep: parseInt(body['retention.daysToKeep'] as string) || 90,\n maxEvents: parseInt(body['retention.maxEvents'] as string) || 100000,\n autoPurge: body['retention.autoPurge'] === 'true'\n }\n }\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings('security-audit', settings)\n\n // For HTMX requests, return 200\n if (c.req.header('HX-Request')) {\n return c.json({ success: true })\n }\n\n return c.redirect('/admin/plugins/security-audit/settings?message=Settings saved successfully')\n})\n\nexport { adminRoutes as securityAuditAdminRoutes }\n","import type { KVNamespace } from '@cloudflare/workers-types'\nimport type { SecurityAuditSettings } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst KV_PREFIX = 'security:bf:'\nconst LOCK_PREFIX = 'security:locked:'\n\nexport class BruteForceDetector {\n private settings: SecurityAuditSettings['bruteForce']\n\n constructor(\n private kv: KVNamespace,\n settings?: SecurityAuditSettings['bruteForce']\n ) {\n this.settings = settings || DEFAULT_SETTINGS.bruteForce\n }\n\n async recordFailedAttempt(ip: string, email: string): Promise<{\n ipCount: number\n emailCount: number\n shouldLockIP: boolean\n shouldLockEmail: boolean\n isSuspicious: boolean\n }> {\n if (!this.settings.enabled || !this.kv) {\n return { ipCount: 0, emailCount: 0, shouldLockIP: false, shouldLockEmail: false, isSuspicious: false }\n }\n\n const now = Date.now()\n const windowMs = this.settings.windowMinutes * 60 * 1000\n\n // Increment IP counter\n const ipKey = `${KV_PREFIX}ip:${ip}`\n const ipCount = await this.incrementCounter(ipKey, windowMs)\n\n // Increment email counter\n const emailKey = `${KV_PREFIX}email:${email}`\n const emailCount = await this.incrementCounter(emailKey, windowMs)\n\n // Check for multi-email from single IP (suspicious)\n const ipEmailsKey = `${KV_PREFIX}ip-emails:${ip}`\n await this.addToSet(ipEmailsKey, email, windowMs)\n const emailsFromIP = await this.getSetSize(ipEmailsKey)\n const isSuspicious = emailsFromIP >= 5\n\n const shouldLockIP = ipCount >= this.settings.maxFailedAttemptsPerIP\n const shouldLockEmail = emailCount >= this.settings.maxFailedAttemptsPerEmail\n\n return { ipCount, emailCount, shouldLockIP, shouldLockEmail, isSuspicious }\n }\n\n async isLocked(ip: string, email: string): Promise<{ locked: boolean, reason?: string }> {\n if (!this.settings.enabled || !this.kv) {\n return { locked: false }\n }\n\n const ipLocked = await this.kv.get(`${LOCK_PREFIX}ip:${ip}`)\n if (ipLocked) {\n return { locked: true, reason: 'IP address temporarily locked due to excessive failed login attempts' }\n }\n\n const emailLocked = await this.kv.get(`${LOCK_PREFIX}email:${email}`)\n if (emailLocked) {\n return { locked: true, reason: 'Account temporarily locked due to excessive failed login attempts' }\n }\n\n return { locked: false }\n }\n\n async lockIP(ip: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}ip:${ip}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_ip'\n }), { expirationTtl: ttl })\n }\n\n async lockEmail(email: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}email:${email}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_email'\n }), { expirationTtl: ttl })\n }\n\n async unlockIP(ip: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}ip:${ip}`)\n }\n\n async unlockEmail(email: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}email:${email}`)\n }\n\n async getActiveLockouts(): Promise> {\n if (!this.kv) return []\n // KV list with prefix to find all active lockouts\n const ipLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}ip:` })\n const emailLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}email:` })\n\n const lockouts: Array<{ key: string, type: 'ip' | 'email', value: string, lockedAt: number }> = []\n\n for (const key of ipLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'ip',\n value: key.name.replace(`${LOCK_PREFIX}ip:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n for (const key of emailLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'email',\n value: key.name.replace(`${LOCK_PREFIX}email:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n return lockouts\n }\n\n async releaseLockout(key: string): Promise {\n if (!this.kv) return\n await this.kv.delete(key)\n }\n\n isAboveAlertThreshold(count: number): boolean {\n return count >= this.settings.alertThreshold\n }\n\n private async incrementCounter(key: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n const now = Date.now()\n\n let entries: number[] = []\n if (existing) {\n try {\n entries = JSON.parse(existing)\n } catch {\n entries = []\n }\n }\n\n // Remove expired entries\n const cutoff = now - windowMs\n entries = entries.filter(ts => ts > cutoff)\n\n // Add new entry\n entries.push(now)\n\n // Store with TTL equal to window\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(entries), { expirationTtl: ttlSeconds })\n\n return entries.length\n }\n\n private async addToSet(key: string, value: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n let set: Record = {}\n const now = Date.now()\n const cutoff = now - windowMs\n\n if (existing) {\n try {\n set = JSON.parse(existing)\n } catch {\n set = {}\n }\n }\n\n // Remove expired entries\n for (const [k, ts] of Object.entries(set)) {\n if (ts < cutoff) delete set[k]\n }\n\n set[value] = now\n\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(set), { expirationTtl: ttlSeconds })\n }\n\n private async getSetSize(key: string): Promise {\n const existing = await this.kv.get(key)\n if (!existing) return 0\n\n try {\n const set = JSON.parse(existing)\n return Object.keys(set).length\n } catch {\n return 0\n }\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventFilters, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\napiRoutes.use('*', requireAuth())\n\n// Check admin role\napiRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// GET /api/security-audit/events\napiRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? Math.min(parseInt(c.req.query('limit')!), 100) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await service.getEvents(filters)\n return c.json(result)\n})\n\n// GET /api/security-audit/events/:id\napiRoutes.get('/events/:id', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const event = await service.getEvent(c.req.param('id'))\n\n if (!event) {\n return c.json({ error: 'Event not found' }, 404)\n }\n\n return c.json(event)\n})\n\n// GET /api/security-audit/stats\napiRoutes.get('/stats', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const stats = await service.getStats()\n return c.json(stats)\n})\n\n// GET /api/security-audit/stats/ips\napiRoutes.get('/stats/ips', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const limit = c.req.query('limit') ? parseInt(c.req.query('limit')!) : 10\n const ips = await service.getTopIPs(limit)\n return c.json(ips)\n})\n\n// GET /api/security-audit/stats/trend\napiRoutes.get('/stats/trend', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const hours = c.req.query('hours') ? parseInt(c.req.query('hours')!) : 24\n const trend = await service.getHourlyTrend(hours)\n return c.json(trend)\n})\n\n// GET /api/security-audit/lockouts\napiRoutes.get('/lockouts', async (c) => {\n const kv = c.env.CACHE_KV\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n const lockouts = await detector.getActiveLockouts()\n return c.json(lockouts)\n})\n\n// DELETE /api/security-audit/lockouts/:key\napiRoutes.delete('/lockouts/:key', async (c) => {\n const kv = c.env.CACHE_KV\n const key = decodeURIComponent(c.req.param('key'))\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n await detector.releaseLockout(key)\n return c.json({ success: true })\n})\n\n// POST /api/security-audit/events/purge\napiRoutes.post('/events/purge', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const body = await c.req.json().catch(() => ({})) as { daysToKeep?: number }\n const deleted = await service.purgeOldEvents(body.daysToKeep)\n return c.json({ success: true, deleted })\n})\n\n// GET /api/security-audit/export\napiRoutes.get('/export', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const format = c.req.query('format') || 'json'\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n limit: 10000,\n page: 1\n }\n\n const { events } = await service.getEvents(filters)\n\n if (format === 'csv') {\n const headers = ['id', 'event_type', 'severity', 'email', 'ip_address', 'country_code', 'blocked', 'created_at']\n const csvRows = [headers.join(',')]\n for (const event of events) {\n csvRows.push([\n event.id,\n event.eventType,\n event.severity,\n event.email || '',\n event.ipAddress || '',\n event.countryCode || '',\n event.blocked ? '1' : '0',\n new Date(event.createdAt).toISOString()\n ].map(v => `\"${String(v).replace(/\"/g, '\"\"')}\"`).join(','))\n }\n\n return new Response(csvRows.join('\\n'), {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"security-events-${Date.now()}.csv\"`\n }\n })\n }\n\n return c.json(events)\n})\n\nexport { apiRoutes as securityAuditApiRoutes }\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../../../../app'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { SecurityAuditSettings, SecurityEventType } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nfunction extractRequestInfo(c: Context<{ Bindings: Bindings; Variables: Variables }>) {\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n const countryCode = c.req.header('cf-ipcountry') || null\n const path = new URL(c.req.url).pathname\n const method = c.req.method\n\n return { ip, userAgent, countryCode, path, method }\n}\n\nfunction generateFingerprint(ip: string, userAgent: string): string {\n // Simple fingerprint from IP + UA - using a basic hash\n const str = `${ip}:${userAgent}`\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash |= 0\n }\n return Math.abs(hash).toString(36)\n}\n\nasync function getPluginSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch {\n // Plugin not installed or DB not ready\n }\n return DEFAULT_SETTINGS\n}\n\nasync function isPluginActive(db: any): Promise {\n try {\n const result = await db.prepare(\n \"SELECT status FROM plugins WHERE id = 'security-audit'\"\n ).first() as { status: string } | null\n return result?.status === 'active'\n } catch {\n return false\n }\n}\n\nexport function securityAuditMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n\n // Only intercept auth-related routes\n if (!path.startsWith('/auth/')) {\n return next()\n }\n\n const db = c.env.DB\n\n // Check if plugin is active\n if (!await isPluginActive(db)) {\n return next()\n }\n\n const settings = await getPluginSettings(db)\n const { ip, userAgent, countryCode, method } = extractRequestInfo(c)\n const fingerprint = generateFingerprint(ip, userAgent)\n\n // For login POST, extract email and check lockout before proceeding\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n let preExtractedEmail = ''\n\n if (isLoginPost) {\n try {\n if (path === '/auth/login/form') {\n // Form-based login: clone request to read formData without consuming it\n const clonedReq = c.req.raw.clone()\n const formData = await clonedReq.formData()\n preExtractedEmail = (formData.get('email') as string || '').toLowerCase()\n } else {\n // JSON login: Hono caches parsed JSON so this is safe\n const body = await c.req.json()\n preExtractedEmail = body?.email?.toLowerCase() || ''\n }\n } catch {\n // Can't parse body, continue\n }\n\n if (preExtractedEmail && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const lockStatus = await detector.isLocked(ip, preExtractedEmail)\n\n if (lockStatus.locked) {\n const service = new SecurityAuditService(db, settings)\n // Log the blocked attempt asynchronously\n const logPromise = service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: preExtractedEmail,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n blocked: true,\n details: { reason: lockStatus.reason }\n })\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n\n return c.json({\n error: lockStatus.reason || 'Too many failed attempts. Please try again later.'\n }, 429)\n }\n }\n }\n\n // Proceed with the request\n await next()\n\n // After response, log the event asynchronously\n const logPromise = logAuthEvent(c, db, settings, ip, userAgent, countryCode, fingerprint, path, method, preExtractedEmail)\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n }\n}\n\nasync function logAuthEvent(\n c: Context<{ Bindings: Bindings; Variables: Variables }>,\n db: any,\n settings: SecurityAuditSettings,\n ip: string,\n userAgent: string,\n countryCode: string | null,\n fingerprint: string,\n path: string,\n method: string,\n preExtractedEmail: string = ''\n): Promise {\n try {\n const service = new SecurityAuditService(db, settings)\n const status = c.res.status\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n const isFormLogin = path === '/auth/login/form'\n\n // Login POST\n if (isLoginPost) {\n // Determine if login succeeded or failed.\n // JSON login: 200 = success, 401/400 = failure\n // Form login: always returns 200 — check if response set an auth cookie (HX-Redirect header indicates success)\n let loginSucceeded: boolean\n if (isFormLogin) {\n // Form login redirects to /admin on success via HX-Redirect header or meta refresh\n const hxRedirect = c.res.headers.get('HX-Redirect')\n const setCookieHeader = c.res.headers.get('set-cookie') || ''\n loginSucceeded = !!(hxRedirect?.includes('/admin') || setCookieHeader.includes('auth_token'))\n } else {\n loginSucceeded = status === 200\n }\n\n if (loginSucceeded) {\n if (!settings.logging.logSuccessfulLogins) return\n\n // Try to get user info from response\n let email = preExtractedEmail\n let userId = ''\n if (!isFormLogin) {\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || email\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n }\n\n await service.logEvent({\n eventType: 'login_success',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n } else {\n // Failed login — use pre-extracted email since body is already consumed\n const email = preExtractedEmail\n\n await service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { statusCode: status }\n })\n\n // Record failed attempt for brute-force detection\n if (email && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const result = await detector.recordFailedAttempt(ip, email)\n\n if (result.shouldLockIP) {\n await detector.lockIP(ip)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_ip', attemptCount: result.ipCount }\n })\n }\n\n if (result.shouldLockEmail) {\n await detector.lockEmail(email)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_email', attemptCount: result.emailCount }\n })\n }\n\n if (result.isSuspicious) {\n await service.logEvent({\n eventType: 'suspicious_activity',\n severity: 'critical',\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'multiple_emails_from_ip', ipCount: result.ipCount }\n })\n }\n }\n }\n }\n\n // Registration POST\n if (path === '/auth/register' && method === 'POST' && settings.logging.logRegistrations) {\n if (status === 201 || status === 200) {\n let email = ''\n let userId = ''\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || ''\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n\n await service.logEvent({\n eventType: 'registration',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n }\n\n // Logout\n if (path === '/auth/logout' && settings.logging.logLogouts) {\n const user = c.get('user')\n await service.logEvent({\n eventType: 'logout',\n severity: 'info',\n userId: user?.userId,\n email: user?.email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n } catch (error) {\n console.error('[SecurityAudit] Error logging auth event:', error)\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { securityAuditAdminRoutes } from './routes/admin'\nimport { securityAuditApiRoutes } from './routes/api'\nimport { securityAuditMiddleware } from './middleware/audit-middleware'\n\nexport function createSecurityAuditPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'security-audit',\n version: '1.0.0-beta.1',\n description: 'Security event logging, brute-force detection, and analytics dashboard'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard and event log routes\n builder.addRoute('/admin/plugins/security-audit', securityAuditAdminRoutes as any, {\n description: 'Security audit dashboard and admin pages',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes\n builder.addRoute('/api/security-audit', securityAuditApiRoutes as any, {\n description: 'Security audit API endpoints',\n requiresAuth: true,\n priority: 50\n })\n\n // Admin menu item — icon is raw SVG to match sidebar rendering\n builder.addMenuItem('Security', '/admin/plugins/security-audit', {\n icon: ``,\n order: 85\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async (context) => {\n console.log('[SecurityAudit] Plugin installed')\n },\n activate: async (context) => {\n console.log('[SecurityAudit] Plugin activated')\n },\n deactivate: async (context) => {\n console.log('[SecurityAudit] Plugin deactivated')\n },\n uninstall: async (context) => {\n console.log('[SecurityAudit] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const securityAuditPlugin = createSecurityAuditPlugin()\nexport { SecurityAuditService } from './services/security-audit-service'\nexport { BruteForceDetector } from './services/brute-force-detector'\nexport { securityAuditMiddleware } from './middleware/audit-middleware'\nexport default securityAuditPlugin\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n Subscription,\n SubscriptionInsert,\n SubscriptionFilters,\n SubscriptionStats,\n SubscriptionStatus\n} from '../types'\n\n/**\n * Manages subscription records in D1\n */\nexport class SubscriptionService {\n constructor(private db: D1Database) {}\n\n /**\n * Ensure the subscriptions table exists\n */\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS subscriptions (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n user_id TEXT NOT NULL,\n stripe_customer_id TEXT NOT NULL,\n stripe_subscription_id TEXT NOT NULL UNIQUE,\n stripe_price_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'incomplete',\n current_period_start INTEGER NOT NULL DEFAULT 0,\n current_period_end INTEGER NOT NULL DEFAULT 0,\n cancel_at_period_end INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\n )\n `).run()\n\n // Indexes for common lookups\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_user_id ON subscriptions(user_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_customer_id ON subscriptions(stripe_customer_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_subscription_id ON subscriptions(stripe_subscription_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_status ON subscriptions(status)\n `).run()\n }\n\n /**\n * Create a new subscription record\n */\n async create(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Upsert a subscription by stripe_subscription_id (INSERT or UPDATE on conflict)\n */\n async upsert(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_subscription_id) DO UPDATE SET\n status = excluded.status,\n stripe_price_id = excluded.stripe_price_id,\n current_period_start = excluded.current_period_start,\n current_period_end = excluded.current_period_end,\n cancel_at_period_end = excluded.cancel_at_period_end,\n updated_at = unixepoch()\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Update a subscription by its Stripe subscription ID\n */\n async updateByStripeId(stripeSubscriptionId: string, data: Partial): Promise {\n const sets: string[] = []\n const values: any[] = []\n\n if (data.status !== undefined) {\n sets.push('status = ?')\n values.push(data.status)\n }\n if (data.stripePriceId !== undefined) {\n sets.push('stripe_price_id = ?')\n values.push(data.stripePriceId)\n }\n if (data.currentPeriodStart !== undefined) {\n sets.push('current_period_start = ?')\n values.push(data.currentPeriodStart)\n }\n if (data.currentPeriodEnd !== undefined) {\n sets.push('current_period_end = ?')\n values.push(data.currentPeriodEnd)\n }\n if (data.cancelAtPeriodEnd !== undefined) {\n sets.push('cancel_at_period_end = ?')\n values.push(data.cancelAtPeriodEnd ? 1 : 0)\n }\n\n if (sets.length === 0) return this.getByStripeSubscriptionId(stripeSubscriptionId)\n\n sets.push('updated_at = unixepoch()')\n values.push(stripeSubscriptionId)\n\n const result = await this.db.prepare(`\n UPDATE subscriptions SET ${sets.join(', ')} WHERE stripe_subscription_id = ? RETURNING *\n `).bind(...values).first()\n\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe subscription ID\n */\n async getByStripeSubscriptionId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get the active subscription for a user\n */\n async getByUserId(userId: string): Promise {\n const result = await this.db.prepare(\n \"SELECT * FROM subscriptions WHERE user_id = ? ORDER BY CASE WHEN status = 'active' THEN 0 WHEN status = 'trialing' THEN 1 ELSE 2 END, updated_at DESC LIMIT 1\"\n ).bind(userId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe customer ID\n */\n async getByStripeCustomerId(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_customer_id = ? ORDER BY updated_at DESC LIMIT 1'\n ).bind(stripeCustomerId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Find the userId linked to a Stripe customer ID\n */\n async getUserIdByStripeCustomer(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT user_id FROM subscriptions WHERE stripe_customer_id = ? LIMIT 1'\n ).bind(stripeCustomerId).first() as { user_id: string } | null\n return result?.user_id ?? null\n }\n\n /**\n * List subscriptions with filters and pagination\n */\n async list(filters: SubscriptionFilters = {}): Promise<{ subscriptions: Subscription[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.userId) {\n where.push('user_id = ?')\n values.push(filters.userId)\n }\n if (filters.stripeCustomerId) {\n where.push('stripe_customer_id = ?')\n values.push(filters.stripeCustomerId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM subscriptions ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n // Get paginated results\n const results = await this.db.prepare(\n `SELECT s.*, u.email as user_email FROM subscriptions s LEFT JOIN users u ON s.user_id = u.id ${whereClause} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n subscriptions: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n /**\n * Get subscription stats\n */\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\n SUM(CASE WHEN status = 'canceled' THEN 1 ELSE 0 END) as canceled,\n SUM(CASE WHEN status = 'past_due' THEN 1 ELSE 0 END) as past_due,\n SUM(CASE WHEN status = 'trialing' THEN 1 ELSE 0 END) as trialing\n FROM subscriptions\n `).first() as any\n\n return {\n total: result?.total || 0,\n active: result?.active || 0,\n canceled: result?.canceled || 0,\n pastDue: result?.past_due || 0,\n trialing: result?.trialing || 0\n }\n }\n\n /**\n * Delete a subscription record by Stripe subscription ID\n */\n async deleteByStripeId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'DELETE FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).run()\n return (result.meta?.changes || 0) > 0\n }\n\n private mapRow(row: Record): Subscription {\n return {\n id: row.id,\n userId: row.user_id,\n stripeCustomerId: row.stripe_customer_id,\n stripeSubscriptionId: row.stripe_subscription_id,\n stripePriceId: row.stripe_price_id,\n status: row.status as SubscriptionStatus,\n currentPeriodStart: row.current_period_start,\n currentPeriodEnd: row.current_period_end,\n cancelAtPeriodEnd: !!row.cancel_at_period_end,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n // Attach email if joined\n ...(row.user_email ? { userEmail: row.user_email } : {})\n } as Subscription\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { StripeEventRecord, StripeEventFilters, StripeEventStats } from '../types'\n\n/**\n * Manages Stripe event log records in D1\n */\nexport class StripeEventService {\n constructor(private db: D1Database) {}\n\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS stripe_events (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n stripe_event_id TEXT NOT NULL UNIQUE,\n type TEXT NOT NULL,\n object_id TEXT NOT NULL DEFAULT '',\n object_type TEXT NOT NULL DEFAULT '',\n data TEXT NOT NULL DEFAULT '{}',\n processed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n status TEXT NOT NULL DEFAULT 'processed',\n error TEXT\n )\n `).run()\n\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_type ON stripe_events(type)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_status ON stripe_events(status)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_processed_at ON stripe_events(processed_at DESC)\n `).run()\n }\n\n async log(event: {\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: Record\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n }): Promise {\n await this.db.prepare(`\n INSERT INTO stripe_events (stripe_event_id, type, object_id, object_type, data, status, error)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_event_id) DO UPDATE SET\n status = excluded.status,\n error = excluded.error,\n processed_at = unixepoch()\n `).bind(\n event.stripeEventId,\n event.type,\n event.objectId,\n event.objectType,\n JSON.stringify(event.data),\n event.status,\n event.error || null\n ).run()\n }\n\n async list(filters: StripeEventFilters = {}): Promise<{ events: StripeEventRecord[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.type) {\n where.push('type = ?')\n values.push(filters.type)\n }\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.objectId) {\n where.push('object_id = ?')\n values.push(filters.objectId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM stripe_events ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n const results = await this.db.prepare(\n `SELECT * FROM stripe_events ${whereClause} ORDER BY processed_at DESC LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n events: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'processed' THEN 1 ELSE 0 END) as processed,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'ignored' THEN 1 ELSE 0 END) as ignored\n FROM stripe_events\n `).first() as any\n\n return {\n total: result?.total || 0,\n processed: result?.processed || 0,\n failed: result?.failed || 0,\n ignored: result?.ignored || 0\n }\n }\n\n async getDistinctTypes(): Promise {\n const results = await this.db.prepare(\n 'SELECT DISTINCT type FROM stripe_events ORDER BY type'\n ).all()\n return (results.results || []).map((r: any) => r.type)\n }\n\n private mapRow(row: Record): StripeEventRecord {\n return {\n id: row.id,\n stripeEventId: row.stripe_event_id,\n type: row.type,\n objectId: row.object_id,\n objectType: row.object_type,\n data: row.data,\n processedAt: row.processed_at,\n status: row.status,\n error: row.error || undefined\n }\n }\n}\n","import type { Subscription, SubscriptionStats, SubscriptionStatus } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface StripePageData {\n subscriptions: (Subscription & { userEmail?: string })[]\n stats: SubscriptionStats\n filters: { status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSubscriptionsPage(data: StripePageData): string {\n const { subscriptions, stats, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Manage subscriptions, view billing status, and monitor payment events.\n

\n
\n
\n \n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe')}\n\n \n
\n ${statsCard('Total', stats.total, 'text-zinc-950 dark:text-white')}\n ${statsCard('Active', stats.active, 'text-emerald-600 dark:text-emerald-400')}\n ${statsCard('Trialing', stats.trialing, 'text-blue-600 dark:text-blue-400')}\n ${statsCard('Past Due', stats.pastDue, 'text-amber-600 dark:text-amber-400')}\n ${statsCard('Canceled', stats.canceled, 'text-red-600 dark:text-red-400')}\n
\n\n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${subscriptions.length === 0\n ? ''\n : subscriptions.map(renderRow).join('')\n }\n \n
UserStatusPrice IDCurrent PeriodCancel at EndStripe
No subscriptions found
\n\n ${renderPagination(filters.page, filters.totalPages, filters.status)}\n
\n\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Subscriptions',\n pageTitle: 'Stripe Subscriptions',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction statsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction statusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.replace('_', ' ').replace(/\\b\\w/g, c => c.toUpperCase())\n return ``\n}\n\nfunction statusBadge(status: SubscriptionStatus): string {\n const colors: Record = {\n active: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n trialing: 'bg-blue-400/10 text-blue-500 dark:text-blue-400 ring-blue-400/20',\n past_due: 'bg-amber-400/10 text-amber-500 dark:text-amber-400 ring-amber-400/20',\n canceled: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n unpaid: 'bg-orange-400/10 text-orange-500 dark:text-orange-400 ring-orange-400/20',\n paused: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete_expired: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n const label = status.replace('_', ' ')\n return `${label}`\n}\n\nfunction formatDate(timestamp: number): string {\n if (!timestamp) return '-'\n return new Date(timestamp * 1000).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })\n}\n\nfunction renderRow(sub: Subscription & { userEmail?: string }): string {\n return `\n \n \n
${sub.userEmail || sub.userId}
\n
${sub.stripeCustomerId}
\n \n ${statusBadge(sub.status)}\n ${sub.stripePriceId}\n \n ${formatDate(sub.currentPeriodStart)} - ${formatDate(sub.currentPeriodEnd)}\n \n \n ${sub.cancelAtPeriodEnd\n ? 'Yes'\n : 'No'\n }\n \n \n \n View in Stripe\n \n \n \n `\n}\n\nfunction renderPagination(page: number, totalPages: number, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params = status ? `&status=${status}` : ''\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","/**\n * Shared tab bar for all Stripe admin pages.\n */\n\nconst TABS = [\n { label: 'Subscriptions', path: '/admin/plugins/stripe' },\n { label: 'Events', path: '/admin/plugins/stripe/events' },\n { label: 'Settings', path: '/admin/plugins/stripe/settings' },\n]\n\nexport function renderStripeTabBar(currentPath: string): string {\n const tabs = TABS.map(tab => {\n const isActive = currentPath === tab.path\n || (tab.path === '/admin/plugins/stripe' && currentPath === '/admin/plugins/stripe/')\n return `\n \n ${tab.label}\n `\n }).join('')\n\n return `\n
\n \n
\n `\n}\n","import type { StripeEventRecord, StripeEventStats } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface EventsPageData {\n events: StripeEventRecord[]\n stats: StripeEventStats\n types: string[]\n filters: { type?: string; status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderEventsPage(data: EventsPageData): string {\n const { events, stats, types, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Webhook event log showing all processed, failed, and ignored Stripe events.\n

\n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/events')}\n\n \n
\n ${eventStatsCard('Total Events', stats.total, 'text-zinc-950 dark:text-white')}\n ${eventStatsCard('Processed', stats.processed, 'text-emerald-600 dark:text-emerald-400')}\n ${eventStatsCard('Failed', stats.failed, 'text-red-600 dark:text-red-400')}\n ${eventStatsCard('Ignored', stats.ignored, 'text-zinc-500 dark:text-zinc-400')}\n
\n\n \n
\n
\n \n \n\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n ${events.length === 0\n ? ''\n : events.map(renderEventRow).join('')\n }\n \n
TimeTypeObject / UserStatusEvent ID
No events recorded yet
\n\n ${renderEventPagination(filters.page, filters.totalPages, filters.type, filters.status)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Events',\n pageTitle: 'Stripe Events',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction eventStatsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction eventStatusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.charAt(0).toUpperCase() + value.slice(1)\n return ``\n}\n\nfunction eventStatusBadge(status: string): string {\n const colors: Record = {\n processed: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n failed: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n ignored: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n return `${status}`\n}\n\nfunction formatTimestamp(timestamp: number): string {\n if (!timestamp) return '-'\n const d = new Date(timestamp * 1000)\n return d.toLocaleString('en-US', {\n month: 'short', day: 'numeric', year: 'numeric',\n hour: '2-digit', minute: '2-digit', second: '2-digit'\n })\n}\n\nfunction extractUserInfo(event: StripeEventRecord): { userId?: string; email?: string } {\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n const userId = data?.metadata?.sonicjs_user_id || data?.sonicjs_user_id\n const email = data?.customer_email || data?.customerEmail || data?.receipt_email\n return { userId: userId || undefined, email: email || undefined }\n } catch {\n return {}\n }\n}\n\nfunction renderEventRow(event: StripeEventRecord): string {\n const errorTooltip = event.error ? ` title=\"${event.error.replace(/\"/g, '"')}\"` : ''\n const userInfo = extractUserInfo(event)\n const userLink = userInfo.userId\n ? `${userInfo.email || userInfo.userId}`\n : userInfo.email\n ? `${userInfo.email}`\n : ''\n\n return `\n \n \n ${formatTimestamp(event.processedAt)}\n \n \n ${event.type}\n \n \n
${event.objectId || '-'}
\n
${event.objectType}
\n ${userLink ? `
${userLink}
` : ''}\n \n ${eventStatusBadge(event.status)}\n ${event.stripeEventId}\n \n `\n}\n\nfunction renderEventPagination(page: number, totalPages: number, type?: string, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params: string[] = []\n if (type) params.push(`type=${type}`)\n if (status) params.push(`status=${status}`)\n const extra = params.length > 0 ? `&${params.join('&')}` : ''\n\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","// ============================================================================\n// Stripe Plugin Types\n// ============================================================================\n\nexport type SubscriptionStatus =\n | 'active'\n | 'canceled'\n | 'past_due'\n | 'trialing'\n | 'unpaid'\n | 'paused'\n | 'incomplete'\n | 'incomplete_expired'\n\nexport interface Subscription {\n id: string\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd: boolean\n createdAt: number\n updatedAt: number\n}\n\nexport interface SubscriptionInsert {\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd?: boolean\n}\n\nexport interface SubscriptionFilters {\n status?: SubscriptionStatus\n userId?: string\n stripeCustomerId?: string\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'updated_at' | 'status'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SubscriptionStats {\n total: number\n active: number\n canceled: number\n pastDue: number\n trialing: number\n}\n\nexport interface StripePluginSettings {\n stripePublishableKey: string\n stripeSecretKey: string\n stripeWebhookSecret: string\n stripePriceId?: string\n successUrl: string\n cancelUrl: string\n}\n\nexport const DEFAULT_SETTINGS: StripePluginSettings = {\n stripePublishableKey: '',\n stripeSecretKey: '',\n stripeWebhookSecret: '',\n stripePriceId: '',\n successUrl: '/admin/dashboard',\n cancelUrl: '/admin/dashboard'\n}\n\n// Stripe webhook event types we handle\nexport type StripeWebhookEventType =\n | 'customer.subscription.created'\n | 'customer.subscription.updated'\n | 'customer.subscription.deleted'\n | 'checkout.session.completed'\n | 'invoice.payment_succeeded'\n | 'invoice.payment_failed'\n\n// Minimal Stripe types (we use fetch, not the SDK)\nexport interface StripeEvent {\n id: string\n type: string\n data: {\n object: Record\n }\n}\n\nexport interface StripeSubscriptionObject {\n id: string\n customer: string\n status: string\n items: {\n data: Array<{\n price: {\n id: string\n }\n }>\n }\n current_period_start: number\n current_period_end: number\n cancel_at_period_end: boolean\n metadata?: Record\n}\n\nexport interface StripeCheckoutSession {\n id: string\n customer: string\n subscription: string\n metadata?: Record\n}\n\nexport interface StripeInvoice {\n id: string\n customer: string\n subscription: string | null\n status: string\n amount_paid: number\n currency: string\n}\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\nexport interface StripeEventRecord {\n id: string\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: string // JSON string\n processedAt: number\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n}\n\nexport interface StripeEventFilters {\n type?: string\n status?: 'processed' | 'failed' | 'ignored'\n objectId?: string\n page?: number\n limit?: number\n}\n\nexport interface StripeEventStats {\n total: number\n processed: number\n failed: number\n ignored: number\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { renderSubscriptionsPage } from '../components/subscriptions-page'\nimport { renderEventsPage } from '../components/events-page'\nimport { renderStripeTabBar } from '../components/tab-bar'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { StripePluginSettings, SubscriptionStatus } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Subscriptions dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const statusFilter = c.req.query('status') as SubscriptionStatus | undefined\n\n const [{ subscriptions, total }, stats] = await Promise.all([\n subscriptionService.list({ status: statusFilter, page, limit }),\n subscriptionService.getStats()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderSubscriptionsPage({\n subscriptions: subscriptions as any,\n stats,\n filters: { status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Events log page\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const typeFilter = c.req.query('type') || undefined\n const statusFilter = c.req.query('status') as 'processed' | 'failed' | 'ignored' | undefined\n\n const [{ events, total }, stats, types] = await Promise.all([\n eventService.list({ type: typeFilter, status: statusFilter, page, limit }),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderEventsPage({\n events,\n stats,\n types,\n filters: { type: typeFilter, status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const { renderAdminLayoutCatalyst } = await import('../../../../templates/layouts/admin-layout-catalyst.template')\n\n const content = `\n
\n
\n

Stripe

\n

\n Configure your Stripe API keys and checkout options.\n

\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/settings')}\n\n
\n\n
\n
\n
\n \n \n

Your Stripe publishable key (starts with pk_)

\n
\n\n
\n \n \n

Your Stripe secret API key (starts with sk_)

\n
\n\n
\n \n \n

Stripe webhook endpoint signing secret (starts with whsec_)

\n
\n\n
\n \n \n

Default Stripe Price ID for checkout sessions (optional)

\n
\n\n
\n \n \n

Redirect URL after successful checkout

\n
\n\n
\n \n \n

Redirect URL if checkout is cancelled

\n
\n
\n\n
\n \n
\n
\n
\n\n \n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Stripe Settings',\n pageTitle: 'Stripe Settings',\n currentPath: '/admin/plugins/stripe',\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n content,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'stripe'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving Stripe settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n})\n\nexport { adminRoutes as stripeAdminRoutes }\n","import type { StripePluginSettings } from '../types'\n\n/**\n * Lightweight Stripe API client using fetch (CF Workers compatible, no SDK needed)\n */\nexport class StripeAPI {\n private baseUrl = 'https://api.stripe.com/v1'\n\n constructor(private secretKey: string) {}\n\n /**\n * Verify a webhook signature\n * Implements Stripe's v1 signature scheme using Web Crypto API\n */\n async verifyWebhookSignature(payload: string, sigHeader: string, secret: string): Promise {\n const parts = sigHeader.split(',')\n const timestamp = parts.find(p => p.startsWith('t='))?.split('=')[1]\n const signatures = parts\n .filter(p => p.startsWith('v1='))\n .map(p => p.substring(3))\n\n if (!timestamp || signatures.length === 0) return false\n\n // Reject events older than 5 minutes (tolerance)\n const now = Math.floor(Date.now() / 1000)\n if (Math.abs(now - parseInt(timestamp)) > 300) return false\n\n // Compute expected signature\n const signedPayload = `${timestamp}.${payload}`\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(signedPayload))\n const expectedSignature = Array.from(new Uint8Array(signatureBuffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n\n return signatures.some(sig => timingSafeEqual(sig, expectedSignature))\n }\n\n /**\n * Create a Checkout Session\n */\n async createCheckoutSession(params: {\n priceId: string\n customerId?: string\n customerEmail?: string\n successUrl: string\n cancelUrl: string\n metadata?: Record\n }): Promise<{ id: string; url: string }> {\n const body = new URLSearchParams()\n body.append('mode', 'subscription')\n body.append('line_items[0][price]', params.priceId)\n body.append('line_items[0][quantity]', '1')\n body.append('success_url', params.successUrl)\n body.append('cancel_url', params.cancelUrl)\n\n if (params.customerId) {\n body.append('customer', params.customerId)\n } else if (params.customerEmail) {\n body.append('customer_email', params.customerEmail)\n }\n\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n\n const response = await this.request('POST', '/checkout/sessions', body)\n return { id: response.id, url: response.url }\n }\n\n /**\n * Retrieve a Stripe subscription\n */\n async getSubscription(subscriptionId: string): Promise {\n return this.request('GET', `/subscriptions/${subscriptionId}`)\n }\n\n /**\n * Create a Stripe customer\n */\n async createCustomer(params: { email: string; metadata?: Record }): Promise<{ id: string }> {\n const body = new URLSearchParams()\n body.append('email', params.email)\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n return this.request('POST', '/customers', body)\n }\n\n /**\n * List subscriptions with pagination (auto-expands across pages)\n */\n async listSubscriptions(params?: {\n status?: string\n limit?: number\n startingAfter?: string\n }): Promise<{ data: any[]; has_more: boolean }> {\n const qs = new URLSearchParams()\n qs.append('limit', String(params?.limit || 100))\n if (params?.status) qs.append('status', params.status)\n if (params?.startingAfter) qs.append('starting_after', params.startingAfter)\n return this.request('GET', `/subscriptions?${qs.toString()}`)\n }\n\n /**\n * Fetch ALL subscriptions from Stripe (handles pagination automatically)\n */\n async listAllSubscriptions(): Promise {\n const all: any[] = []\n let startingAfter: string | undefined\n\n while (true) {\n const result = await this.listSubscriptions({ limit: 100, startingAfter })\n all.push(...result.data)\n if (!result.has_more || result.data.length === 0) break\n startingAfter = result.data[result.data.length - 1].id\n }\n\n return all\n }\n\n /**\n * Search for a customer by email\n */\n async findCustomerByEmail(email: string): Promise<{ id: string } | null> {\n const params = new URLSearchParams()\n params.append('query', `email:'${email}'`)\n params.append('limit', '1')\n const result = await this.request('GET', `/customers/search?${params.toString()}`)\n return result.data?.[0] || null\n }\n\n private async request(method: string, path: string, body?: URLSearchParams): Promise {\n const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${this.secretKey}`,\n ...(body ? { 'Content-Type': 'application/x-www-form-urlencoded' } : {})\n },\n ...(body ? { body: body.toString() } : {})\n })\n\n const data = await response.json() as any\n if (!response.ok) {\n throw new Error(`Stripe API error: ${data.error?.message || response.statusText}`)\n }\n return data\n }\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks on signature verification\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n return result === 0\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { StripeAPI } from '../services/stripe-api'\nimport type { Bindings, Variables } from '../../../../app'\nimport type {\n StripePluginSettings,\n StripeEvent,\n StripeSubscriptionObject,\n StripeCheckoutSession,\n StripeInvoice,\n SubscriptionStatus,\n SubscriptionFilters\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\nfunction mapStripeStatus(status: string): SubscriptionStatus {\n const map: Record = {\n active: 'active',\n canceled: 'canceled',\n past_due: 'past_due',\n trialing: 'trialing',\n unpaid: 'unpaid',\n paused: 'paused',\n incomplete: 'incomplete',\n incomplete_expired: 'incomplete_expired'\n }\n return map[status] || 'incomplete'\n}\n\n// ============================================================================\n// Webhook — No auth, verified by Stripe signature\n// ============================================================================\n\napiRoutes.post('/webhook', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeWebhookSecret) {\n return c.json({ error: 'Webhook secret not configured' }, 500)\n }\n\n // Must read raw body for signature verification\n const rawBody = await c.req.text()\n const sigHeader = c.req.header('stripe-signature') || ''\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const isValid = await stripeApi.verifyWebhookSignature(rawBody, sigHeader, settings.stripeWebhookSecret)\n\n if (!isValid) {\n return c.json({ error: 'Invalid signature' }, 400)\n }\n\n const event: StripeEvent = JSON.parse(rawBody)\n const subscriptionService = new SubscriptionService(db)\n const eventService = new StripeEventService(db)\n await Promise.all([subscriptionService.ensureTable(), eventService.ensureTable()])\n\n // Determine object ID and type for the event log\n const obj = event.data.object as any\n const objectId = obj?.id || ''\n const objectType = obj?.object || event.type.split('.')[0] || ''\n\n try {\n switch (event.type) {\n case 'customer.subscription.created': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n\n await subscriptionService.create({\n userId,\n stripeCustomerId: sub.customer,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items.data[0]?.price.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription created: ${sub.id}`)\n break\n }\n\n case 'customer.subscription.updated': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: mapStripeStatus(sub.status),\n stripePriceId: sub.items.data[0]?.price.id || undefined,\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription updated: ${sub.id} -> ${sub.status}`)\n break\n }\n\n case 'customer.subscription.deleted': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: 'canceled'\n })\n\n console.log(`[Stripe] Subscription deleted: ${sub.id}`)\n break\n }\n\n case 'checkout.session.completed': {\n const session = event.data.object as unknown as StripeCheckoutSession\n const userId = session.metadata?.sonicjs_user_id\n\n if (userId && session.subscription) {\n const existing = await subscriptionService.getByStripeSubscriptionId(session.subscription)\n if (existing && !existing.userId) {\n await subscriptionService.updateByStripeId(session.subscription, {\n userId\n } as any)\n }\n }\n\n console.log(`[Stripe] Checkout completed: ${session.id}`)\n break\n }\n\n case 'invoice.payment_succeeded': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'active'\n })\n }\n console.log(`[Stripe] Payment succeeded for invoice: ${invoice.id}`)\n break\n }\n\n case 'invoice.payment_failed': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'past_due'\n })\n }\n console.log(`[Stripe] Payment failed for invoice: ${invoice.id}`)\n break\n }\n\n default:\n console.log(`[Stripe] Unhandled event type: ${event.type}`)\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'ignored'\n })\n return c.json({ received: true })\n }\n\n // Log successfully processed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'processed'\n })\n } catch (error) {\n // Log failed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error)\n }).catch(() => {}) // Don't let logging failure mask the real error\n\n console.error(`[Stripe] Error processing webhook event ${event.type}:`, error)\n return c.json({ error: 'Webhook processing failed' }, 500)\n }\n\n return c.json({ received: true })\n})\n\n// ============================================================================\n// Authenticated API Routes\n// ============================================================================\n\n// Create checkout session for current user\napiRoutes.post('/create-checkout-session', requireAuth(), async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const settings = await getSettings(db)\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe not configured' }, 500)\n }\n\n const body = await c.req.json().catch(() => ({})) as { priceId?: string }\n const priceId = body.priceId || settings.stripePriceId\n if (!priceId) {\n return c.json({ error: 'No price ID specified' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n // Check if user already has a Stripe customer ID\n const existingSub = await subscriptionService.getByUserId(user.userId)\n let customerId = existingSub?.stripeCustomerId\n\n if (!customerId) {\n // Try to find existing customer by email, or create one\n const existing = await stripeApi.findCustomerByEmail(user.email)\n if (existing) {\n customerId = existing.id\n } else {\n const customer = await stripeApi.createCustomer({\n email: user.email,\n metadata: { sonicjs_user_id: user.userId }\n })\n customerId = customer.id\n }\n }\n\n const origin = new URL(c.req.url).origin\n const session = await stripeApi.createCheckoutSession({\n priceId,\n customerId,\n successUrl: `${origin}${settings.successUrl}?session_id={CHECKOUT_SESSION_ID}`,\n cancelUrl: `${origin}${settings.cancelUrl}`,\n metadata: { sonicjs_user_id: user.userId }\n })\n\n return c.json({ sessionId: session.id, url: session.url })\n})\n\n// Get current user's subscription\napiRoutes.get('/subscription', requireAuth(), async (c) => {\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const subscription = await subscriptionService.getByUserId(user.userId)\n if (!subscription) {\n return c.json({ subscription: null })\n }\n\n return c.json({ subscription })\n})\n\n// ============================================================================\n// Admin API Routes\n// ============================================================================\n\n// List all subscriptions (admin only)\napiRoutes.get('/subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const filters: SubscriptionFilters = {\n status: c.req.query('status') as SubscriptionStatus | undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await subscriptionService.list(filters)\n return c.json(result)\n})\n\n// Get subscription stats (admin only)\napiRoutes.get('/stats', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const stats = await subscriptionService.getStats()\n return c.json(stats)\n})\n\n// ============================================================================\n// Sync Subscriptions from Stripe API\n// ============================================================================\n\napiRoutes.post('/sync-subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe secret key not configured' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n try {\n const allSubs = await stripeApi.listAllSubscriptions()\n let synced = 0\n let errors = 0\n\n for (const sub of allSubs) {\n try {\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n await subscriptionService.upsert({\n userId,\n stripeCustomerId: typeof sub.customer === 'string' ? sub.customer : sub.customer.id,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items?.data?.[0]?.price?.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n synced++\n } catch (err) {\n console.error(`[Stripe Sync] Failed to upsert subscription ${sub.id}:`, err)\n errors++\n }\n }\n\n return c.json({\n success: true,\n total: allSubs.length,\n synced,\n errors\n })\n } catch (error) {\n console.error('[Stripe Sync] Error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Sync failed'\n }, 500)\n }\n})\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\napiRoutes.get('/events', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const filters = {\n type: c.req.query('type') || undefined,\n status: c.req.query('status') as any || undefined,\n objectId: c.req.query('objectId') || undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50\n }\n\n const [result, stats, types] = await Promise.all([\n eventService.list(filters),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n return c.json({ ...result, stats, types })\n})\n\nexport { apiRoutes as stripeApiRoutes }\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { stripeAdminRoutes } from './routes/admin'\nimport { stripeApiRoutes } from './routes/api'\n\nexport function createStripePlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'stripe',\n version: '1.0.0-beta.1',\n description: 'Stripe subscription management with webhook handling, checkout sessions, and subscription gating'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard — subscription management\n builder.addRoute('/admin/plugins/stripe', stripeAdminRoutes as any, {\n description: 'Stripe subscriptions admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes — webhook, checkout, subscription status\n builder.addRoute('/api/stripe', stripeApiRoutes as any, {\n description: 'Stripe API endpoints (webhook, checkout, subscription)',\n requiresAuth: false, // Webhook route handles its own auth via signature\n priority: 50\n })\n\n // Admin menu item\n builder.addMenuItem('Stripe', '/admin/plugins/stripe', {\n icon: ``,\n order: 75\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.log('[Stripe] Plugin installed')\n },\n activate: async () => {\n console.log('[Stripe] Plugin activated')\n },\n deactivate: async () => {\n console.log('[Stripe] Plugin deactivated')\n },\n uninstall: async () => {\n console.log('[Stripe] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const stripePlugin = createStripePlugin()\nexport { SubscriptionService } from './services/subscription-service'\nexport { StripeAPI } from './services/stripe-api'\nexport { requireSubscription } from './middleware/require-subscription'\nexport default stripePlugin\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../app'\nimport { PLUGIN_REGISTRY } from '../plugins/manifest-registry'\n\n// Build menu plugin data from the auto-generated registry.\n// Any plugin with an adminMenu entry in its manifest.json will\n// automatically appear in the sidebar when active.\nconst REGISTRY_MENU_PLUGINS = Object.values(PLUGIN_REGISTRY)\n .filter(p => p.adminMenu !== null)\n .map(p => ({\n codeName: p.codeName,\n label: p.adminMenu!.label,\n path: p.adminMenu!.path,\n icon: p.adminMenu!.icon,\n order: p.adminMenu!.order,\n }))\n\n// Map icon names from manifest.json to Heroicons SVG (outline, 24x24)\nconst ICON_SVG: Record = {\n 'magnifying-glass': '',\n 'chart-bar': '',\n 'image': '',\n 'palette': '',\n 'envelope': '',\n 'hand-raised': '',\n 'key': '',\n 'arrow-right': '',\n 'shield-check': '',\n 'credit-card': '',\n}\n\nfunction resolveIcon(iconName?: string): string {\n if (!iconName) return ''\n // If it's already SVG markup, return as-is\n if (iconName.startsWith('`\n const resolvedIcon = resolveIcon(item.icon) || fallbackIcon\n return `\n \n ${isActive ? '' : ''}\n \n \n ${resolvedIcon}\n \n ${item.label}\n \n `\n}\n\nexport function pluginMenuMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n if (!path.startsWith('/admin')) {\n return next()\n }\n\n // Collect menu items from active plugins using the registry\n let activeMenuItems: Array<{ label: string; path: string; icon?: string; order: number }> = []\n try {\n const db = c.env.DB\n const pluginCodeNames = REGISTRY_MENU_PLUGINS.map(p => p.codeName)\n if (pluginCodeNames.length > 0) {\n const placeholders = pluginCodeNames.map(() => '?').join(',')\n const result = await db.prepare(\n `SELECT name FROM plugins WHERE name IN (${placeholders}) AND status = 'active'`\n ).bind(...pluginCodeNames).all()\n\n const activeNames = new Set((result.results || []).map((r: any) => r.name))\n\n for (const plugin of REGISTRY_MENU_PLUGINS) {\n if (activeNames.has(plugin.codeName)) {\n activeMenuItems.push({\n label: plugin.label,\n path: plugin.path,\n icon: plugin.icon,\n order: plugin.order,\n })\n }\n }\n\n // Sort by order\n activeMenuItems.sort((a, b) => a.order - b.order)\n }\n } catch {\n // DB not ready or plugin table doesn't exist yet\n }\n\n c.set('pluginMenuItems', activeMenuItems.map(m => ({ label: m.label, path: m.path, icon: resolveIcon(m.icon) || '' })))\n\n await next()\n\n // Inject menu items into HTML response by replacing the marker\n if (activeMenuItems.length > 0 && c.res.headers.get('content-type')?.includes('text/html')) {\n const status = c.res.status\n const headers = new Headers(c.res.headers)\n const html = await c.res.text()\n\n if (html.includes(MARKER)) {\n const renderedItems = activeMenuItems.map(item => renderMenuItem(item, path)).join('')\n const newHtml = html.split(MARKER).join(renderedItems)\n c.res = new Response(newHtml, { status, headers })\n } else {\n // Body was consumed by .text(), must create new Response either way\n c.res = new Response(html, { status, headers })\n }\n }\n }\n}\n","/**\n * SonicJS Plugin System Types\n * \n * Defines the core interfaces and types for the plugin system\n */\n\nimport { Hono, Context, Next, MiddlewareHandler } from 'hono'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\n\n// Core plugin definition\nexport interface Plugin {\n /** Unique plugin identifier */\n name: string\n /** Plugin version (semantic versioning) */\n version: string\n /** Human-readable description */\n description?: string\n /** Plugin author information */\n author?: {\n name: string\n email?: string\n url?: string\n }\n /** Plugin dependencies (other plugins required) */\n dependencies?: string[]\n /** SonicJS version compatibility */\n compatibility?: string\n /** Plugin license */\n license?: string\n \n // Extension points\n routes?: PluginRoutes[]\n middleware?: PluginMiddleware[]\n models?: PluginModel[]\n services?: PluginService[]\n adminPages?: PluginAdminPage[]\n adminComponents?: PluginComponent[]\n menuItems?: PluginMenuItem[]\n hooks?: PluginHook[]\n \n // Lifecycle hooks\n install?: (context: PluginContext) => Promise\n uninstall?: (context: PluginContext) => Promise\n activate?: (context: PluginContext) => Promise\n deactivate?: (context: PluginContext) => Promise\n configure?: (config: PluginConfig) => Promise\n}\n\n// Plugin context provides access to SonicJS APIs\nexport interface PluginContext {\n /** Database instance */\n db: D1Database\n /** Key-value storage */\n kv: KVNamespace\n /** R2 storage bucket */\n r2?: R2Bucket\n /** Plugin configuration */\n config: PluginConfig\n /** Core SonicJS services */\n services: {\n auth: AuthService\n content: ContentService\n media: MediaService\n }\n /** Hook system for inter-plugin communication */\n hooks: HookSystem | ScopedHookSystem\n /** Logging utilities */\n logger: PluginLogger\n}\n\n// Authentication service interface for plugins\nexport interface AuthService {\n /** Generate JWT token for a user */\n generateToken(userId: string, email: string, role: string): Promise\n /** Verify and decode JWT token */\n verifyToken(token: string): Promise\n /** Set authentication cookie (useful for alternative auth methods) */\n setAuthCookie(context: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void\n /** Hash password */\n hashPassword(password: string): Promise\n /** Verify password against hash */\n verifyPassword(password: string, hash: string): Promise\n}\n\n// Plugin configuration\nexport interface PluginConfig {\n /** Plugin-specific configuration */\n [key: string]: any\n /** Whether plugin is enabled */\n enabled: boolean\n /** Plugin installation timestamp */\n installedAt?: number\n /** Plugin last update timestamp */\n updatedAt?: number\n}\n\n// Route definitions\nexport interface PluginRoutes {\n /** Route path prefix */\n path: string\n /** Hono route handler */\n handler: Hono\n /** Route description */\n description?: string\n /** Whether route requires authentication */\n requiresAuth?: boolean\n /** Required roles for access */\n roles?: string[]\n /** Route priority (for ordering) */\n priority?: number\n}\n\n// Middleware definitions\nexport interface PluginMiddleware {\n /** Middleware name */\n name: string\n /** Middleware handler function */\n handler: MiddlewareHandler\n /** Middleware description */\n description?: string\n /** Middleware priority (lower = earlier) */\n priority?: number\n /** Routes to apply middleware to */\n routes?: string[]\n /** Whether to apply globally */\n global?: boolean\n}\n\n// Database model definitions\nexport interface PluginModel {\n /** Model name */\n name: string\n /** Database table name */\n tableName: string\n /** Zod schema for validation */\n schema: z.ZodSchema\n /** Database migrations */\n migrations: string[]\n /** Model relationships */\n relationships?: ModelRelationship[]\n /** Whether model extends core content */\n extendsContent?: boolean\n}\n\nexport interface ModelRelationship {\n type: 'oneToOne' | 'oneToMany' | 'manyToMany'\n target: string\n foreignKey?: string\n joinTable?: string\n}\n\n// Service definitions\nexport interface PluginService {\n /** Service name */\n name: string\n /** Service implementation */\n implementation: any\n /** Service description */\n description?: string\n /** Service dependencies */\n dependencies?: string[]\n /** Whether service is singleton */\n singleton?: boolean\n}\n\n// Admin interface extensions\nexport interface PluginAdminPage {\n /** Page path (relative to /admin) */\n path: string\n /** Page title */\n title: string\n /** Page component/template */\n component: string\n /** Page description */\n description?: string\n /** Required permissions */\n permissions?: string[]\n /** Menu item configuration */\n menuItem?: PluginMenuItem\n /** Page icon */\n icon?: string\n}\n\nexport interface PluginComponent {\n /** Component name */\n name: string\n /** Component template function */\n template: (props: any) => string\n /** Component description */\n description?: string\n /** Component props schema */\n propsSchema?: z.ZodSchema\n}\n\nexport interface PluginMenuItem {\n /** Menu item label */\n label: string\n /** Menu item path */\n path: string\n /** Menu item icon */\n icon?: string\n /** Menu item order */\n order?: number\n /** Parent menu item */\n parent?: string\n /** Required permissions */\n permissions?: string[]\n /** Whether item is active */\n active?: boolean\n}\n\n// Hook system for extensibility\nexport interface PluginHook {\n /** Hook name */\n name: string\n /** Hook handler function */\n handler: HookHandler\n /** Hook priority */\n priority?: number\n /** Hook description */\n description?: string\n}\n\nexport type HookHandler = (data: any, context: HookContext) => Promise\n\nexport interface HookContext {\n /** Plugin that registered the hook */\n plugin: string\n /** Hook execution context */\n context: PluginContext\n /** Cancel hook execution */\n cancel?: () => void\n}\n\n// Hook system interface\nexport interface HookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Get all registered hooks */\n getHooks(hookName: string): PluginHook[]\n /** Create a scoped hook system (optional) */\n createScope?(pluginName: string): ScopedHookSystem\n}\n\n// Scoped hook system for plugins\nexport interface ScopedHookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Remove all hooks for this scope */\n unregisterAll(): void\n}\n\n// Plugin registry\nexport interface PluginRegistry {\n /** Get plugin by name */\n get(name: string): Plugin | undefined\n /** Get all registered plugins */\n getAll(): Plugin[]\n /** Get active plugins */\n getActive(): Plugin[]\n /** Register a plugin */\n register(plugin: Plugin): Promise\n /** Unregister a plugin */\n unregister(name: string): Promise\n /** Check if plugin is registered */\n has(name: string): boolean\n /** Activate a plugin */\n activate(name: string): Promise\n /** Deactivate a plugin */\n deactivate(name: string): Promise\n /** Get plugin configuration */\n getConfig(name: string): PluginConfig | undefined\n /** Set plugin configuration */\n setConfig(name: string, config: PluginConfig): void\n /** Get plugin status */\n getStatus(name: string): PluginStatus | undefined\n /** Get all plugin statuses */\n getAllStatuses(): Map\n /** Resolve plugin load order based on dependencies */\n resolveLoadOrder(): string[]\n}\n\n// Plugin manager\nexport interface PluginManager {\n /** Plugin registry */\n registry: PluginRegistry\n /** Hook system */\n hooks: HookSystem\n /** Initialize plugin system */\n initialize(context: PluginContext): Promise\n /** Load plugins from configuration */\n loadPlugins(config: PluginConfig[]): Promise\n /** Install a plugin */\n install(plugin: Plugin, config?: PluginConfig): Promise\n /** Uninstall a plugin */\n uninstall(name: string): Promise\n /** Get plugin status */\n getStatus(name: string): PluginStatus\n}\n\nexport interface PluginStatus {\n name: string\n version: string\n active: boolean\n installed: boolean\n hasErrors: boolean\n errors?: string[]\n lastError?: string\n}\n\n// Service interfaces\nexport interface AuthService {\n /** Verify user permissions */\n hasPermission(userId: string, permission: string): Promise\n /** Get current user */\n getCurrentUser(context: Context): Promise\n /** Create authentication middleware */\n createMiddleware(options?: any): MiddlewareHandler\n}\n\nexport interface ContentService {\n /** Get content by ID */\n getById(id: string): Promise\n /** Create new content */\n create(data: any): Promise\n /** Update content */\n update(id: string, data: any): Promise\n /** Delete content */\n delete(id: string): Promise\n /** Search content */\n search(query: string, options?: any): Promise\n}\n\nexport interface MediaService {\n /** Upload file */\n upload(file: File, options?: any): Promise\n /** Get media by ID */\n getById(id: string): Promise\n /** Delete media */\n delete(id: string): Promise\n /** Transform image */\n transform(id: string, options: any): Promise\n}\n\n// Plugin logger\nexport interface PluginLogger {\n debug(message: string, data?: any): void\n info(message: string, data?: any): void\n warn(message: string, data?: any): void\n error(message: string, error?: Error, data?: any): void\n}\n\n// Plugin development utilities interface\n\nexport interface PluginBuilderOptions {\n name: string\n version: string\n description?: string\n author?: Plugin['author']\n dependencies?: string[]\n}\n\n// Plugin validation\nexport interface PluginValidator {\n /** Validate plugin definition */\n validate(plugin: Plugin): PluginValidationResult\n /** Validate plugin dependencies */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult\n /** Validate plugin compatibility */\n validateCompatibility(plugin: Plugin, version: string): PluginValidationResult\n}\n\nexport interface PluginValidationResult {\n valid: boolean\n errors: string[]\n warnings: string[]\n}\n\n// Standard hook names\nexport const HOOKS = {\n // Application lifecycle\n APP_INIT: 'app:init',\n APP_READY: 'app:ready',\n APP_SHUTDOWN: 'app:shutdown',\n \n // Request lifecycle\n REQUEST_START: 'request:start',\n REQUEST_END: 'request:end',\n REQUEST_ERROR: 'request:error',\n \n // Authentication\n AUTH_LOGIN: 'auth:login',\n AUTH_LOGOUT: 'auth:logout',\n AUTH_REGISTER: 'auth:register',\n USER_LOGIN: 'user:login',\n USER_LOGOUT: 'user:logout',\n \n // Content lifecycle\n CONTENT_CREATE: 'content:create',\n CONTENT_UPDATE: 'content:update',\n CONTENT_DELETE: 'content:delete',\n CONTENT_PUBLISH: 'content:publish',\n CONTENT_SAVE: 'content:save',\n \n // Media lifecycle\n MEDIA_UPLOAD: 'media:upload',\n MEDIA_DELETE: 'media:delete',\n MEDIA_TRANSFORM: 'media:transform',\n \n // Plugin lifecycle\n PLUGIN_INSTALL: 'plugin:install',\n PLUGIN_UNINSTALL: 'plugin:uninstall',\n PLUGIN_ACTIVATE: 'plugin:activate',\n PLUGIN_DEACTIVATE: 'plugin:deactivate',\n \n // Admin interface\n ADMIN_MENU_RENDER: 'admin:menu:render',\n ADMIN_PAGE_RENDER: 'admin:page:render',\n \n // Database\n DB_MIGRATE: 'db:migrate',\n DB_SEED: 'db:seed',\n} as const\n\nexport type HookName = typeof HOOKS[keyof typeof HOOKS]","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { renderAdminLayoutCatalyst } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\n// Analytics Dashboard\nadminRoutes.get('/', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Query real metrics from system_logs\n let totalRequests = 0\n let uniqueIPs = 0\n let avgDuration = 0\n let errorCount = 0\n let topPages: Array<{ path: string; views: number }> = []\n let recentActivity: Array<{ url: string; method: string; status_code: number; duration: number; created_at: number }> = []\n\n try {\n const now = Math.floor(Date.now() / 1000)\n const dayAgo = now - 86400\n\n const [requestsResult, ipsResult, durationResult, errorsResult, pagesResult, activityResult] = await Promise.all([\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT COUNT(DISTINCT ip_address) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT AVG(duration) as avg FROM system_logs WHERE category = ? AND created_at > ? AND duration IS NOT NULL')\n .bind('api', dayAgo).first() as Promise<{ avg: number } | null>,\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE level IN (?, ?) AND created_at > ?')\n .bind('error', 'fatal', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT url, COUNT(*) as views FROM system_logs WHERE category = ? AND created_at > ? AND url IS NOT NULL GROUP BY url ORDER BY views DESC LIMIT 10')\n .bind('api', dayAgo).all(),\n db.prepare('SELECT url, method, status_code, duration, created_at FROM system_logs WHERE category = ? ORDER BY created_at DESC LIMIT 20')\n .bind('api').all(),\n ])\n\n totalRequests = requestsResult?.count || 0\n uniqueIPs = ipsResult?.count || 0\n avgDuration = Math.round(durationResult?.avg || 0)\n errorCount = errorsResult?.count || 0\n topPages = (pagesResult.results || []).map((r: any) => ({ path: r.url, views: r.views }))\n recentActivity = (activityResult.results || []) as any[]\n } catch {\n // Tables may not exist yet\n }\n\n const content = `\n
\n
\n

Analytics Dashboard

\n

Last 24 hours overview from system logs

\n
\n\n \n
\n
\n

Total Requests

\n

${totalRequests.toLocaleString()}

\n
\n
\n

Unique Visitors

\n

${uniqueIPs.toLocaleString()}

\n
\n
\n

Avg Response Time

\n

${avgDuration}ms

\n
\n
\n

Errors

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${errorCount.toLocaleString()}

\n
\n
\n\n \n
\n
\n

Top Pages

\n
\n
\n ${topPages.length > 0 ? topPages.map(p => `\n
\n ${escapeHtml(p.path)}\n ${p.views}\n
\n `).join('') : `\n
\n No page views recorded yet. Analytics data will appear once requests are logged.\n
\n `}\n
\n
\n\n \n
\n
\n

Recent Activity

\n
\n
\n \n \n \n \n \n \n \n \n \n \n ${recentActivity.length > 0 ? recentActivity.map(a => `\n \n \n \n \n \n \n `).join('') : `\n \n \n \n `}\n \n
PathMethodStatusDuration
${escapeHtml(a.url || '')}${a.method || ''}= 400 ? 'bg-red-50 text-red-700 dark:bg-red-900/30 dark:text-red-400' : 'bg-green-50 text-green-700 dark:bg-green-900/30 dark:text-green-400'}\">${a.status_code || ''}${a.duration || 0}ms
No activity recorded yet.
\n
\n
\n
\n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Analytics',\n pageTitle: 'Analytics Dashboard',\n currentPath: '/admin/analytics',\n version: c.get('appVersion'),\n user: user ? {\n name: user.email.split('@')[0] || 'Admin',\n email: user.email,\n role: user.role\n } : undefined,\n content,\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"')\n}\n\nexport { adminRoutes as analyticsAdminRoutes }\n","/**\n * Core Analytics Plugin\n * \n * Provides analytics tracking and reporting extensions\n */\n\nimport { Hono } from 'hono'\n// import { z } from 'zod'\nimport { PluginBuilder, PluginHelpers } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { HOOKS } from '../../types'\nimport { analyticsAdminRoutes } from './routes/admin'\n\nexport function createAnalyticsPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'core-analytics',\n version: '1.0.0-beta.1',\n description: 'Core analytics tracking and reporting plugin'\n })\n\n // Add analytics metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^0.1.0',\n dependencies: ['core-auth'] // Requires auth for admin access\n })\n\n // Create analytics API routes\n const analyticsAPI = new Hono()\n\n // GET /analytics/stats - Get analytics overview\n analyticsAPI.get('/stats', async (c) => {\n const timeRange = c.req.query('range') || '7d' // 1d, 7d, 30d, 90d\n const _metric = c.req.query('metric') || 'all' // pageviews, sessions, users, etc.\n\n return c.json({\n message: 'Analytics stats',\n data: {\n pageviews: 12500,\n uniqueVisitors: 3200,\n sessions: 4800,\n avgSessionDuration: 245,\n bounceRate: 0.35,\n topPages: [\n { path: '/', views: 3200 },\n { path: '/about', views: 1800 },\n { path: '/contact', views: 950 }\n ],\n timeRange\n }\n })\n })\n\n // POST /analytics/track - Track analytics event\n analyticsAPI.post('/track', async (c) => {\n const event = await c.req.json()\n \n // Track event (pageview, click, form submission, etc.)\n console.info('Analytics event tracked:', event)\n \n return c.json({\n message: 'Event tracked successfully',\n eventId: `event-${Date.now()}`\n })\n })\n\n // GET /analytics/reports - Get detailed reports\n analyticsAPI.get('/reports', async (c) => {\n const reportType = c.req.query('type') || 'traffic'\n const startDate = c.req.query('start')\n const endDate = c.req.query('end')\n\n return c.json({\n message: 'Analytics report',\n data: {\n reportType,\n dateRange: { start: startDate, end: endDate },\n data: []\n }\n })\n })\n\n // GET /analytics/realtime - Get real-time analytics\n analyticsAPI.get('/realtime', async (c) => {\n return c.json({\n message: 'Real-time analytics',\n data: {\n activeUsers: 23,\n activePages: [\n { path: '/', users: 8 },\n { path: '/blog', users: 5 },\n { path: '/products', users: 4 }\n ],\n recentEvents: []\n }\n })\n })\n\n builder.addRoute('/api/analytics', analyticsAPI, {\n description: 'Analytics tracking and reporting API',\n requiresAuth: true,\n roles: ['admin', 'analytics:read'],\n priority: 3\n })\n\n // Admin dashboard routes\n builder.addRoute('/admin/analytics', analyticsAdminRoutes as any, {\n description: 'Analytics admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // Add analytics tracking middleware\n builder.addSingleMiddleware('analytics-tracker', async (c: any, next: any) => {\n const start = Date.now()\n const path = c.req.path\n const method = c.req.method\n const userAgent = c.req.header('user-agent')\n const referer = c.req.header('referer')\n const ip = c.req.header('CF-Connecting-IP') || c.req.header('x-forwarded-for')\n\n await next()\n\n const duration = Date.now() - start\n const status = c.res.status\n\n // Track request analytics\n const analyticsData = {\n timestamp: new Date().toISOString(),\n path,\n method,\n status,\n duration,\n userAgent,\n referer,\n ip,\n responseSize: c.res.headers.get('content-length') || 0\n }\n\n console.debug('Analytics tracking:', analyticsData)\n \n // Store analytics data (would integrate with analytics service)\n }, {\n description: 'Track page views and request analytics',\n global: true,\n priority: 99 // Run last to capture response data\n })\n\n // Add analytics service\n builder.addService('analyticsService', {\n trackEvent: async (event: any) => {\n // Event tracking implementation\n console.info('Tracking event:', event)\n return { eventId: `event-${Date.now()}` }\n },\n \n trackPageView: async (data: any) => {\n // Page view tracking implementation\n console.info('Tracking pageview:', data.path)\n return { viewId: `view-${Date.now()}` }\n },\n \n getStats: async (_timeRange: string) => {\n // Get analytics statistics\n return {\n pageviews: 12500,\n sessions: 4800,\n uniqueVisitors: 3200\n }\n },\n \n generateReport: async (type: string, options: any) => {\n // Generate analytics reports\n console.info(`Generating ${type} report with options:`, options)\n return { reportId: `report-${Date.now()}` }\n }\n }, {\n description: 'Core analytics tracking service',\n singleton: true\n })\n\n // Add analytics models\n const pageViewSchema = PluginHelpers.createSchema([\n { name: 'path', type: 'string', optional: false },\n { name: 'title', type: 'string', optional: true },\n { name: 'referrer', type: 'string', optional: true },\n { name: 'userAgent', type: 'string', optional: true },\n { name: 'ipAddress', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true },\n { name: 'duration', type: 'number', optional: true }\n ])\n\n const eventSchema = PluginHelpers.createSchema([\n { name: 'eventType', type: 'string', optional: false },\n { name: 'eventName', type: 'string', optional: false },\n { name: 'eventData', type: 'object', optional: true },\n { name: 'path', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true }\n ])\n\n const pageViewMigration = PluginHelpers.createMigration('analytics_pageviews', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'path', type: 'TEXT', nullable: false },\n { name: 'title', type: 'TEXT', nullable: true },\n { name: 'referrer', type: 'TEXT', nullable: true },\n { name: 'user_agent', type: 'TEXT', nullable: true },\n { name: 'ip_address', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true },\n { name: 'duration', type: 'INTEGER', nullable: true }\n ])\n\n const eventMigration = PluginHelpers.createMigration('analytics_events', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'event_type', type: 'TEXT', nullable: false },\n { name: 'event_name', type: 'TEXT', nullable: false },\n { name: 'event_data', type: 'TEXT', nullable: true },\n { name: 'path', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true }\n ])\n\n builder.addModel('PageView', {\n tableName: 'analytics_pageviews',\n schema: pageViewSchema,\n migrations: [pageViewMigration]\n })\n\n builder.addModel('AnalyticsEvent', {\n tableName: 'analytics_events',\n schema: eventSchema,\n migrations: [eventMigration]\n })\n\n // Add analytics hooks\n builder.addHook(HOOKS.REQUEST_START, async (data: any, _context: any) => {\n // Start tracking request\n data.analytics = {\n startTime: Date.now(),\n sessionId: `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n return data\n }, {\n priority: 1,\n description: 'Initialize analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.REQUEST_END, async (data: any, _context: any) => {\n // Complete request tracking\n if (data.analytics) {\n const duration = Date.now() - data.analytics.startTime\n console.debug(`Request completed in ${duration}ms`)\n }\n return data\n }, {\n priority: 1,\n description: 'Complete analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.USER_LOGIN, async (data: any, context: any) => {\n // Track user login events\n await context.services?.analyticsService?.trackEvent({\n eventType: 'auth',\n eventName: 'user_login',\n userId: data.userId,\n eventData: { loginMethod: data.method }\n })\n return data\n }, {\n priority: 8,\n description: 'Track user login events'\n })\n\n builder.addHook('content:view', async (data: any, context: any) => {\n // Track content views\n await context.services?.analyticsService?.trackEvent({\n eventType: 'content',\n eventName: 'content_view',\n eventData: {\n contentId: data.id,\n contentType: data.type,\n title: data.title\n }\n })\n return data\n }, {\n priority: 8,\n description: 'Track content view events'\n })\n\n // Add admin pages\n builder.addAdminPage(\n '/analytics',\n 'Analytics Dashboard',\n 'AnalyticsDashboardView',\n {\n description: 'View analytics overview and key metrics',\n permissions: ['admin', 'analytics:read'],\n icon: 'chart-bar'\n }\n )\n\n builder.addAdminPage(\n '/analytics/reports',\n 'Analytics Reports',\n 'AnalyticsReportsView',\n {\n description: 'Generate and view detailed analytics reports',\n permissions: ['admin', 'analytics:read'],\n icon: 'document-report'\n }\n )\n\n builder.addAdminPage(\n '/analytics/realtime',\n 'Real-time Analytics',\n 'AnalyticsRealtimeView',\n {\n description: 'View real-time visitor activity',\n permissions: ['admin', 'analytics:read'],\n icon: 'lightning-bolt'\n }\n )\n\n builder.addAdminPage(\n '/analytics/settings',\n 'Analytics Settings',\n 'AnalyticsSettingsView',\n {\n description: 'Configure analytics tracking and data collection',\n permissions: ['admin', 'analytics:configure'],\n icon: 'cog'\n }\n )\n\n // Add menu items\n builder.addMenuItem('Analytics', '/admin/analytics', {\n icon: 'chart-bar',\n order: 40,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Dashboard', '/admin/analytics', {\n icon: 'chart-bar',\n parent: 'Analytics',\n order: 1,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Reports', '/admin/analytics/reports', {\n icon: 'document-report',\n parent: 'Analytics',\n order: 2,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Real-time', '/admin/analytics/realtime', {\n icon: 'lightning-bolt',\n parent: 'Analytics',\n order: 3,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Settings', '/admin/analytics/settings', {\n icon: 'cog',\n parent: 'Analytics',\n order: 4,\n permissions: ['admin', 'analytics:configure']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.info('Installing analytics plugin...')\n // Create analytics database tables and initial configuration\n },\n\n activate: async () => {\n console.info('Activating analytics plugin...')\n // Start analytics tracking services\n },\n\n deactivate: async () => {\n console.info('Deactivating analytics plugin...')\n // Stop analytics tracking and clean up resources\n },\n\n configure: async (config) => {\n console.info('Configuring analytics plugin...', config)\n // Update analytics configuration and settings\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const analyticsPlugin = createAnalyticsPlugin()","import type { D1Database } from '@cloudflare/workers-types'\n\nexport interface TrackEventInput {\n event: string\n properties?: Record\n userId?: string\n sessionId?: string\n ipAddress?: string\n userAgent?: string\n path?: string\n category?: string\n}\n\nexport interface EventQueryFilters {\n event?: string\n category?: string\n userId?: string\n sessionId?: string\n startDate?: number\n endDate?: number\n limit?: number\n offset?: number\n}\n\nexport interface EventStats {\n totalEvents: number\n uniqueUsers: number\n uniqueSessions: number\n topEvents: Array<{ event: string; count: number }>\n}\n\nexport class EventTrackingService {\n constructor(private db: D1Database) {}\n\n async trackEvent(input: TrackEventInput): Promise {\n const id = crypto.randomUUID()\n const category = input.category || 'user-activity'\n\n await this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n ).run()\n\n return id\n }\n\n async trackBatch(events: TrackEventInput[]): Promise {\n const ids: string[] = []\n\n const stmts = events.map(input => {\n const id = crypto.randomUUID()\n ids.push(id)\n const category = input.category || 'user-activity'\n\n return this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n )\n })\n\n await this.db.batch(stmts)\n return ids\n }\n\n async queryEvents(filters: EventQueryFilters = {}): Promise<{ events: any[]; total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.event) {\n conditions.push('event = ?')\n params.push(filters.event)\n }\n if (filters.category) {\n conditions.push('category = ?')\n params.push(filters.category)\n }\n if (filters.userId) {\n conditions.push('user_id = ?')\n params.push(filters.userId)\n }\n if (filters.sessionId) {\n conditions.push('session_id = ?')\n params.push(filters.sessionId)\n }\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const limit = filters.limit || 50\n const offset = filters.offset || 0\n\n const [countResult, eventsResult] = await Promise.all([\n this.db.prepare(`SELECT COUNT(*) as total FROM analytics_events ${where}`).bind(...params).first() as Promise<{ total: number } | null>,\n this.db.prepare(`SELECT * FROM analytics_events ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`).bind(...params, limit, offset).all()\n ])\n\n const events = (eventsResult.results || []).map((e: any) => ({\n ...e,\n properties: e.properties ? JSON.parse(e.properties) : null\n }))\n\n return { events, total: countResult?.total || 0 }\n }\n\n async getStats(startDate?: number, endDate?: number): Promise {\n const conditions: string[] = []\n const params: any[] = []\n\n if (startDate) {\n conditions.push('created_at >= ?')\n params.push(startDate)\n }\n if (endDate) {\n conditions.push('created_at <= ?')\n params.push(endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n const [totals, topEvents] = await Promise.all([\n this.db.prepare(`\n SELECT\n COUNT(*) as total_events,\n COUNT(DISTINCT user_id) as unique_users,\n COUNT(DISTINCT session_id) as unique_sessions\n FROM analytics_events ${where}\n `).bind(...params).first() as Promise<{ total_events: number; unique_users: number; unique_sessions: number } | null>,\n this.db.prepare(`\n SELECT event, COUNT(*) as count\n FROM analytics_events ${where}\n GROUP BY event ORDER BY count DESC LIMIT 20\n `).bind(...params).all()\n ])\n\n return {\n totalEvents: totals?.total_events || 0,\n uniqueUsers: totals?.unique_users || 0,\n uniqueSessions: totals?.unique_sessions || 0,\n topEvents: (topEvents.results || []).map((r: any) => ({ event: r.event, count: r.count }))\n }\n }\n}\n","import { Hono } from 'hono'\nimport { EventTrackingService } from '../services/event-tracking-service'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// POST /api/events - Track a single event or batch of events\napiRoutes.post('/', async (c) => {\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || ''\n const user = c.get('user')\n\n let body: any\n try {\n body = await c.req.json()\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400)\n }\n\n // Batch support: accept an array of events\n if (Array.isArray(body)) {\n if (body.length > 100) {\n return c.json({ error: 'Batch size limit is 100 events' }, 400)\n }\n\n const events = body.map(e => ({\n event: e.event,\n category: e.category || 'user-activity',\n properties: e.properties,\n userId: user?.userId || e.userId,\n sessionId: e.sessionId,\n ipAddress: ip,\n userAgent,\n path: e.path\n }))\n\n // Validate all events have an event name\n const invalid = events.find(e => !e.event || typeof e.event !== 'string')\n if (invalid) {\n return c.json({ error: 'Each event must have an \"event\" string field' }, 400)\n }\n\n const ids = await service.trackBatch(events)\n return c.json({ success: true, eventIds: ids, count: ids.length })\n }\n\n // Single event\n if (!body.event || typeof body.event !== 'string') {\n return c.json({ error: '\"event\" field is required and must be a string' }, 400)\n }\n\n const eventId = await service.trackEvent({\n event: body.event,\n category: body.category || 'user-activity',\n properties: body.properties,\n userId: user?.userId || body.userId,\n sessionId: body.sessionId,\n ipAddress: ip,\n userAgent,\n path: body.path\n })\n\n return c.json({ success: true, eventId })\n})\n\n// GET /api/events - Query events (admin only)\napiRoutes.get('/', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const filters = {\n event: c.req.query('event') || undefined,\n category: c.req.query('category') || undefined,\n userId: c.req.query('userId') || undefined,\n sessionId: c.req.query('sessionId') || undefined,\n startDate: c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined,\n endDate: c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n offset: c.req.query('offset') ? parseInt(c.req.query('offset')!) : 0\n }\n\n const result = await service.queryEvents(filters)\n return c.json(result)\n})\n\n// GET /api/events/stats - Aggregated event stats (admin only)\napiRoutes.get('/stats', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const startDate = c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined\n const endDate = c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined\n\n const stats = await service.getStats(startDate, endDate)\n return c.json(stats)\n})\n\nexport { apiRoutes as eventsApiRoutes }\n","/**\n * Cache Configuration\n *\n * Defines cache configurations for different entity types\n */\n\nexport interface CacheConfig {\n ttl: number // Time-to-live in seconds\n kvEnabled: boolean // Use KV cache tier\n memoryEnabled: boolean // Use in-memory cache tier\n namespace: string // Cache namespace/prefix\n invalidateOn: string[] // Events that invalidate this cache\n version?: string // Cache version for busting\n}\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\n/**\n * Default cache configurations by entity type\n */\nexport const CACHE_CONFIGS: Record = {\n // Content (high read, low write)\n content: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'content',\n invalidateOn: ['content.update', 'content.delete', 'content.publish'],\n version: 'v1'\n },\n\n // User data (medium read, medium write)\n user: {\n ttl: 900, // 15 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'user',\n invalidateOn: ['user.update', 'user.delete', 'auth.login'],\n version: 'v1'\n },\n\n // Configuration (high read, very low write)\n config: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'config',\n invalidateOn: ['config.update', 'plugin.activate', 'plugin.deactivate'],\n version: 'v1'\n },\n\n // Media metadata (high read, low write)\n media: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'media',\n invalidateOn: ['media.upload', 'media.delete', 'media.update'],\n version: 'v1'\n },\n\n // API responses (very high read, low write)\n api: {\n ttl: 300, // 5 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'api',\n invalidateOn: ['content.update', 'content.publish'],\n version: 'v1'\n },\n\n // Session data (very high read, medium write)\n session: {\n ttl: 1800, // 30 minutes\n kvEnabled: false, // Only in-memory for sessions\n memoryEnabled: true,\n namespace: 'session',\n invalidateOn: ['auth.logout'],\n version: 'v1'\n },\n\n // Plugin data\n plugin: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'plugin',\n invalidateOn: ['plugin.activate', 'plugin.deactivate', 'plugin.update'],\n version: 'v1'\n },\n\n // Collections/schema\n collection: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'collection',\n invalidateOn: ['collection.update', 'collection.delete'],\n version: 'v1'\n }\n}\n\n/**\n * Get cache configuration for a specific namespace\n */\nexport function getCacheConfig(namespace: string): CacheConfig {\n return CACHE_CONFIGS[namespace] || {\n ttl: 3600,\n kvEnabled: true,\n memoryEnabled: true,\n namespace,\n invalidateOn: [],\n version: 'v1'\n }\n}\n\n/**\n * Generate a cache key with consistent format\n * Format: {namespace}:{type}:{identifier}:{version}\n */\nexport function generateCacheKey(\n namespace: string,\n type: string,\n identifier: string,\n version?: string\n): string {\n const v = version || getCacheConfig(namespace).version || 'v1'\n return `${namespace}:${type}:${identifier}:${v}`\n}\n\n/**\n * Parse a cache key back into its components\n */\nexport function parseCacheKey(key: string): {\n namespace: string\n type: string\n identifier: string\n version: string\n} | null {\n const parts = key.split(':')\n if (parts.length !== 4) {\n return null\n }\n\n return {\n namespace: parts[0] || '',\n type: parts[1] || '',\n identifier: parts[2] || '',\n version: parts[3] || ''\n }\n}\n\n/**\n * Generate a hash for complex query parameters\n */\nexport function hashQueryParams(params: Record): string {\n // Sort keys for consistent hashing\n const sortedKeys = Object.keys(params).sort()\n const normalized = sortedKeys.map(key => `${key}=${params[key]}`).join('&')\n\n // Simple hash function (for better performance, consider using crypto)\n let hash = 0\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Create a pattern for cache invalidation\n */\nexport function createCachePattern(\n namespace: string,\n type?: string,\n identifier?: string\n): string {\n let pattern = namespace\n if (type) pattern += `:${type}`\n if (identifier) pattern += `:${identifier}`\n return pattern + ':*'\n}\n","/**\n * Cache Service\n *\n * Three-tiered caching implementation:\n * 1. In-Memory Cache (fastest, region-specific)\n * 2. Cloudflare KV Cache (fast, global)\n * 3. Database (fallback, source of truth)\n */\n\nimport { CacheConfig, CacheStats, generateCacheKey } from './cache-config.js'\n\n/**\n * Cache entry with metadata\n */\ninterface CacheEntry {\n data: T\n timestamp: number\n expiresAt: number\n version: string\n}\n\n/**\n * In-memory cache store\n */\nclass MemoryCache {\n private cache: Map> = new Map()\n private maxSize: number = 50 * 1024 * 1024 // 50MB\n private currentSize: number = 0\n\n /**\n * Get item from memory cache\n */\n get(key: string): T | null {\n const entry = this.cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n this.delete(key)\n return null\n }\n\n return entry.data as T\n }\n\n /**\n * Set item in memory cache\n */\n set(key: string, value: T, ttl: number, version: string = 'v1'): void {\n const now = Date.now()\n const entry: CacheEntry = {\n data: value,\n timestamp: now,\n expiresAt: now + (ttl * 1000),\n version\n }\n\n // Estimate size (rough approximation)\n const entrySize = JSON.stringify(entry).length * 2 // UTF-16\n\n // Check if we need to evict\n if (this.currentSize + entrySize > this.maxSize) {\n this.evictLRU(entrySize)\n }\n\n // Delete old entry if exists\n if (this.cache.has(key)) {\n this.delete(key)\n }\n\n this.cache.set(key, entry)\n this.currentSize += entrySize\n }\n\n /**\n * Delete item from memory cache\n */\n delete(key: string): boolean {\n const entry = this.cache.get(key)\n if (entry) {\n const entrySize = JSON.stringify(entry).length * 2\n this.currentSize -= entrySize\n return this.cache.delete(key)\n }\n return false\n }\n\n /**\n * Clear all items from memory cache\n */\n clear(): void {\n this.cache.clear()\n this.currentSize = 0\n }\n\n /**\n * Get cache statistics\n */\n getStats(): { size: number; count: number } {\n return {\n size: this.currentSize,\n count: this.cache.size\n }\n }\n\n /**\n * Evict least recently used items to make space\n */\n private evictLRU(neededSpace: number): void {\n // Sort by timestamp (oldest first)\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp\n )\n\n let freedSpace = 0\n for (const [key, entry] of entries) {\n if (freedSpace >= neededSpace) break\n\n const entrySize = JSON.stringify(entry).length * 2\n this.delete(key)\n freedSpace += entrySize\n }\n }\n\n /**\n * Delete items matching a pattern\n */\n invalidatePattern(pattern: string): number {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n let count = 0\n for (const key of this.cache.keys()) {\n if (regex.test(key)) {\n this.delete(key)\n count++\n }\n }\n\n return count\n }\n}\n\n/**\n * Cache result with source information\n */\nexport interface CacheResult {\n data: T | null\n source: 'memory' | 'kv' | 'miss'\n hit: boolean\n timestamp?: number\n ttl?: number\n}\n\n/**\n * Main cache service with multi-tier support\n */\nexport class CacheService {\n private memoryCache: MemoryCache\n private config: CacheConfig\n private stats: CacheStats\n private kvNamespace?: KVNamespace\n\n constructor(config: CacheConfig, kvNamespace?: KVNamespace) {\n this.memoryCache = new MemoryCache()\n this.config = config\n this.kvNamespace = kvNamespace\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Get value from cache (tries memory first, then KV)\n */\n async get(key: string): Promise {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n return memoryValue\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return kvValue as T\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return null\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise> {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n\n const entry = await this.getEntry(key)\n return {\n data: memoryValue,\n source: 'memory',\n hit: true,\n timestamp: entry?.timestamp,\n ttl: entry?.ttl\n }\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return {\n data: kvValue as T,\n source: 'kv',\n hit: true\n }\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return {\n data: null,\n source: 'miss',\n hit: false\n }\n }\n\n /**\n * Set value in cache (stores in both memory and KV)\n */\n async set(\n key: string,\n value: T,\n customConfig?: Partial\n ): Promise {\n const config = { ...this.config, ...customConfig }\n\n // Store in memory cache (Tier 1)\n if (config.memoryEnabled) {\n this.memoryCache.set(key, value, config.ttl, config.version)\n }\n\n // Store in KV cache (Tier 2)\n if (config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.put(key, JSON.stringify(value), {\n expirationTtl: config.ttl\n })\n } catch (error) {\n console.error('KV cache write error:', error)\n }\n }\n }\n\n /**\n * Delete value from cache (removes from both memory and KV)\n */\n async delete(key: string): Promise {\n // Delete from memory (Tier 1)\n if (this.config.memoryEnabled) {\n this.memoryCache.delete(key)\n }\n\n // Delete from KV (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.delete(key)\n } catch (error) {\n console.error('KV cache delete error:', error)\n }\n }\n }\n\n /**\n * Clear all cache entries for this namespace\n */\n async clear(): Promise {\n if (this.config.memoryEnabled) {\n this.memoryCache.clear()\n }\n\n // Reset stats\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Invalidate cache entries matching a pattern\n */\n async invalidate(pattern: string): Promise {\n let count = 0\n\n // Invalidate from memory (Tier 1)\n if (this.config.memoryEnabled) {\n count += this.memoryCache.invalidatePattern(pattern)\n }\n\n // Invalidate from KV (Tier 2)\n // Note: KV doesn't support pattern matching, so we need to list all keys\n // This is expensive and should be used sparingly\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n // List all keys with the namespace prefix\n const prefix = this.config.namespace + ':'\n const list = await this.kvNamespace.list({ prefix })\n\n for (const key of list.keys) {\n if (regex.test(key.name)) {\n await this.kvNamespace.delete(key.name)\n count++\n }\n }\n } catch (error) {\n console.error('KV cache invalidation error:', error)\n }\n }\n\n return count\n }\n\n /**\n * Invalidate cache entries matching a pattern (alias for invalidate)\n */\n async invalidatePattern(pattern: string): Promise {\n return this.invalidate(pattern)\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const memStats = this.memoryCache.getStats()\n\n return {\n ...this.stats,\n memorySize: memStats.size,\n entryCount: memStats.count\n }\n }\n\n /**\n * Update hit rate calculation\n */\n private updateHitRate(): void {\n const totalHits = this.stats.memoryHits + this.stats.kvHits + this.stats.dbHits\n this.stats.hitRate = this.stats.totalRequests > 0\n ? (totalHits / this.stats.totalRequests) * 100\n : 0\n }\n\n /**\n * Generate a cache key using the configured namespace\n */\n generateKey(type: string, identifier: string): string {\n return generateCacheKey(\n this.config.namespace,\n type,\n identifier,\n this.config.version\n )\n }\n\n /**\n * Warm cache with multiple entries\n */\n async warmCache(entries: Array<{ key: string; value: T }>): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value)\n }\n }\n\n /**\n * Check if a key exists in cache\n */\n async has(key: string): Promise {\n const value = await this.get(key)\n return value !== null\n }\n\n /**\n * Get multiple values at once\n */\n async getMany(keys: string[]): Promise> {\n const results = new Map()\n\n for (const key of keys) {\n const value = await this.get(key)\n if (value !== null) {\n results.set(key, value)\n }\n }\n\n return results\n }\n\n /**\n * Set multiple values at once\n */\n async setMany(\n entries: Array<{ key: string; value: T }>,\n customConfig?: Partial\n ): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value, customConfig)\n }\n }\n\n /**\n * Delete multiple keys at once\n */\n async deleteMany(keys: string[]): Promise {\n for (const key of keys) {\n await this.delete(key)\n }\n }\n\n /**\n * Get or set pattern - fetch from cache or compute if not found\n */\n async getOrSet(\n key: string,\n fetcher: () => Promise,\n customConfig?: Partial\n ): Promise {\n // Try to get from cache\n const cached = await this.get(key)\n if (cached !== null) {\n return cached\n }\n\n // Fetch from source\n const value = await fetcher()\n\n // Store in cache\n await this.set(key, value, customConfig)\n\n return value\n }\n\n /**\n * List all cache keys with metadata\n */\n async listKeys(): Promise> {\n const keys: Array<{ key: string; size: number; expiresAt: number; age: number }> = []\n\n // Get keys from memory cache\n if (this.config.memoryEnabled) {\n const cache = (this.memoryCache as any).cache as Map>\n for (const [key, entry] of cache.entries()) {\n const size = JSON.stringify(entry).length * 2\n const age = Date.now() - entry.timestamp\n keys.push({\n key,\n size,\n expiresAt: entry.expiresAt,\n age\n })\n }\n }\n\n // Sort by age (newest first)\n return keys.sort((a, b) => a.age - b.age)\n }\n\n /**\n * Get cache entry with full metadata\n */\n async getEntry(key: string): Promise<{\n data: T\n timestamp: number\n expiresAt: number\n ttl: number\n size: number\n } | null> {\n if (!this.config.memoryEnabled) {\n return null\n }\n\n const cache = (this.memoryCache as any).cache as Map>\n const entry = cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n await this.delete(key)\n return null\n }\n\n const size = JSON.stringify(entry).length * 2\n const ttl = Math.max(0, entry.expiresAt - Date.now()) / 1000\n\n return {\n data: entry.data as T,\n timestamp: entry.timestamp,\n expiresAt: entry.expiresAt,\n ttl,\n size\n }\n }\n}\n\n/**\n * Create a cache service instance with configuration\n */\nexport function createCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n return new CacheService(config, kvNamespace)\n}\n\n/**\n * Global cache instances by namespace (singleton pattern)\n */\nconst cacheInstances = new Map()\nlet globalKVNamespace: KVNamespace | undefined\n\n/**\n * Set global KV namespace for all cache instances\n */\nexport function setGlobalKVNamespace(kvNamespace: KVNamespace): void {\n globalKVNamespace = kvNamespace\n}\n\n/**\n * Get or create a cache service for a namespace\n */\nexport function getCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n const key = config.namespace\n\n if (!cacheInstances.has(key)) {\n // Use provided KV namespace or global one\n const kv = kvNamespace || globalKVNamespace\n cacheInstances.set(key, new CacheService(config, kv))\n }\n\n return cacheInstances.get(key)!\n}\n\n/**\n * Clear all cache instances\n */\nexport async function clearAllCaches(): Promise {\n for (const cache of cacheInstances.values()) {\n await cache.clear()\n }\n}\n\n/**\n * Get stats from all cache instances\n */\nexport function getAllCacheStats(): Record {\n const stats: Record = {}\n\n for (const [namespace, cache] of cacheInstances.entries()) {\n stats[namespace] = cache.getStats()\n }\n\n return stats\n}\n","/**\n * Event Bus for Cache Invalidation\n *\n * Provides a centralized event system for triggering cache invalidation\n * based on application events.\n */\n\nexport type EventHandler = (data?: any) => Promise | void\n\n// interface EventSubscription {\n// event: string\n// handler: EventHandler\n// }\n\nclass EventBus {\n private subscriptions: Map = new Map()\n private eventLog: Array<{ event: string; timestamp: number; data?: any }> = []\n private maxLogSize: number = 100\n\n /**\n * Subscribe to an event\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.subscriptions.has(event)) {\n this.subscriptions.set(event, [])\n }\n\n this.subscriptions.get(event)!.push(handler)\n\n // Return unsubscribe function\n return () => {\n const handlers = this.subscriptions.get(event)\n if (handlers) {\n const index = handlers.indexOf(handler)\n if (index > -1) {\n handlers.splice(index, 1)\n }\n }\n }\n }\n\n /**\n * Emit an event to all subscribers\n */\n async emit(event: string, data?: any): Promise {\n // Log the event\n this.logEvent(event, data)\n\n const handlers = this.subscriptions.get(event) || []\n\n // Execute all handlers\n await Promise.all(\n handlers.map(async (handler) => {\n try {\n await handler(data)\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error)\n }\n })\n )\n\n // Also emit to wildcard subscribers\n const wildcardHandlers = this.subscriptions.get('*') || []\n await Promise.all(\n wildcardHandlers.map(async (handler) => {\n try {\n await handler({ event, data })\n } catch (error) {\n console.error(`Error in wildcard event handler for ${event}:`, error)\n }\n })\n )\n }\n\n /**\n * Remove all subscribers for an event\n */\n off(event: string): void {\n this.subscriptions.delete(event)\n }\n\n /**\n * Get all registered events\n */\n getEvents(): string[] {\n return Array.from(this.subscriptions.keys())\n }\n\n /**\n * Get subscriber count for an event\n */\n getSubscriberCount(event: string): number {\n return this.subscriptions.get(event)?.length || 0\n }\n\n /**\n * Log an event for debugging\n */\n private logEvent(event: string, data?: any): void {\n this.eventLog.push({\n event,\n timestamp: Date.now(),\n data\n })\n\n // Keep log size manageable\n if (this.eventLog.length > this.maxLogSize) {\n this.eventLog.shift()\n }\n }\n\n /**\n * Get recent event log\n */\n getEventLog(limit: number = 50): Array<{ event: string; timestamp: number; data?: any }> {\n return this.eventLog.slice(-limit)\n }\n\n /**\n * Clear event log\n */\n clearEventLog(): void {\n this.eventLog = []\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n totalEvents: number\n totalSubscriptions: number\n eventCounts: Record\n } {\n const eventCounts: Record = {}\n\n for (const log of this.eventLog) {\n eventCounts[log.event] = (eventCounts[log.event] || 0) + 1\n }\n\n return {\n totalEvents: this.eventLog.length,\n totalSubscriptions: this.subscriptions.size,\n eventCounts\n }\n }\n}\n\n// Global event bus instance\nlet globalEventBus: EventBus | null = null\n\n/**\n * Get or create the global event bus\n */\nexport function getEventBus(): EventBus {\n if (!globalEventBus) {\n globalEventBus = new EventBus()\n }\n return globalEventBus\n}\n\n/**\n * Convenience function to emit an event\n */\nexport async function emitEvent(event: string, data?: any): Promise {\n const bus = getEventBus()\n await bus.emit(event, data)\n}\n\n/**\n * Convenience function to subscribe to an event\n */\nexport function onEvent(event: string, handler: EventHandler): () => void {\n const bus = getEventBus()\n return bus.on(event, handler)\n}\n","/**\n * Cache Invalidation Service\n *\n * Automatically invalidates cache entries based on application events\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\nimport { getEventBus, onEvent } from './event-bus.js'\n\n/**\n * Setup automatic cache invalidation based on events\n */\nexport function setupCacheInvalidation(): void {\n const _eventBus = getEventBus()\n\n // Content cache invalidation\n setupContentInvalidation()\n\n // User cache invalidation\n setupUserInvalidation()\n\n // Config cache invalidation\n setupConfigInvalidation()\n\n // Media cache invalidation\n setupMediaInvalidation()\n\n // API cache invalidation\n setupAPIInvalidation()\n\n // Collection cache invalidation\n setupCollectionInvalidation()\n\n console.log('Cache invalidation listeners registered')\n}\n\n/**\n * Content cache invalidation\n */\nfunction setupContentInvalidation(): void {\n const config = CACHE_CONFIGS.content\n if (!config) return\n const contentCache = getCacheService(config)\n\n // Invalidate on content updates\n onEvent('content.create', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.create')\n })\n\n onEvent('content.update', async (data) => {\n if (data?.id) {\n // Invalidate specific content item\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n // Invalidate all content lists\n await contentCache.invalidate('content:list:*')\n console.log('Cache invalidated: content.update', data?.id)\n })\n\n onEvent('content.delete', async (data) => {\n if (data?.id) {\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.delete', data?.id)\n })\n\n onEvent('content.publish', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.publish')\n })\n}\n\n/**\n * User cache invalidation\n */\nfunction setupUserInvalidation(): void {\n const config = CACHE_CONFIGS.user\n if (!config) return\n const userCache = getCacheService(config)\n\n onEvent('user.update', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.update', data?.id)\n })\n\n onEvent('user.delete', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.delete', data?.id)\n })\n\n onEvent('auth.login', async (data) => {\n if (data?.userId) {\n await userCache.delete(userCache.generateKey('id', data.userId))\n }\n console.log('Cache invalidated: auth.login', data?.userId)\n })\n\n onEvent('auth.logout', async (data) => {\n // Clear session cache\n const sessionConfig = CACHE_CONFIGS.session\n if (sessionConfig) {\n const sessionCache = getCacheService(sessionConfig)\n if (data?.sessionId) {\n await sessionCache.delete(sessionCache.generateKey('session', data.sessionId))\n }\n }\n console.log('Cache invalidated: auth.logout')\n })\n}\n\n/**\n * Config cache invalidation\n */\nfunction setupConfigInvalidation(): void {\n const configConfig = CACHE_CONFIGS.config\n if (!configConfig) return\n const configCache = getCacheService(configConfig)\n\n onEvent('config.update', async (_data) => {\n await configCache.invalidate('config:*')\n console.log('Cache invalidated: config.update')\n })\n\n onEvent('plugin.activate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.activate', data?.pluginId)\n })\n\n onEvent('plugin.deactivate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.deactivate', data?.pluginId)\n })\n\n onEvent('plugin.update', async (data) => {\n const pluginConfig = CACHE_CONFIGS.plugin\n if (!pluginConfig) return\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n console.log('Cache invalidated: plugin.update', data?.pluginId)\n })\n}\n\n/**\n * Media cache invalidation\n */\nfunction setupMediaInvalidation(): void {\n const config = CACHE_CONFIGS.media\n if (!config) return\n const mediaCache = getCacheService(config)\n\n onEvent('media.upload', async (_data) => {\n await mediaCache.invalidate('media:*')\n console.log('Cache invalidated: media.upload')\n })\n\n onEvent('media.delete', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.delete', data?.id)\n })\n\n onEvent('media.update', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.update', data?.id)\n })\n}\n\n/**\n * API cache invalidation (depends on content changes)\n */\nfunction setupAPIInvalidation(): void {\n const config = CACHE_CONFIGS.api\n if (!config) return\n const apiCache = getCacheService(config)\n\n onEvent('content.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.update)')\n })\n\n onEvent('content.publish', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.publish)')\n })\n\n onEvent('content.create', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.create)')\n })\n\n onEvent('content.delete', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.delete)')\n })\n\n onEvent('collection.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (collection.update)')\n })\n}\n\n/**\n * Collection cache invalidation\n */\nfunction setupCollectionInvalidation(): void {\n const config = CACHE_CONFIGS.collection\n if (!config) return\n const collectionCache = getCacheService(config)\n\n onEvent('collection.create', async (_data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.create')\n })\n\n onEvent('collection.update', async (data) => {\n if (data?.id) {\n await collectionCache.delete(collectionCache.generateKey('item', data.id))\n }\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.update', data?.id)\n })\n\n onEvent('collection.delete', async (data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.delete', data?.id)\n })\n}\n\n/**\n * Get invalidation statistics\n */\nexport function getCacheInvalidationStats() {\n const eventBus = getEventBus()\n return eventBus.getStats()\n}\n\n/**\n * Get recent invalidation events\n */\nexport function getRecentInvalidations(limit: number = 50) {\n const eventBus = getEventBus()\n return eventBus.getEventLog(limit)\n}\n","/**\n * Cache Warming Utilities\n *\n * Utilities for preloading and warming cache entries\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\n\n/**\n * Warm cache with common queries\n */\nexport async function warmCommonCaches(db: D1Database): Promise<{\n warmed: number\n errors: number\n details: Array<{ namespace: string; count: number }>\n}> {\n let totalWarmed = 0\n let totalErrors = 0\n const details: Array<{ namespace: string; count: number }> = []\n\n try {\n // Warm collection cache\n const collectionCount = await warmCollections(db)\n totalWarmed += collectionCount\n details.push({ namespace: 'collection', count: collectionCount })\n\n // Warm content cache (most recent items)\n const contentCount = await warmRecentContent(db)\n totalWarmed += contentCount\n details.push({ namespace: 'content', count: contentCount })\n\n // Warm media cache (most recent items)\n const mediaCount = await warmRecentMedia(db)\n totalWarmed += mediaCount\n details.push({ namespace: 'media', count: mediaCount })\n\n } catch (error) {\n console.error('Error warming caches:', error)\n totalErrors++\n }\n\n return {\n warmed: totalWarmed,\n errors: totalErrors,\n details\n }\n}\n\n/**\n * Warm collections cache\n */\nasync function warmCollections(db: D1Database): Promise {\n const config = CACHE_CONFIGS.collection\n if (!config) return 0\n const collectionCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare('SELECT * FROM collections WHERE is_active = 1')\n const { results } = await stmt.all()\n\n for (const collection of results as any[]) {\n const key = collectionCache.generateKey('item', collection.id)\n await collectionCache.set(key, collection)\n count++\n }\n\n // Also cache the full list\n const listKey = collectionCache.generateKey('list', 'all')\n await collectionCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming collections cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent content cache\n */\nasync function warmRecentContent(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.content\n if (!config) return 0\n const contentCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM content ORDER BY created_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const content of results as any[]) {\n const key = contentCache.generateKey('item', content.id)\n await contentCache.set(key, content)\n count++\n }\n\n // Cache the list\n const listKey = contentCache.generateKey('list', 'recent')\n await contentCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming content cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent media cache\n */\nasync function warmRecentMedia(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.media\n if (!config) return 0\n const mediaCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const media of results as any[]) {\n const key = mediaCache.generateKey('item', media.id)\n await mediaCache.set(key, media)\n count++\n }\n\n // Cache the list\n const listKey = mediaCache.generateKey('list', 'recent')\n await mediaCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming media cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm specific namespace with custom data\n */\nexport async function warmNamespace(\n namespace: string,\n entries: Array<{ key: string; value: any }>\n): Promise {\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n throw new Error(`Unknown namespace: ${namespace}`)\n }\n\n const cache = getCacheService(config)\n await cache.setMany(entries)\n\n return entries.length\n}\n\n/**\n * Preload cache on application startup\n */\nexport async function preloadCache(db: D1Database): Promise {\n console.log('🔥 Preloading cache...')\n\n const result = await warmCommonCaches(db)\n\n console.log(`✅ Cache preloaded: ${result.warmed} entries across ${result.details.length} namespaces`)\n result.details.forEach(detail => {\n console.log(` - ${detail.namespace}: ${detail.count} entries`)\n })\n\n if (result.errors > 0) {\n console.warn(`⚠️ ${result.errors} errors during cache preloading`)\n }\n}\n\n/**\n * Schedule periodic cache warming\n */\nexport function schedulePeriodicWarming(\n db: D1Database,\n intervalMs: number = 300000 // 5 minutes default\n): NodeJS.Timeout {\n console.log(`⏰ Scheduling periodic cache warming every ${intervalMs / 1000}s`)\n\n return setInterval(async () => {\n try {\n console.log('🔄 Running periodic cache warming...')\n await warmCommonCaches(db)\n } catch (error) {\n console.error('Error during periodic cache warming:', error)\n }\n }, intervalMs)\n}\n","/**\n * Admin Cache Dashboard Template\n *\n * Moved from @sonicjs-cms/templates to avoid circular dependency\n * during build (templates imports from core, core can't import from templates)\n */\n\nimport { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\nexport interface CacheDashboardData {\n stats: Record\n totals: {\n hits: number\n misses: number\n requests: number\n hitRate: string\n memorySize: number\n entryCount: number\n }\n namespaces: string[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCacheDashboard(data: CacheDashboardData): string {\n const pageContent = `\n
\n \n
\n
\n

Cache System

\n

\n Monitor and manage cache performance across all namespaces\n

\n
\n
\n \n \n \n \n Refresh\n \n \n \n \n \n Clear All\n \n
\n
\n\n \n
\n ${renderStatCard('Total Requests', data.totals.requests.toLocaleString(), 'lime', `\n \n \n \n `)}\n\n ${renderStatCard('Hit Rate', data.totals.hitRate + '%', 'blue', `\n \n \n \n `, parseFloat(data.totals.hitRate) > 70 ? 'lime' : parseFloat(data.totals.hitRate) > 40 ? 'amber' : 'red')}\n\n ${renderStatCard('Memory Usage', formatBytes(data.totals.memorySize), 'purple', `\n \n \n \n `)}\n\n ${renderStatCard('Cached Entries', data.totals.entryCount.toLocaleString(), 'sky', `\n \n \n \n `)}\n
\n\n \n
\n
\n

Cache Namespaces

\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ${data.namespaces.map(namespace => {\n const stat = data.stats[namespace]\n if (!stat) return ''\n return renderNamespaceRow(namespace, stat)\n }).join('')}\n \n
\n Namespace\n \n Requests\n \n Hit Rate\n \n Memory Hits\n \n KV Hits\n \n Entries\n \n Size\n \n Actions\n
\n
\n
\n\n \n
\n
\n

Performance Overview

\n
\n
\n
\n ${renderPerformanceMetric('Memory Cache', data.totals.hits, data.totals.misses)}\n ${renderHealthStatus(parseFloat(data.totals.hitRate))}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'clear-all-cache-confirm',\n title: 'Clear All Cache',\n message: 'Are you sure you want to clear all cache entries? This cannot be undone.',\n confirmText: 'Clear All',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearAllCaches()'\n })}\n\n ${renderConfirmationDialog({\n id: 'clear-namespace-cache-confirm',\n title: 'Clear Namespace Cache',\n message: 'Clear cache for this namespace?',\n confirmText: 'Clear',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearNamespaceCache()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Cache System',\n pageTitle: 'Cache System',\n currentPath: '/admin/cache',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderStatCard(label: string, value: string, color: string, icon: string, colorOverride?: string): string {\n const finalColor = colorOverride || color\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n blue: 'bg-blue-50 dark:bg-blue-500/10 text-blue-600 dark:text-blue-400 ring-blue-600/20 dark:ring-blue-500/20',\n purple: 'bg-purple-50 dark:bg-purple-500/10 text-purple-600 dark:text-purple-400 ring-purple-600/20 dark:ring-purple-500/20',\n sky: 'bg-sky-50 dark:bg-sky-500/10 text-sky-600 dark:text-sky-400 ring-sky-600/20 dark:ring-sky-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n
\n
\n
\n
\n ${icon}\n
\n
\n

${label}

\n

${value}

\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderNamespaceRow(namespace: string, stat: CacheStats): string {\n const hitRate = stat.hitRate.toFixed(1)\n const hitRateColor = stat.hitRate > 70 ? 'text-lime-600 dark:text-lime-400' :\n stat.hitRate > 40 ? 'text-amber-600 dark:text-amber-400' :\n 'text-red-600 dark:text-red-400'\n\n return `\n \n \n \n ${namespace}\n \n \n \n ${stat.totalRequests.toLocaleString()}\n \n \n \n ${hitRate}%\n \n \n \n ${stat.memoryHits.toLocaleString()}\n \n \n ${stat.kvHits.toLocaleString()}\n \n \n ${stat.entryCount.toLocaleString()}\n \n \n ${formatBytes(stat.memorySize)}\n \n \n \n Clear\n \n \n \n `\n}\n\nfunction renderPerformanceMetric(label: string, hits: number, misses: number): string {\n const total = hits + misses\n const hitPercentage = total > 0 ? (hits / total) * 100 : 0\n\n return `\n
\n

${label}

\n
\n
\n Hits\n ${hits.toLocaleString()}\n
\n
\n Misses\n ${misses.toLocaleString()}\n
\n
\n
\n Hit Rate\n ${hitPercentage.toFixed(1)}%\n
\n
\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderHealthStatus(hitRate: number): string {\n const status = hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'critical'\n const statusConfig = {\n healthy: {\n label: 'Healthy',\n color: 'lime',\n icon: `\n \n `\n },\n warning: {\n label: 'Needs Attention',\n color: 'amber',\n icon: `\n \n `\n },\n critical: {\n label: 'Critical',\n color: 'red',\n icon: `\n \n `\n }\n }\n\n const config = statusConfig[status]\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n

System Health

\n
\n ${config.icon}\n
\n

${config.label}

\n

\n ${status === 'healthy' ? 'Cache is performing well' :\n status === 'warning' ? 'Consider increasing cache TTL or capacity' :\n 'Cache hit rate is too low'}\n

\n
\n
\n
\n `\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`\n}\n","/**\n * Cache Plugin Routes\n *\n * Admin routes for cache management\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport { getAllCacheStats, clearAllCaches, getCacheService } from './services/cache.js'\nimport { CACHE_CONFIGS, parseCacheKey } from './services/cache-config.js'\nimport { getRecentInvalidations, getCacheInvalidationStats } from './services/cache-invalidation.js'\nimport { warmCommonCaches, warmNamespace } from './services/cache-warming.js'\nimport { renderCacheDashboard, CacheDashboardData } from '../../templates/pages/admin-cache.template'\n\nconst app = new Hono()\n\n/**\n * GET /admin/cache\n * Cache statistics dashboard\n */\napp.get('/', async (c: Context) => {\n const stats = getAllCacheStats()\n const user = c.get('user')\n\n // Calculate totals\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n Object.values(stats).forEach(stat => {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n })\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n const dashboardData: CacheDashboardData = {\n stats,\n totals: {\n hits: totalHits,\n misses: totalMisses,\n requests: totalRequests,\n hitRate: overallHitRate.toFixed(2),\n memorySize: totalSize,\n entryCount: totalEntries\n },\n namespaces: Object.keys(stats),\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCacheDashboard(dashboardData))\n})\n\n/**\n * GET /admin/cache/stats\n * Detailed statistics for all namespaces\n */\napp.get('/stats', async (c: Context) => {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/stats/:namespace\n * Statistics for a specific namespace\n */\napp.get('/stats/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const stats = cache.getStats()\n\n return c.json({\n success: true,\n data: {\n namespace,\n config,\n stats\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear\n * Clear all cache entries\n */\napp.post('/clear', async (c: Context) => {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear/:namespace\n * Clear cache for a specific namespace\n */\napp.post('/clear/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n await cache.clear()\n\n return c.json({\n success: true,\n message: `Cache cleared for namespace: ${namespace}`,\n namespace,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/invalidate\n * Invalidate cache entries matching a pattern\n */\napp.post('/invalidate', async (c: Context) => {\n const body = await c.req.json()\n const { pattern, namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (namespace) {\n // Invalidate from specific namespace\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: namespace || 'all',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/health\n * Cache system health check\n */\napp.get('/health', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // Calculate health metrics\n const namespaces = Object.entries(stats)\n const healthChecks = namespaces.map(([name, stat]) => {\n const hitRate = stat.hitRate\n const memoryUsage = stat.memorySize / (50 * 1024 * 1024) // Assume 50MB max\n\n return {\n namespace: name,\n status: hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'unhealthy',\n hitRate,\n memoryUsage: (memoryUsage * 100).toFixed(2) + '%',\n entryCount: stat.entryCount\n }\n })\n\n const overallStatus = healthChecks.every(h => h.status === 'healthy')\n ? 'healthy'\n : healthChecks.some(h => h.status === 'unhealthy')\n ? 'unhealthy'\n : 'warning'\n\n return c.json({\n success: true,\n data: {\n status: overallStatus,\n namespaces: healthChecks,\n timestamp: new Date().toISOString()\n }\n })\n})\n\n/**\n * GET /admin/cache/browser\n * Browse all cache entries across namespaces\n */\napp.get('/browser', async (c: Context) => {\n const namespace = c.req.query('namespace') || 'all'\n const search = c.req.query('search') || ''\n const sortBy = c.req.query('sort') || 'age' // age, size, key\n const limit = parseInt(c.req.query('limit') || '100')\n\n const entries: Array<{\n namespace: string\n key: string\n size: number\n age: number\n ttl: number\n expiresAt: number\n parsed: any\n }> = []\n\n const namespaces = namespace === 'all'\n ? Object.keys(CACHE_CONFIGS)\n : [namespace]\n\n for (const ns of namespaces) {\n const config = CACHE_CONFIGS[ns]\n if (!config) continue\n\n const cache = getCacheService(config)\n const keys = await cache.listKeys()\n\n for (const keyInfo of keys) {\n // Apply search filter\n if (search && !keyInfo.key.toLowerCase().includes(search.toLowerCase())) {\n continue\n }\n\n const parsed = parseCacheKey(keyInfo.key)\n const ttl = Math.max(0, keyInfo.expiresAt - Date.now()) / 1000\n\n entries.push({\n namespace: ns,\n key: keyInfo.key,\n size: keyInfo.size,\n age: keyInfo.age,\n ttl,\n expiresAt: keyInfo.expiresAt,\n parsed\n })\n }\n }\n\n // Sort entries\n if (sortBy === 'size') {\n entries.sort((a, b) => b.size - a.size)\n } else if (sortBy === 'age') {\n entries.sort((a, b) => a.age - b.age)\n } else if (sortBy === 'key') {\n entries.sort((a, b) => a.key.localeCompare(b.key))\n }\n\n // Limit results\n const limitedEntries = entries.slice(0, limit)\n\n return c.json({\n success: true,\n data: {\n entries: limitedEntries,\n total: entries.length,\n showing: limitedEntries.length,\n namespace,\n search,\n sortBy\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/browser/:namespace/:key\n * Get detailed information about a specific cache entry\n */\napp.get('/browser/:namespace/:key', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const key = decodeURIComponent(c.req.param('key')!)\n\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const entry = await cache.getEntry(key)\n\n if (!entry) {\n return c.json({\n success: false,\n error: 'Cache entry not found or expired'\n }, 404)\n }\n\n const parsed = parseCacheKey(key)\n\n return c.json({\n success: true,\n data: {\n key,\n namespace,\n parsed,\n ...entry,\n createdAt: new Date(entry.timestamp).toISOString(),\n expiresAt: new Date(entry.expiresAt).toISOString()\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics\n * Advanced cache analytics\n */\napp.get('/analytics', async (c: Context) => {\n const stats = getAllCacheStats()\n const invalidationStats = getCacheInvalidationStats()\n const recentInvalidations = getRecentInvalidations(20)\n\n // Calculate analytics\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n const namespacesAnalytics = []\n\n for (const [namespace, stat] of Object.entries(stats)) {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n\n const totalRequests = stat.memoryHits + stat.kvHits + stat.memoryMisses + stat.kvMisses\n const hitRate = totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / totalRequests) * 100 : 0\n const avgEntrySize = stat.entryCount > 0 ? stat.memorySize / stat.entryCount : 0\n\n namespacesAnalytics.push({\n namespace,\n hitRate: hitRate.toFixed(2),\n totalRequests,\n memoryHitRate: totalRequests > 0 ? ((stat.memoryHits / totalRequests) * 100).toFixed(2) : '0',\n kvHitRate: totalRequests > 0 ? ((stat.kvHits / totalRequests) * 100).toFixed(2) : '0',\n avgEntrySize: Math.round(avgEntrySize),\n totalSize: stat.memorySize,\n entryCount: stat.entryCount,\n efficiency: totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / (stat.memoryHits + stat.kvHits + stat.dbHits + 1)).toFixed(2) : '0'\n })\n }\n\n // Sort by hit rate\n namespacesAnalytics.sort((a, b) => parseFloat(b.hitRate) - parseFloat(a.hitRate))\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n // Calculate cost savings (assume 50ms per DB query vs 2ms for cache)\n const dbQueriesAvoided = totalHits\n const timeSaved = dbQueriesAvoided * 48 // 48ms saved per cache hit\n const estimatedCostSavings = (dbQueriesAvoided / 1000000) * 0.50 // $0.50 per million queries\n\n return c.json({\n success: true,\n data: {\n overview: {\n totalHits,\n totalMisses,\n totalRequests,\n overallHitRate: overallHitRate.toFixed(2),\n totalSize,\n totalEntries,\n avgEntrySize: totalEntries > 0 ? Math.round(totalSize / totalEntries) : 0\n },\n performance: {\n dbQueriesAvoided,\n timeSavedMs: timeSaved,\n timeSavedMinutes: (timeSaved / 1000 / 60).toFixed(2),\n estimatedCostSavings: estimatedCostSavings.toFixed(4)\n },\n namespaces: namespacesAnalytics,\n invalidation: {\n ...invalidationStats,\n recent: recentInvalidations\n }\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/trends\n * Cache trends over time (simplified - would need historical data storage)\n */\napp.get('/analytics/trends', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // For now, return current snapshot as a data point\n // In production, this would query historical data\n const dataPoint = {\n timestamp: Date.now(),\n stats: Object.entries(stats).map(([namespace, stat]) => ({\n namespace,\n hitRate: stat.hitRate,\n entryCount: stat.entryCount,\n memorySize: stat.memorySize,\n totalRequests: stat.totalRequests\n }))\n }\n\n return c.json({\n success: true,\n data: {\n trends: [dataPoint],\n note: 'Historical trends require persistent storage. This returns current snapshot only.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/top-keys\n * Most accessed cache keys (would need hit tracking)\n */\napp.get('/analytics/top-keys', async (c: Context) => {\n const _namespace = c.req.query('namespace') || 'all'\n const _limit = parseInt(c.req.query('limit') || '10')\n\n // This is a placeholder - would need per-key hit tracking\n return c.json({\n success: true,\n data: {\n topKeys: [],\n note: 'Top keys tracking requires per-key hit counting. Feature not yet implemented.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/warm\n * Warm cache with common queries\n */\napp.post('/warm', async (c: Context) => {\n try {\n const db = c.env.DB as D1Database\n const result = await warmCommonCaches(db)\n\n return c.json({\n success: true,\n message: 'Cache warming completed',\n ...result,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Cache warming error:', error)\n return c.json({\n success: false,\n error: 'Cache warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * POST /admin/cache/warm/:namespace\n * Warm specific namespace cache\n */\napp.post('/warm/:namespace', async (c: Context) => {\n try {\n const namespace = c.req.param('namespace')!\n const body = await c.req.json()\n const { entries } = body\n\n if (!entries || !Array.isArray(entries)) {\n return c.json({\n success: false,\n error: 'Entries array is required'\n }, 400)\n }\n\n const count = await warmNamespace(namespace, entries)\n\n return c.json({\n success: true,\n message: `Warmed ${count} entries in namespace: ${namespace}`,\n namespace,\n count,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Namespace warming error:', error)\n return c.json({\n success: false,\n error: 'Namespace warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Cache Plugin\n *\n * Three-tiered caching system for SonicJS\n * - Tier 1: In-Memory (fastest, region-specific)\n * - Tier 2: Cloudflare KV (fast, global)\n * - Tier 3: Database (source of truth)\n */\n\nimport type { Context } from 'hono'\nimport type { PluginContext } from '@sonicjs-cms/core'\nimport { getCacheService, clearAllCaches, getAllCacheStats } from './services/cache.js'\nimport { CACHE_CONFIGS } from './services/cache-config.js'\nimport { setupCacheInvalidation } from './services/cache-invalidation.js'\nimport cacheRoutes from './routes.js'\n\nexport class CachePlugin {\n private _context: PluginContext | null = null\n\n /**\n * Get plugin routes\n */\n getRoutes() {\n return cacheRoutes\n }\n\n /**\n * Activate the cache plugin\n */\n async activate(context: PluginContext): Promise {\n this._context = context\n\n const settings = context.config || {}\n\n console.log('✅ Cache plugin activated', {\n memoryEnabled: settings.memoryEnabled ?? true,\n kvEnabled: settings.kvEnabled ?? false,\n defaultTTL: settings.defaultTTL ?? 3600\n })\n\n // Initialize default cache services\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n\n // Setup event-based cache invalidation\n setupCacheInvalidation()\n }\n\n /**\n * Deactivate the cache plugin\n */\n async deactivate(): Promise {\n console.log('❌ Cache plugin deactivated - clearing all caches')\n await clearAllCaches()\n this._context = null\n }\n\n /**\n * Configure the cache plugin\n */\n async configure(settings: Record): Promise {\n console.log('⚙️ Cache plugin configured', settings)\n\n // Reconfigure all cache instances with new settings\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n }\n\n /**\n * Get cache statistics\n */\n async getStats(c: Context): Promise {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Clear all cache entries\n */\n async clearCache(c: Context): Promise {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Invalidate cache entries matching pattern\n */\n async invalidatePattern(c: Context): Promise {\n const body = await c.req.json()\n const { pattern, namespace: _namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (_namespace) {\n // Invalidate from specific namespace\n const cache = getCacheService(CACHE_CONFIGS[_namespace] || {\n ttl: 3600,\n kvEnabled: false,\n memoryEnabled: true,\n namespace: _namespace,\n invalidateOn: [],\n version: 'v1'\n })\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: _namespace || 'all',\n timestamp: new Date().toISOString()\n })\n }\n}\n\n// Export cache services for use by other plugins/routes when cache plugin is active\nexport {\n getCacheService,\n clearAllCaches,\n getAllCacheStats,\n setGlobalKVNamespace\n} from './services/cache'\nexport { CACHE_CONFIGS, getCacheConfig, generateCacheKey } from './services/cache-config'\nexport type { CacheConfig, CacheStats } from './services/cache-config'\nexport { emitEvent, onEvent, getEventBus } from './services/event-bus'\nexport { getCacheInvalidationStats, getRecentInvalidations } from './services/cache-invalidation'\nexport { warmCommonCaches, warmNamespace, preloadCache } from './services/cache-warming'\n\n// Create and export plugin instance\nconst plugin = new CachePlugin()\nexport default plugin\n","/**\n * SonicJS Favicon SVG\n *\n * Embedded SVG favicon for the admin interface and auth pages.\n * This ensures the favicon is always available without external dependencies.\n */\n\nexport const faviconSvg = `\n\n\n\t\n\t\t\n\t\t\n\t\n\n`;\n","/**\n * Main Application Factory\n *\n * Creates a configured SonicJS application with all core functionality\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport {\n apiRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n testCleanupRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminPluginRoutes,\n adminLogsRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n adminFormsRoutes,\n publicFormsRoutes,\n adminApiReferenceRoutes\n} from './routes'\nimport { getCoreVersion } from './utils/version'\nimport { bootstrapMiddleware } from './middleware/bootstrap'\nimport { metricsMiddleware } from './middleware/metrics'\nimport { csrfProtection } from './middleware/csrf'\nimport { securityHeadersMiddleware } from './middleware/security-headers'\nimport { createDatabaseToolsAdminRoutes } from './plugins/core-plugins/database-tools-plugin/admin-routes'\nimport { createSeedDataAdminRoutes } from './plugins/core-plugins/seed-data-plugin/admin-routes'\nimport { emailPlugin } from './plugins/core-plugins/email-plugin'\nimport { otpLoginPlugin } from './plugins/core-plugins/otp-login-plugin'\nimport { oauthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nimport { userProfilesPlugin } from './plugins/core-plugins/user-profiles'\nimport { aiSearchPlugin } from './plugins/core-plugins/ai-search-plugin'\nimport { createMagicLinkAuthPlugin } from './plugins/available/magic-link-auth'\nimport { securityAuditPlugin } from './plugins/core-plugins/security-audit-plugin'\nimport { securityAuditMiddleware } from './plugins/core-plugins/security-audit-plugin'\nimport { stripePlugin } from './plugins/core-plugins/stripe-plugin'\nimport { requireAuth, requireRole } from './middleware/auth'\nimport { pluginMenuMiddleware } from './middleware/plugin-menu'\nimport { analyticsPlugin } from './plugins/core-plugins/analytics'\nimport { eventsApiRoutes } from './plugins/core-plugins/analytics/routes/api'\nimport cachePlugin from './plugins/cache'\nimport { faviconSvg } from './assets/favicon'\nimport { setAppInstance } from './services/route-metadata'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface Bindings {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n CORS_ORIGINS?: string\n JWT_SECRET?: string\n JWT_EXPIRES_IN?: string\n JWT_REFRESH_GRACE_SECONDS?: string\n BUCKET_NAME?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\nexport interface Variables {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n csrfToken?: string\n pluginMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport interface SonicJSConfig {\n // Collections configuration\n collections?: {\n directory?: string\n autoSync?: boolean\n }\n\n // Plugins configuration\n plugins?: {\n directory?: string\n autoLoad?: boolean\n disableAll?: boolean // Disable all plugins including core plugins\n }\n\n // Custom routes\n routes?: Array<{\n path: string\n handler: Hono\n }>\n\n // Custom middleware\n middleware?: {\n beforeAuth?: Array<(c: Context, next: () => Promise) => Promise>\n afterAuth?: Array<(c: Context, next: () => Promise) => Promise>\n }\n\n // Admin access control\n // Roles allowed to access the /admin panel. Defaults to ['admin'].\n adminAccessRoles?: string[]\n\n // App metadata\n version?: string\n name?: string\n}\n\nexport type SonicJSApp = Hono<{ Bindings: Bindings; Variables: Variables }>\n\n// ============================================================================\n// Application Factory\n// ============================================================================\n\n/**\n * Create a SonicJS application with core functionality\n *\n * @param config - Application configuration\n * @returns Configured Hono application\n *\n * @example\n * ```typescript\n * import { createSonicJSApp } from '@sonicjs-cms/core'\n *\n * const app = createSonicJSApp({\n * collections: {\n * directory: './src/collections',\n * autoSync: true\n * },\n * plugins: {\n * directory: './src/plugins',\n * autoLoad: true\n * }\n * })\n *\n * export default app\n * ```\n */\nexport function createSonicJSApp(config: SonicJSConfig = {}): SonicJSApp {\n const app = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Set app metadata\n const appVersion = config.version || getCoreVersion()\n const appName = config.name || 'SonicJS AI'\n\n // App version middleware\n app.use('*', async (c, next) => {\n c.set('appVersion', appVersion)\n await next()\n })\n\n // Metrics middleware - track all requests for real-time analytics\n app.use('*', metricsMiddleware())\n\n // Bootstrap middleware - runs migrations, syncs collections, and initializes plugins\n app.use('*', bootstrapMiddleware(config))\n\n // Custom middleware - before auth\n if (config.middleware?.beforeAuth) {\n for (const middleware of config.middleware.beforeAuth) {\n app.use('*', middleware)\n }\n }\n\n // Logging middleware\n app.use('*', async (_c, next) => {\n // Logging logic here\n await next()\n })\n\n // Security middleware\n app.use('*', securityHeadersMiddleware())\n\n // CSRF protection middleware\n app.use('*', csrfProtection())\n\n // Custom middleware - after auth\n if (config.middleware?.afterAuth) {\n for (const middleware of config.middleware.afterAuth) {\n app.use('*', middleware)\n }\n }\n\n // Admin panel access control: require authentication and admin role by default\n const adminRoles = config.adminAccessRoles || ['admin']\n app.use('/admin/*', requireAuth())\n app.use('/admin/*', requireRole(adminRoles))\n\n // Plugin dynamic menu items for admin sidebar\n app.use('/admin/*', pluginMenuMiddleware())\n\n // Core routes\n // Routes are being imported incrementally from routes/*\n // Each route is tested and migrated one-by-one\n app.route('/api', apiRoutes)\n app.route('/api/media', apiMediaRoutes)\n app.route('/api/system', apiSystemRoutes)\n app.route('/admin/api', adminApiRoutes)\n app.route('/admin/dashboard', adminDashboardRoutes)\n app.route('/admin/collections', adminCollectionsRoutes)\n app.route('/admin/forms', adminFormsRoutes)\n app.route('/admin/settings', adminSettingsRoutes)\n app.route('/forms', publicFormsRoutes)\n app.route('/api/forms', publicFormsRoutes) // API endpoint for form submissions\n app.route('/admin/api-reference', adminApiReferenceRoutes)\n app.route('/admin/database-tools', createDatabaseToolsAdminRoutes())\n app.route('/admin/seed-data', createSeedDataAdminRoutes())\n app.route('/admin/content', adminContentRoutes)\n app.route('/admin/media', adminMediaRoutes)\n // Security audit middleware - logs auth events (login, register, logout)\n app.use('/auth/*', securityAuditMiddleware())\n\n // Plugin routes - Security Audit (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (securityAuditPlugin.routes && securityAuditPlugin.routes.length > 0) {\n for (const route of securityAuditPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - AI Search (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register AI Search routes first so they take precedence over the generic /:id handler\n if (aiSearchPlugin.routes && aiSearchPlugin.routes.length > 0) {\n for (const route of aiSearchPlugin.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Plugin routes - Cache (dashboard and management API)\n // Fixes GitHub Issue #461: Cache routes were not registered\n app.route('/admin/cache', cachePlugin.getRoutes())\n\n // Plugin routes - OAuth Providers (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (oauthProvidersPlugin.routes && oauthProvidersPlugin.routes.length > 0) {\n for (const route of oauthProvidersPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - User Profiles\n if (userProfilesPlugin.routes && userProfilesPlugin.routes.length > 0) {\n for (const route of userProfilesPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - OTP Login (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register OTP Login routes first so they take precedence over the generic /:id handler\n if (otpLoginPlugin.routes && otpLoginPlugin.routes.length > 0) {\n for (const route of otpLoginPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Analytics (must be before /admin/plugins catch-all)\n if (analyticsPlugin.routes && analyticsPlugin.routes.length > 0) {\n for (const route of analyticsPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Public event tracking API — POST /api/events (open), GET /api/events (admin)\n app.route('/api/events', eventsApiRoutes)\n\n // Plugin routes - Stripe (must be before /admin/plugins catch-all)\n if (stripePlugin.routes && stripePlugin.routes.length > 0) {\n for (const route of stripePlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n app.route('/admin/plugins', adminPluginRoutes)\n app.route('/admin/logs', adminLogsRoutes)\n app.route('/admin', adminUsersRoutes)\n app.route('/auth', authRoutes)\n\n // Test cleanup routes (only for development/test environments)\n app.route('/', testCleanupRoutes)\n\n // Plugin routes - Email\n if (emailPlugin.routes && emailPlugin.routes.length > 0) {\n for (const route of emailPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Magic Link Auth (passwordless authentication via email links)\n const magicLinkPlugin = createMagicLinkAuthPlugin()\n if (magicLinkPlugin.routes && magicLinkPlugin.routes.length > 0) {\n for (const route of magicLinkPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Serve favicon\n app.get('/favicon.svg', (c) => {\n return new Response(faviconSvg, {\n headers: {\n 'Content-Type': 'image/svg+xml',\n 'Cache-Control': 'public, max-age=31536000'\n }\n })\n })\n\n // Serve files from R2 storage (public file access)\n app.get('/files/*', async (c) => {\n try {\n // Extract the path from the URL pathname (everything after /files/)\n const url = new URL(c.req.url)\n const pathname = url.pathname\n\n // Remove the /files/ prefix to get the R2 object key\n const objectKey = pathname.replace(/^\\/files\\//, '')\n\n if (!objectKey) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(objectKey)\n\n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n headers.set('Access-Control-Allow-Origin', '*') // Allow CORS for media files\n headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n headers.set('Access-Control-Allow-Headers', 'Content-Type')\n\n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n })\n\n // Custom routes - User-defined routes\n if (config.routes) {\n for (const route of config.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Root redirect to login\n app.get('/', (c) => {\n return c.redirect('/auth/login')\n })\n\n // Health check\n app.get('/health', (c) => {\n return c.json({\n name: appName,\n version: appVersion,\n status: 'running',\n timestamp: new Date().toISOString()\n })\n })\n\n // Store app instance for route introspection (API reference auto-discovery)\n setAppInstance(app)\n\n // 404 handler\n app.notFound((c) => {\n return c.json({ error: 'Not Found', status: 404 }, 404)\n })\n\n // Error handler\n app.onError((err, c) => {\n console.error(err)\n return c.json({ error: 'Internal Server Error', status: 500 }, 500)\n })\n\n return app\n}\n\n/**\n * Setup core middleware (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreMiddleware(_app: SonicJSApp): void {\n console.warn('setupCoreMiddleware is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n\n/**\n * Setup core routes (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreRoutes(_app: SonicJSApp): void {\n console.warn('setupCoreRoutes is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n","import { drizzle } from 'drizzle-orm/d1';\nimport * as schema from './schema';\n\nexport function createDb(d1: D1Database) {\n return drizzle(d1, { schema });\n}\n\nexport * from './schema';","/**\n * @sonicjs/core - Main Entry Point\n *\n * Core framework for SonicJS headless CMS\n * Built for Cloudflare's edge platform with TypeScript\n *\n * Phase 2 Migration Status:\n * - Week 1: Types, Utils, Database (COMPLETED ✓)\n * - Week 2: Services, Middleware, Plugins (COMPLETED ✓)\n * - Week 3: Routes, Templates (COMPLETED ✓)\n * - Week 4: Integration & Testing (COMPLETED ✓)\n *\n * Test Coverage:\n * - Utilities: 48 tests (sanitize, query-filter, metrics)\n * - Middleware: 51 tests (auth, logging, security, performance)\n * - Total: 99 tests passing\n */\n\n// ============================================================================\n// Main Application API (Phase 2 Week 1)\n// ============================================================================\n\nexport { createSonicJSApp, setupCoreMiddleware, setupCoreRoutes } from './app'\nexport type { SonicJSConfig, SonicJSApp, Bindings, Variables } from './app'\n\n// ============================================================================\n// Placeholders - To be populated in Phase 2\n// ============================================================================\n\n// Services - Week 2 (COMPLETED)\nexport {\n // Collection Management\n loadCollectionConfigs,\n loadCollectionConfig,\n getAvailableCollectionNames,\n validateCollectionConfig,\n registerCollections,\n syncCollections,\n syncCollection,\n isCollectionManaged,\n getManagedCollections,\n cleanupRemovedCollections,\n fullCollectionSync,\n // Form-Collection Sync\n syncAllFormCollections,\n syncFormCollection,\n createContentFromSubmission,\n deriveCollectionSchemaFromFormio,\n deriveSubmissionTitle,\n mapFormStatusToContentStatus,\n backfillFormSubmissions,\n // Database Migrations\n MigrationService,\n // Logging\n Logger,\n getLogger,\n initLogger,\n // Plugin Services - Class implementations\n PluginService as PluginServiceClass,\n PluginBootstrapService,\n} from './services'\n\nexport type { Migration, MigrationStatus, LogLevel, LogCategory, LogEntry, LogFilter, CorePlugin } from './services'\n\n// Middleware - Week 2 (COMPLETED)\nexport {\n // Authentication\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n // Logging\n loggingMiddleware,\n detailedLoggingMiddleware,\n securityLoggingMiddleware,\n performanceLoggingMiddleware,\n // Performance\n cacheHeaders,\n compressionMiddleware,\n securityHeaders,\n // Permissions\n PermissionManager,\n requirePermission,\n requireAnyPermission,\n logActivity,\n // Plugin middleware\n requireActivePlugin,\n requireActivePlugins,\n getActivePlugins,\n isPluginActive,\n // Bootstrap\n bootstrapMiddleware,\n} from './middleware'\n\nexport type { Permission, UserPermissions } from './middleware'\n\n// Plugins - Week 2 (COMPLETED)\nexport {\n // Hook System - Class implementations\n HookSystemImpl,\n ScopedHookSystem as ScopedHookSystemClass,\n HookUtils,\n // Plugin Registry\n PluginRegistryImpl,\n // Plugin Manager - Class implementation\n PluginManager as PluginManagerClass,\n // Plugin Validator - Class implementation\n PluginValidator as PluginValidatorClass,\n} from './plugins'\n\n// Routes - Week 3 (COMPLETED)\nexport {\n ROUTES_INFO,\n apiRoutes,\n apiContentCrudRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminLogsRoutes,\n adminPluginRoutes,\n adminDesignRoutes,\n adminCheckboxRoutes,\n adminTestimonialsRoutes,\n adminCodeExamplesRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n} from './routes'\n\n// Templates - Week 3 (COMPLETED)\nexport {\n // Form templates\n renderForm,\n renderFormField,\n // Table templates\n renderTable,\n // Pagination templates\n renderPagination,\n // Alert templates\n renderAlert,\n // Confirmation dialog templates\n renderConfirmationDialog,\n getConfirmationDialogScript,\n // Filter bar templates\n renderFilterBar,\n} from './templates'\n\nexport type {\n FormField,\n FormData,\n TableColumn,\n TableData,\n PaginationData,\n AlertData,\n ConfirmationDialogOptions,\n FilterBarData,\n Filter,\n FilterOption,\n} from './templates'\n\n// Types - Week 1 (COMPLETED)\nexport type {\n // Collection types\n FieldType,\n FieldConfig,\n CollectionSchema,\n CollectionConfig,\n CollectionConfigModule,\n CollectionSyncResult,\n // Plugin types\n Plugin,\n PluginContext,\n PluginConfig,\n PluginRoutes,\n PluginMiddleware,\n PluginModel,\n PluginService,\n PluginAdminPage,\n PluginComponent,\n PluginMenuItem,\n PluginHook,\n HookHandler,\n HookContext,\n HookSystem,\n ScopedHookSystem,\n PluginRegistry,\n PluginManager,\n PluginStatus,\n AuthService,\n ContentService,\n MediaService,\n PluginLogger,\n PluginBuilderOptions,\n PluginValidator,\n PluginValidationResult,\n HookName,\n // Plugin manifest\n PluginManifest,\n} from './types'\n\nexport { HOOKS } from './types'\n\n// Utils - Week 1 (COMPLETED)\nexport {\n // Sanitization\n escapeHtml,\n sanitizeInput,\n sanitizeObject,\n // Template rendering\n TemplateRenderer,\n templateRenderer,\n renderTemplate,\n // Query filtering\n QueryFilterBuilder,\n buildQuery,\n // Metrics\n metricsTracker,\n // Version\n SONICJS_VERSION,\n getCoreVersion,\n} from './utils'\n\nexport type {\n FilterOperator,\n FilterCondition,\n FilterGroup,\n QueryFilter,\n QueryResult,\n} from './utils'\n\n// Database - Week 1 (COMPLETED)\nexport {\n createDb,\n // Schema exports\n users,\n collections,\n content,\n contentVersions,\n media,\n apiTokens,\n workflowHistory,\n plugins,\n pluginHooks,\n pluginRoutes,\n pluginAssets,\n pluginActivityLog,\n systemLogs,\n logConfig,\n // Zod validation schemas\n insertUserSchema,\n selectUserSchema,\n insertCollectionSchema,\n selectCollectionSchema,\n insertContentSchema,\n selectContentSchema,\n insertMediaSchema,\n selectMediaSchema,\n insertWorkflowHistorySchema,\n selectWorkflowHistorySchema,\n insertPluginSchema,\n selectPluginSchema,\n insertPluginHookSchema,\n selectPluginHookSchema,\n insertPluginRouteSchema,\n selectPluginRouteSchema,\n insertPluginAssetSchema,\n selectPluginAssetSchema,\n insertPluginActivityLogSchema,\n selectPluginActivityLogSchema,\n insertSystemLogSchema,\n selectSystemLogSchema,\n insertLogConfigSchema,\n selectLogConfigSchema,\n} from './db'\n\nexport type {\n User,\n NewUser,\n Collection,\n NewCollection,\n Content,\n NewContent,\n Media,\n NewMedia,\n WorkflowHistory,\n NewWorkflowHistory,\n Plugin as DbPlugin,\n NewPlugin,\n PluginHook as DbPluginHook,\n NewPluginHook,\n PluginRoute,\n NewPluginRoute,\n PluginAsset,\n NewPluginAsset,\n PluginActivityLog,\n NewPluginActivityLog,\n SystemLog,\n NewSystemLog,\n LogConfig,\n NewLogConfig,\n} from './db'\n\n// Plugin SDK (Beta)\nexport { PluginBuilder, PluginHelpers } from './plugins/sdk'\n\n// OAuth Providers Plugin\nexport { oauthProvidersPlugin, createOAuthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nexport { OAuthService, BUILT_IN_PROVIDERS } from './plugins/core-plugins/oauth-providers/oauth-service'\n\n// User Profiles Plugin\nexport { userProfilesPlugin, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig } from './plugins/core-plugins/user-profiles'\nexport type { ProfileFieldDefinition, UserProfileConfig } from './plugins/core-plugins/user-profiles'\n\n// ============================================================================\n// Version\n// ============================================================================\n\n// Import version from package.json\nimport packageJson from '../package.json'\nexport const VERSION = packageJson.version\n\n// ============================================================================\n// Phase 2 Migration Notes\n// ============================================================================\n\n/**\n * This is a work-in-progress package being extracted from the main SonicJS codebase.\n *\n * Current Phase: 2 (Core Module Migration)\n * Current Week: 1 (Types, Utils, Database)\n *\n * Expected completion: 4 weeks from 2025-01-17\n *\n * DO NOT USE IN PRODUCTION - Alpha release for development only\n */\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/core-plugins/database-tools-plugin/services/database-service.ts","../src/templates/pages/admin-database-table.template.ts","../src/plugins/core-plugins/database-tools-plugin/admin-routes.ts","../src/plugins/core-plugins/seed-data-plugin/services/seed-data-service.ts","../src/plugins/core-plugins/seed-data-plugin/admin-routes.ts","../src/plugins/core-plugins/email-plugin/index.ts","../src/plugins/core-plugins/otp-login-plugin/otp-service.ts","../src/plugins/core-plugins/otp-login-plugin/email-templates.ts","../src/plugins/core-plugins/otp-login-plugin/index.ts","../src/plugins/core-plugins/oauth-providers/oauth-service.ts","../src/plugins/core-plugins/oauth-providers/index.ts","../src/plugins/core-plugins/ai-search-plugin/services/embedding.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/chunking.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/custom-rag.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/ai-search.ts","../src/plugins/core-plugins/ai-search-plugin/services/indexer.ts","../src/plugins/core-plugins/ai-search-plugin/components/settings-page.ts","../src/plugins/core-plugins/ai-search-plugin/routes/admin.ts","../src/plugins/core-plugins/ai-search-plugin/routes/api.ts","../src/plugins/core-plugins/ai-search-plugin/manifest.json","../src/plugins/core-plugins/ai-search-plugin/index.ts","../src/plugins/available/magic-link-auth/index.ts","../src/plugins/core-plugins/security-audit-plugin/types.ts","../src/plugins/core-plugins/security-audit-plugin/services/security-audit-service.ts","../src/plugins/core-plugins/security-audit-plugin/components/dashboard-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/event-log-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/settings-page.ts","../src/plugins/core-plugins/security-audit-plugin/routes/admin.ts","../src/plugins/core-plugins/security-audit-plugin/services/brute-force-detector.ts","../src/plugins/core-plugins/security-audit-plugin/routes/api.ts","../src/plugins/core-plugins/security-audit-plugin/middleware/audit-middleware.ts","../src/plugins/core-plugins/security-audit-plugin/index.ts","../src/plugins/core-plugins/stripe-plugin/services/subscription-service.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-event-service.ts","../src/plugins/core-plugins/stripe-plugin/components/subscriptions-page.ts","../src/plugins/core-plugins/stripe-plugin/components/tab-bar.ts","../src/plugins/core-plugins/stripe-plugin/components/events-page.ts","../src/plugins/core-plugins/stripe-plugin/types.ts","../src/plugins/core-plugins/stripe-plugin/routes/admin.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-api.ts","../src/plugins/core-plugins/stripe-plugin/routes/api.ts","../src/plugins/core-plugins/stripe-plugin/index.ts","../src/middleware/plugin-menu.ts","../src/plugins/types.ts","../src/plugins/core-plugins/analytics/routes/admin.ts","../src/plugins/core-plugins/analytics/index.ts","../src/plugins/core-plugins/analytics/services/event-tracking-service.ts","../src/plugins/core-plugins/analytics/routes/api.ts","../src/plugins/cache/services/cache-config.ts","../src/plugins/cache/services/cache.ts","../src/plugins/cache/services/event-bus.ts","../src/plugins/cache/services/cache-invalidation.ts","../src/plugins/cache/services/cache-warming.ts","../src/templates/pages/admin-cache.template.ts","../src/plugins/cache/routes.ts","../src/plugins/cache/index.ts","../src/assets/favicon.ts","../src/app.ts","../src/db/index.ts","../src/index.ts"],"names":["init_admin_layout_catalyst_template","escapeHtml","renderAdminLayoutCatalyst","router","Hono","requireAuth","PluginBuilder","plugin","z","SettingsService","emailPlugin","getJwtExpirySecondsFromDb","AuthManager","setCookie","getCustomData","getCookie","tokenTtl","jwt","content","collections","statusBadge","renderAdminLayout","api_default","DEFAULT_SETTINGS","formatTimestamp","severityBadge","eventTypeBadge","adminRoutes","PluginService","apiRoutes","getSettings","isPluginActive","logPromise","renderPagination","PLUGIN_REGISTRY","HOOKS","PluginHelpers","media","renderConfirmationDialog","getConfirmationDialogScript","totalRequests","app","getCoreVersion","metricsMiddleware","bootstrapMiddleware","securityHeadersMiddleware","csrfProtection","requireRole","api_media_default","api_system_default","admin_api_default","adminCollectionsRoutes","adminFormsRoutes","adminSettingsRoutes","public_forms_default","admin_content_default","adminMediaRoutes","userProfilesPlugin","adminPluginRoutes","adminLogsRoutes","userRoutes","auth_default","test_cleanup_default","setAppInstance","d1","drizzle","schema_exports","package_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import { D1Database } from '@cloudflare/workers-types'\n\nexport interface TruncateResult {\n success: boolean\n message: string\n tablesCleared: string[]\n adminUserPreserved: boolean\n errors?: string[]\n}\n\nexport interface DatabaseStats {\n tables: Array<{\n name: string\n rowCount: number\n }>\n totalRows: number\n}\n\nexport interface TableData {\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n}\n\nexport class DatabaseToolsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get database statistics\n */\n async getDatabaseStats(): Promise {\n const tables = await this.getTables()\n const stats: DatabaseStats = {\n tables: [],\n totalRows: 0\n }\n\n for (const tableName of tables) {\n try {\n const result = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const rowCount = (result?.count as number) || 0\n \n stats.tables.push({\n name: tableName,\n rowCount\n })\n stats.totalRows += rowCount\n } catch (error) {\n // Skip tables that can't be counted (might be views or system tables)\n console.warn(`Could not count rows in table ${tableName}:`, error)\n }\n }\n\n return stats\n }\n\n /**\n * Get all tables in the database\n */\n private async getTables(): Promise {\n const result = await this.db.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='table' \n AND name NOT LIKE 'sqlite_%'\n ORDER BY name\n `).all()\n\n return result.results?.map((row: any) => row.name) || []\n }\n\n /**\n * Truncate all data except admin user\n */\n async truncateAllData(adminEmail: string): Promise {\n const errors: string[] = []\n const tablesCleared: string[] = []\n let adminUserPreserved = false\n\n try {\n // First, preserve the admin user data\n const adminUser = await this.db.prepare(\n 'SELECT * FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n if (!adminUser) {\n return {\n success: false,\n message: 'Admin user not found. Operation cancelled for safety.',\n tablesCleared: [],\n adminUserPreserved: false,\n errors: ['Admin user not found']\n }\n }\n\n // Define tables to truncate (excluding system tables)\n const tablesToTruncate = [\n 'content',\n 'content_versions', \n 'content_workflow_status',\n 'collections',\n 'media',\n 'sessions',\n 'notifications',\n 'api_tokens',\n 'workflow_history',\n 'scheduled_content',\n 'faqs',\n 'faq_categories',\n 'plugins',\n 'plugin_settings',\n 'email_templates',\n 'email_themes'\n ]\n\n // Check which tables exist\n const existingTables = await this.getTables()\n const tablesToClear = tablesToTruncate.filter(table => \n existingTables.includes(table)\n )\n\n // Clear all data except users table\n for (const tableName of tablesToClear) {\n try {\n await this.db.prepare(`DELETE FROM ${tableName}`).run()\n tablesCleared.push(tableName)\n } catch (error) {\n errors.push(`Failed to clear table ${tableName}: ${error}`)\n console.error(`Error clearing table ${tableName}:`, error)\n }\n }\n\n // Clear users table but preserve admin\n try {\n await this.db.prepare('DELETE FROM users WHERE email != ? OR role != ?')\n .bind(adminEmail, 'admin').run()\n \n // Verify admin user still exists\n const verifyAdmin = await this.db.prepare(\n 'SELECT id FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n adminUserPreserved = !!verifyAdmin\n tablesCleared.push('users (non-admin)')\n } catch (error) {\n errors.push(`Failed to clear non-admin users: ${error}`)\n console.error('Error clearing non-admin users:', error)\n }\n\n // Reset auto-increment counters if supported\n try {\n await this.db.prepare('DELETE FROM sqlite_sequence').run()\n } catch (error) {\n // sqlite_sequence might not exist, ignore\n }\n\n const message = errors.length > 0 \n ? `Truncation completed with ${errors.length} errors. ${tablesCleared.length} tables cleared.`\n : `Successfully truncated database. ${tablesCleared.length} tables cleared.`\n\n return {\n success: errors.length === 0,\n message,\n tablesCleared,\n adminUserPreserved,\n errors: errors.length > 0 ? errors : undefined\n }\n\n } catch (error) {\n return {\n success: false,\n message: `Database truncation failed: ${error}`,\n tablesCleared,\n adminUserPreserved,\n errors: [String(error)]\n }\n }\n }\n\n /**\n * Create a backup of current data (simplified version)\n */\n async createBackup(): Promise<{ success: boolean; message: string; backupId?: string }> {\n try {\n const backupId = `backup_${Date.now()}`\n const stats = await this.getDatabaseStats()\n \n // In a real implementation, this would export data to a file or cloud storage\n // For now, we'll just log the stats and return success\n console.log(`Backup ${backupId} created with ${stats.totalRows} total rows`)\n \n return {\n success: true,\n message: `Backup created successfully (${stats.totalRows} rows)`,\n backupId\n }\n } catch (error) {\n return {\n success: false,\n message: `Backup failed: ${error}`\n }\n }\n }\n\n /**\n * Get table data with optional pagination and sorting\n */\n async getTableData(\n tableName: string,\n limit: number = 100,\n offset: number = 0,\n sortColumn?: string,\n sortDirection: 'asc' | 'desc' = 'asc'\n ): Promise {\n try {\n // Validate table name to prevent SQL injection\n const tables = await this.getTables()\n if (!tables.includes(tableName)) {\n throw new Error(`Table ${tableName} not found`)\n }\n\n // Get column names\n const pragmaResult = await this.db.prepare(`PRAGMA table_info(${tableName})`).all()\n const columns = pragmaResult.results?.map((col: any) => col.name) || []\n\n // Validate sort column if provided\n if (sortColumn && !columns.includes(sortColumn)) {\n sortColumn = undefined\n }\n\n // Get total row count\n const countResult = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const totalRows = (countResult?.count as number) || 0\n\n // Build query with optional sorting\n let query = `SELECT * FROM ${tableName}`\n if (sortColumn) {\n query += ` ORDER BY ${sortColumn} ${sortDirection.toUpperCase()}`\n }\n query += ` LIMIT ${limit} OFFSET ${offset}`\n\n // Get paginated data\n const dataResult = await this.db.prepare(query).all()\n\n return {\n tableName,\n columns,\n rows: dataResult.results || [],\n totalRows\n }\n } catch (error) {\n throw new Error(`Failed to fetch table data: ${error}`)\n }\n }\n\n /**\n * Validate database integrity\n */\n async validateDatabase(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n try {\n // Check critical tables exist\n const requiredTables = ['users', 'content', 'collections']\n const existingTables = await this.getTables()\n\n for (const table of requiredTables) {\n if (!existingTables.includes(table)) {\n issues.push(`Critical table missing: ${table}`)\n }\n }\n\n // Check admin user exists\n const adminCount = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM users WHERE role = ?'\n ).bind('admin').first()\n\n if ((adminCount?.count as number) === 0) {\n issues.push('No admin users found')\n }\n\n // Run SQLite integrity check\n try {\n const integrityResult = await this.db.prepare('PRAGMA integrity_check').first()\n if (integrityResult && (integrityResult as any).integrity_check !== 'ok') {\n issues.push(`Database integrity check failed: ${(integrityResult as any).integrity_check}`)\n }\n } catch (error) {\n issues.push(`Could not run integrity check: ${error}`)\n }\n\n } catch (error) {\n issues.push(`Validation error: ${error}`)\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface DatabaseTablePageData {\n user?: {\n name: string\n email: string\n role: string\n }\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n currentPage: number\n pageSize: number\n sortColumn?: string\n sortDirection?: 'asc' | 'desc'\n}\n\nexport function renderDatabaseTablePage(data: DatabaseTablePageData): string {\n const totalPages = Math.ceil(data.totalRows / data.pageSize)\n const startRow = (data.currentPage - 1) * data.pageSize + 1\n const endRow = Math.min(data.currentPage * data.pageSize, data.totalRows)\n\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n Back to Database Tools\n \n
\n

Table: ${data.tableName}

\n

\n Showing ${startRow.toLocaleString()} - ${endRow.toLocaleString()} of ${data.totalRows.toLocaleString()} rows\n

\n
\n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Refresh\n \n
\n
\n\n \n
\n \n
\n \n \n \n ${data.columns.map(col => `\n \n
\n ${col}\n ${data.sortColumn === col ? `\n \n \n \n ` : `\n \n \n \n `}\n
\n \n `).join('')}\n
\n \n \n ${data.rows.length > 0\n ? data.rows.map((row, idx) => `\n \n ${data.columns.map(col => `\n \n `).join('')}\n \n `).join('')\n : `\n \n \n \n `\n }\n \n
\n ${formatCellValue(row[col])}\n
\n \n \n \n

No data in this table

\n
\n
\n\n \n ${totalPages > 1 ? `\n
\n
\n \n Previous\n \n \n Next\n \n
\n
\n
\n

\n Page ${data.currentPage} of ${totalPages}\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Table: ${data.tableName}`,\n pageTitle: `Database: ${data.tableName}`,\n currentPath: `/admin/database-tools/tables/${data.tableName}`,\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction generatePageNumbers(currentPage: number, totalPages: number): string {\n const pages: number[] = []\n const maxVisible = 7\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (currentPage <= 4) {\n for (let i = 1; i <= 5; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n } else if (currentPage >= totalPages - 3) {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = totalPages - 4; i <= totalPages; i++) pages.push(i)\n } else {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n }\n }\n\n return pages.map(page => {\n if (page === -1) {\n return `\n \n ...\n \n `\n }\n\n const isActive = page === currentPage\n return `\n \n ${page}\n \n `\n }).join('')\n}\n\nfunction escapeHtml(text: string): string {\n const map: Record = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }\n return String(text).replace(/[&<>\"']/g, m => map[m] || m)\n}\n\nfunction formatCellValue(value: any): string {\n if (value === null || value === undefined) {\n return 'null'\n }\n if (typeof value === 'boolean') {\n return `${value}`\n }\n if (typeof value === 'object') {\n return '' + JSON.stringify(value).substring(0, 50) + (JSON.stringify(value).length > 50 ? '...' : '') + ''\n }\n const str = String(value)\n if (str.length > 100) {\n return escapeHtml(str.substring(0, 100)) + '...'\n }\n return escapeHtml(str)\n}\n","import { Hono } from 'hono'\nimport { DatabaseToolsService } from './services/database-service'\nimport { renderDatabaseTablePage, DatabaseTablePageData } from '../../../templates/pages/admin-database-table.template'\nimport { requireAuth } from '../../../middleware'\n\ntype Bindings = {\n DB: D1Database\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport function createDatabaseToolsAdminRoutes() {\n const router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Apply authentication middleware\n router.use('*', requireAuth())\n\n // Get database statistics\n router.get('/api/stats', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const stats = await service.getDatabaseStats()\n\n return c.json({\n success: true,\n data: stats\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({ \n success: false, \n error: 'Failed to fetch database statistics' \n }, 500)\n }\n })\n\n // Truncate all data except admin user\n router.post('/api/truncate', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const body = await c.req.json()\n const { confirmText } = body\n\n // Require confirmation text for safety\n if (confirmText !== 'TRUNCATE ALL DATA') {\n return c.json({\n success: false,\n error: 'Invalid confirmation text. Operation cancelled.'\n }, 400)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.truncateAllData(user.email)\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n tablesCleared: result.tablesCleared,\n adminUserPreserved: result.adminUserPreserved,\n errors: result.errors\n }\n })\n } catch (error) {\n console.error('Error truncating database:', error)\n return c.json({ \n success: false, \n error: 'Failed to truncate database' \n }, 500)\n }\n })\n\n // Create backup\n router.post('/api/backup', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.createBackup()\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n backupId: result.backupId\n }\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({ \n success: false, \n error: 'Failed to create backup' \n }, 500)\n }\n })\n\n // Validate database\n router.get('/api/validate', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const validation = await service.validateDatabase()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n })\n\n // Get table data (API endpoint)\n router.get('/api/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const tableName = c.req.param('tableName')\n const limit = parseInt(c.req.query('limit') || '100')\n const offset = parseInt(c.req.query('offset') || '0')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, limit, offset, sortColumn, sortDirection)\n\n return c.json({\n success: true,\n data: tableData\n })\n } catch (error) {\n console.error('Error fetching table data:', error)\n return c.json({\n success: false,\n error: `Failed to fetch table data: ${error}`\n }, 500)\n }\n })\n\n // View table data page\n router.get('/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.redirect('/admin/login')\n }\n\n const tableName = c.req.param('tableName')\n const page = parseInt(c.req.query('page') || '1')\n const pageSize = parseInt(c.req.query('pageSize') || '20')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const offset = (page - 1) * pageSize\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, pageSize, offset, sortColumn, sortDirection)\n\n const pageData: DatabaseTablePageData = {\n user: {\n name: user.email.split('@')[0] || 'Unknown',\n email: user.email,\n role: user.role\n },\n tableName: tableData.tableName,\n columns: tableData.columns,\n rows: tableData.rows,\n totalRows: tableData.totalRows,\n currentPage: page,\n pageSize: pageSize,\n sortColumn: sortColumn,\n sortDirection: sortDirection\n }\n\n return c.html(renderDatabaseTablePage(pageData))\n } catch (error) {\n console.error('Error rendering table page:', error)\n return c.text(`Error: ${error}`, 500)\n }\n })\n\n return router\n}","import type { D1Database } from '@cloudflare/workers-types'\n\nexport class SeedDataService {\n constructor(private db: D1Database) {}\n\n // First names for generating realistic users\n private firstNames = [\n 'Emma', 'Liam', 'Olivia', 'Noah', 'Ava', 'Ethan', 'Sophia', 'Mason',\n 'Isabella', 'William', 'Mia', 'James', 'Charlotte', 'Benjamin', 'Amelia',\n 'Lucas', 'Harper', 'Henry', 'Evelyn', 'Alexander'\n ]\n\n // Last names for generating realistic users\n private lastNames = [\n 'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis',\n 'Rodriguez', 'Martinez', 'Hernandez', 'Lopez', 'Gonzalez', 'Wilson', 'Anderson',\n 'Thomas', 'Taylor', 'Moore', 'Jackson', 'Martin'\n ]\n\n // Content titles for blog posts\n private blogTitles = [\n 'Getting Started with Modern Web Development',\n 'The Future of JavaScript Frameworks',\n 'Building Scalable Applications with Microservices',\n 'Understanding TypeScript: A Complete Guide',\n 'Best Practices for API Design',\n 'Introduction to Cloud Computing',\n 'Mastering Git and Version Control',\n 'The Art of Code Review',\n 'Performance Optimization Techniques',\n 'Security Best Practices for Web Apps',\n 'Exploring Serverless Architecture',\n 'Database Design Fundamentals',\n 'Testing Strategies for Modern Apps',\n 'CI/CD Pipeline Implementation',\n 'Mobile-First Development Approach'\n ]\n\n // Content titles for pages\n private pageTitles = [\n 'About Us', 'Contact', 'Privacy Policy', 'Terms of Service',\n 'FAQ', 'Our Team', 'Careers', 'Press Kit',\n 'Support', 'Documentation', 'Pricing', 'Features'\n ]\n\n // Content titles for products\n private productTitles = [\n 'Premium Wireless Headphones',\n 'Smart Watch Pro',\n 'Laptop Stand Adjustable',\n 'Mechanical Keyboard RGB',\n 'HD Webcam 4K',\n 'USB-C Hub 7-in-1',\n 'Portable SSD 1TB',\n 'Wireless Mouse Ergonomic',\n 'Monitor 27\" 4K',\n 'Desk Lamp LED',\n 'Phone Case Premium',\n 'Tablet Stand Aluminum',\n 'Cable Management Kit',\n 'Power Bank 20000mAh',\n 'Bluetooth Speaker Portable'\n ]\n\n // Content for generating blog posts\n private blogContent = [\n 'This comprehensive guide covers everything you need to know about modern development practices and tools.',\n 'Learn the fundamentals and advanced concepts that will help you build better applications.',\n 'Discover the latest trends and best practices used by industry professionals.',\n 'A deep dive into the technologies and methodologies shaping the future of software development.',\n 'Practical tips and real-world examples to improve your development workflow.',\n 'Explore cutting-edge techniques and proven strategies for building robust applications.',\n 'Master the essential skills needed to excel in modern software development.',\n 'An in-depth look at the tools and frameworks that power today\\'s web applications.',\n 'Step-by-step instructions and expert insights for developers of all levels.',\n 'Understanding the core principles that drive successful software projects.'\n ]\n\n // Generate a random ID\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n\n // Generate a slug from a title\n private generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n }\n\n // Generate random date within the last year\n private randomDate(): Date {\n const now = new Date()\n const yearAgo = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate())\n const randomTime = yearAgo.getTime() + Math.random() * (now.getTime() - yearAgo.getTime())\n return new Date(randomTime)\n }\n\n // Create 20 example users\n async createUsers(): Promise {\n const roles = ['admin', 'editor', 'author', 'viewer']\n // const hashedPassword = await bcrypt.hash('password123', 10)\n const hashedPassword = 'password123' // TODO: Use actual bcrypt hash\n\n let count = 0\n for (let i = 0; i < 20; i++) {\n const firstName = this.firstNames[Math.floor(Math.random() * this.firstNames.length)] || 'John'\n const lastName = this.lastNames[Math.floor(Math.random() * this.lastNames.length)] || 'Doe'\n const username = `${firstName.toLowerCase()}${lastName.toLowerCase()}${i}`\n const email = `${username}@example.com`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n\n const stmt = this.db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, last_login_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n email,\n username,\n firstName,\n lastName,\n hashedPassword,\n roles[Math.floor(Math.random() * roles.length)],\n Math.random() > 0.1 ? 1 : 0, // 90% active\n Math.random() > 0.3 ? createdAtTimestamp : null,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Create 200 content items across different types\n async createContent(): Promise {\n // Get all users and collections\n const usersStmt = this.db.prepare('SELECT * FROM users')\n const { results: allUsers } = await usersStmt.all()\n\n const collectionsStmt = this.db.prepare('SELECT * FROM collections')\n const { results: allCollections } = await collectionsStmt.all()\n\n if (!allUsers || allUsers.length === 0) {\n throw new Error('No users found. Please create users first.')\n }\n\n if (!allCollections || allCollections.length === 0) {\n throw new Error('No collections found. Please create collections first.')\n }\n\n const statuses = ['draft', 'published', 'archived']\n\n // Create 200 content items\n let count = 0\n for (let i = 0; i < 200; i++) {\n const collection: any = allCollections[Math.floor(Math.random() * allCollections.length)]\n const author: any = allUsers[Math.floor(Math.random() * allUsers.length)]\n const status = statuses[Math.floor(Math.random() * statuses.length)]\n\n let title: string\n let contentData: any\n\n // Generate content based on collection type\n if (collection.name === 'blog_posts' || collection.name.includes('blog')) {\n title = this.blogTitles[Math.floor(Math.random() * this.blogTitles.length)] || 'Untitled Blog Post'\n contentData = {\n body: this.blogContent[Math.floor(Math.random() * this.blogContent.length)] || 'Blog content here',\n excerpt: 'A brief introduction to this article that provides an overview of the main topics covered.',\n tags: this.generateTags(),\n featured: Math.random() > 0.7\n }\n } else if (collection.name === 'pages' || collection.name.includes('page')) {\n title = this.pageTitles[Math.floor(Math.random() * this.pageTitles.length)] || 'Untitled Page'\n contentData = {\n body: 'This is a standard page with important information about our services and policies.',\n template: 'default',\n showInMenu: Math.random() > 0.5\n }\n } else if (collection.name === 'products' || collection.name.includes('product')) {\n title = this.productTitles[Math.floor(Math.random() * this.productTitles.length)] || 'Untitled Product'\n contentData = {\n description: 'High-quality product with excellent features and great value for money.',\n price: (Math.random() * 500 + 10).toFixed(2),\n sku: `SKU-${Math.random().toString(36).substr(2, 9).toUpperCase()}`,\n inStock: Math.random() > 0.2,\n rating: (Math.random() * 2 + 3).toFixed(1) // 3.0 - 5.0\n }\n } else {\n // Generic content\n title = `${collection.display_name || collection.name} Item ${i + 1}`\n contentData = {\n description: 'This is a sample content item with generic data.',\n value: Math.floor(Math.random() * 1000)\n }\n }\n\n const slug = `${this.generateSlug(title)}-${i}`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n const publishedAtTimestamp = status === 'published' ? createdAtTimestamp : null\n\n const stmt = this.db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, published_at, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n collection.id,\n slug,\n `${title} ${i}`,\n JSON.stringify(contentData),\n status,\n publishedAtTimestamp,\n author.id,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Generate random tags for blog posts\n private generateTags(): string[] {\n const allTags = [\n 'tutorial', 'guide', 'javascript', 'typescript', 'web-dev',\n 'backend', 'frontend', 'best-practices', 'security', 'performance',\n 'testing', 'deployment', 'cloud', 'database', 'api'\n ]\n\n const numTags = Math.floor(Math.random() * 4) + 1 // 1-4 tags\n const shuffled = allTags.sort(() => 0.5 - Math.random())\n return shuffled.slice(0, numTags)\n }\n\n // Seed all data\n async seedAll(): Promise<{ users: number; content: number }> {\n const userCount = await this.createUsers()\n const contentCount = await this.createContent()\n\n return {\n users: userCount,\n content: contentCount\n }\n }\n\n // Clear all seed data (optional cleanup method)\n async clearSeedData(): Promise {\n // Delete content first (due to foreign key constraints)\n const deleteContentStmt = this.db.prepare('DELETE FROM content')\n await deleteContentStmt.run()\n\n // Delete users (but keep admin users)\n const deleteUsersStmt = this.db.prepare(\n \"DELETE FROM users WHERE role != 'admin'\"\n )\n await deleteUsersStmt.run()\n }\n}\n","import { Hono } from 'hono'\nimport { SeedDataService } from './services/seed-data-service'\n\ntype Bindings = {\n DB: D1Database\n}\n\nexport function createSeedDataAdminRoutes() {\n const routes = new Hono<{ Bindings: Bindings }>()\n\n // Get seed data status/info\n routes.get('/', async (c) => {\n const html = `\n \n \n \n Seed Data - SonicJS Admin\n \n \n \n \n \n
\n ← Back to Plugin Settings\n

🌱 Seed Data Generator

\n

\n Generate realistic example data for testing and development. This will create 20 users and 200 content items with realistic data.\n

\n\n
\n ⚠️ Warning: This will create new data in your database. Make sure you're not running this in production!\n
\n\n
\n
\n\n
\n

What will be created?

\n
    \n
  • 20 Users: With realistic names, emails, and various roles (admin, editor, author, viewer)
  • \n
  • 200 Content Items: Including blog posts, pages, and products with realistic titles and data
  • \n
  • All passwords: Set to \"password123\" for testing
  • \n
  • Random dates: Created within the last year
  • \n
  • Various statuses: Draft, published, and archived content
  • \n
\n
\n\n
\n

Generate Seed Data

\n

Click the button below to generate example data. This may take a few moments.

\n \n
\n\n
\n

Clear Seed Data

\n

Remove all users and content from the database (except admin users).

\n \n
\n
\n\n \n \n \n `\n return c.html(html)\n })\n\n // Generate seed data\n routes.post('/generate', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n const result = await seedService.seedAll()\n\n return c.json({\n success: true,\n users: result.users,\n content: result.content\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n // Clear seed data\n routes.post('/clear', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n await seedService.clearSeedData()\n\n return c.json({\n success: true\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n return routes\n}\n","/**\n * Email Plugin\n *\n * Send transactional emails using Resend\n * Handles registration, verification, password reset, and one-time codes\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\nexport function createEmailPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'email',\n version: '1.0.0-beta.1',\n description: 'Send transactional emails using Resend'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Create the Email Settings route (POST only - GET is handled by generic plugin settings page)\n const emailRoutes = new Hono()\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // POST endpoint for saving settings\n emailRoutes.post('/settings', async (c: any) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n // Update plugin settings in database\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'email'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving email settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n })\n\n // POST endpoint for test email\n emailRoutes.post('/test', async (c: any) => {\n try {\n const db = c.env.DB\n const body = await c.req.json()\n\n // Load settings from database\n const plugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (!plugin?.settings) {\n return c.json({\n success: false,\n error: 'Email settings not configured. Please save your settings first.'\n }, 400)\n }\n\n const settings = JSON.parse(plugin.settings)\n\n // Validate required settings\n if (!settings.apiKey || !settings.fromEmail || !settings.fromName) {\n return c.json({\n success: false,\n error: 'Missing required settings. Please configure API Key, From Email, and From Name.'\n }, 400)\n }\n\n // Use provided email or fallback to fromEmail\n const toEmail = body.toEmail || settings.fromEmail\n\n // Validate email format\n if (!toEmail.match(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)) {\n return c.json({\n success: false,\n error: 'Invalid email address format'\n }, 400)\n }\n\n // Send test email via Resend API\n const response = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${settings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${settings.fromName} <${settings.fromEmail}>`,\n to: [toEmail],\n subject: 'Test Email from SonicJS',\n html: `\n
\n

Test Email Successful! 🎉

\n

This is a test email from your SonicJS Email plugin.

\n

Configuration:

\n
    \n
  • From: ${settings.fromName} <${settings.fromEmail}>
  • \n
  • Reply-To: ${settings.replyTo || 'Not set'}
  • \n
  • Sent at: ${new Date().toISOString()}
  • \n
\n

Your email settings are working correctly!

\n
\n `,\n reply_to: settings.replyTo || settings.fromEmail\n })\n })\n\n const data = await response.json() as any\n\n if (!response.ok) {\n console.error('Resend API error:', data)\n return c.json({\n success: false,\n error: data.message || 'Failed to send test email. Check your API key and domain verification.'\n }, response.status)\n }\n\n return c.json({\n success: true,\n message: `Test email sent successfully to ${toEmail}`,\n emailId: data.id\n })\n\n } catch (error: any) {\n console.error('Test email error:', error)\n return c.json({\n success: false,\n error: error.message || 'An error occurred while sending test email'\n }, 500)\n }\n })\n\n // Register the route\n builder.addRoute('/admin/plugins/email', emailRoutes, {\n description: 'Email plugin settings',\n requiresAuth: true,\n priority: 80\n })\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('Email', '/admin/plugins/email', {\n icon: 'envelope',\n order: 80,\n permissions: ['email:manage']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Email plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Email plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const emailPlugin = createEmailPlugin()\n","/**\n * OTP Service\n * Handles OTP code generation, verification, and management\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\nexport interface OTPSettings {\n codeLength: number\n codeExpiryMinutes: number\n maxAttempts: number\n rateLimitPerHour: number\n allowNewUserRegistration: boolean\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nexport interface OTPCode {\n id: string\n user_email: string\n code: string\n expires_at: number\n used: number\n used_at: number | null\n ip_address: string | null\n user_agent: string | null\n attempts: number\n created_at: number\n}\n\nexport class OTPService {\n constructor(private db: D1Database) {}\n\n /**\n * Generate a secure random OTP code\n */\n generateCode(length: number = 6): string {\n const digits = '0123456789'\n let code = ''\n\n for (let i = 0; i < length; i++) {\n const randomValues = new Uint8Array(1)\n crypto.getRandomValues(randomValues)\n const randomValue = randomValues[0] ?? 0\n code += digits[randomValue % digits.length]\n }\n\n return code\n }\n\n /**\n * Create and store a new OTP code\n */\n async createOTPCode(\n email: string,\n settings: OTPSettings,\n ipAddress?: string,\n userAgent?: string\n ): Promise {\n const code = this.generateCode(settings.codeLength)\n const id = crypto.randomUUID()\n const now = Date.now()\n const expiresAt = now + (settings.codeExpiryMinutes * 60 * 1000)\n\n const otpCode: OTPCode = {\n id,\n user_email: email.toLowerCase(),\n code,\n expires_at: expiresAt,\n used: 0,\n used_at: null,\n ip_address: ipAddress || null,\n user_agent: userAgent || null,\n attempts: 0,\n created_at: now\n }\n\n await this.db.prepare(`\n INSERT INTO otp_codes (\n id, user_email, code, expires_at, used, used_at,\n ip_address, user_agent, attempts, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n otpCode.id,\n otpCode.user_email,\n otpCode.code,\n otpCode.expires_at,\n otpCode.used,\n otpCode.used_at,\n otpCode.ip_address,\n otpCode.user_agent,\n otpCode.attempts,\n otpCode.created_at\n ).run()\n\n return otpCode\n }\n\n /**\n * Verify an OTP code\n */\n async verifyCode(\n email: string,\n code: string,\n settings: OTPSettings\n ): Promise<{ valid: boolean; attemptsRemaining?: number; error?: string }> {\n const normalizedEmail = email.toLowerCase()\n const now = Date.now()\n\n // Find the most recent unused code for this email\n const otpCode = await this.db.prepare(`\n SELECT * FROM otp_codes\n WHERE user_email = ? AND code = ? AND used = 0\n ORDER BY created_at DESC\n LIMIT 1\n `).bind(normalizedEmail, code).first() as OTPCode | null\n\n if (!otpCode) {\n return { valid: false, error: 'Invalid or expired code' }\n }\n\n // Check if expired\n if (now > otpCode.expires_at) {\n return { valid: false, error: 'Code has expired' }\n }\n\n // Check attempts\n if (otpCode.attempts >= settings.maxAttempts) {\n return { valid: false, error: 'Maximum attempts exceeded' }\n }\n\n // Code is valid - mark as used\n await this.db.prepare(`\n UPDATE otp_codes\n SET used = 1, used_at = ?, attempts = attempts + 1\n WHERE id = ?\n `).bind(now, otpCode.id).run()\n\n return { valid: true }\n }\n\n /**\n * Increment failed attempt count\n */\n async incrementAttempts(email: string, code: string): Promise {\n const normalizedEmail = email.toLowerCase()\n\n const result = await this.db.prepare(`\n UPDATE otp_codes\n SET attempts = attempts + 1\n WHERE user_email = ? AND code = ? AND used = 0\n RETURNING attempts\n `).bind(normalizedEmail, code).first() as { attempts: number } | null\n\n return result?.attempts || 0\n }\n\n /**\n * Check rate limiting\n */\n async checkRateLimit(email: string, settings: OTPSettings): Promise {\n const normalizedEmail = email.toLowerCase()\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n\n const result = await this.db.prepare(`\n SELECT COUNT(*) as count\n FROM otp_codes\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as { count: number } | null\n\n const count = result?.count || 0\n return count < settings.rateLimitPerHour\n }\n\n /**\n * Get recent OTP requests for activity log\n */\n async getRecentRequests(limit: number = 50): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM otp_codes\n ORDER BY created_at DESC\n LIMIT ?\n `).bind(limit).all()\n\n const rows = (result.results || []) as Record[]\n return rows.map(row => this.mapRowToOTP(row))\n }\n\n /**\n * Clean up expired codes (for maintenance)\n */\n async cleanupExpiredCodes(): Promise {\n const now = Date.now()\n\n const result = await this.db.prepare(`\n DELETE FROM otp_codes\n WHERE expires_at < ? OR (used = 1 AND used_at < ?)\n `).bind(now, now - (30 * 24 * 60 * 60 * 1000)).run() // Keep used codes for 30 days\n\n return result.meta.changes || 0\n }\n\n private mapRowToOTP(row: Record): OTPCode {\n return {\n id: String(row.id),\n user_email: String(row.user_email),\n code: String(row.code),\n expires_at: Number(row.expires_at ?? Date.now()),\n used: Number(row.used ?? 0),\n used_at: row.used_at === null || row.used_at === undefined ? null : Number(row.used_at),\n ip_address: typeof row.ip_address === 'string' ? row.ip_address : null,\n user_agent: typeof row.user_agent === 'string' ? row.user_agent : null,\n attempts: Number(row.attempts ?? 0),\n created_at: Number(row.created_at ?? Date.now())\n }\n }\n\n /**\n * Get OTP statistics\n */\n async getStats(days: number = 7): Promise<{\n total: number\n successful: number\n failed: number\n expired: number\n }> {\n const since = Date.now() - (days * 24 * 60 * 60 * 1000)\n\n const stats = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as successful,\n SUM(CASE WHEN attempts >= 3 AND used = 0 THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN expires_at < ? AND used = 0 THEN 1 ELSE 0 END) as expired\n FROM otp_codes\n WHERE created_at > ?\n `).bind(Date.now(), since).first() as any\n\n return {\n total: stats?.total || 0,\n successful: stats?.successful || 0,\n failed: stats?.failed || 0,\n expired: stats?.expired || 0\n }\n }\n}\n","/**\n * OTP Email Templates\n * HTML and plain text templates for OTP codes\n */\n\nexport interface OTPEmailData {\n code: string\n expiryMinutes: number\n codeLength: number\n maxAttempts: number\n email: string\n ipAddress?: string\n timestamp: string\n appName: string\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nfunction sanitizeColor(value?: string): string {\n if (!value) return ''\n // Allow #rgb, #rrggbb, #rrggbbaa, named colors, rgb()/rgba()/hsl()/hsla()\n if (/^#[0-9a-fA-F]{3,8}$/.test(value)) return value\n if (/^[a-zA-Z]+$/.test(value)) return value\n if (/^(rgb|rgba|hsl|hsla)\\([0-9.,\\s%]+\\)$/.test(value)) return value\n return ''\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport function renderOTPEmailHTML(data: OTPEmailData): string {\n const logoUrl = data.logoUrl ? escapeHtml(data.logoUrl) : ''\n const loginUrl = data.loginUrl ? escapeHtml(data.loginUrl) : ''\n const appName = escapeHtml(data.appName)\n const loginButtonText = escapeHtml(\n (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n )\n const logoWidth = Math.max(20, Math.min(600, Number(data.logoWidth) || 150))\n const logoBorderWidth = Math.max(0, Math.min(20, Number(data.logoBorderWidth) || 0))\n const logoBorderColor = sanitizeColor(data.logoBorderColor)\n const logoBorderStyle = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${logoBorderColor}; border-radius: 8px;`\n : ''\n\n return `\n\n\n \n \n Your Login Code\n\n\n\n
\n\n ${logoUrl ? `\n
\n \"${appName}\"\n
\n ` : ''}\n\n
\n

Your Login Code

\n

Enter this code to sign in to ${appName}

\n
\n\n
\n
\n
\n ${data.code}\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${data.expiryMinutes} minutes\n

\n
\n\n
\n

Quick Tips:

\n
    \n
  • Enter the code exactly as shown (${data.codeLength} digits)
  • \n
  • The code can only be used once
  • \n
  • You have ${data.maxAttempts} attempts to enter the correct code
  • \n
  • Request a new code if this one expires
  • \n
\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${appName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n\n
\n

\n Didn't request this code?
\n Someone may have entered your email by mistake. You can safely ignore this email.\n

\n\n
\n

This email was sent to ${escapeHtml(data.email)}

\n ${data.ipAddress ? `

IP Address: ${escapeHtml(data.ipAddress)}

` : ''}\n

Time: ${escapeHtml(data.timestamp)}

\n
\n
\n\n
\n\n
\n

© ${new Date().getFullYear()} ${appName}. All rights reserved.

\n
\n\n\n`\n}\n\nexport function renderOTPEmailText(data: OTPEmailData): string {\n const ctaLabel = (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n return `Your Login Code for ${data.appName}\n\nYour one-time verification code is:\n\n${data.code}\n\nThis code expires in ${data.expiryMinutes} minutes.\n${data.loginUrl ? `\\n${ctaLabel}: ${data.loginUrl}\\n` : ''}\n\nQuick Tips:\n• Enter the code exactly as shown (${data.codeLength} digits)\n• The code can only be used once\n• You have ${data.maxAttempts} attempts to enter the correct code\n• Request a new code if this one expires\n\nSecurity Notice:\nNever share this code with anyone. ${data.appName} will never ask you for this code via phone, email, or social media.\n\nDidn't request this code?\nSomeone may have entered your email by mistake. You can safely ignore this email.\n\n---\nThis email was sent to ${data.email}\n${data.ipAddress ? `IP Address: ${data.ipAddress}` : ''}\nTime: ${data.timestamp}\n\n© ${new Date().getFullYear()} ${data.appName}. All rights reserved.`\n}\n\nexport function renderOTPEmail(data: OTPEmailData): { html: string; text: string } {\n return {\n html: renderOTPEmailHTML(data),\n text: renderOTPEmailText(data)\n }\n}\n","/**\n * OTP Login Plugin\n *\n * Passwordless authentication via email one-time codes\n * Users receive a secure 6-digit code to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { setCookie } from 'hono/cookie'\nimport { z } from 'zod'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\nimport { OTPService, type OTPSettings } from './otp-service'\nimport { renderOTPEmail } from './email-templates'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\nimport { SettingsService } from '../../../services/settings'\nimport { getCustomData } from '../user-profiles'\n\n// Validation schemas\nconst otpRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nconst otpVerifySchema = z.object({\n email: z.string().email('Valid email is required'),\n code: z.string().min(4).max(8)\n})\n\n// Default settings (site name comes from general settings)\nconst DEFAULT_SETTINGS: OTPSettings = {\n codeLength: 6,\n codeExpiryMinutes: 10,\n maxAttempts: 3,\n rateLimitPerHour: 5,\n allowNewUserRegistration: false,\n logoUrl: '',\n logoWidth: 150,\n logoBorderWidth: 0,\n logoBorderColor: '#ffffff',\n loginUrl: '',\n loginButtonText: ''\n}\n\nexport function createOTPLoginPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'otp-login',\n version: '1.0.0-beta.1',\n description: 'Passwordless authentication via email one-time codes'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== API Routes ====================\n\n const otpAPI = new Hono()\n\n // POST /auth/otp/request - Request OTP code\n otpAPI.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings: OTPSettings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Get site name from general settings\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName\n\n // Check rate limiting\n const canRequest = await otpService.checkRateLimit(normalizedEmail, settings)\n if (!canRequest) {\n return c.json({\n error: 'Too many requests. Please try again in an hour.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && !settings.allowNewUserRegistration) {\n // Don't reveal if user exists or not (security)\n return c.json({\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Get IP and user agent\n const ipAddress = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n\n // Create OTP code\n const otpCode = await otpService.createOTPCode(\n normalizedEmail,\n settings,\n ipAddress,\n userAgent\n )\n\n // Send email via Email plugin\n try {\n const isDevMode = c.env.ENVIRONMENT === 'development'\n\n if (isDevMode) {\n console.log(`[DEV] OTP Code for ${normalizedEmail}: ${otpCode.code}`)\n }\n\n // Prepare email content\n const emailContent = renderOTPEmail({\n code: otpCode.code,\n expiryMinutes: settings.codeExpiryMinutes,\n codeLength: settings.codeLength,\n maxAttempts: settings.maxAttempts,\n email: normalizedEmail,\n ipAddress,\n timestamp: new Date().toISOString(),\n appName: siteName,\n logoUrl: settings.logoUrl || '',\n logoWidth: settings.logoWidth,\n logoBorderWidth: settings.logoBorderWidth,\n logoBorderColor: settings.logoBorderColor || '',\n loginUrl: settings.loginUrl || '',\n loginButtonText: settings.loginButtonText || ''\n })\n\n // Load email plugin settings from database\n // Note: We don't check status='active' because the email plugin's\n // settings UI works regardless of status, so we follow the same pattern\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (emailPlugin?.settings) {\n const emailSettings = JSON.parse(emailPlugin.settings)\n\n if (emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName) {\n // Send email via Resend API\n const emailResponse = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${emailSettings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${emailSettings.fromName} <${emailSettings.fromEmail}>`,\n to: [normalizedEmail],\n subject: `Your login code for ${siteName}`,\n html: emailContent.html,\n text: emailContent.text,\n reply_to: emailSettings.replyTo || emailSettings.fromEmail\n })\n })\n\n if (!emailResponse.ok) {\n const errorData = await emailResponse.json() as { message?: string }\n console.error('Failed to send OTP email via Resend:', errorData)\n // Don't expose error to user for security - just log it\n }\n } else {\n console.warn('Email plugin is not fully configured (missing apiKey, fromEmail, or fromName)')\n }\n } else {\n console.warn('Email plugin is not active or has no settings configured')\n }\n\n const response: any = {\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n }\n\n // In development, include the code\n if (isDevMode) {\n response.dev_code = otpCode.code\n }\n\n return c.json(response)\n } catch (emailError) {\n console.error('Error sending OTP email:', emailError)\n return c.json({\n error: 'Failed to send verification code. Please try again.'\n }, 500)\n }\n } catch (error) {\n console.error('OTP request error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/verify - Verify OTP code\n otpAPI.post('/verify', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpVerifySchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email, code } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Verify the code\n const verification = await otpService.verifyCode(normalizedEmail, code, settings)\n\n if (!verification.valid) {\n // Increment attempts on failure\n await otpService.incrementAttempts(normalizedEmail, code)\n\n return c.json({\n error: verification.error || 'Invalid code',\n attemptsRemaining: verification.attemptsRemaining\n }, 401)\n }\n\n // Code is valid - get user\n let user = await db.prepare(`\n SELECT id, email, username, first_name, last_name, role, is_active, created_at\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && settings.allowNewUserRegistration) {\n // Auto-create new user on first OTP verification\n const userId = crypto.randomUUID()\n const now = Date.now()\n const username = normalizedEmail.split('@')[0] + '_' + userId.slice(0, 6)\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, '', '', NULL, 'viewer', 1, 1, ?, ?)\n `).bind(userId, normalizedEmail, username, now, now).run()\n\n user = {\n id: userId,\n email: normalizedEmail,\n username,\n first_name: '',\n last_name: '',\n role: 'viewer',\n is_active: 1,\n created_at: now,\n }\n }\n\n if (!user) {\n return c.json({\n error: 'User not found'\n }, 404)\n }\n\n if (!user.is_active) {\n return c.json({\n error: 'Account is deactivated'\n }, 403)\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env as any)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, (c.env as any).JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n const customData = await getCustomData(db, user.id)\n const { is_active, ...publicUser } = user\n\n return c.json({\n success: true,\n user: {\n ...publicUser,\n ...customData,\n },\n token,\n message: 'Authentication successful'\n })\n } catch (error) {\n console.error('OTP verify error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/resend - Resend OTP code\n otpAPI.post('/resend', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n // Reuse the request endpoint logic\n return otpAPI.fetch(\n new Request(c.req.url.replace('/resend', '/request'), {\n method: 'POST',\n headers: c.req.raw.headers,\n body: JSON.stringify({ email: validation.data.email })\n }),\n c.env\n )\n } catch (error) {\n console.error('OTP resend error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // Register API routes\n builder.addRoute('/auth/otp', otpAPI, {\n description: 'OTP authentication endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('OTP Login', '/admin/plugins/otp-login', {\n icon: 'key',\n order: 85,\n permissions: ['otp:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OTP Login plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OTP Login plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const otpLoginPlugin = createOTPLoginPlugin()\n","/**\n * OAuth Service\n * Handles OAuth2 authorization code flow, token exchange, and user info fetching.\n * Provider-agnostic — each provider is a simple config object.\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n// ─── Provider Configuration ─────────────────────────────────────────────────\n\nexport interface OAuthProviderConfig {\n id: string\n name: string\n authorizeUrl: string\n tokenUrl: string\n userInfoUrl: string\n scopes: string[]\n /** Map provider profile JSON to a normalized user profile */\n mapProfile: (profile: Record) => OAuthUserProfile\n}\n\nexport interface OAuthUserProfile {\n providerAccountId: string\n email: string\n name: string\n avatar?: string\n}\n\nexport interface OAuthPluginSettings {\n providers: Record\n}\n\n// ─── Built-in Providers ─────────────────────────────────────────────────────\n\nexport const GITHUB_PROVIDER: OAuthProviderConfig = {\n id: 'github',\n name: 'GitHub',\n authorizeUrl: 'https://github.com/login/oauth/authorize',\n tokenUrl: 'https://github.com/login/oauth/access_token',\n userInfoUrl: 'https://api.github.com/user',\n scopes: ['read:user', 'user:email'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || profile.login || '',\n avatar: profile.avatar_url || undefined\n })\n}\n\nexport const GOOGLE_PROVIDER: OAuthProviderConfig = {\n id: 'google',\n name: 'Google',\n authorizeUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n scopes: ['openid', 'email', 'profile'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || '',\n avatar: profile.picture || undefined\n })\n}\n\nexport const BUILT_IN_PROVIDERS: Record = {\n github: GITHUB_PROVIDER,\n google: GOOGLE_PROVIDER\n}\n\n// ─── OAuth Account DB Record ────────────────────────────────────────────────\n\nexport interface OAuthAccount {\n id: string\n user_id: string\n provider: string\n provider_account_id: string\n access_token: string | null\n refresh_token: string | null\n token_expires_at: number | null\n profile_data: string | null\n created_at: number\n updated_at: number\n}\n\n// ─── OAuth Service ──────────────────────────────────────────────────────────\n\nexport class OAuthService {\n constructor(private db: D1Database) {}\n\n /**\n * Build the authorization redirect URL for a provider.\n */\n buildAuthorizeUrl(\n provider: OAuthProviderConfig,\n clientId: string,\n redirectUri: string,\n state: string\n ): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope: provider.scopes.join(' '),\n state\n })\n\n // Google requires access_type for refresh tokens\n if (provider.id === 'google') {\n params.set('access_type', 'offline')\n params.set('prompt', 'consent')\n }\n\n return `${provider.authorizeUrl}?${params.toString()}`\n }\n\n /**\n * Exchange authorization code for tokens using native fetch.\n */\n async exchangeCode(\n provider: OAuthProviderConfig,\n clientId: string,\n clientSecret: string,\n code: string,\n redirectUri: string\n ): Promise<{ access_token: string; refresh_token?: string; expires_in?: number }> {\n const body: Record = {\n client_id: clientId,\n client_secret: clientSecret,\n code,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code'\n }\n\n const response = await fetch(provider.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json'\n },\n body: new URLSearchParams(body).toString()\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Token exchange failed (${response.status}): ${errorText}`)\n }\n\n const data = await response.json() as Record\n\n if (data.error) {\n throw new Error(`Token exchange error: ${data.error_description || data.error}`)\n }\n\n return {\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n expires_in: data.expires_in ? Number(data.expires_in) : undefined\n }\n }\n\n /**\n * Fetch user profile from the provider's userinfo endpoint.\n */\n async fetchUserProfile(\n provider: OAuthProviderConfig,\n accessToken: string\n ): Promise {\n const headers: Record = {\n 'Authorization': `Bearer ${accessToken}`,\n 'Accept': 'application/json'\n }\n\n // GitHub uses a different auth header format\n if (provider.id === 'github') {\n headers['Authorization'] = `token ${accessToken}`\n }\n\n const response = await fetch(provider.userInfoUrl, { headers })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch user profile (${response.status})`)\n }\n\n const profile = await response.json() as Record\n\n // For GitHub, email may not be in the profile — fetch from /user/emails\n if (provider.id === 'github' && !profile.email) {\n const emailResponse = await fetch('https://api.github.com/user/emails', {\n headers: {\n 'Authorization': `token ${accessToken}`,\n 'Accept': 'application/json'\n }\n })\n\n if (emailResponse.ok) {\n const emails = await emailResponse.json() as Array<{ email: string; primary: boolean; verified: boolean }>\n const primaryEmail = emails.find(e => e.primary && e.verified)\n if (primaryEmail) {\n profile.email = primaryEmail.email\n }\n }\n }\n\n return provider.mapProfile(profile)\n }\n\n // ─── Database Operations ────────────────────────────────────────────────\n\n /**\n * Find an existing OAuth account link.\n */\n async findOAuthAccount(\n provider: string,\n providerAccountId: string\n ): Promise {\n return await this.db.prepare(`\n SELECT * FROM oauth_accounts\n WHERE provider = ? AND provider_account_id = ?\n `).bind(provider, providerAccountId).first() as OAuthAccount | null\n }\n\n /**\n * Find all OAuth accounts for a user.\n */\n async findUserOAuthAccounts(userId: string): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM oauth_accounts WHERE user_id = ?\n `).bind(userId).all()\n return (result.results || []) as unknown as OAuthAccount[]\n }\n\n /**\n * Create a new OAuth account link.\n */\n async createOAuthAccount(params: {\n userId: string\n provider: string\n providerAccountId: string\n accessToken: string\n refreshToken?: string\n tokenExpiresAt?: number\n profileData?: string\n }): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO oauth_accounts (\n id, user_id, provider, provider_account_id,\n access_token, refresh_token, token_expires_at,\n profile_data, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n params.userId,\n params.provider,\n params.providerAccountId,\n params.accessToken,\n params.refreshToken || null,\n params.tokenExpiresAt || null,\n params.profileData || null,\n now,\n now\n ).run()\n\n return {\n id,\n user_id: params.userId,\n provider: params.provider,\n provider_account_id: params.providerAccountId,\n access_token: params.accessToken,\n refresh_token: params.refreshToken || null,\n token_expires_at: params.tokenExpiresAt || null,\n profile_data: params.profileData || null,\n created_at: now,\n updated_at: now\n }\n }\n\n /**\n * Update tokens for an existing OAuth account.\n */\n async updateOAuthTokens(\n id: string,\n accessToken: string,\n refreshToken?: string,\n tokenExpiresAt?: number\n ): Promise {\n await this.db.prepare(`\n UPDATE oauth_accounts\n SET access_token = ?, refresh_token = ?, token_expires_at = ?, updated_at = ?\n WHERE id = ?\n `).bind(accessToken, refreshToken || null, tokenExpiresAt || null, Date.now(), id).run()\n }\n\n /**\n * Unlink an OAuth account from a user (only if they have another auth method).\n */\n async unlinkOAuthAccount(userId: string, provider: string): Promise {\n // Check user has a password or another OAuth link before unlinking\n const user = await this.db.prepare(`\n SELECT password_hash FROM users WHERE id = ?\n `).bind(userId).first() as { password_hash: string | null } | null\n\n const otherLinks = await this.db.prepare(`\n SELECT COUNT(*) as count FROM oauth_accounts\n WHERE user_id = ? AND provider != ?\n `).bind(userId, provider).first() as { count: number } | null\n\n const hasPassword = !!user?.password_hash\n const hasOtherLinks = (otherLinks?.count || 0) > 0\n\n if (!hasPassword && !hasOtherLinks) {\n return false // Cannot unlink the only auth method\n }\n\n await this.db.prepare(`\n DELETE FROM oauth_accounts WHERE user_id = ? AND provider = ?\n `).bind(userId, provider).run()\n\n return true\n }\n\n /**\n * Find a user by email.\n */\n async findUserByEmail(email: string): Promise<{\n id: string\n email: string\n role: string\n is_active: number\n first_name: string\n last_name: string\n } | null> {\n return await this.db.prepare(`\n SELECT id, email, role, is_active, first_name, last_name\n FROM users WHERE email = ?\n `).bind(email.toLowerCase()).first() as any\n }\n\n /**\n * Create a new user from an OAuth profile.\n */\n async createUserFromOAuth(profile: OAuthUserProfile): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n const email = profile.email.toLowerCase()\n const nameParts = (profile.name || email.split('@')[0] || 'User').split(' ')\n const firstName = nameParts[0] || 'User'\n const lastName = nameParts.slice(1).join(' ') || ''\n const username = email.split('@')[0] || id.substring(0, 8)\n\n // Check for username collision and append random suffix if needed\n const existing = await this.db.prepare(\n 'SELECT id FROM users WHERE username = ?'\n ).bind(username).first()\n\n const finalUsername = existing\n ? `${username}-${id.substring(0, 6)}`\n : username\n\n await this.db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, avatar, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', ?, 1, ?, ?)\n `).bind(\n id, email, finalUsername, firstName, lastName,\n profile.avatar || null, now, now\n ).run()\n\n return id\n }\n\n /**\n * Generate a cryptographically random state parameter for CSRF protection.\n */\n generateState(): string {\n const bytes = new Uint8Array(32)\n crypto.getRandomValues(bytes)\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')\n }\n}\n","/**\n * OAuth Providers Plugin\n *\n * OAuth2/OIDC social login support for SonicJS.\n * Phase 1: Core OAuth2 authorization code flow with GitHub and Google providers.\n *\n * Routes:\n * GET /auth/oauth/:provider → Redirect to provider authorization\n * GET /auth/oauth/:provider/callback → Handle OAuth callback\n * POST /auth/oauth/link → Link OAuth provider to logged-in account\n * POST /auth/oauth/unlink → Unlink OAuth provider from account\n * GET /auth/oauth/accounts → List linked OAuth accounts for current user\n */\n\nimport { Hono } from 'hono'\nimport { setCookie, getCookie } from 'hono/cookie'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport {\n OAuthService,\n BUILT_IN_PROVIDERS,\n type OAuthPluginSettings,\n type OAuthProviderConfig\n} from './oauth-service'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst STATE_COOKIE_NAME = 'oauth_state'\nconst STATE_COOKIE_MAX_AGE = 600 // 10 minutes\n\nexport function createOAuthProvidersPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'oauth-providers',\n version: '1.0.0-beta.1',\n description: 'OAuth2/OIDC social login with GitHub, Google, and more'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== Helper Functions ====================\n\n function getCallbackUrl(c: any, provider: string): string {\n const proto = c.req.header('x-forwarded-proto') || 'https'\n const host = c.req.header('host') || 'localhost'\n return `${proto}://${host}/auth/oauth/${provider}/callback`\n }\n\n async function loadSettings(db: any): Promise {\n const row = await db.prepare(\n `SELECT settings FROM plugins WHERE id = 'oauth-providers'`\n ).first() as { settings: string | null } | null\n\n if (!row?.settings) return null\n\n try {\n return JSON.parse(row.settings) as OAuthPluginSettings\n } catch {\n return null\n }\n }\n\n function getProviderCredentials(\n settings: OAuthPluginSettings | null,\n providerId: string\n ): { clientId: string; clientSecret: string } | null {\n if (!settings?.providers?.[providerId]) return null\n const p = settings.providers[providerId]\n if (!p.enabled || !p.clientId || !p.clientSecret) return null\n return { clientId: p.clientId, clientSecret: p.clientSecret }\n }\n\n // ==================== API Routes ====================\n\n const oauthAPI = new Hono()\n\n // GET /auth/oauth/:provider — Redirect to provider authorization\n oauthAPI.get('/:provider', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.json({ error: `Unknown OAuth provider: ${providerId}` }, 400)\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.json({\n error: `OAuth provider \"${providerId}\" is not configured or not enabled`\n }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Store state in a cookie for CSRF validation on callback\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax', // Lax required for OAuth redirect flow\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n providerConfig,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.redirect(authorizeUrl)\n } catch (error) {\n console.error('OAuth authorize error:', error)\n return c.json({ error: 'Failed to initiate OAuth flow' }, 500)\n }\n })\n\n // GET /auth/oauth/:provider/callback — Handle OAuth callback\n oauthAPI.get('/:provider/callback', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.redirect('/auth/login?error=Unknown OAuth provider')\n }\n\n // Validate state (CSRF protection)\n const stateParam = c.req.query('state')\n const stateCookie = getCookie(c, STATE_COOKIE_NAME)\n\n if (!stateParam || !stateCookie || stateParam !== stateCookie) {\n return c.redirect('/auth/login?error=Invalid OAuth state. Please try again.')\n }\n\n // Clear the state cookie\n setCookie(c, STATE_COOKIE_NAME, '', {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: 0,\n path: '/auth/oauth'\n })\n\n // Check for error from provider\n const errorParam = c.req.query('error')\n if (errorParam) {\n const errorDesc = c.req.query('error_description') || errorParam\n return c.redirect(`/auth/login?error=${encodeURIComponent(errorDesc)}`)\n }\n\n const code = c.req.query('code')\n if (!code) {\n return c.redirect('/auth/login?error=No authorization code received')\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.redirect('/auth/login?error=OAuth provider not configured')\n }\n\n const oauthService = new OAuthService(db)\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Exchange code for tokens\n const tokens = await oauthService.exchangeCode(\n providerConfig,\n creds.clientId,\n creds.clientSecret,\n code,\n redirectUri\n )\n\n // Fetch user profile from provider\n const profile = await oauthService.fetchUserProfile(providerConfig, tokens.access_token)\n\n if (!profile.email) {\n return c.redirect('/auth/login?error=Could not retrieve email from OAuth provider. Please ensure your email is public or grant email permission.')\n }\n\n const tokenExpiresAt = tokens.expires_in\n ? Date.now() + (tokens.expires_in * 1000)\n : null\n\n // Check if this OAuth account is already linked to a user\n const existingOAuth = await oauthService.findOAuthAccount(providerId, profile.providerAccountId)\n\n if (existingOAuth) {\n // Existing OAuth link — update tokens and log in\n await oauthService.updateOAuthTokens(\n existingOAuth.id,\n tokens.access_token,\n tokens.refresh_token,\n tokenExpiresAt ?? undefined\n )\n\n // Fetch user to generate JWT\n const user = await db.prepare(\n 'SELECT id, email, role, is_active FROM users WHERE id = ?'\n ).bind(existingOAuth.user_id).first() as any\n\n if (!user || !user.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n user.id, user.email, user.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // No existing OAuth link — check if user exists by email\n const existingUser = await oauthService.findUserByEmail(profile.email)\n\n if (existingUser) {\n if (!existingUser.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n // Link OAuth to existing account\n await oauthService.createOAuthAccount({\n userId: existingUser.id,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n existingUser.id, existingUser.email, existingUser.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // Brand new user — create account from OAuth profile\n const newUserId = await oauthService.createUserFromOAuth(profile)\n\n await oauthService.createOAuthAccount({\n userId: newUserId,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n newUserId, profile.email.toLowerCase(), 'viewer',\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n\n } catch (error) {\n console.error('OAuth callback error:', error)\n const message = error instanceof Error ? error.message : 'OAuth authentication failed'\n return c.redirect(`/auth/login?error=${encodeURIComponent(message)}`)\n }\n })\n\n // POST /auth/oauth/link — Link an OAuth provider to the current logged-in user\n oauthAPI.post('/link', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider || !BUILT_IN_PROVIDERS[provider]) {\n return c.json({ error: 'Invalid provider' }, 400)\n }\n\n // Redirect the user to the OAuth flow — the callback will auto-link\n // since the user already exists by email\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, provider)\n\n if (!creds) {\n return c.json({ error: `OAuth provider \"${provider}\" is not configured` }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, provider)\n\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n BUILT_IN_PROVIDERS[provider]!,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.json({ redirectUrl: authorizeUrl })\n } catch (error) {\n console.error('OAuth link error:', error)\n return c.json({ error: 'Failed to initiate account linking' }, 500)\n }\n })\n\n // POST /auth/oauth/unlink — Unlink an OAuth provider from the current user\n oauthAPI.post('/unlink', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider) {\n return c.json({ error: 'Provider is required' }, 400)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const success = await oauthService.unlinkOAuthAccount(user.userId, provider)\n\n if (!success) {\n return c.json({\n error: 'Cannot unlink the only authentication method. Set a password first.'\n }, 400)\n }\n\n return c.json({ success: true, message: `${provider} account unlinked` })\n } catch (error) {\n console.error('OAuth unlink error:', error)\n return c.json({ error: 'Failed to unlink account' }, 500)\n }\n })\n\n // GET /auth/oauth/accounts — List linked OAuth accounts for current user\n oauthAPI.get('/accounts', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const accounts = await oauthService.findUserOAuthAccounts(user.userId)\n\n return c.json({\n accounts: accounts.map(a => ({\n provider: a.provider,\n providerAccountId: a.provider_account_id,\n linkedAt: a.created_at\n }))\n })\n } catch (error) {\n console.error('OAuth accounts error:', error)\n return c.json({ error: 'Failed to fetch linked accounts' }, 500)\n }\n })\n\n // Register routes\n builder.addRoute('/auth/oauth', oauthAPI, {\n description: 'OAuth2 social login endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Add menu item for admin settings\n builder.addMenuItem('OAuth Providers', '/admin/plugins/oauth-providers', {\n icon: 'shield',\n order: 86,\n permissions: ['oauth:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OAuth Providers plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OAuth Providers plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const oauthProvidersPlugin = createOAuthProvidersPlugin()\n","/**\n * Embedding Service\n * Generates embeddings using Cloudflare Workers AI\n */\n\nexport class EmbeddingService {\n constructor(private ai: any) {}\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string): Promise {\n try {\n // Use Cloudflare Workers AI embedding model\n // @cf/baai/bge-base-en-v1.5 produces 768-dimensional vectors\n const response = await this.ai.run('@cf/baai/bge-base-en-v1.5', {\n text: this.preprocessText(text)\n })\n\n // Extract embedding vector\n if (response.data && response.data.length > 0) {\n return response.data[0]\n }\n\n throw new Error('No embedding data returned')\n } catch (error) {\n console.error('[EmbeddingService] Error generating embedding:', error)\n throw error\n }\n }\n\n /**\n * Generate embeddings for multiple texts (batch processing)\n */\n async generateBatch(texts: string[]): Promise {\n try {\n // Process in smaller batches to avoid rate limits\n const batchSize = 10\n const batches: string[][] = []\n \n for (let i = 0; i < texts.length; i += batchSize) {\n batches.push(texts.slice(i, i + batchSize))\n }\n\n const allEmbeddings: number[][] = []\n\n for (const batch of batches) {\n const batchEmbeddings = await Promise.all(\n batch.map(text => this.generateEmbedding(text))\n )\n allEmbeddings.push(...batchEmbeddings)\n }\n\n return allEmbeddings\n } catch (error) {\n console.error('[EmbeddingService] Error generating batch embeddings:', error)\n throw error\n }\n }\n\n /**\n * Preprocess text before generating embedding\n * - Trim whitespace\n * - Limit length to avoid token limits\n * - Remove special characters that might cause issues\n */\n private preprocessText(text: string): string {\n if (!text) return ''\n\n // Trim and normalize whitespace\n let processed = text.trim().replace(/\\s+/g, ' ')\n\n // Limit to ~8000 characters (rough token limit)\n if (processed.length > 8000) {\n processed = processed.substring(0, 8000)\n }\n\n return processed\n }\n\n /**\n * Calculate cosine similarity between two embeddings\n */\n cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Embeddings must have same dimensions')\n }\n\n let dotProduct = 0\n let normA = 0\n let normB = 0\n\n for (let i = 0; i < a.length; i++) {\n const aVal = a[i] ?? 0\n const bVal = b[i] ?? 0\n dotProduct += aVal * bVal\n normA += aVal * aVal\n normB += bVal * bVal\n }\n\n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB))\n }\n}\n","/**\n * Chunking Service\n * Splits content into optimal chunks for embedding and search\n */\n\nexport interface ContentChunk {\n id: string\n content_id: string\n collection_id: string\n title: string\n text: string\n chunk_index: number\n metadata: Record\n}\n\nexport class ChunkingService {\n // Default chunk size (in approximate tokens)\n private readonly CHUNK_SIZE = 500\n private readonly CHUNK_OVERLAP = 50\n\n /**\n * Chunk a single content item\n */\n chunkContent(\n contentId: string,\n collectionId: string,\n title: string,\n data: any,\n metadata: Record = {}\n ): ContentChunk[] {\n // Extract all text from content\n const text = this.extractText(data)\n \n if (!text || text.trim().length === 0) {\n console.warn(`[ChunkingService] No text found for content ${contentId}`)\n return []\n }\n\n // Split into chunks\n const textChunks = this.splitIntoChunks(text)\n\n // Create chunk objects\n return textChunks.map((chunkText, index) => ({\n id: `${contentId}_chunk_${index}`,\n content_id: contentId,\n collection_id: collectionId,\n title: title,\n text: chunkText,\n chunk_index: index,\n metadata: {\n ...metadata,\n total_chunks: textChunks.length\n }\n }))\n }\n\n /**\n * Chunk multiple content items\n */\n chunkContentBatch(items: Array<{\n id: string\n collection_id: string\n title: string\n data: any\n metadata?: Record\n }>): ContentChunk[] {\n const allChunks: ContentChunk[] = []\n\n for (const item of items) {\n const chunks = this.chunkContent(\n item.id,\n item.collection_id,\n item.title,\n item.data,\n item.metadata\n )\n allChunks.push(...chunks)\n }\n\n return allChunks\n }\n\n /**\n * Extract all text from content data\n */\n private extractText(data: any): string {\n const parts: string[] = []\n\n // Common text fields\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n if (data.summary) parts.push(String(data.summary))\n\n // Recursively extract from nested objects\n const extractRecursive = (obj: any): void => {\n if (typeof obj === 'string') {\n // Skip very short strings and URLs\n if (obj.length > 10 && !obj.startsWith('http')) {\n parts.push(obj)\n }\n } else if (Array.isArray(obj)) {\n obj.forEach(extractRecursive)\n } else if (obj && typeof obj === 'object') {\n // Skip certain keys\n const skipKeys = ['id', 'slug', 'url', 'image', 'thumbnail', 'metadata']\n \n Object.entries(obj).forEach(([key, value]) => {\n if (!skipKeys.includes(key.toLowerCase())) {\n extractRecursive(value)\n }\n })\n }\n }\n\n extractRecursive(data)\n\n return parts.join('\\n\\n').trim()\n }\n\n /**\n * Split text into overlapping chunks\n */\n private splitIntoChunks(text: string): string[] {\n // Split by words\n const words = text.split(/\\s+/)\n \n if (words.length <= this.CHUNK_SIZE) {\n return [text]\n }\n\n const chunks: string[] = []\n let startIndex = 0\n\n while (startIndex < words.length) {\n // Get chunk with overlap\n const endIndex = Math.min(startIndex + this.CHUNK_SIZE, words.length)\n const chunk = words.slice(startIndex, endIndex).join(' ')\n chunks.push(chunk)\n\n // Move forward by chunk size minus overlap\n startIndex += this.CHUNK_SIZE - this.CHUNK_OVERLAP\n\n // Ensure we don't create a tiny last chunk\n if (startIndex >= words.length - this.CHUNK_OVERLAP) {\n break\n }\n }\n\n return chunks\n }\n\n /**\n * Get optimal chunk size based on content type\n */\n getOptimalChunkSize(contentType: string): number {\n switch (contentType) {\n case 'blog_posts':\n case 'articles':\n return 600 // Larger chunks for long-form content\n case 'products':\n case 'pages':\n return 400 // Medium chunks for structured content\n case 'messages':\n case 'comments':\n return 200 // Small chunks for short content\n default:\n return this.CHUNK_SIZE\n }\n }\n}\n","/**\n * Custom RAG Service\n * Implements full RAG pipeline using Cloudflare Vectorize\n * \n * Fulfills GitHub Issue #362: Advanced search with Cloudflare Search\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { EmbeddingService } from './embedding.service'\nimport { ChunkingService, type ContentChunk } from './chunking.service'\nimport type { SearchQuery, SearchResponse, SearchResult, AISearchSettings } from '../types'\n\nexport class CustomRAGService {\n private embeddingService: EmbeddingService\n private chunkingService: ChunkingService\n\n constructor(\n private db: D1Database,\n private ai: any,\n private vectorize: any\n ) {\n this.embeddingService = new EmbeddingService(ai)\n this.chunkingService = new ChunkingService()\n }\n\n /**\n * Index all content from a collection\n */\n async indexCollection(collectionId: string): Promise<{\n total_items: number\n total_chunks: number\n indexed_chunks: number\n errors: number\n }> {\n console.log(`[CustomRAG] Starting indexing for collection: ${collectionId}`)\n \n try {\n // Get all published content from collection\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.collection_id = ? AND c.status = 'published'\n `)\n .bind(collectionId)\n .all<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n const totalItems = contentItems?.length || 0\n \n if (totalItems === 0) {\n console.log(`[CustomRAG] No content found in collection ${collectionId}`)\n return { total_items: 0, total_chunks: 0, indexed_chunks: 0, errors: 0 }\n }\n\n // Chunk all content\n const items = (contentItems || []).map(item => ({\n id: item.id,\n collection_id: item.collection_id,\n title: item.title || 'Untitled',\n data: typeof item.data === 'string' ? JSON.parse(item.data) : item.data,\n metadata: {\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name\n }\n }))\n\n const chunks = this.chunkingService.chunkContentBatch(items)\n const totalChunks = chunks.length\n\n console.log(`[CustomRAG] Generated ${totalChunks} chunks from ${totalItems} items`)\n\n // Generate embeddings in batches\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n console.log(`[CustomRAG] Generated ${embeddings.length} embeddings`)\n\n // Store in Vectorize\n let indexedChunks = 0\n let errors = 0\n const batchSize = 100\n\n for (let i = 0; i < chunks.length; i += batchSize) {\n const chunkBatch = chunks.slice(i, i + batchSize)\n const embeddingBatch = embeddings.slice(i, i + batchSize)\n\n try {\n await this.vectorize.upsert(\n chunkBatch.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddingBatch[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500), // Store snippet for display\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n indexedChunks += chunkBatch.length\n console.log(`[CustomRAG] Indexed batch ${i / batchSize + 1}: ${chunkBatch.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error indexing batch ${i / batchSize + 1}:`, error)\n errors += chunkBatch.length\n }\n }\n\n console.log(`[CustomRAG] Indexing complete: ${indexedChunks}/${totalChunks} chunks indexed`)\n\n return {\n total_items: totalItems,\n total_chunks: totalChunks,\n indexed_chunks: indexedChunks,\n errors\n }\n } catch (error) {\n console.error(`[CustomRAG] Error indexing collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Search using RAG (semantic search with Vectorize)\n */\n async search(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n\n try {\n console.log(`[CustomRAG] Searching for: \"${query.query}\"`)\n\n // Generate query embedding\n const queryEmbedding = await this.embeddingService.generateEmbedding(query.query)\n\n // Build Vectorize query filters\n const filter: any = {}\n \n if (query.filters?.collections && query.filters.collections.length > 0) {\n filter.collection_id = { $in: query.filters.collections }\n } else if (settings.selected_collections.length > 0) {\n filter.collection_id = { $in: settings.selected_collections }\n }\n\n if (query.filters?.status && query.filters.status.length > 0) {\n filter.status = { $in: query.filters.status }\n }\n\n // Vectorize filters have issues, so we query without filter and manually filter results\n const vectorResults = await this.vectorize.query(queryEmbedding, {\n topK: 50, // Max allowed with returnMetadata: true\n returnMetadata: true\n })\n\n // Manually filter results by collection_id if filter exists\n let filteredMatches = vectorResults.matches || []\n if (filter.collection_id?.$in && Array.isArray(filter.collection_id.$in)) {\n const allowedCollections = filter.collection_id.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedCollections.includes(match.metadata?.collection_id)\n )\n }\n\n // Apply status filter if exists\n if (filter.status?.$in && Array.isArray(filter.status.$in)) {\n const allowedStatuses = filter.status.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedStatuses.includes(match.metadata?.status)\n )\n }\n\n // Limit to requested topK\n const topK = query.limit || settings.results_limit || 20\n filteredMatches = filteredMatches.slice(0, topK)\n\n // Replace matches with filtered results\n vectorResults.matches = filteredMatches\n\n if (!vectorResults.matches || vectorResults.matches.length === 0) {\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: 'ai'\n }\n }\n\n // Get unique content IDs\n const contentIds = [...new Set(\n vectorResults.matches.map((m: any) => m.metadata.content_id)\n )]\n\n // Fetch full content from D1\n const placeholders = contentIds.map(() => '?').join(',')\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.display_name as collection_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id IN (${placeholders})\n `)\n .bind(...contentIds)\n .all<{\n id: string\n title: string\n slug: string\n collection_id: string\n collection_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n }>()\n\n // Map results with relevance scores\n const searchResults: SearchResult[] = (contentItems || []).map(item => {\n // Find best matching chunk for this content\n const matchingChunks = vectorResults.matches.filter(\n (m: any) => m.metadata.content_id === item.id\n )\n \n const bestMatch = matchingChunks.reduce((best: any, current: any) => \n current.score > (best?.score || 0) ? current : best\n , null)\n\n return {\n id: item.id,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n collection_id: item.collection_id,\n collection_name: item.collection_name,\n snippet: bestMatch?.metadata?.text || '',\n relevance_score: bestMatch?.score || 0,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at\n }\n })\n\n // Sort by relevance score\n searchResults.sort((a, b) => (b.relevance_score || 0) - (a.relevance_score || 0))\n\n const queryTime = Date.now() - startTime\n console.log(`[CustomRAG] Search completed in ${queryTime}ms, ${searchResults.length} results`)\n\n return {\n results: searchResults,\n total: searchResults.length,\n query_time_ms: queryTime,\n mode: 'ai'\n }\n } catch (error) {\n console.error('[CustomRAG] Search error:', error)\n throw error\n }\n }\n\n /**\n * Update index for a single content item\n */\n async updateContentIndex(contentId: string): Promise {\n try {\n // Get content item\n const content = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n .bind(contentId)\n .first<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!content) {\n console.warn(`[CustomRAG] Content ${contentId} not found`)\n return\n }\n\n // If content is not published, remove from index\n if (content.status !== 'published') {\n await this.removeContentFromIndex(contentId)\n return\n }\n\n // Chunk content\n const chunks = this.chunkingService.chunkContent(\n content.id,\n content.collection_id,\n content.title || 'Untitled',\n typeof content.data === 'string' ? JSON.parse(content.data) : content.data,\n {\n status: content.status,\n created_at: content.created_at,\n updated_at: content.updated_at,\n author_id: content.author_id,\n collection_name: content.collection_name,\n collection_display_name: content.collection_display_name\n }\n )\n\n // Generate embeddings\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n // Update in Vectorize\n await this.vectorize.upsert(\n chunks.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddings[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500),\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n console.log(`[CustomRAG] Updated index for content ${contentId}: ${chunks.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error updating index for ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove content from index\n */\n async removeContentFromIndex(contentId: string): Promise {\n try {\n // Note: Vectorize doesn't have a bulk delete by metadata filter\n // We need to delete each chunk individually\n // In practice, we would track chunk IDs or use a different approach\n \n console.log(`[CustomRAG] Removing content ${contentId} from index`)\n \n // For now, we'll let stale chunks age out\n // A better approach would be to maintain a mapping in D1\n // TODO: Implement proper chunk tracking\n \n } catch (error) {\n console.error(`[CustomRAG] Error removing content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Get search suggestions based on query\n */\n async getSuggestions(partialQuery: string, limit: number = 5): Promise {\n try {\n // Generate embedding for partial query\n const queryEmbedding = await this.embeddingService.generateEmbedding(partialQuery)\n\n // Search for similar content titles\n const results = await this.vectorize.query(queryEmbedding, {\n topK: limit * 2, // Get more to filter\n returnMetadata: true\n })\n\n // Extract unique titles\n const suggestions = [...new Set(\n results.matches?.map((m: any) => m.metadata.title).filter(Boolean) || []\n )].slice(0, limit)\n\n return suggestions as string[]\n } catch (error) {\n console.error('[CustomRAG] Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Check if Vectorize is available and configured\n */\n isAvailable(): boolean {\n return !!this.vectorize && !!this.ai\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n NewCollectionNotification,\n} from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * AI Search Service\n * Handles search operations, settings management, and collection detection\n * Now uses Custom RAG with Vectorize for semantic search\n */\nexport class AISearchService {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[AISearchService] Custom RAG initialized')\n } else {\n console.log('[AISearchService] Custom RAG not available, using keyword search only')\n }\n }\n\n /**\n * Get plugin settings\n */\n async getSettings(): Promise {\n try {\n const plugin = await this.db\n .prepare(`SELECT settings FROM plugins WHERE id = ? LIMIT 1`)\n .bind('ai-search')\n .first<{ settings: string | null }>()\n\n if (!plugin || !plugin.settings) {\n return this.getDefaultSettings()\n }\n\n return JSON.parse(plugin.settings) as AISearchSettings\n } catch (error) {\n console.error('Error fetching AI Search settings:', error)\n return this.getDefaultSettings()\n }\n }\n\n /**\n * Get default settings\n */\n getDefaultSettings(): AISearchSettings {\n return {\n enabled: true,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n }\n\n /**\n * Update plugin settings\n */\n async updateSettings(settings: Partial): Promise {\n const existing = await this.getSettings()\n const updated: AISearchSettings = {\n ...existing!,\n ...settings,\n }\n\n try {\n // Update plugin settings in plugins table\n await this.db\n .prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'ai-search'\n `)\n .bind(JSON.stringify(updated))\n .run()\n\n return updated\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n throw error\n }\n }\n\n /**\n * Detect new collections that aren't indexed or dismissed\n */\n async detectNewCollections(): Promise {\n try {\n // Get all collections (exclude test collections)\n // Note: D1 doesn't support parameterized LIKE, so we filter in JavaScript\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: number\n name: string\n display_name: string\n description?: string\n }>()\n \n // Filter out test collections (starts with test_, ends with _test, or is test_collection)\n const collections = (allCollections || []).filter(\n (col) => {\n if (!col.name) return false\n const name = col.name.toLowerCase()\n return !name.startsWith('test_') && \n !name.endsWith('_test') && \n name !== 'test_collection' &&\n !name.includes('_test_') &&\n name !== 'large_payload_test' &&\n name !== 'concurrent_test'\n }\n )\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n\n // Get item counts for each collection\n const notifications: NewCollectionNotification[] = []\n\n for (const collection of collections || []) {\n const collectionId = String(collection.id)\n\n // Skip if already selected or dismissed\n if (selected.includes(collectionId) || dismissed.includes(collectionId)) {\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n notifications.push({\n collection: {\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: false,\n is_dismissed: false,\n is_new: true,\n },\n message: `New collection \"${collection.display_name}\" with ${itemCount} items available for indexing`,\n })\n }\n\n return notifications\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return []\n }\n }\n\n /**\n * Get all collections with indexing status\n */\n async getAllCollections(): Promise {\n try {\n // Get all collections (same query as content page)\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1 ORDER BY display_name'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: string\n name: string\n display_name: string\n description?: string\n }>()\n \n console.log('[AISearchService.getAllCollections] Raw collections from DB:', allCollections?.length || 0)\n const firstCollection = allCollections?.[0]\n if (firstCollection) {\n console.log('[AISearchService.getAllCollections] Sample collection:', {\n id: firstCollection.id,\n name: firstCollection.name,\n display_name: firstCollection.display_name\n })\n }\n \n // No filtering needed - test collections are now properly cleaned up by E2E tests\n const collections = (allCollections || []).filter(\n (col) => col.id && col.name\n )\n \n console.log('[AISearchService.getAllCollections] After filtering test collections:', collections.length)\n console.log('[AISearchService.getAllCollections] Remaining collections:', collections.map(c => c.name).join(', '))\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n \n console.log('[AISearchService.getAllCollections] Settings:', {\n selected_count: selected.length,\n dismissed_count: dismissed.length,\n selected: selected\n })\n\n // Get item counts and indexing status\n const collectionInfos: CollectionInfo[] = []\n\n for (const collection of collections) {\n if (!collection.id || !collection.name) continue\n const collectionId = String(collection.id)\n \n if (!collectionId) {\n console.warn('[AISearchService] Skipping invalid collection:', collection)\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n collectionInfos.push({\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name || collection.name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: selected.includes(collectionId),\n is_dismissed: dismissed.includes(collectionId),\n is_new: !selected.includes(collectionId) && !dismissed.includes(collectionId),\n })\n }\n \n console.log('[AISearchService.getAllCollections] Returning collectionInfos:', collectionInfos.length)\n const firstInfo = collectionInfos[0]\n if (collectionInfos.length > 0 && firstInfo) {\n console.log('[AISearchService.getAllCollections] First collectionInfo:', {\n id: firstInfo.id,\n name: firstInfo.name,\n display_name: firstInfo.display_name,\n item_count: firstInfo.item_count\n })\n }\n return collectionInfos\n } catch (error) {\n console.error('[AISearchService] Error fetching collections:', error)\n return []\n }\n }\n\n /**\n * Execute search query\n */\n async search(query: SearchQuery): Promise {\n const startTime = Date.now()\n const settings = await this.getSettings()\n\n if (!settings?.enabled) {\n return {\n results: [],\n total: 0,\n query_time_ms: 0,\n mode: query.mode,\n }\n }\n\n // Use AI Search if enabled and mode is 'ai'\n if (query.mode === 'ai' && settings.ai_mode_enabled && this.customRAG?.isAvailable()) {\n return this.searchAI(query, settings)\n }\n\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n\n /**\n * AI-powered semantic search using Custom RAG\n */\n private async searchAI(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n \n try {\n if (!this.customRAG) {\n console.warn('[AISearchService] CustomRAG not available, falling back to keyword search')\n return this.searchKeyword(query, settings)\n }\n\n // Use Custom RAG for semantic search - pass the full query object and settings\n const result = await this.customRAG.search(query, settings)\n\n return result\n } catch (error) {\n console.error('[AISearchService] AI search error, falling back to keyword:', error)\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n }\n\n /**\n * Traditional keyword search\n */\n private async searchKeyword(\n query: SearchQuery,\n settings: AISearchSettings\n ): Promise {\n const startTime = Date.now()\n\n try {\n const conditions: string[] = []\n const params: any[] = []\n\n // Search query\n if (query.query) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n const searchTerm = `%${query.query}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n // Collection filter\n if (query.filters?.collections && query.filters.collections.length > 0) {\n const placeholders = query.filters.collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...query.filters.collections)\n } else if (settings.selected_collections.length > 0) {\n // Only search indexed collections\n const placeholders = settings.selected_collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...settings.selected_collections)\n }\n\n // Status filter\n if (query.filters?.status && query.filters.status.length > 0) {\n const placeholders = query.filters.status.map(() => '?').join(',')\n conditions.push(`c.status IN (${placeholders})`)\n params.push(...query.filters.status)\n } else {\n // Exclude deleted by default\n conditions.push(\"c.status != 'deleted'\")\n }\n\n // Date range filter\n if (query.filters?.dateRange) {\n const field = query.filters.dateRange.field || 'created_at'\n if (query.filters.dateRange.start) {\n conditions.push(`c.${field} >= ?`)\n params.push(query.filters.dateRange.start.getTime())\n }\n if (query.filters.dateRange.end) {\n conditions.push(`c.${field} <= ?`)\n params.push(query.filters.dateRange.end.getTime())\n }\n }\n\n // Author filter\n if (query.filters?.author) {\n conditions.push('c.author_id = ?')\n params.push(query.filters.author)\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get results\n const limit = query.limit || settings.results_limit\n const offset = query.offset || 0\n\n const resultsStmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id, c.data,\n col.name as collection_name, col.display_name as collection_display_name,\n u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results } = await resultsStmt.bind(...params, limit, offset).all<{\n id: string\n title: string\n slug: string\n collection_id: number\n collection_name: string\n collection_display_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n author_email?: string\n data: string\n }>()\n\n const searchResults: SearchResult[] = (results || []).map((row) => ({\n id: String(row.id),\n title: row.title || 'Untitled',\n slug: row.slug || '',\n collection_id: String(row.collection_id),\n collection_name: row.collection_display_name || row.collection_name,\n snippet: this.extractSnippet(row.data, query.query),\n status: row.status,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n author_name: row.author_email,\n }))\n\n const queryTime = Date.now() - startTime\n\n // Log search history\n await this.logSearch(query.query, query.mode, searchResults.length)\n\n return {\n results: searchResults,\n total,\n query_time_ms: queryTime,\n mode: query.mode,\n }\n } catch (error) {\n console.error('Keyword search error:', error)\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: query.mode,\n }\n }\n }\n\n /**\n * Extract snippet from content data\n */\n private extractSnippet(data: string, query: string): string {\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data\n const text = JSON.stringify(parsed).toLowerCase()\n const queryLower = query.toLowerCase()\n\n const index = text.indexOf(queryLower)\n if (index === -1) {\n // Return first 200 chars\n return JSON.stringify(parsed).substring(0, 200) + '...'\n }\n\n // Extract context around match\n const start = Math.max(0, index - 50)\n const end = Math.min(text.length, index + query.length + 50)\n return text.substring(start, end) + '...'\n } catch {\n return data.substring(0, 200) + '...'\n }\n }\n\n /**\n * Get search suggestions (autocomplete)\n */\n async getSearchSuggestions(partial: string): Promise {\n try {\n const settings = await this.getSettings()\n if (!settings?.autocomplete_enabled) {\n return []\n }\n\n // If Custom RAG is available, use AI-powered suggestions\n if (this.customRAG?.isAvailable()) {\n try {\n const aiSuggestions = await this.customRAG.getSuggestions(partial, 5)\n if (aiSuggestions.length > 0) {\n return aiSuggestions\n }\n } catch (error) {\n console.error('[AISearchService] Error getting AI suggestions:', error)\n // Fall through to history-based suggestions\n }\n }\n\n // Fallback to history-based suggestions\n const stmt = this.db.prepare(`\n SELECT DISTINCT query \n FROM ai_search_history \n WHERE query LIKE ? \n ORDER BY created_at DESC \n LIMIT 10\n `)\n const { results } = await stmt.bind(`%${partial}%`).all<{ query: string }>()\n\n return (results || []).map((r) => r.query)\n } catch (error) {\n console.error('Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Log search query to history\n */\n private async logSearch(query: string, mode: 'ai' | 'keyword', resultsCount: number): Promise {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_history (query, mode, results_count, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await stmt.bind(query, mode, resultsCount, Date.now()).run()\n } catch (error) {\n console.error('Error logging search:', error)\n }\n }\n\n /**\n * Get search analytics\n */\n async getSearchAnalytics(): Promise<{\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }> {\n try {\n // Total queries (last 30 days)\n const totalStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n `)\n const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000\n const totalResult = await totalStmt.bind(thirtyDaysAgo).first<{ count: number }>()\n\n // AI vs Keyword breakdown\n const modeStmt = this.db.prepare(`\n SELECT mode, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY mode\n `)\n const { results: modeResults } = await modeStmt.bind(thirtyDaysAgo).all<{\n mode: string\n count: number\n }>()\n\n const aiCount = modeResults?.find((r) => r.mode === 'ai')?.count || 0\n const keywordCount = modeResults?.find((r) => r.mode === 'keyword')?.count || 0\n\n // Popular queries\n const popularStmt = this.db.prepare(`\n SELECT query, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY query \n ORDER BY count DESC \n LIMIT 10\n `)\n const { results: popularResults } = await popularStmt.bind(thirtyDaysAgo).all<{\n query: string\n count: number\n }>()\n\n return {\n total_queries: totalResult?.count || 0,\n ai_queries: aiCount,\n keyword_queries: keywordCount,\n popular_queries: (popularResults || []).map((r) => ({\n query: r.query,\n count: r.count,\n })),\n average_query_time: 0, // TODO: Track query times\n }\n } catch (error) {\n console.error('Error getting analytics:', error)\n return {\n total_queries: 0,\n ai_queries: 0,\n keyword_queries: 0,\n popular_queries: [],\n average_query_time: 0,\n }\n }\n }\n\n /**\n * Verify Custom RAG is available\n */\n verifyBinding(): boolean {\n return this.customRAG?.isAvailable() ?? false\n }\n\n /**\n * Get Custom RAG service instance (for indexer)\n */\n getCustomRAG(): CustomRAGService | undefined {\n return this.customRAG\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { AISearchSettings, IndexStatus } from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * Index Manager Service\n * Handles indexing of content items using Custom RAG with Vectorize\n */\nexport class IndexManager {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[IndexManager] Custom RAG initialized')\n }\n }\n\n /**\n * Index all content items within a collection using Custom RAG\n */\n async indexCollection(collectionId: string): Promise {\n try {\n // Get collection info\n const collectionStmt = this.db.prepare(\n 'SELECT id, name, display_name FROM collections WHERE id = ?'\n )\n const collection = await collectionStmt.bind(collectionId).first<{\n id: string\n name: string\n display_name: string\n }>()\n\n if (!collection) {\n throw new Error(`Collection ${collectionId} not found`)\n }\n\n // Update status to indexing\n await this.updateIndexStatus(collectionId, {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n status: 'indexing',\n })\n\n // Use Custom RAG for indexing if available\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Using Custom RAG to index collection ${collectionId}`)\n \n const result = await this.customRAG.indexCollection(collectionId)\n\n const finalStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: result.total_items,\n indexed_items: result.indexed_chunks,\n last_sync_at: Date.now(),\n status: result.errors > 0 ? 'error' : 'completed',\n error_message: result.errors > 0 ? `${result.errors} errors during indexing` : undefined\n }\n\n await this.updateIndexStatus(collectionId, finalStatus)\n return finalStatus\n }\n\n // Fallback: No indexing without Custom RAG\n console.warn(`[IndexManager] Custom RAG not available, skipping indexing for ${collectionId}`)\n \n const fallbackStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n last_sync_at: Date.now(),\n status: 'completed',\n error_message: 'Custom RAG not available - using keyword search only'\n }\n\n await this.updateIndexStatus(collectionId, fallbackStatus)\n return fallbackStatus\n } catch (error) {\n console.error(`[IndexManager] Error indexing collection ${collectionId}:`, error)\n const errorStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: 'Unknown',\n total_items: 0,\n indexed_items: 0,\n status: 'error',\n error_message: error instanceof Error ? error.message : String(error),\n }\n await this.updateIndexStatus(collectionId, errorStatus)\n return errorStatus\n }\n }\n\n /**\n * Index a single content item\n */\n private async indexContentItem(\n item: {\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n },\n collectionId: string\n ): Promise {\n try {\n // Parse content data\n let parsedData: any = {}\n try {\n parsedData = typeof item.data === 'string' ? JSON.parse(item.data) : item.data\n } catch {\n parsedData = {}\n }\n\n // Prepare document for AI Search\n const document = {\n id: `content_${item.id}`,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n content: this.extractSearchableText(parsedData),\n metadata: {\n collection_id: collectionId,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n },\n }\n\n // TODO: Call Cloudflare AI Search API to index document\n // await this.aiSearch.index(document)\n\n // For now, just log (actual implementation will use AI Search API)\n console.log(`Indexed content item: ${item.id}`)\n } catch (error) {\n console.error(`Error indexing content item ${item.id}:`, error)\n throw error\n }\n }\n\n /**\n * Extract searchable text from content data\n */\n private extractSearchableText(data: any): string {\n const parts: string[] = []\n\n // Add title if present\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n\n // Add description/content fields\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n\n // Add all string values from data\n const extractStrings = (obj: any): void => {\n if (typeof obj === 'string') {\n parts.push(obj)\n } else if (Array.isArray(obj)) {\n obj.forEach(extractStrings)\n } else if (obj && typeof obj === 'object') {\n Object.values(obj).forEach(extractStrings)\n }\n }\n\n extractStrings(data)\n\n return parts.join(' ')\n }\n\n /**\n * Update a single content item in the index\n */\n async updateIndex(collectionId: number, contentId: string): Promise {\n try {\n // Get content item\n const stmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.data, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ? AND c.collection_id = ?\n `)\n const item = await stmt.bind(contentId, collectionId).first<{\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!item) {\n throw new Error(`Content item ${contentId} not found`)\n }\n\n // Re-index the item\n await this.indexContentItem(item, String(collectionId))\n\n // Update last sync time for collection\n const status = await this.getIndexStatus(String(collectionId))\n if (status) {\n await this.updateIndexStatus(String(collectionId), {\n ...status,\n last_sync_at: Date.now(),\n })\n }\n } catch (error) {\n console.error(`Error updating index for content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove a content item from the index using Custom RAG\n */\n async removeFromIndex(collectionId: string, contentId: string): Promise {\n try {\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Removing content ${contentId} from index`)\n await this.customRAG.removeContentFromIndex(contentId)\n } else {\n console.warn(`[IndexManager] Custom RAG not available, skipping removal for ${contentId}`)\n }\n } catch (error) {\n console.error(`[IndexManager] Error removing content ${contentId} from index:`, error)\n throw error\n }\n }\n\n /**\n * Get indexing status for a collection\n */\n async getIndexStatus(collectionId: string): Promise {\n try {\n const stmt = this.db.prepare(\n 'SELECT * FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const result = await stmt.bind(collectionId).first<{\n id: number\n collection_id: string\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n if (!result) {\n return null\n }\n\n return {\n collection_id: String(result.collection_id),\n collection_name: result.collection_name,\n total_items: result.total_items,\n indexed_items: result.indexed_items,\n last_sync_at: result.last_sync_at,\n status: result.status as IndexStatus['status'],\n error_message: result.error_message,\n }\n } catch (error) {\n console.error(`Error getting index status for collection ${collectionId}:`, error)\n return null\n }\n }\n\n /**\n * Get indexing status for all collections\n */\n async getAllIndexStatus(): Promise> {\n try {\n const stmt = this.db.prepare('SELECT * FROM ai_search_index_meta')\n const { results } = await stmt.all<{\n id: number\n collection_id: number\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n const statusMap: Record = {}\n\n for (const row of results || []) {\n const collectionId = String(row.collection_id)\n statusMap[collectionId] = {\n collection_id: collectionId,\n collection_name: row.collection_name,\n total_items: row.total_items,\n indexed_items: row.indexed_items,\n last_sync_at: row.last_sync_at,\n status: row.status as IndexStatus['status'],\n error_message: row.error_message,\n }\n }\n\n return statusMap\n } catch (error) {\n console.error('Error getting all index status:', error)\n return {}\n }\n }\n\n /**\n * Update index status in database\n */\n private async updateIndexStatus(collectionId: string, status: IndexStatus): Promise {\n try {\n // Check if record exists\n const checkStmt = this.db.prepare(\n 'SELECT id FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const existing = await checkStmt.bind(collectionId).first<{ id: number }>()\n\n if (existing) {\n // Update existing\n const stmt = this.db.prepare(`\n UPDATE ai_search_index_meta \n SET collection_name = ?,\n total_items = ?,\n indexed_items = ?,\n last_sync_at = ?,\n status = ?,\n error_message = ?\n WHERE collection_id = ?\n `)\n await stmt\n .bind(\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null,\n String(collectionId)\n )\n .run()\n } else {\n // Insert new\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_index_meta (\n collection_id, collection_name, total_items, indexed_items,\n last_sync_at, status, error_message\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n await stmt\n .bind(\n String(status.collection_id),\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null\n )\n .run()\n }\n } catch (error) {\n console.error(`Error updating index status for collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Sync all selected collections\n */\n async syncAll(selectedCollections: string[]): Promise {\n for (const collectionId of selectedCollections) {\n try {\n await this.indexCollection(collectionId)\n } catch (error) {\n console.error(`Error syncing collection ${collectionId}:`, error)\n }\n }\n }\n}\n","import { renderAdminLayout } from '../../../../templates/layouts/admin-layout-v2.template'\nimport type {\n AISearchSettings,\n CollectionInfo,\n IndexStatus,\n NewCollectionNotification,\n} from '../types'\n\ninterface SettingsPageData {\n settings: AISearchSettings | null\n collections: CollectionInfo[]\n newCollections: NewCollectionNotification[]\n indexStatus: Record\n analytics: {\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const settings = data.settings || {\n enabled: false,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n\n // Ensure arrays exist\n const selectedCollections = Array.isArray(settings.selected_collections) ? settings.selected_collections : []\n const dismissedCollections = Array.isArray(settings.dismissed_collections) ? settings.dismissed_collections : []\n\n const enabled = settings.enabled === true\n const aiModeEnabled = settings.ai_mode_enabled !== false\n const autocompleteEnabled = settings.autocomplete_enabled !== false\n const indexMedia = settings.index_media === true\n\n const selectedCollectionIds = new Set(selectedCollections.map(id => String(id)))\n const dismissedCollectionIds = new Set(dismissedCollections.map(id => String(id)))\n\n // Ensure collections array exists\n const collections = Array.isArray(data.collections) ? data.collections : []\n\n // Debug: Log collections in template\n console.log('[SettingsPage Template] Collections received:', collections.length)\n if (collections.length > 0) {\n console.log('[SettingsPage Template] First collection:', collections[0])\n }\n\n const content = `\n
\n \n
\n
\n

🔍 AI Search Settings

\n

\n Configure advanced search with Cloudflare AI Search. Select collections to index and manage search preferences.\n

\n
\n \n
\n\n\n \n
\n
\n \n
\n

🔍 Search Settings

\n
\n
\n \n
\n \n

Turn on advanced search capabilities across your content

\n
\n
\n\n
\n \n
\n \n

\n Enable natural language queries (requires Cloudflare Workers AI binding)\n → Setup Guide\n

\n

\n ⚠️ If AI binding unavailable, will fallback to keyword search\n

\n
\n
\n
\n
\n\n
\n\n \n
\n
\n
\n

📚 Collections to Index

\n

\n Select which content collections should be indexed and searchable. Only checked collections will be included in search results.\n

\n
\n
\n
\n ${collections.length === 0\n ? '

No collections available. Create collections first.

'\n : collections.map((collection) => {\n const collectionId = String(collection.id)\n const isChecked = selectedCollectionIds.has(collectionId)\n const isDismissed = dismissedCollectionIds.has(collectionId)\n const indexStatusMap: Record = data.indexStatus || {}\n const status = indexStatusMap[collectionId]\n // Only show NEW badge if collection is new, not dismissed, and has never been indexed\n const isNew = collection.is_new === true && !isDismissed && !status\n // Only show status badge if collection is CHECKED and has status\n const statusBadge = (status && isChecked)\n ? `${status.status}`\n : ''\n\n return `
\n \n
\n \n

\n ${collection.description || collection.name || 'No description'} • ${collection.item_count || 0} items\n ${status ? ` • ${status.indexed_items}/${status.total_items} indexed` : ''}\n

\n ${status && status.status === 'indexing'\n ? `
\n
\n
`\n : ''}\n
\n ${isChecked ? `\n \n \n \n \n Re-index\n \n ` : ''}\n
`\n }).join('')}\n
\n
\n\n
\n\n \n
\n

⚙️ Advanced Options

\n
\n
\n \n
\n \n

Show search suggestions as users type

\n
\n
\n\n
\n \n
\n \n

Include media files in search results

\n
\n
\n\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

\n 💡 Collections marked as NEW haven't been indexed yet\n

\n \n
\n
\n
\n\n\n \n
\n

📊 Search Analytics

\n
\n
\n
Total Queries
\n
${data.analytics.total_queries}
\n
\n
\n
AI Queries
\n
${data.analytics.ai_queries}
\n
\n
\n
Keyword Queries
\n
${data.analytics.keyword_queries}
\n
\n
\n ${data.analytics.popular_queries.length > 0\n ? `\n
\n

Popular Searches

\n
\n ${data.analytics.popular_queries.map(\n (item) => `\n
\n \"${item.query}\"\n ${item.count} times\n
\n `\n ).join('')}\n
\n
\n `\n : '

No search history yet.

'}\n
\n\n \n
\n
\n \n Settings Saved Successfully!\n
\n
\n
\n \n `\n\n return renderAdminLayout({\n title: 'AI Search Settings',\n pageTitle: 'AI Search Settings',\n currentPath: '/admin/plugins/ai-search/settings',\n user: data.user,\n content: content\n })\n}\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { requireAuth } from '../../../../middleware'\nimport { AISearchService } from '../services/ai-search'\nimport { IndexManager } from '../services/indexer'\nimport { renderSettingsPage } from '../components/settings-page'\nimport type { AISearchSettings, SearchQuery } from '../types'\n\ntype Variables = {\n user: {\n id: number\n email: string\n role: string\n }\n}\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminRoutes.use('*', requireAuth())\n\n/**\n * GET /admin/plugins/ai-search\n * Render settings page\n */\nadminRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const ai = (c.env as any).AI // Workers AI for embeddings\n const vectorize = (c.env as any).VECTORIZE_INDEX // Vectorize for vector search\n\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n // Get settings\n const settings = await service.getSettings()\n console.log('[AI Search Settings Route] Settings loaded:', !!settings)\n\n // Get all collections with status\n const collections = await service.getAllCollections()\n console.log('[AI Search Settings Route] Collections returned:', collections.length)\n \n // If no collections, try direct query\n if (collections.length === 0) {\n const directQuery = await db.prepare('SELECT id, name, display_name FROM collections WHERE is_active = 1').all()\n console.log('[AI Search Settings Route] Direct DB query found:', directQuery.results?.length || 0, 'collections')\n if (directQuery.results && directQuery.results.length > 0) {\n console.log('[AI Search Settings Route] Sample from DB:', directQuery.results[0])\n }\n } else if (collections.length > 0 && collections[0]) {\n console.log('[AI Search Settings Route] First collection:', {\n id: collections[0].id,\n name: collections[0].name,\n display_name: collections[0].display_name\n })\n }\n\n // Get new collections notifications\n const newCollections = await service.detectNewCollections()\n console.log('AI Search: New collections:', newCollections.length)\n\n // Get index status for all collections\n const indexStatus = await indexer.getAllIndexStatus()\n console.log('AI Search: Index status:', Object.keys(indexStatus).length)\n\n // Get analytics\n const analytics = await service.getSearchAnalytics()\n\n return c.html(\n renderSettingsPage({\n settings,\n collections: collections || [],\n newCollections: newCollections || [],\n indexStatus: indexStatus || {},\n analytics,\n user: {\n name: user.email,\n email: user.email,\n role: user.role,\n },\n })\n )\n } catch (error) {\n console.error('Error rendering AI Search settings:', error)\n return c.html(`

Error loading settings: ${error instanceof Error ? error.message : String(error)}

`, 500)\n }\n})\n\n/**\n * POST /admin/plugins/ai-search\n * Update settings\n */\nadminRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n console.log('[AI Search POST] Received body:', JSON.stringify(body, null, 2))\n\n // Get current settings\n const currentSettings = await service.getSettings()\n console.log('[AI Search POST] Current settings selected_collections:', currentSettings?.selected_collections)\n\n // Update settings\n const updatedSettings: Partial = {\n enabled: body.enabled !== undefined ? Boolean(body.enabled) : currentSettings?.enabled,\n ai_mode_enabled: body.ai_mode_enabled !== undefined ? Boolean(body.ai_mode_enabled) : currentSettings?.ai_mode_enabled,\n selected_collections: Array.isArray(body.selected_collections) ? body.selected_collections.map(String) : (currentSettings?.selected_collections || []),\n dismissed_collections: Array.isArray(body.dismissed_collections) ? body.dismissed_collections.map(String) : (currentSettings?.dismissed_collections || []),\n autocomplete_enabled: body.autocomplete_enabled !== undefined ? Boolean(body.autocomplete_enabled) : currentSettings?.autocomplete_enabled,\n cache_duration: body.cache_duration ? Number(body.cache_duration) : currentSettings?.cache_duration,\n results_limit: body.results_limit ? Number(body.results_limit) : currentSettings?.results_limit,\n index_media: body.index_media !== undefined ? Boolean(body.index_media) : currentSettings?.index_media,\n }\n\n console.log('[AI Search POST] Updated settings selected_collections:', updatedSettings.selected_collections)\n\n // If collections changed, trigger indexing\n const collectionsChanged =\n JSON.stringify(updatedSettings.selected_collections) !==\n JSON.stringify(currentSettings?.selected_collections || [])\n\n const saved = await service.updateSettings(updatedSettings)\n console.log('[AI Search POST] Settings saved, selected_collections:', saved.selected_collections)\n\n // Start indexing if collections were added\n if (collectionsChanged && updatedSettings.selected_collections) {\n console.log('[AI Search POST] Collections changed, starting background indexing')\n // Start indexing in background (non-blocking) - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .syncAll(updatedSettings.selected_collections)\n .then(() => console.log('[AI Search POST] Background indexing completed'))\n .catch((error) => console.error('[AI Search POST] Background indexing error:', error))\n )\n }\n\n return c.json({ success: true, settings: saved })\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n return c.json({ error: 'Failed to update settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/settings\n * Get settings API endpoint\n */\nadminRoutes.get('/api/settings', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const settings = await service.getSettings()\n return c.json({ success: true, data: settings })\n } catch (error) {\n console.error('Error fetching settings:', error)\n return c.json({ error: 'Failed to fetch settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/new-collections\n * Get new collections that aren't indexed or dismissed\n */\nadminRoutes.get('/api/new-collections', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const notifications = await service.detectNewCollections()\n return c.json({ success: true, data: notifications })\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return c.json({ error: 'Failed to detect new collections' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/status\n * Get indexing status\n */\nadminRoutes.get('/api/status', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const status = await indexer.getAllIndexStatus()\n return c.json({ success: true, data: status })\n } catch (error) {\n console.error('Error fetching index status:', error)\n return c.json({ error: 'Failed to fetch status' }, 500)\n }\n})\n\n/**\n * POST /admin/api/ai-search/reindex\n * Trigger re-indexing for a collection\n */\nadminRoutes.post('/api/reindex', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n const collectionIdRaw: unknown = body.collection_id\n const collectionId = collectionIdRaw ? String(collectionIdRaw) : ''\n\n if (!collectionId || collectionId === 'undefined' || collectionId === 'null') {\n return c.json({ error: 'collection_id is required' }, 400)\n }\n\n // Start indexing in background - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .indexCollection(collectionId)\n .then(() => console.log(`[AI Search Reindex] Completed for collection ${collectionId}`))\n .catch((error) => console.error(`[AI Search Reindex] Error for collection ${collectionId}:`, error))\n )\n\n return c.json({ success: true, message: 'Re-indexing started' })\n } catch (error) {\n console.error('Error starting re-index:', error)\n return c.json({ error: 'Failed to start re-indexing' }, 500)\n }\n})\n\nexport default adminRoutes\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { AISearchService } from '../services/ai-search'\nimport type { SearchQuery } from '../types'\n\ntype Variables = {\n user?: {\n id: number\n email: string\n role: string\n }\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * POST /api/search\n * Execute search query\n */\napiRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const body = await c.req.json()\n\n const query: SearchQuery = {\n query: body.query || '',\n mode: body.mode || 'keyword',\n filters: body.filters || {},\n limit: body.limit ? Number(body.limit) : undefined,\n offset: body.offset ? Number(body.offset) : undefined,\n }\n\n // Convert date strings to Date objects if present\n if (query.filters?.dateRange) {\n if (typeof query.filters.dateRange.start === 'string') {\n query.filters.dateRange.start = new Date(query.filters.dateRange.start)\n }\n if (typeof query.filters.dateRange.end === 'string') {\n query.filters.dateRange.end = new Date(query.filters.dateRange.end)\n }\n }\n\n const results = await service.search(query)\n\n return c.json({\n success: true,\n data: results,\n })\n } catch (error) {\n console.error('Search error:', error)\n return c.json(\n {\n success: false,\n error: 'Search failed',\n message: error instanceof Error ? error.message : String(error),\n },\n 500\n )\n }\n})\n\n/**\n * GET /api/search/suggest\n * Get search suggestions (autocomplete)\n */\napiRoutes.get('/suggest', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const query = c.req.query('q') || ''\n\n if (!query || query.length < 2) {\n return c.json({ success: true, data: [] })\n }\n\n const suggestions = await service.getSearchSuggestions(query)\n\n return c.json({\n success: true,\n data: suggestions,\n })\n } catch (error) {\n console.error('Suggestions error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get suggestions',\n },\n 500\n )\n }\n})\n\n/**\n * GET /admin/api/search/analytics\n * Get search analytics\n */\napiRoutes.get('/analytics', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const analytics = await service.getSearchAnalytics()\n\n return c.json({\n success: true,\n data: analytics,\n })\n } catch (error) {\n console.error('Analytics error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get analytics',\n },\n 500\n )\n }\n})\n\nexport default apiRoutes\n","{\n \"id\": \"ai-search\",\n \"name\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"icon\": \"magnifying-glass\",\n \"homepage\": \"https://developers.cloudflare.com/ai-search/\",\n \"repository\": \"https://github.com/sonicjs/sonicjs\",\n \"license\": \"MIT\",\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"configSchema\": {\n \"enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI Search\",\n \"description\": \"Enable or disable AI Search functionality\",\n \"default\": true\n },\n \"ai_mode_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI/Semantic Search\",\n \"description\": \"Enable AI-powered semantic search (requires Cloudflare Workers AI binding)\",\n \"default\": false\n },\n \"ai_provider\": {\n \"type\": \"string\",\n \"label\": \"AI Provider\",\n \"description\": \"Which AI service to use for semantic search\",\n \"default\": \"cloudflare\",\n \"enum\": [\n \"cloudflare\",\n \"keyword-only\"\n ]\n },\n \"autocomplete_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable Autocomplete\",\n \"description\": \"Show search suggestions as user types\",\n \"default\": true\n },\n \"cache_duration\": {\n \"type\": \"number\",\n \"label\": \"Cache Duration (hours)\",\n \"description\": \"How long to cache search results\",\n \"default\": 1,\n \"min\": 0,\n \"max\": 24\n },\n \"results_limit\": {\n \"type\": \"number\",\n \"label\": \"Results Per Page\",\n \"description\": \"Maximum number of results to show per page\",\n \"default\": 20,\n \"min\": 10,\n \"max\": 100\n },\n \"index_media\": {\n \"type\": \"boolean\",\n \"label\": \"Index Media Metadata\",\n \"description\": \"Include R2 media files in search index\",\n \"default\": false\n }\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"href\": \"/admin/plugins/ai-search\",\n \"parentId\": \"plugins\",\n \"order\": 50\n },\n \"codeName\": \"ai-search-plugin\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { AISearchService } from './services/ai-search'\nimport { IndexManager } from './services/indexer'\nimport adminRoutes from './routes/admin'\nimport apiRoutes from './routes/api'\nimport manifest from './manifest.json'\n\n/**\n * AI Search Plugin\n * \n * Provides advanced search capabilities using Cloudflare AI Search.\n * Features:\n * - Semantic/AI-powered search with natural language queries\n * - Traditional keyword search\n * - Full-text search across all content collections\n * - Advanced filtering (collections, dates, status, tags)\n * - Autocomplete suggestions\n * - Search analytics\n * - Dynamic collection discovery and indexing\n * \n * @example\n * ```typescript\n * import { AISearchService } from '@sonicjs-cms/core/plugins'\n * \n * const service = new AISearchService(db, aiSearch)\n * const results = await service.search({\n * query: 'blog posts about security',\n * mode: 'ai',\n * filters: { collections: [1, 2] }\n * })\n * ```\n */\n\nexport const aiSearchPlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('aiSearch', AISearchService)\n .addService('indexManager', IndexManager)\n .addRoute('/admin/plugins/ai-search', adminRoutes as any)\n .addRoute('/api/search', apiRoutes as any)\n .build()\n\n// Export services and types for easy import\nexport { AISearchService } from './services/ai-search'\nexport { IndexManager } from './services/indexer'\nexport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n IndexStatus,\n} from './types'\n","/**\n * Magic Link Authentication Plugin\n *\n * Provides passwordless authentication via email magic links\n * Users receive a secure one-time link to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\nimport type { Plugin, PluginContext } from '../../types'\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { AuthManager, getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst magicLinkRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nexport function createMagicLinkAuthPlugin(): Plugin {\n const magicLinkRoutes = new Hono()\n\n // Request a magic link\n magicLinkRoutes.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = magicLinkRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB as D1Database\n\n // Check rate limiting\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n const recentLinks = await db.prepare(`\n SELECT COUNT(*) as count\n FROM magic_links\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as any\n\n const rateLimitPerHour = 5 // TODO: Get from plugin settings\n if (recentLinks && recentLinks.count >= rateLimitPerHour) {\n return c.json({\n error: 'Too many requests. Please try again later.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && !allowNewUsers) {\n // Don't reveal if user exists or not for security\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.'\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Generate secure token\n const token = crypto.randomUUID() + '-' + crypto.randomUUID()\n const tokenId = crypto.randomUUID()\n const linkExpiryMinutes = 15 // TODO: Get from plugin settings\n const expiresAt = Date.now() + (linkExpiryMinutes * 60 * 1000)\n\n // Store magic link\n await db.prepare(`\n INSERT INTO magic_links (\n id, user_email, token, expires_at, used, created_at, ip_address, user_agent\n ) VALUES (?, ?, ?, ?, 0, ?, ?, ?)\n `).bind(\n tokenId,\n normalizedEmail,\n token,\n expiresAt,\n Date.now(),\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown',\n c.req.header('user-agent') || 'unknown'\n ).run()\n\n // Generate magic link URL\n const baseUrl = new URL(c.req.url).origin\n const magicLink = `${baseUrl}/auth/magic-link/verify?token=${token}`\n\n // Send email via email plugin\n try {\n const emailPlugin = c.env.plugins?.get('email')\n if (emailPlugin && emailPlugin.sendEmail) {\n await emailPlugin.sendEmail({\n to: normalizedEmail,\n subject: 'Your Magic Link to Sign In',\n html: renderMagicLinkEmail(magicLink, linkExpiryMinutes)\n })\n } else {\n console.error('Email plugin not available')\n // In production, this should fail. For now, log the link for testing\n console.log(`Magic link for ${normalizedEmail}: ${magicLink}`)\n }\n } catch (error) {\n console.error('Failed to send magic link email:', error)\n return c.json({\n error: 'Failed to send email. Please try again later.'\n }, 500)\n }\n\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.',\n // For development only - remove in production\n ...(c.env.ENVIRONMENT === 'development' && { dev_link: magicLink })\n })\n } catch (error) {\n console.error('Magic link request error:', error)\n return c.json({ error: 'Failed to process request' }, 500)\n }\n })\n\n // Verify magic link and sign in\n magicLinkRoutes.get('/verify', async (c: any) => {\n try {\n const token = c.req.query('token')\n\n if (!token) {\n return c.redirect('/auth/login?error=Invalid magic link')\n }\n\n const db = c.env.DB as D1Database\n\n // Find magic link\n const magicLink = await db.prepare(`\n SELECT * FROM magic_links\n WHERE token = ? AND used = 0\n `).bind(token).first() as any\n\n if (!magicLink) {\n return c.redirect('/auth/login?error=Invalid or expired magic link')\n }\n\n // Check expiration\n if (magicLink.expires_at < Date.now()) {\n return c.redirect('/auth/login?error=This magic link has expired')\n }\n\n // Get or create user\n let user = await db.prepare(`\n SELECT * FROM users WHERE email = ? AND is_active = 1\n `).bind(magicLink.user_email).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && allowNewUsers) {\n // Create new user\n const userId = crypto.randomUUID()\n const username = magicLink.user_email.split('@')[0]\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 1, ?, ?)\n `).bind(\n userId,\n magicLink.user_email,\n username,\n username,\n '',\n now,\n now\n ).run()\n\n user = {\n id: userId,\n email: magicLink.user_email,\n username,\n role: 'viewer'\n }\n } else if (!user) {\n return c.redirect('/auth/login?error=No account found for this email')\n }\n\n // Mark magic link as used\n await db.prepare(`\n UPDATE magic_links\n SET used = 1, used_at = ?\n WHERE id = ?\n `).bind(Date.now(), magicLink.id).run()\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwtToken = await AuthManager.generateToken(\n user.id,\n user.email,\n user.role,\n (c.env as any).JWT_SECRET,\n tokenTtl\n )\n\n // Set auth cookie\n AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl })\n\n // Update last login\n await db.prepare(`\n UPDATE users SET last_login_at = ? WHERE id = ?\n `).bind(Date.now(), user.id).run()\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?message=Successfully signed in')\n } catch (error) {\n console.error('Magic link verification error:', error)\n return c.redirect('/auth/login?error=Authentication failed')\n }\n })\n\n return {\n name: 'magic-link-auth',\n version: '1.0.0',\n description: 'Passwordless authentication via email magic links',\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n dependencies: ['email'],\n\n routes: [{\n path: '/auth/magic-link',\n handler: magicLinkRoutes,\n description: 'Magic link authentication endpoints',\n requiresAuth: false\n }],\n\n async install(context: PluginContext) {\n console.log('Installing magic-link-auth plugin...')\n // Migration is handled by plugin system\n },\n\n async activate(context: PluginContext) {\n console.log('Magic link authentication activated')\n console.log('Users can now sign in via /auth/magic-link/request')\n },\n\n async deactivate(context: PluginContext) {\n console.log('Magic link authentication deactivated')\n },\n\n async uninstall(context: PluginContext) {\n console.log('Uninstalling magic-link-auth plugin...')\n // Optionally clean up magic_links table\n // await context.db.prepare('DROP TABLE IF EXISTS magic_links').run()\n }\n }\n}\n\n/**\n * Render magic link email template\n */\nfunction renderMagicLinkEmail(magicLink: string, expiryMinutes: number): string {\n return `\n \n \n \n \n \n Your Magic Link\n \n \n \n
\n
\n

🔗 Your Magic Link

\n
\n\n
\n

Hello!

\n

You requested a magic link to sign in to your account. Click the button below to continue:

\n\n
\n Sign In\n
\n\n

⏰ This link expires in ${expiryMinutes} minutes

\n\n
\n Security Notice: If you didn't request this link, you can safely ignore this email.\n Someone may have entered your email address by mistake.\n
\n
\n\n
\n

This is an automated email from SonicJS.

\n

For security, this link can only be used once.

\n
\n
\n \n \n `\n}\n\nexport default createMagicLinkAuthPlugin()\n","export type SecurityEventType =\n | 'login_success'\n | 'login_failure'\n | 'registration'\n | 'password_reset_request'\n | 'password_reset_complete'\n | 'account_lockout'\n | 'suspicious_activity'\n | 'logout'\n | 'permission_denied'\n\nexport type SecuritySeverity = 'info' | 'warning' | 'critical'\n\nexport interface SecurityEvent {\n id: string\n eventType: SecurityEventType\n severity: SecuritySeverity\n userId?: string | null\n email?: string | null\n ipAddress?: string | null\n userAgent?: string | null\n countryCode?: string | null\n requestPath?: string | null\n requestMethod?: string | null\n details?: Record | null\n fingerprint?: string | null\n blocked: boolean\n createdAt: number\n}\n\nexport interface SecurityEventInsert {\n eventType: SecurityEventType\n severity?: SecuritySeverity\n userId?: string\n email?: string\n ipAddress?: string\n userAgent?: string\n countryCode?: string\n requestPath?: string\n requestMethod?: string\n details?: Record\n fingerprint?: string\n blocked?: boolean\n}\n\nexport interface SecurityEventFilters {\n eventType?: SecurityEventType | SecurityEventType[]\n severity?: SecuritySeverity | SecuritySeverity[]\n email?: string\n ipAddress?: string\n search?: string\n startDate?: number\n endDate?: number\n blocked?: boolean\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'event_type' | 'severity'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SecurityStats {\n totalEvents: number\n failedLogins24h: number\n failedLoginsTrend: number // percentage change vs prior 24h\n activeLockouts: number\n flaggedIPs: number\n eventsByType: Record\n eventsBySeverity: Record\n}\n\nexport interface TopIP {\n ipAddress: string\n countryCode: string | null\n failedAttempts: number\n lastSeen: number\n locked: boolean\n}\n\nexport interface HourlyBucket {\n hour: string\n count: number\n}\n\nexport interface SecurityAuditSettings {\n retention: {\n daysToKeep: number\n maxEvents: number\n autoPurge: boolean\n }\n bruteForce: {\n enabled: boolean\n maxFailedAttemptsPerIP: number\n maxFailedAttemptsPerEmail: number\n windowMinutes: number\n lockoutDurationMinutes: number\n alertThreshold: number\n }\n logging: {\n logSuccessfulLogins: boolean\n logLogouts: boolean\n logRegistrations: boolean\n logPasswordResets: boolean\n logPermissionDenied: boolean\n }\n}\n\nexport const DEFAULT_SETTINGS: SecurityAuditSettings = {\n retention: {\n daysToKeep: 90,\n maxEvents: 100000,\n autoPurge: true\n },\n bruteForce: {\n enabled: true,\n maxFailedAttemptsPerIP: 10,\n maxFailedAttemptsPerEmail: 5,\n windowMinutes: 15,\n lockoutDurationMinutes: 30,\n alertThreshold: 20\n },\n logging: {\n logSuccessfulLogins: true,\n logLogouts: true,\n logRegistrations: true,\n logPasswordResets: true,\n logPermissionDenied: true\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n SecurityEvent,\n SecurityEventInsert,\n SecurityEventFilters,\n SecurityStats,\n TopIP,\n HourlyBucket,\n SecurityAuditSettings\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nexport class SecurityAuditService {\n constructor(\n private db: D1Database,\n private settings: SecurityAuditSettings = DEFAULT_SETTINGS\n ) {}\n\n async logEvent(event: SecurityEventInsert): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO security_events (id, event_type, severity, user_id, email, ip_address, user_agent, country_code, request_path, request_method, details, fingerprint, blocked, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n event.eventType,\n event.severity || 'info',\n event.userId || null,\n event.email || null,\n event.ipAddress || null,\n event.userAgent || null,\n event.countryCode || null,\n event.requestPath || null,\n event.requestMethod || null,\n event.details ? JSON.stringify(event.details) : null,\n event.fingerprint || null,\n event.blocked ? 1 : 0,\n now\n ).run()\n\n return id\n }\n\n async getEvents(filters: SecurityEventFilters = {}): Promise<{ events: SecurityEvent[], total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.eventType) {\n if (Array.isArray(filters.eventType)) {\n conditions.push(`event_type IN (${filters.eventType.map(() => '?').join(',')})`)\n params.push(...filters.eventType)\n } else {\n conditions.push('event_type = ?')\n params.push(filters.eventType)\n }\n }\n\n if (filters.severity) {\n if (Array.isArray(filters.severity)) {\n conditions.push(`severity IN (${filters.severity.map(() => '?').join(',')})`)\n params.push(...filters.severity)\n } else {\n conditions.push('severity = ?')\n params.push(filters.severity)\n }\n }\n\n if (filters.email) {\n conditions.push('email LIKE ?')\n params.push(`%${filters.email}%`)\n }\n\n if (filters.ipAddress) {\n conditions.push('ip_address LIKE ?')\n params.push(`%${filters.ipAddress}%`)\n }\n\n if (filters.search) {\n conditions.push('(email LIKE ? OR ip_address LIKE ? OR details LIKE ?)')\n params.push(`%${filters.search}%`, `%${filters.search}%`, `%${filters.search}%`)\n }\n\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n if (filters.blocked !== undefined) {\n conditions.push('blocked = ?')\n params.push(filters.blocked ? 1 : 0)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const page = filters.page || 1\n const limit = filters.limit || 50\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM security_events ${where}`\n ).bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get page of results\n const results = await this.db.prepare(\n `SELECT * FROM security_events ${where} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...params, limit, offset).all()\n\n const events: SecurityEvent[] = (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n\n return { events, total }\n }\n\n async getEvent(id: string): Promise {\n const row = await this.db.prepare(\n 'SELECT * FROM security_events WHERE id = ?'\n ).bind(id).first()\n\n if (!row) return null\n\n return {\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }\n }\n\n async getStats(): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n const h48 = now - 48 * 60 * 60 * 1000\n\n // Total events\n const totalResult = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM security_events'\n ).first<{ count: number }>()\n\n // Failed logins last 24h\n const failed24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ?\"\n ).bind(h24).first<{ count: number }>()\n\n // Failed logins prior 24h (for trend)\n const failedPrior24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ? AND created_at < ?\"\n ).bind(h48, h24).first<{ count: number }>()\n\n const failed24h = failed24hResult?.count || 0\n const failedPrior24h = failedPrior24hResult?.count || 0\n const trend = failedPrior24h > 0\n ? Math.round(((failed24h - failedPrior24h) / failedPrior24h) * 100)\n : (failed24h > 0 ? 100 : 0)\n\n // Active lockouts (events in last lockout window)\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutsResult = await this.db.prepare(\n \"SELECT COUNT(DISTINCT ip_address) as count FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).first<{ count: number }>()\n\n // Flagged IPs (IPs with more than threshold failed attempts in window)\n const windowStart = now - (this.settings.bruteForce.windowMinutes * 60 * 1000)\n const flaggedResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM (\n SELECT ip_address FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address HAVING COUNT(*) >= ?\n )`\n ).bind(windowStart, this.settings.bruteForce.maxFailedAttemptsPerIP).first<{ count: number }>()\n\n // Events by type\n const typeResults = await this.db.prepare(\n 'SELECT event_type, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY event_type'\n ).bind(h24).all()\n\n const eventsByType: Record = {}\n for (const row of (typeResults.results || []) as any[]) {\n eventsByType[row.event_type] = row.count\n }\n\n // Events by severity\n const severityResults = await this.db.prepare(\n 'SELECT severity, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY severity'\n ).bind(h24).all()\n\n const eventsBySeverity: Record = {}\n for (const row of (severityResults.results || []) as any[]) {\n eventsBySeverity[row.severity] = row.count\n }\n\n return {\n totalEvents: totalResult?.count || 0,\n failedLogins24h: failed24h,\n failedLoginsTrend: trend,\n activeLockouts: lockoutsResult?.count || 0,\n flaggedIPs: flaggedResult?.count || 0,\n eventsByType,\n eventsBySeverity\n }\n }\n\n async getTopIPs(limit: number = 10): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n\n const results = await this.db.prepare(`\n SELECT\n ip_address,\n country_code,\n COUNT(*) as failed_attempts,\n MAX(created_at) as last_seen\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address\n ORDER BY failed_attempts DESC\n LIMIT ?\n `).bind(h24, limit).all()\n\n // Check which IPs are locked\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutResults = await this.db.prepare(\n \"SELECT DISTINCT ip_address FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).all()\n\n const lockedIPs = new Set((lockoutResults.results || []).map((r: any) => r.ip_address))\n\n return (results.results || []).map((row: any) => ({\n ipAddress: row.ip_address,\n countryCode: row.country_code,\n failedAttempts: row.failed_attempts,\n lastSeen: row.last_seen,\n locked: lockedIPs.has(row.ip_address)\n }))\n }\n\n async getHourlyTrend(hours: number = 24): Promise {\n const now = Date.now()\n const start = now - hours * 60 * 60 * 1000\n\n // Build hourly buckets\n const buckets: HourlyBucket[] = []\n for (let i = 0; i < hours; i++) {\n const bucketStart = start + i * 60 * 60 * 1000\n const date = new Date(bucketStart)\n buckets.push({\n hour: `${date.getUTCHours().toString().padStart(2, '0')}:00`,\n count: 0\n })\n }\n\n const results = await this.db.prepare(`\n SELECT\n CAST((created_at - ?) / 3600000 AS INTEGER) as bucket,\n COUNT(*) as count\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY bucket\n ORDER BY bucket\n `).bind(start, start).all()\n\n for (const row of (results.results || []) as any[]) {\n const idx = row.bucket\n if (idx >= 0 && idx < buckets.length) {\n buckets[idx]!.count = row.count\n }\n }\n\n return buckets\n }\n\n async purgeOldEvents(daysToKeep?: number): Promise {\n const days = daysToKeep || this.settings.retention.daysToKeep\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000\n\n const result = await this.db.prepare(\n 'DELETE FROM security_events WHERE created_at < ?'\n ).bind(cutoff).run()\n\n return (result.meta as any)?.changes || 0\n }\n\n async getRecentCriticalEvents(limit: number = 20): Promise {\n const results = await this.db.prepare(\n \"SELECT * FROM security_events WHERE severity = 'critical' ORDER BY created_at DESC LIMIT ?\"\n ).bind(limit).all()\n\n return (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n }\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityStats, TopIP, HourlyBucket, SecurityEvent } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecurityDashboardData {\n stats: SecurityStats\n topIPs: TopIP[]\n hourlyTrend: HourlyBucket[]\n recentCritical: SecurityEvent[]\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n const now = Date.now()\n const diff = now - ts\n\n if (diff < 60000) return 'just now'\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n return labels[type] || type\n}\n\nfunction trendArrow(trend: number): string {\n if (trend > 0) return `+${trend}%`\n if (trend < 0) return `${trend}%`\n return `0%`\n}\n\nfunction renderBarChart(data: HourlyBucket[]): string {\n if (data.length === 0) return '

No data available

'\n\n const max = Math.max(...data.map(d => d.count), 1)\n\n const bars = data.map(d => {\n const height = Math.max((d.count / max) * 100, 2)\n const color = d.count === 0\n ? 'bg-zinc-200 dark:bg-zinc-700'\n : d.count >= max * 0.75\n ? 'bg-red-500'\n : d.count >= max * 0.5\n ? 'bg-amber-500'\n : 'bg-cyan-500'\n return `\n
\n
\n \n
\n
\n 12 ? 'hidden sm:block' : ''}\">${d.hour}\n
\n `\n }).join('')\n\n return `
${bars}
`\n}\n\nexport function renderSecurityDashboard(data: SecurityDashboardData): string {\n const { stats, topIPs, hourlyTrend, recentCritical, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Dashboard

\n

\n Monitor login attempts, brute-force detection, and security events.\n

\n
\n \n
\n\n \n
\n
\n

Total Events

\n

${stats.totalEvents.toLocaleString()}

\n
\n
\n

Failed Logins (24h)

\n

\n ${stats.failedLogins24h}\n ${trendArrow(stats.failedLoginsTrend)}\n

\n
\n
\n

Active Lockouts

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${stats.activeLockouts}

\n
\n
\n

Flagged IPs

\n

0 ? 'text-amber-600 dark:text-amber-400' : 'text-zinc-950 dark:text-white'}\">${stats.flaggedIPs}

\n
\n
\n\n \n
\n \n
\n

Failed Login Attempts (24h)

\n ${renderBarChart(hourlyTrend)}\n
\n\n \n
\n

Events by Type (24h)

\n
\n ${Object.entries(stats.eventsByType).length === 0\n ? '

No events in the last 24 hours

'\n : Object.entries(stats.eventsByType)\n .sort(([, a], [, b]) => b - a)\n .map(([type, count]) => {\n const total = Object.values(stats.eventsByType).reduce((s, v) => s + v, 0)\n const pct = total > 0 ? Math.round((count / total) * 100) : 0\n return `\n
\n
\n ${eventTypeBadge(type)}\n ${count}\n
\n
\n
\n
\n
\n `\n }).join('')\n }\n
\n
\n
\n\n \n
\n \n
\n
\n

Top IPs by Failed Logins (24h)

\n
\n ${topIPs.length === 0\n ? '

No failed login attempts

'\n : `\n \n \n \n \n \n \n \n \n \n ${topIPs.map(ip => `\n \n \n \n \n \n \n `).join('')}\n \n
IP AddressCountryAttemptsStatus
${ip.ipAddress}${ip.countryCode || '-'}= 10 ? 'text-red-600 dark:text-red-400' : 'text-zinc-900 dark:text-zinc-100'}\">${ip.failedAttempts}\n ${ip.locked\n ? 'Locked'\n : 'Active'\n }\n
`\n }\n
\n\n \n
\n
\n

Recent Critical Events

\n
\n ${recentCritical.length === 0\n ? '

No critical events

'\n : `
\n ${recentCritical.slice(0, 10).map(event => `\n
\n
\n
\n ${severityBadge(event.severity)}\n ${eventTypeBadge(event.eventType)}\n
\n ${formatTimestamp(event.createdAt)}\n
\n
\n ${event.ipAddress ? `IP: ${event.ipAddress}` : ''}\n ${event.email ? ` | ${event.email}` : ''}\n
\n
\n `).join('')}\n
`\n }\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Dashboard',\n pageTitle: 'Security Dashboard',\n currentPath: '/admin/plugins/security-audit',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityEvent, SecurityEventFilters } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface EventLogPageData {\n events: SecurityEvent[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n }\n filters: SecurityEventFilters\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const colors: Record = {\n login_success: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400',\n login_failure: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n registration: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n account_lockout: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n suspicious_activity: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\n logout: 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400',\n password_reset_request: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n permission_denied: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400'\n }\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n const color = colors[type] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400'\n return `${labels[type] || type}`\n}\n\nfunction buildFilterUrl(filters: SecurityEventFilters, overrides: Record = {}): string {\n const params = new URLSearchParams()\n if (filters.eventType && !overrides.type) params.set('type', String(filters.eventType))\n if (filters.severity && !overrides.severity) params.set('severity', String(filters.severity))\n if (filters.email && !overrides.email) params.set('email', filters.email)\n if (filters.ipAddress && !overrides.ip) params.set('ip', filters.ipAddress)\n if (filters.search && !overrides.search) params.set('search', filters.search)\n\n for (const [key, value] of Object.entries(overrides)) {\n if (value) params.set(key, value)\n }\n\n const qs = params.toString()\n return `/admin/plugins/security-audit/events${qs ? '?' + qs : ''}`\n}\n\nexport function renderEventLogPage(data: EventLogPageData): string {\n const { events, pagination, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Event Log

\n

\n Browse and filter all security events. Showing ${pagination.startItem}-${pagination.endItem} of ${pagination.totalItems}.\n

\n
\n \n
\n\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n Clear\n \n
\n
\n
\n\n \n
\n ${events.length === 0\n ? `
\n \n \n \n

No events found

\n

No security events match your current filters.

\n
`\n : `
\n \n \n \n \n \n \n \n \n \n \n \n \n \n ${events.map(event => `\n \n \n \n \n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimeTypeSeverityEmailIP AddressCountryStatus
${formatTimestamp(event.createdAt)}${eventTypeBadge(event.eventType)}${severityBadge(event.severity)}${event.email || '-'}${event.ipAddress || '-'}${event.countryCode || '-'}\n ${event.blocked\n ? 'Blocked'\n : 'Allowed'\n }\n
\n
\n
Event ID: ${event.id.substring(0, 8)}...
\n
User Agent: ${event.userAgent || '-'}
\n
Path: ${event.requestPath || '-'}
\n
Fingerprint: ${event.fingerprint || '-'}
\n ${event.details ? `
Details:
${JSON.stringify(event.details, null, 2)}
` : ''}\n
\n
\n
`\n }\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n Page ${pagination.currentPage} of ${pagination.totalPages}\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : ''}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : ''}\n
\n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Event Log',\n pageTitle: 'Security Event Log',\n currentPath: '/admin/plugins/security-audit/events',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityAuditSettings } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecuritySettingsPageData {\n settings: SecurityAuditSettings\n user?: BaseUser\n version?: string\n message?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSecuritySettingsPage(data: SecuritySettingsPageData): string {\n const { settings, user, version, message, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Audit Settings

\n

\n Configure brute-force detection thresholds, event logging, and data retention.\n

\n
\n \n
\n\n ${message ? `\n
\n

${message}

\n
\n ` : ''}\n\n
\n\n \n
\n

Brute-Force Detection

\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n

Events above this count trigger critical severity

\n
\n
\n
\n\n \n
\n

Event Logging

\n
\n \n \n \n \n \n
\n
\n\n \n
\n

Data Retention

\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n\n \n
\n \n \n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Audit Settings',\n pageTitle: 'Security Audit Settings',\n currentPath: '/admin/plugins/security-audit/settings',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { PluginService } from '../../../../services'\nimport { renderSecurityDashboard, SecurityDashboardData } from '../components/dashboard-page'\nimport { renderEventLogPage, EventLogPageData } from '../components/event-log-page'\nimport { renderSecuritySettingsPage, SecuritySettingsPageData } from '../components/settings-page'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const [stats, topIPs, hourlyTrend, recentCritical] = await Promise.all([\n service.getStats(),\n service.getTopIPs(10),\n service.getHourlyTrend(24),\n service.getRecentCriticalEvents(20)\n ])\n\n const pageData: SecurityDashboardData = {\n stats,\n topIPs,\n hourlyTrend,\n recentCritical,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecurityDashboard(pageData))\n})\n\n// Event log\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n\n const filters = {\n eventType: (c.req.query('type') as SecurityEventType) || undefined,\n severity: (c.req.query('severity') as SecuritySeverity) || undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n page,\n limit\n }\n\n const { events, total } = await service.getEvents(filters)\n const totalPages = Math.ceil(total / limit)\n\n const pageData: EventLogPageData = {\n events,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: total === 0 ? 0 : (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total)\n },\n filters,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderEventLogPage(pageData))\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const pageData: SecuritySettingsPageData = {\n settings,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n message: c.req.query('message') || undefined,\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecuritySettingsPage(pageData))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const settings: SecurityAuditSettings = {\n bruteForce: {\n enabled: body['bruteForce.enabled'] === 'true',\n maxFailedAttemptsPerIP: parseInt(body['bruteForce.maxFailedAttemptsPerIP'] as string) || 10,\n maxFailedAttemptsPerEmail: parseInt(body['bruteForce.maxFailedAttemptsPerEmail'] as string) || 5,\n windowMinutes: parseInt(body['bruteForce.windowMinutes'] as string) || 15,\n lockoutDurationMinutes: parseInt(body['bruteForce.lockoutDurationMinutes'] as string) || 30,\n alertThreshold: parseInt(body['bruteForce.alertThreshold'] as string) || 20\n },\n logging: {\n logSuccessfulLogins: body['logging.logSuccessfulLogins'] === 'true',\n logLogouts: body['logging.logLogouts'] === 'true',\n logRegistrations: body['logging.logRegistrations'] === 'true',\n logPasswordResets: body['logging.logPasswordResets'] === 'true',\n logPermissionDenied: body['logging.logPermissionDenied'] === 'true'\n },\n retention: {\n daysToKeep: parseInt(body['retention.daysToKeep'] as string) || 90,\n maxEvents: parseInt(body['retention.maxEvents'] as string) || 100000,\n autoPurge: body['retention.autoPurge'] === 'true'\n }\n }\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings('security-audit', settings)\n\n // For HTMX requests, return 200\n if (c.req.header('HX-Request')) {\n return c.json({ success: true })\n }\n\n return c.redirect('/admin/plugins/security-audit/settings?message=Settings saved successfully')\n})\n\nexport { adminRoutes as securityAuditAdminRoutes }\n","import type { KVNamespace } from '@cloudflare/workers-types'\nimport type { SecurityAuditSettings } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst KV_PREFIX = 'security:bf:'\nconst LOCK_PREFIX = 'security:locked:'\n\nexport class BruteForceDetector {\n private settings: SecurityAuditSettings['bruteForce']\n\n constructor(\n private kv: KVNamespace,\n settings?: SecurityAuditSettings['bruteForce']\n ) {\n this.settings = settings || DEFAULT_SETTINGS.bruteForce\n }\n\n async recordFailedAttempt(ip: string, email: string): Promise<{\n ipCount: number\n emailCount: number\n shouldLockIP: boolean\n shouldLockEmail: boolean\n isSuspicious: boolean\n }> {\n if (!this.settings.enabled || !this.kv) {\n return { ipCount: 0, emailCount: 0, shouldLockIP: false, shouldLockEmail: false, isSuspicious: false }\n }\n\n const now = Date.now()\n const windowMs = this.settings.windowMinutes * 60 * 1000\n\n // Increment IP counter\n const ipKey = `${KV_PREFIX}ip:${ip}`\n const ipCount = await this.incrementCounter(ipKey, windowMs)\n\n // Increment email counter\n const emailKey = `${KV_PREFIX}email:${email}`\n const emailCount = await this.incrementCounter(emailKey, windowMs)\n\n // Check for multi-email from single IP (suspicious)\n const ipEmailsKey = `${KV_PREFIX}ip-emails:${ip}`\n await this.addToSet(ipEmailsKey, email, windowMs)\n const emailsFromIP = await this.getSetSize(ipEmailsKey)\n const isSuspicious = emailsFromIP >= 5\n\n const shouldLockIP = ipCount >= this.settings.maxFailedAttemptsPerIP\n const shouldLockEmail = emailCount >= this.settings.maxFailedAttemptsPerEmail\n\n return { ipCount, emailCount, shouldLockIP, shouldLockEmail, isSuspicious }\n }\n\n async isLocked(ip: string, email: string): Promise<{ locked: boolean, reason?: string }> {\n if (!this.settings.enabled || !this.kv) {\n return { locked: false }\n }\n\n const ipLocked = await this.kv.get(`${LOCK_PREFIX}ip:${ip}`)\n if (ipLocked) {\n return { locked: true, reason: 'IP address temporarily locked due to excessive failed login attempts' }\n }\n\n const emailLocked = await this.kv.get(`${LOCK_PREFIX}email:${email}`)\n if (emailLocked) {\n return { locked: true, reason: 'Account temporarily locked due to excessive failed login attempts' }\n }\n\n return { locked: false }\n }\n\n async lockIP(ip: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}ip:${ip}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_ip'\n }), { expirationTtl: ttl })\n }\n\n async lockEmail(email: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}email:${email}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_email'\n }), { expirationTtl: ttl })\n }\n\n async unlockIP(ip: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}ip:${ip}`)\n }\n\n async unlockEmail(email: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}email:${email}`)\n }\n\n async getActiveLockouts(): Promise> {\n if (!this.kv) return []\n // KV list with prefix to find all active lockouts\n const ipLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}ip:` })\n const emailLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}email:` })\n\n const lockouts: Array<{ key: string, type: 'ip' | 'email', value: string, lockedAt: number }> = []\n\n for (const key of ipLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'ip',\n value: key.name.replace(`${LOCK_PREFIX}ip:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n for (const key of emailLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'email',\n value: key.name.replace(`${LOCK_PREFIX}email:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n return lockouts\n }\n\n async releaseLockout(key: string): Promise {\n if (!this.kv) return\n await this.kv.delete(key)\n }\n\n isAboveAlertThreshold(count: number): boolean {\n return count >= this.settings.alertThreshold\n }\n\n private async incrementCounter(key: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n const now = Date.now()\n\n let entries: number[] = []\n if (existing) {\n try {\n entries = JSON.parse(existing)\n } catch {\n entries = []\n }\n }\n\n // Remove expired entries\n const cutoff = now - windowMs\n entries = entries.filter(ts => ts > cutoff)\n\n // Add new entry\n entries.push(now)\n\n // Store with TTL equal to window\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(entries), { expirationTtl: ttlSeconds })\n\n return entries.length\n }\n\n private async addToSet(key: string, value: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n let set: Record = {}\n const now = Date.now()\n const cutoff = now - windowMs\n\n if (existing) {\n try {\n set = JSON.parse(existing)\n } catch {\n set = {}\n }\n }\n\n // Remove expired entries\n for (const [k, ts] of Object.entries(set)) {\n if (ts < cutoff) delete set[k]\n }\n\n set[value] = now\n\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(set), { expirationTtl: ttlSeconds })\n }\n\n private async getSetSize(key: string): Promise {\n const existing = await this.kv.get(key)\n if (!existing) return 0\n\n try {\n const set = JSON.parse(existing)\n return Object.keys(set).length\n } catch {\n return 0\n }\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventFilters, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\napiRoutes.use('*', requireAuth())\n\n// Check admin role\napiRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// GET /api/security-audit/events\napiRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? Math.min(parseInt(c.req.query('limit')!), 100) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await service.getEvents(filters)\n return c.json(result)\n})\n\n// GET /api/security-audit/events/:id\napiRoutes.get('/events/:id', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const event = await service.getEvent(c.req.param('id'))\n\n if (!event) {\n return c.json({ error: 'Event not found' }, 404)\n }\n\n return c.json(event)\n})\n\n// GET /api/security-audit/stats\napiRoutes.get('/stats', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const stats = await service.getStats()\n return c.json(stats)\n})\n\n// GET /api/security-audit/stats/ips\napiRoutes.get('/stats/ips', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const limit = c.req.query('limit') ? parseInt(c.req.query('limit')!) : 10\n const ips = await service.getTopIPs(limit)\n return c.json(ips)\n})\n\n// GET /api/security-audit/stats/trend\napiRoutes.get('/stats/trend', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const hours = c.req.query('hours') ? parseInt(c.req.query('hours')!) : 24\n const trend = await service.getHourlyTrend(hours)\n return c.json(trend)\n})\n\n// GET /api/security-audit/lockouts\napiRoutes.get('/lockouts', async (c) => {\n const kv = c.env.CACHE_KV\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n const lockouts = await detector.getActiveLockouts()\n return c.json(lockouts)\n})\n\n// DELETE /api/security-audit/lockouts/:key\napiRoutes.delete('/lockouts/:key', async (c) => {\n const kv = c.env.CACHE_KV\n const key = decodeURIComponent(c.req.param('key'))\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n await detector.releaseLockout(key)\n return c.json({ success: true })\n})\n\n// POST /api/security-audit/events/purge\napiRoutes.post('/events/purge', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const body = await c.req.json().catch(() => ({})) as { daysToKeep?: number }\n const deleted = await service.purgeOldEvents(body.daysToKeep)\n return c.json({ success: true, deleted })\n})\n\n// GET /api/security-audit/export\napiRoutes.get('/export', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const format = c.req.query('format') || 'json'\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n limit: 10000,\n page: 1\n }\n\n const { events } = await service.getEvents(filters)\n\n if (format === 'csv') {\n const headers = ['id', 'event_type', 'severity', 'email', 'ip_address', 'country_code', 'blocked', 'created_at']\n const csvRows = [headers.join(',')]\n for (const event of events) {\n csvRows.push([\n event.id,\n event.eventType,\n event.severity,\n event.email || '',\n event.ipAddress || '',\n event.countryCode || '',\n event.blocked ? '1' : '0',\n new Date(event.createdAt).toISOString()\n ].map(v => `\"${String(v).replace(/\"/g, '\"\"')}\"`).join(','))\n }\n\n return new Response(csvRows.join('\\n'), {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"security-events-${Date.now()}.csv\"`\n }\n })\n }\n\n return c.json(events)\n})\n\nexport { apiRoutes as securityAuditApiRoutes }\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../../../../app'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { SecurityAuditSettings, SecurityEventType } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nfunction extractRequestInfo(c: Context<{ Bindings: Bindings; Variables: Variables }>) {\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n const countryCode = c.req.header('cf-ipcountry') || null\n const path = new URL(c.req.url).pathname\n const method = c.req.method\n\n return { ip, userAgent, countryCode, path, method }\n}\n\nfunction generateFingerprint(ip: string, userAgent: string): string {\n // Simple fingerprint from IP + UA - using a basic hash\n const str = `${ip}:${userAgent}`\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash |= 0\n }\n return Math.abs(hash).toString(36)\n}\n\nasync function getPluginSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch {\n // Plugin not installed or DB not ready\n }\n return DEFAULT_SETTINGS\n}\n\nasync function isPluginActive(db: any): Promise {\n try {\n const result = await db.prepare(\n \"SELECT status FROM plugins WHERE id = 'security-audit'\"\n ).first() as { status: string } | null\n return result?.status === 'active'\n } catch {\n return false\n }\n}\n\nexport function securityAuditMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n\n // Only intercept auth-related routes\n if (!path.startsWith('/auth/')) {\n return next()\n }\n\n const db = c.env.DB\n\n // Check if plugin is active\n if (!await isPluginActive(db)) {\n return next()\n }\n\n const settings = await getPluginSettings(db)\n const { ip, userAgent, countryCode, method } = extractRequestInfo(c)\n const fingerprint = generateFingerprint(ip, userAgent)\n\n // For login POST, extract email and check lockout before proceeding\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n let preExtractedEmail = ''\n\n if (isLoginPost) {\n try {\n if (path === '/auth/login/form') {\n // Form-based login: clone request to read formData without consuming it\n const clonedReq = c.req.raw.clone()\n const formData = await clonedReq.formData()\n preExtractedEmail = (formData.get('email') as string || '').toLowerCase()\n } else {\n // JSON login: Hono caches parsed JSON so this is safe\n const body = await c.req.json()\n preExtractedEmail = body?.email?.toLowerCase() || ''\n }\n } catch {\n // Can't parse body, continue\n }\n\n if (preExtractedEmail && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const lockStatus = await detector.isLocked(ip, preExtractedEmail)\n\n if (lockStatus.locked) {\n const service = new SecurityAuditService(db, settings)\n // Log the blocked attempt asynchronously\n const logPromise = service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: preExtractedEmail,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n blocked: true,\n details: { reason: lockStatus.reason }\n })\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n\n return c.json({\n error: lockStatus.reason || 'Too many failed attempts. Please try again later.'\n }, 429)\n }\n }\n }\n\n // Proceed with the request\n await next()\n\n // After response, log the event asynchronously\n const logPromise = logAuthEvent(c, db, settings, ip, userAgent, countryCode, fingerprint, path, method, preExtractedEmail)\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n }\n}\n\nasync function logAuthEvent(\n c: Context<{ Bindings: Bindings; Variables: Variables }>,\n db: any,\n settings: SecurityAuditSettings,\n ip: string,\n userAgent: string,\n countryCode: string | null,\n fingerprint: string,\n path: string,\n method: string,\n preExtractedEmail: string = ''\n): Promise {\n try {\n const service = new SecurityAuditService(db, settings)\n const status = c.res.status\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n const isFormLogin = path === '/auth/login/form'\n\n // Login POST\n if (isLoginPost) {\n // Determine if login succeeded or failed.\n // JSON login: 200 = success, 401/400 = failure\n // Form login: always returns 200 — check if response set an auth cookie (HX-Redirect header indicates success)\n let loginSucceeded: boolean\n if (isFormLogin) {\n // Form login redirects to /admin on success via HX-Redirect header or meta refresh\n const hxRedirect = c.res.headers.get('HX-Redirect')\n const setCookieHeader = c.res.headers.get('set-cookie') || ''\n loginSucceeded = !!(hxRedirect?.includes('/admin') || setCookieHeader.includes('auth_token'))\n } else {\n loginSucceeded = status === 200\n }\n\n if (loginSucceeded) {\n if (!settings.logging.logSuccessfulLogins) return\n\n // Try to get user info from response\n let email = preExtractedEmail\n let userId = ''\n if (!isFormLogin) {\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || email\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n }\n\n await service.logEvent({\n eventType: 'login_success',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n } else {\n // Failed login — use pre-extracted email since body is already consumed\n const email = preExtractedEmail\n\n await service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { statusCode: status }\n })\n\n // Record failed attempt for brute-force detection\n if (email && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const result = await detector.recordFailedAttempt(ip, email)\n\n if (result.shouldLockIP) {\n await detector.lockIP(ip)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_ip', attemptCount: result.ipCount }\n })\n }\n\n if (result.shouldLockEmail) {\n await detector.lockEmail(email)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_email', attemptCount: result.emailCount }\n })\n }\n\n if (result.isSuspicious) {\n await service.logEvent({\n eventType: 'suspicious_activity',\n severity: 'critical',\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'multiple_emails_from_ip', ipCount: result.ipCount }\n })\n }\n }\n }\n }\n\n // Registration POST\n if (path === '/auth/register' && method === 'POST' && settings.logging.logRegistrations) {\n if (status === 201 || status === 200) {\n let email = ''\n let userId = ''\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || ''\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n\n await service.logEvent({\n eventType: 'registration',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n }\n\n // Logout\n if (path === '/auth/logout' && settings.logging.logLogouts) {\n const user = c.get('user')\n await service.logEvent({\n eventType: 'logout',\n severity: 'info',\n userId: user?.userId,\n email: user?.email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n } catch (error) {\n console.error('[SecurityAudit] Error logging auth event:', error)\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { securityAuditAdminRoutes } from './routes/admin'\nimport { securityAuditApiRoutes } from './routes/api'\nimport { securityAuditMiddleware } from './middleware/audit-middleware'\n\nexport function createSecurityAuditPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'security-audit',\n version: '1.0.0-beta.1',\n description: 'Security event logging, brute-force detection, and analytics dashboard'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard and event log routes\n builder.addRoute('/admin/plugins/security-audit', securityAuditAdminRoutes as any, {\n description: 'Security audit dashboard and admin pages',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes\n builder.addRoute('/api/security-audit', securityAuditApiRoutes as any, {\n description: 'Security audit API endpoints',\n requiresAuth: true,\n priority: 50\n })\n\n // Admin menu item — icon is raw SVG to match sidebar rendering\n builder.addMenuItem('Security', '/admin/plugins/security-audit', {\n icon: ``,\n order: 85\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async (context) => {\n console.log('[SecurityAudit] Plugin installed')\n },\n activate: async (context) => {\n console.log('[SecurityAudit] Plugin activated')\n },\n deactivate: async (context) => {\n console.log('[SecurityAudit] Plugin deactivated')\n },\n uninstall: async (context) => {\n console.log('[SecurityAudit] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const securityAuditPlugin = createSecurityAuditPlugin()\nexport { SecurityAuditService } from './services/security-audit-service'\nexport { BruteForceDetector } from './services/brute-force-detector'\nexport { securityAuditMiddleware } from './middleware/audit-middleware'\nexport default securityAuditPlugin\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n Subscription,\n SubscriptionInsert,\n SubscriptionFilters,\n SubscriptionStats,\n SubscriptionStatus\n} from '../types'\n\n/**\n * Manages subscription records in D1\n */\nexport class SubscriptionService {\n constructor(private db: D1Database) {}\n\n /**\n * Ensure the subscriptions table exists\n */\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS subscriptions (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n user_id TEXT NOT NULL,\n stripe_customer_id TEXT NOT NULL,\n stripe_subscription_id TEXT NOT NULL UNIQUE,\n stripe_price_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'incomplete',\n current_period_start INTEGER NOT NULL DEFAULT 0,\n current_period_end INTEGER NOT NULL DEFAULT 0,\n cancel_at_period_end INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\n )\n `).run()\n\n // Indexes for common lookups\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_user_id ON subscriptions(user_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_customer_id ON subscriptions(stripe_customer_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_subscription_id ON subscriptions(stripe_subscription_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_status ON subscriptions(status)\n `).run()\n }\n\n /**\n * Create a new subscription record\n */\n async create(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Upsert a subscription by stripe_subscription_id (INSERT or UPDATE on conflict)\n */\n async upsert(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_subscription_id) DO UPDATE SET\n status = excluded.status,\n stripe_price_id = excluded.stripe_price_id,\n current_period_start = excluded.current_period_start,\n current_period_end = excluded.current_period_end,\n cancel_at_period_end = excluded.cancel_at_period_end,\n updated_at = unixepoch()\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Update a subscription by its Stripe subscription ID\n */\n async updateByStripeId(stripeSubscriptionId: string, data: Partial): Promise {\n const sets: string[] = []\n const values: any[] = []\n\n if (data.status !== undefined) {\n sets.push('status = ?')\n values.push(data.status)\n }\n if (data.stripePriceId !== undefined) {\n sets.push('stripe_price_id = ?')\n values.push(data.stripePriceId)\n }\n if (data.currentPeriodStart !== undefined) {\n sets.push('current_period_start = ?')\n values.push(data.currentPeriodStart)\n }\n if (data.currentPeriodEnd !== undefined) {\n sets.push('current_period_end = ?')\n values.push(data.currentPeriodEnd)\n }\n if (data.cancelAtPeriodEnd !== undefined) {\n sets.push('cancel_at_period_end = ?')\n values.push(data.cancelAtPeriodEnd ? 1 : 0)\n }\n\n if (sets.length === 0) return this.getByStripeSubscriptionId(stripeSubscriptionId)\n\n sets.push('updated_at = unixepoch()')\n values.push(stripeSubscriptionId)\n\n const result = await this.db.prepare(`\n UPDATE subscriptions SET ${sets.join(', ')} WHERE stripe_subscription_id = ? RETURNING *\n `).bind(...values).first()\n\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe subscription ID\n */\n async getByStripeSubscriptionId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get the active subscription for a user\n */\n async getByUserId(userId: string): Promise {\n const result = await this.db.prepare(\n \"SELECT * FROM subscriptions WHERE user_id = ? ORDER BY CASE WHEN status = 'active' THEN 0 WHEN status = 'trialing' THEN 1 ELSE 2 END, updated_at DESC LIMIT 1\"\n ).bind(userId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe customer ID\n */\n async getByStripeCustomerId(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_customer_id = ? ORDER BY updated_at DESC LIMIT 1'\n ).bind(stripeCustomerId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Find the userId linked to a Stripe customer ID\n */\n async getUserIdByStripeCustomer(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT user_id FROM subscriptions WHERE stripe_customer_id = ? LIMIT 1'\n ).bind(stripeCustomerId).first() as { user_id: string } | null\n return result?.user_id ?? null\n }\n\n /**\n * List subscriptions with filters and pagination\n */\n async list(filters: SubscriptionFilters = {}): Promise<{ subscriptions: Subscription[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.userId) {\n where.push('user_id = ?')\n values.push(filters.userId)\n }\n if (filters.stripeCustomerId) {\n where.push('stripe_customer_id = ?')\n values.push(filters.stripeCustomerId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM subscriptions ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n // Get paginated results\n const results = await this.db.prepare(\n `SELECT s.*, u.email as user_email FROM subscriptions s LEFT JOIN users u ON s.user_id = u.id ${whereClause} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n subscriptions: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n /**\n * Get subscription stats\n */\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\n SUM(CASE WHEN status = 'canceled' THEN 1 ELSE 0 END) as canceled,\n SUM(CASE WHEN status = 'past_due' THEN 1 ELSE 0 END) as past_due,\n SUM(CASE WHEN status = 'trialing' THEN 1 ELSE 0 END) as trialing\n FROM subscriptions\n `).first() as any\n\n return {\n total: result?.total || 0,\n active: result?.active || 0,\n canceled: result?.canceled || 0,\n pastDue: result?.past_due || 0,\n trialing: result?.trialing || 0\n }\n }\n\n /**\n * Delete a subscription record by Stripe subscription ID\n */\n async deleteByStripeId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'DELETE FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).run()\n return (result.meta?.changes || 0) > 0\n }\n\n private mapRow(row: Record): Subscription {\n return {\n id: row.id,\n userId: row.user_id,\n stripeCustomerId: row.stripe_customer_id,\n stripeSubscriptionId: row.stripe_subscription_id,\n stripePriceId: row.stripe_price_id,\n status: row.status as SubscriptionStatus,\n currentPeriodStart: row.current_period_start,\n currentPeriodEnd: row.current_period_end,\n cancelAtPeriodEnd: !!row.cancel_at_period_end,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n // Attach email if joined\n ...(row.user_email ? { userEmail: row.user_email } : {})\n } as Subscription\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { StripeEventRecord, StripeEventFilters, StripeEventStats } from '../types'\n\n/**\n * Manages Stripe event log records in D1\n */\nexport class StripeEventService {\n constructor(private db: D1Database) {}\n\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS stripe_events (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n stripe_event_id TEXT NOT NULL UNIQUE,\n type TEXT NOT NULL,\n object_id TEXT NOT NULL DEFAULT '',\n object_type TEXT NOT NULL DEFAULT '',\n data TEXT NOT NULL DEFAULT '{}',\n processed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n status TEXT NOT NULL DEFAULT 'processed',\n error TEXT\n )\n `).run()\n\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_type ON stripe_events(type)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_status ON stripe_events(status)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_processed_at ON stripe_events(processed_at DESC)\n `).run()\n }\n\n async log(event: {\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: Record\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n }): Promise {\n await this.db.prepare(`\n INSERT INTO stripe_events (stripe_event_id, type, object_id, object_type, data, status, error)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_event_id) DO UPDATE SET\n status = excluded.status,\n error = excluded.error,\n processed_at = unixepoch()\n `).bind(\n event.stripeEventId,\n event.type,\n event.objectId,\n event.objectType,\n JSON.stringify(event.data),\n event.status,\n event.error || null\n ).run()\n }\n\n async list(filters: StripeEventFilters = {}): Promise<{ events: StripeEventRecord[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.type) {\n where.push('type = ?')\n values.push(filters.type)\n }\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.objectId) {\n where.push('object_id = ?')\n values.push(filters.objectId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM stripe_events ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n const results = await this.db.prepare(\n `SELECT * FROM stripe_events ${whereClause} ORDER BY processed_at DESC LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n events: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'processed' THEN 1 ELSE 0 END) as processed,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'ignored' THEN 1 ELSE 0 END) as ignored\n FROM stripe_events\n `).first() as any\n\n return {\n total: result?.total || 0,\n processed: result?.processed || 0,\n failed: result?.failed || 0,\n ignored: result?.ignored || 0\n }\n }\n\n async getDistinctTypes(): Promise {\n const results = await this.db.prepare(\n 'SELECT DISTINCT type FROM stripe_events ORDER BY type'\n ).all()\n return (results.results || []).map((r: any) => r.type)\n }\n\n private mapRow(row: Record): StripeEventRecord {\n return {\n id: row.id,\n stripeEventId: row.stripe_event_id,\n type: row.type,\n objectId: row.object_id,\n objectType: row.object_type,\n data: row.data,\n processedAt: row.processed_at,\n status: row.status,\n error: row.error || undefined\n }\n }\n}\n","import type { Subscription, SubscriptionStats, SubscriptionStatus } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface StripePageData {\n subscriptions: (Subscription & { userEmail?: string })[]\n stats: SubscriptionStats\n filters: { status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSubscriptionsPage(data: StripePageData): string {\n const { subscriptions, stats, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Manage subscriptions, view billing status, and monitor payment events.\n

\n
\n
\n \n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe')}\n\n \n
\n ${statsCard('Total', stats.total, 'text-zinc-950 dark:text-white')}\n ${statsCard('Active', stats.active, 'text-emerald-600 dark:text-emerald-400')}\n ${statsCard('Trialing', stats.trialing, 'text-blue-600 dark:text-blue-400')}\n ${statsCard('Past Due', stats.pastDue, 'text-amber-600 dark:text-amber-400')}\n ${statsCard('Canceled', stats.canceled, 'text-red-600 dark:text-red-400')}\n
\n\n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${subscriptions.length === 0\n ? ''\n : subscriptions.map(renderRow).join('')\n }\n \n
UserStatusPrice IDCurrent PeriodCancel at EndStripe
No subscriptions found
\n\n ${renderPagination(filters.page, filters.totalPages, filters.status)}\n
\n\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Subscriptions',\n pageTitle: 'Stripe Subscriptions',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction statsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction statusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.replace('_', ' ').replace(/\\b\\w/g, c => c.toUpperCase())\n return ``\n}\n\nfunction statusBadge(status: SubscriptionStatus): string {\n const colors: Record = {\n active: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n trialing: 'bg-blue-400/10 text-blue-500 dark:text-blue-400 ring-blue-400/20',\n past_due: 'bg-amber-400/10 text-amber-500 dark:text-amber-400 ring-amber-400/20',\n canceled: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n unpaid: 'bg-orange-400/10 text-orange-500 dark:text-orange-400 ring-orange-400/20',\n paused: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete_expired: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n const label = status.replace('_', ' ')\n return `${label}`\n}\n\nfunction formatDate(timestamp: number): string {\n if (!timestamp) return '-'\n return new Date(timestamp * 1000).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })\n}\n\nfunction renderRow(sub: Subscription & { userEmail?: string }): string {\n return `\n \n \n
${sub.userEmail || sub.userId}
\n
${sub.stripeCustomerId}
\n \n ${statusBadge(sub.status)}\n ${sub.stripePriceId}\n \n ${formatDate(sub.currentPeriodStart)} - ${formatDate(sub.currentPeriodEnd)}\n \n \n ${sub.cancelAtPeriodEnd\n ? 'Yes'\n : 'No'\n }\n \n \n \n View in Stripe\n \n \n \n `\n}\n\nfunction renderPagination(page: number, totalPages: number, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params = status ? `&status=${status}` : ''\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","/**\n * Shared tab bar for all Stripe admin pages.\n */\n\nconst TABS = [\n { label: 'Subscriptions', path: '/admin/plugins/stripe' },\n { label: 'Events', path: '/admin/plugins/stripe/events' },\n { label: 'Settings', path: '/admin/plugins/stripe/settings' },\n]\n\nexport function renderStripeTabBar(currentPath: string): string {\n const tabs = TABS.map(tab => {\n const isActive = currentPath === tab.path\n || (tab.path === '/admin/plugins/stripe' && currentPath === '/admin/plugins/stripe/')\n return `\n \n ${tab.label}\n `\n }).join('')\n\n return `\n
\n \n
\n `\n}\n","import type { StripeEventRecord, StripeEventStats } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface EventsPageData {\n events: StripeEventRecord[]\n stats: StripeEventStats\n types: string[]\n filters: { type?: string; status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderEventsPage(data: EventsPageData): string {\n const { events, stats, types, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Webhook event log showing all processed, failed, and ignored Stripe events.\n

\n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/events')}\n\n \n
\n ${eventStatsCard('Total Events', stats.total, 'text-zinc-950 dark:text-white')}\n ${eventStatsCard('Processed', stats.processed, 'text-emerald-600 dark:text-emerald-400')}\n ${eventStatsCard('Failed', stats.failed, 'text-red-600 dark:text-red-400')}\n ${eventStatsCard('Ignored', stats.ignored, 'text-zinc-500 dark:text-zinc-400')}\n
\n\n \n
\n
\n \n \n\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n ${events.length === 0\n ? ''\n : events.map(renderEventRow).join('')\n }\n \n
TimeTypeObject / UserStatusEvent ID
No events recorded yet
\n\n ${renderEventPagination(filters.page, filters.totalPages, filters.type, filters.status)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Events',\n pageTitle: 'Stripe Events',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction eventStatsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction eventStatusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.charAt(0).toUpperCase() + value.slice(1)\n return ``\n}\n\nfunction eventStatusBadge(status: string): string {\n const colors: Record = {\n processed: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n failed: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n ignored: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n return `${status}`\n}\n\nfunction formatTimestamp(timestamp: number): string {\n if (!timestamp) return '-'\n const d = new Date(timestamp * 1000)\n return d.toLocaleString('en-US', {\n month: 'short', day: 'numeric', year: 'numeric',\n hour: '2-digit', minute: '2-digit', second: '2-digit'\n })\n}\n\nfunction extractUserInfo(event: StripeEventRecord): { userId?: string; email?: string } {\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n const userId = data?.metadata?.sonicjs_user_id || data?.sonicjs_user_id\n const email = data?.customer_email || data?.customerEmail || data?.receipt_email\n return { userId: userId || undefined, email: email || undefined }\n } catch {\n return {}\n }\n}\n\nfunction renderEventRow(event: StripeEventRecord): string {\n const errorTooltip = event.error ? ` title=\"${event.error.replace(/\"/g, '"')}\"` : ''\n const userInfo = extractUserInfo(event)\n const userLink = userInfo.userId\n ? `${userInfo.email || userInfo.userId}`\n : userInfo.email\n ? `${userInfo.email}`\n : ''\n\n return `\n \n \n ${formatTimestamp(event.processedAt)}\n \n \n ${event.type}\n \n \n
${event.objectId || '-'}
\n
${event.objectType}
\n ${userLink ? `
${userLink}
` : ''}\n \n ${eventStatusBadge(event.status)}\n ${event.stripeEventId}\n \n `\n}\n\nfunction renderEventPagination(page: number, totalPages: number, type?: string, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params: string[] = []\n if (type) params.push(`type=${type}`)\n if (status) params.push(`status=${status}`)\n const extra = params.length > 0 ? `&${params.join('&')}` : ''\n\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","// ============================================================================\n// Stripe Plugin Types\n// ============================================================================\n\nexport type SubscriptionStatus =\n | 'active'\n | 'canceled'\n | 'past_due'\n | 'trialing'\n | 'unpaid'\n | 'paused'\n | 'incomplete'\n | 'incomplete_expired'\n\nexport interface Subscription {\n id: string\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd: boolean\n createdAt: number\n updatedAt: number\n}\n\nexport interface SubscriptionInsert {\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd?: boolean\n}\n\nexport interface SubscriptionFilters {\n status?: SubscriptionStatus\n userId?: string\n stripeCustomerId?: string\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'updated_at' | 'status'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SubscriptionStats {\n total: number\n active: number\n canceled: number\n pastDue: number\n trialing: number\n}\n\nexport interface StripePluginSettings {\n stripePublishableKey: string\n stripeSecretKey: string\n stripeWebhookSecret: string\n stripePriceId?: string\n successUrl: string\n cancelUrl: string\n}\n\nexport const DEFAULT_SETTINGS: StripePluginSettings = {\n stripePublishableKey: '',\n stripeSecretKey: '',\n stripeWebhookSecret: '',\n stripePriceId: '',\n successUrl: '/admin/dashboard',\n cancelUrl: '/admin/dashboard'\n}\n\n// Stripe webhook event types we handle\nexport type StripeWebhookEventType =\n | 'customer.subscription.created'\n | 'customer.subscription.updated'\n | 'customer.subscription.deleted'\n | 'checkout.session.completed'\n | 'invoice.payment_succeeded'\n | 'invoice.payment_failed'\n\n// Minimal Stripe types (we use fetch, not the SDK)\nexport interface StripeEvent {\n id: string\n type: string\n data: {\n object: Record\n }\n}\n\nexport interface StripeSubscriptionObject {\n id: string\n customer: string\n status: string\n items: {\n data: Array<{\n price: {\n id: string\n }\n }>\n }\n current_period_start: number\n current_period_end: number\n cancel_at_period_end: boolean\n metadata?: Record\n}\n\nexport interface StripeCheckoutSession {\n id: string\n customer: string\n subscription: string\n metadata?: Record\n}\n\nexport interface StripeInvoice {\n id: string\n customer: string\n subscription: string | null\n status: string\n amount_paid: number\n currency: string\n}\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\nexport interface StripeEventRecord {\n id: string\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: string // JSON string\n processedAt: number\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n}\n\nexport interface StripeEventFilters {\n type?: string\n status?: 'processed' | 'failed' | 'ignored'\n objectId?: string\n page?: number\n limit?: number\n}\n\nexport interface StripeEventStats {\n total: number\n processed: number\n failed: number\n ignored: number\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { renderSubscriptionsPage } from '../components/subscriptions-page'\nimport { renderEventsPage } from '../components/events-page'\nimport { renderStripeTabBar } from '../components/tab-bar'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { StripePluginSettings, SubscriptionStatus } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Subscriptions dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const statusFilter = c.req.query('status') as SubscriptionStatus | undefined\n\n const [{ subscriptions, total }, stats] = await Promise.all([\n subscriptionService.list({ status: statusFilter, page, limit }),\n subscriptionService.getStats()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderSubscriptionsPage({\n subscriptions: subscriptions as any,\n stats,\n filters: { status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Events log page\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const typeFilter = c.req.query('type') || undefined\n const statusFilter = c.req.query('status') as 'processed' | 'failed' | 'ignored' | undefined\n\n const [{ events, total }, stats, types] = await Promise.all([\n eventService.list({ type: typeFilter, status: statusFilter, page, limit }),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderEventsPage({\n events,\n stats,\n types,\n filters: { type: typeFilter, status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const { renderAdminLayoutCatalyst } = await import('../../../../templates/layouts/admin-layout-catalyst.template')\n\n const content = `\n
\n
\n

Stripe

\n

\n Configure your Stripe API keys and checkout options.\n

\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/settings')}\n\n
\n\n
\n
\n
\n \n \n

Your Stripe publishable key (starts with pk_)

\n
\n\n
\n \n \n

Your Stripe secret API key (starts with sk_)

\n
\n\n
\n \n \n

Stripe webhook endpoint signing secret (starts with whsec_)

\n
\n\n
\n \n \n

Default Stripe Price ID for checkout sessions (optional)

\n
\n\n
\n \n \n

Redirect URL after successful checkout

\n
\n\n
\n \n \n

Redirect URL if checkout is cancelled

\n
\n
\n\n
\n \n
\n
\n
\n\n \n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Stripe Settings',\n pageTitle: 'Stripe Settings',\n currentPath: '/admin/plugins/stripe',\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n content,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'stripe'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving Stripe settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n})\n\nexport { adminRoutes as stripeAdminRoutes }\n","import type { StripePluginSettings } from '../types'\n\n/**\n * Lightweight Stripe API client using fetch (CF Workers compatible, no SDK needed)\n */\nexport class StripeAPI {\n private baseUrl = 'https://api.stripe.com/v1'\n\n constructor(private secretKey: string) {}\n\n /**\n * Verify a webhook signature\n * Implements Stripe's v1 signature scheme using Web Crypto API\n */\n async verifyWebhookSignature(payload: string, sigHeader: string, secret: string): Promise {\n const parts = sigHeader.split(',')\n const timestamp = parts.find(p => p.startsWith('t='))?.split('=')[1]\n const signatures = parts\n .filter(p => p.startsWith('v1='))\n .map(p => p.substring(3))\n\n if (!timestamp || signatures.length === 0) return false\n\n // Reject events older than 5 minutes (tolerance)\n const now = Math.floor(Date.now() / 1000)\n if (Math.abs(now - parseInt(timestamp)) > 300) return false\n\n // Compute expected signature\n const signedPayload = `${timestamp}.${payload}`\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(signedPayload))\n const expectedSignature = Array.from(new Uint8Array(signatureBuffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n\n return signatures.some(sig => timingSafeEqual(sig, expectedSignature))\n }\n\n /**\n * Create a Checkout Session\n */\n async createCheckoutSession(params: {\n priceId: string\n customerId?: string\n customerEmail?: string\n successUrl: string\n cancelUrl: string\n metadata?: Record\n }): Promise<{ id: string; url: string }> {\n const body = new URLSearchParams()\n body.append('mode', 'subscription')\n body.append('line_items[0][price]', params.priceId)\n body.append('line_items[0][quantity]', '1')\n body.append('success_url', params.successUrl)\n body.append('cancel_url', params.cancelUrl)\n\n if (params.customerId) {\n body.append('customer', params.customerId)\n } else if (params.customerEmail) {\n body.append('customer_email', params.customerEmail)\n }\n\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n\n const response = await this.request('POST', '/checkout/sessions', body)\n return { id: response.id, url: response.url }\n }\n\n /**\n * Retrieve a Stripe subscription\n */\n async getSubscription(subscriptionId: string): Promise {\n return this.request('GET', `/subscriptions/${subscriptionId}`)\n }\n\n /**\n * Create a Stripe customer\n */\n async createCustomer(params: { email: string; metadata?: Record }): Promise<{ id: string }> {\n const body = new URLSearchParams()\n body.append('email', params.email)\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n return this.request('POST', '/customers', body)\n }\n\n /**\n * List subscriptions with pagination (auto-expands across pages)\n */\n async listSubscriptions(params?: {\n status?: string\n limit?: number\n startingAfter?: string\n }): Promise<{ data: any[]; has_more: boolean }> {\n const qs = new URLSearchParams()\n qs.append('limit', String(params?.limit || 100))\n if (params?.status) qs.append('status', params.status)\n if (params?.startingAfter) qs.append('starting_after', params.startingAfter)\n return this.request('GET', `/subscriptions?${qs.toString()}`)\n }\n\n /**\n * Fetch ALL subscriptions from Stripe (handles pagination automatically)\n */\n async listAllSubscriptions(): Promise {\n const all: any[] = []\n let startingAfter: string | undefined\n\n while (true) {\n const result = await this.listSubscriptions({ limit: 100, startingAfter })\n all.push(...result.data)\n if (!result.has_more || result.data.length === 0) break\n startingAfter = result.data[result.data.length - 1].id\n }\n\n return all\n }\n\n /**\n * Search for a customer by email\n */\n async findCustomerByEmail(email: string): Promise<{ id: string } | null> {\n const params = new URLSearchParams()\n params.append('query', `email:'${email}'`)\n params.append('limit', '1')\n const result = await this.request('GET', `/customers/search?${params.toString()}`)\n return result.data?.[0] || null\n }\n\n private async request(method: string, path: string, body?: URLSearchParams): Promise {\n const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${this.secretKey}`,\n ...(body ? { 'Content-Type': 'application/x-www-form-urlencoded' } : {})\n },\n ...(body ? { body: body.toString() } : {})\n })\n\n const data = await response.json() as any\n if (!response.ok) {\n throw new Error(`Stripe API error: ${data.error?.message || response.statusText}`)\n }\n return data\n }\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks on signature verification\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n return result === 0\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { StripeAPI } from '../services/stripe-api'\nimport type { Bindings, Variables } from '../../../../app'\nimport type {\n StripePluginSettings,\n StripeEvent,\n StripeSubscriptionObject,\n StripeCheckoutSession,\n StripeInvoice,\n SubscriptionStatus,\n SubscriptionFilters\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\nfunction mapStripeStatus(status: string): SubscriptionStatus {\n const map: Record = {\n active: 'active',\n canceled: 'canceled',\n past_due: 'past_due',\n trialing: 'trialing',\n unpaid: 'unpaid',\n paused: 'paused',\n incomplete: 'incomplete',\n incomplete_expired: 'incomplete_expired'\n }\n return map[status] || 'incomplete'\n}\n\n// ============================================================================\n// Webhook — No auth, verified by Stripe signature\n// ============================================================================\n\napiRoutes.post('/webhook', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeWebhookSecret) {\n return c.json({ error: 'Webhook secret not configured' }, 500)\n }\n\n // Must read raw body for signature verification\n const rawBody = await c.req.text()\n const sigHeader = c.req.header('stripe-signature') || ''\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const isValid = await stripeApi.verifyWebhookSignature(rawBody, sigHeader, settings.stripeWebhookSecret)\n\n if (!isValid) {\n return c.json({ error: 'Invalid signature' }, 400)\n }\n\n const event: StripeEvent = JSON.parse(rawBody)\n const subscriptionService = new SubscriptionService(db)\n const eventService = new StripeEventService(db)\n await Promise.all([subscriptionService.ensureTable(), eventService.ensureTable()])\n\n // Determine object ID and type for the event log\n const obj = event.data.object as any\n const objectId = obj?.id || ''\n const objectType = obj?.object || event.type.split('.')[0] || ''\n\n try {\n switch (event.type) {\n case 'customer.subscription.created': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n\n await subscriptionService.create({\n userId,\n stripeCustomerId: sub.customer,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items.data[0]?.price.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription created: ${sub.id}`)\n break\n }\n\n case 'customer.subscription.updated': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: mapStripeStatus(sub.status),\n stripePriceId: sub.items.data[0]?.price.id || undefined,\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription updated: ${sub.id} -> ${sub.status}`)\n break\n }\n\n case 'customer.subscription.deleted': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: 'canceled'\n })\n\n console.log(`[Stripe] Subscription deleted: ${sub.id}`)\n break\n }\n\n case 'checkout.session.completed': {\n const session = event.data.object as unknown as StripeCheckoutSession\n const userId = session.metadata?.sonicjs_user_id\n\n if (userId && session.subscription) {\n const existing = await subscriptionService.getByStripeSubscriptionId(session.subscription)\n if (existing && !existing.userId) {\n await subscriptionService.updateByStripeId(session.subscription, {\n userId\n } as any)\n }\n }\n\n console.log(`[Stripe] Checkout completed: ${session.id}`)\n break\n }\n\n case 'invoice.payment_succeeded': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'active'\n })\n }\n console.log(`[Stripe] Payment succeeded for invoice: ${invoice.id}`)\n break\n }\n\n case 'invoice.payment_failed': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'past_due'\n })\n }\n console.log(`[Stripe] Payment failed for invoice: ${invoice.id}`)\n break\n }\n\n default:\n console.log(`[Stripe] Unhandled event type: ${event.type}`)\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'ignored'\n })\n return c.json({ received: true })\n }\n\n // Log successfully processed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'processed'\n })\n } catch (error) {\n // Log failed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error)\n }).catch(() => {}) // Don't let logging failure mask the real error\n\n console.error(`[Stripe] Error processing webhook event ${event.type}:`, error)\n return c.json({ error: 'Webhook processing failed' }, 500)\n }\n\n return c.json({ received: true })\n})\n\n// ============================================================================\n// Authenticated API Routes\n// ============================================================================\n\n// Create checkout session for current user\napiRoutes.post('/create-checkout-session', requireAuth(), async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const settings = await getSettings(db)\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe not configured' }, 500)\n }\n\n const body = await c.req.json().catch(() => ({})) as { priceId?: string }\n const priceId = body.priceId || settings.stripePriceId\n if (!priceId) {\n return c.json({ error: 'No price ID specified' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n // Check if user already has a Stripe customer ID\n const existingSub = await subscriptionService.getByUserId(user.userId)\n let customerId = existingSub?.stripeCustomerId\n\n if (!customerId) {\n // Try to find existing customer by email, or create one\n const existing = await stripeApi.findCustomerByEmail(user.email)\n if (existing) {\n customerId = existing.id\n } else {\n const customer = await stripeApi.createCustomer({\n email: user.email,\n metadata: { sonicjs_user_id: user.userId }\n })\n customerId = customer.id\n }\n }\n\n const origin = new URL(c.req.url).origin\n const session = await stripeApi.createCheckoutSession({\n priceId,\n customerId,\n successUrl: `${origin}${settings.successUrl}?session_id={CHECKOUT_SESSION_ID}`,\n cancelUrl: `${origin}${settings.cancelUrl}`,\n metadata: { sonicjs_user_id: user.userId }\n })\n\n return c.json({ sessionId: session.id, url: session.url })\n})\n\n// Get current user's subscription\napiRoutes.get('/subscription', requireAuth(), async (c) => {\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const subscription = await subscriptionService.getByUserId(user.userId)\n if (!subscription) {\n return c.json({ subscription: null })\n }\n\n return c.json({ subscription })\n})\n\n// ============================================================================\n// Admin API Routes\n// ============================================================================\n\n// List all subscriptions (admin only)\napiRoutes.get('/subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const filters: SubscriptionFilters = {\n status: c.req.query('status') as SubscriptionStatus | undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await subscriptionService.list(filters)\n return c.json(result)\n})\n\n// Get subscription stats (admin only)\napiRoutes.get('/stats', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const stats = await subscriptionService.getStats()\n return c.json(stats)\n})\n\n// ============================================================================\n// Sync Subscriptions from Stripe API\n// ============================================================================\n\napiRoutes.post('/sync-subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe secret key not configured' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n try {\n const allSubs = await stripeApi.listAllSubscriptions()\n let synced = 0\n let errors = 0\n\n for (const sub of allSubs) {\n try {\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n await subscriptionService.upsert({\n userId,\n stripeCustomerId: typeof sub.customer === 'string' ? sub.customer : sub.customer.id,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items?.data?.[0]?.price?.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n synced++\n } catch (err) {\n console.error(`[Stripe Sync] Failed to upsert subscription ${sub.id}:`, err)\n errors++\n }\n }\n\n return c.json({\n success: true,\n total: allSubs.length,\n synced,\n errors\n })\n } catch (error) {\n console.error('[Stripe Sync] Error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Sync failed'\n }, 500)\n }\n})\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\napiRoutes.get('/events', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const filters = {\n type: c.req.query('type') || undefined,\n status: c.req.query('status') as any || undefined,\n objectId: c.req.query('objectId') || undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50\n }\n\n const [result, stats, types] = await Promise.all([\n eventService.list(filters),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n return c.json({ ...result, stats, types })\n})\n\nexport { apiRoutes as stripeApiRoutes }\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { stripeAdminRoutes } from './routes/admin'\nimport { stripeApiRoutes } from './routes/api'\n\nexport function createStripePlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'stripe',\n version: '1.0.0-beta.1',\n description: 'Stripe subscription management with webhook handling, checkout sessions, and subscription gating'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard — subscription management\n builder.addRoute('/admin/plugins/stripe', stripeAdminRoutes as any, {\n description: 'Stripe subscriptions admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes — webhook, checkout, subscription status\n builder.addRoute('/api/stripe', stripeApiRoutes as any, {\n description: 'Stripe API endpoints (webhook, checkout, subscription)',\n requiresAuth: false, // Webhook route handles its own auth via signature\n priority: 50\n })\n\n // Admin menu item\n builder.addMenuItem('Stripe', '/admin/plugins/stripe', {\n icon: ``,\n order: 75\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.log('[Stripe] Plugin installed')\n },\n activate: async () => {\n console.log('[Stripe] Plugin activated')\n },\n deactivate: async () => {\n console.log('[Stripe] Plugin deactivated')\n },\n uninstall: async () => {\n console.log('[Stripe] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const stripePlugin = createStripePlugin()\nexport { SubscriptionService } from './services/subscription-service'\nexport { StripeAPI } from './services/stripe-api'\nexport { requireSubscription } from './middleware/require-subscription'\nexport default stripePlugin\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../app'\nimport { PLUGIN_REGISTRY } from '../plugins/manifest-registry'\n\n// Build menu plugin data from the auto-generated registry.\n// Any plugin with an adminMenu entry in its manifest.json will\n// automatically appear in the sidebar when active.\nconst REGISTRY_MENU_PLUGINS = Object.values(PLUGIN_REGISTRY)\n .filter(p => p.adminMenu !== null)\n .map(p => ({\n codeName: p.codeName,\n label: p.adminMenu!.label,\n path: p.adminMenu!.path,\n icon: p.adminMenu!.icon,\n order: p.adminMenu!.order,\n }))\n\n// Map icon names from manifest.json to Heroicons SVG (outline, 24x24)\nconst ICON_SVG: Record = {\n 'magnifying-glass': '',\n 'chart-bar': '',\n 'image': '',\n 'palette': '',\n 'envelope': '',\n 'hand-raised': '',\n 'key': '',\n 'arrow-right': '',\n 'shield-check': '',\n 'credit-card': '',\n}\n\nfunction resolveIcon(iconName?: string): string {\n if (!iconName) return ''\n // If it's already SVG markup, return as-is\n if (iconName.startsWith('`\n const resolvedIcon = resolveIcon(item.icon) || fallbackIcon\n return `\n \n ${isActive ? '' : ''}\n \n \n ${resolvedIcon}\n \n ${item.label}\n \n `\n}\n\nexport function pluginMenuMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n if (!path.startsWith('/admin')) {\n return next()\n }\n\n // Collect menu items from active plugins using the registry\n let activeMenuItems: Array<{ label: string; path: string; icon?: string; order: number }> = []\n try {\n const db = c.env.DB\n const pluginCodeNames = REGISTRY_MENU_PLUGINS.map(p => p.codeName)\n if (pluginCodeNames.length > 0) {\n const placeholders = pluginCodeNames.map(() => '?').join(',')\n const result = await db.prepare(\n `SELECT name FROM plugins WHERE name IN (${placeholders}) AND status = 'active'`\n ).bind(...pluginCodeNames).all()\n\n const activeNames = new Set((result.results || []).map((r: any) => r.name))\n\n for (const plugin of REGISTRY_MENU_PLUGINS) {\n if (activeNames.has(plugin.codeName)) {\n activeMenuItems.push({\n label: plugin.label,\n path: plugin.path,\n icon: plugin.icon,\n order: plugin.order,\n })\n }\n }\n\n // Sort by order\n activeMenuItems.sort((a, b) => a.order - b.order)\n }\n } catch {\n // DB not ready or plugin table doesn't exist yet\n }\n\n c.set('pluginMenuItems', activeMenuItems.map(m => ({ label: m.label, path: m.path, icon: resolveIcon(m.icon) || '' })))\n\n await next()\n\n // Inject menu items into HTML response by replacing the marker\n if (activeMenuItems.length > 0 && c.res.headers.get('content-type')?.includes('text/html')) {\n const status = c.res.status\n const headers = new Headers(c.res.headers)\n const html = await c.res.text()\n\n if (html.includes(MARKER)) {\n const renderedItems = activeMenuItems.map(item => renderMenuItem(item, path)).join('')\n const newHtml = html.split(MARKER).join(renderedItems)\n c.res = new Response(newHtml, { status, headers })\n } else {\n // Body was consumed by .text(), must create new Response either way\n c.res = new Response(html, { status, headers })\n }\n }\n }\n}\n","/**\n * SonicJS Plugin System Types\n * \n * Defines the core interfaces and types for the plugin system\n */\n\nimport { Hono, Context, Next, MiddlewareHandler } from 'hono'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\n\n// Core plugin definition\nexport interface Plugin {\n /** Unique plugin identifier */\n name: string\n /** Plugin version (semantic versioning) */\n version: string\n /** Human-readable description */\n description?: string\n /** Plugin author information */\n author?: {\n name: string\n email?: string\n url?: string\n }\n /** Plugin dependencies (other plugins required) */\n dependencies?: string[]\n /** SonicJS version compatibility */\n compatibility?: string\n /** Plugin license */\n license?: string\n \n // Extension points\n routes?: PluginRoutes[]\n middleware?: PluginMiddleware[]\n models?: PluginModel[]\n services?: PluginService[]\n adminPages?: PluginAdminPage[]\n adminComponents?: PluginComponent[]\n menuItems?: PluginMenuItem[]\n hooks?: PluginHook[]\n \n // Lifecycle hooks\n install?: (context: PluginContext) => Promise\n uninstall?: (context: PluginContext) => Promise\n activate?: (context: PluginContext) => Promise\n deactivate?: (context: PluginContext) => Promise\n configure?: (config: PluginConfig) => Promise\n}\n\n// Plugin context provides access to SonicJS APIs\nexport interface PluginContext {\n /** Database instance */\n db: D1Database\n /** Key-value storage */\n kv: KVNamespace\n /** R2 storage bucket */\n r2?: R2Bucket\n /** Plugin configuration */\n config: PluginConfig\n /** Core SonicJS services */\n services: {\n auth: AuthService\n content: ContentService\n media: MediaService\n }\n /** Hook system for inter-plugin communication */\n hooks: HookSystem | ScopedHookSystem\n /** Logging utilities */\n logger: PluginLogger\n}\n\n// Authentication service interface for plugins\nexport interface AuthService {\n /** Generate JWT token for a user */\n generateToken(userId: string, email: string, role: string): Promise\n /** Verify and decode JWT token */\n verifyToken(token: string): Promise\n /** Set authentication cookie (useful for alternative auth methods) */\n setAuthCookie(context: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void\n /** Hash password */\n hashPassword(password: string): Promise\n /** Verify password against hash */\n verifyPassword(password: string, hash: string): Promise\n}\n\n// Plugin configuration\nexport interface PluginConfig {\n /** Plugin-specific configuration */\n [key: string]: any\n /** Whether plugin is enabled */\n enabled: boolean\n /** Plugin installation timestamp */\n installedAt?: number\n /** Plugin last update timestamp */\n updatedAt?: number\n}\n\n// Route definitions\nexport interface PluginRoutes {\n /** Route path prefix */\n path: string\n /** Hono route handler */\n handler: Hono\n /** Route description */\n description?: string\n /** Whether route requires authentication */\n requiresAuth?: boolean\n /** Required roles for access */\n roles?: string[]\n /** Route priority (for ordering) */\n priority?: number\n}\n\n// Middleware definitions\nexport interface PluginMiddleware {\n /** Middleware name */\n name: string\n /** Middleware handler function */\n handler: MiddlewareHandler\n /** Middleware description */\n description?: string\n /** Middleware priority (lower = earlier) */\n priority?: number\n /** Routes to apply middleware to */\n routes?: string[]\n /** Whether to apply globally */\n global?: boolean\n}\n\n// Database model definitions\nexport interface PluginModel {\n /** Model name */\n name: string\n /** Database table name */\n tableName: string\n /** Zod schema for validation */\n schema: z.ZodSchema\n /** Database migrations */\n migrations: string[]\n /** Model relationships */\n relationships?: ModelRelationship[]\n /** Whether model extends core content */\n extendsContent?: boolean\n}\n\nexport interface ModelRelationship {\n type: 'oneToOne' | 'oneToMany' | 'manyToMany'\n target: string\n foreignKey?: string\n joinTable?: string\n}\n\n// Service definitions\nexport interface PluginService {\n /** Service name */\n name: string\n /** Service implementation */\n implementation: any\n /** Service description */\n description?: string\n /** Service dependencies */\n dependencies?: string[]\n /** Whether service is singleton */\n singleton?: boolean\n}\n\n// Admin interface extensions\nexport interface PluginAdminPage {\n /** Page path (relative to /admin) */\n path: string\n /** Page title */\n title: string\n /** Page component/template */\n component: string\n /** Page description */\n description?: string\n /** Required permissions */\n permissions?: string[]\n /** Menu item configuration */\n menuItem?: PluginMenuItem\n /** Page icon */\n icon?: string\n}\n\nexport interface PluginComponent {\n /** Component name */\n name: string\n /** Component template function */\n template: (props: any) => string\n /** Component description */\n description?: string\n /** Component props schema */\n propsSchema?: z.ZodSchema\n}\n\nexport interface PluginMenuItem {\n /** Menu item label */\n label: string\n /** Menu item path */\n path: string\n /** Menu item icon */\n icon?: string\n /** Menu item order */\n order?: number\n /** Parent menu item */\n parent?: string\n /** Required permissions */\n permissions?: string[]\n /** Whether item is active */\n active?: boolean\n}\n\n// Hook system for extensibility\nexport interface PluginHook {\n /** Hook name */\n name: string\n /** Hook handler function */\n handler: HookHandler\n /** Hook priority */\n priority?: number\n /** Hook description */\n description?: string\n}\n\nexport type HookHandler = (data: any, context: HookContext) => Promise\n\nexport interface HookContext {\n /** Plugin that registered the hook */\n plugin: string\n /** Hook execution context */\n context: PluginContext\n /** Cancel hook execution */\n cancel?: () => void\n}\n\n// Hook system interface\nexport interface HookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Get all registered hooks */\n getHooks(hookName: string): PluginHook[]\n /** Create a scoped hook system (optional) */\n createScope?(pluginName: string): ScopedHookSystem\n}\n\n// Scoped hook system for plugins\nexport interface ScopedHookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Remove all hooks for this scope */\n unregisterAll(): void\n}\n\n// Plugin registry\nexport interface PluginRegistry {\n /** Get plugin by name */\n get(name: string): Plugin | undefined\n /** Get all registered plugins */\n getAll(): Plugin[]\n /** Get active plugins */\n getActive(): Plugin[]\n /** Register a plugin */\n register(plugin: Plugin): Promise\n /** Unregister a plugin */\n unregister(name: string): Promise\n /** Check if plugin is registered */\n has(name: string): boolean\n /** Activate a plugin */\n activate(name: string): Promise\n /** Deactivate a plugin */\n deactivate(name: string): Promise\n /** Get plugin configuration */\n getConfig(name: string): PluginConfig | undefined\n /** Set plugin configuration */\n setConfig(name: string, config: PluginConfig): void\n /** Get plugin status */\n getStatus(name: string): PluginStatus | undefined\n /** Get all plugin statuses */\n getAllStatuses(): Map\n /** Resolve plugin load order based on dependencies */\n resolveLoadOrder(): string[]\n}\n\n// Plugin manager\nexport interface PluginManager {\n /** Plugin registry */\n registry: PluginRegistry\n /** Hook system */\n hooks: HookSystem\n /** Initialize plugin system */\n initialize(context: PluginContext): Promise\n /** Load plugins from configuration */\n loadPlugins(config: PluginConfig[]): Promise\n /** Install a plugin */\n install(plugin: Plugin, config?: PluginConfig): Promise\n /** Uninstall a plugin */\n uninstall(name: string): Promise\n /** Get plugin status */\n getStatus(name: string): PluginStatus\n}\n\nexport interface PluginStatus {\n name: string\n version: string\n active: boolean\n installed: boolean\n hasErrors: boolean\n errors?: string[]\n lastError?: string\n}\n\n// Service interfaces\nexport interface AuthService {\n /** Verify user permissions */\n hasPermission(userId: string, permission: string): Promise\n /** Get current user */\n getCurrentUser(context: Context): Promise\n /** Create authentication middleware */\n createMiddleware(options?: any): MiddlewareHandler\n}\n\nexport interface ContentService {\n /** Get content by ID */\n getById(id: string): Promise\n /** Create new content */\n create(data: any): Promise\n /** Update content */\n update(id: string, data: any): Promise\n /** Delete content */\n delete(id: string): Promise\n /** Search content */\n search(query: string, options?: any): Promise\n}\n\nexport interface MediaService {\n /** Upload file */\n upload(file: File, options?: any): Promise\n /** Get media by ID */\n getById(id: string): Promise\n /** Delete media */\n delete(id: string): Promise\n /** Transform image */\n transform(id: string, options: any): Promise\n}\n\n// Plugin logger\nexport interface PluginLogger {\n debug(message: string, data?: any): void\n info(message: string, data?: any): void\n warn(message: string, data?: any): void\n error(message: string, error?: Error, data?: any): void\n}\n\n// Plugin development utilities interface\n\nexport interface PluginBuilderOptions {\n name: string\n version: string\n description?: string\n author?: Plugin['author']\n dependencies?: string[]\n}\n\n// Plugin validation\nexport interface PluginValidator {\n /** Validate plugin definition */\n validate(plugin: Plugin): PluginValidationResult\n /** Validate plugin dependencies */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult\n /** Validate plugin compatibility */\n validateCompatibility(plugin: Plugin, version: string): PluginValidationResult\n}\n\nexport interface PluginValidationResult {\n valid: boolean\n errors: string[]\n warnings: string[]\n}\n\n// Standard hook names\nexport const HOOKS = {\n // Application lifecycle\n APP_INIT: 'app:init',\n APP_READY: 'app:ready',\n APP_SHUTDOWN: 'app:shutdown',\n \n // Request lifecycle\n REQUEST_START: 'request:start',\n REQUEST_END: 'request:end',\n REQUEST_ERROR: 'request:error',\n \n // Authentication\n AUTH_LOGIN: 'auth:login',\n AUTH_LOGOUT: 'auth:logout',\n AUTH_REGISTER: 'auth:register',\n USER_LOGIN: 'user:login',\n USER_LOGOUT: 'user:logout',\n \n // Content lifecycle\n CONTENT_CREATE: 'content:create',\n CONTENT_UPDATE: 'content:update',\n CONTENT_DELETE: 'content:delete',\n CONTENT_PUBLISH: 'content:publish',\n CONTENT_SAVE: 'content:save',\n \n // Media lifecycle\n MEDIA_UPLOAD: 'media:upload',\n MEDIA_DELETE: 'media:delete',\n MEDIA_TRANSFORM: 'media:transform',\n \n // Plugin lifecycle\n PLUGIN_INSTALL: 'plugin:install',\n PLUGIN_UNINSTALL: 'plugin:uninstall',\n PLUGIN_ACTIVATE: 'plugin:activate',\n PLUGIN_DEACTIVATE: 'plugin:deactivate',\n \n // Admin interface\n ADMIN_MENU_RENDER: 'admin:menu:render',\n ADMIN_PAGE_RENDER: 'admin:page:render',\n \n // Database\n DB_MIGRATE: 'db:migrate',\n DB_SEED: 'db:seed',\n} as const\n\nexport type HookName = typeof HOOKS[keyof typeof HOOKS]","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { renderAdminLayoutCatalyst } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\n// Analytics Dashboard\nadminRoutes.get('/', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Query real metrics from system_logs\n let totalRequests = 0\n let uniqueIPs = 0\n let avgDuration = 0\n let errorCount = 0\n let topPages: Array<{ path: string; views: number }> = []\n let recentActivity: Array<{ url: string; method: string; status_code: number; duration: number; created_at: number }> = []\n\n try {\n const now = Math.floor(Date.now() / 1000)\n const dayAgo = now - 86400\n\n const [requestsResult, ipsResult, durationResult, errorsResult, pagesResult, activityResult] = await Promise.all([\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT COUNT(DISTINCT ip_address) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT AVG(duration) as avg FROM system_logs WHERE category = ? AND created_at > ? AND duration IS NOT NULL')\n .bind('api', dayAgo).first() as Promise<{ avg: number } | null>,\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE level IN (?, ?) AND created_at > ?')\n .bind('error', 'fatal', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT url, COUNT(*) as views FROM system_logs WHERE category = ? AND created_at > ? AND url IS NOT NULL GROUP BY url ORDER BY views DESC LIMIT 10')\n .bind('api', dayAgo).all(),\n db.prepare('SELECT url, method, status_code, duration, created_at FROM system_logs WHERE category = ? ORDER BY created_at DESC LIMIT 20')\n .bind('api').all(),\n ])\n\n totalRequests = requestsResult?.count || 0\n uniqueIPs = ipsResult?.count || 0\n avgDuration = Math.round(durationResult?.avg || 0)\n errorCount = errorsResult?.count || 0\n topPages = (pagesResult.results || []).map((r: any) => ({ path: r.url, views: r.views }))\n recentActivity = (activityResult.results || []) as any[]\n } catch {\n // Tables may not exist yet\n }\n\n const content = `\n
\n
\n

Analytics Dashboard

\n

Last 24 hours overview from system logs

\n
\n\n \n
\n
\n

Total Requests

\n

${totalRequests.toLocaleString()}

\n
\n
\n

Unique Visitors

\n

${uniqueIPs.toLocaleString()}

\n
\n
\n

Avg Response Time

\n

${avgDuration}ms

\n
\n
\n

Errors

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${errorCount.toLocaleString()}

\n
\n
\n\n \n
\n
\n

Top Pages

\n
\n
\n ${topPages.length > 0 ? topPages.map(p => `\n
\n ${escapeHtml(p.path)}\n ${p.views}\n
\n `).join('') : `\n
\n No page views recorded yet. Analytics data will appear once requests are logged.\n
\n `}\n
\n
\n\n \n
\n
\n

Recent Activity

\n
\n
\n \n \n \n \n \n \n \n \n \n \n ${recentActivity.length > 0 ? recentActivity.map(a => `\n \n \n \n \n \n \n `).join('') : `\n \n \n \n `}\n \n
PathMethodStatusDuration
${escapeHtml(a.url || '')}${a.method || ''}= 400 ? 'bg-red-50 text-red-700 dark:bg-red-900/30 dark:text-red-400' : 'bg-green-50 text-green-700 dark:bg-green-900/30 dark:text-green-400'}\">${a.status_code || ''}${a.duration || 0}ms
No activity recorded yet.
\n
\n
\n
\n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Analytics',\n pageTitle: 'Analytics Dashboard',\n currentPath: '/admin/analytics',\n version: c.get('appVersion'),\n user: user ? {\n name: user.email.split('@')[0] || 'Admin',\n email: user.email,\n role: user.role\n } : undefined,\n content,\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"')\n}\n\nexport { adminRoutes as analyticsAdminRoutes }\n","/**\n * Core Analytics Plugin\n * \n * Provides analytics tracking and reporting extensions\n */\n\nimport { Hono } from 'hono'\n// import { z } from 'zod'\nimport { PluginBuilder, PluginHelpers } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { HOOKS } from '../../types'\nimport { analyticsAdminRoutes } from './routes/admin'\n\nexport function createAnalyticsPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'core-analytics',\n version: '1.0.0-beta.1',\n description: 'Core analytics tracking and reporting plugin'\n })\n\n // Add analytics metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^0.1.0',\n dependencies: ['core-auth'] // Requires auth for admin access\n })\n\n // Create analytics API routes\n const analyticsAPI = new Hono()\n\n // GET /analytics/stats - Get analytics overview\n analyticsAPI.get('/stats', async (c) => {\n const timeRange = c.req.query('range') || '7d' // 1d, 7d, 30d, 90d\n const _metric = c.req.query('metric') || 'all' // pageviews, sessions, users, etc.\n\n return c.json({\n message: 'Analytics stats',\n data: {\n pageviews: 12500,\n uniqueVisitors: 3200,\n sessions: 4800,\n avgSessionDuration: 245,\n bounceRate: 0.35,\n topPages: [\n { path: '/', views: 3200 },\n { path: '/about', views: 1800 },\n { path: '/contact', views: 950 }\n ],\n timeRange\n }\n })\n })\n\n // POST /analytics/track - Track analytics event\n analyticsAPI.post('/track', async (c) => {\n const event = await c.req.json()\n \n // Track event (pageview, click, form submission, etc.)\n console.info('Analytics event tracked:', event)\n \n return c.json({\n message: 'Event tracked successfully',\n eventId: `event-${Date.now()}`\n })\n })\n\n // GET /analytics/reports - Get detailed reports\n analyticsAPI.get('/reports', async (c) => {\n const reportType = c.req.query('type') || 'traffic'\n const startDate = c.req.query('start')\n const endDate = c.req.query('end')\n\n return c.json({\n message: 'Analytics report',\n data: {\n reportType,\n dateRange: { start: startDate, end: endDate },\n data: []\n }\n })\n })\n\n // GET /analytics/realtime - Get real-time analytics\n analyticsAPI.get('/realtime', async (c) => {\n return c.json({\n message: 'Real-time analytics',\n data: {\n activeUsers: 23,\n activePages: [\n { path: '/', users: 8 },\n { path: '/blog', users: 5 },\n { path: '/products', users: 4 }\n ],\n recentEvents: []\n }\n })\n })\n\n builder.addRoute('/api/analytics', analyticsAPI, {\n description: 'Analytics tracking and reporting API',\n requiresAuth: true,\n roles: ['admin', 'analytics:read'],\n priority: 3\n })\n\n // Admin dashboard routes\n builder.addRoute('/admin/analytics', analyticsAdminRoutes as any, {\n description: 'Analytics admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // Add analytics tracking middleware\n builder.addSingleMiddleware('analytics-tracker', async (c: any, next: any) => {\n const start = Date.now()\n const path = c.req.path\n const method = c.req.method\n const userAgent = c.req.header('user-agent')\n const referer = c.req.header('referer')\n const ip = c.req.header('CF-Connecting-IP') || c.req.header('x-forwarded-for')\n\n await next()\n\n const duration = Date.now() - start\n const status = c.res.status\n\n // Track request analytics\n const analyticsData = {\n timestamp: new Date().toISOString(),\n path,\n method,\n status,\n duration,\n userAgent,\n referer,\n ip,\n responseSize: c.res.headers.get('content-length') || 0\n }\n\n console.debug('Analytics tracking:', analyticsData)\n \n // Store analytics data (would integrate with analytics service)\n }, {\n description: 'Track page views and request analytics',\n global: true,\n priority: 99 // Run last to capture response data\n })\n\n // Add analytics service\n builder.addService('analyticsService', {\n trackEvent: async (event: any) => {\n // Event tracking implementation\n console.info('Tracking event:', event)\n return { eventId: `event-${Date.now()}` }\n },\n \n trackPageView: async (data: any) => {\n // Page view tracking implementation\n console.info('Tracking pageview:', data.path)\n return { viewId: `view-${Date.now()}` }\n },\n \n getStats: async (_timeRange: string) => {\n // Get analytics statistics\n return {\n pageviews: 12500,\n sessions: 4800,\n uniqueVisitors: 3200\n }\n },\n \n generateReport: async (type: string, options: any) => {\n // Generate analytics reports\n console.info(`Generating ${type} report with options:`, options)\n return { reportId: `report-${Date.now()}` }\n }\n }, {\n description: 'Core analytics tracking service',\n singleton: true\n })\n\n // Add analytics models\n const pageViewSchema = PluginHelpers.createSchema([\n { name: 'path', type: 'string', optional: false },\n { name: 'title', type: 'string', optional: true },\n { name: 'referrer', type: 'string', optional: true },\n { name: 'userAgent', type: 'string', optional: true },\n { name: 'ipAddress', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true },\n { name: 'duration', type: 'number', optional: true }\n ])\n\n const eventSchema = PluginHelpers.createSchema([\n { name: 'eventType', type: 'string', optional: false },\n { name: 'eventName', type: 'string', optional: false },\n { name: 'eventData', type: 'object', optional: true },\n { name: 'path', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true }\n ])\n\n const pageViewMigration = PluginHelpers.createMigration('analytics_pageviews', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'path', type: 'TEXT', nullable: false },\n { name: 'title', type: 'TEXT', nullable: true },\n { name: 'referrer', type: 'TEXT', nullable: true },\n { name: 'user_agent', type: 'TEXT', nullable: true },\n { name: 'ip_address', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true },\n { name: 'duration', type: 'INTEGER', nullable: true }\n ])\n\n const eventMigration = PluginHelpers.createMigration('analytics_events', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'event_type', type: 'TEXT', nullable: false },\n { name: 'event_name', type: 'TEXT', nullable: false },\n { name: 'event_data', type: 'TEXT', nullable: true },\n { name: 'path', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true }\n ])\n\n builder.addModel('PageView', {\n tableName: 'analytics_pageviews',\n schema: pageViewSchema,\n migrations: [pageViewMigration]\n })\n\n builder.addModel('AnalyticsEvent', {\n tableName: 'analytics_events',\n schema: eventSchema,\n migrations: [eventMigration]\n })\n\n // Add analytics hooks\n builder.addHook(HOOKS.REQUEST_START, async (data: any, _context: any) => {\n // Start tracking request\n data.analytics = {\n startTime: Date.now(),\n sessionId: `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n return data\n }, {\n priority: 1,\n description: 'Initialize analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.REQUEST_END, async (data: any, _context: any) => {\n // Complete request tracking\n if (data.analytics) {\n const duration = Date.now() - data.analytics.startTime\n console.debug(`Request completed in ${duration}ms`)\n }\n return data\n }, {\n priority: 1,\n description: 'Complete analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.USER_LOGIN, async (data: any, context: any) => {\n // Track user login events\n await context.services?.analyticsService?.trackEvent({\n eventType: 'auth',\n eventName: 'user_login',\n userId: data.userId,\n eventData: { loginMethod: data.method }\n })\n return data\n }, {\n priority: 8,\n description: 'Track user login events'\n })\n\n builder.addHook('content:view', async (data: any, context: any) => {\n // Track content views\n await context.services?.analyticsService?.trackEvent({\n eventType: 'content',\n eventName: 'content_view',\n eventData: {\n contentId: data.id,\n contentType: data.type,\n title: data.title\n }\n })\n return data\n }, {\n priority: 8,\n description: 'Track content view events'\n })\n\n // Add admin pages\n builder.addAdminPage(\n '/analytics',\n 'Analytics Dashboard',\n 'AnalyticsDashboardView',\n {\n description: 'View analytics overview and key metrics',\n permissions: ['admin', 'analytics:read'],\n icon: 'chart-bar'\n }\n )\n\n builder.addAdminPage(\n '/analytics/reports',\n 'Analytics Reports',\n 'AnalyticsReportsView',\n {\n description: 'Generate and view detailed analytics reports',\n permissions: ['admin', 'analytics:read'],\n icon: 'document-report'\n }\n )\n\n builder.addAdminPage(\n '/analytics/realtime',\n 'Real-time Analytics',\n 'AnalyticsRealtimeView',\n {\n description: 'View real-time visitor activity',\n permissions: ['admin', 'analytics:read'],\n icon: 'lightning-bolt'\n }\n )\n\n builder.addAdminPage(\n '/analytics/settings',\n 'Analytics Settings',\n 'AnalyticsSettingsView',\n {\n description: 'Configure analytics tracking and data collection',\n permissions: ['admin', 'analytics:configure'],\n icon: 'cog'\n }\n )\n\n // Add menu items\n builder.addMenuItem('Analytics', '/admin/analytics', {\n icon: 'chart-bar',\n order: 40,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Dashboard', '/admin/analytics', {\n icon: 'chart-bar',\n parent: 'Analytics',\n order: 1,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Reports', '/admin/analytics/reports', {\n icon: 'document-report',\n parent: 'Analytics',\n order: 2,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Real-time', '/admin/analytics/realtime', {\n icon: 'lightning-bolt',\n parent: 'Analytics',\n order: 3,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Settings', '/admin/analytics/settings', {\n icon: 'cog',\n parent: 'Analytics',\n order: 4,\n permissions: ['admin', 'analytics:configure']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.info('Installing analytics plugin...')\n // Create analytics database tables and initial configuration\n },\n\n activate: async () => {\n console.info('Activating analytics plugin...')\n // Start analytics tracking services\n },\n\n deactivate: async () => {\n console.info('Deactivating analytics plugin...')\n // Stop analytics tracking and clean up resources\n },\n\n configure: async (config) => {\n console.info('Configuring analytics plugin...', config)\n // Update analytics configuration and settings\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const analyticsPlugin = createAnalyticsPlugin()","import type { D1Database } from '@cloudflare/workers-types'\n\nexport interface TrackEventInput {\n event: string\n properties?: Record\n userId?: string\n sessionId?: string\n ipAddress?: string\n userAgent?: string\n path?: string\n category?: string\n}\n\nexport interface EventQueryFilters {\n event?: string\n category?: string\n userId?: string\n sessionId?: string\n startDate?: number\n endDate?: number\n limit?: number\n offset?: number\n}\n\nexport interface EventStats {\n totalEvents: number\n uniqueUsers: number\n uniqueSessions: number\n topEvents: Array<{ event: string; count: number }>\n}\n\nexport class EventTrackingService {\n constructor(private db: D1Database) {}\n\n async trackEvent(input: TrackEventInput): Promise {\n const id = crypto.randomUUID()\n const category = input.category || 'user-activity'\n\n await this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n ).run()\n\n return id\n }\n\n async trackBatch(events: TrackEventInput[]): Promise {\n const ids: string[] = []\n\n const stmts = events.map(input => {\n const id = crypto.randomUUID()\n ids.push(id)\n const category = input.category || 'user-activity'\n\n return this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n )\n })\n\n await this.db.batch(stmts)\n return ids\n }\n\n async queryEvents(filters: EventQueryFilters = {}): Promise<{ events: any[]; total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.event) {\n conditions.push('event = ?')\n params.push(filters.event)\n }\n if (filters.category) {\n conditions.push('category = ?')\n params.push(filters.category)\n }\n if (filters.userId) {\n conditions.push('user_id = ?')\n params.push(filters.userId)\n }\n if (filters.sessionId) {\n conditions.push('session_id = ?')\n params.push(filters.sessionId)\n }\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const limit = filters.limit || 50\n const offset = filters.offset || 0\n\n const [countResult, eventsResult] = await Promise.all([\n this.db.prepare(`SELECT COUNT(*) as total FROM analytics_events ${where}`).bind(...params).first() as Promise<{ total: number } | null>,\n this.db.prepare(`SELECT * FROM analytics_events ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`).bind(...params, limit, offset).all()\n ])\n\n const events = (eventsResult.results || []).map((e: any) => ({\n ...e,\n properties: e.properties ? JSON.parse(e.properties) : null\n }))\n\n return { events, total: countResult?.total || 0 }\n }\n\n async getStats(startDate?: number, endDate?: number): Promise {\n const conditions: string[] = []\n const params: any[] = []\n\n if (startDate) {\n conditions.push('created_at >= ?')\n params.push(startDate)\n }\n if (endDate) {\n conditions.push('created_at <= ?')\n params.push(endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n const [totals, topEvents] = await Promise.all([\n this.db.prepare(`\n SELECT\n COUNT(*) as total_events,\n COUNT(DISTINCT user_id) as unique_users,\n COUNT(DISTINCT session_id) as unique_sessions\n FROM analytics_events ${where}\n `).bind(...params).first() as Promise<{ total_events: number; unique_users: number; unique_sessions: number } | null>,\n this.db.prepare(`\n SELECT event, COUNT(*) as count\n FROM analytics_events ${where}\n GROUP BY event ORDER BY count DESC LIMIT 20\n `).bind(...params).all()\n ])\n\n return {\n totalEvents: totals?.total_events || 0,\n uniqueUsers: totals?.unique_users || 0,\n uniqueSessions: totals?.unique_sessions || 0,\n topEvents: (topEvents.results || []).map((r: any) => ({ event: r.event, count: r.count }))\n }\n }\n}\n","import { Hono } from 'hono'\nimport { EventTrackingService } from '../services/event-tracking-service'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// POST /api/events - Track a single event or batch of events\napiRoutes.post('/', async (c) => {\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || ''\n const user = c.get('user')\n\n let body: any\n try {\n body = await c.req.json()\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400)\n }\n\n // Batch support: accept an array of events\n if (Array.isArray(body)) {\n if (body.length > 100) {\n return c.json({ error: 'Batch size limit is 100 events' }, 400)\n }\n\n const events = body.map(e => ({\n event: e.event,\n category: e.category || 'user-activity',\n properties: e.properties,\n userId: user?.userId || e.userId,\n sessionId: e.sessionId,\n ipAddress: ip,\n userAgent,\n path: e.path\n }))\n\n // Validate all events have an event name\n const invalid = events.find(e => !e.event || typeof e.event !== 'string')\n if (invalid) {\n return c.json({ error: 'Each event must have an \"event\" string field' }, 400)\n }\n\n const ids = await service.trackBatch(events)\n return c.json({ success: true, eventIds: ids, count: ids.length })\n }\n\n // Single event\n if (!body.event || typeof body.event !== 'string') {\n return c.json({ error: '\"event\" field is required and must be a string' }, 400)\n }\n\n const eventId = await service.trackEvent({\n event: body.event,\n category: body.category || 'user-activity',\n properties: body.properties,\n userId: user?.userId || body.userId,\n sessionId: body.sessionId,\n ipAddress: ip,\n userAgent,\n path: body.path\n })\n\n return c.json({ success: true, eventId })\n})\n\n// GET /api/events - Query events (admin only)\napiRoutes.get('/', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const filters = {\n event: c.req.query('event') || undefined,\n category: c.req.query('category') || undefined,\n userId: c.req.query('userId') || undefined,\n sessionId: c.req.query('sessionId') || undefined,\n startDate: c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined,\n endDate: c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n offset: c.req.query('offset') ? parseInt(c.req.query('offset')!) : 0\n }\n\n const result = await service.queryEvents(filters)\n return c.json(result)\n})\n\n// GET /api/events/stats - Aggregated event stats (admin only)\napiRoutes.get('/stats', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const startDate = c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined\n const endDate = c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined\n\n const stats = await service.getStats(startDate, endDate)\n return c.json(stats)\n})\n\nexport { apiRoutes as eventsApiRoutes }\n","/**\n * Cache Configuration\n *\n * Defines cache configurations for different entity types\n */\n\nexport interface CacheConfig {\n ttl: number // Time-to-live in seconds\n kvEnabled: boolean // Use KV cache tier\n memoryEnabled: boolean // Use in-memory cache tier\n namespace: string // Cache namespace/prefix\n invalidateOn: string[] // Events that invalidate this cache\n version?: string // Cache version for busting\n}\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\n/**\n * Default cache configurations by entity type\n */\nexport const CACHE_CONFIGS: Record = {\n // Content (high read, low write)\n content: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'content',\n invalidateOn: ['content.update', 'content.delete', 'content.publish'],\n version: 'v1'\n },\n\n // User data (medium read, medium write)\n user: {\n ttl: 900, // 15 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'user',\n invalidateOn: ['user.update', 'user.delete', 'auth.login'],\n version: 'v1'\n },\n\n // Configuration (high read, very low write)\n config: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'config',\n invalidateOn: ['config.update', 'plugin.activate', 'plugin.deactivate'],\n version: 'v1'\n },\n\n // Media metadata (high read, low write)\n media: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'media',\n invalidateOn: ['media.upload', 'media.delete', 'media.update'],\n version: 'v1'\n },\n\n // API responses (very high read, low write)\n api: {\n ttl: 300, // 5 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'api',\n invalidateOn: ['content.update', 'content.publish'],\n version: 'v1'\n },\n\n // Session data (very high read, medium write)\n session: {\n ttl: 1800, // 30 minutes\n kvEnabled: false, // Only in-memory for sessions\n memoryEnabled: true,\n namespace: 'session',\n invalidateOn: ['auth.logout'],\n version: 'v1'\n },\n\n // Plugin data\n plugin: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'plugin',\n invalidateOn: ['plugin.activate', 'plugin.deactivate', 'plugin.update'],\n version: 'v1'\n },\n\n // Collections/schema\n collection: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'collection',\n invalidateOn: ['collection.update', 'collection.delete'],\n version: 'v1'\n }\n}\n\n/**\n * Get cache configuration for a specific namespace\n */\nexport function getCacheConfig(namespace: string): CacheConfig {\n return CACHE_CONFIGS[namespace] || {\n ttl: 3600,\n kvEnabled: true,\n memoryEnabled: true,\n namespace,\n invalidateOn: [],\n version: 'v1'\n }\n}\n\n/**\n * Generate a cache key with consistent format\n * Format: {namespace}:{type}:{identifier}:{version}\n */\nexport function generateCacheKey(\n namespace: string,\n type: string,\n identifier: string,\n version?: string\n): string {\n const v = version || getCacheConfig(namespace).version || 'v1'\n return `${namespace}:${type}:${identifier}:${v}`\n}\n\n/**\n * Parse a cache key back into its components\n */\nexport function parseCacheKey(key: string): {\n namespace: string\n type: string\n identifier: string\n version: string\n} | null {\n const parts = key.split(':')\n if (parts.length !== 4) {\n return null\n }\n\n return {\n namespace: parts[0] || '',\n type: parts[1] || '',\n identifier: parts[2] || '',\n version: parts[3] || ''\n }\n}\n\n/**\n * Generate a hash for complex query parameters\n */\nexport function hashQueryParams(params: Record): string {\n // Sort keys for consistent hashing\n const sortedKeys = Object.keys(params).sort()\n const normalized = sortedKeys.map(key => `${key}=${params[key]}`).join('&')\n\n // Simple hash function (for better performance, consider using crypto)\n let hash = 0\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Create a pattern for cache invalidation\n */\nexport function createCachePattern(\n namespace: string,\n type?: string,\n identifier?: string\n): string {\n let pattern = namespace\n if (type) pattern += `:${type}`\n if (identifier) pattern += `:${identifier}`\n return pattern + ':*'\n}\n","/**\n * Cache Service\n *\n * Three-tiered caching implementation:\n * 1. In-Memory Cache (fastest, region-specific)\n * 2. Cloudflare KV Cache (fast, global)\n * 3. Database (fallback, source of truth)\n */\n\nimport { CacheConfig, CacheStats, generateCacheKey } from './cache-config.js'\n\n/**\n * Cache entry with metadata\n */\ninterface CacheEntry {\n data: T\n timestamp: number\n expiresAt: number\n version: string\n}\n\n/**\n * In-memory cache store\n */\nclass MemoryCache {\n private cache: Map> = new Map()\n private maxSize: number = 50 * 1024 * 1024 // 50MB\n private currentSize: number = 0\n\n /**\n * Get item from memory cache\n */\n get(key: string): T | null {\n const entry = this.cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n this.delete(key)\n return null\n }\n\n return entry.data as T\n }\n\n /**\n * Set item in memory cache\n */\n set(key: string, value: T, ttl: number, version: string = 'v1'): void {\n const now = Date.now()\n const entry: CacheEntry = {\n data: value,\n timestamp: now,\n expiresAt: now + (ttl * 1000),\n version\n }\n\n // Estimate size (rough approximation)\n const entrySize = JSON.stringify(entry).length * 2 // UTF-16\n\n // Check if we need to evict\n if (this.currentSize + entrySize > this.maxSize) {\n this.evictLRU(entrySize)\n }\n\n // Delete old entry if exists\n if (this.cache.has(key)) {\n this.delete(key)\n }\n\n this.cache.set(key, entry)\n this.currentSize += entrySize\n }\n\n /**\n * Delete item from memory cache\n */\n delete(key: string): boolean {\n const entry = this.cache.get(key)\n if (entry) {\n const entrySize = JSON.stringify(entry).length * 2\n this.currentSize -= entrySize\n return this.cache.delete(key)\n }\n return false\n }\n\n /**\n * Clear all items from memory cache\n */\n clear(): void {\n this.cache.clear()\n this.currentSize = 0\n }\n\n /**\n * Get cache statistics\n */\n getStats(): { size: number; count: number } {\n return {\n size: this.currentSize,\n count: this.cache.size\n }\n }\n\n /**\n * Evict least recently used items to make space\n */\n private evictLRU(neededSpace: number): void {\n // Sort by timestamp (oldest first)\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp\n )\n\n let freedSpace = 0\n for (const [key, entry] of entries) {\n if (freedSpace >= neededSpace) break\n\n const entrySize = JSON.stringify(entry).length * 2\n this.delete(key)\n freedSpace += entrySize\n }\n }\n\n /**\n * Delete items matching a pattern\n */\n invalidatePattern(pattern: string): number {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n let count = 0\n for (const key of this.cache.keys()) {\n if (regex.test(key)) {\n this.delete(key)\n count++\n }\n }\n\n return count\n }\n}\n\n/**\n * Cache result with source information\n */\nexport interface CacheResult {\n data: T | null\n source: 'memory' | 'kv' | 'miss'\n hit: boolean\n timestamp?: number\n ttl?: number\n}\n\n/**\n * Main cache service with multi-tier support\n */\nexport class CacheService {\n private memoryCache: MemoryCache\n private config: CacheConfig\n private stats: CacheStats\n private kvNamespace?: KVNamespace\n\n constructor(config: CacheConfig, kvNamespace?: KVNamespace) {\n this.memoryCache = new MemoryCache()\n this.config = config\n this.kvNamespace = kvNamespace\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Get value from cache (tries memory first, then KV)\n */\n async get(key: string): Promise {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n return memoryValue\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return kvValue as T\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return null\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise> {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n\n const entry = await this.getEntry(key)\n return {\n data: memoryValue,\n source: 'memory',\n hit: true,\n timestamp: entry?.timestamp,\n ttl: entry?.ttl\n }\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return {\n data: kvValue as T,\n source: 'kv',\n hit: true\n }\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return {\n data: null,\n source: 'miss',\n hit: false\n }\n }\n\n /**\n * Set value in cache (stores in both memory and KV)\n */\n async set(\n key: string,\n value: T,\n customConfig?: Partial\n ): Promise {\n const config = { ...this.config, ...customConfig }\n\n // Store in memory cache (Tier 1)\n if (config.memoryEnabled) {\n this.memoryCache.set(key, value, config.ttl, config.version)\n }\n\n // Store in KV cache (Tier 2)\n if (config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.put(key, JSON.stringify(value), {\n expirationTtl: config.ttl\n })\n } catch (error) {\n console.error('KV cache write error:', error)\n }\n }\n }\n\n /**\n * Delete value from cache (removes from both memory and KV)\n */\n async delete(key: string): Promise {\n // Delete from memory (Tier 1)\n if (this.config.memoryEnabled) {\n this.memoryCache.delete(key)\n }\n\n // Delete from KV (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.delete(key)\n } catch (error) {\n console.error('KV cache delete error:', error)\n }\n }\n }\n\n /**\n * Clear all cache entries for this namespace\n */\n async clear(): Promise {\n if (this.config.memoryEnabled) {\n this.memoryCache.clear()\n }\n\n // Reset stats\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Invalidate cache entries matching a pattern\n */\n async invalidate(pattern: string): Promise {\n let count = 0\n\n // Invalidate from memory (Tier 1)\n if (this.config.memoryEnabled) {\n count += this.memoryCache.invalidatePattern(pattern)\n }\n\n // Invalidate from KV (Tier 2)\n // Note: KV doesn't support pattern matching, so we need to list all keys\n // This is expensive and should be used sparingly\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n // List all keys with the namespace prefix\n const prefix = this.config.namespace + ':'\n const list = await this.kvNamespace.list({ prefix })\n\n for (const key of list.keys) {\n if (regex.test(key.name)) {\n await this.kvNamespace.delete(key.name)\n count++\n }\n }\n } catch (error) {\n console.error('KV cache invalidation error:', error)\n }\n }\n\n return count\n }\n\n /**\n * Invalidate cache entries matching a pattern (alias for invalidate)\n */\n async invalidatePattern(pattern: string): Promise {\n return this.invalidate(pattern)\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const memStats = this.memoryCache.getStats()\n\n return {\n ...this.stats,\n memorySize: memStats.size,\n entryCount: memStats.count\n }\n }\n\n /**\n * Update hit rate calculation\n */\n private updateHitRate(): void {\n const totalHits = this.stats.memoryHits + this.stats.kvHits + this.stats.dbHits\n this.stats.hitRate = this.stats.totalRequests > 0\n ? (totalHits / this.stats.totalRequests) * 100\n : 0\n }\n\n /**\n * Generate a cache key using the configured namespace\n */\n generateKey(type: string, identifier: string): string {\n return generateCacheKey(\n this.config.namespace,\n type,\n identifier,\n this.config.version\n )\n }\n\n /**\n * Warm cache with multiple entries\n */\n async warmCache(entries: Array<{ key: string; value: T }>): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value)\n }\n }\n\n /**\n * Check if a key exists in cache\n */\n async has(key: string): Promise {\n const value = await this.get(key)\n return value !== null\n }\n\n /**\n * Get multiple values at once\n */\n async getMany(keys: string[]): Promise> {\n const results = new Map()\n\n for (const key of keys) {\n const value = await this.get(key)\n if (value !== null) {\n results.set(key, value)\n }\n }\n\n return results\n }\n\n /**\n * Set multiple values at once\n */\n async setMany(\n entries: Array<{ key: string; value: T }>,\n customConfig?: Partial\n ): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value, customConfig)\n }\n }\n\n /**\n * Delete multiple keys at once\n */\n async deleteMany(keys: string[]): Promise {\n for (const key of keys) {\n await this.delete(key)\n }\n }\n\n /**\n * Get or set pattern - fetch from cache or compute if not found\n */\n async getOrSet(\n key: string,\n fetcher: () => Promise,\n customConfig?: Partial\n ): Promise {\n // Try to get from cache\n const cached = await this.get(key)\n if (cached !== null) {\n return cached\n }\n\n // Fetch from source\n const value = await fetcher()\n\n // Store in cache\n await this.set(key, value, customConfig)\n\n return value\n }\n\n /**\n * List all cache keys with metadata\n */\n async listKeys(): Promise> {\n const keys: Array<{ key: string; size: number; expiresAt: number; age: number }> = []\n\n // Get keys from memory cache\n if (this.config.memoryEnabled) {\n const cache = (this.memoryCache as any).cache as Map>\n for (const [key, entry] of cache.entries()) {\n const size = JSON.stringify(entry).length * 2\n const age = Date.now() - entry.timestamp\n keys.push({\n key,\n size,\n expiresAt: entry.expiresAt,\n age\n })\n }\n }\n\n // Sort by age (newest first)\n return keys.sort((a, b) => a.age - b.age)\n }\n\n /**\n * Get cache entry with full metadata\n */\n async getEntry(key: string): Promise<{\n data: T\n timestamp: number\n expiresAt: number\n ttl: number\n size: number\n } | null> {\n if (!this.config.memoryEnabled) {\n return null\n }\n\n const cache = (this.memoryCache as any).cache as Map>\n const entry = cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n await this.delete(key)\n return null\n }\n\n const size = JSON.stringify(entry).length * 2\n const ttl = Math.max(0, entry.expiresAt - Date.now()) / 1000\n\n return {\n data: entry.data as T,\n timestamp: entry.timestamp,\n expiresAt: entry.expiresAt,\n ttl,\n size\n }\n }\n}\n\n/**\n * Create a cache service instance with configuration\n */\nexport function createCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n return new CacheService(config, kvNamespace)\n}\n\n/**\n * Global cache instances by namespace (singleton pattern)\n */\nconst cacheInstances = new Map()\nlet globalKVNamespace: KVNamespace | undefined\n\n/**\n * Set global KV namespace for all cache instances\n */\nexport function setGlobalKVNamespace(kvNamespace: KVNamespace): void {\n globalKVNamespace = kvNamespace\n}\n\n/**\n * Get or create a cache service for a namespace\n */\nexport function getCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n const key = config.namespace\n\n if (!cacheInstances.has(key)) {\n // Use provided KV namespace or global one\n const kv = kvNamespace || globalKVNamespace\n cacheInstances.set(key, new CacheService(config, kv))\n }\n\n return cacheInstances.get(key)!\n}\n\n/**\n * Clear all cache instances\n */\nexport async function clearAllCaches(): Promise {\n for (const cache of cacheInstances.values()) {\n await cache.clear()\n }\n}\n\n/**\n * Get stats from all cache instances\n */\nexport function getAllCacheStats(): Record {\n const stats: Record = {}\n\n for (const [namespace, cache] of cacheInstances.entries()) {\n stats[namespace] = cache.getStats()\n }\n\n return stats\n}\n","/**\n * Event Bus for Cache Invalidation\n *\n * Provides a centralized event system for triggering cache invalidation\n * based on application events.\n */\n\nexport type EventHandler = (data?: any) => Promise | void\n\n// interface EventSubscription {\n// event: string\n// handler: EventHandler\n// }\n\nclass EventBus {\n private subscriptions: Map = new Map()\n private eventLog: Array<{ event: string; timestamp: number; data?: any }> = []\n private maxLogSize: number = 100\n\n /**\n * Subscribe to an event\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.subscriptions.has(event)) {\n this.subscriptions.set(event, [])\n }\n\n this.subscriptions.get(event)!.push(handler)\n\n // Return unsubscribe function\n return () => {\n const handlers = this.subscriptions.get(event)\n if (handlers) {\n const index = handlers.indexOf(handler)\n if (index > -1) {\n handlers.splice(index, 1)\n }\n }\n }\n }\n\n /**\n * Emit an event to all subscribers\n */\n async emit(event: string, data?: any): Promise {\n // Log the event\n this.logEvent(event, data)\n\n const handlers = this.subscriptions.get(event) || []\n\n // Execute all handlers\n await Promise.all(\n handlers.map(async (handler) => {\n try {\n await handler(data)\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error)\n }\n })\n )\n\n // Also emit to wildcard subscribers\n const wildcardHandlers = this.subscriptions.get('*') || []\n await Promise.all(\n wildcardHandlers.map(async (handler) => {\n try {\n await handler({ event, data })\n } catch (error) {\n console.error(`Error in wildcard event handler for ${event}:`, error)\n }\n })\n )\n }\n\n /**\n * Remove all subscribers for an event\n */\n off(event: string): void {\n this.subscriptions.delete(event)\n }\n\n /**\n * Get all registered events\n */\n getEvents(): string[] {\n return Array.from(this.subscriptions.keys())\n }\n\n /**\n * Get subscriber count for an event\n */\n getSubscriberCount(event: string): number {\n return this.subscriptions.get(event)?.length || 0\n }\n\n /**\n * Log an event for debugging\n */\n private logEvent(event: string, data?: any): void {\n this.eventLog.push({\n event,\n timestamp: Date.now(),\n data\n })\n\n // Keep log size manageable\n if (this.eventLog.length > this.maxLogSize) {\n this.eventLog.shift()\n }\n }\n\n /**\n * Get recent event log\n */\n getEventLog(limit: number = 50): Array<{ event: string; timestamp: number; data?: any }> {\n return this.eventLog.slice(-limit)\n }\n\n /**\n * Clear event log\n */\n clearEventLog(): void {\n this.eventLog = []\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n totalEvents: number\n totalSubscriptions: number\n eventCounts: Record\n } {\n const eventCounts: Record = {}\n\n for (const log of this.eventLog) {\n eventCounts[log.event] = (eventCounts[log.event] || 0) + 1\n }\n\n return {\n totalEvents: this.eventLog.length,\n totalSubscriptions: this.subscriptions.size,\n eventCounts\n }\n }\n}\n\n// Global event bus instance\nlet globalEventBus: EventBus | null = null\n\n/**\n * Get or create the global event bus\n */\nexport function getEventBus(): EventBus {\n if (!globalEventBus) {\n globalEventBus = new EventBus()\n }\n return globalEventBus\n}\n\n/**\n * Convenience function to emit an event\n */\nexport async function emitEvent(event: string, data?: any): Promise {\n const bus = getEventBus()\n await bus.emit(event, data)\n}\n\n/**\n * Convenience function to subscribe to an event\n */\nexport function onEvent(event: string, handler: EventHandler): () => void {\n const bus = getEventBus()\n return bus.on(event, handler)\n}\n","/**\n * Cache Invalidation Service\n *\n * Automatically invalidates cache entries based on application events\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\nimport { getEventBus, onEvent } from './event-bus.js'\n\n/**\n * Setup automatic cache invalidation based on events\n */\nexport function setupCacheInvalidation(): void {\n const _eventBus = getEventBus()\n\n // Content cache invalidation\n setupContentInvalidation()\n\n // User cache invalidation\n setupUserInvalidation()\n\n // Config cache invalidation\n setupConfigInvalidation()\n\n // Media cache invalidation\n setupMediaInvalidation()\n\n // API cache invalidation\n setupAPIInvalidation()\n\n // Collection cache invalidation\n setupCollectionInvalidation()\n\n console.log('Cache invalidation listeners registered')\n}\n\n/**\n * Content cache invalidation\n */\nfunction setupContentInvalidation(): void {\n const config = CACHE_CONFIGS.content\n if (!config) return\n const contentCache = getCacheService(config)\n\n // Invalidate on content updates\n onEvent('content.create', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.create')\n })\n\n onEvent('content.update', async (data) => {\n if (data?.id) {\n // Invalidate specific content item\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n // Invalidate all content lists\n await contentCache.invalidate('content:list:*')\n console.log('Cache invalidated: content.update', data?.id)\n })\n\n onEvent('content.delete', async (data) => {\n if (data?.id) {\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.delete', data?.id)\n })\n\n onEvent('content.publish', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.publish')\n })\n}\n\n/**\n * User cache invalidation\n */\nfunction setupUserInvalidation(): void {\n const config = CACHE_CONFIGS.user\n if (!config) return\n const userCache = getCacheService(config)\n\n onEvent('user.update', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.update', data?.id)\n })\n\n onEvent('user.delete', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.delete', data?.id)\n })\n\n onEvent('auth.login', async (data) => {\n if (data?.userId) {\n await userCache.delete(userCache.generateKey('id', data.userId))\n }\n console.log('Cache invalidated: auth.login', data?.userId)\n })\n\n onEvent('auth.logout', async (data) => {\n // Clear session cache\n const sessionConfig = CACHE_CONFIGS.session\n if (sessionConfig) {\n const sessionCache = getCacheService(sessionConfig)\n if (data?.sessionId) {\n await sessionCache.delete(sessionCache.generateKey('session', data.sessionId))\n }\n }\n console.log('Cache invalidated: auth.logout')\n })\n}\n\n/**\n * Config cache invalidation\n */\nfunction setupConfigInvalidation(): void {\n const configConfig = CACHE_CONFIGS.config\n if (!configConfig) return\n const configCache = getCacheService(configConfig)\n\n onEvent('config.update', async (_data) => {\n await configCache.invalidate('config:*')\n console.log('Cache invalidated: config.update')\n })\n\n onEvent('plugin.activate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.activate', data?.pluginId)\n })\n\n onEvent('plugin.deactivate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.deactivate', data?.pluginId)\n })\n\n onEvent('plugin.update', async (data) => {\n const pluginConfig = CACHE_CONFIGS.plugin\n if (!pluginConfig) return\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n console.log('Cache invalidated: plugin.update', data?.pluginId)\n })\n}\n\n/**\n * Media cache invalidation\n */\nfunction setupMediaInvalidation(): void {\n const config = CACHE_CONFIGS.media\n if (!config) return\n const mediaCache = getCacheService(config)\n\n onEvent('media.upload', async (_data) => {\n await mediaCache.invalidate('media:*')\n console.log('Cache invalidated: media.upload')\n })\n\n onEvent('media.delete', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.delete', data?.id)\n })\n\n onEvent('media.update', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.update', data?.id)\n })\n}\n\n/**\n * API cache invalidation (depends on content changes)\n */\nfunction setupAPIInvalidation(): void {\n const config = CACHE_CONFIGS.api\n if (!config) return\n const apiCache = getCacheService(config)\n\n onEvent('content.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.update)')\n })\n\n onEvent('content.publish', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.publish)')\n })\n\n onEvent('content.create', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.create)')\n })\n\n onEvent('content.delete', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.delete)')\n })\n\n onEvent('collection.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (collection.update)')\n })\n}\n\n/**\n * Collection cache invalidation\n */\nfunction setupCollectionInvalidation(): void {\n const config = CACHE_CONFIGS.collection\n if (!config) return\n const collectionCache = getCacheService(config)\n\n onEvent('collection.create', async (_data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.create')\n })\n\n onEvent('collection.update', async (data) => {\n if (data?.id) {\n await collectionCache.delete(collectionCache.generateKey('item', data.id))\n }\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.update', data?.id)\n })\n\n onEvent('collection.delete', async (data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.delete', data?.id)\n })\n}\n\n/**\n * Get invalidation statistics\n */\nexport function getCacheInvalidationStats() {\n const eventBus = getEventBus()\n return eventBus.getStats()\n}\n\n/**\n * Get recent invalidation events\n */\nexport function getRecentInvalidations(limit: number = 50) {\n const eventBus = getEventBus()\n return eventBus.getEventLog(limit)\n}\n","/**\n * Cache Warming Utilities\n *\n * Utilities for preloading and warming cache entries\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\n\n/**\n * Warm cache with common queries\n */\nexport async function warmCommonCaches(db: D1Database): Promise<{\n warmed: number\n errors: number\n details: Array<{ namespace: string; count: number }>\n}> {\n let totalWarmed = 0\n let totalErrors = 0\n const details: Array<{ namespace: string; count: number }> = []\n\n try {\n // Warm collection cache\n const collectionCount = await warmCollections(db)\n totalWarmed += collectionCount\n details.push({ namespace: 'collection', count: collectionCount })\n\n // Warm content cache (most recent items)\n const contentCount = await warmRecentContent(db)\n totalWarmed += contentCount\n details.push({ namespace: 'content', count: contentCount })\n\n // Warm media cache (most recent items)\n const mediaCount = await warmRecentMedia(db)\n totalWarmed += mediaCount\n details.push({ namespace: 'media', count: mediaCount })\n\n } catch (error) {\n console.error('Error warming caches:', error)\n totalErrors++\n }\n\n return {\n warmed: totalWarmed,\n errors: totalErrors,\n details\n }\n}\n\n/**\n * Warm collections cache\n */\nasync function warmCollections(db: D1Database): Promise {\n const config = CACHE_CONFIGS.collection\n if (!config) return 0\n const collectionCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare('SELECT * FROM collections WHERE is_active = 1')\n const { results } = await stmt.all()\n\n for (const collection of results as any[]) {\n const key = collectionCache.generateKey('item', collection.id)\n await collectionCache.set(key, collection)\n count++\n }\n\n // Also cache the full list\n const listKey = collectionCache.generateKey('list', 'all')\n await collectionCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming collections cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent content cache\n */\nasync function warmRecentContent(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.content\n if (!config) return 0\n const contentCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM content ORDER BY created_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const content of results as any[]) {\n const key = contentCache.generateKey('item', content.id)\n await contentCache.set(key, content)\n count++\n }\n\n // Cache the list\n const listKey = contentCache.generateKey('list', 'recent')\n await contentCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming content cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent media cache\n */\nasync function warmRecentMedia(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.media\n if (!config) return 0\n const mediaCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const media of results as any[]) {\n const key = mediaCache.generateKey('item', media.id)\n await mediaCache.set(key, media)\n count++\n }\n\n // Cache the list\n const listKey = mediaCache.generateKey('list', 'recent')\n await mediaCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming media cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm specific namespace with custom data\n */\nexport async function warmNamespace(\n namespace: string,\n entries: Array<{ key: string; value: any }>\n): Promise {\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n throw new Error(`Unknown namespace: ${namespace}`)\n }\n\n const cache = getCacheService(config)\n await cache.setMany(entries)\n\n return entries.length\n}\n\n/**\n * Preload cache on application startup\n */\nexport async function preloadCache(db: D1Database): Promise {\n console.log('🔥 Preloading cache...')\n\n const result = await warmCommonCaches(db)\n\n console.log(`✅ Cache preloaded: ${result.warmed} entries across ${result.details.length} namespaces`)\n result.details.forEach(detail => {\n console.log(` - ${detail.namespace}: ${detail.count} entries`)\n })\n\n if (result.errors > 0) {\n console.warn(`⚠️ ${result.errors} errors during cache preloading`)\n }\n}\n\n/**\n * Schedule periodic cache warming\n */\nexport function schedulePeriodicWarming(\n db: D1Database,\n intervalMs: number = 300000 // 5 minutes default\n): NodeJS.Timeout {\n console.log(`⏰ Scheduling periodic cache warming every ${intervalMs / 1000}s`)\n\n return setInterval(async () => {\n try {\n console.log('🔄 Running periodic cache warming...')\n await warmCommonCaches(db)\n } catch (error) {\n console.error('Error during periodic cache warming:', error)\n }\n }, intervalMs)\n}\n","/**\n * Admin Cache Dashboard Template\n *\n * Moved from @sonicjs-cms/templates to avoid circular dependency\n * during build (templates imports from core, core can't import from templates)\n */\n\nimport { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\nexport interface CacheDashboardData {\n stats: Record\n totals: {\n hits: number\n misses: number\n requests: number\n hitRate: string\n memorySize: number\n entryCount: number\n }\n namespaces: string[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCacheDashboard(data: CacheDashboardData): string {\n const pageContent = `\n
\n \n
\n
\n

Cache System

\n

\n Monitor and manage cache performance across all namespaces\n

\n
\n
\n \n \n \n \n Refresh\n \n \n \n \n \n Clear All\n \n
\n
\n\n \n
\n ${renderStatCard('Total Requests', data.totals.requests.toLocaleString(), 'lime', `\n \n \n \n `)}\n\n ${renderStatCard('Hit Rate', data.totals.hitRate + '%', 'blue', `\n \n \n \n `, parseFloat(data.totals.hitRate) > 70 ? 'lime' : parseFloat(data.totals.hitRate) > 40 ? 'amber' : 'red')}\n\n ${renderStatCard('Memory Usage', formatBytes(data.totals.memorySize), 'purple', `\n \n \n \n `)}\n\n ${renderStatCard('Cached Entries', data.totals.entryCount.toLocaleString(), 'sky', `\n \n \n \n `)}\n
\n\n \n
\n
\n

Cache Namespaces

\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ${data.namespaces.map(namespace => {\n const stat = data.stats[namespace]\n if (!stat) return ''\n return renderNamespaceRow(namespace, stat)\n }).join('')}\n \n
\n Namespace\n \n Requests\n \n Hit Rate\n \n Memory Hits\n \n KV Hits\n \n Entries\n \n Size\n \n Actions\n
\n
\n
\n\n \n
\n
\n

Performance Overview

\n
\n
\n
\n ${renderPerformanceMetric('Memory Cache', data.totals.hits, data.totals.misses)}\n ${renderHealthStatus(parseFloat(data.totals.hitRate))}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'clear-all-cache-confirm',\n title: 'Clear All Cache',\n message: 'Are you sure you want to clear all cache entries? This cannot be undone.',\n confirmText: 'Clear All',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearAllCaches()'\n })}\n\n ${renderConfirmationDialog({\n id: 'clear-namespace-cache-confirm',\n title: 'Clear Namespace Cache',\n message: 'Clear cache for this namespace?',\n confirmText: 'Clear',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearNamespaceCache()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Cache System',\n pageTitle: 'Cache System',\n currentPath: '/admin/cache',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderStatCard(label: string, value: string, color: string, icon: string, colorOverride?: string): string {\n const finalColor = colorOverride || color\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n blue: 'bg-blue-50 dark:bg-blue-500/10 text-blue-600 dark:text-blue-400 ring-blue-600/20 dark:ring-blue-500/20',\n purple: 'bg-purple-50 dark:bg-purple-500/10 text-purple-600 dark:text-purple-400 ring-purple-600/20 dark:ring-purple-500/20',\n sky: 'bg-sky-50 dark:bg-sky-500/10 text-sky-600 dark:text-sky-400 ring-sky-600/20 dark:ring-sky-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n
\n
\n
\n
\n ${icon}\n
\n
\n

${label}

\n

${value}

\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderNamespaceRow(namespace: string, stat: CacheStats): string {\n const hitRate = stat.hitRate.toFixed(1)\n const hitRateColor = stat.hitRate > 70 ? 'text-lime-600 dark:text-lime-400' :\n stat.hitRate > 40 ? 'text-amber-600 dark:text-amber-400' :\n 'text-red-600 dark:text-red-400'\n\n return `\n \n \n \n ${namespace}\n \n \n \n ${stat.totalRequests.toLocaleString()}\n \n \n \n ${hitRate}%\n \n \n \n ${stat.memoryHits.toLocaleString()}\n \n \n ${stat.kvHits.toLocaleString()}\n \n \n ${stat.entryCount.toLocaleString()}\n \n \n ${formatBytes(stat.memorySize)}\n \n \n \n Clear\n \n \n \n `\n}\n\nfunction renderPerformanceMetric(label: string, hits: number, misses: number): string {\n const total = hits + misses\n const hitPercentage = total > 0 ? (hits / total) * 100 : 0\n\n return `\n
\n

${label}

\n
\n
\n Hits\n ${hits.toLocaleString()}\n
\n
\n Misses\n ${misses.toLocaleString()}\n
\n
\n
\n Hit Rate\n ${hitPercentage.toFixed(1)}%\n
\n
\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderHealthStatus(hitRate: number): string {\n const status = hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'critical'\n const statusConfig = {\n healthy: {\n label: 'Healthy',\n color: 'lime',\n icon: `\n \n `\n },\n warning: {\n label: 'Needs Attention',\n color: 'amber',\n icon: `\n \n `\n },\n critical: {\n label: 'Critical',\n color: 'red',\n icon: `\n \n `\n }\n }\n\n const config = statusConfig[status]\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n

System Health

\n
\n ${config.icon}\n
\n

${config.label}

\n

\n ${status === 'healthy' ? 'Cache is performing well' :\n status === 'warning' ? 'Consider increasing cache TTL or capacity' :\n 'Cache hit rate is too low'}\n

\n
\n
\n
\n `\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`\n}\n","/**\n * Cache Plugin Routes\n *\n * Admin routes for cache management\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport { getAllCacheStats, clearAllCaches, getCacheService } from './services/cache.js'\nimport { CACHE_CONFIGS, parseCacheKey } from './services/cache-config.js'\nimport { getRecentInvalidations, getCacheInvalidationStats } from './services/cache-invalidation.js'\nimport { warmCommonCaches, warmNamespace } from './services/cache-warming.js'\nimport { renderCacheDashboard, CacheDashboardData } from '../../templates/pages/admin-cache.template'\n\nconst app = new Hono()\n\n/**\n * GET /admin/cache\n * Cache statistics dashboard\n */\napp.get('/', async (c: Context) => {\n const stats = getAllCacheStats()\n const user = c.get('user')\n\n // Calculate totals\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n Object.values(stats).forEach(stat => {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n })\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n const dashboardData: CacheDashboardData = {\n stats,\n totals: {\n hits: totalHits,\n misses: totalMisses,\n requests: totalRequests,\n hitRate: overallHitRate.toFixed(2),\n memorySize: totalSize,\n entryCount: totalEntries\n },\n namespaces: Object.keys(stats),\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCacheDashboard(dashboardData))\n})\n\n/**\n * GET /admin/cache/stats\n * Detailed statistics for all namespaces\n */\napp.get('/stats', async (c: Context) => {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/stats/:namespace\n * Statistics for a specific namespace\n */\napp.get('/stats/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const stats = cache.getStats()\n\n return c.json({\n success: true,\n data: {\n namespace,\n config,\n stats\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear\n * Clear all cache entries\n */\napp.post('/clear', async (c: Context) => {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear/:namespace\n * Clear cache for a specific namespace\n */\napp.post('/clear/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n await cache.clear()\n\n return c.json({\n success: true,\n message: `Cache cleared for namespace: ${namespace}`,\n namespace,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/invalidate\n * Invalidate cache entries matching a pattern\n */\napp.post('/invalidate', async (c: Context) => {\n const body = await c.req.json()\n const { pattern, namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (namespace) {\n // Invalidate from specific namespace\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: namespace || 'all',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/health\n * Cache system health check\n */\napp.get('/health', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // Calculate health metrics\n const namespaces = Object.entries(stats)\n const healthChecks = namespaces.map(([name, stat]) => {\n const hitRate = stat.hitRate\n const memoryUsage = stat.memorySize / (50 * 1024 * 1024) // Assume 50MB max\n\n return {\n namespace: name,\n status: hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'unhealthy',\n hitRate,\n memoryUsage: (memoryUsage * 100).toFixed(2) + '%',\n entryCount: stat.entryCount\n }\n })\n\n const overallStatus = healthChecks.every(h => h.status === 'healthy')\n ? 'healthy'\n : healthChecks.some(h => h.status === 'unhealthy')\n ? 'unhealthy'\n : 'warning'\n\n return c.json({\n success: true,\n data: {\n status: overallStatus,\n namespaces: healthChecks,\n timestamp: new Date().toISOString()\n }\n })\n})\n\n/**\n * GET /admin/cache/browser\n * Browse all cache entries across namespaces\n */\napp.get('/browser', async (c: Context) => {\n const namespace = c.req.query('namespace') || 'all'\n const search = c.req.query('search') || ''\n const sortBy = c.req.query('sort') || 'age' // age, size, key\n const limit = parseInt(c.req.query('limit') || '100')\n\n const entries: Array<{\n namespace: string\n key: string\n size: number\n age: number\n ttl: number\n expiresAt: number\n parsed: any\n }> = []\n\n const namespaces = namespace === 'all'\n ? Object.keys(CACHE_CONFIGS)\n : [namespace]\n\n for (const ns of namespaces) {\n const config = CACHE_CONFIGS[ns]\n if (!config) continue\n\n const cache = getCacheService(config)\n const keys = await cache.listKeys()\n\n for (const keyInfo of keys) {\n // Apply search filter\n if (search && !keyInfo.key.toLowerCase().includes(search.toLowerCase())) {\n continue\n }\n\n const parsed = parseCacheKey(keyInfo.key)\n const ttl = Math.max(0, keyInfo.expiresAt - Date.now()) / 1000\n\n entries.push({\n namespace: ns,\n key: keyInfo.key,\n size: keyInfo.size,\n age: keyInfo.age,\n ttl,\n expiresAt: keyInfo.expiresAt,\n parsed\n })\n }\n }\n\n // Sort entries\n if (sortBy === 'size') {\n entries.sort((a, b) => b.size - a.size)\n } else if (sortBy === 'age') {\n entries.sort((a, b) => a.age - b.age)\n } else if (sortBy === 'key') {\n entries.sort((a, b) => a.key.localeCompare(b.key))\n }\n\n // Limit results\n const limitedEntries = entries.slice(0, limit)\n\n return c.json({\n success: true,\n data: {\n entries: limitedEntries,\n total: entries.length,\n showing: limitedEntries.length,\n namespace,\n search,\n sortBy\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/browser/:namespace/:key\n * Get detailed information about a specific cache entry\n */\napp.get('/browser/:namespace/:key', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const key = decodeURIComponent(c.req.param('key')!)\n\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const entry = await cache.getEntry(key)\n\n if (!entry) {\n return c.json({\n success: false,\n error: 'Cache entry not found or expired'\n }, 404)\n }\n\n const parsed = parseCacheKey(key)\n\n return c.json({\n success: true,\n data: {\n key,\n namespace,\n parsed,\n ...entry,\n createdAt: new Date(entry.timestamp).toISOString(),\n expiresAt: new Date(entry.expiresAt).toISOString()\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics\n * Advanced cache analytics\n */\napp.get('/analytics', async (c: Context) => {\n const stats = getAllCacheStats()\n const invalidationStats = getCacheInvalidationStats()\n const recentInvalidations = getRecentInvalidations(20)\n\n // Calculate analytics\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n const namespacesAnalytics = []\n\n for (const [namespace, stat] of Object.entries(stats)) {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n\n const totalRequests = stat.memoryHits + stat.kvHits + stat.memoryMisses + stat.kvMisses\n const hitRate = totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / totalRequests) * 100 : 0\n const avgEntrySize = stat.entryCount > 0 ? stat.memorySize / stat.entryCount : 0\n\n namespacesAnalytics.push({\n namespace,\n hitRate: hitRate.toFixed(2),\n totalRequests,\n memoryHitRate: totalRequests > 0 ? ((stat.memoryHits / totalRequests) * 100).toFixed(2) : '0',\n kvHitRate: totalRequests > 0 ? ((stat.kvHits / totalRequests) * 100).toFixed(2) : '0',\n avgEntrySize: Math.round(avgEntrySize),\n totalSize: stat.memorySize,\n entryCount: stat.entryCount,\n efficiency: totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / (stat.memoryHits + stat.kvHits + stat.dbHits + 1)).toFixed(2) : '0'\n })\n }\n\n // Sort by hit rate\n namespacesAnalytics.sort((a, b) => parseFloat(b.hitRate) - parseFloat(a.hitRate))\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n // Calculate cost savings (assume 50ms per DB query vs 2ms for cache)\n const dbQueriesAvoided = totalHits\n const timeSaved = dbQueriesAvoided * 48 // 48ms saved per cache hit\n const estimatedCostSavings = (dbQueriesAvoided / 1000000) * 0.50 // $0.50 per million queries\n\n return c.json({\n success: true,\n data: {\n overview: {\n totalHits,\n totalMisses,\n totalRequests,\n overallHitRate: overallHitRate.toFixed(2),\n totalSize,\n totalEntries,\n avgEntrySize: totalEntries > 0 ? Math.round(totalSize / totalEntries) : 0\n },\n performance: {\n dbQueriesAvoided,\n timeSavedMs: timeSaved,\n timeSavedMinutes: (timeSaved / 1000 / 60).toFixed(2),\n estimatedCostSavings: estimatedCostSavings.toFixed(4)\n },\n namespaces: namespacesAnalytics,\n invalidation: {\n ...invalidationStats,\n recent: recentInvalidations\n }\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/trends\n * Cache trends over time (simplified - would need historical data storage)\n */\napp.get('/analytics/trends', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // For now, return current snapshot as a data point\n // In production, this would query historical data\n const dataPoint = {\n timestamp: Date.now(),\n stats: Object.entries(stats).map(([namespace, stat]) => ({\n namespace,\n hitRate: stat.hitRate,\n entryCount: stat.entryCount,\n memorySize: stat.memorySize,\n totalRequests: stat.totalRequests\n }))\n }\n\n return c.json({\n success: true,\n data: {\n trends: [dataPoint],\n note: 'Historical trends require persistent storage. This returns current snapshot only.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/top-keys\n * Most accessed cache keys (would need hit tracking)\n */\napp.get('/analytics/top-keys', async (c: Context) => {\n const _namespace = c.req.query('namespace') || 'all'\n const _limit = parseInt(c.req.query('limit') || '10')\n\n // This is a placeholder - would need per-key hit tracking\n return c.json({\n success: true,\n data: {\n topKeys: [],\n note: 'Top keys tracking requires per-key hit counting. Feature not yet implemented.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/warm\n * Warm cache with common queries\n */\napp.post('/warm', async (c: Context) => {\n try {\n const db = c.env.DB as D1Database\n const result = await warmCommonCaches(db)\n\n return c.json({\n success: true,\n message: 'Cache warming completed',\n ...result,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Cache warming error:', error)\n return c.json({\n success: false,\n error: 'Cache warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * POST /admin/cache/warm/:namespace\n * Warm specific namespace cache\n */\napp.post('/warm/:namespace', async (c: Context) => {\n try {\n const namespace = c.req.param('namespace')!\n const body = await c.req.json()\n const { entries } = body\n\n if (!entries || !Array.isArray(entries)) {\n return c.json({\n success: false,\n error: 'Entries array is required'\n }, 400)\n }\n\n const count = await warmNamespace(namespace, entries)\n\n return c.json({\n success: true,\n message: `Warmed ${count} entries in namespace: ${namespace}`,\n namespace,\n count,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Namespace warming error:', error)\n return c.json({\n success: false,\n error: 'Namespace warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Cache Plugin\n *\n * Three-tiered caching system for SonicJS\n * - Tier 1: In-Memory (fastest, region-specific)\n * - Tier 2: Cloudflare KV (fast, global)\n * - Tier 3: Database (source of truth)\n */\n\nimport type { Context } from 'hono'\nimport type { PluginContext } from '@sonicjs-cms/core'\nimport { getCacheService, clearAllCaches, getAllCacheStats } from './services/cache.js'\nimport { CACHE_CONFIGS } from './services/cache-config.js'\nimport { setupCacheInvalidation } from './services/cache-invalidation.js'\nimport cacheRoutes from './routes.js'\n\nexport class CachePlugin {\n private _context: PluginContext | null = null\n\n /**\n * Get plugin routes\n */\n getRoutes() {\n return cacheRoutes\n }\n\n /**\n * Activate the cache plugin\n */\n async activate(context: PluginContext): Promise {\n this._context = context\n\n const settings = context.config || {}\n\n console.log('✅ Cache plugin activated', {\n memoryEnabled: settings.memoryEnabled ?? true,\n kvEnabled: settings.kvEnabled ?? false,\n defaultTTL: settings.defaultTTL ?? 3600\n })\n\n // Initialize default cache services\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n\n // Setup event-based cache invalidation\n setupCacheInvalidation()\n }\n\n /**\n * Deactivate the cache plugin\n */\n async deactivate(): Promise {\n console.log('❌ Cache plugin deactivated - clearing all caches')\n await clearAllCaches()\n this._context = null\n }\n\n /**\n * Configure the cache plugin\n */\n async configure(settings: Record): Promise {\n console.log('⚙️ Cache plugin configured', settings)\n\n // Reconfigure all cache instances with new settings\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n }\n\n /**\n * Get cache statistics\n */\n async getStats(c: Context): Promise {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Clear all cache entries\n */\n async clearCache(c: Context): Promise {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Invalidate cache entries matching pattern\n */\n async invalidatePattern(c: Context): Promise {\n const body = await c.req.json()\n const { pattern, namespace: _namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (_namespace) {\n // Invalidate from specific namespace\n const cache = getCacheService(CACHE_CONFIGS[_namespace] || {\n ttl: 3600,\n kvEnabled: false,\n memoryEnabled: true,\n namespace: _namespace,\n invalidateOn: [],\n version: 'v1'\n })\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: _namespace || 'all',\n timestamp: new Date().toISOString()\n })\n }\n}\n\n// Export cache services for use by other plugins/routes when cache plugin is active\nexport {\n getCacheService,\n clearAllCaches,\n getAllCacheStats,\n setGlobalKVNamespace\n} from './services/cache'\nexport { CACHE_CONFIGS, getCacheConfig, generateCacheKey } from './services/cache-config'\nexport type { CacheConfig, CacheStats } from './services/cache-config'\nexport { emitEvent, onEvent, getEventBus } from './services/event-bus'\nexport { getCacheInvalidationStats, getRecentInvalidations } from './services/cache-invalidation'\nexport { warmCommonCaches, warmNamespace, preloadCache } from './services/cache-warming'\n\n// Create and export plugin instance\nconst plugin = new CachePlugin()\nexport default plugin\n","/**\n * SonicJS Favicon SVG\n *\n * Embedded SVG favicon for the admin interface and auth pages.\n * This ensures the favicon is always available without external dependencies.\n */\n\nexport const faviconSvg = `\n\n\n\t\n\t\t\n\t\t\n\t\n\n`;\n","/**\n * Main Application Factory\n *\n * Creates a configured SonicJS application with all core functionality\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport {\n apiRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n testCleanupRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminPluginRoutes,\n adminLogsRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n adminFormsRoutes,\n publicFormsRoutes,\n adminApiReferenceRoutes\n} from './routes'\nimport { getCoreVersion } from './utils/version'\nimport { bootstrapMiddleware } from './middleware/bootstrap'\nimport { metricsMiddleware } from './middleware/metrics'\nimport { csrfProtection } from './middleware/csrf'\nimport { securityHeadersMiddleware } from './middleware/security-headers'\nimport { createDatabaseToolsAdminRoutes } from './plugins/core-plugins/database-tools-plugin/admin-routes'\nimport { createSeedDataAdminRoutes } from './plugins/core-plugins/seed-data-plugin/admin-routes'\nimport { emailPlugin } from './plugins/core-plugins/email-plugin'\nimport { otpLoginPlugin } from './plugins/core-plugins/otp-login-plugin'\nimport { oauthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nimport { userProfilesPlugin } from './plugins/core-plugins/user-profiles'\nimport { aiSearchPlugin } from './plugins/core-plugins/ai-search-plugin'\nimport { createMagicLinkAuthPlugin } from './plugins/available/magic-link-auth'\nimport { securityAuditPlugin } from './plugins/core-plugins/security-audit-plugin'\nimport { securityAuditMiddleware } from './plugins/core-plugins/security-audit-plugin'\nimport { stripePlugin } from './plugins/core-plugins/stripe-plugin'\nimport { requireAuth, requireRole } from './middleware/auth'\nimport { pluginMenuMiddleware } from './middleware/plugin-menu'\nimport { analyticsPlugin } from './plugins/core-plugins/analytics'\nimport { eventsApiRoutes } from './plugins/core-plugins/analytics/routes/api'\nimport cachePlugin from './plugins/cache'\nimport { faviconSvg } from './assets/favicon'\nimport { setAppInstance } from './services/route-metadata'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface Bindings {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n CORS_ORIGINS?: string\n JWT_SECRET?: string\n JWT_EXPIRES_IN?: string\n JWT_REFRESH_GRACE_SECONDS?: string\n BUCKET_NAME?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\nexport interface Variables {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n csrfToken?: string\n pluginMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport interface SonicJSConfig {\n // Collections configuration\n collections?: {\n directory?: string\n autoSync?: boolean\n }\n\n // Plugins configuration\n plugins?: {\n directory?: string\n autoLoad?: boolean\n disableAll?: boolean // Disable all plugins including core plugins\n }\n\n // Custom routes\n routes?: Array<{\n path: string\n handler: Hono\n }>\n\n // Custom middleware\n middleware?: {\n beforeAuth?: Array<(c: Context, next: () => Promise) => Promise>\n afterAuth?: Array<(c: Context, next: () => Promise) => Promise>\n }\n\n // Admin access control\n // Roles allowed to access the /admin panel. Defaults to ['admin'].\n adminAccessRoles?: string[]\n\n // App metadata\n version?: string\n name?: string\n}\n\nexport type SonicJSApp = Hono<{ Bindings: Bindings; Variables: Variables }>\n\n// ============================================================================\n// Application Factory\n// ============================================================================\n\n/**\n * Create a SonicJS application with core functionality\n *\n * @param config - Application configuration\n * @returns Configured Hono application\n *\n * @example\n * ```typescript\n * import { createSonicJSApp } from '@sonicjs-cms/core'\n *\n * const app = createSonicJSApp({\n * collections: {\n * directory: './src/collections',\n * autoSync: true\n * },\n * plugins: {\n * directory: './src/plugins',\n * autoLoad: true\n * }\n * })\n *\n * export default app\n * ```\n */\nexport function createSonicJSApp(config: SonicJSConfig = {}): SonicJSApp {\n const app = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Set app metadata\n const appVersion = config.version || getCoreVersion()\n const appName = config.name || 'SonicJS AI'\n\n // App version middleware\n app.use('*', async (c, next) => {\n c.set('appVersion', appVersion)\n await next()\n })\n\n // Metrics middleware - track all requests for real-time analytics\n app.use('*', metricsMiddleware())\n\n // Bootstrap middleware - runs migrations, syncs collections, and initializes plugins\n app.use('*', bootstrapMiddleware(config))\n\n // Custom middleware - before auth\n if (config.middleware?.beforeAuth) {\n for (const middleware of config.middleware.beforeAuth) {\n app.use('*', middleware)\n }\n }\n\n // Logging middleware\n app.use('*', async (_c, next) => {\n // Logging logic here\n await next()\n })\n\n // Security middleware\n app.use('*', securityHeadersMiddleware())\n\n // CSRF protection middleware\n app.use('*', csrfProtection())\n\n // Custom middleware - after auth\n if (config.middleware?.afterAuth) {\n for (const middleware of config.middleware.afterAuth) {\n app.use('*', middleware)\n }\n }\n\n // Admin panel access control: require authentication and admin role by default\n const adminRoles = config.adminAccessRoles || ['admin']\n app.use('/admin/*', requireAuth())\n app.use('/admin/*', requireRole(adminRoles))\n\n // Plugin dynamic menu items for admin sidebar\n app.use('/admin/*', pluginMenuMiddleware())\n\n // Core routes\n // Routes are being imported incrementally from routes/*\n // Each route is tested and migrated one-by-one\n app.route('/api', apiRoutes)\n app.route('/api/media', apiMediaRoutes)\n app.route('/api/system', apiSystemRoutes)\n app.route('/admin/api', adminApiRoutes)\n app.route('/admin/dashboard', adminDashboardRoutes)\n app.route('/admin/collections', adminCollectionsRoutes)\n app.route('/admin/forms', adminFormsRoutes)\n app.route('/admin/settings', adminSettingsRoutes)\n app.route('/forms', publicFormsRoutes)\n app.route('/api/forms', publicFormsRoutes) // API endpoint for form submissions\n app.route('/admin/api-reference', adminApiReferenceRoutes)\n app.route('/admin/database-tools', createDatabaseToolsAdminRoutes())\n app.route('/admin/seed-data', createSeedDataAdminRoutes())\n app.route('/admin/content', adminContentRoutes)\n app.route('/admin/media', adminMediaRoutes)\n // Security audit middleware - logs auth events (login, register, logout)\n app.use('/auth/*', securityAuditMiddleware())\n\n // Plugin routes - Security Audit (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (securityAuditPlugin.routes && securityAuditPlugin.routes.length > 0) {\n for (const route of securityAuditPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - AI Search (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register AI Search routes first so they take precedence over the generic /:id handler\n if (aiSearchPlugin.routes && aiSearchPlugin.routes.length > 0) {\n for (const route of aiSearchPlugin.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Plugin routes - Cache (dashboard and management API)\n // Fixes GitHub Issue #461: Cache routes were not registered\n app.route('/admin/cache', cachePlugin.getRoutes())\n\n // Plugin routes - OAuth Providers (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (oauthProvidersPlugin.routes && oauthProvidersPlugin.routes.length > 0) {\n for (const route of oauthProvidersPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - User Profiles\n if (userProfilesPlugin.routes && userProfilesPlugin.routes.length > 0) {\n for (const route of userProfilesPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - OTP Login (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register OTP Login routes first so they take precedence over the generic /:id handler\n if (otpLoginPlugin.routes && otpLoginPlugin.routes.length > 0) {\n for (const route of otpLoginPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Analytics (must be before /admin/plugins catch-all)\n if (analyticsPlugin.routes && analyticsPlugin.routes.length > 0) {\n for (const route of analyticsPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Public event tracking API — POST /api/events (open), GET /api/events (admin)\n app.route('/api/events', eventsApiRoutes)\n\n // Plugin routes - Stripe (must be before /admin/plugins catch-all)\n if (stripePlugin.routes && stripePlugin.routes.length > 0) {\n for (const route of stripePlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n app.route('/admin/plugins', adminPluginRoutes)\n app.route('/admin/logs', adminLogsRoutes)\n app.route('/admin', adminUsersRoutes)\n app.route('/auth', authRoutes)\n\n // Test cleanup routes (only for development/test environments)\n app.route('/', testCleanupRoutes)\n\n // Plugin routes - Email\n if (emailPlugin.routes && emailPlugin.routes.length > 0) {\n for (const route of emailPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Magic Link Auth (passwordless authentication via email links)\n const magicLinkPlugin = createMagicLinkAuthPlugin()\n if (magicLinkPlugin.routes && magicLinkPlugin.routes.length > 0) {\n for (const route of magicLinkPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Serve favicon\n app.get('/favicon.svg', (c) => {\n return new Response(faviconSvg, {\n headers: {\n 'Content-Type': 'image/svg+xml',\n 'Cache-Control': 'public, max-age=31536000'\n }\n })\n })\n\n // Serve files from R2 storage (public file access)\n app.get('/files/*', async (c) => {\n try {\n // Extract the path from the URL pathname (everything after /files/)\n const url = new URL(c.req.url)\n const pathname = url.pathname\n\n // Remove the /files/ prefix to get the R2 object key\n const objectKey = pathname.replace(/^\\/files\\//, '')\n\n if (!objectKey) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(objectKey)\n\n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n headers.set('Access-Control-Allow-Origin', '*') // Allow CORS for media files\n headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n headers.set('Access-Control-Allow-Headers', 'Content-Type')\n\n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n })\n\n // Custom routes - User-defined routes\n if (config.routes) {\n for (const route of config.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Root redirect to login\n app.get('/', (c) => {\n return c.redirect('/auth/login')\n })\n\n // Health check\n app.get('/health', (c) => {\n return c.json({\n name: appName,\n version: appVersion,\n status: 'running',\n timestamp: new Date().toISOString()\n })\n })\n\n // Store app instance for route introspection (API reference auto-discovery)\n setAppInstance(app)\n\n // 404 handler\n app.notFound((c) => {\n return c.json({ error: 'Not Found', status: 404 }, 404)\n })\n\n // Error handler\n app.onError((err, c) => {\n console.error(err)\n return c.json({ error: 'Internal Server Error', status: 500 }, 500)\n })\n\n return app\n}\n\n/**\n * Setup core middleware (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreMiddleware(_app: SonicJSApp): void {\n console.warn('setupCoreMiddleware is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n\n/**\n * Setup core routes (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreRoutes(_app: SonicJSApp): void {\n console.warn('setupCoreRoutes is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n","import { drizzle } from 'drizzle-orm/d1';\nimport * as schema from './schema';\n\nexport function createDb(d1: D1Database) {\n return drizzle(d1, { schema });\n}\n\nexport * from './schema';","/**\n * @sonicjs/core - Main Entry Point\n *\n * Core framework for SonicJS headless CMS\n * Built for Cloudflare's edge platform with TypeScript\n *\n * Phase 2 Migration Status:\n * - Week 1: Types, Utils, Database (COMPLETED ✓)\n * - Week 2: Services, Middleware, Plugins (COMPLETED ✓)\n * - Week 3: Routes, Templates (COMPLETED ✓)\n * - Week 4: Integration & Testing (COMPLETED ✓)\n *\n * Test Coverage:\n * - Utilities: 48 tests (sanitize, query-filter, metrics)\n * - Middleware: 51 tests (auth, logging, security, performance)\n * - Total: 99 tests passing\n */\n\n// ============================================================================\n// Main Application API (Phase 2 Week 1)\n// ============================================================================\n\nexport { createSonicJSApp, setupCoreMiddleware, setupCoreRoutes } from './app'\nexport type { SonicJSConfig, SonicJSApp, Bindings, Variables } from './app'\n\n// ============================================================================\n// Placeholders - To be populated in Phase 2\n// ============================================================================\n\n// Services - Week 2 (COMPLETED)\nexport {\n // Collection Management\n loadCollectionConfigs,\n loadCollectionConfig,\n getAvailableCollectionNames,\n validateCollectionConfig,\n registerCollections,\n syncCollections,\n syncCollection,\n isCollectionManaged,\n getManagedCollections,\n cleanupRemovedCollections,\n fullCollectionSync,\n // Form-Collection Sync\n syncAllFormCollections,\n syncFormCollection,\n createContentFromSubmission,\n deriveCollectionSchemaFromFormio,\n deriveSubmissionTitle,\n mapFormStatusToContentStatus,\n backfillFormSubmissions,\n // Database Migrations\n MigrationService,\n // Logging\n Logger,\n getLogger,\n initLogger,\n // Plugin Services - Class implementations\n PluginService as PluginServiceClass,\n PluginBootstrapService,\n} from './services'\n\nexport type { Migration, MigrationStatus, LogLevel, LogCategory, LogEntry, LogFilter, CorePlugin } from './services'\n\n// Middleware - Week 2 (COMPLETED)\nexport {\n // Authentication\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n // Logging\n loggingMiddleware,\n detailedLoggingMiddleware,\n securityLoggingMiddleware,\n performanceLoggingMiddleware,\n // Performance\n cacheHeaders,\n compressionMiddleware,\n securityHeaders,\n // Permissions\n PermissionManager,\n requirePermission,\n requireAnyPermission,\n logActivity,\n // Plugin middleware\n requireActivePlugin,\n requireActivePlugins,\n getActivePlugins,\n isPluginActive,\n // Bootstrap\n bootstrapMiddleware,\n} from './middleware'\n\nexport type { Permission, UserPermissions } from './middleware'\n\n// Plugins - Week 2 (COMPLETED)\nexport {\n // Hook System - Class implementations\n HookSystemImpl,\n ScopedHookSystem as ScopedHookSystemClass,\n HookUtils,\n // Plugin Registry\n PluginRegistryImpl,\n // Plugin Manager - Class implementation\n PluginManager as PluginManagerClass,\n // Plugin Validator - Class implementation\n PluginValidator as PluginValidatorClass,\n} from './plugins'\n\n// Routes - Week 3 (COMPLETED)\nexport {\n ROUTES_INFO,\n apiRoutes,\n apiContentCrudRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminLogsRoutes,\n adminPluginRoutes,\n adminDesignRoutes,\n adminCheckboxRoutes,\n adminTestimonialsRoutes,\n adminCodeExamplesRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n} from './routes'\n\n// Templates - Week 3 (COMPLETED)\nexport {\n // Form templates\n renderForm,\n renderFormField,\n // Table templates\n renderTable,\n // Pagination templates\n renderPagination,\n // Alert templates\n renderAlert,\n // Confirmation dialog templates\n renderConfirmationDialog,\n getConfirmationDialogScript,\n // Filter bar templates\n renderFilterBar,\n} from './templates'\n\nexport type {\n FormField,\n FormData,\n TableColumn,\n TableData,\n PaginationData,\n AlertData,\n ConfirmationDialogOptions,\n FilterBarData,\n Filter,\n FilterOption,\n} from './templates'\n\n// Types - Week 1 (COMPLETED)\nexport type {\n // Collection types\n FieldType,\n FieldConfig,\n CollectionSchema,\n CollectionConfig,\n CollectionConfigModule,\n CollectionSyncResult,\n // Plugin types\n Plugin,\n PluginContext,\n PluginConfig,\n PluginRoutes,\n PluginMiddleware,\n PluginModel,\n PluginService,\n PluginAdminPage,\n PluginComponent,\n PluginMenuItem,\n PluginHook,\n HookHandler,\n HookContext,\n HookSystem,\n ScopedHookSystem,\n PluginRegistry,\n PluginManager,\n PluginStatus,\n AuthService,\n ContentService,\n MediaService,\n PluginLogger,\n PluginBuilderOptions,\n PluginValidator,\n PluginValidationResult,\n HookName,\n // Plugin manifest\n PluginManifest,\n} from './types'\n\nexport { HOOKS } from './types'\n\n// Utils - Week 1 (COMPLETED)\nexport {\n // Sanitization\n escapeHtml,\n sanitizeInput,\n sanitizeObject,\n // Template rendering\n TemplateRenderer,\n templateRenderer,\n renderTemplate,\n // Query filtering\n QueryFilterBuilder,\n buildQuery,\n // Metrics\n metricsTracker,\n // Version\n SONICJS_VERSION,\n getCoreVersion,\n} from './utils'\n\nexport type {\n FilterOperator,\n FilterCondition,\n FilterGroup,\n QueryFilter,\n QueryResult,\n} from './utils'\n\n// Database - Week 1 (COMPLETED)\nexport {\n createDb,\n // Schema exports\n users,\n collections,\n content,\n contentVersions,\n media,\n apiTokens,\n workflowHistory,\n plugins,\n pluginHooks,\n pluginRoutes,\n pluginAssets,\n pluginActivityLog,\n systemLogs,\n logConfig,\n // Zod validation schemas\n insertUserSchema,\n selectUserSchema,\n insertCollectionSchema,\n selectCollectionSchema,\n insertContentSchema,\n selectContentSchema,\n insertMediaSchema,\n selectMediaSchema,\n insertWorkflowHistorySchema,\n selectWorkflowHistorySchema,\n insertPluginSchema,\n selectPluginSchema,\n insertPluginHookSchema,\n selectPluginHookSchema,\n insertPluginRouteSchema,\n selectPluginRouteSchema,\n insertPluginAssetSchema,\n selectPluginAssetSchema,\n insertPluginActivityLogSchema,\n selectPluginActivityLogSchema,\n insertSystemLogSchema,\n selectSystemLogSchema,\n insertLogConfigSchema,\n selectLogConfigSchema,\n} from './db'\n\nexport type {\n User,\n NewUser,\n Collection,\n NewCollection,\n Content,\n NewContent,\n Media,\n NewMedia,\n WorkflowHistory,\n NewWorkflowHistory,\n Plugin as DbPlugin,\n NewPlugin,\n PluginHook as DbPluginHook,\n NewPluginHook,\n PluginRoute,\n NewPluginRoute,\n PluginAsset,\n NewPluginAsset,\n PluginActivityLog,\n NewPluginActivityLog,\n SystemLog,\n NewSystemLog,\n LogConfig,\n NewLogConfig,\n} from './db'\n\n// Plugin SDK (Beta)\nexport { PluginBuilder, PluginHelpers } from './plugins/sdk'\n\n// OAuth Providers Plugin\nexport { oauthProvidersPlugin, createOAuthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nexport { OAuthService, BUILT_IN_PROVIDERS } from './plugins/core-plugins/oauth-providers/oauth-service'\n\n// User Profiles Plugin\nexport { userProfilesPlugin, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig } from './plugins/core-plugins/user-profiles'\nexport type { ProfileFieldDefinition, UserProfileConfig } from './plugins/core-plugins/user-profiles'\n\n// ============================================================================\n// Version\n// ============================================================================\n\n// Import version from package.json\nimport packageJson from '../package.json'\nexport const VERSION = packageJson.version\n\n// ============================================================================\n// Phase 2 Migration Notes\n// ============================================================================\n\n/**\n * This is a work-in-progress package being extracted from the main SonicJS codebase.\n *\n * Current Phase: 2 (Core Module Migration)\n * Current Week: 1 (Types, Utils, Database)\n *\n * Expected completion: 4 weeks from 2025-01-17\n *\n * DO NOT USE IN PRODUCTION - Alpha release for development only\n */\n"]} \ No newline at end of file diff --git a/packages/core/dist/index.js b/packages/core/dist/index.js index 5624cd9bb..4d02cbbb1 100644 --- a/packages/core/dist/index.js +++ b/packages/core/dist/index.js @@ -1,21 +1,21 @@ -import { getCustomData, renderConfirmationDialog, getConfirmationDialogScript, api_default, api_media_default, api_system_default, admin_api_default, router, adminCollectionsRoutes, adminFormsRoutes, adminSettingsRoutes, public_forms_default, router2, admin_content_default, adminMediaRoutes, userProfilesPlugin, adminPluginRoutes, adminLogsRoutes, userRoutes, auth_default, test_cleanup_default } from './chunk-OO7BOO6H.js'; -export { ROUTES_INFO, admin_api_default as adminApiRoutes, adminCheckboxRoutes, admin_code_examples_default as adminCodeExamplesRoutes, adminCollectionsRoutes, admin_content_default as adminContentRoutes, router as adminDashboardRoutes, adminDesignRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, admin_testimonials_default as adminTestimonialsRoutes, userRoutes as adminUsersRoutes, api_content_crud_default as apiContentCrudRoutes, api_media_default as apiMediaRoutes, api_default as apiRoutes, api_system_default as apiSystemRoutes, auth_default as authRoutes, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig, userProfilesPlugin } from './chunk-OO7BOO6H.js'; -import { SettingsService, setAppInstance, schema_exports } from './chunk-QFWHAFEO.js'; -export { Logger, apiTokens, collections, content, contentVersions, getLogger, initLogger, insertCollectionSchema, insertContentSchema, insertLogConfigSchema, insertMediaSchema, insertPluginActivityLogSchema, insertPluginAssetSchema, insertPluginHookSchema, insertPluginRouteSchema, insertPluginSchema, insertSystemLogSchema, insertUserSchema, insertWorkflowHistorySchema, logConfig, media, pluginActivityLog, pluginAssets, pluginHooks, pluginRoutes, plugins, selectCollectionSchema, selectContentSchema, selectLogConfigSchema, selectMediaSchema, selectPluginActivityLogSchema, selectPluginAssetSchema, selectPluginHookSchema, selectPluginRouteSchema, selectPluginSchema, selectSystemLogSchema, selectUserSchema, selectWorkflowHistorySchema, systemLogs, users, workflowHistory } from './chunk-QFWHAFEO.js'; -import { requireAuth, getJwtExpirySecondsFromDb, AuthManager, metricsMiddleware, bootstrapMiddleware, securityHeadersMiddleware, csrfProtection, requireRole } from './chunk-DMPXZ6JJ.js'; -export { AuthManager, PermissionManager, bootstrapMiddleware, cacheHeaders, compressionMiddleware, detailedLoggingMiddleware, getActivePlugins, isPluginActive, logActivity, loggingMiddleware, optionalAuth, performanceLoggingMiddleware, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware as securityHeaders, securityLoggingMiddleware } from './chunk-DMPXZ6JJ.js'; -import { PluginService, PLUGIN_REGISTRY } from './chunk-NJVY2U43.js'; -export { PluginBootstrapService, PluginService as PluginServiceClass, backfillFormSubmissions, cleanupRemovedCollections, createContentFromSubmission, deriveCollectionSchemaFromFormio, deriveSubmissionTitle, fullCollectionSync, getAvailableCollectionNames, getManagedCollections, isCollectionManaged, loadCollectionConfig, loadCollectionConfigs, mapFormStatusToContentStatus, registerCollections, syncAllFormCollections, syncCollection, syncCollections, syncFormCollection, validateCollectionConfig } from './chunk-NJVY2U43.js'; -export { MigrationService } from './chunk-46DCL763.js'; +import { getCustomData, renderConfirmationDialog, getConfirmationDialogScript, api_default, api_media_default, api_system_default, admin_api_default, router, adminCollectionsRoutes, adminFormsRoutes, adminSettingsRoutes, public_forms_default, router2, admin_content_default, adminMediaRoutes, userProfilesPlugin, adminPluginRoutes, adminLogsRoutes, userRoutes, auth_default, test_cleanup_default } from './chunk-M2PKQJ6J.js'; +export { ROUTES_INFO, admin_api_default as adminApiRoutes, adminCheckboxRoutes, admin_code_examples_default as adminCodeExamplesRoutes, adminCollectionsRoutes, admin_content_default as adminContentRoutes, router as adminDashboardRoutes, adminDesignRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, admin_testimonials_default as adminTestimonialsRoutes, userRoutes as adminUsersRoutes, api_content_crud_default as apiContentCrudRoutes, api_media_default as apiMediaRoutes, api_default as apiRoutes, api_system_default as apiSystemRoutes, auth_default as authRoutes, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig, userProfilesPlugin } from './chunk-M2PKQJ6J.js'; +import { SettingsService, setAppInstance, schema_exports } from './chunk-GQEIPW3L.js'; +export { Logger, apiTokens, collections, content, contentVersions, getLogger, initLogger, insertCollectionSchema, insertContentSchema, insertLogConfigSchema, insertMediaSchema, insertPluginActivityLogSchema, insertPluginAssetSchema, insertPluginHookSchema, insertPluginRouteSchema, insertPluginSchema, insertSystemLogSchema, insertUserSchema, insertWorkflowHistorySchema, logConfig, media, pluginActivityLog, pluginAssets, pluginHooks, pluginRoutes, plugins, selectCollectionSchema, selectContentSchema, selectLogConfigSchema, selectMediaSchema, selectPluginActivityLogSchema, selectPluginAssetSchema, selectPluginHookSchema, selectPluginRouteSchema, selectPluginSchema, selectSystemLogSchema, selectUserSchema, selectWorkflowHistorySchema, systemLogs, users, workflowHistory } from './chunk-GQEIPW3L.js'; +import { requireAuth, getJwtExpirySecondsFromDb, AuthManager, metricsMiddleware, bootstrapMiddleware, securityHeadersMiddleware, csrfProtection, requireRole } from './chunk-5QK3FXKX.js'; +export { AuthManager, PermissionManager, bootstrapMiddleware, cacheHeaders, compressionMiddleware, detailedLoggingMiddleware, getActivePlugins, isPluginActive, logActivity, loggingMiddleware, optionalAuth, performanceLoggingMiddleware, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware as securityHeaders, securityLoggingMiddleware } from './chunk-5QK3FXKX.js'; +import { PluginService, PLUGIN_REGISTRY } from './chunk-CJOLOONT.js'; +export { PluginBootstrapService, PluginService as PluginServiceClass, backfillFormSubmissions, cleanupRemovedCollections, createContentFromSubmission, deriveCollectionSchemaFromFormio, deriveSubmissionTitle, fullCollectionSync, getAvailableCollectionNames, getManagedCollections, isCollectionManaged, loadCollectionConfig, loadCollectionConfigs, mapFormStatusToContentStatus, registerCollections, syncAllFormCollections, syncCollection, syncCollections, syncFormCollection, validateCollectionConfig } from './chunk-CJOLOONT.js'; +export { MigrationService } from './chunk-CSQWOYGZ.js'; export { renderFilterBar } from './chunk-ON5ZMSU4.js'; import { renderAdminLayout } from './chunk-XWIA3HVX.js'; export { getConfirmationDialogScript, renderAlert, renderConfirmationDialog, renderForm, renderFormField, renderPagination, renderTable } from './chunk-XWIA3HVX.js'; import { init_admin_layout_catalyst_template, renderAdminLayoutCatalyst } from './chunk-55RDMDOP.js'; -export { HookSystemImpl, HookUtils, PluginManager as PluginManagerClass, PluginRegistryImpl, PluginValidator as PluginValidatorClass, ScopedHookSystem as ScopedHookSystemClass } from './chunk-TFNTM3OA.js'; +export { HookSystemImpl, HookUtils, PluginManager as PluginManagerClass, PluginRegistryImpl, PluginValidator as PluginValidatorClass, ScopedHookSystem as ScopedHookSystemClass } from './chunk-NGTBJJXZ.js'; import { PluginBuilder, PluginHelpers } from './chunk-EXNEW5US.js'; export { PluginBuilder, PluginHelpers } from './chunk-EXNEW5US.js'; -import { package_default, getCoreVersion } from './chunk-FE77VWGD.js'; -export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, getCoreVersion, renderTemplate, templateRenderer } from './chunk-FE77VWGD.js'; +import { package_default, getCoreVersion } from './chunk-NDS4S4AG.js'; +export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, getCoreVersion, renderTemplate, templateRenderer } from './chunk-NDS4S4AG.js'; import './chunk-X7ZAEI5S.js'; export { metricsTracker } from './chunk-FICTAGD4.js'; export { escapeHtml, sanitizeInput, sanitizeObject } from './chunk-TQABQWOP.js'; @@ -2005,7 +2005,7 @@ function createOTPLoginPlugin() { maxAge: tokenTtl }); const customData = await getCustomData(db, user.id); - const { is_active: _isActive, ...publicUser } = user; + const { is_active, ...publicUser } = user; return c.json({ success: true, user: { diff --git a/packages/core/dist/index.js.map b/packages/core/dist/index.js.map index 1ed120d40..8de75f503 100644 --- a/packages/core/dist/index.js.map +++ b/packages/core/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/core-plugins/database-tools-plugin/services/database-service.ts","../src/templates/pages/admin-database-table.template.ts","../src/plugins/core-plugins/database-tools-plugin/admin-routes.ts","../src/plugins/core-plugins/seed-data-plugin/services/seed-data-service.ts","../src/plugins/core-plugins/seed-data-plugin/admin-routes.ts","../src/plugins/core-plugins/email-plugin/index.ts","../src/plugins/core-plugins/otp-login-plugin/otp-service.ts","../src/plugins/core-plugins/otp-login-plugin/email-templates.ts","../src/plugins/core-plugins/otp-login-plugin/index.ts","../src/plugins/core-plugins/oauth-providers/oauth-service.ts","../src/plugins/core-plugins/oauth-providers/index.ts","../src/plugins/core-plugins/ai-search-plugin/services/embedding.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/chunking.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/custom-rag.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/ai-search.ts","../src/plugins/core-plugins/ai-search-plugin/services/indexer.ts","../src/plugins/core-plugins/ai-search-plugin/components/settings-page.ts","../src/plugins/core-plugins/ai-search-plugin/routes/admin.ts","../src/plugins/core-plugins/ai-search-plugin/routes/api.ts","../src/plugins/core-plugins/ai-search-plugin/manifest.json","../src/plugins/core-plugins/ai-search-plugin/index.ts","../src/plugins/available/magic-link-auth/index.ts","../src/plugins/core-plugins/security-audit-plugin/types.ts","../src/plugins/core-plugins/security-audit-plugin/services/security-audit-service.ts","../src/plugins/core-plugins/security-audit-plugin/components/dashboard-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/event-log-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/settings-page.ts","../src/plugins/core-plugins/security-audit-plugin/routes/admin.ts","../src/plugins/core-plugins/security-audit-plugin/services/brute-force-detector.ts","../src/plugins/core-plugins/security-audit-plugin/routes/api.ts","../src/plugins/core-plugins/security-audit-plugin/middleware/audit-middleware.ts","../src/plugins/core-plugins/security-audit-plugin/index.ts","../src/plugins/core-plugins/stripe-plugin/services/subscription-service.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-event-service.ts","../src/plugins/core-plugins/stripe-plugin/components/subscriptions-page.ts","../src/plugins/core-plugins/stripe-plugin/components/tab-bar.ts","../src/plugins/core-plugins/stripe-plugin/components/events-page.ts","../src/plugins/core-plugins/stripe-plugin/types.ts","../src/plugins/core-plugins/stripe-plugin/routes/admin.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-api.ts","../src/plugins/core-plugins/stripe-plugin/routes/api.ts","../src/plugins/core-plugins/stripe-plugin/index.ts","../src/middleware/plugin-menu.ts","../src/plugins/types.ts","../src/plugins/core-plugins/analytics/routes/admin.ts","../src/plugins/core-plugins/analytics/index.ts","../src/plugins/core-plugins/analytics/services/event-tracking-service.ts","../src/plugins/core-plugins/analytics/routes/api.ts","../src/plugins/cache/services/cache-config.ts","../src/plugins/cache/services/cache.ts","../src/plugins/cache/services/event-bus.ts","../src/plugins/cache/services/cache-invalidation.ts","../src/plugins/cache/services/cache-warming.ts","../src/templates/pages/admin-cache.template.ts","../src/plugins/cache/routes.ts","../src/plugins/cache/index.ts","../src/assets/favicon.ts","../src/app.ts","../src/db/index.ts","../src/index.ts"],"names":["escapeHtml","router","Hono","plugin","emailPlugin","setCookie","tokenTtl","jwt","content","collections","statusBadge","api_default","z","DEFAULT_SETTINGS","formatTimestamp","severityBadge","eventTypeBadge","adminRoutes","apiRoutes","getSettings","isPluginActive","logPromise","renderPagination","renderAdminLayoutCatalyst","HOOKS","media","renderConfirmationDialog","getConfirmationDialogScript","totalRequests","app"],"mappings":"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","file":"index.js","sourcesContent":["import { D1Database } from '@cloudflare/workers-types'\n\nexport interface TruncateResult {\n success: boolean\n message: string\n tablesCleared: string[]\n adminUserPreserved: boolean\n errors?: string[]\n}\n\nexport interface DatabaseStats {\n tables: Array<{\n name: string\n rowCount: number\n }>\n totalRows: number\n}\n\nexport interface TableData {\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n}\n\nexport class DatabaseToolsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get database statistics\n */\n async getDatabaseStats(): Promise {\n const tables = await this.getTables()\n const stats: DatabaseStats = {\n tables: [],\n totalRows: 0\n }\n\n for (const tableName of tables) {\n try {\n const result = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const rowCount = (result?.count as number) || 0\n \n stats.tables.push({\n name: tableName,\n rowCount\n })\n stats.totalRows += rowCount\n } catch (error) {\n // Skip tables that can't be counted (might be views or system tables)\n console.warn(`Could not count rows in table ${tableName}:`, error)\n }\n }\n\n return stats\n }\n\n /**\n * Get all tables in the database\n */\n private async getTables(): Promise {\n const result = await this.db.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='table' \n AND name NOT LIKE 'sqlite_%'\n ORDER BY name\n `).all()\n\n return result.results?.map((row: any) => row.name) || []\n }\n\n /**\n * Truncate all data except admin user\n */\n async truncateAllData(adminEmail: string): Promise {\n const errors: string[] = []\n const tablesCleared: string[] = []\n let adminUserPreserved = false\n\n try {\n // First, preserve the admin user data\n const adminUser = await this.db.prepare(\n 'SELECT * FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n if (!adminUser) {\n return {\n success: false,\n message: 'Admin user not found. Operation cancelled for safety.',\n tablesCleared: [],\n adminUserPreserved: false,\n errors: ['Admin user not found']\n }\n }\n\n // Define tables to truncate (excluding system tables)\n const tablesToTruncate = [\n 'content',\n 'content_versions', \n 'content_workflow_status',\n 'collections',\n 'media',\n 'sessions',\n 'notifications',\n 'api_tokens',\n 'workflow_history',\n 'scheduled_content',\n 'faqs',\n 'faq_categories',\n 'plugins',\n 'plugin_settings',\n 'email_templates',\n 'email_themes'\n ]\n\n // Check which tables exist\n const existingTables = await this.getTables()\n const tablesToClear = tablesToTruncate.filter(table => \n existingTables.includes(table)\n )\n\n // Clear all data except users table\n for (const tableName of tablesToClear) {\n try {\n await this.db.prepare(`DELETE FROM ${tableName}`).run()\n tablesCleared.push(tableName)\n } catch (error) {\n errors.push(`Failed to clear table ${tableName}: ${error}`)\n console.error(`Error clearing table ${tableName}:`, error)\n }\n }\n\n // Clear users table but preserve admin\n try {\n await this.db.prepare('DELETE FROM users WHERE email != ? OR role != ?')\n .bind(adminEmail, 'admin').run()\n \n // Verify admin user still exists\n const verifyAdmin = await this.db.prepare(\n 'SELECT id FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n adminUserPreserved = !!verifyAdmin\n tablesCleared.push('users (non-admin)')\n } catch (error) {\n errors.push(`Failed to clear non-admin users: ${error}`)\n console.error('Error clearing non-admin users:', error)\n }\n\n // Reset auto-increment counters if supported\n try {\n await this.db.prepare('DELETE FROM sqlite_sequence').run()\n } catch (error) {\n // sqlite_sequence might not exist, ignore\n }\n\n const message = errors.length > 0 \n ? `Truncation completed with ${errors.length} errors. ${tablesCleared.length} tables cleared.`\n : `Successfully truncated database. ${tablesCleared.length} tables cleared.`\n\n return {\n success: errors.length === 0,\n message,\n tablesCleared,\n adminUserPreserved,\n errors: errors.length > 0 ? errors : undefined\n }\n\n } catch (error) {\n return {\n success: false,\n message: `Database truncation failed: ${error}`,\n tablesCleared,\n adminUserPreserved,\n errors: [String(error)]\n }\n }\n }\n\n /**\n * Create a backup of current data (simplified version)\n */\n async createBackup(): Promise<{ success: boolean; message: string; backupId?: string }> {\n try {\n const backupId = `backup_${Date.now()}`\n const stats = await this.getDatabaseStats()\n \n // In a real implementation, this would export data to a file or cloud storage\n // For now, we'll just log the stats and return success\n console.log(`Backup ${backupId} created with ${stats.totalRows} total rows`)\n \n return {\n success: true,\n message: `Backup created successfully (${stats.totalRows} rows)`,\n backupId\n }\n } catch (error) {\n return {\n success: false,\n message: `Backup failed: ${error}`\n }\n }\n }\n\n /**\n * Get table data with optional pagination and sorting\n */\n async getTableData(\n tableName: string,\n limit: number = 100,\n offset: number = 0,\n sortColumn?: string,\n sortDirection: 'asc' | 'desc' = 'asc'\n ): Promise {\n try {\n // Validate table name to prevent SQL injection\n const tables = await this.getTables()\n if (!tables.includes(tableName)) {\n throw new Error(`Table ${tableName} not found`)\n }\n\n // Get column names\n const pragmaResult = await this.db.prepare(`PRAGMA table_info(${tableName})`).all()\n const columns = pragmaResult.results?.map((col: any) => col.name) || []\n\n // Validate sort column if provided\n if (sortColumn && !columns.includes(sortColumn)) {\n sortColumn = undefined\n }\n\n // Get total row count\n const countResult = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const totalRows = (countResult?.count as number) || 0\n\n // Build query with optional sorting\n let query = `SELECT * FROM ${tableName}`\n if (sortColumn) {\n query += ` ORDER BY ${sortColumn} ${sortDirection.toUpperCase()}`\n }\n query += ` LIMIT ${limit} OFFSET ${offset}`\n\n // Get paginated data\n const dataResult = await this.db.prepare(query).all()\n\n return {\n tableName,\n columns,\n rows: dataResult.results || [],\n totalRows\n }\n } catch (error) {\n throw new Error(`Failed to fetch table data: ${error}`)\n }\n }\n\n /**\n * Validate database integrity\n */\n async validateDatabase(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n try {\n // Check critical tables exist\n const requiredTables = ['users', 'content', 'collections']\n const existingTables = await this.getTables()\n\n for (const table of requiredTables) {\n if (!existingTables.includes(table)) {\n issues.push(`Critical table missing: ${table}`)\n }\n }\n\n // Check admin user exists\n const adminCount = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM users WHERE role = ?'\n ).bind('admin').first()\n\n if ((adminCount?.count as number) === 0) {\n issues.push('No admin users found')\n }\n\n // Run SQLite integrity check\n try {\n const integrityResult = await this.db.prepare('PRAGMA integrity_check').first()\n if (integrityResult && (integrityResult as any).integrity_check !== 'ok') {\n issues.push(`Database integrity check failed: ${(integrityResult as any).integrity_check}`)\n }\n } catch (error) {\n issues.push(`Could not run integrity check: ${error}`)\n }\n\n } catch (error) {\n issues.push(`Validation error: ${error}`)\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface DatabaseTablePageData {\n user?: {\n name: string\n email: string\n role: string\n }\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n currentPage: number\n pageSize: number\n sortColumn?: string\n sortDirection?: 'asc' | 'desc'\n}\n\nexport function renderDatabaseTablePage(data: DatabaseTablePageData): string {\n const totalPages = Math.ceil(data.totalRows / data.pageSize)\n const startRow = (data.currentPage - 1) * data.pageSize + 1\n const endRow = Math.min(data.currentPage * data.pageSize, data.totalRows)\n\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n Back to Database Tools\n \n
\n

Table: ${data.tableName}

\n

\n Showing ${startRow.toLocaleString()} - ${endRow.toLocaleString()} of ${data.totalRows.toLocaleString()} rows\n

\n
\n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Refresh\n \n
\n
\n\n \n
\n \n
\n \n \n \n ${data.columns.map(col => `\n \n
\n ${col}\n ${data.sortColumn === col ? `\n \n \n \n ` : `\n \n \n \n `}\n
\n \n `).join('')}\n
\n \n \n ${data.rows.length > 0\n ? data.rows.map((row, idx) => `\n \n ${data.columns.map(col => `\n \n `).join('')}\n \n `).join('')\n : `\n \n \n \n `\n }\n \n
\n ${formatCellValue(row[col])}\n
\n \n \n \n

No data in this table

\n
\n
\n\n \n ${totalPages > 1 ? `\n
\n
\n \n Previous\n \n \n Next\n \n
\n
\n
\n

\n Page ${data.currentPage} of ${totalPages}\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Table: ${data.tableName}`,\n pageTitle: `Database: ${data.tableName}`,\n currentPath: `/admin/database-tools/tables/${data.tableName}`,\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction generatePageNumbers(currentPage: number, totalPages: number): string {\n const pages: number[] = []\n const maxVisible = 7\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (currentPage <= 4) {\n for (let i = 1; i <= 5; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n } else if (currentPage >= totalPages - 3) {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = totalPages - 4; i <= totalPages; i++) pages.push(i)\n } else {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n }\n }\n\n return pages.map(page => {\n if (page === -1) {\n return `\n \n ...\n \n `\n }\n\n const isActive = page === currentPage\n return `\n \n ${page}\n \n `\n }).join('')\n}\n\nfunction escapeHtml(text: string): string {\n const map: Record = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }\n return String(text).replace(/[&<>\"']/g, m => map[m] || m)\n}\n\nfunction formatCellValue(value: any): string {\n if (value === null || value === undefined) {\n return 'null'\n }\n if (typeof value === 'boolean') {\n return `${value}`\n }\n if (typeof value === 'object') {\n return '' + JSON.stringify(value).substring(0, 50) + (JSON.stringify(value).length > 50 ? '...' : '') + ''\n }\n const str = String(value)\n if (str.length > 100) {\n return escapeHtml(str.substring(0, 100)) + '...'\n }\n return escapeHtml(str)\n}\n","import { Hono } from 'hono'\nimport { DatabaseToolsService } from './services/database-service'\nimport { renderDatabaseTablePage, DatabaseTablePageData } from '../../../templates/pages/admin-database-table.template'\nimport { requireAuth } from '../../../middleware'\n\ntype Bindings = {\n DB: D1Database\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport function createDatabaseToolsAdminRoutes() {\n const router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Apply authentication middleware\n router.use('*', requireAuth())\n\n // Get database statistics\n router.get('/api/stats', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const stats = await service.getDatabaseStats()\n\n return c.json({\n success: true,\n data: stats\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({ \n success: false, \n error: 'Failed to fetch database statistics' \n }, 500)\n }\n })\n\n // Truncate all data except admin user\n router.post('/api/truncate', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const body = await c.req.json()\n const { confirmText } = body\n\n // Require confirmation text for safety\n if (confirmText !== 'TRUNCATE ALL DATA') {\n return c.json({\n success: false,\n error: 'Invalid confirmation text. Operation cancelled.'\n }, 400)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.truncateAllData(user.email)\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n tablesCleared: result.tablesCleared,\n adminUserPreserved: result.adminUserPreserved,\n errors: result.errors\n }\n })\n } catch (error) {\n console.error('Error truncating database:', error)\n return c.json({ \n success: false, \n error: 'Failed to truncate database' \n }, 500)\n }\n })\n\n // Create backup\n router.post('/api/backup', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.createBackup()\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n backupId: result.backupId\n }\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({ \n success: false, \n error: 'Failed to create backup' \n }, 500)\n }\n })\n\n // Validate database\n router.get('/api/validate', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const validation = await service.validateDatabase()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n })\n\n // Get table data (API endpoint)\n router.get('/api/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const tableName = c.req.param('tableName')\n const limit = parseInt(c.req.query('limit') || '100')\n const offset = parseInt(c.req.query('offset') || '0')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, limit, offset, sortColumn, sortDirection)\n\n return c.json({\n success: true,\n data: tableData\n })\n } catch (error) {\n console.error('Error fetching table data:', error)\n return c.json({\n success: false,\n error: `Failed to fetch table data: ${error}`\n }, 500)\n }\n })\n\n // View table data page\n router.get('/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.redirect('/admin/login')\n }\n\n const tableName = c.req.param('tableName')\n const page = parseInt(c.req.query('page') || '1')\n const pageSize = parseInt(c.req.query('pageSize') || '20')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const offset = (page - 1) * pageSize\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, pageSize, offset, sortColumn, sortDirection)\n\n const pageData: DatabaseTablePageData = {\n user: {\n name: user.email.split('@')[0] || 'Unknown',\n email: user.email,\n role: user.role\n },\n tableName: tableData.tableName,\n columns: tableData.columns,\n rows: tableData.rows,\n totalRows: tableData.totalRows,\n currentPage: page,\n pageSize: pageSize,\n sortColumn: sortColumn,\n sortDirection: sortDirection\n }\n\n return c.html(renderDatabaseTablePage(pageData))\n } catch (error) {\n console.error('Error rendering table page:', error)\n return c.text(`Error: ${error}`, 500)\n }\n })\n\n return router\n}","import type { D1Database } from '@cloudflare/workers-types'\n\nexport class SeedDataService {\n constructor(private db: D1Database) {}\n\n // First names for generating realistic users\n private firstNames = [\n 'Emma', 'Liam', 'Olivia', 'Noah', 'Ava', 'Ethan', 'Sophia', 'Mason',\n 'Isabella', 'William', 'Mia', 'James', 'Charlotte', 'Benjamin', 'Amelia',\n 'Lucas', 'Harper', 'Henry', 'Evelyn', 'Alexander'\n ]\n\n // Last names for generating realistic users\n private lastNames = [\n 'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis',\n 'Rodriguez', 'Martinez', 'Hernandez', 'Lopez', 'Gonzalez', 'Wilson', 'Anderson',\n 'Thomas', 'Taylor', 'Moore', 'Jackson', 'Martin'\n ]\n\n // Content titles for blog posts\n private blogTitles = [\n 'Getting Started with Modern Web Development',\n 'The Future of JavaScript Frameworks',\n 'Building Scalable Applications with Microservices',\n 'Understanding TypeScript: A Complete Guide',\n 'Best Practices for API Design',\n 'Introduction to Cloud Computing',\n 'Mastering Git and Version Control',\n 'The Art of Code Review',\n 'Performance Optimization Techniques',\n 'Security Best Practices for Web Apps',\n 'Exploring Serverless Architecture',\n 'Database Design Fundamentals',\n 'Testing Strategies for Modern Apps',\n 'CI/CD Pipeline Implementation',\n 'Mobile-First Development Approach'\n ]\n\n // Content titles for pages\n private pageTitles = [\n 'About Us', 'Contact', 'Privacy Policy', 'Terms of Service',\n 'FAQ', 'Our Team', 'Careers', 'Press Kit',\n 'Support', 'Documentation', 'Pricing', 'Features'\n ]\n\n // Content titles for products\n private productTitles = [\n 'Premium Wireless Headphones',\n 'Smart Watch Pro',\n 'Laptop Stand Adjustable',\n 'Mechanical Keyboard RGB',\n 'HD Webcam 4K',\n 'USB-C Hub 7-in-1',\n 'Portable SSD 1TB',\n 'Wireless Mouse Ergonomic',\n 'Monitor 27\" 4K',\n 'Desk Lamp LED',\n 'Phone Case Premium',\n 'Tablet Stand Aluminum',\n 'Cable Management Kit',\n 'Power Bank 20000mAh',\n 'Bluetooth Speaker Portable'\n ]\n\n // Content for generating blog posts\n private blogContent = [\n 'This comprehensive guide covers everything you need to know about modern development practices and tools.',\n 'Learn the fundamentals and advanced concepts that will help you build better applications.',\n 'Discover the latest trends and best practices used by industry professionals.',\n 'A deep dive into the technologies and methodologies shaping the future of software development.',\n 'Practical tips and real-world examples to improve your development workflow.',\n 'Explore cutting-edge techniques and proven strategies for building robust applications.',\n 'Master the essential skills needed to excel in modern software development.',\n 'An in-depth look at the tools and frameworks that power today\\'s web applications.',\n 'Step-by-step instructions and expert insights for developers of all levels.',\n 'Understanding the core principles that drive successful software projects.'\n ]\n\n // Generate a random ID\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n\n // Generate a slug from a title\n private generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n }\n\n // Generate random date within the last year\n private randomDate(): Date {\n const now = new Date()\n const yearAgo = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate())\n const randomTime = yearAgo.getTime() + Math.random() * (now.getTime() - yearAgo.getTime())\n return new Date(randomTime)\n }\n\n // Create 20 example users\n async createUsers(): Promise {\n const roles = ['admin', 'editor', 'author', 'viewer']\n // const hashedPassword = await bcrypt.hash('password123', 10)\n const hashedPassword = 'password123' // TODO: Use actual bcrypt hash\n\n let count = 0\n for (let i = 0; i < 20; i++) {\n const firstName = this.firstNames[Math.floor(Math.random() * this.firstNames.length)] || 'John'\n const lastName = this.lastNames[Math.floor(Math.random() * this.lastNames.length)] || 'Doe'\n const username = `${firstName.toLowerCase()}${lastName.toLowerCase()}${i}`\n const email = `${username}@example.com`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n\n const stmt = this.db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, last_login_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n email,\n username,\n firstName,\n lastName,\n hashedPassword,\n roles[Math.floor(Math.random() * roles.length)],\n Math.random() > 0.1 ? 1 : 0, // 90% active\n Math.random() > 0.3 ? createdAtTimestamp : null,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Create 200 content items across different types\n async createContent(): Promise {\n // Get all users and collections\n const usersStmt = this.db.prepare('SELECT * FROM users')\n const { results: allUsers } = await usersStmt.all()\n\n const collectionsStmt = this.db.prepare('SELECT * FROM collections')\n const { results: allCollections } = await collectionsStmt.all()\n\n if (!allUsers || allUsers.length === 0) {\n throw new Error('No users found. Please create users first.')\n }\n\n if (!allCollections || allCollections.length === 0) {\n throw new Error('No collections found. Please create collections first.')\n }\n\n const statuses = ['draft', 'published', 'archived']\n\n // Create 200 content items\n let count = 0\n for (let i = 0; i < 200; i++) {\n const collection: any = allCollections[Math.floor(Math.random() * allCollections.length)]\n const author: any = allUsers[Math.floor(Math.random() * allUsers.length)]\n const status = statuses[Math.floor(Math.random() * statuses.length)]\n\n let title: string\n let contentData: any\n\n // Generate content based on collection type\n if (collection.name === 'blog_posts' || collection.name.includes('blog')) {\n title = this.blogTitles[Math.floor(Math.random() * this.blogTitles.length)] || 'Untitled Blog Post'\n contentData = {\n body: this.blogContent[Math.floor(Math.random() * this.blogContent.length)] || 'Blog content here',\n excerpt: 'A brief introduction to this article that provides an overview of the main topics covered.',\n tags: this.generateTags(),\n featured: Math.random() > 0.7\n }\n } else if (collection.name === 'pages' || collection.name.includes('page')) {\n title = this.pageTitles[Math.floor(Math.random() * this.pageTitles.length)] || 'Untitled Page'\n contentData = {\n body: 'This is a standard page with important information about our services and policies.',\n template: 'default',\n showInMenu: Math.random() > 0.5\n }\n } else if (collection.name === 'products' || collection.name.includes('product')) {\n title = this.productTitles[Math.floor(Math.random() * this.productTitles.length)] || 'Untitled Product'\n contentData = {\n description: 'High-quality product with excellent features and great value for money.',\n price: (Math.random() * 500 + 10).toFixed(2),\n sku: `SKU-${Math.random().toString(36).substr(2, 9).toUpperCase()}`,\n inStock: Math.random() > 0.2,\n rating: (Math.random() * 2 + 3).toFixed(1) // 3.0 - 5.0\n }\n } else {\n // Generic content\n title = `${collection.display_name || collection.name} Item ${i + 1}`\n contentData = {\n description: 'This is a sample content item with generic data.',\n value: Math.floor(Math.random() * 1000)\n }\n }\n\n const slug = `${this.generateSlug(title)}-${i}`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n const publishedAtTimestamp = status === 'published' ? createdAtTimestamp : null\n\n const stmt = this.db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, published_at, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n collection.id,\n slug,\n `${title} ${i}`,\n JSON.stringify(contentData),\n status,\n publishedAtTimestamp,\n author.id,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Generate random tags for blog posts\n private generateTags(): string[] {\n const allTags = [\n 'tutorial', 'guide', 'javascript', 'typescript', 'web-dev',\n 'backend', 'frontend', 'best-practices', 'security', 'performance',\n 'testing', 'deployment', 'cloud', 'database', 'api'\n ]\n\n const numTags = Math.floor(Math.random() * 4) + 1 // 1-4 tags\n const shuffled = allTags.sort(() => 0.5 - Math.random())\n return shuffled.slice(0, numTags)\n }\n\n // Seed all data\n async seedAll(): Promise<{ users: number; content: number }> {\n const userCount = await this.createUsers()\n const contentCount = await this.createContent()\n\n return {\n users: userCount,\n content: contentCount\n }\n }\n\n // Clear all seed data (optional cleanup method)\n async clearSeedData(): Promise {\n // Delete content first (due to foreign key constraints)\n const deleteContentStmt = this.db.prepare('DELETE FROM content')\n await deleteContentStmt.run()\n\n // Delete users (but keep admin users)\n const deleteUsersStmt = this.db.prepare(\n \"DELETE FROM users WHERE role != 'admin'\"\n )\n await deleteUsersStmt.run()\n }\n}\n","import { Hono } from 'hono'\nimport { SeedDataService } from './services/seed-data-service'\n\ntype Bindings = {\n DB: D1Database\n}\n\nexport function createSeedDataAdminRoutes() {\n const routes = new Hono<{ Bindings: Bindings }>()\n\n // Get seed data status/info\n routes.get('/', async (c) => {\n const html = `\n \n \n \n Seed Data - SonicJS Admin\n \n \n \n \n \n
\n ← Back to Plugin Settings\n

🌱 Seed Data Generator

\n

\n Generate realistic example data for testing and development. This will create 20 users and 200 content items with realistic data.\n

\n\n
\n ⚠️ Warning: This will create new data in your database. Make sure you're not running this in production!\n
\n\n
\n
\n\n
\n

What will be created?

\n
    \n
  • 20 Users: With realistic names, emails, and various roles (admin, editor, author, viewer)
  • \n
  • 200 Content Items: Including blog posts, pages, and products with realistic titles and data
  • \n
  • All passwords: Set to \"password123\" for testing
  • \n
  • Random dates: Created within the last year
  • \n
  • Various statuses: Draft, published, and archived content
  • \n
\n
\n\n
\n

Generate Seed Data

\n

Click the button below to generate example data. This may take a few moments.

\n \n
\n\n
\n

Clear Seed Data

\n

Remove all users and content from the database (except admin users).

\n \n
\n
\n\n \n \n \n `\n return c.html(html)\n })\n\n // Generate seed data\n routes.post('/generate', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n const result = await seedService.seedAll()\n\n return c.json({\n success: true,\n users: result.users,\n content: result.content\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n // Clear seed data\n routes.post('/clear', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n await seedService.clearSeedData()\n\n return c.json({\n success: true\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n return routes\n}\n","/**\n * Email Plugin\n *\n * Send transactional emails using Resend\n * Handles registration, verification, password reset, and one-time codes\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\nexport function createEmailPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'email',\n version: '1.0.0-beta.1',\n description: 'Send transactional emails using Resend'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Create the Email Settings route (POST only - GET is handled by generic plugin settings page)\n const emailRoutes = new Hono()\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // POST endpoint for saving settings\n emailRoutes.post('/settings', async (c: any) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n // Update plugin settings in database\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'email'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving email settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n })\n\n // POST endpoint for test email\n emailRoutes.post('/test', async (c: any) => {\n try {\n const db = c.env.DB\n const body = await c.req.json()\n\n // Load settings from database\n const plugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (!plugin?.settings) {\n return c.json({\n success: false,\n error: 'Email settings not configured. Please save your settings first.'\n }, 400)\n }\n\n const settings = JSON.parse(plugin.settings)\n\n // Validate required settings\n if (!settings.apiKey || !settings.fromEmail || !settings.fromName) {\n return c.json({\n success: false,\n error: 'Missing required settings. Please configure API Key, From Email, and From Name.'\n }, 400)\n }\n\n // Use provided email or fallback to fromEmail\n const toEmail = body.toEmail || settings.fromEmail\n\n // Validate email format\n if (!toEmail.match(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)) {\n return c.json({\n success: false,\n error: 'Invalid email address format'\n }, 400)\n }\n\n // Send test email via Resend API\n const response = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${settings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${settings.fromName} <${settings.fromEmail}>`,\n to: [toEmail],\n subject: 'Test Email from SonicJS',\n html: `\n
\n

Test Email Successful! 🎉

\n

This is a test email from your SonicJS Email plugin.

\n

Configuration:

\n
    \n
  • From: ${settings.fromName} <${settings.fromEmail}>
  • \n
  • Reply-To: ${settings.replyTo || 'Not set'}
  • \n
  • Sent at: ${new Date().toISOString()}
  • \n
\n

Your email settings are working correctly!

\n
\n `,\n reply_to: settings.replyTo || settings.fromEmail\n })\n })\n\n const data = await response.json() as any\n\n if (!response.ok) {\n console.error('Resend API error:', data)\n return c.json({\n success: false,\n error: data.message || 'Failed to send test email. Check your API key and domain verification.'\n }, response.status)\n }\n\n return c.json({\n success: true,\n message: `Test email sent successfully to ${toEmail}`,\n emailId: data.id\n })\n\n } catch (error: any) {\n console.error('Test email error:', error)\n return c.json({\n success: false,\n error: error.message || 'An error occurred while sending test email'\n }, 500)\n }\n })\n\n // Register the route\n builder.addRoute('/admin/plugins/email', emailRoutes, {\n description: 'Email plugin settings',\n requiresAuth: true,\n priority: 80\n })\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('Email', '/admin/plugins/email', {\n icon: 'envelope',\n order: 80,\n permissions: ['email:manage']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Email plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Email plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const emailPlugin = createEmailPlugin()\n","/**\n * OTP Service\n * Handles OTP code generation, verification, and management\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\nexport interface OTPSettings {\n codeLength: number\n codeExpiryMinutes: number\n maxAttempts: number\n rateLimitPerHour: number\n allowNewUserRegistration: boolean\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nexport interface OTPCode {\n id: string\n user_email: string\n code: string\n expires_at: number\n used: number\n used_at: number | null\n ip_address: string | null\n user_agent: string | null\n attempts: number\n created_at: number\n}\n\nexport class OTPService {\n constructor(private db: D1Database) {}\n\n /**\n * Generate a secure random OTP code\n */\n generateCode(length: number = 6): string {\n const digits = '0123456789'\n let code = ''\n\n for (let i = 0; i < length; i++) {\n const randomValues = new Uint8Array(1)\n crypto.getRandomValues(randomValues)\n const randomValue = randomValues[0] ?? 0\n code += digits[randomValue % digits.length]\n }\n\n return code\n }\n\n /**\n * Create and store a new OTP code\n */\n async createOTPCode(\n email: string,\n settings: OTPSettings,\n ipAddress?: string,\n userAgent?: string\n ): Promise {\n const code = this.generateCode(settings.codeLength)\n const id = crypto.randomUUID()\n const now = Date.now()\n const expiresAt = now + (settings.codeExpiryMinutes * 60 * 1000)\n\n const otpCode: OTPCode = {\n id,\n user_email: email.toLowerCase(),\n code,\n expires_at: expiresAt,\n used: 0,\n used_at: null,\n ip_address: ipAddress || null,\n user_agent: userAgent || null,\n attempts: 0,\n created_at: now\n }\n\n await this.db.prepare(`\n INSERT INTO otp_codes (\n id, user_email, code, expires_at, used, used_at,\n ip_address, user_agent, attempts, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n otpCode.id,\n otpCode.user_email,\n otpCode.code,\n otpCode.expires_at,\n otpCode.used,\n otpCode.used_at,\n otpCode.ip_address,\n otpCode.user_agent,\n otpCode.attempts,\n otpCode.created_at\n ).run()\n\n return otpCode\n }\n\n /**\n * Verify an OTP code\n */\n async verifyCode(\n email: string,\n code: string,\n settings: OTPSettings\n ): Promise<{ valid: boolean; attemptsRemaining?: number; error?: string }> {\n const normalizedEmail = email.toLowerCase()\n const now = Date.now()\n\n // Find the most recent unused code for this email\n const otpCode = await this.db.prepare(`\n SELECT * FROM otp_codes\n WHERE user_email = ? AND code = ? AND used = 0\n ORDER BY created_at DESC\n LIMIT 1\n `).bind(normalizedEmail, code).first() as OTPCode | null\n\n if (!otpCode) {\n return { valid: false, error: 'Invalid or expired code' }\n }\n\n // Check if expired\n if (now > otpCode.expires_at) {\n return { valid: false, error: 'Code has expired' }\n }\n\n // Check attempts\n if (otpCode.attempts >= settings.maxAttempts) {\n return { valid: false, error: 'Maximum attempts exceeded' }\n }\n\n // Code is valid - mark as used\n await this.db.prepare(`\n UPDATE otp_codes\n SET used = 1, used_at = ?, attempts = attempts + 1\n WHERE id = ?\n `).bind(now, otpCode.id).run()\n\n return { valid: true }\n }\n\n /**\n * Increment failed attempt count\n */\n async incrementAttempts(email: string, code: string): Promise {\n const normalizedEmail = email.toLowerCase()\n\n const result = await this.db.prepare(`\n UPDATE otp_codes\n SET attempts = attempts + 1\n WHERE user_email = ? AND code = ? AND used = 0\n RETURNING attempts\n `).bind(normalizedEmail, code).first() as { attempts: number } | null\n\n return result?.attempts || 0\n }\n\n /**\n * Check rate limiting\n */\n async checkRateLimit(email: string, settings: OTPSettings): Promise {\n const normalizedEmail = email.toLowerCase()\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n\n const result = await this.db.prepare(`\n SELECT COUNT(*) as count\n FROM otp_codes\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as { count: number } | null\n\n const count = result?.count || 0\n return count < settings.rateLimitPerHour\n }\n\n /**\n * Get recent OTP requests for activity log\n */\n async getRecentRequests(limit: number = 50): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM otp_codes\n ORDER BY created_at DESC\n LIMIT ?\n `).bind(limit).all()\n\n const rows = (result.results || []) as Record[]\n return rows.map(row => this.mapRowToOTP(row))\n }\n\n /**\n * Clean up expired codes (for maintenance)\n */\n async cleanupExpiredCodes(): Promise {\n const now = Date.now()\n\n const result = await this.db.prepare(`\n DELETE FROM otp_codes\n WHERE expires_at < ? OR (used = 1 AND used_at < ?)\n `).bind(now, now - (30 * 24 * 60 * 60 * 1000)).run() // Keep used codes for 30 days\n\n return result.meta.changes || 0\n }\n\n private mapRowToOTP(row: Record): OTPCode {\n return {\n id: String(row.id),\n user_email: String(row.user_email),\n code: String(row.code),\n expires_at: Number(row.expires_at ?? Date.now()),\n used: Number(row.used ?? 0),\n used_at: row.used_at === null || row.used_at === undefined ? null : Number(row.used_at),\n ip_address: typeof row.ip_address === 'string' ? row.ip_address : null,\n user_agent: typeof row.user_agent === 'string' ? row.user_agent : null,\n attempts: Number(row.attempts ?? 0),\n created_at: Number(row.created_at ?? Date.now())\n }\n }\n\n /**\n * Get OTP statistics\n */\n async getStats(days: number = 7): Promise<{\n total: number\n successful: number\n failed: number\n expired: number\n }> {\n const since = Date.now() - (days * 24 * 60 * 60 * 1000)\n\n const stats = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as successful,\n SUM(CASE WHEN attempts >= 3 AND used = 0 THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN expires_at < ? AND used = 0 THEN 1 ELSE 0 END) as expired\n FROM otp_codes\n WHERE created_at > ?\n `).bind(Date.now(), since).first() as any\n\n return {\n total: stats?.total || 0,\n successful: stats?.successful || 0,\n failed: stats?.failed || 0,\n expired: stats?.expired || 0\n }\n }\n}\n","/**\n * OTP Email Templates\n * HTML and plain text templates for OTP codes\n */\n\nexport interface OTPEmailData {\n code: string\n expiryMinutes: number\n codeLength: number\n maxAttempts: number\n email: string\n ipAddress?: string\n timestamp: string\n appName: string\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nfunction sanitizeColor(value?: string): string {\n if (!value) return ''\n // Allow #rgb, #rrggbb, #rrggbbaa, named colors, rgb()/rgba()/hsl()/hsla()\n if (/^#[0-9a-fA-F]{3,8}$/.test(value)) return value\n if (/^[a-zA-Z]+$/.test(value)) return value\n if (/^(rgb|rgba|hsl|hsla)\\([0-9.,\\s%]+\\)$/.test(value)) return value\n return ''\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport function renderOTPEmailHTML(data: OTPEmailData): string {\n const logoUrl = data.logoUrl ? escapeHtml(data.logoUrl) : ''\n const loginUrl = data.loginUrl ? escapeHtml(data.loginUrl) : ''\n const appName = escapeHtml(data.appName)\n const loginButtonText = escapeHtml(\n (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n )\n const logoWidth = Math.max(20, Math.min(600, Number(data.logoWidth) || 150))\n const logoBorderWidth = Math.max(0, Math.min(20, Number(data.logoBorderWidth) || 0))\n const logoBorderColor = sanitizeColor(data.logoBorderColor)\n const logoBorderStyle = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${logoBorderColor}; border-radius: 8px;`\n : ''\n\n return `\n\n\n \n \n Your Login Code\n\n\n\n
\n\n ${logoUrl ? `\n
\n \"${appName}\"\n
\n ` : ''}\n\n
\n

Your Login Code

\n

Enter this code to sign in to ${appName}

\n
\n\n
\n
\n
\n ${data.code}\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${data.expiryMinutes} minutes\n

\n
\n\n
\n

Quick Tips:

\n
    \n
  • Enter the code exactly as shown (${data.codeLength} digits)
  • \n
  • The code can only be used once
  • \n
  • You have ${data.maxAttempts} attempts to enter the correct code
  • \n
  • Request a new code if this one expires
  • \n
\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${appName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n\n
\n

\n Didn't request this code?
\n Someone may have entered your email by mistake. You can safely ignore this email.\n

\n\n
\n

This email was sent to ${escapeHtml(data.email)}

\n ${data.ipAddress ? `

IP Address: ${escapeHtml(data.ipAddress)}

` : ''}\n

Time: ${escapeHtml(data.timestamp)}

\n
\n
\n\n
\n\n
\n

© ${new Date().getFullYear()} ${appName}. All rights reserved.

\n
\n\n\n`\n}\n\nexport function renderOTPEmailText(data: OTPEmailData): string {\n const ctaLabel = (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n return `Your Login Code for ${data.appName}\n\nYour one-time verification code is:\n\n${data.code}\n\nThis code expires in ${data.expiryMinutes} minutes.\n${data.loginUrl ? `\\n${ctaLabel}: ${data.loginUrl}\\n` : ''}\n\nQuick Tips:\n• Enter the code exactly as shown (${data.codeLength} digits)\n• The code can only be used once\n• You have ${data.maxAttempts} attempts to enter the correct code\n• Request a new code if this one expires\n\nSecurity Notice:\nNever share this code with anyone. ${data.appName} will never ask you for this code via phone, email, or social media.\n\nDidn't request this code?\nSomeone may have entered your email by mistake. You can safely ignore this email.\n\n---\nThis email was sent to ${data.email}\n${data.ipAddress ? `IP Address: ${data.ipAddress}` : ''}\nTime: ${data.timestamp}\n\n© ${new Date().getFullYear()} ${data.appName}. All rights reserved.`\n}\n\nexport function renderOTPEmail(data: OTPEmailData): { html: string; text: string } {\n return {\n html: renderOTPEmailHTML(data),\n text: renderOTPEmailText(data)\n }\n}\n","/**\n * OTP Login Plugin\n *\n * Passwordless authentication via email one-time codes\n * Users receive a secure 6-digit code to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { setCookie } from 'hono/cookie'\nimport { z } from 'zod'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\nimport { OTPService, type OTPSettings } from './otp-service'\nimport { renderOTPEmail } from './email-templates'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\nimport { SettingsService } from '../../../services/settings'\nimport { getCustomData } from '../user-profiles'\n\n// Validation schemas\nconst otpRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nconst otpVerifySchema = z.object({\n email: z.string().email('Valid email is required'),\n code: z.string().min(4).max(8)\n})\n\n// Default settings (site name comes from general settings)\nconst DEFAULT_SETTINGS: OTPSettings = {\n codeLength: 6,\n codeExpiryMinutes: 10,\n maxAttempts: 3,\n rateLimitPerHour: 5,\n allowNewUserRegistration: false,\n logoUrl: '',\n logoWidth: 150,\n logoBorderWidth: 0,\n logoBorderColor: '#ffffff',\n loginUrl: '',\n loginButtonText: ''\n}\n\nexport function createOTPLoginPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'otp-login',\n version: '1.0.0-beta.1',\n description: 'Passwordless authentication via email one-time codes'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== API Routes ====================\n\n const otpAPI = new Hono()\n\n // POST /auth/otp/request - Request OTP code\n otpAPI.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings: OTPSettings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Get site name from general settings\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName\n\n // Check rate limiting\n const canRequest = await otpService.checkRateLimit(normalizedEmail, settings)\n if (!canRequest) {\n return c.json({\n error: 'Too many requests. Please try again in an hour.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && !settings.allowNewUserRegistration) {\n // Don't reveal if user exists or not (security)\n return c.json({\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Get IP and user agent\n const ipAddress = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n\n // Create OTP code\n const otpCode = await otpService.createOTPCode(\n normalizedEmail,\n settings,\n ipAddress,\n userAgent\n )\n\n // Send email via Email plugin\n try {\n const isDevMode = c.env.ENVIRONMENT === 'development'\n\n if (isDevMode) {\n console.log(`[DEV] OTP Code for ${normalizedEmail}: ${otpCode.code}`)\n }\n\n // Prepare email content\n const emailContent = renderOTPEmail({\n code: otpCode.code,\n expiryMinutes: settings.codeExpiryMinutes,\n codeLength: settings.codeLength,\n maxAttempts: settings.maxAttempts,\n email: normalizedEmail,\n ipAddress,\n timestamp: new Date().toISOString(),\n appName: siteName,\n logoUrl: settings.logoUrl || '',\n logoWidth: settings.logoWidth,\n logoBorderWidth: settings.logoBorderWidth,\n logoBorderColor: settings.logoBorderColor || '',\n loginUrl: settings.loginUrl || '',\n loginButtonText: settings.loginButtonText || ''\n })\n\n // Load email plugin settings from database\n // Note: We don't check status='active' because the email plugin's\n // settings UI works regardless of status, so we follow the same pattern\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (emailPlugin?.settings) {\n const emailSettings = JSON.parse(emailPlugin.settings)\n\n if (emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName) {\n // Send email via Resend API\n const emailResponse = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${emailSettings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${emailSettings.fromName} <${emailSettings.fromEmail}>`,\n to: [normalizedEmail],\n subject: `Your login code for ${siteName}`,\n html: emailContent.html,\n text: emailContent.text,\n reply_to: emailSettings.replyTo || emailSettings.fromEmail\n })\n })\n\n if (!emailResponse.ok) {\n const errorData = await emailResponse.json() as { message?: string }\n console.error('Failed to send OTP email via Resend:', errorData)\n // Don't expose error to user for security - just log it\n }\n } else {\n console.warn('Email plugin is not fully configured (missing apiKey, fromEmail, or fromName)')\n }\n } else {\n console.warn('Email plugin is not active or has no settings configured')\n }\n\n const response: any = {\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n }\n\n // In development, include the code\n if (isDevMode) {\n response.dev_code = otpCode.code\n }\n\n return c.json(response)\n } catch (emailError) {\n console.error('Error sending OTP email:', emailError)\n return c.json({\n error: 'Failed to send verification code. Please try again.'\n }, 500)\n }\n } catch (error) {\n console.error('OTP request error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/verify - Verify OTP code\n otpAPI.post('/verify', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpVerifySchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email, code } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Verify the code\n const verification = await otpService.verifyCode(normalizedEmail, code, settings)\n\n if (!verification.valid) {\n // Increment attempts on failure\n await otpService.incrementAttempts(normalizedEmail, code)\n\n return c.json({\n error: verification.error || 'Invalid code',\n attemptsRemaining: verification.attemptsRemaining\n }, 401)\n }\n\n // Code is valid - get user\n let user = await db.prepare(`\n SELECT id, email, username, first_name, last_name, role, is_active, created_at\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && settings.allowNewUserRegistration) {\n // Auto-create new user on first OTP verification\n const userId = crypto.randomUUID()\n const now = Date.now()\n const username = normalizedEmail.split('@')[0] + '_' + userId.slice(0, 6)\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, '', '', NULL, 'viewer', 1, 1, ?, ?)\n `).bind(userId, normalizedEmail, username, now, now).run()\n\n user = {\n id: userId,\n email: normalizedEmail,\n username,\n first_name: '',\n last_name: '',\n role: 'viewer',\n is_active: 1,\n created_at: now,\n }\n }\n\n if (!user) {\n return c.json({\n error: 'User not found'\n }, 404)\n }\n\n if (!user.is_active) {\n return c.json({\n error: 'Account is deactivated'\n }, 403)\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env as any)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, (c.env as any).JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n const customData = await getCustomData(db, user.id)\n const { is_active: _isActive, ...publicUser } = user\n\n return c.json({\n success: true,\n user: {\n ...publicUser,\n ...customData,\n },\n token,\n message: 'Authentication successful'\n })\n } catch (error) {\n console.error('OTP verify error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/resend - Resend OTP code\n otpAPI.post('/resend', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n // Reuse the request endpoint logic\n return otpAPI.fetch(\n new Request(c.req.url.replace('/resend', '/request'), {\n method: 'POST',\n headers: c.req.raw.headers,\n body: JSON.stringify({ email: validation.data.email })\n }),\n c.env\n )\n } catch (error) {\n console.error('OTP resend error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // Register API routes\n builder.addRoute('/auth/otp', otpAPI, {\n description: 'OTP authentication endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('OTP Login', '/admin/plugins/otp-login', {\n icon: 'key',\n order: 85,\n permissions: ['otp:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OTP Login plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OTP Login plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const otpLoginPlugin = createOTPLoginPlugin()\n","/**\n * OAuth Service\n * Handles OAuth2 authorization code flow, token exchange, and user info fetching.\n * Provider-agnostic — each provider is a simple config object.\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n// ─── Provider Configuration ─────────────────────────────────────────────────\n\nexport interface OAuthProviderConfig {\n id: string\n name: string\n authorizeUrl: string\n tokenUrl: string\n userInfoUrl: string\n scopes: string[]\n /** Map provider profile JSON to a normalized user profile */\n mapProfile: (profile: Record) => OAuthUserProfile\n}\n\nexport interface OAuthUserProfile {\n providerAccountId: string\n email: string\n name: string\n avatar?: string\n}\n\nexport interface OAuthPluginSettings {\n providers: Record\n}\n\n// ─── Built-in Providers ─────────────────────────────────────────────────────\n\nexport const GITHUB_PROVIDER: OAuthProviderConfig = {\n id: 'github',\n name: 'GitHub',\n authorizeUrl: 'https://github.com/login/oauth/authorize',\n tokenUrl: 'https://github.com/login/oauth/access_token',\n userInfoUrl: 'https://api.github.com/user',\n scopes: ['read:user', 'user:email'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || profile.login || '',\n avatar: profile.avatar_url || undefined\n })\n}\n\nexport const GOOGLE_PROVIDER: OAuthProviderConfig = {\n id: 'google',\n name: 'Google',\n authorizeUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n scopes: ['openid', 'email', 'profile'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || '',\n avatar: profile.picture || undefined\n })\n}\n\nexport const BUILT_IN_PROVIDERS: Record = {\n github: GITHUB_PROVIDER,\n google: GOOGLE_PROVIDER\n}\n\n// ─── OAuth Account DB Record ────────────────────────────────────────────────\n\nexport interface OAuthAccount {\n id: string\n user_id: string\n provider: string\n provider_account_id: string\n access_token: string | null\n refresh_token: string | null\n token_expires_at: number | null\n profile_data: string | null\n created_at: number\n updated_at: number\n}\n\n// ─── OAuth Service ──────────────────────────────────────────────────────────\n\nexport class OAuthService {\n constructor(private db: D1Database) {}\n\n /**\n * Build the authorization redirect URL for a provider.\n */\n buildAuthorizeUrl(\n provider: OAuthProviderConfig,\n clientId: string,\n redirectUri: string,\n state: string\n ): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope: provider.scopes.join(' '),\n state\n })\n\n // Google requires access_type for refresh tokens\n if (provider.id === 'google') {\n params.set('access_type', 'offline')\n params.set('prompt', 'consent')\n }\n\n return `${provider.authorizeUrl}?${params.toString()}`\n }\n\n /**\n * Exchange authorization code for tokens using native fetch.\n */\n async exchangeCode(\n provider: OAuthProviderConfig,\n clientId: string,\n clientSecret: string,\n code: string,\n redirectUri: string\n ): Promise<{ access_token: string; refresh_token?: string; expires_in?: number }> {\n const body: Record = {\n client_id: clientId,\n client_secret: clientSecret,\n code,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code'\n }\n\n const response = await fetch(provider.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json'\n },\n body: new URLSearchParams(body).toString()\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Token exchange failed (${response.status}): ${errorText}`)\n }\n\n const data = await response.json() as Record\n\n if (data.error) {\n throw new Error(`Token exchange error: ${data.error_description || data.error}`)\n }\n\n return {\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n expires_in: data.expires_in ? Number(data.expires_in) : undefined\n }\n }\n\n /**\n * Fetch user profile from the provider's userinfo endpoint.\n */\n async fetchUserProfile(\n provider: OAuthProviderConfig,\n accessToken: string\n ): Promise {\n const headers: Record = {\n 'Authorization': `Bearer ${accessToken}`,\n 'Accept': 'application/json'\n }\n\n // GitHub uses a different auth header format\n if (provider.id === 'github') {\n headers['Authorization'] = `token ${accessToken}`\n }\n\n const response = await fetch(provider.userInfoUrl, { headers })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch user profile (${response.status})`)\n }\n\n const profile = await response.json() as Record\n\n // For GitHub, email may not be in the profile — fetch from /user/emails\n if (provider.id === 'github' && !profile.email) {\n const emailResponse = await fetch('https://api.github.com/user/emails', {\n headers: {\n 'Authorization': `token ${accessToken}`,\n 'Accept': 'application/json'\n }\n })\n\n if (emailResponse.ok) {\n const emails = await emailResponse.json() as Array<{ email: string; primary: boolean; verified: boolean }>\n const primaryEmail = emails.find(e => e.primary && e.verified)\n if (primaryEmail) {\n profile.email = primaryEmail.email\n }\n }\n }\n\n return provider.mapProfile(profile)\n }\n\n // ─── Database Operations ────────────────────────────────────────────────\n\n /**\n * Find an existing OAuth account link.\n */\n async findOAuthAccount(\n provider: string,\n providerAccountId: string\n ): Promise {\n return await this.db.prepare(`\n SELECT * FROM oauth_accounts\n WHERE provider = ? AND provider_account_id = ?\n `).bind(provider, providerAccountId).first() as OAuthAccount | null\n }\n\n /**\n * Find all OAuth accounts for a user.\n */\n async findUserOAuthAccounts(userId: string): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM oauth_accounts WHERE user_id = ?\n `).bind(userId).all()\n return (result.results || []) as unknown as OAuthAccount[]\n }\n\n /**\n * Create a new OAuth account link.\n */\n async createOAuthAccount(params: {\n userId: string\n provider: string\n providerAccountId: string\n accessToken: string\n refreshToken?: string\n tokenExpiresAt?: number\n profileData?: string\n }): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO oauth_accounts (\n id, user_id, provider, provider_account_id,\n access_token, refresh_token, token_expires_at,\n profile_data, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n params.userId,\n params.provider,\n params.providerAccountId,\n params.accessToken,\n params.refreshToken || null,\n params.tokenExpiresAt || null,\n params.profileData || null,\n now,\n now\n ).run()\n\n return {\n id,\n user_id: params.userId,\n provider: params.provider,\n provider_account_id: params.providerAccountId,\n access_token: params.accessToken,\n refresh_token: params.refreshToken || null,\n token_expires_at: params.tokenExpiresAt || null,\n profile_data: params.profileData || null,\n created_at: now,\n updated_at: now\n }\n }\n\n /**\n * Update tokens for an existing OAuth account.\n */\n async updateOAuthTokens(\n id: string,\n accessToken: string,\n refreshToken?: string,\n tokenExpiresAt?: number\n ): Promise {\n await this.db.prepare(`\n UPDATE oauth_accounts\n SET access_token = ?, refresh_token = ?, token_expires_at = ?, updated_at = ?\n WHERE id = ?\n `).bind(accessToken, refreshToken || null, tokenExpiresAt || null, Date.now(), id).run()\n }\n\n /**\n * Unlink an OAuth account from a user (only if they have another auth method).\n */\n async unlinkOAuthAccount(userId: string, provider: string): Promise {\n // Check user has a password or another OAuth link before unlinking\n const user = await this.db.prepare(`\n SELECT password_hash FROM users WHERE id = ?\n `).bind(userId).first() as { password_hash: string | null } | null\n\n const otherLinks = await this.db.prepare(`\n SELECT COUNT(*) as count FROM oauth_accounts\n WHERE user_id = ? AND provider != ?\n `).bind(userId, provider).first() as { count: number } | null\n\n const hasPassword = !!user?.password_hash\n const hasOtherLinks = (otherLinks?.count || 0) > 0\n\n if (!hasPassword && !hasOtherLinks) {\n return false // Cannot unlink the only auth method\n }\n\n await this.db.prepare(`\n DELETE FROM oauth_accounts WHERE user_id = ? AND provider = ?\n `).bind(userId, provider).run()\n\n return true\n }\n\n /**\n * Find a user by email.\n */\n async findUserByEmail(email: string): Promise<{\n id: string\n email: string\n role: string\n is_active: number\n first_name: string\n last_name: string\n } | null> {\n return await this.db.prepare(`\n SELECT id, email, role, is_active, first_name, last_name\n FROM users WHERE email = ?\n `).bind(email.toLowerCase()).first() as any\n }\n\n /**\n * Create a new user from an OAuth profile.\n */\n async createUserFromOAuth(profile: OAuthUserProfile): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n const email = profile.email.toLowerCase()\n const nameParts = (profile.name || email.split('@')[0] || 'User').split(' ')\n const firstName = nameParts[0] || 'User'\n const lastName = nameParts.slice(1).join(' ') || ''\n const username = email.split('@')[0] || id.substring(0, 8)\n\n // Check for username collision and append random suffix if needed\n const existing = await this.db.prepare(\n 'SELECT id FROM users WHERE username = ?'\n ).bind(username).first()\n\n const finalUsername = existing\n ? `${username}-${id.substring(0, 6)}`\n : username\n\n await this.db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, avatar, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', ?, 1, ?, ?)\n `).bind(\n id, email, finalUsername, firstName, lastName,\n profile.avatar || null, now, now\n ).run()\n\n return id\n }\n\n /**\n * Generate a cryptographically random state parameter for CSRF protection.\n */\n generateState(): string {\n const bytes = new Uint8Array(32)\n crypto.getRandomValues(bytes)\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')\n }\n}\n","/**\n * OAuth Providers Plugin\n *\n * OAuth2/OIDC social login support for SonicJS.\n * Phase 1: Core OAuth2 authorization code flow with GitHub and Google providers.\n *\n * Routes:\n * GET /auth/oauth/:provider → Redirect to provider authorization\n * GET /auth/oauth/:provider/callback → Handle OAuth callback\n * POST /auth/oauth/link → Link OAuth provider to logged-in account\n * POST /auth/oauth/unlink → Unlink OAuth provider from account\n * GET /auth/oauth/accounts → List linked OAuth accounts for current user\n */\n\nimport { Hono } from 'hono'\nimport { setCookie, getCookie } from 'hono/cookie'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport {\n OAuthService,\n BUILT_IN_PROVIDERS,\n type OAuthPluginSettings,\n type OAuthProviderConfig\n} from './oauth-service'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst STATE_COOKIE_NAME = 'oauth_state'\nconst STATE_COOKIE_MAX_AGE = 600 // 10 minutes\n\nexport function createOAuthProvidersPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'oauth-providers',\n version: '1.0.0-beta.1',\n description: 'OAuth2/OIDC social login with GitHub, Google, and more'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== Helper Functions ====================\n\n function getCallbackUrl(c: any, provider: string): string {\n const proto = c.req.header('x-forwarded-proto') || 'https'\n const host = c.req.header('host') || 'localhost'\n return `${proto}://${host}/auth/oauth/${provider}/callback`\n }\n\n async function loadSettings(db: any): Promise {\n const row = await db.prepare(\n `SELECT settings FROM plugins WHERE id = 'oauth-providers'`\n ).first() as { settings: string | null } | null\n\n if (!row?.settings) return null\n\n try {\n return JSON.parse(row.settings) as OAuthPluginSettings\n } catch {\n return null\n }\n }\n\n function getProviderCredentials(\n settings: OAuthPluginSettings | null,\n providerId: string\n ): { clientId: string; clientSecret: string } | null {\n if (!settings?.providers?.[providerId]) return null\n const p = settings.providers[providerId]\n if (!p.enabled || !p.clientId || !p.clientSecret) return null\n return { clientId: p.clientId, clientSecret: p.clientSecret }\n }\n\n // ==================== API Routes ====================\n\n const oauthAPI = new Hono()\n\n // GET /auth/oauth/:provider — Redirect to provider authorization\n oauthAPI.get('/:provider', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.json({ error: `Unknown OAuth provider: ${providerId}` }, 400)\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.json({\n error: `OAuth provider \"${providerId}\" is not configured or not enabled`\n }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Store state in a cookie for CSRF validation on callback\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax', // Lax required for OAuth redirect flow\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n providerConfig,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.redirect(authorizeUrl)\n } catch (error) {\n console.error('OAuth authorize error:', error)\n return c.json({ error: 'Failed to initiate OAuth flow' }, 500)\n }\n })\n\n // GET /auth/oauth/:provider/callback — Handle OAuth callback\n oauthAPI.get('/:provider/callback', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.redirect('/auth/login?error=Unknown OAuth provider')\n }\n\n // Validate state (CSRF protection)\n const stateParam = c.req.query('state')\n const stateCookie = getCookie(c, STATE_COOKIE_NAME)\n\n if (!stateParam || !stateCookie || stateParam !== stateCookie) {\n return c.redirect('/auth/login?error=Invalid OAuth state. Please try again.')\n }\n\n // Clear the state cookie\n setCookie(c, STATE_COOKIE_NAME, '', {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: 0,\n path: '/auth/oauth'\n })\n\n // Check for error from provider\n const errorParam = c.req.query('error')\n if (errorParam) {\n const errorDesc = c.req.query('error_description') || errorParam\n return c.redirect(`/auth/login?error=${encodeURIComponent(errorDesc)}`)\n }\n\n const code = c.req.query('code')\n if (!code) {\n return c.redirect('/auth/login?error=No authorization code received')\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.redirect('/auth/login?error=OAuth provider not configured')\n }\n\n const oauthService = new OAuthService(db)\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Exchange code for tokens\n const tokens = await oauthService.exchangeCode(\n providerConfig,\n creds.clientId,\n creds.clientSecret,\n code,\n redirectUri\n )\n\n // Fetch user profile from provider\n const profile = await oauthService.fetchUserProfile(providerConfig, tokens.access_token)\n\n if (!profile.email) {\n return c.redirect('/auth/login?error=Could not retrieve email from OAuth provider. Please ensure your email is public or grant email permission.')\n }\n\n const tokenExpiresAt = tokens.expires_in\n ? Date.now() + (tokens.expires_in * 1000)\n : null\n\n // Check if this OAuth account is already linked to a user\n const existingOAuth = await oauthService.findOAuthAccount(providerId, profile.providerAccountId)\n\n if (existingOAuth) {\n // Existing OAuth link — update tokens and log in\n await oauthService.updateOAuthTokens(\n existingOAuth.id,\n tokens.access_token,\n tokens.refresh_token,\n tokenExpiresAt ?? undefined\n )\n\n // Fetch user to generate JWT\n const user = await db.prepare(\n 'SELECT id, email, role, is_active FROM users WHERE id = ?'\n ).bind(existingOAuth.user_id).first() as any\n\n if (!user || !user.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n user.id, user.email, user.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // No existing OAuth link — check if user exists by email\n const existingUser = await oauthService.findUserByEmail(profile.email)\n\n if (existingUser) {\n if (!existingUser.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n // Link OAuth to existing account\n await oauthService.createOAuthAccount({\n userId: existingUser.id,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n existingUser.id, existingUser.email, existingUser.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // Brand new user — create account from OAuth profile\n const newUserId = await oauthService.createUserFromOAuth(profile)\n\n await oauthService.createOAuthAccount({\n userId: newUserId,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n newUserId, profile.email.toLowerCase(), 'viewer',\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n\n } catch (error) {\n console.error('OAuth callback error:', error)\n const message = error instanceof Error ? error.message : 'OAuth authentication failed'\n return c.redirect(`/auth/login?error=${encodeURIComponent(message)}`)\n }\n })\n\n // POST /auth/oauth/link — Link an OAuth provider to the current logged-in user\n oauthAPI.post('/link', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider || !BUILT_IN_PROVIDERS[provider]) {\n return c.json({ error: 'Invalid provider' }, 400)\n }\n\n // Redirect the user to the OAuth flow — the callback will auto-link\n // since the user already exists by email\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, provider)\n\n if (!creds) {\n return c.json({ error: `OAuth provider \"${provider}\" is not configured` }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, provider)\n\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n BUILT_IN_PROVIDERS[provider]!,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.json({ redirectUrl: authorizeUrl })\n } catch (error) {\n console.error('OAuth link error:', error)\n return c.json({ error: 'Failed to initiate account linking' }, 500)\n }\n })\n\n // POST /auth/oauth/unlink — Unlink an OAuth provider from the current user\n oauthAPI.post('/unlink', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider) {\n return c.json({ error: 'Provider is required' }, 400)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const success = await oauthService.unlinkOAuthAccount(user.userId, provider)\n\n if (!success) {\n return c.json({\n error: 'Cannot unlink the only authentication method. Set a password first.'\n }, 400)\n }\n\n return c.json({ success: true, message: `${provider} account unlinked` })\n } catch (error) {\n console.error('OAuth unlink error:', error)\n return c.json({ error: 'Failed to unlink account' }, 500)\n }\n })\n\n // GET /auth/oauth/accounts — List linked OAuth accounts for current user\n oauthAPI.get('/accounts', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const accounts = await oauthService.findUserOAuthAccounts(user.userId)\n\n return c.json({\n accounts: accounts.map(a => ({\n provider: a.provider,\n providerAccountId: a.provider_account_id,\n linkedAt: a.created_at\n }))\n })\n } catch (error) {\n console.error('OAuth accounts error:', error)\n return c.json({ error: 'Failed to fetch linked accounts' }, 500)\n }\n })\n\n // Register routes\n builder.addRoute('/auth/oauth', oauthAPI, {\n description: 'OAuth2 social login endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Add menu item for admin settings\n builder.addMenuItem('OAuth Providers', '/admin/plugins/oauth-providers', {\n icon: 'shield',\n order: 86,\n permissions: ['oauth:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OAuth Providers plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OAuth Providers plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const oauthProvidersPlugin = createOAuthProvidersPlugin()\n","/**\n * Embedding Service\n * Generates embeddings using Cloudflare Workers AI\n */\n\nexport class EmbeddingService {\n constructor(private ai: any) {}\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string): Promise {\n try {\n // Use Cloudflare Workers AI embedding model\n // @cf/baai/bge-base-en-v1.5 produces 768-dimensional vectors\n const response = await this.ai.run('@cf/baai/bge-base-en-v1.5', {\n text: this.preprocessText(text)\n })\n\n // Extract embedding vector\n if (response.data && response.data.length > 0) {\n return response.data[0]\n }\n\n throw new Error('No embedding data returned')\n } catch (error) {\n console.error('[EmbeddingService] Error generating embedding:', error)\n throw error\n }\n }\n\n /**\n * Generate embeddings for multiple texts (batch processing)\n */\n async generateBatch(texts: string[]): Promise {\n try {\n // Process in smaller batches to avoid rate limits\n const batchSize = 10\n const batches: string[][] = []\n \n for (let i = 0; i < texts.length; i += batchSize) {\n batches.push(texts.slice(i, i + batchSize))\n }\n\n const allEmbeddings: number[][] = []\n\n for (const batch of batches) {\n const batchEmbeddings = await Promise.all(\n batch.map(text => this.generateEmbedding(text))\n )\n allEmbeddings.push(...batchEmbeddings)\n }\n\n return allEmbeddings\n } catch (error) {\n console.error('[EmbeddingService] Error generating batch embeddings:', error)\n throw error\n }\n }\n\n /**\n * Preprocess text before generating embedding\n * - Trim whitespace\n * - Limit length to avoid token limits\n * - Remove special characters that might cause issues\n */\n private preprocessText(text: string): string {\n if (!text) return ''\n\n // Trim and normalize whitespace\n let processed = text.trim().replace(/\\s+/g, ' ')\n\n // Limit to ~8000 characters (rough token limit)\n if (processed.length > 8000) {\n processed = processed.substring(0, 8000)\n }\n\n return processed\n }\n\n /**\n * Calculate cosine similarity between two embeddings\n */\n cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Embeddings must have same dimensions')\n }\n\n let dotProduct = 0\n let normA = 0\n let normB = 0\n\n for (let i = 0; i < a.length; i++) {\n const aVal = a[i] ?? 0\n const bVal = b[i] ?? 0\n dotProduct += aVal * bVal\n normA += aVal * aVal\n normB += bVal * bVal\n }\n\n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB))\n }\n}\n","/**\n * Chunking Service\n * Splits content into optimal chunks for embedding and search\n */\n\nexport interface ContentChunk {\n id: string\n content_id: string\n collection_id: string\n title: string\n text: string\n chunk_index: number\n metadata: Record\n}\n\nexport class ChunkingService {\n // Default chunk size (in approximate tokens)\n private readonly CHUNK_SIZE = 500\n private readonly CHUNK_OVERLAP = 50\n\n /**\n * Chunk a single content item\n */\n chunkContent(\n contentId: string,\n collectionId: string,\n title: string,\n data: any,\n metadata: Record = {}\n ): ContentChunk[] {\n // Extract all text from content\n const text = this.extractText(data)\n \n if (!text || text.trim().length === 0) {\n console.warn(`[ChunkingService] No text found for content ${contentId}`)\n return []\n }\n\n // Split into chunks\n const textChunks = this.splitIntoChunks(text)\n\n // Create chunk objects\n return textChunks.map((chunkText, index) => ({\n id: `${contentId}_chunk_${index}`,\n content_id: contentId,\n collection_id: collectionId,\n title: title,\n text: chunkText,\n chunk_index: index,\n metadata: {\n ...metadata,\n total_chunks: textChunks.length\n }\n }))\n }\n\n /**\n * Chunk multiple content items\n */\n chunkContentBatch(items: Array<{\n id: string\n collection_id: string\n title: string\n data: any\n metadata?: Record\n }>): ContentChunk[] {\n const allChunks: ContentChunk[] = []\n\n for (const item of items) {\n const chunks = this.chunkContent(\n item.id,\n item.collection_id,\n item.title,\n item.data,\n item.metadata\n )\n allChunks.push(...chunks)\n }\n\n return allChunks\n }\n\n /**\n * Extract all text from content data\n */\n private extractText(data: any): string {\n const parts: string[] = []\n\n // Common text fields\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n if (data.summary) parts.push(String(data.summary))\n\n // Recursively extract from nested objects\n const extractRecursive = (obj: any): void => {\n if (typeof obj === 'string') {\n // Skip very short strings and URLs\n if (obj.length > 10 && !obj.startsWith('http')) {\n parts.push(obj)\n }\n } else if (Array.isArray(obj)) {\n obj.forEach(extractRecursive)\n } else if (obj && typeof obj === 'object') {\n // Skip certain keys\n const skipKeys = ['id', 'slug', 'url', 'image', 'thumbnail', 'metadata']\n \n Object.entries(obj).forEach(([key, value]) => {\n if (!skipKeys.includes(key.toLowerCase())) {\n extractRecursive(value)\n }\n })\n }\n }\n\n extractRecursive(data)\n\n return parts.join('\\n\\n').trim()\n }\n\n /**\n * Split text into overlapping chunks\n */\n private splitIntoChunks(text: string): string[] {\n // Split by words\n const words = text.split(/\\s+/)\n \n if (words.length <= this.CHUNK_SIZE) {\n return [text]\n }\n\n const chunks: string[] = []\n let startIndex = 0\n\n while (startIndex < words.length) {\n // Get chunk with overlap\n const endIndex = Math.min(startIndex + this.CHUNK_SIZE, words.length)\n const chunk = words.slice(startIndex, endIndex).join(' ')\n chunks.push(chunk)\n\n // Move forward by chunk size minus overlap\n startIndex += this.CHUNK_SIZE - this.CHUNK_OVERLAP\n\n // Ensure we don't create a tiny last chunk\n if (startIndex >= words.length - this.CHUNK_OVERLAP) {\n break\n }\n }\n\n return chunks\n }\n\n /**\n * Get optimal chunk size based on content type\n */\n getOptimalChunkSize(contentType: string): number {\n switch (contentType) {\n case 'blog_posts':\n case 'articles':\n return 600 // Larger chunks for long-form content\n case 'products':\n case 'pages':\n return 400 // Medium chunks for structured content\n case 'messages':\n case 'comments':\n return 200 // Small chunks for short content\n default:\n return this.CHUNK_SIZE\n }\n }\n}\n","/**\n * Custom RAG Service\n * Implements full RAG pipeline using Cloudflare Vectorize\n * \n * Fulfills GitHub Issue #362: Advanced search with Cloudflare Search\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { EmbeddingService } from './embedding.service'\nimport { ChunkingService, type ContentChunk } from './chunking.service'\nimport type { SearchQuery, SearchResponse, SearchResult, AISearchSettings } from '../types'\n\nexport class CustomRAGService {\n private embeddingService: EmbeddingService\n private chunkingService: ChunkingService\n\n constructor(\n private db: D1Database,\n private ai: any,\n private vectorize: any\n ) {\n this.embeddingService = new EmbeddingService(ai)\n this.chunkingService = new ChunkingService()\n }\n\n /**\n * Index all content from a collection\n */\n async indexCollection(collectionId: string): Promise<{\n total_items: number\n total_chunks: number\n indexed_chunks: number\n errors: number\n }> {\n console.log(`[CustomRAG] Starting indexing for collection: ${collectionId}`)\n \n try {\n // Get all published content from collection\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.collection_id = ? AND c.status = 'published'\n `)\n .bind(collectionId)\n .all<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n const totalItems = contentItems?.length || 0\n \n if (totalItems === 0) {\n console.log(`[CustomRAG] No content found in collection ${collectionId}`)\n return { total_items: 0, total_chunks: 0, indexed_chunks: 0, errors: 0 }\n }\n\n // Chunk all content\n const items = (contentItems || []).map(item => ({\n id: item.id,\n collection_id: item.collection_id,\n title: item.title || 'Untitled',\n data: typeof item.data === 'string' ? JSON.parse(item.data) : item.data,\n metadata: {\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name\n }\n }))\n\n const chunks = this.chunkingService.chunkContentBatch(items)\n const totalChunks = chunks.length\n\n console.log(`[CustomRAG] Generated ${totalChunks} chunks from ${totalItems} items`)\n\n // Generate embeddings in batches\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n console.log(`[CustomRAG] Generated ${embeddings.length} embeddings`)\n\n // Store in Vectorize\n let indexedChunks = 0\n let errors = 0\n const batchSize = 100\n\n for (let i = 0; i < chunks.length; i += batchSize) {\n const chunkBatch = chunks.slice(i, i + batchSize)\n const embeddingBatch = embeddings.slice(i, i + batchSize)\n\n try {\n await this.vectorize.upsert(\n chunkBatch.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddingBatch[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500), // Store snippet for display\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n indexedChunks += chunkBatch.length\n console.log(`[CustomRAG] Indexed batch ${i / batchSize + 1}: ${chunkBatch.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error indexing batch ${i / batchSize + 1}:`, error)\n errors += chunkBatch.length\n }\n }\n\n console.log(`[CustomRAG] Indexing complete: ${indexedChunks}/${totalChunks} chunks indexed`)\n\n return {\n total_items: totalItems,\n total_chunks: totalChunks,\n indexed_chunks: indexedChunks,\n errors\n }\n } catch (error) {\n console.error(`[CustomRAG] Error indexing collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Search using RAG (semantic search with Vectorize)\n */\n async search(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n\n try {\n console.log(`[CustomRAG] Searching for: \"${query.query}\"`)\n\n // Generate query embedding\n const queryEmbedding = await this.embeddingService.generateEmbedding(query.query)\n\n // Build Vectorize query filters\n const filter: any = {}\n \n if (query.filters?.collections && query.filters.collections.length > 0) {\n filter.collection_id = { $in: query.filters.collections }\n } else if (settings.selected_collections.length > 0) {\n filter.collection_id = { $in: settings.selected_collections }\n }\n\n if (query.filters?.status && query.filters.status.length > 0) {\n filter.status = { $in: query.filters.status }\n }\n\n // Vectorize filters have issues, so we query without filter and manually filter results\n const vectorResults = await this.vectorize.query(queryEmbedding, {\n topK: 50, // Max allowed with returnMetadata: true\n returnMetadata: true\n })\n\n // Manually filter results by collection_id if filter exists\n let filteredMatches = vectorResults.matches || []\n if (filter.collection_id?.$in && Array.isArray(filter.collection_id.$in)) {\n const allowedCollections = filter.collection_id.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedCollections.includes(match.metadata?.collection_id)\n )\n }\n\n // Apply status filter if exists\n if (filter.status?.$in && Array.isArray(filter.status.$in)) {\n const allowedStatuses = filter.status.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedStatuses.includes(match.metadata?.status)\n )\n }\n\n // Limit to requested topK\n const topK = query.limit || settings.results_limit || 20\n filteredMatches = filteredMatches.slice(0, topK)\n\n // Replace matches with filtered results\n vectorResults.matches = filteredMatches\n\n if (!vectorResults.matches || vectorResults.matches.length === 0) {\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: 'ai'\n }\n }\n\n // Get unique content IDs\n const contentIds = [...new Set(\n vectorResults.matches.map((m: any) => m.metadata.content_id)\n )]\n\n // Fetch full content from D1\n const placeholders = contentIds.map(() => '?').join(',')\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.display_name as collection_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id IN (${placeholders})\n `)\n .bind(...contentIds)\n .all<{\n id: string\n title: string\n slug: string\n collection_id: string\n collection_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n }>()\n\n // Map results with relevance scores\n const searchResults: SearchResult[] = (contentItems || []).map(item => {\n // Find best matching chunk for this content\n const matchingChunks = vectorResults.matches.filter(\n (m: any) => m.metadata.content_id === item.id\n )\n \n const bestMatch = matchingChunks.reduce((best: any, current: any) => \n current.score > (best?.score || 0) ? current : best\n , null)\n\n return {\n id: item.id,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n collection_id: item.collection_id,\n collection_name: item.collection_name,\n snippet: bestMatch?.metadata?.text || '',\n relevance_score: bestMatch?.score || 0,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at\n }\n })\n\n // Sort by relevance score\n searchResults.sort((a, b) => (b.relevance_score || 0) - (a.relevance_score || 0))\n\n const queryTime = Date.now() - startTime\n console.log(`[CustomRAG] Search completed in ${queryTime}ms, ${searchResults.length} results`)\n\n return {\n results: searchResults,\n total: searchResults.length,\n query_time_ms: queryTime,\n mode: 'ai'\n }\n } catch (error) {\n console.error('[CustomRAG] Search error:', error)\n throw error\n }\n }\n\n /**\n * Update index for a single content item\n */\n async updateContentIndex(contentId: string): Promise {\n try {\n // Get content item\n const content = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n .bind(contentId)\n .first<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!content) {\n console.warn(`[CustomRAG] Content ${contentId} not found`)\n return\n }\n\n // If content is not published, remove from index\n if (content.status !== 'published') {\n await this.removeContentFromIndex(contentId)\n return\n }\n\n // Chunk content\n const chunks = this.chunkingService.chunkContent(\n content.id,\n content.collection_id,\n content.title || 'Untitled',\n typeof content.data === 'string' ? JSON.parse(content.data) : content.data,\n {\n status: content.status,\n created_at: content.created_at,\n updated_at: content.updated_at,\n author_id: content.author_id,\n collection_name: content.collection_name,\n collection_display_name: content.collection_display_name\n }\n )\n\n // Generate embeddings\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n // Update in Vectorize\n await this.vectorize.upsert(\n chunks.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddings[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500),\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n console.log(`[CustomRAG] Updated index for content ${contentId}: ${chunks.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error updating index for ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove content from index\n */\n async removeContentFromIndex(contentId: string): Promise {\n try {\n // Note: Vectorize doesn't have a bulk delete by metadata filter\n // We need to delete each chunk individually\n // In practice, we would track chunk IDs or use a different approach\n \n console.log(`[CustomRAG] Removing content ${contentId} from index`)\n \n // For now, we'll let stale chunks age out\n // A better approach would be to maintain a mapping in D1\n // TODO: Implement proper chunk tracking\n \n } catch (error) {\n console.error(`[CustomRAG] Error removing content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Get search suggestions based on query\n */\n async getSuggestions(partialQuery: string, limit: number = 5): Promise {\n try {\n // Generate embedding for partial query\n const queryEmbedding = await this.embeddingService.generateEmbedding(partialQuery)\n\n // Search for similar content titles\n const results = await this.vectorize.query(queryEmbedding, {\n topK: limit * 2, // Get more to filter\n returnMetadata: true\n })\n\n // Extract unique titles\n const suggestions = [...new Set(\n results.matches?.map((m: any) => m.metadata.title).filter(Boolean) || []\n )].slice(0, limit)\n\n return suggestions as string[]\n } catch (error) {\n console.error('[CustomRAG] Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Check if Vectorize is available and configured\n */\n isAvailable(): boolean {\n return !!this.vectorize && !!this.ai\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n NewCollectionNotification,\n} from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * AI Search Service\n * Handles search operations, settings management, and collection detection\n * Now uses Custom RAG with Vectorize for semantic search\n */\nexport class AISearchService {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[AISearchService] Custom RAG initialized')\n } else {\n console.log('[AISearchService] Custom RAG not available, using keyword search only')\n }\n }\n\n /**\n * Get plugin settings\n */\n async getSettings(): Promise {\n try {\n const plugin = await this.db\n .prepare(`SELECT settings FROM plugins WHERE id = ? LIMIT 1`)\n .bind('ai-search')\n .first<{ settings: string | null }>()\n\n if (!plugin || !plugin.settings) {\n return this.getDefaultSettings()\n }\n\n return JSON.parse(plugin.settings) as AISearchSettings\n } catch (error) {\n console.error('Error fetching AI Search settings:', error)\n return this.getDefaultSettings()\n }\n }\n\n /**\n * Get default settings\n */\n getDefaultSettings(): AISearchSettings {\n return {\n enabled: true,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n }\n\n /**\n * Update plugin settings\n */\n async updateSettings(settings: Partial): Promise {\n const existing = await this.getSettings()\n const updated: AISearchSettings = {\n ...existing!,\n ...settings,\n }\n\n try {\n // Update plugin settings in plugins table\n await this.db\n .prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'ai-search'\n `)\n .bind(JSON.stringify(updated))\n .run()\n\n return updated\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n throw error\n }\n }\n\n /**\n * Detect new collections that aren't indexed or dismissed\n */\n async detectNewCollections(): Promise {\n try {\n // Get all collections (exclude test collections)\n // Note: D1 doesn't support parameterized LIKE, so we filter in JavaScript\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: number\n name: string\n display_name: string\n description?: string\n }>()\n \n // Filter out test collections (starts with test_, ends with _test, or is test_collection)\n const collections = (allCollections || []).filter(\n (col) => {\n if (!col.name) return false\n const name = col.name.toLowerCase()\n return !name.startsWith('test_') && \n !name.endsWith('_test') && \n name !== 'test_collection' &&\n !name.includes('_test_') &&\n name !== 'large_payload_test' &&\n name !== 'concurrent_test'\n }\n )\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n\n // Get item counts for each collection\n const notifications: NewCollectionNotification[] = []\n\n for (const collection of collections || []) {\n const collectionId = String(collection.id)\n\n // Skip if already selected or dismissed\n if (selected.includes(collectionId) || dismissed.includes(collectionId)) {\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n notifications.push({\n collection: {\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: false,\n is_dismissed: false,\n is_new: true,\n },\n message: `New collection \"${collection.display_name}\" with ${itemCount} items available for indexing`,\n })\n }\n\n return notifications\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return []\n }\n }\n\n /**\n * Get all collections with indexing status\n */\n async getAllCollections(): Promise {\n try {\n // Get all collections (same query as content page)\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1 ORDER BY display_name'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: string\n name: string\n display_name: string\n description?: string\n }>()\n \n console.log('[AISearchService.getAllCollections] Raw collections from DB:', allCollections?.length || 0)\n const firstCollection = allCollections?.[0]\n if (firstCollection) {\n console.log('[AISearchService.getAllCollections] Sample collection:', {\n id: firstCollection.id,\n name: firstCollection.name,\n display_name: firstCollection.display_name\n })\n }\n \n // No filtering needed - test collections are now properly cleaned up by E2E tests\n const collections = (allCollections || []).filter(\n (col) => col.id && col.name\n )\n \n console.log('[AISearchService.getAllCollections] After filtering test collections:', collections.length)\n console.log('[AISearchService.getAllCollections] Remaining collections:', collections.map(c => c.name).join(', '))\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n \n console.log('[AISearchService.getAllCollections] Settings:', {\n selected_count: selected.length,\n dismissed_count: dismissed.length,\n selected: selected\n })\n\n // Get item counts and indexing status\n const collectionInfos: CollectionInfo[] = []\n\n for (const collection of collections) {\n if (!collection.id || !collection.name) continue\n const collectionId = String(collection.id)\n \n if (!collectionId) {\n console.warn('[AISearchService] Skipping invalid collection:', collection)\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n collectionInfos.push({\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name || collection.name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: selected.includes(collectionId),\n is_dismissed: dismissed.includes(collectionId),\n is_new: !selected.includes(collectionId) && !dismissed.includes(collectionId),\n })\n }\n \n console.log('[AISearchService.getAllCollections] Returning collectionInfos:', collectionInfos.length)\n const firstInfo = collectionInfos[0]\n if (collectionInfos.length > 0 && firstInfo) {\n console.log('[AISearchService.getAllCollections] First collectionInfo:', {\n id: firstInfo.id,\n name: firstInfo.name,\n display_name: firstInfo.display_name,\n item_count: firstInfo.item_count\n })\n }\n return collectionInfos\n } catch (error) {\n console.error('[AISearchService] Error fetching collections:', error)\n return []\n }\n }\n\n /**\n * Execute search query\n */\n async search(query: SearchQuery): Promise {\n const startTime = Date.now()\n const settings = await this.getSettings()\n\n if (!settings?.enabled) {\n return {\n results: [],\n total: 0,\n query_time_ms: 0,\n mode: query.mode,\n }\n }\n\n // Use AI Search if enabled and mode is 'ai'\n if (query.mode === 'ai' && settings.ai_mode_enabled && this.customRAG?.isAvailable()) {\n return this.searchAI(query, settings)\n }\n\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n\n /**\n * AI-powered semantic search using Custom RAG\n */\n private async searchAI(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n \n try {\n if (!this.customRAG) {\n console.warn('[AISearchService] CustomRAG not available, falling back to keyword search')\n return this.searchKeyword(query, settings)\n }\n\n // Use Custom RAG for semantic search - pass the full query object and settings\n const result = await this.customRAG.search(query, settings)\n\n return result\n } catch (error) {\n console.error('[AISearchService] AI search error, falling back to keyword:', error)\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n }\n\n /**\n * Traditional keyword search\n */\n private async searchKeyword(\n query: SearchQuery,\n settings: AISearchSettings\n ): Promise {\n const startTime = Date.now()\n\n try {\n const conditions: string[] = []\n const params: any[] = []\n\n // Search query\n if (query.query) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n const searchTerm = `%${query.query}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n // Collection filter\n if (query.filters?.collections && query.filters.collections.length > 0) {\n const placeholders = query.filters.collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...query.filters.collections)\n } else if (settings.selected_collections.length > 0) {\n // Only search indexed collections\n const placeholders = settings.selected_collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...settings.selected_collections)\n }\n\n // Status filter\n if (query.filters?.status && query.filters.status.length > 0) {\n const placeholders = query.filters.status.map(() => '?').join(',')\n conditions.push(`c.status IN (${placeholders})`)\n params.push(...query.filters.status)\n } else {\n // Exclude deleted by default\n conditions.push(\"c.status != 'deleted'\")\n }\n\n // Date range filter\n if (query.filters?.dateRange) {\n const field = query.filters.dateRange.field || 'created_at'\n if (query.filters.dateRange.start) {\n conditions.push(`c.${field} >= ?`)\n params.push(query.filters.dateRange.start.getTime())\n }\n if (query.filters.dateRange.end) {\n conditions.push(`c.${field} <= ?`)\n params.push(query.filters.dateRange.end.getTime())\n }\n }\n\n // Author filter\n if (query.filters?.author) {\n conditions.push('c.author_id = ?')\n params.push(query.filters.author)\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get results\n const limit = query.limit || settings.results_limit\n const offset = query.offset || 0\n\n const resultsStmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id, c.data,\n col.name as collection_name, col.display_name as collection_display_name,\n u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results } = await resultsStmt.bind(...params, limit, offset).all<{\n id: string\n title: string\n slug: string\n collection_id: number\n collection_name: string\n collection_display_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n author_email?: string\n data: string\n }>()\n\n const searchResults: SearchResult[] = (results || []).map((row) => ({\n id: String(row.id),\n title: row.title || 'Untitled',\n slug: row.slug || '',\n collection_id: String(row.collection_id),\n collection_name: row.collection_display_name || row.collection_name,\n snippet: this.extractSnippet(row.data, query.query),\n status: row.status,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n author_name: row.author_email,\n }))\n\n const queryTime = Date.now() - startTime\n\n // Log search history\n await this.logSearch(query.query, query.mode, searchResults.length)\n\n return {\n results: searchResults,\n total,\n query_time_ms: queryTime,\n mode: query.mode,\n }\n } catch (error) {\n console.error('Keyword search error:', error)\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: query.mode,\n }\n }\n }\n\n /**\n * Extract snippet from content data\n */\n private extractSnippet(data: string, query: string): string {\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data\n const text = JSON.stringify(parsed).toLowerCase()\n const queryLower = query.toLowerCase()\n\n const index = text.indexOf(queryLower)\n if (index === -1) {\n // Return first 200 chars\n return JSON.stringify(parsed).substring(0, 200) + '...'\n }\n\n // Extract context around match\n const start = Math.max(0, index - 50)\n const end = Math.min(text.length, index + query.length + 50)\n return text.substring(start, end) + '...'\n } catch {\n return data.substring(0, 200) + '...'\n }\n }\n\n /**\n * Get search suggestions (autocomplete)\n */\n async getSearchSuggestions(partial: string): Promise {\n try {\n const settings = await this.getSettings()\n if (!settings?.autocomplete_enabled) {\n return []\n }\n\n // If Custom RAG is available, use AI-powered suggestions\n if (this.customRAG?.isAvailable()) {\n try {\n const aiSuggestions = await this.customRAG.getSuggestions(partial, 5)\n if (aiSuggestions.length > 0) {\n return aiSuggestions\n }\n } catch (error) {\n console.error('[AISearchService] Error getting AI suggestions:', error)\n // Fall through to history-based suggestions\n }\n }\n\n // Fallback to history-based suggestions\n const stmt = this.db.prepare(`\n SELECT DISTINCT query \n FROM ai_search_history \n WHERE query LIKE ? \n ORDER BY created_at DESC \n LIMIT 10\n `)\n const { results } = await stmt.bind(`%${partial}%`).all<{ query: string }>()\n\n return (results || []).map((r) => r.query)\n } catch (error) {\n console.error('Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Log search query to history\n */\n private async logSearch(query: string, mode: 'ai' | 'keyword', resultsCount: number): Promise {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_history (query, mode, results_count, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await stmt.bind(query, mode, resultsCount, Date.now()).run()\n } catch (error) {\n console.error('Error logging search:', error)\n }\n }\n\n /**\n * Get search analytics\n */\n async getSearchAnalytics(): Promise<{\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }> {\n try {\n // Total queries (last 30 days)\n const totalStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n `)\n const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000\n const totalResult = await totalStmt.bind(thirtyDaysAgo).first<{ count: number }>()\n\n // AI vs Keyword breakdown\n const modeStmt = this.db.prepare(`\n SELECT mode, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY mode\n `)\n const { results: modeResults } = await modeStmt.bind(thirtyDaysAgo).all<{\n mode: string\n count: number\n }>()\n\n const aiCount = modeResults?.find((r) => r.mode === 'ai')?.count || 0\n const keywordCount = modeResults?.find((r) => r.mode === 'keyword')?.count || 0\n\n // Popular queries\n const popularStmt = this.db.prepare(`\n SELECT query, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY query \n ORDER BY count DESC \n LIMIT 10\n `)\n const { results: popularResults } = await popularStmt.bind(thirtyDaysAgo).all<{\n query: string\n count: number\n }>()\n\n return {\n total_queries: totalResult?.count || 0,\n ai_queries: aiCount,\n keyword_queries: keywordCount,\n popular_queries: (popularResults || []).map((r) => ({\n query: r.query,\n count: r.count,\n })),\n average_query_time: 0, // TODO: Track query times\n }\n } catch (error) {\n console.error('Error getting analytics:', error)\n return {\n total_queries: 0,\n ai_queries: 0,\n keyword_queries: 0,\n popular_queries: [],\n average_query_time: 0,\n }\n }\n }\n\n /**\n * Verify Custom RAG is available\n */\n verifyBinding(): boolean {\n return this.customRAG?.isAvailable() ?? false\n }\n\n /**\n * Get Custom RAG service instance (for indexer)\n */\n getCustomRAG(): CustomRAGService | undefined {\n return this.customRAG\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { AISearchSettings, IndexStatus } from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * Index Manager Service\n * Handles indexing of content items using Custom RAG with Vectorize\n */\nexport class IndexManager {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[IndexManager] Custom RAG initialized')\n }\n }\n\n /**\n * Index all content items within a collection using Custom RAG\n */\n async indexCollection(collectionId: string): Promise {\n try {\n // Get collection info\n const collectionStmt = this.db.prepare(\n 'SELECT id, name, display_name FROM collections WHERE id = ?'\n )\n const collection = await collectionStmt.bind(collectionId).first<{\n id: string\n name: string\n display_name: string\n }>()\n\n if (!collection) {\n throw new Error(`Collection ${collectionId} not found`)\n }\n\n // Update status to indexing\n await this.updateIndexStatus(collectionId, {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n status: 'indexing',\n })\n\n // Use Custom RAG for indexing if available\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Using Custom RAG to index collection ${collectionId}`)\n \n const result = await this.customRAG.indexCollection(collectionId)\n\n const finalStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: result.total_items,\n indexed_items: result.indexed_chunks,\n last_sync_at: Date.now(),\n status: result.errors > 0 ? 'error' : 'completed',\n error_message: result.errors > 0 ? `${result.errors} errors during indexing` : undefined\n }\n\n await this.updateIndexStatus(collectionId, finalStatus)\n return finalStatus\n }\n\n // Fallback: No indexing without Custom RAG\n console.warn(`[IndexManager] Custom RAG not available, skipping indexing for ${collectionId}`)\n \n const fallbackStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n last_sync_at: Date.now(),\n status: 'completed',\n error_message: 'Custom RAG not available - using keyword search only'\n }\n\n await this.updateIndexStatus(collectionId, fallbackStatus)\n return fallbackStatus\n } catch (error) {\n console.error(`[IndexManager] Error indexing collection ${collectionId}:`, error)\n const errorStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: 'Unknown',\n total_items: 0,\n indexed_items: 0,\n status: 'error',\n error_message: error instanceof Error ? error.message : String(error),\n }\n await this.updateIndexStatus(collectionId, errorStatus)\n return errorStatus\n }\n }\n\n /**\n * Index a single content item\n */\n private async indexContentItem(\n item: {\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n },\n collectionId: string\n ): Promise {\n try {\n // Parse content data\n let parsedData: any = {}\n try {\n parsedData = typeof item.data === 'string' ? JSON.parse(item.data) : item.data\n } catch {\n parsedData = {}\n }\n\n // Prepare document for AI Search\n const document = {\n id: `content_${item.id}`,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n content: this.extractSearchableText(parsedData),\n metadata: {\n collection_id: collectionId,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n },\n }\n\n // TODO: Call Cloudflare AI Search API to index document\n // await this.aiSearch.index(document)\n\n // For now, just log (actual implementation will use AI Search API)\n console.log(`Indexed content item: ${item.id}`)\n } catch (error) {\n console.error(`Error indexing content item ${item.id}:`, error)\n throw error\n }\n }\n\n /**\n * Extract searchable text from content data\n */\n private extractSearchableText(data: any): string {\n const parts: string[] = []\n\n // Add title if present\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n\n // Add description/content fields\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n\n // Add all string values from data\n const extractStrings = (obj: any): void => {\n if (typeof obj === 'string') {\n parts.push(obj)\n } else if (Array.isArray(obj)) {\n obj.forEach(extractStrings)\n } else if (obj && typeof obj === 'object') {\n Object.values(obj).forEach(extractStrings)\n }\n }\n\n extractStrings(data)\n\n return parts.join(' ')\n }\n\n /**\n * Update a single content item in the index\n */\n async updateIndex(collectionId: number, contentId: string): Promise {\n try {\n // Get content item\n const stmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.data, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ? AND c.collection_id = ?\n `)\n const item = await stmt.bind(contentId, collectionId).first<{\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!item) {\n throw new Error(`Content item ${contentId} not found`)\n }\n\n // Re-index the item\n await this.indexContentItem(item, String(collectionId))\n\n // Update last sync time for collection\n const status = await this.getIndexStatus(String(collectionId))\n if (status) {\n await this.updateIndexStatus(String(collectionId), {\n ...status,\n last_sync_at: Date.now(),\n })\n }\n } catch (error) {\n console.error(`Error updating index for content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove a content item from the index using Custom RAG\n */\n async removeFromIndex(collectionId: string, contentId: string): Promise {\n try {\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Removing content ${contentId} from index`)\n await this.customRAG.removeContentFromIndex(contentId)\n } else {\n console.warn(`[IndexManager] Custom RAG not available, skipping removal for ${contentId}`)\n }\n } catch (error) {\n console.error(`[IndexManager] Error removing content ${contentId} from index:`, error)\n throw error\n }\n }\n\n /**\n * Get indexing status for a collection\n */\n async getIndexStatus(collectionId: string): Promise {\n try {\n const stmt = this.db.prepare(\n 'SELECT * FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const result = await stmt.bind(collectionId).first<{\n id: number\n collection_id: string\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n if (!result) {\n return null\n }\n\n return {\n collection_id: String(result.collection_id),\n collection_name: result.collection_name,\n total_items: result.total_items,\n indexed_items: result.indexed_items,\n last_sync_at: result.last_sync_at,\n status: result.status as IndexStatus['status'],\n error_message: result.error_message,\n }\n } catch (error) {\n console.error(`Error getting index status for collection ${collectionId}:`, error)\n return null\n }\n }\n\n /**\n * Get indexing status for all collections\n */\n async getAllIndexStatus(): Promise> {\n try {\n const stmt = this.db.prepare('SELECT * FROM ai_search_index_meta')\n const { results } = await stmt.all<{\n id: number\n collection_id: number\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n const statusMap: Record = {}\n\n for (const row of results || []) {\n const collectionId = String(row.collection_id)\n statusMap[collectionId] = {\n collection_id: collectionId,\n collection_name: row.collection_name,\n total_items: row.total_items,\n indexed_items: row.indexed_items,\n last_sync_at: row.last_sync_at,\n status: row.status as IndexStatus['status'],\n error_message: row.error_message,\n }\n }\n\n return statusMap\n } catch (error) {\n console.error('Error getting all index status:', error)\n return {}\n }\n }\n\n /**\n * Update index status in database\n */\n private async updateIndexStatus(collectionId: string, status: IndexStatus): Promise {\n try {\n // Check if record exists\n const checkStmt = this.db.prepare(\n 'SELECT id FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const existing = await checkStmt.bind(collectionId).first<{ id: number }>()\n\n if (existing) {\n // Update existing\n const stmt = this.db.prepare(`\n UPDATE ai_search_index_meta \n SET collection_name = ?,\n total_items = ?,\n indexed_items = ?,\n last_sync_at = ?,\n status = ?,\n error_message = ?\n WHERE collection_id = ?\n `)\n await stmt\n .bind(\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null,\n String(collectionId)\n )\n .run()\n } else {\n // Insert new\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_index_meta (\n collection_id, collection_name, total_items, indexed_items,\n last_sync_at, status, error_message\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n await stmt\n .bind(\n String(status.collection_id),\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null\n )\n .run()\n }\n } catch (error) {\n console.error(`Error updating index status for collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Sync all selected collections\n */\n async syncAll(selectedCollections: string[]): Promise {\n for (const collectionId of selectedCollections) {\n try {\n await this.indexCollection(collectionId)\n } catch (error) {\n console.error(`Error syncing collection ${collectionId}:`, error)\n }\n }\n }\n}\n","import { renderAdminLayout } from '../../../../templates/layouts/admin-layout-v2.template'\nimport type {\n AISearchSettings,\n CollectionInfo,\n IndexStatus,\n NewCollectionNotification,\n} from '../types'\n\ninterface SettingsPageData {\n settings: AISearchSettings | null\n collections: CollectionInfo[]\n newCollections: NewCollectionNotification[]\n indexStatus: Record\n analytics: {\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const settings = data.settings || {\n enabled: false,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n\n // Ensure arrays exist\n const selectedCollections = Array.isArray(settings.selected_collections) ? settings.selected_collections : []\n const dismissedCollections = Array.isArray(settings.dismissed_collections) ? settings.dismissed_collections : []\n\n const enabled = settings.enabled === true\n const aiModeEnabled = settings.ai_mode_enabled !== false\n const autocompleteEnabled = settings.autocomplete_enabled !== false\n const indexMedia = settings.index_media === true\n\n const selectedCollectionIds = new Set(selectedCollections.map(id => String(id)))\n const dismissedCollectionIds = new Set(dismissedCollections.map(id => String(id)))\n\n // Ensure collections array exists\n const collections = Array.isArray(data.collections) ? data.collections : []\n\n // Debug: Log collections in template\n console.log('[SettingsPage Template] Collections received:', collections.length)\n if (collections.length > 0) {\n console.log('[SettingsPage Template] First collection:', collections[0])\n }\n\n const content = `\n
\n \n
\n
\n

🔍 AI Search Settings

\n

\n Configure advanced search with Cloudflare AI Search. Select collections to index and manage search preferences.\n

\n
\n \n
\n\n\n \n
\n
\n \n
\n

🔍 Search Settings

\n
\n
\n \n
\n \n

Turn on advanced search capabilities across your content

\n
\n
\n\n
\n \n
\n \n

\n Enable natural language queries (requires Cloudflare Workers AI binding)\n → Setup Guide\n

\n

\n ⚠️ If AI binding unavailable, will fallback to keyword search\n

\n
\n
\n
\n
\n\n
\n\n \n
\n
\n
\n

📚 Collections to Index

\n

\n Select which content collections should be indexed and searchable. Only checked collections will be included in search results.\n

\n
\n
\n
\n ${collections.length === 0\n ? '

No collections available. Create collections first.

'\n : collections.map((collection) => {\n const collectionId = String(collection.id)\n const isChecked = selectedCollectionIds.has(collectionId)\n const isDismissed = dismissedCollectionIds.has(collectionId)\n const indexStatusMap: Record = data.indexStatus || {}\n const status = indexStatusMap[collectionId]\n // Only show NEW badge if collection is new, not dismissed, and has never been indexed\n const isNew = collection.is_new === true && !isDismissed && !status\n // Only show status badge if collection is CHECKED and has status\n const statusBadge = (status && isChecked)\n ? `${status.status}`\n : ''\n\n return `
\n \n
\n \n

\n ${collection.description || collection.name || 'No description'} • ${collection.item_count || 0} items\n ${status ? ` • ${status.indexed_items}/${status.total_items} indexed` : ''}\n

\n ${status && status.status === 'indexing'\n ? `
\n
\n
`\n : ''}\n
\n ${isChecked ? `\n \n \n \n \n Re-index\n \n ` : ''}\n
`\n }).join('')}\n
\n
\n\n
\n\n \n
\n

⚙️ Advanced Options

\n
\n
\n \n
\n \n

Show search suggestions as users type

\n
\n
\n\n
\n \n
\n \n

Include media files in search results

\n
\n
\n\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

\n 💡 Collections marked as NEW haven't been indexed yet\n

\n \n
\n
\n
\n\n\n \n
\n

📊 Search Analytics

\n
\n
\n
Total Queries
\n
${data.analytics.total_queries}
\n
\n
\n
AI Queries
\n
${data.analytics.ai_queries}
\n
\n
\n
Keyword Queries
\n
${data.analytics.keyword_queries}
\n
\n
\n ${data.analytics.popular_queries.length > 0\n ? `\n
\n

Popular Searches

\n
\n ${data.analytics.popular_queries.map(\n (item) => `\n
\n \"${item.query}\"\n ${item.count} times\n
\n `\n ).join('')}\n
\n
\n `\n : '

No search history yet.

'}\n
\n\n \n
\n
\n \n Settings Saved Successfully!\n
\n
\n
\n \n `\n\n return renderAdminLayout({\n title: 'AI Search Settings',\n pageTitle: 'AI Search Settings',\n currentPath: '/admin/plugins/ai-search/settings',\n user: data.user,\n content: content\n })\n}\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { requireAuth } from '../../../../middleware'\nimport { AISearchService } from '../services/ai-search'\nimport { IndexManager } from '../services/indexer'\nimport { renderSettingsPage } from '../components/settings-page'\nimport type { AISearchSettings, SearchQuery } from '../types'\n\ntype Variables = {\n user: {\n id: number\n email: string\n role: string\n }\n}\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminRoutes.use('*', requireAuth())\n\n/**\n * GET /admin/plugins/ai-search\n * Render settings page\n */\nadminRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const ai = (c.env as any).AI // Workers AI for embeddings\n const vectorize = (c.env as any).VECTORIZE_INDEX // Vectorize for vector search\n\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n // Get settings\n const settings = await service.getSettings()\n console.log('[AI Search Settings Route] Settings loaded:', !!settings)\n\n // Get all collections with status\n const collections = await service.getAllCollections()\n console.log('[AI Search Settings Route] Collections returned:', collections.length)\n \n // If no collections, try direct query\n if (collections.length === 0) {\n const directQuery = await db.prepare('SELECT id, name, display_name FROM collections WHERE is_active = 1').all()\n console.log('[AI Search Settings Route] Direct DB query found:', directQuery.results?.length || 0, 'collections')\n if (directQuery.results && directQuery.results.length > 0) {\n console.log('[AI Search Settings Route] Sample from DB:', directQuery.results[0])\n }\n } else if (collections.length > 0 && collections[0]) {\n console.log('[AI Search Settings Route] First collection:', {\n id: collections[0].id,\n name: collections[0].name,\n display_name: collections[0].display_name\n })\n }\n\n // Get new collections notifications\n const newCollections = await service.detectNewCollections()\n console.log('AI Search: New collections:', newCollections.length)\n\n // Get index status for all collections\n const indexStatus = await indexer.getAllIndexStatus()\n console.log('AI Search: Index status:', Object.keys(indexStatus).length)\n\n // Get analytics\n const analytics = await service.getSearchAnalytics()\n\n return c.html(\n renderSettingsPage({\n settings,\n collections: collections || [],\n newCollections: newCollections || [],\n indexStatus: indexStatus || {},\n analytics,\n user: {\n name: user.email,\n email: user.email,\n role: user.role,\n },\n })\n )\n } catch (error) {\n console.error('Error rendering AI Search settings:', error)\n return c.html(`

Error loading settings: ${error instanceof Error ? error.message : String(error)}

`, 500)\n }\n})\n\n/**\n * POST /admin/plugins/ai-search\n * Update settings\n */\nadminRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n console.log('[AI Search POST] Received body:', JSON.stringify(body, null, 2))\n\n // Get current settings\n const currentSettings = await service.getSettings()\n console.log('[AI Search POST] Current settings selected_collections:', currentSettings?.selected_collections)\n\n // Update settings\n const updatedSettings: Partial = {\n enabled: body.enabled !== undefined ? Boolean(body.enabled) : currentSettings?.enabled,\n ai_mode_enabled: body.ai_mode_enabled !== undefined ? Boolean(body.ai_mode_enabled) : currentSettings?.ai_mode_enabled,\n selected_collections: Array.isArray(body.selected_collections) ? body.selected_collections.map(String) : (currentSettings?.selected_collections || []),\n dismissed_collections: Array.isArray(body.dismissed_collections) ? body.dismissed_collections.map(String) : (currentSettings?.dismissed_collections || []),\n autocomplete_enabled: body.autocomplete_enabled !== undefined ? Boolean(body.autocomplete_enabled) : currentSettings?.autocomplete_enabled,\n cache_duration: body.cache_duration ? Number(body.cache_duration) : currentSettings?.cache_duration,\n results_limit: body.results_limit ? Number(body.results_limit) : currentSettings?.results_limit,\n index_media: body.index_media !== undefined ? Boolean(body.index_media) : currentSettings?.index_media,\n }\n\n console.log('[AI Search POST] Updated settings selected_collections:', updatedSettings.selected_collections)\n\n // If collections changed, trigger indexing\n const collectionsChanged =\n JSON.stringify(updatedSettings.selected_collections) !==\n JSON.stringify(currentSettings?.selected_collections || [])\n\n const saved = await service.updateSettings(updatedSettings)\n console.log('[AI Search POST] Settings saved, selected_collections:', saved.selected_collections)\n\n // Start indexing if collections were added\n if (collectionsChanged && updatedSettings.selected_collections) {\n console.log('[AI Search POST] Collections changed, starting background indexing')\n // Start indexing in background (non-blocking) - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .syncAll(updatedSettings.selected_collections)\n .then(() => console.log('[AI Search POST] Background indexing completed'))\n .catch((error) => console.error('[AI Search POST] Background indexing error:', error))\n )\n }\n\n return c.json({ success: true, settings: saved })\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n return c.json({ error: 'Failed to update settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/settings\n * Get settings API endpoint\n */\nadminRoutes.get('/api/settings', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const settings = await service.getSettings()\n return c.json({ success: true, data: settings })\n } catch (error) {\n console.error('Error fetching settings:', error)\n return c.json({ error: 'Failed to fetch settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/new-collections\n * Get new collections that aren't indexed or dismissed\n */\nadminRoutes.get('/api/new-collections', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const notifications = await service.detectNewCollections()\n return c.json({ success: true, data: notifications })\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return c.json({ error: 'Failed to detect new collections' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/status\n * Get indexing status\n */\nadminRoutes.get('/api/status', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const status = await indexer.getAllIndexStatus()\n return c.json({ success: true, data: status })\n } catch (error) {\n console.error('Error fetching index status:', error)\n return c.json({ error: 'Failed to fetch status' }, 500)\n }\n})\n\n/**\n * POST /admin/api/ai-search/reindex\n * Trigger re-indexing for a collection\n */\nadminRoutes.post('/api/reindex', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n const collectionIdRaw: unknown = body.collection_id\n const collectionId = collectionIdRaw ? String(collectionIdRaw) : ''\n\n if (!collectionId || collectionId === 'undefined' || collectionId === 'null') {\n return c.json({ error: 'collection_id is required' }, 400)\n }\n\n // Start indexing in background - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .indexCollection(collectionId)\n .then(() => console.log(`[AI Search Reindex] Completed for collection ${collectionId}`))\n .catch((error) => console.error(`[AI Search Reindex] Error for collection ${collectionId}:`, error))\n )\n\n return c.json({ success: true, message: 'Re-indexing started' })\n } catch (error) {\n console.error('Error starting re-index:', error)\n return c.json({ error: 'Failed to start re-indexing' }, 500)\n }\n})\n\nexport default adminRoutes\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { AISearchService } from '../services/ai-search'\nimport type { SearchQuery } from '../types'\n\ntype Variables = {\n user?: {\n id: number\n email: string\n role: string\n }\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * POST /api/search\n * Execute search query\n */\napiRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const body = await c.req.json()\n\n const query: SearchQuery = {\n query: body.query || '',\n mode: body.mode || 'keyword',\n filters: body.filters || {},\n limit: body.limit ? Number(body.limit) : undefined,\n offset: body.offset ? Number(body.offset) : undefined,\n }\n\n // Convert date strings to Date objects if present\n if (query.filters?.dateRange) {\n if (typeof query.filters.dateRange.start === 'string') {\n query.filters.dateRange.start = new Date(query.filters.dateRange.start)\n }\n if (typeof query.filters.dateRange.end === 'string') {\n query.filters.dateRange.end = new Date(query.filters.dateRange.end)\n }\n }\n\n const results = await service.search(query)\n\n return c.json({\n success: true,\n data: results,\n })\n } catch (error) {\n console.error('Search error:', error)\n return c.json(\n {\n success: false,\n error: 'Search failed',\n message: error instanceof Error ? error.message : String(error),\n },\n 500\n )\n }\n})\n\n/**\n * GET /api/search/suggest\n * Get search suggestions (autocomplete)\n */\napiRoutes.get('/suggest', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const query = c.req.query('q') || ''\n\n if (!query || query.length < 2) {\n return c.json({ success: true, data: [] })\n }\n\n const suggestions = await service.getSearchSuggestions(query)\n\n return c.json({\n success: true,\n data: suggestions,\n })\n } catch (error) {\n console.error('Suggestions error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get suggestions',\n },\n 500\n )\n }\n})\n\n/**\n * GET /admin/api/search/analytics\n * Get search analytics\n */\napiRoutes.get('/analytics', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const analytics = await service.getSearchAnalytics()\n\n return c.json({\n success: true,\n data: analytics,\n })\n } catch (error) {\n console.error('Analytics error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get analytics',\n },\n 500\n )\n }\n})\n\nexport default apiRoutes\n","{\n \"id\": \"ai-search\",\n \"name\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"icon\": \"magnifying-glass\",\n \"homepage\": \"https://developers.cloudflare.com/ai-search/\",\n \"repository\": \"https://github.com/sonicjs/sonicjs\",\n \"license\": \"MIT\",\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"configSchema\": {\n \"enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI Search\",\n \"description\": \"Enable or disable AI Search functionality\",\n \"default\": true\n },\n \"ai_mode_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI/Semantic Search\",\n \"description\": \"Enable AI-powered semantic search (requires Cloudflare Workers AI binding)\",\n \"default\": false\n },\n \"ai_provider\": {\n \"type\": \"string\",\n \"label\": \"AI Provider\",\n \"description\": \"Which AI service to use for semantic search\",\n \"default\": \"cloudflare\",\n \"enum\": [\n \"cloudflare\",\n \"keyword-only\"\n ]\n },\n \"autocomplete_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable Autocomplete\",\n \"description\": \"Show search suggestions as user types\",\n \"default\": true\n },\n \"cache_duration\": {\n \"type\": \"number\",\n \"label\": \"Cache Duration (hours)\",\n \"description\": \"How long to cache search results\",\n \"default\": 1,\n \"min\": 0,\n \"max\": 24\n },\n \"results_limit\": {\n \"type\": \"number\",\n \"label\": \"Results Per Page\",\n \"description\": \"Maximum number of results to show per page\",\n \"default\": 20,\n \"min\": 10,\n \"max\": 100\n },\n \"index_media\": {\n \"type\": \"boolean\",\n \"label\": \"Index Media Metadata\",\n \"description\": \"Include R2 media files in search index\",\n \"default\": false\n }\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"href\": \"/admin/plugins/ai-search\",\n \"parentId\": \"plugins\",\n \"order\": 50\n },\n \"codeName\": \"ai-search-plugin\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { AISearchService } from './services/ai-search'\nimport { IndexManager } from './services/indexer'\nimport adminRoutes from './routes/admin'\nimport apiRoutes from './routes/api'\nimport manifest from './manifest.json'\n\n/**\n * AI Search Plugin\n * \n * Provides advanced search capabilities using Cloudflare AI Search.\n * Features:\n * - Semantic/AI-powered search with natural language queries\n * - Traditional keyword search\n * - Full-text search across all content collections\n * - Advanced filtering (collections, dates, status, tags)\n * - Autocomplete suggestions\n * - Search analytics\n * - Dynamic collection discovery and indexing\n * \n * @example\n * ```typescript\n * import { AISearchService } from '@sonicjs-cms/core/plugins'\n * \n * const service = new AISearchService(db, aiSearch)\n * const results = await service.search({\n * query: 'blog posts about security',\n * mode: 'ai',\n * filters: { collections: [1, 2] }\n * })\n * ```\n */\n\nexport const aiSearchPlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('aiSearch', AISearchService)\n .addService('indexManager', IndexManager)\n .addRoute('/admin/plugins/ai-search', adminRoutes as any)\n .addRoute('/api/search', apiRoutes as any)\n .build()\n\n// Export services and types for easy import\nexport { AISearchService } from './services/ai-search'\nexport { IndexManager } from './services/indexer'\nexport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n IndexStatus,\n} from './types'\n","/**\n * Magic Link Authentication Plugin\n *\n * Provides passwordless authentication via email magic links\n * Users receive a secure one-time link to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\nimport type { Plugin, PluginContext } from '../../types'\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { AuthManager, getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst magicLinkRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nexport function createMagicLinkAuthPlugin(): Plugin {\n const magicLinkRoutes = new Hono()\n\n // Request a magic link\n magicLinkRoutes.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = magicLinkRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB as D1Database\n\n // Check rate limiting\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n const recentLinks = await db.prepare(`\n SELECT COUNT(*) as count\n FROM magic_links\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as any\n\n const rateLimitPerHour = 5 // TODO: Get from plugin settings\n if (recentLinks && recentLinks.count >= rateLimitPerHour) {\n return c.json({\n error: 'Too many requests. Please try again later.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && !allowNewUsers) {\n // Don't reveal if user exists or not for security\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.'\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Generate secure token\n const token = crypto.randomUUID() + '-' + crypto.randomUUID()\n const tokenId = crypto.randomUUID()\n const linkExpiryMinutes = 15 // TODO: Get from plugin settings\n const expiresAt = Date.now() + (linkExpiryMinutes * 60 * 1000)\n\n // Store magic link\n await db.prepare(`\n INSERT INTO magic_links (\n id, user_email, token, expires_at, used, created_at, ip_address, user_agent\n ) VALUES (?, ?, ?, ?, 0, ?, ?, ?)\n `).bind(\n tokenId,\n normalizedEmail,\n token,\n expiresAt,\n Date.now(),\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown',\n c.req.header('user-agent') || 'unknown'\n ).run()\n\n // Generate magic link URL\n const baseUrl = new URL(c.req.url).origin\n const magicLink = `${baseUrl}/auth/magic-link/verify?token=${token}`\n\n // Send email via email plugin\n try {\n const emailPlugin = c.env.plugins?.get('email')\n if (emailPlugin && emailPlugin.sendEmail) {\n await emailPlugin.sendEmail({\n to: normalizedEmail,\n subject: 'Your Magic Link to Sign In',\n html: renderMagicLinkEmail(magicLink, linkExpiryMinutes)\n })\n } else {\n console.error('Email plugin not available')\n // In production, this should fail. For now, log the link for testing\n console.log(`Magic link for ${normalizedEmail}: ${magicLink}`)\n }\n } catch (error) {\n console.error('Failed to send magic link email:', error)\n return c.json({\n error: 'Failed to send email. Please try again later.'\n }, 500)\n }\n\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.',\n // For development only - remove in production\n ...(c.env.ENVIRONMENT === 'development' && { dev_link: magicLink })\n })\n } catch (error) {\n console.error('Magic link request error:', error)\n return c.json({ error: 'Failed to process request' }, 500)\n }\n })\n\n // Verify magic link and sign in\n magicLinkRoutes.get('/verify', async (c: any) => {\n try {\n const token = c.req.query('token')\n\n if (!token) {\n return c.redirect('/auth/login?error=Invalid magic link')\n }\n\n const db = c.env.DB as D1Database\n\n // Find magic link\n const magicLink = await db.prepare(`\n SELECT * FROM magic_links\n WHERE token = ? AND used = 0\n `).bind(token).first() as any\n\n if (!magicLink) {\n return c.redirect('/auth/login?error=Invalid or expired magic link')\n }\n\n // Check expiration\n if (magicLink.expires_at < Date.now()) {\n return c.redirect('/auth/login?error=This magic link has expired')\n }\n\n // Get or create user\n let user = await db.prepare(`\n SELECT * FROM users WHERE email = ? AND is_active = 1\n `).bind(magicLink.user_email).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && allowNewUsers) {\n // Create new user\n const userId = crypto.randomUUID()\n const username = magicLink.user_email.split('@')[0]\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 1, ?, ?)\n `).bind(\n userId,\n magicLink.user_email,\n username,\n username,\n '',\n now,\n now\n ).run()\n\n user = {\n id: userId,\n email: magicLink.user_email,\n username,\n role: 'viewer'\n }\n } else if (!user) {\n return c.redirect('/auth/login?error=No account found for this email')\n }\n\n // Mark magic link as used\n await db.prepare(`\n UPDATE magic_links\n SET used = 1, used_at = ?\n WHERE id = ?\n `).bind(Date.now(), magicLink.id).run()\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwtToken = await AuthManager.generateToken(\n user.id,\n user.email,\n user.role,\n (c.env as any).JWT_SECRET,\n tokenTtl\n )\n\n // Set auth cookie\n AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl })\n\n // Update last login\n await db.prepare(`\n UPDATE users SET last_login_at = ? WHERE id = ?\n `).bind(Date.now(), user.id).run()\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?message=Successfully signed in')\n } catch (error) {\n console.error('Magic link verification error:', error)\n return c.redirect('/auth/login?error=Authentication failed')\n }\n })\n\n return {\n name: 'magic-link-auth',\n version: '1.0.0',\n description: 'Passwordless authentication via email magic links',\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n dependencies: ['email'],\n\n routes: [{\n path: '/auth/magic-link',\n handler: magicLinkRoutes,\n description: 'Magic link authentication endpoints',\n requiresAuth: false\n }],\n\n async install(context: PluginContext) {\n console.log('Installing magic-link-auth plugin...')\n // Migration is handled by plugin system\n },\n\n async activate(context: PluginContext) {\n console.log('Magic link authentication activated')\n console.log('Users can now sign in via /auth/magic-link/request')\n },\n\n async deactivate(context: PluginContext) {\n console.log('Magic link authentication deactivated')\n },\n\n async uninstall(context: PluginContext) {\n console.log('Uninstalling magic-link-auth plugin...')\n // Optionally clean up magic_links table\n // await context.db.prepare('DROP TABLE IF EXISTS magic_links').run()\n }\n }\n}\n\n/**\n * Render magic link email template\n */\nfunction renderMagicLinkEmail(magicLink: string, expiryMinutes: number): string {\n return `\n \n \n \n \n \n Your Magic Link\n \n \n \n
\n
\n

🔗 Your Magic Link

\n
\n\n
\n

Hello!

\n

You requested a magic link to sign in to your account. Click the button below to continue:

\n\n
\n Sign In\n
\n\n

⏰ This link expires in ${expiryMinutes} minutes

\n\n
\n Security Notice: If you didn't request this link, you can safely ignore this email.\n Someone may have entered your email address by mistake.\n
\n
\n\n
\n

This is an automated email from SonicJS.

\n

For security, this link can only be used once.

\n
\n
\n \n \n `\n}\n\nexport default createMagicLinkAuthPlugin()\n","export type SecurityEventType =\n | 'login_success'\n | 'login_failure'\n | 'registration'\n | 'password_reset_request'\n | 'password_reset_complete'\n | 'account_lockout'\n | 'suspicious_activity'\n | 'logout'\n | 'permission_denied'\n\nexport type SecuritySeverity = 'info' | 'warning' | 'critical'\n\nexport interface SecurityEvent {\n id: string\n eventType: SecurityEventType\n severity: SecuritySeverity\n userId?: string | null\n email?: string | null\n ipAddress?: string | null\n userAgent?: string | null\n countryCode?: string | null\n requestPath?: string | null\n requestMethod?: string | null\n details?: Record | null\n fingerprint?: string | null\n blocked: boolean\n createdAt: number\n}\n\nexport interface SecurityEventInsert {\n eventType: SecurityEventType\n severity?: SecuritySeverity\n userId?: string\n email?: string\n ipAddress?: string\n userAgent?: string\n countryCode?: string\n requestPath?: string\n requestMethod?: string\n details?: Record\n fingerprint?: string\n blocked?: boolean\n}\n\nexport interface SecurityEventFilters {\n eventType?: SecurityEventType | SecurityEventType[]\n severity?: SecuritySeverity | SecuritySeverity[]\n email?: string\n ipAddress?: string\n search?: string\n startDate?: number\n endDate?: number\n blocked?: boolean\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'event_type' | 'severity'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SecurityStats {\n totalEvents: number\n failedLogins24h: number\n failedLoginsTrend: number // percentage change vs prior 24h\n activeLockouts: number\n flaggedIPs: number\n eventsByType: Record\n eventsBySeverity: Record\n}\n\nexport interface TopIP {\n ipAddress: string\n countryCode: string | null\n failedAttempts: number\n lastSeen: number\n locked: boolean\n}\n\nexport interface HourlyBucket {\n hour: string\n count: number\n}\n\nexport interface SecurityAuditSettings {\n retention: {\n daysToKeep: number\n maxEvents: number\n autoPurge: boolean\n }\n bruteForce: {\n enabled: boolean\n maxFailedAttemptsPerIP: number\n maxFailedAttemptsPerEmail: number\n windowMinutes: number\n lockoutDurationMinutes: number\n alertThreshold: number\n }\n logging: {\n logSuccessfulLogins: boolean\n logLogouts: boolean\n logRegistrations: boolean\n logPasswordResets: boolean\n logPermissionDenied: boolean\n }\n}\n\nexport const DEFAULT_SETTINGS: SecurityAuditSettings = {\n retention: {\n daysToKeep: 90,\n maxEvents: 100000,\n autoPurge: true\n },\n bruteForce: {\n enabled: true,\n maxFailedAttemptsPerIP: 10,\n maxFailedAttemptsPerEmail: 5,\n windowMinutes: 15,\n lockoutDurationMinutes: 30,\n alertThreshold: 20\n },\n logging: {\n logSuccessfulLogins: true,\n logLogouts: true,\n logRegistrations: true,\n logPasswordResets: true,\n logPermissionDenied: true\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n SecurityEvent,\n SecurityEventInsert,\n SecurityEventFilters,\n SecurityStats,\n TopIP,\n HourlyBucket,\n SecurityAuditSettings\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nexport class SecurityAuditService {\n constructor(\n private db: D1Database,\n private settings: SecurityAuditSettings = DEFAULT_SETTINGS\n ) {}\n\n async logEvent(event: SecurityEventInsert): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO security_events (id, event_type, severity, user_id, email, ip_address, user_agent, country_code, request_path, request_method, details, fingerprint, blocked, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n event.eventType,\n event.severity || 'info',\n event.userId || null,\n event.email || null,\n event.ipAddress || null,\n event.userAgent || null,\n event.countryCode || null,\n event.requestPath || null,\n event.requestMethod || null,\n event.details ? JSON.stringify(event.details) : null,\n event.fingerprint || null,\n event.blocked ? 1 : 0,\n now\n ).run()\n\n return id\n }\n\n async getEvents(filters: SecurityEventFilters = {}): Promise<{ events: SecurityEvent[], total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.eventType) {\n if (Array.isArray(filters.eventType)) {\n conditions.push(`event_type IN (${filters.eventType.map(() => '?').join(',')})`)\n params.push(...filters.eventType)\n } else {\n conditions.push('event_type = ?')\n params.push(filters.eventType)\n }\n }\n\n if (filters.severity) {\n if (Array.isArray(filters.severity)) {\n conditions.push(`severity IN (${filters.severity.map(() => '?').join(',')})`)\n params.push(...filters.severity)\n } else {\n conditions.push('severity = ?')\n params.push(filters.severity)\n }\n }\n\n if (filters.email) {\n conditions.push('email LIKE ?')\n params.push(`%${filters.email}%`)\n }\n\n if (filters.ipAddress) {\n conditions.push('ip_address LIKE ?')\n params.push(`%${filters.ipAddress}%`)\n }\n\n if (filters.search) {\n conditions.push('(email LIKE ? OR ip_address LIKE ? OR details LIKE ?)')\n params.push(`%${filters.search}%`, `%${filters.search}%`, `%${filters.search}%`)\n }\n\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n if (filters.blocked !== undefined) {\n conditions.push('blocked = ?')\n params.push(filters.blocked ? 1 : 0)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const page = filters.page || 1\n const limit = filters.limit || 50\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM security_events ${where}`\n ).bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get page of results\n const results = await this.db.prepare(\n `SELECT * FROM security_events ${where} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...params, limit, offset).all()\n\n const events: SecurityEvent[] = (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n\n return { events, total }\n }\n\n async getEvent(id: string): Promise {\n const row = await this.db.prepare(\n 'SELECT * FROM security_events WHERE id = ?'\n ).bind(id).first()\n\n if (!row) return null\n\n return {\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }\n }\n\n async getStats(): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n const h48 = now - 48 * 60 * 60 * 1000\n\n // Total events\n const totalResult = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM security_events'\n ).first<{ count: number }>()\n\n // Failed logins last 24h\n const failed24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ?\"\n ).bind(h24).first<{ count: number }>()\n\n // Failed logins prior 24h (for trend)\n const failedPrior24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ? AND created_at < ?\"\n ).bind(h48, h24).first<{ count: number }>()\n\n const failed24h = failed24hResult?.count || 0\n const failedPrior24h = failedPrior24hResult?.count || 0\n const trend = failedPrior24h > 0\n ? Math.round(((failed24h - failedPrior24h) / failedPrior24h) * 100)\n : (failed24h > 0 ? 100 : 0)\n\n // Active lockouts (events in last lockout window)\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutsResult = await this.db.prepare(\n \"SELECT COUNT(DISTINCT ip_address) as count FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).first<{ count: number }>()\n\n // Flagged IPs (IPs with more than threshold failed attempts in window)\n const windowStart = now - (this.settings.bruteForce.windowMinutes * 60 * 1000)\n const flaggedResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM (\n SELECT ip_address FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address HAVING COUNT(*) >= ?\n )`\n ).bind(windowStart, this.settings.bruteForce.maxFailedAttemptsPerIP).first<{ count: number }>()\n\n // Events by type\n const typeResults = await this.db.prepare(\n 'SELECT event_type, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY event_type'\n ).bind(h24).all()\n\n const eventsByType: Record = {}\n for (const row of (typeResults.results || []) as any[]) {\n eventsByType[row.event_type] = row.count\n }\n\n // Events by severity\n const severityResults = await this.db.prepare(\n 'SELECT severity, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY severity'\n ).bind(h24).all()\n\n const eventsBySeverity: Record = {}\n for (const row of (severityResults.results || []) as any[]) {\n eventsBySeverity[row.severity] = row.count\n }\n\n return {\n totalEvents: totalResult?.count || 0,\n failedLogins24h: failed24h,\n failedLoginsTrend: trend,\n activeLockouts: lockoutsResult?.count || 0,\n flaggedIPs: flaggedResult?.count || 0,\n eventsByType,\n eventsBySeverity\n }\n }\n\n async getTopIPs(limit: number = 10): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n\n const results = await this.db.prepare(`\n SELECT\n ip_address,\n country_code,\n COUNT(*) as failed_attempts,\n MAX(created_at) as last_seen\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address\n ORDER BY failed_attempts DESC\n LIMIT ?\n `).bind(h24, limit).all()\n\n // Check which IPs are locked\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutResults = await this.db.prepare(\n \"SELECT DISTINCT ip_address FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).all()\n\n const lockedIPs = new Set((lockoutResults.results || []).map((r: any) => r.ip_address))\n\n return (results.results || []).map((row: any) => ({\n ipAddress: row.ip_address,\n countryCode: row.country_code,\n failedAttempts: row.failed_attempts,\n lastSeen: row.last_seen,\n locked: lockedIPs.has(row.ip_address)\n }))\n }\n\n async getHourlyTrend(hours: number = 24): Promise {\n const now = Date.now()\n const start = now - hours * 60 * 60 * 1000\n\n // Build hourly buckets\n const buckets: HourlyBucket[] = []\n for (let i = 0; i < hours; i++) {\n const bucketStart = start + i * 60 * 60 * 1000\n const date = new Date(bucketStart)\n buckets.push({\n hour: `${date.getUTCHours().toString().padStart(2, '0')}:00`,\n count: 0\n })\n }\n\n const results = await this.db.prepare(`\n SELECT\n CAST((created_at - ?) / 3600000 AS INTEGER) as bucket,\n COUNT(*) as count\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY bucket\n ORDER BY bucket\n `).bind(start, start).all()\n\n for (const row of (results.results || []) as any[]) {\n const idx = row.bucket\n if (idx >= 0 && idx < buckets.length) {\n buckets[idx]!.count = row.count\n }\n }\n\n return buckets\n }\n\n async purgeOldEvents(daysToKeep?: number): Promise {\n const days = daysToKeep || this.settings.retention.daysToKeep\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000\n\n const result = await this.db.prepare(\n 'DELETE FROM security_events WHERE created_at < ?'\n ).bind(cutoff).run()\n\n return (result.meta as any)?.changes || 0\n }\n\n async getRecentCriticalEvents(limit: number = 20): Promise {\n const results = await this.db.prepare(\n \"SELECT * FROM security_events WHERE severity = 'critical' ORDER BY created_at DESC LIMIT ?\"\n ).bind(limit).all()\n\n return (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n }\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityStats, TopIP, HourlyBucket, SecurityEvent } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecurityDashboardData {\n stats: SecurityStats\n topIPs: TopIP[]\n hourlyTrend: HourlyBucket[]\n recentCritical: SecurityEvent[]\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n const now = Date.now()\n const diff = now - ts\n\n if (diff < 60000) return 'just now'\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n return labels[type] || type\n}\n\nfunction trendArrow(trend: number): string {\n if (trend > 0) return `+${trend}%`\n if (trend < 0) return `${trend}%`\n return `0%`\n}\n\nfunction renderBarChart(data: HourlyBucket[]): string {\n if (data.length === 0) return '

No data available

'\n\n const max = Math.max(...data.map(d => d.count), 1)\n\n const bars = data.map(d => {\n const height = Math.max((d.count / max) * 100, 2)\n const color = d.count === 0\n ? 'bg-zinc-200 dark:bg-zinc-700'\n : d.count >= max * 0.75\n ? 'bg-red-500'\n : d.count >= max * 0.5\n ? 'bg-amber-500'\n : 'bg-cyan-500'\n return `\n
\n
\n \n
\n
\n 12 ? 'hidden sm:block' : ''}\">${d.hour}\n
\n `\n }).join('')\n\n return `
${bars}
`\n}\n\nexport function renderSecurityDashboard(data: SecurityDashboardData): string {\n const { stats, topIPs, hourlyTrend, recentCritical, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Dashboard

\n

\n Monitor login attempts, brute-force detection, and security events.\n

\n
\n \n
\n\n \n
\n
\n

Total Events

\n

${stats.totalEvents.toLocaleString()}

\n
\n
\n

Failed Logins (24h)

\n

\n ${stats.failedLogins24h}\n ${trendArrow(stats.failedLoginsTrend)}\n

\n
\n
\n

Active Lockouts

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${stats.activeLockouts}

\n
\n
\n

Flagged IPs

\n

0 ? 'text-amber-600 dark:text-amber-400' : 'text-zinc-950 dark:text-white'}\">${stats.flaggedIPs}

\n
\n
\n\n \n
\n \n
\n

Failed Login Attempts (24h)

\n ${renderBarChart(hourlyTrend)}\n
\n\n \n
\n

Events by Type (24h)

\n
\n ${Object.entries(stats.eventsByType).length === 0\n ? '

No events in the last 24 hours

'\n : Object.entries(stats.eventsByType)\n .sort(([, a], [, b]) => b - a)\n .map(([type, count]) => {\n const total = Object.values(stats.eventsByType).reduce((s, v) => s + v, 0)\n const pct = total > 0 ? Math.round((count / total) * 100) : 0\n return `\n
\n
\n ${eventTypeBadge(type)}\n ${count}\n
\n
\n
\n
\n
\n `\n }).join('')\n }\n
\n
\n
\n\n \n
\n \n
\n
\n

Top IPs by Failed Logins (24h)

\n
\n ${topIPs.length === 0\n ? '

No failed login attempts

'\n : `\n \n \n \n \n \n \n \n \n \n ${topIPs.map(ip => `\n \n \n \n \n \n \n `).join('')}\n \n
IP AddressCountryAttemptsStatus
${ip.ipAddress}${ip.countryCode || '-'}= 10 ? 'text-red-600 dark:text-red-400' : 'text-zinc-900 dark:text-zinc-100'}\">${ip.failedAttempts}\n ${ip.locked\n ? 'Locked'\n : 'Active'\n }\n
`\n }\n
\n\n \n
\n
\n

Recent Critical Events

\n
\n ${recentCritical.length === 0\n ? '

No critical events

'\n : `
\n ${recentCritical.slice(0, 10).map(event => `\n
\n
\n
\n ${severityBadge(event.severity)}\n ${eventTypeBadge(event.eventType)}\n
\n ${formatTimestamp(event.createdAt)}\n
\n
\n ${event.ipAddress ? `IP: ${event.ipAddress}` : ''}\n ${event.email ? ` | ${event.email}` : ''}\n
\n
\n `).join('')}\n
`\n }\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Dashboard',\n pageTitle: 'Security Dashboard',\n currentPath: '/admin/plugins/security-audit',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityEvent, SecurityEventFilters } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface EventLogPageData {\n events: SecurityEvent[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n }\n filters: SecurityEventFilters\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const colors: Record = {\n login_success: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400',\n login_failure: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n registration: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n account_lockout: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n suspicious_activity: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\n logout: 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400',\n password_reset_request: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n permission_denied: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400'\n }\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n const color = colors[type] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400'\n return `${labels[type] || type}`\n}\n\nfunction buildFilterUrl(filters: SecurityEventFilters, overrides: Record = {}): string {\n const params = new URLSearchParams()\n if (filters.eventType && !overrides.type) params.set('type', String(filters.eventType))\n if (filters.severity && !overrides.severity) params.set('severity', String(filters.severity))\n if (filters.email && !overrides.email) params.set('email', filters.email)\n if (filters.ipAddress && !overrides.ip) params.set('ip', filters.ipAddress)\n if (filters.search && !overrides.search) params.set('search', filters.search)\n\n for (const [key, value] of Object.entries(overrides)) {\n if (value) params.set(key, value)\n }\n\n const qs = params.toString()\n return `/admin/plugins/security-audit/events${qs ? '?' + qs : ''}`\n}\n\nexport function renderEventLogPage(data: EventLogPageData): string {\n const { events, pagination, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Event Log

\n

\n Browse and filter all security events. Showing ${pagination.startItem}-${pagination.endItem} of ${pagination.totalItems}.\n

\n
\n \n
\n\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n Clear\n \n
\n
\n
\n\n \n
\n ${events.length === 0\n ? `
\n \n \n \n

No events found

\n

No security events match your current filters.

\n
`\n : `
\n \n \n \n \n \n \n \n \n \n \n \n \n \n ${events.map(event => `\n \n \n \n \n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimeTypeSeverityEmailIP AddressCountryStatus
${formatTimestamp(event.createdAt)}${eventTypeBadge(event.eventType)}${severityBadge(event.severity)}${event.email || '-'}${event.ipAddress || '-'}${event.countryCode || '-'}\n ${event.blocked\n ? 'Blocked'\n : 'Allowed'\n }\n
\n
\n
Event ID: ${event.id.substring(0, 8)}...
\n
User Agent: ${event.userAgent || '-'}
\n
Path: ${event.requestPath || '-'}
\n
Fingerprint: ${event.fingerprint || '-'}
\n ${event.details ? `
Details:
${JSON.stringify(event.details, null, 2)}
` : ''}\n
\n
\n
`\n }\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n Page ${pagination.currentPage} of ${pagination.totalPages}\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : ''}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : ''}\n
\n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Event Log',\n pageTitle: 'Security Event Log',\n currentPath: '/admin/plugins/security-audit/events',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityAuditSettings } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecuritySettingsPageData {\n settings: SecurityAuditSettings\n user?: BaseUser\n version?: string\n message?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSecuritySettingsPage(data: SecuritySettingsPageData): string {\n const { settings, user, version, message, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Audit Settings

\n

\n Configure brute-force detection thresholds, event logging, and data retention.\n

\n
\n \n
\n\n ${message ? `\n
\n

${message}

\n
\n ` : ''}\n\n
\n\n \n
\n

Brute-Force Detection

\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n

Events above this count trigger critical severity

\n
\n
\n
\n\n \n
\n

Event Logging

\n
\n \n \n \n \n \n
\n
\n\n \n
\n

Data Retention

\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n\n \n
\n \n \n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Audit Settings',\n pageTitle: 'Security Audit Settings',\n currentPath: '/admin/plugins/security-audit/settings',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { PluginService } from '../../../../services'\nimport { renderSecurityDashboard, SecurityDashboardData } from '../components/dashboard-page'\nimport { renderEventLogPage, EventLogPageData } from '../components/event-log-page'\nimport { renderSecuritySettingsPage, SecuritySettingsPageData } from '../components/settings-page'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const [stats, topIPs, hourlyTrend, recentCritical] = await Promise.all([\n service.getStats(),\n service.getTopIPs(10),\n service.getHourlyTrend(24),\n service.getRecentCriticalEvents(20)\n ])\n\n const pageData: SecurityDashboardData = {\n stats,\n topIPs,\n hourlyTrend,\n recentCritical,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecurityDashboard(pageData))\n})\n\n// Event log\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n\n const filters = {\n eventType: (c.req.query('type') as SecurityEventType) || undefined,\n severity: (c.req.query('severity') as SecuritySeverity) || undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n page,\n limit\n }\n\n const { events, total } = await service.getEvents(filters)\n const totalPages = Math.ceil(total / limit)\n\n const pageData: EventLogPageData = {\n events,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: total === 0 ? 0 : (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total)\n },\n filters,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderEventLogPage(pageData))\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const pageData: SecuritySettingsPageData = {\n settings,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n message: c.req.query('message') || undefined,\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecuritySettingsPage(pageData))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const settings: SecurityAuditSettings = {\n bruteForce: {\n enabled: body['bruteForce.enabled'] === 'true',\n maxFailedAttemptsPerIP: parseInt(body['bruteForce.maxFailedAttemptsPerIP'] as string) || 10,\n maxFailedAttemptsPerEmail: parseInt(body['bruteForce.maxFailedAttemptsPerEmail'] as string) || 5,\n windowMinutes: parseInt(body['bruteForce.windowMinutes'] as string) || 15,\n lockoutDurationMinutes: parseInt(body['bruteForce.lockoutDurationMinutes'] as string) || 30,\n alertThreshold: parseInt(body['bruteForce.alertThreshold'] as string) || 20\n },\n logging: {\n logSuccessfulLogins: body['logging.logSuccessfulLogins'] === 'true',\n logLogouts: body['logging.logLogouts'] === 'true',\n logRegistrations: body['logging.logRegistrations'] === 'true',\n logPasswordResets: body['logging.logPasswordResets'] === 'true',\n logPermissionDenied: body['logging.logPermissionDenied'] === 'true'\n },\n retention: {\n daysToKeep: parseInt(body['retention.daysToKeep'] as string) || 90,\n maxEvents: parseInt(body['retention.maxEvents'] as string) || 100000,\n autoPurge: body['retention.autoPurge'] === 'true'\n }\n }\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings('security-audit', settings)\n\n // For HTMX requests, return 200\n if (c.req.header('HX-Request')) {\n return c.json({ success: true })\n }\n\n return c.redirect('/admin/plugins/security-audit/settings?message=Settings saved successfully')\n})\n\nexport { adminRoutes as securityAuditAdminRoutes }\n","import type { KVNamespace } from '@cloudflare/workers-types'\nimport type { SecurityAuditSettings } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst KV_PREFIX = 'security:bf:'\nconst LOCK_PREFIX = 'security:locked:'\n\nexport class BruteForceDetector {\n private settings: SecurityAuditSettings['bruteForce']\n\n constructor(\n private kv: KVNamespace,\n settings?: SecurityAuditSettings['bruteForce']\n ) {\n this.settings = settings || DEFAULT_SETTINGS.bruteForce\n }\n\n async recordFailedAttempt(ip: string, email: string): Promise<{\n ipCount: number\n emailCount: number\n shouldLockIP: boolean\n shouldLockEmail: boolean\n isSuspicious: boolean\n }> {\n if (!this.settings.enabled || !this.kv) {\n return { ipCount: 0, emailCount: 0, shouldLockIP: false, shouldLockEmail: false, isSuspicious: false }\n }\n\n const now = Date.now()\n const windowMs = this.settings.windowMinutes * 60 * 1000\n\n // Increment IP counter\n const ipKey = `${KV_PREFIX}ip:${ip}`\n const ipCount = await this.incrementCounter(ipKey, windowMs)\n\n // Increment email counter\n const emailKey = `${KV_PREFIX}email:${email}`\n const emailCount = await this.incrementCounter(emailKey, windowMs)\n\n // Check for multi-email from single IP (suspicious)\n const ipEmailsKey = `${KV_PREFIX}ip-emails:${ip}`\n await this.addToSet(ipEmailsKey, email, windowMs)\n const emailsFromIP = await this.getSetSize(ipEmailsKey)\n const isSuspicious = emailsFromIP >= 5\n\n const shouldLockIP = ipCount >= this.settings.maxFailedAttemptsPerIP\n const shouldLockEmail = emailCount >= this.settings.maxFailedAttemptsPerEmail\n\n return { ipCount, emailCount, shouldLockIP, shouldLockEmail, isSuspicious }\n }\n\n async isLocked(ip: string, email: string): Promise<{ locked: boolean, reason?: string }> {\n if (!this.settings.enabled || !this.kv) {\n return { locked: false }\n }\n\n const ipLocked = await this.kv.get(`${LOCK_PREFIX}ip:${ip}`)\n if (ipLocked) {\n return { locked: true, reason: 'IP address temporarily locked due to excessive failed login attempts' }\n }\n\n const emailLocked = await this.kv.get(`${LOCK_PREFIX}email:${email}`)\n if (emailLocked) {\n return { locked: true, reason: 'Account temporarily locked due to excessive failed login attempts' }\n }\n\n return { locked: false }\n }\n\n async lockIP(ip: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}ip:${ip}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_ip'\n }), { expirationTtl: ttl })\n }\n\n async lockEmail(email: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}email:${email}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_email'\n }), { expirationTtl: ttl })\n }\n\n async unlockIP(ip: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}ip:${ip}`)\n }\n\n async unlockEmail(email: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}email:${email}`)\n }\n\n async getActiveLockouts(): Promise> {\n if (!this.kv) return []\n // KV list with prefix to find all active lockouts\n const ipLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}ip:` })\n const emailLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}email:` })\n\n const lockouts: Array<{ key: string, type: 'ip' | 'email', value: string, lockedAt: number }> = []\n\n for (const key of ipLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'ip',\n value: key.name.replace(`${LOCK_PREFIX}ip:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n for (const key of emailLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'email',\n value: key.name.replace(`${LOCK_PREFIX}email:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n return lockouts\n }\n\n async releaseLockout(key: string): Promise {\n if (!this.kv) return\n await this.kv.delete(key)\n }\n\n isAboveAlertThreshold(count: number): boolean {\n return count >= this.settings.alertThreshold\n }\n\n private async incrementCounter(key: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n const now = Date.now()\n\n let entries: number[] = []\n if (existing) {\n try {\n entries = JSON.parse(existing)\n } catch {\n entries = []\n }\n }\n\n // Remove expired entries\n const cutoff = now - windowMs\n entries = entries.filter(ts => ts > cutoff)\n\n // Add new entry\n entries.push(now)\n\n // Store with TTL equal to window\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(entries), { expirationTtl: ttlSeconds })\n\n return entries.length\n }\n\n private async addToSet(key: string, value: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n let set: Record = {}\n const now = Date.now()\n const cutoff = now - windowMs\n\n if (existing) {\n try {\n set = JSON.parse(existing)\n } catch {\n set = {}\n }\n }\n\n // Remove expired entries\n for (const [k, ts] of Object.entries(set)) {\n if (ts < cutoff) delete set[k]\n }\n\n set[value] = now\n\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(set), { expirationTtl: ttlSeconds })\n }\n\n private async getSetSize(key: string): Promise {\n const existing = await this.kv.get(key)\n if (!existing) return 0\n\n try {\n const set = JSON.parse(existing)\n return Object.keys(set).length\n } catch {\n return 0\n }\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventFilters, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\napiRoutes.use('*', requireAuth())\n\n// Check admin role\napiRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// GET /api/security-audit/events\napiRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? Math.min(parseInt(c.req.query('limit')!), 100) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await service.getEvents(filters)\n return c.json(result)\n})\n\n// GET /api/security-audit/events/:id\napiRoutes.get('/events/:id', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const event = await service.getEvent(c.req.param('id'))\n\n if (!event) {\n return c.json({ error: 'Event not found' }, 404)\n }\n\n return c.json(event)\n})\n\n// GET /api/security-audit/stats\napiRoutes.get('/stats', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const stats = await service.getStats()\n return c.json(stats)\n})\n\n// GET /api/security-audit/stats/ips\napiRoutes.get('/stats/ips', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const limit = c.req.query('limit') ? parseInt(c.req.query('limit')!) : 10\n const ips = await service.getTopIPs(limit)\n return c.json(ips)\n})\n\n// GET /api/security-audit/stats/trend\napiRoutes.get('/stats/trend', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const hours = c.req.query('hours') ? parseInt(c.req.query('hours')!) : 24\n const trend = await service.getHourlyTrend(hours)\n return c.json(trend)\n})\n\n// GET /api/security-audit/lockouts\napiRoutes.get('/lockouts', async (c) => {\n const kv = c.env.CACHE_KV\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n const lockouts = await detector.getActiveLockouts()\n return c.json(lockouts)\n})\n\n// DELETE /api/security-audit/lockouts/:key\napiRoutes.delete('/lockouts/:key', async (c) => {\n const kv = c.env.CACHE_KV\n const key = decodeURIComponent(c.req.param('key'))\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n await detector.releaseLockout(key)\n return c.json({ success: true })\n})\n\n// POST /api/security-audit/events/purge\napiRoutes.post('/events/purge', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const body = await c.req.json().catch(() => ({})) as { daysToKeep?: number }\n const deleted = await service.purgeOldEvents(body.daysToKeep)\n return c.json({ success: true, deleted })\n})\n\n// GET /api/security-audit/export\napiRoutes.get('/export', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const format = c.req.query('format') || 'json'\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n limit: 10000,\n page: 1\n }\n\n const { events } = await service.getEvents(filters)\n\n if (format === 'csv') {\n const headers = ['id', 'event_type', 'severity', 'email', 'ip_address', 'country_code', 'blocked', 'created_at']\n const csvRows = [headers.join(',')]\n for (const event of events) {\n csvRows.push([\n event.id,\n event.eventType,\n event.severity,\n event.email || '',\n event.ipAddress || '',\n event.countryCode || '',\n event.blocked ? '1' : '0',\n new Date(event.createdAt).toISOString()\n ].map(v => `\"${String(v).replace(/\"/g, '\"\"')}\"`).join(','))\n }\n\n return new Response(csvRows.join('\\n'), {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"security-events-${Date.now()}.csv\"`\n }\n })\n }\n\n return c.json(events)\n})\n\nexport { apiRoutes as securityAuditApiRoutes }\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../../../../app'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { SecurityAuditSettings, SecurityEventType } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nfunction extractRequestInfo(c: Context<{ Bindings: Bindings; Variables: Variables }>) {\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n const countryCode = c.req.header('cf-ipcountry') || null\n const path = new URL(c.req.url).pathname\n const method = c.req.method\n\n return { ip, userAgent, countryCode, path, method }\n}\n\nfunction generateFingerprint(ip: string, userAgent: string): string {\n // Simple fingerprint from IP + UA - using a basic hash\n const str = `${ip}:${userAgent}`\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash |= 0\n }\n return Math.abs(hash).toString(36)\n}\n\nasync function getPluginSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch {\n // Plugin not installed or DB not ready\n }\n return DEFAULT_SETTINGS\n}\n\nasync function isPluginActive(db: any): Promise {\n try {\n const result = await db.prepare(\n \"SELECT status FROM plugins WHERE id = 'security-audit'\"\n ).first() as { status: string } | null\n return result?.status === 'active'\n } catch {\n return false\n }\n}\n\nexport function securityAuditMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n\n // Only intercept auth-related routes\n if (!path.startsWith('/auth/')) {\n return next()\n }\n\n const db = c.env.DB\n\n // Check if plugin is active\n if (!await isPluginActive(db)) {\n return next()\n }\n\n const settings = await getPluginSettings(db)\n const { ip, userAgent, countryCode, method } = extractRequestInfo(c)\n const fingerprint = generateFingerprint(ip, userAgent)\n\n // For login POST, extract email and check lockout before proceeding\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n let preExtractedEmail = ''\n\n if (isLoginPost) {\n try {\n if (path === '/auth/login/form') {\n // Form-based login: clone request to read formData without consuming it\n const clonedReq = c.req.raw.clone()\n const formData = await clonedReq.formData()\n preExtractedEmail = (formData.get('email') as string || '').toLowerCase()\n } else {\n // JSON login: Hono caches parsed JSON so this is safe\n const body = await c.req.json()\n preExtractedEmail = body?.email?.toLowerCase() || ''\n }\n } catch {\n // Can't parse body, continue\n }\n\n if (preExtractedEmail && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const lockStatus = await detector.isLocked(ip, preExtractedEmail)\n\n if (lockStatus.locked) {\n const service = new SecurityAuditService(db, settings)\n // Log the blocked attempt asynchronously\n const logPromise = service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: preExtractedEmail,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n blocked: true,\n details: { reason: lockStatus.reason }\n })\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n\n return c.json({\n error: lockStatus.reason || 'Too many failed attempts. Please try again later.'\n }, 429)\n }\n }\n }\n\n // Proceed with the request\n await next()\n\n // After response, log the event asynchronously\n const logPromise = logAuthEvent(c, db, settings, ip, userAgent, countryCode, fingerprint, path, method, preExtractedEmail)\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n }\n}\n\nasync function logAuthEvent(\n c: Context<{ Bindings: Bindings; Variables: Variables }>,\n db: any,\n settings: SecurityAuditSettings,\n ip: string,\n userAgent: string,\n countryCode: string | null,\n fingerprint: string,\n path: string,\n method: string,\n preExtractedEmail: string = ''\n): Promise {\n try {\n const service = new SecurityAuditService(db, settings)\n const status = c.res.status\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n const isFormLogin = path === '/auth/login/form'\n\n // Login POST\n if (isLoginPost) {\n // Determine if login succeeded or failed.\n // JSON login: 200 = success, 401/400 = failure\n // Form login: always returns 200 — check if response set an auth cookie (HX-Redirect header indicates success)\n let loginSucceeded: boolean\n if (isFormLogin) {\n // Form login redirects to /admin on success via HX-Redirect header or meta refresh\n const hxRedirect = c.res.headers.get('HX-Redirect')\n const setCookieHeader = c.res.headers.get('set-cookie') || ''\n loginSucceeded = !!(hxRedirect?.includes('/admin') || setCookieHeader.includes('auth_token'))\n } else {\n loginSucceeded = status === 200\n }\n\n if (loginSucceeded) {\n if (!settings.logging.logSuccessfulLogins) return\n\n // Try to get user info from response\n let email = preExtractedEmail\n let userId = ''\n if (!isFormLogin) {\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || email\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n }\n\n await service.logEvent({\n eventType: 'login_success',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n } else {\n // Failed login — use pre-extracted email since body is already consumed\n const email = preExtractedEmail\n\n await service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { statusCode: status }\n })\n\n // Record failed attempt for brute-force detection\n if (email && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const result = await detector.recordFailedAttempt(ip, email)\n\n if (result.shouldLockIP) {\n await detector.lockIP(ip)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_ip', attemptCount: result.ipCount }\n })\n }\n\n if (result.shouldLockEmail) {\n await detector.lockEmail(email)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_email', attemptCount: result.emailCount }\n })\n }\n\n if (result.isSuspicious) {\n await service.logEvent({\n eventType: 'suspicious_activity',\n severity: 'critical',\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'multiple_emails_from_ip', ipCount: result.ipCount }\n })\n }\n }\n }\n }\n\n // Registration POST\n if (path === '/auth/register' && method === 'POST' && settings.logging.logRegistrations) {\n if (status === 201 || status === 200) {\n let email = ''\n let userId = ''\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || ''\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n\n await service.logEvent({\n eventType: 'registration',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n }\n\n // Logout\n if (path === '/auth/logout' && settings.logging.logLogouts) {\n const user = c.get('user')\n await service.logEvent({\n eventType: 'logout',\n severity: 'info',\n userId: user?.userId,\n email: user?.email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n } catch (error) {\n console.error('[SecurityAudit] Error logging auth event:', error)\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { securityAuditAdminRoutes } from './routes/admin'\nimport { securityAuditApiRoutes } from './routes/api'\nimport { securityAuditMiddleware } from './middleware/audit-middleware'\n\nexport function createSecurityAuditPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'security-audit',\n version: '1.0.0-beta.1',\n description: 'Security event logging, brute-force detection, and analytics dashboard'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard and event log routes\n builder.addRoute('/admin/plugins/security-audit', securityAuditAdminRoutes as any, {\n description: 'Security audit dashboard and admin pages',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes\n builder.addRoute('/api/security-audit', securityAuditApiRoutes as any, {\n description: 'Security audit API endpoints',\n requiresAuth: true,\n priority: 50\n })\n\n // Admin menu item — icon is raw SVG to match sidebar rendering\n builder.addMenuItem('Security', '/admin/plugins/security-audit', {\n icon: ``,\n order: 85\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async (context) => {\n console.log('[SecurityAudit] Plugin installed')\n },\n activate: async (context) => {\n console.log('[SecurityAudit] Plugin activated')\n },\n deactivate: async (context) => {\n console.log('[SecurityAudit] Plugin deactivated')\n },\n uninstall: async (context) => {\n console.log('[SecurityAudit] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const securityAuditPlugin = createSecurityAuditPlugin()\nexport { SecurityAuditService } from './services/security-audit-service'\nexport { BruteForceDetector } from './services/brute-force-detector'\nexport { securityAuditMiddleware } from './middleware/audit-middleware'\nexport default securityAuditPlugin\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n Subscription,\n SubscriptionInsert,\n SubscriptionFilters,\n SubscriptionStats,\n SubscriptionStatus\n} from '../types'\n\n/**\n * Manages subscription records in D1\n */\nexport class SubscriptionService {\n constructor(private db: D1Database) {}\n\n /**\n * Ensure the subscriptions table exists\n */\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS subscriptions (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n user_id TEXT NOT NULL,\n stripe_customer_id TEXT NOT NULL,\n stripe_subscription_id TEXT NOT NULL UNIQUE,\n stripe_price_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'incomplete',\n current_period_start INTEGER NOT NULL DEFAULT 0,\n current_period_end INTEGER NOT NULL DEFAULT 0,\n cancel_at_period_end INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\n )\n `).run()\n\n // Indexes for common lookups\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_user_id ON subscriptions(user_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_customer_id ON subscriptions(stripe_customer_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_subscription_id ON subscriptions(stripe_subscription_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_status ON subscriptions(status)\n `).run()\n }\n\n /**\n * Create a new subscription record\n */\n async create(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Upsert a subscription by stripe_subscription_id (INSERT or UPDATE on conflict)\n */\n async upsert(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_subscription_id) DO UPDATE SET\n status = excluded.status,\n stripe_price_id = excluded.stripe_price_id,\n current_period_start = excluded.current_period_start,\n current_period_end = excluded.current_period_end,\n cancel_at_period_end = excluded.cancel_at_period_end,\n updated_at = unixepoch()\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Update a subscription by its Stripe subscription ID\n */\n async updateByStripeId(stripeSubscriptionId: string, data: Partial): Promise {\n const sets: string[] = []\n const values: any[] = []\n\n if (data.status !== undefined) {\n sets.push('status = ?')\n values.push(data.status)\n }\n if (data.stripePriceId !== undefined) {\n sets.push('stripe_price_id = ?')\n values.push(data.stripePriceId)\n }\n if (data.currentPeriodStart !== undefined) {\n sets.push('current_period_start = ?')\n values.push(data.currentPeriodStart)\n }\n if (data.currentPeriodEnd !== undefined) {\n sets.push('current_period_end = ?')\n values.push(data.currentPeriodEnd)\n }\n if (data.cancelAtPeriodEnd !== undefined) {\n sets.push('cancel_at_period_end = ?')\n values.push(data.cancelAtPeriodEnd ? 1 : 0)\n }\n\n if (sets.length === 0) return this.getByStripeSubscriptionId(stripeSubscriptionId)\n\n sets.push('updated_at = unixepoch()')\n values.push(stripeSubscriptionId)\n\n const result = await this.db.prepare(`\n UPDATE subscriptions SET ${sets.join(', ')} WHERE stripe_subscription_id = ? RETURNING *\n `).bind(...values).first()\n\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe subscription ID\n */\n async getByStripeSubscriptionId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get the active subscription for a user\n */\n async getByUserId(userId: string): Promise {\n const result = await this.db.prepare(\n \"SELECT * FROM subscriptions WHERE user_id = ? ORDER BY CASE WHEN status = 'active' THEN 0 WHEN status = 'trialing' THEN 1 ELSE 2 END, updated_at DESC LIMIT 1\"\n ).bind(userId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe customer ID\n */\n async getByStripeCustomerId(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_customer_id = ? ORDER BY updated_at DESC LIMIT 1'\n ).bind(stripeCustomerId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Find the userId linked to a Stripe customer ID\n */\n async getUserIdByStripeCustomer(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT user_id FROM subscriptions WHERE stripe_customer_id = ? LIMIT 1'\n ).bind(stripeCustomerId).first() as { user_id: string } | null\n return result?.user_id ?? null\n }\n\n /**\n * List subscriptions with filters and pagination\n */\n async list(filters: SubscriptionFilters = {}): Promise<{ subscriptions: Subscription[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.userId) {\n where.push('user_id = ?')\n values.push(filters.userId)\n }\n if (filters.stripeCustomerId) {\n where.push('stripe_customer_id = ?')\n values.push(filters.stripeCustomerId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM subscriptions ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n // Get paginated results\n const results = await this.db.prepare(\n `SELECT s.*, u.email as user_email FROM subscriptions s LEFT JOIN users u ON s.user_id = u.id ${whereClause} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n subscriptions: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n /**\n * Get subscription stats\n */\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\n SUM(CASE WHEN status = 'canceled' THEN 1 ELSE 0 END) as canceled,\n SUM(CASE WHEN status = 'past_due' THEN 1 ELSE 0 END) as past_due,\n SUM(CASE WHEN status = 'trialing' THEN 1 ELSE 0 END) as trialing\n FROM subscriptions\n `).first() as any\n\n return {\n total: result?.total || 0,\n active: result?.active || 0,\n canceled: result?.canceled || 0,\n pastDue: result?.past_due || 0,\n trialing: result?.trialing || 0\n }\n }\n\n /**\n * Delete a subscription record by Stripe subscription ID\n */\n async deleteByStripeId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'DELETE FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).run()\n return (result.meta?.changes || 0) > 0\n }\n\n private mapRow(row: Record): Subscription {\n return {\n id: row.id,\n userId: row.user_id,\n stripeCustomerId: row.stripe_customer_id,\n stripeSubscriptionId: row.stripe_subscription_id,\n stripePriceId: row.stripe_price_id,\n status: row.status as SubscriptionStatus,\n currentPeriodStart: row.current_period_start,\n currentPeriodEnd: row.current_period_end,\n cancelAtPeriodEnd: !!row.cancel_at_period_end,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n // Attach email if joined\n ...(row.user_email ? { userEmail: row.user_email } : {})\n } as Subscription\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { StripeEventRecord, StripeEventFilters, StripeEventStats } from '../types'\n\n/**\n * Manages Stripe event log records in D1\n */\nexport class StripeEventService {\n constructor(private db: D1Database) {}\n\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS stripe_events (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n stripe_event_id TEXT NOT NULL UNIQUE,\n type TEXT NOT NULL,\n object_id TEXT NOT NULL DEFAULT '',\n object_type TEXT NOT NULL DEFAULT '',\n data TEXT NOT NULL DEFAULT '{}',\n processed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n status TEXT NOT NULL DEFAULT 'processed',\n error TEXT\n )\n `).run()\n\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_type ON stripe_events(type)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_status ON stripe_events(status)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_processed_at ON stripe_events(processed_at DESC)\n `).run()\n }\n\n async log(event: {\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: Record\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n }): Promise {\n await this.db.prepare(`\n INSERT INTO stripe_events (stripe_event_id, type, object_id, object_type, data, status, error)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_event_id) DO UPDATE SET\n status = excluded.status,\n error = excluded.error,\n processed_at = unixepoch()\n `).bind(\n event.stripeEventId,\n event.type,\n event.objectId,\n event.objectType,\n JSON.stringify(event.data),\n event.status,\n event.error || null\n ).run()\n }\n\n async list(filters: StripeEventFilters = {}): Promise<{ events: StripeEventRecord[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.type) {\n where.push('type = ?')\n values.push(filters.type)\n }\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.objectId) {\n where.push('object_id = ?')\n values.push(filters.objectId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM stripe_events ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n const results = await this.db.prepare(\n `SELECT * FROM stripe_events ${whereClause} ORDER BY processed_at DESC LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n events: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'processed' THEN 1 ELSE 0 END) as processed,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'ignored' THEN 1 ELSE 0 END) as ignored\n FROM stripe_events\n `).first() as any\n\n return {\n total: result?.total || 0,\n processed: result?.processed || 0,\n failed: result?.failed || 0,\n ignored: result?.ignored || 0\n }\n }\n\n async getDistinctTypes(): Promise {\n const results = await this.db.prepare(\n 'SELECT DISTINCT type FROM stripe_events ORDER BY type'\n ).all()\n return (results.results || []).map((r: any) => r.type)\n }\n\n private mapRow(row: Record): StripeEventRecord {\n return {\n id: row.id,\n stripeEventId: row.stripe_event_id,\n type: row.type,\n objectId: row.object_id,\n objectType: row.object_type,\n data: row.data,\n processedAt: row.processed_at,\n status: row.status,\n error: row.error || undefined\n }\n }\n}\n","import type { Subscription, SubscriptionStats, SubscriptionStatus } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface StripePageData {\n subscriptions: (Subscription & { userEmail?: string })[]\n stats: SubscriptionStats\n filters: { status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSubscriptionsPage(data: StripePageData): string {\n const { subscriptions, stats, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Manage subscriptions, view billing status, and monitor payment events.\n

\n
\n
\n \n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe')}\n\n \n
\n ${statsCard('Total', stats.total, 'text-zinc-950 dark:text-white')}\n ${statsCard('Active', stats.active, 'text-emerald-600 dark:text-emerald-400')}\n ${statsCard('Trialing', stats.trialing, 'text-blue-600 dark:text-blue-400')}\n ${statsCard('Past Due', stats.pastDue, 'text-amber-600 dark:text-amber-400')}\n ${statsCard('Canceled', stats.canceled, 'text-red-600 dark:text-red-400')}\n
\n\n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${subscriptions.length === 0\n ? ''\n : subscriptions.map(renderRow).join('')\n }\n \n
UserStatusPrice IDCurrent PeriodCancel at EndStripe
No subscriptions found
\n\n ${renderPagination(filters.page, filters.totalPages, filters.status)}\n
\n\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Subscriptions',\n pageTitle: 'Stripe Subscriptions',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction statsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction statusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.replace('_', ' ').replace(/\\b\\w/g, c => c.toUpperCase())\n return ``\n}\n\nfunction statusBadge(status: SubscriptionStatus): string {\n const colors: Record = {\n active: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n trialing: 'bg-blue-400/10 text-blue-500 dark:text-blue-400 ring-blue-400/20',\n past_due: 'bg-amber-400/10 text-amber-500 dark:text-amber-400 ring-amber-400/20',\n canceled: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n unpaid: 'bg-orange-400/10 text-orange-500 dark:text-orange-400 ring-orange-400/20',\n paused: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete_expired: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n const label = status.replace('_', ' ')\n return `${label}`\n}\n\nfunction formatDate(timestamp: number): string {\n if (!timestamp) return '-'\n return new Date(timestamp * 1000).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })\n}\n\nfunction renderRow(sub: Subscription & { userEmail?: string }): string {\n return `\n \n \n
${sub.userEmail || sub.userId}
\n
${sub.stripeCustomerId}
\n \n ${statusBadge(sub.status)}\n ${sub.stripePriceId}\n \n ${formatDate(sub.currentPeriodStart)} - ${formatDate(sub.currentPeriodEnd)}\n \n \n ${sub.cancelAtPeriodEnd\n ? 'Yes'\n : 'No'\n }\n \n \n \n View in Stripe\n \n \n \n `\n}\n\nfunction renderPagination(page: number, totalPages: number, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params = status ? `&status=${status}` : ''\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","/**\n * Shared tab bar for all Stripe admin pages.\n */\n\nconst TABS = [\n { label: 'Subscriptions', path: '/admin/plugins/stripe' },\n { label: 'Events', path: '/admin/plugins/stripe/events' },\n { label: 'Settings', path: '/admin/plugins/stripe/settings' },\n]\n\nexport function renderStripeTabBar(currentPath: string): string {\n const tabs = TABS.map(tab => {\n const isActive = currentPath === tab.path\n || (tab.path === '/admin/plugins/stripe' && currentPath === '/admin/plugins/stripe/')\n return `\n \n ${tab.label}\n `\n }).join('')\n\n return `\n
\n \n
\n `\n}\n","import type { StripeEventRecord, StripeEventStats } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface EventsPageData {\n events: StripeEventRecord[]\n stats: StripeEventStats\n types: string[]\n filters: { type?: string; status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderEventsPage(data: EventsPageData): string {\n const { events, stats, types, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Webhook event log showing all processed, failed, and ignored Stripe events.\n

\n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/events')}\n\n \n
\n ${eventStatsCard('Total Events', stats.total, 'text-zinc-950 dark:text-white')}\n ${eventStatsCard('Processed', stats.processed, 'text-emerald-600 dark:text-emerald-400')}\n ${eventStatsCard('Failed', stats.failed, 'text-red-600 dark:text-red-400')}\n ${eventStatsCard('Ignored', stats.ignored, 'text-zinc-500 dark:text-zinc-400')}\n
\n\n \n
\n
\n \n \n\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n ${events.length === 0\n ? ''\n : events.map(renderEventRow).join('')\n }\n \n
TimeTypeObject / UserStatusEvent ID
No events recorded yet
\n\n ${renderEventPagination(filters.page, filters.totalPages, filters.type, filters.status)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Events',\n pageTitle: 'Stripe Events',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction eventStatsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction eventStatusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.charAt(0).toUpperCase() + value.slice(1)\n return ``\n}\n\nfunction eventStatusBadge(status: string): string {\n const colors: Record = {\n processed: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n failed: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n ignored: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n return `${status}`\n}\n\nfunction formatTimestamp(timestamp: number): string {\n if (!timestamp) return '-'\n const d = new Date(timestamp * 1000)\n return d.toLocaleString('en-US', {\n month: 'short', day: 'numeric', year: 'numeric',\n hour: '2-digit', minute: '2-digit', second: '2-digit'\n })\n}\n\nfunction extractUserInfo(event: StripeEventRecord): { userId?: string; email?: string } {\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n const userId = data?.metadata?.sonicjs_user_id || data?.sonicjs_user_id\n const email = data?.customer_email || data?.customerEmail || data?.receipt_email\n return { userId: userId || undefined, email: email || undefined }\n } catch {\n return {}\n }\n}\n\nfunction renderEventRow(event: StripeEventRecord): string {\n const errorTooltip = event.error ? ` title=\"${event.error.replace(/\"/g, '"')}\"` : ''\n const userInfo = extractUserInfo(event)\n const userLink = userInfo.userId\n ? `${userInfo.email || userInfo.userId}`\n : userInfo.email\n ? `${userInfo.email}`\n : ''\n\n return `\n \n \n ${formatTimestamp(event.processedAt)}\n \n \n ${event.type}\n \n \n
${event.objectId || '-'}
\n
${event.objectType}
\n ${userLink ? `
${userLink}
` : ''}\n \n ${eventStatusBadge(event.status)}\n ${event.stripeEventId}\n \n `\n}\n\nfunction renderEventPagination(page: number, totalPages: number, type?: string, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params: string[] = []\n if (type) params.push(`type=${type}`)\n if (status) params.push(`status=${status}`)\n const extra = params.length > 0 ? `&${params.join('&')}` : ''\n\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","// ============================================================================\n// Stripe Plugin Types\n// ============================================================================\n\nexport type SubscriptionStatus =\n | 'active'\n | 'canceled'\n | 'past_due'\n | 'trialing'\n | 'unpaid'\n | 'paused'\n | 'incomplete'\n | 'incomplete_expired'\n\nexport interface Subscription {\n id: string\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd: boolean\n createdAt: number\n updatedAt: number\n}\n\nexport interface SubscriptionInsert {\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd?: boolean\n}\n\nexport interface SubscriptionFilters {\n status?: SubscriptionStatus\n userId?: string\n stripeCustomerId?: string\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'updated_at' | 'status'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SubscriptionStats {\n total: number\n active: number\n canceled: number\n pastDue: number\n trialing: number\n}\n\nexport interface StripePluginSettings {\n stripePublishableKey: string\n stripeSecretKey: string\n stripeWebhookSecret: string\n stripePriceId?: string\n successUrl: string\n cancelUrl: string\n}\n\nexport const DEFAULT_SETTINGS: StripePluginSettings = {\n stripePublishableKey: '',\n stripeSecretKey: '',\n stripeWebhookSecret: '',\n stripePriceId: '',\n successUrl: '/admin/dashboard',\n cancelUrl: '/admin/dashboard'\n}\n\n// Stripe webhook event types we handle\nexport type StripeWebhookEventType =\n | 'customer.subscription.created'\n | 'customer.subscription.updated'\n | 'customer.subscription.deleted'\n | 'checkout.session.completed'\n | 'invoice.payment_succeeded'\n | 'invoice.payment_failed'\n\n// Minimal Stripe types (we use fetch, not the SDK)\nexport interface StripeEvent {\n id: string\n type: string\n data: {\n object: Record\n }\n}\n\nexport interface StripeSubscriptionObject {\n id: string\n customer: string\n status: string\n items: {\n data: Array<{\n price: {\n id: string\n }\n }>\n }\n current_period_start: number\n current_period_end: number\n cancel_at_period_end: boolean\n metadata?: Record\n}\n\nexport interface StripeCheckoutSession {\n id: string\n customer: string\n subscription: string\n metadata?: Record\n}\n\nexport interface StripeInvoice {\n id: string\n customer: string\n subscription: string | null\n status: string\n amount_paid: number\n currency: string\n}\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\nexport interface StripeEventRecord {\n id: string\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: string // JSON string\n processedAt: number\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n}\n\nexport interface StripeEventFilters {\n type?: string\n status?: 'processed' | 'failed' | 'ignored'\n objectId?: string\n page?: number\n limit?: number\n}\n\nexport interface StripeEventStats {\n total: number\n processed: number\n failed: number\n ignored: number\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { renderSubscriptionsPage } from '../components/subscriptions-page'\nimport { renderEventsPage } from '../components/events-page'\nimport { renderStripeTabBar } from '../components/tab-bar'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { StripePluginSettings, SubscriptionStatus } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Subscriptions dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const statusFilter = c.req.query('status') as SubscriptionStatus | undefined\n\n const [{ subscriptions, total }, stats] = await Promise.all([\n subscriptionService.list({ status: statusFilter, page, limit }),\n subscriptionService.getStats()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderSubscriptionsPage({\n subscriptions: subscriptions as any,\n stats,\n filters: { status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Events log page\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const typeFilter = c.req.query('type') || undefined\n const statusFilter = c.req.query('status') as 'processed' | 'failed' | 'ignored' | undefined\n\n const [{ events, total }, stats, types] = await Promise.all([\n eventService.list({ type: typeFilter, status: statusFilter, page, limit }),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderEventsPage({\n events,\n stats,\n types,\n filters: { type: typeFilter, status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const { renderAdminLayoutCatalyst } = await import('../../../../templates/layouts/admin-layout-catalyst.template')\n\n const content = `\n
\n
\n

Stripe

\n

\n Configure your Stripe API keys and checkout options.\n

\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/settings')}\n\n
\n\n
\n
\n
\n \n \n

Your Stripe publishable key (starts with pk_)

\n
\n\n
\n \n \n

Your Stripe secret API key (starts with sk_)

\n
\n\n
\n \n \n

Stripe webhook endpoint signing secret (starts with whsec_)

\n
\n\n
\n \n \n

Default Stripe Price ID for checkout sessions (optional)

\n
\n\n
\n \n \n

Redirect URL after successful checkout

\n
\n\n
\n \n \n

Redirect URL if checkout is cancelled

\n
\n
\n\n
\n \n
\n
\n
\n\n \n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Stripe Settings',\n pageTitle: 'Stripe Settings',\n currentPath: '/admin/plugins/stripe',\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n content,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'stripe'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving Stripe settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n})\n\nexport { adminRoutes as stripeAdminRoutes }\n","import type { StripePluginSettings } from '../types'\n\n/**\n * Lightweight Stripe API client using fetch (CF Workers compatible, no SDK needed)\n */\nexport class StripeAPI {\n private baseUrl = 'https://api.stripe.com/v1'\n\n constructor(private secretKey: string) {}\n\n /**\n * Verify a webhook signature\n * Implements Stripe's v1 signature scheme using Web Crypto API\n */\n async verifyWebhookSignature(payload: string, sigHeader: string, secret: string): Promise {\n const parts = sigHeader.split(',')\n const timestamp = parts.find(p => p.startsWith('t='))?.split('=')[1]\n const signatures = parts\n .filter(p => p.startsWith('v1='))\n .map(p => p.substring(3))\n\n if (!timestamp || signatures.length === 0) return false\n\n // Reject events older than 5 minutes (tolerance)\n const now = Math.floor(Date.now() / 1000)\n if (Math.abs(now - parseInt(timestamp)) > 300) return false\n\n // Compute expected signature\n const signedPayload = `${timestamp}.${payload}`\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(signedPayload))\n const expectedSignature = Array.from(new Uint8Array(signatureBuffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n\n return signatures.some(sig => timingSafeEqual(sig, expectedSignature))\n }\n\n /**\n * Create a Checkout Session\n */\n async createCheckoutSession(params: {\n priceId: string\n customerId?: string\n customerEmail?: string\n successUrl: string\n cancelUrl: string\n metadata?: Record\n }): Promise<{ id: string; url: string }> {\n const body = new URLSearchParams()\n body.append('mode', 'subscription')\n body.append('line_items[0][price]', params.priceId)\n body.append('line_items[0][quantity]', '1')\n body.append('success_url', params.successUrl)\n body.append('cancel_url', params.cancelUrl)\n\n if (params.customerId) {\n body.append('customer', params.customerId)\n } else if (params.customerEmail) {\n body.append('customer_email', params.customerEmail)\n }\n\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n\n const response = await this.request('POST', '/checkout/sessions', body)\n return { id: response.id, url: response.url }\n }\n\n /**\n * Retrieve a Stripe subscription\n */\n async getSubscription(subscriptionId: string): Promise {\n return this.request('GET', `/subscriptions/${subscriptionId}`)\n }\n\n /**\n * Create a Stripe customer\n */\n async createCustomer(params: { email: string; metadata?: Record }): Promise<{ id: string }> {\n const body = new URLSearchParams()\n body.append('email', params.email)\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n return this.request('POST', '/customers', body)\n }\n\n /**\n * List subscriptions with pagination (auto-expands across pages)\n */\n async listSubscriptions(params?: {\n status?: string\n limit?: number\n startingAfter?: string\n }): Promise<{ data: any[]; has_more: boolean }> {\n const qs = new URLSearchParams()\n qs.append('limit', String(params?.limit || 100))\n if (params?.status) qs.append('status', params.status)\n if (params?.startingAfter) qs.append('starting_after', params.startingAfter)\n return this.request('GET', `/subscriptions?${qs.toString()}`)\n }\n\n /**\n * Fetch ALL subscriptions from Stripe (handles pagination automatically)\n */\n async listAllSubscriptions(): Promise {\n const all: any[] = []\n let startingAfter: string | undefined\n\n while (true) {\n const result = await this.listSubscriptions({ limit: 100, startingAfter })\n all.push(...result.data)\n if (!result.has_more || result.data.length === 0) break\n startingAfter = result.data[result.data.length - 1].id\n }\n\n return all\n }\n\n /**\n * Search for a customer by email\n */\n async findCustomerByEmail(email: string): Promise<{ id: string } | null> {\n const params = new URLSearchParams()\n params.append('query', `email:'${email}'`)\n params.append('limit', '1')\n const result = await this.request('GET', `/customers/search?${params.toString()}`)\n return result.data?.[0] || null\n }\n\n private async request(method: string, path: string, body?: URLSearchParams): Promise {\n const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${this.secretKey}`,\n ...(body ? { 'Content-Type': 'application/x-www-form-urlencoded' } : {})\n },\n ...(body ? { body: body.toString() } : {})\n })\n\n const data = await response.json() as any\n if (!response.ok) {\n throw new Error(`Stripe API error: ${data.error?.message || response.statusText}`)\n }\n return data\n }\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks on signature verification\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n return result === 0\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { StripeAPI } from '../services/stripe-api'\nimport type { Bindings, Variables } from '../../../../app'\nimport type {\n StripePluginSettings,\n StripeEvent,\n StripeSubscriptionObject,\n StripeCheckoutSession,\n StripeInvoice,\n SubscriptionStatus,\n SubscriptionFilters\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\nfunction mapStripeStatus(status: string): SubscriptionStatus {\n const map: Record = {\n active: 'active',\n canceled: 'canceled',\n past_due: 'past_due',\n trialing: 'trialing',\n unpaid: 'unpaid',\n paused: 'paused',\n incomplete: 'incomplete',\n incomplete_expired: 'incomplete_expired'\n }\n return map[status] || 'incomplete'\n}\n\n// ============================================================================\n// Webhook — No auth, verified by Stripe signature\n// ============================================================================\n\napiRoutes.post('/webhook', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeWebhookSecret) {\n return c.json({ error: 'Webhook secret not configured' }, 500)\n }\n\n // Must read raw body for signature verification\n const rawBody = await c.req.text()\n const sigHeader = c.req.header('stripe-signature') || ''\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const isValid = await stripeApi.verifyWebhookSignature(rawBody, sigHeader, settings.stripeWebhookSecret)\n\n if (!isValid) {\n return c.json({ error: 'Invalid signature' }, 400)\n }\n\n const event: StripeEvent = JSON.parse(rawBody)\n const subscriptionService = new SubscriptionService(db)\n const eventService = new StripeEventService(db)\n await Promise.all([subscriptionService.ensureTable(), eventService.ensureTable()])\n\n // Determine object ID and type for the event log\n const obj = event.data.object as any\n const objectId = obj?.id || ''\n const objectType = obj?.object || event.type.split('.')[0] || ''\n\n try {\n switch (event.type) {\n case 'customer.subscription.created': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n\n await subscriptionService.create({\n userId,\n stripeCustomerId: sub.customer,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items.data[0]?.price.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription created: ${sub.id}`)\n break\n }\n\n case 'customer.subscription.updated': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: mapStripeStatus(sub.status),\n stripePriceId: sub.items.data[0]?.price.id || undefined,\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription updated: ${sub.id} -> ${sub.status}`)\n break\n }\n\n case 'customer.subscription.deleted': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: 'canceled'\n })\n\n console.log(`[Stripe] Subscription deleted: ${sub.id}`)\n break\n }\n\n case 'checkout.session.completed': {\n const session = event.data.object as unknown as StripeCheckoutSession\n const userId = session.metadata?.sonicjs_user_id\n\n if (userId && session.subscription) {\n const existing = await subscriptionService.getByStripeSubscriptionId(session.subscription)\n if (existing && !existing.userId) {\n await subscriptionService.updateByStripeId(session.subscription, {\n userId\n } as any)\n }\n }\n\n console.log(`[Stripe] Checkout completed: ${session.id}`)\n break\n }\n\n case 'invoice.payment_succeeded': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'active'\n })\n }\n console.log(`[Stripe] Payment succeeded for invoice: ${invoice.id}`)\n break\n }\n\n case 'invoice.payment_failed': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'past_due'\n })\n }\n console.log(`[Stripe] Payment failed for invoice: ${invoice.id}`)\n break\n }\n\n default:\n console.log(`[Stripe] Unhandled event type: ${event.type}`)\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'ignored'\n })\n return c.json({ received: true })\n }\n\n // Log successfully processed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'processed'\n })\n } catch (error) {\n // Log failed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error)\n }).catch(() => {}) // Don't let logging failure mask the real error\n\n console.error(`[Stripe] Error processing webhook event ${event.type}:`, error)\n return c.json({ error: 'Webhook processing failed' }, 500)\n }\n\n return c.json({ received: true })\n})\n\n// ============================================================================\n// Authenticated API Routes\n// ============================================================================\n\n// Create checkout session for current user\napiRoutes.post('/create-checkout-session', requireAuth(), async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const settings = await getSettings(db)\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe not configured' }, 500)\n }\n\n const body = await c.req.json().catch(() => ({})) as { priceId?: string }\n const priceId = body.priceId || settings.stripePriceId\n if (!priceId) {\n return c.json({ error: 'No price ID specified' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n // Check if user already has a Stripe customer ID\n const existingSub = await subscriptionService.getByUserId(user.userId)\n let customerId = existingSub?.stripeCustomerId\n\n if (!customerId) {\n // Try to find existing customer by email, or create one\n const existing = await stripeApi.findCustomerByEmail(user.email)\n if (existing) {\n customerId = existing.id\n } else {\n const customer = await stripeApi.createCustomer({\n email: user.email,\n metadata: { sonicjs_user_id: user.userId }\n })\n customerId = customer.id\n }\n }\n\n const origin = new URL(c.req.url).origin\n const session = await stripeApi.createCheckoutSession({\n priceId,\n customerId,\n successUrl: `${origin}${settings.successUrl}?session_id={CHECKOUT_SESSION_ID}`,\n cancelUrl: `${origin}${settings.cancelUrl}`,\n metadata: { sonicjs_user_id: user.userId }\n })\n\n return c.json({ sessionId: session.id, url: session.url })\n})\n\n// Get current user's subscription\napiRoutes.get('/subscription', requireAuth(), async (c) => {\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const subscription = await subscriptionService.getByUserId(user.userId)\n if (!subscription) {\n return c.json({ subscription: null })\n }\n\n return c.json({ subscription })\n})\n\n// ============================================================================\n// Admin API Routes\n// ============================================================================\n\n// List all subscriptions (admin only)\napiRoutes.get('/subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const filters: SubscriptionFilters = {\n status: c.req.query('status') as SubscriptionStatus | undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await subscriptionService.list(filters)\n return c.json(result)\n})\n\n// Get subscription stats (admin only)\napiRoutes.get('/stats', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const stats = await subscriptionService.getStats()\n return c.json(stats)\n})\n\n// ============================================================================\n// Sync Subscriptions from Stripe API\n// ============================================================================\n\napiRoutes.post('/sync-subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe secret key not configured' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n try {\n const allSubs = await stripeApi.listAllSubscriptions()\n let synced = 0\n let errors = 0\n\n for (const sub of allSubs) {\n try {\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n await subscriptionService.upsert({\n userId,\n stripeCustomerId: typeof sub.customer === 'string' ? sub.customer : sub.customer.id,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items?.data?.[0]?.price?.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n synced++\n } catch (err) {\n console.error(`[Stripe Sync] Failed to upsert subscription ${sub.id}:`, err)\n errors++\n }\n }\n\n return c.json({\n success: true,\n total: allSubs.length,\n synced,\n errors\n })\n } catch (error) {\n console.error('[Stripe Sync] Error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Sync failed'\n }, 500)\n }\n})\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\napiRoutes.get('/events', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const filters = {\n type: c.req.query('type') || undefined,\n status: c.req.query('status') as any || undefined,\n objectId: c.req.query('objectId') || undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50\n }\n\n const [result, stats, types] = await Promise.all([\n eventService.list(filters),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n return c.json({ ...result, stats, types })\n})\n\nexport { apiRoutes as stripeApiRoutes }\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { stripeAdminRoutes } from './routes/admin'\nimport { stripeApiRoutes } from './routes/api'\n\nexport function createStripePlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'stripe',\n version: '1.0.0-beta.1',\n description: 'Stripe subscription management with webhook handling, checkout sessions, and subscription gating'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard — subscription management\n builder.addRoute('/admin/plugins/stripe', stripeAdminRoutes as any, {\n description: 'Stripe subscriptions admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes — webhook, checkout, subscription status\n builder.addRoute('/api/stripe', stripeApiRoutes as any, {\n description: 'Stripe API endpoints (webhook, checkout, subscription)',\n requiresAuth: false, // Webhook route handles its own auth via signature\n priority: 50\n })\n\n // Admin menu item\n builder.addMenuItem('Stripe', '/admin/plugins/stripe', {\n icon: ``,\n order: 75\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.log('[Stripe] Plugin installed')\n },\n activate: async () => {\n console.log('[Stripe] Plugin activated')\n },\n deactivate: async () => {\n console.log('[Stripe] Plugin deactivated')\n },\n uninstall: async () => {\n console.log('[Stripe] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const stripePlugin = createStripePlugin()\nexport { SubscriptionService } from './services/subscription-service'\nexport { StripeAPI } from './services/stripe-api'\nexport { requireSubscription } from './middleware/require-subscription'\nexport default stripePlugin\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../app'\nimport { PLUGIN_REGISTRY } from '../plugins/manifest-registry'\n\n// Build menu plugin data from the auto-generated registry.\n// Any plugin with an adminMenu entry in its manifest.json will\n// automatically appear in the sidebar when active.\nconst REGISTRY_MENU_PLUGINS = Object.values(PLUGIN_REGISTRY)\n .filter(p => p.adminMenu !== null)\n .map(p => ({\n codeName: p.codeName,\n label: p.adminMenu!.label,\n path: p.adminMenu!.path,\n icon: p.adminMenu!.icon,\n order: p.adminMenu!.order,\n }))\n\n// Map icon names from manifest.json to Heroicons SVG (outline, 24x24)\nconst ICON_SVG: Record = {\n 'magnifying-glass': '',\n 'chart-bar': '',\n 'image': '',\n 'palette': '',\n 'envelope': '',\n 'hand-raised': '',\n 'key': '',\n 'arrow-right': '',\n 'shield-check': '',\n 'credit-card': '',\n}\n\nfunction resolveIcon(iconName?: string): string {\n if (!iconName) return ''\n // If it's already SVG markup, return as-is\n if (iconName.startsWith('`\n const resolvedIcon = resolveIcon(item.icon) || fallbackIcon\n return `\n \n ${isActive ? '' : ''}\n \n \n ${resolvedIcon}\n \n ${item.label}\n \n `\n}\n\nexport function pluginMenuMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n if (!path.startsWith('/admin')) {\n return next()\n }\n\n // Collect menu items from active plugins using the registry\n let activeMenuItems: Array<{ label: string; path: string; icon?: string; order: number }> = []\n try {\n const db = c.env.DB\n const pluginCodeNames = REGISTRY_MENU_PLUGINS.map(p => p.codeName)\n if (pluginCodeNames.length > 0) {\n const placeholders = pluginCodeNames.map(() => '?').join(',')\n const result = await db.prepare(\n `SELECT name FROM plugins WHERE name IN (${placeholders}) AND status = 'active'`\n ).bind(...pluginCodeNames).all()\n\n const activeNames = new Set((result.results || []).map((r: any) => r.name))\n\n for (const plugin of REGISTRY_MENU_PLUGINS) {\n if (activeNames.has(plugin.codeName)) {\n activeMenuItems.push({\n label: plugin.label,\n path: plugin.path,\n icon: plugin.icon,\n order: plugin.order,\n })\n }\n }\n\n // Sort by order\n activeMenuItems.sort((a, b) => a.order - b.order)\n }\n } catch {\n // DB not ready or plugin table doesn't exist yet\n }\n\n c.set('pluginMenuItems', activeMenuItems.map(m => ({ label: m.label, path: m.path, icon: resolveIcon(m.icon) || '' })))\n\n await next()\n\n // Inject menu items into HTML response by replacing the marker\n if (activeMenuItems.length > 0 && c.res.headers.get('content-type')?.includes('text/html')) {\n const status = c.res.status\n const headers = new Headers(c.res.headers)\n const html = await c.res.text()\n\n if (html.includes(MARKER)) {\n const renderedItems = activeMenuItems.map(item => renderMenuItem(item, path)).join('')\n const newHtml = html.split(MARKER).join(renderedItems)\n c.res = new Response(newHtml, { status, headers })\n } else {\n // Body was consumed by .text(), must create new Response either way\n c.res = new Response(html, { status, headers })\n }\n }\n }\n}\n","/**\n * SonicJS Plugin System Types\n * \n * Defines the core interfaces and types for the plugin system\n */\n\nimport { Hono, Context, Next, MiddlewareHandler } from 'hono'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\n\n// Core plugin definition\nexport interface Plugin {\n /** Unique plugin identifier */\n name: string\n /** Plugin version (semantic versioning) */\n version: string\n /** Human-readable description */\n description?: string\n /** Plugin author information */\n author?: {\n name: string\n email?: string\n url?: string\n }\n /** Plugin dependencies (other plugins required) */\n dependencies?: string[]\n /** SonicJS version compatibility */\n compatibility?: string\n /** Plugin license */\n license?: string\n \n // Extension points\n routes?: PluginRoutes[]\n middleware?: PluginMiddleware[]\n models?: PluginModel[]\n services?: PluginService[]\n adminPages?: PluginAdminPage[]\n adminComponents?: PluginComponent[]\n menuItems?: PluginMenuItem[]\n hooks?: PluginHook[]\n \n // Lifecycle hooks\n install?: (context: PluginContext) => Promise\n uninstall?: (context: PluginContext) => Promise\n activate?: (context: PluginContext) => Promise\n deactivate?: (context: PluginContext) => Promise\n configure?: (config: PluginConfig) => Promise\n}\n\n// Plugin context provides access to SonicJS APIs\nexport interface PluginContext {\n /** Database instance */\n db: D1Database\n /** Key-value storage */\n kv: KVNamespace\n /** R2 storage bucket */\n r2?: R2Bucket\n /** Plugin configuration */\n config: PluginConfig\n /** Core SonicJS services */\n services: {\n auth: AuthService\n content: ContentService\n media: MediaService\n }\n /** Hook system for inter-plugin communication */\n hooks: HookSystem | ScopedHookSystem\n /** Logging utilities */\n logger: PluginLogger\n}\n\n// Authentication service interface for plugins\nexport interface AuthService {\n /** Generate JWT token for a user */\n generateToken(userId: string, email: string, role: string): Promise\n /** Verify and decode JWT token */\n verifyToken(token: string): Promise\n /** Set authentication cookie (useful for alternative auth methods) */\n setAuthCookie(context: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void\n /** Hash password */\n hashPassword(password: string): Promise\n /** Verify password against hash */\n verifyPassword(password: string, hash: string): Promise\n}\n\n// Plugin configuration\nexport interface PluginConfig {\n /** Plugin-specific configuration */\n [key: string]: any\n /** Whether plugin is enabled */\n enabled: boolean\n /** Plugin installation timestamp */\n installedAt?: number\n /** Plugin last update timestamp */\n updatedAt?: number\n}\n\n// Route definitions\nexport interface PluginRoutes {\n /** Route path prefix */\n path: string\n /** Hono route handler */\n handler: Hono\n /** Route description */\n description?: string\n /** Whether route requires authentication */\n requiresAuth?: boolean\n /** Required roles for access */\n roles?: string[]\n /** Route priority (for ordering) */\n priority?: number\n}\n\n// Middleware definitions\nexport interface PluginMiddleware {\n /** Middleware name */\n name: string\n /** Middleware handler function */\n handler: MiddlewareHandler\n /** Middleware description */\n description?: string\n /** Middleware priority (lower = earlier) */\n priority?: number\n /** Routes to apply middleware to */\n routes?: string[]\n /** Whether to apply globally */\n global?: boolean\n}\n\n// Database model definitions\nexport interface PluginModel {\n /** Model name */\n name: string\n /** Database table name */\n tableName: string\n /** Zod schema for validation */\n schema: z.ZodSchema\n /** Database migrations */\n migrations: string[]\n /** Model relationships */\n relationships?: ModelRelationship[]\n /** Whether model extends core content */\n extendsContent?: boolean\n}\n\nexport interface ModelRelationship {\n type: 'oneToOne' | 'oneToMany' | 'manyToMany'\n target: string\n foreignKey?: string\n joinTable?: string\n}\n\n// Service definitions\nexport interface PluginService {\n /** Service name */\n name: string\n /** Service implementation */\n implementation: any\n /** Service description */\n description?: string\n /** Service dependencies */\n dependencies?: string[]\n /** Whether service is singleton */\n singleton?: boolean\n}\n\n// Admin interface extensions\nexport interface PluginAdminPage {\n /** Page path (relative to /admin) */\n path: string\n /** Page title */\n title: string\n /** Page component/template */\n component: string\n /** Page description */\n description?: string\n /** Required permissions */\n permissions?: string[]\n /** Menu item configuration */\n menuItem?: PluginMenuItem\n /** Page icon */\n icon?: string\n}\n\nexport interface PluginComponent {\n /** Component name */\n name: string\n /** Component template function */\n template: (props: any) => string\n /** Component description */\n description?: string\n /** Component props schema */\n propsSchema?: z.ZodSchema\n}\n\nexport interface PluginMenuItem {\n /** Menu item label */\n label: string\n /** Menu item path */\n path: string\n /** Menu item icon */\n icon?: string\n /** Menu item order */\n order?: number\n /** Parent menu item */\n parent?: string\n /** Required permissions */\n permissions?: string[]\n /** Whether item is active */\n active?: boolean\n}\n\n// Hook system for extensibility\nexport interface PluginHook {\n /** Hook name */\n name: string\n /** Hook handler function */\n handler: HookHandler\n /** Hook priority */\n priority?: number\n /** Hook description */\n description?: string\n}\n\nexport type HookHandler = (data: any, context: HookContext) => Promise\n\nexport interface HookContext {\n /** Plugin that registered the hook */\n plugin: string\n /** Hook execution context */\n context: PluginContext\n /** Cancel hook execution */\n cancel?: () => void\n}\n\n// Hook system interface\nexport interface HookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Get all registered hooks */\n getHooks(hookName: string): PluginHook[]\n /** Create a scoped hook system (optional) */\n createScope?(pluginName: string): ScopedHookSystem\n}\n\n// Scoped hook system for plugins\nexport interface ScopedHookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Remove all hooks for this scope */\n unregisterAll(): void\n}\n\n// Plugin registry\nexport interface PluginRegistry {\n /** Get plugin by name */\n get(name: string): Plugin | undefined\n /** Get all registered plugins */\n getAll(): Plugin[]\n /** Get active plugins */\n getActive(): Plugin[]\n /** Register a plugin */\n register(plugin: Plugin): Promise\n /** Unregister a plugin */\n unregister(name: string): Promise\n /** Check if plugin is registered */\n has(name: string): boolean\n /** Activate a plugin */\n activate(name: string): Promise\n /** Deactivate a plugin */\n deactivate(name: string): Promise\n /** Get plugin configuration */\n getConfig(name: string): PluginConfig | undefined\n /** Set plugin configuration */\n setConfig(name: string, config: PluginConfig): void\n /** Get plugin status */\n getStatus(name: string): PluginStatus | undefined\n /** Get all plugin statuses */\n getAllStatuses(): Map\n /** Resolve plugin load order based on dependencies */\n resolveLoadOrder(): string[]\n}\n\n// Plugin manager\nexport interface PluginManager {\n /** Plugin registry */\n registry: PluginRegistry\n /** Hook system */\n hooks: HookSystem\n /** Initialize plugin system */\n initialize(context: PluginContext): Promise\n /** Load plugins from configuration */\n loadPlugins(config: PluginConfig[]): Promise\n /** Install a plugin */\n install(plugin: Plugin, config?: PluginConfig): Promise\n /** Uninstall a plugin */\n uninstall(name: string): Promise\n /** Get plugin status */\n getStatus(name: string): PluginStatus\n}\n\nexport interface PluginStatus {\n name: string\n version: string\n active: boolean\n installed: boolean\n hasErrors: boolean\n errors?: string[]\n lastError?: string\n}\n\n// Service interfaces\nexport interface AuthService {\n /** Verify user permissions */\n hasPermission(userId: string, permission: string): Promise\n /** Get current user */\n getCurrentUser(context: Context): Promise\n /** Create authentication middleware */\n createMiddleware(options?: any): MiddlewareHandler\n}\n\nexport interface ContentService {\n /** Get content by ID */\n getById(id: string): Promise\n /** Create new content */\n create(data: any): Promise\n /** Update content */\n update(id: string, data: any): Promise\n /** Delete content */\n delete(id: string): Promise\n /** Search content */\n search(query: string, options?: any): Promise\n}\n\nexport interface MediaService {\n /** Upload file */\n upload(file: File, options?: any): Promise\n /** Get media by ID */\n getById(id: string): Promise\n /** Delete media */\n delete(id: string): Promise\n /** Transform image */\n transform(id: string, options: any): Promise\n}\n\n// Plugin logger\nexport interface PluginLogger {\n debug(message: string, data?: any): void\n info(message: string, data?: any): void\n warn(message: string, data?: any): void\n error(message: string, error?: Error, data?: any): void\n}\n\n// Plugin development utilities interface\n\nexport interface PluginBuilderOptions {\n name: string\n version: string\n description?: string\n author?: Plugin['author']\n dependencies?: string[]\n}\n\n// Plugin validation\nexport interface PluginValidator {\n /** Validate plugin definition */\n validate(plugin: Plugin): PluginValidationResult\n /** Validate plugin dependencies */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult\n /** Validate plugin compatibility */\n validateCompatibility(plugin: Plugin, version: string): PluginValidationResult\n}\n\nexport interface PluginValidationResult {\n valid: boolean\n errors: string[]\n warnings: string[]\n}\n\n// Standard hook names\nexport const HOOKS = {\n // Application lifecycle\n APP_INIT: 'app:init',\n APP_READY: 'app:ready',\n APP_SHUTDOWN: 'app:shutdown',\n \n // Request lifecycle\n REQUEST_START: 'request:start',\n REQUEST_END: 'request:end',\n REQUEST_ERROR: 'request:error',\n \n // Authentication\n AUTH_LOGIN: 'auth:login',\n AUTH_LOGOUT: 'auth:logout',\n AUTH_REGISTER: 'auth:register',\n USER_LOGIN: 'user:login',\n USER_LOGOUT: 'user:logout',\n \n // Content lifecycle\n CONTENT_CREATE: 'content:create',\n CONTENT_UPDATE: 'content:update',\n CONTENT_DELETE: 'content:delete',\n CONTENT_PUBLISH: 'content:publish',\n CONTENT_SAVE: 'content:save',\n \n // Media lifecycle\n MEDIA_UPLOAD: 'media:upload',\n MEDIA_DELETE: 'media:delete',\n MEDIA_TRANSFORM: 'media:transform',\n \n // Plugin lifecycle\n PLUGIN_INSTALL: 'plugin:install',\n PLUGIN_UNINSTALL: 'plugin:uninstall',\n PLUGIN_ACTIVATE: 'plugin:activate',\n PLUGIN_DEACTIVATE: 'plugin:deactivate',\n \n // Admin interface\n ADMIN_MENU_RENDER: 'admin:menu:render',\n ADMIN_PAGE_RENDER: 'admin:page:render',\n \n // Database\n DB_MIGRATE: 'db:migrate',\n DB_SEED: 'db:seed',\n} as const\n\nexport type HookName = typeof HOOKS[keyof typeof HOOKS]","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { renderAdminLayoutCatalyst } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\n// Analytics Dashboard\nadminRoutes.get('/', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Query real metrics from system_logs\n let totalRequests = 0\n let uniqueIPs = 0\n let avgDuration = 0\n let errorCount = 0\n let topPages: Array<{ path: string; views: number }> = []\n let recentActivity: Array<{ url: string; method: string; status_code: number; duration: number; created_at: number }> = []\n\n try {\n const now = Math.floor(Date.now() / 1000)\n const dayAgo = now - 86400\n\n const [requestsResult, ipsResult, durationResult, errorsResult, pagesResult, activityResult] = await Promise.all([\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT COUNT(DISTINCT ip_address) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT AVG(duration) as avg FROM system_logs WHERE category = ? AND created_at > ? AND duration IS NOT NULL')\n .bind('api', dayAgo).first() as Promise<{ avg: number } | null>,\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE level IN (?, ?) AND created_at > ?')\n .bind('error', 'fatal', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT url, COUNT(*) as views FROM system_logs WHERE category = ? AND created_at > ? AND url IS NOT NULL GROUP BY url ORDER BY views DESC LIMIT 10')\n .bind('api', dayAgo).all(),\n db.prepare('SELECT url, method, status_code, duration, created_at FROM system_logs WHERE category = ? ORDER BY created_at DESC LIMIT 20')\n .bind('api').all(),\n ])\n\n totalRequests = requestsResult?.count || 0\n uniqueIPs = ipsResult?.count || 0\n avgDuration = Math.round(durationResult?.avg || 0)\n errorCount = errorsResult?.count || 0\n topPages = (pagesResult.results || []).map((r: any) => ({ path: r.url, views: r.views }))\n recentActivity = (activityResult.results || []) as any[]\n } catch {\n // Tables may not exist yet\n }\n\n const content = `\n
\n
\n

Analytics Dashboard

\n

Last 24 hours overview from system logs

\n
\n\n \n
\n
\n

Total Requests

\n

${totalRequests.toLocaleString()}

\n
\n
\n

Unique Visitors

\n

${uniqueIPs.toLocaleString()}

\n
\n
\n

Avg Response Time

\n

${avgDuration}ms

\n
\n
\n

Errors

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${errorCount.toLocaleString()}

\n
\n
\n\n \n
\n
\n

Top Pages

\n
\n
\n ${topPages.length > 0 ? topPages.map(p => `\n
\n ${escapeHtml(p.path)}\n ${p.views}\n
\n `).join('') : `\n
\n No page views recorded yet. Analytics data will appear once requests are logged.\n
\n `}\n
\n
\n\n \n
\n
\n

Recent Activity

\n
\n
\n \n \n \n \n \n \n \n \n \n \n ${recentActivity.length > 0 ? recentActivity.map(a => `\n \n \n \n \n \n \n `).join('') : `\n \n \n \n `}\n \n
PathMethodStatusDuration
${escapeHtml(a.url || '')}${a.method || ''}= 400 ? 'bg-red-50 text-red-700 dark:bg-red-900/30 dark:text-red-400' : 'bg-green-50 text-green-700 dark:bg-green-900/30 dark:text-green-400'}\">${a.status_code || ''}${a.duration || 0}ms
No activity recorded yet.
\n
\n
\n
\n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Analytics',\n pageTitle: 'Analytics Dashboard',\n currentPath: '/admin/analytics',\n version: c.get('appVersion'),\n user: user ? {\n name: user.email.split('@')[0] || 'Admin',\n email: user.email,\n role: user.role\n } : undefined,\n content,\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"')\n}\n\nexport { adminRoutes as analyticsAdminRoutes }\n","/**\n * Core Analytics Plugin\n * \n * Provides analytics tracking and reporting extensions\n */\n\nimport { Hono } from 'hono'\n// import { z } from 'zod'\nimport { PluginBuilder, PluginHelpers } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { HOOKS } from '../../types'\nimport { analyticsAdminRoutes } from './routes/admin'\n\nexport function createAnalyticsPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'core-analytics',\n version: '1.0.0-beta.1',\n description: 'Core analytics tracking and reporting plugin'\n })\n\n // Add analytics metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^0.1.0',\n dependencies: ['core-auth'] // Requires auth for admin access\n })\n\n // Create analytics API routes\n const analyticsAPI = new Hono()\n\n // GET /analytics/stats - Get analytics overview\n analyticsAPI.get('/stats', async (c) => {\n const timeRange = c.req.query('range') || '7d' // 1d, 7d, 30d, 90d\n const _metric = c.req.query('metric') || 'all' // pageviews, sessions, users, etc.\n\n return c.json({\n message: 'Analytics stats',\n data: {\n pageviews: 12500,\n uniqueVisitors: 3200,\n sessions: 4800,\n avgSessionDuration: 245,\n bounceRate: 0.35,\n topPages: [\n { path: '/', views: 3200 },\n { path: '/about', views: 1800 },\n { path: '/contact', views: 950 }\n ],\n timeRange\n }\n })\n })\n\n // POST /analytics/track - Track analytics event\n analyticsAPI.post('/track', async (c) => {\n const event = await c.req.json()\n \n // Track event (pageview, click, form submission, etc.)\n console.info('Analytics event tracked:', event)\n \n return c.json({\n message: 'Event tracked successfully',\n eventId: `event-${Date.now()}`\n })\n })\n\n // GET /analytics/reports - Get detailed reports\n analyticsAPI.get('/reports', async (c) => {\n const reportType = c.req.query('type') || 'traffic'\n const startDate = c.req.query('start')\n const endDate = c.req.query('end')\n\n return c.json({\n message: 'Analytics report',\n data: {\n reportType,\n dateRange: { start: startDate, end: endDate },\n data: []\n }\n })\n })\n\n // GET /analytics/realtime - Get real-time analytics\n analyticsAPI.get('/realtime', async (c) => {\n return c.json({\n message: 'Real-time analytics',\n data: {\n activeUsers: 23,\n activePages: [\n { path: '/', users: 8 },\n { path: '/blog', users: 5 },\n { path: '/products', users: 4 }\n ],\n recentEvents: []\n }\n })\n })\n\n builder.addRoute('/api/analytics', analyticsAPI, {\n description: 'Analytics tracking and reporting API',\n requiresAuth: true,\n roles: ['admin', 'analytics:read'],\n priority: 3\n })\n\n // Admin dashboard routes\n builder.addRoute('/admin/analytics', analyticsAdminRoutes as any, {\n description: 'Analytics admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // Add analytics tracking middleware\n builder.addSingleMiddleware('analytics-tracker', async (c: any, next: any) => {\n const start = Date.now()\n const path = c.req.path\n const method = c.req.method\n const userAgent = c.req.header('user-agent')\n const referer = c.req.header('referer')\n const ip = c.req.header('CF-Connecting-IP') || c.req.header('x-forwarded-for')\n\n await next()\n\n const duration = Date.now() - start\n const status = c.res.status\n\n // Track request analytics\n const analyticsData = {\n timestamp: new Date().toISOString(),\n path,\n method,\n status,\n duration,\n userAgent,\n referer,\n ip,\n responseSize: c.res.headers.get('content-length') || 0\n }\n\n console.debug('Analytics tracking:', analyticsData)\n \n // Store analytics data (would integrate with analytics service)\n }, {\n description: 'Track page views and request analytics',\n global: true,\n priority: 99 // Run last to capture response data\n })\n\n // Add analytics service\n builder.addService('analyticsService', {\n trackEvent: async (event: any) => {\n // Event tracking implementation\n console.info('Tracking event:', event)\n return { eventId: `event-${Date.now()}` }\n },\n \n trackPageView: async (data: any) => {\n // Page view tracking implementation\n console.info('Tracking pageview:', data.path)\n return { viewId: `view-${Date.now()}` }\n },\n \n getStats: async (_timeRange: string) => {\n // Get analytics statistics\n return {\n pageviews: 12500,\n sessions: 4800,\n uniqueVisitors: 3200\n }\n },\n \n generateReport: async (type: string, options: any) => {\n // Generate analytics reports\n console.info(`Generating ${type} report with options:`, options)\n return { reportId: `report-${Date.now()}` }\n }\n }, {\n description: 'Core analytics tracking service',\n singleton: true\n })\n\n // Add analytics models\n const pageViewSchema = PluginHelpers.createSchema([\n { name: 'path', type: 'string', optional: false },\n { name: 'title', type: 'string', optional: true },\n { name: 'referrer', type: 'string', optional: true },\n { name: 'userAgent', type: 'string', optional: true },\n { name: 'ipAddress', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true },\n { name: 'duration', type: 'number', optional: true }\n ])\n\n const eventSchema = PluginHelpers.createSchema([\n { name: 'eventType', type: 'string', optional: false },\n { name: 'eventName', type: 'string', optional: false },\n { name: 'eventData', type: 'object', optional: true },\n { name: 'path', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true }\n ])\n\n const pageViewMigration = PluginHelpers.createMigration('analytics_pageviews', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'path', type: 'TEXT', nullable: false },\n { name: 'title', type: 'TEXT', nullable: true },\n { name: 'referrer', type: 'TEXT', nullable: true },\n { name: 'user_agent', type: 'TEXT', nullable: true },\n { name: 'ip_address', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true },\n { name: 'duration', type: 'INTEGER', nullable: true }\n ])\n\n const eventMigration = PluginHelpers.createMigration('analytics_events', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'event_type', type: 'TEXT', nullable: false },\n { name: 'event_name', type: 'TEXT', nullable: false },\n { name: 'event_data', type: 'TEXT', nullable: true },\n { name: 'path', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true }\n ])\n\n builder.addModel('PageView', {\n tableName: 'analytics_pageviews',\n schema: pageViewSchema,\n migrations: [pageViewMigration]\n })\n\n builder.addModel('AnalyticsEvent', {\n tableName: 'analytics_events',\n schema: eventSchema,\n migrations: [eventMigration]\n })\n\n // Add analytics hooks\n builder.addHook(HOOKS.REQUEST_START, async (data: any, _context: any) => {\n // Start tracking request\n data.analytics = {\n startTime: Date.now(),\n sessionId: `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n return data\n }, {\n priority: 1,\n description: 'Initialize analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.REQUEST_END, async (data: any, _context: any) => {\n // Complete request tracking\n if (data.analytics) {\n const duration = Date.now() - data.analytics.startTime\n console.debug(`Request completed in ${duration}ms`)\n }\n return data\n }, {\n priority: 1,\n description: 'Complete analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.USER_LOGIN, async (data: any, context: any) => {\n // Track user login events\n await context.services?.analyticsService?.trackEvent({\n eventType: 'auth',\n eventName: 'user_login',\n userId: data.userId,\n eventData: { loginMethod: data.method }\n })\n return data\n }, {\n priority: 8,\n description: 'Track user login events'\n })\n\n builder.addHook('content:view', async (data: any, context: any) => {\n // Track content views\n await context.services?.analyticsService?.trackEvent({\n eventType: 'content',\n eventName: 'content_view',\n eventData: {\n contentId: data.id,\n contentType: data.type,\n title: data.title\n }\n })\n return data\n }, {\n priority: 8,\n description: 'Track content view events'\n })\n\n // Add admin pages\n builder.addAdminPage(\n '/analytics',\n 'Analytics Dashboard',\n 'AnalyticsDashboardView',\n {\n description: 'View analytics overview and key metrics',\n permissions: ['admin', 'analytics:read'],\n icon: 'chart-bar'\n }\n )\n\n builder.addAdminPage(\n '/analytics/reports',\n 'Analytics Reports',\n 'AnalyticsReportsView',\n {\n description: 'Generate and view detailed analytics reports',\n permissions: ['admin', 'analytics:read'],\n icon: 'document-report'\n }\n )\n\n builder.addAdminPage(\n '/analytics/realtime',\n 'Real-time Analytics',\n 'AnalyticsRealtimeView',\n {\n description: 'View real-time visitor activity',\n permissions: ['admin', 'analytics:read'],\n icon: 'lightning-bolt'\n }\n )\n\n builder.addAdminPage(\n '/analytics/settings',\n 'Analytics Settings',\n 'AnalyticsSettingsView',\n {\n description: 'Configure analytics tracking and data collection',\n permissions: ['admin', 'analytics:configure'],\n icon: 'cog'\n }\n )\n\n // Add menu items\n builder.addMenuItem('Analytics', '/admin/analytics', {\n icon: 'chart-bar',\n order: 40,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Dashboard', '/admin/analytics', {\n icon: 'chart-bar',\n parent: 'Analytics',\n order: 1,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Reports', '/admin/analytics/reports', {\n icon: 'document-report',\n parent: 'Analytics',\n order: 2,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Real-time', '/admin/analytics/realtime', {\n icon: 'lightning-bolt',\n parent: 'Analytics',\n order: 3,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Settings', '/admin/analytics/settings', {\n icon: 'cog',\n parent: 'Analytics',\n order: 4,\n permissions: ['admin', 'analytics:configure']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.info('Installing analytics plugin...')\n // Create analytics database tables and initial configuration\n },\n\n activate: async () => {\n console.info('Activating analytics plugin...')\n // Start analytics tracking services\n },\n\n deactivate: async () => {\n console.info('Deactivating analytics plugin...')\n // Stop analytics tracking and clean up resources\n },\n\n configure: async (config) => {\n console.info('Configuring analytics plugin...', config)\n // Update analytics configuration and settings\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const analyticsPlugin = createAnalyticsPlugin()","import type { D1Database } from '@cloudflare/workers-types'\n\nexport interface TrackEventInput {\n event: string\n properties?: Record\n userId?: string\n sessionId?: string\n ipAddress?: string\n userAgent?: string\n path?: string\n category?: string\n}\n\nexport interface EventQueryFilters {\n event?: string\n category?: string\n userId?: string\n sessionId?: string\n startDate?: number\n endDate?: number\n limit?: number\n offset?: number\n}\n\nexport interface EventStats {\n totalEvents: number\n uniqueUsers: number\n uniqueSessions: number\n topEvents: Array<{ event: string; count: number }>\n}\n\nexport class EventTrackingService {\n constructor(private db: D1Database) {}\n\n async trackEvent(input: TrackEventInput): Promise {\n const id = crypto.randomUUID()\n const category = input.category || 'user-activity'\n\n await this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n ).run()\n\n return id\n }\n\n async trackBatch(events: TrackEventInput[]): Promise {\n const ids: string[] = []\n\n const stmts = events.map(input => {\n const id = crypto.randomUUID()\n ids.push(id)\n const category = input.category || 'user-activity'\n\n return this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n )\n })\n\n await this.db.batch(stmts)\n return ids\n }\n\n async queryEvents(filters: EventQueryFilters = {}): Promise<{ events: any[]; total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.event) {\n conditions.push('event = ?')\n params.push(filters.event)\n }\n if (filters.category) {\n conditions.push('category = ?')\n params.push(filters.category)\n }\n if (filters.userId) {\n conditions.push('user_id = ?')\n params.push(filters.userId)\n }\n if (filters.sessionId) {\n conditions.push('session_id = ?')\n params.push(filters.sessionId)\n }\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const limit = filters.limit || 50\n const offset = filters.offset || 0\n\n const [countResult, eventsResult] = await Promise.all([\n this.db.prepare(`SELECT COUNT(*) as total FROM analytics_events ${where}`).bind(...params).first() as Promise<{ total: number } | null>,\n this.db.prepare(`SELECT * FROM analytics_events ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`).bind(...params, limit, offset).all()\n ])\n\n const events = (eventsResult.results || []).map((e: any) => ({\n ...e,\n properties: e.properties ? JSON.parse(e.properties) : null\n }))\n\n return { events, total: countResult?.total || 0 }\n }\n\n async getStats(startDate?: number, endDate?: number): Promise {\n const conditions: string[] = []\n const params: any[] = []\n\n if (startDate) {\n conditions.push('created_at >= ?')\n params.push(startDate)\n }\n if (endDate) {\n conditions.push('created_at <= ?')\n params.push(endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n const [totals, topEvents] = await Promise.all([\n this.db.prepare(`\n SELECT\n COUNT(*) as total_events,\n COUNT(DISTINCT user_id) as unique_users,\n COUNT(DISTINCT session_id) as unique_sessions\n FROM analytics_events ${where}\n `).bind(...params).first() as Promise<{ total_events: number; unique_users: number; unique_sessions: number } | null>,\n this.db.prepare(`\n SELECT event, COUNT(*) as count\n FROM analytics_events ${where}\n GROUP BY event ORDER BY count DESC LIMIT 20\n `).bind(...params).all()\n ])\n\n return {\n totalEvents: totals?.total_events || 0,\n uniqueUsers: totals?.unique_users || 0,\n uniqueSessions: totals?.unique_sessions || 0,\n topEvents: (topEvents.results || []).map((r: any) => ({ event: r.event, count: r.count }))\n }\n }\n}\n","import { Hono } from 'hono'\nimport { EventTrackingService } from '../services/event-tracking-service'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// POST /api/events - Track a single event or batch of events\napiRoutes.post('/', async (c) => {\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || ''\n const user = c.get('user')\n\n let body: any\n try {\n body = await c.req.json()\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400)\n }\n\n // Batch support: accept an array of events\n if (Array.isArray(body)) {\n if (body.length > 100) {\n return c.json({ error: 'Batch size limit is 100 events' }, 400)\n }\n\n const events = body.map(e => ({\n event: e.event,\n category: e.category || 'user-activity',\n properties: e.properties,\n userId: user?.userId || e.userId,\n sessionId: e.sessionId,\n ipAddress: ip,\n userAgent,\n path: e.path\n }))\n\n // Validate all events have an event name\n const invalid = events.find(e => !e.event || typeof e.event !== 'string')\n if (invalid) {\n return c.json({ error: 'Each event must have an \"event\" string field' }, 400)\n }\n\n const ids = await service.trackBatch(events)\n return c.json({ success: true, eventIds: ids, count: ids.length })\n }\n\n // Single event\n if (!body.event || typeof body.event !== 'string') {\n return c.json({ error: '\"event\" field is required and must be a string' }, 400)\n }\n\n const eventId = await service.trackEvent({\n event: body.event,\n category: body.category || 'user-activity',\n properties: body.properties,\n userId: user?.userId || body.userId,\n sessionId: body.sessionId,\n ipAddress: ip,\n userAgent,\n path: body.path\n })\n\n return c.json({ success: true, eventId })\n})\n\n// GET /api/events - Query events (admin only)\napiRoutes.get('/', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const filters = {\n event: c.req.query('event') || undefined,\n category: c.req.query('category') || undefined,\n userId: c.req.query('userId') || undefined,\n sessionId: c.req.query('sessionId') || undefined,\n startDate: c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined,\n endDate: c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n offset: c.req.query('offset') ? parseInt(c.req.query('offset')!) : 0\n }\n\n const result = await service.queryEvents(filters)\n return c.json(result)\n})\n\n// GET /api/events/stats - Aggregated event stats (admin only)\napiRoutes.get('/stats', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const startDate = c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined\n const endDate = c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined\n\n const stats = await service.getStats(startDate, endDate)\n return c.json(stats)\n})\n\nexport { apiRoutes as eventsApiRoutes }\n","/**\n * Cache Configuration\n *\n * Defines cache configurations for different entity types\n */\n\nexport interface CacheConfig {\n ttl: number // Time-to-live in seconds\n kvEnabled: boolean // Use KV cache tier\n memoryEnabled: boolean // Use in-memory cache tier\n namespace: string // Cache namespace/prefix\n invalidateOn: string[] // Events that invalidate this cache\n version?: string // Cache version for busting\n}\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\n/**\n * Default cache configurations by entity type\n */\nexport const CACHE_CONFIGS: Record = {\n // Content (high read, low write)\n content: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'content',\n invalidateOn: ['content.update', 'content.delete', 'content.publish'],\n version: 'v1'\n },\n\n // User data (medium read, medium write)\n user: {\n ttl: 900, // 15 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'user',\n invalidateOn: ['user.update', 'user.delete', 'auth.login'],\n version: 'v1'\n },\n\n // Configuration (high read, very low write)\n config: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'config',\n invalidateOn: ['config.update', 'plugin.activate', 'plugin.deactivate'],\n version: 'v1'\n },\n\n // Media metadata (high read, low write)\n media: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'media',\n invalidateOn: ['media.upload', 'media.delete', 'media.update'],\n version: 'v1'\n },\n\n // API responses (very high read, low write)\n api: {\n ttl: 300, // 5 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'api',\n invalidateOn: ['content.update', 'content.publish'],\n version: 'v1'\n },\n\n // Session data (very high read, medium write)\n session: {\n ttl: 1800, // 30 minutes\n kvEnabled: false, // Only in-memory for sessions\n memoryEnabled: true,\n namespace: 'session',\n invalidateOn: ['auth.logout'],\n version: 'v1'\n },\n\n // Plugin data\n plugin: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'plugin',\n invalidateOn: ['plugin.activate', 'plugin.deactivate', 'plugin.update'],\n version: 'v1'\n },\n\n // Collections/schema\n collection: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'collection',\n invalidateOn: ['collection.update', 'collection.delete'],\n version: 'v1'\n }\n}\n\n/**\n * Get cache configuration for a specific namespace\n */\nexport function getCacheConfig(namespace: string): CacheConfig {\n return CACHE_CONFIGS[namespace] || {\n ttl: 3600,\n kvEnabled: true,\n memoryEnabled: true,\n namespace,\n invalidateOn: [],\n version: 'v1'\n }\n}\n\n/**\n * Generate a cache key with consistent format\n * Format: {namespace}:{type}:{identifier}:{version}\n */\nexport function generateCacheKey(\n namespace: string,\n type: string,\n identifier: string,\n version?: string\n): string {\n const v = version || getCacheConfig(namespace).version || 'v1'\n return `${namespace}:${type}:${identifier}:${v}`\n}\n\n/**\n * Parse a cache key back into its components\n */\nexport function parseCacheKey(key: string): {\n namespace: string\n type: string\n identifier: string\n version: string\n} | null {\n const parts = key.split(':')\n if (parts.length !== 4) {\n return null\n }\n\n return {\n namespace: parts[0] || '',\n type: parts[1] || '',\n identifier: parts[2] || '',\n version: parts[3] || ''\n }\n}\n\n/**\n * Generate a hash for complex query parameters\n */\nexport function hashQueryParams(params: Record): string {\n // Sort keys for consistent hashing\n const sortedKeys = Object.keys(params).sort()\n const normalized = sortedKeys.map(key => `${key}=${params[key]}`).join('&')\n\n // Simple hash function (for better performance, consider using crypto)\n let hash = 0\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Create a pattern for cache invalidation\n */\nexport function createCachePattern(\n namespace: string,\n type?: string,\n identifier?: string\n): string {\n let pattern = namespace\n if (type) pattern += `:${type}`\n if (identifier) pattern += `:${identifier}`\n return pattern + ':*'\n}\n","/**\n * Cache Service\n *\n * Three-tiered caching implementation:\n * 1. In-Memory Cache (fastest, region-specific)\n * 2. Cloudflare KV Cache (fast, global)\n * 3. Database (fallback, source of truth)\n */\n\nimport { CacheConfig, CacheStats, generateCacheKey } from './cache-config.js'\n\n/**\n * Cache entry with metadata\n */\ninterface CacheEntry {\n data: T\n timestamp: number\n expiresAt: number\n version: string\n}\n\n/**\n * In-memory cache store\n */\nclass MemoryCache {\n private cache: Map> = new Map()\n private maxSize: number = 50 * 1024 * 1024 // 50MB\n private currentSize: number = 0\n\n /**\n * Get item from memory cache\n */\n get(key: string): T | null {\n const entry = this.cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n this.delete(key)\n return null\n }\n\n return entry.data as T\n }\n\n /**\n * Set item in memory cache\n */\n set(key: string, value: T, ttl: number, version: string = 'v1'): void {\n const now = Date.now()\n const entry: CacheEntry = {\n data: value,\n timestamp: now,\n expiresAt: now + (ttl * 1000),\n version\n }\n\n // Estimate size (rough approximation)\n const entrySize = JSON.stringify(entry).length * 2 // UTF-16\n\n // Check if we need to evict\n if (this.currentSize + entrySize > this.maxSize) {\n this.evictLRU(entrySize)\n }\n\n // Delete old entry if exists\n if (this.cache.has(key)) {\n this.delete(key)\n }\n\n this.cache.set(key, entry)\n this.currentSize += entrySize\n }\n\n /**\n * Delete item from memory cache\n */\n delete(key: string): boolean {\n const entry = this.cache.get(key)\n if (entry) {\n const entrySize = JSON.stringify(entry).length * 2\n this.currentSize -= entrySize\n return this.cache.delete(key)\n }\n return false\n }\n\n /**\n * Clear all items from memory cache\n */\n clear(): void {\n this.cache.clear()\n this.currentSize = 0\n }\n\n /**\n * Get cache statistics\n */\n getStats(): { size: number; count: number } {\n return {\n size: this.currentSize,\n count: this.cache.size\n }\n }\n\n /**\n * Evict least recently used items to make space\n */\n private evictLRU(neededSpace: number): void {\n // Sort by timestamp (oldest first)\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp\n )\n\n let freedSpace = 0\n for (const [key, entry] of entries) {\n if (freedSpace >= neededSpace) break\n\n const entrySize = JSON.stringify(entry).length * 2\n this.delete(key)\n freedSpace += entrySize\n }\n }\n\n /**\n * Delete items matching a pattern\n */\n invalidatePattern(pattern: string): number {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n let count = 0\n for (const key of this.cache.keys()) {\n if (regex.test(key)) {\n this.delete(key)\n count++\n }\n }\n\n return count\n }\n}\n\n/**\n * Cache result with source information\n */\nexport interface CacheResult {\n data: T | null\n source: 'memory' | 'kv' | 'miss'\n hit: boolean\n timestamp?: number\n ttl?: number\n}\n\n/**\n * Main cache service with multi-tier support\n */\nexport class CacheService {\n private memoryCache: MemoryCache\n private config: CacheConfig\n private stats: CacheStats\n private kvNamespace?: KVNamespace\n\n constructor(config: CacheConfig, kvNamespace?: KVNamespace) {\n this.memoryCache = new MemoryCache()\n this.config = config\n this.kvNamespace = kvNamespace\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Get value from cache (tries memory first, then KV)\n */\n async get(key: string): Promise {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n return memoryValue\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return kvValue as T\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return null\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise> {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n\n const entry = await this.getEntry(key)\n return {\n data: memoryValue,\n source: 'memory',\n hit: true,\n timestamp: entry?.timestamp,\n ttl: entry?.ttl\n }\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return {\n data: kvValue as T,\n source: 'kv',\n hit: true\n }\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return {\n data: null,\n source: 'miss',\n hit: false\n }\n }\n\n /**\n * Set value in cache (stores in both memory and KV)\n */\n async set(\n key: string,\n value: T,\n customConfig?: Partial\n ): Promise {\n const config = { ...this.config, ...customConfig }\n\n // Store in memory cache (Tier 1)\n if (config.memoryEnabled) {\n this.memoryCache.set(key, value, config.ttl, config.version)\n }\n\n // Store in KV cache (Tier 2)\n if (config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.put(key, JSON.stringify(value), {\n expirationTtl: config.ttl\n })\n } catch (error) {\n console.error('KV cache write error:', error)\n }\n }\n }\n\n /**\n * Delete value from cache (removes from both memory and KV)\n */\n async delete(key: string): Promise {\n // Delete from memory (Tier 1)\n if (this.config.memoryEnabled) {\n this.memoryCache.delete(key)\n }\n\n // Delete from KV (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.delete(key)\n } catch (error) {\n console.error('KV cache delete error:', error)\n }\n }\n }\n\n /**\n * Clear all cache entries for this namespace\n */\n async clear(): Promise {\n if (this.config.memoryEnabled) {\n this.memoryCache.clear()\n }\n\n // Reset stats\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Invalidate cache entries matching a pattern\n */\n async invalidate(pattern: string): Promise {\n let count = 0\n\n // Invalidate from memory (Tier 1)\n if (this.config.memoryEnabled) {\n count += this.memoryCache.invalidatePattern(pattern)\n }\n\n // Invalidate from KV (Tier 2)\n // Note: KV doesn't support pattern matching, so we need to list all keys\n // This is expensive and should be used sparingly\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n // List all keys with the namespace prefix\n const prefix = this.config.namespace + ':'\n const list = await this.kvNamespace.list({ prefix })\n\n for (const key of list.keys) {\n if (regex.test(key.name)) {\n await this.kvNamespace.delete(key.name)\n count++\n }\n }\n } catch (error) {\n console.error('KV cache invalidation error:', error)\n }\n }\n\n return count\n }\n\n /**\n * Invalidate cache entries matching a pattern (alias for invalidate)\n */\n async invalidatePattern(pattern: string): Promise {\n return this.invalidate(pattern)\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const memStats = this.memoryCache.getStats()\n\n return {\n ...this.stats,\n memorySize: memStats.size,\n entryCount: memStats.count\n }\n }\n\n /**\n * Update hit rate calculation\n */\n private updateHitRate(): void {\n const totalHits = this.stats.memoryHits + this.stats.kvHits + this.stats.dbHits\n this.stats.hitRate = this.stats.totalRequests > 0\n ? (totalHits / this.stats.totalRequests) * 100\n : 0\n }\n\n /**\n * Generate a cache key using the configured namespace\n */\n generateKey(type: string, identifier: string): string {\n return generateCacheKey(\n this.config.namespace,\n type,\n identifier,\n this.config.version\n )\n }\n\n /**\n * Warm cache with multiple entries\n */\n async warmCache(entries: Array<{ key: string; value: T }>): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value)\n }\n }\n\n /**\n * Check if a key exists in cache\n */\n async has(key: string): Promise {\n const value = await this.get(key)\n return value !== null\n }\n\n /**\n * Get multiple values at once\n */\n async getMany(keys: string[]): Promise> {\n const results = new Map()\n\n for (const key of keys) {\n const value = await this.get(key)\n if (value !== null) {\n results.set(key, value)\n }\n }\n\n return results\n }\n\n /**\n * Set multiple values at once\n */\n async setMany(\n entries: Array<{ key: string; value: T }>,\n customConfig?: Partial\n ): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value, customConfig)\n }\n }\n\n /**\n * Delete multiple keys at once\n */\n async deleteMany(keys: string[]): Promise {\n for (const key of keys) {\n await this.delete(key)\n }\n }\n\n /**\n * Get or set pattern - fetch from cache or compute if not found\n */\n async getOrSet(\n key: string,\n fetcher: () => Promise,\n customConfig?: Partial\n ): Promise {\n // Try to get from cache\n const cached = await this.get(key)\n if (cached !== null) {\n return cached\n }\n\n // Fetch from source\n const value = await fetcher()\n\n // Store in cache\n await this.set(key, value, customConfig)\n\n return value\n }\n\n /**\n * List all cache keys with metadata\n */\n async listKeys(): Promise> {\n const keys: Array<{ key: string; size: number; expiresAt: number; age: number }> = []\n\n // Get keys from memory cache\n if (this.config.memoryEnabled) {\n const cache = (this.memoryCache as any).cache as Map>\n for (const [key, entry] of cache.entries()) {\n const size = JSON.stringify(entry).length * 2\n const age = Date.now() - entry.timestamp\n keys.push({\n key,\n size,\n expiresAt: entry.expiresAt,\n age\n })\n }\n }\n\n // Sort by age (newest first)\n return keys.sort((a, b) => a.age - b.age)\n }\n\n /**\n * Get cache entry with full metadata\n */\n async getEntry(key: string): Promise<{\n data: T\n timestamp: number\n expiresAt: number\n ttl: number\n size: number\n } | null> {\n if (!this.config.memoryEnabled) {\n return null\n }\n\n const cache = (this.memoryCache as any).cache as Map>\n const entry = cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n await this.delete(key)\n return null\n }\n\n const size = JSON.stringify(entry).length * 2\n const ttl = Math.max(0, entry.expiresAt - Date.now()) / 1000\n\n return {\n data: entry.data as T,\n timestamp: entry.timestamp,\n expiresAt: entry.expiresAt,\n ttl,\n size\n }\n }\n}\n\n/**\n * Create a cache service instance with configuration\n */\nexport function createCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n return new CacheService(config, kvNamespace)\n}\n\n/**\n * Global cache instances by namespace (singleton pattern)\n */\nconst cacheInstances = new Map()\nlet globalKVNamespace: KVNamespace | undefined\n\n/**\n * Set global KV namespace for all cache instances\n */\nexport function setGlobalKVNamespace(kvNamespace: KVNamespace): void {\n globalKVNamespace = kvNamespace\n}\n\n/**\n * Get or create a cache service for a namespace\n */\nexport function getCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n const key = config.namespace\n\n if (!cacheInstances.has(key)) {\n // Use provided KV namespace or global one\n const kv = kvNamespace || globalKVNamespace\n cacheInstances.set(key, new CacheService(config, kv))\n }\n\n return cacheInstances.get(key)!\n}\n\n/**\n * Clear all cache instances\n */\nexport async function clearAllCaches(): Promise {\n for (const cache of cacheInstances.values()) {\n await cache.clear()\n }\n}\n\n/**\n * Get stats from all cache instances\n */\nexport function getAllCacheStats(): Record {\n const stats: Record = {}\n\n for (const [namespace, cache] of cacheInstances.entries()) {\n stats[namespace] = cache.getStats()\n }\n\n return stats\n}\n","/**\n * Event Bus for Cache Invalidation\n *\n * Provides a centralized event system for triggering cache invalidation\n * based on application events.\n */\n\nexport type EventHandler = (data?: any) => Promise | void\n\n// interface EventSubscription {\n// event: string\n// handler: EventHandler\n// }\n\nclass EventBus {\n private subscriptions: Map = new Map()\n private eventLog: Array<{ event: string; timestamp: number; data?: any }> = []\n private maxLogSize: number = 100\n\n /**\n * Subscribe to an event\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.subscriptions.has(event)) {\n this.subscriptions.set(event, [])\n }\n\n this.subscriptions.get(event)!.push(handler)\n\n // Return unsubscribe function\n return () => {\n const handlers = this.subscriptions.get(event)\n if (handlers) {\n const index = handlers.indexOf(handler)\n if (index > -1) {\n handlers.splice(index, 1)\n }\n }\n }\n }\n\n /**\n * Emit an event to all subscribers\n */\n async emit(event: string, data?: any): Promise {\n // Log the event\n this.logEvent(event, data)\n\n const handlers = this.subscriptions.get(event) || []\n\n // Execute all handlers\n await Promise.all(\n handlers.map(async (handler) => {\n try {\n await handler(data)\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error)\n }\n })\n )\n\n // Also emit to wildcard subscribers\n const wildcardHandlers = this.subscriptions.get('*') || []\n await Promise.all(\n wildcardHandlers.map(async (handler) => {\n try {\n await handler({ event, data })\n } catch (error) {\n console.error(`Error in wildcard event handler for ${event}:`, error)\n }\n })\n )\n }\n\n /**\n * Remove all subscribers for an event\n */\n off(event: string): void {\n this.subscriptions.delete(event)\n }\n\n /**\n * Get all registered events\n */\n getEvents(): string[] {\n return Array.from(this.subscriptions.keys())\n }\n\n /**\n * Get subscriber count for an event\n */\n getSubscriberCount(event: string): number {\n return this.subscriptions.get(event)?.length || 0\n }\n\n /**\n * Log an event for debugging\n */\n private logEvent(event: string, data?: any): void {\n this.eventLog.push({\n event,\n timestamp: Date.now(),\n data\n })\n\n // Keep log size manageable\n if (this.eventLog.length > this.maxLogSize) {\n this.eventLog.shift()\n }\n }\n\n /**\n * Get recent event log\n */\n getEventLog(limit: number = 50): Array<{ event: string; timestamp: number; data?: any }> {\n return this.eventLog.slice(-limit)\n }\n\n /**\n * Clear event log\n */\n clearEventLog(): void {\n this.eventLog = []\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n totalEvents: number\n totalSubscriptions: number\n eventCounts: Record\n } {\n const eventCounts: Record = {}\n\n for (const log of this.eventLog) {\n eventCounts[log.event] = (eventCounts[log.event] || 0) + 1\n }\n\n return {\n totalEvents: this.eventLog.length,\n totalSubscriptions: this.subscriptions.size,\n eventCounts\n }\n }\n}\n\n// Global event bus instance\nlet globalEventBus: EventBus | null = null\n\n/**\n * Get or create the global event bus\n */\nexport function getEventBus(): EventBus {\n if (!globalEventBus) {\n globalEventBus = new EventBus()\n }\n return globalEventBus\n}\n\n/**\n * Convenience function to emit an event\n */\nexport async function emitEvent(event: string, data?: any): Promise {\n const bus = getEventBus()\n await bus.emit(event, data)\n}\n\n/**\n * Convenience function to subscribe to an event\n */\nexport function onEvent(event: string, handler: EventHandler): () => void {\n const bus = getEventBus()\n return bus.on(event, handler)\n}\n","/**\n * Cache Invalidation Service\n *\n * Automatically invalidates cache entries based on application events\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\nimport { getEventBus, onEvent } from './event-bus.js'\n\n/**\n * Setup automatic cache invalidation based on events\n */\nexport function setupCacheInvalidation(): void {\n const _eventBus = getEventBus()\n\n // Content cache invalidation\n setupContentInvalidation()\n\n // User cache invalidation\n setupUserInvalidation()\n\n // Config cache invalidation\n setupConfigInvalidation()\n\n // Media cache invalidation\n setupMediaInvalidation()\n\n // API cache invalidation\n setupAPIInvalidation()\n\n // Collection cache invalidation\n setupCollectionInvalidation()\n\n console.log('Cache invalidation listeners registered')\n}\n\n/**\n * Content cache invalidation\n */\nfunction setupContentInvalidation(): void {\n const config = CACHE_CONFIGS.content\n if (!config) return\n const contentCache = getCacheService(config)\n\n // Invalidate on content updates\n onEvent('content.create', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.create')\n })\n\n onEvent('content.update', async (data) => {\n if (data?.id) {\n // Invalidate specific content item\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n // Invalidate all content lists\n await contentCache.invalidate('content:list:*')\n console.log('Cache invalidated: content.update', data?.id)\n })\n\n onEvent('content.delete', async (data) => {\n if (data?.id) {\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.delete', data?.id)\n })\n\n onEvent('content.publish', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.publish')\n })\n}\n\n/**\n * User cache invalidation\n */\nfunction setupUserInvalidation(): void {\n const config = CACHE_CONFIGS.user\n if (!config) return\n const userCache = getCacheService(config)\n\n onEvent('user.update', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.update', data?.id)\n })\n\n onEvent('user.delete', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.delete', data?.id)\n })\n\n onEvent('auth.login', async (data) => {\n if (data?.userId) {\n await userCache.delete(userCache.generateKey('id', data.userId))\n }\n console.log('Cache invalidated: auth.login', data?.userId)\n })\n\n onEvent('auth.logout', async (data) => {\n // Clear session cache\n const sessionConfig = CACHE_CONFIGS.session\n if (sessionConfig) {\n const sessionCache = getCacheService(sessionConfig)\n if (data?.sessionId) {\n await sessionCache.delete(sessionCache.generateKey('session', data.sessionId))\n }\n }\n console.log('Cache invalidated: auth.logout')\n })\n}\n\n/**\n * Config cache invalidation\n */\nfunction setupConfigInvalidation(): void {\n const configConfig = CACHE_CONFIGS.config\n if (!configConfig) return\n const configCache = getCacheService(configConfig)\n\n onEvent('config.update', async (_data) => {\n await configCache.invalidate('config:*')\n console.log('Cache invalidated: config.update')\n })\n\n onEvent('plugin.activate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.activate', data?.pluginId)\n })\n\n onEvent('plugin.deactivate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.deactivate', data?.pluginId)\n })\n\n onEvent('plugin.update', async (data) => {\n const pluginConfig = CACHE_CONFIGS.plugin\n if (!pluginConfig) return\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n console.log('Cache invalidated: plugin.update', data?.pluginId)\n })\n}\n\n/**\n * Media cache invalidation\n */\nfunction setupMediaInvalidation(): void {\n const config = CACHE_CONFIGS.media\n if (!config) return\n const mediaCache = getCacheService(config)\n\n onEvent('media.upload', async (_data) => {\n await mediaCache.invalidate('media:*')\n console.log('Cache invalidated: media.upload')\n })\n\n onEvent('media.delete', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.delete', data?.id)\n })\n\n onEvent('media.update', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.update', data?.id)\n })\n}\n\n/**\n * API cache invalidation (depends on content changes)\n */\nfunction setupAPIInvalidation(): void {\n const config = CACHE_CONFIGS.api\n if (!config) return\n const apiCache = getCacheService(config)\n\n onEvent('content.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.update)')\n })\n\n onEvent('content.publish', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.publish)')\n })\n\n onEvent('content.create', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.create)')\n })\n\n onEvent('content.delete', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.delete)')\n })\n\n onEvent('collection.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (collection.update)')\n })\n}\n\n/**\n * Collection cache invalidation\n */\nfunction setupCollectionInvalidation(): void {\n const config = CACHE_CONFIGS.collection\n if (!config) return\n const collectionCache = getCacheService(config)\n\n onEvent('collection.create', async (_data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.create')\n })\n\n onEvent('collection.update', async (data) => {\n if (data?.id) {\n await collectionCache.delete(collectionCache.generateKey('item', data.id))\n }\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.update', data?.id)\n })\n\n onEvent('collection.delete', async (data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.delete', data?.id)\n })\n}\n\n/**\n * Get invalidation statistics\n */\nexport function getCacheInvalidationStats() {\n const eventBus = getEventBus()\n return eventBus.getStats()\n}\n\n/**\n * Get recent invalidation events\n */\nexport function getRecentInvalidations(limit: number = 50) {\n const eventBus = getEventBus()\n return eventBus.getEventLog(limit)\n}\n","/**\n * Cache Warming Utilities\n *\n * Utilities for preloading and warming cache entries\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\n\n/**\n * Warm cache with common queries\n */\nexport async function warmCommonCaches(db: D1Database): Promise<{\n warmed: number\n errors: number\n details: Array<{ namespace: string; count: number }>\n}> {\n let totalWarmed = 0\n let totalErrors = 0\n const details: Array<{ namespace: string; count: number }> = []\n\n try {\n // Warm collection cache\n const collectionCount = await warmCollections(db)\n totalWarmed += collectionCount\n details.push({ namespace: 'collection', count: collectionCount })\n\n // Warm content cache (most recent items)\n const contentCount = await warmRecentContent(db)\n totalWarmed += contentCount\n details.push({ namespace: 'content', count: contentCount })\n\n // Warm media cache (most recent items)\n const mediaCount = await warmRecentMedia(db)\n totalWarmed += mediaCount\n details.push({ namespace: 'media', count: mediaCount })\n\n } catch (error) {\n console.error('Error warming caches:', error)\n totalErrors++\n }\n\n return {\n warmed: totalWarmed,\n errors: totalErrors,\n details\n }\n}\n\n/**\n * Warm collections cache\n */\nasync function warmCollections(db: D1Database): Promise {\n const config = CACHE_CONFIGS.collection\n if (!config) return 0\n const collectionCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare('SELECT * FROM collections WHERE is_active = 1')\n const { results } = await stmt.all()\n\n for (const collection of results as any[]) {\n const key = collectionCache.generateKey('item', collection.id)\n await collectionCache.set(key, collection)\n count++\n }\n\n // Also cache the full list\n const listKey = collectionCache.generateKey('list', 'all')\n await collectionCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming collections cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent content cache\n */\nasync function warmRecentContent(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.content\n if (!config) return 0\n const contentCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM content ORDER BY created_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const content of results as any[]) {\n const key = contentCache.generateKey('item', content.id)\n await contentCache.set(key, content)\n count++\n }\n\n // Cache the list\n const listKey = contentCache.generateKey('list', 'recent')\n await contentCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming content cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent media cache\n */\nasync function warmRecentMedia(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.media\n if (!config) return 0\n const mediaCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const media of results as any[]) {\n const key = mediaCache.generateKey('item', media.id)\n await mediaCache.set(key, media)\n count++\n }\n\n // Cache the list\n const listKey = mediaCache.generateKey('list', 'recent')\n await mediaCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming media cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm specific namespace with custom data\n */\nexport async function warmNamespace(\n namespace: string,\n entries: Array<{ key: string; value: any }>\n): Promise {\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n throw new Error(`Unknown namespace: ${namespace}`)\n }\n\n const cache = getCacheService(config)\n await cache.setMany(entries)\n\n return entries.length\n}\n\n/**\n * Preload cache on application startup\n */\nexport async function preloadCache(db: D1Database): Promise {\n console.log('🔥 Preloading cache...')\n\n const result = await warmCommonCaches(db)\n\n console.log(`✅ Cache preloaded: ${result.warmed} entries across ${result.details.length} namespaces`)\n result.details.forEach(detail => {\n console.log(` - ${detail.namespace}: ${detail.count} entries`)\n })\n\n if (result.errors > 0) {\n console.warn(`⚠️ ${result.errors} errors during cache preloading`)\n }\n}\n\n/**\n * Schedule periodic cache warming\n */\nexport function schedulePeriodicWarming(\n db: D1Database,\n intervalMs: number = 300000 // 5 minutes default\n): NodeJS.Timeout {\n console.log(`⏰ Scheduling periodic cache warming every ${intervalMs / 1000}s`)\n\n return setInterval(async () => {\n try {\n console.log('🔄 Running periodic cache warming...')\n await warmCommonCaches(db)\n } catch (error) {\n console.error('Error during periodic cache warming:', error)\n }\n }, intervalMs)\n}\n","/**\n * Admin Cache Dashboard Template\n *\n * Moved from @sonicjs-cms/templates to avoid circular dependency\n * during build (templates imports from core, core can't import from templates)\n */\n\nimport { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\nexport interface CacheDashboardData {\n stats: Record\n totals: {\n hits: number\n misses: number\n requests: number\n hitRate: string\n memorySize: number\n entryCount: number\n }\n namespaces: string[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCacheDashboard(data: CacheDashboardData): string {\n const pageContent = `\n
\n \n
\n
\n

Cache System

\n

\n Monitor and manage cache performance across all namespaces\n

\n
\n
\n \n \n \n \n Refresh\n \n \n \n \n \n Clear All\n \n
\n
\n\n \n
\n ${renderStatCard('Total Requests', data.totals.requests.toLocaleString(), 'lime', `\n \n \n \n `)}\n\n ${renderStatCard('Hit Rate', data.totals.hitRate + '%', 'blue', `\n \n \n \n `, parseFloat(data.totals.hitRate) > 70 ? 'lime' : parseFloat(data.totals.hitRate) > 40 ? 'amber' : 'red')}\n\n ${renderStatCard('Memory Usage', formatBytes(data.totals.memorySize), 'purple', `\n \n \n \n `)}\n\n ${renderStatCard('Cached Entries', data.totals.entryCount.toLocaleString(), 'sky', `\n \n \n \n `)}\n
\n\n \n
\n
\n

Cache Namespaces

\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ${data.namespaces.map(namespace => {\n const stat = data.stats[namespace]\n if (!stat) return ''\n return renderNamespaceRow(namespace, stat)\n }).join('')}\n \n
\n Namespace\n \n Requests\n \n Hit Rate\n \n Memory Hits\n \n KV Hits\n \n Entries\n \n Size\n \n Actions\n
\n
\n
\n\n \n
\n
\n

Performance Overview

\n
\n
\n
\n ${renderPerformanceMetric('Memory Cache', data.totals.hits, data.totals.misses)}\n ${renderHealthStatus(parseFloat(data.totals.hitRate))}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'clear-all-cache-confirm',\n title: 'Clear All Cache',\n message: 'Are you sure you want to clear all cache entries? This cannot be undone.',\n confirmText: 'Clear All',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearAllCaches()'\n })}\n\n ${renderConfirmationDialog({\n id: 'clear-namespace-cache-confirm',\n title: 'Clear Namespace Cache',\n message: 'Clear cache for this namespace?',\n confirmText: 'Clear',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearNamespaceCache()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Cache System',\n pageTitle: 'Cache System',\n currentPath: '/admin/cache',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderStatCard(label: string, value: string, color: string, icon: string, colorOverride?: string): string {\n const finalColor = colorOverride || color\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n blue: 'bg-blue-50 dark:bg-blue-500/10 text-blue-600 dark:text-blue-400 ring-blue-600/20 dark:ring-blue-500/20',\n purple: 'bg-purple-50 dark:bg-purple-500/10 text-purple-600 dark:text-purple-400 ring-purple-600/20 dark:ring-purple-500/20',\n sky: 'bg-sky-50 dark:bg-sky-500/10 text-sky-600 dark:text-sky-400 ring-sky-600/20 dark:ring-sky-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n
\n
\n
\n
\n ${icon}\n
\n
\n

${label}

\n

${value}

\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderNamespaceRow(namespace: string, stat: CacheStats): string {\n const hitRate = stat.hitRate.toFixed(1)\n const hitRateColor = stat.hitRate > 70 ? 'text-lime-600 dark:text-lime-400' :\n stat.hitRate > 40 ? 'text-amber-600 dark:text-amber-400' :\n 'text-red-600 dark:text-red-400'\n\n return `\n \n \n \n ${namespace}\n \n \n \n ${stat.totalRequests.toLocaleString()}\n \n \n \n ${hitRate}%\n \n \n \n ${stat.memoryHits.toLocaleString()}\n \n \n ${stat.kvHits.toLocaleString()}\n \n \n ${stat.entryCount.toLocaleString()}\n \n \n ${formatBytes(stat.memorySize)}\n \n \n \n Clear\n \n \n \n `\n}\n\nfunction renderPerformanceMetric(label: string, hits: number, misses: number): string {\n const total = hits + misses\n const hitPercentage = total > 0 ? (hits / total) * 100 : 0\n\n return `\n
\n

${label}

\n
\n
\n Hits\n ${hits.toLocaleString()}\n
\n
\n Misses\n ${misses.toLocaleString()}\n
\n
\n
\n Hit Rate\n ${hitPercentage.toFixed(1)}%\n
\n
\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderHealthStatus(hitRate: number): string {\n const status = hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'critical'\n const statusConfig = {\n healthy: {\n label: 'Healthy',\n color: 'lime',\n icon: `\n \n `\n },\n warning: {\n label: 'Needs Attention',\n color: 'amber',\n icon: `\n \n `\n },\n critical: {\n label: 'Critical',\n color: 'red',\n icon: `\n \n `\n }\n }\n\n const config = statusConfig[status]\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n

System Health

\n
\n ${config.icon}\n
\n

${config.label}

\n

\n ${status === 'healthy' ? 'Cache is performing well' :\n status === 'warning' ? 'Consider increasing cache TTL or capacity' :\n 'Cache hit rate is too low'}\n

\n
\n
\n
\n `\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`\n}\n","/**\n * Cache Plugin Routes\n *\n * Admin routes for cache management\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport { getAllCacheStats, clearAllCaches, getCacheService } from './services/cache.js'\nimport { CACHE_CONFIGS, parseCacheKey } from './services/cache-config.js'\nimport { getRecentInvalidations, getCacheInvalidationStats } from './services/cache-invalidation.js'\nimport { warmCommonCaches, warmNamespace } from './services/cache-warming.js'\nimport { renderCacheDashboard, CacheDashboardData } from '../../templates/pages/admin-cache.template'\n\nconst app = new Hono()\n\n/**\n * GET /admin/cache\n * Cache statistics dashboard\n */\napp.get('/', async (c: Context) => {\n const stats = getAllCacheStats()\n const user = c.get('user')\n\n // Calculate totals\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n Object.values(stats).forEach(stat => {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n })\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n const dashboardData: CacheDashboardData = {\n stats,\n totals: {\n hits: totalHits,\n misses: totalMisses,\n requests: totalRequests,\n hitRate: overallHitRate.toFixed(2),\n memorySize: totalSize,\n entryCount: totalEntries\n },\n namespaces: Object.keys(stats),\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCacheDashboard(dashboardData))\n})\n\n/**\n * GET /admin/cache/stats\n * Detailed statistics for all namespaces\n */\napp.get('/stats', async (c: Context) => {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/stats/:namespace\n * Statistics for a specific namespace\n */\napp.get('/stats/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const stats = cache.getStats()\n\n return c.json({\n success: true,\n data: {\n namespace,\n config,\n stats\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear\n * Clear all cache entries\n */\napp.post('/clear', async (c: Context) => {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear/:namespace\n * Clear cache for a specific namespace\n */\napp.post('/clear/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n await cache.clear()\n\n return c.json({\n success: true,\n message: `Cache cleared for namespace: ${namespace}`,\n namespace,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/invalidate\n * Invalidate cache entries matching a pattern\n */\napp.post('/invalidate', async (c: Context) => {\n const body = await c.req.json()\n const { pattern, namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (namespace) {\n // Invalidate from specific namespace\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: namespace || 'all',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/health\n * Cache system health check\n */\napp.get('/health', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // Calculate health metrics\n const namespaces = Object.entries(stats)\n const healthChecks = namespaces.map(([name, stat]) => {\n const hitRate = stat.hitRate\n const memoryUsage = stat.memorySize / (50 * 1024 * 1024) // Assume 50MB max\n\n return {\n namespace: name,\n status: hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'unhealthy',\n hitRate,\n memoryUsage: (memoryUsage * 100).toFixed(2) + '%',\n entryCount: stat.entryCount\n }\n })\n\n const overallStatus = healthChecks.every(h => h.status === 'healthy')\n ? 'healthy'\n : healthChecks.some(h => h.status === 'unhealthy')\n ? 'unhealthy'\n : 'warning'\n\n return c.json({\n success: true,\n data: {\n status: overallStatus,\n namespaces: healthChecks,\n timestamp: new Date().toISOString()\n }\n })\n})\n\n/**\n * GET /admin/cache/browser\n * Browse all cache entries across namespaces\n */\napp.get('/browser', async (c: Context) => {\n const namespace = c.req.query('namespace') || 'all'\n const search = c.req.query('search') || ''\n const sortBy = c.req.query('sort') || 'age' // age, size, key\n const limit = parseInt(c.req.query('limit') || '100')\n\n const entries: Array<{\n namespace: string\n key: string\n size: number\n age: number\n ttl: number\n expiresAt: number\n parsed: any\n }> = []\n\n const namespaces = namespace === 'all'\n ? Object.keys(CACHE_CONFIGS)\n : [namespace]\n\n for (const ns of namespaces) {\n const config = CACHE_CONFIGS[ns]\n if (!config) continue\n\n const cache = getCacheService(config)\n const keys = await cache.listKeys()\n\n for (const keyInfo of keys) {\n // Apply search filter\n if (search && !keyInfo.key.toLowerCase().includes(search.toLowerCase())) {\n continue\n }\n\n const parsed = parseCacheKey(keyInfo.key)\n const ttl = Math.max(0, keyInfo.expiresAt - Date.now()) / 1000\n\n entries.push({\n namespace: ns,\n key: keyInfo.key,\n size: keyInfo.size,\n age: keyInfo.age,\n ttl,\n expiresAt: keyInfo.expiresAt,\n parsed\n })\n }\n }\n\n // Sort entries\n if (sortBy === 'size') {\n entries.sort((a, b) => b.size - a.size)\n } else if (sortBy === 'age') {\n entries.sort((a, b) => a.age - b.age)\n } else if (sortBy === 'key') {\n entries.sort((a, b) => a.key.localeCompare(b.key))\n }\n\n // Limit results\n const limitedEntries = entries.slice(0, limit)\n\n return c.json({\n success: true,\n data: {\n entries: limitedEntries,\n total: entries.length,\n showing: limitedEntries.length,\n namespace,\n search,\n sortBy\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/browser/:namespace/:key\n * Get detailed information about a specific cache entry\n */\napp.get('/browser/:namespace/:key', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const key = decodeURIComponent(c.req.param('key')!)\n\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const entry = await cache.getEntry(key)\n\n if (!entry) {\n return c.json({\n success: false,\n error: 'Cache entry not found or expired'\n }, 404)\n }\n\n const parsed = parseCacheKey(key)\n\n return c.json({\n success: true,\n data: {\n key,\n namespace,\n parsed,\n ...entry,\n createdAt: new Date(entry.timestamp).toISOString(),\n expiresAt: new Date(entry.expiresAt).toISOString()\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics\n * Advanced cache analytics\n */\napp.get('/analytics', async (c: Context) => {\n const stats = getAllCacheStats()\n const invalidationStats = getCacheInvalidationStats()\n const recentInvalidations = getRecentInvalidations(20)\n\n // Calculate analytics\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n const namespacesAnalytics = []\n\n for (const [namespace, stat] of Object.entries(stats)) {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n\n const totalRequests = stat.memoryHits + stat.kvHits + stat.memoryMisses + stat.kvMisses\n const hitRate = totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / totalRequests) * 100 : 0\n const avgEntrySize = stat.entryCount > 0 ? stat.memorySize / stat.entryCount : 0\n\n namespacesAnalytics.push({\n namespace,\n hitRate: hitRate.toFixed(2),\n totalRequests,\n memoryHitRate: totalRequests > 0 ? ((stat.memoryHits / totalRequests) * 100).toFixed(2) : '0',\n kvHitRate: totalRequests > 0 ? ((stat.kvHits / totalRequests) * 100).toFixed(2) : '0',\n avgEntrySize: Math.round(avgEntrySize),\n totalSize: stat.memorySize,\n entryCount: stat.entryCount,\n efficiency: totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / (stat.memoryHits + stat.kvHits + stat.dbHits + 1)).toFixed(2) : '0'\n })\n }\n\n // Sort by hit rate\n namespacesAnalytics.sort((a, b) => parseFloat(b.hitRate) - parseFloat(a.hitRate))\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n // Calculate cost savings (assume 50ms per DB query vs 2ms for cache)\n const dbQueriesAvoided = totalHits\n const timeSaved = dbQueriesAvoided * 48 // 48ms saved per cache hit\n const estimatedCostSavings = (dbQueriesAvoided / 1000000) * 0.50 // $0.50 per million queries\n\n return c.json({\n success: true,\n data: {\n overview: {\n totalHits,\n totalMisses,\n totalRequests,\n overallHitRate: overallHitRate.toFixed(2),\n totalSize,\n totalEntries,\n avgEntrySize: totalEntries > 0 ? Math.round(totalSize / totalEntries) : 0\n },\n performance: {\n dbQueriesAvoided,\n timeSavedMs: timeSaved,\n timeSavedMinutes: (timeSaved / 1000 / 60).toFixed(2),\n estimatedCostSavings: estimatedCostSavings.toFixed(4)\n },\n namespaces: namespacesAnalytics,\n invalidation: {\n ...invalidationStats,\n recent: recentInvalidations\n }\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/trends\n * Cache trends over time (simplified - would need historical data storage)\n */\napp.get('/analytics/trends', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // For now, return current snapshot as a data point\n // In production, this would query historical data\n const dataPoint = {\n timestamp: Date.now(),\n stats: Object.entries(stats).map(([namespace, stat]) => ({\n namespace,\n hitRate: stat.hitRate,\n entryCount: stat.entryCount,\n memorySize: stat.memorySize,\n totalRequests: stat.totalRequests\n }))\n }\n\n return c.json({\n success: true,\n data: {\n trends: [dataPoint],\n note: 'Historical trends require persistent storage. This returns current snapshot only.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/top-keys\n * Most accessed cache keys (would need hit tracking)\n */\napp.get('/analytics/top-keys', async (c: Context) => {\n const _namespace = c.req.query('namespace') || 'all'\n const _limit = parseInt(c.req.query('limit') || '10')\n\n // This is a placeholder - would need per-key hit tracking\n return c.json({\n success: true,\n data: {\n topKeys: [],\n note: 'Top keys tracking requires per-key hit counting. Feature not yet implemented.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/warm\n * Warm cache with common queries\n */\napp.post('/warm', async (c: Context) => {\n try {\n const db = c.env.DB as D1Database\n const result = await warmCommonCaches(db)\n\n return c.json({\n success: true,\n message: 'Cache warming completed',\n ...result,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Cache warming error:', error)\n return c.json({\n success: false,\n error: 'Cache warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * POST /admin/cache/warm/:namespace\n * Warm specific namespace cache\n */\napp.post('/warm/:namespace', async (c: Context) => {\n try {\n const namespace = c.req.param('namespace')!\n const body = await c.req.json()\n const { entries } = body\n\n if (!entries || !Array.isArray(entries)) {\n return c.json({\n success: false,\n error: 'Entries array is required'\n }, 400)\n }\n\n const count = await warmNamespace(namespace, entries)\n\n return c.json({\n success: true,\n message: `Warmed ${count} entries in namespace: ${namespace}`,\n namespace,\n count,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Namespace warming error:', error)\n return c.json({\n success: false,\n error: 'Namespace warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Cache Plugin\n *\n * Three-tiered caching system for SonicJS\n * - Tier 1: In-Memory (fastest, region-specific)\n * - Tier 2: Cloudflare KV (fast, global)\n * - Tier 3: Database (source of truth)\n */\n\nimport type { Context } from 'hono'\nimport type { PluginContext } from '@sonicjs-cms/core'\nimport { getCacheService, clearAllCaches, getAllCacheStats } from './services/cache.js'\nimport { CACHE_CONFIGS } from './services/cache-config.js'\nimport { setupCacheInvalidation } from './services/cache-invalidation.js'\nimport cacheRoutes from './routes.js'\n\nexport class CachePlugin {\n private _context: PluginContext | null = null\n\n /**\n * Get plugin routes\n */\n getRoutes() {\n return cacheRoutes\n }\n\n /**\n * Activate the cache plugin\n */\n async activate(context: PluginContext): Promise {\n this._context = context\n\n const settings = context.config || {}\n\n console.log('✅ Cache plugin activated', {\n memoryEnabled: settings.memoryEnabled ?? true,\n kvEnabled: settings.kvEnabled ?? false,\n defaultTTL: settings.defaultTTL ?? 3600\n })\n\n // Initialize default cache services\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n\n // Setup event-based cache invalidation\n setupCacheInvalidation()\n }\n\n /**\n * Deactivate the cache plugin\n */\n async deactivate(): Promise {\n console.log('❌ Cache plugin deactivated - clearing all caches')\n await clearAllCaches()\n this._context = null\n }\n\n /**\n * Configure the cache plugin\n */\n async configure(settings: Record): Promise {\n console.log('⚙️ Cache plugin configured', settings)\n\n // Reconfigure all cache instances with new settings\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n }\n\n /**\n * Get cache statistics\n */\n async getStats(c: Context): Promise {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Clear all cache entries\n */\n async clearCache(c: Context): Promise {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Invalidate cache entries matching pattern\n */\n async invalidatePattern(c: Context): Promise {\n const body = await c.req.json()\n const { pattern, namespace: _namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (_namespace) {\n // Invalidate from specific namespace\n const cache = getCacheService(CACHE_CONFIGS[_namespace] || {\n ttl: 3600,\n kvEnabled: false,\n memoryEnabled: true,\n namespace: _namespace,\n invalidateOn: [],\n version: 'v1'\n })\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: _namespace || 'all',\n timestamp: new Date().toISOString()\n })\n }\n}\n\n// Export cache services for use by other plugins/routes when cache plugin is active\nexport {\n getCacheService,\n clearAllCaches,\n getAllCacheStats,\n setGlobalKVNamespace\n} from './services/cache'\nexport { CACHE_CONFIGS, getCacheConfig, generateCacheKey } from './services/cache-config'\nexport type { CacheConfig, CacheStats } from './services/cache-config'\nexport { emitEvent, onEvent, getEventBus } from './services/event-bus'\nexport { getCacheInvalidationStats, getRecentInvalidations } from './services/cache-invalidation'\nexport { warmCommonCaches, warmNamespace, preloadCache } from './services/cache-warming'\n\n// Create and export plugin instance\nconst plugin = new CachePlugin()\nexport default plugin\n","/**\n * SonicJS Favicon SVG\n *\n * Embedded SVG favicon for the admin interface and auth pages.\n * This ensures the favicon is always available without external dependencies.\n */\n\nexport const faviconSvg = `\n\n\n\t\n\t\t\n\t\t\n\t\n\n`;\n","/**\n * Main Application Factory\n *\n * Creates a configured SonicJS application with all core functionality\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport {\n apiRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n testCleanupRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminPluginRoutes,\n adminLogsRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n adminFormsRoutes,\n publicFormsRoutes,\n adminApiReferenceRoutes\n} from './routes'\nimport { getCoreVersion } from './utils/version'\nimport { bootstrapMiddleware } from './middleware/bootstrap'\nimport { metricsMiddleware } from './middleware/metrics'\nimport { csrfProtection } from './middleware/csrf'\nimport { securityHeadersMiddleware } from './middleware/security-headers'\nimport { createDatabaseToolsAdminRoutes } from './plugins/core-plugins/database-tools-plugin/admin-routes'\nimport { createSeedDataAdminRoutes } from './plugins/core-plugins/seed-data-plugin/admin-routes'\nimport { emailPlugin } from './plugins/core-plugins/email-plugin'\nimport { otpLoginPlugin } from './plugins/core-plugins/otp-login-plugin'\nimport { oauthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nimport { userProfilesPlugin } from './plugins/core-plugins/user-profiles'\nimport { aiSearchPlugin } from './plugins/core-plugins/ai-search-plugin'\nimport { createMagicLinkAuthPlugin } from './plugins/available/magic-link-auth'\nimport { securityAuditPlugin } from './plugins/core-plugins/security-audit-plugin'\nimport { securityAuditMiddleware } from './plugins/core-plugins/security-audit-plugin'\nimport { stripePlugin } from './plugins/core-plugins/stripe-plugin'\nimport { requireAuth, requireRole } from './middleware/auth'\nimport { pluginMenuMiddleware } from './middleware/plugin-menu'\nimport { analyticsPlugin } from './plugins/core-plugins/analytics'\nimport { eventsApiRoutes } from './plugins/core-plugins/analytics/routes/api'\nimport cachePlugin from './plugins/cache'\nimport { faviconSvg } from './assets/favicon'\nimport { setAppInstance } from './services/route-metadata'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface Bindings {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n CORS_ORIGINS?: string\n JWT_SECRET?: string\n JWT_EXPIRES_IN?: string\n JWT_REFRESH_GRACE_SECONDS?: string\n BUCKET_NAME?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\nexport interface Variables {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n csrfToken?: string\n pluginMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport interface SonicJSConfig {\n // Collections configuration\n collections?: {\n directory?: string\n autoSync?: boolean\n }\n\n // Plugins configuration\n plugins?: {\n directory?: string\n autoLoad?: boolean\n disableAll?: boolean // Disable all plugins including core plugins\n }\n\n // Custom routes\n routes?: Array<{\n path: string\n handler: Hono\n }>\n\n // Custom middleware\n middleware?: {\n beforeAuth?: Array<(c: Context, next: () => Promise) => Promise>\n afterAuth?: Array<(c: Context, next: () => Promise) => Promise>\n }\n\n // Admin access control\n // Roles allowed to access the /admin panel. Defaults to ['admin'].\n adminAccessRoles?: string[]\n\n // App metadata\n version?: string\n name?: string\n}\n\nexport type SonicJSApp = Hono<{ Bindings: Bindings; Variables: Variables }>\n\n// ============================================================================\n// Application Factory\n// ============================================================================\n\n/**\n * Create a SonicJS application with core functionality\n *\n * @param config - Application configuration\n * @returns Configured Hono application\n *\n * @example\n * ```typescript\n * import { createSonicJSApp } from '@sonicjs-cms/core'\n *\n * const app = createSonicJSApp({\n * collections: {\n * directory: './src/collections',\n * autoSync: true\n * },\n * plugins: {\n * directory: './src/plugins',\n * autoLoad: true\n * }\n * })\n *\n * export default app\n * ```\n */\nexport function createSonicJSApp(config: SonicJSConfig = {}): SonicJSApp {\n const app = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Set app metadata\n const appVersion = config.version || getCoreVersion()\n const appName = config.name || 'SonicJS AI'\n\n // App version middleware\n app.use('*', async (c, next) => {\n c.set('appVersion', appVersion)\n await next()\n })\n\n // Metrics middleware - track all requests for real-time analytics\n app.use('*', metricsMiddleware())\n\n // Bootstrap middleware - runs migrations, syncs collections, and initializes plugins\n app.use('*', bootstrapMiddleware(config))\n\n // Custom middleware - before auth\n if (config.middleware?.beforeAuth) {\n for (const middleware of config.middleware.beforeAuth) {\n app.use('*', middleware)\n }\n }\n\n // Logging middleware\n app.use('*', async (_c, next) => {\n // Logging logic here\n await next()\n })\n\n // Security middleware\n app.use('*', securityHeadersMiddleware())\n\n // CSRF protection middleware\n app.use('*', csrfProtection())\n\n // Custom middleware - after auth\n if (config.middleware?.afterAuth) {\n for (const middleware of config.middleware.afterAuth) {\n app.use('*', middleware)\n }\n }\n\n // Admin panel access control: require authentication and admin role by default\n const adminRoles = config.adminAccessRoles || ['admin']\n app.use('/admin/*', requireAuth())\n app.use('/admin/*', requireRole(adminRoles))\n\n // Plugin dynamic menu items for admin sidebar\n app.use('/admin/*', pluginMenuMiddleware())\n\n // Core routes\n // Routes are being imported incrementally from routes/*\n // Each route is tested and migrated one-by-one\n app.route('/api', apiRoutes)\n app.route('/api/media', apiMediaRoutes)\n app.route('/api/system', apiSystemRoutes)\n app.route('/admin/api', adminApiRoutes)\n app.route('/admin/dashboard', adminDashboardRoutes)\n app.route('/admin/collections', adminCollectionsRoutes)\n app.route('/admin/forms', adminFormsRoutes)\n app.route('/admin/settings', adminSettingsRoutes)\n app.route('/forms', publicFormsRoutes)\n app.route('/api/forms', publicFormsRoutes) // API endpoint for form submissions\n app.route('/admin/api-reference', adminApiReferenceRoutes)\n app.route('/admin/database-tools', createDatabaseToolsAdminRoutes())\n app.route('/admin/seed-data', createSeedDataAdminRoutes())\n app.route('/admin/content', adminContentRoutes)\n app.route('/admin/media', adminMediaRoutes)\n // Security audit middleware - logs auth events (login, register, logout)\n app.use('/auth/*', securityAuditMiddleware())\n\n // Plugin routes - Security Audit (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (securityAuditPlugin.routes && securityAuditPlugin.routes.length > 0) {\n for (const route of securityAuditPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - AI Search (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register AI Search routes first so they take precedence over the generic /:id handler\n if (aiSearchPlugin.routes && aiSearchPlugin.routes.length > 0) {\n for (const route of aiSearchPlugin.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Plugin routes - Cache (dashboard and management API)\n // Fixes GitHub Issue #461: Cache routes were not registered\n app.route('/admin/cache', cachePlugin.getRoutes())\n\n // Plugin routes - OAuth Providers (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (oauthProvidersPlugin.routes && oauthProvidersPlugin.routes.length > 0) {\n for (const route of oauthProvidersPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - User Profiles\n if (userProfilesPlugin.routes && userProfilesPlugin.routes.length > 0) {\n for (const route of userProfilesPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - OTP Login (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register OTP Login routes first so they take precedence over the generic /:id handler\n if (otpLoginPlugin.routes && otpLoginPlugin.routes.length > 0) {\n for (const route of otpLoginPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Analytics (must be before /admin/plugins catch-all)\n if (analyticsPlugin.routes && analyticsPlugin.routes.length > 0) {\n for (const route of analyticsPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Public event tracking API — POST /api/events (open), GET /api/events (admin)\n app.route('/api/events', eventsApiRoutes)\n\n // Plugin routes - Stripe (must be before /admin/plugins catch-all)\n if (stripePlugin.routes && stripePlugin.routes.length > 0) {\n for (const route of stripePlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n app.route('/admin/plugins', adminPluginRoutes)\n app.route('/admin/logs', adminLogsRoutes)\n app.route('/admin', adminUsersRoutes)\n app.route('/auth', authRoutes)\n\n // Test cleanup routes (only for development/test environments)\n app.route('/', testCleanupRoutes)\n\n // Plugin routes - Email\n if (emailPlugin.routes && emailPlugin.routes.length > 0) {\n for (const route of emailPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Magic Link Auth (passwordless authentication via email links)\n const magicLinkPlugin = createMagicLinkAuthPlugin()\n if (magicLinkPlugin.routes && magicLinkPlugin.routes.length > 0) {\n for (const route of magicLinkPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Serve favicon\n app.get('/favicon.svg', (c) => {\n return new Response(faviconSvg, {\n headers: {\n 'Content-Type': 'image/svg+xml',\n 'Cache-Control': 'public, max-age=31536000'\n }\n })\n })\n\n // Serve files from R2 storage (public file access)\n app.get('/files/*', async (c) => {\n try {\n // Extract the path from the URL pathname (everything after /files/)\n const url = new URL(c.req.url)\n const pathname = url.pathname\n\n // Remove the /files/ prefix to get the R2 object key\n const objectKey = pathname.replace(/^\\/files\\//, '')\n\n if (!objectKey) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(objectKey)\n\n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n headers.set('Access-Control-Allow-Origin', '*') // Allow CORS for media files\n headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n headers.set('Access-Control-Allow-Headers', 'Content-Type')\n\n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n })\n\n // Custom routes - User-defined routes\n if (config.routes) {\n for (const route of config.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Root redirect to login\n app.get('/', (c) => {\n return c.redirect('/auth/login')\n })\n\n // Health check\n app.get('/health', (c) => {\n return c.json({\n name: appName,\n version: appVersion,\n status: 'running',\n timestamp: new Date().toISOString()\n })\n })\n\n // Store app instance for route introspection (API reference auto-discovery)\n setAppInstance(app)\n\n // 404 handler\n app.notFound((c) => {\n return c.json({ error: 'Not Found', status: 404 }, 404)\n })\n\n // Error handler\n app.onError((err, c) => {\n console.error(err)\n return c.json({ error: 'Internal Server Error', status: 500 }, 500)\n })\n\n return app\n}\n\n/**\n * Setup core middleware (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreMiddleware(_app: SonicJSApp): void {\n console.warn('setupCoreMiddleware is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n\n/**\n * Setup core routes (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreRoutes(_app: SonicJSApp): void {\n console.warn('setupCoreRoutes is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n","import { drizzle } from 'drizzle-orm/d1';\nimport * as schema from './schema';\n\nexport function createDb(d1: D1Database) {\n return drizzle(d1, { schema });\n}\n\nexport * from './schema';","/**\n * @sonicjs/core - Main Entry Point\n *\n * Core framework for SonicJS headless CMS\n * Built for Cloudflare's edge platform with TypeScript\n *\n * Phase 2 Migration Status:\n * - Week 1: Types, Utils, Database (COMPLETED ✓)\n * - Week 2: Services, Middleware, Plugins (COMPLETED ✓)\n * - Week 3: Routes, Templates (COMPLETED ✓)\n * - Week 4: Integration & Testing (COMPLETED ✓)\n *\n * Test Coverage:\n * - Utilities: 48 tests (sanitize, query-filter, metrics)\n * - Middleware: 51 tests (auth, logging, security, performance)\n * - Total: 99 tests passing\n */\n\n// ============================================================================\n// Main Application API (Phase 2 Week 1)\n// ============================================================================\n\nexport { createSonicJSApp, setupCoreMiddleware, setupCoreRoutes } from './app'\nexport type { SonicJSConfig, SonicJSApp, Bindings, Variables } from './app'\n\n// ============================================================================\n// Placeholders - To be populated in Phase 2\n// ============================================================================\n\n// Services - Week 2 (COMPLETED)\nexport {\n // Collection Management\n loadCollectionConfigs,\n loadCollectionConfig,\n getAvailableCollectionNames,\n validateCollectionConfig,\n registerCollections,\n syncCollections,\n syncCollection,\n isCollectionManaged,\n getManagedCollections,\n cleanupRemovedCollections,\n fullCollectionSync,\n // Form-Collection Sync\n syncAllFormCollections,\n syncFormCollection,\n createContentFromSubmission,\n deriveCollectionSchemaFromFormio,\n deriveSubmissionTitle,\n mapFormStatusToContentStatus,\n backfillFormSubmissions,\n // Database Migrations\n MigrationService,\n // Logging\n Logger,\n getLogger,\n initLogger,\n // Plugin Services - Class implementations\n PluginService as PluginServiceClass,\n PluginBootstrapService,\n} from './services'\n\nexport type { Migration, MigrationStatus, LogLevel, LogCategory, LogEntry, LogFilter, CorePlugin } from './services'\n\n// Middleware - Week 2 (COMPLETED)\nexport {\n // Authentication\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n // Logging\n loggingMiddleware,\n detailedLoggingMiddleware,\n securityLoggingMiddleware,\n performanceLoggingMiddleware,\n // Performance\n cacheHeaders,\n compressionMiddleware,\n securityHeaders,\n // Permissions\n PermissionManager,\n requirePermission,\n requireAnyPermission,\n logActivity,\n // Plugin middleware\n requireActivePlugin,\n requireActivePlugins,\n getActivePlugins,\n isPluginActive,\n // Bootstrap\n bootstrapMiddleware,\n} from './middleware'\n\nexport type { Permission, UserPermissions } from './middleware'\n\n// Plugins - Week 2 (COMPLETED)\nexport {\n // Hook System - Class implementations\n HookSystemImpl,\n ScopedHookSystem as ScopedHookSystemClass,\n HookUtils,\n // Plugin Registry\n PluginRegistryImpl,\n // Plugin Manager - Class implementation\n PluginManager as PluginManagerClass,\n // Plugin Validator - Class implementation\n PluginValidator as PluginValidatorClass,\n} from './plugins'\n\n// Routes - Week 3 (COMPLETED)\nexport {\n ROUTES_INFO,\n apiRoutes,\n apiContentCrudRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminLogsRoutes,\n adminPluginRoutes,\n adminDesignRoutes,\n adminCheckboxRoutes,\n adminTestimonialsRoutes,\n adminCodeExamplesRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n} from './routes'\n\n// Templates - Week 3 (COMPLETED)\nexport {\n // Form templates\n renderForm,\n renderFormField,\n // Table templates\n renderTable,\n // Pagination templates\n renderPagination,\n // Alert templates\n renderAlert,\n // Confirmation dialog templates\n renderConfirmationDialog,\n getConfirmationDialogScript,\n // Filter bar templates\n renderFilterBar,\n} from './templates'\n\nexport type {\n FormField,\n FormData,\n TableColumn,\n TableData,\n PaginationData,\n AlertData,\n ConfirmationDialogOptions,\n FilterBarData,\n Filter,\n FilterOption,\n} from './templates'\n\n// Types - Week 1 (COMPLETED)\nexport type {\n // Collection types\n FieldType,\n FieldConfig,\n CollectionSchema,\n CollectionConfig,\n CollectionConfigModule,\n CollectionSyncResult,\n // Plugin types\n Plugin,\n PluginContext,\n PluginConfig,\n PluginRoutes,\n PluginMiddleware,\n PluginModel,\n PluginService,\n PluginAdminPage,\n PluginComponent,\n PluginMenuItem,\n PluginHook,\n HookHandler,\n HookContext,\n HookSystem,\n ScopedHookSystem,\n PluginRegistry,\n PluginManager,\n PluginStatus,\n AuthService,\n ContentService,\n MediaService,\n PluginLogger,\n PluginBuilderOptions,\n PluginValidator,\n PluginValidationResult,\n HookName,\n // Plugin manifest\n PluginManifest,\n} from './types'\n\nexport { HOOKS } from './types'\n\n// Utils - Week 1 (COMPLETED)\nexport {\n // Sanitization\n escapeHtml,\n sanitizeInput,\n sanitizeObject,\n // Template rendering\n TemplateRenderer,\n templateRenderer,\n renderTemplate,\n // Query filtering\n QueryFilterBuilder,\n buildQuery,\n // Metrics\n metricsTracker,\n // Version\n SONICJS_VERSION,\n getCoreVersion,\n} from './utils'\n\nexport type {\n FilterOperator,\n FilterCondition,\n FilterGroup,\n QueryFilter,\n QueryResult,\n} from './utils'\n\n// Database - Week 1 (COMPLETED)\nexport {\n createDb,\n // Schema exports\n users,\n collections,\n content,\n contentVersions,\n media,\n apiTokens,\n workflowHistory,\n plugins,\n pluginHooks,\n pluginRoutes,\n pluginAssets,\n pluginActivityLog,\n systemLogs,\n logConfig,\n // Zod validation schemas\n insertUserSchema,\n selectUserSchema,\n insertCollectionSchema,\n selectCollectionSchema,\n insertContentSchema,\n selectContentSchema,\n insertMediaSchema,\n selectMediaSchema,\n insertWorkflowHistorySchema,\n selectWorkflowHistorySchema,\n insertPluginSchema,\n selectPluginSchema,\n insertPluginHookSchema,\n selectPluginHookSchema,\n insertPluginRouteSchema,\n selectPluginRouteSchema,\n insertPluginAssetSchema,\n selectPluginAssetSchema,\n insertPluginActivityLogSchema,\n selectPluginActivityLogSchema,\n insertSystemLogSchema,\n selectSystemLogSchema,\n insertLogConfigSchema,\n selectLogConfigSchema,\n} from './db'\n\nexport type {\n User,\n NewUser,\n Collection,\n NewCollection,\n Content,\n NewContent,\n Media,\n NewMedia,\n WorkflowHistory,\n NewWorkflowHistory,\n Plugin as DbPlugin,\n NewPlugin,\n PluginHook as DbPluginHook,\n NewPluginHook,\n PluginRoute,\n NewPluginRoute,\n PluginAsset,\n NewPluginAsset,\n PluginActivityLog,\n NewPluginActivityLog,\n SystemLog,\n NewSystemLog,\n LogConfig,\n NewLogConfig,\n} from './db'\n\n// Plugin SDK (Beta)\nexport { PluginBuilder, PluginHelpers } from './plugins/sdk'\n\n// OAuth Providers Plugin\nexport { oauthProvidersPlugin, createOAuthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nexport { OAuthService, BUILT_IN_PROVIDERS } from './plugins/core-plugins/oauth-providers/oauth-service'\n\n// User Profiles Plugin\nexport { userProfilesPlugin, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig } from './plugins/core-plugins/user-profiles'\nexport type { ProfileFieldDefinition, UserProfileConfig } from './plugins/core-plugins/user-profiles'\n\n// ============================================================================\n// Version\n// ============================================================================\n\n// Import version from package.json\nimport packageJson from '../package.json'\nexport const VERSION = packageJson.version\n\n// ============================================================================\n// Phase 2 Migration Notes\n// ============================================================================\n\n/**\n * This is a work-in-progress package being extracted from the main SonicJS codebase.\n *\n * Current Phase: 2 (Core Module Migration)\n * Current Week: 1 (Types, Utils, Database)\n *\n * Expected completion: 4 weeks from 2025-01-17\n *\n * DO NOT USE IN PRODUCTION - Alpha release for development only\n */\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/core-plugins/database-tools-plugin/services/database-service.ts","../src/templates/pages/admin-database-table.template.ts","../src/plugins/core-plugins/database-tools-plugin/admin-routes.ts","../src/plugins/core-plugins/seed-data-plugin/services/seed-data-service.ts","../src/plugins/core-plugins/seed-data-plugin/admin-routes.ts","../src/plugins/core-plugins/email-plugin/index.ts","../src/plugins/core-plugins/otp-login-plugin/otp-service.ts","../src/plugins/core-plugins/otp-login-plugin/email-templates.ts","../src/plugins/core-plugins/otp-login-plugin/index.ts","../src/plugins/core-plugins/oauth-providers/oauth-service.ts","../src/plugins/core-plugins/oauth-providers/index.ts","../src/plugins/core-plugins/ai-search-plugin/services/embedding.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/chunking.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/custom-rag.service.ts","../src/plugins/core-plugins/ai-search-plugin/services/ai-search.ts","../src/plugins/core-plugins/ai-search-plugin/services/indexer.ts","../src/plugins/core-plugins/ai-search-plugin/components/settings-page.ts","../src/plugins/core-plugins/ai-search-plugin/routes/admin.ts","../src/plugins/core-plugins/ai-search-plugin/routes/api.ts","../src/plugins/core-plugins/ai-search-plugin/manifest.json","../src/plugins/core-plugins/ai-search-plugin/index.ts","../src/plugins/available/magic-link-auth/index.ts","../src/plugins/core-plugins/security-audit-plugin/types.ts","../src/plugins/core-plugins/security-audit-plugin/services/security-audit-service.ts","../src/plugins/core-plugins/security-audit-plugin/components/dashboard-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/event-log-page.ts","../src/plugins/core-plugins/security-audit-plugin/components/settings-page.ts","../src/plugins/core-plugins/security-audit-plugin/routes/admin.ts","../src/plugins/core-plugins/security-audit-plugin/services/brute-force-detector.ts","../src/plugins/core-plugins/security-audit-plugin/routes/api.ts","../src/plugins/core-plugins/security-audit-plugin/middleware/audit-middleware.ts","../src/plugins/core-plugins/security-audit-plugin/index.ts","../src/plugins/core-plugins/stripe-plugin/services/subscription-service.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-event-service.ts","../src/plugins/core-plugins/stripe-plugin/components/subscriptions-page.ts","../src/plugins/core-plugins/stripe-plugin/components/tab-bar.ts","../src/plugins/core-plugins/stripe-plugin/components/events-page.ts","../src/plugins/core-plugins/stripe-plugin/types.ts","../src/plugins/core-plugins/stripe-plugin/routes/admin.ts","../src/plugins/core-plugins/stripe-plugin/services/stripe-api.ts","../src/plugins/core-plugins/stripe-plugin/routes/api.ts","../src/plugins/core-plugins/stripe-plugin/index.ts","../src/middleware/plugin-menu.ts","../src/plugins/types.ts","../src/plugins/core-plugins/analytics/routes/admin.ts","../src/plugins/core-plugins/analytics/index.ts","../src/plugins/core-plugins/analytics/services/event-tracking-service.ts","../src/plugins/core-plugins/analytics/routes/api.ts","../src/plugins/cache/services/cache-config.ts","../src/plugins/cache/services/cache.ts","../src/plugins/cache/services/event-bus.ts","../src/plugins/cache/services/cache-invalidation.ts","../src/plugins/cache/services/cache-warming.ts","../src/templates/pages/admin-cache.template.ts","../src/plugins/cache/routes.ts","../src/plugins/cache/index.ts","../src/assets/favicon.ts","../src/app.ts","../src/db/index.ts","../src/index.ts"],"names":["escapeHtml","router","Hono","plugin","emailPlugin","setCookie","tokenTtl","jwt","content","collections","statusBadge","api_default","z","DEFAULT_SETTINGS","formatTimestamp","severityBadge","eventTypeBadge","adminRoutes","apiRoutes","getSettings","isPluginActive","logPromise","renderPagination","renderAdminLayoutCatalyst","HOOKS","media","renderConfirmationDialog","getConfirmationDialogScript","totalRequests","app"],"mappings":"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","file":"index.js","sourcesContent":["import { D1Database } from '@cloudflare/workers-types'\n\nexport interface TruncateResult {\n success: boolean\n message: string\n tablesCleared: string[]\n adminUserPreserved: boolean\n errors?: string[]\n}\n\nexport interface DatabaseStats {\n tables: Array<{\n name: string\n rowCount: number\n }>\n totalRows: number\n}\n\nexport interface TableData {\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n}\n\nexport class DatabaseToolsService {\n constructor(private db: D1Database) {}\n\n /**\n * Get database statistics\n */\n async getDatabaseStats(): Promise {\n const tables = await this.getTables()\n const stats: DatabaseStats = {\n tables: [],\n totalRows: 0\n }\n\n for (const tableName of tables) {\n try {\n const result = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const rowCount = (result?.count as number) || 0\n \n stats.tables.push({\n name: tableName,\n rowCount\n })\n stats.totalRows += rowCount\n } catch (error) {\n // Skip tables that can't be counted (might be views or system tables)\n console.warn(`Could not count rows in table ${tableName}:`, error)\n }\n }\n\n return stats\n }\n\n /**\n * Get all tables in the database\n */\n private async getTables(): Promise {\n const result = await this.db.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='table' \n AND name NOT LIKE 'sqlite_%'\n ORDER BY name\n `).all()\n\n return result.results?.map((row: any) => row.name) || []\n }\n\n /**\n * Truncate all data except admin user\n */\n async truncateAllData(adminEmail: string): Promise {\n const errors: string[] = []\n const tablesCleared: string[] = []\n let adminUserPreserved = false\n\n try {\n // First, preserve the admin user data\n const adminUser = await this.db.prepare(\n 'SELECT * FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n if (!adminUser) {\n return {\n success: false,\n message: 'Admin user not found. Operation cancelled for safety.',\n tablesCleared: [],\n adminUserPreserved: false,\n errors: ['Admin user not found']\n }\n }\n\n // Define tables to truncate (excluding system tables)\n const tablesToTruncate = [\n 'content',\n 'content_versions', \n 'content_workflow_status',\n 'collections',\n 'media',\n 'sessions',\n 'notifications',\n 'api_tokens',\n 'workflow_history',\n 'scheduled_content',\n 'faqs',\n 'faq_categories',\n 'plugins',\n 'plugin_settings',\n 'email_templates',\n 'email_themes'\n ]\n\n // Check which tables exist\n const existingTables = await this.getTables()\n const tablesToClear = tablesToTruncate.filter(table => \n existingTables.includes(table)\n )\n\n // Clear all data except users table\n for (const tableName of tablesToClear) {\n try {\n await this.db.prepare(`DELETE FROM ${tableName}`).run()\n tablesCleared.push(tableName)\n } catch (error) {\n errors.push(`Failed to clear table ${tableName}: ${error}`)\n console.error(`Error clearing table ${tableName}:`, error)\n }\n }\n\n // Clear users table but preserve admin\n try {\n await this.db.prepare('DELETE FROM users WHERE email != ? OR role != ?')\n .bind(adminEmail, 'admin').run()\n \n // Verify admin user still exists\n const verifyAdmin = await this.db.prepare(\n 'SELECT id FROM users WHERE email = ? AND role = ?'\n ).bind(adminEmail, 'admin').first()\n\n adminUserPreserved = !!verifyAdmin\n tablesCleared.push('users (non-admin)')\n } catch (error) {\n errors.push(`Failed to clear non-admin users: ${error}`)\n console.error('Error clearing non-admin users:', error)\n }\n\n // Reset auto-increment counters if supported\n try {\n await this.db.prepare('DELETE FROM sqlite_sequence').run()\n } catch (error) {\n // sqlite_sequence might not exist, ignore\n }\n\n const message = errors.length > 0 \n ? `Truncation completed with ${errors.length} errors. ${tablesCleared.length} tables cleared.`\n : `Successfully truncated database. ${tablesCleared.length} tables cleared.`\n\n return {\n success: errors.length === 0,\n message,\n tablesCleared,\n adminUserPreserved,\n errors: errors.length > 0 ? errors : undefined\n }\n\n } catch (error) {\n return {\n success: false,\n message: `Database truncation failed: ${error}`,\n tablesCleared,\n adminUserPreserved,\n errors: [String(error)]\n }\n }\n }\n\n /**\n * Create a backup of current data (simplified version)\n */\n async createBackup(): Promise<{ success: boolean; message: string; backupId?: string }> {\n try {\n const backupId = `backup_${Date.now()}`\n const stats = await this.getDatabaseStats()\n \n // In a real implementation, this would export data to a file or cloud storage\n // For now, we'll just log the stats and return success\n console.log(`Backup ${backupId} created with ${stats.totalRows} total rows`)\n \n return {\n success: true,\n message: `Backup created successfully (${stats.totalRows} rows)`,\n backupId\n }\n } catch (error) {\n return {\n success: false,\n message: `Backup failed: ${error}`\n }\n }\n }\n\n /**\n * Get table data with optional pagination and sorting\n */\n async getTableData(\n tableName: string,\n limit: number = 100,\n offset: number = 0,\n sortColumn?: string,\n sortDirection: 'asc' | 'desc' = 'asc'\n ): Promise {\n try {\n // Validate table name to prevent SQL injection\n const tables = await this.getTables()\n if (!tables.includes(tableName)) {\n throw new Error(`Table ${tableName} not found`)\n }\n\n // Get column names\n const pragmaResult = await this.db.prepare(`PRAGMA table_info(${tableName})`).all()\n const columns = pragmaResult.results?.map((col: any) => col.name) || []\n\n // Validate sort column if provided\n if (sortColumn && !columns.includes(sortColumn)) {\n sortColumn = undefined\n }\n\n // Get total row count\n const countResult = await this.db.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).first()\n const totalRows = (countResult?.count as number) || 0\n\n // Build query with optional sorting\n let query = `SELECT * FROM ${tableName}`\n if (sortColumn) {\n query += ` ORDER BY ${sortColumn} ${sortDirection.toUpperCase()}`\n }\n query += ` LIMIT ${limit} OFFSET ${offset}`\n\n // Get paginated data\n const dataResult = await this.db.prepare(query).all()\n\n return {\n tableName,\n columns,\n rows: dataResult.results || [],\n totalRows\n }\n } catch (error) {\n throw new Error(`Failed to fetch table data: ${error}`)\n }\n }\n\n /**\n * Validate database integrity\n */\n async validateDatabase(): Promise<{ valid: boolean; issues: string[] }> {\n const issues: string[] = []\n\n try {\n // Check critical tables exist\n const requiredTables = ['users', 'content', 'collections']\n const existingTables = await this.getTables()\n\n for (const table of requiredTables) {\n if (!existingTables.includes(table)) {\n issues.push(`Critical table missing: ${table}`)\n }\n }\n\n // Check admin user exists\n const adminCount = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM users WHERE role = ?'\n ).bind('admin').first()\n\n if ((adminCount?.count as number) === 0) {\n issues.push('No admin users found')\n }\n\n // Run SQLite integrity check\n try {\n const integrityResult = await this.db.prepare('PRAGMA integrity_check').first()\n if (integrityResult && (integrityResult as any).integrity_check !== 'ok') {\n issues.push(`Database integrity check failed: ${(integrityResult as any).integrity_check}`)\n }\n } catch (error) {\n issues.push(`Could not run integrity check: ${error}`)\n }\n\n } catch (error) {\n issues.push(`Validation error: ${error}`)\n }\n\n return {\n valid: issues.length === 0,\n issues\n }\n }\n}","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\n\nexport interface DatabaseTablePageData {\n user?: {\n name: string\n email: string\n role: string\n }\n tableName: string\n columns: string[]\n rows: any[]\n totalRows: number\n currentPage: number\n pageSize: number\n sortColumn?: string\n sortDirection?: 'asc' | 'desc'\n}\n\nexport function renderDatabaseTablePage(data: DatabaseTablePageData): string {\n const totalPages = Math.ceil(data.totalRows / data.pageSize)\n const startRow = (data.currentPage - 1) * data.pageSize + 1\n const endRow = Math.min(data.currentPage * data.pageSize, data.totalRows)\n\n const pageContent = `\n
\n \n
\n
\n
\n \n \n \n \n Back to Database Tools\n \n
\n

Table: ${data.tableName}

\n

\n Showing ${startRow.toLocaleString()} - ${endRow.toLocaleString()} of ${data.totalRows.toLocaleString()} rows\n

\n
\n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n Refresh\n \n
\n
\n\n \n
\n \n
\n \n \n \n ${data.columns.map(col => `\n \n
\n ${col}\n ${data.sortColumn === col ? `\n \n \n \n ` : `\n \n \n \n `}\n
\n \n `).join('')}\n
\n \n \n ${data.rows.length > 0\n ? data.rows.map((row, idx) => `\n \n ${data.columns.map(col => `\n \n `).join('')}\n \n `).join('')\n : `\n \n \n \n `\n }\n \n
\n ${formatCellValue(row[col])}\n
\n \n \n \n

No data in this table

\n
\n
\n\n \n ${totalPages > 1 ? `\n
\n
\n \n Previous\n \n \n Next\n \n
\n
\n
\n

\n Page ${data.currentPage} of ${totalPages}\n

\n
\n
\n \n
\n
\n
\n ` : ''}\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: `Table: ${data.tableName}`,\n pageTitle: `Database: ${data.tableName}`,\n currentPath: `/admin/database-tools/tables/${data.tableName}`,\n user: data.user,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction generatePageNumbers(currentPage: number, totalPages: number): string {\n const pages: number[] = []\n const maxVisible = 7\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (currentPage <= 4) {\n for (let i = 1; i <= 5; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n } else if (currentPage >= totalPages - 3) {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = totalPages - 4; i <= totalPages; i++) pages.push(i)\n } else {\n pages.push(1)\n pages.push(-1) // ellipsis\n for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i)\n pages.push(-1) // ellipsis\n pages.push(totalPages)\n }\n }\n\n return pages.map(page => {\n if (page === -1) {\n return `\n \n ...\n \n `\n }\n\n const isActive = page === currentPage\n return `\n \n ${page}\n \n `\n }).join('')\n}\n\nfunction escapeHtml(text: string): string {\n const map: Record = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }\n return String(text).replace(/[&<>\"']/g, m => map[m] || m)\n}\n\nfunction formatCellValue(value: any): string {\n if (value === null || value === undefined) {\n return 'null'\n }\n if (typeof value === 'boolean') {\n return `${value}`\n }\n if (typeof value === 'object') {\n return '' + JSON.stringify(value).substring(0, 50) + (JSON.stringify(value).length > 50 ? '...' : '') + ''\n }\n const str = String(value)\n if (str.length > 100) {\n return escapeHtml(str.substring(0, 100)) + '...'\n }\n return escapeHtml(str)\n}\n","import { Hono } from 'hono'\nimport { DatabaseToolsService } from './services/database-service'\nimport { renderDatabaseTablePage, DatabaseTablePageData } from '../../../templates/pages/admin-database-table.template'\nimport { requireAuth } from '../../../middleware'\n\ntype Bindings = {\n DB: D1Database\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n }\n}\n\nexport function createDatabaseToolsAdminRoutes() {\n const router = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Apply authentication middleware\n router.use('*', requireAuth())\n\n // Get database statistics\n router.get('/api/stats', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const stats = await service.getDatabaseStats()\n\n return c.json({\n success: true,\n data: stats\n })\n } catch (error) {\n console.error('Error fetching database stats:', error)\n return c.json({ \n success: false, \n error: 'Failed to fetch database statistics' \n }, 500)\n }\n })\n\n // Truncate all data except admin user\n router.post('/api/truncate', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const body = await c.req.json()\n const { confirmText } = body\n\n // Require confirmation text for safety\n if (confirmText !== 'TRUNCATE ALL DATA') {\n return c.json({\n success: false,\n error: 'Invalid confirmation text. Operation cancelled.'\n }, 400)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.truncateAllData(user.email)\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n tablesCleared: result.tablesCleared,\n adminUserPreserved: result.adminUserPreserved,\n errors: result.errors\n }\n })\n } catch (error) {\n console.error('Error truncating database:', error)\n return c.json({ \n success: false, \n error: 'Failed to truncate database' \n }, 500)\n }\n })\n\n // Create backup\n router.post('/api/backup', async (c) => {\n try {\n const user = c.get('user')\n \n if (!user || user.role !== 'admin') {\n return c.json({ \n success: false, \n error: 'Unauthorized. Admin access required.' \n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const result = await service.createBackup()\n\n return c.json({\n success: result.success,\n message: result.message,\n data: {\n backupId: result.backupId\n }\n })\n } catch (error) {\n console.error('Error creating backup:', error)\n return c.json({ \n success: false, \n error: 'Failed to create backup' \n }, 500)\n }\n })\n\n // Validate database\n router.get('/api/validate', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const validation = await service.validateDatabase()\n\n return c.json({\n success: true,\n data: validation\n })\n } catch (error) {\n console.error('Error validating database:', error)\n return c.json({\n success: false,\n error: 'Failed to validate database'\n }, 500)\n }\n })\n\n // Get table data (API endpoint)\n router.get('/api/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.json({\n success: false,\n error: 'Unauthorized. Admin access required.'\n }, 403)\n }\n\n const tableName = c.req.param('tableName')\n const limit = parseInt(c.req.query('limit') || '100')\n const offset = parseInt(c.req.query('offset') || '0')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, limit, offset, sortColumn, sortDirection)\n\n return c.json({\n success: true,\n data: tableData\n })\n } catch (error) {\n console.error('Error fetching table data:', error)\n return c.json({\n success: false,\n error: `Failed to fetch table data: ${error}`\n }, 500)\n }\n })\n\n // View table data page\n router.get('/tables/:tableName', async (c) => {\n try {\n const user = c.get('user')\n\n if (!user || user.role !== 'admin') {\n return c.redirect('/admin/login')\n }\n\n const tableName = c.req.param('tableName')\n const page = parseInt(c.req.query('page') || '1')\n const pageSize = parseInt(c.req.query('pageSize') || '20')\n const sortColumn = c.req.query('sort')\n const sortDirection = (c.req.query('dir') || 'asc') as 'asc' | 'desc'\n\n const offset = (page - 1) * pageSize\n\n const db = c.env.DB\n const service = new DatabaseToolsService(db)\n const tableData = await service.getTableData(tableName, pageSize, offset, sortColumn, sortDirection)\n\n const pageData: DatabaseTablePageData = {\n user: {\n name: user.email.split('@')[0] || 'Unknown',\n email: user.email,\n role: user.role\n },\n tableName: tableData.tableName,\n columns: tableData.columns,\n rows: tableData.rows,\n totalRows: tableData.totalRows,\n currentPage: page,\n pageSize: pageSize,\n sortColumn: sortColumn,\n sortDirection: sortDirection\n }\n\n return c.html(renderDatabaseTablePage(pageData))\n } catch (error) {\n console.error('Error rendering table page:', error)\n return c.text(`Error: ${error}`, 500)\n }\n })\n\n return router\n}","import type { D1Database } from '@cloudflare/workers-types'\n\nexport class SeedDataService {\n constructor(private db: D1Database) {}\n\n // First names for generating realistic users\n private firstNames = [\n 'Emma', 'Liam', 'Olivia', 'Noah', 'Ava', 'Ethan', 'Sophia', 'Mason',\n 'Isabella', 'William', 'Mia', 'James', 'Charlotte', 'Benjamin', 'Amelia',\n 'Lucas', 'Harper', 'Henry', 'Evelyn', 'Alexander'\n ]\n\n // Last names for generating realistic users\n private lastNames = [\n 'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis',\n 'Rodriguez', 'Martinez', 'Hernandez', 'Lopez', 'Gonzalez', 'Wilson', 'Anderson',\n 'Thomas', 'Taylor', 'Moore', 'Jackson', 'Martin'\n ]\n\n // Content titles for blog posts\n private blogTitles = [\n 'Getting Started with Modern Web Development',\n 'The Future of JavaScript Frameworks',\n 'Building Scalable Applications with Microservices',\n 'Understanding TypeScript: A Complete Guide',\n 'Best Practices for API Design',\n 'Introduction to Cloud Computing',\n 'Mastering Git and Version Control',\n 'The Art of Code Review',\n 'Performance Optimization Techniques',\n 'Security Best Practices for Web Apps',\n 'Exploring Serverless Architecture',\n 'Database Design Fundamentals',\n 'Testing Strategies for Modern Apps',\n 'CI/CD Pipeline Implementation',\n 'Mobile-First Development Approach'\n ]\n\n // Content titles for pages\n private pageTitles = [\n 'About Us', 'Contact', 'Privacy Policy', 'Terms of Service',\n 'FAQ', 'Our Team', 'Careers', 'Press Kit',\n 'Support', 'Documentation', 'Pricing', 'Features'\n ]\n\n // Content titles for products\n private productTitles = [\n 'Premium Wireless Headphones',\n 'Smart Watch Pro',\n 'Laptop Stand Adjustable',\n 'Mechanical Keyboard RGB',\n 'HD Webcam 4K',\n 'USB-C Hub 7-in-1',\n 'Portable SSD 1TB',\n 'Wireless Mouse Ergonomic',\n 'Monitor 27\" 4K',\n 'Desk Lamp LED',\n 'Phone Case Premium',\n 'Tablet Stand Aluminum',\n 'Cable Management Kit',\n 'Power Bank 20000mAh',\n 'Bluetooth Speaker Portable'\n ]\n\n // Content for generating blog posts\n private blogContent = [\n 'This comprehensive guide covers everything you need to know about modern development practices and tools.',\n 'Learn the fundamentals and advanced concepts that will help you build better applications.',\n 'Discover the latest trends and best practices used by industry professionals.',\n 'A deep dive into the technologies and methodologies shaping the future of software development.',\n 'Practical tips and real-world examples to improve your development workflow.',\n 'Explore cutting-edge techniques and proven strategies for building robust applications.',\n 'Master the essential skills needed to excel in modern software development.',\n 'An in-depth look at the tools and frameworks that power today\\'s web applications.',\n 'Step-by-step instructions and expert insights for developers of all levels.',\n 'Understanding the core principles that drive successful software projects.'\n ]\n\n // Generate a random ID\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n\n // Generate a slug from a title\n private generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n }\n\n // Generate random date within the last year\n private randomDate(): Date {\n const now = new Date()\n const yearAgo = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate())\n const randomTime = yearAgo.getTime() + Math.random() * (now.getTime() - yearAgo.getTime())\n return new Date(randomTime)\n }\n\n // Create 20 example users\n async createUsers(): Promise {\n const roles = ['admin', 'editor', 'author', 'viewer']\n // const hashedPassword = await bcrypt.hash('password123', 10)\n const hashedPassword = 'password123' // TODO: Use actual bcrypt hash\n\n let count = 0\n for (let i = 0; i < 20; i++) {\n const firstName = this.firstNames[Math.floor(Math.random() * this.firstNames.length)] || 'John'\n const lastName = this.lastNames[Math.floor(Math.random() * this.lastNames.length)] || 'Doe'\n const username = `${firstName.toLowerCase()}${lastName.toLowerCase()}${i}`\n const email = `${username}@example.com`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n\n const stmt = this.db.prepare(`\n INSERT INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, last_login_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n email,\n username,\n firstName,\n lastName,\n hashedPassword,\n roles[Math.floor(Math.random() * roles.length)],\n Math.random() > 0.1 ? 1 : 0, // 90% active\n Math.random() > 0.3 ? createdAtTimestamp : null,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Create 200 content items across different types\n async createContent(): Promise {\n // Get all users and collections\n const usersStmt = this.db.prepare('SELECT * FROM users')\n const { results: allUsers } = await usersStmt.all()\n\n const collectionsStmt = this.db.prepare('SELECT * FROM collections')\n const { results: allCollections } = await collectionsStmt.all()\n\n if (!allUsers || allUsers.length === 0) {\n throw new Error('No users found. Please create users first.')\n }\n\n if (!allCollections || allCollections.length === 0) {\n throw new Error('No collections found. Please create collections first.')\n }\n\n const statuses = ['draft', 'published', 'archived']\n\n // Create 200 content items\n let count = 0\n for (let i = 0; i < 200; i++) {\n const collection: any = allCollections[Math.floor(Math.random() * allCollections.length)]\n const author: any = allUsers[Math.floor(Math.random() * allUsers.length)]\n const status = statuses[Math.floor(Math.random() * statuses.length)]\n\n let title: string\n let contentData: any\n\n // Generate content based on collection type\n if (collection.name === 'blog_posts' || collection.name.includes('blog')) {\n title = this.blogTitles[Math.floor(Math.random() * this.blogTitles.length)] || 'Untitled Blog Post'\n contentData = {\n body: this.blogContent[Math.floor(Math.random() * this.blogContent.length)] || 'Blog content here',\n excerpt: 'A brief introduction to this article that provides an overview of the main topics covered.',\n tags: this.generateTags(),\n featured: Math.random() > 0.7\n }\n } else if (collection.name === 'pages' || collection.name.includes('page')) {\n title = this.pageTitles[Math.floor(Math.random() * this.pageTitles.length)] || 'Untitled Page'\n contentData = {\n body: 'This is a standard page with important information about our services and policies.',\n template: 'default',\n showInMenu: Math.random() > 0.5\n }\n } else if (collection.name === 'products' || collection.name.includes('product')) {\n title = this.productTitles[Math.floor(Math.random() * this.productTitles.length)] || 'Untitled Product'\n contentData = {\n description: 'High-quality product with excellent features and great value for money.',\n price: (Math.random() * 500 + 10).toFixed(2),\n sku: `SKU-${Math.random().toString(36).substr(2, 9).toUpperCase()}`,\n inStock: Math.random() > 0.2,\n rating: (Math.random() * 2 + 3).toFixed(1) // 3.0 - 5.0\n }\n } else {\n // Generic content\n title = `${collection.display_name || collection.name} Item ${i + 1}`\n contentData = {\n description: 'This is a sample content item with generic data.',\n value: Math.floor(Math.random() * 1000)\n }\n }\n\n const slug = `${this.generateSlug(title)}-${i}`\n const createdAt = this.randomDate()\n const createdAtTimestamp = Math.floor(createdAt.getTime() / 1000)\n const publishedAtTimestamp = status === 'published' ? createdAtTimestamp : null\n\n const stmt = this.db.prepare(`\n INSERT INTO content (id, collection_id, slug, title, data, status, published_at, author_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await stmt.bind(\n this.generateId(),\n collection.id,\n slug,\n `${title} ${i}`,\n JSON.stringify(contentData),\n status,\n publishedAtTimestamp,\n author.id,\n createdAtTimestamp,\n createdAtTimestamp\n ).run()\n\n count++\n }\n\n return count\n }\n\n // Generate random tags for blog posts\n private generateTags(): string[] {\n const allTags = [\n 'tutorial', 'guide', 'javascript', 'typescript', 'web-dev',\n 'backend', 'frontend', 'best-practices', 'security', 'performance',\n 'testing', 'deployment', 'cloud', 'database', 'api'\n ]\n\n const numTags = Math.floor(Math.random() * 4) + 1 // 1-4 tags\n const shuffled = allTags.sort(() => 0.5 - Math.random())\n return shuffled.slice(0, numTags)\n }\n\n // Seed all data\n async seedAll(): Promise<{ users: number; content: number }> {\n const userCount = await this.createUsers()\n const contentCount = await this.createContent()\n\n return {\n users: userCount,\n content: contentCount\n }\n }\n\n // Clear all seed data (optional cleanup method)\n async clearSeedData(): Promise {\n // Delete content first (due to foreign key constraints)\n const deleteContentStmt = this.db.prepare('DELETE FROM content')\n await deleteContentStmt.run()\n\n // Delete users (but keep admin users)\n const deleteUsersStmt = this.db.prepare(\n \"DELETE FROM users WHERE role != 'admin'\"\n )\n await deleteUsersStmt.run()\n }\n}\n","import { Hono } from 'hono'\nimport { SeedDataService } from './services/seed-data-service'\n\ntype Bindings = {\n DB: D1Database\n}\n\nexport function createSeedDataAdminRoutes() {\n const routes = new Hono<{ Bindings: Bindings }>()\n\n // Get seed data status/info\n routes.get('/', async (c) => {\n const html = `\n \n \n \n Seed Data - SonicJS Admin\n \n \n \n \n \n
\n ← Back to Plugin Settings\n

🌱 Seed Data Generator

\n

\n Generate realistic example data for testing and development. This will create 20 users and 200 content items with realistic data.\n

\n\n
\n ⚠️ Warning: This will create new data in your database. Make sure you're not running this in production!\n
\n\n
\n
\n\n
\n

What will be created?

\n
    \n
  • 20 Users: With realistic names, emails, and various roles (admin, editor, author, viewer)
  • \n
  • 200 Content Items: Including blog posts, pages, and products with realistic titles and data
  • \n
  • All passwords: Set to \"password123\" for testing
  • \n
  • Random dates: Created within the last year
  • \n
  • Various statuses: Draft, published, and archived content
  • \n
\n
\n\n
\n

Generate Seed Data

\n

Click the button below to generate example data. This may take a few moments.

\n \n
\n\n
\n

Clear Seed Data

\n

Remove all users and content from the database (except admin users).

\n \n
\n
\n\n \n \n \n `\n return c.html(html)\n })\n\n // Generate seed data\n routes.post('/generate', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n const result = await seedService.seedAll()\n\n return c.json({\n success: true,\n users: result.users,\n content: result.content\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n // Clear seed data\n routes.post('/clear', async (c) => {\n try {\n const db = c.env.DB\n const seedService = new SeedDataService(db)\n\n await seedService.clearSeedData()\n\n return c.json({\n success: true\n })\n } catch (error: any) {\n return c.json({\n success: false,\n error: error.message\n }, 500)\n }\n })\n\n return routes\n}\n","/**\n * Email Plugin\n *\n * Send transactional emails using Resend\n * Handles registration, verification, password reset, and one-time codes\n */\n\nimport { Hono } from 'hono'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\n\nexport function createEmailPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'email',\n version: '1.0.0-beta.1',\n description: 'Send transactional emails using Resend'\n })\n\n // Add plugin metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // Create the Email Settings route (POST only - GET is handled by generic plugin settings page)\n const emailRoutes = new Hono()\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // POST endpoint for saving settings\n emailRoutes.post('/settings', async (c: any) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n // Update plugin settings in database\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'email'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving email settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n })\n\n // POST endpoint for test email\n emailRoutes.post('/test', async (c: any) => {\n try {\n const db = c.env.DB\n const body = await c.req.json()\n\n // Load settings from database\n const plugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (!plugin?.settings) {\n return c.json({\n success: false,\n error: 'Email settings not configured. Please save your settings first.'\n }, 400)\n }\n\n const settings = JSON.parse(plugin.settings)\n\n // Validate required settings\n if (!settings.apiKey || !settings.fromEmail || !settings.fromName) {\n return c.json({\n success: false,\n error: 'Missing required settings. Please configure API Key, From Email, and From Name.'\n }, 400)\n }\n\n // Use provided email or fallback to fromEmail\n const toEmail = body.toEmail || settings.fromEmail\n\n // Validate email format\n if (!toEmail.match(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)) {\n return c.json({\n success: false,\n error: 'Invalid email address format'\n }, 400)\n }\n\n // Send test email via Resend API\n const response = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${settings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${settings.fromName} <${settings.fromEmail}>`,\n to: [toEmail],\n subject: 'Test Email from SonicJS',\n html: `\n
\n

Test Email Successful! 🎉

\n

This is a test email from your SonicJS Email plugin.

\n

Configuration:

\n
    \n
  • From: ${settings.fromName} <${settings.fromEmail}>
  • \n
  • Reply-To: ${settings.replyTo || 'Not set'}
  • \n
  • Sent at: ${new Date().toISOString()}
  • \n
\n

Your email settings are working correctly!

\n
\n `,\n reply_to: settings.replyTo || settings.fromEmail\n })\n })\n\n const data = await response.json() as any\n\n if (!response.ok) {\n console.error('Resend API error:', data)\n return c.json({\n success: false,\n error: data.message || 'Failed to send test email. Check your API key and domain verification.'\n }, response.status)\n }\n\n return c.json({\n success: true,\n message: `Test email sent successfully to ${toEmail}`,\n emailId: data.id\n })\n\n } catch (error: any) {\n console.error('Test email error:', error)\n return c.json({\n success: false,\n error: error.message || 'An error occurred while sending test email'\n }, 500)\n }\n })\n\n // Register the route\n builder.addRoute('/admin/plugins/email', emailRoutes, {\n description: 'Email plugin settings',\n requiresAuth: true,\n priority: 80\n })\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('Email', '/admin/plugins/email', {\n icon: 'envelope',\n order: 80,\n permissions: ['email:manage']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ Email plugin activated')\n },\n\n deactivate: async () => {\n console.info('❌ Email plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const emailPlugin = createEmailPlugin()\n","/**\n * OTP Service\n * Handles OTP code generation, verification, and management\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\nexport interface OTPSettings {\n codeLength: number\n codeExpiryMinutes: number\n maxAttempts: number\n rateLimitPerHour: number\n allowNewUserRegistration: boolean\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nexport interface OTPCode {\n id: string\n user_email: string\n code: string\n expires_at: number\n used: number\n used_at: number | null\n ip_address: string | null\n user_agent: string | null\n attempts: number\n created_at: number\n}\n\nexport class OTPService {\n constructor(private db: D1Database) {}\n\n /**\n * Generate a secure random OTP code\n */\n generateCode(length: number = 6): string {\n const digits = '0123456789'\n let code = ''\n\n for (let i = 0; i < length; i++) {\n const randomValues = new Uint8Array(1)\n crypto.getRandomValues(randomValues)\n const randomValue = randomValues[0] ?? 0\n code += digits[randomValue % digits.length]\n }\n\n return code\n }\n\n /**\n * Create and store a new OTP code\n */\n async createOTPCode(\n email: string,\n settings: OTPSettings,\n ipAddress?: string,\n userAgent?: string\n ): Promise {\n const code = this.generateCode(settings.codeLength)\n const id = crypto.randomUUID()\n const now = Date.now()\n const expiresAt = now + (settings.codeExpiryMinutes * 60 * 1000)\n\n const otpCode: OTPCode = {\n id,\n user_email: email.toLowerCase(),\n code,\n expires_at: expiresAt,\n used: 0,\n used_at: null,\n ip_address: ipAddress || null,\n user_agent: userAgent || null,\n attempts: 0,\n created_at: now\n }\n\n await this.db.prepare(`\n INSERT INTO otp_codes (\n id, user_email, code, expires_at, used, used_at,\n ip_address, user_agent, attempts, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n otpCode.id,\n otpCode.user_email,\n otpCode.code,\n otpCode.expires_at,\n otpCode.used,\n otpCode.used_at,\n otpCode.ip_address,\n otpCode.user_agent,\n otpCode.attempts,\n otpCode.created_at\n ).run()\n\n return otpCode\n }\n\n /**\n * Verify an OTP code\n */\n async verifyCode(\n email: string,\n code: string,\n settings: OTPSettings\n ): Promise<{ valid: boolean; attemptsRemaining?: number; error?: string }> {\n const normalizedEmail = email.toLowerCase()\n const now = Date.now()\n\n // Find the most recent unused code for this email\n const otpCode = await this.db.prepare(`\n SELECT * FROM otp_codes\n WHERE user_email = ? AND code = ? AND used = 0\n ORDER BY created_at DESC\n LIMIT 1\n `).bind(normalizedEmail, code).first() as OTPCode | null\n\n if (!otpCode) {\n return { valid: false, error: 'Invalid or expired code' }\n }\n\n // Check if expired\n if (now > otpCode.expires_at) {\n return { valid: false, error: 'Code has expired' }\n }\n\n // Check attempts\n if (otpCode.attempts >= settings.maxAttempts) {\n return { valid: false, error: 'Maximum attempts exceeded' }\n }\n\n // Code is valid - mark as used\n await this.db.prepare(`\n UPDATE otp_codes\n SET used = 1, used_at = ?, attempts = attempts + 1\n WHERE id = ?\n `).bind(now, otpCode.id).run()\n\n return { valid: true }\n }\n\n /**\n * Increment failed attempt count\n */\n async incrementAttempts(email: string, code: string): Promise {\n const normalizedEmail = email.toLowerCase()\n\n const result = await this.db.prepare(`\n UPDATE otp_codes\n SET attempts = attempts + 1\n WHERE user_email = ? AND code = ? AND used = 0\n RETURNING attempts\n `).bind(normalizedEmail, code).first() as { attempts: number } | null\n\n return result?.attempts || 0\n }\n\n /**\n * Check rate limiting\n */\n async checkRateLimit(email: string, settings: OTPSettings): Promise {\n const normalizedEmail = email.toLowerCase()\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n\n const result = await this.db.prepare(`\n SELECT COUNT(*) as count\n FROM otp_codes\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as { count: number } | null\n\n const count = result?.count || 0\n return count < settings.rateLimitPerHour\n }\n\n /**\n * Get recent OTP requests for activity log\n */\n async getRecentRequests(limit: number = 50): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM otp_codes\n ORDER BY created_at DESC\n LIMIT ?\n `).bind(limit).all()\n\n const rows = (result.results || []) as Record[]\n return rows.map(row => this.mapRowToOTP(row))\n }\n\n /**\n * Clean up expired codes (for maintenance)\n */\n async cleanupExpiredCodes(): Promise {\n const now = Date.now()\n\n const result = await this.db.prepare(`\n DELETE FROM otp_codes\n WHERE expires_at < ? OR (used = 1 AND used_at < ?)\n `).bind(now, now - (30 * 24 * 60 * 60 * 1000)).run() // Keep used codes for 30 days\n\n return result.meta.changes || 0\n }\n\n private mapRowToOTP(row: Record): OTPCode {\n return {\n id: String(row.id),\n user_email: String(row.user_email),\n code: String(row.code),\n expires_at: Number(row.expires_at ?? Date.now()),\n used: Number(row.used ?? 0),\n used_at: row.used_at === null || row.used_at === undefined ? null : Number(row.used_at),\n ip_address: typeof row.ip_address === 'string' ? row.ip_address : null,\n user_agent: typeof row.user_agent === 'string' ? row.user_agent : null,\n attempts: Number(row.attempts ?? 0),\n created_at: Number(row.created_at ?? Date.now())\n }\n }\n\n /**\n * Get OTP statistics\n */\n async getStats(days: number = 7): Promise<{\n total: number\n successful: number\n failed: number\n expired: number\n }> {\n const since = Date.now() - (days * 24 * 60 * 60 * 1000)\n\n const stats = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as successful,\n SUM(CASE WHEN attempts >= 3 AND used = 0 THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN expires_at < ? AND used = 0 THEN 1 ELSE 0 END) as expired\n FROM otp_codes\n WHERE created_at > ?\n `).bind(Date.now(), since).first() as any\n\n return {\n total: stats?.total || 0,\n successful: stats?.successful || 0,\n failed: stats?.failed || 0,\n expired: stats?.expired || 0\n }\n }\n}\n","/**\n * OTP Email Templates\n * HTML and plain text templates for OTP codes\n */\n\nexport interface OTPEmailData {\n code: string\n expiryMinutes: number\n codeLength: number\n maxAttempts: number\n email: string\n ipAddress?: string\n timestamp: string\n appName: string\n logoUrl?: string\n logoWidth?: number\n logoBorderWidth?: number\n logoBorderColor?: string\n loginUrl?: string\n loginButtonText?: string\n}\n\nfunction sanitizeColor(value?: string): string {\n if (!value) return ''\n // Allow #rgb, #rrggbb, #rrggbbaa, named colors, rgb()/rgba()/hsl()/hsla()\n if (/^#[0-9a-fA-F]{3,8}$/.test(value)) return value\n if (/^[a-zA-Z]+$/.test(value)) return value\n if (/^(rgb|rgba|hsl|hsla)\\([0-9.,\\s%]+\\)$/.test(value)) return value\n return ''\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>')\n}\n\nexport function renderOTPEmailHTML(data: OTPEmailData): string {\n const logoUrl = data.logoUrl ? escapeHtml(data.logoUrl) : ''\n const loginUrl = data.loginUrl ? escapeHtml(data.loginUrl) : ''\n const appName = escapeHtml(data.appName)\n const loginButtonText = escapeHtml(\n (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n )\n const logoWidth = Math.max(20, Math.min(600, Number(data.logoWidth) || 150))\n const logoBorderWidth = Math.max(0, Math.min(20, Number(data.logoBorderWidth) || 0))\n const logoBorderColor = sanitizeColor(data.logoBorderColor)\n const logoBorderStyle = logoBorderWidth > 0 && logoBorderColor\n ? `border: ${logoBorderWidth}px solid ${logoBorderColor}; border-radius: 8px;`\n : ''\n\n return `\n\n\n \n \n Your Login Code\n\n\n\n
\n\n ${logoUrl ? `\n
\n \"${appName}\"\n
\n ` : ''}\n\n
\n

Your Login Code

\n

Enter this code to sign in to ${appName}

\n
\n\n
\n
\n
\n ${data.code}\n
\n
\n\n ${loginUrl ? `\n \n ` : ''}\n\n
\n

\n ⚠️ This code expires in ${data.expiryMinutes} minutes\n

\n
\n\n
\n

Quick Tips:

\n
    \n
  • Enter the code exactly as shown (${data.codeLength} digits)
  • \n
  • The code can only be used once
  • \n
  • You have ${data.maxAttempts} attempts to enter the correct code
  • \n
  • Request a new code if this one expires
  • \n
\n
\n\n
\n

\n 🔒 Security Notice\n

\n

\n Never share this code with anyone. ${appName} will never ask you for this code via phone, email, or social media.\n

\n
\n
\n\n
\n

\n Didn't request this code?
\n Someone may have entered your email by mistake. You can safely ignore this email.\n

\n\n
\n

This email was sent to ${escapeHtml(data.email)}

\n ${data.ipAddress ? `

IP Address: ${escapeHtml(data.ipAddress)}

` : ''}\n

Time: ${escapeHtml(data.timestamp)}

\n
\n
\n\n
\n\n
\n

© ${new Date().getFullYear()} ${appName}. All rights reserved.

\n
\n\n\n`\n}\n\nexport function renderOTPEmailText(data: OTPEmailData): string {\n const ctaLabel = (data.loginButtonText && data.loginButtonText.trim()) || `Sign in to ${data.appName}`\n return `Your Login Code for ${data.appName}\n\nYour one-time verification code is:\n\n${data.code}\n\nThis code expires in ${data.expiryMinutes} minutes.\n${data.loginUrl ? `\\n${ctaLabel}: ${data.loginUrl}\\n` : ''}\n\nQuick Tips:\n• Enter the code exactly as shown (${data.codeLength} digits)\n• The code can only be used once\n• You have ${data.maxAttempts} attempts to enter the correct code\n• Request a new code if this one expires\n\nSecurity Notice:\nNever share this code with anyone. ${data.appName} will never ask you for this code via phone, email, or social media.\n\nDidn't request this code?\nSomeone may have entered your email by mistake. You can safely ignore this email.\n\n---\nThis email was sent to ${data.email}\n${data.ipAddress ? `IP Address: ${data.ipAddress}` : ''}\nTime: ${data.timestamp}\n\n© ${new Date().getFullYear()} ${data.appName}. All rights reserved.`\n}\n\nexport function renderOTPEmail(data: OTPEmailData): { html: string; text: string } {\n return {\n html: renderOTPEmailHTML(data),\n text: renderOTPEmailText(data)\n }\n}\n","/**\n * OTP Login Plugin\n *\n * Passwordless authentication via email one-time codes\n * Users receive a secure 6-digit code to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { setCookie } from 'hono/cookie'\nimport { z } from 'zod'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '@sonicjs-cms/core'\nimport { OTPService, type OTPSettings } from './otp-service'\nimport { renderOTPEmail } from './email-templates'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\nimport { SettingsService } from '../../../services/settings'\nimport { getCustomData } from '../user-profiles'\n\n// Validation schemas\nconst otpRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nconst otpVerifySchema = z.object({\n email: z.string().email('Valid email is required'),\n code: z.string().min(4).max(8)\n})\n\n// Default settings (site name comes from general settings)\nconst DEFAULT_SETTINGS: OTPSettings = {\n codeLength: 6,\n codeExpiryMinutes: 10,\n maxAttempts: 3,\n rateLimitPerHour: 5,\n allowNewUserRegistration: false,\n logoUrl: '',\n logoWidth: 150,\n logoBorderWidth: 0,\n logoBorderColor: '#ffffff',\n loginUrl: '',\n loginButtonText: ''\n}\n\nexport function createOTPLoginPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'otp-login',\n version: '1.0.0-beta.1',\n description: 'Passwordless authentication via email one-time codes'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== API Routes ====================\n\n const otpAPI = new Hono()\n\n // POST /auth/otp/request - Request OTP code\n otpAPI.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings: OTPSettings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Get site name from general settings\n const settingsService = new SettingsService(db)\n const generalSettings = await settingsService.getGeneralSettings()\n const siteName = generalSettings.siteName\n\n // Check rate limiting\n const canRequest = await otpService.checkRateLimit(normalizedEmail, settings)\n if (!canRequest) {\n return c.json({\n error: 'Too many requests. Please try again in an hour.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && !settings.allowNewUserRegistration) {\n // Don't reveal if user exists or not (security)\n return c.json({\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Get IP and user agent\n const ipAddress = c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n\n // Create OTP code\n const otpCode = await otpService.createOTPCode(\n normalizedEmail,\n settings,\n ipAddress,\n userAgent\n )\n\n // Send email via Email plugin\n try {\n const isDevMode = c.env.ENVIRONMENT === 'development'\n\n if (isDevMode) {\n console.log(`[DEV] OTP Code for ${normalizedEmail}: ${otpCode.code}`)\n }\n\n // Prepare email content\n const emailContent = renderOTPEmail({\n code: otpCode.code,\n expiryMinutes: settings.codeExpiryMinutes,\n codeLength: settings.codeLength,\n maxAttempts: settings.maxAttempts,\n email: normalizedEmail,\n ipAddress,\n timestamp: new Date().toISOString(),\n appName: siteName,\n logoUrl: settings.logoUrl || '',\n logoWidth: settings.logoWidth,\n logoBorderWidth: settings.logoBorderWidth,\n logoBorderColor: settings.logoBorderColor || '',\n loginUrl: settings.loginUrl || '',\n loginButtonText: settings.loginButtonText || ''\n })\n\n // Load email plugin settings from database\n // Note: We don't check status='active' because the email plugin's\n // settings UI works regardless of status, so we follow the same pattern\n const emailPlugin = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'email'\n `).first() as { settings: string | null } | null\n\n if (emailPlugin?.settings) {\n const emailSettings = JSON.parse(emailPlugin.settings)\n\n if (emailSettings.apiKey && emailSettings.fromEmail && emailSettings.fromName) {\n // Send email via Resend API\n const emailResponse = await fetch('https://api.resend.com/emails', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${emailSettings.apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n from: `${emailSettings.fromName} <${emailSettings.fromEmail}>`,\n to: [normalizedEmail],\n subject: `Your login code for ${siteName}`,\n html: emailContent.html,\n text: emailContent.text,\n reply_to: emailSettings.replyTo || emailSettings.fromEmail\n })\n })\n\n if (!emailResponse.ok) {\n const errorData = await emailResponse.json() as { message?: string }\n console.error('Failed to send OTP email via Resend:', errorData)\n // Don't expose error to user for security - just log it\n }\n } else {\n console.warn('Email plugin is not fully configured (missing apiKey, fromEmail, or fromName)')\n }\n } else {\n console.warn('Email plugin is not active or has no settings configured')\n }\n\n const response: any = {\n message: 'If an account exists for this email, you will receive a verification code shortly.',\n expiresIn: settings.codeExpiryMinutes * 60\n }\n\n // In development, include the code\n if (isDevMode) {\n response.dev_code = otpCode.code\n }\n\n return c.json(response)\n } catch (emailError) {\n console.error('Error sending OTP email:', emailError)\n return c.json({\n error: 'Failed to send verification code. Please try again.'\n }, 500)\n }\n } catch (error) {\n console.error('OTP request error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/verify - Verify OTP code\n otpAPI.post('/verify', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpVerifySchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email, code } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB\n const otpService = new OTPService(db)\n\n // Load plugin settings from database\n let settings = { ...DEFAULT_SETTINGS }\n const pluginRow = await db.prepare(`\n SELECT settings FROM plugins WHERE id = 'otp-login'\n `).first() as { settings: string | null } | null\n if (pluginRow?.settings) {\n try {\n const savedSettings = JSON.parse(pluginRow.settings)\n settings = { ...DEFAULT_SETTINGS, ...savedSettings }\n } catch (e) {\n console.warn('Failed to parse OTP plugin settings, using defaults')\n }\n }\n\n // Verify the code\n const verification = await otpService.verifyCode(normalizedEmail, code, settings)\n\n if (!verification.valid) {\n // Increment attempts on failure\n await otpService.incrementAttempts(normalizedEmail, code)\n\n return c.json({\n error: verification.error || 'Invalid code',\n attemptsRemaining: verification.attemptsRemaining\n }, 401)\n }\n\n // Code is valid - get user\n let user = await db.prepare(`\n SELECT id, email, username, first_name, last_name, role, is_active, created_at\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n if (!user && settings.allowNewUserRegistration) {\n // Auto-create new user on first OTP verification\n const userId = crypto.randomUUID()\n const now = Date.now()\n const username = normalizedEmail.split('@')[0] + '_' + userId.slice(0, 6)\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, email_verified, created_at, updated_at\n ) VALUES (?, ?, ?, '', '', NULL, 'viewer', 1, 1, ?, ?)\n `).bind(userId, normalizedEmail, username, now, now).run()\n\n user = {\n id: userId,\n email: normalizedEmail,\n username,\n first_name: '',\n last_name: '',\n role: 'viewer',\n is_active: 1,\n created_at: now,\n }\n }\n\n if (!user) {\n return c.json({\n error: 'User not found'\n }, 404)\n }\n\n if (!user.is_active) {\n return c.json({\n error: 'Account is deactivated'\n }, 403)\n }\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb(db, c.env as any)\n const token = await AuthManager.generateToken(user.id, user.email, user.role, (c.env as any).JWT_SECRET, tokenTtl)\n\n // Set HTTP-only cookie\n setCookie(c, 'auth_token', token, {\n httpOnly: true,\n secure: true,\n sameSite: 'Strict',\n maxAge: tokenTtl\n })\n\n const customData = await getCustomData(db, user.id)\n const { is_active, ...publicUser } = user\n\n return c.json({\n success: true,\n user: {\n ...publicUser,\n ...customData,\n },\n token,\n message: 'Authentication successful'\n })\n } catch (error) {\n console.error('OTP verify error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // POST /auth/otp/resend - Resend OTP code\n otpAPI.post('/resend', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = otpRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n // Reuse the request endpoint logic\n return otpAPI.fetch(\n new Request(c.req.url.replace('/resend', '/request'), {\n method: 'POST',\n headers: c.req.raw.headers,\n body: JSON.stringify({ email: validation.data.email })\n }),\n c.env\n )\n } catch (error) {\n console.error('OTP resend error:', error)\n return c.json({\n error: 'An error occurred. Please try again.'\n }, 500)\n }\n })\n\n // Register API routes\n builder.addRoute('/auth/otp', otpAPI, {\n description: 'OTP authentication endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Note: Admin UI is now handled by the generic plugin settings page\n // with custom component at admin-plugin-settings.template.ts\n\n // Add menu item (points to generic plugin settings page)\n builder.addMenuItem('OTP Login', '/admin/plugins/otp-login', {\n icon: 'key',\n order: 85,\n permissions: ['otp:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OTP Login plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OTP Login plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const otpLoginPlugin = createOTPLoginPlugin()\n","/**\n * OAuth Service\n * Handles OAuth2 authorization code flow, token exchange, and user info fetching.\n * Provider-agnostic — each provider is a simple config object.\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\n\n// ─── Provider Configuration ─────────────────────────────────────────────────\n\nexport interface OAuthProviderConfig {\n id: string\n name: string\n authorizeUrl: string\n tokenUrl: string\n userInfoUrl: string\n scopes: string[]\n /** Map provider profile JSON to a normalized user profile */\n mapProfile: (profile: Record) => OAuthUserProfile\n}\n\nexport interface OAuthUserProfile {\n providerAccountId: string\n email: string\n name: string\n avatar?: string\n}\n\nexport interface OAuthPluginSettings {\n providers: Record\n}\n\n// ─── Built-in Providers ─────────────────────────────────────────────────────\n\nexport const GITHUB_PROVIDER: OAuthProviderConfig = {\n id: 'github',\n name: 'GitHub',\n authorizeUrl: 'https://github.com/login/oauth/authorize',\n tokenUrl: 'https://github.com/login/oauth/access_token',\n userInfoUrl: 'https://api.github.com/user',\n scopes: ['read:user', 'user:email'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || profile.login || '',\n avatar: profile.avatar_url || undefined\n })\n}\n\nexport const GOOGLE_PROVIDER: OAuthProviderConfig = {\n id: 'google',\n name: 'Google',\n authorizeUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n scopes: ['openid', 'email', 'profile'],\n mapProfile: (profile) => ({\n providerAccountId: String(profile.id),\n email: profile.email || '',\n name: profile.name || '',\n avatar: profile.picture || undefined\n })\n}\n\nexport const BUILT_IN_PROVIDERS: Record = {\n github: GITHUB_PROVIDER,\n google: GOOGLE_PROVIDER\n}\n\n// ─── OAuth Account DB Record ────────────────────────────────────────────────\n\nexport interface OAuthAccount {\n id: string\n user_id: string\n provider: string\n provider_account_id: string\n access_token: string | null\n refresh_token: string | null\n token_expires_at: number | null\n profile_data: string | null\n created_at: number\n updated_at: number\n}\n\n// ─── OAuth Service ──────────────────────────────────────────────────────────\n\nexport class OAuthService {\n constructor(private db: D1Database) {}\n\n /**\n * Build the authorization redirect URL for a provider.\n */\n buildAuthorizeUrl(\n provider: OAuthProviderConfig,\n clientId: string,\n redirectUri: string,\n state: string\n ): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope: provider.scopes.join(' '),\n state\n })\n\n // Google requires access_type for refresh tokens\n if (provider.id === 'google') {\n params.set('access_type', 'offline')\n params.set('prompt', 'consent')\n }\n\n return `${provider.authorizeUrl}?${params.toString()}`\n }\n\n /**\n * Exchange authorization code for tokens using native fetch.\n */\n async exchangeCode(\n provider: OAuthProviderConfig,\n clientId: string,\n clientSecret: string,\n code: string,\n redirectUri: string\n ): Promise<{ access_token: string; refresh_token?: string; expires_in?: number }> {\n const body: Record = {\n client_id: clientId,\n client_secret: clientSecret,\n code,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code'\n }\n\n const response = await fetch(provider.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json'\n },\n body: new URLSearchParams(body).toString()\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Token exchange failed (${response.status}): ${errorText}`)\n }\n\n const data = await response.json() as Record\n\n if (data.error) {\n throw new Error(`Token exchange error: ${data.error_description || data.error}`)\n }\n\n return {\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n expires_in: data.expires_in ? Number(data.expires_in) : undefined\n }\n }\n\n /**\n * Fetch user profile from the provider's userinfo endpoint.\n */\n async fetchUserProfile(\n provider: OAuthProviderConfig,\n accessToken: string\n ): Promise {\n const headers: Record = {\n 'Authorization': `Bearer ${accessToken}`,\n 'Accept': 'application/json'\n }\n\n // GitHub uses a different auth header format\n if (provider.id === 'github') {\n headers['Authorization'] = `token ${accessToken}`\n }\n\n const response = await fetch(provider.userInfoUrl, { headers })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch user profile (${response.status})`)\n }\n\n const profile = await response.json() as Record\n\n // For GitHub, email may not be in the profile — fetch from /user/emails\n if (provider.id === 'github' && !profile.email) {\n const emailResponse = await fetch('https://api.github.com/user/emails', {\n headers: {\n 'Authorization': `token ${accessToken}`,\n 'Accept': 'application/json'\n }\n })\n\n if (emailResponse.ok) {\n const emails = await emailResponse.json() as Array<{ email: string; primary: boolean; verified: boolean }>\n const primaryEmail = emails.find(e => e.primary && e.verified)\n if (primaryEmail) {\n profile.email = primaryEmail.email\n }\n }\n }\n\n return provider.mapProfile(profile)\n }\n\n // ─── Database Operations ────────────────────────────────────────────────\n\n /**\n * Find an existing OAuth account link.\n */\n async findOAuthAccount(\n provider: string,\n providerAccountId: string\n ): Promise {\n return await this.db.prepare(`\n SELECT * FROM oauth_accounts\n WHERE provider = ? AND provider_account_id = ?\n `).bind(provider, providerAccountId).first() as OAuthAccount | null\n }\n\n /**\n * Find all OAuth accounts for a user.\n */\n async findUserOAuthAccounts(userId: string): Promise {\n const result = await this.db.prepare(`\n SELECT * FROM oauth_accounts WHERE user_id = ?\n `).bind(userId).all()\n return (result.results || []) as unknown as OAuthAccount[]\n }\n\n /**\n * Create a new OAuth account link.\n */\n async createOAuthAccount(params: {\n userId: string\n provider: string\n providerAccountId: string\n accessToken: string\n refreshToken?: string\n tokenExpiresAt?: number\n profileData?: string\n }): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO oauth_accounts (\n id, user_id, provider, provider_account_id,\n access_token, refresh_token, token_expires_at,\n profile_data, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n params.userId,\n params.provider,\n params.providerAccountId,\n params.accessToken,\n params.refreshToken || null,\n params.tokenExpiresAt || null,\n params.profileData || null,\n now,\n now\n ).run()\n\n return {\n id,\n user_id: params.userId,\n provider: params.provider,\n provider_account_id: params.providerAccountId,\n access_token: params.accessToken,\n refresh_token: params.refreshToken || null,\n token_expires_at: params.tokenExpiresAt || null,\n profile_data: params.profileData || null,\n created_at: now,\n updated_at: now\n }\n }\n\n /**\n * Update tokens for an existing OAuth account.\n */\n async updateOAuthTokens(\n id: string,\n accessToken: string,\n refreshToken?: string,\n tokenExpiresAt?: number\n ): Promise {\n await this.db.prepare(`\n UPDATE oauth_accounts\n SET access_token = ?, refresh_token = ?, token_expires_at = ?, updated_at = ?\n WHERE id = ?\n `).bind(accessToken, refreshToken || null, tokenExpiresAt || null, Date.now(), id).run()\n }\n\n /**\n * Unlink an OAuth account from a user (only if they have another auth method).\n */\n async unlinkOAuthAccount(userId: string, provider: string): Promise {\n // Check user has a password or another OAuth link before unlinking\n const user = await this.db.prepare(`\n SELECT password_hash FROM users WHERE id = ?\n `).bind(userId).first() as { password_hash: string | null } | null\n\n const otherLinks = await this.db.prepare(`\n SELECT COUNT(*) as count FROM oauth_accounts\n WHERE user_id = ? AND provider != ?\n `).bind(userId, provider).first() as { count: number } | null\n\n const hasPassword = !!user?.password_hash\n const hasOtherLinks = (otherLinks?.count || 0) > 0\n\n if (!hasPassword && !hasOtherLinks) {\n return false // Cannot unlink the only auth method\n }\n\n await this.db.prepare(`\n DELETE FROM oauth_accounts WHERE user_id = ? AND provider = ?\n `).bind(userId, provider).run()\n\n return true\n }\n\n /**\n * Find a user by email.\n */\n async findUserByEmail(email: string): Promise<{\n id: string\n email: string\n role: string\n is_active: number\n first_name: string\n last_name: string\n } | null> {\n return await this.db.prepare(`\n SELECT id, email, role, is_active, first_name, last_name\n FROM users WHERE email = ?\n `).bind(email.toLowerCase()).first() as any\n }\n\n /**\n * Create a new user from an OAuth profile.\n */\n async createUserFromOAuth(profile: OAuthUserProfile): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n const email = profile.email.toLowerCase()\n const nameParts = (profile.name || email.split('@')[0] || 'User').split(' ')\n const firstName = nameParts[0] || 'User'\n const lastName = nameParts.slice(1).join(' ') || ''\n const username = email.split('@')[0] || id.substring(0, 8)\n\n // Check for username collision and append random suffix if needed\n const existing = await this.db.prepare(\n 'SELECT id FROM users WHERE username = ?'\n ).bind(username).first()\n\n const finalUsername = existing\n ? `${username}-${id.substring(0, 6)}`\n : username\n\n await this.db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, avatar, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', ?, 1, ?, ?)\n `).bind(\n id, email, finalUsername, firstName, lastName,\n profile.avatar || null, now, now\n ).run()\n\n return id\n }\n\n /**\n * Generate a cryptographically random state parameter for CSRF protection.\n */\n generateState(): string {\n const bytes = new Uint8Array(32)\n crypto.getRandomValues(bytes)\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')\n }\n}\n","/**\n * OAuth Providers Plugin\n *\n * OAuth2/OIDC social login support for SonicJS.\n * Phase 1: Core OAuth2 authorization code flow with GitHub and Google providers.\n *\n * Routes:\n * GET /auth/oauth/:provider → Redirect to provider authorization\n * GET /auth/oauth/:provider/callback → Handle OAuth callback\n * POST /auth/oauth/link → Link OAuth provider to logged-in account\n * POST /auth/oauth/unlink → Unlink OAuth provider from account\n * GET /auth/oauth/accounts → List linked OAuth accounts for current user\n */\n\nimport { Hono } from 'hono'\nimport { setCookie, getCookie } from 'hono/cookie'\nimport { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport {\n OAuthService,\n BUILT_IN_PROVIDERS,\n type OAuthPluginSettings,\n type OAuthProviderConfig\n} from './oauth-service'\nimport { AuthManager } from '../../../middleware'\nimport { getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst STATE_COOKIE_NAME = 'oauth_state'\nconst STATE_COOKIE_MAX_AGE = 600 // 10 minutes\n\nexport function createOAuthProvidersPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'oauth-providers',\n version: '1.0.0-beta.1',\n description: 'OAuth2/OIDC social login with GitHub, Google, and more'\n })\n\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^2.0.0'\n })\n\n // ==================== Helper Functions ====================\n\n function getCallbackUrl(c: any, provider: string): string {\n const proto = c.req.header('x-forwarded-proto') || 'https'\n const host = c.req.header('host') || 'localhost'\n return `${proto}://${host}/auth/oauth/${provider}/callback`\n }\n\n async function loadSettings(db: any): Promise {\n const row = await db.prepare(\n `SELECT settings FROM plugins WHERE id = 'oauth-providers'`\n ).first() as { settings: string | null } | null\n\n if (!row?.settings) return null\n\n try {\n return JSON.parse(row.settings) as OAuthPluginSettings\n } catch {\n return null\n }\n }\n\n function getProviderCredentials(\n settings: OAuthPluginSettings | null,\n providerId: string\n ): { clientId: string; clientSecret: string } | null {\n if (!settings?.providers?.[providerId]) return null\n const p = settings.providers[providerId]\n if (!p.enabled || !p.clientId || !p.clientSecret) return null\n return { clientId: p.clientId, clientSecret: p.clientSecret }\n }\n\n // ==================== API Routes ====================\n\n const oauthAPI = new Hono()\n\n // GET /auth/oauth/:provider — Redirect to provider authorization\n oauthAPI.get('/:provider', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.json({ error: `Unknown OAuth provider: ${providerId}` }, 400)\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.json({\n error: `OAuth provider \"${providerId}\" is not configured or not enabled`\n }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Store state in a cookie for CSRF validation on callback\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax', // Lax required for OAuth redirect flow\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n providerConfig,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.redirect(authorizeUrl)\n } catch (error) {\n console.error('OAuth authorize error:', error)\n return c.json({ error: 'Failed to initiate OAuth flow' }, 500)\n }\n })\n\n // GET /auth/oauth/:provider/callback — Handle OAuth callback\n oauthAPI.get('/:provider/callback', async (c: any) => {\n try {\n const providerId = c.req.param('provider')\n const providerConfig = BUILT_IN_PROVIDERS[providerId]\n\n if (!providerConfig) {\n return c.redirect('/auth/login?error=Unknown OAuth provider')\n }\n\n // Validate state (CSRF protection)\n const stateParam = c.req.query('state')\n const stateCookie = getCookie(c, STATE_COOKIE_NAME)\n\n if (!stateParam || !stateCookie || stateParam !== stateCookie) {\n return c.redirect('/auth/login?error=Invalid OAuth state. Please try again.')\n }\n\n // Clear the state cookie\n setCookie(c, STATE_COOKIE_NAME, '', {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: 0,\n path: '/auth/oauth'\n })\n\n // Check for error from provider\n const errorParam = c.req.query('error')\n if (errorParam) {\n const errorDesc = c.req.query('error_description') || errorParam\n return c.redirect(`/auth/login?error=${encodeURIComponent(errorDesc)}`)\n }\n\n const code = c.req.query('code')\n if (!code) {\n return c.redirect('/auth/login?error=No authorization code received')\n }\n\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, providerId)\n\n if (!creds) {\n return c.redirect('/auth/login?error=OAuth provider not configured')\n }\n\n const oauthService = new OAuthService(db)\n const redirectUri = getCallbackUrl(c, providerId)\n\n // Exchange code for tokens\n const tokens = await oauthService.exchangeCode(\n providerConfig,\n creds.clientId,\n creds.clientSecret,\n code,\n redirectUri\n )\n\n // Fetch user profile from provider\n const profile = await oauthService.fetchUserProfile(providerConfig, tokens.access_token)\n\n if (!profile.email) {\n return c.redirect('/auth/login?error=Could not retrieve email from OAuth provider. Please ensure your email is public or grant email permission.')\n }\n\n const tokenExpiresAt = tokens.expires_in\n ? Date.now() + (tokens.expires_in * 1000)\n : null\n\n // Check if this OAuth account is already linked to a user\n const existingOAuth = await oauthService.findOAuthAccount(providerId, profile.providerAccountId)\n\n if (existingOAuth) {\n // Existing OAuth link — update tokens and log in\n await oauthService.updateOAuthTokens(\n existingOAuth.id,\n tokens.access_token,\n tokens.refresh_token,\n tokenExpiresAt ?? undefined\n )\n\n // Fetch user to generate JWT\n const user = await db.prepare(\n 'SELECT id, email, role, is_active FROM users WHERE id = ?'\n ).bind(existingOAuth.user_id).first() as any\n\n if (!user || !user.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n user.id, user.email, user.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // No existing OAuth link — check if user exists by email\n const existingUser = await oauthService.findUserByEmail(profile.email)\n\n if (existingUser) {\n if (!existingUser.is_active) {\n return c.redirect('/auth/login?error=Account is deactivated')\n }\n\n // Link OAuth to existing account\n await oauthService.createOAuthAccount({\n userId: existingUser.id,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n existingUser.id, existingUser.email, existingUser.role,\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n }\n\n // Brand new user — create account from OAuth profile\n const newUserId = await oauthService.createUserFromOAuth(profile)\n\n await oauthService.createOAuthAccount({\n userId: newUserId,\n provider: providerId,\n providerAccountId: profile.providerAccountId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n tokenExpiresAt: tokenExpiresAt ?? undefined,\n profileData: JSON.stringify(profile)\n })\n\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwt = await AuthManager.generateToken(\n newUserId, profile.email.toLowerCase(), 'viewer',\n (c.env as any).JWT_SECRET, tokenTtl\n )\n\n AuthManager.setAuthCookie(c, jwt, { sameSite: 'Lax', maxAge: tokenTtl })\n return c.redirect('/admin')\n\n } catch (error) {\n console.error('OAuth callback error:', error)\n const message = error instanceof Error ? error.message : 'OAuth authentication failed'\n return c.redirect(`/auth/login?error=${encodeURIComponent(message)}`)\n }\n })\n\n // POST /auth/oauth/link — Link an OAuth provider to the current logged-in user\n oauthAPI.post('/link', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider || !BUILT_IN_PROVIDERS[provider]) {\n return c.json({ error: 'Invalid provider' }, 400)\n }\n\n // Redirect the user to the OAuth flow — the callback will auto-link\n // since the user already exists by email\n const db = c.env.DB\n const settings = await loadSettings(db)\n const creds = getProviderCredentials(settings, provider)\n\n if (!creds) {\n return c.json({ error: `OAuth provider \"${provider}\" is not configured` }, 400)\n }\n\n const oauthService = new OAuthService(db)\n const state = oauthService.generateState()\n const redirectUri = getCallbackUrl(c, provider)\n\n setCookie(c, STATE_COOKIE_NAME, state, {\n httpOnly: true,\n secure: true,\n sameSite: 'Lax',\n maxAge: STATE_COOKIE_MAX_AGE,\n path: '/auth/oauth'\n })\n\n const authorizeUrl = oauthService.buildAuthorizeUrl(\n BUILT_IN_PROVIDERS[provider]!,\n creds.clientId,\n redirectUri,\n state\n )\n\n return c.json({ redirectUrl: authorizeUrl })\n } catch (error) {\n console.error('OAuth link error:', error)\n return c.json({ error: 'Failed to initiate account linking' }, 500)\n }\n })\n\n // POST /auth/oauth/unlink — Unlink an OAuth provider from the current user\n oauthAPI.post('/unlink', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const body = await c.req.json()\n const { provider } = body\n\n if (!provider) {\n return c.json({ error: 'Provider is required' }, 400)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const success = await oauthService.unlinkOAuthAccount(user.userId, provider)\n\n if (!success) {\n return c.json({\n error: 'Cannot unlink the only authentication method. Set a password first.'\n }, 400)\n }\n\n return c.json({ success: true, message: `${provider} account unlinked` })\n } catch (error) {\n console.error('OAuth unlink error:', error)\n return c.json({ error: 'Failed to unlink account' }, 500)\n }\n })\n\n // GET /auth/oauth/accounts — List linked OAuth accounts for current user\n oauthAPI.get('/accounts', async (c: any) => {\n try {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const oauthService = new OAuthService(db)\n const accounts = await oauthService.findUserOAuthAccounts(user.userId)\n\n return c.json({\n accounts: accounts.map(a => ({\n provider: a.provider,\n providerAccountId: a.provider_account_id,\n linkedAt: a.created_at\n }))\n })\n } catch (error) {\n console.error('OAuth accounts error:', error)\n return c.json({ error: 'Failed to fetch linked accounts' }, 500)\n }\n })\n\n // Register routes\n builder.addRoute('/auth/oauth', oauthAPI, {\n description: 'OAuth2 social login endpoints',\n requiresAuth: false,\n priority: 100\n })\n\n // Add menu item for admin settings\n builder.addMenuItem('OAuth Providers', '/admin/plugins/oauth-providers', {\n icon: 'shield',\n order: 86,\n permissions: ['oauth:manage']\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n activate: async () => {\n console.info('✅ OAuth Providers plugin activated')\n },\n deactivate: async () => {\n console.info('❌ OAuth Providers plugin deactivated')\n }\n })\n\n return builder.build() as Plugin\n}\n\nexport const oauthProvidersPlugin = createOAuthProvidersPlugin()\n","/**\n * Embedding Service\n * Generates embeddings using Cloudflare Workers AI\n */\n\nexport class EmbeddingService {\n constructor(private ai: any) {}\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string): Promise {\n try {\n // Use Cloudflare Workers AI embedding model\n // @cf/baai/bge-base-en-v1.5 produces 768-dimensional vectors\n const response = await this.ai.run('@cf/baai/bge-base-en-v1.5', {\n text: this.preprocessText(text)\n })\n\n // Extract embedding vector\n if (response.data && response.data.length > 0) {\n return response.data[0]\n }\n\n throw new Error('No embedding data returned')\n } catch (error) {\n console.error('[EmbeddingService] Error generating embedding:', error)\n throw error\n }\n }\n\n /**\n * Generate embeddings for multiple texts (batch processing)\n */\n async generateBatch(texts: string[]): Promise {\n try {\n // Process in smaller batches to avoid rate limits\n const batchSize = 10\n const batches: string[][] = []\n \n for (let i = 0; i < texts.length; i += batchSize) {\n batches.push(texts.slice(i, i + batchSize))\n }\n\n const allEmbeddings: number[][] = []\n\n for (const batch of batches) {\n const batchEmbeddings = await Promise.all(\n batch.map(text => this.generateEmbedding(text))\n )\n allEmbeddings.push(...batchEmbeddings)\n }\n\n return allEmbeddings\n } catch (error) {\n console.error('[EmbeddingService] Error generating batch embeddings:', error)\n throw error\n }\n }\n\n /**\n * Preprocess text before generating embedding\n * - Trim whitespace\n * - Limit length to avoid token limits\n * - Remove special characters that might cause issues\n */\n private preprocessText(text: string): string {\n if (!text) return ''\n\n // Trim and normalize whitespace\n let processed = text.trim().replace(/\\s+/g, ' ')\n\n // Limit to ~8000 characters (rough token limit)\n if (processed.length > 8000) {\n processed = processed.substring(0, 8000)\n }\n\n return processed\n }\n\n /**\n * Calculate cosine similarity between two embeddings\n */\n cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Embeddings must have same dimensions')\n }\n\n let dotProduct = 0\n let normA = 0\n let normB = 0\n\n for (let i = 0; i < a.length; i++) {\n const aVal = a[i] ?? 0\n const bVal = b[i] ?? 0\n dotProduct += aVal * bVal\n normA += aVal * aVal\n normB += bVal * bVal\n }\n\n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB))\n }\n}\n","/**\n * Chunking Service\n * Splits content into optimal chunks for embedding and search\n */\n\nexport interface ContentChunk {\n id: string\n content_id: string\n collection_id: string\n title: string\n text: string\n chunk_index: number\n metadata: Record\n}\n\nexport class ChunkingService {\n // Default chunk size (in approximate tokens)\n private readonly CHUNK_SIZE = 500\n private readonly CHUNK_OVERLAP = 50\n\n /**\n * Chunk a single content item\n */\n chunkContent(\n contentId: string,\n collectionId: string,\n title: string,\n data: any,\n metadata: Record = {}\n ): ContentChunk[] {\n // Extract all text from content\n const text = this.extractText(data)\n \n if (!text || text.trim().length === 0) {\n console.warn(`[ChunkingService] No text found for content ${contentId}`)\n return []\n }\n\n // Split into chunks\n const textChunks = this.splitIntoChunks(text)\n\n // Create chunk objects\n return textChunks.map((chunkText, index) => ({\n id: `${contentId}_chunk_${index}`,\n content_id: contentId,\n collection_id: collectionId,\n title: title,\n text: chunkText,\n chunk_index: index,\n metadata: {\n ...metadata,\n total_chunks: textChunks.length\n }\n }))\n }\n\n /**\n * Chunk multiple content items\n */\n chunkContentBatch(items: Array<{\n id: string\n collection_id: string\n title: string\n data: any\n metadata?: Record\n }>): ContentChunk[] {\n const allChunks: ContentChunk[] = []\n\n for (const item of items) {\n const chunks = this.chunkContent(\n item.id,\n item.collection_id,\n item.title,\n item.data,\n item.metadata\n )\n allChunks.push(...chunks)\n }\n\n return allChunks\n }\n\n /**\n * Extract all text from content data\n */\n private extractText(data: any): string {\n const parts: string[] = []\n\n // Common text fields\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n if (data.summary) parts.push(String(data.summary))\n\n // Recursively extract from nested objects\n const extractRecursive = (obj: any): void => {\n if (typeof obj === 'string') {\n // Skip very short strings and URLs\n if (obj.length > 10 && !obj.startsWith('http')) {\n parts.push(obj)\n }\n } else if (Array.isArray(obj)) {\n obj.forEach(extractRecursive)\n } else if (obj && typeof obj === 'object') {\n // Skip certain keys\n const skipKeys = ['id', 'slug', 'url', 'image', 'thumbnail', 'metadata']\n \n Object.entries(obj).forEach(([key, value]) => {\n if (!skipKeys.includes(key.toLowerCase())) {\n extractRecursive(value)\n }\n })\n }\n }\n\n extractRecursive(data)\n\n return parts.join('\\n\\n').trim()\n }\n\n /**\n * Split text into overlapping chunks\n */\n private splitIntoChunks(text: string): string[] {\n // Split by words\n const words = text.split(/\\s+/)\n \n if (words.length <= this.CHUNK_SIZE) {\n return [text]\n }\n\n const chunks: string[] = []\n let startIndex = 0\n\n while (startIndex < words.length) {\n // Get chunk with overlap\n const endIndex = Math.min(startIndex + this.CHUNK_SIZE, words.length)\n const chunk = words.slice(startIndex, endIndex).join(' ')\n chunks.push(chunk)\n\n // Move forward by chunk size minus overlap\n startIndex += this.CHUNK_SIZE - this.CHUNK_OVERLAP\n\n // Ensure we don't create a tiny last chunk\n if (startIndex >= words.length - this.CHUNK_OVERLAP) {\n break\n }\n }\n\n return chunks\n }\n\n /**\n * Get optimal chunk size based on content type\n */\n getOptimalChunkSize(contentType: string): number {\n switch (contentType) {\n case 'blog_posts':\n case 'articles':\n return 600 // Larger chunks for long-form content\n case 'products':\n case 'pages':\n return 400 // Medium chunks for structured content\n case 'messages':\n case 'comments':\n return 200 // Small chunks for short content\n default:\n return this.CHUNK_SIZE\n }\n }\n}\n","/**\n * Custom RAG Service\n * Implements full RAG pipeline using Cloudflare Vectorize\n * \n * Fulfills GitHub Issue #362: Advanced search with Cloudflare Search\n */\n\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { EmbeddingService } from './embedding.service'\nimport { ChunkingService, type ContentChunk } from './chunking.service'\nimport type { SearchQuery, SearchResponse, SearchResult, AISearchSettings } from '../types'\n\nexport class CustomRAGService {\n private embeddingService: EmbeddingService\n private chunkingService: ChunkingService\n\n constructor(\n private db: D1Database,\n private ai: any,\n private vectorize: any\n ) {\n this.embeddingService = new EmbeddingService(ai)\n this.chunkingService = new ChunkingService()\n }\n\n /**\n * Index all content from a collection\n */\n async indexCollection(collectionId: string): Promise<{\n total_items: number\n total_chunks: number\n indexed_chunks: number\n errors: number\n }> {\n console.log(`[CustomRAG] Starting indexing for collection: ${collectionId}`)\n \n try {\n // Get all published content from collection\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.collection_id = ? AND c.status = 'published'\n `)\n .bind(collectionId)\n .all<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n const totalItems = contentItems?.length || 0\n \n if (totalItems === 0) {\n console.log(`[CustomRAG] No content found in collection ${collectionId}`)\n return { total_items: 0, total_chunks: 0, indexed_chunks: 0, errors: 0 }\n }\n\n // Chunk all content\n const items = (contentItems || []).map(item => ({\n id: item.id,\n collection_id: item.collection_id,\n title: item.title || 'Untitled',\n data: typeof item.data === 'string' ? JSON.parse(item.data) : item.data,\n metadata: {\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name\n }\n }))\n\n const chunks = this.chunkingService.chunkContentBatch(items)\n const totalChunks = chunks.length\n\n console.log(`[CustomRAG] Generated ${totalChunks} chunks from ${totalItems} items`)\n\n // Generate embeddings in batches\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n console.log(`[CustomRAG] Generated ${embeddings.length} embeddings`)\n\n // Store in Vectorize\n let indexedChunks = 0\n let errors = 0\n const batchSize = 100\n\n for (let i = 0; i < chunks.length; i += batchSize) {\n const chunkBatch = chunks.slice(i, i + batchSize)\n const embeddingBatch = embeddings.slice(i, i + batchSize)\n\n try {\n await this.vectorize.upsert(\n chunkBatch.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddingBatch[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500), // Store snippet for display\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n indexedChunks += chunkBatch.length\n console.log(`[CustomRAG] Indexed batch ${i / batchSize + 1}: ${chunkBatch.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error indexing batch ${i / batchSize + 1}:`, error)\n errors += chunkBatch.length\n }\n }\n\n console.log(`[CustomRAG] Indexing complete: ${indexedChunks}/${totalChunks} chunks indexed`)\n\n return {\n total_items: totalItems,\n total_chunks: totalChunks,\n indexed_chunks: indexedChunks,\n errors\n }\n } catch (error) {\n console.error(`[CustomRAG] Error indexing collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Search using RAG (semantic search with Vectorize)\n */\n async search(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n\n try {\n console.log(`[CustomRAG] Searching for: \"${query.query}\"`)\n\n // Generate query embedding\n const queryEmbedding = await this.embeddingService.generateEmbedding(query.query)\n\n // Build Vectorize query filters\n const filter: any = {}\n \n if (query.filters?.collections && query.filters.collections.length > 0) {\n filter.collection_id = { $in: query.filters.collections }\n } else if (settings.selected_collections.length > 0) {\n filter.collection_id = { $in: settings.selected_collections }\n }\n\n if (query.filters?.status && query.filters.status.length > 0) {\n filter.status = { $in: query.filters.status }\n }\n\n // Vectorize filters have issues, so we query without filter and manually filter results\n const vectorResults = await this.vectorize.query(queryEmbedding, {\n topK: 50, // Max allowed with returnMetadata: true\n returnMetadata: true\n })\n\n // Manually filter results by collection_id if filter exists\n let filteredMatches = vectorResults.matches || []\n if (filter.collection_id?.$in && Array.isArray(filter.collection_id.$in)) {\n const allowedCollections = filter.collection_id.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedCollections.includes(match.metadata?.collection_id)\n )\n }\n\n // Apply status filter if exists\n if (filter.status?.$in && Array.isArray(filter.status.$in)) {\n const allowedStatuses = filter.status.$in\n filteredMatches = filteredMatches.filter((match: any) => \n allowedStatuses.includes(match.metadata?.status)\n )\n }\n\n // Limit to requested topK\n const topK = query.limit || settings.results_limit || 20\n filteredMatches = filteredMatches.slice(0, topK)\n\n // Replace matches with filtered results\n vectorResults.matches = filteredMatches\n\n if (!vectorResults.matches || vectorResults.matches.length === 0) {\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: 'ai'\n }\n }\n\n // Get unique content IDs\n const contentIds = [...new Set(\n vectorResults.matches.map((m: any) => m.metadata.content_id)\n )]\n\n // Fetch full content from D1\n const placeholders = contentIds.map(() => '?').join(',')\n const { results: contentItems } = await this.db\n .prepare(`\n SELECT c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.display_name as collection_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id IN (${placeholders})\n `)\n .bind(...contentIds)\n .all<{\n id: string\n title: string\n slug: string\n collection_id: string\n collection_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n }>()\n\n // Map results with relevance scores\n const searchResults: SearchResult[] = (contentItems || []).map(item => {\n // Find best matching chunk for this content\n const matchingChunks = vectorResults.matches.filter(\n (m: any) => m.metadata.content_id === item.id\n )\n \n const bestMatch = matchingChunks.reduce((best: any, current: any) => \n current.score > (best?.score || 0) ? current : best\n , null)\n\n return {\n id: item.id,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n collection_id: item.collection_id,\n collection_name: item.collection_name,\n snippet: bestMatch?.metadata?.text || '',\n relevance_score: bestMatch?.score || 0,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at\n }\n })\n\n // Sort by relevance score\n searchResults.sort((a, b) => (b.relevance_score || 0) - (a.relevance_score || 0))\n\n const queryTime = Date.now() - startTime\n console.log(`[CustomRAG] Search completed in ${queryTime}ms, ${searchResults.length} results`)\n\n return {\n results: searchResults,\n total: searchResults.length,\n query_time_ms: queryTime,\n mode: 'ai'\n }\n } catch (error) {\n console.error('[CustomRAG] Search error:', error)\n throw error\n }\n }\n\n /**\n * Update index for a single content item\n */\n async updateContentIndex(contentId: string): Promise {\n try {\n // Get content item\n const content = await this.db\n .prepare(`\n SELECT c.id, c.title, c.data, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ?\n `)\n .bind(contentId)\n .first<{\n id: string\n title: string\n data: string\n collection_id: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!content) {\n console.warn(`[CustomRAG] Content ${contentId} not found`)\n return\n }\n\n // If content is not published, remove from index\n if (content.status !== 'published') {\n await this.removeContentFromIndex(contentId)\n return\n }\n\n // Chunk content\n const chunks = this.chunkingService.chunkContent(\n content.id,\n content.collection_id,\n content.title || 'Untitled',\n typeof content.data === 'string' ? JSON.parse(content.data) : content.data,\n {\n status: content.status,\n created_at: content.created_at,\n updated_at: content.updated_at,\n author_id: content.author_id,\n collection_name: content.collection_name,\n collection_display_name: content.collection_display_name\n }\n )\n\n // Generate embeddings\n const embeddings = await this.embeddingService.generateBatch(\n chunks.map(c => `${c.title}\\n\\n${c.text}`)\n )\n\n // Update in Vectorize\n await this.vectorize.upsert(\n chunks.map((chunk, idx) => ({\n id: chunk.id,\n values: embeddings[idx],\n metadata: {\n content_id: chunk.content_id,\n collection_id: chunk.collection_id,\n title: chunk.title,\n text: chunk.text.substring(0, 500),\n chunk_index: chunk.chunk_index,\n ...chunk.metadata\n }\n }))\n )\n\n console.log(`[CustomRAG] Updated index for content ${contentId}: ${chunks.length} chunks`)\n } catch (error) {\n console.error(`[CustomRAG] Error updating index for ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove content from index\n */\n async removeContentFromIndex(contentId: string): Promise {\n try {\n // Note: Vectorize doesn't have a bulk delete by metadata filter\n // We need to delete each chunk individually\n // In practice, we would track chunk IDs or use a different approach\n \n console.log(`[CustomRAG] Removing content ${contentId} from index`)\n \n // For now, we'll let stale chunks age out\n // A better approach would be to maintain a mapping in D1\n // TODO: Implement proper chunk tracking\n \n } catch (error) {\n console.error(`[CustomRAG] Error removing content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Get search suggestions based on query\n */\n async getSuggestions(partialQuery: string, limit: number = 5): Promise {\n try {\n // Generate embedding for partial query\n const queryEmbedding = await this.embeddingService.generateEmbedding(partialQuery)\n\n // Search for similar content titles\n const results = await this.vectorize.query(queryEmbedding, {\n topK: limit * 2, // Get more to filter\n returnMetadata: true\n })\n\n // Extract unique titles\n const suggestions = [...new Set(\n results.matches?.map((m: any) => m.metadata.title).filter(Boolean) || []\n )].slice(0, limit)\n\n return suggestions as string[]\n } catch (error) {\n console.error('[CustomRAG] Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Check if Vectorize is available and configured\n */\n isAvailable(): boolean {\n return !!this.vectorize && !!this.ai\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n NewCollectionNotification,\n} from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * AI Search Service\n * Handles search operations, settings management, and collection detection\n * Now uses Custom RAG with Vectorize for semantic search\n */\nexport class AISearchService {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[AISearchService] Custom RAG initialized')\n } else {\n console.log('[AISearchService] Custom RAG not available, using keyword search only')\n }\n }\n\n /**\n * Get plugin settings\n */\n async getSettings(): Promise {\n try {\n const plugin = await this.db\n .prepare(`SELECT settings FROM plugins WHERE id = ? LIMIT 1`)\n .bind('ai-search')\n .first<{ settings: string | null }>()\n\n if (!plugin || !plugin.settings) {\n return this.getDefaultSettings()\n }\n\n return JSON.parse(plugin.settings) as AISearchSettings\n } catch (error) {\n console.error('Error fetching AI Search settings:', error)\n return this.getDefaultSettings()\n }\n }\n\n /**\n * Get default settings\n */\n getDefaultSettings(): AISearchSettings {\n return {\n enabled: true,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n }\n\n /**\n * Update plugin settings\n */\n async updateSettings(settings: Partial): Promise {\n const existing = await this.getSettings()\n const updated: AISearchSettings = {\n ...existing!,\n ...settings,\n }\n\n try {\n // Update plugin settings in plugins table\n await this.db\n .prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'ai-search'\n `)\n .bind(JSON.stringify(updated))\n .run()\n\n return updated\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n throw error\n }\n }\n\n /**\n * Detect new collections that aren't indexed or dismissed\n */\n async detectNewCollections(): Promise {\n try {\n // Get all collections (exclude test collections)\n // Note: D1 doesn't support parameterized LIKE, so we filter in JavaScript\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: number\n name: string\n display_name: string\n description?: string\n }>()\n \n // Filter out test collections (starts with test_, ends with _test, or is test_collection)\n const collections = (allCollections || []).filter(\n (col) => {\n if (!col.name) return false\n const name = col.name.toLowerCase()\n return !name.startsWith('test_') && \n !name.endsWith('_test') && \n name !== 'test_collection' &&\n !name.includes('_test_') &&\n name !== 'large_payload_test' &&\n name !== 'concurrent_test'\n }\n )\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n\n // Get item counts for each collection\n const notifications: NewCollectionNotification[] = []\n\n for (const collection of collections || []) {\n const collectionId = String(collection.id)\n\n // Skip if already selected or dismissed\n if (selected.includes(collectionId) || dismissed.includes(collectionId)) {\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n notifications.push({\n collection: {\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: false,\n is_dismissed: false,\n is_new: true,\n },\n message: `New collection \"${collection.display_name}\" with ${itemCount} items available for indexing`,\n })\n }\n\n return notifications\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return []\n }\n }\n\n /**\n * Get all collections with indexing status\n */\n async getAllCollections(): Promise {\n try {\n // Get all collections (same query as content page)\n const collectionsStmt = this.db.prepare(\n 'SELECT id, name, display_name, description FROM collections WHERE is_active = 1 ORDER BY display_name'\n )\n const { results: allCollections } = await collectionsStmt.all<{\n id: string\n name: string\n display_name: string\n description?: string\n }>()\n \n console.log('[AISearchService.getAllCollections] Raw collections from DB:', allCollections?.length || 0)\n const firstCollection = allCollections?.[0]\n if (firstCollection) {\n console.log('[AISearchService.getAllCollections] Sample collection:', {\n id: firstCollection.id,\n name: firstCollection.name,\n display_name: firstCollection.display_name\n })\n }\n \n // No filtering needed - test collections are now properly cleaned up by E2E tests\n const collections = (allCollections || []).filter(\n (col) => col.id && col.name\n )\n \n console.log('[AISearchService.getAllCollections] After filtering test collections:', collections.length)\n console.log('[AISearchService.getAllCollections] Remaining collections:', collections.map(c => c.name).join(', '))\n\n // Get settings\n const settings = await this.getSettings()\n const selected = settings?.selected_collections || []\n const dismissed = settings?.dismissed_collections || []\n \n console.log('[AISearchService.getAllCollections] Settings:', {\n selected_count: selected.length,\n dismissed_count: dismissed.length,\n selected: selected\n })\n\n // Get item counts and indexing status\n const collectionInfos: CollectionInfo[] = []\n\n for (const collection of collections) {\n if (!collection.id || !collection.name) continue\n const collectionId = String(collection.id)\n \n if (!collectionId) {\n console.warn('[AISearchService] Skipping invalid collection:', collection)\n continue\n }\n\n // Get item count\n const countStmt = this.db.prepare(\n 'SELECT COUNT(*) as count FROM content WHERE collection_id = ?'\n )\n const countResult = await countStmt.bind(collectionId).first<{ count: number }>()\n const itemCount = countResult?.count || 0\n\n collectionInfos.push({\n id: collectionId,\n name: collection.name,\n display_name: collection.display_name || collection.name,\n description: collection.description,\n item_count: itemCount,\n is_indexed: selected.includes(collectionId),\n is_dismissed: dismissed.includes(collectionId),\n is_new: !selected.includes(collectionId) && !dismissed.includes(collectionId),\n })\n }\n \n console.log('[AISearchService.getAllCollections] Returning collectionInfos:', collectionInfos.length)\n const firstInfo = collectionInfos[0]\n if (collectionInfos.length > 0 && firstInfo) {\n console.log('[AISearchService.getAllCollections] First collectionInfo:', {\n id: firstInfo.id,\n name: firstInfo.name,\n display_name: firstInfo.display_name,\n item_count: firstInfo.item_count\n })\n }\n return collectionInfos\n } catch (error) {\n console.error('[AISearchService] Error fetching collections:', error)\n return []\n }\n }\n\n /**\n * Execute search query\n */\n async search(query: SearchQuery): Promise {\n const startTime = Date.now()\n const settings = await this.getSettings()\n\n if (!settings?.enabled) {\n return {\n results: [],\n total: 0,\n query_time_ms: 0,\n mode: query.mode,\n }\n }\n\n // Use AI Search if enabled and mode is 'ai'\n if (query.mode === 'ai' && settings.ai_mode_enabled && this.customRAG?.isAvailable()) {\n return this.searchAI(query, settings)\n }\n\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n\n /**\n * AI-powered semantic search using Custom RAG\n */\n private async searchAI(query: SearchQuery, settings: AISearchSettings): Promise {\n const startTime = Date.now()\n \n try {\n if (!this.customRAG) {\n console.warn('[AISearchService] CustomRAG not available, falling back to keyword search')\n return this.searchKeyword(query, settings)\n }\n\n // Use Custom RAG for semantic search - pass the full query object and settings\n const result = await this.customRAG.search(query, settings)\n\n return result\n } catch (error) {\n console.error('[AISearchService] AI search error, falling back to keyword:', error)\n // Fallback to keyword search\n return this.searchKeyword(query, settings)\n }\n }\n\n /**\n * Traditional keyword search\n */\n private async searchKeyword(\n query: SearchQuery,\n settings: AISearchSettings\n ): Promise {\n const startTime = Date.now()\n\n try {\n const conditions: string[] = []\n const params: any[] = []\n\n // Search query\n if (query.query) {\n conditions.push('(c.title LIKE ? OR c.slug LIKE ? OR c.data LIKE ?)')\n const searchTerm = `%${query.query}%`\n params.push(searchTerm, searchTerm, searchTerm)\n }\n\n // Collection filter\n if (query.filters?.collections && query.filters.collections.length > 0) {\n const placeholders = query.filters.collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...query.filters.collections)\n } else if (settings.selected_collections.length > 0) {\n // Only search indexed collections\n const placeholders = settings.selected_collections.map(() => '?').join(',')\n conditions.push(`c.collection_id IN (${placeholders})`)\n params.push(...settings.selected_collections)\n }\n\n // Status filter\n if (query.filters?.status && query.filters.status.length > 0) {\n const placeholders = query.filters.status.map(() => '?').join(',')\n conditions.push(`c.status IN (${placeholders})`)\n params.push(...query.filters.status)\n } else {\n // Exclude deleted by default\n conditions.push(\"c.status != 'deleted'\")\n }\n\n // Date range filter\n if (query.filters?.dateRange) {\n const field = query.filters.dateRange.field || 'created_at'\n if (query.filters.dateRange.start) {\n conditions.push(`c.${field} >= ?`)\n params.push(query.filters.dateRange.start.getTime())\n }\n if (query.filters.dateRange.end) {\n conditions.push(`c.${field} <= ?`)\n params.push(query.filters.dateRange.end.getTime())\n }\n }\n\n // Author filter\n if (query.filters?.author) {\n conditions.push('c.author_id = ?')\n params.push(query.filters.author)\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n // Get total count\n const countStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM content c\n ${whereClause}\n `)\n const countResult = await countStmt.bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get results\n const limit = query.limit || settings.results_limit\n const offset = query.offset || 0\n\n const resultsStmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.collection_id, c.status,\n c.created_at, c.updated_at, c.author_id, c.data,\n col.name as collection_name, col.display_name as collection_display_name,\n u.email as author_email\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n LEFT JOIN users u ON c.author_id = u.id\n ${whereClause}\n ORDER BY c.updated_at DESC\n LIMIT ? OFFSET ?\n `)\n\n const { results } = await resultsStmt.bind(...params, limit, offset).all<{\n id: string\n title: string\n slug: string\n collection_id: number\n collection_name: string\n collection_display_name: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n author_email?: string\n data: string\n }>()\n\n const searchResults: SearchResult[] = (results || []).map((row) => ({\n id: String(row.id),\n title: row.title || 'Untitled',\n slug: row.slug || '',\n collection_id: String(row.collection_id),\n collection_name: row.collection_display_name || row.collection_name,\n snippet: this.extractSnippet(row.data, query.query),\n status: row.status,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n author_name: row.author_email,\n }))\n\n const queryTime = Date.now() - startTime\n\n // Log search history\n await this.logSearch(query.query, query.mode, searchResults.length)\n\n return {\n results: searchResults,\n total,\n query_time_ms: queryTime,\n mode: query.mode,\n }\n } catch (error) {\n console.error('Keyword search error:', error)\n return {\n results: [],\n total: 0,\n query_time_ms: Date.now() - startTime,\n mode: query.mode,\n }\n }\n }\n\n /**\n * Extract snippet from content data\n */\n private extractSnippet(data: string, query: string): string {\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data\n const text = JSON.stringify(parsed).toLowerCase()\n const queryLower = query.toLowerCase()\n\n const index = text.indexOf(queryLower)\n if (index === -1) {\n // Return first 200 chars\n return JSON.stringify(parsed).substring(0, 200) + '...'\n }\n\n // Extract context around match\n const start = Math.max(0, index - 50)\n const end = Math.min(text.length, index + query.length + 50)\n return text.substring(start, end) + '...'\n } catch {\n return data.substring(0, 200) + '...'\n }\n }\n\n /**\n * Get search suggestions (autocomplete)\n */\n async getSearchSuggestions(partial: string): Promise {\n try {\n const settings = await this.getSettings()\n if (!settings?.autocomplete_enabled) {\n return []\n }\n\n // If Custom RAG is available, use AI-powered suggestions\n if (this.customRAG?.isAvailable()) {\n try {\n const aiSuggestions = await this.customRAG.getSuggestions(partial, 5)\n if (aiSuggestions.length > 0) {\n return aiSuggestions\n }\n } catch (error) {\n console.error('[AISearchService] Error getting AI suggestions:', error)\n // Fall through to history-based suggestions\n }\n }\n\n // Fallback to history-based suggestions\n const stmt = this.db.prepare(`\n SELECT DISTINCT query \n FROM ai_search_history \n WHERE query LIKE ? \n ORDER BY created_at DESC \n LIMIT 10\n `)\n const { results } = await stmt.bind(`%${partial}%`).all<{ query: string }>()\n\n return (results || []).map((r) => r.query)\n } catch (error) {\n console.error('Error getting suggestions:', error)\n return []\n }\n }\n\n /**\n * Log search query to history\n */\n private async logSearch(query: string, mode: 'ai' | 'keyword', resultsCount: number): Promise {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_history (query, mode, results_count, created_at)\n VALUES (?, ?, ?, ?)\n `)\n await stmt.bind(query, mode, resultsCount, Date.now()).run()\n } catch (error) {\n console.error('Error logging search:', error)\n }\n }\n\n /**\n * Get search analytics\n */\n async getSearchAnalytics(): Promise<{\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }> {\n try {\n // Total queries (last 30 days)\n const totalStmt = this.db.prepare(`\n SELECT COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n `)\n const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000\n const totalResult = await totalStmt.bind(thirtyDaysAgo).first<{ count: number }>()\n\n // AI vs Keyword breakdown\n const modeStmt = this.db.prepare(`\n SELECT mode, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY mode\n `)\n const { results: modeResults } = await modeStmt.bind(thirtyDaysAgo).all<{\n mode: string\n count: number\n }>()\n\n const aiCount = modeResults?.find((r) => r.mode === 'ai')?.count || 0\n const keywordCount = modeResults?.find((r) => r.mode === 'keyword')?.count || 0\n\n // Popular queries\n const popularStmt = this.db.prepare(`\n SELECT query, COUNT(*) as count \n FROM ai_search_history \n WHERE created_at >= ?\n GROUP BY query \n ORDER BY count DESC \n LIMIT 10\n `)\n const { results: popularResults } = await popularStmt.bind(thirtyDaysAgo).all<{\n query: string\n count: number\n }>()\n\n return {\n total_queries: totalResult?.count || 0,\n ai_queries: aiCount,\n keyword_queries: keywordCount,\n popular_queries: (popularResults || []).map((r) => ({\n query: r.query,\n count: r.count,\n })),\n average_query_time: 0, // TODO: Track query times\n }\n } catch (error) {\n console.error('Error getting analytics:', error)\n return {\n total_queries: 0,\n ai_queries: 0,\n keyword_queries: 0,\n popular_queries: [],\n average_query_time: 0,\n }\n }\n }\n\n /**\n * Verify Custom RAG is available\n */\n verifyBinding(): boolean {\n return this.customRAG?.isAvailable() ?? false\n }\n\n /**\n * Get Custom RAG service instance (for indexer)\n */\n getCustomRAG(): CustomRAGService | undefined {\n return this.customRAG\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { AISearchSettings, IndexStatus } from '../types'\nimport { CustomRAGService } from './custom-rag.service'\n\n/**\n * Index Manager Service\n * Handles indexing of content items using Custom RAG with Vectorize\n */\nexport class IndexManager {\n private customRAG?: CustomRAGService\n\n constructor(\n private db: D1Database,\n private ai?: any, // Workers AI for embeddings\n private vectorize?: any // Vectorize for vector search\n ) {\n // Initialize Custom RAG if bindings are available\n if (this.ai && this.vectorize) {\n this.customRAG = new CustomRAGService(db, ai, vectorize)\n console.log('[IndexManager] Custom RAG initialized')\n }\n }\n\n /**\n * Index all content items within a collection using Custom RAG\n */\n async indexCollection(collectionId: string): Promise {\n try {\n // Get collection info\n const collectionStmt = this.db.prepare(\n 'SELECT id, name, display_name FROM collections WHERE id = ?'\n )\n const collection = await collectionStmt.bind(collectionId).first<{\n id: string\n name: string\n display_name: string\n }>()\n\n if (!collection) {\n throw new Error(`Collection ${collectionId} not found`)\n }\n\n // Update status to indexing\n await this.updateIndexStatus(collectionId, {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n status: 'indexing',\n })\n\n // Use Custom RAG for indexing if available\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Using Custom RAG to index collection ${collectionId}`)\n \n const result = await this.customRAG.indexCollection(collectionId)\n\n const finalStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: result.total_items,\n indexed_items: result.indexed_chunks,\n last_sync_at: Date.now(),\n status: result.errors > 0 ? 'error' : 'completed',\n error_message: result.errors > 0 ? `${result.errors} errors during indexing` : undefined\n }\n\n await this.updateIndexStatus(collectionId, finalStatus)\n return finalStatus\n }\n\n // Fallback: No indexing without Custom RAG\n console.warn(`[IndexManager] Custom RAG not available, skipping indexing for ${collectionId}`)\n \n const fallbackStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: collection.display_name,\n total_items: 0,\n indexed_items: 0,\n last_sync_at: Date.now(),\n status: 'completed',\n error_message: 'Custom RAG not available - using keyword search only'\n }\n\n await this.updateIndexStatus(collectionId, fallbackStatus)\n return fallbackStatus\n } catch (error) {\n console.error(`[IndexManager] Error indexing collection ${collectionId}:`, error)\n const errorStatus: IndexStatus = {\n collection_id: collectionId,\n collection_name: 'Unknown',\n total_items: 0,\n indexed_items: 0,\n status: 'error',\n error_message: error instanceof Error ? error.message : String(error),\n }\n await this.updateIndexStatus(collectionId, errorStatus)\n return errorStatus\n }\n }\n\n /**\n * Index a single content item\n */\n private async indexContentItem(\n item: {\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n },\n collectionId: string\n ): Promise {\n try {\n // Parse content data\n let parsedData: any = {}\n try {\n parsedData = typeof item.data === 'string' ? JSON.parse(item.data) : item.data\n } catch {\n parsedData = {}\n }\n\n // Prepare document for AI Search\n const document = {\n id: `content_${item.id}`,\n title: item.title || 'Untitled',\n slug: item.slug || '',\n content: this.extractSearchableText(parsedData),\n metadata: {\n collection_id: collectionId,\n collection_name: item.collection_name,\n collection_display_name: item.collection_display_name,\n status: item.status,\n created_at: item.created_at,\n updated_at: item.updated_at,\n author_id: item.author_id,\n },\n }\n\n // TODO: Call Cloudflare AI Search API to index document\n // await this.aiSearch.index(document)\n\n // For now, just log (actual implementation will use AI Search API)\n console.log(`Indexed content item: ${item.id}`)\n } catch (error) {\n console.error(`Error indexing content item ${item.id}:`, error)\n throw error\n }\n }\n\n /**\n * Extract searchable text from content data\n */\n private extractSearchableText(data: any): string {\n const parts: string[] = []\n\n // Add title if present\n if (data.title) parts.push(String(data.title))\n if (data.name) parts.push(String(data.name))\n\n // Add description/content fields\n if (data.description) parts.push(String(data.description))\n if (data.content) parts.push(String(data.content))\n if (data.body) parts.push(String(data.body))\n if (data.text) parts.push(String(data.text))\n\n // Add all string values from data\n const extractStrings = (obj: any): void => {\n if (typeof obj === 'string') {\n parts.push(obj)\n } else if (Array.isArray(obj)) {\n obj.forEach(extractStrings)\n } else if (obj && typeof obj === 'object') {\n Object.values(obj).forEach(extractStrings)\n }\n }\n\n extractStrings(data)\n\n return parts.join(' ')\n }\n\n /**\n * Update a single content item in the index\n */\n async updateIndex(collectionId: number, contentId: string): Promise {\n try {\n // Get content item\n const stmt = this.db.prepare(`\n SELECT \n c.id, c.title, c.slug, c.data, c.status,\n c.created_at, c.updated_at, c.author_id,\n col.name as collection_name, col.display_name as collection_display_name\n FROM content c\n JOIN collections col ON c.collection_id = col.id\n WHERE c.id = ? AND c.collection_id = ?\n `)\n const item = await stmt.bind(contentId, collectionId).first<{\n id: string\n title: string\n slug: string\n data: string\n status: string\n created_at: number\n updated_at: number\n author_id?: string\n collection_name: string\n collection_display_name: string\n }>()\n\n if (!item) {\n throw new Error(`Content item ${contentId} not found`)\n }\n\n // Re-index the item\n await this.indexContentItem(item, String(collectionId))\n\n // Update last sync time for collection\n const status = await this.getIndexStatus(String(collectionId))\n if (status) {\n await this.updateIndexStatus(String(collectionId), {\n ...status,\n last_sync_at: Date.now(),\n })\n }\n } catch (error) {\n console.error(`Error updating index for content ${contentId}:`, error)\n throw error\n }\n }\n\n /**\n * Remove a content item from the index using Custom RAG\n */\n async removeFromIndex(collectionId: string, contentId: string): Promise {\n try {\n if (this.customRAG?.isAvailable()) {\n console.log(`[IndexManager] Removing content ${contentId} from index`)\n await this.customRAG.removeContentFromIndex(contentId)\n } else {\n console.warn(`[IndexManager] Custom RAG not available, skipping removal for ${contentId}`)\n }\n } catch (error) {\n console.error(`[IndexManager] Error removing content ${contentId} from index:`, error)\n throw error\n }\n }\n\n /**\n * Get indexing status for a collection\n */\n async getIndexStatus(collectionId: string): Promise {\n try {\n const stmt = this.db.prepare(\n 'SELECT * FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const result = await stmt.bind(collectionId).first<{\n id: number\n collection_id: string\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n if (!result) {\n return null\n }\n\n return {\n collection_id: String(result.collection_id),\n collection_name: result.collection_name,\n total_items: result.total_items,\n indexed_items: result.indexed_items,\n last_sync_at: result.last_sync_at,\n status: result.status as IndexStatus['status'],\n error_message: result.error_message,\n }\n } catch (error) {\n console.error(`Error getting index status for collection ${collectionId}:`, error)\n return null\n }\n }\n\n /**\n * Get indexing status for all collections\n */\n async getAllIndexStatus(): Promise> {\n try {\n const stmt = this.db.prepare('SELECT * FROM ai_search_index_meta')\n const { results } = await stmt.all<{\n id: number\n collection_id: number\n collection_name: string\n total_items: number\n indexed_items: number\n last_sync_at?: number\n status: string\n error_message?: string\n }>()\n\n const statusMap: Record = {}\n\n for (const row of results || []) {\n const collectionId = String(row.collection_id)\n statusMap[collectionId] = {\n collection_id: collectionId,\n collection_name: row.collection_name,\n total_items: row.total_items,\n indexed_items: row.indexed_items,\n last_sync_at: row.last_sync_at,\n status: row.status as IndexStatus['status'],\n error_message: row.error_message,\n }\n }\n\n return statusMap\n } catch (error) {\n console.error('Error getting all index status:', error)\n return {}\n }\n }\n\n /**\n * Update index status in database\n */\n private async updateIndexStatus(collectionId: string, status: IndexStatus): Promise {\n try {\n // Check if record exists\n const checkStmt = this.db.prepare(\n 'SELECT id FROM ai_search_index_meta WHERE collection_id = ?'\n )\n const existing = await checkStmt.bind(collectionId).first<{ id: number }>()\n\n if (existing) {\n // Update existing\n const stmt = this.db.prepare(`\n UPDATE ai_search_index_meta \n SET collection_name = ?,\n total_items = ?,\n indexed_items = ?,\n last_sync_at = ?,\n status = ?,\n error_message = ?\n WHERE collection_id = ?\n `)\n await stmt\n .bind(\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null,\n String(collectionId)\n )\n .run()\n } else {\n // Insert new\n const stmt = this.db.prepare(`\n INSERT INTO ai_search_index_meta (\n collection_id, collection_name, total_items, indexed_items,\n last_sync_at, status, error_message\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n await stmt\n .bind(\n String(status.collection_id),\n status.collection_name,\n status.total_items,\n status.indexed_items,\n status.last_sync_at || null,\n status.status,\n status.error_message || null\n )\n .run()\n }\n } catch (error) {\n console.error(`Error updating index status for collection ${collectionId}:`, error)\n throw error\n }\n }\n\n /**\n * Sync all selected collections\n */\n async syncAll(selectedCollections: string[]): Promise {\n for (const collectionId of selectedCollections) {\n try {\n await this.indexCollection(collectionId)\n } catch (error) {\n console.error(`Error syncing collection ${collectionId}:`, error)\n }\n }\n }\n}\n","import { renderAdminLayout } from '../../../../templates/layouts/admin-layout-v2.template'\nimport type {\n AISearchSettings,\n CollectionInfo,\n IndexStatus,\n NewCollectionNotification,\n} from '../types'\n\ninterface SettingsPageData {\n settings: AISearchSettings | null\n collections: CollectionInfo[]\n newCollections: NewCollectionNotification[]\n indexStatus: Record\n analytics: {\n total_queries: number\n ai_queries: number\n keyword_queries: number\n popular_queries: Array<{ query: string; count: number }>\n average_query_time: number\n }\n user?: {\n name: string\n email: string\n role: string\n }\n}\n\nexport function renderSettingsPage(data: SettingsPageData): string {\n const settings = data.settings || {\n enabled: false,\n ai_mode_enabled: true,\n selected_collections: [],\n dismissed_collections: [],\n autocomplete_enabled: true,\n cache_duration: 1,\n results_limit: 20,\n index_media: false,\n }\n\n // Ensure arrays exist\n const selectedCollections = Array.isArray(settings.selected_collections) ? settings.selected_collections : []\n const dismissedCollections = Array.isArray(settings.dismissed_collections) ? settings.dismissed_collections : []\n\n const enabled = settings.enabled === true\n const aiModeEnabled = settings.ai_mode_enabled !== false\n const autocompleteEnabled = settings.autocomplete_enabled !== false\n const indexMedia = settings.index_media === true\n\n const selectedCollectionIds = new Set(selectedCollections.map(id => String(id)))\n const dismissedCollectionIds = new Set(dismissedCollections.map(id => String(id)))\n\n // Ensure collections array exists\n const collections = Array.isArray(data.collections) ? data.collections : []\n\n // Debug: Log collections in template\n console.log('[SettingsPage Template] Collections received:', collections.length)\n if (collections.length > 0) {\n console.log('[SettingsPage Template] First collection:', collections[0])\n }\n\n const content = `\n
\n \n
\n
\n

🔍 AI Search Settings

\n

\n Configure advanced search with Cloudflare AI Search. Select collections to index and manage search preferences.\n

\n
\n \n
\n\n\n \n
\n
\n \n
\n

🔍 Search Settings

\n
\n
\n \n
\n \n

Turn on advanced search capabilities across your content

\n
\n
\n\n
\n \n
\n \n

\n Enable natural language queries (requires Cloudflare Workers AI binding)\n → Setup Guide\n

\n

\n ⚠️ If AI binding unavailable, will fallback to keyword search\n

\n
\n
\n
\n
\n\n
\n\n \n
\n
\n
\n

📚 Collections to Index

\n

\n Select which content collections should be indexed and searchable. Only checked collections will be included in search results.\n

\n
\n
\n
\n ${collections.length === 0\n ? '

No collections available. Create collections first.

'\n : collections.map((collection) => {\n const collectionId = String(collection.id)\n const isChecked = selectedCollectionIds.has(collectionId)\n const isDismissed = dismissedCollectionIds.has(collectionId)\n const indexStatusMap: Record = data.indexStatus || {}\n const status = indexStatusMap[collectionId]\n // Only show NEW badge if collection is new, not dismissed, and has never been indexed\n const isNew = collection.is_new === true && !isDismissed && !status\n // Only show status badge if collection is CHECKED and has status\n const statusBadge = (status && isChecked)\n ? `${status.status}`\n : ''\n\n return `
\n \n
\n \n

\n ${collection.description || collection.name || 'No description'} • ${collection.item_count || 0} items\n ${status ? ` • ${status.indexed_items}/${status.total_items} indexed` : ''}\n

\n ${status && status.status === 'indexing'\n ? `
\n
\n
`\n : ''}\n
\n ${isChecked ? `\n \n \n \n \n Re-index\n \n ` : ''}\n
`\n }).join('')}\n
\n
\n\n
\n\n \n
\n

⚙️ Advanced Options

\n
\n
\n \n
\n \n

Show search suggestions as users type

\n
\n
\n\n
\n \n
\n \n

Include media files in search results

\n
\n
\n\n
\n \n \n
\n
\n \n \n
\n
\n
\n\n \n
\n

\n 💡 Collections marked as NEW haven't been indexed yet\n

\n \n
\n
\n
\n\n\n \n
\n

📊 Search Analytics

\n
\n
\n
Total Queries
\n
${data.analytics.total_queries}
\n
\n
\n
AI Queries
\n
${data.analytics.ai_queries}
\n
\n
\n
Keyword Queries
\n
${data.analytics.keyword_queries}
\n
\n
\n ${data.analytics.popular_queries.length > 0\n ? `\n
\n

Popular Searches

\n
\n ${data.analytics.popular_queries.map(\n (item) => `\n
\n \"${item.query}\"\n ${item.count} times\n
\n `\n ).join('')}\n
\n
\n `\n : '

No search history yet.

'}\n
\n\n \n
\n
\n \n Settings Saved Successfully!\n
\n
\n
\n \n `\n\n return renderAdminLayout({\n title: 'AI Search Settings',\n pageTitle: 'AI Search Settings',\n currentPath: '/admin/plugins/ai-search/settings',\n user: data.user,\n content: content\n })\n}\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { requireAuth } from '../../../../middleware'\nimport { AISearchService } from '../services/ai-search'\nimport { IndexManager } from '../services/indexer'\nimport { renderSettingsPage } from '../components/settings-page'\nimport type { AISearchSettings, SearchQuery } from '../types'\n\ntype Variables = {\n user: {\n id: number\n email: string\n role: string\n }\n}\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// Apply authentication middleware\nadminRoutes.use('*', requireAuth())\n\n/**\n * GET /admin/plugins/ai-search\n * Render settings page\n */\nadminRoutes.get('/', async (c) => {\n try {\n const user = c.get('user')\n const db = c.env.DB\n const ai = (c.env as any).AI // Workers AI for embeddings\n const vectorize = (c.env as any).VECTORIZE_INDEX // Vectorize for vector search\n\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n // Get settings\n const settings = await service.getSettings()\n console.log('[AI Search Settings Route] Settings loaded:', !!settings)\n\n // Get all collections with status\n const collections = await service.getAllCollections()\n console.log('[AI Search Settings Route] Collections returned:', collections.length)\n \n // If no collections, try direct query\n if (collections.length === 0) {\n const directQuery = await db.prepare('SELECT id, name, display_name FROM collections WHERE is_active = 1').all()\n console.log('[AI Search Settings Route] Direct DB query found:', directQuery.results?.length || 0, 'collections')\n if (directQuery.results && directQuery.results.length > 0) {\n console.log('[AI Search Settings Route] Sample from DB:', directQuery.results[0])\n }\n } else if (collections.length > 0 && collections[0]) {\n console.log('[AI Search Settings Route] First collection:', {\n id: collections[0].id,\n name: collections[0].name,\n display_name: collections[0].display_name\n })\n }\n\n // Get new collections notifications\n const newCollections = await service.detectNewCollections()\n console.log('AI Search: New collections:', newCollections.length)\n\n // Get index status for all collections\n const indexStatus = await indexer.getAllIndexStatus()\n console.log('AI Search: Index status:', Object.keys(indexStatus).length)\n\n // Get analytics\n const analytics = await service.getSearchAnalytics()\n\n return c.html(\n renderSettingsPage({\n settings,\n collections: collections || [],\n newCollections: newCollections || [],\n indexStatus: indexStatus || {},\n analytics,\n user: {\n name: user.email,\n email: user.email,\n role: user.role,\n },\n })\n )\n } catch (error) {\n console.error('Error rendering AI Search settings:', error)\n return c.html(`

Error loading settings: ${error instanceof Error ? error.message : String(error)}

`, 500)\n }\n})\n\n/**\n * POST /admin/plugins/ai-search\n * Update settings\n */\nadminRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n console.log('[AI Search POST] Received body:', JSON.stringify(body, null, 2))\n\n // Get current settings\n const currentSettings = await service.getSettings()\n console.log('[AI Search POST] Current settings selected_collections:', currentSettings?.selected_collections)\n\n // Update settings\n const updatedSettings: Partial = {\n enabled: body.enabled !== undefined ? Boolean(body.enabled) : currentSettings?.enabled,\n ai_mode_enabled: body.ai_mode_enabled !== undefined ? Boolean(body.ai_mode_enabled) : currentSettings?.ai_mode_enabled,\n selected_collections: Array.isArray(body.selected_collections) ? body.selected_collections.map(String) : (currentSettings?.selected_collections || []),\n dismissed_collections: Array.isArray(body.dismissed_collections) ? body.dismissed_collections.map(String) : (currentSettings?.dismissed_collections || []),\n autocomplete_enabled: body.autocomplete_enabled !== undefined ? Boolean(body.autocomplete_enabled) : currentSettings?.autocomplete_enabled,\n cache_duration: body.cache_duration ? Number(body.cache_duration) : currentSettings?.cache_duration,\n results_limit: body.results_limit ? Number(body.results_limit) : currentSettings?.results_limit,\n index_media: body.index_media !== undefined ? Boolean(body.index_media) : currentSettings?.index_media,\n }\n\n console.log('[AI Search POST] Updated settings selected_collections:', updatedSettings.selected_collections)\n\n // If collections changed, trigger indexing\n const collectionsChanged =\n JSON.stringify(updatedSettings.selected_collections) !==\n JSON.stringify(currentSettings?.selected_collections || [])\n\n const saved = await service.updateSettings(updatedSettings)\n console.log('[AI Search POST] Settings saved, selected_collections:', saved.selected_collections)\n\n // Start indexing if collections were added\n if (collectionsChanged && updatedSettings.selected_collections) {\n console.log('[AI Search POST] Collections changed, starting background indexing')\n // Start indexing in background (non-blocking) - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .syncAll(updatedSettings.selected_collections)\n .then(() => console.log('[AI Search POST] Background indexing completed'))\n .catch((error) => console.error('[AI Search POST] Background indexing error:', error))\n )\n }\n\n return c.json({ success: true, settings: saved })\n } catch (error) {\n console.error('Error updating AI Search settings:', error)\n return c.json({ error: 'Failed to update settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/settings\n * Get settings API endpoint\n */\nadminRoutes.get('/api/settings', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const settings = await service.getSettings()\n return c.json({ success: true, data: settings })\n } catch (error) {\n console.error('Error fetching settings:', error)\n return c.json({ error: 'Failed to fetch settings' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/new-collections\n * Get new collections that aren't indexed or dismissed\n */\nadminRoutes.get('/api/new-collections', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const notifications = await service.detectNewCollections()\n return c.json({ success: true, data: notifications })\n } catch (error) {\n console.error('Error detecting new collections:', error)\n return c.json({ error: 'Failed to detect new collections' }, 500)\n }\n})\n\n/**\n * GET /admin/api/ai-search/status\n * Get indexing status\n */\nadminRoutes.get('/api/status', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const status = await indexer.getAllIndexStatus()\n return c.json({ success: true, data: status })\n } catch (error) {\n console.error('Error fetching index status:', error)\n return c.json({ error: 'Failed to fetch status' }, 500)\n }\n})\n\n/**\n * POST /admin/api/ai-search/reindex\n * Trigger re-indexing for a collection\n */\nadminRoutes.post('/api/reindex', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const indexer = new IndexManager(db, ai, vectorize)\n\n const body = await c.req.json()\n const collectionIdRaw: unknown = body.collection_id\n const collectionId = collectionIdRaw ? String(collectionIdRaw) : ''\n\n if (!collectionId || collectionId === 'undefined' || collectionId === 'null') {\n return c.json({ error: 'collection_id is required' }, 400)\n }\n\n // Start indexing in background - must use waitUntil to ensure it completes\n c.executionCtx.waitUntil(\n indexer\n .indexCollection(collectionId)\n .then(() => console.log(`[AI Search Reindex] Completed for collection ${collectionId}`))\n .catch((error) => console.error(`[AI Search Reindex] Error for collection ${collectionId}:`, error))\n )\n\n return c.json({ success: true, message: 'Re-indexing started' })\n } catch (error) {\n console.error('Error starting re-index:', error)\n return c.json({ error: 'Failed to start re-indexing' }, 500)\n }\n})\n\nexport default adminRoutes\n","import { Hono } from 'hono'\nimport type { Bindings } from '../../../../app'\nimport { AISearchService } from '../services/ai-search'\nimport type { SearchQuery } from '../types'\n\ntype Variables = {\n user?: {\n id: number\n email: string\n role: string\n }\n}\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n/**\n * POST /api/search\n * Execute search query\n */\napiRoutes.post('/', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const body = await c.req.json()\n\n const query: SearchQuery = {\n query: body.query || '',\n mode: body.mode || 'keyword',\n filters: body.filters || {},\n limit: body.limit ? Number(body.limit) : undefined,\n offset: body.offset ? Number(body.offset) : undefined,\n }\n\n // Convert date strings to Date objects if present\n if (query.filters?.dateRange) {\n if (typeof query.filters.dateRange.start === 'string') {\n query.filters.dateRange.start = new Date(query.filters.dateRange.start)\n }\n if (typeof query.filters.dateRange.end === 'string') {\n query.filters.dateRange.end = new Date(query.filters.dateRange.end)\n }\n }\n\n const results = await service.search(query)\n\n return c.json({\n success: true,\n data: results,\n })\n } catch (error) {\n console.error('Search error:', error)\n return c.json(\n {\n success: false,\n error: 'Search failed',\n message: error instanceof Error ? error.message : String(error),\n },\n 500\n )\n }\n})\n\n/**\n * GET /api/search/suggest\n * Get search suggestions (autocomplete)\n */\napiRoutes.get('/suggest', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const query = c.req.query('q') || ''\n\n if (!query || query.length < 2) {\n return c.json({ success: true, data: [] })\n }\n\n const suggestions = await service.getSearchSuggestions(query)\n\n return c.json({\n success: true,\n data: suggestions,\n })\n } catch (error) {\n console.error('Suggestions error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get suggestions',\n },\n 500\n )\n }\n})\n\n/**\n * GET /admin/api/search/analytics\n * Get search analytics\n */\napiRoutes.get('/analytics', async (c) => {\n try {\n const db = c.env.DB\n const ai = (c.env as any).AI\n const vectorize = (c.env as any).VECTORIZE_INDEX\n const service = new AISearchService(db, ai, vectorize)\n\n const analytics = await service.getSearchAnalytics()\n\n return c.json({\n success: true,\n data: analytics,\n })\n } catch (error) {\n console.error('Analytics error:', error)\n return c.json(\n {\n success: false,\n error: 'Failed to get analytics',\n },\n 500\n )\n }\n})\n\nexport default apiRoutes\n","{\n \"id\": \"ai-search\",\n \"name\": \"AI Search\",\n \"description\": \"Advanced search with Cloudflare AI Search. Full-text search, semantic search, and advanced filtering across all content collections.\",\n \"version\": \"1.0.0\",\n \"author\": \"SonicJS\",\n \"category\": \"content\",\n \"icon\": \"magnifying-glass\",\n \"homepage\": \"https://developers.cloudflare.com/ai-search/\",\n \"repository\": \"https://github.com/sonicjs/sonicjs\",\n \"license\": \"MIT\",\n \"permissions\": [\n \"settings:write\",\n \"admin:access\",\n \"content:read\"\n ],\n \"dependencies\": [],\n \"configSchema\": {\n \"enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI Search\",\n \"description\": \"Enable or disable AI Search functionality\",\n \"default\": true\n },\n \"ai_mode_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable AI/Semantic Search\",\n \"description\": \"Enable AI-powered semantic search (requires Cloudflare Workers AI binding)\",\n \"default\": false\n },\n \"ai_provider\": {\n \"type\": \"string\",\n \"label\": \"AI Provider\",\n \"description\": \"Which AI service to use for semantic search\",\n \"default\": \"cloudflare\",\n \"enum\": [\n \"cloudflare\",\n \"keyword-only\"\n ]\n },\n \"autocomplete_enabled\": {\n \"type\": \"boolean\",\n \"label\": \"Enable Autocomplete\",\n \"description\": \"Show search suggestions as user types\",\n \"default\": true\n },\n \"cache_duration\": {\n \"type\": \"number\",\n \"label\": \"Cache Duration (hours)\",\n \"description\": \"How long to cache search results\",\n \"default\": 1,\n \"min\": 0,\n \"max\": 24\n },\n \"results_limit\": {\n \"type\": \"number\",\n \"label\": \"Results Per Page\",\n \"description\": \"Maximum number of results to show per page\",\n \"default\": 20,\n \"min\": 10,\n \"max\": 100\n },\n \"index_media\": {\n \"type\": \"boolean\",\n \"label\": \"Index Media Metadata\",\n \"description\": \"Include R2 media files in search index\",\n \"default\": false\n }\n },\n \"adminMenu\": {\n \"label\": \"AI Search\",\n \"icon\": \"magnifying-glass\",\n \"href\": \"/admin/plugins/ai-search\",\n \"parentId\": \"plugins\",\n \"order\": 50\n },\n \"codeName\": \"ai-search-plugin\",\n \"iconEmoji\": \"🔍\",\n \"is_core\": true,\n \"defaultSettings\": {\n \"enabled\": true,\n \"ai_mode_enabled\": true,\n \"selected_collections\": [],\n \"dismissed_collections\": [],\n \"autocomplete_enabled\": true,\n \"cache_duration\": 1,\n \"results_limit\": 20,\n \"index_media\": false\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport { AISearchService } from './services/ai-search'\nimport { IndexManager } from './services/indexer'\nimport adminRoutes from './routes/admin'\nimport apiRoutes from './routes/api'\nimport manifest from './manifest.json'\n\n/**\n * AI Search Plugin\n * \n * Provides advanced search capabilities using Cloudflare AI Search.\n * Features:\n * - Semantic/AI-powered search with natural language queries\n * - Traditional keyword search\n * - Full-text search across all content collections\n * - Advanced filtering (collections, dates, status, tags)\n * - Autocomplete suggestions\n * - Search analytics\n * - Dynamic collection discovery and indexing\n * \n * @example\n * ```typescript\n * import { AISearchService } from '@sonicjs-cms/core/plugins'\n * \n * const service = new AISearchService(db, aiSearch)\n * const results = await service.search({\n * query: 'blog posts about security',\n * mode: 'ai',\n * filters: { collections: [1, 2] }\n * })\n * ```\n */\n\nexport const aiSearchPlugin = new PluginBuilder({\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n author: { name: manifest.author },\n})\n .metadata({\n description: manifest.description,\n author: { name: manifest.author },\n })\n .addService('aiSearch', AISearchService)\n .addService('indexManager', IndexManager)\n .addRoute('/admin/plugins/ai-search', adminRoutes as any)\n .addRoute('/api/search', apiRoutes as any)\n .build()\n\n// Export services and types for easy import\nexport { AISearchService } from './services/ai-search'\nexport { IndexManager } from './services/indexer'\nexport type {\n AISearchSettings,\n SearchQuery,\n SearchResponse,\n SearchResult,\n CollectionInfo,\n IndexStatus,\n} from './types'\n","/**\n * Magic Link Authentication Plugin\n *\n * Provides passwordless authentication via email magic links\n * Users receive a secure one-time link to sign in without passwords\n */\n\nimport { Hono } from 'hono'\nimport { z } from 'zod'\nimport type { Plugin, PluginContext } from '../../types'\nimport type { D1Database } from '@cloudflare/workers-types'\nimport { AuthManager, getJwtExpirySecondsFromDb } from '../../../middleware/auth'\n\nconst magicLinkRequestSchema = z.object({\n email: z.string().email('Valid email is required')\n})\n\nexport function createMagicLinkAuthPlugin(): Plugin {\n const magicLinkRoutes = new Hono()\n\n // Request a magic link\n magicLinkRoutes.post('/request', async (c: any) => {\n try {\n const body = await c.req.json()\n const validation = magicLinkRequestSchema.safeParse(body)\n\n if (!validation.success) {\n return c.json({\n error: 'Validation failed',\n details: validation.error.issues\n }, 400)\n }\n\n const { email } = validation.data\n const normalizedEmail = email.toLowerCase()\n const db = c.env.DB as D1Database\n\n // Check rate limiting\n const oneHourAgo = Date.now() - (60 * 60 * 1000)\n const recentLinks = await db.prepare(`\n SELECT COUNT(*) as count\n FROM magic_links\n WHERE user_email = ? AND created_at > ?\n `).bind(normalizedEmail, oneHourAgo).first() as any\n\n const rateLimitPerHour = 5 // TODO: Get from plugin settings\n if (recentLinks && recentLinks.count >= rateLimitPerHour) {\n return c.json({\n error: 'Too many requests. Please try again later.'\n }, 429)\n }\n\n // Check if user exists\n const user = await db.prepare(`\n SELECT id, email, role, is_active\n FROM users\n WHERE email = ?\n `).bind(normalizedEmail).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && !allowNewUsers) {\n // Don't reveal if user exists or not for security\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.'\n })\n }\n\n if (user && !user.is_active) {\n return c.json({\n error: 'This account has been deactivated.'\n }, 403)\n }\n\n // Generate secure token\n const token = crypto.randomUUID() + '-' + crypto.randomUUID()\n const tokenId = crypto.randomUUID()\n const linkExpiryMinutes = 15 // TODO: Get from plugin settings\n const expiresAt = Date.now() + (linkExpiryMinutes * 60 * 1000)\n\n // Store magic link\n await db.prepare(`\n INSERT INTO magic_links (\n id, user_email, token, expires_at, used, created_at, ip_address, user_agent\n ) VALUES (?, ?, ?, ?, 0, ?, ?, ?)\n `).bind(\n tokenId,\n normalizedEmail,\n token,\n expiresAt,\n Date.now(),\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || 'unknown',\n c.req.header('user-agent') || 'unknown'\n ).run()\n\n // Generate magic link URL\n const baseUrl = new URL(c.req.url).origin\n const magicLink = `${baseUrl}/auth/magic-link/verify?token=${token}`\n\n // Send email via email plugin\n try {\n const emailPlugin = c.env.plugins?.get('email')\n if (emailPlugin && emailPlugin.sendEmail) {\n await emailPlugin.sendEmail({\n to: normalizedEmail,\n subject: 'Your Magic Link to Sign In',\n html: renderMagicLinkEmail(magicLink, linkExpiryMinutes)\n })\n } else {\n console.error('Email plugin not available')\n // In production, this should fail. For now, log the link for testing\n console.log(`Magic link for ${normalizedEmail}: ${magicLink}`)\n }\n } catch (error) {\n console.error('Failed to send magic link email:', error)\n return c.json({\n error: 'Failed to send email. Please try again later.'\n }, 500)\n }\n\n return c.json({\n message: 'If an account exists for this email, you will receive a magic link shortly.',\n // For development only - remove in production\n ...(c.env.ENVIRONMENT === 'development' && { dev_link: magicLink })\n })\n } catch (error) {\n console.error('Magic link request error:', error)\n return c.json({ error: 'Failed to process request' }, 500)\n }\n })\n\n // Verify magic link and sign in\n magicLinkRoutes.get('/verify', async (c: any) => {\n try {\n const token = c.req.query('token')\n\n if (!token) {\n return c.redirect('/auth/login?error=Invalid magic link')\n }\n\n const db = c.env.DB as D1Database\n\n // Find magic link\n const magicLink = await db.prepare(`\n SELECT * FROM magic_links\n WHERE token = ? AND used = 0\n `).bind(token).first() as any\n\n if (!magicLink) {\n return c.redirect('/auth/login?error=Invalid or expired magic link')\n }\n\n // Check expiration\n if (magicLink.expires_at < Date.now()) {\n return c.redirect('/auth/login?error=This magic link has expired')\n }\n\n // Get or create user\n let user = await db.prepare(`\n SELECT * FROM users WHERE email = ? AND is_active = 1\n `).bind(magicLink.user_email).first() as any\n\n const allowNewUsers = false // TODO: Get from plugin settings\n\n if (!user && allowNewUsers) {\n // Create new user\n const userId = crypto.randomUUID()\n const username = magicLink.user_email.split('@')[0]\n const now = Date.now()\n\n await db.prepare(`\n INSERT INTO users (\n id, email, username, first_name, last_name,\n password_hash, role, is_active, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, NULL, 'viewer', 1, ?, ?)\n `).bind(\n userId,\n magicLink.user_email,\n username,\n username,\n '',\n now,\n now\n ).run()\n\n user = {\n id: userId,\n email: magicLink.user_email,\n username,\n role: 'viewer'\n }\n } else if (!user) {\n return c.redirect('/auth/login?error=No account found for this email')\n }\n\n // Mark magic link as used\n await db.prepare(`\n UPDATE magic_links\n SET used = 1, used_at = ?\n WHERE id = ?\n `).bind(Date.now(), magicLink.id).run()\n\n // Generate JWT token\n const tokenTtl = await getJwtExpirySecondsFromDb((c.env as any).DB, c.env as any)\n const jwtToken = await AuthManager.generateToken(\n user.id,\n user.email,\n user.role,\n (c.env as any).JWT_SECRET,\n tokenTtl\n )\n\n // Set auth cookie\n AuthManager.setAuthCookie(c, jwtToken, { maxAge: tokenTtl })\n\n // Update last login\n await db.prepare(`\n UPDATE users SET last_login_at = ? WHERE id = ?\n `).bind(Date.now(), user.id).run()\n\n // Redirect to admin dashboard\n return c.redirect('/admin/dashboard?message=Successfully signed in')\n } catch (error) {\n console.error('Magic link verification error:', error)\n return c.redirect('/auth/login?error=Authentication failed')\n }\n })\n\n return {\n name: 'magic-link-auth',\n version: '1.0.0',\n description: 'Passwordless authentication via email magic links',\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n dependencies: ['email'],\n\n routes: [{\n path: '/auth/magic-link',\n handler: magicLinkRoutes,\n description: 'Magic link authentication endpoints',\n requiresAuth: false\n }],\n\n async install(context: PluginContext) {\n console.log('Installing magic-link-auth plugin...')\n // Migration is handled by plugin system\n },\n\n async activate(context: PluginContext) {\n console.log('Magic link authentication activated')\n console.log('Users can now sign in via /auth/magic-link/request')\n },\n\n async deactivate(context: PluginContext) {\n console.log('Magic link authentication deactivated')\n },\n\n async uninstall(context: PluginContext) {\n console.log('Uninstalling magic-link-auth plugin...')\n // Optionally clean up magic_links table\n // await context.db.prepare('DROP TABLE IF EXISTS magic_links').run()\n }\n }\n}\n\n/**\n * Render magic link email template\n */\nfunction renderMagicLinkEmail(magicLink: string, expiryMinutes: number): string {\n return `\n \n \n \n \n \n Your Magic Link\n \n \n \n
\n
\n

🔗 Your Magic Link

\n
\n\n
\n

Hello!

\n

You requested a magic link to sign in to your account. Click the button below to continue:

\n\n
\n Sign In\n
\n\n

⏰ This link expires in ${expiryMinutes} minutes

\n\n
\n Security Notice: If you didn't request this link, you can safely ignore this email.\n Someone may have entered your email address by mistake.\n
\n
\n\n
\n

This is an automated email from SonicJS.

\n

For security, this link can only be used once.

\n
\n
\n \n \n `\n}\n\nexport default createMagicLinkAuthPlugin()\n","export type SecurityEventType =\n | 'login_success'\n | 'login_failure'\n | 'registration'\n | 'password_reset_request'\n | 'password_reset_complete'\n | 'account_lockout'\n | 'suspicious_activity'\n | 'logout'\n | 'permission_denied'\n\nexport type SecuritySeverity = 'info' | 'warning' | 'critical'\n\nexport interface SecurityEvent {\n id: string\n eventType: SecurityEventType\n severity: SecuritySeverity\n userId?: string | null\n email?: string | null\n ipAddress?: string | null\n userAgent?: string | null\n countryCode?: string | null\n requestPath?: string | null\n requestMethod?: string | null\n details?: Record | null\n fingerprint?: string | null\n blocked: boolean\n createdAt: number\n}\n\nexport interface SecurityEventInsert {\n eventType: SecurityEventType\n severity?: SecuritySeverity\n userId?: string\n email?: string\n ipAddress?: string\n userAgent?: string\n countryCode?: string\n requestPath?: string\n requestMethod?: string\n details?: Record\n fingerprint?: string\n blocked?: boolean\n}\n\nexport interface SecurityEventFilters {\n eventType?: SecurityEventType | SecurityEventType[]\n severity?: SecuritySeverity | SecuritySeverity[]\n email?: string\n ipAddress?: string\n search?: string\n startDate?: number\n endDate?: number\n blocked?: boolean\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'event_type' | 'severity'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SecurityStats {\n totalEvents: number\n failedLogins24h: number\n failedLoginsTrend: number // percentage change vs prior 24h\n activeLockouts: number\n flaggedIPs: number\n eventsByType: Record\n eventsBySeverity: Record\n}\n\nexport interface TopIP {\n ipAddress: string\n countryCode: string | null\n failedAttempts: number\n lastSeen: number\n locked: boolean\n}\n\nexport interface HourlyBucket {\n hour: string\n count: number\n}\n\nexport interface SecurityAuditSettings {\n retention: {\n daysToKeep: number\n maxEvents: number\n autoPurge: boolean\n }\n bruteForce: {\n enabled: boolean\n maxFailedAttemptsPerIP: number\n maxFailedAttemptsPerEmail: number\n windowMinutes: number\n lockoutDurationMinutes: number\n alertThreshold: number\n }\n logging: {\n logSuccessfulLogins: boolean\n logLogouts: boolean\n logRegistrations: boolean\n logPasswordResets: boolean\n logPermissionDenied: boolean\n }\n}\n\nexport const DEFAULT_SETTINGS: SecurityAuditSettings = {\n retention: {\n daysToKeep: 90,\n maxEvents: 100000,\n autoPurge: true\n },\n bruteForce: {\n enabled: true,\n maxFailedAttemptsPerIP: 10,\n maxFailedAttemptsPerEmail: 5,\n windowMinutes: 15,\n lockoutDurationMinutes: 30,\n alertThreshold: 20\n },\n logging: {\n logSuccessfulLogins: true,\n logLogouts: true,\n logRegistrations: true,\n logPasswordResets: true,\n logPermissionDenied: true\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n SecurityEvent,\n SecurityEventInsert,\n SecurityEventFilters,\n SecurityStats,\n TopIP,\n HourlyBucket,\n SecurityAuditSettings\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nexport class SecurityAuditService {\n constructor(\n private db: D1Database,\n private settings: SecurityAuditSettings = DEFAULT_SETTINGS\n ) {}\n\n async logEvent(event: SecurityEventInsert): Promise {\n const id = crypto.randomUUID()\n const now = Date.now()\n\n await this.db.prepare(`\n INSERT INTO security_events (id, event_type, severity, user_id, email, ip_address, user_agent, country_code, request_path, request_method, details, fingerprint, blocked, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n event.eventType,\n event.severity || 'info',\n event.userId || null,\n event.email || null,\n event.ipAddress || null,\n event.userAgent || null,\n event.countryCode || null,\n event.requestPath || null,\n event.requestMethod || null,\n event.details ? JSON.stringify(event.details) : null,\n event.fingerprint || null,\n event.blocked ? 1 : 0,\n now\n ).run()\n\n return id\n }\n\n async getEvents(filters: SecurityEventFilters = {}): Promise<{ events: SecurityEvent[], total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.eventType) {\n if (Array.isArray(filters.eventType)) {\n conditions.push(`event_type IN (${filters.eventType.map(() => '?').join(',')})`)\n params.push(...filters.eventType)\n } else {\n conditions.push('event_type = ?')\n params.push(filters.eventType)\n }\n }\n\n if (filters.severity) {\n if (Array.isArray(filters.severity)) {\n conditions.push(`severity IN (${filters.severity.map(() => '?').join(',')})`)\n params.push(...filters.severity)\n } else {\n conditions.push('severity = ?')\n params.push(filters.severity)\n }\n }\n\n if (filters.email) {\n conditions.push('email LIKE ?')\n params.push(`%${filters.email}%`)\n }\n\n if (filters.ipAddress) {\n conditions.push('ip_address LIKE ?')\n params.push(`%${filters.ipAddress}%`)\n }\n\n if (filters.search) {\n conditions.push('(email LIKE ? OR ip_address LIKE ? OR details LIKE ?)')\n params.push(`%${filters.search}%`, `%${filters.search}%`, `%${filters.search}%`)\n }\n\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n if (filters.blocked !== undefined) {\n conditions.push('blocked = ?')\n params.push(filters.blocked ? 1 : 0)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const page = filters.page || 1\n const limit = filters.limit || 50\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM security_events ${where}`\n ).bind(...params).first<{ count: number }>()\n const total = countResult?.count || 0\n\n // Get page of results\n const results = await this.db.prepare(\n `SELECT * FROM security_events ${where} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...params, limit, offset).all()\n\n const events: SecurityEvent[] = (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n\n return { events, total }\n }\n\n async getEvent(id: string): Promise {\n const row = await this.db.prepare(\n 'SELECT * FROM security_events WHERE id = ?'\n ).bind(id).first()\n\n if (!row) return null\n\n return {\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }\n }\n\n async getStats(): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n const h48 = now - 48 * 60 * 60 * 1000\n\n // Total events\n const totalResult = await this.db.prepare(\n 'SELECT COUNT(*) as count FROM security_events'\n ).first<{ count: number }>()\n\n // Failed logins last 24h\n const failed24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ?\"\n ).bind(h24).first<{ count: number }>()\n\n // Failed logins prior 24h (for trend)\n const failedPrior24hResult = await this.db.prepare(\n \"SELECT COUNT(*) as count FROM security_events WHERE event_type = 'login_failure' AND created_at >= ? AND created_at < ?\"\n ).bind(h48, h24).first<{ count: number }>()\n\n const failed24h = failed24hResult?.count || 0\n const failedPrior24h = failedPrior24hResult?.count || 0\n const trend = failedPrior24h > 0\n ? Math.round(((failed24h - failedPrior24h) / failedPrior24h) * 100)\n : (failed24h > 0 ? 100 : 0)\n\n // Active lockouts (events in last lockout window)\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutsResult = await this.db.prepare(\n \"SELECT COUNT(DISTINCT ip_address) as count FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).first<{ count: number }>()\n\n // Flagged IPs (IPs with more than threshold failed attempts in window)\n const windowStart = now - (this.settings.bruteForce.windowMinutes * 60 * 1000)\n const flaggedResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM (\n SELECT ip_address FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address HAVING COUNT(*) >= ?\n )`\n ).bind(windowStart, this.settings.bruteForce.maxFailedAttemptsPerIP).first<{ count: number }>()\n\n // Events by type\n const typeResults = await this.db.prepare(\n 'SELECT event_type, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY event_type'\n ).bind(h24).all()\n\n const eventsByType: Record = {}\n for (const row of (typeResults.results || []) as any[]) {\n eventsByType[row.event_type] = row.count\n }\n\n // Events by severity\n const severityResults = await this.db.prepare(\n 'SELECT severity, COUNT(*) as count FROM security_events WHERE created_at >= ? GROUP BY severity'\n ).bind(h24).all()\n\n const eventsBySeverity: Record = {}\n for (const row of (severityResults.results || []) as any[]) {\n eventsBySeverity[row.severity] = row.count\n }\n\n return {\n totalEvents: totalResult?.count || 0,\n failedLogins24h: failed24h,\n failedLoginsTrend: trend,\n activeLockouts: lockoutsResult?.count || 0,\n flaggedIPs: flaggedResult?.count || 0,\n eventsByType,\n eventsBySeverity\n }\n }\n\n async getTopIPs(limit: number = 10): Promise {\n const now = Date.now()\n const h24 = now - 24 * 60 * 60 * 1000\n\n const results = await this.db.prepare(`\n SELECT\n ip_address,\n country_code,\n COUNT(*) as failed_attempts,\n MAX(created_at) as last_seen\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY ip_address\n ORDER BY failed_attempts DESC\n LIMIT ?\n `).bind(h24, limit).all()\n\n // Check which IPs are locked\n const lockoutWindow = now - (this.settings.bruteForce.lockoutDurationMinutes * 60 * 1000)\n const lockoutResults = await this.db.prepare(\n \"SELECT DISTINCT ip_address FROM security_events WHERE event_type = 'account_lockout' AND created_at >= ?\"\n ).bind(lockoutWindow).all()\n\n const lockedIPs = new Set((lockoutResults.results || []).map((r: any) => r.ip_address))\n\n return (results.results || []).map((row: any) => ({\n ipAddress: row.ip_address,\n countryCode: row.country_code,\n failedAttempts: row.failed_attempts,\n lastSeen: row.last_seen,\n locked: lockedIPs.has(row.ip_address)\n }))\n }\n\n async getHourlyTrend(hours: number = 24): Promise {\n const now = Date.now()\n const start = now - hours * 60 * 60 * 1000\n\n // Build hourly buckets\n const buckets: HourlyBucket[] = []\n for (let i = 0; i < hours; i++) {\n const bucketStart = start + i * 60 * 60 * 1000\n const date = new Date(bucketStart)\n buckets.push({\n hour: `${date.getUTCHours().toString().padStart(2, '0')}:00`,\n count: 0\n })\n }\n\n const results = await this.db.prepare(`\n SELECT\n CAST((created_at - ?) / 3600000 AS INTEGER) as bucket,\n COUNT(*) as count\n FROM security_events\n WHERE event_type = 'login_failure' AND created_at >= ?\n GROUP BY bucket\n ORDER BY bucket\n `).bind(start, start).all()\n\n for (const row of (results.results || []) as any[]) {\n const idx = row.bucket\n if (idx >= 0 && idx < buckets.length) {\n buckets[idx]!.count = row.count\n }\n }\n\n return buckets\n }\n\n async purgeOldEvents(daysToKeep?: number): Promise {\n const days = daysToKeep || this.settings.retention.daysToKeep\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000\n\n const result = await this.db.prepare(\n 'DELETE FROM security_events WHERE created_at < ?'\n ).bind(cutoff).run()\n\n return (result.meta as any)?.changes || 0\n }\n\n async getRecentCriticalEvents(limit: number = 20): Promise {\n const results = await this.db.prepare(\n \"SELECT * FROM security_events WHERE severity = 'critical' ORDER BY created_at DESC LIMIT ?\"\n ).bind(limit).all()\n\n return (results.results || []).map((row: any) => ({\n id: row.id,\n eventType: row.event_type,\n severity: row.severity,\n userId: row.user_id,\n email: row.email,\n ipAddress: row.ip_address,\n userAgent: row.user_agent,\n countryCode: row.country_code,\n requestPath: row.request_path,\n requestMethod: row.request_method,\n details: row.details ? JSON.parse(row.details) : null,\n fingerprint: row.fingerprint,\n blocked: !!row.blocked,\n createdAt: row.created_at\n }))\n }\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityStats, TopIP, HourlyBucket, SecurityEvent } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecurityDashboardData {\n stats: SecurityStats\n topIPs: TopIP[]\n hourlyTrend: HourlyBucket[]\n recentCritical: SecurityEvent[]\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n const now = Date.now()\n const diff = now - ts\n\n if (diff < 60000) return 'just now'\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n return labels[type] || type\n}\n\nfunction trendArrow(trend: number): string {\n if (trend > 0) return `+${trend}%`\n if (trend < 0) return `${trend}%`\n return `0%`\n}\n\nfunction renderBarChart(data: HourlyBucket[]): string {\n if (data.length === 0) return '

No data available

'\n\n const max = Math.max(...data.map(d => d.count), 1)\n\n const bars = data.map(d => {\n const height = Math.max((d.count / max) * 100, 2)\n const color = d.count === 0\n ? 'bg-zinc-200 dark:bg-zinc-700'\n : d.count >= max * 0.75\n ? 'bg-red-500'\n : d.count >= max * 0.5\n ? 'bg-amber-500'\n : 'bg-cyan-500'\n return `\n
\n
\n \n
\n
\n 12 ? 'hidden sm:block' : ''}\">${d.hour}\n
\n `\n }).join('')\n\n return `
${bars}
`\n}\n\nexport function renderSecurityDashboard(data: SecurityDashboardData): string {\n const { stats, topIPs, hourlyTrend, recentCritical, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Dashboard

\n

\n Monitor login attempts, brute-force detection, and security events.\n

\n
\n \n
\n\n \n
\n
\n

Total Events

\n

${stats.totalEvents.toLocaleString()}

\n
\n
\n

Failed Logins (24h)

\n

\n ${stats.failedLogins24h}\n ${trendArrow(stats.failedLoginsTrend)}\n

\n
\n
\n

Active Lockouts

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${stats.activeLockouts}

\n
\n
\n

Flagged IPs

\n

0 ? 'text-amber-600 dark:text-amber-400' : 'text-zinc-950 dark:text-white'}\">${stats.flaggedIPs}

\n
\n
\n\n \n
\n \n
\n

Failed Login Attempts (24h)

\n ${renderBarChart(hourlyTrend)}\n
\n\n \n
\n

Events by Type (24h)

\n
\n ${Object.entries(stats.eventsByType).length === 0\n ? '

No events in the last 24 hours

'\n : Object.entries(stats.eventsByType)\n .sort(([, a], [, b]) => b - a)\n .map(([type, count]) => {\n const total = Object.values(stats.eventsByType).reduce((s, v) => s + v, 0)\n const pct = total > 0 ? Math.round((count / total) * 100) : 0\n return `\n
\n
\n ${eventTypeBadge(type)}\n ${count}\n
\n
\n
\n
\n
\n `\n }).join('')\n }\n
\n
\n
\n\n \n
\n \n
\n
\n

Top IPs by Failed Logins (24h)

\n
\n ${topIPs.length === 0\n ? '

No failed login attempts

'\n : `\n \n \n \n \n \n \n \n \n \n ${topIPs.map(ip => `\n \n \n \n \n \n \n `).join('')}\n \n
IP AddressCountryAttemptsStatus
${ip.ipAddress}${ip.countryCode || '-'}= 10 ? 'text-red-600 dark:text-red-400' : 'text-zinc-900 dark:text-zinc-100'}\">${ip.failedAttempts}\n ${ip.locked\n ? 'Locked'\n : 'Active'\n }\n
`\n }\n
\n\n \n
\n
\n

Recent Critical Events

\n
\n ${recentCritical.length === 0\n ? '

No critical events

'\n : `
\n ${recentCritical.slice(0, 10).map(event => `\n
\n
\n
\n ${severityBadge(event.severity)}\n ${eventTypeBadge(event.eventType)}\n
\n ${formatTimestamp(event.createdAt)}\n
\n
\n ${event.ipAddress ? `IP: ${event.ipAddress}` : ''}\n ${event.email ? ` | ${event.email}` : ''}\n
\n
\n `).join('')}\n
`\n }\n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Dashboard',\n pageTitle: 'Security Dashboard',\n currentPath: '/admin/plugins/security-audit',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityEvent, SecurityEventFilters } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface EventLogPageData {\n events: SecurityEvent[]\n pagination: {\n currentPage: number\n totalPages: number\n totalItems: number\n itemsPerPage: number\n startItem: number\n endItem: number\n }\n filters: SecurityEventFilters\n user?: BaseUser\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts)\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n })\n}\n\nfunction severityBadge(severity: string): string {\n const colors: Record = {\n info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n warning: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n }\n return `${severity}`\n}\n\nfunction eventTypeBadge(type: string): string {\n const colors: Record = {\n login_success: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400',\n login_failure: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n registration: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n account_lockout: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n suspicious_activity: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\n logout: 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400',\n password_reset_request: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n permission_denied: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400'\n }\n const labels: Record = {\n login_success: 'Login OK',\n login_failure: 'Login Failed',\n registration: 'Registration',\n account_lockout: 'Lockout',\n suspicious_activity: 'Suspicious',\n logout: 'Logout',\n password_reset_request: 'Password Reset',\n permission_denied: 'Access Denied'\n }\n const color = colors[type] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400'\n return `${labels[type] || type}`\n}\n\nfunction buildFilterUrl(filters: SecurityEventFilters, overrides: Record = {}): string {\n const params = new URLSearchParams()\n if (filters.eventType && !overrides.type) params.set('type', String(filters.eventType))\n if (filters.severity && !overrides.severity) params.set('severity', String(filters.severity))\n if (filters.email && !overrides.email) params.set('email', filters.email)\n if (filters.ipAddress && !overrides.ip) params.set('ip', filters.ipAddress)\n if (filters.search && !overrides.search) params.set('search', filters.search)\n\n for (const [key, value] of Object.entries(overrides)) {\n if (value) params.set(key, value)\n }\n\n const qs = params.toString()\n return `/admin/plugins/security-audit/events${qs ? '?' + qs : ''}`\n}\n\nexport function renderEventLogPage(data: EventLogPageData): string {\n const { events, pagination, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Event Log

\n

\n Browse and filter all security events. Showing ${pagination.startItem}-${pagination.endItem} of ${pagination.totalItems}.\n

\n
\n \n
\n\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n Clear\n \n
\n
\n
\n\n \n
\n ${events.length === 0\n ? `
\n \n \n \n

No events found

\n

No security events match your current filters.

\n
`\n : `
\n \n \n \n \n \n \n \n \n \n \n \n \n \n ${events.map(event => `\n \n \n \n \n \n \n \n \n \n \n \n \n `).join('')}\n \n
TimeTypeSeverityEmailIP AddressCountryStatus
${formatTimestamp(event.createdAt)}${eventTypeBadge(event.eventType)}${severityBadge(event.severity)}${event.email || '-'}${event.ipAddress || '-'}${event.countryCode || '-'}\n ${event.blocked\n ? 'Blocked'\n : 'Allowed'\n }\n
\n
\n
Event ID: ${event.id.substring(0, 8)}...
\n
User Agent: ${event.userAgent || '-'}
\n
Path: ${event.requestPath || '-'}
\n
Fingerprint: ${event.fingerprint || '-'}
\n ${event.details ? `
Details:
${JSON.stringify(event.details, null, 2)}
` : ''}\n
\n
\n
`\n }\n\n \n ${pagination.totalPages > 1 ? `\n
\n
\n Page ${pagination.currentPage} of ${pagination.totalPages}\n
\n
\n ${pagination.currentPage > 1 ? `\n \n Previous\n \n ` : ''}\n ${pagination.currentPage < pagination.totalPages ? `\n \n Next\n \n ` : ''}\n
\n
\n ` : ''}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Event Log',\n pageTitle: 'Security Event Log',\n currentPath: '/admin/plugins/security-audit/events',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { SecurityAuditSettings } from '../types'\n\ninterface BaseUser {\n name: string\n email: string\n role: string\n}\n\nexport interface SecuritySettingsPageData {\n settings: SecurityAuditSettings\n user?: BaseUser\n version?: string\n message?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSecuritySettingsPage(data: SecuritySettingsPageData): string {\n const { settings, user, version, message, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Security Audit Settings

\n

\n Configure brute-force detection thresholds, event logging, and data retention.\n

\n
\n \n
\n\n ${message ? `\n
\n

${message}

\n
\n ` : ''}\n\n
\n\n \n
\n

Brute-Force Detection

\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n

Events above this count trigger critical severity

\n
\n
\n
\n\n \n
\n

Event Logging

\n
\n \n \n \n \n \n
\n
\n\n \n
\n

Data Retention

\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n\n \n
\n \n \n
\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Security Audit Settings',\n pageTitle: 'Security Audit Settings',\n currentPath: '/admin/plugins/security-audit/settings',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { PluginService } from '../../../../services'\nimport { renderSecurityDashboard, SecurityDashboardData } from '../components/dashboard-page'\nimport { renderEventLogPage, EventLogPageData } from '../components/event-log-page'\nimport { renderSecuritySettingsPage, SecuritySettingsPageData } from '../components/settings-page'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const [stats, topIPs, hourlyTrend, recentCritical] = await Promise.all([\n service.getStats(),\n service.getTopIPs(10),\n service.getHourlyTrend(24),\n service.getRecentCriticalEvents(20)\n ])\n\n const pageData: SecurityDashboardData = {\n stats,\n topIPs,\n hourlyTrend,\n recentCritical,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecurityDashboard(pageData))\n})\n\n// Event log\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n\n const filters = {\n eventType: (c.req.query('type') as SecurityEventType) || undefined,\n severity: (c.req.query('severity') as SecuritySeverity) || undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n page,\n limit\n }\n\n const { events, total } = await service.getEvents(filters)\n const totalPages = Math.ceil(total / limit)\n\n const pageData: EventLogPageData = {\n events,\n pagination: {\n currentPage: page,\n totalPages,\n totalItems: total,\n itemsPerPage: limit,\n startItem: total === 0 ? 0 : (page - 1) * limit + 1,\n endItem: Math.min(page * limit, total)\n },\n filters,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderEventLogPage(pageData))\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const pageData: SecuritySettingsPageData = {\n settings,\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n message: c.req.query('message') || undefined,\n dynamicMenuItems: c.get('pluginMenuItems')\n }\n\n return c.html(renderSecuritySettingsPage(pageData))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n const db = c.env.DB\n const body = await c.req.parseBody()\n\n const settings: SecurityAuditSettings = {\n bruteForce: {\n enabled: body['bruteForce.enabled'] === 'true',\n maxFailedAttemptsPerIP: parseInt(body['bruteForce.maxFailedAttemptsPerIP'] as string) || 10,\n maxFailedAttemptsPerEmail: parseInt(body['bruteForce.maxFailedAttemptsPerEmail'] as string) || 5,\n windowMinutes: parseInt(body['bruteForce.windowMinutes'] as string) || 15,\n lockoutDurationMinutes: parseInt(body['bruteForce.lockoutDurationMinutes'] as string) || 30,\n alertThreshold: parseInt(body['bruteForce.alertThreshold'] as string) || 20\n },\n logging: {\n logSuccessfulLogins: body['logging.logSuccessfulLogins'] === 'true',\n logLogouts: body['logging.logLogouts'] === 'true',\n logRegistrations: body['logging.logRegistrations'] === 'true',\n logPasswordResets: body['logging.logPasswordResets'] === 'true',\n logPermissionDenied: body['logging.logPermissionDenied'] === 'true'\n },\n retention: {\n daysToKeep: parseInt(body['retention.daysToKeep'] as string) || 90,\n maxEvents: parseInt(body['retention.maxEvents'] as string) || 100000,\n autoPurge: body['retention.autoPurge'] === 'true'\n }\n }\n\n const pluginService = new PluginService(db)\n await pluginService.updatePluginSettings('security-audit', settings)\n\n // For HTMX requests, return 200\n if (c.req.header('HX-Request')) {\n return c.json({ success: true })\n }\n\n return c.redirect('/admin/plugins/security-audit/settings?message=Settings saved successfully')\n})\n\nexport { adminRoutes as securityAuditAdminRoutes }\n","import type { KVNamespace } from '@cloudflare/workers-types'\nimport type { SecurityAuditSettings } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst KV_PREFIX = 'security:bf:'\nconst LOCK_PREFIX = 'security:locked:'\n\nexport class BruteForceDetector {\n private settings: SecurityAuditSettings['bruteForce']\n\n constructor(\n private kv: KVNamespace,\n settings?: SecurityAuditSettings['bruteForce']\n ) {\n this.settings = settings || DEFAULT_SETTINGS.bruteForce\n }\n\n async recordFailedAttempt(ip: string, email: string): Promise<{\n ipCount: number\n emailCount: number\n shouldLockIP: boolean\n shouldLockEmail: boolean\n isSuspicious: boolean\n }> {\n if (!this.settings.enabled || !this.kv) {\n return { ipCount: 0, emailCount: 0, shouldLockIP: false, shouldLockEmail: false, isSuspicious: false }\n }\n\n const now = Date.now()\n const windowMs = this.settings.windowMinutes * 60 * 1000\n\n // Increment IP counter\n const ipKey = `${KV_PREFIX}ip:${ip}`\n const ipCount = await this.incrementCounter(ipKey, windowMs)\n\n // Increment email counter\n const emailKey = `${KV_PREFIX}email:${email}`\n const emailCount = await this.incrementCounter(emailKey, windowMs)\n\n // Check for multi-email from single IP (suspicious)\n const ipEmailsKey = `${KV_PREFIX}ip-emails:${ip}`\n await this.addToSet(ipEmailsKey, email, windowMs)\n const emailsFromIP = await this.getSetSize(ipEmailsKey)\n const isSuspicious = emailsFromIP >= 5\n\n const shouldLockIP = ipCount >= this.settings.maxFailedAttemptsPerIP\n const shouldLockEmail = emailCount >= this.settings.maxFailedAttemptsPerEmail\n\n return { ipCount, emailCount, shouldLockIP, shouldLockEmail, isSuspicious }\n }\n\n async isLocked(ip: string, email: string): Promise<{ locked: boolean, reason?: string }> {\n if (!this.settings.enabled || !this.kv) {\n return { locked: false }\n }\n\n const ipLocked = await this.kv.get(`${LOCK_PREFIX}ip:${ip}`)\n if (ipLocked) {\n return { locked: true, reason: 'IP address temporarily locked due to excessive failed login attempts' }\n }\n\n const emailLocked = await this.kv.get(`${LOCK_PREFIX}email:${email}`)\n if (emailLocked) {\n return { locked: true, reason: 'Account temporarily locked due to excessive failed login attempts' }\n }\n\n return { locked: false }\n }\n\n async lockIP(ip: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}ip:${ip}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_ip'\n }), { expirationTtl: ttl })\n }\n\n async lockEmail(email: string): Promise {\n if (!this.kv) return\n const ttl = this.settings.lockoutDurationMinutes * 60\n await this.kv.put(`${LOCK_PREFIX}email:${email}`, JSON.stringify({\n lockedAt: Date.now(),\n reason: 'brute_force_email'\n }), { expirationTtl: ttl })\n }\n\n async unlockIP(ip: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}ip:${ip}`)\n }\n\n async unlockEmail(email: string): Promise {\n if (!this.kv) return\n await this.kv.delete(`${LOCK_PREFIX}email:${email}`)\n }\n\n async getActiveLockouts(): Promise> {\n if (!this.kv) return []\n // KV list with prefix to find all active lockouts\n const ipLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}ip:` })\n const emailLocks = await this.kv.list({ prefix: `${LOCK_PREFIX}email:` })\n\n const lockouts: Array<{ key: string, type: 'ip' | 'email', value: string, lockedAt: number }> = []\n\n for (const key of ipLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'ip',\n value: key.name.replace(`${LOCK_PREFIX}ip:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n for (const key of emailLocks.keys) {\n const data = await this.kv.get(key.name)\n if (data) {\n const parsed = JSON.parse(data)\n lockouts.push({\n key: key.name,\n type: 'email',\n value: key.name.replace(`${LOCK_PREFIX}email:`, ''),\n lockedAt: parsed.lockedAt\n })\n }\n }\n\n return lockouts\n }\n\n async releaseLockout(key: string): Promise {\n if (!this.kv) return\n await this.kv.delete(key)\n }\n\n isAboveAlertThreshold(count: number): boolean {\n return count >= this.settings.alertThreshold\n }\n\n private async incrementCounter(key: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n const now = Date.now()\n\n let entries: number[] = []\n if (existing) {\n try {\n entries = JSON.parse(existing)\n } catch {\n entries = []\n }\n }\n\n // Remove expired entries\n const cutoff = now - windowMs\n entries = entries.filter(ts => ts > cutoff)\n\n // Add new entry\n entries.push(now)\n\n // Store with TTL equal to window\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(entries), { expirationTtl: ttlSeconds })\n\n return entries.length\n }\n\n private async addToSet(key: string, value: string, windowMs: number): Promise {\n const existing = await this.kv.get(key)\n let set: Record = {}\n const now = Date.now()\n const cutoff = now - windowMs\n\n if (existing) {\n try {\n set = JSON.parse(existing)\n } catch {\n set = {}\n }\n }\n\n // Remove expired entries\n for (const [k, ts] of Object.entries(set)) {\n if (ts < cutoff) delete set[k]\n }\n\n set[value] = now\n\n const ttlSeconds = Math.ceil(windowMs / 1000)\n await this.kv.put(key, JSON.stringify(set), { expirationTtl: ttlSeconds })\n }\n\n private async getSetSize(key: string): Promise {\n const existing = await this.kv.get(key)\n if (!existing) return 0\n\n try {\n const set = JSON.parse(existing)\n return Object.keys(set).length\n } catch {\n return 0\n }\n }\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { SecurityAuditSettings, SecurityEventFilters, SecurityEventType, SecuritySeverity } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\napiRoutes.use('*', requireAuth())\n\n// Check admin role\napiRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.json({ error: 'Access denied' }, 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// GET /api/security-audit/events\napiRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n email: c.req.query('email') || undefined,\n ipAddress: c.req.query('ip') || undefined,\n search: c.req.query('search') || undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? Math.min(parseInt(c.req.query('limit')!), 100) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await service.getEvents(filters)\n return c.json(result)\n})\n\n// GET /api/security-audit/events/:id\napiRoutes.get('/events/:id', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const event = await service.getEvent(c.req.param('id'))\n\n if (!event) {\n return c.json({ error: 'Event not found' }, 404)\n }\n\n return c.json(event)\n})\n\n// GET /api/security-audit/stats\napiRoutes.get('/stats', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const stats = await service.getStats()\n return c.json(stats)\n})\n\n// GET /api/security-audit/stats/ips\napiRoutes.get('/stats/ips', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const limit = c.req.query('limit') ? parseInt(c.req.query('limit')!) : 10\n const ips = await service.getTopIPs(limit)\n return c.json(ips)\n})\n\n// GET /api/security-audit/stats/trend\napiRoutes.get('/stats/trend', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const hours = c.req.query('hours') ? parseInt(c.req.query('hours')!) : 24\n const trend = await service.getHourlyTrend(hours)\n return c.json(trend)\n})\n\n// GET /api/security-audit/lockouts\napiRoutes.get('/lockouts', async (c) => {\n const kv = c.env.CACHE_KV\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n const lockouts = await detector.getActiveLockouts()\n return c.json(lockouts)\n})\n\n// DELETE /api/security-audit/lockouts/:key\napiRoutes.delete('/lockouts/:key', async (c) => {\n const kv = c.env.CACHE_KV\n const key = decodeURIComponent(c.req.param('key'))\n const db = c.env.DB\n const settings = await getSettings(db)\n const detector = new BruteForceDetector(kv, settings.bruteForce)\n await detector.releaseLockout(key)\n return c.json({ success: true })\n})\n\n// POST /api/security-audit/events/purge\napiRoutes.post('/events/purge', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const body = await c.req.json().catch(() => ({})) as { daysToKeep?: number }\n const deleted = await service.purgeOldEvents(body.daysToKeep)\n return c.json({ success: true, deleted })\n})\n\n// GET /api/security-audit/export\napiRoutes.get('/export', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n const service = new SecurityAuditService(db, settings)\n const format = c.req.query('format') || 'json'\n\n const filters: SecurityEventFilters = {\n eventType: c.req.query('type') as SecurityEventType | undefined,\n severity: c.req.query('severity') as SecuritySeverity | undefined,\n startDate: c.req.query('start') ? parseInt(c.req.query('start')!) : undefined,\n endDate: c.req.query('end') ? parseInt(c.req.query('end')!) : undefined,\n limit: 10000,\n page: 1\n }\n\n const { events } = await service.getEvents(filters)\n\n if (format === 'csv') {\n const headers = ['id', 'event_type', 'severity', 'email', 'ip_address', 'country_code', 'blocked', 'created_at']\n const csvRows = [headers.join(',')]\n for (const event of events) {\n csvRows.push([\n event.id,\n event.eventType,\n event.severity,\n event.email || '',\n event.ipAddress || '',\n event.countryCode || '',\n event.blocked ? '1' : '0',\n new Date(event.createdAt).toISOString()\n ].map(v => `\"${String(v).replace(/\"/g, '\"\"')}\"`).join(','))\n }\n\n return new Response(csvRows.join('\\n'), {\n headers: {\n 'Content-Type': 'text/csv',\n 'Content-Disposition': `attachment; filename=\"security-events-${Date.now()}.csv\"`\n }\n })\n }\n\n return c.json(events)\n})\n\nexport { apiRoutes as securityAuditApiRoutes }\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../../../../app'\nimport { SecurityAuditService } from '../services/security-audit-service'\nimport { BruteForceDetector } from '../services/brute-force-detector'\nimport { PluginService } from '../../../../services'\nimport type { SecurityAuditSettings, SecurityEventType } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nfunction extractRequestInfo(c: Context<{ Bindings: Bindings; Variables: Variables }>) {\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || 'unknown'\n const countryCode = c.req.header('cf-ipcountry') || null\n const path = new URL(c.req.url).pathname\n const method = c.req.method\n\n return { ip, userAgent, countryCode, path, method }\n}\n\nfunction generateFingerprint(ip: string, userAgent: string): string {\n // Simple fingerprint from IP + UA - using a basic hash\n const str = `${ip}:${userAgent}`\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash |= 0\n }\n return Math.abs(hash).toString(36)\n}\n\nasync function getPluginSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('security-audit')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch {\n // Plugin not installed or DB not ready\n }\n return DEFAULT_SETTINGS\n}\n\nasync function isPluginActive(db: any): Promise {\n try {\n const result = await db.prepare(\n \"SELECT status FROM plugins WHERE id = 'security-audit'\"\n ).first() as { status: string } | null\n return result?.status === 'active'\n } catch {\n return false\n }\n}\n\nexport function securityAuditMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n\n // Only intercept auth-related routes\n if (!path.startsWith('/auth/')) {\n return next()\n }\n\n const db = c.env.DB\n\n // Check if plugin is active\n if (!await isPluginActive(db)) {\n return next()\n }\n\n const settings = await getPluginSettings(db)\n const { ip, userAgent, countryCode, method } = extractRequestInfo(c)\n const fingerprint = generateFingerprint(ip, userAgent)\n\n // For login POST, extract email and check lockout before proceeding\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n let preExtractedEmail = ''\n\n if (isLoginPost) {\n try {\n if (path === '/auth/login/form') {\n // Form-based login: clone request to read formData without consuming it\n const clonedReq = c.req.raw.clone()\n const formData = await clonedReq.formData()\n preExtractedEmail = (formData.get('email') as string || '').toLowerCase()\n } else {\n // JSON login: Hono caches parsed JSON so this is safe\n const body = await c.req.json()\n preExtractedEmail = body?.email?.toLowerCase() || ''\n }\n } catch {\n // Can't parse body, continue\n }\n\n if (preExtractedEmail && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const lockStatus = await detector.isLocked(ip, preExtractedEmail)\n\n if (lockStatus.locked) {\n const service = new SecurityAuditService(db, settings)\n // Log the blocked attempt asynchronously\n const logPromise = service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: preExtractedEmail,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n blocked: true,\n details: { reason: lockStatus.reason }\n })\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n\n return c.json({\n error: lockStatus.reason || 'Too many failed attempts. Please try again later.'\n }, 429)\n }\n }\n }\n\n // Proceed with the request\n await next()\n\n // After response, log the event asynchronously\n const logPromise = logAuthEvent(c, db, settings, ip, userAgent, countryCode, fingerprint, path, method, preExtractedEmail)\n\n if (c.executionCtx?.waitUntil) {\n c.executionCtx.waitUntil(logPromise)\n }\n }\n}\n\nasync function logAuthEvent(\n c: Context<{ Bindings: Bindings; Variables: Variables }>,\n db: any,\n settings: SecurityAuditSettings,\n ip: string,\n userAgent: string,\n countryCode: string | null,\n fingerprint: string,\n path: string,\n method: string,\n preExtractedEmail: string = ''\n): Promise {\n try {\n const service = new SecurityAuditService(db, settings)\n const status = c.res.status\n const isLoginPost = (path === '/auth/login' || path === '/auth/login/form') && method === 'POST'\n const isFormLogin = path === '/auth/login/form'\n\n // Login POST\n if (isLoginPost) {\n // Determine if login succeeded or failed.\n // JSON login: 200 = success, 401/400 = failure\n // Form login: always returns 200 — check if response set an auth cookie (HX-Redirect header indicates success)\n let loginSucceeded: boolean\n if (isFormLogin) {\n // Form login redirects to /admin on success via HX-Redirect header or meta refresh\n const hxRedirect = c.res.headers.get('HX-Redirect')\n const setCookieHeader = c.res.headers.get('set-cookie') || ''\n loginSucceeded = !!(hxRedirect?.includes('/admin') || setCookieHeader.includes('auth_token'))\n } else {\n loginSucceeded = status === 200\n }\n\n if (loginSucceeded) {\n if (!settings.logging.logSuccessfulLogins) return\n\n // Try to get user info from response\n let email = preExtractedEmail\n let userId = ''\n if (!isFormLogin) {\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || email\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n }\n\n await service.logEvent({\n eventType: 'login_success',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n } else {\n // Failed login — use pre-extracted email since body is already consumed\n const email = preExtractedEmail\n\n await service.logEvent({\n eventType: 'login_failure',\n severity: 'warning',\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { statusCode: status }\n })\n\n // Record failed attempt for brute-force detection\n if (email && settings.bruteForce.enabled) {\n const detector = new BruteForceDetector(c.env.CACHE_KV, settings.bruteForce)\n const result = await detector.recordFailedAttempt(ip, email)\n\n if (result.shouldLockIP) {\n await detector.lockIP(ip)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_ip', attemptCount: result.ipCount }\n })\n }\n\n if (result.shouldLockEmail) {\n await detector.lockEmail(email)\n await service.logEvent({\n eventType: 'account_lockout',\n severity: 'critical',\n email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'brute_force_email', attemptCount: result.emailCount }\n })\n }\n\n if (result.isSuspicious) {\n await service.logEvent({\n eventType: 'suspicious_activity',\n severity: 'critical',\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint,\n details: { reason: 'multiple_emails_from_ip', ipCount: result.ipCount }\n })\n }\n }\n }\n }\n\n // Registration POST\n if (path === '/auth/register' && method === 'POST' && settings.logging.logRegistrations) {\n if (status === 201 || status === 200) {\n let email = ''\n let userId = ''\n try {\n const cloned = c.res.clone()\n const body = await cloned.json() as any\n email = body?.user?.email || ''\n userId = body?.user?.id || ''\n } catch { /* ignore */ }\n\n await service.logEvent({\n eventType: 'registration',\n severity: 'info',\n userId: userId || undefined,\n email: email || undefined,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n }\n\n // Logout\n if (path === '/auth/logout' && settings.logging.logLogouts) {\n const user = c.get('user')\n await service.logEvent({\n eventType: 'logout',\n severity: 'info',\n userId: user?.userId,\n email: user?.email,\n ipAddress: ip,\n userAgent,\n countryCode: countryCode || undefined,\n requestPath: path,\n requestMethod: method,\n fingerprint\n })\n }\n } catch (error) {\n console.error('[SecurityAudit] Error logging auth event:', error)\n }\n}\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { securityAuditAdminRoutes } from './routes/admin'\nimport { securityAuditApiRoutes } from './routes/api'\nimport { securityAuditMiddleware } from './middleware/audit-middleware'\n\nexport function createSecurityAuditPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'security-audit',\n version: '1.0.0-beta.1',\n description: 'Security event logging, brute-force detection, and analytics dashboard'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard and event log routes\n builder.addRoute('/admin/plugins/security-audit', securityAuditAdminRoutes as any, {\n description: 'Security audit dashboard and admin pages',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes\n builder.addRoute('/api/security-audit', securityAuditApiRoutes as any, {\n description: 'Security audit API endpoints',\n requiresAuth: true,\n priority: 50\n })\n\n // Admin menu item — icon is raw SVG to match sidebar rendering\n builder.addMenuItem('Security', '/admin/plugins/security-audit', {\n icon: ``,\n order: 85\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async (context) => {\n console.log('[SecurityAudit] Plugin installed')\n },\n activate: async (context) => {\n console.log('[SecurityAudit] Plugin activated')\n },\n deactivate: async (context) => {\n console.log('[SecurityAudit] Plugin deactivated')\n },\n uninstall: async (context) => {\n console.log('[SecurityAudit] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const securityAuditPlugin = createSecurityAuditPlugin()\nexport { SecurityAuditService } from './services/security-audit-service'\nexport { BruteForceDetector } from './services/brute-force-detector'\nexport { securityAuditMiddleware } from './middleware/audit-middleware'\nexport default securityAuditPlugin\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type {\n Subscription,\n SubscriptionInsert,\n SubscriptionFilters,\n SubscriptionStats,\n SubscriptionStatus\n} from '../types'\n\n/**\n * Manages subscription records in D1\n */\nexport class SubscriptionService {\n constructor(private db: D1Database) {}\n\n /**\n * Ensure the subscriptions table exists\n */\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS subscriptions (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n user_id TEXT NOT NULL,\n stripe_customer_id TEXT NOT NULL,\n stripe_subscription_id TEXT NOT NULL UNIQUE,\n stripe_price_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'incomplete',\n current_period_start INTEGER NOT NULL DEFAULT 0,\n current_period_end INTEGER NOT NULL DEFAULT 0,\n cancel_at_period_end INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n updated_at INTEGER NOT NULL DEFAULT (unixepoch())\n )\n `).run()\n\n // Indexes for common lookups\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_user_id ON subscriptions(user_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_customer_id ON subscriptions(stripe_customer_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_stripe_subscription_id ON subscriptions(stripe_subscription_id)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_subscriptions_status ON subscriptions(status)\n `).run()\n }\n\n /**\n * Create a new subscription record\n */\n async create(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Upsert a subscription by stripe_subscription_id (INSERT or UPDATE on conflict)\n */\n async upsert(data: SubscriptionInsert): Promise {\n const result = await this.db.prepare(`\n INSERT INTO subscriptions (user_id, stripe_customer_id, stripe_subscription_id, stripe_price_id, status, current_period_start, current_period_end, cancel_at_period_end)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_subscription_id) DO UPDATE SET\n status = excluded.status,\n stripe_price_id = excluded.stripe_price_id,\n current_period_start = excluded.current_period_start,\n current_period_end = excluded.current_period_end,\n cancel_at_period_end = excluded.cancel_at_period_end,\n updated_at = unixepoch()\n RETURNING *\n `).bind(\n data.userId,\n data.stripeCustomerId,\n data.stripeSubscriptionId,\n data.stripePriceId,\n data.status,\n data.currentPeriodStart,\n data.currentPeriodEnd,\n data.cancelAtPeriodEnd ? 1 : 0\n ).first()\n\n return this.mapRow(result as any)\n }\n\n /**\n * Update a subscription by its Stripe subscription ID\n */\n async updateByStripeId(stripeSubscriptionId: string, data: Partial): Promise {\n const sets: string[] = []\n const values: any[] = []\n\n if (data.status !== undefined) {\n sets.push('status = ?')\n values.push(data.status)\n }\n if (data.stripePriceId !== undefined) {\n sets.push('stripe_price_id = ?')\n values.push(data.stripePriceId)\n }\n if (data.currentPeriodStart !== undefined) {\n sets.push('current_period_start = ?')\n values.push(data.currentPeriodStart)\n }\n if (data.currentPeriodEnd !== undefined) {\n sets.push('current_period_end = ?')\n values.push(data.currentPeriodEnd)\n }\n if (data.cancelAtPeriodEnd !== undefined) {\n sets.push('cancel_at_period_end = ?')\n values.push(data.cancelAtPeriodEnd ? 1 : 0)\n }\n\n if (sets.length === 0) return this.getByStripeSubscriptionId(stripeSubscriptionId)\n\n sets.push('updated_at = unixepoch()')\n values.push(stripeSubscriptionId)\n\n const result = await this.db.prepare(`\n UPDATE subscriptions SET ${sets.join(', ')} WHERE stripe_subscription_id = ? RETURNING *\n `).bind(...values).first()\n\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe subscription ID\n */\n async getByStripeSubscriptionId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get the active subscription for a user\n */\n async getByUserId(userId: string): Promise {\n const result = await this.db.prepare(\n \"SELECT * FROM subscriptions WHERE user_id = ? ORDER BY CASE WHEN status = 'active' THEN 0 WHEN status = 'trialing' THEN 1 ELSE 2 END, updated_at DESC LIMIT 1\"\n ).bind(userId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Get subscription by Stripe customer ID\n */\n async getByStripeCustomerId(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT * FROM subscriptions WHERE stripe_customer_id = ? ORDER BY updated_at DESC LIMIT 1'\n ).bind(stripeCustomerId).first()\n return result ? this.mapRow(result as any) : null\n }\n\n /**\n * Find the userId linked to a Stripe customer ID\n */\n async getUserIdByStripeCustomer(stripeCustomerId: string): Promise {\n const result = await this.db.prepare(\n 'SELECT user_id FROM subscriptions WHERE stripe_customer_id = ? LIMIT 1'\n ).bind(stripeCustomerId).first() as { user_id: string } | null\n return result?.user_id ?? null\n }\n\n /**\n * List subscriptions with filters and pagination\n */\n async list(filters: SubscriptionFilters = {}): Promise<{ subscriptions: Subscription[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.userId) {\n where.push('user_id = ?')\n values.push(filters.userId)\n }\n if (filters.stripeCustomerId) {\n where.push('stripe_customer_id = ?')\n values.push(filters.stripeCustomerId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const sortBy = filters.sortBy || 'created_at'\n const sortOrder = filters.sortOrder || 'desc'\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n // Get total count\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM subscriptions ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n // Get paginated results\n const results = await this.db.prepare(\n `SELECT s.*, u.email as user_email FROM subscriptions s LEFT JOIN users u ON s.user_id = u.id ${whereClause} ORDER BY ${sortBy} ${sortOrder} LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n subscriptions: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n /**\n * Get subscription stats\n */\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\n SUM(CASE WHEN status = 'canceled' THEN 1 ELSE 0 END) as canceled,\n SUM(CASE WHEN status = 'past_due' THEN 1 ELSE 0 END) as past_due,\n SUM(CASE WHEN status = 'trialing' THEN 1 ELSE 0 END) as trialing\n FROM subscriptions\n `).first() as any\n\n return {\n total: result?.total || 0,\n active: result?.active || 0,\n canceled: result?.canceled || 0,\n pastDue: result?.past_due || 0,\n trialing: result?.trialing || 0\n }\n }\n\n /**\n * Delete a subscription record by Stripe subscription ID\n */\n async deleteByStripeId(stripeSubscriptionId: string): Promise {\n const result = await this.db.prepare(\n 'DELETE FROM subscriptions WHERE stripe_subscription_id = ?'\n ).bind(stripeSubscriptionId).run()\n return (result.meta?.changes || 0) > 0\n }\n\n private mapRow(row: Record): Subscription {\n return {\n id: row.id,\n userId: row.user_id,\n stripeCustomerId: row.stripe_customer_id,\n stripeSubscriptionId: row.stripe_subscription_id,\n stripePriceId: row.stripe_price_id,\n status: row.status as SubscriptionStatus,\n currentPeriodStart: row.current_period_start,\n currentPeriodEnd: row.current_period_end,\n cancelAtPeriodEnd: !!row.cancel_at_period_end,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n // Attach email if joined\n ...(row.user_email ? { userEmail: row.user_email } : {})\n } as Subscription\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types'\nimport type { StripeEventRecord, StripeEventFilters, StripeEventStats } from '../types'\n\n/**\n * Manages Stripe event log records in D1\n */\nexport class StripeEventService {\n constructor(private db: D1Database) {}\n\n async ensureTable(): Promise {\n await this.db.prepare(`\n CREATE TABLE IF NOT EXISTS stripe_events (\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\n stripe_event_id TEXT NOT NULL UNIQUE,\n type TEXT NOT NULL,\n object_id TEXT NOT NULL DEFAULT '',\n object_type TEXT NOT NULL DEFAULT '',\n data TEXT NOT NULL DEFAULT '{}',\n processed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n status TEXT NOT NULL DEFAULT 'processed',\n error TEXT\n )\n `).run()\n\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_type ON stripe_events(type)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_status ON stripe_events(status)\n `).run()\n await this.db.prepare(`\n CREATE INDEX IF NOT EXISTS idx_stripe_events_processed_at ON stripe_events(processed_at DESC)\n `).run()\n }\n\n async log(event: {\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: Record\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n }): Promise {\n await this.db.prepare(`\n INSERT INTO stripe_events (stripe_event_id, type, object_id, object_type, data, status, error)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(stripe_event_id) DO UPDATE SET\n status = excluded.status,\n error = excluded.error,\n processed_at = unixepoch()\n `).bind(\n event.stripeEventId,\n event.type,\n event.objectId,\n event.objectType,\n JSON.stringify(event.data),\n event.status,\n event.error || null\n ).run()\n }\n\n async list(filters: StripeEventFilters = {}): Promise<{ events: StripeEventRecord[]; total: number }> {\n const where: string[] = []\n const values: any[] = []\n\n if (filters.type) {\n where.push('type = ?')\n values.push(filters.type)\n }\n if (filters.status) {\n where.push('status = ?')\n values.push(filters.status)\n }\n if (filters.objectId) {\n where.push('object_id = ?')\n values.push(filters.objectId)\n }\n\n const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''\n const limit = Math.min(filters.limit || 50, 100)\n const page = filters.page || 1\n const offset = (page - 1) * limit\n\n const countResult = await this.db.prepare(\n `SELECT COUNT(*) as count FROM stripe_events ${whereClause}`\n ).bind(...values).first() as { count: number }\n\n const results = await this.db.prepare(\n `SELECT * FROM stripe_events ${whereClause} ORDER BY processed_at DESC LIMIT ? OFFSET ?`\n ).bind(...values, limit, offset).all()\n\n return {\n events: (results.results || []).map((r: any) => this.mapRow(r)),\n total: countResult?.count || 0\n }\n }\n\n async getStats(): Promise {\n const result = await this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(CASE WHEN status = 'processed' THEN 1 ELSE 0 END) as processed,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'ignored' THEN 1 ELSE 0 END) as ignored\n FROM stripe_events\n `).first() as any\n\n return {\n total: result?.total || 0,\n processed: result?.processed || 0,\n failed: result?.failed || 0,\n ignored: result?.ignored || 0\n }\n }\n\n async getDistinctTypes(): Promise {\n const results = await this.db.prepare(\n 'SELECT DISTINCT type FROM stripe_events ORDER BY type'\n ).all()\n return (results.results || []).map((r: any) => r.type)\n }\n\n private mapRow(row: Record): StripeEventRecord {\n return {\n id: row.id,\n stripeEventId: row.stripe_event_id,\n type: row.type,\n objectId: row.object_id,\n objectType: row.object_type,\n data: row.data,\n processedAt: row.processed_at,\n status: row.status,\n error: row.error || undefined\n }\n }\n}\n","import type { Subscription, SubscriptionStats, SubscriptionStatus } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface StripePageData {\n subscriptions: (Subscription & { userEmail?: string })[]\n stats: SubscriptionStats\n filters: { status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderSubscriptionsPage(data: StripePageData): string {\n const { subscriptions, stats, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Manage subscriptions, view billing status, and monitor payment events.\n

\n
\n
\n \n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe')}\n\n \n
\n ${statsCard('Total', stats.total, 'text-zinc-950 dark:text-white')}\n ${statsCard('Active', stats.active, 'text-emerald-600 dark:text-emerald-400')}\n ${statsCard('Trialing', stats.trialing, 'text-blue-600 dark:text-blue-400')}\n ${statsCard('Past Due', stats.pastDue, 'text-amber-600 dark:text-amber-400')}\n ${statsCard('Canceled', stats.canceled, 'text-red-600 dark:text-red-400')}\n
\n\n \n
\n
\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n ${subscriptions.length === 0\n ? ''\n : subscriptions.map(renderRow).join('')\n }\n \n
UserStatusPrice IDCurrent PeriodCancel at EndStripe
No subscriptions found
\n\n ${renderPagination(filters.page, filters.totalPages, filters.status)}\n
\n\n
\n
\n\n \n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Subscriptions',\n pageTitle: 'Stripe Subscriptions',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction statsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction statusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.replace('_', ' ').replace(/\\b\\w/g, c => c.toUpperCase())\n return ``\n}\n\nfunction statusBadge(status: SubscriptionStatus): string {\n const colors: Record = {\n active: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n trialing: 'bg-blue-400/10 text-blue-500 dark:text-blue-400 ring-blue-400/20',\n past_due: 'bg-amber-400/10 text-amber-500 dark:text-amber-400 ring-amber-400/20',\n canceled: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n unpaid: 'bg-orange-400/10 text-orange-500 dark:text-orange-400 ring-orange-400/20',\n paused: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20',\n incomplete_expired: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n const label = status.replace('_', ' ')\n return `${label}`\n}\n\nfunction formatDate(timestamp: number): string {\n if (!timestamp) return '-'\n return new Date(timestamp * 1000).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })\n}\n\nfunction renderRow(sub: Subscription & { userEmail?: string }): string {\n return `\n \n \n
${sub.userEmail || sub.userId}
\n
${sub.stripeCustomerId}
\n \n ${statusBadge(sub.status)}\n ${sub.stripePriceId}\n \n ${formatDate(sub.currentPeriodStart)} - ${formatDate(sub.currentPeriodEnd)}\n \n \n ${sub.cancelAtPeriodEnd\n ? 'Yes'\n : 'No'\n }\n \n \n \n View in Stripe\n \n \n \n `\n}\n\nfunction renderPagination(page: number, totalPages: number, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params = status ? `&status=${status}` : ''\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","/**\n * Shared tab bar for all Stripe admin pages.\n */\n\nconst TABS = [\n { label: 'Subscriptions', path: '/admin/plugins/stripe' },\n { label: 'Events', path: '/admin/plugins/stripe/events' },\n { label: 'Settings', path: '/admin/plugins/stripe/settings' },\n]\n\nexport function renderStripeTabBar(currentPath: string): string {\n const tabs = TABS.map(tab => {\n const isActive = currentPath === tab.path\n || (tab.path === '/admin/plugins/stripe' && currentPath === '/admin/plugins/stripe/')\n return `\n \n ${tab.label}\n `\n }).join('')\n\n return `\n
\n \n
\n `\n}\n","import type { StripeEventRecord, StripeEventStats } from '../types'\nimport { renderAdminLayoutCatalyst, type AdminLayoutCatalystData } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport { renderStripeTabBar } from './tab-bar'\n\nexport interface EventsPageData {\n events: StripeEventRecord[]\n stats: StripeEventStats\n types: string[]\n filters: { type?: string; status?: string; page: number; totalPages: number }\n user?: { name: string; email: string; role: string }\n version?: string\n dynamicMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport function renderEventsPage(data: EventsPageData): string {\n const { events, stats, types, filters, user, version, dynamicMenuItems } = data\n\n const content = `\n
\n
\n
\n

Stripe

\n

\n Webhook event log showing all processed, failed, and ignored Stripe events.\n

\n
\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/events')}\n\n \n
\n ${eventStatsCard('Total Events', stats.total, 'text-zinc-950 dark:text-white')}\n ${eventStatsCard('Processed', stats.processed, 'text-emerald-600 dark:text-emerald-400')}\n ${eventStatsCard('Failed', stats.failed, 'text-red-600 dark:text-red-400')}\n ${eventStatsCard('Ignored', stats.ignored, 'text-zinc-500 dark:text-zinc-400')}\n
\n\n \n
\n
\n \n \n\n \n \n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n \n ${events.length === 0\n ? ''\n : events.map(renderEventRow).join('')\n }\n \n
TimeTypeObject / UserStatusEvent ID
No events recorded yet
\n\n ${renderEventPagination(filters.page, filters.totalPages, filters.type, filters.status)}\n
\n
\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Stripe Events',\n pageTitle: 'Stripe Events',\n currentPath: '/admin/plugins/stripe',\n user,\n content,\n version,\n dynamicMenuItems\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction eventStatsCard(label: string, value: number, colorClass: string): string {\n return `\n
\n

${label}

\n

${value}

\n
\n `\n}\n\nfunction eventStatusOption(value: string, current?: string): string {\n const selected = value === current ? 'selected' : ''\n const label = value.charAt(0).toUpperCase() + value.slice(1)\n return ``\n}\n\nfunction eventStatusBadge(status: string): string {\n const colors: Record = {\n processed: 'bg-emerald-400/10 text-emerald-500 dark:text-emerald-400 ring-emerald-400/20',\n failed: 'bg-red-400/10 text-red-500 dark:text-red-400 ring-red-400/20',\n ignored: 'bg-zinc-400/10 text-zinc-500 dark:text-zinc-400 ring-zinc-400/20'\n }\n const color = colors[status] || 'bg-zinc-400/10 text-zinc-500 ring-zinc-400/20'\n return `${status}`\n}\n\nfunction formatTimestamp(timestamp: number): string {\n if (!timestamp) return '-'\n const d = new Date(timestamp * 1000)\n return d.toLocaleString('en-US', {\n month: 'short', day: 'numeric', year: 'numeric',\n hour: '2-digit', minute: '2-digit', second: '2-digit'\n })\n}\n\nfunction extractUserInfo(event: StripeEventRecord): { userId?: string; email?: string } {\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n const userId = data?.metadata?.sonicjs_user_id || data?.sonicjs_user_id\n const email = data?.customer_email || data?.customerEmail || data?.receipt_email\n return { userId: userId || undefined, email: email || undefined }\n } catch {\n return {}\n }\n}\n\nfunction renderEventRow(event: StripeEventRecord): string {\n const errorTooltip = event.error ? ` title=\"${event.error.replace(/\"/g, '"')}\"` : ''\n const userInfo = extractUserInfo(event)\n const userLink = userInfo.userId\n ? `${userInfo.email || userInfo.userId}`\n : userInfo.email\n ? `${userInfo.email}`\n : ''\n\n return `\n \n \n ${formatTimestamp(event.processedAt)}\n \n \n ${event.type}\n \n \n
${event.objectId || '-'}
\n
${event.objectType}
\n ${userLink ? `
${userLink}
` : ''}\n \n ${eventStatusBadge(event.status)}\n ${event.stripeEventId}\n \n `\n}\n\nfunction renderEventPagination(page: number, totalPages: number, type?: string, status?: string): string {\n if (totalPages <= 1) return ''\n\n const params: string[] = []\n if (type) params.push(`type=${type}`)\n if (status) params.push(`status=${status}`)\n const extra = params.length > 0 ? `&${params.join('&')}` : ''\n\n return `\n
\n
\n Page ${page} of ${totalPages}\n
\n
\n ${page > 1\n ? `Previous`\n : ''\n }\n ${page < totalPages\n ? `Next`\n : ''\n }\n
\n
\n `\n}\n","// ============================================================================\n// Stripe Plugin Types\n// ============================================================================\n\nexport type SubscriptionStatus =\n | 'active'\n | 'canceled'\n | 'past_due'\n | 'trialing'\n | 'unpaid'\n | 'paused'\n | 'incomplete'\n | 'incomplete_expired'\n\nexport interface Subscription {\n id: string\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd: boolean\n createdAt: number\n updatedAt: number\n}\n\nexport interface SubscriptionInsert {\n userId: string\n stripeCustomerId: string\n stripeSubscriptionId: string\n stripePriceId: string\n status: SubscriptionStatus\n currentPeriodStart: number\n currentPeriodEnd: number\n cancelAtPeriodEnd?: boolean\n}\n\nexport interface SubscriptionFilters {\n status?: SubscriptionStatus\n userId?: string\n stripeCustomerId?: string\n page?: number\n limit?: number\n sortBy?: 'created_at' | 'updated_at' | 'status'\n sortOrder?: 'asc' | 'desc'\n}\n\nexport interface SubscriptionStats {\n total: number\n active: number\n canceled: number\n pastDue: number\n trialing: number\n}\n\nexport interface StripePluginSettings {\n stripePublishableKey: string\n stripeSecretKey: string\n stripeWebhookSecret: string\n stripePriceId?: string\n successUrl: string\n cancelUrl: string\n}\n\nexport const DEFAULT_SETTINGS: StripePluginSettings = {\n stripePublishableKey: '',\n stripeSecretKey: '',\n stripeWebhookSecret: '',\n stripePriceId: '',\n successUrl: '/admin/dashboard',\n cancelUrl: '/admin/dashboard'\n}\n\n// Stripe webhook event types we handle\nexport type StripeWebhookEventType =\n | 'customer.subscription.created'\n | 'customer.subscription.updated'\n | 'customer.subscription.deleted'\n | 'checkout.session.completed'\n | 'invoice.payment_succeeded'\n | 'invoice.payment_failed'\n\n// Minimal Stripe types (we use fetch, not the SDK)\nexport interface StripeEvent {\n id: string\n type: string\n data: {\n object: Record\n }\n}\n\nexport interface StripeSubscriptionObject {\n id: string\n customer: string\n status: string\n items: {\n data: Array<{\n price: {\n id: string\n }\n }>\n }\n current_period_start: number\n current_period_end: number\n cancel_at_period_end: boolean\n metadata?: Record\n}\n\nexport interface StripeCheckoutSession {\n id: string\n customer: string\n subscription: string\n metadata?: Record\n}\n\nexport interface StripeInvoice {\n id: string\n customer: string\n subscription: string | null\n status: string\n amount_paid: number\n currency: string\n}\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\nexport interface StripeEventRecord {\n id: string\n stripeEventId: string\n type: string\n objectId: string\n objectType: string\n data: string // JSON string\n processedAt: number\n status: 'processed' | 'failed' | 'ignored'\n error?: string\n}\n\nexport interface StripeEventFilters {\n type?: string\n status?: 'processed' | 'failed' | 'ignored'\n objectId?: string\n page?: number\n limit?: number\n}\n\nexport interface StripeEventStats {\n total: number\n processed: number\n failed: number\n ignored: number\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { renderSubscriptionsPage } from '../components/subscriptions-page'\nimport { renderEventsPage } from '../components/events-page'\nimport { renderStripeTabBar } from '../components/tab-bar'\nimport type { Bindings, Variables } from '../../../../app'\nimport type { StripePluginSettings, SubscriptionStatus } from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\n// Check admin role\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\n// Subscriptions dashboard\nadminRoutes.get('/', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const statusFilter = c.req.query('status') as SubscriptionStatus | undefined\n\n const [{ subscriptions, total }, stats] = await Promise.all([\n subscriptionService.list({ status: statusFilter, page, limit }),\n subscriptionService.getStats()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderSubscriptionsPage({\n subscriptions: subscriptions as any,\n stats,\n filters: { status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Events log page\nadminRoutes.get('/events', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const page = parseInt(c.req.query('page') || '1')\n const limit = 50\n const typeFilter = c.req.query('type') || undefined\n const statusFilter = c.req.query('status') as 'processed' | 'failed' | 'ignored' | undefined\n\n const [{ events, total }, stats, types] = await Promise.all([\n eventService.list({ type: typeFilter, status: statusFilter, page, limit }),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n const totalPages = Math.ceil(total / limit)\n\n const html = renderEventsPage({\n events,\n stats,\n types,\n filters: { type: typeFilter, status: statusFilter, page, totalPages },\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n })\n\n return c.html(html)\n})\n\n// Settings page\nadminRoutes.get('/settings', async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n const settings = await getSettings(db)\n\n const { renderAdminLayoutCatalyst } = await import('../../../../templates/layouts/admin-layout-catalyst.template')\n\n const content = `\n
\n
\n

Stripe

\n

\n Configure your Stripe API keys and checkout options.\n

\n
\n\n ${renderStripeTabBar('/admin/plugins/stripe/settings')}\n\n
\n\n
\n
\n
\n \n \n

Your Stripe publishable key (starts with pk_)

\n
\n\n
\n \n \n

Your Stripe secret API key (starts with sk_)

\n
\n\n
\n \n \n

Stripe webhook endpoint signing secret (starts with whsec_)

\n
\n\n
\n \n \n

Default Stripe Price ID for checkout sessions (optional)

\n
\n\n
\n \n \n

Redirect URL after successful checkout

\n
\n\n
\n \n \n

Redirect URL if checkout is cancelled

\n
\n
\n\n
\n \n
\n
\n
\n\n \n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Stripe Settings',\n pageTitle: 'Stripe Settings',\n currentPath: '/admin/plugins/stripe',\n user: user ? { name: user.email, email: user.email, role: user.role } : undefined,\n content,\n version: c.get('appVersion'),\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\n// Save settings\nadminRoutes.post('/settings', async (c) => {\n try {\n const body = await c.req.json()\n const db = c.env.DB\n\n await db.prepare(`\n UPDATE plugins\n SET settings = ?,\n updated_at = unixepoch()\n WHERE id = 'stripe'\n `).bind(JSON.stringify(body)).run()\n\n return c.json({ success: true })\n } catch (error) {\n console.error('Error saving Stripe settings:', error)\n return c.json({ success: false, error: 'Failed to save settings' }, 500)\n }\n})\n\nexport { adminRoutes as stripeAdminRoutes }\n","import type { StripePluginSettings } from '../types'\n\n/**\n * Lightweight Stripe API client using fetch (CF Workers compatible, no SDK needed)\n */\nexport class StripeAPI {\n private baseUrl = 'https://api.stripe.com/v1'\n\n constructor(private secretKey: string) {}\n\n /**\n * Verify a webhook signature\n * Implements Stripe's v1 signature scheme using Web Crypto API\n */\n async verifyWebhookSignature(payload: string, sigHeader: string, secret: string): Promise {\n const parts = sigHeader.split(',')\n const timestamp = parts.find(p => p.startsWith('t='))?.split('=')[1]\n const signatures = parts\n .filter(p => p.startsWith('v1='))\n .map(p => p.substring(3))\n\n if (!timestamp || signatures.length === 0) return false\n\n // Reject events older than 5 minutes (tolerance)\n const now = Math.floor(Date.now() / 1000)\n if (Math.abs(now - parseInt(timestamp)) > 300) return false\n\n // Compute expected signature\n const signedPayload = `${timestamp}.${payload}`\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(signedPayload))\n const expectedSignature = Array.from(new Uint8Array(signatureBuffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n\n return signatures.some(sig => timingSafeEqual(sig, expectedSignature))\n }\n\n /**\n * Create a Checkout Session\n */\n async createCheckoutSession(params: {\n priceId: string\n customerId?: string\n customerEmail?: string\n successUrl: string\n cancelUrl: string\n metadata?: Record\n }): Promise<{ id: string; url: string }> {\n const body = new URLSearchParams()\n body.append('mode', 'subscription')\n body.append('line_items[0][price]', params.priceId)\n body.append('line_items[0][quantity]', '1')\n body.append('success_url', params.successUrl)\n body.append('cancel_url', params.cancelUrl)\n\n if (params.customerId) {\n body.append('customer', params.customerId)\n } else if (params.customerEmail) {\n body.append('customer_email', params.customerEmail)\n }\n\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n\n const response = await this.request('POST', '/checkout/sessions', body)\n return { id: response.id, url: response.url }\n }\n\n /**\n * Retrieve a Stripe subscription\n */\n async getSubscription(subscriptionId: string): Promise {\n return this.request('GET', `/subscriptions/${subscriptionId}`)\n }\n\n /**\n * Create a Stripe customer\n */\n async createCustomer(params: { email: string; metadata?: Record }): Promise<{ id: string }> {\n const body = new URLSearchParams()\n body.append('email', params.email)\n if (params.metadata) {\n for (const [key, value] of Object.entries(params.metadata)) {\n body.append(`metadata[${key}]`, value)\n }\n }\n return this.request('POST', '/customers', body)\n }\n\n /**\n * List subscriptions with pagination (auto-expands across pages)\n */\n async listSubscriptions(params?: {\n status?: string\n limit?: number\n startingAfter?: string\n }): Promise<{ data: any[]; has_more: boolean }> {\n const qs = new URLSearchParams()\n qs.append('limit', String(params?.limit || 100))\n if (params?.status) qs.append('status', params.status)\n if (params?.startingAfter) qs.append('starting_after', params.startingAfter)\n return this.request('GET', `/subscriptions?${qs.toString()}`)\n }\n\n /**\n * Fetch ALL subscriptions from Stripe (handles pagination automatically)\n */\n async listAllSubscriptions(): Promise {\n const all: any[] = []\n let startingAfter: string | undefined\n\n while (true) {\n const result = await this.listSubscriptions({ limit: 100, startingAfter })\n all.push(...result.data)\n if (!result.has_more || result.data.length === 0) break\n startingAfter = result.data[result.data.length - 1].id\n }\n\n return all\n }\n\n /**\n * Search for a customer by email\n */\n async findCustomerByEmail(email: string): Promise<{ id: string } | null> {\n const params = new URLSearchParams()\n params.append('query', `email:'${email}'`)\n params.append('limit', '1')\n const result = await this.request('GET', `/customers/search?${params.toString()}`)\n return result.data?.[0] || null\n }\n\n private async request(method: string, path: string, body?: URLSearchParams): Promise {\n const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${this.secretKey}`,\n ...(body ? { 'Content-Type': 'application/x-www-form-urlencoded' } : {})\n },\n ...(body ? { body: body.toString() } : {})\n })\n\n const data = await response.json() as any\n if (!response.ok) {\n throw new Error(`Stripe API error: ${data.error?.message || response.statusText}`)\n }\n return data\n }\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks on signature verification\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n return result === 0\n}\n","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { PluginService } from '../../../../services'\nimport { SubscriptionService } from '../services/subscription-service'\nimport { StripeEventService } from '../services/stripe-event-service'\nimport { StripeAPI } from '../services/stripe-api'\nimport type { Bindings, Variables } from '../../../../app'\nimport type {\n StripePluginSettings,\n StripeEvent,\n StripeSubscriptionObject,\n StripeCheckoutSession,\n StripeInvoice,\n SubscriptionStatus,\n SubscriptionFilters\n} from '../types'\nimport { DEFAULT_SETTINGS } from '../types'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nasync function getSettings(db: any): Promise {\n try {\n const pluginService = new PluginService(db)\n const plugin = await pluginService.getPlugin('stripe')\n if (plugin?.settings) {\n const settings = typeof plugin.settings === 'string' ? JSON.parse(plugin.settings) : plugin.settings\n return { ...DEFAULT_SETTINGS, ...settings }\n }\n } catch { /* ignore */ }\n return DEFAULT_SETTINGS\n}\n\nfunction mapStripeStatus(status: string): SubscriptionStatus {\n const map: Record = {\n active: 'active',\n canceled: 'canceled',\n past_due: 'past_due',\n trialing: 'trialing',\n unpaid: 'unpaid',\n paused: 'paused',\n incomplete: 'incomplete',\n incomplete_expired: 'incomplete_expired'\n }\n return map[status] || 'incomplete'\n}\n\n// ============================================================================\n// Webhook — No auth, verified by Stripe signature\n// ============================================================================\n\napiRoutes.post('/webhook', async (c) => {\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeWebhookSecret) {\n return c.json({ error: 'Webhook secret not configured' }, 500)\n }\n\n // Must read raw body for signature verification\n const rawBody = await c.req.text()\n const sigHeader = c.req.header('stripe-signature') || ''\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const isValid = await stripeApi.verifyWebhookSignature(rawBody, sigHeader, settings.stripeWebhookSecret)\n\n if (!isValid) {\n return c.json({ error: 'Invalid signature' }, 400)\n }\n\n const event: StripeEvent = JSON.parse(rawBody)\n const subscriptionService = new SubscriptionService(db)\n const eventService = new StripeEventService(db)\n await Promise.all([subscriptionService.ensureTable(), eventService.ensureTable()])\n\n // Determine object ID and type for the event log\n const obj = event.data.object as any\n const objectId = obj?.id || ''\n const objectType = obj?.object || event.type.split('.')[0] || ''\n\n try {\n switch (event.type) {\n case 'customer.subscription.created': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n\n await subscriptionService.create({\n userId,\n stripeCustomerId: sub.customer,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items.data[0]?.price.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription created: ${sub.id}`)\n break\n }\n\n case 'customer.subscription.updated': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: mapStripeStatus(sub.status),\n stripePriceId: sub.items.data[0]?.price.id || undefined,\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n\n console.log(`[Stripe] Subscription updated: ${sub.id} -> ${sub.status}`)\n break\n }\n\n case 'customer.subscription.deleted': {\n const sub = event.data.object as unknown as StripeSubscriptionObject\n await subscriptionService.updateByStripeId(sub.id, {\n status: 'canceled'\n })\n\n console.log(`[Stripe] Subscription deleted: ${sub.id}`)\n break\n }\n\n case 'checkout.session.completed': {\n const session = event.data.object as unknown as StripeCheckoutSession\n const userId = session.metadata?.sonicjs_user_id\n\n if (userId && session.subscription) {\n const existing = await subscriptionService.getByStripeSubscriptionId(session.subscription)\n if (existing && !existing.userId) {\n await subscriptionService.updateByStripeId(session.subscription, {\n userId\n } as any)\n }\n }\n\n console.log(`[Stripe] Checkout completed: ${session.id}`)\n break\n }\n\n case 'invoice.payment_succeeded': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'active'\n })\n }\n console.log(`[Stripe] Payment succeeded for invoice: ${invoice.id}`)\n break\n }\n\n case 'invoice.payment_failed': {\n const invoice = event.data.object as unknown as StripeInvoice\n if (invoice.subscription) {\n await subscriptionService.updateByStripeId(invoice.subscription, {\n status: 'past_due'\n })\n }\n console.log(`[Stripe] Payment failed for invoice: ${invoice.id}`)\n break\n }\n\n default:\n console.log(`[Stripe] Unhandled event type: ${event.type}`)\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'ignored'\n })\n return c.json({ received: true })\n }\n\n // Log successfully processed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'processed'\n })\n } catch (error) {\n // Log failed event\n await eventService.log({\n stripeEventId: event.id,\n type: event.type,\n objectId,\n objectType,\n data: event.data.object as any,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error)\n }).catch(() => {}) // Don't let logging failure mask the real error\n\n console.error(`[Stripe] Error processing webhook event ${event.type}:`, error)\n return c.json({ error: 'Webhook processing failed' }, 500)\n }\n\n return c.json({ received: true })\n})\n\n// ============================================================================\n// Authenticated API Routes\n// ============================================================================\n\n// Create checkout session for current user\napiRoutes.post('/create-checkout-session', requireAuth(), async (c) => {\n const db = c.env.DB\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const settings = await getSettings(db)\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe not configured' }, 500)\n }\n\n const body = await c.req.json().catch(() => ({})) as { priceId?: string }\n const priceId = body.priceId || settings.stripePriceId\n if (!priceId) {\n return c.json({ error: 'No price ID specified' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n // Check if user already has a Stripe customer ID\n const existingSub = await subscriptionService.getByUserId(user.userId)\n let customerId = existingSub?.stripeCustomerId\n\n if (!customerId) {\n // Try to find existing customer by email, or create one\n const existing = await stripeApi.findCustomerByEmail(user.email)\n if (existing) {\n customerId = existing.id\n } else {\n const customer = await stripeApi.createCustomer({\n email: user.email,\n metadata: { sonicjs_user_id: user.userId }\n })\n customerId = customer.id\n }\n }\n\n const origin = new URL(c.req.url).origin\n const session = await stripeApi.createCheckoutSession({\n priceId,\n customerId,\n successUrl: `${origin}${settings.successUrl}?session_id={CHECKOUT_SESSION_ID}`,\n cancelUrl: `${origin}${settings.cancelUrl}`,\n metadata: { sonicjs_user_id: user.userId }\n })\n\n return c.json({ sessionId: session.id, url: session.url })\n})\n\n// Get current user's subscription\napiRoutes.get('/subscription', requireAuth(), async (c) => {\n const user = c.get('user')\n if (!user) return c.json({ error: 'Unauthorized' }, 401)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const subscription = await subscriptionService.getByUserId(user.userId)\n if (!subscription) {\n return c.json({ subscription: null })\n }\n\n return c.json({ subscription })\n})\n\n// ============================================================================\n// Admin API Routes\n// ============================================================================\n\n// List all subscriptions (admin only)\napiRoutes.get('/subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const filters: SubscriptionFilters = {\n status: c.req.query('status') as SubscriptionStatus | undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n sortBy: (c.req.query('sortBy') as any) || 'created_at',\n sortOrder: (c.req.query('sortOrder') as any) || 'desc'\n }\n\n const result = await subscriptionService.list(filters)\n return c.json(result)\n})\n\n// Get subscription stats (admin only)\napiRoutes.get('/stats', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n const stats = await subscriptionService.getStats()\n return c.json(stats)\n})\n\n// ============================================================================\n// Sync Subscriptions from Stripe API\n// ============================================================================\n\napiRoutes.post('/sync-subscriptions', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const settings = await getSettings(db)\n\n if (!settings.stripeSecretKey) {\n return c.json({ error: 'Stripe secret key not configured' }, 400)\n }\n\n const stripeApi = new StripeAPI(settings.stripeSecretKey)\n const subscriptionService = new SubscriptionService(db)\n await subscriptionService.ensureTable()\n\n try {\n const allSubs = await stripeApi.listAllSubscriptions()\n let synced = 0\n let errors = 0\n\n for (const sub of allSubs) {\n try {\n const userId = sub.metadata?.sonicjs_user_id || await subscriptionService.getUserIdByStripeCustomer(sub.customer) || ''\n await subscriptionService.upsert({\n userId,\n stripeCustomerId: typeof sub.customer === 'string' ? sub.customer : sub.customer.id,\n stripeSubscriptionId: sub.id,\n stripePriceId: sub.items?.data?.[0]?.price?.id || '',\n status: mapStripeStatus(sub.status),\n currentPeriodStart: sub.current_period_start,\n currentPeriodEnd: sub.current_period_end,\n cancelAtPeriodEnd: sub.cancel_at_period_end\n })\n synced++\n } catch (err) {\n console.error(`[Stripe Sync] Failed to upsert subscription ${sub.id}:`, err)\n errors++\n }\n }\n\n return c.json({\n success: true,\n total: allSubs.length,\n synced,\n errors\n })\n } catch (error) {\n console.error('[Stripe Sync] Error:', error)\n return c.json({\n success: false,\n error: error instanceof Error ? error.message : 'Sync failed'\n }, 500)\n }\n})\n\n// ============================================================================\n// Stripe Events Log\n// ============================================================================\n\napiRoutes.get('/events', requireAuth(), async (c) => {\n const user = c.get('user')\n if (user?.role !== 'admin') return c.json({ error: 'Access denied' }, 403)\n\n const db = c.env.DB\n const eventService = new StripeEventService(db)\n await eventService.ensureTable()\n\n const filters = {\n type: c.req.query('type') || undefined,\n status: c.req.query('status') as any || undefined,\n objectId: c.req.query('objectId') || undefined,\n page: c.req.query('page') ? parseInt(c.req.query('page')!) : 1,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50\n }\n\n const [result, stats, types] = await Promise.all([\n eventService.list(filters),\n eventService.getStats(),\n eventService.getDistinctTypes()\n ])\n\n return c.json({ ...result, stats, types })\n})\n\nexport { apiRoutes as stripeApiRoutes }\n","import { PluginBuilder } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { stripeAdminRoutes } from './routes/admin'\nimport { stripeApiRoutes } from './routes/api'\n\nexport function createStripePlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'stripe',\n version: '1.0.0-beta.1',\n description: 'Stripe subscription management with webhook handling, checkout sessions, and subscription gating'\n })\n\n builder.metadata({\n author: { name: 'SonicJS Team' },\n license: 'MIT'\n })\n\n // Admin dashboard — subscription management\n builder.addRoute('/admin/plugins/stripe', stripeAdminRoutes as any, {\n description: 'Stripe subscriptions admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // API routes — webhook, checkout, subscription status\n builder.addRoute('/api/stripe', stripeApiRoutes as any, {\n description: 'Stripe API endpoints (webhook, checkout, subscription)',\n requiresAuth: false, // Webhook route handles its own auth via signature\n priority: 50\n })\n\n // Admin menu item\n builder.addMenuItem('Stripe', '/admin/plugins/stripe', {\n icon: ``,\n order: 75\n })\n\n // Lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.log('[Stripe] Plugin installed')\n },\n activate: async () => {\n console.log('[Stripe] Plugin activated')\n },\n deactivate: async () => {\n console.log('[Stripe] Plugin deactivated')\n },\n uninstall: async () => {\n console.log('[Stripe] Plugin uninstalled')\n }\n })\n\n return builder.build()\n}\n\nexport const stripePlugin = createStripePlugin()\nexport { SubscriptionService } from './services/subscription-service'\nexport { StripeAPI } from './services/stripe-api'\nexport { requireSubscription } from './middleware/require-subscription'\nexport default stripePlugin\n","import type { Context, Next } from 'hono'\nimport type { Bindings, Variables } from '../app'\nimport { PLUGIN_REGISTRY } from '../plugins/manifest-registry'\n\n// Build menu plugin data from the auto-generated registry.\n// Any plugin with an adminMenu entry in its manifest.json will\n// automatically appear in the sidebar when active.\nconst REGISTRY_MENU_PLUGINS = Object.values(PLUGIN_REGISTRY)\n .filter(p => p.adminMenu !== null)\n .map(p => ({\n codeName: p.codeName,\n label: p.adminMenu!.label,\n path: p.adminMenu!.path,\n icon: p.adminMenu!.icon,\n order: p.adminMenu!.order,\n }))\n\n// Map icon names from manifest.json to Heroicons SVG (outline, 24x24)\nconst ICON_SVG: Record = {\n 'magnifying-glass': '',\n 'chart-bar': '',\n 'image': '',\n 'palette': '',\n 'envelope': '',\n 'hand-raised': '',\n 'key': '',\n 'arrow-right': '',\n 'shield-check': '',\n 'credit-card': '',\n}\n\nfunction resolveIcon(iconName?: string): string {\n if (!iconName) return ''\n // If it's already SVG markup, return as-is\n if (iconName.startsWith('`\n const resolvedIcon = resolveIcon(item.icon) || fallbackIcon\n return `\n \n ${isActive ? '' : ''}\n \n \n ${resolvedIcon}\n \n ${item.label}\n \n `\n}\n\nexport function pluginMenuMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const path = new URL(c.req.url).pathname\n if (!path.startsWith('/admin')) {\n return next()\n }\n\n // Collect menu items from active plugins using the registry\n let activeMenuItems: Array<{ label: string; path: string; icon?: string; order: number }> = []\n try {\n const db = c.env.DB\n const pluginCodeNames = REGISTRY_MENU_PLUGINS.map(p => p.codeName)\n if (pluginCodeNames.length > 0) {\n const placeholders = pluginCodeNames.map(() => '?').join(',')\n const result = await db.prepare(\n `SELECT name FROM plugins WHERE name IN (${placeholders}) AND status = 'active'`\n ).bind(...pluginCodeNames).all()\n\n const activeNames = new Set((result.results || []).map((r: any) => r.name))\n\n for (const plugin of REGISTRY_MENU_PLUGINS) {\n if (activeNames.has(plugin.codeName)) {\n activeMenuItems.push({\n label: plugin.label,\n path: plugin.path,\n icon: plugin.icon,\n order: plugin.order,\n })\n }\n }\n\n // Sort by order\n activeMenuItems.sort((a, b) => a.order - b.order)\n }\n } catch {\n // DB not ready or plugin table doesn't exist yet\n }\n\n c.set('pluginMenuItems', activeMenuItems.map(m => ({ label: m.label, path: m.path, icon: resolveIcon(m.icon) || '' })))\n\n await next()\n\n // Inject menu items into HTML response by replacing the marker\n if (activeMenuItems.length > 0 && c.res.headers.get('content-type')?.includes('text/html')) {\n const status = c.res.status\n const headers = new Headers(c.res.headers)\n const html = await c.res.text()\n\n if (html.includes(MARKER)) {\n const renderedItems = activeMenuItems.map(item => renderMenuItem(item, path)).join('')\n const newHtml = html.split(MARKER).join(renderedItems)\n c.res = new Response(newHtml, { status, headers })\n } else {\n // Body was consumed by .text(), must create new Response either way\n c.res = new Response(html, { status, headers })\n }\n }\n }\n}\n","/**\n * SonicJS Plugin System Types\n * \n * Defines the core interfaces and types for the plugin system\n */\n\nimport { Hono, Context, Next, MiddlewareHandler } from 'hono'\nimport { z } from 'zod'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\n\n// Core plugin definition\nexport interface Plugin {\n /** Unique plugin identifier */\n name: string\n /** Plugin version (semantic versioning) */\n version: string\n /** Human-readable description */\n description?: string\n /** Plugin author information */\n author?: {\n name: string\n email?: string\n url?: string\n }\n /** Plugin dependencies (other plugins required) */\n dependencies?: string[]\n /** SonicJS version compatibility */\n compatibility?: string\n /** Plugin license */\n license?: string\n \n // Extension points\n routes?: PluginRoutes[]\n middleware?: PluginMiddleware[]\n models?: PluginModel[]\n services?: PluginService[]\n adminPages?: PluginAdminPage[]\n adminComponents?: PluginComponent[]\n menuItems?: PluginMenuItem[]\n hooks?: PluginHook[]\n \n // Lifecycle hooks\n install?: (context: PluginContext) => Promise\n uninstall?: (context: PluginContext) => Promise\n activate?: (context: PluginContext) => Promise\n deactivate?: (context: PluginContext) => Promise\n configure?: (config: PluginConfig) => Promise\n}\n\n// Plugin context provides access to SonicJS APIs\nexport interface PluginContext {\n /** Database instance */\n db: D1Database\n /** Key-value storage */\n kv: KVNamespace\n /** R2 storage bucket */\n r2?: R2Bucket\n /** Plugin configuration */\n config: PluginConfig\n /** Core SonicJS services */\n services: {\n auth: AuthService\n content: ContentService\n media: MediaService\n }\n /** Hook system for inter-plugin communication */\n hooks: HookSystem | ScopedHookSystem\n /** Logging utilities */\n logger: PluginLogger\n}\n\n// Authentication service interface for plugins\nexport interface AuthService {\n /** Generate JWT token for a user */\n generateToken(userId: string, email: string, role: string): Promise\n /** Verify and decode JWT token */\n verifyToken(token: string): Promise\n /** Set authentication cookie (useful for alternative auth methods) */\n setAuthCookie(context: Context, token: string, options?: {\n maxAge?: number\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n }): void\n /** Hash password */\n hashPassword(password: string): Promise\n /** Verify password against hash */\n verifyPassword(password: string, hash: string): Promise\n}\n\n// Plugin configuration\nexport interface PluginConfig {\n /** Plugin-specific configuration */\n [key: string]: any\n /** Whether plugin is enabled */\n enabled: boolean\n /** Plugin installation timestamp */\n installedAt?: number\n /** Plugin last update timestamp */\n updatedAt?: number\n}\n\n// Route definitions\nexport interface PluginRoutes {\n /** Route path prefix */\n path: string\n /** Hono route handler */\n handler: Hono\n /** Route description */\n description?: string\n /** Whether route requires authentication */\n requiresAuth?: boolean\n /** Required roles for access */\n roles?: string[]\n /** Route priority (for ordering) */\n priority?: number\n}\n\n// Middleware definitions\nexport interface PluginMiddleware {\n /** Middleware name */\n name: string\n /** Middleware handler function */\n handler: MiddlewareHandler\n /** Middleware description */\n description?: string\n /** Middleware priority (lower = earlier) */\n priority?: number\n /** Routes to apply middleware to */\n routes?: string[]\n /** Whether to apply globally */\n global?: boolean\n}\n\n// Database model definitions\nexport interface PluginModel {\n /** Model name */\n name: string\n /** Database table name */\n tableName: string\n /** Zod schema for validation */\n schema: z.ZodSchema\n /** Database migrations */\n migrations: string[]\n /** Model relationships */\n relationships?: ModelRelationship[]\n /** Whether model extends core content */\n extendsContent?: boolean\n}\n\nexport interface ModelRelationship {\n type: 'oneToOne' | 'oneToMany' | 'manyToMany'\n target: string\n foreignKey?: string\n joinTable?: string\n}\n\n// Service definitions\nexport interface PluginService {\n /** Service name */\n name: string\n /** Service implementation */\n implementation: any\n /** Service description */\n description?: string\n /** Service dependencies */\n dependencies?: string[]\n /** Whether service is singleton */\n singleton?: boolean\n}\n\n// Admin interface extensions\nexport interface PluginAdminPage {\n /** Page path (relative to /admin) */\n path: string\n /** Page title */\n title: string\n /** Page component/template */\n component: string\n /** Page description */\n description?: string\n /** Required permissions */\n permissions?: string[]\n /** Menu item configuration */\n menuItem?: PluginMenuItem\n /** Page icon */\n icon?: string\n}\n\nexport interface PluginComponent {\n /** Component name */\n name: string\n /** Component template function */\n template: (props: any) => string\n /** Component description */\n description?: string\n /** Component props schema */\n propsSchema?: z.ZodSchema\n}\n\nexport interface PluginMenuItem {\n /** Menu item label */\n label: string\n /** Menu item path */\n path: string\n /** Menu item icon */\n icon?: string\n /** Menu item order */\n order?: number\n /** Parent menu item */\n parent?: string\n /** Required permissions */\n permissions?: string[]\n /** Whether item is active */\n active?: boolean\n}\n\n// Hook system for extensibility\nexport interface PluginHook {\n /** Hook name */\n name: string\n /** Hook handler function */\n handler: HookHandler\n /** Hook priority */\n priority?: number\n /** Hook description */\n description?: string\n}\n\nexport type HookHandler = (data: any, context: HookContext) => Promise\n\nexport interface HookContext {\n /** Plugin that registered the hook */\n plugin: string\n /** Hook execution context */\n context: PluginContext\n /** Cancel hook execution */\n cancel?: () => void\n}\n\n// Hook system interface\nexport interface HookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Get all registered hooks */\n getHooks(hookName: string): PluginHook[]\n /** Create a scoped hook system (optional) */\n createScope?(pluginName: string): ScopedHookSystem\n}\n\n// Scoped hook system for plugins\nexport interface ScopedHookSystem {\n /** Register a hook handler */\n register(hookName: string, handler: HookHandler, priority?: number): void\n /** Execute all handlers for a hook */\n execute(hookName: string, data: any, context?: any): Promise\n /** Remove a hook handler */\n unregister(hookName: string, handler: HookHandler): void\n /** Remove all hooks for this scope */\n unregisterAll(): void\n}\n\n// Plugin registry\nexport interface PluginRegistry {\n /** Get plugin by name */\n get(name: string): Plugin | undefined\n /** Get all registered plugins */\n getAll(): Plugin[]\n /** Get active plugins */\n getActive(): Plugin[]\n /** Register a plugin */\n register(plugin: Plugin): Promise\n /** Unregister a plugin */\n unregister(name: string): Promise\n /** Check if plugin is registered */\n has(name: string): boolean\n /** Activate a plugin */\n activate(name: string): Promise\n /** Deactivate a plugin */\n deactivate(name: string): Promise\n /** Get plugin configuration */\n getConfig(name: string): PluginConfig | undefined\n /** Set plugin configuration */\n setConfig(name: string, config: PluginConfig): void\n /** Get plugin status */\n getStatus(name: string): PluginStatus | undefined\n /** Get all plugin statuses */\n getAllStatuses(): Map\n /** Resolve plugin load order based on dependencies */\n resolveLoadOrder(): string[]\n}\n\n// Plugin manager\nexport interface PluginManager {\n /** Plugin registry */\n registry: PluginRegistry\n /** Hook system */\n hooks: HookSystem\n /** Initialize plugin system */\n initialize(context: PluginContext): Promise\n /** Load plugins from configuration */\n loadPlugins(config: PluginConfig[]): Promise\n /** Install a plugin */\n install(plugin: Plugin, config?: PluginConfig): Promise\n /** Uninstall a plugin */\n uninstall(name: string): Promise\n /** Get plugin status */\n getStatus(name: string): PluginStatus\n}\n\nexport interface PluginStatus {\n name: string\n version: string\n active: boolean\n installed: boolean\n hasErrors: boolean\n errors?: string[]\n lastError?: string\n}\n\n// Service interfaces\nexport interface AuthService {\n /** Verify user permissions */\n hasPermission(userId: string, permission: string): Promise\n /** Get current user */\n getCurrentUser(context: Context): Promise\n /** Create authentication middleware */\n createMiddleware(options?: any): MiddlewareHandler\n}\n\nexport interface ContentService {\n /** Get content by ID */\n getById(id: string): Promise\n /** Create new content */\n create(data: any): Promise\n /** Update content */\n update(id: string, data: any): Promise\n /** Delete content */\n delete(id: string): Promise\n /** Search content */\n search(query: string, options?: any): Promise\n}\n\nexport interface MediaService {\n /** Upload file */\n upload(file: File, options?: any): Promise\n /** Get media by ID */\n getById(id: string): Promise\n /** Delete media */\n delete(id: string): Promise\n /** Transform image */\n transform(id: string, options: any): Promise\n}\n\n// Plugin logger\nexport interface PluginLogger {\n debug(message: string, data?: any): void\n info(message: string, data?: any): void\n warn(message: string, data?: any): void\n error(message: string, error?: Error, data?: any): void\n}\n\n// Plugin development utilities interface\n\nexport interface PluginBuilderOptions {\n name: string\n version: string\n description?: string\n author?: Plugin['author']\n dependencies?: string[]\n}\n\n// Plugin validation\nexport interface PluginValidator {\n /** Validate plugin definition */\n validate(plugin: Plugin): PluginValidationResult\n /** Validate plugin dependencies */\n validateDependencies(plugin: Plugin, registry: PluginRegistry): PluginValidationResult\n /** Validate plugin compatibility */\n validateCompatibility(plugin: Plugin, version: string): PluginValidationResult\n}\n\nexport interface PluginValidationResult {\n valid: boolean\n errors: string[]\n warnings: string[]\n}\n\n// Standard hook names\nexport const HOOKS = {\n // Application lifecycle\n APP_INIT: 'app:init',\n APP_READY: 'app:ready',\n APP_SHUTDOWN: 'app:shutdown',\n \n // Request lifecycle\n REQUEST_START: 'request:start',\n REQUEST_END: 'request:end',\n REQUEST_ERROR: 'request:error',\n \n // Authentication\n AUTH_LOGIN: 'auth:login',\n AUTH_LOGOUT: 'auth:logout',\n AUTH_REGISTER: 'auth:register',\n USER_LOGIN: 'user:login',\n USER_LOGOUT: 'user:logout',\n \n // Content lifecycle\n CONTENT_CREATE: 'content:create',\n CONTENT_UPDATE: 'content:update',\n CONTENT_DELETE: 'content:delete',\n CONTENT_PUBLISH: 'content:publish',\n CONTENT_SAVE: 'content:save',\n \n // Media lifecycle\n MEDIA_UPLOAD: 'media:upload',\n MEDIA_DELETE: 'media:delete',\n MEDIA_TRANSFORM: 'media:transform',\n \n // Plugin lifecycle\n PLUGIN_INSTALL: 'plugin:install',\n PLUGIN_UNINSTALL: 'plugin:uninstall',\n PLUGIN_ACTIVATE: 'plugin:activate',\n PLUGIN_DEACTIVATE: 'plugin:deactivate',\n \n // Admin interface\n ADMIN_MENU_RENDER: 'admin:menu:render',\n ADMIN_PAGE_RENDER: 'admin:page:render',\n \n // Database\n DB_MIGRATE: 'db:migrate',\n DB_SEED: 'db:seed',\n} as const\n\nexport type HookName = typeof HOOKS[keyof typeof HOOKS]","import { Hono } from 'hono'\nimport { requireAuth } from '../../../../middleware'\nimport { renderAdminLayoutCatalyst } from '../../../../templates/layouts/admin-layout-catalyst.template'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst adminRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\nadminRoutes.use('*', requireAuth())\n\nadminRoutes.use('*', async (c, next) => {\n const user = c.get('user')\n if (user?.role !== 'admin') {\n return c.text('Access denied', 403)\n }\n return next()\n})\n\n// Analytics Dashboard\nadminRoutes.get('/', async (c) => {\n const user = c.get('user')\n const db = c.env.DB\n\n // Query real metrics from system_logs\n let totalRequests = 0\n let uniqueIPs = 0\n let avgDuration = 0\n let errorCount = 0\n let topPages: Array<{ path: string; views: number }> = []\n let recentActivity: Array<{ url: string; method: string; status_code: number; duration: number; created_at: number }> = []\n\n try {\n const now = Math.floor(Date.now() / 1000)\n const dayAgo = now - 86400\n\n const [requestsResult, ipsResult, durationResult, errorsResult, pagesResult, activityResult] = await Promise.all([\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT COUNT(DISTINCT ip_address) as count FROM system_logs WHERE category = ? AND created_at > ?')\n .bind('api', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT AVG(duration) as avg FROM system_logs WHERE category = ? AND created_at > ? AND duration IS NOT NULL')\n .bind('api', dayAgo).first() as Promise<{ avg: number } | null>,\n db.prepare('SELECT COUNT(*) as count FROM system_logs WHERE level IN (?, ?) AND created_at > ?')\n .bind('error', 'fatal', dayAgo).first() as Promise<{ count: number } | null>,\n db.prepare('SELECT url, COUNT(*) as views FROM system_logs WHERE category = ? AND created_at > ? AND url IS NOT NULL GROUP BY url ORDER BY views DESC LIMIT 10')\n .bind('api', dayAgo).all(),\n db.prepare('SELECT url, method, status_code, duration, created_at FROM system_logs WHERE category = ? ORDER BY created_at DESC LIMIT 20')\n .bind('api').all(),\n ])\n\n totalRequests = requestsResult?.count || 0\n uniqueIPs = ipsResult?.count || 0\n avgDuration = Math.round(durationResult?.avg || 0)\n errorCount = errorsResult?.count || 0\n topPages = (pagesResult.results || []).map((r: any) => ({ path: r.url, views: r.views }))\n recentActivity = (activityResult.results || []) as any[]\n } catch {\n // Tables may not exist yet\n }\n\n const content = `\n
\n
\n

Analytics Dashboard

\n

Last 24 hours overview from system logs

\n
\n\n \n
\n
\n

Total Requests

\n

${totalRequests.toLocaleString()}

\n
\n
\n

Unique Visitors

\n

${uniqueIPs.toLocaleString()}

\n
\n
\n

Avg Response Time

\n

${avgDuration}ms

\n
\n
\n

Errors

\n

0 ? 'text-red-600 dark:text-red-400' : 'text-zinc-950 dark:text-white'}\">${errorCount.toLocaleString()}

\n
\n
\n\n \n
\n
\n

Top Pages

\n
\n
\n ${topPages.length > 0 ? topPages.map(p => `\n
\n ${escapeHtml(p.path)}\n ${p.views}\n
\n `).join('') : `\n
\n No page views recorded yet. Analytics data will appear once requests are logged.\n
\n `}\n
\n
\n\n \n
\n
\n

Recent Activity

\n
\n
\n \n \n \n \n \n \n \n \n \n \n ${recentActivity.length > 0 ? recentActivity.map(a => `\n \n \n \n \n \n \n `).join('') : `\n \n \n \n `}\n \n
PathMethodStatusDuration
${escapeHtml(a.url || '')}${a.method || ''}= 400 ? 'bg-red-50 text-red-700 dark:bg-red-900/30 dark:text-red-400' : 'bg-green-50 text-green-700 dark:bg-green-900/30 dark:text-green-400'}\">${a.status_code || ''}${a.duration || 0}ms
No activity recorded yet.
\n
\n
\n
\n `\n\n return c.html(renderAdminLayoutCatalyst({\n title: 'Analytics',\n pageTitle: 'Analytics Dashboard',\n currentPath: '/admin/analytics',\n version: c.get('appVersion'),\n user: user ? {\n name: user.email.split('@')[0] || 'Admin',\n email: user.email,\n role: user.role\n } : undefined,\n content,\n dynamicMenuItems: c.get('pluginMenuItems')\n }))\n})\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"')\n}\n\nexport { adminRoutes as analyticsAdminRoutes }\n","/**\n * Core Analytics Plugin\n * \n * Provides analytics tracking and reporting extensions\n */\n\nimport { Hono } from 'hono'\n// import { z } from 'zod'\nimport { PluginBuilder, PluginHelpers } from '../../sdk/plugin-builder'\nimport type { Plugin } from '../../types'\nimport { HOOKS } from '../../types'\nimport { analyticsAdminRoutes } from './routes/admin'\n\nexport function createAnalyticsPlugin(): Plugin {\n const builder = PluginBuilder.create({\n name: 'core-analytics',\n version: '1.0.0-beta.1',\n description: 'Core analytics tracking and reporting plugin'\n })\n\n // Add analytics metadata\n builder.metadata({\n author: {\n name: 'SonicJS Team',\n email: 'team@sonicjs.com'\n },\n license: 'MIT',\n compatibility: '^0.1.0',\n dependencies: ['core-auth'] // Requires auth for admin access\n })\n\n // Create analytics API routes\n const analyticsAPI = new Hono()\n\n // GET /analytics/stats - Get analytics overview\n analyticsAPI.get('/stats', async (c) => {\n const timeRange = c.req.query('range') || '7d' // 1d, 7d, 30d, 90d\n const _metric = c.req.query('metric') || 'all' // pageviews, sessions, users, etc.\n\n return c.json({\n message: 'Analytics stats',\n data: {\n pageviews: 12500,\n uniqueVisitors: 3200,\n sessions: 4800,\n avgSessionDuration: 245,\n bounceRate: 0.35,\n topPages: [\n { path: '/', views: 3200 },\n { path: '/about', views: 1800 },\n { path: '/contact', views: 950 }\n ],\n timeRange\n }\n })\n })\n\n // POST /analytics/track - Track analytics event\n analyticsAPI.post('/track', async (c) => {\n const event = await c.req.json()\n \n // Track event (pageview, click, form submission, etc.)\n console.info('Analytics event tracked:', event)\n \n return c.json({\n message: 'Event tracked successfully',\n eventId: `event-${Date.now()}`\n })\n })\n\n // GET /analytics/reports - Get detailed reports\n analyticsAPI.get('/reports', async (c) => {\n const reportType = c.req.query('type') || 'traffic'\n const startDate = c.req.query('start')\n const endDate = c.req.query('end')\n\n return c.json({\n message: 'Analytics report',\n data: {\n reportType,\n dateRange: { start: startDate, end: endDate },\n data: []\n }\n })\n })\n\n // GET /analytics/realtime - Get real-time analytics\n analyticsAPI.get('/realtime', async (c) => {\n return c.json({\n message: 'Real-time analytics',\n data: {\n activeUsers: 23,\n activePages: [\n { path: '/', users: 8 },\n { path: '/blog', users: 5 },\n { path: '/products', users: 4 }\n ],\n recentEvents: []\n }\n })\n })\n\n builder.addRoute('/api/analytics', analyticsAPI, {\n description: 'Analytics tracking and reporting API',\n requiresAuth: true,\n roles: ['admin', 'analytics:read'],\n priority: 3\n })\n\n // Admin dashboard routes\n builder.addRoute('/admin/analytics', analyticsAdminRoutes as any, {\n description: 'Analytics admin dashboard',\n requiresAuth: true,\n priority: 50\n })\n\n // Add analytics tracking middleware\n builder.addSingleMiddleware('analytics-tracker', async (c: any, next: any) => {\n const start = Date.now()\n const path = c.req.path\n const method = c.req.method\n const userAgent = c.req.header('user-agent')\n const referer = c.req.header('referer')\n const ip = c.req.header('CF-Connecting-IP') || c.req.header('x-forwarded-for')\n\n await next()\n\n const duration = Date.now() - start\n const status = c.res.status\n\n // Track request analytics\n const analyticsData = {\n timestamp: new Date().toISOString(),\n path,\n method,\n status,\n duration,\n userAgent,\n referer,\n ip,\n responseSize: c.res.headers.get('content-length') || 0\n }\n\n console.debug('Analytics tracking:', analyticsData)\n \n // Store analytics data (would integrate with analytics service)\n }, {\n description: 'Track page views and request analytics',\n global: true,\n priority: 99 // Run last to capture response data\n })\n\n // Add analytics service\n builder.addService('analyticsService', {\n trackEvent: async (event: any) => {\n // Event tracking implementation\n console.info('Tracking event:', event)\n return { eventId: `event-${Date.now()}` }\n },\n \n trackPageView: async (data: any) => {\n // Page view tracking implementation\n console.info('Tracking pageview:', data.path)\n return { viewId: `view-${Date.now()}` }\n },\n \n getStats: async (_timeRange: string) => {\n // Get analytics statistics\n return {\n pageviews: 12500,\n sessions: 4800,\n uniqueVisitors: 3200\n }\n },\n \n generateReport: async (type: string, options: any) => {\n // Generate analytics reports\n console.info(`Generating ${type} report with options:`, options)\n return { reportId: `report-${Date.now()}` }\n }\n }, {\n description: 'Core analytics tracking service',\n singleton: true\n })\n\n // Add analytics models\n const pageViewSchema = PluginHelpers.createSchema([\n { name: 'path', type: 'string', optional: false },\n { name: 'title', type: 'string', optional: true },\n { name: 'referrer', type: 'string', optional: true },\n { name: 'userAgent', type: 'string', optional: true },\n { name: 'ipAddress', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true },\n { name: 'duration', type: 'number', optional: true }\n ])\n\n const eventSchema = PluginHelpers.createSchema([\n { name: 'eventType', type: 'string', optional: false },\n { name: 'eventName', type: 'string', optional: false },\n { name: 'eventData', type: 'object', optional: true },\n { name: 'path', type: 'string', optional: true },\n { name: 'sessionId', type: 'string', optional: true },\n { name: 'userId', type: 'number', optional: true }\n ])\n\n const pageViewMigration = PluginHelpers.createMigration('analytics_pageviews', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'path', type: 'TEXT', nullable: false },\n { name: 'title', type: 'TEXT', nullable: true },\n { name: 'referrer', type: 'TEXT', nullable: true },\n { name: 'user_agent', type: 'TEXT', nullable: true },\n { name: 'ip_address', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true },\n { name: 'duration', type: 'INTEGER', nullable: true }\n ])\n\n const eventMigration = PluginHelpers.createMigration('analytics_events', [\n { name: 'id', type: 'INTEGER', primaryKey: true },\n { name: 'event_type', type: 'TEXT', nullable: false },\n { name: 'event_name', type: 'TEXT', nullable: false },\n { name: 'event_data', type: 'TEXT', nullable: true },\n { name: 'path', type: 'TEXT', nullable: true },\n { name: 'session_id', type: 'TEXT', nullable: true },\n { name: 'user_id', type: 'INTEGER', nullable: true }\n ])\n\n builder.addModel('PageView', {\n tableName: 'analytics_pageviews',\n schema: pageViewSchema,\n migrations: [pageViewMigration]\n })\n\n builder.addModel('AnalyticsEvent', {\n tableName: 'analytics_events',\n schema: eventSchema,\n migrations: [eventMigration]\n })\n\n // Add analytics hooks\n builder.addHook(HOOKS.REQUEST_START, async (data: any, _context: any) => {\n // Start tracking request\n data.analytics = {\n startTime: Date.now(),\n sessionId: `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n return data\n }, {\n priority: 1,\n description: 'Initialize analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.REQUEST_END, async (data: any, _context: any) => {\n // Complete request tracking\n if (data.analytics) {\n const duration = Date.now() - data.analytics.startTime\n console.debug(`Request completed in ${duration}ms`)\n }\n return data\n }, {\n priority: 1,\n description: 'Complete analytics tracking for requests'\n })\n\n builder.addHook(HOOKS.USER_LOGIN, async (data: any, context: any) => {\n // Track user login events\n await context.services?.analyticsService?.trackEvent({\n eventType: 'auth',\n eventName: 'user_login',\n userId: data.userId,\n eventData: { loginMethod: data.method }\n })\n return data\n }, {\n priority: 8,\n description: 'Track user login events'\n })\n\n builder.addHook('content:view', async (data: any, context: any) => {\n // Track content views\n await context.services?.analyticsService?.trackEvent({\n eventType: 'content',\n eventName: 'content_view',\n eventData: {\n contentId: data.id,\n contentType: data.type,\n title: data.title\n }\n })\n return data\n }, {\n priority: 8,\n description: 'Track content view events'\n })\n\n // Add admin pages\n builder.addAdminPage(\n '/analytics',\n 'Analytics Dashboard',\n 'AnalyticsDashboardView',\n {\n description: 'View analytics overview and key metrics',\n permissions: ['admin', 'analytics:read'],\n icon: 'chart-bar'\n }\n )\n\n builder.addAdminPage(\n '/analytics/reports',\n 'Analytics Reports',\n 'AnalyticsReportsView',\n {\n description: 'Generate and view detailed analytics reports',\n permissions: ['admin', 'analytics:read'],\n icon: 'document-report'\n }\n )\n\n builder.addAdminPage(\n '/analytics/realtime',\n 'Real-time Analytics',\n 'AnalyticsRealtimeView',\n {\n description: 'View real-time visitor activity',\n permissions: ['admin', 'analytics:read'],\n icon: 'lightning-bolt'\n }\n )\n\n builder.addAdminPage(\n '/analytics/settings',\n 'Analytics Settings',\n 'AnalyticsSettingsView',\n {\n description: 'Configure analytics tracking and data collection',\n permissions: ['admin', 'analytics:configure'],\n icon: 'cog'\n }\n )\n\n // Add menu items\n builder.addMenuItem('Analytics', '/admin/analytics', {\n icon: 'chart-bar',\n order: 40,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Dashboard', '/admin/analytics', {\n icon: 'chart-bar',\n parent: 'Analytics',\n order: 1,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Reports', '/admin/analytics/reports', {\n icon: 'document-report',\n parent: 'Analytics',\n order: 2,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Real-time', '/admin/analytics/realtime', {\n icon: 'lightning-bolt',\n parent: 'Analytics',\n order: 3,\n permissions: ['admin', 'analytics:read']\n })\n\n builder.addMenuItem('Settings', '/admin/analytics/settings', {\n icon: 'cog',\n parent: 'Analytics',\n order: 4,\n permissions: ['admin', 'analytics:configure']\n })\n\n // Add lifecycle hooks\n builder.lifecycle({\n install: async () => {\n console.info('Installing analytics plugin...')\n // Create analytics database tables and initial configuration\n },\n\n activate: async () => {\n console.info('Activating analytics plugin...')\n // Start analytics tracking services\n },\n\n deactivate: async () => {\n console.info('Deactivating analytics plugin...')\n // Stop analytics tracking and clean up resources\n },\n\n configure: async (config) => {\n console.info('Configuring analytics plugin...', config)\n // Update analytics configuration and settings\n }\n })\n\n return builder.build() as Plugin\n}\n\n// Export the plugin instance\nexport const analyticsPlugin = createAnalyticsPlugin()","import type { D1Database } from '@cloudflare/workers-types'\n\nexport interface TrackEventInput {\n event: string\n properties?: Record\n userId?: string\n sessionId?: string\n ipAddress?: string\n userAgent?: string\n path?: string\n category?: string\n}\n\nexport interface EventQueryFilters {\n event?: string\n category?: string\n userId?: string\n sessionId?: string\n startDate?: number\n endDate?: number\n limit?: number\n offset?: number\n}\n\nexport interface EventStats {\n totalEvents: number\n uniqueUsers: number\n uniqueSessions: number\n topEvents: Array<{ event: string; count: number }>\n}\n\nexport class EventTrackingService {\n constructor(private db: D1Database) {}\n\n async trackEvent(input: TrackEventInput): Promise {\n const id = crypto.randomUUID()\n const category = input.category || 'user-activity'\n\n await this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n ).run()\n\n return id\n }\n\n async trackBatch(events: TrackEventInput[]): Promise {\n const ids: string[] = []\n\n const stmts = events.map(input => {\n const id = crypto.randomUUID()\n ids.push(id)\n const category = input.category || 'user-activity'\n\n return this.db.prepare(`\n INSERT INTO analytics_events (id, event, category, properties, user_id, session_id, ip_address, user_agent, path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).bind(\n id,\n input.event,\n category,\n input.properties ? JSON.stringify(input.properties) : null,\n input.userId || null,\n input.sessionId || null,\n input.ipAddress || null,\n input.userAgent || null,\n input.path || null\n )\n })\n\n await this.db.batch(stmts)\n return ids\n }\n\n async queryEvents(filters: EventQueryFilters = {}): Promise<{ events: any[]; total: number }> {\n const conditions: string[] = []\n const params: any[] = []\n\n if (filters.event) {\n conditions.push('event = ?')\n params.push(filters.event)\n }\n if (filters.category) {\n conditions.push('category = ?')\n params.push(filters.category)\n }\n if (filters.userId) {\n conditions.push('user_id = ?')\n params.push(filters.userId)\n }\n if (filters.sessionId) {\n conditions.push('session_id = ?')\n params.push(filters.sessionId)\n }\n if (filters.startDate) {\n conditions.push('created_at >= ?')\n params.push(filters.startDate)\n }\n if (filters.endDate) {\n conditions.push('created_at <= ?')\n params.push(filters.endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n const limit = filters.limit || 50\n const offset = filters.offset || 0\n\n const [countResult, eventsResult] = await Promise.all([\n this.db.prepare(`SELECT COUNT(*) as total FROM analytics_events ${where}`).bind(...params).first() as Promise<{ total: number } | null>,\n this.db.prepare(`SELECT * FROM analytics_events ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`).bind(...params, limit, offset).all()\n ])\n\n const events = (eventsResult.results || []).map((e: any) => ({\n ...e,\n properties: e.properties ? JSON.parse(e.properties) : null\n }))\n\n return { events, total: countResult?.total || 0 }\n }\n\n async getStats(startDate?: number, endDate?: number): Promise {\n const conditions: string[] = []\n const params: any[] = []\n\n if (startDate) {\n conditions.push('created_at >= ?')\n params.push(startDate)\n }\n if (endDate) {\n conditions.push('created_at <= ?')\n params.push(endDate)\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''\n\n const [totals, topEvents] = await Promise.all([\n this.db.prepare(`\n SELECT\n COUNT(*) as total_events,\n COUNT(DISTINCT user_id) as unique_users,\n COUNT(DISTINCT session_id) as unique_sessions\n FROM analytics_events ${where}\n `).bind(...params).first() as Promise<{ total_events: number; unique_users: number; unique_sessions: number } | null>,\n this.db.prepare(`\n SELECT event, COUNT(*) as count\n FROM analytics_events ${where}\n GROUP BY event ORDER BY count DESC LIMIT 20\n `).bind(...params).all()\n ])\n\n return {\n totalEvents: totals?.total_events || 0,\n uniqueUsers: totals?.unique_users || 0,\n uniqueSessions: totals?.unique_sessions || 0,\n topEvents: (topEvents.results || []).map((r: any) => ({ event: r.event, count: r.count }))\n }\n }\n}\n","import { Hono } from 'hono'\nimport { EventTrackingService } from '../services/event-tracking-service'\nimport type { Bindings, Variables } from '../../../../app'\n\nconst apiRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n// POST /api/events - Track a single event or batch of events\napiRoutes.post('/', async (c) => {\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const ip = c.req.header('cf-connecting-ip')\n || c.req.header('x-forwarded-for')?.split(',')[0]?.trim()\n || 'unknown'\n const userAgent = c.req.header('user-agent') || ''\n const user = c.get('user')\n\n let body: any\n try {\n body = await c.req.json()\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400)\n }\n\n // Batch support: accept an array of events\n if (Array.isArray(body)) {\n if (body.length > 100) {\n return c.json({ error: 'Batch size limit is 100 events' }, 400)\n }\n\n const events = body.map(e => ({\n event: e.event,\n category: e.category || 'user-activity',\n properties: e.properties,\n userId: user?.userId || e.userId,\n sessionId: e.sessionId,\n ipAddress: ip,\n userAgent,\n path: e.path\n }))\n\n // Validate all events have an event name\n const invalid = events.find(e => !e.event || typeof e.event !== 'string')\n if (invalid) {\n return c.json({ error: 'Each event must have an \"event\" string field' }, 400)\n }\n\n const ids = await service.trackBatch(events)\n return c.json({ success: true, eventIds: ids, count: ids.length })\n }\n\n // Single event\n if (!body.event || typeof body.event !== 'string') {\n return c.json({ error: '\"event\" field is required and must be a string' }, 400)\n }\n\n const eventId = await service.trackEvent({\n event: body.event,\n category: body.category || 'user-activity',\n properties: body.properties,\n userId: user?.userId || body.userId,\n sessionId: body.sessionId,\n ipAddress: ip,\n userAgent,\n path: body.path\n })\n\n return c.json({ success: true, eventId })\n})\n\n// GET /api/events - Query events (admin only)\napiRoutes.get('/', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const filters = {\n event: c.req.query('event') || undefined,\n category: c.req.query('category') || undefined,\n userId: c.req.query('userId') || undefined,\n sessionId: c.req.query('sessionId') || undefined,\n startDate: c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined,\n endDate: c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined,\n limit: c.req.query('limit') ? parseInt(c.req.query('limit')!) : 50,\n offset: c.req.query('offset') ? parseInt(c.req.query('offset')!) : 0\n }\n\n const result = await service.queryEvents(filters)\n return c.json(result)\n})\n\n// GET /api/events/stats - Aggregated event stats (admin only)\napiRoutes.get('/stats', async (c) => {\n const user = c.get('user')\n if (!user || user.role !== 'admin') {\n return c.json({ error: 'Admin access required' }, 403)\n }\n\n const db = c.env.DB\n const service = new EventTrackingService(db)\n\n const startDate = c.req.query('startDate') ? parseInt(c.req.query('startDate')!) : undefined\n const endDate = c.req.query('endDate') ? parseInt(c.req.query('endDate')!) : undefined\n\n const stats = await service.getStats(startDate, endDate)\n return c.json(stats)\n})\n\nexport { apiRoutes as eventsApiRoutes }\n","/**\n * Cache Configuration\n *\n * Defines cache configurations for different entity types\n */\n\nexport interface CacheConfig {\n ttl: number // Time-to-live in seconds\n kvEnabled: boolean // Use KV cache tier\n memoryEnabled: boolean // Use in-memory cache tier\n namespace: string // Cache namespace/prefix\n invalidateOn: string[] // Events that invalidate this cache\n version?: string // Cache version for busting\n}\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\n/**\n * Default cache configurations by entity type\n */\nexport const CACHE_CONFIGS: Record = {\n // Content (high read, low write)\n content: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'content',\n invalidateOn: ['content.update', 'content.delete', 'content.publish'],\n version: 'v1'\n },\n\n // User data (medium read, medium write)\n user: {\n ttl: 900, // 15 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'user',\n invalidateOn: ['user.update', 'user.delete', 'auth.login'],\n version: 'v1'\n },\n\n // Configuration (high read, very low write)\n config: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'config',\n invalidateOn: ['config.update', 'plugin.activate', 'plugin.deactivate'],\n version: 'v1'\n },\n\n // Media metadata (high read, low write)\n media: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'media',\n invalidateOn: ['media.upload', 'media.delete', 'media.update'],\n version: 'v1'\n },\n\n // API responses (very high read, low write)\n api: {\n ttl: 300, // 5 minutes\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'api',\n invalidateOn: ['content.update', 'content.publish'],\n version: 'v1'\n },\n\n // Session data (very high read, medium write)\n session: {\n ttl: 1800, // 30 minutes\n kvEnabled: false, // Only in-memory for sessions\n memoryEnabled: true,\n namespace: 'session',\n invalidateOn: ['auth.logout'],\n version: 'v1'\n },\n\n // Plugin data\n plugin: {\n ttl: 3600, // 1 hour\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'plugin',\n invalidateOn: ['plugin.activate', 'plugin.deactivate', 'plugin.update'],\n version: 'v1'\n },\n\n // Collections/schema\n collection: {\n ttl: 7200, // 2 hours\n kvEnabled: true,\n memoryEnabled: true,\n namespace: 'collection',\n invalidateOn: ['collection.update', 'collection.delete'],\n version: 'v1'\n }\n}\n\n/**\n * Get cache configuration for a specific namespace\n */\nexport function getCacheConfig(namespace: string): CacheConfig {\n return CACHE_CONFIGS[namespace] || {\n ttl: 3600,\n kvEnabled: true,\n memoryEnabled: true,\n namespace,\n invalidateOn: [],\n version: 'v1'\n }\n}\n\n/**\n * Generate a cache key with consistent format\n * Format: {namespace}:{type}:{identifier}:{version}\n */\nexport function generateCacheKey(\n namespace: string,\n type: string,\n identifier: string,\n version?: string\n): string {\n const v = version || getCacheConfig(namespace).version || 'v1'\n return `${namespace}:${type}:${identifier}:${v}`\n}\n\n/**\n * Parse a cache key back into its components\n */\nexport function parseCacheKey(key: string): {\n namespace: string\n type: string\n identifier: string\n version: string\n} | null {\n const parts = key.split(':')\n if (parts.length !== 4) {\n return null\n }\n\n return {\n namespace: parts[0] || '',\n type: parts[1] || '',\n identifier: parts[2] || '',\n version: parts[3] || ''\n }\n}\n\n/**\n * Generate a hash for complex query parameters\n */\nexport function hashQueryParams(params: Record): string {\n // Sort keys for consistent hashing\n const sortedKeys = Object.keys(params).sort()\n const normalized = sortedKeys.map(key => `${key}=${params[key]}`).join('&')\n\n // Simple hash function (for better performance, consider using crypto)\n let hash = 0\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Create a pattern for cache invalidation\n */\nexport function createCachePattern(\n namespace: string,\n type?: string,\n identifier?: string\n): string {\n let pattern = namespace\n if (type) pattern += `:${type}`\n if (identifier) pattern += `:${identifier}`\n return pattern + ':*'\n}\n","/**\n * Cache Service\n *\n * Three-tiered caching implementation:\n * 1. In-Memory Cache (fastest, region-specific)\n * 2. Cloudflare KV Cache (fast, global)\n * 3. Database (fallback, source of truth)\n */\n\nimport { CacheConfig, CacheStats, generateCacheKey } from './cache-config.js'\n\n/**\n * Cache entry with metadata\n */\ninterface CacheEntry {\n data: T\n timestamp: number\n expiresAt: number\n version: string\n}\n\n/**\n * In-memory cache store\n */\nclass MemoryCache {\n private cache: Map> = new Map()\n private maxSize: number = 50 * 1024 * 1024 // 50MB\n private currentSize: number = 0\n\n /**\n * Get item from memory cache\n */\n get(key: string): T | null {\n const entry = this.cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n this.delete(key)\n return null\n }\n\n return entry.data as T\n }\n\n /**\n * Set item in memory cache\n */\n set(key: string, value: T, ttl: number, version: string = 'v1'): void {\n const now = Date.now()\n const entry: CacheEntry = {\n data: value,\n timestamp: now,\n expiresAt: now + (ttl * 1000),\n version\n }\n\n // Estimate size (rough approximation)\n const entrySize = JSON.stringify(entry).length * 2 // UTF-16\n\n // Check if we need to evict\n if (this.currentSize + entrySize > this.maxSize) {\n this.evictLRU(entrySize)\n }\n\n // Delete old entry if exists\n if (this.cache.has(key)) {\n this.delete(key)\n }\n\n this.cache.set(key, entry)\n this.currentSize += entrySize\n }\n\n /**\n * Delete item from memory cache\n */\n delete(key: string): boolean {\n const entry = this.cache.get(key)\n if (entry) {\n const entrySize = JSON.stringify(entry).length * 2\n this.currentSize -= entrySize\n return this.cache.delete(key)\n }\n return false\n }\n\n /**\n * Clear all items from memory cache\n */\n clear(): void {\n this.cache.clear()\n this.currentSize = 0\n }\n\n /**\n * Get cache statistics\n */\n getStats(): { size: number; count: number } {\n return {\n size: this.currentSize,\n count: this.cache.size\n }\n }\n\n /**\n * Evict least recently used items to make space\n */\n private evictLRU(neededSpace: number): void {\n // Sort by timestamp (oldest first)\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp\n )\n\n let freedSpace = 0\n for (const [key, entry] of entries) {\n if (freedSpace >= neededSpace) break\n\n const entrySize = JSON.stringify(entry).length * 2\n this.delete(key)\n freedSpace += entrySize\n }\n }\n\n /**\n * Delete items matching a pattern\n */\n invalidatePattern(pattern: string): number {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n let count = 0\n for (const key of this.cache.keys()) {\n if (regex.test(key)) {\n this.delete(key)\n count++\n }\n }\n\n return count\n }\n}\n\n/**\n * Cache result with source information\n */\nexport interface CacheResult {\n data: T | null\n source: 'memory' | 'kv' | 'miss'\n hit: boolean\n timestamp?: number\n ttl?: number\n}\n\n/**\n * Main cache service with multi-tier support\n */\nexport class CacheService {\n private memoryCache: MemoryCache\n private config: CacheConfig\n private stats: CacheStats\n private kvNamespace?: KVNamespace\n\n constructor(config: CacheConfig, kvNamespace?: KVNamespace) {\n this.memoryCache = new MemoryCache()\n this.config = config\n this.kvNamespace = kvNamespace\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Get value from cache (tries memory first, then KV)\n */\n async get(key: string): Promise {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n return memoryValue\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return kvValue as T\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return null\n }\n\n /**\n * Get value from cache with source information\n */\n async getWithSource(key: string): Promise> {\n this.stats.totalRequests++\n\n // Try memory cache first (Tier 1)\n if (this.config.memoryEnabled) {\n const memoryValue = this.memoryCache.get(key)\n if (memoryValue !== null) {\n this.stats.memoryHits++\n this.updateHitRate()\n\n const entry = await this.getEntry(key)\n return {\n data: memoryValue,\n source: 'memory',\n hit: true,\n timestamp: entry?.timestamp,\n ttl: entry?.ttl\n }\n }\n this.stats.memoryMisses++\n }\n\n // Try KV cache (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const kvValue = await this.kvNamespace.get(key, 'json')\n if (kvValue !== null) {\n this.stats.kvHits++\n\n // Populate memory cache for faster subsequent access\n if (this.config.memoryEnabled) {\n this.memoryCache.set(key, kvValue as T, this.config.ttl, this.config.version)\n }\n\n this.updateHitRate()\n return {\n data: kvValue as T,\n source: 'kv',\n hit: true\n }\n }\n this.stats.kvMisses++\n } catch (error) {\n console.error('KV cache read error:', error)\n this.stats.kvMisses++\n }\n }\n\n this.updateHitRate()\n return {\n data: null,\n source: 'miss',\n hit: false\n }\n }\n\n /**\n * Set value in cache (stores in both memory and KV)\n */\n async set(\n key: string,\n value: T,\n customConfig?: Partial\n ): Promise {\n const config = { ...this.config, ...customConfig }\n\n // Store in memory cache (Tier 1)\n if (config.memoryEnabled) {\n this.memoryCache.set(key, value, config.ttl, config.version)\n }\n\n // Store in KV cache (Tier 2)\n if (config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.put(key, JSON.stringify(value), {\n expirationTtl: config.ttl\n })\n } catch (error) {\n console.error('KV cache write error:', error)\n }\n }\n }\n\n /**\n * Delete value from cache (removes from both memory and KV)\n */\n async delete(key: string): Promise {\n // Delete from memory (Tier 1)\n if (this.config.memoryEnabled) {\n this.memoryCache.delete(key)\n }\n\n // Delete from KV (Tier 2)\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n await this.kvNamespace.delete(key)\n } catch (error) {\n console.error('KV cache delete error:', error)\n }\n }\n }\n\n /**\n * Clear all cache entries for this namespace\n */\n async clear(): Promise {\n if (this.config.memoryEnabled) {\n this.memoryCache.clear()\n }\n\n // Reset stats\n this.stats = {\n memoryHits: 0,\n memoryMisses: 0,\n kvHits: 0,\n kvMisses: 0,\n dbHits: 0,\n totalRequests: 0,\n hitRate: 0,\n memorySize: 0,\n entryCount: 0\n }\n }\n\n /**\n * Invalidate cache entries matching a pattern\n */\n async invalidate(pattern: string): Promise {\n let count = 0\n\n // Invalidate from memory (Tier 1)\n if (this.config.memoryEnabled) {\n count += this.memoryCache.invalidatePattern(pattern)\n }\n\n // Invalidate from KV (Tier 2)\n // Note: KV doesn't support pattern matching, so we need to list all keys\n // This is expensive and should be used sparingly\n if (this.config.kvEnabled && this.kvNamespace) {\n try {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n\n // List all keys with the namespace prefix\n const prefix = this.config.namespace + ':'\n const list = await this.kvNamespace.list({ prefix })\n\n for (const key of list.keys) {\n if (regex.test(key.name)) {\n await this.kvNamespace.delete(key.name)\n count++\n }\n }\n } catch (error) {\n console.error('KV cache invalidation error:', error)\n }\n }\n\n return count\n }\n\n /**\n * Invalidate cache entries matching a pattern (alias for invalidate)\n */\n async invalidatePattern(pattern: string): Promise {\n return this.invalidate(pattern)\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const memStats = this.memoryCache.getStats()\n\n return {\n ...this.stats,\n memorySize: memStats.size,\n entryCount: memStats.count\n }\n }\n\n /**\n * Update hit rate calculation\n */\n private updateHitRate(): void {\n const totalHits = this.stats.memoryHits + this.stats.kvHits + this.stats.dbHits\n this.stats.hitRate = this.stats.totalRequests > 0\n ? (totalHits / this.stats.totalRequests) * 100\n : 0\n }\n\n /**\n * Generate a cache key using the configured namespace\n */\n generateKey(type: string, identifier: string): string {\n return generateCacheKey(\n this.config.namespace,\n type,\n identifier,\n this.config.version\n )\n }\n\n /**\n * Warm cache with multiple entries\n */\n async warmCache(entries: Array<{ key: string; value: T }>): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value)\n }\n }\n\n /**\n * Check if a key exists in cache\n */\n async has(key: string): Promise {\n const value = await this.get(key)\n return value !== null\n }\n\n /**\n * Get multiple values at once\n */\n async getMany(keys: string[]): Promise> {\n const results = new Map()\n\n for (const key of keys) {\n const value = await this.get(key)\n if (value !== null) {\n results.set(key, value)\n }\n }\n\n return results\n }\n\n /**\n * Set multiple values at once\n */\n async setMany(\n entries: Array<{ key: string; value: T }>,\n customConfig?: Partial\n ): Promise {\n for (const entry of entries) {\n await this.set(entry.key, entry.value, customConfig)\n }\n }\n\n /**\n * Delete multiple keys at once\n */\n async deleteMany(keys: string[]): Promise {\n for (const key of keys) {\n await this.delete(key)\n }\n }\n\n /**\n * Get or set pattern - fetch from cache or compute if not found\n */\n async getOrSet(\n key: string,\n fetcher: () => Promise,\n customConfig?: Partial\n ): Promise {\n // Try to get from cache\n const cached = await this.get(key)\n if (cached !== null) {\n return cached\n }\n\n // Fetch from source\n const value = await fetcher()\n\n // Store in cache\n await this.set(key, value, customConfig)\n\n return value\n }\n\n /**\n * List all cache keys with metadata\n */\n async listKeys(): Promise> {\n const keys: Array<{ key: string; size: number; expiresAt: number; age: number }> = []\n\n // Get keys from memory cache\n if (this.config.memoryEnabled) {\n const cache = (this.memoryCache as any).cache as Map>\n for (const [key, entry] of cache.entries()) {\n const size = JSON.stringify(entry).length * 2\n const age = Date.now() - entry.timestamp\n keys.push({\n key,\n size,\n expiresAt: entry.expiresAt,\n age\n })\n }\n }\n\n // Sort by age (newest first)\n return keys.sort((a, b) => a.age - b.age)\n }\n\n /**\n * Get cache entry with full metadata\n */\n async getEntry(key: string): Promise<{\n data: T\n timestamp: number\n expiresAt: number\n ttl: number\n size: number\n } | null> {\n if (!this.config.memoryEnabled) {\n return null\n }\n\n const cache = (this.memoryCache as any).cache as Map>\n const entry = cache.get(key)\n\n if (!entry) {\n return null\n }\n\n // Check expiration\n if (Date.now() > entry.expiresAt) {\n await this.delete(key)\n return null\n }\n\n const size = JSON.stringify(entry).length * 2\n const ttl = Math.max(0, entry.expiresAt - Date.now()) / 1000\n\n return {\n data: entry.data as T,\n timestamp: entry.timestamp,\n expiresAt: entry.expiresAt,\n ttl,\n size\n }\n }\n}\n\n/**\n * Create a cache service instance with configuration\n */\nexport function createCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n return new CacheService(config, kvNamespace)\n}\n\n/**\n * Global cache instances by namespace (singleton pattern)\n */\nconst cacheInstances = new Map()\nlet globalKVNamespace: KVNamespace | undefined\n\n/**\n * Set global KV namespace for all cache instances\n */\nexport function setGlobalKVNamespace(kvNamespace: KVNamespace): void {\n globalKVNamespace = kvNamespace\n}\n\n/**\n * Get or create a cache service for a namespace\n */\nexport function getCacheService(config: CacheConfig, kvNamespace?: KVNamespace): CacheService {\n const key = config.namespace\n\n if (!cacheInstances.has(key)) {\n // Use provided KV namespace or global one\n const kv = kvNamespace || globalKVNamespace\n cacheInstances.set(key, new CacheService(config, kv))\n }\n\n return cacheInstances.get(key)!\n}\n\n/**\n * Clear all cache instances\n */\nexport async function clearAllCaches(): Promise {\n for (const cache of cacheInstances.values()) {\n await cache.clear()\n }\n}\n\n/**\n * Get stats from all cache instances\n */\nexport function getAllCacheStats(): Record {\n const stats: Record = {}\n\n for (const [namespace, cache] of cacheInstances.entries()) {\n stats[namespace] = cache.getStats()\n }\n\n return stats\n}\n","/**\n * Event Bus for Cache Invalidation\n *\n * Provides a centralized event system for triggering cache invalidation\n * based on application events.\n */\n\nexport type EventHandler = (data?: any) => Promise | void\n\n// interface EventSubscription {\n// event: string\n// handler: EventHandler\n// }\n\nclass EventBus {\n private subscriptions: Map = new Map()\n private eventLog: Array<{ event: string; timestamp: number; data?: any }> = []\n private maxLogSize: number = 100\n\n /**\n * Subscribe to an event\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.subscriptions.has(event)) {\n this.subscriptions.set(event, [])\n }\n\n this.subscriptions.get(event)!.push(handler)\n\n // Return unsubscribe function\n return () => {\n const handlers = this.subscriptions.get(event)\n if (handlers) {\n const index = handlers.indexOf(handler)\n if (index > -1) {\n handlers.splice(index, 1)\n }\n }\n }\n }\n\n /**\n * Emit an event to all subscribers\n */\n async emit(event: string, data?: any): Promise {\n // Log the event\n this.logEvent(event, data)\n\n const handlers = this.subscriptions.get(event) || []\n\n // Execute all handlers\n await Promise.all(\n handlers.map(async (handler) => {\n try {\n await handler(data)\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error)\n }\n })\n )\n\n // Also emit to wildcard subscribers\n const wildcardHandlers = this.subscriptions.get('*') || []\n await Promise.all(\n wildcardHandlers.map(async (handler) => {\n try {\n await handler({ event, data })\n } catch (error) {\n console.error(`Error in wildcard event handler for ${event}:`, error)\n }\n })\n )\n }\n\n /**\n * Remove all subscribers for an event\n */\n off(event: string): void {\n this.subscriptions.delete(event)\n }\n\n /**\n * Get all registered events\n */\n getEvents(): string[] {\n return Array.from(this.subscriptions.keys())\n }\n\n /**\n * Get subscriber count for an event\n */\n getSubscriberCount(event: string): number {\n return this.subscriptions.get(event)?.length || 0\n }\n\n /**\n * Log an event for debugging\n */\n private logEvent(event: string, data?: any): void {\n this.eventLog.push({\n event,\n timestamp: Date.now(),\n data\n })\n\n // Keep log size manageable\n if (this.eventLog.length > this.maxLogSize) {\n this.eventLog.shift()\n }\n }\n\n /**\n * Get recent event log\n */\n getEventLog(limit: number = 50): Array<{ event: string; timestamp: number; data?: any }> {\n return this.eventLog.slice(-limit)\n }\n\n /**\n * Clear event log\n */\n clearEventLog(): void {\n this.eventLog = []\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n totalEvents: number\n totalSubscriptions: number\n eventCounts: Record\n } {\n const eventCounts: Record = {}\n\n for (const log of this.eventLog) {\n eventCounts[log.event] = (eventCounts[log.event] || 0) + 1\n }\n\n return {\n totalEvents: this.eventLog.length,\n totalSubscriptions: this.subscriptions.size,\n eventCounts\n }\n }\n}\n\n// Global event bus instance\nlet globalEventBus: EventBus | null = null\n\n/**\n * Get or create the global event bus\n */\nexport function getEventBus(): EventBus {\n if (!globalEventBus) {\n globalEventBus = new EventBus()\n }\n return globalEventBus\n}\n\n/**\n * Convenience function to emit an event\n */\nexport async function emitEvent(event: string, data?: any): Promise {\n const bus = getEventBus()\n await bus.emit(event, data)\n}\n\n/**\n * Convenience function to subscribe to an event\n */\nexport function onEvent(event: string, handler: EventHandler): () => void {\n const bus = getEventBus()\n return bus.on(event, handler)\n}\n","/**\n * Cache Invalidation Service\n *\n * Automatically invalidates cache entries based on application events\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\nimport { getEventBus, onEvent } from './event-bus.js'\n\n/**\n * Setup automatic cache invalidation based on events\n */\nexport function setupCacheInvalidation(): void {\n const _eventBus = getEventBus()\n\n // Content cache invalidation\n setupContentInvalidation()\n\n // User cache invalidation\n setupUserInvalidation()\n\n // Config cache invalidation\n setupConfigInvalidation()\n\n // Media cache invalidation\n setupMediaInvalidation()\n\n // API cache invalidation\n setupAPIInvalidation()\n\n // Collection cache invalidation\n setupCollectionInvalidation()\n\n console.log('Cache invalidation listeners registered')\n}\n\n/**\n * Content cache invalidation\n */\nfunction setupContentInvalidation(): void {\n const config = CACHE_CONFIGS.content\n if (!config) return\n const contentCache = getCacheService(config)\n\n // Invalidate on content updates\n onEvent('content.create', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.create')\n })\n\n onEvent('content.update', async (data) => {\n if (data?.id) {\n // Invalidate specific content item\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n // Invalidate all content lists\n await contentCache.invalidate('content:list:*')\n console.log('Cache invalidated: content.update', data?.id)\n })\n\n onEvent('content.delete', async (data) => {\n if (data?.id) {\n await contentCache.delete(contentCache.generateKey('item', data.id))\n }\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.delete', data?.id)\n })\n\n onEvent('content.publish', async (_data) => {\n await contentCache.invalidate('content:*')\n console.log('Cache invalidated: content.publish')\n })\n}\n\n/**\n * User cache invalidation\n */\nfunction setupUserInvalidation(): void {\n const config = CACHE_CONFIGS.user\n if (!config) return\n const userCache = getCacheService(config)\n\n onEvent('user.update', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.update', data?.id)\n })\n\n onEvent('user.delete', async (data) => {\n if (data?.id) {\n await userCache.delete(userCache.generateKey('id', data.id))\n }\n if (data?.email) {\n await userCache.delete(userCache.generateKey('email', data.email))\n }\n console.log('Cache invalidated: user.delete', data?.id)\n })\n\n onEvent('auth.login', async (data) => {\n if (data?.userId) {\n await userCache.delete(userCache.generateKey('id', data.userId))\n }\n console.log('Cache invalidated: auth.login', data?.userId)\n })\n\n onEvent('auth.logout', async (data) => {\n // Clear session cache\n const sessionConfig = CACHE_CONFIGS.session\n if (sessionConfig) {\n const sessionCache = getCacheService(sessionConfig)\n if (data?.sessionId) {\n await sessionCache.delete(sessionCache.generateKey('session', data.sessionId))\n }\n }\n console.log('Cache invalidated: auth.logout')\n })\n}\n\n/**\n * Config cache invalidation\n */\nfunction setupConfigInvalidation(): void {\n const configConfig = CACHE_CONFIGS.config\n if (!configConfig) return\n const configCache = getCacheService(configConfig)\n\n onEvent('config.update', async (_data) => {\n await configCache.invalidate('config:*')\n console.log('Cache invalidated: config.update')\n })\n\n onEvent('plugin.activate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.activate', data?.pluginId)\n })\n\n onEvent('plugin.deactivate', async (data) => {\n await configCache.invalidate('config:*')\n const pluginConfig = CACHE_CONFIGS.plugin\n if (pluginConfig) {\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n }\n console.log('Cache invalidated: plugin.deactivate', data?.pluginId)\n })\n\n onEvent('plugin.update', async (data) => {\n const pluginConfig = CACHE_CONFIGS.plugin\n if (!pluginConfig) return\n const pluginCache = getCacheService(pluginConfig)\n await pluginCache.invalidate('plugin:*')\n console.log('Cache invalidated: plugin.update', data?.pluginId)\n })\n}\n\n/**\n * Media cache invalidation\n */\nfunction setupMediaInvalidation(): void {\n const config = CACHE_CONFIGS.media\n if (!config) return\n const mediaCache = getCacheService(config)\n\n onEvent('media.upload', async (_data) => {\n await mediaCache.invalidate('media:*')\n console.log('Cache invalidated: media.upload')\n })\n\n onEvent('media.delete', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.delete', data?.id)\n })\n\n onEvent('media.update', async (data) => {\n if (data?.id) {\n await mediaCache.delete(mediaCache.generateKey('item', data.id))\n }\n await mediaCache.invalidate('media:list:*')\n console.log('Cache invalidated: media.update', data?.id)\n })\n}\n\n/**\n * API cache invalidation (depends on content changes)\n */\nfunction setupAPIInvalidation(): void {\n const config = CACHE_CONFIGS.api\n if (!config) return\n const apiCache = getCacheService(config)\n\n onEvent('content.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.update)')\n })\n\n onEvent('content.publish', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.publish)')\n })\n\n onEvent('content.create', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.create)')\n })\n\n onEvent('content.delete', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (content.delete)')\n })\n\n onEvent('collection.update', async (_data) => {\n await apiCache.invalidate('api:*')\n console.log('Cache invalidated: api (collection.update)')\n })\n}\n\n/**\n * Collection cache invalidation\n */\nfunction setupCollectionInvalidation(): void {\n const config = CACHE_CONFIGS.collection\n if (!config) return\n const collectionCache = getCacheService(config)\n\n onEvent('collection.create', async (_data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.create')\n })\n\n onEvent('collection.update', async (data) => {\n if (data?.id) {\n await collectionCache.delete(collectionCache.generateKey('item', data.id))\n }\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.update', data?.id)\n })\n\n onEvent('collection.delete', async (data) => {\n await collectionCache.invalidate('collection:*')\n console.log('Cache invalidated: collection.delete', data?.id)\n })\n}\n\n/**\n * Get invalidation statistics\n */\nexport function getCacheInvalidationStats() {\n const eventBus = getEventBus()\n return eventBus.getStats()\n}\n\n/**\n * Get recent invalidation events\n */\nexport function getRecentInvalidations(limit: number = 50) {\n const eventBus = getEventBus()\n return eventBus.getEventLog(limit)\n}\n","/**\n * Cache Warming Utilities\n *\n * Utilities for preloading and warming cache entries\n */\n\nimport { getCacheService } from './cache.js'\nimport { CACHE_CONFIGS } from './cache-config.js'\n\n/**\n * Warm cache with common queries\n */\nexport async function warmCommonCaches(db: D1Database): Promise<{\n warmed: number\n errors: number\n details: Array<{ namespace: string; count: number }>\n}> {\n let totalWarmed = 0\n let totalErrors = 0\n const details: Array<{ namespace: string; count: number }> = []\n\n try {\n // Warm collection cache\n const collectionCount = await warmCollections(db)\n totalWarmed += collectionCount\n details.push({ namespace: 'collection', count: collectionCount })\n\n // Warm content cache (most recent items)\n const contentCount = await warmRecentContent(db)\n totalWarmed += contentCount\n details.push({ namespace: 'content', count: contentCount })\n\n // Warm media cache (most recent items)\n const mediaCount = await warmRecentMedia(db)\n totalWarmed += mediaCount\n details.push({ namespace: 'media', count: mediaCount })\n\n } catch (error) {\n console.error('Error warming caches:', error)\n totalErrors++\n }\n\n return {\n warmed: totalWarmed,\n errors: totalErrors,\n details\n }\n}\n\n/**\n * Warm collections cache\n */\nasync function warmCollections(db: D1Database): Promise {\n const config = CACHE_CONFIGS.collection\n if (!config) return 0\n const collectionCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare('SELECT * FROM collections WHERE is_active = 1')\n const { results } = await stmt.all()\n\n for (const collection of results as any[]) {\n const key = collectionCache.generateKey('item', collection.id)\n await collectionCache.set(key, collection)\n count++\n }\n\n // Also cache the full list\n const listKey = collectionCache.generateKey('list', 'all')\n await collectionCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming collections cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent content cache\n */\nasync function warmRecentContent(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.content\n if (!config) return 0\n const contentCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM content ORDER BY created_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const content of results as any[]) {\n const key = contentCache.generateKey('item', content.id)\n await contentCache.set(key, content)\n count++\n }\n\n // Cache the list\n const listKey = contentCache.generateKey('list', 'recent')\n await contentCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming content cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm recent media cache\n */\nasync function warmRecentMedia(db: D1Database, limit: number = 50): Promise {\n const config = CACHE_CONFIGS.media\n if (!config) return 0\n const mediaCache = getCacheService(config)\n let count = 0\n\n try {\n const stmt = db.prepare(`SELECT * FROM media WHERE deleted_at IS NULL ORDER BY uploaded_at DESC LIMIT ${limit}`)\n const { results } = await stmt.all()\n\n for (const media of results as any[]) {\n const key = mediaCache.generateKey('item', media.id)\n await mediaCache.set(key, media)\n count++\n }\n\n // Cache the list\n const listKey = mediaCache.generateKey('list', 'recent')\n await mediaCache.set(listKey, results)\n count++\n\n } catch (error) {\n console.error('Error warming media cache:', error)\n }\n\n return count\n}\n\n/**\n * Warm specific namespace with custom data\n */\nexport async function warmNamespace(\n namespace: string,\n entries: Array<{ key: string; value: any }>\n): Promise {\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n throw new Error(`Unknown namespace: ${namespace}`)\n }\n\n const cache = getCacheService(config)\n await cache.setMany(entries)\n\n return entries.length\n}\n\n/**\n * Preload cache on application startup\n */\nexport async function preloadCache(db: D1Database): Promise {\n console.log('🔥 Preloading cache...')\n\n const result = await warmCommonCaches(db)\n\n console.log(`✅ Cache preloaded: ${result.warmed} entries across ${result.details.length} namespaces`)\n result.details.forEach(detail => {\n console.log(` - ${detail.namespace}: ${detail.count} entries`)\n })\n\n if (result.errors > 0) {\n console.warn(`⚠️ ${result.errors} errors during cache preloading`)\n }\n}\n\n/**\n * Schedule periodic cache warming\n */\nexport function schedulePeriodicWarming(\n db: D1Database,\n intervalMs: number = 300000 // 5 minutes default\n): NodeJS.Timeout {\n console.log(`⏰ Scheduling periodic cache warming every ${intervalMs / 1000}s`)\n\n return setInterval(async () => {\n try {\n console.log('🔄 Running periodic cache warming...')\n await warmCommonCaches(db)\n } catch (error) {\n console.error('Error during periodic cache warming:', error)\n }\n }, intervalMs)\n}\n","/**\n * Admin Cache Dashboard Template\n *\n * Moved from @sonicjs-cms/templates to avoid circular dependency\n * during build (templates imports from core, core can't import from templates)\n */\n\nimport { renderAdminLayoutCatalyst, AdminLayoutCatalystData } from '../layouts/admin-layout-catalyst.template'\nimport { renderConfirmationDialog, getConfirmationDialogScript } from '../components/confirmation-dialog.template'\n\nexport interface CacheStats {\n memoryHits: number\n memoryMisses: number\n kvHits: number\n kvMisses: number\n dbHits: number\n totalRequests: number\n hitRate: number\n memorySize: number\n entryCount: number\n}\n\nexport interface CacheDashboardData {\n stats: Record\n totals: {\n hits: number\n misses: number\n requests: number\n hitRate: string\n memorySize: number\n entryCount: number\n }\n namespaces: string[]\n user?: {\n name: string\n email: string\n role: string\n }\n version?: string\n}\n\nexport function renderCacheDashboard(data: CacheDashboardData): string {\n const pageContent = `\n
\n \n
\n
\n

Cache System

\n

\n Monitor and manage cache performance across all namespaces\n

\n
\n
\n \n \n \n \n Refresh\n \n \n \n \n \n Clear All\n \n
\n
\n\n \n
\n ${renderStatCard('Total Requests', data.totals.requests.toLocaleString(), 'lime', `\n \n \n \n `)}\n\n ${renderStatCard('Hit Rate', data.totals.hitRate + '%', 'blue', `\n \n \n \n `, parseFloat(data.totals.hitRate) > 70 ? 'lime' : parseFloat(data.totals.hitRate) > 40 ? 'amber' : 'red')}\n\n ${renderStatCard('Memory Usage', formatBytes(data.totals.memorySize), 'purple', `\n \n \n \n `)}\n\n ${renderStatCard('Cached Entries', data.totals.entryCount.toLocaleString(), 'sky', `\n \n \n \n `)}\n
\n\n \n
\n
\n

Cache Namespaces

\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ${data.namespaces.map(namespace => {\n const stat = data.stats[namespace]\n if (!stat) return ''\n return renderNamespaceRow(namespace, stat)\n }).join('')}\n \n
\n Namespace\n \n Requests\n \n Hit Rate\n \n Memory Hits\n \n KV Hits\n \n Entries\n \n Size\n \n Actions\n
\n
\n
\n\n \n
\n
\n

Performance Overview

\n
\n
\n
\n ${renderPerformanceMetric('Memory Cache', data.totals.hits, data.totals.misses)}\n ${renderHealthStatus(parseFloat(data.totals.hitRate))}\n
\n
\n
\n
\n\n \n\n \n ${renderConfirmationDialog({\n id: 'clear-all-cache-confirm',\n title: 'Clear All Cache',\n message: 'Are you sure you want to clear all cache entries? This cannot be undone.',\n confirmText: 'Clear All',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearAllCaches()'\n })}\n\n ${renderConfirmationDialog({\n id: 'clear-namespace-cache-confirm',\n title: 'Clear Namespace Cache',\n message: 'Clear cache for this namespace?',\n confirmText: 'Clear',\n cancelText: 'Cancel',\n iconColor: 'yellow',\n confirmClass: 'bg-yellow-500 hover:bg-yellow-400',\n onConfirm: 'performClearNamespaceCache()'\n })}\n\n ${getConfirmationDialogScript()}\n `\n\n const layoutData: AdminLayoutCatalystData = {\n title: 'Cache System',\n pageTitle: 'Cache System',\n currentPath: '/admin/cache',\n user: data.user,\n version: data.version,\n content: pageContent\n }\n\n return renderAdminLayoutCatalyst(layoutData)\n}\n\nfunction renderStatCard(label: string, value: string, color: string, icon: string, colorOverride?: string): string {\n const finalColor = colorOverride || color\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n blue: 'bg-blue-50 dark:bg-blue-500/10 text-blue-600 dark:text-blue-400 ring-blue-600/20 dark:ring-blue-500/20',\n purple: 'bg-purple-50 dark:bg-purple-500/10 text-purple-600 dark:text-purple-400 ring-purple-600/20 dark:ring-purple-500/20',\n sky: 'bg-sky-50 dark:bg-sky-500/10 text-sky-600 dark:text-sky-400 ring-sky-600/20 dark:ring-sky-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n
\n
\n
\n
\n ${icon}\n
\n
\n

${label}

\n

${value}

\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderNamespaceRow(namespace: string, stat: CacheStats): string {\n const hitRate = stat.hitRate.toFixed(1)\n const hitRateColor = stat.hitRate > 70 ? 'text-lime-600 dark:text-lime-400' :\n stat.hitRate > 40 ? 'text-amber-600 dark:text-amber-400' :\n 'text-red-600 dark:text-red-400'\n\n return `\n \n \n \n ${namespace}\n \n \n \n ${stat.totalRequests.toLocaleString()}\n \n \n \n ${hitRate}%\n \n \n \n ${stat.memoryHits.toLocaleString()}\n \n \n ${stat.kvHits.toLocaleString()}\n \n \n ${stat.entryCount.toLocaleString()}\n \n \n ${formatBytes(stat.memorySize)}\n \n \n \n Clear\n \n \n \n `\n}\n\nfunction renderPerformanceMetric(label: string, hits: number, misses: number): string {\n const total = hits + misses\n const hitPercentage = total > 0 ? (hits / total) * 100 : 0\n\n return `\n
\n

${label}

\n
\n
\n Hits\n ${hits.toLocaleString()}\n
\n
\n Misses\n ${misses.toLocaleString()}\n
\n
\n
\n Hit Rate\n ${hitPercentage.toFixed(1)}%\n
\n
\n
\n
\n
\n
\n
\n `\n}\n\nfunction renderHealthStatus(hitRate: number): string {\n const status = hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'critical'\n const statusConfig = {\n healthy: {\n label: 'Healthy',\n color: 'lime',\n icon: `\n \n `\n },\n warning: {\n label: 'Needs Attention',\n color: 'amber',\n icon: `\n \n `\n },\n critical: {\n label: 'Critical',\n color: 'red',\n icon: `\n \n `\n }\n }\n\n const config = statusConfig[status]\n const colorClasses = {\n lime: 'bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400 ring-lime-600/20 dark:ring-lime-500/20',\n amber: 'bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 ring-amber-600/20 dark:ring-amber-500/20',\n red: 'bg-red-50 dark:bg-red-500/10 text-red-600 dark:text-red-400 ring-red-600/20 dark:ring-red-500/20'\n }\n\n return `\n
\n

System Health

\n
\n ${config.icon}\n
\n

${config.label}

\n

\n ${status === 'healthy' ? 'Cache is performing well' :\n status === 'warning' ? 'Consider increasing cache TTL or capacity' :\n 'Cache hit rate is too low'}\n

\n
\n
\n
\n `\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`\n}\n","/**\n * Cache Plugin Routes\n *\n * Admin routes for cache management\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport { getAllCacheStats, clearAllCaches, getCacheService } from './services/cache.js'\nimport { CACHE_CONFIGS, parseCacheKey } from './services/cache-config.js'\nimport { getRecentInvalidations, getCacheInvalidationStats } from './services/cache-invalidation.js'\nimport { warmCommonCaches, warmNamespace } from './services/cache-warming.js'\nimport { renderCacheDashboard, CacheDashboardData } from '../../templates/pages/admin-cache.template'\n\nconst app = new Hono()\n\n/**\n * GET /admin/cache\n * Cache statistics dashboard\n */\napp.get('/', async (c: Context) => {\n const stats = getAllCacheStats()\n const user = c.get('user')\n\n // Calculate totals\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n Object.values(stats).forEach(stat => {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n })\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n const dashboardData: CacheDashboardData = {\n stats,\n totals: {\n hits: totalHits,\n misses: totalMisses,\n requests: totalRequests,\n hitRate: overallHitRate.toFixed(2),\n memorySize: totalSize,\n entryCount: totalEntries\n },\n namespaces: Object.keys(stats),\n user: user ? {\n name: user.email,\n email: user.email,\n role: user.role\n } : undefined,\n version: c.get('appVersion')\n }\n\n return c.html(renderCacheDashboard(dashboardData))\n})\n\n/**\n * GET /admin/cache/stats\n * Detailed statistics for all namespaces\n */\napp.get('/stats', async (c: Context) => {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/stats/:namespace\n * Statistics for a specific namespace\n */\napp.get('/stats/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const stats = cache.getStats()\n\n return c.json({\n success: true,\n data: {\n namespace,\n config,\n stats\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear\n * Clear all cache entries\n */\napp.post('/clear', async (c: Context) => {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/clear/:namespace\n * Clear cache for a specific namespace\n */\napp.post('/clear/:namespace', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const config = CACHE_CONFIGS[namespace]\n\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n await cache.clear()\n\n return c.json({\n success: true,\n message: `Cache cleared for namespace: ${namespace}`,\n namespace,\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/invalidate\n * Invalidate cache entries matching a pattern\n */\napp.post('/invalidate', async (c: Context) => {\n const body = await c.req.json()\n const { pattern, namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (namespace) {\n // Invalidate from specific namespace\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: namespace || 'all',\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/health\n * Cache system health check\n */\napp.get('/health', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // Calculate health metrics\n const namespaces = Object.entries(stats)\n const healthChecks = namespaces.map(([name, stat]) => {\n const hitRate = stat.hitRate\n const memoryUsage = stat.memorySize / (50 * 1024 * 1024) // Assume 50MB max\n\n return {\n namespace: name,\n status: hitRate > 70 ? 'healthy' : hitRate > 40 ? 'warning' : 'unhealthy',\n hitRate,\n memoryUsage: (memoryUsage * 100).toFixed(2) + '%',\n entryCount: stat.entryCount\n }\n })\n\n const overallStatus = healthChecks.every(h => h.status === 'healthy')\n ? 'healthy'\n : healthChecks.some(h => h.status === 'unhealthy')\n ? 'unhealthy'\n : 'warning'\n\n return c.json({\n success: true,\n data: {\n status: overallStatus,\n namespaces: healthChecks,\n timestamp: new Date().toISOString()\n }\n })\n})\n\n/**\n * GET /admin/cache/browser\n * Browse all cache entries across namespaces\n */\napp.get('/browser', async (c: Context) => {\n const namespace = c.req.query('namespace') || 'all'\n const search = c.req.query('search') || ''\n const sortBy = c.req.query('sort') || 'age' // age, size, key\n const limit = parseInt(c.req.query('limit') || '100')\n\n const entries: Array<{\n namespace: string\n key: string\n size: number\n age: number\n ttl: number\n expiresAt: number\n parsed: any\n }> = []\n\n const namespaces = namespace === 'all'\n ? Object.keys(CACHE_CONFIGS)\n : [namespace]\n\n for (const ns of namespaces) {\n const config = CACHE_CONFIGS[ns]\n if (!config) continue\n\n const cache = getCacheService(config)\n const keys = await cache.listKeys()\n\n for (const keyInfo of keys) {\n // Apply search filter\n if (search && !keyInfo.key.toLowerCase().includes(search.toLowerCase())) {\n continue\n }\n\n const parsed = parseCacheKey(keyInfo.key)\n const ttl = Math.max(0, keyInfo.expiresAt - Date.now()) / 1000\n\n entries.push({\n namespace: ns,\n key: keyInfo.key,\n size: keyInfo.size,\n age: keyInfo.age,\n ttl,\n expiresAt: keyInfo.expiresAt,\n parsed\n })\n }\n }\n\n // Sort entries\n if (sortBy === 'size') {\n entries.sort((a, b) => b.size - a.size)\n } else if (sortBy === 'age') {\n entries.sort((a, b) => a.age - b.age)\n } else if (sortBy === 'key') {\n entries.sort((a, b) => a.key.localeCompare(b.key))\n }\n\n // Limit results\n const limitedEntries = entries.slice(0, limit)\n\n return c.json({\n success: true,\n data: {\n entries: limitedEntries,\n total: entries.length,\n showing: limitedEntries.length,\n namespace,\n search,\n sortBy\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/browser/:namespace/:key\n * Get detailed information about a specific cache entry\n */\napp.get('/browser/:namespace/:key', async (c: Context) => {\n const namespace = c.req.param('namespace')!\n const key = decodeURIComponent(c.req.param('key')!)\n\n const config = CACHE_CONFIGS[namespace]\n if (!config) {\n return c.json({\n success: false,\n error: `Unknown namespace: ${namespace}`\n }, 404)\n }\n\n const cache = getCacheService(config)\n const entry = await cache.getEntry(key)\n\n if (!entry) {\n return c.json({\n success: false,\n error: 'Cache entry not found or expired'\n }, 404)\n }\n\n const parsed = parseCacheKey(key)\n\n return c.json({\n success: true,\n data: {\n key,\n namespace,\n parsed,\n ...entry,\n createdAt: new Date(entry.timestamp).toISOString(),\n expiresAt: new Date(entry.expiresAt).toISOString()\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics\n * Advanced cache analytics\n */\napp.get('/analytics', async (c: Context) => {\n const stats = getAllCacheStats()\n const invalidationStats = getCacheInvalidationStats()\n const recentInvalidations = getRecentInvalidations(20)\n\n // Calculate analytics\n let totalHits = 0\n let totalMisses = 0\n let totalSize = 0\n let totalEntries = 0\n\n const namespacesAnalytics = []\n\n for (const [namespace, stat] of Object.entries(stats)) {\n totalHits += stat.memoryHits + stat.kvHits\n totalMisses += stat.memoryMisses + stat.kvMisses\n totalSize += stat.memorySize\n totalEntries += stat.entryCount\n\n const totalRequests = stat.memoryHits + stat.kvHits + stat.memoryMisses + stat.kvMisses\n const hitRate = totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / totalRequests) * 100 : 0\n const avgEntrySize = stat.entryCount > 0 ? stat.memorySize / stat.entryCount : 0\n\n namespacesAnalytics.push({\n namespace,\n hitRate: hitRate.toFixed(2),\n totalRequests,\n memoryHitRate: totalRequests > 0 ? ((stat.memoryHits / totalRequests) * 100).toFixed(2) : '0',\n kvHitRate: totalRequests > 0 ? ((stat.kvHits / totalRequests) * 100).toFixed(2) : '0',\n avgEntrySize: Math.round(avgEntrySize),\n totalSize: stat.memorySize,\n entryCount: stat.entryCount,\n efficiency: totalRequests > 0 ? ((stat.memoryHits + stat.kvHits) / (stat.memoryHits + stat.kvHits + stat.dbHits + 1)).toFixed(2) : '0'\n })\n }\n\n // Sort by hit rate\n namespacesAnalytics.sort((a, b) => parseFloat(b.hitRate) - parseFloat(a.hitRate))\n\n const totalRequests = totalHits + totalMisses\n const overallHitRate = totalRequests > 0 ? (totalHits / totalRequests) * 100 : 0\n\n // Calculate cost savings (assume 50ms per DB query vs 2ms for cache)\n const dbQueriesAvoided = totalHits\n const timeSaved = dbQueriesAvoided * 48 // 48ms saved per cache hit\n const estimatedCostSavings = (dbQueriesAvoided / 1000000) * 0.50 // $0.50 per million queries\n\n return c.json({\n success: true,\n data: {\n overview: {\n totalHits,\n totalMisses,\n totalRequests,\n overallHitRate: overallHitRate.toFixed(2),\n totalSize,\n totalEntries,\n avgEntrySize: totalEntries > 0 ? Math.round(totalSize / totalEntries) : 0\n },\n performance: {\n dbQueriesAvoided,\n timeSavedMs: timeSaved,\n timeSavedMinutes: (timeSaved / 1000 / 60).toFixed(2),\n estimatedCostSavings: estimatedCostSavings.toFixed(4)\n },\n namespaces: namespacesAnalytics,\n invalidation: {\n ...invalidationStats,\n recent: recentInvalidations\n }\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/trends\n * Cache trends over time (simplified - would need historical data storage)\n */\napp.get('/analytics/trends', async (c: Context) => {\n const stats = getAllCacheStats()\n\n // For now, return current snapshot as a data point\n // In production, this would query historical data\n const dataPoint = {\n timestamp: Date.now(),\n stats: Object.entries(stats).map(([namespace, stat]) => ({\n namespace,\n hitRate: stat.hitRate,\n entryCount: stat.entryCount,\n memorySize: stat.memorySize,\n totalRequests: stat.totalRequests\n }))\n }\n\n return c.json({\n success: true,\n data: {\n trends: [dataPoint],\n note: 'Historical trends require persistent storage. This returns current snapshot only.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * GET /admin/cache/analytics/top-keys\n * Most accessed cache keys (would need hit tracking)\n */\napp.get('/analytics/top-keys', async (c: Context) => {\n const _namespace = c.req.query('namespace') || 'all'\n const _limit = parseInt(c.req.query('limit') || '10')\n\n // This is a placeholder - would need per-key hit tracking\n return c.json({\n success: true,\n data: {\n topKeys: [],\n note: 'Top keys tracking requires per-key hit counting. Feature not yet implemented.'\n },\n timestamp: new Date().toISOString()\n })\n})\n\n/**\n * POST /admin/cache/warm\n * Warm cache with common queries\n */\napp.post('/warm', async (c: Context) => {\n try {\n const db = c.env.DB as D1Database\n const result = await warmCommonCaches(db)\n\n return c.json({\n success: true,\n message: 'Cache warming completed',\n ...result,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Cache warming error:', error)\n return c.json({\n success: false,\n error: 'Cache warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\n/**\n * POST /admin/cache/warm/:namespace\n * Warm specific namespace cache\n */\napp.post('/warm/:namespace', async (c: Context) => {\n try {\n const namespace = c.req.param('namespace')!\n const body = await c.req.json()\n const { entries } = body\n\n if (!entries || !Array.isArray(entries)) {\n return c.json({\n success: false,\n error: 'Entries array is required'\n }, 400)\n }\n\n const count = await warmNamespace(namespace, entries)\n\n return c.json({\n success: true,\n message: `Warmed ${count} entries in namespace: ${namespace}`,\n namespace,\n count,\n timestamp: new Date().toISOString()\n })\n } catch (error) {\n console.error('Namespace warming error:', error)\n return c.json({\n success: false,\n error: 'Namespace warming failed',\n details: error instanceof Error ? error.message : 'Unknown error'\n }, 500)\n }\n})\n\nexport default app\n","/**\n * Cache Plugin\n *\n * Three-tiered caching system for SonicJS\n * - Tier 1: In-Memory (fastest, region-specific)\n * - Tier 2: Cloudflare KV (fast, global)\n * - Tier 3: Database (source of truth)\n */\n\nimport type { Context } from 'hono'\nimport type { PluginContext } from '@sonicjs-cms/core'\nimport { getCacheService, clearAllCaches, getAllCacheStats } from './services/cache.js'\nimport { CACHE_CONFIGS } from './services/cache-config.js'\nimport { setupCacheInvalidation } from './services/cache-invalidation.js'\nimport cacheRoutes from './routes.js'\n\nexport class CachePlugin {\n private _context: PluginContext | null = null\n\n /**\n * Get plugin routes\n */\n getRoutes() {\n return cacheRoutes\n }\n\n /**\n * Activate the cache plugin\n */\n async activate(context: PluginContext): Promise {\n this._context = context\n\n const settings = context.config || {}\n\n console.log('✅ Cache plugin activated', {\n memoryEnabled: settings.memoryEnabled ?? true,\n kvEnabled: settings.kvEnabled ?? false,\n defaultTTL: settings.defaultTTL ?? 3600\n })\n\n // Initialize default cache services\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n\n // Setup event-based cache invalidation\n setupCacheInvalidation()\n }\n\n /**\n * Deactivate the cache plugin\n */\n async deactivate(): Promise {\n console.log('❌ Cache plugin deactivated - clearing all caches')\n await clearAllCaches()\n this._context = null\n }\n\n /**\n * Configure the cache plugin\n */\n async configure(settings: Record): Promise {\n console.log('⚙️ Cache plugin configured', settings)\n\n // Reconfigure all cache instances with new settings\n for (const [_namespace, config] of Object.entries(CACHE_CONFIGS)) {\n getCacheService({\n ...config,\n memoryEnabled: settings.memoryEnabled ?? config.memoryEnabled,\n kvEnabled: settings.kvEnabled ?? config.kvEnabled,\n ttl: settings.defaultTTL ?? config.ttl\n })\n }\n }\n\n /**\n * Get cache statistics\n */\n async getStats(c: Context): Promise {\n const stats = getAllCacheStats()\n\n return c.json({\n success: true,\n data: stats,\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Clear all cache entries\n */\n async clearCache(c: Context): Promise {\n await clearAllCaches()\n\n return c.json({\n success: true,\n message: 'All cache entries cleared',\n timestamp: new Date().toISOString()\n })\n }\n\n /**\n * Invalidate cache entries matching pattern\n */\n async invalidatePattern(c: Context): Promise {\n const body = await c.req.json()\n const { pattern, namespace: _namespace } = body\n\n if (!pattern) {\n return c.json({\n success: false,\n error: 'Pattern is required'\n }, 400)\n }\n\n let totalInvalidated = 0\n\n if (_namespace) {\n // Invalidate from specific namespace\n const cache = getCacheService(CACHE_CONFIGS[_namespace] || {\n ttl: 3600,\n kvEnabled: false,\n memoryEnabled: true,\n namespace: _namespace,\n invalidateOn: [],\n version: 'v1'\n })\n totalInvalidated = await cache.invalidate(pattern)\n } else {\n // Invalidate from all namespaces\n for (const config of Object.values(CACHE_CONFIGS)) {\n const cache = getCacheService(config)\n totalInvalidated += await cache.invalidate(pattern)\n }\n }\n\n return c.json({\n success: true,\n invalidated: totalInvalidated,\n pattern,\n namespace: _namespace || 'all',\n timestamp: new Date().toISOString()\n })\n }\n}\n\n// Export cache services for use by other plugins/routes when cache plugin is active\nexport {\n getCacheService,\n clearAllCaches,\n getAllCacheStats,\n setGlobalKVNamespace\n} from './services/cache'\nexport { CACHE_CONFIGS, getCacheConfig, generateCacheKey } from './services/cache-config'\nexport type { CacheConfig, CacheStats } from './services/cache-config'\nexport { emitEvent, onEvent, getEventBus } from './services/event-bus'\nexport { getCacheInvalidationStats, getRecentInvalidations } from './services/cache-invalidation'\nexport { warmCommonCaches, warmNamespace, preloadCache } from './services/cache-warming'\n\n// Create and export plugin instance\nconst plugin = new CachePlugin()\nexport default plugin\n","/**\n * SonicJS Favicon SVG\n *\n * Embedded SVG favicon for the admin interface and auth pages.\n * This ensures the favicon is always available without external dependencies.\n */\n\nexport const faviconSvg = `\n\n\n\t\n\t\t\n\t\t\n\t\n\n`;\n","/**\n * Main Application Factory\n *\n * Creates a configured SonicJS application with all core functionality\n */\n\nimport { Hono } from 'hono'\nimport type { Context } from 'hono'\nimport type { D1Database, KVNamespace, R2Bucket } from '@cloudflare/workers-types'\nimport {\n apiRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n testCleanupRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminPluginRoutes,\n adminLogsRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n adminFormsRoutes,\n publicFormsRoutes,\n adminApiReferenceRoutes\n} from './routes'\nimport { getCoreVersion } from './utils/version'\nimport { bootstrapMiddleware } from './middleware/bootstrap'\nimport { metricsMiddleware } from './middleware/metrics'\nimport { csrfProtection } from './middleware/csrf'\nimport { securityHeadersMiddleware } from './middleware/security-headers'\nimport { createDatabaseToolsAdminRoutes } from './plugins/core-plugins/database-tools-plugin/admin-routes'\nimport { createSeedDataAdminRoutes } from './plugins/core-plugins/seed-data-plugin/admin-routes'\nimport { emailPlugin } from './plugins/core-plugins/email-plugin'\nimport { otpLoginPlugin } from './plugins/core-plugins/otp-login-plugin'\nimport { oauthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nimport { userProfilesPlugin } from './plugins/core-plugins/user-profiles'\nimport { aiSearchPlugin } from './plugins/core-plugins/ai-search-plugin'\nimport { createMagicLinkAuthPlugin } from './plugins/available/magic-link-auth'\nimport { securityAuditPlugin } from './plugins/core-plugins/security-audit-plugin'\nimport { securityAuditMiddleware } from './plugins/core-plugins/security-audit-plugin'\nimport { stripePlugin } from './plugins/core-plugins/stripe-plugin'\nimport { requireAuth, requireRole } from './middleware/auth'\nimport { pluginMenuMiddleware } from './middleware/plugin-menu'\nimport { analyticsPlugin } from './plugins/core-plugins/analytics'\nimport { eventsApiRoutes } from './plugins/core-plugins/analytics/routes/api'\nimport cachePlugin from './plugins/cache'\nimport { faviconSvg } from './assets/favicon'\nimport { setAppInstance } from './services/route-metadata'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface Bindings {\n DB: D1Database\n CACHE_KV: KVNamespace\n MEDIA_BUCKET: R2Bucket\n ASSETS: Fetcher\n EMAIL_QUEUE?: Queue\n SENDGRID_API_KEY?: string\n DEFAULT_FROM_EMAIL?: string\n IMAGES_ACCOUNT_ID?: string\n IMAGES_API_TOKEN?: string\n ENVIRONMENT?: string\n CORS_ORIGINS?: string\n JWT_SECRET?: string\n JWT_EXPIRES_IN?: string\n JWT_REFRESH_GRACE_SECONDS?: string\n BUCKET_NAME?: string\n GOOGLE_MAPS_API_KEY?: string\n}\n\nexport interface Variables {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n appVersion?: string\n csrfToken?: string\n pluginMenuItems?: Array<{ label: string; path: string; icon: string }>\n}\n\nexport interface SonicJSConfig {\n // Collections configuration\n collections?: {\n directory?: string\n autoSync?: boolean\n }\n\n // Plugins configuration\n plugins?: {\n directory?: string\n autoLoad?: boolean\n disableAll?: boolean // Disable all plugins including core plugins\n }\n\n // Custom routes\n routes?: Array<{\n path: string\n handler: Hono\n }>\n\n // Custom middleware\n middleware?: {\n beforeAuth?: Array<(c: Context, next: () => Promise) => Promise>\n afterAuth?: Array<(c: Context, next: () => Promise) => Promise>\n }\n\n // Admin access control\n // Roles allowed to access the /admin panel. Defaults to ['admin'].\n adminAccessRoles?: string[]\n\n // App metadata\n version?: string\n name?: string\n}\n\nexport type SonicJSApp = Hono<{ Bindings: Bindings; Variables: Variables }>\n\n// ============================================================================\n// Application Factory\n// ============================================================================\n\n/**\n * Create a SonicJS application with core functionality\n *\n * @param config - Application configuration\n * @returns Configured Hono application\n *\n * @example\n * ```typescript\n * import { createSonicJSApp } from '@sonicjs-cms/core'\n *\n * const app = createSonicJSApp({\n * collections: {\n * directory: './src/collections',\n * autoSync: true\n * },\n * plugins: {\n * directory: './src/plugins',\n * autoLoad: true\n * }\n * })\n *\n * export default app\n * ```\n */\nexport function createSonicJSApp(config: SonicJSConfig = {}): SonicJSApp {\n const app = new Hono<{ Bindings: Bindings; Variables: Variables }>()\n\n // Set app metadata\n const appVersion = config.version || getCoreVersion()\n const appName = config.name || 'SonicJS AI'\n\n // App version middleware\n app.use('*', async (c, next) => {\n c.set('appVersion', appVersion)\n await next()\n })\n\n // Metrics middleware - track all requests for real-time analytics\n app.use('*', metricsMiddleware())\n\n // Bootstrap middleware - runs migrations, syncs collections, and initializes plugins\n app.use('*', bootstrapMiddleware(config))\n\n // Custom middleware - before auth\n if (config.middleware?.beforeAuth) {\n for (const middleware of config.middleware.beforeAuth) {\n app.use('*', middleware)\n }\n }\n\n // Logging middleware\n app.use('*', async (_c, next) => {\n // Logging logic here\n await next()\n })\n\n // Security middleware\n app.use('*', securityHeadersMiddleware())\n\n // CSRF protection middleware\n app.use('*', csrfProtection())\n\n // Custom middleware - after auth\n if (config.middleware?.afterAuth) {\n for (const middleware of config.middleware.afterAuth) {\n app.use('*', middleware)\n }\n }\n\n // Admin panel access control: require authentication and admin role by default\n const adminRoles = config.adminAccessRoles || ['admin']\n app.use('/admin/*', requireAuth())\n app.use('/admin/*', requireRole(adminRoles))\n\n // Plugin dynamic menu items for admin sidebar\n app.use('/admin/*', pluginMenuMiddleware())\n\n // Core routes\n // Routes are being imported incrementally from routes/*\n // Each route is tested and migrated one-by-one\n app.route('/api', apiRoutes)\n app.route('/api/media', apiMediaRoutes)\n app.route('/api/system', apiSystemRoutes)\n app.route('/admin/api', adminApiRoutes)\n app.route('/admin/dashboard', adminDashboardRoutes)\n app.route('/admin/collections', adminCollectionsRoutes)\n app.route('/admin/forms', adminFormsRoutes)\n app.route('/admin/settings', adminSettingsRoutes)\n app.route('/forms', publicFormsRoutes)\n app.route('/api/forms', publicFormsRoutes) // API endpoint for form submissions\n app.route('/admin/api-reference', adminApiReferenceRoutes)\n app.route('/admin/database-tools', createDatabaseToolsAdminRoutes())\n app.route('/admin/seed-data', createSeedDataAdminRoutes())\n app.route('/admin/content', adminContentRoutes)\n app.route('/admin/media', adminMediaRoutes)\n // Security audit middleware - logs auth events (login, register, logout)\n app.use('/auth/*', securityAuditMiddleware())\n\n // Plugin routes - Security Audit (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (securityAuditPlugin.routes && securityAuditPlugin.routes.length > 0) {\n for (const route of securityAuditPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - AI Search (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register AI Search routes first so they take precedence over the generic /:id handler\n if (aiSearchPlugin.routes && aiSearchPlugin.routes.length > 0) {\n for (const route of aiSearchPlugin.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Plugin routes - Cache (dashboard and management API)\n // Fixes GitHub Issue #461: Cache routes were not registered\n app.route('/admin/cache', cachePlugin.getRoutes())\n\n // Plugin routes - OAuth Providers (MUST be registered BEFORE admin/plugins to avoid route conflict)\n if (oauthProvidersPlugin.routes && oauthProvidersPlugin.routes.length > 0) {\n for (const route of oauthProvidersPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - User Profiles\n if (userProfilesPlugin.routes && userProfilesPlugin.routes.length > 0) {\n for (const route of userProfilesPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - OTP Login (MUST be registered BEFORE admin/plugins to avoid route conflict)\n // Register OTP Login routes first so they take precedence over the generic /:id handler\n if (otpLoginPlugin.routes && otpLoginPlugin.routes.length > 0) {\n for (const route of otpLoginPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Analytics (must be before /admin/plugins catch-all)\n if (analyticsPlugin.routes && analyticsPlugin.routes.length > 0) {\n for (const route of analyticsPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Public event tracking API — POST /api/events (open), GET /api/events (admin)\n app.route('/api/events', eventsApiRoutes)\n\n // Plugin routes - Stripe (must be before /admin/plugins catch-all)\n if (stripePlugin.routes && stripePlugin.routes.length > 0) {\n for (const route of stripePlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n app.route('/admin/plugins', adminPluginRoutes)\n app.route('/admin/logs', adminLogsRoutes)\n app.route('/admin', adminUsersRoutes)\n app.route('/auth', authRoutes)\n\n // Test cleanup routes (only for development/test environments)\n app.route('/', testCleanupRoutes)\n\n // Plugin routes - Email\n if (emailPlugin.routes && emailPlugin.routes.length > 0) {\n for (const route of emailPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Plugin routes - Magic Link Auth (passwordless authentication via email links)\n const magicLinkPlugin = createMagicLinkAuthPlugin()\n if (magicLinkPlugin.routes && magicLinkPlugin.routes.length > 0) {\n for (const route of magicLinkPlugin.routes) {\n app.route(route.path, route.handler as any)\n }\n }\n\n // Serve favicon\n app.get('/favicon.svg', (c) => {\n return new Response(faviconSvg, {\n headers: {\n 'Content-Type': 'image/svg+xml',\n 'Cache-Control': 'public, max-age=31536000'\n }\n })\n })\n\n // Serve files from R2 storage (public file access)\n app.get('/files/*', async (c) => {\n try {\n // Extract the path from the URL pathname (everything after /files/)\n const url = new URL(c.req.url)\n const pathname = url.pathname\n\n // Remove the /files/ prefix to get the R2 object key\n const objectKey = pathname.replace(/^\\/files\\//, '')\n\n if (!objectKey) {\n return c.notFound()\n }\n\n // Get file from R2\n const object = await c.env.MEDIA_BUCKET.get(objectKey)\n\n if (!object) {\n return c.notFound()\n }\n\n // Set appropriate headers\n const headers = new Headers()\n object.httpMetadata?.contentType && headers.set('Content-Type', object.httpMetadata.contentType)\n object.httpMetadata?.contentDisposition && headers.set('Content-Disposition', object.httpMetadata.contentDisposition)\n headers.set('Cache-Control', 'public, max-age=31536000') // 1 year cache\n headers.set('Access-Control-Allow-Origin', '*') // Allow CORS for media files\n headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n headers.set('Access-Control-Allow-Headers', 'Content-Type')\n\n return new Response(object.body as any, {\n headers\n })\n } catch (error) {\n console.error('Error serving file:', error)\n return c.notFound()\n }\n })\n\n // Custom routes - User-defined routes\n if (config.routes) {\n for (const route of config.routes) {\n app.route(route.path, route.handler)\n }\n }\n\n // Root redirect to login\n app.get('/', (c) => {\n return c.redirect('/auth/login')\n })\n\n // Health check\n app.get('/health', (c) => {\n return c.json({\n name: appName,\n version: appVersion,\n status: 'running',\n timestamp: new Date().toISOString()\n })\n })\n\n // Store app instance for route introspection (API reference auto-discovery)\n setAppInstance(app)\n\n // 404 handler\n app.notFound((c) => {\n return c.json({ error: 'Not Found', status: 404 }, 404)\n })\n\n // Error handler\n app.onError((err, c) => {\n console.error(err)\n return c.json({ error: 'Internal Server Error', status: 500 }, 500)\n })\n\n return app\n}\n\n/**\n * Setup core middleware (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreMiddleware(_app: SonicJSApp): void {\n console.warn('setupCoreMiddleware is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n\n/**\n * Setup core routes (backward compatibility)\n *\n * @param _app - Hono application\n * @deprecated Use createSonicJSApp() instead\n */\nexport function setupCoreRoutes(_app: SonicJSApp): void {\n console.warn('setupCoreRoutes is deprecated. Use createSonicJSApp() instead.')\n // Backward compatibility implementation\n}\n","import { drizzle } from 'drizzle-orm/d1';\nimport * as schema from './schema';\n\nexport function createDb(d1: D1Database) {\n return drizzle(d1, { schema });\n}\n\nexport * from './schema';","/**\n * @sonicjs/core - Main Entry Point\n *\n * Core framework for SonicJS headless CMS\n * Built for Cloudflare's edge platform with TypeScript\n *\n * Phase 2 Migration Status:\n * - Week 1: Types, Utils, Database (COMPLETED ✓)\n * - Week 2: Services, Middleware, Plugins (COMPLETED ✓)\n * - Week 3: Routes, Templates (COMPLETED ✓)\n * - Week 4: Integration & Testing (COMPLETED ✓)\n *\n * Test Coverage:\n * - Utilities: 48 tests (sanitize, query-filter, metrics)\n * - Middleware: 51 tests (auth, logging, security, performance)\n * - Total: 99 tests passing\n */\n\n// ============================================================================\n// Main Application API (Phase 2 Week 1)\n// ============================================================================\n\nexport { createSonicJSApp, setupCoreMiddleware, setupCoreRoutes } from './app'\nexport type { SonicJSConfig, SonicJSApp, Bindings, Variables } from './app'\n\n// ============================================================================\n// Placeholders - To be populated in Phase 2\n// ============================================================================\n\n// Services - Week 2 (COMPLETED)\nexport {\n // Collection Management\n loadCollectionConfigs,\n loadCollectionConfig,\n getAvailableCollectionNames,\n validateCollectionConfig,\n registerCollections,\n syncCollections,\n syncCollection,\n isCollectionManaged,\n getManagedCollections,\n cleanupRemovedCollections,\n fullCollectionSync,\n // Form-Collection Sync\n syncAllFormCollections,\n syncFormCollection,\n createContentFromSubmission,\n deriveCollectionSchemaFromFormio,\n deriveSubmissionTitle,\n mapFormStatusToContentStatus,\n backfillFormSubmissions,\n // Database Migrations\n MigrationService,\n // Logging\n Logger,\n getLogger,\n initLogger,\n // Plugin Services - Class implementations\n PluginService as PluginServiceClass,\n PluginBootstrapService,\n} from './services'\n\nexport type { Migration, MigrationStatus, LogLevel, LogCategory, LogEntry, LogFilter, CorePlugin } from './services'\n\n// Middleware - Week 2 (COMPLETED)\nexport {\n // Authentication\n AuthManager,\n requireAuth,\n requireRole,\n optionalAuth,\n // Logging\n loggingMiddleware,\n detailedLoggingMiddleware,\n securityLoggingMiddleware,\n performanceLoggingMiddleware,\n // Performance\n cacheHeaders,\n compressionMiddleware,\n securityHeaders,\n // Permissions\n PermissionManager,\n requirePermission,\n requireAnyPermission,\n logActivity,\n // Plugin middleware\n requireActivePlugin,\n requireActivePlugins,\n getActivePlugins,\n isPluginActive,\n // Bootstrap\n bootstrapMiddleware,\n} from './middleware'\n\nexport type { Permission, UserPermissions } from './middleware'\n\n// Plugins - Week 2 (COMPLETED)\nexport {\n // Hook System - Class implementations\n HookSystemImpl,\n ScopedHookSystem as ScopedHookSystemClass,\n HookUtils,\n // Plugin Registry\n PluginRegistryImpl,\n // Plugin Manager - Class implementation\n PluginManager as PluginManagerClass,\n // Plugin Validator - Class implementation\n PluginValidator as PluginValidatorClass,\n} from './plugins'\n\n// Routes - Week 3 (COMPLETED)\nexport {\n ROUTES_INFO,\n apiRoutes,\n apiContentCrudRoutes,\n apiMediaRoutes,\n apiSystemRoutes,\n adminApiRoutes,\n authRoutes,\n adminContentRoutes,\n adminUsersRoutes,\n adminMediaRoutes,\n adminLogsRoutes,\n adminPluginRoutes,\n adminDesignRoutes,\n adminCheckboxRoutes,\n adminTestimonialsRoutes,\n adminCodeExamplesRoutes,\n adminDashboardRoutes,\n adminCollectionsRoutes,\n adminSettingsRoutes,\n} from './routes'\n\n// Templates - Week 3 (COMPLETED)\nexport {\n // Form templates\n renderForm,\n renderFormField,\n // Table templates\n renderTable,\n // Pagination templates\n renderPagination,\n // Alert templates\n renderAlert,\n // Confirmation dialog templates\n renderConfirmationDialog,\n getConfirmationDialogScript,\n // Filter bar templates\n renderFilterBar,\n} from './templates'\n\nexport type {\n FormField,\n FormData,\n TableColumn,\n TableData,\n PaginationData,\n AlertData,\n ConfirmationDialogOptions,\n FilterBarData,\n Filter,\n FilterOption,\n} from './templates'\n\n// Types - Week 1 (COMPLETED)\nexport type {\n // Collection types\n FieldType,\n FieldConfig,\n CollectionSchema,\n CollectionConfig,\n CollectionConfigModule,\n CollectionSyncResult,\n // Plugin types\n Plugin,\n PluginContext,\n PluginConfig,\n PluginRoutes,\n PluginMiddleware,\n PluginModel,\n PluginService,\n PluginAdminPage,\n PluginComponent,\n PluginMenuItem,\n PluginHook,\n HookHandler,\n HookContext,\n HookSystem,\n ScopedHookSystem,\n PluginRegistry,\n PluginManager,\n PluginStatus,\n AuthService,\n ContentService,\n MediaService,\n PluginLogger,\n PluginBuilderOptions,\n PluginValidator,\n PluginValidationResult,\n HookName,\n // Plugin manifest\n PluginManifest,\n} from './types'\n\nexport { HOOKS } from './types'\n\n// Utils - Week 1 (COMPLETED)\nexport {\n // Sanitization\n escapeHtml,\n sanitizeInput,\n sanitizeObject,\n // Template rendering\n TemplateRenderer,\n templateRenderer,\n renderTemplate,\n // Query filtering\n QueryFilterBuilder,\n buildQuery,\n // Metrics\n metricsTracker,\n // Version\n SONICJS_VERSION,\n getCoreVersion,\n} from './utils'\n\nexport type {\n FilterOperator,\n FilterCondition,\n FilterGroup,\n QueryFilter,\n QueryResult,\n} from './utils'\n\n// Database - Week 1 (COMPLETED)\nexport {\n createDb,\n // Schema exports\n users,\n collections,\n content,\n contentVersions,\n media,\n apiTokens,\n workflowHistory,\n plugins,\n pluginHooks,\n pluginRoutes,\n pluginAssets,\n pluginActivityLog,\n systemLogs,\n logConfig,\n // Zod validation schemas\n insertUserSchema,\n selectUserSchema,\n insertCollectionSchema,\n selectCollectionSchema,\n insertContentSchema,\n selectContentSchema,\n insertMediaSchema,\n selectMediaSchema,\n insertWorkflowHistorySchema,\n selectWorkflowHistorySchema,\n insertPluginSchema,\n selectPluginSchema,\n insertPluginHookSchema,\n selectPluginHookSchema,\n insertPluginRouteSchema,\n selectPluginRouteSchema,\n insertPluginAssetSchema,\n selectPluginAssetSchema,\n insertPluginActivityLogSchema,\n selectPluginActivityLogSchema,\n insertSystemLogSchema,\n selectSystemLogSchema,\n insertLogConfigSchema,\n selectLogConfigSchema,\n} from './db'\n\nexport type {\n User,\n NewUser,\n Collection,\n NewCollection,\n Content,\n NewContent,\n Media,\n NewMedia,\n WorkflowHistory,\n NewWorkflowHistory,\n Plugin as DbPlugin,\n NewPlugin,\n PluginHook as DbPluginHook,\n NewPluginHook,\n PluginRoute,\n NewPluginRoute,\n PluginAsset,\n NewPluginAsset,\n PluginActivityLog,\n NewPluginActivityLog,\n SystemLog,\n NewSystemLog,\n LogConfig,\n NewLogConfig,\n} from './db'\n\n// Plugin SDK (Beta)\nexport { PluginBuilder, PluginHelpers } from './plugins/sdk'\n\n// OAuth Providers Plugin\nexport { oauthProvidersPlugin, createOAuthProvidersPlugin } from './plugins/core-plugins/oauth-providers'\nexport { OAuthService, BUILT_IN_PROVIDERS } from './plugins/core-plugins/oauth-providers/oauth-service'\n\n// User Profiles Plugin\nexport { userProfilesPlugin, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig } from './plugins/core-plugins/user-profiles'\nexport type { ProfileFieldDefinition, UserProfileConfig } from './plugins/core-plugins/user-profiles'\n\n// ============================================================================\n// Version\n// ============================================================================\n\n// Import version from package.json\nimport packageJson from '../package.json'\nexport const VERSION = packageJson.version\n\n// ============================================================================\n// Phase 2 Migration Notes\n// ============================================================================\n\n/**\n * This is a work-in-progress package being extracted from the main SonicJS codebase.\n *\n * Current Phase: 2 (Core Module Migration)\n * Current Week: 1 (Types, Utils, Database)\n *\n * Expected completion: 4 weeks from 2025-01-17\n *\n * DO NOT USE IN PRODUCTION - Alpha release for development only\n */\n"]} \ No newline at end of file diff --git a/packages/core/dist/middleware.cjs b/packages/core/dist/middleware.cjs index 8983654ec..bac9ff235 100644 --- a/packages/core/dist/middleware.cjs +++ b/packages/core/dist/middleware.cjs @@ -1,8 +1,8 @@ 'use strict'; -var chunkTAOOLOUH_cjs = require('./chunk-TAOOLOUH.cjs'); -require('./chunk-656GGECX.cjs'); -require('./chunk-ICMNCCX2.cjs'); +var chunkV4V54BY3_cjs = require('./chunk-V4V54BY3.cjs'); +require('./chunk-QOZZJZ76.cjs'); +require('./chunk-7KR6GOY3.cjs'); require('./chunk-RCQ2HIQD.cjs'); require('./chunk-IGJUBJBW.cjs'); @@ -10,119 +10,119 @@ require('./chunk-IGJUBJBW.cjs'); Object.defineProperty(exports, "AuthManager", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.AuthManager; } + get: function () { return chunkV4V54BY3_cjs.AuthManager; } }); Object.defineProperty(exports, "PermissionManager", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.PermissionManager; } + get: function () { return chunkV4V54BY3_cjs.PermissionManager; } }); Object.defineProperty(exports, "bootstrapMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.bootstrapMiddleware; } + get: function () { return chunkV4V54BY3_cjs.bootstrapMiddleware; } }); Object.defineProperty(exports, "cacheHeaders", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.cacheHeaders; } + get: function () { return chunkV4V54BY3_cjs.cacheHeaders; } }); Object.defineProperty(exports, "compressionMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.compressionMiddleware; } + get: function () { return chunkV4V54BY3_cjs.compressionMiddleware; } }); Object.defineProperty(exports, "csrfProtection", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.csrfProtection; } + get: function () { return chunkV4V54BY3_cjs.csrfProtection; } }); Object.defineProperty(exports, "detailedLoggingMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.detailedLoggingMiddleware; } + get: function () { return chunkV4V54BY3_cjs.detailedLoggingMiddleware; } }); Object.defineProperty(exports, "generateCsrfToken", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.generateCsrfToken; } + get: function () { return chunkV4V54BY3_cjs.generateCsrfToken; } }); Object.defineProperty(exports, "getActivePlugins", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.getActivePlugins; } + get: function () { return chunkV4V54BY3_cjs.getActivePlugins; } }); Object.defineProperty(exports, "getJwtExpirySeconds", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.getJwtExpirySeconds; } + get: function () { return chunkV4V54BY3_cjs.getJwtExpirySeconds; } }); Object.defineProperty(exports, "getJwtExpirySecondsFromDb", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.getJwtExpirySecondsFromDb; } + get: function () { return chunkV4V54BY3_cjs.getJwtExpirySecondsFromDb; } }); Object.defineProperty(exports, "getJwtRefreshGraceSecondsFromDb", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.getJwtRefreshGraceSecondsFromDb; } + get: function () { return chunkV4V54BY3_cjs.getJwtRefreshGraceSecondsFromDb; } }); Object.defineProperty(exports, "isPluginActive", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.isPluginActive; } + get: function () { return chunkV4V54BY3_cjs.isPluginActive; } }); Object.defineProperty(exports, "logActivity", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.logActivity; } + get: function () { return chunkV4V54BY3_cjs.logActivity; } }); Object.defineProperty(exports, "loggingMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.loggingMiddleware; } + get: function () { return chunkV4V54BY3_cjs.loggingMiddleware; } }); Object.defineProperty(exports, "metricsMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.metricsMiddleware; } + get: function () { return chunkV4V54BY3_cjs.metricsMiddleware; } }); Object.defineProperty(exports, "optionalAuth", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.optionalAuth; } + get: function () { return chunkV4V54BY3_cjs.optionalAuth; } }); Object.defineProperty(exports, "performanceLoggingMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.performanceLoggingMiddleware; } + get: function () { return chunkV4V54BY3_cjs.performanceLoggingMiddleware; } }); Object.defineProperty(exports, "rateLimit", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.rateLimit; } + get: function () { return chunkV4V54BY3_cjs.rateLimit; } }); Object.defineProperty(exports, "requireActivePlugin", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requireActivePlugin; } + get: function () { return chunkV4V54BY3_cjs.requireActivePlugin; } }); Object.defineProperty(exports, "requireActivePlugins", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requireActivePlugins; } + get: function () { return chunkV4V54BY3_cjs.requireActivePlugins; } }); Object.defineProperty(exports, "requireAnyPermission", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requireAnyPermission; } + get: function () { return chunkV4V54BY3_cjs.requireAnyPermission; } }); Object.defineProperty(exports, "requireAuth", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requireAuth; } + get: function () { return chunkV4V54BY3_cjs.requireAuth; } }); Object.defineProperty(exports, "requirePermission", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requirePermission; } + get: function () { return chunkV4V54BY3_cjs.requirePermission; } }); Object.defineProperty(exports, "requireRole", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.requireRole; } + get: function () { return chunkV4V54BY3_cjs.requireRole; } }); Object.defineProperty(exports, "securityHeaders", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.securityHeadersMiddleware; } + get: function () { return chunkV4V54BY3_cjs.securityHeadersMiddleware; } }); Object.defineProperty(exports, "securityLoggingMiddleware", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.securityLoggingMiddleware; } + get: function () { return chunkV4V54BY3_cjs.securityLoggingMiddleware; } }); Object.defineProperty(exports, "validateCsrfToken", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.validateCsrfToken; } + get: function () { return chunkV4V54BY3_cjs.validateCsrfToken; } }); Object.defineProperty(exports, "verifySecurityConfig", { enumerable: true, - get: function () { return chunkTAOOLOUH_cjs.verifySecurityConfig; } + get: function () { return chunkV4V54BY3_cjs.verifySecurityConfig; } }); //# sourceMappingURL=middleware.cjs.map //# sourceMappingURL=middleware.cjs.map \ No newline at end of file diff --git a/packages/core/dist/middleware.d.cts b/packages/core/dist/middleware.d.cts index 2bafa4b2b..fda548d4b 100644 --- a/packages/core/dist/middleware.d.cts +++ b/packages/core/dist/middleware.d.cts @@ -62,31 +62,12 @@ declare class AuthManager { /** * Verify a token's signature and expiration. * - * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the - * `secret` argument. If omitted, this falls back to a development-only - * placeholder secret — tokens signed with the real `JWT_SECRET` will then - * silently fail verification. From inside a Hono handler prefer - * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction - * and pulls the secret from `c.env` for you. - * * If `graceSeconds` > 0, tokens whose `exp` is within the grace window * (i.e. expired by no more than `graceSeconds`) are still returned. This * supports a sliding-session refresh endpoint that accepts recently-expired * tokens. Signature failures always return null. */ static verifyToken(token: string, secret?: string, graceSeconds?: number): Promise; - /** - * Verify the JWT on an incoming Hono request using the `JWT_SECRET` - * binding from `c.env`. Reads the token from the `Authorization: Bearer …` - * header first, then falls back to the `auth_token` cookie. Returns the - * decoded payload, or null when the token is missing, malformed, expired, - * or signed with a different secret. - * - * Use this from custom Hono routes mounted alongside SonicJS — it - * resolves the secret the same way `requireAuth()` does, without forcing - * the caller to plumb it through manually. - */ - static verifyAuthRequest(c: Context): Promise; static hashPassword(password: string): Promise; static hashPasswordLegacy(password: string): Promise; static verifyPassword(password: string, storedHash: string): Promise; diff --git a/packages/core/dist/middleware.d.ts b/packages/core/dist/middleware.d.ts index 6342b3f49..3b79b476c 100644 --- a/packages/core/dist/middleware.d.ts +++ b/packages/core/dist/middleware.d.ts @@ -62,31 +62,12 @@ declare class AuthManager { /** * Verify a token's signature and expiration. * - * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the - * `secret` argument. If omitted, this falls back to a development-only - * placeholder secret — tokens signed with the real `JWT_SECRET` will then - * silently fail verification. From inside a Hono handler prefer - * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction - * and pulls the secret from `c.env` for you. - * * If `graceSeconds` > 0, tokens whose `exp` is within the grace window * (i.e. expired by no more than `graceSeconds`) are still returned. This * supports a sliding-session refresh endpoint that accepts recently-expired * tokens. Signature failures always return null. */ static verifyToken(token: string, secret?: string, graceSeconds?: number): Promise; - /** - * Verify the JWT on an incoming Hono request using the `JWT_SECRET` - * binding from `c.env`. Reads the token from the `Authorization: Bearer …` - * header first, then falls back to the `auth_token` cookie. Returns the - * decoded payload, or null when the token is missing, malformed, expired, - * or signed with a different secret. - * - * Use this from custom Hono routes mounted alongside SonicJS — it - * resolves the secret the same way `requireAuth()` does, without forcing - * the caller to plumb it through manually. - */ - static verifyAuthRequest(c: Context): Promise; static hashPassword(password: string): Promise; static hashPasswordLegacy(password: string): Promise; static verifyPassword(password: string, storedHash: string): Promise; diff --git a/packages/core/dist/middleware.js b/packages/core/dist/middleware.js index 7676914c9..e55f1cbe2 100644 --- a/packages/core/dist/middleware.js +++ b/packages/core/dist/middleware.js @@ -1,6 +1,6 @@ -export { AuthManager, PermissionManager, bootstrapMiddleware, cacheHeaders, compressionMiddleware, csrfProtection, detailedLoggingMiddleware, generateCsrfToken, getActivePlugins, getJwtExpirySeconds, getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb, isPluginActive, logActivity, loggingMiddleware, metricsMiddleware, optionalAuth, performanceLoggingMiddleware, rateLimit, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware as securityHeaders, securityLoggingMiddleware, validateCsrfToken, verifySecurityConfig } from './chunk-DMPXZ6JJ.js'; -import './chunk-NJVY2U43.js'; -import './chunk-46DCL763.js'; +export { AuthManager, PermissionManager, bootstrapMiddleware, cacheHeaders, compressionMiddleware, csrfProtection, detailedLoggingMiddleware, generateCsrfToken, getActivePlugins, getJwtExpirySeconds, getJwtExpirySecondsFromDb, getJwtRefreshGraceSecondsFromDb, isPluginActive, logActivity, loggingMiddleware, metricsMiddleware, optionalAuth, performanceLoggingMiddleware, rateLimit, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware as securityHeaders, securityLoggingMiddleware, validateCsrfToken, verifySecurityConfig } from './chunk-5QK3FXKX.js'; +import './chunk-CJOLOONT.js'; +import './chunk-CSQWOYGZ.js'; import './chunk-FICTAGD4.js'; import './chunk-V4OQ3NZ2.js'; //# sourceMappingURL=middleware.js.map diff --git a/packages/core/dist/migrations-2MVNZKQI.cjs b/packages/core/dist/migrations-2MVNZKQI.cjs deleted file mode 100644 index 701a125a9..000000000 --- a/packages/core/dist/migrations-2MVNZKQI.cjs +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -var chunkICMNCCX2_cjs = require('./chunk-ICMNCCX2.cjs'); -require('./chunk-IGJUBJBW.cjs'); - - - -Object.defineProperty(exports, "MigrationService", { - enumerable: true, - get: function () { return chunkICMNCCX2_cjs.MigrationService; } -}); -//# sourceMappingURL=migrations-2MVNZKQI.cjs.map -//# sourceMappingURL=migrations-2MVNZKQI.cjs.map \ No newline at end of file diff --git a/packages/core/dist/migrations-3CPSXQ26.cjs b/packages/core/dist/migrations-3CPSXQ26.cjs new file mode 100644 index 000000000..f09936c4c --- /dev/null +++ b/packages/core/dist/migrations-3CPSXQ26.cjs @@ -0,0 +1,13 @@ +'use strict'; + +var chunk7KR6GOY3_cjs = require('./chunk-7KR6GOY3.cjs'); +require('./chunk-IGJUBJBW.cjs'); + + + +Object.defineProperty(exports, "MigrationService", { + enumerable: true, + get: function () { return chunk7KR6GOY3_cjs.MigrationService; } +}); +//# sourceMappingURL=migrations-3CPSXQ26.cjs.map +//# sourceMappingURL=migrations-3CPSXQ26.cjs.map \ No newline at end of file diff --git a/packages/core/dist/migrations-2MVNZKQI.cjs.map b/packages/core/dist/migrations-3CPSXQ26.cjs.map similarity index 76% rename from packages/core/dist/migrations-2MVNZKQI.cjs.map rename to packages/core/dist/migrations-3CPSXQ26.cjs.map index 4e606a073..66e6af341 100644 --- a/packages/core/dist/migrations-2MVNZKQI.cjs.map +++ b/packages/core/dist/migrations-3CPSXQ26.cjs.map @@ -1 +1 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"migrations-2MVNZKQI.cjs"} \ No newline at end of file +{"version":3,"sources":[],"names":[],"mappings":"","file":"migrations-3CPSXQ26.cjs"} \ No newline at end of file diff --git a/packages/core/dist/migrations-SMFIJBW2.js b/packages/core/dist/migrations-SMFIJBW2.js new file mode 100644 index 000000000..280170158 --- /dev/null +++ b/packages/core/dist/migrations-SMFIJBW2.js @@ -0,0 +1,4 @@ +export { MigrationService } from './chunk-CSQWOYGZ.js'; +import './chunk-V4OQ3NZ2.js'; +//# sourceMappingURL=migrations-SMFIJBW2.js.map +//# sourceMappingURL=migrations-SMFIJBW2.js.map \ No newline at end of file diff --git a/packages/core/dist/migrations-W7P2NBXW.js.map b/packages/core/dist/migrations-SMFIJBW2.js.map similarity index 77% rename from packages/core/dist/migrations-W7P2NBXW.js.map rename to packages/core/dist/migrations-SMFIJBW2.js.map index 1f1384222..585eabd7d 100644 --- a/packages/core/dist/migrations-W7P2NBXW.js.map +++ b/packages/core/dist/migrations-SMFIJBW2.js.map @@ -1 +1 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"migrations-W7P2NBXW.js"} \ No newline at end of file +{"version":3,"sources":[],"names":[],"mappings":"","file":"migrations-SMFIJBW2.js"} \ No newline at end of file diff --git a/packages/core/dist/migrations-W7P2NBXW.js b/packages/core/dist/migrations-W7P2NBXW.js deleted file mode 100644 index 3f1522c19..000000000 --- a/packages/core/dist/migrations-W7P2NBXW.js +++ /dev/null @@ -1,4 +0,0 @@ -export { MigrationService } from './chunk-46DCL763.js'; -import './chunk-V4OQ3NZ2.js'; -//# sourceMappingURL=migrations-W7P2NBXW.js.map -//# sourceMappingURL=migrations-W7P2NBXW.js.map \ No newline at end of file diff --git a/packages/core/dist/plugins.cjs b/packages/core/dist/plugins.cjs index b1421a7e4..7920e976c 100644 --- a/packages/core/dist/plugins.cjs +++ b/packages/core/dist/plugins.cjs @@ -1,6 +1,6 @@ 'use strict'; -var chunkABB34XUS_cjs = require('./chunk-ABB34XUS.cjs'); +var chunkZUXOAZWZ_cjs = require('./chunk-ZUXOAZWZ.cjs'); var chunk635JAMSE_cjs = require('./chunk-635JAMSE.cjs'); require('./chunk-QTFKZBLC.cjs'); require('./chunk-IGJUBJBW.cjs'); @@ -9,35 +9,35 @@ require('./chunk-IGJUBJBW.cjs'); Object.defineProperty(exports, "HookSystemImpl", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.HookSystemImpl; } + get: function () { return chunkZUXOAZWZ_cjs.HookSystemImpl; } }); Object.defineProperty(exports, "HookUtils", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.HookUtils; } + get: function () { return chunkZUXOAZWZ_cjs.HookUtils; } }); Object.defineProperty(exports, "PluginManager", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.PluginManager; } + get: function () { return chunkZUXOAZWZ_cjs.PluginManager; } }); Object.defineProperty(exports, "PluginRegistryImpl", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.PluginRegistryImpl; } + get: function () { return chunkZUXOAZWZ_cjs.PluginRegistryImpl; } }); Object.defineProperty(exports, "PluginValidator", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.PluginValidator; } + get: function () { return chunkZUXOAZWZ_cjs.PluginValidator; } }); Object.defineProperty(exports, "ScopedHookSystem", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.ScopedHookSystem; } + get: function () { return chunkZUXOAZWZ_cjs.ScopedHookSystem; } }); Object.defineProperty(exports, "createTurnstileMiddleware", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.createTurnstileMiddleware; } + get: function () { return chunkZUXOAZWZ_cjs.createTurnstileMiddleware; } }); Object.defineProperty(exports, "verifyTurnstile", { enumerable: true, - get: function () { return chunkABB34XUS_cjs.verifyTurnstile; } + get: function () { return chunkZUXOAZWZ_cjs.verifyTurnstile; } }); Object.defineProperty(exports, "TurnstileService", { enumerable: true, diff --git a/packages/core/dist/plugins.js b/packages/core/dist/plugins.js index 9bc52b13e..1cc817703 100644 --- a/packages/core/dist/plugins.js +++ b/packages/core/dist/plugins.js @@ -1,4 +1,4 @@ -export { HookSystemImpl, HookUtils, PluginManager, PluginRegistryImpl, PluginValidator, ScopedHookSystem, createTurnstileMiddleware, verifyTurnstile } from './chunk-TFNTM3OA.js'; +export { HookSystemImpl, HookUtils, PluginManager, PluginRegistryImpl, PluginValidator, ScopedHookSystem, createTurnstileMiddleware, verifyTurnstile } from './chunk-NGTBJJXZ.js'; export { TurnstileService } from './chunk-EXNEW5US.js'; import './chunk-QXOZI5Q2.js'; import './chunk-V4OQ3NZ2.js'; diff --git a/packages/core/dist/routes.cjs b/packages/core/dist/routes.cjs index 796d064e4..41d4ec363 100644 --- a/packages/core/dist/routes.cjs +++ b/packages/core/dist/routes.cjs @@ -1,14 +1,14 @@ 'use strict'; -var chunkLPYFMGAK_cjs = require('./chunk-LPYFMGAK.cjs'); -require('./chunk-WAEQXGCX.cjs'); -require('./chunk-TAOOLOUH.cjs'); -require('./chunk-656GGECX.cjs'); -require('./chunk-ICMNCCX2.cjs'); +var chunkBX75LZES_cjs = require('./chunk-BX75LZES.cjs'); +require('./chunk-XWQVFWPW.cjs'); +require('./chunk-V4V54BY3.cjs'); +require('./chunk-QOZZJZ76.cjs'); +require('./chunk-7KR6GOY3.cjs'); require('./chunk-OHYBNCVL.cjs'); require('./chunk-UYJ6TJHX.cjs'); require('./chunk-635JAMSE.cjs'); -require('./chunk-GLRZAPX6.cjs'); +require('./chunk-74BFRAQS.cjs'); require('./chunk-P3XDZL6Q.cjs'); require('./chunk-RCQ2HIQD.cjs'); require('./chunk-MNWKYY5E.cjs'); @@ -18,95 +18,95 @@ require('./chunk-IGJUBJBW.cjs'); Object.defineProperty(exports, "ROUTES_INFO", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.ROUTES_INFO; } + get: function () { return chunkBX75LZES_cjs.ROUTES_INFO; } }); Object.defineProperty(exports, "adminApiReferenceRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.router2; } + get: function () { return chunkBX75LZES_cjs.router2; } }); Object.defineProperty(exports, "adminApiRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.admin_api_default; } + get: function () { return chunkBX75LZES_cjs.admin_api_default; } }); Object.defineProperty(exports, "adminCheckboxRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminCheckboxRoutes; } + get: function () { return chunkBX75LZES_cjs.adminCheckboxRoutes; } }); Object.defineProperty(exports, "adminCodeExamplesRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.admin_code_examples_default; } + get: function () { return chunkBX75LZES_cjs.admin_code_examples_default; } }); Object.defineProperty(exports, "adminCollectionsRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminCollectionsRoutes; } + get: function () { return chunkBX75LZES_cjs.adminCollectionsRoutes; } }); Object.defineProperty(exports, "adminContentRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.admin_content_default; } + get: function () { return chunkBX75LZES_cjs.admin_content_default; } }); Object.defineProperty(exports, "adminDashboardRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.router; } + get: function () { return chunkBX75LZES_cjs.router; } }); Object.defineProperty(exports, "adminDesignRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminDesignRoutes; } + get: function () { return chunkBX75LZES_cjs.adminDesignRoutes; } }); Object.defineProperty(exports, "adminFormsRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminFormsRoutes; } + get: function () { return chunkBX75LZES_cjs.adminFormsRoutes; } }); Object.defineProperty(exports, "adminLogsRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminLogsRoutes; } + get: function () { return chunkBX75LZES_cjs.adminLogsRoutes; } }); Object.defineProperty(exports, "adminMediaRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminMediaRoutes; } + get: function () { return chunkBX75LZES_cjs.adminMediaRoutes; } }); Object.defineProperty(exports, "adminPluginRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminPluginRoutes; } + get: function () { return chunkBX75LZES_cjs.adminPluginRoutes; } }); Object.defineProperty(exports, "adminSettingsRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.adminSettingsRoutes; } + get: function () { return chunkBX75LZES_cjs.adminSettingsRoutes; } }); Object.defineProperty(exports, "adminTestimonialsRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.admin_testimonials_default; } + get: function () { return chunkBX75LZES_cjs.admin_testimonials_default; } }); Object.defineProperty(exports, "adminUsersRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.userRoutes; } + get: function () { return chunkBX75LZES_cjs.userRoutes; } }); Object.defineProperty(exports, "apiContentCrudRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.api_content_crud_default; } + get: function () { return chunkBX75LZES_cjs.api_content_crud_default; } }); Object.defineProperty(exports, "apiMediaRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.api_media_default; } + get: function () { return chunkBX75LZES_cjs.api_media_default; } }); Object.defineProperty(exports, "apiRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.api_default; } + get: function () { return chunkBX75LZES_cjs.api_default; } }); Object.defineProperty(exports, "apiSystemRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.api_system_default; } + get: function () { return chunkBX75LZES_cjs.api_system_default; } }); Object.defineProperty(exports, "authRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.auth_default; } + get: function () { return chunkBX75LZES_cjs.auth_default; } }); Object.defineProperty(exports, "publicFormsRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.public_forms_default; } + get: function () { return chunkBX75LZES_cjs.public_forms_default; } }); Object.defineProperty(exports, "testCleanupRoutes", { enumerable: true, - get: function () { return chunkLPYFMGAK_cjs.test_cleanup_default; } + get: function () { return chunkBX75LZES_cjs.test_cleanup_default; } }); //# sourceMappingURL=routes.cjs.map //# sourceMappingURL=routes.cjs.map \ No newline at end of file diff --git a/packages/core/dist/routes.js b/packages/core/dist/routes.js index b5168a89f..905916380 100644 --- a/packages/core/dist/routes.js +++ b/packages/core/dist/routes.js @@ -1,12 +1,12 @@ -export { ROUTES_INFO, router2 as adminApiReferenceRoutes, admin_api_default as adminApiRoutes, adminCheckboxRoutes, admin_code_examples_default as adminCodeExamplesRoutes, adminCollectionsRoutes, admin_content_default as adminContentRoutes, router as adminDashboardRoutes, adminDesignRoutes, adminFormsRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, admin_testimonials_default as adminTestimonialsRoutes, userRoutes as adminUsersRoutes, api_content_crud_default as apiContentCrudRoutes, api_media_default as apiMediaRoutes, api_default as apiRoutes, api_system_default as apiSystemRoutes, auth_default as authRoutes, public_forms_default as publicFormsRoutes, test_cleanup_default as testCleanupRoutes } from './chunk-OO7BOO6H.js'; -import './chunk-QFWHAFEO.js'; -import './chunk-DMPXZ6JJ.js'; -import './chunk-NJVY2U43.js'; -import './chunk-46DCL763.js'; +export { ROUTES_INFO, router2 as adminApiReferenceRoutes, admin_api_default as adminApiRoutes, adminCheckboxRoutes, admin_code_examples_default as adminCodeExamplesRoutes, adminCollectionsRoutes, admin_content_default as adminContentRoutes, router as adminDashboardRoutes, adminDesignRoutes, adminFormsRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, admin_testimonials_default as adminTestimonialsRoutes, userRoutes as adminUsersRoutes, api_content_crud_default as apiContentCrudRoutes, api_media_default as apiMediaRoutes, api_default as apiRoutes, api_system_default as apiSystemRoutes, auth_default as authRoutes, public_forms_default as publicFormsRoutes, test_cleanup_default as testCleanupRoutes } from './chunk-M2PKQJ6J.js'; +import './chunk-GQEIPW3L.js'; +import './chunk-5QK3FXKX.js'; +import './chunk-CJOLOONT.js'; +import './chunk-CSQWOYGZ.js'; import './chunk-XWIA3HVX.js'; import './chunk-55RDMDOP.js'; import './chunk-EXNEW5US.js'; -import './chunk-FE77VWGD.js'; +import './chunk-NDS4S4AG.js'; import './chunk-X7ZAEI5S.js'; import './chunk-FICTAGD4.js'; import './chunk-TQABQWOP.js'; diff --git a/packages/core/dist/services.cjs b/packages/core/dist/services.cjs index 8aa6507f0..26934b2a0 100644 --- a/packages/core/dist/services.cjs +++ b/packages/core/dist/services.cjs @@ -1,8 +1,8 @@ 'use strict'; -var chunkWAEQXGCX_cjs = require('./chunk-WAEQXGCX.cjs'); -var chunk656GGECX_cjs = require('./chunk-656GGECX.cjs'); -var chunkICMNCCX2_cjs = require('./chunk-ICMNCCX2.cjs'); +var chunkXWQVFWPW_cjs = require('./chunk-XWQVFWPW.cjs'); +var chunkQOZZJZ76_cjs = require('./chunk-QOZZJZ76.cjs'); +var chunk7KR6GOY3_cjs = require('./chunk-7KR6GOY3.cjs'); require('./chunk-P3XDZL6Q.cjs'); require('./chunk-IGJUBJBW.cjs'); @@ -10,147 +10,147 @@ require('./chunk-IGJUBJBW.cjs'); Object.defineProperty(exports, "CACHE_CONFIGS", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.CACHE_CONFIGS; } + get: function () { return chunkXWQVFWPW_cjs.CACHE_CONFIGS; } }); Object.defineProperty(exports, "CATEGORY_INFO", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.CATEGORY_INFO; } + get: function () { return chunkXWQVFWPW_cjs.CATEGORY_INFO; } }); Object.defineProperty(exports, "CacheService", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.CacheService; } + get: function () { return chunkXWQVFWPW_cjs.CacheService; } }); Object.defineProperty(exports, "Logger", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.Logger; } + get: function () { return chunkXWQVFWPW_cjs.Logger; } }); Object.defineProperty(exports, "SettingsService", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.SettingsService; } + get: function () { return chunkXWQVFWPW_cjs.SettingsService; } }); Object.defineProperty(exports, "TelemetryService", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.TelemetryService; } + get: function () { return chunkXWQVFWPW_cjs.TelemetryService; } }); Object.defineProperty(exports, "buildRouteList", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.buildRouteList; } + get: function () { return chunkXWQVFWPW_cjs.buildRouteList; } }); Object.defineProperty(exports, "createInstallationIdentity", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.createInstallationIdentity; } + get: function () { return chunkXWQVFWPW_cjs.createInstallationIdentity; } }); Object.defineProperty(exports, "getAppInstance", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.getAppInstance; } + get: function () { return chunkXWQVFWPW_cjs.getAppInstance; } }); Object.defineProperty(exports, "getCacheService", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.getCacheService; } + get: function () { return chunkXWQVFWPW_cjs.getCacheService; } }); Object.defineProperty(exports, "getLogger", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.getLogger; } + get: function () { return chunkXWQVFWPW_cjs.getLogger; } }); Object.defineProperty(exports, "getTelemetryService", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.getTelemetryService; } + get: function () { return chunkXWQVFWPW_cjs.getTelemetryService; } }); Object.defineProperty(exports, "initLogger", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.initLogger; } + get: function () { return chunkXWQVFWPW_cjs.initLogger; } }); Object.defineProperty(exports, "initTelemetry", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.initTelemetry; } + get: function () { return chunkXWQVFWPW_cjs.initTelemetry; } }); Object.defineProperty(exports, "setAppInstance", { enumerable: true, - get: function () { return chunkWAEQXGCX_cjs.setAppInstance; } + get: function () { return chunkXWQVFWPW_cjs.setAppInstance; } }); Object.defineProperty(exports, "PluginBootstrapService", { enumerable: true, - get: function () { return chunk656GGECX_cjs.PluginBootstrapService; } + get: function () { return chunkQOZZJZ76_cjs.PluginBootstrapService; } }); Object.defineProperty(exports, "PluginService", { enumerable: true, - get: function () { return chunk656GGECX_cjs.PluginService; } + get: function () { return chunkQOZZJZ76_cjs.PluginService; } }); Object.defineProperty(exports, "backfillFormSubmissions", { enumerable: true, - get: function () { return chunk656GGECX_cjs.backfillFormSubmissions; } + get: function () { return chunkQOZZJZ76_cjs.backfillFormSubmissions; } }); Object.defineProperty(exports, "cleanupRemovedCollections", { enumerable: true, - get: function () { return chunk656GGECX_cjs.cleanupRemovedCollections; } + get: function () { return chunkQOZZJZ76_cjs.cleanupRemovedCollections; } }); Object.defineProperty(exports, "createContentFromSubmission", { enumerable: true, - get: function () { return chunk656GGECX_cjs.createContentFromSubmission; } + get: function () { return chunkQOZZJZ76_cjs.createContentFromSubmission; } }); Object.defineProperty(exports, "deriveCollectionSchemaFromFormio", { enumerable: true, - get: function () { return chunk656GGECX_cjs.deriveCollectionSchemaFromFormio; } + get: function () { return chunkQOZZJZ76_cjs.deriveCollectionSchemaFromFormio; } }); Object.defineProperty(exports, "deriveSubmissionTitle", { enumerable: true, - get: function () { return chunk656GGECX_cjs.deriveSubmissionTitle; } + get: function () { return chunkQOZZJZ76_cjs.deriveSubmissionTitle; } }); Object.defineProperty(exports, "fullCollectionSync", { enumerable: true, - get: function () { return chunk656GGECX_cjs.fullCollectionSync; } + get: function () { return chunkQOZZJZ76_cjs.fullCollectionSync; } }); Object.defineProperty(exports, "getAvailableCollectionNames", { enumerable: true, - get: function () { return chunk656GGECX_cjs.getAvailableCollectionNames; } + get: function () { return chunkQOZZJZ76_cjs.getAvailableCollectionNames; } }); Object.defineProperty(exports, "getManagedCollections", { enumerable: true, - get: function () { return chunk656GGECX_cjs.getManagedCollections; } + get: function () { return chunkQOZZJZ76_cjs.getManagedCollections; } }); Object.defineProperty(exports, "isCollectionManaged", { enumerable: true, - get: function () { return chunk656GGECX_cjs.isCollectionManaged; } + get: function () { return chunkQOZZJZ76_cjs.isCollectionManaged; } }); Object.defineProperty(exports, "loadCollectionConfig", { enumerable: true, - get: function () { return chunk656GGECX_cjs.loadCollectionConfig; } + get: function () { return chunkQOZZJZ76_cjs.loadCollectionConfig; } }); Object.defineProperty(exports, "loadCollectionConfigs", { enumerable: true, - get: function () { return chunk656GGECX_cjs.loadCollectionConfigs; } + get: function () { return chunkQOZZJZ76_cjs.loadCollectionConfigs; } }); Object.defineProperty(exports, "mapFormStatusToContentStatus", { enumerable: true, - get: function () { return chunk656GGECX_cjs.mapFormStatusToContentStatus; } + get: function () { return chunkQOZZJZ76_cjs.mapFormStatusToContentStatus; } }); Object.defineProperty(exports, "registerCollections", { enumerable: true, - get: function () { return chunk656GGECX_cjs.registerCollections; } + get: function () { return chunkQOZZJZ76_cjs.registerCollections; } }); Object.defineProperty(exports, "syncAllFormCollections", { enumerable: true, - get: function () { return chunk656GGECX_cjs.syncAllFormCollections; } + get: function () { return chunkQOZZJZ76_cjs.syncAllFormCollections; } }); Object.defineProperty(exports, "syncCollection", { enumerable: true, - get: function () { return chunk656GGECX_cjs.syncCollection; } + get: function () { return chunkQOZZJZ76_cjs.syncCollection; } }); Object.defineProperty(exports, "syncCollections", { enumerable: true, - get: function () { return chunk656GGECX_cjs.syncCollections; } + get: function () { return chunkQOZZJZ76_cjs.syncCollections; } }); Object.defineProperty(exports, "syncFormCollection", { enumerable: true, - get: function () { return chunk656GGECX_cjs.syncFormCollection; } + get: function () { return chunkQOZZJZ76_cjs.syncFormCollection; } }); Object.defineProperty(exports, "validateCollectionConfig", { enumerable: true, - get: function () { return chunk656GGECX_cjs.validateCollectionConfig; } + get: function () { return chunkQOZZJZ76_cjs.validateCollectionConfig; } }); Object.defineProperty(exports, "MigrationService", { enumerable: true, - get: function () { return chunkICMNCCX2_cjs.MigrationService; } + get: function () { return chunk7KR6GOY3_cjs.MigrationService; } }); //# sourceMappingURL=services.cjs.map //# sourceMappingURL=services.cjs.map \ No newline at end of file diff --git a/packages/core/dist/services.js b/packages/core/dist/services.js index a56e6249f..2c7427577 100644 --- a/packages/core/dist/services.js +++ b/packages/core/dist/services.js @@ -1,6 +1,6 @@ -export { CACHE_CONFIGS, CATEGORY_INFO, CacheService, Logger, SettingsService, TelemetryService, buildRouteList, createInstallationIdentity, getAppInstance, getCacheService, getLogger, getTelemetryService, initLogger, initTelemetry, setAppInstance } from './chunk-QFWHAFEO.js'; -export { PluginBootstrapService, PluginService, backfillFormSubmissions, cleanupRemovedCollections, createContentFromSubmission, deriveCollectionSchemaFromFormio, deriveSubmissionTitle, fullCollectionSync, getAvailableCollectionNames, getManagedCollections, isCollectionManaged, loadCollectionConfig, loadCollectionConfigs, mapFormStatusToContentStatus, registerCollections, syncAllFormCollections, syncCollection, syncCollections, syncFormCollection, validateCollectionConfig } from './chunk-NJVY2U43.js'; -export { MigrationService } from './chunk-46DCL763.js'; +export { CACHE_CONFIGS, CATEGORY_INFO, CacheService, Logger, SettingsService, TelemetryService, buildRouteList, createInstallationIdentity, getAppInstance, getCacheService, getLogger, getTelemetryService, initLogger, initTelemetry, setAppInstance } from './chunk-GQEIPW3L.js'; +export { PluginBootstrapService, PluginService, backfillFormSubmissions, cleanupRemovedCollections, createContentFromSubmission, deriveCollectionSchemaFromFormio, deriveSubmissionTitle, fullCollectionSync, getAvailableCollectionNames, getManagedCollections, isCollectionManaged, loadCollectionConfig, loadCollectionConfigs, mapFormStatusToContentStatus, registerCollections, syncAllFormCollections, syncCollection, syncCollections, syncFormCollection, validateCollectionConfig } from './chunk-CJOLOONT.js'; +export { MigrationService } from './chunk-CSQWOYGZ.js'; import './chunk-X7ZAEI5S.js'; import './chunk-V4OQ3NZ2.js'; //# sourceMappingURL=services.js.map diff --git a/packages/core/dist/utils.cjs b/packages/core/dist/utils.cjs index a4f0272df..dc18fb78c 100644 --- a/packages/core/dist/utils.cjs +++ b/packages/core/dist/utils.cjs @@ -1,6 +1,6 @@ 'use strict'; -var chunkGLRZAPX6_cjs = require('./chunk-GLRZAPX6.cjs'); +var chunk74BFRAQS_cjs = require('./chunk-74BFRAQS.cjs'); var chunkP3XDZL6Q_cjs = require('./chunk-P3XDZL6Q.cjs'); var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs'); var chunkMNWKYY5E_cjs = require('./chunk-MNWKYY5E.cjs'); @@ -10,43 +10,43 @@ require('./chunk-IGJUBJBW.cjs'); Object.defineProperty(exports, "QueryFilterBuilder", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.QueryFilterBuilder; } + get: function () { return chunk74BFRAQS_cjs.QueryFilterBuilder; } }); Object.defineProperty(exports, "SONICJS_VERSION", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.SONICJS_VERSION; } + get: function () { return chunk74BFRAQS_cjs.SONICJS_VERSION; } }); Object.defineProperty(exports, "TemplateRenderer", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.TemplateRenderer; } + get: function () { return chunk74BFRAQS_cjs.TemplateRenderer; } }); Object.defineProperty(exports, "buildQuery", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.buildQuery; } + get: function () { return chunk74BFRAQS_cjs.buildQuery; } }); Object.defineProperty(exports, "generateSlug", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.generateSlug; } + get: function () { return chunk74BFRAQS_cjs.generateSlug; } }); Object.defineProperty(exports, "getBlocksFieldConfig", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.getBlocksFieldConfig; } + get: function () { return chunk74BFRAQS_cjs.getBlocksFieldConfig; } }); Object.defineProperty(exports, "getCoreVersion", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.getCoreVersion; } + get: function () { return chunk74BFRAQS_cjs.getCoreVersion; } }); Object.defineProperty(exports, "parseBlocksValue", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.parseBlocksValue; } + get: function () { return chunk74BFRAQS_cjs.parseBlocksValue; } }); Object.defineProperty(exports, "renderTemplate", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.renderTemplate; } + get: function () { return chunk74BFRAQS_cjs.renderTemplate; } }); Object.defineProperty(exports, "templateRenderer", { enumerable: true, - get: function () { return chunkGLRZAPX6_cjs.templateRenderer; } + get: function () { return chunk74BFRAQS_cjs.templateRenderer; } }); Object.defineProperty(exports, "generateInstallationId", { enumerable: true, diff --git a/packages/core/dist/utils.js b/packages/core/dist/utils.js index c15fac090..c5db97a75 100644 --- a/packages/core/dist/utils.js +++ b/packages/core/dist/utils.js @@ -1,4 +1,4 @@ -export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, generateSlug, getBlocksFieldConfig, getCoreVersion, parseBlocksValue, renderTemplate, templateRenderer } from './chunk-FE77VWGD.js'; +export { QueryFilterBuilder, SONICJS_VERSION, TemplateRenderer, buildQuery, generateSlug, getBlocksFieldConfig, getCoreVersion, parseBlocksValue, renderTemplate, templateRenderer } from './chunk-NDS4S4AG.js'; export { generateInstallationId, generateProjectId, getDefaultTelemetryConfig, getTelemetryConfig, isTelemetryEnabled, sanitizeErrorMessage, sanitizeRoute, shouldSkipEvent } from './chunk-X7ZAEI5S.js'; export { metricsTracker } from './chunk-FICTAGD4.js'; export { escapeHtml, sanitizeInput, sanitizeObject } from './chunk-TQABQWOP.js'; diff --git a/packages/core/src/db/migrations-bundle.ts b/packages/core/src/db/migrations-bundle.ts index 7bfcbeaa1..b134aff29 100644 --- a/packages/core/src/db/migrations-bundle.ts +++ b/packages/core/src/db/migrations-bundle.ts @@ -1,7 +1,7 @@ /** * AUTO-GENERATED FILE - DO NOT EDIT * Generated by: scripts/generate-migrations.ts - * Generated at: 2026-05-16T15:00:21.459Z + * Generated at: 2026-05-01T00:32:37.853Z * * This file contains all migration SQL bundled for use in Cloudflare Workers * where filesystem access is not available at runtime. diff --git a/packages/core/src/plugins/manifest-registry.ts b/packages/core/src/plugins/manifest-registry.ts index 8a78b7a2c..2fdd44526 100644 --- a/packages/core/src/plugins/manifest-registry.ts +++ b/packages/core/src/plugins/manifest-registry.ts @@ -2,7 +2,7 @@ * Plugin Registry - AUTO-GENERATED * * Generated by: packages/scripts/generate-plugin-registry.mjs - * Generated at: 2026-05-16T15:00:20.475Z + * Generated at: 2026-05-01T00:32:37.025Z * Source: All manifest.json files in src/plugins/ * * DO NOT EDIT MANUALLY - run the generator script instead. From dc384983134bd6dc358a979db3af05c2374778ea Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 16 May 2026 15:03:57 +0000 Subject: [PATCH 3/4] fix: add single-flight lock for bootstrap middleware Agent-Logs-Url: https://github.com/furelid/sonicjs/sessions/57fd154d-2496-405b-8c12-d502940db821 --- .../core/src/middleware/bootstrap.test.ts | 46 +++++++++ packages/core/src/middleware/bootstrap.ts | 97 ++++++++++--------- 2 files changed, 99 insertions(+), 44 deletions(-) diff --git a/packages/core/src/middleware/bootstrap.test.ts b/packages/core/src/middleware/bootstrap.test.ts index 587c54d37..b459f9865 100644 --- a/packages/core/src/middleware/bootstrap.test.ts +++ b/packages/core/src/middleware/bootstrap.test.ts @@ -11,6 +11,10 @@ vi.mock('../services/collection-sync', () => ({ syncCollections: vi.fn().mockResolvedValue([]) })) +vi.mock('../services/form-collection-sync', () => ({ + syncAllFormCollections: vi.fn().mockResolvedValue(undefined) +})) + vi.mock('../services/migrations', () => { const mockRunPendingMigrations = vi.fn().mockResolvedValue(undefined) return { @@ -35,6 +39,7 @@ vi.mock('../services/plugin-bootstrap', () => { // Import the mocked modules after mocking import { syncCollections } from '../services/collection-sync' +import { syncAllFormCollections } from '../services/form-collection-sync' import { MigrationService } from '../services/migrations' import { PluginBootstrapService } from '../services/plugin-bootstrap' @@ -232,6 +237,46 @@ describe('bootstrapMiddleware', () => { expect(consoleSpy).toHaveBeenCalledWith('[Bootstrap] Plugin bootstrap skipped (disableAll is true)') }) + it('should run bootstrap only once for concurrent cold-start requests', async () => { + const app = new Hono() + const env = createMockEnv() + + let releaseMigration: (() => void) | undefined + const migrationGate = new Promise((resolve) => { + releaseMigration = resolve + }) + + vi.mocked(MigrationService).mockImplementationOnce(function() { + this.runPendingMigrations = vi.fn().mockImplementation(async () => { + await migrationGate + }) + return this + }) + + app.use('*', async (c, next) => { + c.env = env as any + await next() + }) + app.use('*', bootstrapMiddleware()) + app.get('/test', (c) => c.json({ ok: true })) + + const firstRequest = app.request('/test') + await Promise.resolve() + const secondRequest = app.request('/test') + + expect(MigrationService).toHaveBeenCalledTimes(1) + + releaseMigration?.() + const [firstResponse, secondResponse] = await Promise.all([firstRequest, secondRequest]) + + expect(firstResponse.status).toBe(200) + expect(secondResponse.status).toBe(200) + expect(MigrationService).toHaveBeenCalledTimes(1) + expect(syncCollections).toHaveBeenCalledTimes(1) + expect(syncAllFormCollections).toHaveBeenCalledTimes(1) + expect(PluginBootstrapService).toHaveBeenCalledTimes(1) + }) + it('should continue on fatal bootstrap error', async () => { const app = new Hono() const env = createMockEnv() @@ -258,6 +303,7 @@ describe('bootstrapMiddleware', () => { describe('resetBootstrap', () => { beforeEach(() => { + resetBootstrap() vi.clearAllMocks() }) diff --git a/packages/core/src/middleware/bootstrap.ts b/packages/core/src/middleware/bootstrap.ts index bf6fc131e..d6be969ae 100644 --- a/packages/core/src/middleware/bootstrap.ts +++ b/packages/core/src/middleware/bootstrap.ts @@ -15,6 +15,7 @@ type Bindings = { // Track if bootstrap has been run in this worker instance let bootstrapComplete = false; +let bootstrapInFlight: Promise | null = null; /** * Verify security-critical environment configuration at startup. @@ -99,52 +100,59 @@ export function bootstrapMiddleware(config: SonicJSConfig = {}) { return next(); } - try { - console.log("[Bootstrap] Starting system initialization..."); - - // 1. Run database migrations first - console.log("[Bootstrap] Running database migrations..."); - const migrationService = new MigrationService(c.env.DB); - await migrationService.runPendingMigrations(); - - // 2. Sync collection configurations - console.log("[Bootstrap] Syncing collection configurations..."); - try { - await syncCollections(c.env.DB); - } catch (error) { - console.error("[Bootstrap] Error syncing collections:", error); - // Continue bootstrap even if collection sync fails - } - - // 2b. Sync form-derived shadow collections - console.log("[Bootstrap] Syncing form collections..."); - try { - await syncAllFormCollections(c.env.DB); - } catch (error) { - console.error("[Bootstrap] Error syncing form collections:", error); - } - - // 3. Bootstrap core plugins (unless disableAll is set) - if (!config.plugins?.disableAll) { - console.log("[Bootstrap] Bootstrapping core plugins..."); - const bootstrapService = new PluginBootstrapService(c.env.DB); - - // Check if bootstrap is needed - const needsBootstrap = await bootstrapService.isBootstrapNeeded(); - if (needsBootstrap) { - await bootstrapService.bootstrapCorePlugins(); + if (!bootstrapInFlight) { + bootstrapInFlight = (async () => { + try { + console.log("[Bootstrap] Starting system initialization..."); + + // 1. Run database migrations first + console.log("[Bootstrap] Running database migrations..."); + const migrationService = new MigrationService(c.env.DB); + await migrationService.runPendingMigrations(); + + // 2. Sync collection configurations + console.log("[Bootstrap] Syncing collection configurations..."); + try { + await syncCollections(c.env.DB); + } catch (error) { + console.error("[Bootstrap] Error syncing collections:", error); + // Continue bootstrap even if collection sync fails + } + + // 2b. Sync form-derived shadow collections + console.log("[Bootstrap] Syncing form collections..."); + try { + await syncAllFormCollections(c.env.DB); + } catch (error) { + console.error("[Bootstrap] Error syncing form collections:", error); + } + + // 3. Bootstrap core plugins (unless disableAll is set) + if (!config.plugins?.disableAll) { + console.log("[Bootstrap] Bootstrapping core plugins..."); + const bootstrapService = new PluginBootstrapService(c.env.DB); + + // Check if bootstrap is needed + const needsBootstrap = await bootstrapService.isBootstrapNeeded(); + if (needsBootstrap) { + await bootstrapService.bootstrapCorePlugins(); + } + } else { + console.log("[Bootstrap] Plugin bootstrap skipped (disableAll is true)"); + } + + // Mark bootstrap as complete for this worker instance + bootstrapComplete = true; + console.log("[Bootstrap] System initialization completed"); + } catch (error) { + console.error("[Bootstrap] Error during system initialization:", error); + // Don't prevent the app from starting, but log the error + } finally { + bootstrapInFlight = null; } - } else { - console.log("[Bootstrap] Plugin bootstrap skipped (disableAll is true)"); - } - - // Mark bootstrap as complete for this worker instance - bootstrapComplete = true; - console.log("[Bootstrap] System initialization completed"); - } catch (error) { - console.error("[Bootstrap] Error during system initialization:", error); - // Don't prevent the app from starting, but log the error + })(); } + await bootstrapInFlight; // 4. Verify security configuration (outside try/catch so critical // errors in production propagate and prevent insecure deployments) @@ -159,4 +167,5 @@ export function bootstrapMiddleware(config: SonicJSConfig = {}) { */ export function resetBootstrap() { bootstrapComplete = false; + bootstrapInFlight = null; } From e6637e8e57c016d71738b5e2a8c75f984b8d94be Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 16 May 2026 15:06:17 +0000 Subject: [PATCH 4/4] test: harden concurrent bootstrap middleware test synchronization Agent-Logs-Url: https://github.com/furelid/sonicjs/sessions/57fd154d-2496-405b-8c12-d502940db821 --- packages/core/src/middleware/bootstrap.test.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/core/src/middleware/bootstrap.test.ts b/packages/core/src/middleware/bootstrap.test.ts index b459f9865..dfb6634b1 100644 --- a/packages/core/src/middleware/bootstrap.test.ts +++ b/packages/core/src/middleware/bootstrap.test.ts @@ -242,12 +242,18 @@ describe('bootstrapMiddleware', () => { const env = createMockEnv() let releaseMigration: (() => void) | undefined + let markMigrationStarted: (() => void) | undefined const migrationGate = new Promise((resolve) => { releaseMigration = resolve }) + const migrationStarted = new Promise((resolve) => { + markMigrationStarted = resolve + }) - vi.mocked(MigrationService).mockImplementationOnce(function() { + const migrationServiceMock = vi.mocked(MigrationService) + migrationServiceMock.mockImplementation(function() { this.runPendingMigrations = vi.fn().mockImplementation(async () => { + markMigrationStarted?.() await migrationGate }) return this @@ -261,7 +267,7 @@ describe('bootstrapMiddleware', () => { app.get('/test', (c) => c.json({ ok: true })) const firstRequest = app.request('/test') - await Promise.resolve() + await migrationStarted const secondRequest = app.request('/test') expect(MigrationService).toHaveBeenCalledTimes(1) @@ -275,6 +281,12 @@ describe('bootstrapMiddleware', () => { expect(syncCollections).toHaveBeenCalledTimes(1) expect(syncAllFormCollections).toHaveBeenCalledTimes(1) expect(PluginBootstrapService).toHaveBeenCalledTimes(1) + + migrationServiceMock.mockReset() + migrationServiceMock.mockImplementation(function() { + this.runPendingMigrations = vi.fn().mockResolvedValue(undefined) + return this + }) }) it('should continue on fatal bootstrap error', async () => {